HEX
Server: Apache
System: Linux vps.mmtprep.com 4.18.0-477.21.1.el8_8.x86_64 #1 SMP Thu Aug 10 13:51:50 EDT 2023 x86_64
User: mmtprep (1001)
PHP: 8.1.34
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/mmtprep/public_html/mathzen.mmtprep.com/assets/Spline-RTcaFHGe.js.map
{"version":3,"file":"Spline-RTcaFHGe.js","sources":["../../src/lib/mathFonctions/Spline.js"],"sourcesContent":["import { abs, acos, polynomialRoot, round } from 'mathjs'\n\nimport { colorToLatexOrHTML, ObjetMathalea2D } from '../../modules/2dGeneralites.js'\nimport FractionEtendue from '../../modules/FractionEtendue.js'\nimport { egal, randint } from '../../modules/outils.js'\nimport { Courbe } from '../2d/courbes.js'\nimport { point, tracePoint } from '../2d/points.js'\nimport { Segment } from '../2d/segmentsVecteurs.js'\nimport { choice } from '../outils/arrayOutils'\nimport { signesFonction, variationsFonction } from './etudeFonction.js'\nimport { MatriceCarree } from './MatriceCarree.js'\nimport { rationnalise } from './outilsMaths.js'\nimport { Polynome } from './Polynome.js'\nimport Decimal from 'decimal.js'\nimport { rangeMinMax } from '../outils/nombres'\n\n/**\n * Une fonction pour créer une Spline aléatoire\n * @param {number} n\n * @param {boolean} noeudsVisibles\n * @param {number} xMin\n * @param {number} step\n * @returns {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>}\n */\nexport function noeudsSplineAleatoire (n, noeudsVisibles, xMin = -n / 2, y0 = 0, step = 2) {\n  const noeuds = []\n  const isVisible = noeudsVisibles\n\n  let y = y0\n  let deriveeDroit = Math.cos(Math.random() * Math.PI) * randint(1, 2)\n  for (let x = xMin; x < -xMin + 1; x += step) {\n    const y0 = y\n    noeuds.push({ x, y, deriveeGauche: deriveeDroit, deriveeDroit, isVisible })\n    do {\n      y = y + choice([-1, 1]) * randint(1, 2)\n    } while (y > 5 || y < -5)\n    do {\n      deriveeDroit = Math.cos(Math.random() * Math.PI) * randint(0, 2)\n    } while (deriveeDroit * (y - y0) < 0)\n  }\n  return noeuds\n}\n\n/**\n * Une fonction pour créer un nuage de noeuds différents d'un nuage passé en argument avec certaines options\n * @param {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>} noeudsF\n * @param {objet} options\n * @param {boolean} [options.symetrieH]\n * @param {boolean} [options.symetrieV]\n * @param {number} [options.echangeNoeuds]\n * @param {number} [options.decalVertical]\n * @param {number} [options.decalHorizontal]\n * @return {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>}\n */\nexport function modifieNoeuds (noeudsF, options) {\n  const noeudsG = noeudsF.map(el => Object.assign({}, { x: el.x, y: el.y, deriveeGauche: el.deriveeGauche, deriveeDroit: el.deriveeDroit, isVisible: el.isVisible }))\n  const nbNoeuds = noeudsF.length\n  if (options.symetrieH) {\n    for (let i = nbNoeuds; i > 0; i--) {\n      noeudsG[nbNoeuds - i] = {\n        x: noeudsF[nbNoeuds - i].x,\n        y: noeudsF[i - 1].y,\n        deriveeGauche: noeudsF[i - 1].deriveeDroit,\n        deriveeDroit: noeudsF[i - 1].deriveeGauche,\n        isVisible: noeudsF[i - 1].isVisible\n      }\n    }\n  }\n  if (options.symetrieV) {\n    for (let i = 0; i < nbNoeuds; i++) {\n      noeudsG[i] = {\n        x: noeudsG[i].x,\n        y: -noeudsG[i].y,\n        deriveeGauche: -noeudsG[i].deriveeGauche,\n        deriveeDroit: -noeudsG[i].deriveeDroit,\n        isVisible: noeudsG[i].isVisible\n      }\n    }\n  }\n  if (options.echangeNoeuds) {\n    const indices = rangeMinMax(0, nbNoeuds - 1)\n    // le nombre de modifications doit être pair car on va échanger 2 par 2 et il doit y en avoir moins que nbNoeuds.\n    const nbModifs = options.echangeNoeuds ?? 2 * Math.round(randint(2, nbNoeuds) / 2)\n    const indiceDepartArrivee = []\n    for (let i = 0, cpt = 0; i < nbModifs / 2 && cpt < 50;) {\n      const choix1 = choice(indices, indiceDepartArrivee)\n      const choix2 = choice(indices, indiceDepartArrivee)\n      if (choix1 != null && choix2 != null) {\n        indiceDepartArrivee.push(choix1, choix2)\n        i++\n      }\n      cpt++\n    }\n    for (let i = 0; i < indiceDepartArrivee.length; i += 2) { // on va de 2 en 2 car les indices impairs sont les indices d'arrivée\n      const depart = indiceDepartArrivee[i]\n      const arrivee = indiceDepartArrivee[i + 1]\n      // on n'échange que si l'indice du noeud concerné est avant celui d'arrivée\n      const noeudInter = {\n        x: noeudsG[arrivee].x,\n        y: noeudsG[depart].y,\n        deriveeGauche: noeudsG[depart].deriveeGauche,\n        deriveeDroit: noeudsG[depart].deriveeDroit,\n        isVisible: noeudsG[depart].isVisible\n      }\n      noeudsG[depart] = {\n        x: noeudsG[depart].x,\n        y: noeudsG[arrivee].y,\n        deriveeGauche: noeudsG[arrivee].deriveeGauche,\n        deriveeDroit: noeudsG[arrivee].deriveeDroit,\n        isVisible: noeudsG[arrivee].isVisible\n      }\n      noeudsG[arrivee] = {\n        x: noeudInter.x,\n        y: noeudInter.y,\n        deriveeGauche: noeudInter.deriveeGauche,\n        deriveeDroit: noeudInter.deriveeDroit,\n        isVisible: noeudInter.isVisible\n      }\n    }\n  }\n  if (options.decalVertical) {\n    const offset = Number.isInteger(options.decalVertical) ? options.decalVertical : randint(-2, 2, 0)\n    for (let i = 0; i < noeudsG.length; i++) {\n      noeudsG[i] = {\n        x: noeudsG[i].x,\n        y: noeudsG[i].y + offset,\n        deriveeGauche: noeudsG[i].deriveeGauche,\n        deriveeDroit: noeudsG[i].deriveeDroit,\n        isVisible: noeudsG[i].isVisible\n      }\n    }\n  }\n  if (options.decalHorizontal) {\n    const offset = Number.isInteger(options.decalVertical) ? options.decalVertical : randint(-2, 2, 0)\n    for (let i = 0; i < noeudsG.length; i++) {\n      noeudsG[i] = {\n        x: noeudsG[i].x + offset,\n        y: noeudsG[i].y,\n        deriveeGauche: noeudsG[i].deriveeGauche,\n        deriveeDroit: noeudsG[i].deriveeDroit,\n        isVisible: noeudsG[i].isVisible\n      }\n    }\n  }\n  return noeudsG\n}\n/**\n * Les noeuds sont des objets : {x,y, nombreDerive} attention à les donner dans l'ordre des x croissants\n * @author Jean-Claude Lhote\n */\nexport class Spline {\n  /**\n     * Passer au moins deux noeuds, sinon ça ne peut pas fonctionner d'où la valeur par défaut...\n     * @param {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>} noeuds la liste des noeuds avec leurs nombres dérivés\n     */\n  constructor (noeuds) {\n    this.polys = []\n\n    if (noeuds == null || !Array.isArray(noeuds) || noeuds.length < 2) { // on ne peut pas interpoler une courbe avec moins de 2 noeuds\n      window.notify('Spline : nombre de noeuds insuffisant', { noeuds })\n      noeuds = [{ x: -3, y: -5, deriveeGauche: 0, deriveeDroit: 2, isVisible: false }, { x: 3, y: 0, deriveeGauche: -2, deriveeDroit: -2, isVisible: false }]\n    }\n    if (!trieNoeuds(noeuds)) {\n      window.notify('Il y a un problème avec ces noeuds (peut-être un doublon ?) ', { noeuds })\n      return\n    } // les noeuds comportent une anomalie : deux valeur de x identiques\n\n    for (let i = 0; i < noeuds.length - 1; i++) {\n      const x0 = noeuds[i].x\n      const y0 = noeuds[i].y\n      const d0 = noeuds[i].deriveeDroit\n      const x1 = noeuds[i + 1].x\n      const y1 = noeuds[i + 1].y\n      const d1 = noeuds[i + 1].deriveeGauche\n      const matrice = new MatriceCarree([\n        [x0 ** 3, x0 ** 2, x0, 1],\n        [x1 ** 3, x1 ** 2, x1, 1],\n        [3 * x0 ** 2, 2 * x0, 1, 0],\n        [3 * x1 ** 2, 2 * x1, 1, 0]\n      ])\n      if (matrice.table.filter(ligne => ligne.filter(nombre => isNaN(nombre)).length !== 0).length > 0) {\n        window.notify('Spline : Système impossible à résoudre il y a un problème avec les données ', {\n          x0,\n          y0,\n          x1,\n          y1,\n          d0,\n          d1\n        })\n        return\n      }\n      const determinant = matrice.determinant()// c'est maintenant une FractionEtendue !\n      if (determinant.valeurDecimale === 0) {\n        window.notify('Spline : impossible de trouver un polynome ici car la matrice n\\'est pas inversible, il faut revoir vos noeuds : ', {\n          noeudGauche: noeuds[i],\n          noeudDroit: noeuds[i + 1]\n        })\n        return\n      }\n      const matriceInverse = matrice.inverse()\n      const vecteur = [y0, y1, d0, d1]\n      this.polys.push(new Polynome({\n        isUseFraction: true,\n        coeffs: matriceInverse.multiplieVecteur(vecteur).reverse()\n      }))\n    }\n    this.noeuds = [...noeuds]\n    this.n = this.noeuds.length\n    this.x = this.noeuds.map((noeud) => noeud.x)\n    this.y = this.noeuds.map((noeud) => noeud.y)\n    this.visibles = this.noeuds.map((noeud) => noeud.isVisible) // On récupère la visibilité des noeuds pour la courbe\n    this.n = this.y.length // on a n valeurs de y et donc de x, soit n-1 intervalles numérotés de 1 à n-1.\n    // this.step = step // on en a besoin pour la dérivée...\n    this.fonctions = this.#convertPolyFunction()\n  }\n\n  pointsOfSpline (nbPoints) {\n    const points = []\n    const stepPoints = (this.x[this.x.length - 1] - this.x[0]) / nbPoints // on fait 50 points ça devrait suffir...\n    let x = this.x[0]\n    do {\n      points.push({ x, y: this.#image(x) })\n      x += stepPoints\n    } while (x <= this.x[this.x.length - 1])\n    points.push({ x: this.x[this.x.length - 1], y: this.#image(this.x[this.x.length - 1]) })\n    return points\n  }\n\n  /**\n     * convertit les polynomes en fonctions\n     * @returns {Function[]}\n     */\n  #convertPolyFunction () {\n    const f = []\n    for (let i = 0; i < this.n - 1; i++) {\n      f.push(this.polys[i].fonction)\n    }\n    return f\n  }\n\n  /**\n   * une méthode pour ajouter deux splines... et retourner une nouvelle spline !\n   * Attention ! il faut que les deux splines aient exactement le même nombre de noeuds, et que les abscisses de ces noeuds soient les mêmes !\n   * @param {Spline} s\n   * @param {boolean} opposite\n   */\n  add (s, opposite) {\n    if (this.n !== s.n) {\n      throw Error('Veuillez vous assurer de donner deux splines compatibles')\n    }\n    if (this.x.filter(el => s.x.includes(el)).length !== this.n) {\n      throw Error('Veuillez vous assurer de donner deux splines compatibles')\n    }\n    const noeuds = []\n    for (let i = 0; i < this.n; i++) {\n      const x = this.x[i]\n      const y = this.y[i] + (opposite ? -1 : 1) * s.y[i]\n      const deriveeGauche = this.noeuds[i].deriveeGauche + (opposite ? -1 : 1) * s.noeuds[i].deriveeGauche\n      const deriveeDroit = this.noeuds[i].deriveeDroit + (opposite ? -1 : 1) * s.noeuds[i].deriveeDroit\n      const isVisible = this.noeuds[i].isVisible && s.noeuds[i].isVisible\n      noeuds.push({ x, y, deriveeGauche, deriveeDroit, isVisible })\n    }\n    return new Spline(noeuds)\n  }\n\n  /**\n     * retourne les solutions de f(x) = y sur son domaine de définition\n     * @param {number} y\n     * @returns {number[]}\n     */\n  solve (y) {\n    // On a eu des soucis plus loin dans polynome.add(-y) donc on s'assure que y est bien un number.\n    const yArg = y\n    y = Number(y)\n    if (!isNaN(y)) {\n      const antecedents = []\n      for (let i = 0; i < this.polys.length; i++) {\n        const polEquation = this.polys[i].add(-y) // Le polynome dont les racines sont les antécédents de y\n        // Algebrite n'aime pas beaucoup les coefficients decimaux...\n        try {\n          const liste = polynomialRoot(...polEquation.monomes)\n          for (const valeur of liste) {\n            let arr\n            if (typeof valeur === 'number') {\n              arr = round(valeur, 3)\n            } else { // complexe !\n              const module = valeur.toPolar().r\n              if (module < 1e-5) { // module trop petit pour être complexe, c'est 0 !\n                arr = 0\n              } else {\n                const argument = valeur.arg()\n                if (abs(argument) < 0.01 || abs((abs(argument) - acos(-1))) < 0.001) { // si l'argument est proche de 0 ou de Pi ou de -Pi\n                  arr = round(valeur.re, 3) // on prend la partie réelle\n                } else {\n                  arr = null // c'est une vraie racine complexe, du coup, on prend null\n                }\n              }\n            }\n            if (arr !== null && arr >= this.x[i] && arr <= this.x[i + 1]) {\n              if (!antecedents.includes(arr)) {\n                antecedents.push(arr)\n              }\n            }\n          }\n        } catch (e) {\n          window.notify('Erreur dans Spline.solve()' + e.message, { valeur_de_y: y })\n        }\n      }\n      return antecedents\n    } else {\n      window.notify(`Spline.solve() a reçu un truc bizarre à la place d'un nombre : ${yArg} !`, { valeurArgument: yArg })\n    }\n  }\n\n  /**\n     * retourne un array décrivant les variations de la Spline sur son domaine de déf\n     * à améliorer... la fonction variationsFonctions ne travaille pas proprement. on peut faire beaucoup mieux avec Spline\n     * @returns {*[]|null}\n     */\n  variations (step) {\n    return variationsFonction(this.derivee, this.noeuds[0].x, this.noeuds[this.n - 1].x, step ?? new FractionEtendue(1, 100))\n  }\n\n  /**\n     * retourne les signes pris par la Spline sur son domaine de déf\n     * à améliorer... la fonction signesFonctions ne travaille pas proprement. on peut faire beaucoup mieux avec Spline\n     * @returns {T[]}\n     */\n  signes (step) {\n    return signesFonction(this.fonction, this.noeuds[0].x, this.noeuds[this.n - 1].x, step ?? new FractionEtendue(1, 10), 0.001)\n  }\n\n  /**\n     * retourne le nombre d'antécédents entiers trouvés pour une valeur y donnée\n     * @param {number} y\n     * @returns {number}\n     */\n  nombreAntecedentsEntiers (y) {\n    const solutions = this.solve(y)\n    const solutionsEntieres = solutions.filter(sol => Number.isInteger(sol))\n    return solutionsEntieres.length\n  }\n\n  /**\n     * retourne le nombre d'antécédents de y\n     * @param {number} y\n     * @returns {number}\n     */\n  nombreAntecedents (y) {\n    const solutions = this.solve(y)\n    return solutions.length\n  }\n\n  nombreAntecedentsMaximum (yMin, yMax, yentier = true, entiers = true) {\n    let nbMax = 0\n    for (let k = yMin; k < yMax; k += (yentier ? 1 : 0.1)) {\n      if (entiers) {\n        nbMax = Math.max(nbMax, this.nombreAntecedentsEntiers(k))\n      } else {\n        nbMax = Math.max(nbMax, this.nombreAntecedents(k))\n      }\n    }\n    return nbMax\n  }\n\n  /**\n     * Retourne une valeur de y (si trouvée) pôur laquelle il y a exactement n antécédents\n     * @param {number} n\n     * @param {number} yMin\n     * @param {number} yMax\n     * @returns {string|*}\n     */\n  trouveYPourNAntecedents (n, yMin, yMax, yEntier = true, antecedentsEntiers = true) {\n    const candidats = []\n    if (Number.isInteger(yMin) && Number.isInteger(yMax)) {\n      if (yEntier) {\n        for (let y = yMin; y <= yMax; y++) {\n          if ((antecedentsEntiers && this.nombreAntecedentsEntiers(y) === n && this.nombreAntecedents(y) === n) || (!antecedentsEntiers && this.nombreAntecedents(y) === n)) {\n            candidats.push(y)\n          }\n        }\n      } else {\n        // ici, on n'a pas trouvé avec y entier entre xMin et yMax, on recommence avec un pas de 0.1\n        for (let y = yMin; y <= yMax; y += 0.1) {\n          if ((antecedentsEntiers && this.nombreAntecedentsEntiers(y) === n && this.nombreAntecedents(y) === n) || (!antecedentsEntiers && this.nombreAntecedents(y) === n)) {\n            candidats.push(y)\n          }\n        }\n      }\n    } else {\n      window.notify('trouveYPourNAntecedentsEntiers() appelé avec des valeurs incorrectes', { n, yMin, yMax })\n    }\n    if (candidats.length < 1) {\n      window.notify('trouveYPourNAntecedents() : Je n\\'ai rien trouvé !', { n, yMin, yMax })\n    }\n    return choice(candidats) // normalement, il ne devrait jamais retourner cette valeur.\n  }\n\n  /**\n     * retourne les min et max pour un repère contenant la courbe si ceux-ci sont sur des noeuds (c'est vivement consseillé)\n     * Ne fonctionne pas si yMax ou yMin sont atteints entre deux noeuds\n     * @returns {{yMin: number, yMax: number, xMax: number, xMin: number}}\n     */\n  trouveMaxes () {\n    if (Array.isArray(this.noeuds) && this.noeuds.length > 0) {\n      const xMin = Math.ceil(Math.min(...this.noeuds.map(el => el.x)))\n      const yMin = Math.ceil(Math.min(...this.noeuds.map(el => el.y)))\n      const xMax = Math.floor(Math.max(...this.noeuds.map(el => el.x)))\n      const yMax = Math.floor(Math.max(...this.noeuds.map(el => el.y)))\n      return { xMin, xMax, yMin, yMax }\n    }\n  }\n\n  /**\n     * retourne le minimum et le maximum de la fonction\n     * @returns {{yMin: number, yMax: number}}\n     */\n  amplitude () {\n    let yMin = 1000\n    let yMax = -1000\n    const derivees = this.derivees\n    for (let i = 0; i < this.x.length - 1; i++) {\n      const derivee = derivees[i]\n      let maxLocal, minLocal\n      if (derivee.deg === 2) {\n        const a = Number(derivee.monomes[2])\n        const b = Number(derivee.monomes[1])\n        const c = Number(derivee.monomes[0])\n        const delta = b ** 2 - 4 * a * c\n        if (delta < 0) { // la dérivée ne s'annule pas donc la fonction est monotone du signe de a\n          if (a > 0) { // la fonction est croissante don le max est atteint en x[i+1]\n            maxLocal = this.y[i + 1]\n            minLocal = this.y[i]\n          } else {\n            maxLocal = this.y[i]\n            minLocal = this.y[i + 1]\n          }\n        } else if (delta === 0) { // la dérivée s'annule une seule fois mais il faut vérifier que c'est sur l'intervalle x[i] x[i+1]\n          const racine = -b / 2 / a\n          if (racine > this.x[i] && racine < this.x[i]) { // ça peut encore être un max ou un min !\n            if (a > 0) { // c'est un minimum\n              maxLocal = Math.max(this.y[i], this.y[i + 1])\n              minLocal = this.#image(racine)\n            } else { // c'est un maximum\n              maxLocal = this.#image(racine)\n              minLocal = Math.min(this.y[i], Number(this.y[i + 1]))\n            }\n          } else { // la racine n'est pas dans cet intervalle, donc la dérivée est monotone ici\n            maxLocal = Math.max(this.y[i], Number(this.y[i + 1]))\n            minLocal = Math.min(this.y[i], Number(this.y[i + 1]))\n          }\n        } else { // delta >0 deux racines !\n          const ptiDelta = Math.sqrt(delta)\n          const r1 = a > 0 ? (-b - ptiDelta) / 2 / a : (-b + ptiDelta) / 2 / a\n          const r2 = a > 0 ? (-b + ptiDelta) / 2 / a : (-b - ptiDelta) / 2 / a\n          if (this.x[i] < r1 && r1 < this.x[i + 1]) { // r1 est dans l'intervalle\n            if (this.x[i] < r2 && r2 < this.x[i + 1]) { // r2 aussi !\n              if (a > 0) { // croissant puis decroissant puis croissant : le max est soit en r1 soit en x[i+1]\n                maxLocal = Math.max(this.#image(r1), this.y[i + 1])\n                minLocal = Math.min(this.y[i], this.#image(r2))\n              } else { // a<0 décroissant puis croissant puis décroissant\n                minLocal = Math.min(this.#image(r1), this.y[i + 1])\n                maxLocal = Math.max(this.y[i], this.#image(r2))\n              }\n            } else { // r1 est dedans mais pas r2\n              if (a > 0) { // on a un max en r1 et le min est soit en x[i] soit en x[i+1]\n                maxLocal = this.#image(r1)\n                minLocal = Math.min(this.y[i], this.y[i + 1])\n              } else { // minimum en r1, max en x[i] ou x[i+1]\n                minLocal = this.#image(r1)\n                maxLocal = Math.max(Number(this.y[i], this.y[i + 1]))\n              }\n            }\n          } else { // r1 n'est pas dans l'intervalle mais peut-être r2 y est\n            if (this.x[i] < r2 && r2 < this.x[i + 1]) {\n              if (a > 0) { // on a le min en r2 et le max en x[i] ou en x[i+1]\n                minLocal = this.#image(r2)\n                maxLocal = Math.max(this.x[i], this.y[i + 1])\n              } else { // on a le max en r2 et le min en x[i] ou en x[i+1]\n                maxLocal = this.#image(r2)\n                minLocal = Math.min(this.x[i], this.y[i + 1])\n              }\n            } else { // ni r1, ni r2 ne sont dans l'intervalle. La fonction est monotone\n              if (a > 0) {\n                if (r2 < this.x[i] || r1 > this.x[i + 1]) { // strictement croissante\n                  maxLocal = this.y[i + 1]\n                  minLocal = this.y[i]\n                } else { // normalemennt r1<x[i] et r2>x[i+1] strictement décroissante\n                  maxLocal = this.y[i]\n                  minLocal = this.y[i + 1]\n                }\n              } else {\n                if (r2 < this.x[i] || r1 > this.x[i + 1]) { // strictement décroissante\n                  maxLocal = this.y[i]\n                  minLocal = this.y[i + 1]\n                } else { // normalemennt r1<x[i] et r2>x[i+1] strictement croissante\n                  maxLocal = this.y[i + 1]\n                  minLocal = this.y[i]\n                }\n              }\n            }\n          }\n        }\n      } else if (derivees[i].deg === 1) { // derivée affine, monotone croissante ou décroissante selon le signe de derivee[i].monomes[1]\n        const a = derivees[i].monomes[1]\n        if (a > 0) {\n          maxLocal = this.y[i + 1]\n          minLocal = this.y[i]\n        } else {\n          maxLocal = this.y[i]\n          minLocal = this.y[i + 1]\n        }\n      } else { // constante !\n        minLocal = this.y[i]\n        maxLocal = this.y[i]\n      }\n      yMin = Math.min(yMin, minLocal)\n      yMax = Math.max(yMax, maxLocal)\n    }\n    return { yMin, yMax }\n  }\n\n  /**\n     * fournit la fonction à passer pour simuler une fonction mathématique du type (x)=>f(x)\n     * @returns {function(*): number|*}\n     */\n  get fonction () {\n    return x => this.#image(rationnalise(x))\n  }\n\n  /**\n     * Retourne l'image de x par la fonction\n     * @param {number} x\n     * @returns {number}\n     */\n  #image (x) {\n    if (typeof x !== 'number') {\n      if (x instanceof FractionEtendue) {\n        x = x.valeurDecimale\n      } else if (x instanceof Decimal) {\n        x = x.toNumber()\n      }\n    }\n    let trouveK = false\n    let k = 0\n    for (let i = 0; i < this.n - 1; i++) {\n      if (x >= this.x[i] && x <= this.x[i + 1]) {\n        k = i\n        trouveK = true\n        break\n      }\n    }\n    if (!trouveK) {\n      const intervalle = `D = [${this.x[0]} ; ${this.x[this.n - 1]}]`\n      window.notify('Spline: la valeur de x fournie n\\'est pas dans lìntervalle de définition de la fonction', {\n        x,\n        intervalle\n      })\n      return NaN\n    } else {\n      return this.fonctions[k](x)\n    }\n  }\n\n  /**\n     * retourne un array de polynomes dérivés (degré 2) de ceux de la Spline utilisé par derivee() pour définir la dérivée pour tout x du domaine\n     * la fonction est continue, mais les dérivées à gauche et à droite des noeuds ne seront pas identiques\n     * donc on ne peut pas en faire une Spline.\n     */\n  get derivees () {\n    const derivees = []\n    for (let i = 0; i < this.polys.length; i++) {\n      derivees.push(this.polys[i].derivee())\n    }\n    return derivees\n  }\n\n  /**\n     * retourne une fonction dérivée de la spline sur son domaine de définition\n     */\n  get derivee () {\n    const intervalles = []\n    for (let i = 0; i < this.noeuds.length - 1; i++) {\n      intervalles.push({ xG: this.noeuds[i].x, xD: this.noeuds[i + 1].x })\n    }\n    return (x) => {\n      const index = intervalles.findIndex((intervalle) => x >= intervalle.xG && x <= intervalle.xD)\n      return this.derivees[index].image(rationnalise(x))\n    }\n  }\n\n  /** retourne une spline construite avec les valeurs dérivées aux noeuds de la spline.\n   * Il faut impérativement que cette fonction soit continue donc les nombre dérivés à gauche et à droite en chacun des noeuds doivent être égaux !\n   */\n  get splineDerivee () {\n    const noeudsDerivee/** Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}> */ = []\n    for (const noeud of this.noeuds) {\n      noeudsDerivee.push({ x: noeud.x, y: noeud.deriveeGauche, deriveeGauche: 0, deriveeDroit: 0, isVisible: noeud.isVisible })\n    }\n    return new Spline(noeudsDerivee)\n  }\n\n  /**\n     * crée l'objet mathalea2d correspondant à la courbe tracée\n     * @param {Repere} repere\n     * @param {number} step\n     * @param {string} color\n     * @param {number} epaisseur\n     * @param {boolean} ajouteNoeuds\n     * @param {Object} optionsNoeuds\n     * @returns {Trace}\n     */\n  courbe ({\n    repere,\n    step = 0.1,\n    color = 'black',\n    epaisseur = 1,\n    ajouteNoeuds = false,\n    optionsNoeuds = {}\n  } = {}) {\n    return new Trace(this, {\n      repere,\n      step,\n      color,\n      epaisseur,\n      ajouteNoeuds,\n      optionsNoeuds\n    })\n  }\n}\n\n/**\n * un raccourcis pour new Spline(noeuds)\n * @param {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>} noeuds\n * @returns {Spline}\n */\nexport function spline (noeuds) {\n  return new Spline(noeuds)\n}\n\n/**\n * Fonction qui trie des noeuds pour Spline afin de les remettre dans l'ordre des x croissant\n * @param {Array<{x: number, y:number,nombreDerive:number}>} noeuds\n * @author Jean-Claude Lhote\n */\nexport function trieNoeuds (noeuds) {\n  let xInter, yInter, dGaucheInter, dDroitInter, isVisibleInter\n  for (let i = 0; i < noeuds.length - 1; i++) {\n    for (let j = i + 1; j < noeuds.length; j++) {\n      if (noeuds[i].x > noeuds[j].x) {\n        xInter = noeuds[i].x\n        yInter = noeuds[i].y\n        dGaucheInter = noeuds[i].deriveeGauche\n        dDroitInter = noeuds[i].deriveeDroit\n        isVisibleInter = noeuds[i].isVisible\n        noeuds[i].x = noeuds[j].x\n        noeuds[i].y = noeuds[j].y\n        noeuds[i].deriveeGauche = noeuds[j].deriveeGauche\n        noeuds[i].deriveeDroit = noeuds[j].deriveeDroit\n        noeuds[i].isVisible = noeuds[j].isVisible\n        noeuds[j].x = xInter\n        noeuds[j].y = yInter\n        noeuds[j].deriveeGauche = dGaucheInter\n        noeuds[j].deriveeDroit = dDroitInter\n        noeuds[j].isVisible = isVisibleInter\n      } else if (egal(noeuds[i].x, noeuds[j].x)) {\n        return false\n      }\n    }\n  }\n  return true\n}\n\n/**\n * @class\n * crée la courbe de la spline (objet mathalea2d)\n */\nexport class Trace extends ObjetMathalea2D {\n  /**\n     * @param {Spline | SplineCatmullRom}spline La splineCatmulRom ou Spline dont on veut la Trace\n     * @param {Repere} repere le repère associé\n     * @param {number} step le pas entre deux points\n     * @param {string} color la couleur\n     * @param {number} epaisseur son épaisseur\n     * @param {boolean} ajouteNoeuds si true, des points sont ajoutés aux endroits des noeuds\n     * @param {Object} optionsNoeud\n     */\n  constructor (spline, {\n    repere,\n    step = 0.1,\n    color = 'black',\n    epaisseur = 1,\n    ajouteNoeuds = true,\n    optionsNoeuds = {}\n  } = {}) {\n    super()\n    const objets = []\n    const { xMin, xMax, yMin, yMax } = spline.trouveMaxes()\n    this.bordures = [xMin, yMin, xMax, yMax]\n    for (let i = 0; i < spline.n - 1; i++) {\n      if (spline.polys[i].deg > 1) {\n        objets.push(new Courbe(spline.fonctions[i], {\n          repere,\n          epaisseur,\n          color,\n          step,\n          xMin: spline.x[i],\n          xMax: spline.x[i + 1]\n        }))\n      } else {\n        const s = new Segment(spline.x[i] * repere.xUnite, spline.y[i] * repere.yUnite, spline.x[i + 1] * repere.xUnite, spline.fonctions[i](spline.x[i + 1]) * repere.yUnite, color)\n        s.epaisseur = epaisseur\n        objets.push(s)\n      }\n      if (ajouteNoeuds && spline.visibles[i]) {\n        const noeud = point(spline.x[i], spline.y[i])\n        const traceNoeud = tracePoint(noeud)\n        if (optionsNoeuds) {\n          if (optionsNoeuds.color) {\n            traceNoeud.color = colorToLatexOrHTML(optionsNoeuds.color)\n            traceNoeud.couleurDeRemplissage = colorToLatexOrHTML(optionsNoeuds.color)\n          }\n          if (optionsNoeuds.epaisseur) {\n            traceNoeud.epaisseur = optionsNoeuds.epaisseur\n          }\n          if (optionsNoeuds.style) {\n            traceNoeud.style = optionsNoeuds.style\n          }\n          if (optionsNoeuds.taille) {\n            traceNoeud.taille = optionsNoeuds.taille\n          }\n        }\n        objets.push(traceNoeud)\n      }\n    }\n    if (ajouteNoeuds && spline.visibles[spline.n - 1]) {\n      const noeud = point(spline.x[spline.n - 1], spline.y[spline.n - 1])\n      const traceNoeud = tracePoint(noeud)\n      if (optionsNoeuds) {\n        if (optionsNoeuds.color) {\n          traceNoeud.color = colorToLatexOrHTML(optionsNoeuds.color)\n          traceNoeud.couleurDeRemplissage = colorToLatexOrHTML(optionsNoeuds.color)\n        }\n        if (optionsNoeuds.epaisseur) {\n          traceNoeud.epaisseur = optionsNoeuds.epaisseur\n        }\n        if (optionsNoeuds.style) {\n          traceNoeud.style = optionsNoeuds.style\n        }\n        if (optionsNoeuds.taille) {\n          traceNoeud.taille = optionsNoeuds.taille\n        }\n      }\n      objets.push(traceNoeud)\n    }\n    this.svg = function (coeff) {\n      let code = ''\n      for (const objet of objets) {\n        code += '\\n\\t' + objet.svg(coeff)\n      }\n      return code\n    }\n    this.tikz = function () {\n      let code = ''\n      for (const objet of objets) {\n        code += '\\n\\t' + objet.tikz()\n      }\n      return code\n    }\n  }\n}\n"],"names":["noeudsSplineAleatoire","n","noeudsVisibles","xMin","y0","step","noeuds","isVisible","y","deriveeDroit","randint","x","choice","_Spline","__privateAdd","_convertPolyFunction","_image","trieNoeuds","i","x0","d0","x1","y1","d1","matrice","MatriceCarree","ligne","nombre","matriceInverse","vecteur","Polynome","noeud","__privateMethod","convertPolyFunction_fn","nbPoints","points","stepPoints","image_fn","s","opposite","el","deriveeGauche","yArg","antecedents","polEquation","liste","polynomialRoot","valeur","arr","round","argument","abs","acos","e","variationsFonction","FractionEtendue","signesFonction","sol","yMin","yMax","yentier","entiers","nbMax","k","yEntier","antecedentsEntiers","candidats","xMax","derivees","derivee","maxLocal","minLocal","a","b","c","delta","racine","ptiDelta","r1","r2","rationnalise","intervalles","index","intervalle","noeudsDerivee","repere","color","epaisseur","ajouteNoeuds","optionsNoeuds","Trace","f","Decimal","trouveK","Spline","spline","xInter","yInter","dGaucheInter","dDroitInter","isVisibleInter","j","egal","ObjetMathalea2D","objets","Courbe","Segment","point","traceNoeud","tracePoint","colorToLatexOrHTML","coeff","code","objet"],"mappings":"+jBAwBO,SAASA,EAAuBC,EAAGC,EAAgBC,EAAO,CAACF,EAAI,EAAGG,EAAK,EAAGC,EAAO,EAAG,CACzF,MAAMC,EAAS,CAAE,EACXC,EAAYL,EAElB,IAAIM,EAAIJ,EACJK,EAAe,KAAK,IAAI,KAAK,OAAM,EAAK,KAAK,EAAE,EAAIC,EAAQ,EAAG,CAAC,EACnE,QAASC,EAAIR,EAAMQ,EAAI,CAACR,EAAO,EAAGQ,GAAKN,EAAM,CAC3C,MAAMD,EAAKI,EACXF,EAAO,KAAK,CAAE,EAAAK,EAAG,EAAAH,EAAG,cAAeC,EAAc,aAAAA,EAAc,UAAAF,EAAW,EAC1E,GACEC,EAAIA,EAAII,EAAO,CAAC,GAAI,CAAC,CAAC,EAAIF,EAAQ,EAAG,CAAC,QAC/BF,EAAI,GAAKA,EAAI,IACtB,GACEC,EAAe,KAAK,IAAI,KAAK,OAAM,EAAK,KAAK,EAAE,EAAIC,EAAQ,EAAG,CAAC,QACxDD,GAAgBD,EAAIJ,GAAM,EACpC,CACD,OAAOE,CACT,aA6GO,MAAMO,EAAN,MAAMA,CAAO,CAKlB,YAAaP,EAAQ,CA6ErBQ,EAAA,KAAAC,GA+SAD,EAAA,KAAAE,GArXE,GANA,KAAK,MAAQ,CAAE,GAEXV,GAAU,MAAQ,CAAC,MAAM,QAAQA,CAAM,GAAKA,EAAO,OAAS,KAC9D,OAAO,OAAO,wCAAyC,CAAE,OAAAA,CAAM,CAAE,EACjEA,EAAS,CAAC,CAAE,EAAG,GAAI,EAAG,GAAI,cAAe,EAAG,aAAc,EAAG,UAAW,IAAS,CAAE,EAAG,EAAG,EAAG,EAAG,cAAe,GAAI,aAAc,GAAI,UAAW,EAAK,CAAE,GAEpJ,CAACW,EAAWX,CAAM,EAAG,CACvB,OAAO,OAAO,+DAAgE,CAAE,OAAAA,CAAM,CAAE,EACxF,MACD,CAED,QAASY,EAAI,EAAGA,EAAIZ,EAAO,OAAS,EAAGY,IAAK,CAC1C,MAAMC,EAAKb,EAAOY,CAAC,EAAE,EACfd,EAAKE,EAAOY,CAAC,EAAE,EACfE,EAAKd,EAAOY,CAAC,EAAE,aACfG,EAAKf,EAAOY,EAAI,CAAC,EAAE,EACnBI,EAAKhB,EAAOY,EAAI,CAAC,EAAE,EACnBK,EAAKjB,EAAOY,EAAI,CAAC,EAAE,cACnBM,EAAU,IAAIC,EAAc,CAChC,CAACN,GAAM,EAAGA,GAAM,EAAGA,EAAI,CAAC,EACxB,CAACE,GAAM,EAAGA,GAAM,EAAGA,EAAI,CAAC,EACxB,CAAC,EAAIF,GAAM,EAAG,EAAIA,EAAI,EAAG,CAAC,EAC1B,CAAC,EAAIE,GAAM,EAAG,EAAIA,EAAI,EAAG,CAAC,CAClC,CAAO,EACD,GAAIG,EAAQ,MAAM,OAAOE,GAASA,EAAM,OAAOC,GAAU,MAAMA,CAAM,CAAC,EAAE,SAAW,CAAC,EAAE,OAAS,EAAG,CAChG,OAAO,OAAO,8EAA+E,CAC3F,GAAAR,EACA,GAAAf,EACA,GAAAiB,EACA,GAAAC,EACA,GAAAF,EACA,GAAAG,CACV,CAAS,EACD,MACD,CAED,GADoBC,EAAQ,YAAa,EACzB,iBAAmB,EAAG,CACpC,OAAO,OAAO,mHAAqH,CACjI,YAAalB,EAAOY,CAAC,EACrB,WAAYZ,EAAOY,EAAI,CAAC,CAClC,CAAS,EACD,MACD,CACD,MAAMU,EAAiBJ,EAAQ,QAAS,EAClCK,EAAU,CAACzB,EAAIkB,EAAIF,EAAIG,CAAE,EAC/B,KAAK,MAAM,KAAK,IAAIO,EAAS,CAC3B,cAAe,GACf,OAAQF,EAAe,iBAAiBC,CAAO,EAAE,QAAS,CAClE,CAAO,CAAC,CACH,CACD,KAAK,OAAS,CAAC,GAAGvB,CAAM,EACxB,KAAK,EAAI,KAAK,OAAO,OACrB,KAAK,EAAI,KAAK,OAAO,IAAKyB,GAAUA,EAAM,CAAC,EAC3C,KAAK,EAAI,KAAK,OAAO,IAAKA,GAAUA,EAAM,CAAC,EAC3C,KAAK,SAAW,KAAK,OAAO,IAAKA,GAAUA,EAAM,SAAS,EAC1D,KAAK,EAAI,KAAK,EAAE,OAEhB,KAAK,UAAYC,EAAA,KAAKjB,EAAAkB,GAAL,UAClB,CAED,eAAgBC,EAAU,CACxB,MAAMC,EAAS,CAAE,EACXC,GAAc,KAAK,EAAE,KAAK,EAAE,OAAS,CAAC,EAAI,KAAK,EAAE,CAAC,GAAKF,EAC7D,IAAIvB,EAAI,KAAK,EAAE,CAAC,EAChB,GACEwB,EAAO,KAAK,CAAE,EAAAxB,EAAG,EAAGqB,EAAA,KAAKhB,EAAAqB,GAAL,UAAY1B,GAAI,EACpCA,GAAKyB,QACEzB,GAAK,KAAK,EAAE,KAAK,EAAE,OAAS,CAAC,GACtC,OAAAwB,EAAO,KAAK,CAAE,EAAG,KAAK,EAAE,KAAK,EAAE,OAAS,CAAC,EAAG,EAAGH,EAAA,KAAKhB,EAAAqB,GAAL,UAAY,KAAK,EAAE,KAAK,EAAE,OAAS,CAAC,GAAI,EAChFF,CACR,CAoBD,IAAKG,EAAGC,EAAU,CAIhB,GAHI,KAAK,IAAMD,EAAE,GAGb,KAAK,EAAE,OAAOE,GAAMF,EAAE,EAAE,SAASE,CAAE,CAAC,EAAE,SAAW,KAAK,EACxD,MAAM,MAAM,0DAA0D,EAExE,MAAMlC,EAAS,CAAE,EACjB,QAASY,EAAI,EAAGA,EAAI,KAAK,EAAGA,IAAK,CAC/B,MAAMP,EAAI,KAAK,EAAEO,CAAC,EACZV,EAAI,KAAK,EAAEU,CAAC,GAAKqB,EAAW,GAAK,GAAKD,EAAE,EAAEpB,CAAC,EAC3CuB,EAAgB,KAAK,OAAOvB,CAAC,EAAE,eAAiBqB,EAAW,GAAK,GAAKD,EAAE,OAAOpB,CAAC,EAAE,cACjFT,EAAe,KAAK,OAAOS,CAAC,EAAE,cAAgBqB,EAAW,GAAK,GAAKD,EAAE,OAAOpB,CAAC,EAAE,aAC/EX,EAAY,KAAK,OAAOW,CAAC,EAAE,WAAaoB,EAAE,OAAOpB,CAAC,EAAE,UAC1DZ,EAAO,KAAK,CAAE,EAAAK,EAAG,EAAAH,EAAG,cAAAiC,EAAe,aAAAhC,EAAc,UAAAF,EAAW,CAC7D,CACD,OAAO,IAAIM,EAAOP,CAAM,CACzB,CAOD,MAAOE,EAAG,CAER,MAAMkC,EAAOlC,EAEb,GADAA,EAAI,OAAOA,CAAC,EACP,MAAMA,CAAC,EAoCV,OAAO,OAAO,kEAAkEkC,CAAI,KAAM,CAAE,eAAgBA,EAAM,MApCrG,CACb,MAAMC,EAAc,CAAE,EACtB,QAASzB,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IAAK,CAC1C,MAAM0B,EAAc,KAAK,MAAM1B,CAAC,EAAE,IAAI,CAACV,CAAC,EAExC,GAAI,CACF,MAAMqC,EAAQC,EAAe,GAAGF,EAAY,OAAO,EACnD,UAAWG,KAAUF,EAAO,CAC1B,IAAIG,EACJ,GAAI,OAAOD,GAAW,SACpBC,EAAMC,EAAMF,EAAQ,CAAC,UAENA,EAAO,QAAO,EAAG,EACnB,KACXC,EAAM,MACD,CACL,MAAME,EAAWH,EAAO,IAAK,EACzBI,EAAID,CAAQ,EAAI,KAAQC,EAAKA,EAAID,CAAQ,EAAIE,EAAK,EAAE,CAAC,EAAK,KAC5DJ,EAAMC,EAAMF,EAAO,GAAI,CAAC,EAExBC,EAAM,IAET,CAECA,IAAQ,MAAQA,GAAO,KAAK,EAAE9B,CAAC,GAAK8B,GAAO,KAAK,EAAE9B,EAAI,CAAC,IACpDyB,EAAY,SAASK,CAAG,GAC3BL,EAAY,KAAKK,CAAG,EAGzB,CACF,OAAQK,EAAG,CACV,OAAO,OAAO,6BAA+BA,EAAE,QAAS,CAAE,YAAa7C,EAAG,CAC3E,CACF,CACD,OAAOmC,CACb,CAGG,CAOD,WAAYtC,EAAM,CAChB,OAAOiD,EAAmB,KAAK,QAAS,KAAK,OAAO,CAAC,EAAE,EAAG,KAAK,OAAO,KAAK,EAAI,CAAC,EAAE,EAAGjD,GAAQ,IAAIkD,EAAgB,EAAG,GAAG,CAAC,CACzH,CAOD,OAAQlD,EAAM,CACZ,OAAOmD,EAAe,KAAK,SAAU,KAAK,OAAO,CAAC,EAAE,EAAG,KAAK,OAAO,KAAK,EAAI,CAAC,EAAE,EAAGnD,GAAQ,IAAIkD,EAAgB,EAAG,EAAE,EAAG,IAAK,CAC5H,CAOD,yBAA0B/C,EAAG,CAG3B,OAFkB,KAAK,MAAMA,CAAC,EACM,OAAOiD,GAAO,OAAO,UAAUA,CAAG,CAAC,EAC9C,MAC1B,CAOD,kBAAmBjD,EAAG,CAEpB,OADkB,KAAK,MAAMA,CAAC,EACb,MAClB,CAED,yBAA0BkD,EAAMC,EAAMC,EAAU,GAAMC,EAAU,GAAM,CACpE,IAAIC,EAAQ,EACZ,QAASC,EAAIL,EAAMK,EAAIJ,EAAMI,GAAMH,EAAU,EAAI,GAC3CC,EACFC,EAAQ,KAAK,IAAIA,EAAO,KAAK,yBAAyBC,CAAC,CAAC,EAExDD,EAAQ,KAAK,IAAIA,EAAO,KAAK,kBAAkBC,CAAC,CAAC,EAGrD,OAAOD,CACR,CASD,wBAAyB7D,EAAGyD,EAAMC,EAAMK,EAAU,GAAMC,EAAqB,GAAM,CACjF,MAAMC,EAAY,CAAE,EACpB,GAAI,OAAO,UAAUR,CAAI,GAAK,OAAO,UAAUC,CAAI,EACjD,GAAIK,EACF,QAASxD,EAAIkD,EAAMlD,GAAKmD,EAAMnD,KACvByD,GAAsB,KAAK,yBAAyBzD,CAAC,IAAMP,GAAK,KAAK,kBAAkBO,CAAC,IAAMP,GAAO,CAACgE,GAAsB,KAAK,kBAAkBzD,CAAC,IAAMP,IAC7JiE,EAAU,KAAK1D,CAAC,MAKpB,SAASA,EAAIkD,EAAMlD,GAAKmD,EAAMnD,GAAK,IAC5ByD,GAAsB,KAAK,yBAAyBzD,CAAC,IAAMP,GAAK,KAAK,kBAAkBO,CAAC,IAAMP,GAAO,CAACgE,GAAsB,KAAK,kBAAkBzD,CAAC,IAAMP,IAC7JiE,EAAU,KAAK1D,CAAC,OAKtB,OAAO,OAAO,uEAAwE,CAAE,EAAAP,EAAG,KAAAyD,EAAM,KAAAC,EAAM,EAEzG,OAAIO,EAAU,OAAS,GACrB,OAAO,OAAO,oDAAsD,CAAE,EAAAjE,EAAG,KAAAyD,EAAM,KAAAC,EAAM,EAEhF/C,EAAOsD,CAAS,CACxB,CAOD,aAAe,CACb,GAAI,MAAM,QAAQ,KAAK,MAAM,GAAK,KAAK,OAAO,OAAS,EAAG,CACxD,MAAM/D,EAAO,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAIqC,GAAMA,EAAG,CAAC,CAAC,CAAC,EACzDkB,EAAO,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAIlB,GAAMA,EAAG,CAAC,CAAC,CAAC,EACzD2B,EAAO,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI3B,GAAMA,EAAG,CAAC,CAAC,CAAC,EAC1DmB,EAAO,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,IAAInB,GAAMA,EAAG,CAAC,CAAC,CAAC,EAChE,MAAO,CAAE,KAAArC,EAAM,KAAAgE,EAAM,KAAAT,EAAM,KAAAC,CAAM,CAClC,CACF,CAMD,WAAa,CACX,IAAID,EAAO,IACPC,EAAO,KACX,MAAMS,EAAW,KAAK,SACtB,QAASlD,EAAI,EAAGA,EAAI,KAAK,EAAE,OAAS,EAAGA,IAAK,CAC1C,MAAMmD,EAAUD,EAASlD,CAAC,EAC1B,IAAIoD,EAAUC,EACd,GAAIF,EAAQ,MAAQ,EAAG,CACrB,MAAMG,EAAI,OAAOH,EAAQ,QAAQ,CAAC,CAAC,EAC7BI,EAAI,OAAOJ,EAAQ,QAAQ,CAAC,CAAC,EAC7BK,EAAI,OAAOL,EAAQ,QAAQ,CAAC,CAAC,EAC7BM,EAAQF,GAAK,EAAI,EAAID,EAAIE,EAC/B,GAAIC,EAAQ,EACNH,EAAI,GACNF,EAAW,KAAK,EAAEpD,EAAI,CAAC,EACvBqD,EAAW,KAAK,EAAErD,CAAC,IAEnBoD,EAAW,KAAK,EAAEpD,CAAC,EACnBqD,EAAW,KAAK,EAAErD,EAAI,CAAC,WAEhByD,IAAU,EAAG,CACtB,MAAMC,EAAS,CAACH,EAAI,EAAID,EACpBI,EAAS,KAAK,EAAE1D,CAAC,GAAK0D,EAAS,KAAK,EAAE1D,CAAC,EACrCsD,EAAI,GACNF,EAAW,KAAK,IAAI,KAAK,EAAEpD,CAAC,EAAG,KAAK,EAAEA,EAAI,CAAC,CAAC,EAC5CqD,EAAWvC,EAAA,KAAKhB,EAAAqB,GAAL,UAAYuC,KAEvBN,EAAWtC,EAAA,KAAKhB,EAAAqB,GAAL,UAAYuC,GACvBL,EAAW,KAAK,IAAI,KAAK,EAAErD,CAAC,EAAG,OAAO,KAAK,EAAEA,EAAI,CAAC,CAAC,CAAC,IAGtDoD,EAAW,KAAK,IAAI,KAAK,EAAEpD,CAAC,EAAG,OAAO,KAAK,EAAEA,EAAI,CAAC,CAAC,CAAC,EACpDqD,EAAW,KAAK,IAAI,KAAK,EAAErD,CAAC,EAAG,OAAO,KAAK,EAAEA,EAAI,CAAC,CAAC,CAAC,EAEhE,KAAe,CACL,MAAM2D,EAAW,KAAK,KAAKF,CAAK,EAC1BG,EAAKN,EAAI,GAAK,CAACC,EAAII,GAAY,EAAIL,GAAK,CAACC,EAAII,GAAY,EAAIL,EAC7DO,EAAKP,EAAI,GAAK,CAACC,EAAII,GAAY,EAAIL,GAAK,CAACC,EAAII,GAAY,EAAIL,EAC/D,KAAK,EAAEtD,CAAC,EAAI4D,GAAMA,EAAK,KAAK,EAAE5D,EAAI,CAAC,EACjC,KAAK,EAAEA,CAAC,EAAI6D,GAAMA,EAAK,KAAK,EAAE7D,EAAI,CAAC,EACjCsD,EAAI,GACNF,EAAW,KAAK,IAAItC,EAAA,KAAKhB,EAAAqB,GAAL,UAAYyC,GAAK,KAAK,EAAE5D,EAAI,CAAC,CAAC,EAClDqD,EAAW,KAAK,IAAI,KAAK,EAAErD,CAAC,EAAGc,EAAA,KAAKhB,EAAAqB,GAAL,UAAY0C,EAAG,IAE9CR,EAAW,KAAK,IAAIvC,EAAA,KAAKhB,EAAAqB,GAAL,UAAYyC,GAAK,KAAK,EAAE5D,EAAI,CAAC,CAAC,EAClDoD,EAAW,KAAK,IAAI,KAAK,EAAEpD,CAAC,EAAGc,EAAA,KAAKhB,EAAAqB,GAAL,UAAY0C,EAAG,GAG5CP,EAAI,GACNF,EAAWtC,EAAA,KAAKhB,EAAAqB,GAAL,UAAYyC,GACvBP,EAAW,KAAK,IAAI,KAAK,EAAErD,CAAC,EAAG,KAAK,EAAEA,EAAI,CAAC,CAAC,IAE5CqD,EAAWvC,EAAA,KAAKhB,EAAAqB,GAAL,UAAYyC,GACvBR,EAAW,KAAK,IAAI,OAAO,KAAK,EAAEpD,CAAC,EAAG,KAAK,EAAEA,EAAI,CAAC,CAAC,CAAC,GAIpD,KAAK,EAAEA,CAAC,EAAI6D,GAAMA,EAAK,KAAK,EAAE7D,EAAI,CAAC,EACjCsD,EAAI,GACND,EAAWvC,EAAA,KAAKhB,EAAAqB,GAAL,UAAY0C,GACvBT,EAAW,KAAK,IAAI,KAAK,EAAEpD,CAAC,EAAG,KAAK,EAAEA,EAAI,CAAC,CAAC,IAE5CoD,EAAWtC,EAAA,KAAKhB,EAAAqB,GAAL,UAAY0C,GACvBR,EAAW,KAAK,IAAI,KAAK,EAAErD,CAAC,EAAG,KAAK,EAAEA,EAAI,CAAC,CAAC,GAG1CsD,EAAI,EACFO,EAAK,KAAK,EAAE7D,CAAC,GAAK4D,EAAK,KAAK,EAAE5D,EAAI,CAAC,GACrCoD,EAAW,KAAK,EAAEpD,EAAI,CAAC,EACvBqD,EAAW,KAAK,EAAErD,CAAC,IAEnBoD,EAAW,KAAK,EAAEpD,CAAC,EACnBqD,EAAW,KAAK,EAAErD,EAAI,CAAC,GAGrB6D,EAAK,KAAK,EAAE7D,CAAC,GAAK4D,EAAK,KAAK,EAAE5D,EAAI,CAAC,GACrCoD,EAAW,KAAK,EAAEpD,CAAC,EACnBqD,EAAW,KAAK,EAAErD,EAAI,CAAC,IAEvBoD,EAAW,KAAK,EAAEpD,EAAI,CAAC,EACvBqD,EAAW,KAAK,EAAErD,CAAC,EAK5B,CACF,MAAUkD,EAASlD,CAAC,EAAE,MAAQ,EACnBkD,EAASlD,CAAC,EAAE,QAAQ,CAAC,EACvB,GACNoD,EAAW,KAAK,EAAEpD,EAAI,CAAC,EACvBqD,EAAW,KAAK,EAAErD,CAAC,IAEnBoD,EAAW,KAAK,EAAEpD,CAAC,EACnBqD,EAAW,KAAK,EAAErD,EAAI,CAAC,IAGzBqD,EAAW,KAAK,EAAErD,CAAC,EACnBoD,EAAW,KAAK,EAAEpD,CAAC,GAErBwC,EAAO,KAAK,IAAIA,EAAMa,CAAQ,EAC9BZ,EAAO,KAAK,IAAIA,EAAMW,CAAQ,CAC/B,CACD,MAAO,CAAE,KAAAZ,EAAM,KAAAC,CAAM,CACtB,CAMD,IAAI,UAAY,CACd,OAAOhD,GAAKqB,EAAA,KAAKhB,EAAAqB,GAAL,UAAY2C,EAAarE,CAAC,EACvC,CAyCD,IAAI,UAAY,CACd,MAAMyD,EAAW,CAAE,EACnB,QAASlD,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IACrCkD,EAAS,KAAK,KAAK,MAAMlD,CAAC,EAAE,SAAS,EAEvC,OAAOkD,CACR,CAKD,IAAI,SAAW,CACb,MAAMa,EAAc,CAAE,EACtB,QAAS/D,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAS,EAAGA,IAC1C+D,EAAY,KAAK,CAAE,GAAI,KAAK,OAAO/D,CAAC,EAAE,EAAG,GAAI,KAAK,OAAOA,EAAI,CAAC,EAAE,EAAG,EAErE,OAAQP,GAAM,CACZ,MAAMuE,EAAQD,EAAY,UAAWE,GAAexE,GAAKwE,EAAW,IAAMxE,GAAKwE,EAAW,EAAE,EAC5F,OAAO,KAAK,SAASD,CAAK,EAAE,MAAMF,EAAarE,CAAC,CAAC,CAClD,CACF,CAKD,IAAI,eAAiB,CACnB,MAAMyE,EAAiH,CAAE,EACzH,UAAWrD,KAAS,KAAK,OACvBqD,EAAc,KAAK,CAAE,EAAGrD,EAAM,EAAG,EAAGA,EAAM,cAAe,cAAe,EAAG,aAAc,EAAG,UAAWA,EAAM,UAAW,EAE1H,OAAO,IAAIlB,EAAOuE,CAAa,CAChC,CAYD,OAAQ,CACN,OAAAC,EACA,KAAAhF,EAAO,GACP,MAAAiF,EAAQ,QACR,UAAAC,EAAY,EACZ,aAAAC,EAAe,GACf,cAAAC,EAAgB,CAAE,CACnB,EAAG,GAAI,CACN,OAAO,IAAIC,EAAM,KAAM,CACrB,OAAAL,EACA,KAAAhF,EACA,MAAAiF,EACA,UAAAC,EACA,aAAAC,EACA,cAAAC,CACN,CAAK,CACF,CACH,EA7YE1E,EAAA,YAAAkB,EAAqB,UAAG,CACtB,MAAM0D,EAAI,CAAE,EACZ,QAASzE,EAAI,EAAGA,EAAI,KAAK,EAAI,EAAGA,IAC9ByE,EAAE,KAAK,KAAK,MAAMzE,CAAC,EAAE,QAAQ,EAE/B,OAAOyE,CACR,EAySD3E,EAAA,YAAAqB,EAAO,SAAC1B,EAAG,CACL,OAAOA,GAAM,WACXA,aAAa4C,EACf5C,EAAIA,EAAE,eACGA,aAAaiF,IACtBjF,EAAIA,EAAE,SAAU,IAGpB,IAAIkF,EAAU,GACV9B,EAAI,EACR,QAAS7C,EAAI,EAAGA,EAAI,KAAK,EAAI,EAAGA,IAC9B,GAAIP,GAAK,KAAK,EAAEO,CAAC,GAAKP,GAAK,KAAK,EAAEO,EAAI,CAAC,EAAG,CACxC6C,EAAI7C,EACJ2E,EAAU,GACV,KACD,CAEH,GAAKA,EAQH,OAAO,KAAK,UAAU9B,CAAC,EAAEpD,CAAC,EARd,CACZ,MAAMwE,EAAa,QAAQ,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,EAAE,KAAK,EAAI,CAAC,CAAC,IAC5D,cAAO,OAAO,yFAA2F,CACvG,EAAAxE,EACA,WAAAwE,CACR,CAAO,EACM,GACb,CAGG,EA5ZI,IAAMW,EAANjF,EAseA,SAASkF,GAAQzF,EAAQ,CAC9B,OAAO,IAAIwF,EAAOxF,CAAM,CAC1B,CAOO,SAASW,EAAYX,EAAQ,CAClC,IAAI0F,EAAQC,EAAQC,EAAcC,EAAaC,EAC/C,QAASlF,EAAI,EAAGA,EAAIZ,EAAO,OAAS,EAAGY,IACrC,QAASmF,EAAInF,EAAI,EAAGmF,EAAI/F,EAAO,OAAQ+F,IACrC,GAAI/F,EAAOY,CAAC,EAAE,EAAIZ,EAAO+F,CAAC,EAAE,EAC1BL,EAAS1F,EAAOY,CAAC,EAAE,EACnB+E,EAAS3F,EAAOY,CAAC,EAAE,EACnBgF,EAAe5F,EAAOY,CAAC,EAAE,cACzBiF,EAAc7F,EAAOY,CAAC,EAAE,aACxBkF,EAAiB9F,EAAOY,CAAC,EAAE,UAC3BZ,EAAOY,CAAC,EAAE,EAAIZ,EAAO+F,CAAC,EAAE,EACxB/F,EAAOY,CAAC,EAAE,EAAIZ,EAAO+F,CAAC,EAAE,EACxB/F,EAAOY,CAAC,EAAE,cAAgBZ,EAAO+F,CAAC,EAAE,cACpC/F,EAAOY,CAAC,EAAE,aAAeZ,EAAO+F,CAAC,EAAE,aACnC/F,EAAOY,CAAC,EAAE,UAAYZ,EAAO+F,CAAC,EAAE,UAChC/F,EAAO+F,CAAC,EAAE,EAAIL,EACd1F,EAAO+F,CAAC,EAAE,EAAIJ,EACd3F,EAAO+F,CAAC,EAAE,cAAgBH,EAC1B5F,EAAO+F,CAAC,EAAE,aAAeF,EACzB7F,EAAO+F,CAAC,EAAE,UAAYD,UACbE,EAAKhG,EAAOY,CAAC,EAAE,EAAGZ,EAAO+F,CAAC,EAAE,CAAC,EACtC,MAAO,GAIb,MAAO,EACT,CAMO,MAAMX,UAAca,CAAgB,CAUzC,YAAaR,EAAQ,CACnB,OAAAV,EACA,KAAAhF,EAAO,GACP,MAAAiF,EAAQ,QACR,UAAAC,EAAY,EACZ,aAAAC,EAAe,GACf,cAAAC,EAAgB,CAAE,CACnB,EAAG,GAAI,CACN,MAAO,EACP,MAAMe,EAAS,CAAE,EACX,CAAE,KAAArG,EAAM,KAAAgE,EAAM,KAAAT,EAAM,KAAAC,CAAM,EAAGoC,EAAO,YAAa,EACvD,KAAK,SAAW,CAAC5F,EAAMuD,EAAMS,EAAMR,CAAI,EACvC,QAASzC,EAAI,EAAGA,EAAI6E,EAAO,EAAI,EAAG7E,IAAK,CACrC,GAAI6E,EAAO,MAAM7E,CAAC,EAAE,IAAM,EACxBsF,EAAO,KAAK,IAAIC,EAAOV,EAAO,UAAU7E,CAAC,EAAG,CAC1C,OAAAmE,EACA,UAAAE,EACA,MAAAD,EACA,KAAAjF,EACA,KAAM0F,EAAO,EAAE7E,CAAC,EAChB,KAAM6E,EAAO,EAAE7E,EAAI,CAAC,CAC9B,CAAS,CAAC,MACG,CACL,MAAMoB,EAAI,IAAIoE,EAAQX,EAAO,EAAE7E,CAAC,EAAImE,EAAO,OAAQU,EAAO,EAAE7E,CAAC,EAAImE,EAAO,OAAQU,EAAO,EAAE7E,EAAI,CAAC,EAAImE,EAAO,OAAQU,EAAO,UAAU7E,CAAC,EAAE6E,EAAO,EAAE7E,EAAI,CAAC,CAAC,EAAImE,EAAO,OAAQC,CAAK,EAC5KhD,EAAE,UAAYiD,EACdiB,EAAO,KAAKlE,CAAC,CACd,CACD,GAAIkD,GAAgBO,EAAO,SAAS7E,CAAC,EAAG,CACtC,MAAMa,EAAQ4E,EAAMZ,EAAO,EAAE7E,CAAC,EAAG6E,EAAO,EAAE7E,CAAC,CAAC,EACtC0F,EAAaC,EAAW9E,CAAK,EAC/B0D,IACEA,EAAc,QAChBmB,EAAW,MAAQE,EAAmBrB,EAAc,KAAK,EACzDmB,EAAW,qBAAuBE,EAAmBrB,EAAc,KAAK,GAEtEA,EAAc,YAChBmB,EAAW,UAAYnB,EAAc,WAEnCA,EAAc,QAChBmB,EAAW,MAAQnB,EAAc,OAE/BA,EAAc,SAChBmB,EAAW,OAASnB,EAAc,SAGtCe,EAAO,KAAKI,CAAU,CACvB,CACF,CACD,GAAIpB,GAAgBO,EAAO,SAASA,EAAO,EAAI,CAAC,EAAG,CACjD,MAAMhE,EAAQ4E,EAAMZ,EAAO,EAAEA,EAAO,EAAI,CAAC,EAAGA,EAAO,EAAEA,EAAO,EAAI,CAAC,CAAC,EAC5Da,EAAaC,EAAW9E,CAAK,EAC/B0D,IACEA,EAAc,QAChBmB,EAAW,MAAQE,EAAmBrB,EAAc,KAAK,EACzDmB,EAAW,qBAAuBE,EAAmBrB,EAAc,KAAK,GAEtEA,EAAc,YAChBmB,EAAW,UAAYnB,EAAc,WAEnCA,EAAc,QAChBmB,EAAW,MAAQnB,EAAc,OAE/BA,EAAc,SAChBmB,EAAW,OAASnB,EAAc,SAGtCe,EAAO,KAAKI,CAAU,CACvB,CACD,KAAK,IAAM,SAAUG,EAAO,CAC1B,IAAIC,EAAO,GACX,UAAWC,KAAST,EAClBQ,GAAQ;AAAA,GAASC,EAAM,IAAIF,CAAK,EAElC,OAAOC,CACR,EACD,KAAK,KAAO,UAAY,CACtB,IAAIA,EAAO,GACX,UAAWC,KAAST,EAClBQ,GAAQ;AAAA,GAASC,EAAM,KAAM,EAE/B,OAAOD,CACR,CACF,CACH"}