{
  "version": 3,
  "sources": ["/cdn/shop/t/31/assets/speckles-ar.js?b=cd2b"],
  "sourcesContent": ["/* =====================================================================\n   MUSEGLAM AR Try-On - module d'essayage virtuel (visage + levres)\n   Lit la config produit depuis .speckles-ar (data-*) et la carte\n   variantes JSON (.speckles-ar-cfg) posee par snippets/speckles-ar.liquid.\n   Suivi facial : MediaPipe Face Landmarker (100% navigateur, GPU).\n   Deux modes : \"speckles\" (patchs visage) et \"lips\" (gloss levres).\n   ===================================================================== */\nimport { FaceLandmarker, FilesetResolver }\n  from \"https://cdn.shopify.com/s/files/1/1016/8008/7383/files/museglam-mediapipe-vision.js?v=1780411741\";\n\n/* Ancrages du maillage 478 points (gauche / droite) selon le placement */\nconst ANCHORS = { cheeks:[50,280], undereye:[330,101], temple:[71,301] };\n\n/* Contour externe des levres (boucle fermee) - indices MediaPipe */\nconst LIPS_OUTER = [61,185,40,39,37,0,267,269,270,409,291,375,321,405,314,17,84,181,91,146];\n/* Contour interne (ouverture de la bouche) - evide pour ne pas glosser langue/dents */\nconst LIPS_INNER = [78,191,80,81,82,13,312,311,310,415,308,324,318,402,317,14,87,178,88,95];\n/* Ligne du sourire (coin a coin) pour placer les reflets de brillance */\nconst LIPS_CUPID = [0,267,269,270,409]; // demi-levre sup droite (repere)\n\n/* Couleur de secours par style de lueur */\nconst GLOW_HEX = { rose:'#f4b8d4', gold:'#e9c89a', ice:'#cfe8ff' };\n\n/* ===== FOND DE TEINT (essayage cushion TIRTIR) \u2014 zone peau + r\u00E9glages ===== */\nconst FACE_OVAL = [10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109];\nconst LEFT_EYE_RING  = [33,7,163,144,145,153,154,155,133,173,157,158,159,160,161,246];\nconst RIGHT_EYE_RING = [263,249,390,373,374,380,381,382,362,398,384,385,386,387,388,466];\nconst NOSE_RING = [6,1,2,98,327];   // nez (pont + bout + narines) \u2014 a PROTEGER du flou beaute (sinon nez ramolli / plus gros)\nconst LEFT_BROW  = [70,63,105,66,107,55,65,52,53,46];        // sourcil cote image gauche (exclu du fond de teint)\nconst RIGHT_BROW = [300,293,334,296,336,285,295,282,283,276]; // sourcil cote image droit  (exclu du fond de teint)\nconst FOUNDATION_INSET = 1.0;    // couvre tout l'ovale visage (agrandi : couvre un peu plus, jusqu'au contour du visage)\nconst FOUNDATION_FOREHEAD= 1.12; // LIFT DU FRONT (menton fixe, front etire vers le haut) -> couvre TOUT le front jusqu'a la racine des cheveux, gabarit TIRTIR. Voile soft-light INCHANGE. Reglable : monte si front coupe, baisse si ca mord les cheveux.\nconst FOUNDATION_BLEND = 'soft-light';  // voile SHEER transparent (la version \"presque correcte\" validee par l'utilisatrice) - on voit la peau a travers\nconst FOUNDATION_TINT    = 0.36;   // MONTE (0.30->0.36) : rendu juge trop CLAIR vs officiel. Voile plus present, TOUJOURS soft-light (PAS couvrance). Baisser si masque.\nconst FOUNDATION_FEATHER = 0.060;  // SANS BORD : bords bien fondus (fraction largeur visage) \u2014 aucune ligne de \"masque\"\nconst FOUNDATION_DEPTH_BOOST = 0.12; // opacite ADAPTATIVE : les teintes FONCEES montent en couvrance pour se LIRE foncees ; les claires restent sheer. 0 = desactive (toutes au meme TINT)\nconst FOUNDATION_TINT_MAX    = 0.40; // plafond opacite teinte la plus foncee (MONTE 0.52->0.58 : foncees encore trop claires au rendu). Baisser si masque.\nconst FOUNDATION_DEYELLOW    = 7;    // ANTI-JAUNE : retire du vert a la teinte (rendu juge trop JAUNE vs officiel red cushion = plus rose). 0 = off ; monter si encore jaune\nlet _foundCv = null;               // calque hors-ecran reutilise\n\n/* ===== LISSAGE DE PEAU (BEAUTY) \u2014 reglages ===== */\nlet _beautyCv = null;              // calque hors-ecran reutilise (video floutee + masque peau)\nconst BEAUTY_STRENGTH = 0.80;      // MONTE (0.72->0.80) : flou juge trop FAIBLE vs officiel ; >0.85 -> plastifie (flou bete). Vrai \"puissant+non destructeur\" = bilateral (a faire).\nconst BEAUTY_BLUR     = 0.030;     // rayon de flou (fraction largeur visage)\n\n/* ===== MOTEUR WEBGL FOND DE TEINT (FoundationGL) =====================\n   Calque WebGL EMPILE SOUS le canvas 2D. Cree UNIQUEMENT en mode foundation.\n   Teinte luminance-preserving (reflets/relief preserves) + profondeur AUTO\n   selon la clarte de la teinte + masque peau (yeux/sourcils/levres exclus, nez COUVERT).\n   Si WebGL indispo / shader echoue -> create() renvoie null -> repli Canvas\n   (drawBeauty + drawFoundation) inchange. GLOSS/PATCHS jamais touches. */\nconst FGL_COUVRANCE = 0.60;       // couvrance de base (reglable : monter=+couvrant)\nconst FGL_HLPROTECT = 0.85;       // protege reflets / highlighter\nconst FGL_SHADOWPROTECT = 0.50;   // protege le relief (creux) \u2014 anti-aplat\nlet _maskCv = null;               // calque masque peau hors-ecran (reutilise)\nlet glcv = null, GLE = null;      // canvas WebGL + instance moteur (foundation only)\n\nfunction fgDepth(col){ const l=(0.299*col[0]+0.587*col[1]+0.114*col[2])/255; return Math.max(0,Math.min(0.9,(1.0-l-0.15)*1.15)); }\n\n/* masque peau : ovale visage (inset + lift front) MOINS yeux/sourcils/levres (dilates),\n   bords fondus en UN flou. PAS de trou nez (un fond de teint couvre le nez ; son reflet\n   est protege par le shader). Rasterise en Canvas 2D -> uploade comme texture. */\nfunction buildFaceMask(lm, W, H){\n  const c = _maskCv || (_maskCv = document.createElement('canvas'));\n  if(c.width!==W || c.height!==H){ c.width=W; c.height=H; }\n  const m = c.getContext('2d'); m.setTransform(1,0,0,1,0,0); m.globalCompositeOperation='source-over'; m.clearRect(0,0,W,H);\n  const fl=lm[234], fr=lm[454]; const fw=(fl&&fr)?Math.hypot((fr.x-fl.x)*W,(fr.y-fl.y)*H):W*0.35;\n  const feather=Math.max(2,Math.round(fw*FOUNDATION_FEATHER));\n  let cx=0,cy=0,n=0; for(let i=0;i<FACE_OVAL.length;i++){ const p=lm[FACE_OVAL[i]]; if(p){cx+=p.x;cy+=p.y;n++;} } if(n){cx/=n;cy/=n;}\n  const chinY=lm[152]?lm[152].y:(cy+0.20);\n  m.fillStyle='#fff'; m.beginPath();\n  for(let i=0;i<FACE_OVAL.length;i++){ const p=lm[FACE_OVAL[i]]; if(!p) continue; const x=(cx+(p.x-cx)*FOUNDATION_INSET)*W, y=(chinY+(p.y-chinY)*FOUNDATION_FOREHEAD)*H; if(i===0) m.moveTo(x,y); else m.lineTo(x,y); }\n  m.closePath(); m.fill();\n  m.globalCompositeOperation='destination-out'; m.filter='blur('+feather+'px)';\n  const cut=function(idxs,grow){ grow=grow||1.0; let gx=0,gy=0,k=0; for(let i=0;i<idxs.length;i++){ const p=lm[idxs[i]]; if(p){gx+=p.x;gy+=p.y;k++;} } if(k){gx/=k;gy/=k;}\n    m.beginPath(); for(let i=0;i<idxs.length;i++){ const p=lm[idxs[i]]; if(!p) continue; const x=(gx+(p.x-gx)*grow)*W, y=(gy+(p.y-gy)*grow)*H; if(i===0) m.moveTo(x,y); else m.lineTo(x,y); } m.closePath(); m.fill(); };\n  cut(LEFT_EYE_RING,1.06); cut(RIGHT_EYE_RING,1.06); cut(LEFT_BROW,1.10); cut(RIGHT_BROW,1.10); cut(LIPS_OUTER,1.18);\n  m.filter='none'; m.globalCompositeOperation='source-over';\n  return c;\n}\n\nconst FoundationGL = (function(){\n  const VERT = 'attribute vec2 a_pos;varying vec2 v_uv;void main(){v_uv=vec2(a_pos.x*0.5+0.5,1.0-(a_pos.y*0.5+0.5));gl_Position=vec4(a_pos,0.0,1.0);}';\n  const FRAG = [\n    'precision highp float;varying vec2 v_uv;',\n    'uniform sampler2D u_img;uniform sampler2D u_mask;uniform float u_useMask;',\n    'uniform vec3 u_tint;uniform float u_couvrance;uniform float u_depth;uniform float u_hlProtect;uniform float u_shadowProtect;',\n    'vec3 toLin(vec3 c){return pow(max(c,0.0),vec3(2.2));}',\n    'vec3 toSrgb(vec3 c){return pow(max(c,0.0),vec3(1.0/2.2));}',\n    'float luma(vec3 l){return dot(l,vec3(0.2126,0.7152,0.0722));}',\n    'void main(){',\n    '  vec3 baseS=texture2D(u_img,v_uv).rgb;',\n    '  float skin=(u_useMask>0.5)?texture2D(u_mask,v_uv).a:1.0;',\n    '  vec3 base=toLin(baseS), tint=toLin(u_tint);',\n    '  float lb=luma(base), lt=max(luma(tint),0.0015);',\n    '  float Ld=mix(lb,lt,u_depth);',\n    '  float f=min(Ld/lt, 1.0/max(max(tint.r,tint.g),max(tint.b,0.0015)));',\n    '  vec3 colored=tint*f; vec3 res=mix(base,colored,u_couvrance);',\n    '  float hi=smoothstep(0.55,0.92,lb), lo=1.0-smoothstep(0.06,0.30,lb);',\n    '  res=mix(res,base,hi*u_hlProtect); res=mix(res,base,lo*u_shadowProtect);',\n    '  float mx=max(baseS.r,max(baseS.g,baseS.b)), mn=min(baseS.r,min(baseS.g,baseS.b));',\n    '  float sat=(mx-mn)/max(mx,1e-3); float spec=smoothstep(0.65,0.95,mx)*(1.0-smoothstep(0.15,0.45,sat));',\n    '  res=mix(res,base,spec*u_hlProtect);',\n    '  res=mix(base,res,skin);',\n    '  gl_FragColor=vec4(clamp(toSrgb(res),0.0,1.0),1.0);',\n    '}'\n  ].join('\\n');\n  function comp(gl,t,s){ const sh=gl.createShader(t); gl.shaderSource(sh,s); gl.compileShader(sh); if(!gl.getShaderParameter(sh,gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(sh)); return sh; }\n  return {\n    create:function(cnv){\n      let gl=null;\n      try{ gl = cnv.getContext('webgl',{alpha:false,premultipliedAlpha:false,antialias:false,depth:false,stencil:false,powerPreference:'default'}) || cnv.getContext('experimental-webgl'); }catch(e){ return null; }\n      if(!gl) return null;\n      let prog, buf, tex, texMask; const U={};\n      try{\n        prog=gl.createProgram(); gl.attachShader(prog,comp(gl,gl.VERTEX_SHADER,VERT)); gl.attachShader(prog,comp(gl,gl.FRAGMENT_SHADER,FRAG));\n        gl.linkProgram(prog); if(!gl.getProgramParameter(prog,gl.LINK_STATUS)) return null;\n        gl.useProgram(prog);\n        buf=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,buf);\n        gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),gl.STATIC_DRAW);\n        const loc=gl.getAttribLocation(prog,'a_pos'); gl.enableVertexAttribArray(loc); gl.vertexAttribPointer(loc,2,gl.FLOAT,false,0,0);\n        const mk=function(){ const t=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,t);\n          gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);\n          gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR); return t; };\n        tex=mk(); texMask=mk();\n        ['u_tint','u_couvrance','u_depth','u_hlProtect','u_shadowProtect','u_useMask'].forEach(function(n){ U[n]=gl.getUniformLocation(prog,n); });\n        U.img=gl.getUniformLocation(prog,'u_img'); U.mask=gl.getUniformLocation(prog,'u_mask'); gl.uniform1i(U.img,0); gl.uniform1i(U.mask,1);\n      }catch(e){ return null; }\n      return {\n        draw:function(video, maskCanvas, tint, P){\n          if(!video || !video.videoWidth) return;\n          const W=video.videoWidth, H=video.videoHeight;\n          if(cnv.width!==W||cnv.height!==H){ cnv.width=W; cnv.height=H; gl.viewport(0,0,W,H); }\n          gl.useProgram(prog);\n          gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,tex);\n          try{ gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,gl.RGB,gl.UNSIGNED_BYTE,video); }catch(e){ return; }\n          let useMask=0;\n          if(maskCanvas){ gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D,texMask); gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,maskCanvas); useMask=1; }\n          gl.uniform3fv(U.u_tint,tint); gl.uniform1f(U.u_couvrance,P.couvrance); gl.uniform1f(U.u_depth,P.depth);\n          gl.uniform1f(U.u_hlProtect,P.hlProtect); gl.uniform1f(U.u_shadowProtect,P.shadowProtect); gl.uniform1f(U.u_useMask,useMask);\n          gl.drawArrays(gl.TRIANGLES,0,6);\n        },\n        dispose:function(){ try{ if(tex)gl.deleteTexture(tex); if(texMask)gl.deleteTexture(texMask); if(buf)gl.deleteBuffer(buf); if(prog)gl.deleteProgram(prog); const e=gl.getExtension('WEBGL_lose_context'); if(e)e.loseContext(); }catch(_){} }\n      };\n    }\n  };\n})();\n\n/* ===== MOTEUR WEBGL PATCHS D\u00C9CO (PatchGL) ============================\n   M\u00CAME calque WebGL (.sar-gl) qu'en fond de teint, mais cr\u00E9\u00E9 en mode\n   \u00AB speckles \u00BB avec alpha:true -> calque TRANSPARENT par-dessus la <video>\n   (la vid\u00E9o reste VISIBLE derri\u00E8re). Plaque la bande de motifs sur la M\u00CAME\n   grille de pose que drawPatch (PATCH_TOP/MID/BOT, joue->nez->joue) mais en\n   VRAI mesh UV interpol\u00E9 GPU -> motif NET (fini les \u00AB \u00E9claboussures \u00BB du\n   mapping per-triangle Canvas). R\u00E9serv\u00E9 aux patchs D\u00C9CO (source-over,\n   dor\u00E9/argent/rouge/rose gold). Les patchs PEAU (rousseur/naturel) restent\n   sur le Canvas drawPatch (MULTIPLY) -> non touch\u00E9s. Si WebGL \u00E9choue,\n   create() renvoie null -> repli Canvas drawPatch inchang\u00E9.\n   GLOSS (drawLips) & FOND DE TEINT jamais touch\u00E9s.\n   Valeurs valid\u00E9es en labo (cam\u00E9ra + photo) : opacit\u00E9 0.17, taille 0.83. */\nconst PATCHGL_OP    = 0.45;     // opacit\u00E9 patch d\u00E9co (d\u00E9faut = r\u00E9glage RED valid\u00E9 live ; ajustable au curseur)\nconst PATCHGL_SCALE = 0.80;     // \u00E9chelle globale grille (d\u00E9faut RED)\nlet PATCH_OP_LIVE = PATCHGL_OP, PATCH_SC_LIVE = PATCHGL_SCALE;  // ajustables en direct via ?tune=1\nlet PATCH_OFF_LIVE = -0.10;     // d\u00E9calage vertical de la bande (>0 = remonte ; <0 = descend), en fraction hauteur visage\nlet PATCH_CURVE_LIVE = -0.15;   // courbure (>0 = arc/centre haut ; <0 = sourire/bords relev\u00E9s vers les pommettes)\nconst PGL_SUBDIV = 6;           // subdivisions colonnes PatchGL (plus fin que le Canvas -> motifs moins d\u00E9form\u00E9s)\nconst PATCHGL_OFF_DEF = -0.10, PATCHGL_CURVE_DEF = -0.15;   // d\u00E9fauts hauteur/courbe (repli si m\u00E9tachamp variante absent)\nconst TUNE_MODE = /[?&]tune=1/.test(location.search);        // panneau de r\u00E9glage : visible UNIQUEMENT avec ?tune=1\nlet PGL = null;                 // instance moteur patch (mode speckles uniquement)\n\n/* Placement du patch pour la VARIANTE COURANTE : en mode r\u00E9glage (?tune=1) = curseurs live ;\n   sinon = m\u00E9tachamps PAR VARIANTE (ar_patch_opacity/scale/offset/curve), repli sur les d\u00E9fauts. */\nfunction placementFor(v){\n  if(TUNE_MODE) return {op:PATCH_OP_LIVE, scale:PATCH_SC_LIVE, off:PATCH_OFF_LIVE, curve:PATCH_CURVE_LIVE};\n  let op=parseFloat(v&&v.patch_opacity); if(isNaN(op)) op=PATCHGL_OP; op=Math.max(0,Math.min(1,op));\n  let sc=parseFloat(v&&v.patch_scale);   if(isNaN(sc)||sc<=0) sc=PATCHGL_SCALE;\n  let of=parseFloat(v&&v.patch_offset);  if(isNaN(of)) of=PATCHGL_OFF_DEF;\n  let cu=parseFloat(v&&v.patch_curve);   if(isNaN(cu)) cu=PATCHGL_CURVE_DEF;\n  return {op:op, scale:sc, off:of, curve:cu};\n}\n\nconst PatchGL = (function(){\n  const VS = 'attribute vec2 a_pos;attribute vec2 a_uv;attribute float a_al;varying vec2 v_uv;varying float v_al;void main(){v_uv=a_uv;v_al=a_al;gl_Position=vec4(a_pos,0.0,1.0);}';\n  /* Sortie PR\u00C9MULTIPLI\u00C9E (rgb*a, a) \u2014 indispensable pour un calque transparent\n     (premultipliedAlpha:true) compos\u00E9 par-dessus la <video> DOM, sinon le motif\n     est att\u00E9nu\u00E9 deux fois et devient quasi invisible \u00E0 faible opacit\u00E9. */\n  const FS = 'precision mediump float;varying vec2 v_uv;varying float v_al;uniform sampler2D u_tex;uniform float u_op;void main(){vec4 t=texture2D(u_tex,v_uv);float a=t.a*v_al*u_op;gl_FragColor=vec4(t.rgb*a,a);}';\n  function comp(gl,t,s){ const sh=gl.createShader(t); gl.shaderSource(sh,s); gl.compileShader(sh); if(!gl.getShaderParameter(sh,gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(sh)); return sh; }\n  /* Fondu des extr\u00E9mit\u00E9s L/R \u2014 SYM\u00C9TRIQUE : t va de 0 \u00E0 1 sur les colonnes (i/(N-1)),\n     donc la colonne centrale = 0.5 et les deux c\u00F4t\u00E9s s'estompent \u00E0 l'identique.\n     (L'ancien i/(N-2) d\u00E9calait le centre \u2192 un c\u00F4t\u00E9 du visage s'effa\u00E7ait plus que l'autre.) */\n  function winA(i,N){ const t=(N<=1)?0.5:i/(N-1); const e=PATCH_EDGE; let w=1; if(t<e)w=t/e; else if(t>1-e)w=(1-t)/e; w=Math.max(0,Math.min(1,w)); return w*w*(3-2*w); }\n  return {\n    create:function(cnv){\n      let gl=null;\n      try{ gl = cnv.getContext('webgl',{alpha:true,premultipliedAlpha:true,antialias:true,depth:false,stencil:false,powerPreference:'default'}) || cnv.getContext('experimental-webgl'); }catch(e){ return null; }\n      if(!gl) return null;\n      let prog,bufPos,bufUv,bufAl,bufIdx,tex; const U={},A={};\n      try{\n        prog=gl.createProgram(); gl.attachShader(prog,comp(gl,gl.VERTEX_SHADER,VS)); gl.attachShader(prog,comp(gl,gl.FRAGMENT_SHADER,FS));\n        gl.linkProgram(prog); if(!gl.getProgramParameter(prog,gl.LINK_STATUS)) return null;\n        gl.useProgram(prog);\n        A.pos=gl.getAttribLocation(prog,'a_pos'); A.uv=gl.getAttribLocation(prog,'a_uv'); A.al=gl.getAttribLocation(prog,'a_al');\n        U.op=gl.getUniformLocation(prog,'u_op'); U.tex=gl.getUniformLocation(prog,'u_tex'); gl.uniform1i(U.tex,0);\n        bufPos=gl.createBuffer(); bufUv=gl.createBuffer(); bufAl=gl.createBuffer(); bufIdx=gl.createBuffer();\n        tex=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,tex);\n        gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);\n        gl.disable(gl.DEPTH_TEST);\n      }catch(e){ return null; }\n      let lastImg=null;\n      function size(video){ const vw=video.videoWidth, vh=video.videoHeight; if(!vw||!vh) return null;\n        /* SUR\u00C9CHANTILLONNAGE : on rend le calque \u00E0 ~1500px de large (puis le CSS le r\u00E9duit) -> motifs NETS,\n           plus de \u00AB mouchetis \u00BB flou. Les coords du maillage sont normalis\u00E9es (x/W) donc l'\u00E9chelle s'annule :\n           seul le nombre de pixels de rendu augmente. */\n        const SS = Math.max(1, Math.min(2.5, 1500/vw));\n        const W = Math.round(vw*SS), H = Math.round(vh*SS);\n        if(cnv.width!==W||cnv.height!==H){ cnv.width=W; cnv.height=H; } gl.viewport(0,0,W,H); return {W:W,H:H}; }\n      function rowPts(anchors,lm,W,H){ const Aa=[]; for(let i=0;i<anchors.length;i++){ const p=lm[anchors[i]]; if(!p) return null; Aa.push([p.x*W,p.y*H]); }\n        const pts=[]; for(let s=0;s<Aa.length-1;s++){ for(let k=0;k<PGL_SUBDIV;k++){ const t=k/PGL_SUBDIV; pts.push([Aa[s][0]+(Aa[s+1][0]-Aa[s][0])*t, Aa[s][1]+(Aa[s+1][1]-Aa[s][1])*t]); } } pts.push(Aa[Aa.length-1]); return pts; }\n      function buildMesh(lm,W,H,scale,off,curve){\n        let top=rowPts(PATCH_TOP,lm,W,H), mid=rowPts(PATCH_MID,lm,W,H), bot=rowPts(PATCH_BOT,lm,W,H);\n        if(!top||!mid||!bot) return null;\n        const N=mid.length;\n        for(let c=0;c<N;c++){ top[c]=[mid[c][0]+(top[c][0]-mid[c][0])*PATCH_H, mid[c][1]+(top[c][1]-mid[c][1])*PATCH_H]; bot[c]=[mid[c][0]+(bot[c][0]-mid[c][0])*PATCH_H, mid[c][1]+(bot[c][1]-mid[c][1])*PATCH_H]; }\n        const grid=[top,mid,bot], ROWS=3;\n        let ccx=0,ccy=0,nP=0; for(const row of grid)for(const p of row){ ccx+=p[0]; ccy+=p[1]; nP++; } ccx/=nP; ccy/=nP;\n        for(const row of grid)for(const p of row){ p[0]=ccx+(p[0]-ccx)*PATCH_W; p[1]=ccy+(p[1]-ccy)*PATCH_W; }\n        if(scale!==1){ for(const row of grid)for(const p of row){ p[0]=ccx+(p[0]-ccx)*scale; p[1]=ccy+(p[1]-ccy)*scale; } }\n        const pos=[],uv=[],al=[],idx=[];\n        /* hauteur du visage (front 10 -> menton 152) : sert d'\u00E9chelle pour d\u00E9calage & courbure\n           (proportionnels \u00E0 la distance cam\u00E9ra, donc stables quand tu t'approches/\u00E9loignes). */\n        const _fh = (lm[10]&&lm[152]) ? Math.abs(lm[152].y-lm[10].y)*H : H*0.42;\n        const _off = (off||0)*_fh;             // d\u00E9calage vertical (param par variante / curseur)\n        const _cv  = (curve||0)*_fh;            // courbure (param par variante / curseur)\n        for(let r=0;r<ROWS;r++)for(let c=0;c<N;c++){\n          const x=grid[r][c][0]; const tx=(N>1)?c/(N-1):0.5;\n          const y=grid[r][c][1] - _off + _cv*(2*tx-1)*(2*tx-1);   // d\u00E9calage vertical + courbure parabolique\n          pos.push(x/W*2-1, 1-y/H*2); uv.push(c/(N-1), r/(ROWS-1)); al.push(winA(c,N));\n        }\n        for(let r=0;r<ROWS-1;r++)for(let c=0;c<N-1;c++){ const a=r*N+c,b=r*N+c+1,d=(r+1)*N+c,e=(r+1)*N+c+1; idx.push(a,b,e, a,e,d); }\n        return {pos:new Float32Array(pos),uv:new Float32Array(uv),al:new Float32Array(al),idx:new Uint16Array(idx),n:idx.length};\n      }\n      function bindAttr(buf,data,loc,sz){ gl.bindBuffer(gl.ARRAY_BUFFER,buf); gl.bufferData(gl.ARRAY_BUFFER,data,gl.DYNAMIC_DRAW); gl.enableVertexAttribArray(loc); gl.vertexAttribPointer(loc,sz,gl.FLOAT,false,0,0); }\n      return {\n        clear:function(video){ if(!video) return; const s=size(video); if(!s) return; gl.clearColor(0,0,0,0); gl.clear(gl.COLOR_BUFFER_BIT); },\n        draw:function(video, lm, image, op, scale, off, curve){\n          if(!video||!lm||!image) return;\n          const s=size(video); if(!s) return;\n          gl.clearColor(0,0,0,0); gl.clear(gl.COLOR_BUFFER_BIT);\n          gl.useProgram(prog);\n          const m=buildMesh(lm,s.W,s.H,(scale==null?1:scale),off,curve);\n          if(!m) return;\n          gl.enable(gl.BLEND); gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);   /* over pr\u00E9multipli\u00E9 */\n          gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,tex);\n          if(image!==lastImg){ try{ gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,image); lastImg=image; }catch(e){ return; } }\n          gl.uniform1f(U.op, (op==null?PATCHGL_OP:op));\n          bindAttr(bufPos,m.pos,A.pos,2); bindAttr(bufUv,m.uv,A.uv,2); bindAttr(bufAl,m.al,A.al,1);\n          gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,bufIdx); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,m.idx,gl.DYNAMIC_DRAW);\n          gl.drawElements(gl.TRIANGLES,m.n,gl.UNSIGNED_SHORT,0);\n        },\n        dispose:function(){ try{ if(tex)gl.deleteTexture(tex); [bufPos,bufUv,bufAl,bufIdx].forEach(function(b){ if(b)gl.deleteBuffer(b); }); if(prog)gl.deleteProgram(prog); const e=gl.getExtension('WEBGL_lose_context'); if(e)e.loseContext(); }catch(_){} }\n      };\n    }\n  };\n})();\n\nlet faceLandmarker = null, running = false, lastTime = -1, stream = null;\nlet cfg = null;                 // { effect, glow, placement, size, variants[], current }\nlet video, canvas, ctx, overlay, statusEl, swatchWrap, shadeEl, titleEl;\nlet SEED = null;                // semis deterministe (fixe, ne tremble pas)\nlet zoomed = false;             // vue amplifiee (zoom) on/off\n\n/* =====================================================================\n   R\u00C9GLAGES PATCHS \u2014 modes de fusion & opacit\u00E9 (AJUSTE ICI)\n   Deux familles de patchs :\n   \u2022 \u00AB PEAU \u00BB (taches de rousseur / effet naturel) \u2192 se FOND dans la peau :\n     fusion MULTIPLY + opacit\u00E9 douce, pour \u00E9viter l'effet \u00AB autocollant pos\u00E9 \u00BB.\n   \u2022 \u00AB D\u00C9CO \u00BB (Snow, Carnival, Dor\u00E9, Argent, Rose gold\u2026) \u2192 reste POS\u00C9, couleur\n     vive : fusion normale (source-over) + opacit\u00E9 haute.\n   Le gloss l\u00E8vres n'est JAMAIS concern\u00E9 : autre mode de rendu (voir drawLips),\n   jamais dessin\u00E9 dans la m\u00EAme image qu'un patch.\n   ===================================================================== */\nconst FRECKLES_BLEND    = 'multiply';   // famille PEAU : teste 'soft-light' \u00E0 la place de 'multiply'\nconst FRECKLES_OPACITY  = 0.6;          // famille PEAU : opacit\u00E9 des taches (ajuste entre 0.5 et 0.7)\nconst DECOR_OPACITY_DEF = 0.9;          // famille D\u00C9CO : opacit\u00E9 par d\u00E9faut si la teinte n'en pr\u00E9cise pas (0.9\u20131)\n/* Une teinte tombe dans la famille PEAU si son NOM (titre de variante) contient un\n   de ces mots (insensible \u00E0 la casse et aux accents). Ajoute/retire un mot pour\n   reclasser un patch sans toucher au reste du code. */\nconst SKIN_PATCH_KEYWORDS = ['rousseur', 'freckle', 'tache', 'naturel', 'red', 'rouge'];\n// 'naturel'\u2192Naturelle, 'red'/'rouge'\u2192Red/Rouge : tes deux teintes \u00AB se fondent dans la peau \u00BB.\n// NB : 'red' est un fragment large \u2014 si une teinte D\u00C9CO contient un jour \u00AB red \u00BB, retire-le ici.\n\n/* Famille d'un patch : true = PEAU (multiply), false = D\u00C9CO (source-over).\n   Un r\u00E9glage explicite v.patch_blend ('skin'/'peau'/'multiply' ou 'deco'/'normal'/\n   'source-over'), s'il est pos\u00E9 dans la config produit, est prioritaire sur le nom. */\nfunction isSkinPatch(v){\n  if(!v) return false;\n  /* 1) Propri\u00E9t\u00E9 explicite PAR PATCH (m\u00E9tachamp ar_patch_family) \u2014 prioritaire.\n        PEAU : peau/skin/naturel/multiply \u2014 D\u00C9CO : deco/normal/source-over/vif. */\n  const fam = String(v.patch_family || v.patch_blend || '').toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').trim();\n  if(fam === 'peau' || fam === 'skin' || fam === 'naturel' || fam === 'natural' || fam === 'multiply') return true;\n  if(fam === 'deco' || fam === 'decor' || fam === 'normal' || fam === 'source-over' || fam === 'vif') return false;\n  /* 2) Repli : classement par le NOM de la teinte (liste SKIN_PATCH_KEYWORDS ci-dessus). */\n  const t = String(v.title || '').toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n  return SKIN_PATCH_KEYWORDS.some(function(k){ return t.indexOf(k) !== -1; });\n}\n\n/* ---------- Cache de textures photo (patchs) ---------- */\nconst TEX = Object.create(null);\nfunction getTexture(url){\n  if(!url) return null;\n  let t = TEX[url];\n  if(!t){\n    t = { img:new Image(), ready:false };\n    t.img.crossOrigin = 'anonymous';\n    t.img.onload  = function(){ t.ready = true; };\n    t.img.onerror = function(){ t.ready = false; };\n    t.img.src = url;\n    TEX[url] = t;\n  }\n  return t.ready ? t.img : null;\n}\n\n/* ---------- Utilitaires couleur ---------- */\nfunction hexToRgb(hex){\n  if(!hex) return null;\n  hex = String(hex).replace('#','').trim();\n  if(hex.length === 3) hex = hex.split('').map(c=>c+c).join('');\n  if(hex.length < 6) return null;\n  return [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n}\nfunction rgbStr(c){ return c[0]+','+c[1]+','+c[2]; }\n\n/* Palette de rendu pour une variante (array de [r,g,b]) */\nfunction paletteFor(v){\n  if(v && Array.isArray(v.palette) && v.palette.length){\n    const arr = v.palette.map(hexToRgb).filter(Boolean);\n    if(arr.length) return arr;\n  }\n  if(v && v.color){ const c = hexToRgb(v.color); if(c) return [c]; }\n  const c = hexToRgb(GLOW_HEX[cfg.glow] || GLOW_HEX.rose);\n  return [c];\n}\n\n/* Couleur d'un swatch (pastille) selon le mode */\nfunction swatchHex(v){\n  if(cfg.effect === 'lips') return v.lip_color || '#e0808f';\n  if(v.color) return v.color;\n  if(Array.isArray(v.palette) && v.palette.length) return v.palette[0];\n  return GLOW_HEX[cfg.glow] || GLOW_HEX.rose;\n}\n\n/* ---------- Semis deterministe des paillettes ---------- */\nfunction buildSeed(n){\n  let s = 987654321;\n  const rnd = ()=>{ s = (s*1103515245 + 12345) & 0x7fffffff; return s / 0x7fffffff; };\n  const pts = [];\n  for(let i=0;i<n;i++){\n    const a = rnd()*Math.PI*2;\n    const rad = Math.pow(rnd(), 0.65);      // densite plus forte au centre\n    pts.push({\n      dx: Math.cos(a)*rad,\n      dy: Math.sin(a)*rad*0.82,             // cluster legerement aplati\n      r:  0.55 + rnd()*0.9,\n      phase: rnd()*Math.PI*2,\n      ci: Math.floor(rnd()*3),              // index couleur (palette)\n      big: rnd() > 0.86\n    });\n  }\n  return pts;\n}\n\n/* ---------- Styles de l'overlay (injectes une fois) ---------- */\nfunction injectStyles(){\n  if(document.getElementById('sar-style')) return;\n  const s = document.createElement('style');\n  s.id = 'sar-style';\n  s.textContent = [\n    \".sar-overlay{position:fixed;inset:0;z-index:99999;display:flex;flex-direction:column;\",\n    \"align-items:center;justify-content:center;gap:14px;padding:18px;\",\n    \"background:radial-gradient(120% 80% at 50% -10%,#3a2742,#1a1320 60%,#120d18);\",\n    \"font-family:'Jost',system-ui,sans-serif;color:#f6eef2}\",\n    \".sar-stage{position:relative;width:100%;max-width:460px;aspect-ratio:3/4;border-radius:22px;\",\n    \"overflow:hidden;background:#0d0911;border:1px solid rgba(244,184,212,.18);\",\n    \"box-shadow:0 30px 80px -30px rgba(0,0,0,.8)}\",\n    \".sar-stage video,.sar-stage canvas{position:absolute;inset:0;width:100%;height:100%;\",\n    \"object-fit:cover;transform:scaleX(-1)}\",\n    \".sar-status{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;\",\n    \"text-align:center;padding:24px;color:#cbb8d6;font-size:13px;line-height:1.6}\",\n    \".sar-title{font-family:'Cormorant Garamond',Georgia,serif;font-style:italic;font-size:22px;text-align:center}\",\n    \".sar-note{max-width:460px;text-align:center;font-size:11.5px;line-height:1.5;color:#cbb8d6;font-style:italic;margin:-2px auto 0;padding:0 10px}\",\n    \".sar-swatches{display:flex;gap:9px;flex-wrap:wrap;justify-content:center;max-width:460px}\",\n    \".sar-sw{width:34px;height:34px;border-radius:50%;cursor:pointer;border:2px solid rgba(255,255,255,.25);\",\n    \"transition:transform .15s,border-color .15s;position:relative}\",\n    \".sar-sw:active{transform:scale(.9)}\",\n    \".sar-sw.on{border-color:#fff;transform:scale(1.12);box-shadow:0 0 0 3px rgba(255,255,255,.18)}\",\n    \".sar-row{display:flex;gap:10px;width:100%;max-width:460px}\",\n    \".sar-btn{flex:1;cursor:pointer;border:none;border-radius:13px;padding:13px 16px;\",\n    \"font-family:inherit;font-size:14px;font-weight:600;letter-spacing:.3px;transition:transform .15s}\",\n    \".sar-btn:active{transform:scale(.97)}\",\n    \".sar-primary{color:#2a1320;background:linear-gradient(100deg,#f4b8d4,#e9c89a)}\",\n    \".sar-ghost{background:rgba(255,255,255,.06);color:#f6eef2;border:1px solid rgba(244,184,212,.18)}\",\n    \".sar-shade{font-size:13px;letter-spacing:1.6px;font-weight:600;text-transform:uppercase;\",\n    \"color:#fff;text-align:center;min-height:16px}\",\n    \".sar-add{width:100%;max-width:460px}\",\n    \".sar-add:disabled{opacity:.75;cursor:default}\",\n    \".sar-close{position:absolute;top:16px;right:18px;z-index:10;width:40px;height:40px;border-radius:50%;\",\n    \"border:1px solid rgba(244,184,212,.25);background:rgba(20,14,24,.6);color:#f6eef2;\",\n    \"font-size:20px;cursor:pointer;line-height:1}\",\n    \".sar-zoom{position:absolute;top:14px;left:14px;z-index:6;border:none;\",\n    \"background:linear-gradient(100deg,#f4b8d4,#e9c89a);color:#2a1320;border-radius:20px;padding:10px 16px;font-size:13px;\",\n    \"font-family:inherit;font-weight:700;letter-spacing:.3px;cursor:pointer;box-shadow:0 6px 18px -6px rgba(0,0,0,.55)}\",\n    \".sar-zoom:active{transform:scale(.96)}\",\n    \".sar-err{color:#ff9bb0}\",\n    \".sar-consent{position:absolute;inset:0;z-index:7;display:flex;align-items:center;justify-content:center;\",\n    \"padding:22px;overflow:auto;background:radial-gradient(120% 80% at 50% -10%,#3a2742,#1a1320 60%,#120d18)}\",\n    \".sar-consent-card{max-width:420px;width:100%;background:rgba(20,14,24,.55);\",\n    \"border:1px solid rgba(244,184,212,.18);border-radius:18px;padding:22px 20px;text-align:left}\",\n    \".sar-consent-card h3{font-family:'Cormorant Garamond',Georgia,serif;font-style:italic;font-size:21px;\",\n    \"margin:0 0 12px;text-align:center;color:#f6eef2}\",\n    \".sar-consent-card p{font-size:12.5px;line-height:1.6;color:#cbb8d6;margin:0 0 9px}\",\n    \".sar-consent-card p.sar-key{color:#efe2ea}\",\n    \".sar-tips{display:flex;flex-direction:column;gap:9px;margin:6px 0 14px;padding:12px 14px;background:rgba(255,255,255,.06);border-radius:12px}\",\n    \".sar-tip{display:flex;align-items:center;gap:11px;font-size:13px;color:#efe2ea;font-weight:500;text-align:left}\",\n    \".sar-tip-ic{font-size:17px;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);border-radius:50%;flex:0 0 auto}\",\n    \".sar-consent-actions{display:flex;gap:10px;margin:15px 0 13px}\",\n    \".sar-fine{font-size:11px;line-height:1.55;color:#9a8aa6;margin:0}\",\n    \".sar-fine a{color:#e9c89a;text-decoration:underline}\",\n    \".sar-consent-check{display:flex;align-items:flex-start;gap:9px;font-size:12px;line-height:1.5;color:#cbb8d6;margin:2px 0 13px;cursor:pointer;text-align:left}\",\n    \".sar-consent-check input{margin-top:2px;flex:0 0 auto;width:16px;height:16px;accent-color:#e9c89a;cursor:pointer}\",\n    \".sar-consent-check a{color:#e9c89a;text-decoration:underline}\",\n    \".sar-btn:disabled{opacity:.45;cursor:not-allowed;filter:grayscale(.3)}\"\n  ].join('');\n  document.head.appendChild(s);\n}\n\n/* ---------- Construction de l'overlay ---------- */\nfunction buildOverlay(){\n  injectStyles();\n  overlay = document.createElement('div');\n  overlay.className = 'sar-overlay';\n  overlay.innerHTML =\n    '<button class=\"sar-close\" aria-label=\"Fermer\">\\u00d7</button>' +\n    '<div class=\"sar-title\"></div>' +\n    '<div class=\"sar-stage\">' +\n      '<video playsinline autoplay muted></video>' +\n      '<canvas class=\"sar-gl\"></canvas>' +\n      '<canvas></canvas>' +\n      '<div class=\"sar-status\">Initialisation\\u2026</div>' +\n      '<button class=\"sar-zoom js-zoom\" type=\"button\">\uD83D\uDD0D Zoom +</button>' +\n    '</div>' +\n    '<div class=\"sar-note\">Aper\u00E7u \u00E0 titre indicatif pour choisir votre teinte. Le rendu r\u00E9el peut varier selon votre peau, la lumi\u00E8re et votre \u00E9cran \u2014 sur la peau, le r\u00E9sultat est g\u00E9n\u00E9ralement encore plus beau. \u2728</div>' +\n    '<div class=\"sar-swatches\"></div>' +\n    '<div class=\"sar-shade\"></div>' +\n    '<button class=\"sar-btn sar-primary sar-add js-add\">Ajouter au panier</button>' +\n    '<div class=\"sar-row\">' +\n      '<button class=\"sar-btn sar-ghost js-shot\">Prendre une photo</button>' +\n      '<button class=\"sar-btn sar-ghost js-stop\">Terminer</button>' +\n    '</div>' +\n    /* Ecran de consentement : affiche EN PREMIER, recouvre tout. Rien ne demarre\n       (ni camera, ni moteur Google/jsDelivr) tant que \"Activer la camera\" n'est pas clique. */\n    '<div class=\"sar-consent\">' +\n      '<div class=\"sar-consent-card\">' +\n        '<h3>Essayage virtuel</h3>' +\n        '<p>Pour vous permettre d\u2019essayer ce produit virtuellement, nous avons besoin d\u2019acc\u00E9der \u00E0 la cam\u00E9ra de votre appareil.</p>' +\n        '<p class=\"sar-key\">Votre visage reste sur votre appareil. L\u2019analyse de l\u2019image se fait enti\u00E8rement dans votre navigateur. Aucune photo, aucune vid\u00E9o et aucune donn\u00E9e de votre visage n\u2019est envoy\u00E9e \u00E0 nos serveurs, transmise \u00E0 un tiers, ni conserv\u00E9e. Tout dispara\u00EEt d\u00E8s que vous fermez l\u2019essayage.</p>' +\n        '<p>En cliquant sur \u00AB Activer la cam\u00E9ra \u00BB, vous consentez \u00E0 l\u2019utilisation temporaire de votre cam\u00E9ra, uniquement pour cette fonctionnalit\u00E9 d\u2019essayage virtuel.</p>' +\n        '<p class=\"sar-key\" style=\"margin-bottom:6px\">Pour un rendu optimal :</p>' +\n        '<div class=\"sar-tips\">' +\n          '<div class=\"sar-tip\"><span class=\"sar-tip-ic\">\u2600\uFE0F</span> Placez-vous dans un endroit bien \u00E9clair\u00E9</div>' +\n          '<div class=\"sar-tip\"><span class=\"sar-tip-ic\">\uD83D\uDC87\u200D\u2640\uFE0F</span> D\u00E9gagez votre visage (cheveux en arri\u00E8re)</div>' +\n          '<div class=\"sar-tip\"><span class=\"sar-tip-ic\">\uD83D\uDCF7</span> Regardez droit vers la cam\u00E9ra</div>' +\n        '</div>' +\n        '<label class=\"sar-consent-check\"><input type=\"checkbox\" class=\"js-consent-agree\"> J\u2019accepte que ma cam\u00E9ra soit utilis\u00E9e pour l\u2019essayage virtuel et j\u2019ai lu la <a class=\"js-privacy\" href=\"/policies/privacy-policy\" target=\"_blank\" rel=\"noopener\">politique de confidentialit\u00E9</a>.</label>' +\n        '<div class=\"sar-consent-actions\">' +\n          '<button class=\"sar-btn sar-primary js-consent-yes\" type=\"button\" disabled>Activer la cam\u00E9ra</button>' +\n          '<button class=\"sar-btn sar-ghost js-consent-no\" type=\"button\">Annuler</button>' +\n        '</div>' +\n        '<p class=\"sar-fine\">Vous pouvez refuser ou d\u00E9sactiver la cam\u00E9ra \u00E0 tout moment. L\u2019essayage fonctionne sans aucune connexion \u00E0 un service tiers : tout est charg\u00E9 depuis le serveur de la boutique et l\u2019analyse se fait uniquement sur votre appareil. En savoir plus dans notre <a class=\"js-privacy\" href=\"/policies/privacy-policy\" target=\"_blank\" rel=\"noopener\">politique de confidentialit\u00E9</a>.</p>' +\n      '</div>' +\n    '</div>';\n  document.body.appendChild(overlay);\n  document.body.style.overflow = 'hidden';\n\n  video = overlay.querySelector('video');\n  canvas = overlay.querySelector('canvas:not(.sar-gl)');\n  glcv = overlay.querySelector('.sar-gl');\n  GLE = null; PGL = null;\n  if(cfg && cfg.effect === 'foundation'){ try{ GLE = FoundationGL.create(glcv); }catch(e){ GLE = null; } }\n  else if(cfg && cfg.effect === 'speckles'){ try{ PGL = PatchGL.create(glcv); }catch(e){ PGL = null; } }\n  if(GLE){ glcv.style.display='block'; if(video) video.style.visibility='hidden'; }   /* fond de teint : glcv REMPLACE la video */\n  else if(PGL){ glcv.style.display='block'; }                                          /* patchs deco : glcv TRANSPARENT par-dessus la video (video VISIBLE) */\n  else if(glcv){ glcv.style.display='none'; }\n  ctx = canvas.getContext('2d');\n  /* Panneau de reglage TEMPORAIRE (opacite/taille patch), visible UNIQUEMENT avec\n     ?tune=1 dans l'URL -> jamais pour les clientes. Dosage en direct sur la camera. */\n  if(/[?&]tune=1/.test(location.search) && cfg && cfg.effect === 'speckles'){\n    const tp = document.createElement('div');\n    tp.className = 'sar-tune';   /* masqu\u00E9 tant que la cam\u00E9ra n'a pas d\u00E9marr\u00E9 (sinon il couvre l'\u00E9cran de consentement) */\n    tp.style.cssText = 'position:absolute;left:8px;right:8px;bottom:8px;z-index:6;display:none;background:rgba(20,12,24,.88);border-radius:12px;padding:9px 12px;font:12px/1.5 Jost,system-ui,sans-serif;color:#f6eef2';\n    tp.innerHTML =\n      '<div style=\"display:flex;justify-content:space-between\"><span>Opacite</span><b class=\"tvO\">'+PATCH_OP_LIVE.toFixed(2)+'</b></div>'+\n      '<input class=\"tsO\" type=\"range\" min=\"0.05\" max=\"0.9\" step=\"0.01\" value=\"'+PATCH_OP_LIVE+'\" style=\"width:100%;margin:1px 0 5px\">'+\n      '<div style=\"display:flex;justify-content:space-between\"><span>Taille</span><b class=\"tvS\">'+PATCH_SC_LIVE.toFixed(2)+'</b></div>'+\n      '<input class=\"tsS\" type=\"range\" min=\"0.5\" max=\"1.7\" step=\"0.05\" value=\"'+PATCH_SC_LIVE+'\" style=\"width:100%;margin:1px 0 5px\">'+\n      '<div style=\"display:flex;justify-content:space-between\"><span>Hauteur (haut +)</span><b class=\"tvH\">'+PATCH_OFF_LIVE.toFixed(2)+'</b></div>'+\n      '<input class=\"tsH\" type=\"range\" min=\"-0.30\" max=\"0.30\" step=\"0.01\" value=\"'+PATCH_OFF_LIVE+'\" style=\"width:100%;margin:1px 0 5px\">'+\n      '<div style=\"display:flex;justify-content:space-between\"><span>Courbe (arc + / sourire -)</span><b class=\"tvC\">'+PATCH_CURVE_LIVE.toFixed(2)+'</b></div>'+\n      '<input class=\"tsC\" type=\"range\" min=\"-0.70\" max=\"0.70\" step=\"0.01\" value=\"'+PATCH_CURVE_LIVE+'\" style=\"width:100%;margin:1px 0 0\">';\n    const stage = overlay.querySelector('.sar-stage'); (stage||overlay).appendChild(tp);\n    tp.querySelector('.tsO').addEventListener('input', function(e){ PATCH_OP_LIVE = parseFloat(e.target.value); tp.querySelector('.tvO').textContent = PATCH_OP_LIVE.toFixed(2); });\n    tp.querySelector('.tsS').addEventListener('input', function(e){ PATCH_SC_LIVE = parseFloat(e.target.value); tp.querySelector('.tvS').textContent = PATCH_SC_LIVE.toFixed(2); });\n    tp.querySelector('.tsH').addEventListener('input', function(e){ PATCH_OFF_LIVE = parseFloat(e.target.value); tp.querySelector('.tvH').textContent = PATCH_OFF_LIVE.toFixed(2); });\n    tp.querySelector('.tsC').addEventListener('input', function(e){ PATCH_CURVE_LIVE = parseFloat(e.target.value); tp.querySelector('.tvC').textContent = PATCH_CURVE_LIVE.toFixed(2); });\n  }\n  statusEl = overlay.querySelector('.sar-status');\n  swatchWrap = overlay.querySelector('.sar-swatches');\n  shadeEl = overlay.querySelector('.sar-shade');\n  titleEl = overlay.querySelector('.sar-title');\n  titleEl.textContent = cfg.title || 'Essayage virtuel';\n\n  overlay.querySelector('.sar-close').onclick = close;\n  overlay.querySelector('.js-stop').onclick = close;\n  overlay.querySelector('.js-shot').onclick = capture;\n  overlay.querySelector('.js-add').onclick = addToCart;\n  overlay.querySelector('.js-zoom').onclick = toggleZoom;\n  overlay.querySelector('.js-consent-yes').onclick = startCamera;   // consentement -> demarre camera + modele\n  overlay.querySelector('.js-consent-no').onclick  = close;          // refus -> on ferme tout\n  overlay.querySelectorAll('.js-privacy').forEach(function(a){ if(cfg.privacyUrl) a.setAttribute('href', cfg.privacyUrl); });  // liens politique de confidentialite (fine print + case a cocher)\n  var agreeEl = overlay.querySelector('.js-consent-agree');           // case a cocher OBLIGATOIRE (consentement explicite, facon MUFE)\n  var yesBtn2 = overlay.querySelector('.js-consent-yes');             // \"Activer la camera\" reste desactive tant que la case n'est pas cochee\n  if(agreeEl && yesBtn2) agreeEl.onchange = function(){ yesBtn2.disabled = !agreeEl.checked; };\n  buildSwatches();\n  updateShade();\n}\n\n/* ---------- Pastilles de teintes (changement en direct) ---------- */\nfunction buildSwatches(){\n  swatchWrap.innerHTML = '';\n  if(!cfg.variants || cfg.variants.length < 2 && cfg.effect !== 'lips'){\n    if(cfg.variants.length < 2) return; // une seule teinte : pas de selecteur\n  }\n  cfg.variants.forEach(v=>{\n    if(cfg.effect === 'speckles' && !v.patch_image) return;  // teinte patch sans texture : masquee (pas encore prete)\n    const b = document.createElement('button');\n    b.className = 'sar-sw' + (v === cfg.current ? ' on' : '');\n    b.style.background = swatchHex(v);\n    b.title = v.title || '';\n    b.onclick = ()=>{ setVariant(v.id); };\n    swatchWrap.appendChild(b);\n  });\n}\nfunction markSwatch(){\n  const all = swatchWrap.querySelectorAll('.sar-sw');\n  cfg.variants.forEach((v,i)=>{ if(all[i]) all[i].classList.toggle('on', v === cfg.current); });\n}\nfunction setVariant(id){\n  const v = cfg.variants.find(x=>String(x.id) === String(id));\n  if(!v) return;\n  cfg.current = v;\n  markSwatch();\n  updateShade();\n}\n\n/* ---------- Nom de la teinte (style MUFE) ---------- */\nfunction shadeLabel(v){\n  if(!v) return '';\n  const idx = cfg.variants.indexOf(v);\n  const num = idx >= 0 ? String(idx+1).padStart(2,'0') + ' - ' : '';\n  const tt = String(v.title || cfg.title || '').toUpperCase();\n  return num + tt;\n}\nfunction updateShade(){\n  if(shadeEl) shadeEl.textContent = shadeLabel(cfg.current);\n}\n\n/* ---------- Ajout au panier Shopify (teinte essayee) ---------- */\nfunction addToCart(){\n  const v = cfg.current;\n  if(!v || !v.id) return;\n  const btn = overlay && overlay.querySelector('.js-add');\n  if(!btn) return;\n  const orig = btn.textContent;\n  btn.disabled = true; btn.textContent = 'Ajout\u2026';\n  fetch('/cart/add.js', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n    body: JSON.stringify({ items: [{ id: parseInt(v.id, 10) || v.id, quantity: 1 }] })\n  })\n    .then(function(r){ if(!r.ok) throw new Error('add'); return r.json(); })\n    .then(function(){\n      btn.textContent = '\u2713 Ajout\u00E9 au panier';\n      document.dispatchEvent(new CustomEvent('cart:refresh'));\n      setTimeout(function(){ btn.disabled = false; btn.textContent = orig; }, 2200);\n    })\n    .catch(function(){ btn.textContent = 'R\u00E9essayer'; btn.disabled = false; });\n}\n\n/* ---------- Modele MediaPipe ---------- */\nasync function loadModel(){\n  statusEl.textContent = 'Chargement du mod\\u00e8le IA\\u2026';\n  /* Moteur WASM + modele auto-heberges sur le CDN Shopify (meme infra que la\n     boutique, AUCUN service tiers). Version MediaPipe figee = 0.10.35. */\n  const fileset = {\n    wasmLoaderPath:\"https://cdn.shopify.com/s/files/1/1016/8008/7383/files/museglam-mediapipe-wasm.js?v=1780411741\",\n    wasmBinaryPath:\"https://cdn.shopify.com/s/files/1/1016/8008/7383/files/museglam-mediapipe-wasm.wasm?v=1780411742\"\n  };\n  faceLandmarker = await FaceLandmarker.createFromOptions(fileset, {\n    baseOptions:{\n      modelAssetPath:\"https://cdn.shopify.com/s/files/1/1016/8008/7383/files/museglam-facelandmarker.task?v=1780411742\",\n      delegate:\"GPU\"\n    },\n    runningMode:\"VIDEO\", numFaces:1\n  });\n}\n\n/* ---------- Ouverture ---------- */\nasync function open(config){\n  cfg = config;\n  zoomed = false;\n  /* si la teinte selectionnee est un patch SANS texture (pas encore prete), on bascule\n     sur la 1ere teinte qui a une texture -> jamais d'essai \"vide\" a l'ouverture. */\n  if(cfg.effect === 'speckles' && cfg.current && !cfg.current.patch_image){\n    const t = (cfg.variants || []).find(v => v.patch_image);\n    if(t) cfg.current = t;\n  }\n  if(!SEED) SEED = buildSeed(46);\n  buildOverlay();\n  /* CONSENTEMENT OBLIGATOIRE : on s'arrete ici. Ni la camera, ni le moteur d'analyse\n     (Google/jsDelivr) ne demarrent. L'ecran .sar-consent reste affiche jusqu'au clic\n     \"Activer la camera\" -> startCamera(). \"Annuler\" -> close(). */\n}\n\n/* ---------- Demarrage camera + modele : UNIQUEMENT apres consentement ---------- */\nasync function startCamera(){\n  const consentEl = overlay && overlay.querySelector('.sar-consent');\n  if(consentEl) consentEl.remove();\n  const _tunePanel = overlay && overlay.querySelector('.sar-tune'); if(_tunePanel) _tunePanel.style.display='block';   /* panneau reglage : visible SEULEMENT apres consentement */\n  if(statusEl) statusEl.style.display = 'flex';\n  try{\n    if(!faceLandmarker) await loadModel();\n    statusEl.textContent = 'Autorisez l\\u2019acc\\u00e8s \\u00e0 la cam\\u00e9ra\\u2026';\n    stream = await navigator.mediaDevices.getUserMedia({\n      video:{ facingMode:'user', width:{ideal:1280}, height:{ideal:720} }, audio:false });\n    video.srcObject = stream;\n    await video.play();\n    canvas.width = video.videoWidth || 720;\n    canvas.height = video.videoHeight || 960;\n    statusEl.style.display = 'none';\n    running = true;\n    requestAnimationFrame(loop);\n  }catch(err){\n    statusEl.innerHTML = '<span class=\"sar-err\">Cam\\u00e9ra indisponible : ' + (err && err.message ? err.message : err) +\n      '<br><br>V\\u00e9rifiez l\\u2019autorisation cam\\u00e9ra de votre navigateur.</span>';\n    statusEl.style.display = 'flex';\n  }\n}\nfunction close(){\n  running = false;\n  if(stream){ stream.getTracks().forEach(t=>t.stop()); stream = null; }\n  if(GLE){ try{ GLE.dispose(); }catch(e){} GLE = null; }\n  if(PGL){ try{ PGL.dispose(); }catch(e){} PGL = null; }\n  if(overlay){ overlay.remove(); overlay = null; }\n  document.body.style.overflow = '';\n}\n\n/* ---------- Zoom / vue amplifiee : la cliente voit le rendu DE PRES, clairement\n   (independant de la lumiere de la piece). Centre sur les levres (gloss) ou\n   les joues/nez (patchs). Zoom CSS sur la video + le canvas ensemble. ---------- */\nfunction toggleZoom(){\n  zoomed = !zoomed;\n  const Z  = (cfg && cfg.effect === 'lips') ? 2.1 : 1.85;   // facteur de zoom\n  const oy = (cfg && cfg.effect === 'lips') ? 70 : 46;      // origine verticale % (levres plus bas que les joues)\n  const tf   = zoomed ? ('scaleX(-1) scale(' + Z + ')') : 'scaleX(-1)';\n  const orig = zoomed ? ('50% ' + oy + '%') : '50% 50%';\n  [video, canvas, glcv].forEach(function(el){ if(el){ el.style.transformOrigin = orig; el.style.transform = tf; } });\n  const b = overlay && overlay.querySelector('.js-zoom');\n  if(b) b.textContent = zoomed ? '\uD83D\uDD0D Zoom \u2212' : '\uD83D\uDD0D Zoom +';\n}\n\n/* ---------- Boucle de rendu ---------- */\nfunction loop(){\n  if(!running) return;\n  if(video.currentTime !== lastTime && video.readyState >= 2){\n    lastTime = video.currentTime;\n    const res = faceLandmarker.detectForVideo(video, performance.now());\n    render(res);\n  }\n  requestAnimationFrame(loop);\n}\n\n/* Lissage ADAPTATIF a la vitesse (facon L'Oreal) : au REPOS, lissage fort -> aucun\n   tremblement (pas de \"flottement\") ; en MOUVEMENT, quasi brut -> le filtre reste\n   VERROUILLE sur les levres (pas de \"balancement/sac\", pas de retard). Chaque repere\n   ajuste sa force de lissage selon sa propre vitesse. */\nlet _smoothLm = null;\nlet _patchPrev = null;                  // anti-flottement patch (n'affecte PAS le gloss)\nconst PATCH_A_REST = 0.25;              // patch au repos : BAS = + stable (anti-flottement)\nconst PATCH_A_MOVE = 0.95;              // patch en mouvement : ~1 = suit sans retard\nconst PATCH_SPD    = 7;                 // px/frame pour passer en mode suivi\nconst A_REST = 0.30;    // repos  : + bas = + stable (anti-flottement)\nconst A_MOVE = 0.99;    // mouvement : proche de 1 = verrouille, pas de balancement (monte si ca balance encore)\nconst SPD_REF = 0.006;  // vitesse (norm/frame) pour basculer en mode \"verrouille\" (bas = verrouille plus tot)\nfunction smoothLandmarks(raw){\n  if(!_smoothLm || _smoothLm.length !== raw.length){ _smoothLm = raw.map(p=>({x:p.x,y:p.y,z:p.z})); return _smoothLm; }\n  for(let i=0;i<raw.length;i++){\n    const s=_smoothLm[i], r=raw[i];\n    const spd = Math.abs(r.x-s.x) + Math.abs(r.y-s.y);          // mouvement de CE repere\n    const a = A_REST + (A_MOVE-A_REST)*Math.min(1, spd/SPD_REF);\n    s.x += (r.x-s.x)*a; s.y += (r.y-s.y)*a; s.z += (r.z-s.z)*a;\n  }\n  return _smoothLm;\n}\n\nfunction render(res){\n  ctx.clearRect(0,0,canvas.width,canvas.height);\n  if(PGL) PGL.clear(video);   /* vide le calque patch WebGL (transparent) ; redessine plus bas si patch DECO */\n  if(!res.faceLandmarks || !res.faceLandmarks.length){ _smoothLm = null; _patchPrev = null; return; }\n  const W = canvas.width, H = canvas.height;\n  const lm = smoothLandmarks(res.faceLandmarks[0]);\n  if(cfg.effect === 'lips'){\n    drawLips(lm, W, H, cfg.current);\n    return;\n  }\n  if(cfg.effect === 'foundation'){\n    if(GLE){\n      const _c = hexToRgb((cfg.current && cfg.current.color) || '#D8B188');\n      GLE.draw(video, buildFaceMask(lm, W, H), [_c[0]/255, _c[1]/255, _c[2]/255],\n               { couvrance:FGL_COUVRANCE, depth:fgDepth(_c), hlProtect:FGL_HLPROTECT, shadowProtect:FGL_SHADOWPROTECT });\n    } else {\n      drawBeauty(lm, W, H, cfg.current);      // repli Canvas \u2014 gloss/patchs intacts\n      drawFoundation(lm, W, H, cfg.current);\n    }\n    return;\n  }\n  /* Patch photo (texture reelle) : si la variante porte une image, on mappe la\n     bande d'etoiles sur le milieu du visage. Sinon, rendu synthetique. */\n  const patchUrl = cfg.current && cfg.current.patch_image;\n  if(patchUrl){\n    const tex = getTexture(patchUrl);\n    if(tex){\n      if(PGL && !isSkinPatch(cfg.current)){\n        const PL = placementFor(cfg.current);\n        PGL.draw(video, lm, tex, PL.op, PL.scale, PL.off, PL.curve);   /* DECO -> mesh net ; placement PAR VARIANTE (ou curseurs si ?tune=1) */\n      } else {\n        drawPatch(lm, W, H, tex, cfg.current);                 /* PEAU (multiply) ou repli WebGL indispo -> Canvas 2D inchange */\n      }\n    }\n    return;\n  }\n  /* teinte patch SANS texture photo (pas encore prete) : on ne dessine RIEN\n     -> aucun rendu synthetique \"grossier\" n'apparait (lancement propre). */\n}\n\n/* ---------- Rendu d'un patch photo en MESH-WARP 3D ----------\n   La texture (bande de motifs) est mappee sur une GRILLE de reperes du visage\n   (colonnes joue->nez->joue). Les positions 2D de ces reperes encodent deja la\n   pose 3D -> quand la tete tourne/s'incline, la bande s'enroule et SUIT (comme\n   le gloss, qui s'accroche a beaucoup de points). Rangees haut/bas derivees par\n   decalage perpendiculaire. Mapping par triangles (affine texture -> ecran). */\n\n/* Affine qui envoie un triangle TEXTURE (s) sur un triangle ECRAN (d) */\nfunction _affRow(sx,sy,d){\n  const Dn = sx[0]*(sy[1]-sy[2]) - sy[0]*(sx[1]-sx[2]) + (sx[1]*sy[2]-sx[2]*sy[1]);\n  if(Math.abs(Dn) < 1e-9) return null;\n  return [\n    (d[0]*(sy[1]-sy[2]) - sy[0]*(d[1]-d[2]) + (d[1]*sy[2]-d[2]*sy[1]))/Dn,\n    (sx[0]*(d[1]-d[2]) - d[0]*(sx[1]-sx[2]) + (sx[1]*d[2]-sx[2]*d[1]))/Dn,\n    (sx[0]*(sy[1]*d[2]-sy[2]*d[1]) - sy[0]*(sx[1]*d[2]-sx[2]*d[1]) + d[0]*(sx[1]*sy[2]-sx[2]*sy[1]))/Dn\n  ];\n}\nfunction _texTri(img, s, d){\n  const sx=[s[0][0],s[1][0],s[2][0]], sy=[s[0][1],s[1][1],s[2][1]];\n  const dx=[d[0][0],d[1][0],d[2][0]], dy=[d[0][1],d[1][1],d[2][1]];\n  const rx=_affRow(sx,sy,dx), ry=_affRow(sx,sy,dy);\n  if(!rx || !ry) return;\n  ctx.save();\n  ctx.beginPath(); ctx.moveTo(dx[0],dy[0]); ctx.lineTo(dx[1],dy[1]); ctx.lineTo(dx[2],dy[2]); ctx.closePath(); ctx.clip();\n  ctx.transform(rx[0],ry[0],rx[1],ry[1],rx[2],ry[2]);\n  ctx.drawImage(img,0,0);\n  ctx.restore();\n}\n\n/* Colonnes de la grille (gauche->droite) sur la zone des taches. A CALIBRER. */\nconst PATCH_ANCHORS = [116, 197, 345];          // joue G, nez (centre), joue D \u2014 3 reperes confirmes au calage\nconst PATCH_SUBDIV  = 3;                         // sous-colonnes interpolees par segment (repartition EGALE + lissage)\nconst PATCH_DEBUG = false;                        // pastilles de calage (mettre false une fois cale)\nconst PATCH_VOFF  = 0.05;                        // decalage vertical de la bande (en hauteurs de bande)\nconst PATCH_EDGE  = 0.16;                        // fondu des extremites L/R (0 = bords francs, +haut = dispersion + large)\nconst PATCH_W = 1.5;                             // agrandissement global de la grille (1 = grille de calage validee ; >1 = + large) \u2014 RE-AGRANDI 2026-06-02 (recouvre le visage comme \"au debut\")\nconst PATCH_H = 1.3;                             // ecart vertical des rangees depuis le milieu (1 = positions validees ; >1 = + haut/bas) \u2014 RE-AGRANDI 2026-06-02\n/* --- Calage 3D : grille candidate (rang HAUT / MILIEU / BAS) x (joue G / nez / joue D).\n   PATCH_CAL=true dessine la grille par-dessus le rendu actuel pour la caler a la camera,\n   AVANT de mouler la texture dessus (rendu qui epouse le relief 3D). Indices A CALER. */\nconst PATCH_CAL = false;                         // grille de calage (mettre true pour re-caler les reperes)\nconst PATCH_TOP = [117, 6,   346];               // sous les yeux (haut des pommettes)\nconst PATCH_MID = [116, 197, 345];               // pommettes + pont du nez (confirme)\nconst PATCH_BOT = [205, 195, 425];               // mi-joues / bas du nez\n\nfunction drawPatch(lm, W, H, tex, v){\n  const tw = tex.naturalWidth  || tex.width  || 687;\n  const th = tex.naturalHeight || tex.height || 261;\n  /* GRILLE 3D : 3 rangees (HAUT / MILIEU / BAS) de VRAIS reperes du visage, chacune\n     interpolee en colonnes (joue G -> nez -> joue D). Les positions 2D de ces reperes\n     encodent deja le relief -> la texture, mappee PAR TRIANGLES sur cette grille, EPOUSE\n     la forme 3D du visage (courbe des joues + nez) au lieu d'etre une bande plate.\n     (grille calee + validee a la camera) */\n  function rowPts(anchors){\n    const Aa = [];\n    for(let i=0;i<anchors.length;i++){ const p = lm[anchors[i]]; if(!p) return null; Aa.push([p.x*W, p.y*H]); }\n    const pts = [];\n    for(let s=0;s<Aa.length-1;s++){\n      for(let k=0;k<PATCH_SUBDIV;k++){ const t=k/PATCH_SUBDIV; pts.push([Aa[s][0]+(Aa[s+1][0]-Aa[s][0])*t, Aa[s][1]+(Aa[s+1][1]-Aa[s][1])*t]); }\n    }\n    pts.push(Aa[Aa.length-1]);\n    return pts;\n  }\n  const top = rowPts(PATCH_TOP), mid = rowPts(PATCH_MID), bot = rowPts(PATCH_BOT);\n  if(!top || !mid || !bot) return;\n  const N = mid.length;\n\n  /* echelle PAR TEINTE (ar_patch_scale, defaut 1) : agrandit CE patch (ex. Snow = motifs fins)\n     sans toucher aux autres patchs ni au gloss. */\n  let psc = parseFloat(v && v.patch_scale); if(isNaN(psc) || psc <= 0) psc = 1;\n  const PW = PATCH_W * psc, PH = PATCH_H * psc;\n\n  /* ampleur verticale (PH) : ecarte les rangees haut/bas depuis la rangee milieu */\n  if(PH !== 1){\n    for(let c=0;c<N;c++){\n      top[c][0]=mid[c][0]+(top[c][0]-mid[c][0])*PH; top[c][1]=mid[c][1]+(top[c][1]-mid[c][1])*PH;\n      bot[c][0]=mid[c][0]+(bot[c][0]-mid[c][0])*PH; bot[c][1]=mid[c][1]+(bot[c][1]-mid[c][1])*PH;\n    }\n  }\n  const grid = [top, mid, bot], ROWS = grid.length;\n  /* agrandissement global (PW) autour du centre de la grille */\n  if(PW !== 1){\n    let ccx=0, ccy=0, nP=0;\n    for(const row of grid) for(const p of row){ ccx+=p[0]; ccy+=p[1]; nP++; }\n    ccx/=nP; ccy/=nP;\n    for(const row of grid) for(const p of row){ p[0]=ccx+(p[0]-ccx)*PW; p[1]=ccy+(p[1]-ccy)*PW; }\n  }\n\n  /* Anti-flottement patch : lisse la grille finale, adaptatif a la vitesse\n     (repos = tres stable ; mouvement = suit sans retard). N'utilise PAS l'etat du gloss. */\n  if(_patchPrev && _patchPrev.length === N*ROWS){\n    let k=0;\n    for(let r=0;r<ROWS;r++) for(let c=0;c<N;c++){\n      const s=_patchPrev[k++], gx=grid[r][c][0], gy=grid[r][c][1];\n      const spd=Math.abs(gx-s[0])+Math.abs(gy-s[1]);\n      const a=PATCH_A_REST+(PATCH_A_MOVE-PATCH_A_REST)*Math.min(1, spd/PATCH_SPD);\n      grid[r][c][0]=s[0]+(gx-s[0])*a; grid[r][c][1]=s[1]+(gy-s[1])*a;\n    }\n  }\n  _patchPrev=[]; for(let r=0;r<ROWS;r++) for(let c=0;c<N;c++) _patchPrev.push([grid[r][c][0],grid[r][c][1]]);\n\n  /* Famille du patch (voir \u00AB R\u00C9GLAGES PATCHS \u00BB en haut du fichier) :\n     PEAU (taches de rousseur / naturel) \u2192 se fond dans la peau (MULTIPLY + opacit\u00E9 douce) ;\n     D\u00C9CO (Snow, Carnival, Dor\u00E9, Argent, Rose gold\u2026) \u2192 source-over + opacit\u00E9 haute, couleur vive. */\n  const skinPatch  = isSkinPatch(v);\n  const patchBlend = skinPatch ? FRECKLES_BLEND : 'source-over';\n  let op;\n  if(skinPatch){\n    op = FRECKLES_OPACITY;                        // PEAU : opacit\u00E9 douce centralis\u00E9e (r\u00E9glable en haut)\n  } else {\n    op = parseFloat(v && v.patch_opacity);        // D\u00C9CO : respecte l'opacit\u00E9 de la teinte si d\u00E9finie\n    if(isNaN(op)) op = DECOR_OPACITY_DEF;\n  }\n  op = Math.max(0, Math.min(1, op));\n\n  /* Fondu des extremites L/R : les taches se dispersent au bout des joues (smoothstep). */\n  const winA = (i) => {\n    const t = (N<=2) ? 0.5 : i/(N-2);\n    const e = PATCH_EDGE;\n    let w = 1;\n    if(t < e)        w = t/e;\n    else if(t > 1-e) w = (1-t)/e;\n    w = Math.max(0, Math.min(1, w));\n    return w*w*(3-2*w);\n  };\n  /* Mapping par triangles : (u = colonne, v = rangee) de la texture -> grille ecran 3D. */\n  const drawPass = () => {\n    for(let r=0;r<ROWS-1;r++){\n      const v0=(r/(ROWS-1))*th, v1=((r+1)/(ROWS-1))*th;\n      for(let c=0;c<N-1;c++){\n        ctx.globalAlpha = op * winA(c);\n        const u0=(c/(N-1))*tw, u1=((c+1)/(N-1))*tw;\n        const Aq=grid[r][c], Bq=grid[r][c+1], Cq=grid[r+1][c+1], Dq=grid[r+1][c];\n        _texTri(tex, [[u0,v0],[u1,v0],[u1,v1]], [Aq,Bq,Cq]);\n        _texTri(tex, [[u0,v0],[u1,v1],[u0,v1]], [Aq,Cq,Dq]);\n      }\n    }\n  };\n  /* Le mode de fusion (multiply pour la PEAU) est pos\u00E9 ICI, encadr\u00E9 par save()/restore() :\n     il ne peut PAS fuiter au-del\u00E0 du patch \u2014 ni sur un autre rendu, ni (en mode l\u00E8vres) sur\n     le gloss. restore() remet automatiquement source-over + globalAlpha = 1. */\n  ctx.save();\n  ctx.globalCompositeOperation = patchBlend;\n  drawPass();                                        // texture moulee sur le relief 3D (pas de voile)\n  ctx.restore();\n  ctx.globalAlpha = 1;\n  ctx.globalCompositeOperation = 'source-over';\n\n  if(PATCH_CAL){\n    const rows = [PATCH_TOP, PATCH_MID, PATCH_BOT];\n    const cc = ['rgba(0,235,255,0.97)','rgba(255,225,0,0.97)','rgba(255,70,210,0.97)']; // haut / milieu / bas\n    const P = rows.map(r => r.map(ix => { const p = lm[ix]; return p ? [p.x*W, p.y*H] : null; }));\n    ctx.save(); ctx.globalCompositeOperation = 'source-over';\n    ctx.strokeStyle = 'rgba(255,255,255,0.6)'; ctx.lineWidth = 1.5;\n    for(let r=0;r<3;r++) for(let c=0;c<3;c++){\n      const a = P[r][c]; if(!a) continue;\n      if(c<2 && P[r][c+1]){ ctx.beginPath(); ctx.moveTo(a[0],a[1]); ctx.lineTo(P[r][c+1][0],P[r][c+1][1]); ctx.stroke(); }\n      if(r<2 && P[r+1][c]){ ctx.beginPath(); ctx.moveTo(a[0],a[1]); ctx.lineTo(P[r+1][c][0],P[r+1][c][1]); ctx.stroke(); }\n    }\n    for(let r=0;r<3;r++) for(let c=0;c<3;c++){\n      const a = P[r][c]; if(!a) continue;\n      ctx.fillStyle = cc[r]; ctx.beginPath(); ctx.arc(a[0],a[1],7,0,6.2832); ctx.fill();\n      ctx.fillStyle = 'rgba(0,0,0,0.85)'; ctx.beginPath(); ctx.arc(a[0],a[1],2.4,0,6.2832); ctx.fill();\n    }\n    ctx.restore();\n  }\n}\n\n/* ---------- Rendu d'un cluster de speckles ---------- */\nfunction drawCluster(anchor, W, H, size, angle, v){\n  if(!anchor || !v) return;\n  const region = size * 1.4;\n  const colors = paletteFor(v);\n  const matte = v.finish === 'matte';\n  const holo  = v.finish === 'holographic';\n  const motif = v.motif || 'dots';\n  const t = performance.now()/1000;\n\n  ctx.save();\n  ctx.translate(anchor.x*W, anchor.y*H);\n  ctx.rotate(angle);\n\n  for(const p of SEED){\n    const x = p.dx*region, y = p.dy*region;\n    const base = size * 0.06;\n    const rr = (p.big ? 2.1 : 1.15) * p.r * base;\n\n    let colArr;\n    if(holo){\n      const hue = (t*55 + (p.dx+1)*170 + (p.dy+1)*110) % 360;\n      colArr = hslToRgb(hue/360, 0.8, 0.72);\n    } else {\n      colArr = colors[p.ci % colors.length];\n    }\n    const col = 'rgb(' + rgbStr(colArr) + ')';\n\n    /* Halo additif (sauf mat) */\n    if(!matte){\n      ctx.globalCompositeOperation = 'lighter';\n      const tw = 0.55 + 0.45*Math.sin(t*3 + p.phase);\n      const hr = rr*3.2;\n      const g = ctx.createRadialGradient(x,y,0,x,y,hr);\n      g.addColorStop(0, 'rgba(' + rgbStr(colArr) + ',' + (0.5*tw).toFixed(3) + ')');\n      g.addColorStop(1, 'rgba(' + rgbStr(colArr) + ',0)');\n      ctx.fillStyle = g;\n      ctx.beginPath(); ctx.arc(x,y,hr,0,Math.PI*2); ctx.fill();\n    }\n\n    /* Motif */\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.fillStyle = col;\n    if(motif === 'hearts'){ heart(x,y,rr*1.7); }\n    else if(motif === 'snowflakes'){ snowflake(x,y,rr*2.0, col); }\n    else { ctx.beginPath(); ctx.arc(x,y,rr,0,Math.PI*2); ctx.fill(); }\n\n    /* Eclat blanc central (glitter, pas en mat) */\n    if(!matte){\n      ctx.fillStyle = 'rgba(255,255,255,.85)';\n      ctx.beginPath(); ctx.arc(x - rr*0.3, y - rr*0.3, rr*0.34, 0, Math.PI*2); ctx.fill();\n    }\n  }\n\n  ctx.restore();\n  ctx.globalCompositeOperation = 'source-over';\n}\n\nfunction heart(x,y,s){\n  ctx.beginPath();\n  ctx.moveTo(x, y + s*0.55);\n  ctx.bezierCurveTo(x + s, y - s*0.30, x + s*0.42, y - s*0.95, x, y - s*0.38);\n  ctx.bezierCurveTo(x - s*0.42, y - s*0.95, x - s, y - s*0.30, x, y + s*0.55);\n  ctx.closePath(); ctx.fill();\n}\nfunction snowflake(x,y,s,stroke){\n  ctx.save();\n  ctx.strokeStyle = stroke;\n  ctx.lineWidth = Math.max(1, s*0.16);\n  ctx.lineCap = 'round';\n  for(let k=0;k<6;k++){\n    const a = k*Math.PI/3;\n    ctx.beginPath();\n    ctx.moveTo(x,y);\n    ctx.lineTo(x + Math.cos(a)*s, y + Math.sin(a)*s);\n    ctx.stroke();\n  }\n  ctx.restore();\n}\n\n/* ---------- Micro-paillettes (shimmer tres subtil dans l'huile) ----------\n   Positions FIXES en coordonnees locales a la levre (u,v in [0,1]) -> elles suivent\n   la bouche quand la tete bouge et ne \"grouillent\" pas. Chaque paillette scintille\n   doucement dans le temps. Genere une seule fois (RNG deterministe). */\nfunction mulberry32(a){return function(){a|=0;a=a+0x6D2B79F5|0;let t=Math.imul(a^a>>>15,1|a);t=t+Math.imul(t^t>>>7,61|t)^t;return((t^t>>>14)>>>0)/4294967296;};}\nconst SPARKLES = (function(){\n  const rng = mulberry32(0x9E3779B9), arr = [], N = 32;\n  for(let i=0;i<N;i++){\n    arr.push({\n      u: rng(),                  // x local [0,1]\n      v: 0.10 + rng()*0.80,      // y local (on evite les bords)\n      r: 0.6 + rng()*1.5,        // taille relative\n      ph: rng()*Math.PI*2,       // phase de scintillement\n      sp: 1.4 + rng()*2.4,       // vitesse de scintillement\n      a: 0.14 + rng()*0.20,      // alpha de base (subtil)\n      warm: rng() < 0.25         // ~25% paillettes chaudes (or/miel)\n    });\n  }\n  return arr;\n})();\n\n/* ---------- Lissage de peau (BEAUTY / \"sans defauts\") ----------\n   Polit la peau SANS rien couvrir : on echantillonne la <video>, on la FLOUTE, et on\n   recompose ce voile flou UNIQUEMENT sur la zone peau (meme ovale que le fond de teint\n   + trous yeux/bouche en fondu) -> la peau se lisse, les TRAITS restent NETS (la vraie\n   video nette transparait dans les trous). Le canvas etant un overlay transparent par-dessus\n   la <video>, le voile flou a BEAUTY_STRENGTH se fond sur la peau reelle dessous = effet \"poli\".\n   Appele AVANT drawFoundation, en mode cushion seulement. N'affecte NI le gloss NI les patchs. */\nfunction drawBeauty(lm, W, H, v){\n  if(BEAUTY_STRENGTH <= 0) return;\n  if(!video || !video.videoWidth) return;                 // besoin des pixels video\n  if(typeof ctx.filter !== 'string') return;              // flou indispo -> on s'abstient (pas de rendu degrade)\n  if(!_beautyCv){ _beautyCv = document.createElement('canvas'); }\n  const cv = _beautyCv;\n  if(cv.width !== W || cv.height !== H){ cv.width = W; cv.height = H; }\n  const bx = cv.getContext('2d');\n\n  /* echelle (largeur visage) pour le rayon de flou et le fondu des bords */\n  const fl = lm[234], fr = lm[454];\n  const fw = (fl && fr) ? Math.hypot((fr.x-fl.x)*W,(fr.y-fl.y)*H) : W*0.35;\n  /* centre du visage (pour l'inset de l'ovale, identique au fond de teint) */\n  let cx=0, cy=0, nn=0;\n  for(let i=0;i<FACE_OVAL.length;i++){ const p=lm[FACE_OVAL[i]]; if(p){ cx+=p.x; cy+=p.y; nn++; } }\n  if(nn){ cx/=nn; cy/=nn; }\n  const chinY = lm[152] ? lm[152].y : (cy + 0.20);\n\n  /* 1) VIDEO FLOUTEE plein cadre sur le calque hors-ecran (alignee pixel-pour-pixel : buffer = videoWidth x videoHeight) */\n  bx.setTransform(1,0,0,1,0,0);\n  bx.globalCompositeOperation = 'source-over';\n  bx.globalAlpha = 1;\n  bx.clearRect(0,0,W,H);\n  bx.filter = 'blur('+Math.max(2, Math.round(fw*BEAUTY_BLUR))+'px)';\n  bx.drawImage(video, 0, 0, W, H);\n  bx.filter = 'none';\n\n  /* 2) on NE GARDE la video floutee QUE dans l'ovale visage (inset + lift front),\n        bord FONDU via blur du masque -> aucune ligne de \"masque\" (destination-in) */\n  const feather = Math.max(2, Math.round(fw*FOUNDATION_FEATHER));\n  bx.globalCompositeOperation = 'destination-in';\n  bx.filter = 'blur('+feather+'px)';\n  bx.fillStyle = '#fff';\n  bx.beginPath();\n  for(let i=0;i<FACE_OVAL.length;i++){ const p=lm[FACE_OVAL[i]]; if(!p) continue;\n    const x = (cx + (p.x-cx)*FOUNDATION_INSET) * W;\n    const y = (chinY + (p.y - chinY)*FOUNDATION_FOREHEAD) * H;\n    if(i===0) bx.moveTo(x,y); else bx.lineTo(x,y); }\n  bx.closePath(); bx.fill();\n  bx.filter = 'none';\n\n  /* 3) on RETIRE yeux + bouche en FONDU -> ces traits restent NETS (vraie video dessous) */\n  const ringBox = function(idxs){\n    let mnx=1,mny=1,mxx=0,mxy=0,ok=false;\n    for(let i=0;i<idxs.length;i++){ const p=lm[idxs[i]]; if(p){ ok=true; if(p.x<mnx)mnx=p.x; if(p.x>mxx)mxx=p.x; if(p.y<mny)mny=p.y; if(p.y>mxy)mxy=p.y; } }\n    return ok ? { cx:(mnx+mxx)/2*W, cy:(mny+mxy)/2*H, rx:Math.max(3,(mxx-mnx)/2*W), ry:Math.max(3,(mxy-mny)/2*H) } : null;\n  };\n  const softHole = function(b, grow){\n    if(!b) return;\n    const rx=b.rx*grow, ry=b.ry*grow, r=Math.max(rx,ry);\n    const g=bx.createRadialGradient(b.cx,b.cy,0, b.cx,b.cy,r);\n    g.addColorStop(0,'rgba(0,0,0,1)'); g.addColorStop(0.5,'rgba(0,0,0,1)'); g.addColorStop(1,'rgba(0,0,0,0)');\n    bx.save(); bx.translate(b.cx,b.cy); bx.scale(rx/r, ry/r); bx.translate(-b.cx,-b.cy);\n    bx.fillStyle=g; bx.beginPath(); bx.arc(b.cx,b.cy,r,0,Math.PI*2); bx.fill(); bx.restore();\n  };\n  bx.globalCompositeOperation = 'destination-out';\n  softHole(ringBox(LEFT_EYE_RING),  1.7);    // oeil G net\n  softHole(ringBox(RIGHT_EYE_RING), 1.7);    // oeil D net\n  softHole(ringBox(LIPS_OUTER),     1.5);    // bouche nette (gloss/levres intacts)\n  softHole(ringBox(NOSE_RING),      1.15);   // NEZ net (sinon le flou le ramollit / l'agrandit)\n  bx.globalCompositeOperation = 'source-over';\n\n  /* 4) composite du voile flou sur le canvas principal, a opacite MOYENNE (poli, pas plastique) */\n  ctx.save();\n  ctx.globalCompositeOperation = 'source-over';\n  ctx.globalAlpha = BEAUTY_STRENGTH;\n  ctx.drawImage(cv, 0, 0);\n  ctx.restore();\n  ctx.globalAlpha = 1;\n  ctx.globalCompositeOperation = 'source-over';\n}\n\n/* ---------- Rendu FOND DE TEINT (cushion TIRTIR) ----------\n   Teinte TRANSLUCIDE fusionnee a la peau (PAS un aplat opaque). Calque hors-ecran : ovale\n   visage rempli de v.color, PUIS yeux/sourcils/bouche/narines retires en destination-out\n   -> teinte SEULEMENT sur la vraie peau ; composite soft-light a FOUNDATION_TINT\n   (voile transparent) + bords floutes (aucun bord de masque). Suit chaque frame. Indep. gloss/patchs. */\nfunction drawFoundation(lm, W, H, v){\n  if(!v) return;\n  const col = hexToRgb(v.color || '#D8B188'); if(!col) return;\n  if(FOUNDATION_DEYELLOW){ col[1] = Math.max(0, col[1] - FOUNDATION_DEYELLOW); }  // anti-jaune : retire du vert (-> moins jaune, plus rose)\n  /* calque hors-ecran : ZONES DE PEAU = ovale visage RETRECI (hors cheveux) MOINS yeux, sourcils et bouche */\n  if(!_foundCv){ _foundCv = document.createElement('canvas'); }\n  const cv = _foundCv;\n  if(cv.width !== W || cv.height !== H){ cv.width = W; cv.height = H; }\n  const fx = cv.getContext('2d');\n  fx.clearRect(0,0,W,H);\n  let cx=0, cy=0, nn=0;\n  for(let i=0;i<FACE_OVAL.length;i++){ const p=lm[FACE_OVAL[i]]; if(p){ cx+=p.x; cy+=p.y; nn++; } }\n  if(nn){ cx/=nn; cy/=nn; }\n  const fl = lm[234], fr = lm[454];\n  const fw = (fl && fr) ? Math.hypot((fr.x-fl.x)*W,(fr.y-fl.y)*H) : W*0.35;\n  const poly = function(idxs,k){ fx.beginPath(); for(let i=0;i<idxs.length;i++){ const p=lm[idxs[i]]; if(!p) continue; const x=(cx+(p.x-cx)*k)*W, y=(cy+(p.y-cy)*k)*H; if(i===0) fx.moveTo(x,y); else fx.lineTo(x,y); } fx.closePath(); };\n  // 1) PEAU : ovale visage rempli de la teinte, AVEC LIFT DU FRONT (menton fixe, front etire vers le haut)\n  //    -> couvre TOUT le front (gabarit TIRTIR). Le composite reste soft-light (voile), pas de couvrance.\n  fx.globalCompositeOperation = 'source-over';\n  fx.fillStyle = 'rgb('+rgbStr(col)+')';\n  const chinY = lm[152] ? lm[152].y : (cy + 0.20);\n  fx.beginPath();\n  for(let i=0;i<FACE_OVAL.length;i++){ const p=lm[FACE_OVAL[i]]; if(!p) continue;\n    const x = (cx + (p.x-cx)*FOUNDATION_INSET) * W;\n    const y = (chinY + (p.y - chinY)*FOUNDATION_FOREHEAD) * H;\n    if(i===0) fx.moveTo(x,y); else fx.lineTo(x,y); }\n  fx.closePath(); fx.fill();\n  // 2) EXCLUSIONS DOUCES (destination-out en DEGRADE) : yeux + bouche retires en FONDU.\n  //    Aucune decoupe nette -> AUCUN \"trou\" visible -> plus d'effet masque / loup de carnaval.\n  //    (un vrai fond de teint n'a pas de trous ; les traits restent naturels grace au fondu + l'opacite tres basse.)\n  const ringBox = function(idxs){\n    let mnx=1,mny=1,mxx=0,mxy=0,ok=false;\n    for(let i=0;i<idxs.length;i++){ const p=lm[idxs[i]]; if(p){ ok=true; if(p.x<mnx)mnx=p.x; if(p.x>mxx)mxx=p.x; if(p.y<mny)mny=p.y; if(p.y>mxy)mxy=p.y; } }\n    return ok ? { cx:(mnx+mxx)/2*W, cy:(mny+mxy)/2*H, rx:Math.max(3,(mxx-mnx)/2*W), ry:Math.max(3,(mxy-mny)/2*H) } : null;\n  };\n  const softHole = function(b, grow){\n    if(!b) return;\n    const rx=b.rx*grow, ry=b.ry*grow, r=Math.max(rx,ry);\n    const g=fx.createRadialGradient(b.cx,b.cy,0, b.cx,b.cy,r);\n    g.addColorStop(0,'rgba(0,0,0,1)'); g.addColorStop(0.5,'rgba(0,0,0,1)'); g.addColorStop(1,'rgba(0,0,0,0)');\n    fx.save(); fx.translate(b.cx,b.cy); fx.scale(rx/r, ry/r); fx.translate(-b.cx,-b.cy);\n    fx.fillStyle=g; fx.beginPath(); fx.arc(b.cx,b.cy,r,0,Math.PI*2); fx.fill(); fx.restore();\n  };\n  fx.globalCompositeOperation = 'destination-out';\n  softHole(ringBox(LEFT_EYE_RING),  1.7);   // oeil G fondu\n  softHole(ringBox(RIGHT_EYE_RING), 1.7);   // oeil D fondu\n  softHole(ringBox(LEFT_BROW),      1.4);   // sourcil G (FIX : la teinte ne bave plus dessus)\n  softHole(ringBox(RIGHT_BROW),     1.4);   // sourcil D (FIX)\n  softHole(ringBox(LIPS_OUTER),     1.5);   // bouche fondue (garde la couleur des levres)\n  fx.globalCompositeOperation = 'source-over';\n  /* voile TRANSPARENT : soft-light a opacite basse (on voit la peau) + bords FLOUS = aucune ligne de masque */\n  const blur = Math.max(2, Math.round(fw * FOUNDATION_FEATHER));\n  ctx.save();\n  ctx.globalCompositeOperation = FOUNDATION_BLEND;\n  /* opacite adaptative selon la CLARTE de la teinte : foncee -> plus presente (se lit foncee) ; claire -> reste sheer */\n  const _lum = (0.299*col[0] + 0.587*col[1] + 0.114*col[2]) / 255;   // 0 = noir, 1 = blanc\n  ctx.globalAlpha = Math.min(FOUNDATION_TINT_MAX, FOUNDATION_TINT + (1 - _lum) * FOUNDATION_DEPTH_BOOST);\n  if(typeof ctx.filter === 'string'){ ctx.filter = 'blur('+blur+'px)'; }\n  ctx.drawImage(cv, 0, 0);\n  ctx.filter = 'none';\n  ctx.restore();\n  ctx.globalAlpha = 1;\n  ctx.globalCompositeOperation = 'source-over';\n}\n\n/* ---------- Rendu gloss levres ---------- */\nfunction drawLips(lm, W, H, v){\n  if(!v) return;\n  const col = hexToRgb(v.lip_color || '#e0808f');\n  let op = parseFloat(v.lip_opacity);\n  if(isNaN(op)) op = 0.22;\n\n  /* Lumiere chaude facon Gisou (huile miel) : blanc tres legerement creme pour un\n     glow lumineux, jamais un blanc dur. WARM = coeur de reflet legerement miel. */\n  const WG = '255,251,242';\n  const WARM = '255,247,232';\n\n  /* Contour des levres : on suit EXACTEMENT la ligne naturelle (zero debordement).\n     Le galbe \"pulpeux\" vient de la lumiere centrale + d'un fin contour facon\n     crayon a levres MUFE, pas d'un elargissement du trace. Le contour interne\n     (ouverture) reste inchange, decoupe even-odd : le gloss n'entre jamais dans\n     la bouche. */\n  const ox=[], oy=[];\n  LIPS_OUTER.forEach(idx=>{ const pt=lm[idx]; if(pt){ ox.push(pt.x*W); oy.push(pt.y*H); } });\n  if(!ox.length) return;\n  const ocx = ox.reduce((a,b)=>a+b,0)/ox.length;\n  const ocy = oy.reduce((a,b)=>a+b,0)/oy.length;\n  /* REPULPAGE LEVRE SUP : on agrandit le contour de la levre SUPERIEURE (points au-dessus\n     du centre) -> levre du haut plus pleine. La levre INF reste inchangee. Les coins\n     (y ~ centre) bougent a peine -> fondu naturel, pas de debordement. PLUMP_UP=1 = off. */\n  const PLUMP_UP = 1.12;                 // gonfle la levre SUP (1=off ; 1.10 leger ... 1.25 fort)\n  const PLUMP_LO = 1.00;                 // levre INF inchangee\n  const PLUMP_SX = 1.02;                 // tres leger elargissement horizontal\n  const PLUMP_ON = (PLUMP_UP !== 1 || PLUMP_LO !== 1 || PLUMP_SX !== 1);\n  const ex = x => ocx + (x-ocx)*PLUMP_SX;\n  const ey = y => (y < ocy) ? ocy + (y-ocy)*PLUMP_UP : ocy + (y-ocy)*PLUMP_LO;\n\n  const xs = [], ys = [];\n  ctx.save();\n  ctx.beginPath();\n  LIPS_OUTER.forEach((idx,i)=>{\n    const pt = lm[idx]; if(!pt) return;\n    const x = ex(pt.x*W), y = ey(pt.y*H);\n    xs.push(x); ys.push(y);\n    if(i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);\n  });\n  ctx.closePath();\n  LIPS_INNER.forEach((idx,i)=>{\n    const pt = lm[idx]; if(!pt) return;\n    const x = pt.x*W, y = pt.y*H;        // ouverture de la bouche : inchangee\n    if(i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);\n  });\n  ctx.closePath();\n  ctx.clip('evenodd');\n\n  if(!xs.length){ ctx.restore(); ctx.globalCompositeOperation = 'source-over'; return; }\n\n  const minX=Math.min.apply(null,xs), maxX=Math.max.apply(null,xs);\n  const minY=Math.min.apply(null,ys), maxY=Math.max.apply(null,ys);\n  const cx=(minX+maxX)/2, lipW=Math.max(1,maxX-minX), lipH=Math.max(1,maxY-minY);\n\n  /* Pastille de brillance douce (ellipse en degrade), melange additif -> reflet\n     \"verre mouille\". Bords fondus pour rester harmonieux (jamais un point dur). */\n  const glow = (gx,gy,rx,ry,a0,a1,rgb,core)=>{\n    const C = rgb || WG;                 // coeur blanc vif possible pour le reflet \"verre\"\n    const K = (core==null) ? 0.55 : core; // position du coeur : bas = eclat net, haut = nappe douce/large\n    ctx.save();\n    ctx.globalCompositeOperation = 'lighter';\n    ctx.translate(gx,gy);\n    ctx.scale(Math.max(0.001,rx), Math.max(0.001,ry));\n    const g = ctx.createRadialGradient(0,0,0, 0,0,1);\n    g.addColorStop(0.00, 'rgba('+C+','+a0+')');\n    g.addColorStop(K, 'rgba('+C+','+a1+')');\n    g.addColorStop(1.00, 'rgba('+C+',0)');\n    ctx.fillStyle = g;\n    ctx.beginPath(); ctx.arc(0,0,1,0,Math.PI*2); ctx.fill();\n    ctx.restore();\n  };\n\n  /* Ombre douce (galbe / contouring) : meme principe que glow mais en source-over\n     avec une teinte foncee -> creuse une zone pour donner du relief. */\n  const shade = (gx,gy,rx,ry,a0,rgb)=>{\n    ctx.save();\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.translate(gx,gy);\n    ctx.scale(Math.max(0.001,rx), Math.max(0.001,ry));\n    const g = ctx.createRadialGradient(0,0,0, 0,0,1);\n    g.addColorStop(0.00, 'rgba('+rgb+','+a0+')');\n    g.addColorStop(0.70, 'rgba('+rgb+','+(a0*0.4).toFixed(3)+')');\n    g.addColorStop(1.00, 'rgba('+rgb+',0)');\n    ctx.fillStyle = g;\n    ctx.beginPath(); ctx.arc(0,0,1,0,Math.PI*2); ctx.fill();\n    ctx.restore();\n  };\n\n  /* 1) STAIN HUILE TEINTEE (tone-reactive) : pour rester FIDELE a la vraie couleur\n        Gisou tout en restant une HUILE translucide (pas un gloss collant opaque), on\n        TEINTE la vraie levre au lieu de peindre par-dessus. (a) on pose les vrais\n        pixels de la levre dans le clip, (b) on les teinte en MULTIPLY -> la couleur\n        reagit au teint (caramel sur levre claire, cacao sur levre foncee, exactement\n        comme sur les visuels Gisou), (c) un voile \"milky\" tres leger en source-over\n        garantit la lisibilite de la teinte + le cote lacte. La levre transparait. */\n  ctx.globalCompositeOperation = 'source-over';\n  if(PLUMP_ON){\n    /* on MOULE les vrais pixels de la levre du contour NATUREL vers le contour AGRANDI\n       (warp par triangles : anneau outer<->inner). La levre sup se remplit de vraie\n       MATIERE de levre (pas de peau) -> elle parait plus pleine, sans debordement. */\n    const NO = LIPS_OUTER.length;\n    for(let i=0;i<NO;i++){\n      const j=(i+1)%NO;\n      const a=lm[LIPS_OUTER[i]], b=lm[LIPS_OUTER[j]], c=lm[LIPS_INNER[j]], d=lm[LIPS_INNER[i]];\n      if(!a||!b||!c||!d) continue;\n      const aN=[a.x*W,a.y*H], bN=[b.x*W,b.y*H], cN=[c.x*W,c.y*H], dN=[d.x*W,d.y*H];\n      const aE=[ex(a.x*W),ey(a.y*H)], bE=[ex(b.x*W),ey(b.y*H)]; // outer agrandi ; inner inchange\n      _texTri(video, [aN,bN,cN], [aE,bE,cN]);\n      _texTri(video, [aN,cN,dN], [aE,cN,dN]);\n    }\n  } else {\n    ctx.drawImage(video, 0, 0, W, H);                            // vrais pixels de la levre (clip even-odd actif)\n  }\n  ctx.globalCompositeOperation = 'multiply';\n  const stainA = Math.max(0.20, Math.min(0.52, op*1.0 + 0.13)); // dose du stain (suit lip_opacity) \u2014 HUILE = translucide, on voit la levre a travers\n  const stain = ctx.createLinearGradient(0, minY, 0, maxY);\n  stain.addColorStop(0.00, 'rgba('+rgbStr(col)+','+(stainA*0.85).toFixed(3)+')'); // fondu haut\n  stain.addColorStop(0.30, 'rgba('+rgbStr(col)+','+stainA.toFixed(3)+')');\n  stain.addColorStop(0.72, 'rgba('+rgbStr(col)+','+stainA.toFixed(3)+')');\n  stain.addColorStop(1.00, 'rgba('+rgbStr(col)+','+(stainA*0.85).toFixed(3)+')'); // fondu bas\n  ctx.fillStyle = stain;\n  ctx.fillRect(0,0,W,H);\n  ctx.globalCompositeOperation = 'source-over';\n  const cov = Math.max(0.04, Math.min(0.13, op*0.38));          // voile milky reduit (huile legere, pas lacte/epais)\n  const milky = ctx.createLinearGradient(0, minY, 0, maxY);\n  milky.addColorStop(0.00, 'rgba('+rgbStr(col)+','+(cov*0.82).toFixed(3)+')');\n  milky.addColorStop(0.30, 'rgba('+rgbStr(col)+','+cov.toFixed(3)+')');\n  milky.addColorStop(0.72, 'rgba('+rgbStr(col)+','+cov.toFixed(3)+')');\n  milky.addColorStop(1.00, 'rgba('+rgbStr(col)+','+(cov*0.82).toFixed(3)+')');\n  ctx.fillStyle = milky;\n  ctx.fillRect(0,0,W,H);\n\n  /* 1b) CONTOURING (galbe facon filtre MUFE) : on creuse legerement les commissures\n        (ombre dans la teinte) et on rehausse l'arc de cupidon + la bombe de la levre\n        inferieure (lumiere douce) -> bouche plus pulpeuse et dessinee, SANS sortir\n        de la levre (tout reste dans le clip even-odd). */\n  const dark = Math.round(col[0]*0.5)+','+Math.round(col[1]*0.5)+','+Math.round(col[2]*0.5);\n  shade(minX + lipW*0.05, minY + lipH*0.50, lipW*0.17, lipH*0.42, 0.16, dark); // commissure gauche (ombre)\n  shade(maxX - lipW*0.05, minY + lipH*0.50, lipW*0.17, lipH*0.42, 0.16, dark); // commissure droite (ombre)\n  glow(cx, minY + lipH*0.07, lipW*0.18, lipH*0.060, 0.20, 0.05);               // arc de cupidon (lumiere)\n  glow(cx, minY + lipH*0.80, lipW*0.30, lipH*0.120, 0.16, 0.04);               // bombe levre inf (volume)\n\n  /* 2) GLACAGE (screen) TRES LEGER + chaud : un voile mouille discret, dose pour\n        NE PAS delaver la couleur ni alourdir. Le glow vient des eclats (etape 3). */\n  ctx.globalCompositeOperation = 'screen';\n  const glaze = ctx.createLinearGradient(0, minY, 0, maxY);\n  glaze.addColorStop(0.00, 'rgba('+WG+',0.05)');   // haut levre sup\n  glaze.addColorStop(0.42, 'rgba('+WG+',0.02)');  // ligne des levres\n  glaze.addColorStop(0.55, 'rgba('+WG+',0.02)');\n  glaze.addColorStop(0.74, 'rgba('+WG+',0.07)');   // corps levre inf (film fin, pas collant)\n  glaze.addColorStop(1.00, 'rgba('+WG+',0.03)');   // bord inferieur\n  ctx.fillStyle = glaze;\n  ctx.fillRect(0,0,W,H);\n  ctx.globalCompositeOperation = 'source-over';\n\n  /* 2b) CONTOUR facon crayon MUFE : fin lisere de teinte un peu plus dense pose sur\n        la ligne des levres. Le clip etant cale sur la levre, la moitie exterieure\n        du trait est rognee -> bord net, ZERO debordement, levre plus dessinee /\n        pulpeuse sans elargir le trace. */\n  const linerA = 0.0;   // liner DESACTIVE (adoucir le contour : plus de \"trait/contouring\" autour de la levre)\n  ctx.beginPath();\n  LIPS_OUTER.forEach((idx,i)=>{\n    const pt = lm[idx]; if(!pt) return;\n    const x = ex(pt.x*W), y = ey(pt.y*H);\n    if(i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);\n  });\n  ctx.closePath();\n  ctx.lineJoin = 'round'; ctx.lineCap = 'round';\n  ctx.lineWidth = Math.max(1.6, lipH*0.05);\n  ctx.strokeStyle = 'rgba('+rgbStr(col)+','+linerA.toFixed(3)+')';\n  ctx.stroke();\n\n  /* 3) REFLET HUILE (fini OIL leger, validee) : UN seul reflet mouille doux sur la levre\n        inferieure + une lumiere discrete sur la sup + de la profondeur. PAS de halo global\n        ni de grosses bombes -> ca ferait \"gloss epais\". C'est une HUILE : translucide,\n        legere, eclat naturel. (Brillance du gloss = REGLEE, ne plus pousser.) */\n  shade(cx,            minY + lipH*0.515, lipW*0.46, lipH*0.060, 0.12, dark);                 // creux ligne des levres\n  shade(cx,            maxY - lipH*0.02,  lipW*0.40, lipH*0.110, 0.16, dark);                 // ombre bord inf (la bombe ressort)\n  /* -- levre superieure : nappe douce + 1 petit eclat doux au cupidon (pas un point dur) -- */\n  glow(cx,             minY + lipH*0.21,  lipW*0.32, lipH*0.060, 0.30, 0.07, WG,   0.42);     // nappe sup douce\n  glow(cx - lipW*0.05, minY + lipH*0.175, lipW*0.075,lipH*0.034, 0.50, 0.00, WARM, 0.36);     // catchlight cupidon (doux)\n  /* -- levre inferieure : UN reflet mouille dominant = grande nappe + coeur doux large + 1 glint -- */\n  glow(cx - lipW*0.02, minY + lipH*0.70,  lipW*0.40, lipH*0.150, 0.22, 0.05, WG,   0.50);     // grande nappe mouillee chaude\n  glow(cx - lipW*0.05, minY + lipH*0.695, lipW*0.26, lipH*0.080, 0.44, 0.10, WG,   0.46);     // coeur du reflet (doux, large)\n  glow(cx - lipW*0.07, minY + lipH*0.685, lipW*0.10, lipH*0.040, 0.68, 0.00, WARM, 0.34);     // glint vif unique (soft)\n  /* -- fin lisere de lumiere sur le bord haut -- */\n  glow(cx,             minY + lipH*0.11,  lipW*0.30, lipH*0.050, 0.14, 0.05);                 // lisere haut\n\n  /* 4) MICRO-PAILLETTES : intensite PAR TEINTE via lip_shimmer. Coco Cacao & Pineapple\n        Pout = \"golden shimmer\" -> fines paillettes DOREES tres subtiles. Raspberry\n        Swirl = \"sheer cool pink\" -> AUCUNE paillette (lip_shimmer=0). Defaut si non\n        defini : or subtil. (le clip reste actif -> tout reste sur la levre) */\n  let shim = parseFloat(v.lip_shimmer);\n  if(isNaN(shim)) shim = 0.6;                       // defaut : or subtil\n  if(shim > 0.001){\n    const tms = (typeof performance!=='undefined' ? performance.now() : Date.now())/1000;\n    for(let i=0;i<SPARKLES.length;i++){\n      const s = SPARKLES[i];\n      const px = minX + s.u*lipW, py = minY + s.v*lipH;\n      const tw = 0.30 + 0.70*(0.5 + 0.5*Math.sin(tms*s.sp + s.ph)); // scintillement [0.30..1]\n      const rad = Math.max(0.6, s.r * lipW*0.009);\n      const warm = (i % 5 !== 0);                   // ~80% or, 20% blanc froid\n      glow(px, py, rad, rad, (s.a*tw*shim).toFixed(3), 0, warm ? '255,221,150' : '255,250,240');\n    }\n  }\n\n  ctx.restore();\n  ctx.globalCompositeOperation = 'source-over';\n}\n\n/* ---------- HSL -> RGB (pour l'holographique) ---------- */\nfunction hslToRgb(h,s,l){\n  let r,g,b;\n  if(s===0){ r=g=b=l; }\n  else{\n    const hue2rgb=(p,q,t)=>{ if(t<0)t+=1; if(t>1)t-=1;\n      if(t<1/6)return p+(q-p)*6*t; if(t<1/2)return q;\n      if(t<2/3)return p+(q-p)*(2/3-t)*6; return p; };\n    const q = l<0.5 ? l*(1+s) : l+s-l*s;\n    const p = 2*l-q;\n    r=hue2rgb(p,q,h+1/3); g=hue2rgb(p,q,h); b=hue2rgb(p,q,h-1/3);\n  }\n  return [Math.round(r*255), Math.round(g*255), Math.round(b*255)];\n}\n\n/* ---------- Capture photo ---------- */\nfunction capture(){\n  if(!running) return;\n  const out = document.createElement('canvas');\n  out.width = canvas.width; out.height = canvas.height;\n  const c = out.getContext('2d');\n  c.translate(out.width,0); c.scale(-1,1);\n  c.drawImage(GLE ? glcv : video,0,0,out.width,out.height);\n  if(PGL) c.drawImage(glcv,0,0,out.width,out.height);   /* patch deco WebGL par-dessus la video */\n  c.drawImage(canvas,0,0);\n  const a = document.createElement('a');\n  a.download = 'museglam-tryon.png';\n  a.href = out.toDataURL('image/png'); a.click();\n}\n\n/* ---------- Declencheur : clic sur le bouton ---------- */\ndocument.addEventListener('click', function(e){\n  const btn = e.target.closest('.js-speckles-open');\n  if(!btn) return;\n  const root = btn.closest('.speckles-ar');\n  if(!root) return;\n\n  /* Lecture de la carte variantes */\n  let variants = [];\n  const cfgEl = root.querySelector('.speckles-ar-cfg');\n  if(cfgEl){\n    try{\n      const parsed = JSON.parse(cfgEl.textContent);\n      variants = (parsed.variants || []).map(function(v){\n        return {\n          id: v.id,\n          title: v.title || '',\n          color: v.color || '',\n          finish: v.finish || 'glitter',\n          motif: v.motif || 'dots',\n          palette: Array.isArray(v.palette) ? v.palette : null,\n          lip_color: v.lip_color || '',\n          lip_opacity: v.lip_opacity,\n          lip_shimmer: v.lip_shimmer,\n          patch_image: v.patch_image || '',\n          patch_opacity: v.patch_opacity,\n          patch_scale: v.patch_scale,\n          patch_offset: v.patch_offset,\n          patch_curve: v.patch_curve,\n          patch_family: v.patch_family || ''\n        };\n      });\n    }catch(err){ variants = []; }\n  }\n  if(!variants.length){\n    variants = [{ id:'0', title:'', color:'', finish:'glitter', motif:'dots', palette:null, lip_color:'', lip_opacity:'0.25', lip_shimmer:'', patch_image:'', patch_opacity:'' }];\n  }\n\n  /* Variante actuellement selectionnee sur la fiche produit */\n  let curId = variants[0].id;\n  const idInput = document.querySelector('form[action*=\"/cart/add\"] input[name=\"id\"]') ||\n                  document.querySelector('input[name=\"id\"]');\n  if(idInput && idInput.value){\n    if(variants.some(function(v){ return String(v.id) === String(idInput.value); })) curId = idInput.value;\n  }\n  const current = variants.find(function(v){ return String(v.id) === String(curId); }) || variants[0];\n\n  open({\n    effect: root.dataset.effect || 'speckles',\n    glow: root.dataset.glow || 'rose',\n    placement: root.dataset.placement || 'cheeks',\n    size: parseFloat(root.dataset.size || '1') || 1,\n    title: root.dataset.title || '',\n    privacyUrl: root.dataset.privacyUrl || '/policies/privacy-policy',\n    variants: variants,\n    current: current\n  });\n});\n\n\n\n\n"],
  "mappings": "AAOA,OAAS,mBACF,mGAGP,MAAM,QAAU,CAAE,OAAO,CAAC,GAAG,GAAG,EAAG,SAAS,CAAC,IAAI,GAAG,EAAG,OAAO,CAAC,GAAG,GAAG,CAAE,EAGjE,WAAa,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,EAEpF,WAAa,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,EAEpF,WAAa,CAAC,EAAE,IAAI,IAAI,IAAI,GAAG,EAG/B,SAAW,CAAE,KAAK,UAAW,KAAK,UAAW,IAAI,SAAU,EAG3D,UAAY,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,EACtJ,cAAiB,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAC9E,eAAiB,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EACjF,UAAY,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,EACzB,UAAa,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,EAC7C,WAAa,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EACrD,iBAAmB,EACnB,oBAAqB,KACrB,iBAAmB,aACnB,gBAAqB,IACrB,mBAAqB,IACrB,uBAAyB,IACzB,oBAAyB,GACzB,oBAAyB,EAC/B,IAAI,SAAW,KAGX,UAAY,KAChB,MAAM,gBAAkB,GAClB,YAAkB,IAQlB,cAAgB,GAChB,cAAgB,IAChB,kBAAoB,GAC1B,IAAI,QAAU,KACV,KAAO,KAAM,IAAM,KAEvB,SAAS,QAAQ,IAAI,CAAE,MAAM,GAAG,KAAM,IAAI,CAAC,EAAE,KAAM,IAAI,CAAC,EAAE,KAAM,IAAI,CAAC,GAAG,IAAK,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,IAAK,EAAI,EAAE,KAAM,IAAI,CAAC,CAAG,CAKjI,SAAS,cAAc,GAAI,EAAG,EAAE,CAC9B,MAAM,EAAI,UAAY,QAAU,SAAS,cAAc,QAAQ,IAC5D,EAAE,QAAQ,GAAK,EAAE,SAAS,KAAI,EAAE,MAAM,EAAG,EAAE,OAAO,GACrD,MAAM,EAAI,EAAE,WAAW,IAAI,EAAG,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,EAAE,yBAAyB,cAAe,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,EACxH,MAAM,GAAG,GAAG,GAAG,EAAG,GAAG,GAAG,GAAG,EAAS,GAAI,IAAI,GAAI,KAAK,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,IACpF,QAAQ,KAAK,IAAI,EAAE,KAAK,MAAM,GAAG,kBAAkB,CAAC,EAC1D,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,EAAG,QAAQ,EAAE,EAAE,EAAE,UAAU,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAM,IAAG,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAM,CAAK,IAAG,IAAI,EAAE,IAAI,GAChI,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAG,GAAG,GAClC,EAAE,UAAU,OAAQ,EAAE,UAAU,EAChC,QAAQ,EAAE,EAAE,EAAE,UAAU,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAG,GAAG,CAAC,EAAG,SAAU,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,kBAAkB,EAAG,GAAG,OAAO,EAAE,EAAE,OAAO,qBAAqB,EAAM,IAAI,EAAG,EAAE,OAAO,EAAE,CAAC,EAAQ,EAAE,OAAO,EAAE,CAAC,CAAG,CACpN,EAAE,UAAU,EAAG,EAAE,KAAK,EACtB,EAAE,yBAAyB,kBAAmB,EAAE,OAAO,QAAQ,QAAQ,MACvE,MAAM,IAAI,SAAS,KAAK,KAAK,CAAE,KAAK,MAAM,EAAK,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,EAAG,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAM,IAAG,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAM,CAAK,IAAG,IAAI,EAAE,IAAI,GACnK,EAAE,UAAU,EAAG,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAG,GAAG,CAAC,EAAG,SAAU,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,MAAM,EAAG,GAAG,IAAI,EAAE,EAAE,IAAI,MAAM,EAAM,IAAI,EAAG,EAAE,OAAO,EAAE,CAAC,EAAQ,EAAE,OAAO,EAAE,CAAC,CAAG,CAAE,EAAE,UAAU,EAAG,EAAE,KAAK,CAAG,EACrN,WAAI,cAAc,IAAI,EAAG,IAAI,eAAe,IAAI,EAAG,IAAI,UAAU,GAAI,EAAG,IAAI,WAAW,GAAI,EAAG,IAAI,WAAW,IAAI,EACjH,EAAE,OAAO,OAAQ,EAAE,yBAAyB,cACrC,CACT,CAEA,MAAM,cAAgB,UAAU,CAC9B,MAAM,KAAO,wIACP,KAAO,CACX,2CACA,4EACA,+HACA,wDACA,6DACA,gEACA,eACA,0CACA,6DACA,gDACA,oDACA,iCACA,wEACA,iEACA,wEACA,4EACA,sFACA,yGACA,wCACA,4BACA,uDACA,GACF,EAAE,KAAK;AAAA,CAAI,EACX,SAAS,KAAK,GAAG,EAAE,EAAE,CAAE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAgD,GAA7C,GAAG,aAAa,GAAG,CAAC,EAAG,GAAG,cAAc,EAAE,EAAM,CAAC,GAAG,mBAAmB,GAAG,GAAG,cAAc,EAAG,MAAM,IAAI,MAAM,GAAG,iBAAiB,EAAE,CAAC,EAAG,OAAO,EAAI,CACvM,MAAO,CACL,OAAO,SAAS,IAAI,CAClB,IAAI,GAAG,KACP,GAAG,CAAE,GAAK,IAAI,WAAW,QAAQ,CAAC,MAAM,GAAM,mBAAmB,GAAM,UAAU,GAAM,MAAM,GAAM,QAAQ,GAAM,gBAAgB,SAAS,CAAC,GAAK,IAAI,WAAW,oBAAoB,CAAG,MAAS,CAAE,OAAO,IAAM,CAC9M,GAAG,CAAC,GAAI,OAAO,KACf,IAAI,KAAM,IAAK,IAAK,QAAS,MAAM,EAAE,CAAC,EACtC,GAAG,CAEqB,GADtB,KAAK,GAAG,cAAc,EAAG,GAAG,aAAa,KAAK,KAAK,GAAG,GAAG,cAAc,IAAI,CAAC,EAAG,GAAG,aAAa,KAAK,KAAK,GAAG,GAAG,gBAAgB,IAAI,CAAC,EACpI,GAAG,YAAY,IAAI,EAAM,CAAC,GAAG,oBAAoB,KAAK,GAAG,WAAW,EAAG,OAAO,KAC9E,GAAG,WAAW,IAAI,EAClB,IAAI,GAAG,aAAa,EAAG,GAAG,WAAW,GAAG,aAAa,GAAG,EACxD,GAAG,WAAW,GAAG,aAAa,IAAI,aAAa,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,EAC9F,MAAM,IAAI,GAAG,kBAAkB,KAAK,OAAO,EAAG,GAAG,wBAAwB,GAAG,EAAG,GAAG,oBAAoB,IAAI,EAAE,GAAG,MAAM,GAAM,EAAE,CAAC,EAC9H,MAAM,GAAG,UAAU,CAAE,MAAM,EAAE,GAAG,cAAc,EAAG,UAAG,YAAY,GAAG,WAAW,CAAC,EAC7E,GAAG,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,EAAG,GAAG,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,EACrI,GAAG,cAAc,GAAG,WAAW,GAAG,mBAAmB,GAAG,MAAM,EAAG,GAAG,cAAc,GAAG,WAAW,GAAG,mBAAmB,GAAG,MAAM,EAAU,CAAG,EAC9I,IAAI,GAAG,EAAG,QAAQ,GAAG,EACrB,CAAC,SAAS,cAAc,UAAU,cAAc,kBAAkB,WAAW,EAAE,QAAQ,SAAS,EAAE,CAAE,EAAE,CAAC,EAAE,GAAG,mBAAmB,KAAK,CAAC,CAAG,CAAC,EACzI,EAAE,IAAI,GAAG,mBAAmB,KAAK,OAAO,EAAG,EAAE,KAAK,GAAG,mBAAmB,KAAK,QAAQ,EAAG,GAAG,UAAU,EAAE,IAAI,CAAC,EAAG,GAAG,UAAU,EAAE,KAAK,CAAC,CACtI,MAAS,CAAE,OAAO,IAAM,CACxB,MAAO,CACL,KAAK,SAASA,OAAO,WAAY,KAAM,EAAE,CACvC,GAAG,CAACA,QAAS,CAACA,OAAM,WAAY,OAChC,MAAM,EAAEA,OAAM,WAAY,EAAEA,OAAM,aAC/B,IAAI,QAAQ,GAAG,IAAI,SAAS,KAAI,IAAI,MAAM,EAAG,IAAI,OAAO,EAAG,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,GACjF,GAAG,WAAW,IAAI,EAClB,GAAG,cAAc,GAAG,QAAQ,EAAG,GAAG,YAAY,GAAG,WAAW,GAAG,EAC/D,GAAG,CAAE,GAAG,WAAW,GAAG,WAAW,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,cAAcA,MAAK,CAAG,MAAS,CAAE,MAAQ,CAC7F,IAAI,QAAQ,EACT,aAAa,GAAG,cAAc,GAAG,QAAQ,EAAG,GAAG,YAAY,GAAG,WAAW,OAAO,EAAG,GAAG,WAAW,GAAG,WAAW,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,cAAc,UAAU,EAAG,QAAQ,GAC1K,GAAG,WAAW,EAAE,OAAO,IAAI,EAAG,GAAG,UAAU,EAAE,YAAY,EAAE,SAAS,EAAG,GAAG,UAAU,EAAE,QAAQ,EAAE,KAAK,EACrG,GAAG,UAAU,EAAE,YAAY,EAAE,SAAS,EAAG,GAAG,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAG,GAAG,UAAU,EAAE,UAAU,OAAO,EAC1H,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC,CAChC,EACA,QAAQ,UAAU,CAAE,GAAG,CAAK,KAAI,GAAG,cAAc,GAAG,EAAM,SAAQ,GAAG,cAAc,OAAO,EAAM,KAAI,GAAG,aAAa,GAAG,EAAM,MAAK,GAAG,cAAc,IAAI,EAAG,MAAM,EAAE,GAAG,aAAa,oBAAoB,EAAM,GAAE,EAAE,YAAY,CAAG,MAAS,CAAC,CAAE,CAC7O,CACF,CACF,CACF,GAAG,EAcG,WAAgB,IAChB,cAAgB,GACtB,IAAI,cAAgB,WAAY,cAAgB,cAC5C,eAAiB,IACjB,iBAAmB,KACvB,MAAM,WAAa,EACb,gBAAkB,IAAO,kBAAoB,KAC7C,UAAY,aAAa,KAAK,SAAS,MAAM,EACnD,IAAI,IAAM,KAIV,SAAS,aAAa,EAAE,CACtB,GAAG,UAAW,MAAO,CAAC,GAAG,cAAe,MAAM,cAAe,IAAI,eAAgB,MAAM,gBAAgB,EACvG,IAAI,GAAG,WAAW,GAAG,EAAE,aAAa,EAAM,MAAM,EAAE,IAAG,GAAG,YAAY,GAAG,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,EAChG,IAAI,GAAG,WAAW,GAAG,EAAE,WAAW,GAAQ,MAAM,EAAE,GAAG,IAAI,KAAG,GAAG,eAC/D,IAAI,GAAG,WAAW,GAAG,EAAE,YAAY,EAAO,MAAM,EAAE,IAAG,GAAG,iBACxD,IAAI,GAAG,WAAW,GAAG,EAAE,WAAW,EAAK,OAAG,MAAM,EAAE,IAAG,GAAG,mBACjD,CAAC,GAAO,MAAM,GAAI,IAAI,GAAI,MAAM,EAAE,CAC3C,CAEA,MAAM,SAAW,UAAU,CACzB,MAAM,GAAK,uKAIL,GAAK,wMACX,SAAS,KAAK,GAAG,EAAE,EAAE,CAAE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAgD,GAA7C,GAAG,aAAa,GAAG,CAAC,EAAG,GAAG,cAAc,EAAE,EAAM,CAAC,GAAG,mBAAmB,GAAG,GAAG,cAAc,EAAG,MAAM,IAAI,MAAM,GAAG,iBAAiB,EAAE,CAAC,EAAG,OAAO,EAAI,CAIvM,SAAS,KAAK,EAAE,EAAE,CAAE,MAAM,EAAG,GAAG,EAAG,GAAI,GAAG,EAAE,GAAU,EAAE,WAAY,IAAI,EAAE,EAAG,OAAG,EAAE,EAAE,EAAE,EAAE,EAAW,EAAE,EAAE,IAAE,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAU,EAAE,GAAG,EAAE,EAAE,EAAI,CACrK,MAAO,CACL,OAAO,SAAS,IAAI,CAClB,IAAI,GAAG,KACP,GAAG,CAAE,GAAK,IAAI,WAAW,QAAQ,CAAC,MAAM,GAAK,mBAAmB,GAAK,UAAU,GAAK,MAAM,GAAM,QAAQ,GAAM,gBAAgB,SAAS,CAAC,GAAK,IAAI,WAAW,oBAAoB,CAAG,MAAS,CAAE,OAAO,IAAM,CAC3M,GAAG,CAAC,GAAI,OAAO,KACf,IAAI,KAAK,OAAO,MAAM,MAAM,OAAO,IAAK,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EACtD,GAAG,CAEqB,GADtB,KAAK,GAAG,cAAc,EAAG,GAAG,aAAa,KAAK,KAAK,GAAG,GAAG,cAAc,EAAE,CAAC,EAAG,GAAG,aAAa,KAAK,KAAK,GAAG,GAAG,gBAAgB,EAAE,CAAC,EAChI,GAAG,YAAY,IAAI,EAAM,CAAC,GAAG,oBAAoB,KAAK,GAAG,WAAW,EAAG,OAAO,KAC9E,GAAG,WAAW,IAAI,EAClB,EAAE,IAAI,GAAG,kBAAkB,KAAK,OAAO,EAAG,EAAE,GAAG,GAAG,kBAAkB,KAAK,MAAM,EAAG,EAAE,GAAG,GAAG,kBAAkB,KAAK,MAAM,EACvH,EAAE,GAAG,GAAG,mBAAmB,KAAK,MAAM,EAAG,EAAE,IAAI,GAAG,mBAAmB,KAAK,OAAO,EAAG,GAAG,UAAU,EAAE,IAAI,CAAC,EACxG,OAAO,GAAG,aAAa,EAAG,MAAM,GAAG,aAAa,EAAG,MAAM,GAAG,aAAa,EAAG,OAAO,GAAG,aAAa,EACnG,IAAI,GAAG,cAAc,EAAG,GAAG,YAAY,GAAG,WAAW,GAAG,EACxD,GAAG,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,EAAG,GAAG,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,EACrI,GAAG,cAAc,GAAG,WAAW,GAAG,mBAAmB,GAAG,MAAM,EAAG,GAAG,cAAc,GAAG,WAAW,GAAG,mBAAmB,GAAG,MAAM,EAC/H,GAAG,QAAQ,GAAG,UAAU,CAC1B,MAAS,CAAE,OAAO,IAAM,CACxB,IAAI,QAAQ,KACZ,SAAS,KAAKA,OAAM,CAAE,MAAM,GAAGA,OAAM,WAAY,GAAGA,OAAM,YAAa,GAAG,CAAC,IAAI,CAAC,GAAI,OAAO,KAIzF,MAAM,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,EAAE,CAAC,EACvC,EAAI,KAAK,MAAM,GAAG,EAAE,EAAG,EAAI,KAAK,MAAM,GAAG,EAAE,EACjD,OAAG,IAAI,QAAQ,GAAG,IAAI,SAAS,KAAI,IAAI,MAAM,EAAG,IAAI,OAAO,GAAK,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,EAAU,CAAC,EAAI,CAAG,CAAG,CAC1G,SAAS,OAAO,QAAQ,GAAG,EAAE,EAAE,CAAE,MAAM,GAAG,CAAC,EAAG,QAAQ,EAAE,EAAE,EAAE,QAAQ,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAG,GAAG,CAAC,EAAG,OAAO,KAAM,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAG,CACnJ,MAAM,IAAI,CAAC,EAAG,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,IAAM,QAAQ,EAAE,EAAE,EAAE,WAAW,IAAI,CAAE,MAAM,EAAE,EAAE,WAAY,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAG,CAAI,WAAI,KAAK,GAAG,GAAG,OAAO,CAAC,CAAC,EAAU,GAAK,CAChO,SAAS,UAAU,GAAG,EAAE,EAAE,MAAM,IAAI,MAAM,CACxC,IAAI,IAAI,OAAO,UAAU,GAAG,EAAE,CAAC,EAAG,IAAI,OAAO,UAAU,GAAG,EAAE,CAAC,EAAG,IAAI,OAAO,UAAU,GAAG,EAAE,CAAC,EAC3F,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAK,OAAO,KAC5B,MAAM,EAAE,IAAI,OACZ,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,QAAS,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,EAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,QAAS,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,EACzM,MAAM,KAAK,CAAC,IAAI,IAAI,GAAG,EAAG,KAAK,EAC/B,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,EAAG,UAAU,OAAO,KAAK,UAAU,KAAK,IAAM,KAAK,EAAE,CAAC,EAAG,KAAK,EAAE,CAAC,EAAG,KAAQ,KAAK,GAAI,KAAK,GAC7G,UAAU,OAAO,KAAK,UAAU,KAAK,IAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,QAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,QAC5F,GAAG,QAAQ,EAAI,UAAU,OAAO,KAAK,UAAU,KAAK,IAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,MAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,MACzG,MAAM,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAGxB,IAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAK,KAAK,IAAI,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAI,EAAE,IAC7D,MAAQ,KAAK,GAAG,IAChB,KAAQ,OAAO,GAAG,IACxB,QAAQ,EAAE,EAAE,EAAE,KAAK,IAAI,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CACzC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAS,GAAI,EAAE,EAAG,GAAG,EAAE,GAAG,GACxC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAI,KAAO,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAClD,IAAI,KAAK,EAAE,EAAE,EAAE,EAAG,EAAE,EAAE,EAAE,CAAC,EAAG,GAAG,KAAK,GAAG,EAAE,GAAI,GAAG,KAAK,EAAE,EAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAC7E,CACA,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAG,IAAI,KAAK,EAAE,EAAE,EAAG,EAAE,EAAE,CAAC,CAAG,CAC5H,MAAO,CAAC,IAAI,IAAI,aAAa,GAAG,EAAE,GAAG,IAAI,aAAa,EAAE,EAAE,GAAG,IAAI,aAAa,EAAE,EAAE,IAAI,IAAI,YAAY,GAAG,EAAE,EAAE,IAAI,MAAM,CACzH,CACA,SAAS,SAAS,IAAI,KAAK,IAAI,GAAG,CAAE,GAAG,WAAW,GAAG,aAAa,GAAG,EAAG,GAAG,WAAW,GAAG,aAAa,KAAK,GAAG,YAAY,EAAG,GAAG,wBAAwB,GAAG,EAAG,GAAG,oBAAoB,IAAI,GAAG,GAAG,MAAM,GAAM,EAAE,CAAC,CAAG,CACjN,MAAO,CACL,MAAM,SAASA,OAAM,CAAK,CAACA,QAAuC,CAAhB,KAAKA,MAAK,IAAkB,GAAG,WAAW,EAAE,EAAE,EAAE,CAAC,EAAG,GAAG,MAAM,GAAG,gBAAgB,EAAG,EACrI,KAAK,SAASA,OAAO,GAAI,MAAO,GAAI,MAAO,IAAK,MAAM,CACpD,GAAG,CAACA,QAAO,CAAC,IAAI,CAAC,MAAO,OACxB,MAAM,EAAE,KAAKA,MAAK,EAAG,GAAG,CAAC,EAAG,OAC5B,GAAG,WAAW,EAAE,EAAE,EAAE,CAAC,EAAG,GAAG,MAAM,GAAG,gBAAgB,EACpD,GAAG,WAAW,IAAI,EAClB,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,EAAE,EAAG,OAAY,EAAS,IAAI,KAAK,EAC5D,GAAI,EAGJ,IAFA,GAAG,OAAO,GAAG,KAAK,EAAG,GAAG,UAAU,GAAG,IAAK,GAAG,mBAAmB,EAChE,GAAG,cAAc,GAAG,QAAQ,EAAG,GAAG,YAAY,GAAG,WAAW,GAAG,EAC5D,QAAQ,QAAU,GAAG,CAAE,GAAG,WAAW,GAAG,WAAW,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,cAAc,KAAK,EAAG,QAAQ,KAAO,MAAS,CAAE,MAAQ,CACnI,GAAG,UAAU,EAAE,GAAK,IAAS,UAAc,EAC3C,SAAS,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAG,SAAS,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,SAAS,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EACvF,GAAG,WAAW,GAAG,qBAAqB,MAAM,EAAG,GAAG,WAAW,GAAG,qBAAqB,EAAE,IAAI,GAAG,YAAY,EAC1G,GAAG,aAAa,GAAG,UAAU,EAAE,EAAE,GAAG,eAAe,CAAC,EACtD,EACA,QAAQ,UAAU,CAAE,GAAG,CAAK,KAAI,GAAG,cAAc,GAAG,EAAG,CAAC,OAAO,MAAM,MAAM,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAK,GAAE,GAAG,aAAa,CAAC,CAAG,CAAC,EAAM,MAAK,GAAG,cAAc,IAAI,EAAG,MAAM,EAAE,GAAG,aAAa,oBAAoB,EAAM,GAAE,EAAE,YAAY,CAAG,MAAS,CAAC,CAAE,CACxP,CACF,CACF,CACF,GAAG,EAEH,IAAI,eAAiB,KAAM,QAAU,GAAO,SAAW,GAAI,OAAS,KAChE,IAAM,KACN,MAAO,OAAQ,IAAK,QAAS,SAAU,WAAY,QAAS,QAC5D,KAAO,KACP,OAAS,GAYb,MAAM,eAAoB,WACpB,iBAAoB,GACpB,kBAAoB,GAIpB,oBAAsB,CAAC,WAAY,UAAW,QAAS,UAAW,MAAO,OAAO,EAOtF,SAAS,YAAY,EAAE,CACrB,GAAG,CAAC,EAAG,MAAO,GAGd,MAAM,IAAM,OAAO,EAAE,cAAgB,EAAE,aAAe,EAAE,EAAE,YAAY,EAAE,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,KAAK,EAC9H,GAAG,MAAQ,QAAU,MAAQ,QAAU,MAAQ,WAAa,MAAQ,WAAa,MAAQ,WAAY,MAAO,GAC5G,GAAG,MAAQ,QAAU,MAAQ,SAAW,MAAQ,UAAY,MAAQ,eAAiB,MAAQ,MAAO,MAAO,GAE3G,MAAM,EAAI,OAAO,EAAE,OAAS,EAAE,EAAE,YAAY,EAAE,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAC7F,OAAO,oBAAoB,KAAK,SAAS,EAAE,CAAE,OAAO,EAAE,QAAQ,CAAC,IAAM,EAAI,CAAC,CAC5E,CAGA,MAAM,IAAM,OAAO,OAAO,IAAI,EAC9B,SAAS,WAAW,IAAI,CACtB,GAAG,CAAC,IAAK,OAAO,KAChB,IAAI,EAAI,IAAI,GAAG,EACf,OAAI,IACF,EAAI,CAAE,IAAI,IAAI,MAAS,MAAM,EAAM,EACnC,EAAE,IAAI,YAAc,YACpB,EAAE,IAAI,OAAU,UAAU,CAAE,EAAE,MAAQ,EAAM,EAC5C,EAAE,IAAI,QAAU,UAAU,CAAE,EAAE,MAAQ,EAAO,EAC7C,EAAE,IAAI,IAAM,IACZ,IAAI,GAAG,EAAI,GAEN,EAAE,MAAQ,EAAE,IAAM,IAC3B,CAGA,SAAS,SAAS,IAAI,CAIpB,MAHG,CAAC,MACJ,IAAM,OAAO,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAE,KAAK,EACpC,IAAI,SAAW,IAAG,IAAM,IAAI,MAAM,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GACzD,IAAI,OAAS,GAAU,KACnB,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,EAAG,SAAS,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,EAAG,SAAS,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/F,CACA,SAAS,OAAO,EAAE,CAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAG,CAGnD,SAAS,WAAW,EAAE,CACpB,GAAG,GAAK,MAAM,QAAQ,EAAE,OAAO,GAAK,EAAE,QAAQ,OAAO,CACnD,MAAM,IAAM,EAAE,QAAQ,IAAI,QAAQ,EAAE,OAAO,OAAO,EAClD,GAAG,IAAI,OAAQ,OAAO,GACxB,CACA,GAAG,GAAK,EAAE,MAAM,CAAE,MAAMC,GAAI,SAAS,EAAE,KAAK,EAAG,GAAGA,GAAG,MAAO,CAACA,EAAC,CAAG,CAEjE,MAAO,CADG,SAAS,SAAS,IAAI,IAAI,GAAK,SAAS,IAAI,CAC7C,CACX,CAGA,SAAS,UAAU,EAAE,CACnB,OAAG,IAAI,SAAW,OAAe,EAAE,WAAa,UAC7C,EAAE,MAAc,EAAE,MAClB,MAAM,QAAQ,EAAE,OAAO,GAAK,EAAE,QAAQ,OAAe,EAAE,QAAQ,CAAC,EAC5D,SAAS,IAAI,IAAI,GAAK,SAAS,IACxC,CAGA,SAAS,UAAU,EAAE,CACnB,IAAI,EAAI,UACR,MAAM,IAAM,KAAM,EAAK,EAAE,WAAa,MAAS,WAAmB,EAAI,YAChE,IAAM,CAAC,EACb,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CAClB,MAAM,EAAI,IAAI,EAAE,KAAK,GAAG,EAClB,IAAM,KAAK,IAAI,IAAI,EAAG,GAAI,EAChC,IAAI,KAAK,CACP,GAAI,KAAK,IAAI,CAAC,EAAE,IAChB,GAAI,KAAK,IAAI,CAAC,EAAE,IAAI,IACpB,EAAI,IAAO,IAAI,EAAE,GACjB,MAAO,IAAI,EAAE,KAAK,GAAG,EACrB,GAAI,KAAK,MAAM,IAAI,EAAE,CAAC,EACtB,IAAK,IAAI,EAAI,GACf,CAAC,CACH,CACA,OAAO,GACT,CAGA,SAAS,cAAc,CACrB,GAAG,SAAS,eAAe,WAAW,EAAG,OACzC,MAAM,EAAI,SAAS,cAAc,OAAO,EACxC,EAAE,GAAK,YACP,EAAE,YAAc,CACd,wFACA,mEACA,gFACA,yDACA,+FACA,6EACA,+CACA,uFACA,yCACA,gGACA,+EACA,gHACA,kJACA,4FACA,0GACA,iEACA,sCACA,iGACA,6DACA,mFACA,oGACA,wCACA,iFACA,oGACA,2FACA,gDACA,uCACA,gDACA,wGACA,qFACA,+CACA,wEACA,wHACA,qHACA,yCACA,0BACA,2GACA,2GACA,8EACA,+FACA,wGACA,mDACA,qFACA,6CACA,gJACA,kHACA,mLACA,iEACA,oEACA,uDACA,gKACA,oHACA,gEACA,wEACF,EAAE,KAAK,EAAE,EACT,SAAS,KAAK,YAAY,CAAC,CAC7B,CAGA,SAAS,cAAc,CAmDrB,GAlDA,aAAa,EACb,QAAU,SAAS,cAAc,KAAK,EACtC,QAAQ,UAAY,cACpB,QAAQ,UACN,g+FAuCF,SAAS,KAAK,YAAY,OAAO,EACjC,SAAS,KAAK,MAAM,SAAW,SAE/B,MAAQ,QAAQ,cAAc,OAAO,EACrC,OAAS,QAAQ,cAAc,qBAAqB,EACpD,KAAO,QAAQ,cAAc,SAAS,EACtC,IAAM,KAAM,IAAM,KACf,KAAO,IAAI,SAAW,aAAe,GAAG,CAAE,IAAM,aAAa,OAAO,IAAI,CAAG,MAAS,CAAE,IAAM,IAAM,SAC7F,KAAO,IAAI,SAAW,WAAa,GAAG,CAAE,IAAM,QAAQ,OAAO,IAAI,CAAG,MAAS,CAAE,IAAM,IAAM,CAOnG,GANG,KAAM,KAAK,MAAM,QAAQ,QAAY,QAAO,MAAM,MAAM,WAAW,WAC9D,IAAM,KAAK,MAAM,QAAQ,QACzB,OAAO,KAAK,MAAM,QAAQ,QAClC,IAAM,OAAO,WAAW,IAAI,EAGzB,aAAa,KAAK,SAAS,MAAM,GAAK,KAAO,IAAI,SAAW,WAAW,CACxE,MAAM,GAAK,SAAS,cAAc,KAAK,EACvC,GAAG,UAAY,WACf,GAAG,MAAM,QAAU,iMACnB,GAAG,UACD,8FAA8F,cAAc,QAAQ,CAAC,EAAE,qFAC5C,cAAc,mIACI,cAAc,QAAQ,CAAC,EAAE,oFAC5C,cAAc,6IACe,eAAe,QAAQ,CAAC,EAAE,uFACpD,eAAe,uJACqB,iBAAiB,QAAQ,CAAC,EAAE,uFAChE,iBAAiB,wCAClF,QAAQ,cAAc,YAAY,GAAW,SAAS,YAAY,EAAE,EAClF,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAS,EAAE,CAAE,cAAgB,WAAW,EAAE,OAAO,KAAK,EAAG,GAAG,cAAc,MAAM,EAAE,YAAc,cAAc,QAAQ,CAAC,CAAG,CAAC,EAC9K,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAS,EAAE,CAAE,cAAgB,WAAW,EAAE,OAAO,KAAK,EAAG,GAAG,cAAc,MAAM,EAAE,YAAc,cAAc,QAAQ,CAAC,CAAG,CAAC,EAC9K,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAS,EAAE,CAAE,eAAiB,WAAW,EAAE,OAAO,KAAK,EAAG,GAAG,cAAc,MAAM,EAAE,YAAc,eAAe,QAAQ,CAAC,CAAG,CAAC,EAChL,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAS,EAAE,CAAE,iBAAmB,WAAW,EAAE,OAAO,KAAK,EAAG,GAAG,cAAc,MAAM,EAAE,YAAc,iBAAiB,QAAQ,CAAC,CAAG,CAAC,CACtL,CACA,SAAW,QAAQ,cAAc,aAAa,EAC9C,WAAa,QAAQ,cAAc,eAAe,EAClD,QAAU,QAAQ,cAAc,YAAY,EAC5C,QAAU,QAAQ,cAAc,YAAY,EAC5C,QAAQ,YAAc,IAAI,OAAS,mBAEnC,QAAQ,cAAc,YAAY,EAAE,QAAU,MAC9C,QAAQ,cAAc,UAAU,EAAE,QAAU,MAC5C,QAAQ,cAAc,UAAU,EAAE,QAAU,QAC5C,QAAQ,cAAc,SAAS,EAAE,QAAU,UAC3C,QAAQ,cAAc,UAAU,EAAE,QAAU,WAC5C,QAAQ,cAAc,iBAAiB,EAAE,QAAU,YACnD,QAAQ,cAAc,gBAAgB,EAAE,QAAW,MACnD,QAAQ,iBAAiB,aAAa,EAAE,QAAQ,SAAS,EAAE,CAAK,IAAI,YAAY,EAAE,aAAa,OAAQ,IAAI,UAAU,CAAG,CAAC,EACzH,IAAI,QAAU,QAAQ,cAAc,mBAAmB,EACnD,QAAU,QAAQ,cAAc,iBAAiB,EAClD,SAAW,UAAS,QAAQ,SAAW,UAAU,CAAE,QAAQ,SAAW,CAAC,QAAQ,OAAS,GAC3F,cAAc,EACd,YAAY,CACd,CAGA,SAAS,eAAe,CACtB,WAAW,UAAY,GACpB,IAAC,IAAI,UAAY,IAAI,SAAS,OAAS,GAAK,IAAI,SAAW,SACzD,IAAI,SAAS,OAAS,IAE3B,IAAI,SAAS,QAAQ,GAAG,CACtB,GAAG,IAAI,SAAW,YAAc,CAAC,EAAE,YAAa,OAChD,MAAM,EAAI,SAAS,cAAc,QAAQ,EACzC,EAAE,UAAY,UAAY,IAAM,IAAI,QAAU,MAAQ,IACtD,EAAE,MAAM,WAAa,UAAU,CAAC,EAChC,EAAE,MAAQ,EAAE,OAAS,GACrB,EAAE,QAAU,IAAI,CAAE,WAAW,EAAE,EAAE,CAAG,EACpC,WAAW,YAAY,CAAC,CAC1B,CAAC,CACH,CACA,SAAS,YAAY,CACnB,MAAM,IAAM,WAAW,iBAAiB,SAAS,EACjD,IAAI,SAAS,QAAQ,CAAC,EAAE,IAAI,CAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,UAAU,OAAO,KAAM,IAAM,IAAI,OAAO,CAAG,CAAC,CAC9F,CACA,SAAS,WAAW,GAAG,CACrB,MAAM,EAAI,IAAI,SAAS,KAAK,GAAG,OAAO,EAAE,EAAE,IAAM,OAAO,EAAE,CAAC,EACtD,IACJ,IAAI,QAAU,EACd,WAAW,EACX,YAAY,EACd,CAGA,SAAS,WAAW,EAAE,CACpB,GAAG,CAAC,EAAG,MAAO,GACd,MAAM,IAAM,IAAI,SAAS,QAAQ,CAAC,EAC5B,IAAM,KAAO,EAAI,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAI,MAAQ,GACzD,GAAK,OAAO,EAAE,OAAS,IAAI,OAAS,EAAE,EAAE,YAAY,EAC1D,OAAO,IAAM,EACf,CACA,SAAS,aAAa,CACjB,UAAS,QAAQ,YAAc,WAAW,IAAI,OAAO,EAC1D,CAGA,SAAS,WAAW,CAClB,MAAM,EAAI,IAAI,QACd,GAAG,CAAC,GAAK,CAAC,EAAE,GAAI,OAChB,MAAM,IAAM,SAAW,QAAQ,cAAc,SAAS,EACtD,GAAG,CAAC,IAAK,OACT,MAAM,KAAO,IAAI,YACjB,IAAI,SAAW,GAAM,IAAI,YAAc,cACvC,MAAM,eAAgB,CACpB,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CAAE,MAAO,CAAC,CAAE,GAAI,SAAS,EAAE,GAAI,EAAE,GAAK,EAAE,GAAI,SAAU,CAAE,CAAC,CAAE,CAAC,CACnF,CAAC,EACE,KAAK,SAAS,EAAE,CAAE,GAAG,CAAC,EAAE,GAAI,MAAM,IAAI,MAAM,KAAK,EAAG,OAAO,EAAE,KAAK,CAAG,CAAC,EACtE,KAAK,UAAU,CACd,IAAI,YAAc,6BAClB,SAAS,cAAc,IAAI,YAAY,cAAc,CAAC,EACtD,WAAW,UAAU,CAAE,IAAI,SAAW,GAAO,IAAI,YAAc,IAAM,EAAG,IAAI,CAC9E,CAAC,EACA,MAAM,UAAU,CAAE,IAAI,YAAc,eAAa,IAAI,SAAW,EAAO,CAAC,CAC7E,CAGA,eAAe,WAAW,CACxB,SAAS,YAAc,mCAGvB,MAAM,QAAU,CACd,eAAe,iGACf,eAAe,kGACjB,EACA,eAAiB,MAAM,eAAe,kBAAkB,QAAS,CAC/D,YAAY,CACV,eAAe,mGACf,SAAS,KACX,EACA,YAAY,QAAS,SAAS,CAChC,CAAC,CACH,CAGA,eAAe,KAAK,OAAO,CAKzB,GAJA,IAAM,OACN,OAAS,GAGN,IAAI,SAAW,YAAc,IAAI,SAAW,CAAC,IAAI,QAAQ,YAAY,CACtE,MAAM,GAAK,IAAI,UAAY,CAAC,GAAG,KAAK,GAAK,EAAE,WAAW,EACnD,IAAG,IAAI,QAAU,EACtB,CACI,OAAM,KAAO,UAAU,EAAE,GAC7B,aAAa,CAIf,CAGA,eAAe,aAAa,CAC1B,MAAM,UAAY,SAAW,QAAQ,cAAc,cAAc,EAC9D,WAAW,UAAU,OAAO,EAC/B,MAAM,WAAa,SAAW,QAAQ,cAAc,WAAW,EAAM,aAAY,WAAW,MAAM,QAAQ,SACvG,WAAU,SAAS,MAAM,QAAU,QACtC,GAAG,CACG,gBAAgB,MAAM,UAAU,EACpC,SAAS,YAAc,oDACvB,OAAS,MAAM,UAAU,aAAa,aAAa,CACjD,MAAM,CAAE,WAAW,OAAQ,MAAM,CAAC,MAAM,IAAI,EAAG,OAAO,CAAC,MAAM,GAAG,CAAE,EAAG,MAAM,EAAM,CAAC,EACpF,MAAM,UAAY,OAClB,MAAM,MAAM,KAAK,EACjB,OAAO,MAAQ,MAAM,YAAc,IACnC,OAAO,OAAS,MAAM,aAAe,IACrC,SAAS,MAAM,QAAU,OACzB,QAAU,GACV,sBAAsB,IAAI,CAC5B,OAAO,IAAI,CACT,SAAS,UAAY,mDAAuD,KAAO,IAAI,QAAU,IAAI,QAAU,KAC7G,gFACF,SAAS,MAAM,QAAU,MAC3B,CACF,CACA,SAAS,OAAO,CAGd,GAFA,QAAU,GACP,SAAS,OAAO,UAAU,EAAE,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAG,OAAS,MAC3D,IAAI,CAAE,GAAG,CAAE,IAAI,QAAQ,CAAG,MAAS,CAAC,CAAE,IAAM,IAAM,CACrD,GAAG,IAAI,CAAE,GAAG,CAAE,IAAI,QAAQ,CAAG,MAAS,CAAC,CAAE,IAAM,IAAM,CAClD,UAAU,QAAQ,OAAO,EAAG,QAAU,MACzC,SAAS,KAAK,MAAM,SAAW,EACjC,CAKA,SAAS,YAAY,CACnB,OAAS,CAAC,OACV,MAAM,EAAM,KAAO,IAAI,SAAW,OAAU,IAAM,KAC5C,GAAM,KAAO,IAAI,SAAW,OAAU,GAAK,GAC3C,GAAO,OAAU,oBAAsB,EAAI,IAAO,aAClD,KAAO,OAAU,OAAS,GAAK,IAAO,UAC5C,CAAC,MAAO,OAAQ,IAAI,EAAE,QAAQ,SAAS,GAAG,CAAK,KAAK,GAAG,MAAM,gBAAkB,KAAM,GAAG,MAAM,UAAY,GAAM,CAAC,EACjH,MAAM,EAAI,SAAW,QAAQ,cAAc,UAAU,EAClD,IAAG,EAAE,YAAc,OAAS,wBAAc,mBAC/C,CAGA,SAAS,MAAM,CACb,GAAI,QACJ,IAAG,MAAM,cAAgB,UAAY,MAAM,YAAc,EAAE,CACzD,SAAW,MAAM,YACjB,MAAM,IAAM,eAAe,eAAe,MAAO,YAAY,IAAI,CAAC,EAClE,OAAO,GAAG,CACZ,CACA,sBAAsB,IAAI,EAC5B,CAMA,IAAI,UAAY,KACZ,WAAa,KACjB,MAAM,aAAe,IACf,aAAe,IACf,UAAe,EACf,OAAS,GACT,OAAS,IACT,QAAU,KAChB,SAAS,gBAAgB,IAAI,CAC3B,GAAG,CAAC,WAAa,UAAU,SAAW,IAAI,OAAS,iBAAY,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAU,UACzG,QAAQ,EAAE,EAAE,EAAE,IAAI,OAAO,IAAI,CAC3B,MAAM,EAAE,UAAU,CAAC,EAAG,EAAE,IAAI,CAAC,EACvB,IAAM,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,EAAI,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,EAC1C,EAAI,QAAU,OAAO,QAAQ,KAAK,IAAI,EAAG,IAAI,OAAO,EAC1D,EAAE,IAAM,EAAE,EAAE,EAAE,GAAG,EAAG,EAAE,IAAM,EAAE,EAAE,EAAE,GAAG,EAAG,EAAE,IAAM,EAAE,EAAE,EAAE,GAAG,CAC3D,CACA,OAAO,SACT,CAEA,SAAS,OAAO,IAAI,CAGlB,GAFA,IAAI,UAAU,EAAE,EAAE,OAAO,MAAM,OAAO,MAAM,EACzC,KAAK,IAAI,MAAM,KAAK,EACpB,CAAC,IAAI,eAAiB,CAAC,IAAI,cAAc,OAAO,CAAE,UAAY,KAAM,WAAa,KAAM,MAAQ,CAClG,MAAM,EAAI,OAAO,MAAO,EAAI,OAAO,OAC7B,GAAK,gBAAgB,IAAI,cAAc,CAAC,CAAC,EAC/C,GAAG,IAAI,SAAW,OAAO,CACvB,SAAS,GAAI,EAAG,EAAG,IAAI,OAAO,EAC9B,MACF,CACA,GAAG,IAAI,SAAW,aAAa,CAC7B,GAAG,IAAI,CACL,MAAM,GAAK,SAAU,IAAI,SAAW,IAAI,QAAQ,OAAU,SAAS,EACnE,IAAI,KAAK,MAAO,cAAc,GAAI,EAAG,CAAC,EAAG,CAAC,GAAG,CAAC,EAAE,IAAK,GAAG,CAAC,EAAE,IAAK,GAAG,CAAC,EAAE,GAAG,EAChE,CAAE,UAAU,cAAe,MAAM,QAAQ,EAAE,EAAG,UAAU,cAAe,cAAc,iBAAkB,CAAC,CACnH,MACE,WAAW,GAAI,EAAG,EAAG,IAAI,OAAO,EAChC,eAAe,GAAI,EAAG,EAAG,IAAI,OAAO,EAEtC,MACF,CAGA,MAAM,SAAW,IAAI,SAAW,IAAI,QAAQ,YAC5C,GAAG,SAAS,CACV,MAAM,IAAM,WAAW,QAAQ,EAC/B,GAAG,IACD,GAAG,KAAO,CAAC,YAAY,IAAI,OAAO,EAAE,CAClC,MAAM,GAAK,aAAa,IAAI,OAAO,EACnC,IAAI,KAAK,MAAO,GAAI,IAAK,GAAG,GAAI,GAAG,MAAO,GAAG,IAAK,GAAG,KAAK,CAC5D,MACE,UAAU,GAAI,EAAG,EAAG,IAAK,IAAI,OAAO,EAGxC,MACF,CAGF,CAUA,SAAS,QAAQ,GAAG,GAAG,EAAE,CACvB,MAAM,GAAK,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,GAAK,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,IAAM,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAC9E,OAAG,KAAK,IAAI,EAAE,EAAI,KAAa,KACxB,EACJ,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,GAAK,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,IAClE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAK,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,IAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,IAClE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAK,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAK,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,EACnG,CACF,CACA,SAAS,QAAQ,IAAK,EAAG,EAAE,CACzB,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EACzD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EACzD,GAAG,QAAQ,GAAG,GAAG,EAAE,EAAG,GAAG,QAAQ,GAAG,GAAG,EAAE,EAC5C,CAAC,IAAM,CAAC,KACX,IAAI,KAAK,EACT,IAAI,UAAU,EAAG,IAAI,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAG,IAAI,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAG,IAAI,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAG,IAAI,UAAU,EAAG,IAAI,KAAK,EACtH,IAAI,UAAU,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EACjD,IAAI,UAAU,IAAI,EAAE,CAAC,EACrB,IAAI,QAAQ,EACd,CAGA,MAAM,cAAgB,CAAC,IAAK,IAAK,GAAG,EAC9B,aAAgB,EAChB,YAAc,GACd,WAAc,IACd,WAAc,IACd,QAAU,IACV,QAAU,IAIV,UAAY,GACZ,UAAY,CAAC,IAAK,EAAK,GAAG,EAC1B,UAAY,CAAC,IAAK,IAAK,GAAG,EAC1B,UAAY,CAAC,IAAK,IAAK,GAAG,EAEhC,SAAS,UAAU,GAAI,EAAG,EAAG,IAAK,EAAE,CAClC,MAAM,GAAK,IAAI,cAAiB,IAAI,OAAU,IACxC,GAAK,IAAI,eAAiB,IAAI,QAAU,IAM9C,SAAS,OAAO,QAAQ,CACtB,MAAM,GAAK,CAAC,EACZ,QAAQ,EAAE,EAAE,EAAE,QAAQ,OAAO,IAAI,CAAE,MAAM,EAAI,GAAG,QAAQ,CAAC,CAAC,EAAG,GAAG,CAAC,EAAG,OAAO,KAAM,GAAG,KAAK,CAAC,EAAE,EAAE,EAAG,EAAE,EAAE,CAAC,CAAC,CAAG,CAC1G,MAAM,IAAM,CAAC,EACb,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,IACxB,QAAQ,EAAE,EAAE,EAAE,aAAa,IAAI,CAAE,MAAM,EAAE,EAAE,aAAc,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAG,CAE3I,WAAI,KAAK,GAAG,GAAG,OAAO,CAAC,CAAC,EACjB,GACT,CACA,MAAM,IAAM,OAAO,SAAS,EAAG,IAAM,OAAO,SAAS,EAAG,IAAM,OAAO,SAAS,EAC9E,GAAG,CAAC,KAAO,CAAC,KAAO,CAAC,IAAK,OACzB,MAAM,EAAI,IAAI,OAId,IAAI,IAAM,WAAW,GAAK,EAAE,WAAW,GAAM,MAAM,GAAG,GAAK,KAAO,KAAG,IAAM,GAC3E,MAAM,GAAK,QAAU,IAAK,GAAK,QAAU,IAGzC,GAAG,KAAO,EACR,QAAQ,EAAE,EAAE,EAAE,EAAE,IACd,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,GAAI,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,GACxF,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,GAAI,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,GAG5F,MAAM,KAAO,CAAC,IAAK,IAAK,GAAG,EAAG,KAAO,KAAK,OAE1C,GAAG,KAAO,EAAE,CACV,IAAI,IAAI,EAAG,IAAI,EAAG,GAAG,EACrB,UAAU,OAAO,KAAM,UAAU,KAAK,IAAM,KAAK,EAAE,CAAC,EAAG,KAAK,EAAE,CAAC,EAAG,KAClE,KAAK,GAAI,KAAK,GACd,UAAU,OAAO,KAAM,UAAU,KAAK,IAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAC1F,CAIA,GAAG,YAAc,WAAW,SAAW,EAAE,KAAK,CAC5C,IAAI,EAAE,EACN,QAAQ,EAAE,EAAE,EAAE,KAAK,IAAK,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CAC1C,MAAM,EAAE,WAAW,GAAG,EAAG,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAG,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EACpD,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,EACtC,EAAE,cAAc,aAAa,cAAc,KAAK,IAAI,EAAG,IAAI,SAAS,EAC1E,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAC/D,CACF,CACA,WAAW,CAAC,EAAG,QAAQ,EAAE,EAAE,EAAE,KAAK,IAAK,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAK,WAAW,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAKzG,MAAM,UAAa,YAAY,CAAC,EAC1B,WAAa,UAAY,eAAiB,cAChD,IAAI,GACD,UACD,GAAK,kBAEL,GAAK,WAAW,GAAK,EAAE,aAAa,EACjC,MAAM,EAAE,IAAG,GAAK,oBAErB,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAE,CAAC,EAGhC,MAAM,KAAQ,GAAM,CAClB,MAAM,EAAK,GAAG,EAAK,GAAM,GAAG,EAAE,GACxB,EAAI,WACV,IAAI,EAAI,EACR,OAAG,EAAI,EAAU,EAAI,EAAE,EACf,EAAI,EAAE,IAAG,GAAK,EAAE,GAAG,GAC3B,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,CAAC,CAAC,EACvB,EAAE,GAAG,EAAE,EAAE,EAClB,EAEM,SAAW,IAAM,CACrB,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CACvB,MAAM,GAAI,GAAG,KAAK,GAAI,GAAI,IAAK,EAAE,IAAI,KAAK,GAAI,GAC9C,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CACpB,IAAI,YAAc,GAAK,KAAK,CAAC,EAC7B,MAAM,GAAI,GAAG,EAAE,GAAI,GAAI,IAAK,EAAE,IAAI,EAAE,GAAI,GAClC,GAAG,KAAK,CAAC,EAAE,CAAC,EAAG,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,EAAG,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAG,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,EACvE,QAAQ,IAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAG,CAAC,GAAG,GAAG,EAAE,CAAC,EAClD,QAAQ,IAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CACpD,CACF,CACF,EAWA,GAPA,IAAI,KAAK,EACT,IAAI,yBAA2B,WAC/B,SAAS,EACT,IAAI,QAAQ,EACZ,IAAI,YAAc,EAClB,IAAI,yBAA2B,cAE5B,UAAU,CACX,MAAM,KAAO,CAAC,UAAW,UAAW,SAAS,EACvC,GAAK,CAAC,uBAAuB,uBAAuB,uBAAuB,EAC3E,EAAI,KAAK,IAAI,GAAK,EAAE,IAAI,IAAM,CAAE,MAAM,EAAI,GAAG,EAAE,EAAG,OAAO,EAAI,CAAC,EAAE,EAAE,EAAG,EAAE,EAAE,CAAC,EAAI,IAAM,CAAC,CAAC,EAC5F,IAAI,KAAK,EAAG,IAAI,yBAA2B,cAC3C,IAAI,YAAc,wBAAyB,IAAI,UAAY,IAC3D,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAK,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CACvC,MAAM,EAAI,EAAE,CAAC,EAAE,CAAC,EAAO,IACpB,EAAE,GAAK,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,UAAU,EAAG,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAG,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAG,IAAI,OAAO,GAC7G,EAAE,GAAK,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,UAAU,EAAG,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAG,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAG,IAAI,OAAO,GAClH,CACA,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAK,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CACvC,MAAM,EAAI,EAAE,CAAC,EAAE,CAAC,EAAO,IACvB,IAAI,UAAY,GAAG,CAAC,EAAG,IAAI,UAAU,EAAG,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAG,IAAI,KAAK,EAChF,IAAI,UAAY,mBAAoB,IAAI,UAAU,EAAG,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAG,IAAI,KAAK,EACjG,CACA,IAAI,QAAQ,CACd,CACF,CAGA,SAAS,YAAY,OAAQ,EAAG,EAAG,KAAM,MAAO,EAAE,CAChD,GAAG,CAAC,QAAU,CAAC,EAAG,OAClB,MAAM,OAAS,KAAO,IAChB,OAAS,WAAW,CAAC,EACrB,MAAQ,EAAE,SAAW,QACrB,KAAQ,EAAE,SAAW,cACrB,MAAQ,EAAE,OAAS,OACnB,EAAI,YAAY,IAAI,EAAE,IAE5B,IAAI,KAAK,EACT,IAAI,UAAU,OAAO,EAAE,EAAG,OAAO,EAAE,CAAC,EACpC,IAAI,OAAO,KAAK,EAEhB,UAAU,KAAK,KAAK,CAClB,MAAM,EAAI,EAAE,GAAG,OAAQ,EAAI,EAAE,GAAG,OAC1B,KAAO,KAAO,IACd,IAAM,EAAE,IAAM,IAAM,MAAQ,EAAE,EAAI,KAExC,IAAI,OACJ,GAAG,KAAK,CACN,MAAM,KAAO,EAAE,IAAM,EAAE,GAAG,GAAG,KAAO,EAAE,GAAG,GAAG,KAAO,IACnD,OAAS,SAAS,IAAI,IAAK,GAAK,GAAI,CACtC,MACE,OAAS,OAAO,EAAE,GAAK,OAAO,MAAM,EAEtC,MAAM,IAAM,OAAS,OAAO,MAAM,EAAI,IAGtC,GAAG,CAAC,MAAM,CACR,IAAI,yBAA2B,UAC/B,MAAM,GAAK,IAAO,IAAK,KAAK,IAAI,EAAE,EAAI,EAAE,KAAK,EACvC,GAAK,GAAG,IACR,EAAI,IAAI,qBAAqB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC/C,EAAE,aAAa,EAAG,QAAU,OAAO,MAAM,EAAI,KAAO,GAAI,IAAI,QAAQ,CAAC,EAAI,GAAG,EAC5E,EAAE,aAAa,EAAG,QAAU,OAAO,MAAM,EAAI,KAAK,EAClD,IAAI,UAAY,EAChB,IAAI,UAAU,EAAG,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAG,IAAI,KAAK,CACzD,CAGA,IAAI,yBAA2B,cAC/B,IAAI,UAAY,IACb,QAAU,SAAW,MAAM,EAAE,EAAE,GAAG,GAAG,EAChC,QAAU,aAAe,UAAU,EAAE,EAAE,GAAG,EAAK,GAAG,GACnD,IAAI,UAAU,EAAG,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAG,IAAI,KAAK,GAG1D,QACF,IAAI,UAAY,wBAChB,IAAI,UAAU,EAAG,IAAI,IAAI,EAAI,GAAG,GAAK,EAAI,GAAG,GAAK,GAAG,IAAM,EAAG,KAAK,GAAG,CAAC,EAAG,IAAI,KAAK,EAEtF,CAEA,IAAI,QAAQ,EACZ,IAAI,yBAA2B,aACjC,CAEA,SAAS,MAAM,EAAE,EAAE,EAAE,CACnB,IAAI,UAAU,EACd,IAAI,OAAO,EAAG,EAAI,EAAE,GAAI,EACxB,IAAI,cAAc,EAAI,EAAG,EAAI,EAAE,GAAM,EAAI,EAAE,IAAM,EAAI,EAAE,IAAM,EAAG,EAAI,EAAE,GAAI,EAC1E,IAAI,cAAc,EAAI,EAAE,IAAM,EAAI,EAAE,IAAM,EAAI,EAAG,EAAI,EAAE,GAAM,EAAG,EAAI,EAAE,GAAI,EAC1E,IAAI,UAAU,EAAG,IAAI,KAAK,CAC5B,CACA,SAAS,UAAU,EAAE,EAAE,EAAE,OAAO,CAC9B,IAAI,KAAK,EACT,IAAI,YAAc,OAClB,IAAI,UAAY,KAAK,IAAI,EAAG,EAAE,GAAI,EAClC,IAAI,QAAU,QACd,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CAClB,MAAM,EAAI,EAAE,KAAK,GAAG,EACpB,IAAI,UAAU,EACd,IAAI,OAAO,EAAE,CAAC,EACd,IAAI,OAAO,EAAI,KAAK,IAAI,CAAC,EAAE,EAAG,EAAI,KAAK,IAAI,CAAC,EAAE,CAAC,EAC/C,IAAI,OAAO,CACb,CACA,IAAI,QAAQ,CACd,CAMA,SAAS,WAAW,EAAE,CAAC,OAAO,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,EAAE,SAAE,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAU,EAAE,IAAI,MAAM,GAAG,UAAW,CAAE,CAC/J,MAAM,UAAY,UAAU,CAC1B,MAAM,IAAM,WAAW,UAAU,EAAG,IAAM,CAAC,EAAG,EAAI,GAClD,QAAQ,EAAE,EAAE,EAAE,EAAE,IACd,IAAI,KAAK,CACP,EAAG,IAAI,EACP,EAAG,GAAO,IAAI,EAAE,GAChB,EAAG,GAAM,IAAI,EAAE,IACf,GAAI,IAAI,EAAE,KAAK,GAAG,EAClB,GAAI,IAAM,IAAI,EAAE,IAChB,EAAG,IAAO,IAAI,EAAE,GAChB,KAAM,IAAI,EAAI,GAChB,CAAC,EAEH,OAAO,GACT,GAAG,EASH,SAAS,WAAW,GAAI,EAAG,EAAG,EAAE,CAG9B,GAFG,iBAAmB,GACnB,CAAC,OAAS,CAAC,MAAM,YACjB,OAAO,IAAI,QAAW,SAAU,OAC/B,YAAY,UAAY,SAAS,cAAc,QAAQ,GAC3D,MAAM,GAAK,WACR,GAAG,QAAU,GAAK,GAAG,SAAW,KAAI,GAAG,MAAQ,EAAG,GAAG,OAAS,GACjE,MAAM,GAAK,GAAG,WAAW,IAAI,EAGvB,GAAK,GAAG,GAAG,EAAG,GAAK,GAAG,GAAG,EACzB,GAAM,IAAM,GAAM,KAAK,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,EAAI,EAAE,IAEpE,IAAI,GAAG,EAAG,GAAG,EAAG,GAAG,EACnB,QAAQ,EAAE,EAAE,EAAE,UAAU,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAM,IAAI,IAAI,EAAE,EAAG,IAAI,EAAE,EAAG,KAAQ,CAC7F,KAAK,IAAI,GAAI,IAAI,IACpB,MAAM,MAAQ,GAAG,GAAG,EAAI,GAAG,GAAG,EAAE,EAAK,GAAK,GAG1C,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAC3B,GAAG,yBAA2B,cAC9B,GAAG,YAAc,EACjB,GAAG,UAAU,EAAE,EAAE,EAAE,CAAC,EACpB,GAAG,OAAS,QAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,GAAG,WAAW,CAAC,EAAE,MAC5D,GAAG,UAAU,MAAO,EAAG,EAAG,EAAG,CAAC,EAC9B,GAAG,OAAS,OAIZ,MAAM,QAAU,KAAK,IAAI,EAAG,KAAK,MAAM,GAAG,kBAAkB,CAAC,EAC7D,GAAG,yBAA2B,iBAC9B,GAAG,OAAS,QAAQ,QAAQ,MAC5B,GAAG,UAAY,OACf,GAAG,UAAU,EACb,QAAQ,EAAE,EAAE,EAAE,UAAU,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAG,GAAG,CAAC,EAAG,SACpE,MAAM,GAAK,IAAM,EAAE,EAAE,IAAI,kBAAoB,EACvC,GAAK,OAAS,EAAE,EAAI,OAAO,qBAAuB,EACrD,IAAI,EAAG,GAAG,OAAO,EAAE,CAAC,EAAQ,GAAG,OAAO,EAAE,CAAC,CAAG,CACjD,GAAG,UAAU,EAAG,GAAG,KAAK,EACxB,GAAG,OAAS,OAGZ,MAAM,QAAU,SAAS,KAAK,CAC5B,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAC/B,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAM,IAAI,GAAG,GAAS,EAAE,EAAE,MAAI,IAAI,EAAE,GAAM,EAAE,EAAE,MAAI,IAAI,EAAE,GAAM,EAAE,EAAE,MAAI,IAAI,EAAE,GAAM,EAAE,EAAE,MAAI,IAAI,EAAE,GAAK,CACvJ,OAAO,GAAK,CAAE,IAAI,IAAI,KAAK,EAAE,EAAG,IAAI,IAAI,KAAK,EAAE,EAAG,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,EAAG,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAE,EAAI,IACnH,EACM,SAAW,SAAS,EAAG,KAAK,CAChC,GAAG,CAAC,EAAG,OACP,MAAM,GAAG,EAAE,GAAG,KAAM,GAAG,EAAE,GAAG,KAAM,EAAE,KAAK,IAAI,GAAG,EAAE,EAC5C,EAAE,GAAG,qBAAqB,EAAE,GAAG,EAAE,GAAG,EAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACxD,EAAE,aAAa,EAAE,eAAe,EAAG,EAAE,aAAa,GAAI,eAAe,EAAG,EAAE,aAAa,EAAE,eAAe,EACxG,GAAG,KAAK,EAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,EAAG,GAAG,MAAM,GAAG,EAAG,GAAG,CAAC,EAAG,GAAG,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAClF,GAAG,UAAU,EAAG,GAAG,UAAU,EAAG,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAG,GAAG,KAAK,EAAG,GAAG,QAAQ,CACzF,EACA,GAAG,yBAA2B,kBAC9B,SAAS,QAAQ,aAAa,EAAI,GAAG,EACrC,SAAS,QAAQ,cAAc,EAAG,GAAG,EACrC,SAAS,QAAQ,UAAU,EAAO,GAAG,EACrC,SAAS,QAAQ,SAAS,EAAQ,IAAI,EACtC,GAAG,yBAA2B,cAG9B,IAAI,KAAK,EACT,IAAI,yBAA2B,cAC/B,IAAI,YAAc,gBAClB,IAAI,UAAU,GAAI,EAAG,CAAC,EACtB,IAAI,QAAQ,EACZ,IAAI,YAAc,EAClB,IAAI,yBAA2B,aACjC,CAOA,SAAS,eAAe,GAAI,EAAG,EAAG,EAAE,CAClC,GAAG,CAAC,EAAG,OACP,MAAM,IAAM,SAAS,EAAE,OAAS,SAAS,EAAG,GAAG,CAAC,IAAK,OAClD,sBAAsB,IAAI,CAAC,EAAI,KAAK,IAAI,EAAG,IAAI,CAAC,EAAI,mBAAmB,GAEtE,WAAW,SAAW,SAAS,cAAc,QAAQ,GACzD,MAAM,GAAK,UACR,GAAG,QAAU,GAAK,GAAG,SAAW,KAAI,GAAG,MAAQ,EAAG,GAAG,OAAS,GACjE,MAAM,GAAK,GAAG,WAAW,IAAI,EAC7B,GAAG,UAAU,EAAE,EAAE,EAAE,CAAC,EACpB,IAAI,GAAG,EAAG,GAAG,EAAG,GAAG,EACnB,QAAQ,EAAE,EAAE,EAAE,UAAU,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAM,IAAI,IAAI,EAAE,EAAG,IAAI,EAAE,EAAG,KAAQ,CAC7F,KAAK,IAAI,GAAI,IAAI,IACpB,MAAM,GAAK,GAAG,GAAG,EAAG,GAAK,GAAG,GAAG,EACzB,GAAM,IAAM,GAAM,KAAK,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,EAAI,EAAE,IAC9D,KAAO,SAAS,KAAK,EAAE,CAAE,GAAG,UAAU,EAAG,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAG,GAAG,CAAC,EAAG,SAAU,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,GAAG,EAAG,GAAG,IAAI,EAAE,EAAE,IAAI,GAAG,EAAM,IAAI,EAAG,GAAG,OAAO,EAAE,CAAC,EAAQ,GAAG,OAAO,EAAE,CAAC,CAAG,CAAE,GAAG,UAAU,CAAG,EAGtO,GAAG,yBAA2B,cAC9B,GAAG,UAAY,OAAO,OAAO,GAAG,EAAE,IAClC,MAAM,MAAQ,GAAG,GAAG,EAAI,GAAG,GAAG,EAAE,EAAK,GAAK,GAC1C,GAAG,UAAU,EACb,QAAQ,EAAE,EAAE,EAAE,UAAU,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAG,GAAG,CAAC,EAAG,SACpE,MAAM,GAAK,IAAM,EAAE,EAAE,IAAI,kBAAoB,EACvC,GAAK,OAAS,EAAE,EAAI,OAAO,qBAAuB,EACrD,IAAI,EAAG,GAAG,OAAO,EAAE,CAAC,EAAQ,GAAG,OAAO,EAAE,CAAC,CAAG,CACjD,GAAG,UAAU,EAAG,GAAG,KAAK,EAIxB,MAAM,QAAU,SAAS,KAAK,CAC5B,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAC/B,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,IAAI,CAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAM,IAAI,GAAG,GAAS,EAAE,EAAE,MAAI,IAAI,EAAE,GAAM,EAAE,EAAE,MAAI,IAAI,EAAE,GAAM,EAAE,EAAE,MAAI,IAAI,EAAE,GAAM,EAAE,EAAE,MAAI,IAAI,EAAE,GAAK,CACvJ,OAAO,GAAK,CAAE,IAAI,IAAI,KAAK,EAAE,EAAG,IAAI,IAAI,KAAK,EAAE,EAAG,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,EAAG,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAE,EAAI,IACnH,EACM,SAAW,SAAS,EAAG,KAAK,CAChC,GAAG,CAAC,EAAG,OACP,MAAM,GAAG,EAAE,GAAG,KAAM,GAAG,EAAE,GAAG,KAAM,EAAE,KAAK,IAAI,GAAG,EAAE,EAC5C,EAAE,GAAG,qBAAqB,EAAE,GAAG,EAAE,GAAG,EAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACxD,EAAE,aAAa,EAAE,eAAe,EAAG,EAAE,aAAa,GAAI,eAAe,EAAG,EAAE,aAAa,EAAE,eAAe,EACxG,GAAG,KAAK,EAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,EAAG,GAAG,MAAM,GAAG,EAAG,GAAG,CAAC,EAAG,GAAG,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAClF,GAAG,UAAU,EAAG,GAAG,UAAU,EAAG,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAG,GAAG,KAAK,EAAG,GAAG,QAAQ,CACzF,EACA,GAAG,yBAA2B,kBAC9B,SAAS,QAAQ,aAAa,EAAI,GAAG,EACrC,SAAS,QAAQ,cAAc,EAAG,GAAG,EACrC,SAAS,QAAQ,SAAS,EAAQ,GAAG,EACrC,SAAS,QAAQ,UAAU,EAAO,GAAG,EACrC,SAAS,QAAQ,UAAU,EAAO,GAAG,EACrC,GAAG,yBAA2B,cAE9B,MAAM,KAAO,KAAK,IAAI,EAAG,KAAK,MAAM,GAAK,kBAAkB,CAAC,EAC5D,IAAI,KAAK,EACT,IAAI,yBAA2B,iBAE/B,MAAM,MAAQ,KAAM,IAAI,CAAC,EAAI,KAAM,IAAI,CAAC,EAAI,KAAM,IAAI,CAAC,GAAK,IAC5D,IAAI,YAAc,KAAK,IAAI,oBAAqB,iBAAmB,EAAI,MAAQ,sBAAsB,EAClG,OAAO,IAAI,QAAW,WAAW,IAAI,OAAS,QAAQ,KAAK,OAC9D,IAAI,UAAU,GAAI,EAAG,CAAC,EACtB,IAAI,OAAS,OACb,IAAI,QAAQ,EACZ,IAAI,YAAc,EAClB,IAAI,yBAA2B,aACjC,CAGA,SAAS,SAAS,GAAI,EAAG,EAAG,EAAE,CAC5B,GAAG,CAAC,EAAG,OACP,MAAM,IAAM,SAAS,EAAE,WAAa,SAAS,EAC7C,IAAI,GAAK,WAAW,EAAE,WAAW,EAC9B,MAAM,EAAE,IAAG,GAAK,KAInB,MAAM,GAAK,cACL,KAAO,cAOP,GAAG,CAAC,EAAG,GAAG,CAAC,EAEjB,GADA,WAAW,QAAQ,KAAK,CAAE,MAAM,GAAG,GAAG,GAAG,EAAM,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC,EAAG,GAAG,KAAK,GAAG,EAAE,CAAC,EAAK,CAAC,EACtF,CAAC,GAAG,OAAQ,OACf,MAAM,IAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,OACjC,IAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,OAIjC,SAAW,KACX,SAAW,EACX,SAAW,KACX,SAAY,WAAa,GAAK,WAAa,GAAK,WAAa,EAC7D,GAAK,GAAK,KAAO,EAAE,KAAK,SACxB,GAAK,GAAM,EAAI,IAAO,KAAO,EAAE,KAAK,SAAW,KAAO,EAAE,KAAK,SAE7D,GAAK,CAAC,EAAG,GAAK,CAAC,EAkBrB,GAjBA,IAAI,KAAK,EACT,IAAI,UAAU,EACd,WAAW,QAAQ,CAAC,IAAI,IAAI,CAC1B,MAAM,GAAK,GAAG,GAAG,EAAG,GAAG,CAAC,GAAI,OAC5B,MAAM,EAAI,GAAG,GAAG,EAAE,CAAC,EAAG,EAAI,GAAG,GAAG,EAAE,CAAC,EACnC,GAAG,KAAK,CAAC,EAAG,GAAG,KAAK,CAAC,EAClB,IAAI,EAAG,IAAI,OAAO,EAAE,CAAC,EAAQ,IAAI,OAAO,EAAE,CAAC,CAChD,CAAC,EACD,IAAI,UAAU,EACd,WAAW,QAAQ,CAAC,IAAI,IAAI,CAC1B,MAAM,GAAK,GAAG,GAAG,EAAG,GAAG,CAAC,GAAI,OAC5B,MAAM,EAAI,GAAG,EAAE,EAAG,EAAI,GAAG,EAAE,EACxB,IAAI,EAAG,IAAI,OAAO,EAAE,CAAC,EAAQ,IAAI,OAAO,EAAE,CAAC,CAChD,CAAC,EACD,IAAI,UAAU,EACd,IAAI,KAAK,SAAS,EAEf,CAAC,GAAG,OAAO,CAAE,IAAI,QAAQ,EAAG,IAAI,yBAA2B,cAAe,MAAQ,CAErF,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,EAAG,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,EACzD,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,EAAG,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,EACzD,IAAI,KAAK,MAAM,EAAG,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,EAAG,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,EAIvE,KAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,OAAO,CACzC,MAAM,EAAI,KAAO,GACX,EAAK,MAAc,IACzB,IAAI,KAAK,EACT,IAAI,yBAA2B,UAC/B,IAAI,UAAU,GAAG,EAAE,EACnB,IAAI,MAAM,KAAK,IAAI,KAAM,EAAE,EAAG,KAAK,IAAI,KAAM,EAAE,CAAC,EAChD,MAAM,EAAI,IAAI,qBAAqB,EAAE,EAAE,EAAG,EAAE,EAAE,CAAC,EAC/C,EAAE,aAAa,EAAM,QAAQ,EAAE,IAAI,GAAG,GAAG,EACzC,EAAE,aAAa,EAAG,QAAQ,EAAE,IAAI,GAAG,GAAG,EACtC,EAAE,aAAa,EAAM,QAAQ,EAAE,KAAK,EACpC,IAAI,UAAY,EAChB,IAAI,UAAU,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAG,IAAI,KAAK,EACtD,IAAI,QAAQ,CACd,EAIM,MAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,CAClC,IAAI,KAAK,EACT,IAAI,yBAA2B,cAC/B,IAAI,UAAU,GAAG,EAAE,EACnB,IAAI,MAAM,KAAK,IAAI,KAAM,EAAE,EAAG,KAAK,IAAI,KAAM,EAAE,CAAC,EAChD,MAAM,EAAI,IAAI,qBAAqB,EAAE,EAAE,EAAG,EAAE,EAAE,CAAC,EAC/C,EAAE,aAAa,EAAM,QAAQ,IAAI,IAAI,GAAG,GAAG,EAC3C,EAAE,aAAa,GAAM,QAAQ,IAAI,KAAK,GAAG,IAAK,QAAQ,CAAC,EAAE,GAAG,EAC5D,EAAE,aAAa,EAAM,QAAQ,IAAI,KAAK,EACtC,IAAI,UAAY,EAChB,IAAI,UAAU,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAG,IAAI,KAAK,EACtD,IAAI,QAAQ,CACd,EAUA,GADA,IAAI,yBAA2B,cAC5B,SAAS,CAIV,MAAM,GAAK,WAAW,OACtB,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI,CACnB,MAAM,GAAG,EAAE,GAAG,GACR,EAAE,GAAG,WAAW,CAAC,CAAC,EAAG,EAAE,GAAG,WAAW,CAAC,CAAC,EAAG,EAAE,GAAG,WAAW,CAAC,CAAC,EAAG,EAAE,GAAG,WAAW,CAAC,CAAC,EACvF,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAG,SACnB,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAG,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EACvD,QAAQ,MAAO,CAAC,GAAG,GAAG,EAAE,EAAG,CAAC,GAAG,GAAG,EAAE,CAAC,EACrC,QAAQ,MAAO,CAAC,GAAG,GAAG,EAAE,EAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CACvC,CACF,MACE,IAAI,UAAU,MAAO,EAAG,EAAG,EAAG,CAAC,EAEjC,IAAI,yBAA2B,WAC/B,MAAM,OAAS,KAAK,IAAI,GAAM,KAAK,IAAI,IAAM,GAAG,EAAM,GAAI,CAAC,EACrD,MAAQ,IAAI,qBAAqB,EAAG,KAAM,EAAG,IAAI,EACvD,MAAM,aAAa,EAAM,QAAQ,OAAO,GAAG,EAAE,KAAK,OAAO,KAAM,QAAQ,CAAC,EAAE,GAAG,EAC7E,MAAM,aAAa,GAAM,QAAQ,OAAO,GAAG,EAAE,IAAI,OAAO,QAAQ,CAAC,EAAE,GAAG,EACtE,MAAM,aAAa,IAAM,QAAQ,OAAO,GAAG,EAAE,IAAI,OAAO,QAAQ,CAAC,EAAE,GAAG,EACtE,MAAM,aAAa,EAAM,QAAQ,OAAO,GAAG,EAAE,KAAK,OAAO,KAAM,QAAQ,CAAC,EAAE,GAAG,EAC7E,IAAI,UAAY,MAChB,IAAI,SAAS,EAAE,EAAE,EAAE,CAAC,EACpB,IAAI,yBAA2B,cAC/B,MAAM,IAAM,KAAK,IAAI,IAAM,KAAK,IAAI,IAAM,GAAG,GAAI,CAAC,EAC5C,MAAQ,IAAI,qBAAqB,EAAG,KAAM,EAAG,IAAI,EACvD,MAAM,aAAa,EAAM,QAAQ,OAAO,GAAG,EAAE,KAAK,IAAI,KAAM,QAAQ,CAAC,EAAE,GAAG,EAC1E,MAAM,aAAa,GAAM,QAAQ,OAAO,GAAG,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE,GAAG,EACnE,MAAM,aAAa,IAAM,QAAQ,OAAO,GAAG,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE,GAAG,EACnE,MAAM,aAAa,EAAM,QAAQ,OAAO,GAAG,EAAE,KAAK,IAAI,KAAM,QAAQ,CAAC,EAAE,GAAG,EAC1E,IAAI,UAAY,MAChB,IAAI,SAAS,EAAE,EAAE,EAAE,CAAC,EAMpB,MAAM,KAAO,KAAK,MAAM,IAAI,CAAC,EAAE,EAAG,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,EAAG,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,EAAG,EACxF,MAAM,KAAO,KAAK,IAAM,KAAO,KAAK,GAAM,KAAK,IAAM,KAAK,IAAM,IAAM,IAAI,EAC1E,MAAM,KAAO,KAAK,IAAM,KAAO,KAAK,GAAM,KAAK,IAAM,KAAK,IAAM,IAAM,IAAI,EAC1E,KAAK,GAAI,KAAO,KAAK,IAAM,KAAK,IAAM,KAAK,IAAO,GAAM,GAAI,EAC5D,KAAK,GAAI,KAAO,KAAK,GAAM,KAAK,GAAM,KAAK,IAAO,IAAM,GAAI,EAI5D,IAAI,yBAA2B,SAC/B,MAAM,MAAQ,IAAI,qBAAqB,EAAG,KAAM,EAAG,IAAI,EACvD,MAAM,aAAa,EAAM,QAAQ,GAAG,QAAQ,EAC5C,MAAM,aAAa,IAAM,QAAQ,GAAG,QAAQ,EAC5C,MAAM,aAAa,IAAM,QAAQ,GAAG,QAAQ,EAC5C,MAAM,aAAa,IAAM,QAAQ,GAAG,QAAQ,EAC5C,MAAM,aAAa,EAAM,QAAQ,GAAG,QAAQ,EAC5C,IAAI,UAAY,MAChB,IAAI,SAAS,EAAE,EAAE,EAAE,CAAC,EACpB,IAAI,yBAA2B,cAM/B,MAAM,OAAS,EACf,IAAI,UAAU,EACd,WAAW,QAAQ,CAAC,IAAI,IAAI,CAC1B,MAAM,GAAK,GAAG,GAAG,EAAG,GAAG,CAAC,GAAI,OAC5B,MAAM,EAAI,GAAG,GAAG,EAAE,CAAC,EAAG,EAAI,GAAG,GAAG,EAAE,CAAC,EAChC,IAAI,EAAG,IAAI,OAAO,EAAE,CAAC,EAAQ,IAAI,OAAO,EAAE,CAAC,CAChD,CAAC,EACD,IAAI,UAAU,EACd,IAAI,SAAW,QAAS,IAAI,QAAU,QACtC,IAAI,UAAY,KAAK,IAAI,IAAK,KAAK,GAAI,EACvC,IAAI,YAAc,QAAQ,OAAO,GAAG,EAAE,IAAI,OAAO,QAAQ,CAAC,EAAE,IAC5D,IAAI,OAAO,EAMX,MAAM,GAAe,KAAO,KAAK,KAAO,KAAK,IAAM,KAAK,IAAO,IAAM,IAAI,EACzE,MAAM,GAAe,KAAO,KAAK,IAAO,KAAK,GAAM,KAAK,IAAO,IAAM,IAAI,EAEzE,KAAK,GAAgB,KAAO,KAAK,IAAO,KAAK,IAAM,KAAK,IAAO,GAAM,IAAM,GAAM,GAAI,EACrF,KAAK,GAAK,KAAK,IAAM,KAAO,KAAK,KAAO,KAAK,KAAM,KAAK,KAAO,GAAM,EAAM,KAAM,GAAI,EAErF,KAAK,GAAK,KAAK,IAAM,KAAO,KAAK,GAAO,KAAK,GAAM,KAAK,IAAO,IAAM,IAAM,GAAM,EAAI,EACrF,KAAK,GAAK,KAAK,IAAM,KAAO,KAAK,KAAO,KAAK,IAAM,KAAK,IAAO,IAAM,GAAM,GAAM,GAAI,EACrF,KAAK,GAAK,KAAK,IAAM,KAAO,KAAK,KAAO,KAAK,GAAM,KAAK,IAAO,IAAM,EAAM,KAAM,GAAI,EAErF,KAAK,GAAgB,KAAO,KAAK,IAAO,KAAK,GAAM,KAAK,IAAO,IAAM,GAAI,EAMzE,IAAI,KAAO,WAAW,EAAE,WAAW,EAEnC,GADG,MAAM,IAAI,IAAG,KAAO,IACpB,KAAO,KAAM,CACd,MAAM,KAAO,OAAO,YAAc,IAAc,YAAY,IAAI,EAAI,KAAK,IAAI,GAAG,IAChF,QAAQ,EAAE,EAAE,EAAE,SAAS,OAAO,IAAI,CAChC,MAAM,EAAI,SAAS,CAAC,EACd,GAAK,KAAO,EAAE,EAAE,KAAM,GAAK,KAAO,EAAE,EAAE,KACtC,GAAK,GAAO,IAAM,GAAM,GAAI,KAAK,IAAI,IAAI,EAAE,GAAK,EAAE,EAAE,GACpD,IAAM,KAAK,IAAI,GAAK,EAAE,EAAI,KAAK,IAAK,EACpC,KAAQ,EAAI,IAAM,EACxB,KAAK,GAAI,GAAI,IAAK,KAAM,EAAE,EAAE,GAAG,MAAM,QAAQ,CAAC,EAAG,EAAG,KAAO,cAAgB,aAAa,CAC1F,CACF,CAEA,IAAI,QAAQ,EACZ,IAAI,yBAA2B,aACjC,CAGA,SAAS,SAAS,EAAE,EAAE,EAAE,CACtB,IAAI,EAAE,EAAE,EACR,GAAG,IAAI,EAAI,EAAE,EAAE,EAAE,MACb,CACF,MAAM,QAAQ,CAACC,GAAEC,GAAE,KAAS,EAAE,IAAE,GAAG,GAAM,EAAE,IAAE,GAAG,GAC3C,EAAE,mBAAWD,IAAGC,GAAED,IAAG,EAAE,EAAM,EAAE,GAAWC,GAC1C,EAAE,kBAAWD,IAAGC,GAAED,KAAI,kBAAI,GAAG,EAAUA,IACtC,EAAI,EAAE,GAAM,GAAG,EAAE,GAAK,EAAE,EAAE,EAAE,EAC5B,EAAI,EAAE,EAAE,EACd,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAC7D,CACA,MAAO,CAAC,KAAK,MAAM,EAAE,GAAG,EAAG,KAAK,MAAM,EAAE,GAAG,EAAG,KAAK,MAAM,EAAE,GAAG,CAAC,CACjE,CAGA,SAAS,SAAS,CAChB,GAAG,CAAC,QAAS,OACb,MAAM,IAAM,SAAS,cAAc,QAAQ,EAC3C,IAAI,MAAQ,OAAO,MAAO,IAAI,OAAS,OAAO,OAC9C,MAAM,EAAI,IAAI,WAAW,IAAI,EAC7B,EAAE,UAAU,IAAI,MAAM,CAAC,EAAG,EAAE,MAAM,GAAG,CAAC,EACtC,EAAE,UAAU,IAAM,KAAO,MAAM,EAAE,EAAE,IAAI,MAAM,IAAI,MAAM,EACpD,KAAK,EAAE,UAAU,KAAK,EAAE,EAAE,IAAI,MAAM,IAAI,MAAM,EACjD,EAAE,UAAU,OAAO,EAAE,CAAC,EACtB,MAAM,EAAI,SAAS,cAAc,GAAG,EACpC,EAAE,SAAW,qBACb,EAAE,KAAO,IAAI,UAAU,WAAW,EAAG,EAAE,MAAM,CAC/C,CAGA,SAAS,iBAAiB,QAAS,SAAS,EAAE,CAC5C,MAAM,IAAM,EAAE,OAAO,QAAQ,mBAAmB,EAChD,GAAG,CAAC,IAAK,OACT,MAAM,KAAO,IAAI,QAAQ,cAAc,EACvC,GAAG,CAAC,KAAM,OAGV,IAAI,SAAW,CAAC,EAChB,MAAM,MAAQ,KAAK,cAAc,kBAAkB,EACnD,GAAG,MACD,GAAG,CAED,UADe,KAAK,MAAM,MAAM,WAAW,EACxB,UAAY,CAAC,GAAG,IAAI,SAAS,EAAE,CAChD,MAAO,CACL,GAAI,EAAE,GACN,MAAO,EAAE,OAAS,GAClB,MAAO,EAAE,OAAS,GAClB,OAAQ,EAAE,QAAU,UACpB,MAAO,EAAE,OAAS,OAClB,QAAS,MAAM,QAAQ,EAAE,OAAO,EAAI,EAAE,QAAU,KAChD,UAAW,EAAE,WAAa,GAC1B,YAAa,EAAE,YACf,YAAa,EAAE,YACf,YAAa,EAAE,aAAe,GAC9B,cAAe,EAAE,cACjB,YAAa,EAAE,YACf,aAAc,EAAE,aAChB,YAAa,EAAE,YACf,aAAc,EAAE,cAAgB,EAClC,CACF,CAAC,CACH,MAAW,CAAE,SAAW,CAAC,CAAG,CAE1B,SAAS,SACX,SAAW,CAAC,CAAE,GAAG,IAAK,MAAM,GAAI,MAAM,GAAI,OAAO,UAAW,MAAM,OAAQ,QAAQ,KAAM,UAAU,GAAI,YAAY,OAAQ,YAAY,GAAI,YAAY,GAAI,cAAc,EAAG,CAAC,GAI9K,IAAI,MAAQ,SAAS,CAAC,EAAE,GACxB,MAAM,QAAU,SAAS,cAAc,4CAA4C,GACnE,SAAS,cAAc,kBAAkB,EACtD,SAAW,QAAQ,OACjB,SAAS,KAAK,SAAS,EAAE,CAAE,OAAO,OAAO,EAAE,EAAE,IAAM,OAAO,QAAQ,KAAK,CAAG,CAAC,IAAG,MAAQ,QAAQ,OAEnG,MAAM,QAAU,SAAS,KAAK,SAAS,EAAE,CAAE,OAAO,OAAO,EAAE,EAAE,IAAM,OAAO,KAAK,CAAG,CAAC,GAAK,SAAS,CAAC,EAElG,KAAK,CACH,OAAQ,KAAK,QAAQ,QAAU,WAC/B,KAAM,KAAK,QAAQ,MAAQ,OAC3B,UAAW,KAAK,QAAQ,WAAa,SACrC,KAAM,WAAW,KAAK,QAAQ,MAAQ,GAAG,GAAK,EAC9C,MAAO,KAAK,QAAQ,OAAS,GAC7B,WAAY,KAAK,QAAQ,YAAc,2BACvC,SACA,OACF,CAAC,CACH,CAAC",
  "names": ["video", "c", "p", "q"]
}
