File: /home/mmtprep/public_html/mathzen.mmtprep.com/assets/6G14-eZRiDtBQ.js.map
{"version":3,"file":"6G14-eZRiDtBQ.js","sources":["../../src/exercices/6e/6G14.js"],"sourcesContent":["import { codageAngleDroit } from '../../lib/2d/angles.js'\nimport {\n droite,\n droiteParPointEtParallele,\n droiteParPointEtPente,\n droiteParPointEtPerpendiculaire\n} from '../../lib/2d/droites.js'\nimport { point, pointIntersectionDD, pointSurDroite } from '../../lib/2d/points.js'\nimport { segment } from '../../lib/2d/segmentsVecteurs.js'\nimport { latexParCoordonneesBox } from '../../lib/2d/textes.js'\nimport { rotation } from '../../lib/2d/transformations.js'\nimport { choice, combinaisonListesSansChangerOrdre, shuffle } from '../../lib/outils/arrayOutils'\nimport { range, rangeMinMax } from '../../lib/outils/nombres'\nimport Exercice from '../deprecatedExercice.js'\nimport { mathalea2d, vide2d } from '../../modules/2dGeneralites.js'\nimport { context } from '../../modules/context.js'\nimport {\n listeQuestionsToContenu,\n randint,\n egal,\n contraindreValeur,\n gestionnaireFormulaireTexte\n} from '../../modules/outils.js'\n\nexport const amcReady = true\nexport const amcType = 'AMCOpen'\nexport const titre = 'Use the properties of perpendicular lines'\n\n/**\n * Ref 6G14\n * @author Jean-Claude Lhote (EE : pour l'ajout d'AMC et la possibilité de sélectionner différents mélanges)\n * @author Mickael Guironnet (refactoring avec ajout des 4 à 6 et des figures)\n * publié le 22/11/2020\n */\nexport const uuid = '6a336'\nexport const ref = '6G14'\nexport default function ProprietesParallelesPerpendiculaires () {\n Exercice.call(this)\n this.nbQuestions = 3\n this.nbCols = 1\n this.nbColsCorr = 1\n this.sup = 4\n this.sup2 = false\n this.sup3 = true\n this.correctionDetailleeDisponible = true\n this.correctionDetaillee = false\n this.nouvelleVersion = function () {\n this.autoCorrection = []\n const typesDeQuestionsDisponibles = []\n let questionsParNiveau = []\n if (!this.sup2) {\n questionsParNiveau.push(range(3))\n questionsParNiveau.push(rangeMinMax(4, 6))\n questionsParNiveau.push(rangeMinMax(9, 15))\n questionsParNiveau.push(rangeMinMax(19, 31, 20))\n questionsParNiveau.push(questionsParNiveau[0].concat(questionsParNiveau[1].concat(questionsParNiveau[2]).concat(questionsParNiveau[3])))\n } else {\n questionsParNiveau = [[2], [5], [15], [31], [2, 5, 15, 31]]\n }\n let QuestionsDisponibles = []\n const IndiceNew = [0, 0, 0, 0, 0]\n let NumQuestionsDisponibles\n QuestionsDisponibles = gestionnaireFormulaireTexte({\n saisie: this.sup,\n min: 1,\n max: 4,\n defaut: 5,\n melange: 5,\n nbQuestions: this.nbQuestions,\n shuffle: true\n })\n for (let i = 0; i < this.nbQuestions; i++) { // on a un tableau avec des strings : ['1', '1', '2']\n NumQuestionsDisponibles = contraindreValeur(1, 5, parseInt(QuestionsDisponibles[i % QuestionsDisponibles.length]), 4) - 1\n typesDeQuestionsDisponibles[i] = choice(questionsParNiveau[NumQuestionsDisponibles], typesDeQuestionsDisponibles.slice(IndiceNew[NumQuestionsDisponibles])) // Ce slice permet de gérer, par exemple, le mélange 1-1-2 pour 10 questions car il n'y a pas assez de choix différents pour le mélange 1.\n if (typesDeQuestionsDisponibles[i] === undefined) { // Dans le cas, on a épuisé tous les choix différents d'un mélange\n IndiceNew[NumQuestionsDisponibles] = i\n typesDeQuestionsDisponibles[i] = choice(questionsParNiveau[NumQuestionsDisponibles], typesDeQuestionsDisponibles.slice(IndiceNew[NumQuestionsDisponibles]))\n }\n }\n const listeTypeDeQuestions = combinaisonListesSansChangerOrdre(\n typesDeQuestionsDisponibles,\n this.nbQuestions\n )\n\n this.listeQuestions = [] // Liste de questions\n this.listeCorrections = [] // Liste de questions corrigées\n const droiteColor = (context.isHtml ? ['red', 'blue', 'green', 'black', 'magenta', '#f15929'] : ['black', 'black', 'black', 'black', 'black', 'black'])\n\n for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {\n texte = ''\n texteCorr = ''\n\n const numDroites = shuffle([1, 2, 3, 4, 5])\n // constRightNumbers = [1, 2, 3, 4, 5]\n const d = []\n const dE = []\n const P = []\n const objets = []\n const objets2 = []\n let code = []\n let code2 = []\n\n switch (listeTypeDeQuestions[i]) {\n // \\n1: One step (0 to 3)\\n2: One step with distractor (4 to 6)\\n3: Two steps (9 to 15)\\n4: Three steps (19 to 31)\\n5 : Blend']\n case 0: // si 1//2 et 2//3 alors 1//3\n code = [[1, 2, 1], [2, 3, 1]]\n break\n case 1: // si 1//2 et 2T3 alors 1T3\n code = [[1, 2, 1], [2, 3, -1]]\n break\n case 2: // si 1T2 et 2T3 alors 1//3\n code = [[1, 2, -1], [2, 3, -1]]\n break\n case 3: // si 1T2 et 2//3 alors 1T3\n code = [[1, 2, -1], [2, 3, 1]]\n break\n case 4: // si 1T2 et 2//3 alors 1T3 et 4 distracteur\n code = [[1, 2, -1], [2, 3, 1]]\n code2 = [[1, 4, 1]]\n break\n case 5: // si 1T2 et 2T3 alors 1//3 et 4 distracteur\n code = [[1, 2, -1], [2, 3, -1]]\n code2 = [[2, 4, 1]]\n break\n case 6: // si 1//2 et 2//3 alors 1//3 et 4 distracteur\n code = [[1, 2, 1], [2, 3, 1]]\n code2 = [[1, 4, -1]]\n break\n case 8: // Si 1//2 et 2//3 et 3//4 alors 1//4\n code = [[1, 2, 1], [2, 3, 1], [3, 4, 1]]\n break\n case 9: // Si 1//2 et 2//3 et 3T4 alors 1T4\n code = [[1, 2, 1], [2, 3, 1], [3, 4, -1]]\n break\n case 10: // Si 1//2 et 2T3 et 3//4 alors 1T4\n code = [[1, 2, 1], [2, 3, 1], [3, 4, 1]]\n break\n case 11: // Si 1//2 et 2T3 et 3T4 alors 1//4\n code = [[1, 2, 1], [2, 3, -1], [3, 4, -1]]\n break\n case 12: // Si 1T2 et 2//3 et 3//4 alors 1T4\n code = [[1, 2, -1], [2, 3, 1], [3, 4, 1]]\n break\n case 13: // Si 1T2 et 2//3 et 3T4 alors 1//4\n code = [[1, 2, -1], [2, 3, 1], [3, 4, -1]]\n break\n case 14: // Si 1T2 et 2T3 et 3//4 alors 1//4\n code = [[1, 2, -1], [2, 3, -1], [3, 4, 1]]\n break\n case 15: // Si 1T2 et 2T3 et 3T4 alors 1T4\n code = [[1, 2, -1], [2, 3, -1], [3, 4, -1]]\n break\n case 16: // Si 1//2 et 2//3 et 3//4 et 4//5 alors 1//5\n code = [[1, 2, 1], [2, 3, 1], [3, 4, 1], [4, 5, 1]]\n break\n case 17: // Si 1//2 et 2//3 et 3T4 et 4//5 alors 1T5\n code = [[1, 2, 1], [2, 3, 1], [3, 4, -1], [4, 5, 1]]\n break\n case 18: // Si 1//2 et 2T3 et 3//4 et 4//5 alors 1T5\n code = [[1, 2, 1], [2, 3, -1], [3, 4, 1], [4, 5, 1]]\n break\n case 19: // Si 1//2 et 2T3 et 3T4 et 4//5 alors 1//5\n code = [[1, 2, 1], [2, 3, -1], [3, 4, -1], [4, 5, 1]]\n break\n case 20: // Si 1T2 et 2//3 et 3//4 et 4//5 alors 1T5\n code = [[1, 2, -1], [2, 3, 1], [3, 4, 1], [4, 5, 1]]\n break\n case 21: // Si 1T2 et 2//3 et 3T4 et 4//5 alors 1//5\n code = [[1, 2, -1], [2, 3, 1], [3, 4, -1], [4, 5, 1]]\n break\n case 22: // Si 1T2 et 2T3 et 3//4 et 4//5 alors 1//5\n code = [[1, 2, -1], [2, 3, -1], [3, 4, 1], [4, 5, 1]]\n break\n case 23: // Si 1T2 et 2T3 et 3T4 et 4//5 alors 1T5\n code = [[1, 2, -1], [2, 3, -1], [3, 4, -1], [4, 5, 1]]\n break\n case 24: // Si 1//2 et 2//3 et 3//4 et 4T5 alors 1T5\n code = [[1, 2, 1], [2, 3, 1], [3, 4, 1], [4, 5, -1]]\n break\n case 25: // Si 1//2 et 2//3 et 3T4 et 4T5 alors 1//5\n code = [[1, 2, 1], [2, 3, 1], [3, 4, -1], [4, 5, -1]]\n break\n case 26: // Si 1//2 et 2T3 et 3//4 et 4T5 alors 1//5\n code = [[1, 2, 1], [2, 3, -1], [3, 4, 1], [4, 5, -1]]\n break\n case 27: // Si 1//2 et 2T3 et 3T4 et 4T5 alors 1T5\n code = [[1, 2, 1], [2, 3, -1], [3, 4, -1], [4, 5, -1]]\n break\n case 28: // Si 1T2 et 2//3 et 3//4 et 4T5 alors 1//5\n code = [[1, 2, -1], [2, 3, 1], [3, 4, 1], [4, 5, -1]]\n break\n case 29: // Si 1T2 et 2//3 et 3T4 et 4T5 alors 1T5\n code = [[1, 2, -1], [2, 3, 1], [3, 4, -1], [4, 5, -1]]\n break\n case 30: // Si 1T2 et 2T3 et 3//4 et 4T5 alors 1T5\n code = [[1, 2, -1], [2, 3, -1], [3, 4, 1], [4, 5, -1]]\n break\n case 31: // Si 1T2 et 2T3 et 3T4 et 4T5 alors 1//5\n code = [[1, 2, -1], [2, 3, -1], [3, 4, -1], [4, 5, -1]]\n break\n }\n\n // mixed statement\n const couleurd = []\n const phrases = []\n texte += 'We know that'\n couleurd.push(randint(0, 5))\n const codeAll = code.concat(code2)\n for (let j = 0; j < codeAll.length; j++) {\n let textetemp = `$(d_${numDroites[codeAll[j][0] - 1]})`\n if (codeAll[j][2] === 1) {\n textetemp += '||'\n couleurd.push(couleurd[j])\n } else {\n textetemp += '\\\\perp'\n couleurd.push((couleurd[j] + 1) % 6)\n }\n textetemp += `(d_${numDroites[codeAll[j][1] - 1]})$`\n phrases.push(textetemp)\n }\n // sentences=shuffle(sentences)\n for (let j = 0; j < codeAll.length - 1; j++) {\n texte += phrases[j]\n if (j !== codeAll.length - 2) texte += ','\n else texte += ' And'\n }\n texte += phrases[codeAll.length - 1] + '.<br>'\n\n // construction of the figure\n context.fenetreMathalea2d = [-2, -2, 15, 10] // important avec la création des droites\n const labels = []\n P.push(point(0, 0))\n let droiteP = droiteParPointEtPente(P[0], randint(-1, 1, -2) / 10, '', droiteColor[couleurd[0]])\n droiteP.epaisseur = 2\n droite.pointilles = false\n d.push(droiteP)\n const droiteE = droite(point(droiteP.x1, droiteP.y1), point(droiteP.x2, droiteP.y2), '')\n droiteE.epaisseur = 2\n dE.push(droiteE)\n labels.push(labelOnLine(droiteE, `$(d_${numDroites[codeAll[0][0] - 1]})$`))\n objets.push(d[0])\n objets2.push(dE[0])\n for (let x = 0; x < codeAll.length; x++) {\n if (codeAll[x][2] === 1) {\n P.push(point((x + 1) * 2, (x + 1) * 2))\n droiteP = droiteParPointEtParallele(P[x + 1], d[codeAll[x][0] - 1], '', droiteColor[couleurd[x + 1]])\n droiteP.epaisseur = 2\n droiteP.pointilles = d[[codeAll[x][0] - 1]].pointilles\n d.push(droiteP)\n const droiteP2 = droite(point(droiteP.x1, droiteP.y1), point(droiteP.x2, droiteP.y2), '')\n droiteP2.epaisseur = 2\n dE.push(droiteP2)\n labels.push(labelOnLine(droiteP2, `$(d_${numDroites[codeAll[x][1] - 1]})$`))\n } else {\n P.push(point((x + 1) * 2, (x + 1) * 2))\n droiteP = droiteParPointEtPerpendiculaire(P[x + 1], d[codeAll[x][0] - 1], '', droiteColor[couleurd[x + 1]])\n droiteP.epaisseur = 2\n droiteP.pointilles = x % 3 + 1\n d.push(droiteP)\n const droiteP2 = droite(point(droiteP.x1, droiteP.y1), point(droiteP.x2, droiteP.y2), '')\n labels.push(labelOnLine(droiteP2, `$(d_${numDroites[codeAll[x][1] - 1]})$`))\n droiteP2.epaisseur = 2\n dE.push(droiteP2)\n const Inter = pointIntersectionDD(d[codeAll[x][0] - 1], droiteP)\n const PP = rotation(P[x + 1], Inter, 90)\n objets.push(codageAngleDroit(PP, Inter, P[x + 1], 'black', 0.6))\n objets2.push(codageAngleDroit(PP, Inter, P[x + 1], 'black', 0.6))\n }\n objets.push(d[x + 1])\n objets2.push(dE[x + 1])\n }\n objets2.push(...labels)\n objets.push(...labels)\n\n if (this.sup3) {\n texte += (context.vue === 'diap' ? '<center>' : '') + mathalea2d({\n xmin: -2,\n xmax: 15,\n ymin: -2,\n ymax: 10,\n pixelsParCm: 20,\n scale: (context.vue !== 'latex' ? 0.3 : 0.6),\n mainlevee: false,\n amplitude: 0.3\n }, objets2) + '<br>' + (context.vue === 'diap' ? '</center>' : '')\n }\n texte += `What can we say about $(d_${numDroites[code[0][0] - 1]})$ and $(d_${numDroites[code[code.length - 1][1] - 1]})$?`\n if (context.isAmc && !this.sup3) {\n texte += ' We can help ourselves by drawing a figure.'\n }\n\n // orderly reasoning correction\n texteCorr = 'From the statement, we can create the following diagram (there are an infinite number of them).<br>'\n if ([2, 5, 15, 31].indexOf(listeTypeDeQuestions[i]) === -1 && !this.sup2) {\n texteCorr += ' The parallel lines given in the statement are the same'\n texteCorr += (context.html) ? ' color/style.<br>' : 'style.<br>'\n }\n texteCorr += mathalea2d({\n xmin: -2,\n xmax: 15,\n ymin: -2,\n ymax: 10,\n pixelsParCm: 20,\n scale: (context.vue !== 'latex' ? 0.3 : 0.6),\n mainlevee: false,\n amplitude: 0.3\n }, objets) + '<br>'\n for (let j = 0; j < code.length - 1; j++) {\n if (this.correctionDetaillee) texteCorr += 'We know that :'\n else texteCorr += 'As'\n texteCorr += `$(d_${numDroites[code[j][0] - 1]})`\n if (code[j][2] === 1) texteCorr += '||'\n else texteCorr += '\\\\perp'\n texteCorr += `(d_${numDroites[code[j][1] - 1]})$ and`\n texteCorr += `$(d_${numDroites[code[j + 1][0] - 1]})`\n if (code[j + 1][2] === 1) texteCorr += '||'\n else texteCorr += '\\\\perp'\n texteCorr += `(d_${numDroites[code[j + 1][1] - 1]})$`\n // what property?\n if (code[j][2] * code[j + 1][2] === -1) { // Une parallèle et une perpendiculaire\n if (this.correctionDetaillee) texteCorr += '.<br> Now “If two lines are parallel then any line perpendicular to one is also perpendicular to the other”.<br>So'\n else texteCorr += ', we deduce that'\n texteCorr += ` $(d_${numDroites[code[0][0] - 1]})\\\\perp(d_${numDroites[code[j + 1][1] - 1]})$.<br>`\n code[j + 1][0] = code[j][0]\n code[j + 1][2] = -1\n } else if (code[j][2] > 0) { // deux parallèles\n if (this.correctionDetaillee) texteCorr += '.<br> Or “If two lines are parallel to the same line then they are parallel to each other”.<br>So'\n else texteCorr += ', we deduce that'\n texteCorr += ` $(d_${numDroites[code[0][0] - 1]})||(d_${numDroites[code[j + 1][1] - 1]})$.<br>`\n code[j + 1][0] = code[j][0]\n code[j + 1][2] = 1\n } else { // deux perpendiculaires\n if (this.correctionDetaillee) texteCorr += '.<br> Or “If two lines are perpendicular to the same line then they are parallel to each other”.<br>So'\n else texteCorr += ', we deduce that'\n texteCorr += ` $(d_${numDroites[code[0][0] - 1]})||(d_${numDroites[code[j + 1][1] - 1]})$.<br>`\n code[j + 1][0] = code[j][0]\n code[j + 1][2] = 1\n }\n }\n\n /** ********************** AMC Open *****************************/\n this.autoCorrection[i] = {}\n this.autoCorrection[i].options = { ordered: false }\n this.autoCorrection[i].enonce = texte + '<br>'\n this.autoCorrection[i].propositions = [\n {\n texte: texteCorr,\n statut: 3\n }\n ]\n /****************************************************/\n\n if (this.listeQuestions.indexOf(texte) === -1) {\n // If the question has never been asked, we create another one\n this.listeQuestions.push(texte + '<br>')\n this.listeCorrections.push(texteCorr + '<br>')\n i++\n }\n cpt++\n }\n\n listeQuestionsToContenu(this)\n }\n this.besoinFormulaireTexte = ['Number of reasoning steps', 'Numbers separated by hyphens\\n1: One step\\n2: One step with distractor\\n3: Two steps\\n4: Three steps\\n5: Mix']\n this.besoinFormulaire2CaseACocher = ['Only perpendiculars', false]\n this.besoinFormulaire3CaseACocher = ['With the drawing', true]\n}\n\n/**\n * Ajouter une étiquette sur une droite.\n * @param {*} droite La droite où on va rajouter une étiquette\n * @param {*} nom Le nom de la droite doit être au format latex, c'est-à-dire compris entre $ et $\n * @param {*} options Les options permettant de personnaliser la position de l'étiquette et la mise en forme\n * options.preferedPosition La position à privilégier si possible sur le bord de l\"image ('left\", 'right', 'above', 'below')\n * options.usedPosition Un tableau des anciennes positions déjà allouées pour éviter les colisions avec des étiquettes d'autres droites\n * options.taille La taille de la police de l'étiquette par défaut 6\n * options.color La couleur de l\"default label 'red\"\n * @returns LatexParCoordonneesBox L'étiquette\n *\n * Exemple :\n * context.fenetreMathalea2d = [xmin + 0.2, ymin, xmax, ymax] // important pour la position des labels\n * const d3nom = labelOnLine(d3, '$' + noms[3] + '$', { color: 'blue', taille: 8, preferedPosition: 'left' })\n * const d0nom = labelOnLine(d0, '$' + noms[0] + '$', { color: 'red', taille: 8, usedPosition: [d3nom] })\n *\n * @author Mickael Guironnet\n */\nexport function labelOnLine (droite, nom, options = {}) {\n if (options.preferedPosition === undefined) options.preferedPosition = 'auto'\n if (options.usedPosition === undefined) options.usedPosition = []\n if (options.taille === undefined) options.taille = 6\n if (options.color === undefined) options.color = 'red'\n\n const debug = false\n\n // const width = Math.ceil((name.replaceAll('$', '').length) * 10 * Math.log10(options.size))\n const largeur = Math.ceil((nom.replaceAll('$', '').length) * options.taille * 10 / 12)\n const hauteur = 20\n let absNom, ordNom, leNom, anchor, usedPosition\n const positions = []\n if (nom !== '') {\n if (egal(droite.b, 0, 0.05)) { // ax+c=0 x=-c/a est l'équation de la droite\n // almost vertical line\n absNom = -droite.c / droite.a + largeur * 0.5 / context.pixelsParCm + 2 / context.pixelsParCm\n ordNom = context.fenetreMathalea2d[1] + 1 // l'ordonnée du label est ymin +1\n anchor = 'right'\n usedPosition = 'below'\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n } else if (egal(droite.a, 0, 0.05)) { // by+c=0 y=-c/b est l'équation de la droite\n // almost horizontal straight line\n absNom = context.fenetreMathalea2d[0] + 1 // l'abscisse du label est xmin +1\n ordNom = -droite.c / droite.b + hauteur * 0.5 / context.pixelsParCm\n anchor = 'above'\n usedPosition = 'left'\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n } else { // a et b sont différents de 0 ax+by+c=0 est l'équation\n // y=(-a.x-c)/b is the Cartesian equation and x=(-by-c)/a\n const y0 = (-droite.a * (context.fenetreMathalea2d[0] + 1) - droite.c) / droite.b\n const y1 = (-droite.a * (context.fenetreMathalea2d[2] - 1) - droite.c) / droite.b\n const x0 = (-droite.b * (context.fenetreMathalea2d[1] + 1) - droite.c) / droite.a\n const x1 = (-droite.b * (context.fenetreMathalea2d[3] - 1) - droite.c) / droite.a\n if (y0 > context.fenetreMathalea2d[1] && y0 < context.fenetreMathalea2d[3]) {\n // on the left: either below or below\n absNom = context.fenetreMathalea2d[0] + 1\n ordNom = y0 - droite.pente * (largeur * 0.5 / context.pixelsParCm) + (droite.pente > 0 ? -1 : 1) * hauteur * 0.5 / context.pixelsParCm\n anchor = (droite.pente > 0 ? 'below' : 'above')\n usedPosition = 'left'\n if (ordNom < context.fenetreMathalea2d[1] + 1 || ordNom > context.fenetreMathalea2d[3] - 1) {\n if (debug) console.log('problem:name:' + nom + ':position:' + usedPosition + (context.fenetreMathalea2d[1] + 1) + '<' + ordNom + '<' + (context.fenetreMathalea2d[3] - 1))\n } else {\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n // on the left: either below or below\n absNom = context.fenetreMathalea2d[0] + 1\n ordNom = y0 + droite.pente * (largeur * 0.5 / context.pixelsParCm) - (droite.pente > 0 ? -1 : 1) * hauteur * 0.5 / context.pixelsParCm\n anchor = (droite.pente > 0 ? 'above' : 'below')\n usedPosition = 'left'\n if (ordNom < context.fenetreMathalea2d[1] + 1 || ordNom > context.fenetreMathalea2d[3] - 1) {\n if (debug) console.log('problem:name:' + nom + ':position:' + usedPosition + (context.fenetreMathalea2d[1] + 1) + '<' + ordNom + '<' + (context.fenetreMathalea2d[3] - 1))\n } else {\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n }\n if (y1 > context.fenetreMathalea2d[1] && y1 < context.fenetreMathalea2d[3]) {\n // to the right\n absNom = context.fenetreMathalea2d[2] - 1\n ordNom = y1 - droite.pente * (largeur * 0.5 / context.pixelsParCm) + (droite.pente > 0 ? -1 : 1) * hauteur * 0.5 / context.pixelsParCm\n anchor = (droite.pente > 0 ? 'below' : 'above')\n usedPosition = 'right'\n if (ordNom < context.fenetreMathalea2d[1] + 1 || ordNom > context.fenetreMathalea2d[3] - 1) {\n if (debug) console.log('problem:name:' + nom + ':position:' + usedPosition + (context.fenetreMathalea2d[1] + 1) + '<' + ordNom + '<' + (context.fenetreMathalea2d[3] - 1))\n } else {\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n }\n if (x0 > context.fenetreMathalea2d[0] && x0 < context.fenetreMathalea2d[2]) {\n // bottom: either left or right\n absNom = x0 + (droite.pente > 0 ? -1 : 1) * largeur * 0.5 / context.pixelsParCm - (droite.pente > 0 ? 1 : 1) * (hauteur * 0.5 / context.pixelsParCm) / droite.pente - (droite.pente > 0 ? 1 : -1) * 2 / context.pixelsParCm\n ordNom = context.fenetreMathalea2d[1] + 1\n anchor = (droite.pente > 0 ? 'left' : 'right')\n usedPosition = 'below'\n if (absNom < context.fenetreMathalea2d[0] + 1 || absNom > context.fenetreMathalea2d[2] - 1) {\n if (debug) console.log('problem:name:' + nom + ':position:' + usedPosition + (context.fenetreMathalea2d[0] + 1) + '<' + absNom + '<' + (context.fenetreMathalea2d[2] - 1))\n } else {\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n // down on the other side\n absNom = x0 - (droite.pente > 0 ? -1 : 1) * largeur * 0.5 / context.pixelsParCm + (droite.pente > 0 ? 1 : 1) * (hauteur * 0.5 / context.pixelsParCm) / droite.pente + (droite.pente > 0 ? 1 : -1) * 2 / context.pixelsParCm\n ordNom = context.fenetreMathalea2d[1] + 1\n anchor = (droite.pente > 0 ? 'right' : 'left')\n usedPosition = 'below'\n if (absNom < context.fenetreMathalea2d[0] + 1 || absNom > context.fenetreMathalea2d[2] - 1) {\n if (debug) console.log('problem:name:' + nom + ':position:' + usedPosition + (context.fenetreMathalea2d[0] + 1) + '<' + absNom + '<' + (context.fenetreMathalea2d[2] - 1))\n } else {\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n }\n if (x1 > context.fenetreMathalea2d[0] && x1 < context.fenetreMathalea2d[2]) {\n // at the top: either left or right\n absNom = x1 + (droite.pente > 0 ? -1 : 1) * largeur * 0.5 / context.pixelsParCm - (droite.pente > 0 ? 1 : 1) * (hauteur * 0.5 / context.pixelsParCm) / droite.pente - (droite.pente > 0 ? 1 : -1) * 2 / context.pixelsParCm\n ordNom = context.fenetreMathalea2d[3] - 1\n anchor = (droite.pente > 0 ? 'left' : 'right')\n usedPosition = 'above'\n if (absNom < context.fenetreMathalea2d[0] + 1 || absNom > context.fenetreMathalea2d[2] - 1) {\n if (debug) console.log('problem:name:' + nom + ':position:' + usedPosition + (context.fenetreMathalea2d[0] + 1) + '<' + absNom + '<' + (context.fenetreMathalea2d[2] - 1))\n } else {\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n // at the top of the other side\n absNom = x1 - (droite.pente > 0 ? -1 : 1) * largeur * 0.5 / context.pixelsParCm + (droite.pente > 0 ? 1 : 1) * (hauteur * 0.5 / context.pixelsParCm) / droite.pente + (droite.pente > 0 ? 1 : -1) * 2 / context.pixelsParCm\n ordNom = context.fenetreMathalea2d[3] - 1\n anchor = (droite.pente > 0 ? 'right' : 'left')\n usedPosition = 'above'\n if (absNom < context.fenetreMathalea2d[0] + 1 || absNom > context.fenetreMathalea2d[2] - 1) {\n if (debug) console.log('problem:name:' + nom + ':position:' + usedPosition + (context.fenetreMathalea2d[0] + 1) + '<' + absNom + '<' + (context.fenetreMathalea2d[2] - 1))\n } else {\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n }\n let xgauche, xdroite\n if (y0 > context.fenetreMathalea2d[1] && y0 < context.fenetreMathalea2d[3]) {\n xgauche = context.fenetreMathalea2d[0]\n } else {\n xgauche = Math.min(x0, x1)\n }\n if (y1 > context.fenetreMathalea2d[1] && y1 < context.fenetreMathalea2d[3]) {\n xdroite = context.fenetreMathalea2d[2]\n } else {\n xdroite = Math.max(x0, x1)\n }\n // between\n absNom = (xgauche + xdroite) / 2\n ordNom = pointSurDroite(droite, absNom).y\n anchor = (droite.pente > 0 ? 'left' : 'right')\n usedPosition = 'middle'\n leNom = latexParCoordonneesBox(nom.substr(1, nom.length - 2), absNom, ordNom, options.color, largeur, hauteur, 'white', options.taille, { anchor })\n positions.push({ label: leNom, position: usedPosition, anch: anchor })\n }\n\n // check if there are collisions between labels\n for (let i = 0; i < positions.length; i++) {\n if (positions[i].position === 'middle') continue\n const coli = []\n for (let j = 0; j < options.usedPosition.length; j++) {\n const label = options.usedPosition[j]\n const dis = segment(point(label.x, label.y), point(positions[i].label.x, positions[i].label.y)).longueur * context.pixelsParCm\n // collision of two rectangles\n const XYlabel = [label.x * context.pixelsParCm - label.largeur / 2, label.x * context.pixelsParCm + label.largeur / 2, label.y * context.pixelsParCm - label.hauteur / 2, label.y * context.pixelsParCm + label.hauteur / 2]\n const XYlabel2 = [positions[i].label.x * context.pixelsParCm - positions[i].label.largeur / 2, positions[i].label.x * context.pixelsParCm + positions[i].label.largeur / 2, positions[i].label.y * context.pixelsParCm - positions[i].label.hauteur / 2, positions[i].label.y * context.pixelsParCm + positions[i].label.hauteur / 2]\n if (debug) console.log('coli:name:' + nom + ':position:' + positions[i].position + ':i:' + i + ':j:' + j + ':say:' + dis.toFixed(2) + ':text:' + label.texte + ':XYlabel:' + XYlabel[0].toFixed(1) + ',' + XYlabel[1].toFixed(1) + ',' + XYlabel[2].toFixed(1) + ',' + XYlabel[3].toFixed(1) + ':XYlabel2:' + XYlabel2[0].toFixed(1) + ',' + XYlabel2[1].toFixed(1) + ',' + XYlabel2[2].toFixed(1) + ',' + XYlabel2[3].toFixed(1))\n const colision = (XYlabel[0] < XYlabel2[1]) && (XYlabel[1] > XYlabel2[0]) && (XYlabel[2] < XYlabel2[3]) && (XYlabel[3] > XYlabel2[2])\n // collision of two circles\n const r0 = Math.max(label.largeur / 2, label.hauteur / 2)\n const r1 = Math.max(positions[i].label.largeur / 2, positions[i].label.hauteur / 2)\n let colision2 = true\n if (dis > r0 + r1 || dis < Math.abs(r0 - r1)) colision2 = false\n coli[j] = [dis, colision]\n if (debug) console.log('coli:name:' + nom + ':position:' + positions[i].position + ':anchor:' + positions[i].anch + ':i:' + i + ':j:' + j + ':say:' + dis.toFixed(2) + 'text:' + label.texte + ':collision:' + (colision ? '1' : '0') + ':coli_cer:' + (colision2 ? '1' : '0'))\n }\n positions[i].colision = coli\n }\n // 1st strategy: user preference\n // we only check if there is a collision\n const found = [false, 0]\n for (let i = 0; i < positions.length && !found[0]; i++) {\n if (positions[i].position === 'middle') continue\n if (positions[i].position === options.preferedPosition) {\n found[0] = true\n for (let j = 0; j < options.usedPosition.length; j++) {\n if (positions[i].colision[j][1]) found[0] = false\n if (debug) console.log('1st:name:' + nom + ':position:' + positions[i].position + ':i:' + i + ':j:' + j + ':collision:' + positions[i].colision[j][1] + ':preferredPosition:' + options.preferedPosition)\n }\n found[1] = i\n }\n }\n\n // 2nd strategy: the furthest in terms of distance!\n let disMax = [0, 0, 0]\n for (let i = 0; i < positions.length && !found[0] && options.usedPosition.length > 0; i++) {\n if (positions[i].position === 'middle') continue\n let dis = [1000, 0, 0]\n for (let j = 0; j < options.usedPosition.length; j++) {\n if (positions[i].colision[j][0] < dis[0]) {\n dis = [positions[i].colision[j][0], i, j]\n if (debug) console.log('2nd:name:' + nom + ':position:' + positions[i].position + ':anchor:' + positions[i].anch + ':i:' + i + ':j:' + j + 'say:' + dis[0].toFixed(2) + ':collision:' + positions[i].colision[j][1])\n }\n }\n if (dis[0] > disMax[0]) {\n disMax = dis\n if (debug) console.log('Max 2nd:name:' + nom + ':position:' + positions[i].position + ':anchor:' + positions[i].anch + ':i:' + i + 'say:' + dis[0].toFixed(2))\n }\n }\n let colision = false\n if (disMax[0] > 0) {\n colision = positions[disMax[1]].colision[disMax[2]][1]\n if (debug) console.log('Max end: 2nd:name:' + nom + ':position:' + positions[disMax[1]].position + ':anchor:' + positions[disMax[1]].anch + ':i:' + disMax[1] + ':j:' + disMax[2] + 'disMax:' + disMax[0] + ':collision:' + positions[disMax[1]].colision[disMax[2]][1])\n }\n // 1st: if preference then Ok otherwise furthest distance without overlap otherwise the first solution if no comparison otherwise the last middle\n leNom = found[0] ? positions[found[1]].label : (disMax[0] > 0 && !colision ? positions[disMax[1]].label : positions[options.usedPosition.length === 0 ? 0 : positions.length - 1].label)\n } else {\n leNom = vide2d()\n }\n return leNom\n}\n"],"names":["amcReady","amcType","titre","uuid","ref","ProprietesParallelesPerpendiculaires","Exercice","typesDeQuestionsDisponibles","questionsParNiveau","range","rangeMinMax","QuestionsDisponibles","IndiceNew","NumQuestionsDisponibles","gestionnaireFormulaireTexte","i","contraindreValeur","choice","listeTypeDeQuestions","combinaisonListesSansChangerOrdre","droiteColor","context","texte","texteCorr","cpt","numDroites","shuffle","d","dE","P","objets","objets2","code","code2","couleurd","phrases","randint","codeAll","j","textetemp","labels","point","droiteP","droiteParPointEtPente","droite","droiteE","labelOnLine","x","droiteParPointEtParallele","droiteP2","droiteParPointEtPerpendiculaire","Inter","pointIntersectionDD","PP","rotation","codageAngleDroit","mathalea2d","listeQuestionsToContenu","nom","options","largeur","hauteur","absNom","ordNom","leNom","anchor","usedPosition","positions","egal","latexParCoordonneesBox","y0","y1","x0","x1","xgauche","xdroite","pointSurDroite","coli","label","dis","segment","XYlabel","XYlabel2","colision","found","disMax","vide2d"],"mappings":"gOAwBY,MAACA,GAAW,GACXC,GAAU,UACVC,GAAQ,4CAQRC,GAAO,QACPC,GAAM,OACJ,SAASC,IAAwC,CAC9DC,EAAS,KAAK,IAAI,EAClB,KAAK,YAAc,EACnB,KAAK,OAAS,EACd,KAAK,WAAa,EAClB,KAAK,IAAM,EACX,KAAK,KAAO,GACZ,KAAK,KAAO,GACZ,KAAK,8BAAgC,GACrC,KAAK,oBAAsB,GAC3B,KAAK,gBAAkB,UAAY,CACjC,KAAK,eAAiB,CAAE,EACxB,MAAMC,EAA8B,CAAE,EACtC,IAAIC,EAAqB,CAAE,EACtB,KAAK,KAORA,EAAqB,CAAC,CAAC,CAAC,EAAG,CAAC,CAAC,EAAG,CAAC,EAAE,EAAG,CAAC,EAAE,EAAG,CAAC,EAAG,EAAG,GAAI,EAAE,CAAC,GAN1DA,EAAmB,KAAKC,EAAM,CAAC,CAAC,EAChCD,EAAmB,KAAKE,EAAY,EAAG,CAAC,CAAC,EACzCF,EAAmB,KAAKE,EAAY,EAAG,EAAE,CAAC,EAC1CF,EAAmB,KAAKE,EAAY,GAAI,GAAI,EAAE,CAAC,EAC/CF,EAAmB,KAAKA,EAAmB,CAAC,EAAE,OAAOA,EAAmB,CAAC,EAAE,OAAOA,EAAmB,CAAC,CAAC,EAAE,OAAOA,EAAmB,CAAC,CAAC,CAAC,CAAC,GAIzI,IAAIG,EAAuB,CAAE,EAC7B,MAAMC,EAAY,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,EAChC,IAAIC,EACJF,EAAuBG,EAA4B,CACjD,OAAQ,KAAK,IACb,IAAK,EACL,IAAK,EACL,OAAQ,EACR,QAAS,EACT,YAAa,KAAK,YAClB,QAAS,EACf,CAAK,EACD,QAASC,EAAI,EAAGA,EAAI,KAAK,YAAaA,IACpCF,EAA0BG,EAAkB,EAAG,EAAG,SAASL,EAAqBI,EAAIJ,EAAqB,MAAM,CAAC,EAAG,CAAC,EAAI,EACxHJ,EAA4BQ,CAAC,EAAIE,EAAOT,EAAmBK,CAAuB,EAAGN,EAA4B,MAAMK,EAAUC,CAAuB,CAAC,CAAC,EACtJN,EAA4BQ,CAAC,IAAM,SACrCH,EAAUC,CAAuB,EAAIE,EACrCR,EAA4BQ,CAAC,EAAIE,EAAOT,EAAmBK,CAAuB,EAAGN,EAA4B,MAAMK,EAAUC,CAAuB,CAAC,CAAC,GAG9J,MAAMK,EAAuBC,EAC3BZ,EACA,KAAK,WACN,EAED,KAAK,eAAiB,CAAE,EACxB,KAAK,iBAAmB,CAAE,EAC1B,MAAMa,EAAeC,EAAQ,OAAS,CAAC,MAAO,OAAQ,QAAS,QAAS,UAAW,SAAS,EAAI,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAErJ,QAASN,EAAI,EAAGO,EAAOC,EAAWC,EAAM,EAAGT,EAAI,KAAK,aAAeS,EAAM,IAAK,CAC5EF,EAAQ,GACRC,EAAY,GAEZ,MAAME,EAAaC,EAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,EAEpCC,EAAI,CAAE,EACNC,EAAK,CAAE,EACPC,EAAI,CAAE,EACNC,EAAS,CAAE,EACXC,EAAU,CAAE,EAClB,IAAIC,EAAO,CAAE,EACTC,EAAQ,CAAE,EAEd,OAAQf,EAAqBH,CAAC,EAAC,CAE7B,IAAK,GACHiB,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAC5B,MACF,IAAK,GACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EAC7B,MACF,IAAK,GACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EAC9B,MACF,IAAK,GACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAC7B,MACF,IAAK,GACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAC7BC,EAAQ,CAAC,CAAC,EAAG,EAAG,CAAC,CAAC,EAClB,MACF,IAAK,GACHD,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EAC9BC,EAAQ,CAAC,CAAC,EAAG,EAAG,CAAC,CAAC,EAClB,MACF,IAAK,GACHD,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAC5BC,EAAQ,CAAC,CAAC,EAAG,EAAG,EAAE,CAAC,EACnB,MACF,IAAK,GACHD,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACvC,MACF,IAAK,GACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACxC,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACvC,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACzC,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACxC,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACzC,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACzC,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EAC1C,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAClD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACnD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACnD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACpD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACnD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACpD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACpD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACrD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACnD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACpD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACpD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACrD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACpD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACrD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACrD,MACF,IAAK,IACHA,EAAO,CAAC,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EACtD,KACH,CAGD,MAAME,EAAW,CAAE,EACbC,EAAU,CAAE,EAClBb,GAAS,eACTY,EAAS,KAAKE,EAAQ,EAAG,CAAC,CAAC,EAC3B,MAAMC,EAAUL,EAAK,OAAOC,CAAK,EACjC,QAASK,EAAI,EAAGA,EAAID,EAAQ,OAAQC,IAAK,CACvC,IAAIC,EAAY,OAAOd,EAAWY,EAAQC,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,IAChDD,EAAQC,CAAC,EAAE,CAAC,IAAM,GACpBC,GAAa,KACbL,EAAS,KAAKA,EAASI,CAAC,CAAC,IAEzBC,GAAa,SACbL,EAAS,MAAMA,EAASI,CAAC,EAAI,GAAK,CAAC,GAErCC,GAAa,MAAMd,EAAWY,EAAQC,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,KAChDH,EAAQ,KAAKI,CAAS,CACvB,CAED,QAASD,EAAI,EAAGA,EAAID,EAAQ,OAAS,EAAGC,IACtChB,GAASa,EAAQG,CAAC,EACdA,IAAMD,EAAQ,OAAS,EAAGf,GAAS,IAClCA,GAAS,OAEhBA,GAASa,EAAQE,EAAQ,OAAS,CAAC,EAAI,QAGvChB,EAAQ,kBAAoB,CAAC,GAAI,GAAI,GAAI,EAAE,EAC3C,MAAMmB,EAAS,CAAE,EACjBX,EAAE,KAAKY,EAAM,EAAG,CAAC,CAAC,EAClB,IAAIC,EAAUC,EAAsBd,EAAE,CAAC,EAAGO,EAAQ,GAAI,EAAG,EAAE,EAAI,GAAI,GAAIhB,EAAYc,EAAS,CAAC,CAAC,CAAC,EAC/FQ,EAAQ,UAAY,EACpBE,EAAO,WAAa,GACpBjB,EAAE,KAAKe,CAAO,EACd,MAAMG,EAAUD,EAAOH,EAAMC,EAAQ,GAAIA,EAAQ,EAAE,EAAGD,EAAMC,EAAQ,GAAIA,EAAQ,EAAE,EAAG,EAAE,EACvFG,EAAQ,UAAY,EACpBjB,EAAG,KAAKiB,CAAO,EACfL,EAAO,KAAKM,EAAYD,EAAS,OAAOpB,EAAWY,EAAQ,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,IAAI,CAAC,EAC1EP,EAAO,KAAKH,EAAE,CAAC,CAAC,EAChBI,EAAQ,KAAKH,EAAG,CAAC,CAAC,EAClB,QAASmB,EAAI,EAAGA,EAAIV,EAAQ,OAAQU,IAAK,CACvC,GAAIV,EAAQU,CAAC,EAAE,CAAC,IAAM,EAAG,CACvBlB,EAAE,KAAKY,GAAOM,EAAI,GAAK,GAAIA,EAAI,GAAK,CAAC,CAAC,EACtCL,EAAUM,EAA0BnB,EAAEkB,EAAI,CAAC,EAAGpB,EAAEU,EAAQU,CAAC,EAAE,CAAC,EAAI,CAAC,EAAG,GAAI3B,EAAYc,EAASa,EAAI,CAAC,CAAC,CAAC,EACpGL,EAAQ,UAAY,EACpBA,EAAQ,WAAaf,EAAE,CAACU,EAAQU,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,EAAE,WAC5CpB,EAAE,KAAKe,CAAO,EACd,MAAMO,EAAWL,EAAOH,EAAMC,EAAQ,GAAIA,EAAQ,EAAE,EAAGD,EAAMC,EAAQ,GAAIA,EAAQ,EAAE,EAAG,EAAE,EACxFO,EAAS,UAAY,EACrBrB,EAAG,KAAKqB,CAAQ,EAChBT,EAAO,KAAKM,EAAYG,EAAU,OAAOxB,EAAWY,EAAQU,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,IAAI,CAAC,CACrF,KAAe,CACLlB,EAAE,KAAKY,GAAOM,EAAI,GAAK,GAAIA,EAAI,GAAK,CAAC,CAAC,EACtCL,EAAUQ,EAAgCrB,EAAEkB,EAAI,CAAC,EAAGpB,EAAEU,EAAQU,CAAC,EAAE,CAAC,EAAI,CAAC,EAAG,GAAI3B,EAAYc,EAASa,EAAI,CAAC,CAAC,CAAC,EAC1GL,EAAQ,UAAY,EACpBA,EAAQ,WAAaK,EAAI,EAAI,EAC7BpB,EAAE,KAAKe,CAAO,EACd,MAAMO,EAAWL,EAAOH,EAAMC,EAAQ,GAAIA,EAAQ,EAAE,EAAGD,EAAMC,EAAQ,GAAIA,EAAQ,EAAE,EAAG,EAAE,EACxFF,EAAO,KAAKM,EAAYG,EAAU,OAAOxB,EAAWY,EAAQU,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,IAAI,CAAC,EAC3EE,EAAS,UAAY,EACrBrB,EAAG,KAAKqB,CAAQ,EAChB,MAAME,EAAQC,EAAoBzB,EAAEU,EAAQU,CAAC,EAAE,CAAC,EAAI,CAAC,EAAGL,CAAO,EACzDW,EAAKC,EAASzB,EAAEkB,EAAI,CAAC,EAAGI,EAAO,EAAE,EACvCrB,EAAO,KAAKyB,EAAiBF,EAAIF,EAAOtB,EAAEkB,EAAI,CAAC,EAAG,QAAS,EAAG,CAAC,EAC/DhB,EAAQ,KAAKwB,EAAiBF,EAAIF,EAAOtB,EAAEkB,EAAI,CAAC,EAAG,QAAS,EAAG,CAAC,CACjE,CACDjB,EAAO,KAAKH,EAAEoB,EAAI,CAAC,CAAC,EACpBhB,EAAQ,KAAKH,EAAGmB,EAAI,CAAC,CAAC,CACvB,CACDhB,EAAQ,KAAK,GAAGS,CAAM,EACtBV,EAAO,KAAK,GAAGU,CAAM,EAEjB,KAAK,OACPlB,IAAUD,EAAQ,MAAQ,OAAS,WAAa,IAAMmC,EAAW,CAC/D,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,YAAa,GACb,MAAQnC,EAAQ,MAAQ,QAAU,GAAM,GACxC,UAAW,GACX,UAAW,EACrB,EAAWU,CAAO,EAAI,QAAUV,EAAQ,MAAQ,OAAS,YAAc,KAEjEC,GAAS,6BAA6BG,EAAWO,EAAK,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,cAAcP,EAAWO,EAAKA,EAAK,OAAS,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,MAClHX,EAAQ,OAAS,CAAC,KAAK,OACzBC,GAAS,+CAIXC,EAAY,sGACR,CAAC,EAAG,EAAG,GAAI,EAAE,EAAE,QAAQL,EAAqBH,CAAC,CAAC,IAAM,IAAM,CAAC,KAAK,OAClEQ,GAAa,0DACbA,GAAcF,EAAQ,KAAQ,oBAAsB,cAEtDE,GAAaiC,EAAW,CACtB,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,YAAa,GACb,MAAQnC,EAAQ,MAAQ,QAAU,GAAM,GACxC,UAAW,GACX,UAAW,EACnB,EAASS,CAAM,EAAI,OACb,QAASQ,EAAI,EAAGA,EAAIN,EAAK,OAAS,EAAGM,IAC/B,KAAK,oBAAqBf,GAAa,iBACtCA,GAAa,KAClBA,GAAa,OAAOE,EAAWO,EAAKM,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,IAC1CN,EAAKM,CAAC,EAAE,CAAC,IAAM,EAAGf,GAAa,KAC9BA,GAAa,SAClBA,GAAa,MAAME,EAAWO,EAAKM,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,SAC7Cf,GAAa,OAAOE,EAAWO,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,IAC9CN,EAAKM,EAAI,CAAC,EAAE,CAAC,IAAM,EAAGf,GAAa,KAClCA,GAAa,SAClBA,GAAa,MAAME,EAAWO,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,KAE7CN,EAAKM,CAAC,EAAE,CAAC,EAAIN,EAAKM,EAAI,CAAC,EAAE,CAAC,IAAM,IAC9B,KAAK,oBAAqBf,GAAa,qHACtCA,GAAa,mBAClBA,GAAa,QAAQE,EAAWO,EAAK,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,aAAaP,EAAWO,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,UAC1FN,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAIN,EAAKM,CAAC,EAAE,CAAC,EAC1BN,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,IACRN,EAAKM,CAAC,EAAE,CAAC,EAAI,GAClB,KAAK,oBAAqBf,GAAa,oGACtCA,GAAa,mBAClBA,GAAa,QAAQE,EAAWO,EAAK,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,SAASP,EAAWO,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,UACtFN,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAIN,EAAKM,CAAC,EAAE,CAAC,EAC1BN,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,IAEb,KAAK,oBAAqBf,GAAa,yGACtCA,GAAa,mBAClBA,GAAa,QAAQE,EAAWO,EAAK,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,SAASP,EAAWO,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,UACtFN,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAIN,EAAKM,CAAC,EAAE,CAAC,EAC1BN,EAAKM,EAAI,CAAC,EAAE,CAAC,EAAI,GAKrB,KAAK,eAAevB,CAAC,EAAI,CAAE,EAC3B,KAAK,eAAeA,CAAC,EAAE,QAAU,CAAE,QAAS,EAAO,EACnD,KAAK,eAAeA,CAAC,EAAE,OAASO,EAAQ,OACxC,KAAK,eAAeP,CAAC,EAAE,aAAe,CACpC,CACE,MAAOQ,EACP,OAAQ,CACT,CACF,EAGG,KAAK,eAAe,QAAQD,CAAK,IAAM,KAEzC,KAAK,eAAe,KAAKA,EAAQ,MAAM,EACvC,KAAK,iBAAiB,KAAKC,EAAY,MAAM,EAC7CR,KAEFS,GACD,CAEDiC,EAAwB,IAAI,CAC7B,EACD,KAAK,sBAAwB,CAAC,4BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA,OAA8G,EACzK,KAAK,6BAA+B,CAAC,sBAAuB,EAAK,EACjE,KAAK,6BAA+B,CAAC,mBAAoB,EAAI,CAC/D,CAoBO,SAASX,EAAaF,EAAQc,EAAKC,EAAU,CAAA,EAAI,CAClDA,EAAQ,mBAAqB,SAAWA,EAAQ,iBAAmB,QACnEA,EAAQ,eAAiB,SAAWA,EAAQ,aAAe,CAAE,GAC7DA,EAAQ,SAAW,SAAWA,EAAQ,OAAS,GAC/CA,EAAQ,QAAU,SAAWA,EAAQ,MAAQ,OAKjD,MAAMC,EAAU,KAAK,KAAMF,EAAI,WAAW,IAAK,EAAE,EAAE,OAAUC,EAAQ,OAAS,GAAK,EAAE,EAC/EE,EAAU,GAChB,IAAIC,EAAQC,EAAQC,EAAOC,EAAQC,EACnC,MAAMC,EAAY,CAAE,EACpB,GAAIT,IAAQ,GAAI,CACd,GAAIU,EAAKxB,EAAO,EAAG,EAAG,GAAI,EAExBkB,EAAS,CAAClB,EAAO,EAAIA,EAAO,EAAIgB,EAAU,GAAMvC,EAAQ,YAAc,EAAIA,EAAQ,YAClF0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,EACxC4C,EAAS,QACTC,EAAe,QACfF,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,UAC5DG,EAAKxB,EAAO,EAAG,EAAG,GAAI,EAE/BkB,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,EACxC0C,EAAS,CAACnB,EAAO,EAAIA,EAAO,EAAIiB,EAAU,GAAMxC,EAAQ,YACxD4C,EAAS,QACTC,EAAe,OACfF,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,MAChE,CAEL,MAAMK,GAAM,CAAC1B,EAAO,GAAKvB,EAAQ,kBAAkB,CAAC,EAAI,GAAKuB,EAAO,GAAKA,EAAO,EAC1E2B,GAAM,CAAC3B,EAAO,GAAKvB,EAAQ,kBAAkB,CAAC,EAAI,GAAKuB,EAAO,GAAKA,EAAO,EAC1E4B,GAAM,CAAC5B,EAAO,GAAKvB,EAAQ,kBAAkB,CAAC,EAAI,GAAKuB,EAAO,GAAKA,EAAO,EAC1E6B,GAAM,CAAC7B,EAAO,GAAKvB,EAAQ,kBAAkB,CAAC,EAAI,GAAKuB,EAAO,GAAKA,EAAO,EAC5E0B,EAAKjD,EAAQ,kBAAkB,CAAC,GAAKiD,EAAKjD,EAAQ,kBAAkB,CAAC,IAEvEyC,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,EACxC0C,EAASO,EAAK1B,EAAO,OAASgB,EAAU,GAAMvC,EAAQ,cAAgBuB,EAAO,MAAQ,EAAI,GAAK,GAAKiB,EAAU,GAAMxC,EAAQ,YAC3H4C,EAAUrB,EAAO,MAAQ,EAAI,QAAU,QACvCsB,EAAe,OACXH,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,GAAK0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,IAGvF2C,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,GAGvEH,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,EACxC0C,EAASO,EAAK1B,EAAO,OAASgB,EAAU,GAAMvC,EAAQ,cAAgBuB,EAAO,MAAQ,EAAI,GAAK,GAAKiB,EAAU,GAAMxC,EAAQ,YAC3H4C,EAAUrB,EAAO,MAAQ,EAAI,QAAU,QACvCsB,EAAe,OACXH,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,GAAK0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,IAGvF2C,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,IAGrEM,EAAKlD,EAAQ,kBAAkB,CAAC,GAAKkD,EAAKlD,EAAQ,kBAAkB,CAAC,IAEvEyC,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,EACxC0C,EAASQ,EAAK3B,EAAO,OAASgB,EAAU,GAAMvC,EAAQ,cAAgBuB,EAAO,MAAQ,EAAI,GAAK,GAAKiB,EAAU,GAAMxC,EAAQ,YAC3H4C,EAAUrB,EAAO,MAAQ,EAAI,QAAU,QACvCsB,EAAe,QACXH,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,GAAK0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,IAGvF2C,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,IAGrEO,EAAKnD,EAAQ,kBAAkB,CAAC,GAAKmD,EAAKnD,EAAQ,kBAAkB,CAAC,IAEvEyC,EAASU,GAAM5B,EAAO,MAAQ,EAAI,GAAK,GAAKgB,EAAU,GAAMvC,EAAQ,aAAeuB,EAAO,MAAQ,EAAI,GAAUiB,EAAU,GAAMxC,EAAQ,aAAeuB,EAAO,QAASA,EAAO,MAAQ,EAAI,EAAI,IAAM,EAAIvB,EAAQ,YAChN0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,EACxC4C,EAAUrB,EAAO,MAAQ,EAAI,OAAS,QACtCsB,EAAe,QACXJ,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,GAAKyC,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,IAGvF2C,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,GAGvEH,EAASU,GAAM5B,EAAO,MAAQ,EAAI,GAAK,GAAKgB,EAAU,GAAMvC,EAAQ,aAAeuB,EAAO,MAAQ,EAAI,GAAUiB,EAAU,GAAMxC,EAAQ,aAAeuB,EAAO,QAASA,EAAO,MAAQ,EAAI,EAAI,IAAM,EAAIvB,EAAQ,YAChN0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,EACxC4C,EAAUrB,EAAO,MAAQ,EAAI,QAAU,OACvCsB,EAAe,QACXJ,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,GAAKyC,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,IAGvF2C,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,IAGrEQ,EAAKpD,EAAQ,kBAAkB,CAAC,GAAKoD,EAAKpD,EAAQ,kBAAkB,CAAC,IAEvEyC,EAASW,GAAM7B,EAAO,MAAQ,EAAI,GAAK,GAAKgB,EAAU,GAAMvC,EAAQ,aAAeuB,EAAO,MAAQ,EAAI,GAAUiB,EAAU,GAAMxC,EAAQ,aAAeuB,EAAO,QAASA,EAAO,MAAQ,EAAI,EAAI,IAAM,EAAIvB,EAAQ,YAChN0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,EACxC4C,EAAUrB,EAAO,MAAQ,EAAI,OAAS,QACtCsB,EAAe,QACXJ,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,GAAKyC,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,IAGvF2C,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,GAGvEH,EAASW,GAAM7B,EAAO,MAAQ,EAAI,GAAK,GAAKgB,EAAU,GAAMvC,EAAQ,aAAeuB,EAAO,MAAQ,EAAI,GAAUiB,EAAU,GAAMxC,EAAQ,aAAeuB,EAAO,QAASA,EAAO,MAAQ,EAAI,EAAI,IAAM,EAAIvB,EAAQ,YAChN0C,EAAS1C,EAAQ,kBAAkB,CAAC,EAAI,EACxC4C,EAAUrB,EAAO,MAAQ,EAAI,QAAU,OACvCsB,EAAe,QACXJ,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,GAAKyC,EAASzC,EAAQ,kBAAkB,CAAC,EAAI,IAGvF2C,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,IAGzE,IAAIS,EAASC,EACTL,EAAKjD,EAAQ,kBAAkB,CAAC,GAAKiD,EAAKjD,EAAQ,kBAAkB,CAAC,EACvEqD,EAAUrD,EAAQ,kBAAkB,CAAC,EAErCqD,EAAU,KAAK,IAAIF,EAAIC,CAAE,EAEvBF,EAAKlD,EAAQ,kBAAkB,CAAC,GAAKkD,EAAKlD,EAAQ,kBAAkB,CAAC,EACvEsD,EAAUtD,EAAQ,kBAAkB,CAAC,EAErCsD,EAAU,KAAK,IAAIH,EAAIC,CAAE,EAG3BX,GAAUY,EAAUC,GAAW,EAC/BZ,EAASa,EAAehC,EAAQkB,CAAM,EAAE,EACxCG,EAAUrB,EAAO,MAAQ,EAAI,OAAS,QACtCsB,EAAe,SACfF,EAAQK,EAAuBX,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,EAAGI,EAAQC,EAAQJ,EAAQ,MAAOC,EAASC,EAAS,QAASF,EAAQ,OAAQ,CAAE,OAAAM,EAAQ,EAClJE,EAAU,KAAK,CAAE,MAAOH,EAAO,SAAUE,EAAc,KAAMD,EAAQ,CACtE,CAGD,QAAS,EAAI,EAAG,EAAIE,EAAU,OAAQ,IAAK,CACzC,GAAIA,EAAU,CAAC,EAAE,WAAa,SAAU,SACxC,MAAMU,EAAO,CAAE,EACf,QAASvC,EAAI,EAAGA,EAAIqB,EAAQ,aAAa,OAAQrB,IAAK,CACpD,MAAMwC,EAAQnB,EAAQ,aAAarB,CAAC,EAC9ByC,EAAMC,EAAQvC,EAAMqC,EAAM,EAAGA,EAAM,CAAC,EAAGrC,EAAM0B,EAAU,CAAC,EAAE,MAAM,EAAGA,EAAU,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,SAAW9C,EAAQ,YAE7G4D,EAAU,CAACH,EAAM,EAAIzD,EAAQ,YAAcyD,EAAM,QAAU,EAAGA,EAAM,EAAIzD,EAAQ,YAAcyD,EAAM,QAAU,EAAGA,EAAM,EAAIzD,EAAQ,YAAcyD,EAAM,QAAU,EAAGA,EAAM,EAAIzD,EAAQ,YAAcyD,EAAM,QAAU,CAAC,EACrNI,EAAW,CAACf,EAAU,CAAC,EAAE,MAAM,EAAI9C,EAAQ,YAAc8C,EAAU,CAAC,EAAE,MAAM,QAAU,EAAGA,EAAU,CAAC,EAAE,MAAM,EAAI9C,EAAQ,YAAc8C,EAAU,CAAC,EAAE,MAAM,QAAU,EAAGA,EAAU,CAAC,EAAE,MAAM,EAAI9C,EAAQ,YAAc8C,EAAU,CAAC,EAAE,MAAM,QAAU,EAAGA,EAAU,CAAC,EAAE,MAAM,EAAI9C,EAAQ,YAAc8C,EAAU,CAAC,EAAE,MAAM,QAAU,CAAC,EAE9TgB,EAAYF,EAAQ,CAAC,EAAIC,EAAS,CAAC,GAAOD,EAAQ,CAAC,EAAIC,EAAS,CAAC,GAAOD,EAAQ,CAAC,EAAIC,EAAS,CAAC,GAAOD,EAAQ,CAAC,EAAIC,EAAS,CAAC,EAExH,KAAK,IAAIJ,EAAM,QAAU,EAAGA,EAAM,QAAU,CAAC,EAC7C,KAAK,IAAIX,EAAU,CAAC,EAAE,MAAM,QAAU,EAAGA,EAAU,CAAC,EAAE,MAAM,QAAU,CAAC,EAGlFU,EAAKvC,CAAC,EAAI,CAACyC,EAAKI,CAAQ,CAEzB,CACDhB,EAAU,CAAC,EAAE,SAAWU,CACzB,CAGD,MAAMO,EAAQ,CAAC,GAAO,CAAC,EACvB,QAAS,EAAI,EAAG,EAAIjB,EAAU,QAAU,CAACiB,EAAM,CAAC,EAAG,IACjD,GAAIjB,EAAU,CAAC,EAAE,WAAa,UAC1BA,EAAU,CAAC,EAAE,WAAaR,EAAQ,iBAAkB,CACtDyB,EAAM,CAAC,EAAI,GACX,QAAS9C,EAAI,EAAGA,EAAIqB,EAAQ,aAAa,OAAQrB,IAC3C6B,EAAU,CAAC,EAAE,SAAS7B,CAAC,EAAE,CAAC,IAAG8C,EAAM,CAAC,EAAI,IAG9CA,EAAM,CAAC,EAAI,CACZ,CAIH,IAAIC,EAAS,CAAC,EAAG,EAAG,CAAC,EACrB,QAAS,EAAI,EAAG,EAAIlB,EAAU,QAAU,CAACiB,EAAM,CAAC,GAAKzB,EAAQ,aAAa,OAAS,EAAG,IAAK,CACzF,GAAIQ,EAAU,CAAC,EAAE,WAAa,SAAU,SACxC,IAAIY,EAAM,CAAC,IAAM,EAAG,CAAC,EACrB,QAASzC,EAAI,EAAGA,EAAIqB,EAAQ,aAAa,OAAQrB,IAC3C6B,EAAU,CAAC,EAAE,SAAS7B,CAAC,EAAE,CAAC,EAAIyC,EAAI,CAAC,IACrCA,EAAM,CAACZ,EAAU,CAAC,EAAE,SAAS7B,CAAC,EAAE,CAAC,EAAG,EAAGA,CAAC,GAIxCyC,EAAI,CAAC,EAAIM,EAAO,CAAC,IACnBA,EAASN,EAGZ,CACD,IAAII,EAAW,GACXE,EAAO,CAAC,EAAI,IACdF,EAAWhB,EAAUkB,EAAO,CAAC,CAAC,EAAE,SAASA,EAAO,CAAC,CAAC,EAAE,CAAC,GAIvDrB,EAAQoB,EAAM,CAAC,EAAIjB,EAAUiB,EAAM,CAAC,CAAC,EAAE,MAASC,EAAO,CAAC,EAAI,GAAK,CAACF,EAAWhB,EAAUkB,EAAO,CAAC,CAAC,EAAE,MAAQlB,EAAUR,EAAQ,aAAa,SAAW,EAAI,EAAIQ,EAAU,OAAS,CAAC,EAAE,KACtL,MACIH,EAAQsB,GAAQ,EAElB,OAAOtB,CACT"}