@sportsdataverse/sdvtables 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -112
- package/data/table_themes.json +12136 -0
- package/data/table_themes.json.sha256 +1 -0
- package/dist/aggrid.d.ts +104 -0
- package/dist/aggrid.js +230 -0
- package/dist/aggrid.js.map +1 -0
- package/dist/chunk-3TJR7TKS.js +223 -0
- package/dist/chunk-3TJR7TKS.js.map +1 -0
- package/dist/{chunk-UCRLJGDL.js → chunk-R375P3MN.js} +963 -276
- package/dist/chunk-R375P3MN.js.map +1 -0
- package/dist/chunk-UTOVFIFT.js +15176 -0
- package/dist/chunk-UTOVFIFT.js.map +1 -0
- package/dist/{chunk-U6W6MWKW.js → chunk-VLF2S6VW.js} +7 -5
- package/dist/chunk-VLF2S6VW.js.map +1 -0
- package/dist/chunk-WBTFIGYK.js +189 -0
- package/dist/chunk-WBTFIGYK.js.map +1 -0
- package/dist/{engine-CkfxYXAL.d.ts → engine-BFIPJUlC.d.ts} +1 -1
- package/dist/export.d.ts +1 -1
- package/dist/export.js +4 -3
- package/dist/export.js.map +1 -1
- package/dist/html.d.ts +8 -5
- package/dist/html.js +4 -3
- package/dist/index.d.ts +121 -8
- package/dist/index.js +51 -3
- package/dist/index.js.map +1 -1
- package/dist/mui.d.ts +134 -0
- package/dist/mui.js +193 -0
- package/dist/mui.js.map +1 -0
- package/dist/react.d.ts +2 -2
- package/dist/react.js +3 -2
- package/dist/react.js.map +1 -1
- package/dist/spec-A88vJX5A.d.ts +748 -0
- package/dist/tanstack-table.d.ts +113 -0
- package/dist/tanstack-table.js +98 -0
- package/dist/tanstack-table.js.map +1 -0
- package/dist/{tokens-CpYFsFtf.d.ts → tokens-CHwBt9gs.d.ts} +1 -1
- package/package.json +40 -3
- package/dist/chunk-4VKYHOHL.js +0 -2081
- package/dist/chunk-4VKYHOHL.js.map +0 -1
- package/dist/chunk-U6W6MWKW.js.map +0 -1
- package/dist/chunk-UCRLJGDL.js.map +0 -1
- package/dist/spec-BEhLDtj_.d.ts +0 -430
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/team-name.ts","../src/html/escape.ts","../src/html/fonts.ts","../src/table-id.ts","../src/themes/base-css.ts","../src/scale.ts","../src/html/cells.ts","../src/html/social-icons.ts","../src/html/svg.ts","../src/html/decorations.ts","../src/html/layout.ts","../src/html/parts.ts","../src/html/interactive.ts","../src/html/controls.ts"],"names":["mix","hex6","onColor","r","solid","contrast"],"mappings":";;;AAIA,IAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,eAAsB,cAAc,OAAA,EAA2C;AAC7E,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,KAAM;AACvB,MAAA,KAAA,MAAW,MAAM,MAAM,UAAA,CAAW,CAAC,CAAA,EAAG,KAAA,MAAW,CAAA,CAAE,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,IAChG,CAAC;AAAA,GACH;AACF;AAEO,SAAS,YAAA,CAAa,QAAgB,MAAA,EAAoC;AAC/E,EAAA,OAAO,MAAM,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACxC;;;ACbA,IAAM,GAAA,GAAwC;AAAA,EAC5C,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,QAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AACO,IAAM,UAAA,GAAa,CAAC,CAAA,KACzB,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAW;AACtD,IAAM,UAAA,GAAqC;AAElD,IAAM,UAAA,GAAa,gBAAA;AAEZ,IAAM,UAAA,GAAa,CAAC,CAAA,KAAwB,CAAC,WAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAEtE,SAAS,QAAA,CAAS,GAAY,KAAA,EAAuB;AAC1D,EAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,EAAA,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA;AACnB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,GAAG,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,sEAAA;AAAA,KAC/B;AACF,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,OAAA,CAAQ,GAAY,KAAA,EAAuB;AACzD,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAK,KAAM,EAAA,GAAK,MAAA,CAAO,CAAC,IAAI,MAAA,CAAO,GAAA;AACpG,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AACpB,IAAA,MAAM,IAAI,eAAe,CAAA,EAAG,KAAK,iCAAiC,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AACvF,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,UAAU,IAAA,EAA4E;AACpG,EAAA,OAAO,OAAO,OAAA,CAAQ,IAAI,CAAA,CACvB,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,MAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,EAAE,CAAA,CAC3D,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,IAAI,UAAA,CAAW,QAAA,CAAS,CAAA,EAAG,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,CAAA,CAC7D,KAAK,GAAG,CAAA;AACb;AAEO,SAAS,QAAQ,KAAA,EAAkC;AACxD,EAAA,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAChD,EAAA,OAAO,CAAA,GAAI,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/B;;;ACzCO,SAAS,UAAU,KAAA,EAAsC;AAC9D,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,EAAE,MAAM,CAAA,wBAAS,GAAA,EAAY;AACtD,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,OAAA,EAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AACpC,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,QAAA,CAAS,IAAA,KAAS,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,MAAM,IAAI,CAAC,GAAG,SAAS,OAAA,EAAS,EAC7B,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,EAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACrC,GAAA;AAAA,IACC,CAAC,CAAC,GAAA,EAAK,EAAE,CAAA,KACP,CAAA,OAAA,EAAU,kBAAA,CAAmB,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,MAAA,EAAS,CAAC,GAAG,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,GAC1G,CACC,KAAK,OAAO,CAAA;AACf,EAAA,OAAO,kEAAkE,CAAC,CAAA,mBAAA,CAAA;AAC5E;;;ACdO,SAAS,QAAQ,CAAA,EAAmB;AACzC,EAAA,IAAI,CAAA,GAAI,UAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,CAAA,IAAK,CAAA,CAAE,WAAW,CAAC,CAAA;AACnB,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,QAAU,CAAA,KAAM,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACvC;AACO,SAAS,QAAa,IAAA,EAA8B;AACzD,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,KAAA,EAAQ,OAAA,CAAQ,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA,CAAA;AACzD;;;ACXA,IAAM,KAAA,GAAQ,CAAC,CAAA,KAAsB,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAAA;AAC9E,SAAS,SAAA,CAAU,KAAa,CAAA,EAAwB;AAC7D,EAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,WAAW,GAAA,CAAI,CAAC,MAAM,CAAA,OAAA,EAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,CAAA;AAChF;AACO,SAAS,SAAS,GAAA,EAAqB;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,OAAO;AAAA,IACL,GAAG,CAAC,CAAA,gOAAA,CAAA;AAAA;AAAA,IAEJ,GAAG,CAAC,CAAA,8OAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,qIAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,yOAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,iLAAA,CAAA;AAAA;AAAA,IACJ,CAAA,EAAG,CAAC,CAAA,yBAAA,EAA4B,CAAC,CAAA,6GAAA,CAAA;AAAA,IACjC,GAAG,CAAC,CAAA,4bAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,iIAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,yWAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKJ,UAAU,CAAC,CAAA,2BAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKX,GAAG,CAAC,CAAA,uDAAA,CAAA;AAAA;AAAA;AAAA,IAGJ,CAAA,EAAG,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,aAAA,CAAA;AAAA,IACZ,GAAG,CAAC,CAAA,+HAAA,CAAA;AAAA,IACJ,CAAA,EAAG,CAAC,CAAA,mDAAA,EAAsD,CAAC,CAAA,oDAAA,CAAA;AAAA;AAAA,IAE3D,GAAG,CAAC,CAAA,iEAAA,CAAA;AAAA,IACJ,CAAA,EAAG,CAAC,CAAA,4BAAA,EAA+B,CAAC,mCAAmC,CAAC,CAAA,8BAAA,CAAA;AAAA,IACxE,GAAG,CAAC,CAAA,kKAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,qCAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,oBAAA,CAAA;AAAA;AAAA,IACJ,GAAG,CAAC,CAAA,+DAAA,CAAA;AAAA;AAAA;AAAA,IAEJ,GAAG,CAAC,CAAA,qEAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,4EAAA,CAAA;AAAA;AAAA;AAAA,IAEJ,GAAG,CAAC,CAAA,mGAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,oGAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,qEAAA,CAAA;AAAA;AAAA;AAAA,IAGJ,GAAG,CAAC,CAAA,2MAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,6FAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,wCAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,4DAAA,CAAA;AAAA;AAAA,IACJ,GAAG,CAAC,CAAA,yEAAA,CAAA;AAAA,IACJ,GAAG,CAAC,CAAA,oHAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKJ,UAAU,CAAC,CAAA,iLAAA,CAAA;AAAA,IACX,GAAG,CAAC,CAAA,8EAAA,CAAA;AAAA;AAAA,IACJ,GAAG,CAAC,CAAA,oFAAA;AAAA;AAAA,GACN,CAAE,KAAK,IAAI,CAAA;AACb;AC5DO,SAAS,IAAA,CACd,OAAA,EACA,CAAC,EAAA,EAAI,EAAE,CAAA,EACuB;AAC9B,EAAA,MAAM,CAAA,GAAI,QAAQ,MAAA,GAAS,CAAA;AAC3B,EAAA,OAAO,CAAC,CAAA,KAAM;AACZ,IAAA,IAAI,EAAE,EAAA,IAAM,CAAA,IAAK,CAAA,IAAK,KAAK,OAAO,IAAA;AAClC,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAClC,IAAA,MAAM,IAAI,EAAA,KAAO,EAAA,GAAK,GAAA,GAAA,CAAO,CAAA,GAAI,OAAO,EAAA,GAAK,EAAA,CAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAC3C,IAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAa,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAa,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAAA,EACtE,CAAA;AACF;AAGO,SAAS,YAAA,CAAa,QAAoC,IAAA,EAAkC;AACjG,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAU,CAAA,CAC7B,MAAA,CAAO,CAAC,CAAA,KAAsC,EAAE,CAAC,CAAA,KAAM,IAAI,CAAA,CAC3D,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAyB,MAAA,CAAO,GAAA,CAAI,MAAM,IAAI,CAAA;AACpD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU;AAChC,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAA;AAC9D,IAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,GAAI,CAAC,CAAW,CAAA,GAAI,CAAA;AAC1D,IAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACV;AACA,EAAA,IAAI,CAAC,IAAA,IAAQ,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,GAAA;AACtC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK,IAAI,MAAM,IAAA,IAAQ,CAAA,GAAI,KAAK,GAAA,GAAM,CAAA;AACtD,EAAA,OAAO,GAAA,CAAI,IAAI,CAAC,CAAA,KAAO,MAAM,IAAA,GAAO,IAAA,GAAO,GAAA,GAAM,CAAA,GAAI,CAAE,CAAA;AACzD;AAEO,SAAS,SAAS,OAAA,EAAoE;AAC3F,EAAA,IAAI,KAAK,MAAA,CAAO,iBAAA;AAChB,EAAA,IAAI,KAAK,MAAA,CAAO,iBAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA;AAChB,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA;AACd,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,IAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AACjB,QAAA,IAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AAAA,MACnB;AACJ,EAAA,IAAI,EAAA,GAAK,EAAA,EAAI,MAAM,IAAI,eAAe,yDAAyD,CAAA;AAC/F,EAAA,OAAO,CAAC,IAAI,EAAE,CAAA;AAChB;AAGO,SAAS,SAAA,CAAU,IAAuB,CAAA,EAAmB;AAClE,EAAA,MAAM,CAAA,GAAI,CAAC,GAAG,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACtC,EAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACvB,EAAA,OAAQ,EAAE,EAAE,CAAA,GAAA,CAAgB,CAAA,GAAI,EAAA,KAAQ,EAAE,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG,EAAE,MAAA,GAAS,CAAC,CAAC,CAAA,GAAgB,EAAE,EAAE,CAAA,CAAA;AAC9F;AAEO,SAAS,SAAS,EAAA,EAA+B;AACtD,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,EAAA,CAAG,MAAA;AAC7C,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAA,CAAK,CAAA,GAAI,MAAM,CAAA,EAAG,CAAC,CAAA,IAAK,EAAA,CAAG,SAAS,CAAA,CAAE,CAAA;AAC7E;;;ACZO,IAAM,SAAA,GAAY,CAAM,GAAA,EAAU,GAAA,KAA0B,IAAgC,GAAG,CAAA;AAEtG,IAAM,OAAA,GAAU,CAAC,CAAA,KAAwB,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAA,GAAK,WAAW,CAAC,CAAA;AACvE,IAAM,OAAA,GAAU,CAAM,GAAA,KACpB,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,aAAA,GAAgB,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,OAAO,EAAE,CAAA;AAGvE,SAAS,OAAA,CAAQ,GAAA,EAAa,GAAA,EAAa,QAAA,EAAkB,MAAA,EAAyB;AAC3F,EAAA,OAAO,+BAA+B,UAAA,CAAW,GAAG,CAAC,CAAA,OAAA,EAAU,WAAW,GAAG,CAAC,CAAA,gBAAA,EAAmB,QAAQ,MAAM,MAAA,GAAS,CAAA,oBAAA,EAAuB,WAAW,MAAM,CAAC,MAAM,EAAE,CAAA,CAAA,CAAA;AAC3K;AAEO,SAAS,WAAA,CACd,OAAA,EACA,SAAA,EACA,UAAA,EACA,SAAS,GAAA,EACD;AACR,EAAA,MAAM,MAAA,GAAS,QAAQ,UAAU,CAAA;AACjC,EAAA,KAAA,MAAW,CAAA,IAAK,CAAC,OAAA,EAAS,SAAS,CAAA,EAAG,IAAI,CAAA,KAAM,MAAA,IAAa,QAAA,CAAS,CAAA,EAAG,UAAU,CAAA,IAAK,QAAQ,OAAO,CAAA;AACvG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,CAAA,GAAIA,GAAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,IAAI,IAAA,GAAO,CAAA,GAAI,KAAA,EAAO,CAAC,CAAC,CAAA;AAC5D,IAAA,IAAI,QAAA,CAAS,CAAA,EAAG,UAAU,CAAA,IAAK,QAAQ,OAAO,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,MAAA;AACT;AACA,SAAS,WAAA,CAAY,GAAW,IAAA,EAAsB;AACpD,EAAA,IAAI,EAAE,MAAA,CAAO,QAAA,CAAS,CAAC,KAAK,CAAA,IAAK,CAAA,CAAA;AAC/B,IAAA,MAAM,IAAI,eAAe,CAAA,EAAG,IAAI,gDAAgD,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAC7F,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,SAAA,CACd,MACA,IAAA,EACqC;AACrC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoC;AACpD,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,OAAA,EAAS;AAC5B,IAAA,IACE,CAAA,CAAE,IAAA,KAAS,MAAA,IACX,CAAA,CAAE,IAAA,KAAS,UAAA,IACX,CAAA,CAAE,IAAA,KAAS,qBAAA,IACX,CAAA,CAAE,IAAA,KAAS,cAAA,IACX,EAAE,IAAA,KAAS,aAAA;AAEX,MAAA;AACF,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,qBAAA,GAAwB,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAC3B,MAAA,OAAO,QAAQ,CAAC,CAAA,GAAI,OAAO,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK;AAAA,IAC5C,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,GAAA;AAAA,MACF,CAAA,CAAE,GAAA;AAAA,MACF,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ;AAAA,QAC5B,GAAI,EAAE,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI,EAAC;AAAA,QACrD,GAAI,EAAE,QAAA,GAAW,EAAE,UAAU,CAAA,CAAE,QAAA,KAAa,EAAC;AAAA,QAC7C,MAAA,EAAQ,EAAE,MAAA,IAAU;AAAA,OACrB;AAAA,KACH;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAMA,IAAM,SAAA,GAAY,CAAC,GAAA,EAAe,CAAA,KAChC,WAAA;AAAA,EACE,CAAA,KAAM,QAAQ,GAAA,CAAI,UAAA,KAAe,aAAa,GAAA,CAAI,YAAA,GAAe,IAAI,GAAA,GAAM,CAAA;AAAA,EAC3E,GAAA,CAAI,MAAA;AAAA,EACJ,GAAA,CAAI,UAAA;AAAA,EACJ,GAAA,CAAI;AACN,CAAA;AAEF,IAAM,IAAA,GAAO,CAAC,GAAA,EAAqB,CAAA,KACjC,OAAA,CAAQ,CAAC,CAAA,IACT,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAO,IAAI,UAAA,GAAa,CAAA,CAAE,WAAA,EAAY,KAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,KAAM,MAAA,CAAO,CAAC,CAAE,CAAA;AAGrG,IAAM,QAAA,GAAW,CACtB,GAAA,KAEA,GAAA,CAAI,IAAA,KAAS,gBAAgB,GAAA,CAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,eAAA;AAElE,SAAS,YAAA,CACd,IAAA,EACA,IAAA,EACA,MAAA,EACA,aAA6B,IAAA,EACH;AAE1B,EAAA,MAAM,EAAA,GAAK,UAAA,KAAe,IAAA,GAAO,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAU,CAAC,CAAA;AACzF,EAAA,MAAM,OAAA,GAAU,EAAA,KAAO,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAA,CAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAC1D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,OAAA,EAAS;AAC9B,IAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AACpB,IAAA,IAAI,OAAA;AACF,MAAA,MAAA;AAAA,QACE,CAAA,qBAAA,EAAwB,IAAI,GAAG,CAAA,CAAA;AAAA,QAC/B,CAAA,QAAA,EAAW,IAAI,GAAG,CAAA,4KAAA;AAAA,OACpB;AAEF,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAa,UAAA,CAAW,WAAW,CAAA,EAAG;AACzD,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,SAAA,CAAU,CAAA,EAAG,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AAClE,IAAA,IAAI,MAAA,GAA4B,IAAA;AAChC,IAAA,IAAI,GAAA,GAAM,CAAC,CAAA,KAAoC,CAAA;AAC/C,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,aAAa,MAAA,EAAQ;AACxD,MAAA,MAAA,GAAS,YAAA,CAAa,IAAA,EAAM,GAAA,CAAI,SAAA,KAAc,MAAM,CAAA;AACpD,MAAA,GAAA,GAAM,MAAM,IAAA;AAAA,IACd;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,eAAA,EAAiB;AAChC,MAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,IAAI,CAAA;AAC1D,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA,CAAI,MAAA;AACrB,MAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAElB,MAAA,MAAM,UAAA,GACJ,KAAA,KAAU,MAAA,IAAU,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAM,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAC,KAAK,EAAA,GAAK,CAAA;AAC3F,MAAA,GAAA,GAAM,CAAC,CAAA,KACL,CAAA,KAAM,IAAA,GAAO,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,GAAI,KAAA,GAAQ,UAAA,GAAa,EAAA,GAAK,CAAA,IAAK,KAAK,EAAA,CAAA,GAAM,CAAA;AAChG,MAAA,MAAA,GAAS,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,SAAoC,GAAA,CAAI,MAAA,IAAU,QAAA,CAAS,CAAC,MAAM,CAAC,CAAA;AACzE,IAAA,MAAM,GAAA,GAAM,MAAc,CAAA,CAAA,EAAI,aAAA,CAAc,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,IAAA,EAAO,aAAA,CAAc,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA;AACrF,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,MAAA,KAAW,MAAA;AAC9C,MAAA,MAAA;AAAA,QACE,oBAAoB,GAAA,CAAI,GAAG,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QAC/C,CAAA,uDAAA,EAA0D,KAAK,CAAA,uDAAA;AAAA,OACjE;AACF,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA,CAAE,OAAA,EAAQ,GAAI,OAAA,EAAS,MAAM,CAAA;AACzE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,IAAI,CAAA,CAAE,MAAA;AACtE,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,IAAgB,OAAA,GAAU,CAAA;AACzC,MAAA,MAAA;AAAA,QACE,CAAA,kBAAA,EAAqB,IAAI,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QAC3D,CAAA,EAAG,OAAO,CAAA,kCAAA,EAAqC,GAAA,EAAK,CAAA,mBAAA;AAAA,OACtD;AACF,IAAA,MAAM,QACJ,EAAA,KAAO,IAAA,GACH,SACA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACd,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA;AAClB,MAAA,OAAO,CAAA,KAAM,MAAA,GAAY,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,CAAA,EAAG,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA,GAAK,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAAA,IAChF,CAAC,CAAA;AACP,IAAA,MAAM,SAAA,GAAY,EAAA,KAAO,IAAA,GAAO,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,SAAA,CAAU,CAAA,EAAG,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AACtF,IAAA,MAAM,aACJ,GAAA,CAAI,IAAA,KAAS,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,MAAM,SAAA,CAAU,GAAA,EAAK,CAAC,CAAA,CAAE,MAAM,CAAC,CAAA,GAAI,CAAA;AAC/F,IAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,YAAY,CAAA;AAAA,EAC9F;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,UAAA,CAAgB,GAAA,EAAsB,GAAA,EAAU,CAAA,EAAW,GAAA,EAAiC;AAC1G,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,MAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA;AAAA,IAExC,KAAK,KAAA;AAAA,IACL,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAC1C,MAAA,IAAI,CAAA,KAAM,MAAM,OAAO,EAAA;AACvB,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,GAAG,CAAA;AACjC,MAAA,IAAI,EAAA,EAAI,OAAO,UAAA,CAAW,YAAA,CAAa,IAAI,EAAA,CAAG,OAAA,EAAS,EAAE,MAAA,EAAQ,EAAA,CAAG,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAC1F,MAAA,OAAO,UAAA;AAAA,QACL,GAAA,CAAI,IAAA,KAAS,KAAA,GACT,YAAA,CAAa,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,CAAA,GACxC,aAAa,CAAA,EAAG;AAAA,UACd,GAAI,IAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO,GAAI,EAAC;AAAA,UACzD,GAAA,EAAK,IAAI,GAAA,IAAO,KAAA;AAAA,UAChB,MAAA,EAAQ,IAAI,MAAA,IAAU,EAAA;AAAA,UACtB,MAAA,EAAQ,IAAI,MAAA,IAAU,EAAA;AAAA,UACtB,SAAA,EAAW,IAAI,SAAA,IAAa;AAAA,SAC7B;AAAA,OACP;AAAA,IACF;AAAA,IACA,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAC1C,MAAA,OAAO,MAAM,IAAA,GACT,EAAA,GACA,UAAA,CAAW,CAAA,EAAG,aAAa,GAAA,CAAI,KAAA,GAAQ,CAAA,GAAI,GAAA,GAAM,GAAG,EAAE,MAAA,EAAQ,IAAI,MAAA,EAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACpF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAC1C,MAAA,IAAI,CAAA,KAAM,MAAM,OAAO,EAAA;AACvB,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAChC,MAAA,OAAO,GAAA,CAAI,cACP,CAAA,EAAG,GAAG,yBAAyB,UAAA,CAAW,QAAA,CAAS,IAAI,UAAA,EAAY,iBAAiB,CAAC,CAAC,CAAA,EAAA,EAAK,EAAE,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA,MAAA,CAAA,GAC9G,WAAW,CAAC,CAAA;AAAA,IAClB;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAC1C,MAAA,MAAM,IAAI,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACzC,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,EAAA;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,OAAA,GAAW,CAAA,KAAM,IAAI,IAAA,GAAA,CAAQ,CAAA,GAAI,CAAA,IAAK,CAAA,GAAK,CAAA,GAAI,CAAA;AAC7D,MAAA,IAAI,MAAM,IAAA,IAAQ,CAAC,OAAO,QAAA,CAAS,CAAC,GAAG,OAAO,EAAA;AAC9C,MAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AACzC,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,GAAA,CAAI,MAAA,GAAU,IAAI,CAAA,GAAI,SAAA,GAAO,CAAA,GAAI,CAAA,GAAI,YAAO,EAAA,GAAM,EAAE,CAAA,EAAG,YAAA,CAAa,IAAI,OAAA,GAAU,KAAA,GAAQ,GAAA,GAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,SAAA,EAAW,IAAI,SAAA,IAAa,CAAC,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA,EAAG,GAAA,CAAI,OAAA,GAAU,MAAM,EAAE,CAAA,CAAA;AAClN,MAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,CAAI,KAAA,GACf,OACA,CAAA,GAAI,CAAA,GACF,GAAA,CAAI,aAAA,GACJ,CAAA,GAAI,CAAA,GACF,GAAA,CAAI,aAAA,GACH,IAAI,YAAA,IAAgB,IAAA;AAC7B,MAAA,OAAO,KAAA,GACH,CAAA,mBAAA,EAAsB,UAAA,CAAW,QAAA,CAAS,OAAO,aAAa,CAAC,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,CAAA,GACrF,WAAW,IAAI,CAAA;AAAA,IACrB;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,CAAC,CAAC,CAAC,CAAA;AAC1D,MAAA,IAAI,GAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA,EAAG;AAC9B,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA;AAChC,QAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,MAClB;AACA,MAAA,MAAM,EAAA,GAAK,EAAA;AACX,MAAA,IAAI,GAAA,CAAI,KAAA,IAAS,EAAE,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,IAAK,GAAA,CAAI,OAAA,IAAW,CAAA,IAAK,GAAA,CAAI,UAAU,EAAA,CAAG,MAAA,CAAA;AACvF,QAAA,MAAM,IAAI,eAAe,CAAA,yCAAA,EAA4C,GAAA,CAAI,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC5F,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAC/D,MAAA,MAAM,KAAA,GAAQ,GAAG,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC1C,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,IAAS,UAAU,CAAA,EAAG,OAAO,WAAW,IAAI,CAAA;AACrD,MAAA,OAAO,UAAA;AAAA,QACL,CAAA,EAAG,IAAI,CAAA,EAAG,GAAA,CAAI,WAAW,CAAA,EAAG,YAAA,CAAA,CAAe,EAAA,CAAG,GAAA,CAAI,OAAO,CAAA,IAAK,KAAK,KAAA,GAAS,GAAA,EAAK,EAAE,MAAA,EAAQ,GAAA,CAAI,eAAe,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,WAAW,CAAA;AAAA,OACpI;AAAA,IACF;AAAA;AAAA,IAEA,KAAK,MAAA;AAAA,IACL,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,GAAA,CAAI,GAAG,IAAI,CAAC,CAAA;AACvC,MAAA,IAAI,EAAA,KAAO,QAAW,OAAO,IAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,EAAA,EAAI,GAAA,CAAI,MAAA,EAAQ;AAAA,QACtC,GAAI,IAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO,GAAI,EAAC;AAAA,QACzD,GAAI,IAAI,OAAA,GAAU,EAAE,SAAS,GAAA,CAAI,OAAA,KAAY,EAAC;AAAA,QAC9C,UAAU,GAAA,CAAI,IAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,OACE,OAAA,CAAQ,KAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,EAAE,CAAA,IAAK,MAAA,CAAO,GAAG,CAAA,EAAG,WAAA,CAAY,IAAI,MAAA,EAAQ,GAAA,CAAI,IAAI,CAAA,EAAG,EAAE,CAAA,IAC9F,IAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,WAAA,GAAc,IAAA,GAAO,EAAA,CAAA;AAAA,IAErD;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA;AAClC,MAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,EAAA;AACzB,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK,EAAG,GAAA,CAAI,MAAA,EAAQ,EAAE,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA;AAClF,MAAA,OAAO,GAAA,GAAM,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK,EAAG,WAAA,CAAY,IAAI,MAAA,EAAQ,UAAU,CAAC,CAAA,GAAI,QAAQ,GAAG,CAAA;AAAA,IAClG;AAAA,IACA,KAAK,qBAAA,EAAuB;AAE1B,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,GAAA,CAAI,GAAG,IAAI,CAAC,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,IAAI,UAAA,GAAa,KAAA,CAAM,IAAI,UAAU,CAAA,GAAI,QAAQ,GAAG,CAAA;AAC/D,MAAA,MAAM,CAAA,GAAI,EAAA,KAAO,MAAA,GAAY,MAAA,GAAY,cAAA,CAAe,GAAA,CAAI,MAAA,EAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,SAAA,EAAW,CAAA;AAC/F,MAAA,MAAM,CAAA,GACJ,EAAA,KAAO,MAAA,GACH,MAAA,GACA,cAAA,CAAe,GAAA,CAAI,MAAA,EAAQ,EAAA,EAAI,EAAE,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,WAAW,CAAA;AAChF,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,CAAA,IAAK,SAAA,EAAW,GAAG,EAAE,CAAA;AAC7C,MAAA,OAAO,CAAA,wBAAA,EAA2B,GAAA,CAAI,WAAA,GAAc,CAAC,CAAA,iBAAA,EAAoB,SAAA,CAAU,EAAE,aAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,YAAA,EAAc,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,WAAA,EAAa,CAAA,EAAG,GAAA,CAAI,WAAW,CAAA,EAAA,CAAA,EAAM,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AAAA,wBAAA,EAA0C,GAAA,CAAI,cAAA,GAAiB,CAAC,CAAA,iBAAA,EAAoB,SAAA,CAAU,EAAE,aAAA,EAAe,MAAA,EAAQ,KAAA,EAAO,GAAA,EAAK,WAAA,EAAa,CAAA,EAAG,IAAI,cAAc,CAAA,EAAA,CAAA,EAAM,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,UAAU,GAAA,EAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAA,aAAA,CAAA;AAAA,IAC5b;AAAA,IACA,KAAK,cAAA;AAAA,IACL,KAAK,aAAA;AACH,MAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA,IAExC,KAAK,YAAA,EAAc;AAEjB,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,GAAG,CAAA;AACjC,MAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,uBAAuB,CAAA;AAClE,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,yBAAyB,CAAA;AACxE,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAC1B,MAAA,MAAM,QAAQ,EAAA,CAAG,UAAA;AACjB,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW,OAAO,EAAA;AACtC,QAAA,IAAA,GAAO,GAAA,CAAI,OAAA;AACX,QAAA,IAAA,GAAO,EAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA,IAAK,SAAA;AACtB,QAAA,IAAA,GAAO,SAAA,CAAU,KAAK,QAAA,CAAS,SAAA,CAAU,KAAK,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AAAA,MACzD;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,SAAA,IAAa,OAAA,CAAQ,MAAM,IAAA,EAAM,OAAA,CAAQ,GAAG,CAAC,CAAC,CAAA;AAC9D,MAAA,MAAM,OAAA,GACJ,GAAA,CAAI,YAAA,KAAiB,MAAA,GACjB,WAAW,YAAY,CAAA,SAAA,EAAY,UAAA,CAAW,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,yBAAyB,CAAC,CAAC,CAAA,CAAA,GACpG,EAAA;AACN,MAAA,OAAO,CAAA,wCAAA,EAA2C,KAAK,CAAA,6CAAA,EAAgD,UAAU,CAAA,eAAA,EAAkB,UAAU,CAAA,oBAAA,EAAuB,UAAA,CAAW,QAAA,CAAS,IAAA,EAAM,oBAAoB,CAAC,CAAC,CAAA,OAAA,EAAU,UAAA,CAAW,QAAA,CAAS,GAAA,EAAK,sBAAsB,CAAC,CAAC,CAAA,qCAAA,EAAwC,OAAO,CAAA,EAAA,EAAK,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,CAAA;AAAA,IACrV;AAAA,IACA,KAAK,YAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA;AAAA,IACxC,KAAK,aAAA;AACH,MAAA,OAAO,KAAK,GAAA,EAAK,SAAA,CAAU,KAAK,GAAA,CAAI,GAAG,CAAC,CAAA,GACpC,UAAA,CAAW,GAAA,CAAI,WAAA,IAAe,EAAE,CAAA,GAChC,OAAA,CAAQ,UAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,IACrC,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,GAAG,CAAA;AACjC,MAAA,MAAM,CAAA,GAAI,EAAA,EAAI,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,2BAA2B,CAAA;AAC/D,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,0BAA0B,CAAA;AAC5D,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,KAAa,MAAA,GAAY,IAAI,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,wBAAwB,CAAA;AACpG,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,yBAAyB,CAAA;AAClE,MAAA,MAAM,aAAa,UAAA,CAAW,QAAA,CAAS,GAAA,CAAI,UAAA,EAAY,0BAA0B,CAAC,CAAA;AAClF,MAAA,MAAM,YAAY,UAAA,CAAW,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,yBAAyB,CAAC,CAAA;AAC/E,MAAA,IAAI,EAAA,KAAO,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM;AAElC,QAAA,MAAM,GAAA,GAAM,CAAA,0BAAA,EAA6B,EAAE,CAAA,cAAA,EAAiB,WAAW,QAAA,CAAS,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,UAAA,EAAY,4BAA4B,CAAC,CAAC,kBAAkB,EAAE,CAAA,UAAA,CAAA;AACtK,QAAA,OAAO,CAAA,qEAAA,EAAwE,CAAC,CAAA,eAAA,EAAkB,GAAG,mCAAmC,UAAA,CAAW,QAAA,CAAS,IAAI,WAAA,EAAa,2BAA2B,CAAC,CAAC,CAAA,WAAA,EAAc,QAAQ,CAAA,IAAA,EAAO,UAAA,CAAW,IAAI,OAAA,IAAW,EAAE,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,MAAA,CAAA;AAAA,MACnR;AACA,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA,CAAG,MAAA;AACpB,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AAC5C,MAAA,MAAM,CAAA,GAAI,MAAA,CAAA,CAAQ,EAAA,KAAO,EAAA,GAAK,EAAA,GAAA,CAAO,OAAA,GAAU,EAAA,KAAO,EAAA,GAAK,EAAA,CAAA,GAAO,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AACjF,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,OAAO,CAAA,IAAK,UAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,+DAA+D,EAAE,CAAA,eAAA,EAAkB,KAAK,CAAC,CAAA,cAAA,EAAiB,UAAU,CAAA,eAAA,EAAkB,EAAE,CAAA,UAAA,CAAA;AACtJ,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,GACb,EAAA,GACA,sDAAsD,CAAC,CAAA,SAAA,EAAY,EAAE,CAAA,eAAA,EAAkB,EAAA,GAAK,CAAC,CAAA,cAAA,EAAiB,KAAK,kBAAkB,EAAE,CAAA,UAAA,CAAA;AAC3I,MAAA,MAAM,IAAA,GACJ,GAAA,CAAI,SAAA,KAAc,MAAA,GACd,qBAAqB,SAAS,CAAA,GAAA,EAAM,UAAA,CAAW,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,yBAAyB,CAAC,CAAC,CAAA,CAAA,GAClG,EAAA;AACN,MAAA,MAAM,MAAA,GAAS,CAAA,yCAAA,EAA4C,CAAC,CAAA,eAAA,EAAkB,CAAA,GAAI,CAAC,CAAA,SAAA,EAAY,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,gCAAA,EAAmC,KAAK,CAAA,OAAA,EAAU,SAAS,CAAA,WAAA,EAAc,QAAQ,CAAA,eAAA,EAAkB,CAAC,CAAA,2DAAA,EAA8D,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,WAAA,CAAY,CAAA,EAAG,GAAA,CAAI,QAAA,EAAU,QAAA,EAAU,EAAE,CAAC,CAAC,CAAA,MAAA,CAAA;AAC/U,MAAA,OAAO,0DAA0D,CAAC,CAAA,eAAA,EAAkB,KAAK,CAAA,EAAG,IAAI,GAAG,MAAM,CAAA,MAAA,CAAA;AAAA,IAC3G;AAAA,IACA,KAAK,cAAA,EAAgB;AAEnB,MAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACtD,MAAA,IAAK,GAAA,CAAI,aAAa,QAAA,IAAY,CAAC,MAAQ,GAAA,CAAI,QAAA,KAAa,SAAA,IAAa,EAAA,EAAK,OAAO,EAAA;AACrF,MAAA,OAAO,CAAA,aAAA,EAAgB,SAAA,CAAU,EAAE,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,CAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,CAAA,EAAM,kBAAA,EAAoB,EAAA,GAAK,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,OAAA,EAAS,gBAAA,EAAkB,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,CAAC,CAAA,SAAA,CAAA;AAAA,IAChN;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,EAAA;AACvB,MAAA,MAAM,MAAM,GAAA,CAAI,GAAA,GAAM,UAAU,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA,GAAI,EAAA;AAChD,MAAA,OAAO,OAAA;AAAA,QACL,OAAO,CAAC,CAAA;AAAA,QACR,OAAA,CAAQ,GAAG,CAAA,GAAI,EAAA,GAAK,OAAO,GAAG,CAAA;AAAA,QAC9B,YAAY,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,MAAM,GAAG,OAAO;AAAA,OACpD;AAAA,IACF;AAAA,IACA,SAAS;AACP,MAAA,MAAM,GAAA,GAAa,GAAA;AACnB,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,oBAAA,EAAuB,OAAQ,GAAA,CAAyB,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1F;AAAA;AAEJ;AAEO,SAAS,aAAA,CACd,GAAA,EACA,GAAA,EACA,CAAA,EACA,GAAA,EACQ;AACR,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,cAAA;AAAA,IACL,KAAK,aAAA,EAAe;AAElB,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,GAAA,CAAI,GAAG,IAAI,CAAC,CAAA;AACvC,MAAA,MAAM,SACH,EAAA,KAAO,MAAA,GACJ,MAAA,GACA,cAAA,CAAe,IAAI,MAAA,EAAQ,EAAA,EAAI,EAAE,KAAA,EAAO,IAAI,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,MAAM,GAAA,CAAI,OAAA;AACxF,MAAA,IAAI,IAAI,IAAA,KAAS,cAAA;AACf,QAAA,OAAO,SAAA,CAAU,EAAE,aAAA,EAAe,CAAA,EAAG,IAAI,QAAQ,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,EAAI,CAAA;AACxE,MAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA,GAAI,GAAG,CAAA,CAC3D,QAAA,CAAS,EAAE,CAAA,CACX,QAAA,CAAS,GAAG,GAAG,CAAA;AAClB,MAAA,OAAO,SAAA,CAAU,EAAE,kBAAA,EAAoB,CAAA,EAAG,KAAK,KAAA,EAAO,EAAE,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,IAAI,CAAA;AAAA,IACpF;AAAA,IACA,KAAK,YAAA,EAAc;AAEjB,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,GAAG,CAAA;AACjC,MAAA,MAAM,CAAA,GAAI,EAAA,EAAI,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAC3B,MAAA,MAAM,QAAQ,CAAA,KAAM,IAAA,GAAO,OAAO,EAAA,EAAI,KAAA,CAAM,CAAC,CAAA,KAAM,SAAA;AACnD,MAAA,OAAO,SAAA,CAAU,EAAE,kBAAA,EAAoB,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,OAAA,CAAQ,GAAG,CAAC,CAAC,GAAG,CAAA;AAAA,IAC1F;AAAA,IACA,KAAK,WAAA;AACH,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,GAAG,IACxB,SAAA,CAAU;AAAA,QACR,oBAAoB,GAAA,CAAI,IAAA;AAAA,QACxB,OAAO,GAAA,CAAI,SAAA;AAAA,QACX,aAAA,EAAe,GAAA,CAAI,IAAA,GAAO,MAAA,GAAS;AAAA,OACpC,CAAA,GACD,EAAA;AAAA,IACN,KAAK,aAAA;AACH,MAAA,OAAO,IAAA,CAAK,KAAK,SAAA,CAAU,GAAA,EAAK,IAAI,GAAG,CAAC,IACpC,SAAA,CAAU;AAAA,QACR,oBAAoB,GAAA,CAAI,IAAA;AAAA,QACxB,OAAO,GAAA,CAAI,SAAA;AAAA,QACX,aAAA,EAAe,GAAA,CAAI,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,QACnC,YAAA,EAAc,GAAA,CAAI,MAAA,GAAS,QAAA,GAAW;AAAA,OACvC,CAAA,GACD,EAAA;AAAA,IACN;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;;;AC9bA,IAAM,CAAA,GACJ,8OAAA;AACF,IAAM,EAAA,GACJ,4+BAAA;AACF,IAAM,IAAA,GACJ,4fAAA;AACF,IAAM,EAAA,GACJ,02CAAA;AACF,IAAM,EAAA,GACJ,wiBAAA;AACF,IAAM,EAAA,GACJ,0VAAA;AACF,IAAM,GAAA,GACJ,kiCAAA;AACF,IAAM,KAAA,GACJ,qVAAA;AACK,IAAM,YAAA,GAAiD;AAAA,EAC5D,CAAA,EAAG,CAAA;AAAA,EACH,OAAA,EAAS,CAAA;AAAA,EACT,EAAA,EAAI,EAAA;AAAA,EACJ,IAAA,EAAM,IAAA;AAAA,EACN,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,GAAA,EAAK,GAAA;AAAA,EACL,OAAA,EAAS,GAAA;AAAA,EACT,IAAA,EAAM,GAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;;;AChCO,IAAM,QAAA,GAAW,CAAC,CAAA,KAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACtB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,IAAO,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAClE,CAAA;AAEO,SAAS,UAAA,CAAW,IAAA,EAAc,KAAA,EAAe,IAAA,EAAsB;AAC5E,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,MAAM,QAAA,GAAW,GAAA;AACjB,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC/E,EAAA,MAAM,GAAA,GAAM,CAAA,+CAAA,EAAkD,QAAA,CAAS,CAAA,CAAE,MAAA,IAAU,IAAA,GAAO,GAAA,GAAM,QAAA,CAAA,GAAY,CAAC,CAAC,CAAA,UAAA,EAAa,QAAA,CAAS,IAAA,GAAO,CAAC,CAAC,CAAA,iBAAA,EAAA,CAAqB,IAAA,GAAO,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,sDAAA,EAAyD,IAAI,CAAA,oCAAA,EAAuC,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,aAAA,CAAA;AAC5T,EAAA,OAAO,CAAA,iCAAA,EAAoC,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAA;AACzD;AAEO,IAAM,OAAA,GAAU,CAAC,CAAA,KACtB,kBAAA,CAAmB,CAAC,CAAA,CAAE,OAAA,CAAQ,YAAY,CAAC,CAAA,KAAM,IAAI,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAAA;AAE5F,SAAS,YAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,EACA,OACA,IAAA,EACmB;AACnB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AACpF,EAAA,MAAM,IAAA,GAAO,GAAA;AACb,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,GAAS,IAAA,GAAO,MAAM,IAAI,CAAA;AACvD,EAAA,MAAM,QAAQ,IAAA,GAAO,GAAA;AACrB,EAAA,MAAM,MAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,KAAK,EAAA,GAAM,GAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,GAAI,CAAA;AACrE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,GAAI,CAAA;AACrE,EAAA,MAAM,GAAA,GAAM,KAAA,KAAU,CAAA,GAAI,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,EAAA,CAAA,GAAO,EAAA;AAC9E,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsB,CAAA,CAAE,QAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACzG,EAAA,MAAM,GAAA,GAAM,CAAA,qDAAA,EAAwD,CAAC,CAAA,CAAA,EAAI,CAAC,YAAY,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,sFAAA,EAAyF,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAA,0BAAA,EAA6B,IAAA,CAAK,KAAK,CAAC,mBAAmB,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,aAAA,CAAA;AAC9S,EAAA,OAAO,CAAC,CAAA,mBAAA,EAAsB,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA;AACrD;AAEO,IAAM,SAAS,CAAC,CAAA,KACrB,CAAA,CAAE,OAAA,CAAQ,eAAe,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,CAAE,WAAW,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;;;ACMtE,SAAS,OAAA,CAAQ,OAA0B,KAAA,EAAyB;AAClE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,GAAG,CAAC,CAAA;AAC/B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAC3C,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA,GAAA,GAAM,IAAA;AAAA,IACR,OAAO,GAAA,GAAM,GAAA,GAAM,GAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAAA,EACxC;AACA,EAAA,OAAO,GAAA,GAAM,CAAC,GAAG,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA;AAC/B;AACO,SAAS,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,OAAA,EAA4B;AACjF,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAK,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAA;AACtD,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG,OAAO,CAAC,IAAI,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG,OAAO,CAAC,IAAI,CAAA;AACpC,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA,GAAI,OAAO,MAAM,CAAA;AACpF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAO,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AACtC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,MAAA,IAAU,GAAA,EAAK;AAC/B,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,GAAA,GAAM,IAAA;AAAA,IACR,OAAO,GAAA,GAAM,IAAA;AAAA,EACf;AACA,EAAA,OAAO,GAAA,GAAM,CAAC,GAAG,KAAA,EAAO,GAAG,CAAA,GAAI,KAAA;AACjC;AAGO,SAAS,YAAA,CAAkB,MAAsB,GAAA,EAAuB;AAC7E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAqB;AACtC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACrB,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,KAAK,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACnB,CAAC,CAAA;AACH;AACA,IAAM,MAAA,GAAS,CAAC,CAAA,KAAuC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAG/D,SAAS,cAAc,EAAA,EAAmC;AAC/D,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,MAAM,IAAI,SAAA,CAAU;AAAA,IAClB,OAAO,EAAA,CAAG,KAAA;AAAA,IACV,aAAa,EAAA,CAAG,IAAA;AAAA,IAChB,eAAe,EAAA,CAAG,MAAA;AAAA,IAClB,aAAA,EAAe,GAAG,IAAA,GAAO,SAAA,CAAU,YAAY,EAAA,CAAG,IAAI,CAAC,CAAA,GAAI,MAAA;AAAA,IAC3D,gBAAA,EAAkB,EAAA,CAAG,SAAA,KAAc,WAAA,GAAc,WAAA,GAAc,MAAA;AAAA,IAC/D,YAAA,EAAc,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,QAAA,GAAW;AAAA,GAClD,CAAA;AACD,EAAA,OAAO,CAAA,GAAI,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/B;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AACtB,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,aAAA,EAAgB,CAAC,CAAA,oDAAA,CAAsD,CAAA;AAClG,EAAA,OAAO,CAAA;AACT;AACA,IAAM,aAAA,GAAgB,CAAC,CAAA,EAAW,GAAA,KAAkC;AAClE,EAAA,IAAI,CAAA,KAAM,SAAS,CAAA,KAAM,QAAA;AACvB,IAAA,MAAM,IAAI,eAAe,CAAA,EAAG,GAAG,wCAAwC,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAC5F,EAAA,OAAO,CAAA;AACT,CAAA;AACA,IAAM,wBAAQ,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,CAAA;AACjD,IAAM,UAAA,GAAa,CAAC,CAAA,EAAW,GAAA,KAAwB;AACrD,EAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,IAAI,cAAA,CAAe,CAAA,EAAG,GAAG,CAAA,qCAAA,EAAwC,CAAC,CAAA,CAAA,CAAG,CAAA;AAC9F,EAAA,OAAO,CAAA;AACT,CAAA;AAEA,IAAM,WAAA,GAAmE;AAAA,EACvE,GAAA,EAAK,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,EAC3B,GAAA,EAAK,CAAC,UAAA,EAAY,YAAY,CAAA;AAAA,EAC9B,GAAA,EAAK,CAAC,UAAA,EAAY,YAAY,CAAA;AAAA,EAC9B,IAAA,EAAM,CAAC,WAAA,EAAa,aAAa;AACnC,CAAA;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,IAAA,EACA,GAAA,EACuB;AACvB,EAAA,MAAM,OAAO,MAAc,EAAA;AAC3B,EAAA,MAAM,GAAA,GAA6B;AAAA,IACjC,OAAA,EAAS,EAAA;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,MAAM,EAAC;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,KAAK,EAAC;AAAA,IACN,OAAO,EAAC;AAAA,IACR,aAAA,sBAAmB,GAAA,EAAI;AAAA,IACvB,SAAA,sBAAe,GAAA,EAAI;AAAA,IACnB,KAAA,EAAO,CAAC,EAAA,EAAI,CAAA,KAAM,WAAW,CAAC,CAAA;AAAA,IAC9B,WAAA,EAAa,IAAA;AAAA,IACb,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY;AAAA,GACd;AACA,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,CAAY,IAAA;AAAA,IAC7B,CAAC,CAAA,KAAwD,CAAA,CAAE,IAAA,KAAS;AAAA,GACtE;AACA,EAAA,MAAM,QAAA,GAAW,KAAK,WAAA,CAAY,IAAA;AAAA,IAChC,CAAC,CAAA,KAA2D,CAAA,CAAE,IAAA,KAAS;AAAA,GACzE;AACA,EAAA,IAAI,KAAA,IAAS,QAAA;AACX,IAAA,GAAA,CAAI,UAAU,CAAA,EAAG,KAAA,GAAQ,4BAA4B,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA,OAAA,CAAA,GAAY,EAAE,CAAA,EAAG,WAAW,CAAA,4BAAA,EAA+B,UAAA,CAAW,SAAS,IAAI,CAAC,YAAY,EAAE,CAAA,CAAA;AAE/K,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoC;AAC1D,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAgD;AACvE,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAW,IAAA,KAAuC;AAChE,IAAA,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,EAAE,GAAG,SAAA,CAAU,IAAI,CAAC,CAAA,EAAG,GAAG,IAAA,EAAM,CAAA;AAAA,EACnD,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,EAAW,CAAA,KAAoB;AAC/C,IAAA,UAAA,CAAW,GAAA,CAAI,CAAA,EAAG,CAAC,GAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC,EAAI,CAAC,CAAC,CAAA;AAAA,EACrD,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,GAAA,EAAa,IAAA,KAAmD;AAC1F,IAAA,UAAA,CAAW,IAAI,CAAA,EAAG,CAAC,IAAI,GAAG,CAAA,CAAA,EAAI,EAAE,GAAG,UAAA,CAAW,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,EAAG,GAAG,MAAM,CAAA;AAAA,EAC7E,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,EAAW,IAAA,KAAmD;AAC/E,IAAA,KAAA,MAAW,KAAK,GAAA,CAAI,OAAA,UAAiB,CAAA,EAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACrD,CAAA;AACA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,aAAA,GAAgB,SAAA,GAAYC,IAAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAEvF,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAmC,UAAA,CAAW,KAAK,GAAA,CAAI,UAAU,EAAE,MAAA,KAAW,CAAA;AAEnG,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,OAAA;AACnB,IAAA,IAAI,CAAA,CAAE,SAAS,cAAA,EAAgB;AAC7B,MAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAiC,CAAA,CAAE,UAAA,KAAe,QAAA,GAAW,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,KAAK,GAAG,CAAA;AAC/F,MAAA,MAAM,EAAA,GAAK,CAAC,CAAA,EAAY,IAAA,KACtB,CAAA,KAAM,IAAA,IAAS,OAAO,CAAA,KAAM,SAAA,IAAa,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA;AACzD,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AAC5B,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG;AAChB,QAAA,IAAI,EAAA,CAAG,CAAA,EAAG,GAAG,CAAA,EAAG,SAAA,CAAU,CAAA,EAAG,EAAE,kBAAA,EAAoB,CAAA,CAAE,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,cAAc,CAAA;AAAA,aAAA,IAC7E,EAAA,CAAG,CAAA,EAAG,IAAI,CAAA,EAAG,SAAA,CAAU,CAAA,EAAG,EAAE,kBAAA,EAAoB,CAAA,CAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CAAE,eAAe,CAAA;AAAA,aAAA,IACrF,EAAE,QAAA,KAAa,MAAA,IAAa,EAAA,CAAG,CAAA,EAAG,EAAE,QAAQ,CAAA;AACnD,UAAA,SAAA,CAAU,CAAA,EAAG,EAAE,kBAAA,EAAoB,CAAA,CAAE,UAAU,KAAA,EAAO,CAAA,CAAE,cAAc,CAAA;AAAA,MAC1E,CAAC,CAAA;AAAA,IACH;AACF,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,WAAA;AACnB,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,YAAA;AACH,QAAA,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,EAAE,IAAA,GAAO,UAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA;AACpD,QAAA;AAAA,MACF,KAAK,YAAA,EAAc;AACjB,QAAA,MAAM,OAAO,GAAA,CAAI,KAAA;AACjB,QAAA,GAAA,CAAI,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,KAChB,CAAC,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,GACpC,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,GAC/D,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACpB,QAAA;AAAA,MACF;AAAA;AAAA,MAEA,KAAK,cAAA,EAAgB;AACnB,QAAA,IAAI,CAAC,GAAA,CAAI,QAAA,EAAU,MAAM,IAAI,eAAe,kCAAkC,CAAA;AAC9E,QAAA,MAAM,EAAA,GAAK,CAAC,EAAA,KAAwB,EAAA,GAAK,OAAO,CAAA,CAAE,KAAA,KAAU,IAAI,CAAA,GAAI,CAAA,CAAA;AACpE,QAAA,YAAA,CAAa,MAAM,GAAA,CAAI,QAAQ,EAAE,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM;AACjD,UAAA,IAAI,EAAA,CAAG,CAAC,CAAA,EAAG,QAAA,CAAS,GAAG,cAAc,CAAA;AAAA,QACvC,CAAC,CAAA;AAED,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA;AAAA,UACN,CAAA,EAAG,IAAI,GAAG,CAAA,qCAAA,EAAwC,SAAS,CAAA,CAAE,KAAA,EAAO,oBAAoB,CAAC,CAAA,CAAA;AAAA,SAC3F;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAEhB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,OAAA;AAClC,UAAA,MAAM,IAAI,eAAe,CAAA,0CAAA,EAA6C,IAAA,CAAK,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAA;AAChG,QAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAA0B;AACvC,UAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AAC5B,UAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA,GAAO,OAAO,CAAC,CAAA;AAAA,QACrC,CAAA;AACA,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAE3B,QAAA,MAAM,SAAS,CAAC,GAAG,IAAI,GAAA,CAAI,GAAA,CAAI,WAAW,GAAA,CAAI,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,KAAM,IAAI,CAAC,CAAC,EAAE,IAAA,EAAK;AACnG,QAAA,MAAM,MAAM,CAAA,CAAE,OAAA;AACd,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,CAAA,KACvB,CAAA,KAAM,IAAA,GACF,MAAA,GACA,GAAA,KAAQ,MAAA,GACN,CAAA,GACA,MAAA,CAAO,GAAG,CAAA,GACR,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,GAClC,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA,GAClB,GAAA,CAAI,CAAC,CAAA,GACL;AAAA,SACZ;AACA,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,GAAA,CAAI,UAAU,CAAC,CAAA,GAAI,IAAA;AAC1E,QAAA,IAAI,CAAA,CAAE,QAAQ,IAAA,EAAM,IAAA,KAAS,KAAK,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,EAAG;AACrD,UAAA,GAAA,CAAI,IAAA,CAAK,CAAA,oBAAA,EAAuB,GAAA,CAAI,EAAE,IAAI,8CAA8C,CAAA;AACxF,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,QAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,UAAA,MAAM,IAAA,GAAO,KAAK,CAAA,CAAE,OAAA;AACpB,UAAA,IAAI,SAAS,aAAA,IAAkB,IAAA,IAAQ,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAI;AAEtD,UAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,CAAA,KAAM,MAAA,IAAa,CAAC,WAAW,CAAC,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AAAA,eACnE,MAAA,CAAO,CAAA,EAAG,EAAE,CAAC,UAAU,CAAA,CAAE,IAAI,CAAA,CAAE,GAAG,GAAG,CAAA,CAAE,KAAK,CAAA,SAAA,EAAY,IAAI,IAAI,CAAA;AAAA,QACvE,CAAC,CAAA;AACD,QAAA,IAAI,OAAO,IAAA,GAAO,CAAA;AAChB,UAAA,GAAA,CAAI,IAAA;AAAA,YACF,CAAA,oBAAA,EAAuB,GAAA,CAAI,EAAE,CAAA,KAAA,EAAQ,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,YAC1D,CAAA,EAAG,CAAC,GAAG,MAAM,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,KAAA,EAAQ,CAAA,CAAE,GAAG,+BAA+B,MAAA,CAAO,IAAA,KAAS,CAAA,GAAI,eAAA,GAAkB,gBAAgB,CAAA,UAAA;AAAA,WAC3J;AACF,QAAA,IAAI,EAAE,IAAA,EAAM,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,EAAE,GAAG,CAAA;AACvC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA;AACH,QAAA,KAAA,MAAW,KAAK,UAAA,CAAW,CAAA,CAAE,MAAM,IAAA,EAAM,GAAA,CAAI,UAAU,CAAA,EAAG;AACxD,UAAA,MAAA,CAAO,CAAA,EAAG,EAAE,aAAA,EAAe,MAAA,EAAQ,CAAA;AACnC,UAAA,SAAA,CAAU,CAAA,EAAG;AAAA,YACX,OAAO,CAAA,CAAE,SAAA;AAAA,YACT,GAAI,EAAE,cAAA,GAAiB,EAAE,oBAAoB,CAAA,CAAE,cAAA,KAAmB;AAAC,WACpE,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF,KAAK,WAAA,EAAa;AAEhB,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,CAAI,UAAU,CAAC,CAAA;AAC5D,QAAA,IAAI,IAAI,IAAA,KAAS,CAAA,IAAK,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,EAAG;AACzC,UAAA,GAAA,CAAI,IAAA,CAAK,CAAA,oBAAA,EAAuB,GAAA,CAAI,EAAE,IAAI,iDAAiD,CAAA;AAC3F,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,KAAa,MAAA,GAAS,WAAA,CAAY,IAAIC,OAAAA,CAAQ,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,QAAA;AACrE,QAAA,MAAM,IAAA,GAA+B;AAAA,UACnC,GAAI,EAAE,IAAA,GAAO,EAAE,oBAAoB,CAAA,CAAE,IAAA,KAAS,EAAC;AAAA,UAC/C,GAAI,EAAE,SAAA,GAAY,EAAE,OAAO,CAAA,CAAE,SAAA,KAAc;AAAC,SAC9C;AACA,QAAA,MAAM,IAAA,GAA+B,EAAE,GAAG,IAAA,EAAM,GAAI,CAAA,CAAE,IAAA,GAAO,EAAE,aAAA,EAAe,MAAA,EAAO,GAAI,EAAC,EAAG;AAC7F,QAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,UAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG;AACf,YAAA,IAAI,KAAK,MAAA,CAAO,CAAA,EAAG,EAAE,KAAA,EAAO,KAAK,CAAA;AACjC,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAA,CAAE,WAAA,EAAa,MAAA,CAAO,CAAA,EAAG,EAAE,YAAA,EAAc,CAAA,MAAA,EAAS,CAAA,CAAE,WAAW,CAAA,OAAA,EAAU,CAAA,CAAE,WAAW,IAAI,CAAA;AAC9F,UAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AACd,YAAA,SAAA,CAAU,GAAG,IAAI,CAAA;AACjB,YAAA,IAAI,EAAE,IAAA,EAAM,MAAA,CAAO,GAAG,EAAE,aAAA,EAAe,QAAQ,CAAA;AAC/C,YAAA;AAAA,UACF;AACA,UAAA,KAAA,MAAW,KAAK,GAAA,CAAI,OAAA;AAClB,YAAA,IAAK,CAAA,CAAE,OAAA,CAA8B,QAAA,CAAS,CAAA,CAAE,GAAG,GAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,IAAI,CAAA;AAAA,iBAAA,IACnE,GAAA,UAAa,CAAA,EAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,QAClD,CAAC,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,SAAA,EAAW;AAEd,QAAA,IAAI,CAAC,EAAE,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA;AAC3C,UAAA,MAAM,IAAI,eAAe,CAAA,6CAAA,EAAgD,CAAA,CAAE,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC/F,QAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,EAAE,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA,CAAE,CAAA;AACrE,UAAA,MAAM,IAAI,eAAe,qDAAqD,CAAA;AAChF,QAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,QAAA,MAAM,OAAA,GAAU,EAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AACrD,QAAA,IAAI,QAAQ,MAAA,GAAS,CAAA;AACnB,UAAA,GAAA,CAAI,IAAA;AAAA,YACF,qBAAqB,GAAA,CAAI,EAAE,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,YAChD,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAmB,OAAA,CAAQ,KAAK,IAAI,CAAC,CAAA,8BAAA,EAAiC,CAAA,GAAI,CAAC,CAAA,oDAAA;AAAA,WACtG;AACF,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,eAAe,CAAA;AAC/C,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,eAAe,CAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,CAAE,MAAA,EAAQ,gBAAgB,CAAA;AACjD,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,CAAA,CAAE,SAAA,EAAW,mBAAmB,CAAA;AAC1D,QAAA,MAAM,EAAA,GAAK,QAAA,EAAA;AACX,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAC1B,QAAA,MAAM,QAAQ,CAAA,CAAE,GAAA,CAAI,EAAE,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA;AACzC,QAAA,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,UAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG;AACrB,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,MAAM,MAAA,GAAS,CAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK,IAAA,GAAQ,IAAA;AACtF,UAAA,MAAM,GAAA,GAAM,CAAA,CAAE,aAAA,KAAkB,OAAA,IAAW,CAAA,KAAM,CAAA;AACjD,UAAA,MAAM,QAAA,GAAW,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AAC/B,UAAA,QAAA,CAAS,CAAA,EAAG,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AACjC,UAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAA,EAAI,CAAC,kBAAkB,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAC7F,UAAA,IAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,CAAA,IAAK,EAAE,KAAA,IAAS,QAAA,KAAa,IAAI,CAAA,CAAA,EAAI;AACxD,YAAA,QAAA,CAAS,IAAI,CAAA,EAAG,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,MAAA,CAAQ,CAAA;AAC3C,YAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,yBAAA,EAA4B,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,UACtF;AACA,UAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,EAAE,KAAA,IAAS,QAAA,KAAa,CAAA,CAAA;AACvC,YAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,gBAAA,EAAmB,KAAK,CAAA,GAAA,CAAK,CAAA;AAC7E,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,QAAA,CAAS,QAAA,EAAU,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,MAAA,CAAQ,CAAA;AAC9C,YAAA,GAAA,CAAI,GAAA,CAAI,IAAA;AAAA,cACN,GAAG,GAAA,CAAI,GAAG,CAAA,aAAA,EAAgB,EAAE,IAAI,CAAC,CAAA,kBAAA,EAAqB,GAAA,GAAM,KAAA,GAAQ,QAAQ,CAAA,CAAA,EAAI,SAAA,GAAY,EAAA,IAAM,GAAA,GAAM,QAAQ,KAAA,CAAM,CAAA,gCAAA,CAAA;AAAA,cACtH,GAAG,GAAA,CAAI,GAAG,gBAAgB,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,6BAAA,EAAgC,UAAA,CAAW,KAAA,EAAO,CAAA,CAAE,cAAc,KAAA,EAAO,SAAS,CAAC,CAAA,mDAAA,EAAsD,GAAA,GAAM,aAAa,iBAAiB,CAAA,CAAA;AAAA,aAChN;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AAEjB,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,kBAAkB,CAAA;AAClD,QAAA,MAAM,CAAA,GAAI,gBAAgB,OAAA,CAAQ,CAAA,CAAE,QAAQ,mBAAmB,CAAC,YAAY,KAAK,CAAA,CAAA;AACjF,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA;AAAA,UACN,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,+BAAA,EAAkC,CAAC,CAAA,CAAA,CAAA;AAAA,UAC7C,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAA;AAAA,SACnD;AACA,QAAA,IAAI,CAAA,CAAE,aAAA,EAAe,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAG,GAAA,CAAI,GAAG,CAAA,gCAAA,EAAmC,CAAC,CAAA,CAAA,CAAG,CAAA;AACnF,QAAA;AAAA,MACF;AAAA;AAAA,MAEA,KAAK,aAAA,EAAe;AAElB,QAAA,KAAA,MAAW,EAAA,IAAM,CAAC,CAAA,CAAE,WAAA,EAAa,EAAE,UAAA,EAAY,CAAA,CAAE,aAAA,EAAe,CAAA,CAAE,SAAS,CAAA;AACzE,UAAA,IAAI,EAAA,EAAI,IAAA;AACN,YAAA,GAAA,CAAI,MAAM,IAAA,CAAK;AAAA,cACb,MAAA,EAAQ,WAAA,CAAY,EAAA,CAAG,IAAI,CAAA;AAAA,cAC3B,OAAA,EAAS,CAAC,OAAO,EAAA,CAAG,WAAW,QAAA,GAAW,EAAA,CAAG,SAAS,GAAG;AAAA,aAC1D,CAAA;AACL,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA;AAAA,UACN,CAAA,EAAG,IAAI,GAAG,CAAA,iIAAA,CAAA;AAAA,UACV,CAAA,EAAG,IAAI,GAAG,CAAA,6EAAA;AAAA,SACZ;AACA,QAAA,GAAA,CAAI,OAAA,GAAU,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,CAAA,wBAAA,EAA2B,cAAc,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAC,CAAA,MAAA,CAAA,GAAW,EAAE,CAAA,wBAAA,EAA2B,aAAA,CAAc,CAAA,CAAE,UAAU,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,OAAA,EAAU,EAAE,QAAA,GAAW,CAAA,2BAAA,EAA8B,aAAA,CAAc,CAAA,CAAE,aAAa,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAC,CAAA,OAAA,CAAA,GAAY,EAAE,CAAA,EAAG,EAAE,IAAA,GAAO,CAAA,sBAAA,EAAyB,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA,MAAA,CAAA,GAAW,EAAE,CAAA,CAAA;AACla,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AAEjB,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,CAAE,KAAA,EAAO,kBAAkB,CAAA;AACpD,QAAA,IAAI,CAAC,CAAA,CAAE,GAAA,IAAO,CAAC,CAAA,CAAE,MAAA;AACf,UAAA,MAAM,IAAI,eAAe,2DAA2D,CAAA;AACtF,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,SAAA,IAAa,GAAA,CAAI,MAAM,MAAA,CAAO,IAAA;AAC7C,QAAA,IAAI,CAAA,CAAE,GAAA;AACJ,UAAA,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,YACP,CAAA,gCAAA,EAAmC,UAAU,EAAE,eAAA,EAAiB,GAAG,CAAA,CAAE,SAAS,YAAY,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,CAAA,EAAM,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAA,MAAA;AAAA,WACvJ;AACF,QAAA,IAAI,CAAA,CAAE,MAAA;AACJ,UAAA,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,YACP,CAAA,gCAAA,EAAmC,SAAA,CAAU,EAAE,YAAA,EAAc,KAAA,EAAO,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,CAAA,CAAE,MAAM,CAAC,CAAA,MAAA;AAAA,WAChG;AACF,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAEhB,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,CAAE,KAAA,EAAO,iBAAiB,CAAA;AACnD,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA;AACzC,QAAA,IAAI,QAAQ,MAAA,KAAW,CAAA;AACrB,UAAA,MAAM,IAAI,eAAe,kEAAkE,CAAA;AAC7F,QAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,MAAM,CAAA,KAAM;AACzC,UAAA,MAAM,GAAA,GAAM,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,CAAA;AACxC,UAAA,IAAI,CAAC,GAAA;AACH,YAAA,MAAM,IAAI,cAAA;AAAA,cACR,CAAA,6BAAA,EAAgC,CAAC,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,YAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,aACpF;AACF,UAAA,OAAO,CAAA,0BAAA,EAA6B,IAAI,OAAA,CAAQ,OAAA,EAAS,eAAe,SAAA,CAAU,EAAE,MAAA,EAAQ,CAAA,CAAE,UAAA,EAAY,gBAAA,EAAkB,YAAY,IAAA,EAAM,CAAA,CAAE,SAAA,IAAa,cAAA,EAAgB,CAAC,IAAI,CAAC,CAAA,EAAG,UAAA,CAAW,MAAM,CAAC,CAAA,OAAA,CAAA;AAAA,QAC1M,CAAC,CAAA;AACD,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA;AAAA,UACN,CAAA,EAAG,IAAI,GAAG,CAAA,kFAAA;AAAA,SACZ;AACA,QAAA,IAAI,CAAA,CAAE,OAAA;AACJ,UAAA,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,YACP,mCAAmC,SAAA,CAAU,EAAE,iBAAiB,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,WAAA,EAAa,QAAQ,CAAC,KAAK,UAAA,CAAW,CAAA,CAAE,OAAO,CAAC,CAAA,MAAA;AAAA,WACxJ;AACF,QAAA,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,UACP,CAAA,2CAAA,EAA8C,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,KAAA,GAAQ,MAAA,GAAS,UAAA,CAAW,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA,MAAA;AAAA,SAChH;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAEhB,QAAA,IAAI,EAAE,MAAA,CAAO,QAAA,CAAS,EAAE,OAAO,CAAA,IAAK,EAAE,OAAA,KAAY,CAAA,CAAA;AAChD,UAAA,MAAM,IAAI,cAAA,CAAe,CAAA,wDAAA,EAA2D,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACjG,QAAA,IAAI,EAAE,OAAA,CAAQ,MAAA,KAAW,GAAG,MAAM,IAAI,eAAe,sCAAsC,CAAA;AAC3F,QAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,OAAA,EAAS,GAAA,CAAI,OAAO,GAAA,CAAI,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,QAAA,EAAU,CAAA,CAAE,UAAU,CAAA;AACzF,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,CAAE,OAAO,CAAA;AACnC,QAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,EAAE,OAAO,CAAA,GACpC,aAAa,CAAA,CAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAK,IAAA,EAAM,IAChD,aAAA,CAAc,CAAA,CAAE,SAAS,IAAI,CAAA;AACjC,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,KAAA,GAAQ,CAAA,WAAA,EAAc,MAAM,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAA,CAAA,CAAA;AACvF,QAAA,MAAM,MAAA,GAAS,EAAE,WAAA,KAAgB,KAAA,GAAQ,MAAM,CAAC,CAAA,GAAI,QAAK,KAAK,CAAA,CAAA,CAAA,CAAA;AAC9D,QAAA,IAAI,CAAA,CAAE,UAAU,OAAA,EAAS,GAAA,CAAI,KAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AACvD,QAAA,IAAI,CAAA,CAAE,UAAU,YAAA,EAAc;AAC5B,UAAA,MAAM,OAAO,GAAA,CAAI,WAAA;AACjB,UAAA,GAAA,CAAI,WAAA,GAAc,CAAC,GAAA,KAChB,CAAA,CAAE,OAAA,CAA8B,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,IAAA,CAAK,GAAG,CAAA;AAAA,QAC5E;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AAEjB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,IAAA,KAAS,QAAA;AACjC,UAAA,MAAM,IAAI,eAAe,CAAA,2CAAA,EAA8C,IAAA,CAAK,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAA;AACjG,QAAA,UAAA,CAAW,CAAA,CAAE,UAAU,qBAAqB,CAAA;AAC5C,QAAA,MAAM,WAAW,UAAA,CAAW,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,qBAAqB,CAAC,CAAA;AACvE,QAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,QAAA,CAAS,CAAA,EAAG,mBAAmB,CAAC,CAAC,CAAA;AAC/E,QAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,IAAU,CAAA,CAAE,QAAA,KAAa,OAAA;AAC1C,UAAA,MAAM,IAAI,cAAA;AAAA,YACR,CAAA,+CAAA,EAAkD,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,WAC9E;AACF,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA;AACpC,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA;AAC5B,UAAA,MAAM,IAAI,cAAA;AAAA,YACR,CAAA,2CAAA,EAA8C,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,WAC3E;AACF,QAAA,IAAI,CAAA,CAAE,SAAA,KAAc,MAAA,IAAU,CAAA,CAAE,SAAA,KAAc,OAAA;AAC5C,UAAA,MAAM,IAAI,cAAA,CAAe,CAAA,iDAAA,EAAoD,CAAA,CAAE,SAAS,CAAA,CAAA,CAAG,CAAA;AAC7F,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,IAAA,EAAM,iCAAA;AAAA,UACN,MAAA,EAAQ,oCAAA;AAAA,UACR,KAAA,EAAO;AAAA,SACT,CAAE,EAAE,QAAuC,CAAA;AAC3C,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAC,EAAE,GAAA,EAAK;AACrB,UAAA,MAAM,IAAA,GAAO,MAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,oCAAA,EAAuC,SAAS,CAAA,oBAAA,EAAuB,CAAC,CAAA,QAAA,CAAU,CAAA,CAC7F,IAAA,CAAK,EAAE,CAAA;AACV,UAAA,KAAA,GAAQ,CAAA,qEAAA,EAAwE,QAAQ,CAAA,CAAA,EAAI,MAAM,KAAK,IAAI,CAAA,MAAA,CAAA;AAAA,QAC7G,CAAA,MAAO;AACL,UAAA,MAAM,OAAO,CAAA,CAAE,IAAA,GACX,CAAA,oCAAA,EAAuC,SAAA,CAAU,EAAE,aAAA,EAAe,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,SAAA,EAAW,WAAA,EAAa,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,EAAA,CAAA,EAAM,CAAC,CAAA,QAAA,EAAW,CAAA,CAAE,SAAS,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,WAAW,CAAA,EAAA,CAAA,EAAM,aAAA,EAAe,SAAA,EAAW,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA,OAAA,CAAA,GACxO,eAAA;AACJ,UAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,GACV,CAAA,gCAAA,EAAmC,WAAW,CAAA,CAAE,GAAG,CAAC,CAAA,gBAAA,EAAmB,SAAA,CAAU,EAAE,KAAA,EAAO,CAAA,EAAG,EAAE,QAAQ,CAAA,EAAA,CAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,EAAA,CAAA,EAAM,CAAC,WAAW,CAAA,CAAE,QAAQ,CAAA,CAAE,GAAG,GAAG,CAAA,CAAE,UAAU,CAAA,EAAA,CAAA,EAAM,CAAC,CAAA,EAAA,CAAA,GAC1L,EAAA;AACJ,UAAA,KAAA,GAAQ,CAAA,uGAAA,EAA0G,SAAS,CAAA,oBAAA,EAAuB,MAAA,CAAO,CAAC,CAAA,IAAK,MAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,IAAI,GAAG,GAAG,CAAA,MAAA,CAAA;AAAA,QAClN;AACA,QAAA,MAAM,OAAA,GAAU,CAAA,gCAAA,EAAmC,CAAA,CAAE,IAAI,KAAK,KAAK,CAAA,MAAA,CAAA;AACnE,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,KAAA,EAAO,GAAA,CAAI,MAAA,IAAU,OAAA;AAAA,iBAC3B,KAAA,IAAS,OAAA;AAClB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAEhB,QAAA,IAAI,CAAC,EAAE,IAAA,KAAS,CAAC,EAAE,KAAA,EAAO,MAAM,IAAI,cAAA,CAAe,gDAAgD,CAAA;AACnG,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,IAAA,GAAO,KAAA;AACX,QAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,CAAA,CAAE,OAAA,EAAS,mBAAmB,CAAA;AACtD,QAAA,IAAI,EAAE,KAAA,EAAO;AACX,UAAA,GAAA,GAAM,MAAA,CAAO,EAAE,KAAK,CAAA;AACpB,UAAA,KAAA,GAAQ,YAAY,OAAO,CAAA,CAAA;AAAA,QAC7B,CAAA,MAAO,CAAC,GAAA,EAAK,IAAI,IAAI,YAAA,CAAa,CAAA,CAAE,IAAA,IAAQ,EAAA,EAAI,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,KAAA,EAAO,EAAE,IAAI,CAAA;AACjF,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,gBAAgB,CAAA;AAC9C,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA;AAAA,UACN,CAAA,EAAG,IAAI,GAAG,CAAA,6BAAA,EAAgC,GAAG,CAAA,mDAAA,EAAsD,QAAA,CAAS,EAAE,QAAA,EAAU,oBAAoB,CAAC,CAAA,iBAAA,EAAoB,IAAA,GAAO,QAAQ,IAAI,CAAA,CAAA,GAAK,GAAG,IAAI,CAAA,KAAA,CAAO,GAAG,KAAK,CAAA,CAAA;AAAA,SACjN;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,WAAA,CAAY,CAAA,CAAE,MAAM,CAAC,CAAA;AAC7C,QAAA,IAAI,CAAA,CAAE,MAAA;AACJ,UAAA,GAAA,CAAI,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,QAAQ,OAAA,EAAS,CAAC,OAAO,CAAA,CAAE,WAAW,QAAA,GAAW,CAAA,CAAE,MAAA,GAAS,GAAG,GAAG,CAAA;AAC/F,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA;AAAA,UACN,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,kBAAA,EAAqB,KAAK,CAAA,mBAAA,EAAsB,KAAK,CAAA,mBAAA,EAAsB,KAAK,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,uBAAuB,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,aAAa,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,EAAG,CAAA,CAAE,KAAA,GAAQ,CAAA,YAAA,EAAe,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,CAAC,KAAK,EAAE,CAAA,CAAA;AAAA,SAC3O;AACA,QAAA;AAAA,MACF;AAAA;AAAA,MAEA,KAAK,kBAAA,EAAoB;AAEvB,QAAA,MAAM,MAAM,GAAA,CAAI,QAAA;AAChB,QAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,OAAA,IAAW,GAAA,EAAK,OAAA,IAAW,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAAMD,IAAAA,CAAK,CAAC,CAAC,CAAA;AAC9E,QAAA,IAAI,MAAA,GAAS,CAAA,CAAE,MAAA,IAAU,GAAA,EAAK,MAAA;AAC9B,QAAA,IAAI,CAAC,MAAA,IAAU,CAAA,CAAE,OAAA,IAAW,GAAA,CAAI,WAAW,MAAA,GAAS,CAAA;AAClD,UAAA,MAAA,GAAS,SAAS,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,IAAI,UAAA,CAAW,GAAA,CAAI,CAACE,EAAAA,KAAM,SAAS,SAAA,CAAUA,EAAAA,EAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAG9F,QAAA,IAAI,CAAC,MAAA,IAAU,GAAA,CAAI,UAAA,CAAW,MAAA,KAAW,CAAA,KAAM,CAAA,CAAE,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI;AACzF,QAAA,IAAI,CAAC,MAAA;AACH,UAAA,MAAM,IAAI,cAAA;AAAA,YACR;AAAA,WACF;AACF,QAAA,IAAI,EAAE,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,eAAe,2CAA2C,CAAA;AACrF,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,CAAA,CAAE,QAAA,EAAU,kBAAkB,CAAA;AACxD,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,CAAE,WAAA,EAAa,8BAA8B,CAAA;AACjE,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,CAAE,YAAA,EAAc,+BAA+B,CAAA;AACnE,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,IAAW,GAAA,EAAK,OAAA,IAAW,KAAA;AACzC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,GAAM,CAAC,GAAG,OAAO,CAAA,CAAE,OAAA,EAAQ,GAAI,OAAA,EAAS,MAAM,CAAA;AAC7D,QAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAA;AACjB,QAAA,MAAM,KAAK,KAAA,CAAM,IAAA;AAAA,UACf,EAAE,MAAA,EAAQ,CAAA,CAAE,KAAA,EAAM;AAAA,UAClB,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,4DAAA,EAA+D,GAAG,aAAa,GAAG,CAAA,oBAAA,EAAuB,CAAA,CAAE,EAAA,GAAA,CAAO,IAAI,GAAA,IAAO,CAAA,CAAE,SAAU,EAAA,GAAK,EAAA,CAAG,KAAK,SAAS,CAAA,SAAA;AAAA,SACnK;AACA,QAAA,MAAM,SAAS,CAAA,CAAE,MAAA,IAAU,CAAC,EAAA,EAAI,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,YAAY,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,OAAA,EAAS,EAAE,CAAC,CAAA;AACpF,QAAA,MAAM,QAAQ,CAAA,oCAAA,EAAuC,GAAG,CAAA,qCAAA,EAAwC,CAAA,CAAE,kBAAkB,MAAA,GAAS,KAAA,GAAQ,QAAQ,CAAA,oDAAA,EAAuD,EAAE,KAAA,GAAQ,CAAA,+BAAA,EAAkC,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,MAAA,CAAA,GAAW,EAAE,CAAA,2GAAA,EAA8G,UAAA,CAAW,OAAO,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,OAAA,EAAU,GAAG,IAAA,CAAK,EAAE,CAAC,CAAA,8BAAA,EAAiC,WAAW,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,mBAAA,CAAA;AAC1f,QAAA,IAAI,GAAA,KAAQ,KAAA,EAAO,GAAA,CAAI,MAAA,IAAU,KAAA;AAAA,iBACxB,KAAA,IAAS,KAAA;AAClB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,KAAQ,UAAA,GAAa,cAAc,CAAA,CAAE,GAAA;AACnD,QAAA,IAAI,CAAC,GAAA;AACH,UAAA,MAAM,IAAI,cAAA;AAAA,YACR;AAAA,WACF;AACF,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,CAAA,CAAE,QAAA,EAAU,gBAAgB,CAAA;AACtD,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAA,CAAE,UAAA,EAAY,2BAA2B,CAAA;AAC9D,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,CAAE,GAAA,EAAK,oBAAoB,CAAA;AAC/C,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA;AAAA,UAChC,CAAC,CAAC,KAAA,EAAO,KAAK,CAAA,KACZ,CAAA,oHAAA,EAAuH,UAAU,EAAE,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,GAAG,IAAI,CAAA,EAAA,CAAA,EAAM,QAAQ,CAAA,EAAG,IAAI,MAAM,kBAAA,EAAoB,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,eAAe,cAAc,CAAA,CAAA,GAAK,QAAW,eAAA,EAAiB,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,QAAQ,MAAA,EAAW,CAAC,CAAA,SAAA,EAAY,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,SAC5Y;AACA,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,CAAE,KAAA,EAAO,sBAAsB,CAAA;AACxD,QAAA,MAAM,KAAA,GAAQ,uCAAuC,GAAG,CAAA,wDAAA,EAA2D,EAAE,IAAA,EAAM,YAAA,EAAc,QAAQ,QAAA,EAAU,KAAA,EAAO,YAAW,CAAE,KAAK,CAAC,CAAA,UAAA,EAAa,CAAA,CAAE,UAAU,CAAA,+BAAA,EAAkC,UAAA,CAAW,CAAA,CAAE,OAAO,CAAC,CAAA,MAAA,CAAA,GAAW,EAAE,CAAA,EAAG,CAAA,CAAE,WAAW,CAAA,6BAAA,EAAgC,UAAA,CAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAA,wCAAA,EAA2C,EAAE,SAAA,KAAc,UAAA,GAAa,WAAW,KAAK,CAAA,oBAAA,EAAuB,GAAG,CAAA,IAAA,EAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,YAAA,CAAA;AAC5e,QAAA,IAAI,GAAA,KAAQ,KAAA,EAAO,GAAA,CAAI,MAAA,IAAU,KAAA;AAAA,iBACxB,KAAA,IAAS,KAAA;AAClB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA,EAAgB;AAEnB,QAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,CAAE,OAAA,CAAQ,MAAA;AAChC,UAAA,MAAM,IAAI,eAAe,yDAAyD,CAAA;AACpF,QAAA,IAAI,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,MAAA,CAAO,CAAA,GAAI,CAAC,KAAK,CAAA,CAAE,CAAA;AAC7D,UAAA,MAAM,IAAI,eAAe,iEAAiE,CAAA;AAC5F,QAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC1B,UAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,YAAA,MAAM,IAAI,QAAA,CAAS,SAAA,CAAU,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACvC,YAAA,IAAI,MAAM,IAAA,EAAM;AAChB,YAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,UAAU,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAC,CAAA;AACpD,YAAA,IAAI,CAAA,EAAG;AACL,cAAA,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,KAAK,QAAQ,CAAA,CAAA;AAC/B,cAAA,QAAA,CAAS,GAAA;AAAA,gBACP,CAAA;AAAA,gBACA,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,CAAE,WAAA,GAAc,CAAA,6BAAA,EAAgC,WAAW,CAAC,CAAC,CAAA,MAAA,CAAA,GAAW,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,eAClH;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AACD,UAAA,IAAI,EAAE,KAAA,EAAO,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,QAC3C;AACA,QAAA,IAAI,CAAA,CAAE,IAAA;AACJ,UAAA,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,YACP,UAAA,CAAW,EAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAE,QAAQ,aAAA,CAAc,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,WAC/F;AACF,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AAEf,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,QAAA,IAAY,CAAC,CAAA,CAAE,MAAA;AAC9B,UAAA,MAAM,IAAI,eAAe,gEAAgE,CAAA;AAC3F,QAAA,MAAM,IAAI,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,MAAA,KAAW,OAAO,CAAA,GAAI,GAAA,CAAA;AAClD,QAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,KAAS,MAAA,GAAY,OAAOC,KAAAA,CAAM,CAAA,CAAE,MAAM,EAAE,CAAA;AAC5D,QAAA,MAAM,GAAA,GACJ,CAAA,CAAE,KAAA,KAAU,KAAA,KAAU,IAAA,IAAQC,QAAAA,CAAS,SAAA,EAAW,KAAK,CAAA,IAAK,GAAA,GAAM,SAAA,GAAYH,OAAAA,CAAQ,KAAK,CAAA,CAAA;AAC7F,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,SAAS,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAEpD,UAAA,MAAM,OAAO,GAAA,CAAI,UAAA,CACd,GAAA,CAAI,CAAC,MAAM,QAAA,CAAS,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA,CACpC,OAAO,CAAC,CAAA,KAAmB,MAAM,IAAI,CAAA;AACxC,UAAA,IAAI,KAAK,MAAA,CAAO,iBAAA;AAChB,UAAA,IAAI,KAAK,MAAA,CAAO,iBAAA;AAChB,UAAA,IAAI,CAAA,CAAE,WAAW,QAAA,EAAU;AACzB,YAAA,EAAA,GAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AACtB,YAAA,EAAA,GAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAAA,UACxB,WAAW,IAAA,CAAK,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,WAAW,IAAA,EAAM;AAChD,YAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AACjD,YAAA,MAAM,CAAA,GAAI,SAAS,IAAI,CAAA;AACvB,YAAA,IAAI,MAAM,CAAA,EAAG;AACX,cAAA,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACb,cAAA,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AAAA,YACf;AAAA,UACF,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,IAAU,CAAA,EAAG;AAC3B,YAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAC/B,YAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAC/B,YAAA,IAAI,OAAO,EAAA,EAAI;AACb,cAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,CAAA;AACpB,cAAA,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,CAAA;AAAA,YACtB;AAAA,UACF;AACA,UAAA,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,YAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,EAAG,CAAA,GAAI,EAAA,IAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAY,CAAA,GAAI,EAAA,IAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAA,EAAS;AACpF,YAAA,OAAA,GAAU,IAAA;AACV,YAAA,OAAA,CAAQ,GAAG,CAAA,EAAG;AAAA,cACZ,KAAA,EAAO,GAAA;AAAA,cACP,aAAA,EAAe,CAAA,CAAE,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,cACjC,oBAAoB,CAAA,CAAE;AAAA,aACvB,CAAA;AACD,YAAA,IAAI,CAAA,CAAE,MAAA;AACJ,cAAA,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAA,EAAG,SAAS,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE,CAAA,IAAK,EAAE,GAAG,UAAA,CAAW,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,UACzF,CAAC,CAAA;AAAA,QACH;AACA,QAAA,IAAI,OAAA,IAAW,EAAE,IAAA,EAAM;AACrB,UAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,qBAAqB,GAAA,EAAK,kBAAA,EAAmB,CAAE,CAAA,CAAE,IAAI,CAAA;AACpF,UAAA,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,YACP,UAAA;AAAA,cACE,OAAO,EAAE,IAAA,KAAS,QAAA,GACd,EAAE,IAAA,GACF,CAAA,CAAE,WAAW,IAAA,GACX,CAAA,6BAAA,EAAgC,cAAc,CAAC,CAAC,sBAAsB,CAAA,KAAM,CAAA,GAAI,KAAK,GAAG,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAA,GACpH,CAAA,CAAE,WAAW,KAAA,GACX,CAAA,2BAAA,EAA8B,cAAc,CAAC,CAAC,oCAAiC,IAAI,CAAA,CAAA,CAAA,GACnF,8BAA8B,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,IAAK,IAAI,SAAI,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,IAAK,IAAI,GAAG,IAAI,CAAA,CAAA;AAAA;AAC7F,WACF;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AAEjB,QAAA,MAAM,GAAA,GAAMA,QAAQ,EAAE,CAAA;AACtB,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,WAAA,CAAY,IAAI,GAAG,CAAA;AAC5C,QAAA,MAAM,OAAO,CAAA,CAAE,SAAA,IAAaF,GAAAA,CAAI,EAAA,EAAI,KAAK,IAAI,CAAA;AAC7C,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,CAAE,KAAA,EAAO,kBAAkB,CAAA;AACpD,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,UAAA,IAAI,EAAE,KAAA,KAAU,MAAA;AACd,YAAA,WAAA,CAAY,GAAA;AAAA,cACV,CAAA;AAAA,cACA,CAAA,MAAA,EAAS,OAAO,CAAA,CAAE,KAAA,KAAU,WAAW,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,CAAA,GAAO,WAAW,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,kBAAkB,CAAC,CAAC,CAAA;AAAA,aAC3G;AACF,UAAA,IAAA,CAAK,OAAA;AAAA,YAAQ,CAAC,CAAA,EAAG,CAAA,KACf,OAAA,CAAQ,GAAG,CAAA,EAAG;AAAA,cACZ,YAAA,EAAc,CAAA,CAAE,MAAA,GAAS,QAAA,GAAW,QAAA;AAAA,cACpC,aAAa,CAAA,CAAE,IAAA;AAAA,cACf,KAAA;AAAA,cACA,aAAA,EAAe,CAAA,CAAE,IAAA,GAAO,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,GAAK,MAAA;AAAA,cAC9C,YAAA,EAAc;AAAA,aACf;AAAA,WACH;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AAEZ,QAAA,IAAI,CAAC,CAAA,CAAE,MAAA;AACL,UAAA,MAAM,IAAI,eAAe,8DAA8D,CAAA;AACzF,QAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,CAAE,MAAA,CAAO,MAAA;AAC/B,UAAA,MAAM,IAAI,cAAA;AAAA,YACR,wDAAwD,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,YAAA,EAAe,CAAA,CAAE,OAAO,MAAM,CAAA,OAAA;AAAA,WACvG;AACF,QAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAMC,IAAAA,CAAK,CAAC,CAAC,CAAA;AACzC,QAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAA0B;AACxC,UAAA,MAAM,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA;AAChC,UAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA,GAAO,OAAO,CAAC,CAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,IAAI,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,CAAE,OAAO,CAAC,CAAA,KAAmB,CAAA,KAAM,IAAI,CAAC,CAAC,CAAA;AAC3F,QAAA,MAAM,OAAA,GAAU,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,CAAC,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AACxD,QAAA,IAAI,QAAQ,MAAA,GAAS,CAAA;AACnB,UAAA,GAAA,CAAI,IAAA;AAAA,YACF,CAAA,gBAAA,EAAmB,IAAI,EAAE,CAAA,CAAA;AAAA,YACzB,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,EAAgB,CAAA,CAAE,OAAO,CAAA,iCAAA,EAAoC,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,WAC3G;AACF,QAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,UAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,UAAA,MAAM,CAAA,GAAI,MAAM,IAAA,GAAO,MAAA,GAAY,MAAM,CAAA,CAAE,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC5D,UAAA,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,CAAE,SAAS,EAAE,kBAAA,EAAoB,CAAA,EAAG,KAAA,EAAOC,OAAAA,CAAQ,CAAC,CAAA,EAAG,aAAA,EAAe,QAAQ,CAAA;AAAA,QAClG,CAAC,CAAA;AACD,QAAA,WAAA,GAAc,MAAA,CAAO,WAAA,CAAY,CAAA,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,GAAG,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA;AAC5E,QAAA;AAAA,MACF;AAEE;AAEN,EAAA,GAAA,CAAI,UAAA,GAAa,CAAC,CAAA,EAAG,GAAA,KAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA,IAAK,EAAA;AAC5D,EAAA,GAAA,CAAI,aAAa,CAAC,GAAA,KAAQ,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,IAAK,EAAA;AAClD,EAAA,GAAA,CAAI,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AACrD,EAAA,GAAA,CAAI,WAAW,CAAC,CAAA,KAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAC3E,EAAA,GAAA,CAAI,QAAA,GAAW,CAAC,CAAA,KAAM;AACpB,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AACzB,IAAA,OAAO,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAAA,EAC5B,CAAA;AACA,EAAA,GAAA,CAAI,SAAA,GAAY,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AACtC,IAAA,OAAO,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAAA,EAC5B,CAAA;AACA,EAAA,OAAO,GAAA;AACT;;;ACpsBO,SAAS,YAAiB,IAAA,EAAsC;AACrE,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAuB,CAAA,CAAE,SAAS,OAAO,CAAA;AAC1E,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAuB;AACvD,IAAA,IAAI,CAAC,CAAA,CAAE,YAAA,CAAa,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA,EAAG,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,EAAA,EAAG;AAC9D,IAAA,OAAO;AAAA,MACL,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM,OAAA;AAAA,MACN,QAAQ,CAAA,CAAE,SAAA;AAAA,MACV,GAAI,EAAE,KAAA,GAAQ,EAAE,OAAO,CAAA,CAAE,KAAA,KAAU,EAAC;AAAA,MACpC,GAAI,EAAE,KAAA,GAAQ,EAAE,OAAO,CAAA,CAAE,KAAA,KAAU;AAAC,KACtC;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,CAAE,OAAM,EAAE;AAAA,IAChF;AAAA,GACF;AACF;AAIO,SAAS,WAAA,CACd,GACA,IAAA,EACA,SAAA,EACA,MACA,OAAA,EACA,IAAA,EACA,OACA,KAAA,EACyC;AACzC,EAAA,MAAM,MAAA,GAAS,UAAA;AAAA,IACb,IAAA,CAAK,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,GAAA,EAAK,GAAE,CAAE,CAAA;AAAA,IACjC,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAI,CAAA,CAAE,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,CAAA,CAAE,UAAA,EAAW,GAAI,EAAC;AAAG,GACxF;AACA,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AACnD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,oCAAoC,UAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA,KAAA,CAAA,CAAQ,OAAO,IAAI,CAAA;AACvF,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,GAAA,EAAI;AAAA,IAAG,CAAC,GAAG,CAAA,KAC3C,IAAA;AAAA,MACE,MAAA,CAAO,CAAC,CAAA,GAAI,CAAC,GAAG,CAAA,IAAK,CAAA;AAAA,MACrB,MAAA,CACG,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,QAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA;AAAA,MACnC,CAAC,CAAA,CACA,IAAA,CAAK,KAAK;AAAA;AACf,GACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAM,SAAS,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,EAAK;AAC/D;;;ACcA,SAAS,SAAA,CAAe,MAAsB,IAAA,EAA4B;AACxE,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,UAAU,MAAA,EAAW;AACzB,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,KAAe,CAAC,CAAA;AACjD,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,OAAA,EAAS;AAC9B,IAAA,MAAM,IAAA,GAAiB;AAAA,MACrB,GAAA,CAAI,GAAA;AAAA,MACJ,GAAI,IAAA,IAAQ,GAAA,GAAM,CAAC,GAAA,CAAI,EAAE,IAAI,EAAC;AAAA,MAC9B,GAAI,MAAA,IAAU,GAAA,GAAM,GAAA,CAAI,OAAO,EAAC;AAAA,MAChC,GAAI,WAAW,GAAA,GAAM,CAAC,IAAI,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA,GAAI;AAAC,KAChD;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA;AACd,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACb,QAAA,MAAM,IAAI,cAAA;AAAA,UACR,CAAA,QAAA,EAAW,CAAC,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,CAAA,0CAAA,EAA6C,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAClG;AAAA,EACN;AACF;AACA,SAAS,QAAa,GAAA,EAAmD;AACvE,EAAA,IAAI,GAAA,CAAI,KAAA,EAAO,OAAO,GAAA,CAAI,KAAA;AAC1B,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,KAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,YAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AACO,SAAS,QAAa,GAAA,EAA8B;AACzD,EAAA,OAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,GAAA,CAAI,QAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AACxF;AAGO,SAAS,SAAS,GAAA,EAAuB;AAC9C,EAAA,OAAO,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAA,IAAW,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,MAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA;AACvJ;AAEO,SAAS,WAAgB,IAAA,EAAsB,KAAA,GAAe,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAW;AACrG,EAAA,MAAM,GAAA,GAAM,CAAA,CAAA,EAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AACpC,EAAA,OAAO,CAAA,EAAG,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,MAAM,CAAC;AAAA,EAAK,QAAA,CAAS,GAAG,CAAC;AAAA,EAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA;AAC/E;AAGO,SAAS,QAAA,CAAS,MAA+B,GAAA,EAAkD;AACxG,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,KAAK,OAAO,MAAA;AACtC,EAAA,OAAO,IAAA,CAAK,GAAA,KAAQ,KAAA,GAAQ,WAAA,GAAc,YAAA;AAC5C;AAEO,SAAS,UAAU,KAAA,EAAiD;AACzE,EAAA,OAAO,OAAO,OAAA,CAAQ,KAAK,EACxB,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,KAAK,UAAA,CAAW,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CAC1C,KAAK,EAAE,CAAA;AACZ;AACA,IAAM,WAAW,CAAC,GAAA,KAAyB,GAAA,GAAM,CAAA,OAAA,EAAU,GAAG,CAAA,QAAA,CAAA,GAAa,EAAA;AAEpE,SAAS,UAAU,CAAA,EAA0B;AAClD,EAAA,OAAO,CAAA,EAAG,QAAA,CAAS,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,MAAA,EAAS,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,OAAA,EAAU,CAAA,CAAE,QAAQ,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,oBAAA,EAAuB,CAAA,CAAE,IAAI,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,QAAA,EAAW,CAAA,CAAE,KAAK,CAAA,CAAA;AAC3K;AAKO,SAAS,QAAA,CAAS,CAAA,EAAkB,KAAA,GAAgB,SAAA,CAAU,CAAC,CAAA,EAAW;AAC/E,EAAA,OAAO,CAAA,EAAG,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,EAAE,IAAI;AAAA,CAAA,GAAO,EAAE,CAAA,IAAA,EAAO,SAAA,CAAU,CAAA,CAAE,YAAY,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA,MAAA,CAAA;AACpG;AAMO,SAAS,WAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,GAAsB,EAAC,EACR;AACf,EAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,QAAQ,KAAK,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AACrC,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AAC7B,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,2DAAA;AAAA,KAChC;AACF,EAAA,MAAM,GAAA,GAAM,IAAI,EAAE,CAAA,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,KAAK,WAAA,CAAY,IAAA;AAAA,IAC/B,CAAC,CAAA,KAA0D,CAAA,CAAE,IAAA,KAAS;AAAA,GACxE;AACA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,IAAU,EAAC;AACrC,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,MAAA,CAAO,CAAC,MAAM,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,CAAC,CAAC,CAAA;AAC7E,EAAA,IAAI,IAAI,MAAA,GAAS,CAAA;AACf,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,uBAAA,EAA0B,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAClI;AACF,EAAA,MAAM,UAAA,GAAc,KAAK,UAAA,IAAc,IAAA;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,KAAgB,IAAA,GAAO,KAAK,IAAA,GAAO,MAAA;AACrD,EAAA,MAAM,MAAA,GAAS,IAAA,KAAS,MAAA,GAAY,EAAA,GAAK,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,EAAM,IAAA,EAAM,MAAM,UAAU,CAAA;AACxD,EAAA,MAAM,GAAA,GAA0B;AAAA,IAC9B,IAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAA;AAAA,IACA,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,UAAU,OAAA,EAAS,GAAA;AAAA,IACnB,IAAA;AAAA,IACA,OAAA,EAAS,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAAA,IAC7B,MAAA;AAAA,IACA,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,CAAE,EAAA,CAAG,EAAE,CAAA,EAAG,GAAA,IAAO,EAAE,CAAA;AAAA;AAAA,IACpE,MAAA,sBAAY,GAAA;AAAI,GAClB;AACA,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,IAAK,CAAC,aAAa,QAAA,CAAS,CAAA,CAAE,GAAG,CAAC,CAAA;AAC1G,EAAA,MAAM,OAAO,OAAA,CAAQ,MAAA;AACrB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAC7B,EAAA,MAAM,SAAS,IAAI,GAAA;AAAA,IACjB,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,GAAA,EAAA,CAAM,KAAK,SAAA,CAAU,GAAA,CAAI,EAAE,GAAG,CAAA,IAAK,QAAQ,CAAC,CAAA,IAAK,KAAK,WAAA,CAAY,CAAA,CAAE,GAAG,CAAC,CAAU;AAAA,GAC1G;AACA,EAAA,IAAI,IAAA,GAAO,OAAA,CACR,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,KAAA,GAAQ,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,MAAA,CAAO,GAAA,CAAI,EAAE,GAAG,CAAW,CAAC,CAAA,EAAG,CAAA,CAAE,YAAY,CAAA,6BAAA,EAAgC,UAAA,CAAW,EAAE,SAAS,CAAC,YAAY,EAAE,CAAA,CAAA;AACjJ,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,KAAgB,IAAA,IAAQ,EAAE,QAAA,KAAa,KAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,EAAE,GAAG,CAAA;AACrC,IAAA,MAAM,OAAO,QAAA,IAAY,GAAA,KAAQ,MAAA,GAAS,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,CAAA,GAAM,EAAA;AAClE,IAAA,MAAM,KAAA,GAAQ,WACV,CAAA,uDAAA,EAA0D,UAAA,CAAW,EAAE,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,SAAA,CAAA,GACrF,KAAA;AACJ,IAAA,MAAM,SAAA,GAAY,IAAA,EAAM,GAAA,KAAQ,CAAA,CAAE,GAAA;AAClC,IAAA,MAAM,OAAA,GAAU,YAAY,mBAAA,GAAsB,EAAA;AAElD,IAAA,MAAM,WAAA,GAAc,YAAY,sBAAA,GAAyB,EAAA;AACzD,IAAA,OAAO,CAAA,uCAAA,EAA0C,WAAW,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,EAAG,OAAO,CAAA,YAAA,EAAe,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA,EAAG,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,GAAQ,SAAS,UAAA,CAAW,QAAA,CAAS,EAAE,KAAA,EAAO,CAAA,OAAA,EAAU,CAAA,CAAE,GAAG,CAAA,MAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA,EAAI,KAAK,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,KAAA,CAAA;AAAA,EAC1S,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAU,CAAA,KACzB,OAAA,CACG,GAAA;AAAA,IACC,CAAC,MACC,CAAA,+BAAA,EAAkC,UAAA,CAAW,EAAE,IAAI,CAAC,CAAA,MAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,aAAA,CAAc,CAAA,EAAG,GAAA,EAAK,GAAG,GAAG,CAAA,EAAG,KAAK,SAAA,CAAU,CAAA,EAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,GAAG,GAAA,EAAK,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,KAAK,UAAA,CAAW,CAAA,EAAG,CAAA,CAAE,GAAG,CAAC,CAAA,KAAA;AAAA,GACvP,CACC,KAAK,EAAE,CAAA;AAEZ,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,aAAA;AACxC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,UAAU,CAAC,CAAA,KACf,IAAA,KAAS,MAAA,GACL,KACA,CAAA,WAAA,EAAc,CAAA,KAAM,MAAA,GAAS,CAAA,GAAI,EAAE,CAAA,iBAAA,EAAoB,IAAA,CAAK,UAAU,GAAA,CAAI,CAAC,MAAM,IAAI,CAAA,CAAA,CAAA;AAC3F,EAAA,MAAM,OAAO,CAAC,CAAA,EAAW,UACvB,CAAA,mBAAA,EAAsB,OAAA,IAAW,UAAU,CAAA,KAAM,CAAA,GAAI,cAAA,GAAiB,EAAE,GAAG,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,KAAK,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,gBAAA,GAAmB,EAAE,eAAe,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAC,CAAC,GAAG,OAAA,CAAQ,CAAC,KAAK,QAAA,CAAS,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAA,KAAA,CAAA;AAC3N,EAAA,IAAI,OAAiB,EAAC;AACtB,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,CAAY,IAAA;AAAA,IAC7B,CAAC,CAAA,KAAwD,CAAA,CAAE,IAAA,KAAS;AAAA,GACtE;AACA,EAAA,IAAI,SAAS,GAAA,CAAI,QAAA,KAAa,QAAW,MAAM,IAAI,eAAe,uCAAuC,CAAA;AAGzG,EAAA,IAAI,KAAA,IAAS,KAAK,WAAA,KAAgB,IAAA;AAChC,IAAA,MAAM,IAAI,cAAA;AAAA,MACR;AAAA,KACF;AACF,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,GAAA,GAAM,IAAI,CAAA,aAAA,EAAgB,KAAA,CAAM,GAAG,CAAA,eAAA,CAAA,GAAoB,EAAA;AAClF,EAAA,MAAM,SAAS,KAAA,GACX,WAAA;AAAA,IACE,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAA,GAAM,CAAA,qBAAA,EAAwB,GAAG,CAAA,MAAA,CAAA,GAAW,EAAA;AAAA,IAC5C,GAAA,GAAM,CAAA,qBAAA,EAAwB,GAAG,CAAA,MAAA,CAAA,GAAW;AAAA,GAC9C,GACA,IAAA;AACJ,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAI,KAAA,CAAM,SAAA;AACR,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,QACP,CAAA,EAAG,GAAG,CAAA,WAAA,EAAc,GAAG,CAAA,gGAAA;AAAA,OACzB;AAAA,EACJ,CAAA,MAAO;AAEL,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAuB;AAC1C,IAAA,IAAI,IAAI,QAAA,KAAa,MAAA;AACnB,MAAA,MAAA,CAAO,GAAA;AAAA,QACL,MAAA;AAAA,QACA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAC;AAAA,OACtB;AAAA;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACvB,QAAA,MAAM,CAAA,GAAK,GAAA,CAAgC,GAAA,CAAI,QAAkB,CAAA;AACjE,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACzB,QAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,aAChB,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,MACxB,CAAC,CAAA;AAEH,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,IAAI,CAAA,IAAK,MAAA,EAAQ;AAE9B,MAAA,IAAI,IAAI,QAAA,KAAa,MAAA;AACnB,QAAA,IAAA,CAAK,IAAA;AAAA,UACH,CAAA,yBAAA,EAA4B,IAAA,CAAK,aAAA,CAAwB,CAAC,mCAAmC,IAAI,CAAA,qBAAA,EAAwB,UAAA,CAAW,CAAC,CAAC,CAAA,UAAA;AAAA,SACxI;AACF,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAU,CAAC,CAAC,CAAC,CAAA;AAAA,IACrE;AAAA,EACF;AACA,EAAA,MAAM,QAAsB,CAAC,GAAG,MAAM,KAAA,EAAO,GAAG,KAAK,KAAK,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA;AACxB,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,MAAM,IAAA,CAAK,KAAA,KAAU,KAAA,GAAQ,EAAA,GAAK,UAAU,KAAK,CAAA;AAAA;AAAA,IACjD,YAAA,EAAc;AAAA,MACZ,OAAO,CAAA,gBAAA,EAAmB,IAAI,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAAA,MACtD,EAAA;AAAA,MACA,iBAAA,EAAmB,IAAA;AAAA,MACnB,mBAAA,EAAqB,KAAK,KAAA,CAAM;AAAA,KAClC;AAAA,IACA,OAAO,IAAA,CAAK,GAAA,KAAQ,SAAS,EAAA,GAAK,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,IACxD,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAS,IAAA,CAAK,OAAA,GAAU,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,CAAA,UAAA,CAAA,GAAe,EAAA;AAAA,IAC/D,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,IAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAAA,IAClB,IAAA,EACE,KAAK,IAAA,CAAK,MAAA,GAAS,IACf,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,GAAA,CAAI,CAAC,MAAM,CAAA,iBAAA,EAAoB,IAAI,KAAK,CAAC,CAAA,UAAA,CAAY,EAAE,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA,GACnF,EAAA;AAAA,IACN,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,UAAA,EAAY,IAAA,KAAS,MAAA,GAAY,EAAA,GAAK;AAAA,GACxC;AACF;AAGO,IAAM,eAAe,CAAM,IAAA,KAAiC,YAAY,IAAA,EAAM,EAAE,CAAA,CAAE;;;AC7TlF,SAAS,mBAAwB,KAAA,EAAkC;AACxE,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,EAAa;AAC/B,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,IAClB,MAAA,EAAQ,MAAM,KAAA,CAAM,MAAA;AAAA,IACpB,QAAA,EAAU,IAAI,GAAA,CAAI,KAAA,CAAM,KAAK,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAO,GAAA,CAAI,IAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAC,CAAC,CAAA,GAAI,EAAG,CAAC,CAAA;AAAA;AAAA;AAAA,IAGpF,YAAY,KAAA,CAAM,OAAA;AAAA;AAAA,IAElB,IAAA,EAAM,MAAM,KAAA,CAAM;AAAA,GACpB;AACF;AAGO,SAAS,WAAgB,KAAA,EAA2B;AACzD,EAAA,OAAO,QAAQ,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,IAAA,EAAO,MAAM,SAAS,CAAA,CAAA;AAC3D;AAOO,SAAS,YAAA,CACd,OACA,MAAA,EACiD;AACjD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM;AAClC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA;AAC9B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,GAAG,CAAA;AACnC,IAAA,OAAO,EAAE,UAAA,KAAe,IAAA,IAAQ,UAAU,MAAA,GACtC,CAAC,EAAE,GAAA,EAAK,CAAA,CAAE,KAAK,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,EAAA,EAAI,IAC7D,EAAC;AAAA,EACP,CAAC,CAAA;AACH;AAGO,IAAM,OAAA,GACX;AAEF,IAAM,WAAA,GAAc,CAClB,EAAA,EACA,KAAA,EACA,WAAA,EACA,GAAA,EACA,IAAA,EACA,KAAA,KAEA,CAAA,YAAA,EAAe,UAAA,CAAW,EAAE,CAAC,CAAA,SAAA,EAAY,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,iCAAA,EAAoC,UAAA,CAAW,EAAE,CAAC,CAAA,SAAA,EAAY,GAAG,CAAA,EAAA,EAAK,IAAI,CAAA,cAAA,EAAiB,WAAW,CAAA,SAAA,EAAY,UAAA,CAAW,KAAK,CAAC,CAAA,GAAA,CAAA;AAOxL,SAAS,aAAA,CACd,KAAA,EACA,MAAA,GAAsC,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,MAAA,EAC7F;AACR,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,GAAG,EAAE,CAAA,OAAA,CAAA;AAAA,IACL,oBAAA;AAAA,IACA,QAAA;AAAA,IACA,oBAAA;AAAA,IACA,2BAAA;AAAA,IACA,MAAM,KAAA,CAAM;AAAA,GACd;AACA,EAAA,MAAM,SAAA,GAAY,aAAa,KAAA,EAAO,MAAM,EACzC,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACb,IAAA,MAAM,KAAA,GAAQ,CAAA,OAAA,EAAU,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA;AAC3C,IAAA,OAAO,WAAA;AAAA,MACL,CAAA,EAAG,EAAE,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA;AAAA,MACjB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,CAAA,iBAAA,EAAoB,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MACrC,CAAA,CAAE;AAAA,KACJ;AAAA,EACF,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,CAAA,0BAAA,EAA6B,MAAM,CAAA,EAAG,SAAS,CAAA,MAAA,CAAA;AACxD;AAOO,SAAS,YAAiB,KAAA,EAA2B;AAC1D,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,IAAI,uBAAA,GAA0B,EAAA;AAChE,EAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,QAAQ,KAAA,CAAM,SAAA,GAAY,IAAI,uBAAA,GAA0B,EAAA;AACjF,EAAA,OAAO,4JAA4J,IAAI,CAAA,wFAAA,EAAsF,WAAW,KAAK,CAAC,6FAA6F,IAAI,CAAA,sBAAA,CAAA;AACjX;AAGO,SAAS,iBAAA,CAAuB,KAAA,EAAmB,IAAA,GAAsB,EAAC,EAAW;AAC1F,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,GAAG,kBAAA,CAAmB,KAAK,GAAG,CAAA;AACvF,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,QAAA,KAAa,OAAO,iBAAA,GAAoB,EAAA,GAAK,YAAY,KAAK,CAAA;AACxF,EAAA,OAAO,QAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAA,EAAG,aAAA,CAAc,KAAA,EAAO,CAAA,CAAE,MAAM,CAAC,CAAA,wCAAA,EAA2C,SAAA,CAAU,CAAC,CAAC,CAAA,MAAA,EAAS,KAAK,CAAA;AAAA,GACxG;AACF;;;AC5GA,IAAM,QAAA,GAAW,uCAAA;AAGV,SAAS,OAAA,CAAa,OAAmB,MAAA,EAA2C;AAEzF,EAAA,MAAM,KAAK,MAAA,YAAkB,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA;AAClE,EAAA,MAAM,GAAA,GAAM,EAAA,KAAO,IAAA,GAAO,MAAA,GAAY,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,CAAa,UAAU,CAAC,CAAC,CAAA;AACpF,EAAA,MAAM,KAAK,GAAA,KAAQ,MAAA,GAAY,EAAA,GAAK,KAAA,CAAM,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAA,KAAO,KAAK,IAAA,GAAO,EAAA;AAC5B;AAWO,SAAS,UAAA,CAAgB,IAAA,EAAe,KAAA,EAAmB,EAAA,EAAyB;AACzF,EAAA,KAAA,MAAW,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,gBAAA,CAAiB,QAAQ,CAAC,CAAA,EAAG;AAC5D,IAAA,MAAM,GAAA,GAAM,EAAA,KAAO,IAAA,GAAO,MAAA,GAAY,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,CAAa,UAAU,CAAC,CAAC,CAAA;AACpF,IAAA,EAAA,CAAG,SAAA,CAAU,OAAO,YAAA,EAAc,GAAA,KAAQ,UAAa,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,KAAM,EAAE,CAAA;AAAA,EAChF;AACF;AAGO,SAAS,WAAA,CAAiB,OAAmB,MAAA,EAAkC;AACpF,EAAA,MAAM,KACJ,MAAA,YAAkB,OAAA,GAAU,MAAA,CAAO,OAAA,CAAqB,iCAAiC,CAAA,GAAI,IAAA;AAC/F,EAAA,IAAI,CAAC,EAAA,EAAI;AAEP,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AAChC,IAAA,IAAI,OAAO,IAAA,EAAM;AACjB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,cAAc,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,EAAE,CAAA;AACjC,IAAA,KAAA,CAAM,aAAa,IAAI,CAAA;AACvB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,EAAA,CAAG,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA,EAAQ;AACjD,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,YAAA,CAAa,eAAe,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,eAAe,CAAA;AAC5C,EAAA,IAAI,OAAA,KAAY,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,YAAY,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,OAAA,IAC1E,SAAS,MAAA,EAAQ,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,OAAA,IACnD,SAAS,MAAA,EAAQ,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA;AAC9D;AAGO,SAAS,WAAA,CAAiB,OAAmB,MAAA,EAAkC;AACpF,EAAA,IAAI,EAAE,kBAAkB,gBAAA,CAAA,EAAmB;AAC3C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,iBAAiB,CAAA;AACjD,EAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,GAAA,EAAK,OAAO,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA;AAAA,OAAA,IACvE,OAAO,YAAA,CAAa,wBAAwB,GAAG,KAAA,CAAM,eAAA,CAAgB,OAAO,KAAK,CAAA;AAC5F;AAGO,SAAS,WAAA,CAAiB,OAAmB,MAAA,EAAkC;AACpF,EAAA,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AACvC;AAGA,IAAM,QAAA,GAAW,CAAC,eAAA,EAAiB,iBAAA,EAAmB,0BAA0B,eAAe,CAAA;AAC/F,IAAM,SAAA,GAAY,iDAAA;AASX,SAAS,aAAa,EAAA,EAAyB;AACpD,EAAA,MAAM,IAAA,GAAO,GAAG,WAAA,EAAY;AAC5B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,IAAiB,EAAA,CAAG,aAAA,CAAc,aAAA;AACvD,EAAA,IAAI,OAAA,KAAY,QAAQ,CAAC,EAAA,CAAG,SAAS,OAAO,CAAA,SAAU,MAAM;AAAA,EAAC,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAC,CAAA;AACzD,EAAA,MAAM,QAAQ,IAAA,KAAS,MAAA,GAAY,IAAA,GAAO,OAAA,CAAQ,aAAa,IAAI,CAAA;AACnE,EAAA,MAAM,KAAA,GACJ,OAAA,YAAmB,gBAAA,GACf,EAAE,KAAA,EAAO,QAAQ,cAAA,EAAgB,GAAA,EAAK,OAAA,CAAQ,YAAA,EAAa,GAC3D,MAAA;AACN,EAAA,MAAM,KAAK,IAAA,KAAS,MAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,2CAA2C,CAAA,GAAI,IAAA;AAC/F,EAAA,MAAM,SAAS,EAAA,GACX;AAAA,IACE,GAAA,EAAK,EAAA,CAAG,aAAA,EAAe,YAAA,CAAa,UAAU,CAAA;AAAA,IAC9C,GAAA,EAAK,EAAA,CAAG,YAAA,CAAa,UAAU,CAAA;AAAA,IAC/B,CAAA,EAAG,MAAM,IAAA,CAAK,EAAA,CAAG,iBAAiB,SAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO;AAAA,GAC/D,GACA,MAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,IAAA,KAAS,MAAA,IAAa,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,GAAI,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA,GAAI,IAAA;AACjG,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1B,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,iBAA8B,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,IAAA;AAAA,QACrE,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,IAAI,CAAA,KAAM;AAAA,OAClC;AACA,MAAA,IAAA,EAAM,KAAA,EAAM;AACZ,MAAA,IAAI,gBAAgB,gBAAA,IAAoB,KAAA,EAAO,KAAA,IAAS,IAAA,IAAQ,MAAM,GAAA,IAAO,IAAA;AAC3E,QAAA,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,GAAG,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,gBAAA,CAA8B,QAAQ,CAAC,CAAA,CAClD,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,YAAA,CAAa,UAAU,CAAA,KAAM,GAAG,GAC7C,KAAA,EAAM;AAAA,IACZ,CAAA,MAAA,IAAW,MAAA,IAAU,MAAA,CAAO,CAAA,IAAK,CAAA,EAAG;AAClC,MAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,gBAAA,CAAiB,8BAA8B,CAAC,CAAA,CACvE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,UAAU,CAAA,KAAM,OAAO,GAAG,CAAA,EACpD,iBAAiB,cAAc,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,GAAA,IAAO,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,YAAA,CAAa,UAAU,CAAA,KAAM,OAAO,GAAG,CAAA;AACxF,MAAA,IAAA,EAAM,iBAA8B,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAA,EAAM;AAAA,IAClE;AAAA,EACF,CAAA;AACF;AAgCA,IAAM,IAAA,uBAAsC,GAAA,CAAI;AAAA,EAC9C,CAAC,KAAK,MAAM,CAAA;AAAA,EACZ,CAAC,KAAK,IAAI,CAAA;AAAA,EACV,CAAC,KAAK,MAAM,CAAA;AAAA,EACZ,CAAC,KAAK,OAAO,CAAA;AAAA,EACb,CAAC,KAAK,MAAM,CAAA;AAAA,EACZ,CAAC,KAAK,QAAQ,CAAA;AAAA,EACd,CAAC,aAAa,MAAM,CAAA;AAAA,EACpB,CAAC,WAAW,IAAI,CAAA;AAAA,EAChB,CAAC,aAAa,MAAM,CAAA;AAAA,EACpB,CAAC,cAAc,OAAO,CAAA;AAAA,EACtB,CAAC,SAAS,QAAQ,CAAA;AAAA,EAClB,CAAC,KAAK,QAAQ;AAChB,CAAC,CAAA;AAED,IAAM,OAAA,mBAA+B,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAC3E,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAsB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AA4BvE,SAAS,SAAA,CAAU,KAAa,CAAA,EAAiC;AACtE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACzB,EAAA,IAAI,IAAA,KAAS,UAAc,CAAC,CAAA,CAAE,WAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAI,OAAO,IAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkC,CAAA,KAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AAChF,EAAA,MAAM,MAAM,KAAA,CAAM,CAAA,CAAE,OAAO,GAAG,CAAA,GAAI,EAAE,MAAA,CAAO,GAAA,GAAM,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,SAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAC5F,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,MAAA,CAAO,GAAA;AAClC,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AAAA,IACL,KAAK,IAAA,EAAM;AACT,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,MAAA,IAAI,EAAA,GAAK,GAAG,OAAO,IAAA;AACnB,MAAA,MAAM,OAAO,CAAA,CAAE,OAAA,KAAY,IAAA,GAAO,GAAA,GAAM,EAAE,KAAA,CAAM,KAAA,CAAM,EAAA,IAAM,IAAA,KAAS,SAAS,CAAA,GAAI,EAAA,CAAA,EAAK,CAAA,CAAE,KAAA,CAAM,MAAM,CAAC,CAAA;AACtG,MAAA,OAAO,IAAA,KAAS,MAAA,GAAY,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,CAAA,CAAE,MAAA,CAAO,GAAA,EAAI;AAAA,IACpF;AAAA,IACA,KAAK,MAAA;AAAA,IACL,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,EAAE,OAAA,KAAY,IAAA,IAAQ,CAAC,CAAA,CAAE,OAAO,OAAO,IAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,KAAS,OAAA,GAAU,CAAA,GAAI,EAAA;AACpC,MAAA,MAAM,OAAO,GAAA,KAAQ,IAAA,GAAO,MAAA,GAAY,CAAA,CAAE,KAAK,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAC/F,MAAA,OAAO,IAAA,KAAS,SAAY,IAAA,GAAO,EAAE,MAAM,QAAA,EAAU,GAAA,EAAK,KAAK,IAAA,EAAK;AAAA,IACtE;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAA,GAAO,IAAA,GAAO,EAAE,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,IACnD,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,IAC1B,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,OAAA,KAAY,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA;AAAA;AAElF;AAGA,IAAM,UAAA,GAAa,wEAAA;AAkCZ,SAAS,aAAA,CAAmB,KAAA,EAAmB,IAAA,EAAe,CAAA,EAAwB;AAC3F,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,IAAI,CAAA,CAAE,oBAAoB,CAAA,CAAE,WAAA,IAAe,EAAE,OAAA,IAAW,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,MAAA,EAAQ;AAC/E,EAAA,IAAI,EAAE,CAAA,YAAa,OAAA,CAAA,IAAY,EAAE,OAAA,CAAQ,UAAU,MAAM,IAAA,EAAM;AAC/D,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAA8B,QAAQ,CAAC,CAAA;AACpE,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAA8B,iCAAiC,CAAC,CAAA;AAC9F,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAC/B,EAAA,MAAM,QAAQ,IAAA,KAAS,IAAA,IAAQ,KAAK,QAAA,CAAS,IAAI,IAAI,IAAA,GAAO,IAAA;AAC5D,EAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAChB,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAA,CAAE,GAAA,EAAK;AAAA,IAC9B,OAAA,EAAS,UAAU,IAAA,GAAO,IAAA,GAAO,OAAO,KAAA,CAAM,YAAA,CAAa,UAAU,CAAC,CAAA;AAAA,IACtE,OAAO,KAAA,KAAU,CAAA;AAAA,IACjB,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IACvB,IAAA,EAAM,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,YAAA,CAAa,eAAe,CAAA,IAAK,EAAE,CAAA;AAAA,IAC5D,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,YAAA,CAAa,UAAU,CAAC,CAAC,CAAA;AAAA,IACzD,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,WAAA,EAAa,OAAA,KAAY;AAAA,GAC9C,CAAA;AACD,EAAA,MAAM,MAAM,MAAA,EAAQ,IAAA,KAAS,WAAW,IAAA,CAAK,aAAA,CAA2B,0BAA0B,CAAA,GAAI,IAAA;AACtG,EAAA,IAAI,WAAW,IAAA,IAAS,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,QAAQ,IAAA,EAAO;AACnE,EAAA,CAAA,CAAE,cAAA,EAAe;AACjB,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU,GAAA,EAAK,KAAA,EAAM;AAAA,OAAA,IAChC,OAAO,IAAA,KAAS,MAAA;AACvB,IAAA,WAAA,CAAY,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA,CAAO,GAAG,CAAA,IAAK,IAAI,CAAA;AAAA,OAAA,IACrF,MAAA,CAAO,SAAS,QAAA,EAAU;AACjC,IAAA,IAAI,CAAC,CAAA,CAAE,MAAA,EAAQ,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,EACzC,CAAA,MAAO;AAEL,IAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,UAAU,CAAA,KAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,KAAA,EAAM;AAC3E,IAAA,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EACxC;AACF","file":"chunk-UCRLJGDL.js","sourcesContent":["// src/team-name.ts — sdvplot exports no sync name lookup (getLeagueSync is internal), so prepare() caches the names once.\nimport type { League } from \"@sportsdataverse/sdvplot\";\nimport { loadLeague } from \"@sportsdataverse/sdvplot\";\n\nconst NAMES = new Map<string, string>();\nexport async function loadTeamNames(leagues: readonly League[]): Promise<void> {\n await Promise.all(\n leagues.map(async (l) => {\n for (const t of (await loadLeague(l)).teams) if (t.name) NAMES.set(`${l}:${t.team_id}`, t.name);\n }),\n );\n}\n/** The team's name after prepare(); undefined before (alt text then falls back to the cell value). */\nexport function teamNameSync(league: League, teamId: string): string | undefined {\n return NAMES.get(`${league}:${teamId}`);\n}\n","// src/html/escape.ts\nimport { TableSpecError } from \"../errors.js\";\nconst MAP: Readonly<Record<string, string>> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\nexport const escapeHtml = (s: unknown): string =>\n String(s ?? \"\").replace(/[&<>\"']/g, (c) => MAP[c] as string);\nexport const escapeAttr: (s: unknown) => string = escapeHtml;\n/** What can end a CSS declaration, rule, string, attribute or element. */\nconst CSS_UNSAFE = /[;{}<>\"\\\\\\n\\r]/;\n/** True when `v` can sit in a CSS declaration value as is (the non-throwing check, for data). */\nexport const isCssValue = (v: unknown): boolean => !CSS_UNSAFE.test(String(v));\n/** A spec value bound for a CSS declaration (deco `<style>` rule or inline style): returned as is, or TableSpecError naming the field. */\nexport function cssValue(v: unknown, field: string): string {\n const s = String(v);\n if (CSS_UNSAFE.test(s))\n throw new TableSpecError(\n `${field} ${JSON.stringify(s)} is not a CSS value: it may not contain ; { } < > \" \\\\ or a line break`,\n );\n return s;\n}\n/** A spec number bound for CSS: a finite number (or numeric string), else TableSpecError naming the field; null and \"\" are rejected. */\nexport function checkPx(v: unknown, field: string): number {\n const n = typeof v === \"number\" ? v : typeof v === \"string\" && v.trim() !== \"\" ? Number(v) : Number.NaN;\n if (!Number.isFinite(n))\n throw new TableSpecError(`${field} must be a finite number, got ${JSON.stringify(v)}`);\n return n;\n}\n/** `{ \"background-color\": \"#fff\", \"font-size\": null }` → `background-color:#fff` (nulls dropped; values CSS-checked and escaped). Bare declarations, no `style=`. */\nexport function styleAttr(decl: Readonly<Record<string, string | number | null | undefined>>): string {\n return Object.entries(decl)\n .filter(([, v]) => v !== null && v !== undefined && v !== \"\")\n .map(([k, v]) => `${k}:${escapeAttr(cssValue(v, `CSS ${k}`))}`)\n .join(\";\");\n}\n/** The ONE place a `style=\"…\"` attribute is built: declaration lists joined with \";\" in order (later wins in CSS); \"\" when all are empty. */\nexport function styleOf(decls: readonly string[]): string {\n const s = decls.filter((x) => x !== \"\").join(\";\");\n return s ? ` style=\"${s}\"` : \"\";\n}\n","import type { GoogleFont } from \"../themes/tokens.js\";\n/** The Google Fonts css2 `<link>` for these faces (weights merged per family, families sorted); \"\" when there are none. */\nexport function fontsLink(fonts: readonly GoogleFont[]): string {\n const byFamily = new Map<string, Set<number>>();\n for (const f of fonts) {\n const set = byFamily.get(f.family) ?? new Set<number>();\n for (const w of f.weights) set.add(w);\n byFamily.set(f.family, set);\n }\n if (byFamily.size === 0) return \"\";\n const q = [...byFamily.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(\n ([fam, ws]) =>\n `family=${encodeURIComponent(fam).replace(/%20/g, \"+\")}:wght@${[...ws].sort((a, b) => a - b).join(\";\")}`,\n )\n .join(\"&\");\n return `<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?${q}&display=swap\">`;\n}\n","// src/table-id.ts — deterministic id from the spec (functions dropped by JSON.stringify, which is what we want).\n// JSON.stringify is key-order sensitive: the builder always emits one key order, so a built spec and its JSON round-trip share an id.\nimport type { TableSpec } from \"./spec.js\";\n\nexport function fnv1a32(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\nexport function tableId<Row>(spec: TableSpec<Row>): string {\n return spec.id ?? `sdvt-${fnv1a32(JSON.stringify(spec))}`;\n}\n","// src/themes/base-css.ts\nimport type { ThemeTokens } from \"./tokens.js\";\nimport { TOKEN_KEYS } from \"./tokens.js\";\nconst kebab = (s: string): string => s.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\nexport function tokensCSS(sel: string, t: ThemeTokens): string {\n return `${sel}{${TOKEN_KEYS.map((k) => `--sdvt-${kebab(k)}:${t[k]};`).join(\"\")}}`;\n}\nexport function BASE_CSS(sel: string): string {\n const s = sel;\n return [\n `${s}{display:inline-block;max-width:100%;background:var(--sdvt-bg);color:var(--sdvt-text);font-family:var(--sdvt-font-body);font-size:var(--sdvt-body-size);font-weight:var(--sdvt-body-weight);line-height:var(--sdvt-line-height)}`,\n // font:inherit: a host's table{font} (Observable Framework's 13px sans) outranks inheriting the root's type\n `${s} table{font:inherit;border-collapse:collapse;border-spacing:0;width:auto;border-top:var(--sdvt-table-border-top);border-bottom:var(--sdvt-table-border-bottom);border-left:var(--sdvt-table-border-x);border-right:var(--sdvt-table-border-x)}`,\n `${s} caption{caption-side:top;text-align:var(--sdvt-heading-align);background:var(--sdvt-heading-bg);padding:var(--sdvt-heading-pad) 5px}`,\n `${s} .sdvt-title{font-family:var(--sdvt-font-title);font-weight:var(--sdvt-title-weight);font-size:var(--sdvt-title-size);color:var(--sdvt-title-color);text-transform:var(--sdvt-title-transform);letter-spacing:var(--sdvt-title-tracking)}`,\n `${s} .sdvt-subtitle{display:block;font-size:var(--sdvt-subtitle-size);font-style:var(--sdvt-subtitle-style);font-weight:var(--sdvt-subtitle-weight);color:var(--sdvt-subtitle-color)}`, // great_tables draws the subtitle on its own heading row in every theme\n `${s} thead{position:relative}${s} thead::after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--sdvt-horizon)}`,\n `${s} th.sdvt-label{font-family:var(--sdvt-font-label);font-weight:var(--sdvt-label-weight);font-size:var(--sdvt-label-size);font-style:var(--sdvt-label-style);color:var(--sdvt-label-color);background:var(--sdvt-label-bg);text-transform:var(--sdvt-label-transform);letter-spacing:var(--sdvt-label-tracking);border-top:var(--sdvt-label-border-top);border-bottom:var(--sdvt-label-border-bottom);padding:var(--sdvt-label-pad) 5px;vertical-align:bottom}`,\n `${s} .sdvt-subheader{display:block;font-weight:400;font-size:0.8em;color:var(--sdvt-muted);text-transform:none;letter-spacing:normal}`,\n `${s} th.sdvt-group{font-family:var(--sdvt-font-label);font-weight:var(--sdvt-group-weight);font-size:var(--sdvt-group-size);color:var(--sdvt-group-color);background:var(--sdvt-group-bg);text-transform:var(--sdvt-group-transform);border-top:var(--sdvt-group-border-top);border-bottom:var(--sdvt-group-border-bottom);text-align:left;padding:var(--sdvt-group-pad) 5px}`,\n // A host's td{color} (Framework; Infima's --ifm-table-cell-color) outranks the ink a cell only inherits, so the\n // cell asks for it explicitly. inherit, not var(--sdvt-text): the row's ink is the theme's, or spotlight's dim on\n // the <tr>. ponytail: (0,1,0), the scope in :where(): beats any element-only host rule (td, table td), loses to an\n // author's class-qualified rule (.page td at (0,1,1)) and to every theme rule and inline cell style.\n `:where(${s}) .sdvt-cell{color:inherit}`,\n // Hosts paint rows: Infima stripes every second one (table tr:nth-child(2n), (0,1,2)) under cells that leave the\n // ground to the root, and Framework and Infima rule them. sdvtables' own sheets never colour or border a <tr>\n // (themes and decorations style cells; cutlines and watermarks are images; row decorations are inline), so rows\n // stay clear. ponytail: :nth-child(n) lifts this to (0,2,1), past that stripe whatever the stylesheet order.\n `${s} tr:nth-child(n){background-color:transparent;border:0}`,\n // Infima borders every cell (table th, table td { border }, (0,0,2)). ponytail: (0,1,1) clears that, and every\n // border sdvtables draws comes from a more specific rule or a later one (themes and decorations follow BASE_CSS)\n `${s} td,${s} th{border:0}`,\n `${s} td.sdvt-cell{padding:var(--sdvt-pad) 5px;border-top:var(--sdvt-hline);font-variant-numeric:tabular-nums;vertical-align:middle}`,\n `${s} tbody tr:first-child td.sdvt-cell{border-top:none}${s} tbody{border-bottom:var(--sdvt-body-border-bottom)}`,\n // background-color, not the `background` shorthand: the shorthand would reset the hovered row's underline image\n `${s} tr.sdvt-stripe td.sdvt-cell{background-color:var(--sdvt-stripe)}`,\n `${s} .sdvt-left{text-align:left}${s} .sdvt-center{text-align:center}${s} .sdvt-right{text-align:right}`,\n `${s} tfoot td{font-size:var(--sdvt-source-size);font-style:var(--sdvt-source-style);color:var(--sdvt-source-color);padding:var(--sdvt-source-pad) 5px;text-align:left}`,\n `${s} img.sdvt-mark{vertical-align:middle}`,\n `${s} img{max-width:none}`, // A47: a host img{max-width:100%} reset (Docusaurus, Tailwind preflight) squashed cell logos\n `${s} table{--bs-table-bg:transparent;--bs-table-color:currentcolor}`, // utils-theme.R .theme_bs_host: Bootstrap hosts repaint td\n // Phase 5 controls: renderHTML(table), hydrate and <SdvTable/> (the last rule is J31 A5, a neutral selected-row overlay)\n `${s} .sdvt-sort{all:unset;cursor:pointer;display:inline-block;width:100%}`,\n `${s} .sdvt-sort:focus-visible{outline:2px solid currentColor;outline-offset:2px}`, // all:unset drops the UA focus ring (WCAG 2.4.7)\n // the arrow repeats aria-sort, so its alt text is empty (kept out of the button name); the plain declaration is the fallback\n `${s} th[aria-sort=\"ascending\"] .sdvt-sort::after{content:\" ▲\";content:\" ▲\"/\"\";font-size:.7em}`,\n `${s} th[aria-sort=\"descending\"] .sdvt-sort::after{content:\" ▼\";content:\" ▼\"/\"\";font-size:.7em}`,\n `${s} .sdvt-toolbar{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}`,\n // I4 (WCAG 1.4.11): the theme's rule taken 60% of the way to the text colour, 3:1 or better on the table background\n // in every theme (a black or ink rule stays itself); where color-mix is unsupported, the text colour\n `${s} .sdvt-toolbar input{font:inherit;padding:2px 6px;border:1px solid var(--sdvt-text);border-color:color-mix(in srgb,var(--sdvt-text) 60%,var(--sdvt-rule));background:var(--sdvt-bg);color:var(--sdvt-text)}`,\n `${s} .sdvt-pager{display:flex;gap:8px;align-items:center;justify-content:flex-end;margin-top:6px}`,\n `${s} .sdvt-page{font:inherit;cursor:pointer}`,\n `${s} .sdvt-page[aria-disabled=\"true\"]{opacity:.4;cursor:default}`, // M1: aria-disabled, so focus stays on an edge button\n `${s} tr.sdvt-selected>td{box-shadow:inset 0 0 0 9999px rgba(127,127,127,.18)}`,\n `${s} tr.sdvt-selected>td:first-child{box-shadow:inset 3px 0 0 var(--sdvt-text),inset 0 0 0 9999px rgba(127,127,127,.18)}`, // I4: the tint is 1.2:1; a text-coloured bar gives the state 3:1\n // J31 (A29): a hovered row (its own pointer, or a linked figure's) gets a text-coloured underline, 3:1 like I4's bar.\n // A background image: it sits beside the selected overlay (box-shadow) and moves no layout. The scope and the row\n // sit in :where(), so the rule weighs (0,1,1), td.sdvt-cell alone: the documented one-rule opt-out\n // tr.sdvt-hover>td.sdvt-cell{background-image:none}, at (0,2,2), wins wherever a page puts it\n `:where(${s} tr.sdvt-hover)>td.sdvt-cell{background-image:linear-gradient(var(--sdvt-text),var(--sdvt-text));background-size:100% 2px;background-position:0 100%;background-repeat:no-repeat}`,\n `${s} tr.sdvt-row:focus-visible{outline:2px solid currentColor;outline-offset:-2px}`, // Task 10: the grid's tab stop (WCAG 2.4.7)\n `${s} th.sdvt-col-current .sdvt-sort{text-decoration:underline;text-underline-offset:4px}`, // Task 10: the column `s` sorts\n ].join(\"\\n\");\n}\n","// src/scale.ts — ports of sdvplot Python great_tables/_cells.py `_ramp` / `_ranks` and _layout.py `_quantile`.\nimport { mix } from \"@sportsdataverse/sdvplot\";\nimport { TableSpecError } from \"./errors.js\";\n\n/** Python `_ramp` (_cells.py:1027-1048): piecewise-linear sRGB over evenly spaced stops, as great_tables `data_color`; null outside the domain. */\nexport function ramp(\n palette: readonly string[],\n [lo, hi]: readonly [number, number],\n): (v: number) => string | null {\n const k = palette.length - 1;\n return (v) => {\n if (!(lo <= v && v <= hi)) return null;\n if (k === 0) return palette[0] ?? null;\n const t = hi === lo ? 0.5 : (v - lo) / (hi - lo);\n const i = Math.min(Math.floor(t * k), k - 1);\n return mix(palette[i] as string, palette[i + 1] as string, t * k - i);\n };\n}\n\n/** Python `_ranks` (_cells.py:1051-1066): R rank(ties = \"average\", na.last = \"keep\") ascending; desc flips it as top − r + 1, top = the largest rank. */\nexport function averageRanks(values: readonly (number | null)[], desc: boolean): (number | null)[] {\n const idx = values\n .map((v, i) => [v, i] as const)\n .filter((p): p is readonly [number, number] => p[0] !== null)\n .sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n const out: (number | null)[] = values.map(() => null);\n for (let s = 0; s < idx.length; ) {\n let e = s;\n while (e + 1 < idx.length && idx[e + 1]?.[0] === idx[s]?.[0]) e++;\n const r = (s + e) / 2 + 1;\n for (let j = s; j <= e; j++) out[idx[j]?.[1] as number] = r;\n s = e + 1;\n }\n if (!desc || idx.length === 0) return out;\n let top = 0;\n for (const r of out) if (r !== null && r > top) top = r;\n return out.map((r) => (r === null ? null : top - r + 1));\n}\n\nexport function domainOf(columns: readonly (readonly (number | null)[])[]): [number, number] {\n let lo = Number.POSITIVE_INFINITY;\n let hi = Number.NEGATIVE_INFINITY;\n for (const col of columns)\n for (const v of col)\n if (v !== null) {\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n if (lo > hi) throw new TableSpecError(\"no domain given and no numeric value to derive one from\");\n return [lo, hi];\n}\n\n/** Python `_quantile` (_layout.py:1159): R type-7 quantile. */\nexport function quantile7(xs: readonly number[], p: number): number {\n const s = [...xs].sort((a, b) => a - b);\n const h = (s.length - 1) * p;\n const lo = Math.floor(h);\n return (s[lo] as number) + (h - lo) * ((s[Math.min(lo + 1, s.length - 1)] as number) - (s[lo] as number));\n}\n\nexport function sampleSd(xs: readonly number[]): number {\n const m = xs.reduce((a, b) => a + b, 0) / xs.length;\n return Math.sqrt(xs.reduce((a, b) => a + (b - m) ** 2, 0) / (xs.length - 1));\n}\n","// src/html/cells.ts — Task 5 version: the context types + dispatcher + text; Tasks 6–8 add the other kinds in this file\nimport {\n contrast,\n headshotUrl,\n hex6,\n logoUrlSync,\n mix,\n onColor,\n resolveSync,\n solid,\n teamColorsSync,\n} from \"@sportsdataverse/sdvplot\";\nimport { TableSpecError } from \"../errors.js\";\nimport { formatNumber, formatValue, isBlank, naturalDigits, ordinal, toNumber } from \"../format.js\";\nimport { matches } from \"../predicate.js\";\nimport { averageRanks, domainOf, ramp } from \"../scale.js\";\nimport type { ColumnSpec, TableSpec } from \"../spec.js\";\nimport { teamNameSync } from \"../team-name.js\";\nimport type { Theme } from \"../themes/tokens.js\";\nimport { checkPx, cssValue, escapeAttr, escapeHtml, styleAttr } from \"./escape.js\";\n/** One scaled column (pills, ranks, percentile), computed once per column by Task 8's columnScales. */\nexport interface ColumnScale {\n readonly domain: readonly [number, number];\n readonly palette: readonly string[];\n readonly reverse: boolean;\n readonly values: readonly (number | null)[];\n readonly color: (v: number) => string | null;\n /** colorPills: the widest label in `ch`, computed once per column (gt_color_pills); 1 otherwise. */\n readonly labelWidth: number;\n}\n/** Decided once here; Tasks 7, 8 and 10 fill the maps (index.ts passes them empty until then). */\nexport interface RenderContext<Row> {\n readonly spec: TableSpec<Row>;\n readonly rows: readonly Row[];\n /** J31 (A4): the rows scale and legend domains come from (`RenderOptions.domainRows`, default `rows`). */\n readonly domainRows: readonly Row[];\n readonly theme: Theme;\n readonly id: string;\n readonly sel: string;\n readonly columns: readonly ColumnSpec<Row>[];\n readonly groupKey: string | undefined;\n readonly warn: (key: string, message: string) => void;\n /** Task 7: team ids per team column, ONE resolveSync per column (J28), keyed by the column key. */\n readonly teamIds: ReadonlyMap<string, readonly (string | undefined)[]>;\n /** Task 8: scales per pills/ranks/percentile column, keyed by column key. */\n readonly scales: ReadonlyMap<string, ColumnScale>;\n /** Task 8: the last scale in column order — what gt_legend_continuous reads back as `_sdvplot_scale`. */\n readonly recorded: ColumnScale | undefined;\n /** Task 10: scaleNote divisor + decimals per num/int column; applyDecorations fills it before the row loop. */\n readonly scaled: Map<string, { readonly divisor: number; readonly decimals: number }>;\n}\nexport const cellValue = <Row>(row: Row, key: string): unknown => (row as Record<string, unknown>)[key];\n/** Cell text: null/undefined/NaN/blank string render empty, never \"NaN\". */\nconst blankOr = (v: unknown): string => (isBlank(v) ? \"\" : escapeHtml(v));\nconst tableBg = <Row>(ctx: RenderContext<Row>): string =>\n ctx.theme.tokens.bg === \"transparent\" ? \"#ffffff\" : hex6(ctx.theme.tokens.bg);\n\n// ---- Task 7 helpers\nexport function markImg(src: string, alt: string, heightPx: number, teamId?: string): string {\n return `<img class=\"sdvt-mark\" src=\"${escapeAttr(src)}\" alt=\"${escapeAttr(alt)}\" style=\"height:${heightPx}px\"${teamId ? ` data-sdvplot-team=\"${escapeAttr(teamId)}\"` : \"\"}>`;\n}\n/** sdvplotR sdv_readable_ink() = Python readable_ink (_marks.py:373-386): primary, else secondary, else primary blended toward onColor(bg), weights 0.95 -> 0. */\nexport function readableInk(\n primary: string,\n secondary: string | undefined,\n background: string,\n target = 4.5,\n): string {\n const toward = onColor(background);\n for (const c of [primary, secondary]) if (c !== undefined && contrast(c, background) >= target) return c;\n for (let i = 0; i < 20; i++) {\n const c = mix(toward, primary, Math.max(0.95 + i * -0.05, 0)); // R seq(0.95, 0, by = -0.05), unrounded\n if (contrast(c, background) >= target) return c;\n }\n return toward;\n}\nfunction checkHeight(h: number, kind: string): number {\n if (!(Number.isFinite(h) && h >= 1))\n throw new TableSpecError(`${kind} height must be a number of pixels >= 1, got ${String(h)}`);\n return h;\n}\n/** ONE resolveSync per team-aware column (J28: one warning per call listing every unresolved value; strict throws once). */\nexport function teamIdsOf<Row>(\n spec: TableSpec<Row>,\n rows: readonly Row[],\n): Map<string, (string | undefined)[]> {\n const out = new Map<string, (string | undefined)[]>();\n for (const c of spec.columns) {\n if (\n c.kind !== \"logo\" &&\n c.kind !== \"wordmark\" &&\n c.kind !== \"mergeStackTeamColor\" &&\n c.kind !== \"teamColorBar\" &&\n c.kind !== \"teamColorBg\"\n )\n continue;\n const from = c.kind === \"mergeStackTeamColor\" ? c.team : c.key;\n const values = rows.map((r) => {\n const v = cellValue(r, from);\n return isBlank(v) ? null : String(v).trim(); // the raw value, never the escaped one (Review Focus 1)\n });\n out.set(\n c.key,\n resolveSync(values, c.league, {\n ...(c.season !== undefined ? { season: c.season } : {}),\n ...(c.idSystem ? { idSystem: c.idSystem } : {}),\n strict: c.strict ?? false,\n }),\n );\n }\n return out;\n}\n\ntype PillsCol = Pick<\n Extract<ColumnSpec<never>, { kind: \"colorPills\" }>,\n \"formatType\" | \"scalePercent\" | \"digits\" | \"suffix\"\n>;\nconst pillLabel = (col: PillsCol, v: number | null): string =>\n formatValue(\n v !== null && col.formatType === \"percent\" && col.scalePercent ? v * 100 : v,\n col.digits,\n col.formatType,\n col.suffix,\n );\ntype HighlightNaCol = Extract<ColumnSpec<never>, { kind: \"highlightNa\" }>;\nconst isNa = (col: HighlightNaCol, v: unknown): boolean =>\n isBlank(v) ||\n col.naStrings.some((n) => (col.ignoreCase ? n.toLowerCase() === String(v).toLowerCase() : n === String(v)));\n\n/** The column kinds `columnScales` computes a scale for. */\nexport const isScaled = <Row>(\n col: ColumnSpec<Row>,\n): col is Extract<ColumnSpec<Row>, { kind: \"colorPills\" | \"colorRanks\" | \"percentileBar\" }> =>\n col.kind === \"colorPills\" || col.kind === \"colorRanks\" || col.kind === \"percentileBar\";\n/** One pass per scaled column (pills, ranks, percentile): numbers, ranks, domain, ramp — gt computes these per column, not per cell. */\nexport function columnScales<Row>(\n spec: TableSpec<Row>,\n rows: readonly Row[],\n warnFn: (key: string, m: string) => void,\n domainRows: readonly Row[] = rows,\n): Map<string, ColumnScale> {\n // J31 (A4): domain, ranks and the out-of-domain count come from domainRows; `values` and pill widths follow `rows`\n const at = domainRows === rows ? null : new Map(domainRows.map((r, j) => [r, j] as const));\n const missing = at !== null && rows.some((r) => !at.has(r));\n const out = new Map<string, ColumnScale>();\n for (const col of spec.columns) {\n if (!isScaled(col)) continue;\n if (missing)\n warnFn(\n `sdvtables:domainRows:${col.key}`,\n `column \"${col.key}\": a rendered row is not in domainRows (matched by identity, not by value), so it is colored from its own value (a rank fill: not at all); pass the same row objects as rows`,\n );\n // zero rows: no domain to derive, nothing to color. Phase 4's throw for an all-null NON-empty column stays (domainOf).\n if (col.domain === undefined && domainRows.length === 0) continue;\n const nums = domainRows.map((r) => toNumber(cellValue(r, col.key)));\n let values: (number | null)[] = nums;\n let own = (n: number | null): number | null => n; // a rendered row's value when it is not in domainRows (I2)\n if (col.kind === \"colorPills\" && col.fillType === \"rank\") {\n values = averageRanks(nums, col.rankOrder === \"desc\");\n own = () => null; // a rank exists only within domainRows\n }\n if (col.kind === \"percentileBar\") {\n const present = nums.filter((n): n is number => n !== null);\n const [lo, hi] = col.domain;\n const scale = col.scale;\n // _layout.py:772-779,806: numeric scale multiplies; \"auto\" maps proportions only when every value is in [0, 1] and hi > 1\n const proportion =\n scale === \"auto\" && present.length > 0 && present.every((n) => n >= 0 && n <= 1) && hi > 1;\n own = (n) =>\n n === null ? null : typeof scale === \"number\" ? n * scale : proportion ? lo + n * (hi - lo) : n;\n values = nums.map(own);\n }\n const domain: readonly [number, number] = col.domain ?? domainOf([values]);\n const fmt = (): string => `(${naturalDigits(domain[0])} to ${naturalDigits(domain[1])})`;\n if (col.kind === \"colorPills\" && col.domain === undefined)\n warnFn(\n `sdvtables:domain:${col.key}:${domain.join(\",\")}`,\n `no domain given, so the colors span the observed range ${fmt()}; set domain to compare colors across tables or columns`,\n ); // _cells.py:1197-1201\n const palette = col.palette.map((c) => hex6(c));\n const color = ramp(col.reverse ? [...palette].reverse() : palette, domain);\n const outside = values.filter((v) => v !== null && color(v) === null).length;\n if (col.kind === \"colorPills\" && outside > 0)\n warnFn(\n `sdvtables:outside:${col.key}:${outside}:${domain.join(\",\")}`,\n `${outside} value(s) fall outside the domain ${fmt()} and are drawn grey`,\n ); // _cells.py:1226-1227\n const shown =\n at === null\n ? values\n : rows.map((r) => {\n const j = at.get(r);\n return j === undefined ? own(toNumber(cellValue(r, col.key))) : (values[j] ?? null);\n });\n const shownNums = at === null ? nums : rows.map((r) => toNumber(cellValue(r, col.key)));\n const labelWidth =\n col.kind === \"colorPills\" ? Math.max(1, ...shownNums.map((n) => pillLabel(col, n).length)) : 1;\n out.set(col.key, { domain, palette, reverse: col.reverse, values: shown, color, labelWidth });\n }\n return out;\n}\n\nexport function renderCell<Row>(col: ColumnSpec<Row>, row: Row, i: number, ctx: RenderContext<Row>): string {\n switch (col.kind) {\n case \"text\":\n case \"colorResults\": // colorResults fills its row (decorations.ts, Task 9); the cell is its text\n return blankOr(cellValue(row, col.key));\n // ---- Task 6\n case \"num\":\n case \"int\": {\n const n = toNumber(cellValue(row, col.key));\n if (n === null) return \"\";\n const sc = ctx.scaled.get(col.key); // scaleNote (Task 10): Python fmt_number(scale_by = 1/divisor, decimals) replaces the column's own format\n if (sc) return escapeHtml(formatNumber(n / sc.divisor, { digits: sc.decimals, big: true }));\n return escapeHtml(\n col.kind === \"int\"\n ? formatNumber(n, { digits: 0, big: true })\n : formatNumber(n, {\n ...(col.digits !== undefined ? { digits: col.digits } : {}),\n big: col.big ?? false,\n prefix: col.prefix ?? \"\",\n suffix: col.suffix ?? \"\",\n forceSign: col.forceSign ?? false,\n }),\n );\n }\n case \"pct\": {\n const n = toNumber(cellValue(row, col.key));\n return n === null\n ? \"\"\n : escapeHtml(`${formatNumber(col.scale ? n * 100 : n, { digits: col.digits })}%`);\n }\n case \"rank\": {\n const n = toNumber(cellValue(row, col.key));\n if (n === null) return \"\";\n const o = ordinal(n);\n const num = String(Math.trunc(n));\n return col.superscript\n ? `${num}<sup style=\"font-size:${escapeAttr(cssValue(col.suffixSize, \"rank suffixSize\"))}\">${o.slice(num.length)}</sup>`\n : escapeHtml(o);\n }\n case \"delta\": {\n const a = toNumber(cellValue(row, col.key));\n const b = toNumber(cellValue(row, col.to));\n if (a === null || b === null) return \"\";\n const d = col.percent ? (a === 0 ? null : (b - a) / a) : b - a;\n if (d === null || !Number.isFinite(d)) return \"\";\n const shown = col.arrows ? Math.abs(d) : d;\n const text = `${col.arrows ? (d > 0 ? \"▲ \" : d < 0 ? \"▼ \" : \"\") : \"\"}${formatNumber(col.percent ? shown * 100 : shown, { digits: col.decimals, forceSign: col.forceSign && !col.arrows })}${col.percent ? \"%\" : \"\"}`;\n const color = !col.color\n ? null\n : d > 0\n ? col.colorPositive\n : d < 0\n ? col.colorNegative\n : (col.colorNeutral ?? null);\n return color\n ? `<span style=\"color:${escapeAttr(cssValue(color, \"delta color\"))}\">${escapeHtml(text)}</span>`\n : escapeHtml(text);\n }\n case \"tally\": {\n const ns = col.keys.map((k) => toNumber(cellValue(row, k)));\n if (ns.some((n) => n === null)) {\n const v = cellValue(row, col.key);\n return blankOr(v);\n }\n const xs = ns as number[];\n if (col.share && !(Number.isInteger(col.shareOf) && col.shareOf >= 0 && col.shareOf < xs.length))\n throw new TableSpecError(`tally shareOf must index (from 0) one of ${col.keys.join(\", \")}`);\n const text = xs.map((n) => naturalDigits(n)).join(col.separator);\n const total = xs.reduce((s, n) => s + n, 0);\n if (!col.share || total === 0) return escapeHtml(text);\n return escapeHtml(\n `${text}${col.sharePrefix}${formatNumber(((xs[col.shareOf] ?? 0) / total) * 100, { digits: col.shareDecimals })}%${col.shareSuffix}`,\n );\n }\n // ---- Task 7\n case \"logo\":\n case \"wordmark\": {\n const raw = cellValue(row, col.key);\n const text = blankOr(raw);\n const id = ctx.teamIds.get(col.key)?.[i];\n if (id === undefined) return text; // blank or unknown: text kept; the column's one resolveSync already warned (J28)\n const url = logoUrlSync(id, col.league, {\n ...(col.season !== undefined ? { season: col.season } : {}),\n ...(col.variant ? { variant: col.variant } : {}),\n markType: col.kind,\n idSystem: \"team_id\",\n });\n if (!url) return text; // no mark of that type archived (sdvplot warns once)\n return (\n markImg(url, teamNameSync(col.league, id) ?? String(raw), checkHeight(col.height, col.kind), id) +\n (col.kind === \"logo\" && col.includeName ? text : \"\")\n );\n }\n case \"headshot\": {\n const raw = cellValue(row, col.key);\n if (isBlank(raw)) return \"\";\n const url = headshotUrl(String(raw).trim(), col.league, { idSystem: col.idSystem });\n return url ? markImg(url, String(raw).trim(), checkHeight(col.height, \"headshot\")) : blankOr(raw);\n }\n case \"mergeStackTeamColor\": {\n // gt_merge_stack_team_color (_marks.py:451-475): two divs; the bottom in the team's readable color, #bebebe when unresolved\n const id = ctx.teamIds.get(col.key)?.[i];\n const bg = col.background ? solid(col.background) : tableBg(ctx);\n const p = id === undefined ? undefined : teamColorsSync(col.league, id, { idSystem: \"team_id\" });\n const s =\n id === undefined\n ? undefined\n : teamColorsSync(col.league, id, { which: \"secondary\", idSystem: \"team_id\" });\n const ink = readableInk(p ?? \"#bebebe\", s, bg);\n return `<div style=\"line-height:${col.fontSizeTop - 2}px\"><span style=\"${styleAttr({ \"font-weight\": \"bold\", \"font-variant\": \"small-caps\", color: col.color, \"font-size\": `${col.fontSizeTop}px` })}\">${blankOr(cellValue(row, col.key))}</span></div>\\n<div style=\"line-height:${col.fontSizeBottom - 2}px\"><span style=\"${styleAttr({ \"font-weight\": \"bold\", color: ink, \"font-size\": `${col.fontSizeBottom}px` })}\">${blankOr(cellValue(row, col.stack))}</span></div>`;\n }\n case \"teamColorBar\":\n case \"teamColorBg\":\n return blankOr(cellValue(row, col.key)); // the color lives on the <td> (kindCellStyle)\n // ---- Task 8\n case \"colorPills\": {\n // gt_color_pills (_cells.py:1203-1225)\n const sc = ctx.scales.get(col.key);\n if (!sc) return \"\";\n const pillHeight = checkPx(col.pillHeight, \"colorPills pillHeight\");\n const outlineWidth = checkPx(col.outlineWidth, \"colorPills outlineWidth\");\n const s = sc.values[i] ?? null;\n const width = sc.labelWidth;\n let fill: string;\n let text: string;\n if (s === null) {\n if (col.naColor === undefined) return \"\";\n fill = col.naColor;\n text = \"\";\n } else {\n fill = sc.color(s) ?? \"#808080\";\n text = pillLabel(col, toNumber(cellValue(row, col.key)));\n }\n const ink = col.textColor ?? onColor(solid(fill, tableBg(ctx)));\n const outline =\n col.outlineColor !== undefined\n ? `;border:${outlineWidth}px solid ${escapeAttr(cssValue(col.outlineColor, \"colorPills outlineColor\"))}`\n : \"\";\n return `<span style=\"display:inline-block;width:${width}ch;padding-left:3px;padding-right:3px;height:${pillHeight}px;line-height:${pillHeight}px;background-color:${escapeAttr(cssValue(fill, \"colorPills naColor\"))};color:${escapeAttr(cssValue(ink, \"colorPills textColor\"))};border-radius:10px;text-align:center${outline}\">${escapeHtml(text)}</span>`;\n }\n case \"colorRanks\":\n case \"highlight\":\n return blankOr(cellValue(row, col.key)); // the fill lives on the <td> (kindCellStyle)\n case \"highlightNa\":\n return isNa(col, cellValue(row, col.key))\n ? escapeHtml(col.missingText ?? \"\")\n : blankOr(cellValue(row, col.key));\n case \"percentileBar\": {\n const sc = ctx.scales.get(col.key);\n const v = sc?.values[i] ?? null;\n const th = checkPx(col.trackHeight, \"percentileBar trackHeight\");\n const m = checkPx(col.markerSize, \"percentileBar markerSize\");\n const fontSize = col.fontSize === undefined ? m / 2 : checkPx(col.fontSize, \"percentileBar fontSize\");\n const ringWidth = checkPx(col.ringWidth, \"percentileBar ringWidth\");\n const trackColor = escapeAttr(cssValue(col.trackColor, \"percentileBar trackColor\"));\n const textColor = escapeAttr(cssValue(col.textColor, \"percentileBar textColor\"));\n if (sc === undefined || v === null) {\n // broken track: flex, so no `left:` anywhere\n const seg = `<div style=\"flex:1;height:${th}px;background:${escapeAttr(cssValue(col.naTrackColor ?? col.trackColor, \"percentileBar naTrackColor\"))};border-radius:${th}px\"></div>`;\n return `<div class=\"sdvt-pbar\" style=\"display:flex;align-items:center;height:${m}px;width:100%\">${seg}<span style=\"margin:0 6px;color:${escapeAttr(cssValue(col.naTextColor, \"percentileBar naTextColor\"))};font-size:${fontSize}px\">${escapeHtml(col.naLabel ?? \"\")}</span>${seg}</div>`;\n }\n const [lo, hi] = sc.domain;\n const clamped = Math.min(hi, Math.max(lo, v));\n const p = Number((hi === lo ? 50 : ((clamped - lo) / (hi - lo)) * 100).toFixed(4));\n const color = sc.color(clamped) ?? trackColor; // ramp output is hex\n const track = `<div style=\"position:absolute;top:50%;left:0;right:0;height:${th}px;margin-top:-${th / 2}px;background:${trackColor};border-radius:${th}px\"></div>`;\n const fill = col.fullTrack\n ? \"\"\n : `<div style=\"position:absolute;top:50%;left:0;width:${p}%;height:${th}px;margin-top:-${th / 2}px;background:${color};border-radius:${th}px\"></div>`;\n const ring =\n col.ringColor !== undefined\n ? `;box-shadow:0 0 0 ${ringWidth}px ${escapeAttr(cssValue(col.ringColor, \"percentileBar ringColor\"))}`\n : \"\";\n const marker = `<div style=\"position:absolute;top:0;left:${p}%;margin-left:-${m / 2}px;width:${m}px;height:${m}px;border-radius:50%;background:${color};color:${textColor};font-size:${fontSize}px;line-height:${m}px;text-align:center;font-weight:700;letter-spacing:-0.02em${ring}\">${escapeHtml(formatValue(v, col.decimals, \"number\", \"\"))}</div>`;\n return `<div class=\"sdvt-pbar\" style=\"position:relative;height:${m}px;width:100%\">${track}${fill}${marker}</div>`;\n }\n case \"indicatorBox\": {\n // gt_indicator_boxes (_cells.py:1428-1449): box only (no show_text in Phase 4)\n const on = col.truthy.includes(cellValue(row, col.key));\n if ((col.showOnly === \"filled\" && !on) || (col.showOnly === \"neutral\" && on)) return \"\";\n return `<span style=\"${styleAttr({ display: \"inline-block\", width: `${col.size}px`, height: `${col.size}px`, \"background-color\": on ? col.fill : col.neutral, \"vertical-align\": \"middle\", margin: \"4px 1px\" })}\"></span>`;\n }\n case \"image\": {\n const v = cellValue(row, col.key);\n if (isBlank(v)) return \"\";\n const alt = col.alt ? cellValue(row, col.alt) : \"\";\n return markImg(\n String(v),\n isBlank(alt) ? \"\" : String(alt),\n checkHeight(Number.parseFloat(col.height), \"image\"),\n );\n }\n default: {\n const bad: never = col;\n throw new TableSpecError(`unknown column kind ${String((bad as { kind: string }).kind)}`); // exhaustive over the 21 kinds\n }\n }\n}\n/** Bare `prop:value` declarations a column kind puts on its own `<td>` (Task 7 team colors; Task 8 colorRanks/highlight/highlightNa); \"\" otherwise. */\nexport function kindCellStyle<Row>(\n col: ColumnSpec<Row>,\n row: Row,\n i: number,\n ctx: RenderContext<Row>,\n): string {\n switch (col.kind) {\n case \"teamColorBar\":\n case \"teamColorBg\": {\n // reactable_sdv_team_color_bar/_bg\n const id = ctx.teamIds.get(col.key)?.[i];\n const color =\n (id === undefined\n ? undefined\n : teamColorsSync(col.league, id, { which: col.which, idSystem: \"team_id\" })) ?? col.naColor;\n if (col.kind === \"teamColorBar\")\n return styleAttr({ \"border-left\": `${col.barWidth}px solid ${color}` });\n const a = Math.round(Math.min(1, Math.max(0, col.alpha)) * 255)\n .toString(16)\n .padStart(2, \"0\");\n return styleAttr({ \"background-color\": `${hex6(color, { dropAlpha: true })}${a}` }); // scales::alpha(): replace any alpha the color had\n }\n case \"colorRanks\": {\n // data_color on the <td>; null or outside the domain -> na_color \"white\" (gt_color_ranks default)\n const sc = ctx.scales.get(col.key);\n const s = sc?.values[i] ?? null;\n const fill = (s === null ? null : sc?.color(s)) ?? \"#ffffff\";\n return styleAttr({ \"background-color\": fill, color: onColor(solid(fill, tableBg(ctx))) });\n }\n case \"highlight\":\n return matches(col.when, row)\n ? styleAttr({\n \"background-color\": col.fill,\n color: col.textColor,\n \"font-weight\": col.bold ? \"bold\" : undefined,\n })\n : \"\";\n case \"highlightNa\":\n return isNa(col, cellValue(row, col.key))\n ? styleAttr({\n \"background-color\": col.fill,\n color: col.textColor,\n \"font-weight\": col.bold ? \"bold\" : undefined,\n \"font-style\": col.italic ? \"italic\" : undefined,\n })\n : \"\";\n default:\n return \"\";\n }\n}\n","// src/html/social-icons.ts - Font Awesome Free 6 brand/solid icons (https://fontawesome.com, CC BY 4.0; see NOTICE.md).\n// Platform keys and aliases follow Python _SOCIAL (_layout.py:1525-1538); every icon keeps its own viewBox width (not all 512).\n// Paths: faicons 0.2.2 (the Python dependency) for instagram, github, youtube, facebook, globe, envelope; Font Awesome Free 6.7.2 for x-twitter and bluesky,\n// which faicons 0.2.2 predates (Python falls back to the twitter bird for X and raises for bluesky).\nconst X =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z\"/></svg>';\nconst IG =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z\"/></svg>';\nconst BSKY =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M111.8 62.2C170.2 105.9 233 194.7 256 242.4c23-47.6 85.8-136.4 144.2-180.2c42.1-31.6 110.3-56 110.3 21.8c0 15.5-8.9 130.5-14.1 149.2C478.2 298 412 314.6 353.1 304.5c102.9 17.5 129.1 75.5 72.5 133.5c-107.4 110.2-154.3-27.6-166.3-62.9l0 0c-1.7-4.9-2.6-7.8-3.3-7.8s-1.6 3-3.3 7.8l0 0c-12 35.3-59 173.1-166.3 62.9c-56.5-58-30.4-116 72.5-133.5C100 314.6 33.8 298 15.7 233.1C10.4 214.4 1.5 99.4 1.5 83.9c0-77.8 68.2-53.4 110.3-21.8z\"/></svg>';\nconst GH =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 496 512\"><path d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z\"/></svg>';\nconst YT =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z\"/></svg>';\nconst FB =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z\"/></svg>';\nconst WEB =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M352 256c0 22.2-1.2 43.6-3.3 64H163.3c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64H348.7c2.2 20.4 3.3 41.8 3.3 64zm28.8-64H503.9c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64zm112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6c78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7c10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5c11.6 26 21 58.2 27 94.7zm-209 0H18.6C48.6 85.9 112.2 29.1 190.6 8.4C165.1 42.6 145.3 96.1 135.3 160zM8.1 192H131.2c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64zM194.7 446.6c-11.6-26-20.9-58.2-27-94.6H344.3c-6.1 36.4-15.5 68.6-27 94.6c-10.5 23.6-22.2 40.7-33.5 51.5C272.6 508.8 263.3 512 256 512s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6C112.2 482.9 48.6 426.1 18.6 352H135.3zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6c25.5-34.2 45.2-87.7 55.3-151.6H493.4z\"/></svg>';\nconst EMAIL =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z\"/></svg>';\nexport const SOCIAL_ICONS: Readonly<Record<string, string>> = {\n x: X,\n twitter: X,\n ig: IG,\n bsky: BSKY,\n gh: GH,\n yt: YT,\n fb: FB,\n web: WEB,\n website: WEB,\n link: WEB,\n email: EMAIL,\n mail: EMAIL,\n};\n","/** Round half to even, as Python :.0f formats. */\nexport const halfEven = (x: number): string => {\n const r = Math.round(x);\n return String(Math.abs(x % 1) === 0.5 && r % 2 !== 0 ? r - 1 : r);\n};\n/** Python _cutline_svg (_cells.py:806-817) byte for byte: uppercase label, `quote(svg, safe=\"\")`, `;charset=utf-8`. */\nexport function cutlineSvg(text: string, color: string, size: number): string {\n const t = text.toUpperCase();\n const tracking = 1.1;\n const esc = t.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${halfEven(t.length * (size * 0.8 + tracking) + 4)}\" height=\"${halfEven(size + 4)}\"><text x=\"0\" y=\"${(size + 0.5).toFixed(1)}\" font-family=\"Helvetica,Arial,sans-serif\" font-size=\"${size}\" font-weight=\"700\" letter-spacing=\"${tracking}\" fill=\"${color}\">${esc}</text></svg>`;\n return `data:image/svg+xml;charset=utf-8,${pyQuote(svg)}`;\n}\n/** Python `urllib.parse.quote(s, safe=\"\")`: encodeURIComponent also leaves `!'()*` alone. */\nexport const pyQuote = (x: string): string =>\n encodeURIComponent(x).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);\n/** Python _watermark_svg (_layout.py:251-268): returns the data URI and whether the rotated box is taller than wide. */\nexport function watermarkSvg(\n text: string,\n color: string,\n opacity: number,\n angle: number,\n font: string,\n): [string, boolean] {\n const label = text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n const size = 100;\n const textW = Math.max(label.length * size * 0.62, size);\n const textH = size * 1.3;\n const rad = (Math.abs(angle) * Math.PI) / 180;\n const w = Math.ceil(textW * Math.cos(rad) + textH * Math.sin(rad)) + 4;\n const h = Math.ceil(textW * Math.sin(rad) + textH * Math.cos(rad)) + 4;\n const rot = angle !== 0 ? ` transform=\"rotate(${angle} ${w / 2} ${h / 2})\"` : \"\";\n const attr = (v: string): string => v.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/\"/g, \""\");\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${w} ${h}\" width=\"${w}\" height=\"${h}\"><text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dominant-baseline=\"central\" font-family=\"${attr(font)}\" font-size=\"${size}\" font-weight=\"700\" fill=\"${attr(color)}\" fill-opacity=\"${opacity}\"${rot}>${label}</text></svg>`;\n return [`data:image/svg+xml,${pyQuote(svg)}`, h > w];\n}\n/** A CSS string body: backslash-escape what could end the string or the <style> element. */\nexport const cssStr = (v: string): string =>\n v.replace(/[\\\\\"\\n\\r<]/g, (c) => `\\\\${c.charCodeAt(0).toString(16)} `);\n","// src/html/decorations.ts — Task 5 version: every hook exists (defaults are no-ops); title, subtitle, sourceNote here; groupBy is read by index.ts.\n// Later tasks only POPULATE hooks; none adds one. Style hooks return bare declarations — index.ts builds the one style=\"\" (styleOf).\nimport { contrast, hex6, mix, onColor, solid } from \"@sportsdataverse/sdvplot\";\nimport { RANK_PALETTE } from \"../define.js\";\nimport { TableSpecError } from \"../errors.js\";\nimport { formatNumber, formatValue, isBlank, naturalDigits, toNumber } from \"../format.js\";\nimport { selectRows } from \"../predicate.js\";\nimport { domainOf, quantile7, ramp, sampleSd } from \"../scale.js\";\nimport type { ColumnSpec, Decoration, RowSelector, TableSpec, TextStyle } from \"../spec.js\";\nimport { secondaryOn } from \"../themes/sdv.js\";\nimport { type GoogleFont, fontStack } from \"../themes/tokens.js\";\nimport { type RenderContext, cellValue, isScaled } from \"./cells.js\";\nimport { checkPx, cssValue, escapeAttr, escapeHtml, isCssValue, styleAttr } from \"./escape.js\";\nimport { SOCIAL_ICONS } from \"./social-icons.js\";\nimport { cssStr, cutlineSvg, watermarkSvg } from \"./svg.js\";\nexport interface DecorationOutput<Row> {\n caption: string;\n headRows: string;\n foot: string[];\n before: string;\n after: string;\n css: string[];\n fonts: GoogleFont[];\n hiddenColumns: Set<string>;\n /** raw label text replacing a column's label (marginalia, Task 11) */\n labelText: Map<string, string>;\n /** label HTML from raw text: escapes; wrapLabels (Task 6) wraps first */\n label(col: ColumnSpec<Row>, text: string): string;\n /** raw text appended to a label before label() (scaleNote where \"label\"/\"both\", Task 10) */\n labelSuffix(key: string): string;\n /** `<th>` declarations after the column's own width (marginalia width, Task 11) */\n labelStyle(key: string): string;\n /** \" cls\" list for `<tr class=\"sdvt-row…\">` (groupStripes, cutline — Task 9) */\n rowClass(i: number): string;\n /** `<tr>` declarations (rowAccent, boldRows, spotlight, colorResults — Task 9) */\n rowStyle(i: number): string;\n /** \" cls\" for the group header row of the `groupIndex`-th group (groupStripes, Task 9) */\n groupRowClass(groupIndex: number): string;\n /** `<td>` declarations after the kind's own (spotlight columns — Task 9; outliers, marginalia, tiers — Tasks 11–12) */\n cellStyle(i: number, key: string): string;\n /** HTML appended after the rendered cell (significance stars, outlier symbol — Task 11) */\n cellSuffix(i: number, key: string): string;\n}\n// ---- Task 6: R strwrap via Python textwrap.wrap(width - 1) (_layout.py:1813-1815) and _balanced (:1818-1833)\nfunction strwrap(words: readonly string[], width: number): string[] {\n const w = Math.max(width - 1, 1);\n const out: string[] = [];\n let cur = \"\";\n for (const word of words) {\n if (cur && cur.length + 1 + word.length > w) {\n out.push(cur);\n cur = word;\n } else cur = cur ? `${cur} ${word}` : word;\n }\n return cur ? [...out, cur] : out;\n}\nexport function wrapLabel(text: string, width: number, balance: boolean): string[] {\n const words = text.split(/\\s+/).filter((x) => x !== \"\");\n if (words.length <= 1) return [text];\n const greedy = strwrap(words, width);\n if (greedy.length <= 1) return [text];\n if (!balance) return greedy;\n const target = Math.ceil(words.reduce((s, x) => s + x.length + 1, 0) / greedy.length);\n const lines: string[] = [];\n let cur = \"\";\n for (const word of words) {\n const cand = cur ? `${cur} ${word}` : word;\n if (cand.length > target && cur) {\n lines.push(cur);\n cur = word;\n } else cur = cand;\n }\n return cur ? [...lines, cur] : lines;\n}\n\n// ---- Task 9\nexport function groupIndexOf<Row>(rows: readonly Row[], key: string): number[] {\n const seen = new Map<unknown, number>();\n return rows.map((r) => {\n const g = cellValue(r, key);\n if (!seen.has(g)) seen.set(g, seen.size);\n return seen.get(g) as number;\n });\n}\nconst isList = (p: unknown): p is readonly string[] => Array.isArray(p);\n\n// ---- Task 10\nexport function textStyleAttr(ts: TextStyle | undefined): string {\n if (!ts) return \"\";\n const s = styleAttr({\n color: ts.color,\n \"font-size\": ts.size,\n \"font-weight\": ts.weight,\n \"font-family\": ts.font ? fontStack(checkFamily(ts.font)) : undefined,\n \"text-transform\": ts.transform === \"uppercase\" ? \"uppercase\" : undefined,\n \"font-style\": ts.style === \"italic\" ? \"italic\" : undefined,\n });\n return s ? ` style=\"${s}\"` : \"\";\n}\n/** A family name lands inside `'…'` in CSS: letters, digits, spaces, `.`, `-`, `_` only. */\nfunction checkFamily(f: string): string {\n if (!/^[\\w .-]+$/.test(f))\n throw new TableSpecError(`font family \"${f}\" may only hold letters, digits, spaces, \".\" \"-\" \"_\"`);\n return f;\n}\nconst checkLocation = (l: string, arg: string): \"top\" | \"bottom\" => {\n if (l !== \"top\" && l !== \"bottom\")\n throw new TableSpecError(`${arg} location must be top or bottom, not ${JSON.stringify(l)}`);\n return l;\n};\nconst ALIGN = new Set([\"left\", \"center\", \"right\"]);\nconst checkAlign = (a: string, arg: string): string => {\n if (!ALIGN.has(a)) throw new TableSpecError(`${arg} must be left, center or right, not \"${a}\"`);\n return a;\n};\n/** Python _SCALE_NAMES (_layout.py:1442-1447): only these four divisors have names. */\nconst SCALE_NAMES: Readonly<Record<number, readonly [string, string]>> = {\n 1e3: [\"thousands\", \"(000s)\"],\n 1e6: [\"millions\", \"(millions)\"],\n 1e9: [\"billions\", \"(billions)\"],\n 1e12: [\"trillions\", \"(trillions)\"],\n};\n\nexport function applyDecorations<Row>(\n spec: TableSpec<Row>,\n rows: readonly Row[],\n ctx: RenderContext<Row>,\n): DecorationOutput<Row> {\n const none = (): string => \"\";\n const out: DecorationOutput<Row> = {\n caption: \"\",\n headRows: \"\",\n foot: [],\n before: \"\",\n after: \"\",\n css: [],\n fonts: [],\n hiddenColumns: new Set(),\n labelText: new Map(),\n label: (_c, t) => escapeHtml(t),\n labelSuffix: none,\n labelStyle: none,\n rowClass: none,\n rowStyle: none,\n groupRowClass: none,\n cellStyle: none,\n cellSuffix: none,\n };\n const title = spec.decorations.find(\n (d): d is Extract<Decoration<Row>, { type: \"title\" }> => d.type === \"title\",\n );\n const subtitle = spec.decorations.find(\n (d): d is Extract<Decoration<Row>, { type: \"subtitle\" }> => d.type === \"subtitle\",\n );\n if (title || subtitle)\n out.caption = `${title ? `<span class=\"sdvt-title\">${escapeHtml(title.text)}</span>` : \"\"}${subtitle ? `<span class=\"sdvt-subtitle\">${escapeHtml(subtitle.text)}</span>` : \"\"}`;\n // Task 9: the per-row / per-cell maps every row and cell decoration writes into (later tasks reuse them)\n const rowStyles = new Map<number, Record<string, string>>();\n const rowClasses = new Map<number, string[]>();\n const cellStyles = new Map<string, Record<string, string | undefined>>(); // key `${i}:${col}`\n const addRow = (i: number, decl: Record<string, string>): void => {\n rowStyles.set(i, { ...rowStyles.get(i), ...decl });\n };\n const addClass = (i: number, c: string): void => {\n rowClasses.set(i, [...(rowClasses.get(i) ?? []), c]);\n };\n const addCell = (i: number, key: string, decl: Record<string, string | undefined>): void => {\n cellStyles.set(`${i}:${key}`, { ...cellStyles.get(`${i}:${key}`), ...decl });\n };\n // Fills go on every <td> (Python applies them as !important cell styles, _cells.py:221): a <tr> background is hidden by the stripe and theme band rules on td\n const fillCells = (i: number, decl: Record<string, string | undefined>): void => {\n for (const c of ctx.columns) addCell(i, c.key, decl);\n };\n const suffixes = new Map<string, string>(); // Task 11, key `${i}:${col}`\n const labelStyles = new Map<string, string>(); // Task 11\n let recordedKey: Readonly<Record<string, string>> | undefined; // tiers sets it for legendDiscrete(\"recorded\")\n let cutCount = 0; // one id per .cutline() call so two calls never share a class\n const bg = ctx.theme.tokens.bg === \"transparent\" ? \"#ffffff\" : hex6(ctx.theme.tokens.bg);\n // \"matched no rows\" asks the source rows (A49): a page or filter that hides the picked rows still dims / skips the rest\n const matchesNone = (sel: RowSelector<Row>): boolean => selectRows(sel, ctx.domainRows).length === 0;\n // colorResults is a column kind (spec §6.1) whose effect is a row fill: gt_color_results (_cells.py:203-222), exact W/L or 1/0\n for (const c of spec.columns)\n if (c.kind === \"colorResults\") {\n const [win, loss]: readonly [unknown, unknown] = c.resultType === \"binary\" ? [1, 0] : [\"W\", \"L\"];\n const eq = (v: unknown, want: unknown): boolean =>\n v === want || (typeof v === \"boolean\" && Number(v) === want);\n rows.forEach((r, i) => {\n const v = cellValue(r, c.key);\n if (isBlank(v)) return;\n if (eq(v, win)) fillCells(i, { \"background-color\": c.winColor, color: c.winTextColor });\n else if (eq(v, loss)) fillCells(i, { \"background-color\": c.lossColor, color: c.lossTextColor });\n else if (c.tieColor !== undefined && eq(v, c.tieValue))\n fillCells(i, { \"background-color\": c.tieColor, color: c.tieTextColor });\n });\n }\n for (const d of spec.decorations)\n switch (d.type) {\n case \"sourceNote\":\n out.foot.push(d.unsafe ? d.html : escapeHtml(d.html));\n break;\n case \"wrapLabels\": {\n const prev = out.label;\n out.label = (col, text) =>\n !d.columns || d.columns.includes(col.key)\n ? wrapLabel(text, d.width, d.balance).map(escapeHtml).join(\"<br>\")\n : prev(col, text);\n break;\n }\n // ---- Task 9\n case \"groupStripes\": {\n if (!ctx.groupKey) throw new TableSpecError(\"groupStripes needs .groupBy(key)\");\n const on = (gi: number): boolean => gi % 2 === (d.start === 2 ? 1 : 0);\n groupIndexOf(rows, ctx.groupKey).forEach((g, i) => {\n if (on(g)) addClass(i, \"sdvt-gstripe\");\n });\n // Python gt_group_stripes (_cells.py:421-424, 458-463) styles body (+stub) rows only: \"Group heading rows are left alone\" - the brief striped the header too; Python wins\n out.css.push(\n `${ctx.sel} tr.sdvt-gstripe td{background-color:${cssValue(d.color, \"groupStripes color\")}}`,\n );\n break;\n }\n case \"rowAccent\": {\n // gt_row_accent (_layout.py:1123-1156): no palette = the column holds the colors; a list maps sorted levels, recycled\n if (d.side !== \"left\" && d.side !== \"right\")\n throw new TableSpecError(`rowAccent side must be left or right, not ${JSON.stringify(d.side)}`);\n const keyOf = (r: Row): string | null => {\n const v = cellValue(r, d.key);\n return isBlank(v) ? null : String(v);\n };\n const keys = rows.map(keyOf);\n // A49: levels from the source rows, so a row keeps its accent colour under paging, filtering and brushing\n const levels = [...new Set(ctx.domainRows.map(keyOf).filter((k): k is string => k !== null))].sort();\n const pal = d.palette;\n const colors = keys.map((k) =>\n k === null\n ? undefined\n : pal === undefined\n ? k\n : isList(pal)\n ? pal[levels.indexOf(k) % pal.length]\n : Object.hasOwn(pal, k)\n ? pal[k]\n : undefined,\n );\n const keep = d.rows ? new Set(selectRows(d.rows, rows, ctx.domainRows)) : null;\n if (d.rows && keep?.size === 0 && matchesNone(d.rows)) {\n ctx.warn(`sdvtables:rowAccent:${ctx.id}`, \"rows matched no rows; the table is unchanged\");\n break;\n }\n const unsafe = new Set<string>();\n colors.forEach((c, i) => {\n const fill = c ?? d.naColor;\n if (fill === \"transparent\" || (keep && !keep.has(i))) return;\n // a color read from the DATA (no palette) never throws: warn once per call and skip that row's accent\n if (pal === undefined && c !== undefined && !isCssValue(c)) unsafe.add(c);\n else addRow(i, { [`border-${d.side}`]: `${d.width}px solid ${fill}` });\n });\n if (unsafe.size > 0)\n ctx.warn(\n `sdvtables:rowAccent:${ctx.id}:css:${[...unsafe].join(\",\")}`,\n `${[...unsafe].map((c) => JSON.stringify(c)).join(\", \")} in \"${d.key}\" cannot be a CSS color, so ${unsafe.size === 1 ? \"that row gets\" : \"those rows get\"} no accent`,\n );\n if (d.hide) out.hiddenColumns.add(d.key);\n break;\n }\n case \"boldRows\":\n for (const i of selectRows(d.rows, rows, ctx.domainRows)) {\n addRow(i, { \"font-weight\": \"bold\" });\n fillCells(i, {\n color: d.textColor,\n ...(d.highlightColor ? { \"background-color\": d.highlightColor } : {}),\n });\n }\n break;\n case \"spotlight\": {\n // gt_spotlight (_layout.py:1036-1074): no rows → unchanged + warning; `columns` narrows the lit cells, the rest of a lit row dims\n const lit = new Set(selectRows(d.rows, rows, ctx.domainRows));\n if (lit.size === 0 && matchesNone(d.rows)) {\n ctx.warn(`sdvtables:spotlight:${ctx.id}`, \"rows matched no rows, so the table is unchanged\");\n break;\n }\n const dim = d.dimColor === \"auto\" ? secondaryOn(bg, onColor(bg)) : d.dimColor;\n const fill: Record<string, string> = {\n ...(d.fill ? { \"background-color\": d.fill } : {}),\n ...(d.textColor ? { color: d.textColor } : {}),\n };\n const look: Record<string, string> = { ...fill, ...(d.bold ? { \"font-weight\": \"bold\" } : {}) };\n rows.forEach((_, i) => {\n if (!lit.has(i)) {\n if (dim) addRow(i, { color: dim });\n return;\n }\n if (d.accentColor) addRow(i, { \"box-shadow\": `inset ${d.accentWidth}px 0 0 ${d.accentColor}` });\n if (!d.columns) {\n fillCells(i, fill);\n if (d.bold) addRow(i, { \"font-weight\": \"bold\" });\n return;\n }\n for (const c of ctx.columns)\n if ((d.columns as readonly string[]).includes(c.key)) addCell(i, c.key, look);\n else if (dim) addCell(i, c.key, { color: dim });\n });\n break;\n }\n case \"cutline\": {\n // gt_cutline (_cells.py:880-950): `after` rows above the line → the rule is the TOP border of 0-based row `after`\n if (!d.after.every((a) => Number.isInteger(a)))\n throw new TableSpecError(`cutline after must be whole row numbers, got ${d.after.join(\", \")}`);\n if (d.gap.length < 1 || d.gap.length > 2 || d.gap.some((g) => !(g >= 0)))\n throw new TableSpecError(\"cutline gap must be one or two non-negative numbers\");\n const n = rows.length;\n const dropped = d.after.filter((a) => a < 0 || a >= n);\n if (dropped.length > 0)\n ctx.warn(\n `sdvtables:cutline:${ctx.id}:${dropped.join(\",\")}`,\n `dropped ${dropped.length} cut line(s) at ${dropped.join(\", \")}: after must be between 0 and ${n - 1}; a line after the last row is just the table border`,\n );\n const color = cssValue(d.color, \"cutline color\");\n const style = cssValue(d.style, \"cutline style\");\n const weight = checkPx(d.weight, \"cutline weight\");\n const labelSize = checkPx(d.labelSize, \"cutline labelSize\");\n const cn = cutCount++;\n const above = d.gap[0] ?? 0;\n const below = d.gap[d.gap.length - 1] ?? 0;\n d.after.forEach((a, j) => {\n if (a < 0 || a >= n) return;\n const label = d.label && d.label.length > 0 ? (d.label[j % d.label.length] ?? null) : null;\n const top = d.labelPosition === \"below\" || a === 0;\n const labelRow = top ? a : a - 1;\n addClass(a, `sdvt-cut-${cn}-${j}`);\n out.css.push(`${ctx.sel} tr.sdvt-cut-${cn}-${j} td{border-top:${weight}px ${style} ${color}}`);\n if (above > 0 && a > 0 && !(label && labelRow === a - 1)) {\n addClass(a - 1, `sdvt-cut-${cn}-${j}-above`);\n out.css.push(`${ctx.sel} tr.sdvt-cut-${cn}-${j}-above td{padding-bottom:${above}px}`);\n }\n if (below > 0 && !(label && labelRow === a))\n out.css.push(`${ctx.sel} tr.sdvt-cut-${cn}-${j} td{padding-top:${below}px}`);\n if (label) {\n addClass(labelRow, `sdvt-cut-${cn}-${j}-label`);\n out.css.push(\n `${ctx.sel} tr.sdvt-cut-${cn}-${j}-label td{padding-${top ? \"top\" : \"bottom\"}:${labelSize + 13 + (top ? below : above)}px;background-color:transparent}`,\n `${ctx.sel} tr.sdvt-cut-${cn}-${j}-label{background-image:url(\"${cutlineSvg(label, d.labelColor ?? color, labelSize)}\");background-repeat:no-repeat;background-position:${top ? \"left 5px\" : \"left bottom 5px\"}}`,\n );\n }\n });\n break;\n }\n case \"borderGrid\": {\n // _cells.py:793-803\n const color = cssValue(d.color, \"borderGrid color\");\n const b = `border-right:${checkPx(d.weight, \"borderGrid weight\")}px solid ${color}`;\n out.css.push(\n `${ctx.sel} td.sdvt-cell:not(:last-child){${b}}`,\n `${ctx.sel} td.sdvt-cell{border-top-color:${color}}`,\n );\n if (d.includeLabels) out.css.push(`${ctx.sel} th.sdvt-label:not(:last-child){${b}}`);\n break;\n }\n // ---- Task 10\n case \"titleHeader\": {\n // gt_title_header (_layout.py:121-215): kicker / title / subtitle / date, each with its own style; Python's kicker and date defaults live in the rules below\n for (const ts of [d.kickerStyle, d.titleStyle, d.subtitleStyle, d.dateStyle])\n if (ts?.font)\n out.fonts.push({\n family: checkFamily(ts.font),\n weights: [typeof ts.weight === \"number\" ? ts.weight : 400],\n });\n out.css.push(\n `${ctx.sel} .sdvt-kicker{font-size:0.75em;font-weight:700;color:#C84630;text-transform:uppercase;letter-spacing:0.08em;margin-bottom:0.15em}`,\n `${ctx.sel} .sdvt-date{font-size:0.85em;font-weight:400;color:#8A8A8A;margin-top:0.15em}`,\n );\n out.caption = `${d.kicker ? `<div class=\"sdvt-kicker\"${textStyleAttr(d.kickerStyle)}>${escapeHtml(d.kicker)}</div>` : \"\"}<span class=\"sdvt-title\"${textStyleAttr(d.titleStyle)}>${escapeHtml(d.title)}</span>${d.subtitle ? `<span class=\"sdvt-subtitle\"${textStyleAttr(d.subtitleStyle)}>${escapeHtml(d.subtitle)}</span>` : \"\"}${d.date ? `<div class=\"sdvt-date\"${textStyleAttr(d.dateStyle)}>${escapeHtml(d.date)}</div>` : \"\"}`;\n break;\n }\n case \"caption538\": {\n // gt_538_caption (_cells.py:482-535): the TOP note carries the rule + size, the BOTTOM note the alignment\n const align = checkAlign(d.align, \"caption538 align\");\n if (!d.top && !d.bottom)\n throw new TableSpecError(\"caption538: nothing to caption; pass top, bottom, or both\");\n const rule = d.ruleColor ?? ctx.theme.tokens.text;\n if (d.top)\n out.foot.push(\n `<div class=\"sdvt-cap538\" style=\"${styleAttr({ \"border-bottom\": `${d.ruleWidth}px solid ${rule}`, \"font-size\": `${d.size}px` })}\">${escapeHtml(d.top)}</div>`,\n );\n if (d.bottom)\n out.foot.push(\n `<div class=\"sdvt-cap538\" style=\"${styleAttr({ \"text-align\": align })}\">${escapeHtml(d.bottom)}</div>`,\n );\n break;\n }\n case \"socialTag\": {\n // gt_social_tag (_layout.py:1553-1620): handles behind icons; a caption is a gt_538_caption TOP note (rule + size), the handle line the bottom\n const align = checkAlign(d.align, \"socialTag align\");\n const entries = Object.entries(d.accounts);\n if (entries.length === 0)\n throw new TableSpecError(\"socialTag accounts must be a non-empty {platform: handle} object\");\n const parts = entries.map(([k, handle]) => {\n const svg = SOCIAL_ICONS[k.toLowerCase()];\n if (!svg)\n throw new TableSpecError(\n `socialTag: unknown platform \"${k}\"; one of ${Object.keys(SOCIAL_ICONS).join(\", \")}`,\n );\n return `<span class=\"sdvt-handle\">${svg.replace(\"<svg \", `<svg style=\"${styleAttr({ height: d.iconHeight, \"vertical-align\": \"-0.125em\", fill: d.iconColor ?? \"currentColor\" })}\" `)}${escapeHtml(handle)}</span>`;\n });\n out.css.push(\n `${ctx.sel} .sdvt-handle{display:inline-flex;align-items:center;gap:0.3em;white-space:nowrap}`,\n );\n if (d.caption)\n out.foot.push(\n `<div class=\"sdvt-cap538\" style=\"${styleAttr({ \"border-bottom\": `1px solid ${ctx.theme.tokens.text}`, \"font-size\": \"12px\" })}\">${escapeHtml(d.caption)}</div>`,\n );\n out.foot.push(\n `<div class=\"sdvt-social\" style=\"text-align:${align}\">${parts.join(d.stack ? \"<br>\" : escapeHtml(d.separator))}</div>`,\n );\n break;\n }\n case \"scaleNote\": {\n // gt_scale_note (_layout.py:1495-1515)\n if (!(Number.isFinite(d.divisor) && d.divisor !== 0))\n throw new TableSpecError(`scaleNote divisor must be a single non-zero number, got ${d.divisor}`);\n if (d.columns.length === 0) throw new TableSpecError(\"scaleNote columns matched no columns\");\n for (const k of d.columns) ctx.scaled.set(k, { divisor: d.divisor, decimals: d.decimals });\n const named = SCALE_NAMES[d.divisor];\n const shown = Number.isInteger(d.divisor)\n ? formatNumber(d.divisor, { digits: 0, big: true })\n : naturalDigits(d.divisor, true);\n const note = d.note ?? (named ? `Figures in ${named[0]}.` : `Figures divided by ${shown}.`);\n const suffix = d.labelSuffix ?? (named ? named[1] : `(÷${shown})`);\n if (d.where !== \"label\") out.foot.push(escapeHtml(note));\n if (d.where !== \"sourceNote\") {\n const prev = out.labelSuffix;\n out.labelSuffix = (key) =>\n (d.columns as readonly string[]).includes(key) ? ` ${suffix}` : prev(key);\n }\n break;\n }\n case \"borderBars\": {\n // _bars (_cells.py:560-594): no text/img = one full-width bar per color; either = ONE flex bar in the first color holding the text and image (Python)\n if (d.side !== \"top\" && d.side !== \"bottom\")\n throw new TableSpecError(`borderBars side must be top or bottom, not ${JSON.stringify(d.side)}`);\n checkAlign(d.barAlign, \"borderBars barAlign\");\n const barWidth = escapeAttr(cssValue(d.barWidth, \"borderBars barWidth\"));\n const colors = d.colors.map((c) => escapeAttr(cssValue(c, \"borderBars colors\")));\n if (d.imgAlign !== \"left\" && d.imgAlign !== \"right\")\n throw new TableSpecError(\n `borderBars imgAlign must be left or right, not ${JSON.stringify(d.imgAlign)}`,\n );\n const barHeight = Number(d.barHeight);\n if (!Number.isFinite(barHeight))\n throw new TableSpecError(\n `borderBars barHeight must be a number, got ${JSON.stringify(d.barHeight)}`,\n );\n if (d.textAlign !== \"left\" && d.textAlign !== \"right\")\n throw new TableSpecError(`borderBars textAlign must be left or right, not \"${d.textAlign}\"`);\n const margin = {\n left: \"margin-left:0;margin-right:auto\",\n center: \"margin-left:auto;margin-right:auto\",\n right: \"margin-left:auto;margin-right:0\",\n }[d.barAlign as \"left\" | \"center\" | \"right\"];\n let block: string;\n if (!d.text && !d.img) {\n const bars = colors\n .map((c) => `<div class=\"sdvt-bar\" style=\"height:${barHeight}px;background-color:${c}\"></div>`)\n .join(\"\");\n block = `<div class=\"sdvt-bars-box\" style=\"background-color:transparent;width:${barWidth};${margin}\">${bars}</div>`;\n } else {\n const text = d.text\n ? `<span class=\"sdvt-bars-text\" style=\"${styleAttr({ \"font-weight\": d.textWeight, color: d.textColor, \"font-size\": `${d.textSize}px`, [`padding-${d.textAlign}`]: `${d.textPadding}px`, \"font-family\": \"inherit\" })}\">${escapeHtml(d.text)}</span>`\n : \"<span></span>\";\n const img = d.img\n ? `<img class=\"sdvt-bars-img\" src=\"${escapeAttr(d.img)}\" alt=\"\" style=\"${styleAttr({ width: `${d.imgWidth}px`, height: `${d.imgHeight}px`, [`padding-${d.imgAlign}`]: `${d.imgPadding}px` })}\">`\n : \"\";\n block = `<div class=\"sdvt-bars-row\" style=\"display:flex;justify-content:space-between;align-items:center;height:${barHeight}px;background-color:${colors[0] ?? \"#000\"};width:${barWidth};${margin}\">${text}${img}</div>`;\n }\n const wrapped = `<div class=\"sdvt-bars sdvt-bars-${d.side}\">${block}</div>`;\n if (d.side === \"top\") out.before += wrapped;\n else out.after += wrapped;\n break;\n }\n case \"watermark\": {\n // gt_watermark (_layout.py:271-340); Python reads a local image into a base64 URI, here `image` is a URL used as is\n if (!d.text === !d.image) throw new TableSpecError(\"watermark: supply exactly one of text or image\");\n let url: string;\n let tall = false;\n let extra = \"\";\n const opacity = checkPx(d.opacity, \"watermark opacity\");\n if (d.image) {\n url = cssStr(d.image);\n extra = `;opacity:${opacity}`;\n } else [url, tall] = watermarkSvg(d.text ?? \"\", d.color, opacity, d.angle, d.font);\n const size = cssValue(d.size, \"watermark size\");\n out.css.push(\n `${ctx.sel} tbody{background-image:url(\"${url}\");background-repeat:no-repeat;background-position:${cssValue(d.position, \"watermark position\")};background-size:${tall ? `auto ${size}` : `${size} auto`}${extra}}`,\n );\n break;\n }\n case \"font\": {\n const stack = fontStack(checkFamily(d.family));\n if (d.google)\n out.fonts.push({ family: d.family, weights: [typeof d.weight === \"number\" ? d.weight : 400] });\n out.css.push(\n `${ctx.sel}{--sdvt-font-body:${stack};--sdvt-font-label:${stack};--sdvt-font-title:${stack}${d.weight ? `;--sdvt-body-weight:${cssValue(d.weight, \"font weight\")}` : \"\"}${d.style ? `;font-style:${cssValue(d.style, \"font style\")}` : \"\"}}`,\n );\n break;\n }\n // ---- Task 11\n case \"legendContinuous\": {\n // gt_legend_continuous (_layout.py:395-470), type \"steps\": nBins swatches sampled at bin midpoints (k + 0.5) / nBins (:471)\n const rec = ctx.recorded;\n const palette = (d.palette ?? rec?.palette ?? RANK_PALETTE).map((c) => hex6(c));\n let domain = d.domain ?? rec?.domain;\n if (!domain && d.columns && ctx.domainRows.length > 0)\n domain = domainOf(d.columns.map((k) => ctx.domainRows.map((r) => toNumber(cellValue(r, k)))));\n // J31 (A4): the domain comes from domainRows like the cell scales, so a paged or brushed legend holds still.\n // No domain rows: a data-derived domain does not exist yet (an empty page, fontsLinkFor), so no legend; a spec with no source still throws\n if (!domain && ctx.domainRows.length === 0 && (d.columns || ctx.columns.some(isScaled))) break;\n if (!domain)\n throw new TableSpecError(\n \"legendContinuous: no recorded scale (color a column with colorPills/colorRanks/percentileBar first) and no domain or columns given\",\n );\n if (d.nBins < 1) throw new TableSpecError(\"legendContinuous nBins must be at least 1\");\n const loc = checkLocation(d.location, \"legendContinuous\");\n const swW = checkPx(d.swatchWidth, \"legendContinuous swatchWidth\");\n const swH = checkPx(d.swatchHeight, \"legendContinuous swatchHeight\");\n const rev = d.reverse ?? rec?.reverse ?? false;\n const r = ramp(rev ? [...palette].reverse() : palette, domain);\n const [lo, hi] = domain;\n const sw = Array.from(\n { length: d.nBins },\n (_, b) =>\n `<span class=\"sdvt-swatch\" style=\"display:inline-block;width:${swW}px;height:${swH}px;background-color:${r(lo + ((b + 0.5) / d.nBins) * (hi - lo)) ?? \"#808080\"}\"></span>`,\n );\n const labels = d.labels ?? [lo, hi].map((v) => formatValue(v, d.digits, \"comma\", \"\"));\n const block = `<div class=\"sdvt-legend sdvt-legend-${loc}\" style=\"display:flex;flex-direction:${d.titlePosition === \"left\" ? \"row\" : \"column\"};align-items:center;gap:6px;justify-content:center\">${d.title ? `<div class=\"sdvt-legend-title\">${escapeHtml(d.title)}</div>` : \"\"}<div class=\"sdvt-legend-bar\" style=\"display:flex;align-items:center;gap:4px\"><span class=\"sdvt-legend-lab\">${escapeHtml(labels[0] ?? \"\")}</span>${sw.join(\"\")}<span class=\"sdvt-legend-lab\">${escapeHtml(labels[labels.length - 1] ?? \"\")}</span></div></div>`;\n if (loc === \"top\") out.before += block;\n else out.after += block;\n break;\n }\n case \"legendDiscrete\": {\n const key = d.key === \"recorded\" ? recordedKey : d.key;\n if (!key)\n throw new TableSpecError(\n 'legendDiscrete(\"recorded\") needs a .tiers() decoration before it (no recorded key)',\n );\n const loc = checkLocation(d.location, \"legendDiscrete\");\n const size = checkPx(d.swatchSize, \"legendDiscrete swatchSize\");\n const gap = checkPx(d.gap, \"legendDiscrete gap\");\n const items = Object.entries(key).map(\n ([label, color]) =>\n `<span class=\"sdvt-key-item\" style=\"display:inline-flex;align-items:center;gap:6px\"><span class=\"sdvt-swatch\" style=\"${styleAttr({ display: \"inline-block\", width: `${size}px`, height: `${size}px`, \"background-color\": color, border: d.border ? `1px solid ${d.borderColor ?? \"currentColor\"}` : undefined, \"border-radius\": d.shape === \"circle\" ? \"50%\" : undefined })}\"></span>${escapeHtml(label)}</span>`,\n );\n const align = checkAlign(d.align, \"legendDiscrete align\") as \"left\" | \"center\" | \"right\";\n const block = `<div class=\"sdvt-legend sdvt-legend-${loc}\" style=\"display:flex;flex-direction:column;align-items:${{ left: \"flex-start\", center: \"center\", right: \"flex-end\" }[align]};gap:4px\">${d.heading ? `<div class=\"sdvt-legend-title\">${escapeHtml(d.heading)}</div>` : \"\"}${d.subtitle ? `<div class=\"sdvt-legend-sub\">${escapeHtml(d.subtitle)}</div>` : \"\"}<div style=\"display:flex;flex-direction:${d.direction === \"vertical\" ? \"column\" : \"row\"};flex-wrap:wrap;gap:${gap}px\">${items.join(\"\")}</div></div>`;\n if (loc === \"top\") out.before += block;\n else out.after += block;\n break;\n }\n case \"significance\": {\n // gt_significance (_layout.py:1342-1369): levels ascending (strictest first), the first level p is below wins; p columns hidden\n if (d.levels.length !== d.symbols.length)\n throw new TableSpecError(\"significance levels and symbols must be the same length\");\n if (d.levels.some((x, j) => j > 0 && x < (d.levels[j - 1] ?? x)))\n throw new TableSpecError(\"significance levels must be in ascending order, strictest first\");\n for (const pair of d.pairs) {\n rows.forEach((r, i) => {\n const p = toNumber(cellValue(r, pair.p));\n if (p === null) return;\n const s = d.symbols[d.levels.findIndex((x) => p < x)];\n if (s) {\n const k = `${i}:${pair.estimate}`;\n suffixes.set(\n k,\n `${suffixes.get(k) ?? \"\"}${d.superscript ? `<sup style=\"font-size:0.7em\">${escapeHtml(s)}</sup>` : escapeHtml(s)}`,\n );\n }\n });\n if (d.hideP) out.hiddenColumns.add(pair.p);\n }\n if (d.note)\n out.foot.push(\n escapeHtml(d.levels.map((x, j) => `${d.symbols[j] ?? \"\"} p < ${naturalDigits(x)}`).join(\", \")),\n );\n break;\n }\n case \"outliers\": {\n // gt_outliers (_layout.py:1240-1290); limits = _limits (:1165-1180): fewer than 2 values or zero spread flags nothing\n if (d.method === \"bounds\" && !d.bounds)\n throw new TableSpecError(\"outliers bounds must be [lower, upper] when method is 'bounds'\");\n const t = d.threshold ?? (d.method === \"sd\" ? 3 : 1.5);\n const shown = d.fill === undefined ? null : solid(d.fill, bg);\n const ink =\n d.color ?? (shown === null || contrast(\"#B3261E\", shown) >= 4.5 ? \"#B3261E\" : onColor(shown));\n let flagged = false;\n for (const k of d.columns) {\n const xs = rows.map((r) => toNumber(cellValue(r, k)));\n // A49: the limits come from the source rows, so a page or filter never flags a value the whole column does not\n const nums = ctx.domainRows\n .map((r) => toNumber(cellValue(r, k)))\n .filter((v): v is number => v !== null);\n let lo = Number.NEGATIVE_INFINITY;\n let hi = Number.POSITIVE_INFINITY;\n if (d.method === \"bounds\") {\n lo = d.bounds?.[0] ?? lo;\n hi = d.bounds?.[1] ?? hi;\n } else if (nums.length >= 2 && d.method === \"sd\") {\n const m = nums.reduce((a, b) => a + b, 0) / nums.length;\n const s = sampleSd(nums);\n if (s !== 0) {\n lo = m - t * s;\n hi = m + t * s;\n }\n } else if (nums.length >= 2) {\n const q1 = quantile7(nums, 0.25);\n const q3 = quantile7(nums, 0.75);\n if (q3 !== q1) {\n lo = q1 - t * (q3 - q1);\n hi = q3 + t * (q3 - q1);\n }\n }\n xs.forEach((v, i) => {\n if (v === null || !((v < lo && d.side !== \"high\") || (v > hi && d.side !== \"low\"))) return;\n flagged = true;\n addCell(i, k, {\n color: ink,\n \"font-weight\": d.bold ? \"bold\" : undefined,\n \"background-color\": d.fill,\n });\n if (d.symbol)\n suffixes.set(`${i}:${k}`, `${suffixes.get(`${i}:${k}`) ?? \"\"}${escapeHtml(d.symbol)}`);\n });\n }\n if (flagged && d.note) {\n const tail = { both: \"\", high: \" (high side only)\", low: \" (low side only)\" }[d.side];\n out.foot.push(\n escapeHtml(\n typeof d.note === \"string\"\n ? d.note\n : d.method === \"sd\"\n ? `Marked values fall more than ${naturalDigits(t)} standard deviation${t === 1 ? \"\" : \"s\"} from the column mean${tail}.`\n : d.method === \"iqr\"\n ? `Marked values fall outside ${naturalDigits(t)} × IQR of the column quartiles${tail}.`\n : `Marked values fall outside ${d.bounds?.[0] ?? \"NA\"}–${d.bounds?.[1] ?? \"NA\"}${tail}.`,\n ),\n );\n }\n break;\n }\n case \"marginalia\": {\n // gt_marginalia (_layout.py:1420-1434): muted ink = secondaryOn(bg, onColor(bg)); hairline = mix(bg, ink, 0.18)\n const ink = onColor(bg);\n const color = d.color ?? secondaryOn(bg, ink);\n const rule = d.ruleColor ?? mix(bg, ink, 0.18);\n const align = checkAlign(d.align, \"marginalia align\");\n for (const k of d.columns) {\n out.labelText.set(k, d.label);\n if (d.width !== undefined)\n labelStyles.set(\n k,\n `width:${typeof d.width === \"number\" ? `${d.width}px` : escapeAttr(cssValue(d.width, \"marginalia width\"))}`,\n );\n rows.forEach((_, i) =>\n addCell(i, k, {\n \"font-style\": d.italic ? \"italic\" : \"normal\",\n \"font-size\": d.size,\n color,\n \"border-left\": d.rule ? `1px solid ${rule}` : undefined,\n \"text-align\": align,\n }),\n );\n }\n break;\n }\n case \"tiers\": {\n // gt_tiers (_layout.py:870-913): colors required; each level's tier cells filled, bold readable ink; recorded for legendDiscrete(\"recorded\")\n if (!d.colors)\n throw new TableSpecError(\"tiers colors is missing; pass levels and colors as two lists\");\n if (d.colors.length !== d.levels.length)\n throw new TableSpecError(\n `tiers levels and colors must be the same length: got ${d.levels.length} levels and ${d.colors.length} colors`,\n );\n const fills = d.colors.map((c) => hex6(c));\n const tierOf = (r: Row): string | null => {\n const v = cellValue(r, d.tierKey);\n return isBlank(v) ? null : String(v);\n };\n // A49: the levels the SOURCE rows hold, so a page or filter without a level warns nothing\n const held = [...new Set(ctx.domainRows.map(tierOf).filter((t): t is string => t !== null))];\n const missing = d.levels.filter((l) => !held.includes(l));\n if (missing.length > 0)\n ctx.warn(\n `sdvtables:tiers:${ctx.id}`,\n `tier(s) ${missing.join(\", \")} are not in \"${d.tierKey}\", so they get no rows; it holds ${held.join(\", \")}`,\n );\n rows.forEach((r, i) => {\n const t = tierOf(r);\n const f = t === null ? undefined : fills[d.levels.indexOf(t)];\n if (f) addCell(i, d.tierKey, { \"background-color\": f, color: onColor(f), \"font-weight\": \"bold\" });\n });\n recordedKey = Object.fromEntries(d.levels.map((l, j) => [l, fills[j] ?? \"\"]));\n break;\n }\n default:\n break; // title/subtitle (above), groupBy and snake (index.ts)\n }\n out.cellSuffix = (i, key) => suffixes.get(`${i}:${key}`) ?? \"\";\n out.labelStyle = (key) => labelStyles.get(key) ?? \"\";\n out.css = out.css.map((r) => r.replace(/</g, \"\\\\3c \")); // nothing a spec says can close the <style> element\n out.rowClass = (i) => (rowClasses.get(i) ?? []).map((c) => ` ${c}`).join(\"\");\n out.rowStyle = (i) => {\n const s = rowStyles.get(i);\n return s ? styleAttr(s) : \"\";\n };\n out.cellStyle = (i, key) => {\n const s = cellStyles.get(`${i}:${key}`);\n return s ? styleAttr(s) : \"\";\n };\n return out;\n}\n","// src/html/layout.ts — the two decorations that reshape the table rather than style it\nimport { snakeAlign } from \"../snake.js\";\nimport type { ColumnSpec, Decoration, TableSpec } from \"../spec.js\";\nimport { escapeHtml } from \"./escape.js\";\n\ntype Tiers<Row> = Extract<Decoration<Row>, { type: \"tiers\" }>;\ntype Snake<Row> = Extract<Decoration<Row>, { type: \"snake\" }>;\n\n/** gt_tiers' reshaping (_layout.py:870-890): theme `tier` (style), image columns at imgHeight, every label blanked. */\nexport function expandTiers<Row>(spec: TableSpec<Row>): TableSpec<Row> {\n const d = spec.decorations.find((x): x is Tiers<Row> => x.type === \"tiers\");\n if (!d) return spec;\n const columns = spec.columns.map((c): ColumnSpec<Row> => {\n if (!d.imageColumns.includes(c.key)) return { ...c, label: \"\" };\n return {\n key: c.key,\n label: \"\",\n kind: \"image\",\n height: d.imgHeight,\n ...(c.align ? { align: c.align } : {}),\n ...(c.width ? { width: c.width } : {}),\n };\n });\n return {\n ...spec,\n theme: { name: \"tier\", density: spec.theme.density, options: { style: d.style } },\n columns,\n };\n}\n\n/** gt_snake: N side-by-side blocks inside ONE <table>; each output row carries the FIRST block's data-row and row hooks.\n * Returns null when Python leaves the table unchanged (fewer than two blocks, or no rows). */\nexport function snakeLayout<Row>(\n d: Snake<Row>,\n rows: readonly Row[],\n headCells: string,\n ncol: number,\n rowHtml: (row: Row, i: number) => string,\n trOf: (i: number, cells: string) => string,\n gapTh: string,\n gapTd: string,\n): { head: string; body: string[] } | null {\n const blocks = snakeAlign(\n rows.map((row, i) => ({ row, i })),\n { nCols: d.nCols, ...(d.rowsPerCol !== undefined ? { rowsPerCol: d.rowsPerCol } : {}) },\n );\n if (blocks.length < 2 || rows.length === 0) return null;\n const per = blocks[0]?.length ?? 0;\n const blank = `<td class=\"sdvt-cell sdvt-blank\">${escapeHtml(d.fill)}</td>`.repeat(ncol);\n const body = Array.from({ length: per }, (_, k) =>\n trOf(\n blocks[0]?.[k]?.i ?? k,\n blocks\n .map((b) => {\n const e = b[k];\n return e ? rowHtml(e.row, e.i) : blank;\n })\n .join(gapTd),\n ),\n );\n return { head: blocks.map(() => headCells).join(gapTh), body };\n}\n","// src/html/parts.ts — Phase 4's renderHTML body (moved from index.ts), split into strings so the static path,\n// renderHTML(table), hydrate and <SdvTable/> share ONE renderer (Phase 5 Task 2).\nimport { warn } from \"@sportsdataverse/sdvplot\";\nimport type { Sort, TableCursor } from \"../engine.js\";\nimport { TableSpecError } from \"../errors.js\";\nimport type { ColumnSpec, Decoration, TableSpec, ThemeRef } from \"../spec.js\";\nimport { fnv1a32, tableId } from \"../table-id.js\";\nimport { BASE_CSS, tokensCSS } from \"../themes/base-css.js\";\nimport { resolveTheme } from \"../themes/index.js\";\nimport type { GoogleFont, Theme } from \"../themes/tokens.js\";\nimport { type RenderContext, columnScales, isScaled, kindCellStyle, renderCell, teamIdsOf } from \"./cells.js\";\nimport { applyDecorations } from \"./decorations.js\";\nimport { cssValue, escapeAttr, escapeHtml, styleOf } from \"./escape.js\";\nimport { fontsLink } from \"./fonts.js\";\nimport { expandTiers, snakeLayout } from \"./layout.js\";\n\nexport interface RenderOptions {\n readonly css?: \"inline\" | \"none\";\n readonly fonts?: boolean;\n /** Phase 5: a sort button on every `sortable !== false` column, and aria-sort on the sorted one */\n readonly interactive?: boolean;\n /** Phase 5: the engine's current sort, for aria-sort */\n readonly sort?: Sort | null;\n /** Phase 5: engine-hidden column keys (merged with decoration-hidden columns); a key that is not a column throws `TableSpecError` */\n readonly hidden?: readonly string[];\n /** J31 (A5): page-relative indices of selected rows → `sdvt-selected` on their `<tr>` */\n readonly selected?: ReadonlySet<number>;\n /**\n * J31 (A4): rows the scale/legend domains, outlier limits and row-accent levels are computed from, and the rows\n * an index row selector (`boldRows([5])`) counts in; default the rendered rows. Interactive renders pass the\n * table's full source rows (A49), so nothing re-colours or moves while the user pages, filters, sorts or brushes.\n * It must hold the same row OBJECTS as `rows` (matched by identity, as the engine passes them), not equal copies:\n * a rendered row missing from it is colored from its own value (a rank fill gets none) and warns once per column.\n */\n readonly domainRows?: readonly unknown[];\n /**\n * Task 10 (A48): with `interactive`, render the table as a selectable ARIA grid: `role=\"grid\"` and\n * `aria-multiselectable=\"true\"` on the table, `tabindex=\"0\"` on the body row whose index is `grid.row` (clamped to\n * the rows) and `\"-1\"` on the others, `aria-selected` on every body row, and `sdvt-col-current` plus\n * `aria-current=\"true\"` on the header of `grid.col`. Ignored without `interactive`.\n */\n readonly grid?: TableCursor;\n}\n/** One render split into strings: `assemble` joins them into `renderHTML`'s output; `tableHTML` is the part that depends on the rows. */\nexport interface RenderedParts {\n /** the table id (`tableId(spec)`), also the wrapper's `id` */\n readonly id: string;\n /** the Google Fonts `<link>`, or \"\" */\n readonly link: string;\n /** class, id, data-sdvt-theme, data-sdvt-density — UNESCAPED values, in this order */\n readonly wrapperAttrs: Readonly<Record<string, string>>;\n /** the shared theme sheet (`styleSheet`) without the tag, or \"\" when css === \"none\" */\n readonly sheet: string;\n /** the decorations' own rules without the tag, or \"\" — part of the table block, so hydrate re-renders them */\n readonly rules: string;\n /** decoration blocks placed before the table element (top border bars and legends), or \"\" */\n readonly before: string;\n /** the caption element (title, subtitle), or \"\" */\n readonly caption: string;\n /** header rows above the main one, or \"\" (no decoration emits any yet) */\n readonly headRows: string;\n /** the `<th>` cells of the main header row */\n readonly head: string;\n /** each SHOWN column's header text, unescaped, keyed by column key (a marginalia rename and scaleNote suffix included): the toolbar's filter labels */\n readonly labels: ReadonlyMap<string, string>;\n /** every body `<tr>` (group header rows included) */\n readonly rows: string;\n /** the tfoot element (source notes, footnotes), or \"\" */\n readonly foot: string;\n /** decoration blocks placed after the table element (bottom border bars and legends), or \"\" */\n readonly after: string;\n /** the `<table>` tag's attributes with a leading space (Task 10: the grid role), or \"\" */\n readonly tableAttrs: string;\n}\n\nfunction checkKeys<Row>(spec: TableSpec<Row>, rows: readonly Row[]): void {\n const first = rows[0];\n if (first === undefined) return;\n const keys = new Set(Object.keys(first as object));\n for (const col of spec.columns) {\n const need: string[] = [\n col.key,\n ...(\"to\" in col ? [col.to] : []),\n ...(\"keys\" in col ? col.keys : []),\n ...(\"stack\" in col ? [col.stack, col.team] : []),\n ];\n for (const k of need)\n if (!keys.has(k))\n throw new TableSpecError(\n `column \"${k}\" (kind ${col.kind}) is not a key of the first row; keys are ${[...keys].join(\", \")}`,\n );\n }\n}\nfunction alignOf<Row>(col: ColumnSpec<Row>): \"left\" | \"center\" | \"right\" {\n if (col.align) return col.align;\n switch (col.kind) {\n case \"num\":\n case \"int\":\n case \"pct\":\n case \"rank\":\n case \"delta\":\n case \"tally\":\n case \"colorPills\":\n case \"colorRanks\":\n return \"right\";\n case \"logo\":\n case \"wordmark\":\n case \"headshot\":\n case \"indicatorBox\":\n case \"image\":\n return \"center\";\n default:\n return \"left\";\n }\n}\nexport function labelOf<Row>(col: ColumnSpec<Row>): string {\n return col.label ?? col.key.replace(/_/g, \" \").replace(/\\b\\w/g, (m) => m.toUpperCase());\n}\n\n/** Class shared by every table with the same theme name + density + options (two sdvTeam tables for different teams get different keys). */\nexport function themeKey(ref: ThemeRef): string {\n return `sdvt-t-${fnv1a32(JSON.stringify([ref.name, ref.density, Object.entries(ref.options ?? {}).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))]))}`;\n}\n/** The `<style>` body without the tag: token block + base sheet + the theme's own rules, scoped to `.sdvt-t-<key>`. A host page emits it once per key. */\nexport function styleSheet<Row>(spec: TableSpec<Row>, theme: Theme = resolveTheme(spec.theme)): string {\n const sel = `.${themeKey(spec.theme)}`;\n return `${tokensCSS(sel, theme.tokens)}\\n${BASE_CSS(sel)}\\n${theme.rules(sel)}`;\n}\n\n/** The `aria-sort` value of column `key` under `sort`: \"none\" unless `sort` is on that column. */\nexport function sortAria(sort: Sort | null | undefined, key: string): \"ascending\" | \"descending\" | \"none\" {\n if (!sort || sort.col !== key) return \"none\";\n return sort.dir === \"asc\" ? \"ascending\" : \"descending\";\n}\n/** ` k=\"v\"` for each entry, in order. Values are attribute-escaped; keys are NOT escaped, so they must be trusted names. */\nexport function attrsText(attrs: Readonly<Record<string, string>>): string {\n return Object.entries(attrs)\n .map(([k, v]) => ` ${k}=\"${escapeAttr(v)}\"`)\n .join(\"\");\n}\nconst styleTag = (css: string): string => (css ? `<style>${css}</style>` : \"\");\n/** The table block: the decorations' own `<style>`, then before + `<table>` + after. hydrate re-renders exactly this. */\nexport function tableHTML(p: RenderedParts): string {\n return `${styleTag(p.rules)}${p.before}<table${p.tableAttrs}>${p.caption}<thead>${p.headRows}<tr>${p.head}</tr></thead><tbody>${p.rows}</tbody>${p.foot}</table>${p.after}`;\n}\n/**\n * The fonts link, then the wrapper holding the theme sheet and `inner` (default: the table block).\n * `inner` is inserted as raw, unescaped HTML: pass trusted renderer output (`tableHTML`) only, never data.\n */\nexport function assemble(p: RenderedParts, inner: string = tableHTML(p)): string {\n return `${p.link ? `${p.link}\\n` : \"\"}<div${attrsText(p.wrapperAttrs)}>${styleTag(p.sheet)}${inner}</div>`;\n}\n\n/**\n * Render `rows` of `spec` as {@link RenderedParts}; `assemble(renderParts(spec, rows, opts))` is `renderHTML`'s output.\n * Throws `TableSpecError` for a column key missing from the first row, an unknown `hidden` key, or an invalid spec.\n */\nexport function renderParts<Row>(\n input: TableSpec<Row>,\n rows: readonly Row[],\n opts: RenderOptions = {},\n): RenderedParts {\n checkKeys(input, rows);\n const id = tableId(input); // the spec as built, before tier expansion\n const spec = expandTiers(input);\n const theme = resolveTheme(spec.theme);\n if (!/^[A-Za-z][\\w-]*$/.test(id))\n throw new TableSpecError(\n `table id ${JSON.stringify(id)} must match /^[A-Za-z][\\\\w-]*$/ (it becomes a CSS selector)`,\n );\n const sel = `#${id}`;\n const groupBy = spec.decorations.find(\n (d): d is Extract<Decoration<Row>, { type: \"groupBy\" }> => d.type === \"groupBy\",\n );\n const engineHidden = opts.hidden ?? [];\n const bad = engineHidden.filter((k) => !spec.columns.some((c) => c.key === k));\n if (bad.length > 0)\n throw new TableSpecError(\n `hidden names no column ${bad.map((k) => JSON.stringify(k)).join(\", \")}; columns are ${spec.columns.map((c) => c.key).join(\", \")}`,\n );\n const domainRows = (opts.domainRows ?? rows) as readonly Row[]; // J31 (A4)\n const grid = opts.interactive === true ? opts.grid : undefined; // Task 10 (A48)\n const tabRow = grid === undefined ? -1 : Math.min(grid.row, rows.length - 1); // exactly one tab stop\n const scales = columnScales(spec, rows, warn, domainRows);\n const ctx: RenderContext<Row> = {\n spec,\n rows,\n domainRows,\n theme,\n id,\n sel,\n columns: spec.columns,\n groupKey: groupBy?.key,\n warn,\n teamIds: teamIdsOf(spec, rows),\n scales,\n recorded: scales.get(spec.columns.filter(isScaled).at(-1)?.key ?? \"\"), // none when the last one was skipped (zero rows)\n scaled: new Map(),\n };\n const deco = applyDecorations(spec, rows, ctx);\n const visible = spec.columns.filter((c) => !deco.hiddenColumns.has(c.key) && !engineHidden.includes(c.key));\n const ncol = visible.length;\n const span = Math.max(1, ncol); // every column hidden: a colspan is never 0\n const labels = new Map(\n visible.map((c) => [c.key, (deco.labelText.get(c.key) ?? labelOf(c)) + deco.labelSuffix(c.key)] as const),\n );\n let head = visible\n .map((c) => {\n const label = `${deco.label(c, labels.get(c.key) as string)}${c.subheader ? `<span class=\"sdvt-subheader\">${escapeHtml(c.subheader)}</span>` : \"\"}`;\n const sortable = opts.interactive === true && c.sortable !== false;\n const dir = sortAria(opts.sort, c.key);\n const aria = sortable && dir !== \"none\" ? ` aria-sort=\"${dir}\"` : \"\"; // ARIA 1.2: only the sorted header carries it\n const inner = sortable\n ? `<button type=\"button\" class=\"sdvt-sort\" data-sdv-sort=\"${escapeAttr(c.key)}\">${label}</button>`\n : label;\n const isCurrent = grid?.col === c.key;\n const current = isCurrent ? \" sdvt-col-current\" : \"\";\n // fix 1 (I2): the column `s` sorts, for assistive tech too (the class is only the visual marker)\n const currentAria = isCurrent ? ' aria-current=\"true\"' : \"\";\n return `<th scope=\"col\" class=\"sdvt-label sdvt-${escapeAttr(alignOf(c))}${current}\" data-col=\"${escapeAttr(c.key)}\" data-kind=\"${escapeAttr(c.kind)}\"${currentAria}${aria}${styleOf([c.width ? `width:${escapeAttr(cssValue(c.width, `column ${c.key} width`))}` : \"\", deco.labelStyle(c.key)])}>${inner}</th>`;\n })\n .join(\"\");\n const cellsOf = (row: Row, i: number): string =>\n visible\n .map(\n (c) =>\n `<td class=\"sdvt-cell sdvt-kind-${escapeAttr(c.kind)} sdvt-${escapeAttr(alignOf(c))}\" data-col=\"${escapeAttr(c.key)}\"${styleOf([kindCellStyle(c, row, i, ctx), deco.cellStyle(i, c.key)])}>${renderCell(c, row, i, ctx)}${deco.cellSuffix(i, c.key)}</td>`,\n )\n .join(\"\");\n // opt_row_striping: great_tables marks every second DISPLAYED data row (j % 2 == 1 over the body in display order, group headers not counted)\n const striped = theme.tokens.stripe !== \"transparent\";\n let shown = 0;\n const gridRow = (i: number): string =>\n grid === undefined\n ? \"\"\n : ` tabindex=\"${i === tabRow ? 0 : -1}\" aria-selected=\"${opts.selected?.has(i) === true}\"`;\n const trOf = (i: number, cells: string): string =>\n `<tr class=\"sdvt-row${striped && shown++ % 2 === 1 ? \" sdvt-stripe\" : \"\"}${deco.rowClass(i)}${opts.selected?.has(i) === true ? \" sdvt-selected\" : \"\"}\" data-row=\"${i}\"${gridRow(i)}${styleOf([deco.rowStyle(i)])}>${cells}</tr>`;\n let body: string[] = [];\n const snake = spec.decorations.find(\n (d): d is Extract<Decoration<Row>, { type: \"snake\" }> => d.type === \"snake\",\n );\n if (snake && ctx.groupKey !== undefined) throw new TableSpecError(\"snake cannot be combined with groupBy\");\n // a snaked <tr> holds one row per block but carries only the first block's data-row, so a click or hover in\n // another block would select the wrong row, and every block repeats the sort buttons\n if (snake && opts.interactive === true)\n throw new TableSpecError(\n \"snake cannot be combined with an interactive table (renderHTML(table), hydrate, SdvTable); render it statically with renderHTML(spec, rows)\",\n );\n const gap = snake && snake.gap > 0 ? `style=\"width:${snake.gap}px;border:none\"` : \"\";\n const snaked = snake\n ? snakeLayout(\n snake,\n rows,\n head,\n ncol,\n cellsOf,\n trOf,\n gap ? `<th class=\"sdvt-gap\" ${gap}></th>` : \"\",\n gap ? `<td class=\"sdvt-gap\" ${gap}></td>` : \"\",\n )\n : null;\n if (snake && snaked) {\n head = snaked.head;\n body = snaked.body;\n if (snake.cleanGaps)\n deco.css.push(\n `${sel} .sdvt-gap,${sel} td.sdvt-blank{border:none!important;background:transparent!important;box-shadow:none!important}`,\n );\n } else {\n // Stable partition by first-appearance group (gt groupname_col): one header per group, rows keep their original index.\n const groups = new Map<unknown, number[]>();\n if (ctx.groupKey === undefined)\n groups.set(\n undefined,\n rows.map((_, i) => i),\n );\n else\n rows.forEach((row, i) => {\n const g = (row as Record<string, unknown>)[ctx.groupKey as string];\n const list = groups.get(g);\n if (list) list.push(i);\n else groups.set(g, [i]);\n });\n let groupIndex = -1;\n for (const [g, idxs] of groups) {\n groupIndex++;\n if (ctx.groupKey !== undefined)\n body.push(\n `<tr class=\"sdvt-group-row${deco.groupRowClass(groupIndex)}\"><th scope=\"rowgroup\" colspan=\"${span}\" class=\"sdvt-group\">${escapeHtml(g)}</th></tr>`,\n );\n for (const i of idxs) body.push(trOf(i, cellsOf(rows[i] as Row, i)));\n }\n }\n const fonts: GoogleFont[] = [...theme.fonts, ...deco.fonts];\n const name = spec.theme.name;\n return {\n id,\n link: opts.fonts === false ? \"\" : fontsLink(fonts), // css:\"none\" drops only the shared theme sheet (A98, A100)\n wrapperAttrs: {\n class: `sdvt sdvt-theme-${name} ${themeKey(spec.theme)}`,\n id,\n \"data-sdvt-theme\": name,\n \"data-sdvt-density\": spec.theme.density,\n },\n sheet: opts.css === \"none\" ? \"\" : styleSheet(spec, theme),\n rules: deco.css.join(\"\\n\"),\n before: deco.before,\n caption: deco.caption ? `<caption>${deco.caption}</caption>` : \"\",\n headRows: deco.headRows,\n head,\n labels,\n rows: body.join(\"\"),\n foot:\n deco.foot.length > 0\n ? `<tfoot>${deco.foot.map((f) => `<tr><td colspan=\"${span}\">${f}</td></tr>`).join(\"\")}</tfoot>`\n : \"\",\n after: deco.after,\n tableAttrs: grid === undefined ? \"\" : ' role=\"grid\" aria-multiselectable=\"true\"',\n };\n}\n// ponytail: renders the empty table to get the font link; cheap and always consistent with renderHTML\n/** The Google Fonts link element `renderHTML(spec, ...)` would emit (theme and decoration fonts), or \"\": for a page's head. */\nexport const fontsLinkFor = <Row>(spec: TableSpec<Row>): string => renderParts(spec, []).link;\n","import type { Table } from \"../engine.js\";\nimport { tableId } from \"../table-id.js\";\nimport { escapeAttr, escapeHtml } from \"./escape.js\";\nimport { type RenderOptions, assemble, renderParts, tableHTML } from \"./parts.js\";\n\n/** J31 (A4, A5): the engine-driven render options, built in ONE place for renderInteractive, hydrate and `<SdvTable/>`. */\nexport function tableRenderOptions<Row>(table: Table<Row>): RenderOptions {\n const sel = table.getSelection();\n return {\n interactive: true,\n sort: table.state.sort,\n hidden: table.state.hidden,\n selected: new Set(table.rows.flatMap((r, i) => (sel.has(table.rowId(r)) ? [i] : []))),\n // A49: always the full source rows, so colours, legends, outlier limits and row-accent palettes hold still\n // while the user pages, types, sorts or brushes, and index row selectors mean source rows\n domainRows: table.allRows,\n // Task 10 (A48): a selectable grid whose one tab stop is the cursor row\n grid: table.state.cursor,\n };\n}\n\n/** The pager's page text, `\"Page <page> of <pageCount>\"` with a 1-based page, e.g. `\"Page 1 of 3\"`. */\nexport function pagerLabel<Row>(table: Table<Row>): string {\n return `Page ${table.state.page + 1} of ${table.pageCount}`;\n}\n\n/**\n * M8: one input per filterable column that is SHOWN, labelled with its shown header text (`labels`, from\n * `RenderedParts.labels`, so a marginalia rename or scaleNote suffix carries over). A hidden column gets no input; a\n * filter already set on it stays active. The one rule renderToolbar, hydrate and `<SdvTable/>` all follow.\n */\nexport function filterInputs<Row>(\n table: Table<Row>,\n labels: ReadonlyMap<string, string>,\n): { key: string; label: string; value: string }[] {\n return table.columns.flatMap((c) => {\n const label = labels.get(c.key);\n const f = table.state.filters[c.key];\n return c.filterable === true && label !== undefined\n ? [{ key: c.key, label, value: typeof f === \"string\" ? f : \"\" }]\n : [];\n });\n}\n\n// a <label> that screen readers announce and sighted users never see; inline so the shared theme sheet stays unchanged\nexport const SR_ONLY: string =\n \"position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0\";\n/** `label` and `placeholder` are escaped HTML; `data` is a trusted attribute. */\nconst searchInput = (\n id: string,\n label: string,\n placeholder: string,\n cls: string,\n data: string,\n value: string,\n): string =>\n `<label for=\"${escapeAttr(id)}\" style=\"${SR_ONLY}\">${label}</label><input type=\"search\" id=\"${escapeAttr(id)}\" class=\"${cls}\" ${data} placeholder=\"${placeholder}\" value=\"${escapeAttr(value)}\"/>`;\n\n/**\n * Global search box, then one filter input per shown `filterable` column, each with a visually hidden `<label>`\n * naming the column by its shown header text. `value` is written last (React's attribute order). `labels` defaults\n * to a render of the table's current page; pass `renderParts(…).labels` when you already have one.\n */\nexport function renderToolbar<Row>(\n table: Table<Row>,\n labels: ReadonlyMap<string, string> = renderParts(table.spec, table.rows, tableRenderOptions(table)).labels,\n): string {\n const id = tableId(table.spec);\n const global = searchInput(\n `${id}-search`,\n \"Search all columns\",\n \"Search\",\n \"sdvt-global-filter\",\n 'data-sdv-global-filter=\"\"',\n table.state.globalFilter,\n );\n const perColumn = filterInputs(table, labels)\n .map((f, j) => {\n const label = `Filter ${escapeHtml(f.label)}`;\n return searchInput(\n `${id}-filter-${j}`,\n label,\n label,\n \"sdvt-filter\",\n `data-sdv-filter=\"${escapeAttr(f.key)}\"`,\n f.value,\n );\n })\n .join(\"\");\n return `<div class=\"sdvt-toolbar\">${global}${perColumn}</div>`;\n}\n\n/**\n * The pager: Previous and Next buttons around {@link pagerLabel}, a polite live region. Rendered only when\n * `pageSize` is finite. An edge button is `aria-disabled`, not `disabled`, so a keyboard user paging to the end\n * keeps focus on it (a disabled button drops focus to the page body); a click on it does nothing.\n */\nexport function renderPager<Row>(table: Table<Row>): string {\n const prev = table.state.page === 0 ? ' aria-disabled=\"true\"' : \"\";\n const next = table.state.page >= table.pageCount - 1 ? ' aria-disabled=\"true\"' : \"\";\n return `<nav class=\"sdvt-pager\" data-sdv-pager=\"\" aria-label=\"Pagination\"><button type=\"button\" class=\"sdvt-page\" data-sdv-page=\"prev\" aria-label=\"Previous page\"${prev}>‹</button><span class=\"sdvt-page-label\" data-sdv-page-label=\"\" aria-live=\"polite\">${pagerLabel(table)}</span><button type=\"button\" class=\"sdvt-page\" data-sdv-page=\"next\" aria-label=\"Next page\"${next}>›</button></nav>`;\n}\n\n/** The interactive document: the wrapper holding the style, toolbar, body block and pager, in that order. */\nexport function renderInteractive<Row>(table: Table<Row>, opts: RenderOptions = {}): string {\n const p = renderParts(table.spec, table.rows, { ...opts, ...tableRenderOptions(table) });\n const pager = table.state.pageSize === Number.POSITIVE_INFINITY ? \"\" : renderPager(table);\n return assemble(\n p,\n `${renderToolbar(table, p.labels)}<div class=\"sdvt-body\" data-sdv-body=\"\">${tableHTML(p)}</div>${pager}`,\n );\n}\n","import { type Table, type TableCursor, nextSortDir } from \"../engine.js\";\n\n// a body row of THIS table's block (a host page's or an outer table's tr[data-row] is never one)\nconst BODY_ROW = \"[data-sdv-body] tr.sdvt-row[data-row]\";\n\n/** J31: the engine id of the body row an event landed in; null for a header, toolbar, pager, group row, or outside the table. */\nexport function rowIdAt<Row>(table: Table<Row>, target: EventTarget | null): string | null {\n // scoped to the body block: a host page or outer table with its own tr[data-row] is never read as one of ours\n const tr = target instanceof Element ? target.closest(BODY_ROW) : null;\n const row = tr === null ? undefined : table.rows[Number(tr.getAttribute(\"data-row\"))];\n const id = row === undefined ? \"\" : table.rowId(row);\n return id === \"\" ? null : id;\n}\n\n/**\n * J31 (A18, A29): mark the body rows whose engine id is `id` with `sdvt-hover` and unmark the rest; `null` unmarks all.\n * A class toggle, never `innerHTML`, so it writes only the rows whose state changes. Shared by hydrate and\n * `<SdvTable/>`, which call it on each `hover` event AND after each body render, since a render rebuilds the rows.\n */\n// ponytail: O(rows on the page) reads per hover. Measured in the Phase 8 Task 5 review on a synthetic DOM of the same\n// shape as an unpaged 2,000-row table, not a hydrated one: 0.84 ms a hover in headless Chromium (26.5 ms in jsdom),\n// 0.19 ms at pageSize 25. Linear, so ~4 ms at 10,000 rows on one page, a quarter of a 60 Hz frame: past that, keep an\n// id → <tr> map rebuilt in render\nexport function applyHover<Row>(root: Element, table: Table<Row>, id: string | null): void {\n for (const tr of Array.from(root.querySelectorAll(BODY_ROW))) {\n const row = id === null ? undefined : table.rows[Number(tr.getAttribute(\"data-row\"))];\n tr.classList.toggle(\"sdvt-hover\", row !== undefined && table.rowId(row) === id);\n }\n}\n\n/** A click anywhere inside the table wrapper — shared by hydrate and `<SdvTable/>`. */\nexport function handleClick<Row>(table: Table<Row>, target: EventTarget | null): void {\n const el =\n target instanceof Element ? target.closest<HTMLElement>(\"[data-sdv-sort],[data-sdv-page]\") : null;\n if (!el) {\n // J31: a click on a body row toggles its id in the selection\n const id = rowIdAt(table, target);\n if (id === null) return;\n const next = new Set(table.getSelection());\n if (!next.delete(id)) next.add(id);\n table.setSelection(next);\n return;\n }\n if (el.getAttribute(\"aria-disabled\") === \"true\") return; // M1: an edge pager button keeps focus and does nothing\n const sortCol = el.getAttribute(\"data-sdv-sort\");\n const page = el.getAttribute(\"data-sdv-page\");\n if (sortCol !== null) table.setSort(sortCol, nextSortDir(table.state.sort, sortCol));\n else if (page === \"prev\") table.setPage(table.state.page - 1);\n else if (page === \"next\") table.setPage(table.state.page + 1);\n}\n\n/** An `input` event anywhere inside the wrapper. */\nexport function handleInput<Row>(table: Table<Row>, target: EventTarget | null): void {\n if (!(target instanceof HTMLInputElement)) return;\n const col = target.getAttribute(\"data-sdv-filter\");\n if (col !== null) table.setFilter(col, target.value === \"\" ? null : target.value);\n else if (target.hasAttribute(\"data-sdv-global-filter\")) table.setGlobalFilter(target.value);\n}\n\n/** J31: `mouseover` / `mouseleave` inside the wrapper → the engine's hover event (null off a body row). */\nexport function handleHover<Row>(table: Table<Row>, target: EventTarget | null): void {\n table.setHover(rowIdAt(table, target));\n}\n\n// M5: the attributes that name a control; a control rebuilt under focus gets focus back by name\nconst CONTROLS = [\"data-sdv-sort\", \"data-sdv-filter\", \"data-sdv-global-filter\", \"data-sdv-page\"] as const;\nconst FOCUSABLE = \"a[href],button,input,select,textarea,[tabindex]\";\n\n/**\n * Remembers what has focus inside `el` by names a re-render keeps: a control by its `data-sdv-*` attribute (and an\n * input's caret), a focusable element inside a rendered cell by row, column key and its index among that cell's\n * focusables. Call it before a re-render; the returned function, called after it, moves focus to the rebuilt element\n * when the re-render replaced the focused one (shadow-root mounts included), and does nothing otherwise. Shared by\n * hydrate and `<SdvTable/>`.\n */\nexport function captureFocus(el: Element): () => void {\n const root = el.getRootNode() as Document | ShadowRoot;\n const focused = root.activeElement ?? el.ownerDocument.activeElement;\n if (focused === null || !el.contains(focused)) return () => {};\n const name = CONTROLS.find((a) => focused.hasAttribute(a));\n const value = name === undefined ? null : focused.getAttribute(name);\n const caret =\n focused instanceof HTMLInputElement\n ? { start: focused.selectionStart, end: focused.selectionEnd }\n : undefined;\n const td = name === undefined ? focused.closest(\"[data-sdv-body] tr[data-row] td[data-col]\") : null;\n const cellAt = td\n ? {\n row: td.parentElement?.getAttribute(\"data-row\"),\n col: td.getAttribute(\"data-col\"),\n n: Array.from(td.querySelectorAll(FOCUSABLE)).indexOf(focused),\n }\n : undefined;\n // Task 10: the focused body row itself (the grid's roving tab stop) comes back by its data-row\n const row = name === undefined && focused.matches(BODY_ROW) ? focused.getAttribute(\"data-row\") : null;\n return () => {\n if (el.contains(focused)) return;\n if (name !== undefined) {\n const next = Array.from(el.querySelectorAll<HTMLElement>(`[${name}]`)).find(\n (n) => n.getAttribute(name) === value,\n );\n next?.focus();\n if (next instanceof HTMLInputElement && caret?.start != null && caret.end != null)\n next.setSelectionRange(caret.start, caret.end);\n } else if (row !== null) {\n Array.from(el.querySelectorAll<HTMLElement>(BODY_ROW))\n .find((r) => r.getAttribute(\"data-row\") === row)\n ?.focus();\n } else if (cellAt && cellAt.n >= 0) {\n const tds = Array.from(el.querySelectorAll(\"[data-sdv-body] tr[data-row]\"))\n .find((r) => r.getAttribute(\"data-row\") === cellAt.row)\n ?.querySelectorAll(\"td[data-col]\");\n const cell = Array.from(tds ?? []).find((c) => c.getAttribute(\"data-col\") === cellAt.col);\n cell?.querySelectorAll<HTMLElement>(FOCUSABLE)[cellAt.n]?.focus();\n }\n };\n}\n\n/** Task 10: what a key means to an interactive table (see {@link keyAction}). */\nexport type KeyAction =\n | { readonly type: \"cursor\"; readonly row: number; readonly col: string | null }\n | { readonly type: \"sort\"; readonly col: string }\n | { readonly type: \"search\" }\n | { readonly type: \"toggle\"; readonly row: number };\n\n/** Task 10: everything {@link keyAction} reads; {@link handleKeydown} gathers it from the engine and the DOM. */\nexport interface KeyContext {\n /** the `data-row` of the body row the key landed in, or null (toolbar, header, pager) */\n readonly focused: number | null;\n /**\n * the key landed on that body row itself, not on a link or button inside it (that control keeps its Enter, Space\n * and left/right keys)\n */\n readonly onRow: boolean;\n /** the engine's cursor (`table.state.cursor`) */\n readonly cursor: TableCursor;\n /** the sorted column (`table.state.sort?.col`), or null */\n readonly sorted: string | null;\n /** the shown sortable columns in header order: the `data-sdv-sort` buttons */\n readonly cols: readonly string[];\n /** the page's body rows' `data-row` values in display order (`groupBy` reorders them) */\n readonly order: readonly number[];\n /** `spec.interactive.hotkeys !== false`: the letter keys and `/` are on */\n readonly hotkeys: boolean;\n}\n\ntype Move = \"down\" | \"up\" | \"left\" | \"right\" | \"sort\" | \"search\" | \"toggle\";\n// a Map, not an object literal: KEYS[\"constructor\"] would be Object.prototype's and slip past the undefined check\nconst KEYS: ReadonlyMap<string, Move> = new Map([\n [\"j\", \"down\"],\n [\"k\", \"up\"],\n [\"h\", \"left\"],\n [\"l\", \"right\"],\n [\"s\", \"sort\"],\n [\"/\", \"search\"],\n [\"ArrowDown\", \"down\"],\n [\"ArrowUp\", \"up\"],\n [\"ArrowLeft\", \"left\"],\n [\"ArrowRight\", \"right\"],\n [\"Enter\", \"toggle\"],\n [\" \", \"toggle\"],\n]);\n// G19's keys, which `hotkeys: false` turns off; the arrows, Enter and Space are the grid's own keyboard model\nconst LETTERS: ReadonlySet<string> = new Set([\"j\", \"k\", \"h\", \"l\", \"s\", \"/\"]);\nconst clamp = (i: number, n: number): number => Math.max(0, Math.min(i, n - 1));\n\n/**\n * Task 10 (A45, G19): the action a keydown means, or null when it means nothing here. Pure. `j`/`k` (and the down and\n * up arrows) move the cursor row in display order, and enter the grid at the cursor row when the key came from\n * outside the rows; `h`/`l` (left and right arrows) move the cursor column over the shown sortable columns, starting\n * from the cursor column, else the sorted one, else the first; `s` sorts that column; `/` goes to the search box;\n * Enter and Space toggle the selection of the row the key landed on. Moves stop at the edges: `j`/`k` stop at the\n * first and last row of the CURRENT page and never turn it (the pager does), `h`/`l` at the first and last sortable\n * column. A left/right key that lands on a link or button inside a row (`focused` set, `onRow` false) is that\n * control's: null.\n *\n * @example\n * ```ts\n * import { keyAction } from \"@sportsdataverse/sdvtables/html\";\n *\n * // `l` on the first row of a table sorted by wins: the cursor column moves right, to net_epa\n * keyAction(\"l\", {\n * focused: 0,\n * onRow: true,\n * cursor: { row: 0, col: null },\n * sorted: \"wins\",\n * cols: [\"team\", \"wins\", \"net_epa\"],\n * order: [0, 1, 2],\n * hotkeys: true,\n * });\n * ```\n */\nexport function keyAction(key: string, k: KeyContext): KeyAction | null {\n const what = KEYS.get(key);\n if (what === undefined || (!k.hotkeys && LETTERS.has(key))) return null;\n const shown = (c: string | null): c is string => c !== null && k.cols.includes(c);\n const col = shown(k.cursor.col) ? k.cursor.col : shown(k.sorted) ? k.sorted : (k.cols[0] ?? null);\n const row = k.focused ?? k.cursor.row;\n switch (what) {\n case \"down\":\n case \"up\": {\n const at = k.order.indexOf(row);\n if (at < 0) return null;\n const next = k.focused === null ? row : k.order[clamp(at + (what === \"down\" ? 1 : -1), k.order.length)];\n return next === undefined ? null : { type: \"cursor\", row: next, col: k.cursor.col };\n }\n case \"left\":\n case \"right\": {\n if (k.focused !== null && !k.onRow) return null; // fix 1: a link or button in a cell keeps its own left/right\n const step = what === \"right\" ? 1 : -1;\n const next = col === null ? undefined : k.cols[clamp(k.cols.indexOf(col) + step, k.cols.length)];\n return next === undefined ? null : { type: \"cursor\", row, col: next };\n }\n case \"sort\":\n return col === null ? null : { type: \"sort\", col };\n case \"search\":\n return { type: \"search\" };\n case \"toggle\":\n return k.onRow && k.focused !== null ? { type: \"toggle\", row: k.focused } : null;\n }\n}\n\n// typing in a field is never a hotkey (A45); contenteditable=\"false\" is not a field\nconst TEXT_FIELD = 'input,textarea,select,[contenteditable]:not([contenteditable=\"false\"])';\n\n/**\n * Task 10 (A45, A48): a keydown anywhere inside `root`, the table wrapper; shared by hydrate and `<SdvTable/>`.\n * Ignored with Ctrl, Meta or Alt held, during IME composition, or when it comes from a text field (input, textarea,\n * select, contenteditable). Otherwise {@link keyAction} decides, and a key that acts is consumed (`preventDefault`):\n * a cursor move focuses the destination row BEFORE the engine re-renders, so the re-render's focus restore keeps it\n * there; `s` and Enter/Space go through {@link handleClick} on the column's sort button or on the row, exactly as a\n * click, once per press (a held key's repeats are consumed but toggle nothing); `/` focuses the search box, and passes\n * through to the browser (quick-find) when `root` has none. `spec.interactive.hotkeys: false` leaves only the arrows,\n * Enter and Space.\n *\n * @example\n * ```ts\n * import { createTable, defineTable } from \"@sportsdataverse/sdvtables\";\n * import { handleKeydown, renderHTML } from \"@sportsdataverse/sdvtables/html\";\n *\n * // 2024 AFC: Kansas City 15 wins, Buffalo 13\n * const spec = defineTable<{ team: string; wins: number }>()\n * .columns((c) => [c.text(\"team\"), c.int(\"wins\")])\n * .build();\n * const table = createTable(spec, [\n * { team: \"KC\", wins: 15 },\n * { team: \"BUF\", wins: 13 },\n * ]);\n * const root = document.createElement(\"div\");\n * root.innerHTML = renderHTML(table, { fonts: false });\n * root.addEventListener(\"keydown\", (e) => handleKeydown(table, root, e));\n * root\n * .querySelector(\"[data-sdv-body] tr[data-row]\")\n * ?.dispatchEvent(new KeyboardEvent(\"keydown\", { key: \"j\", bubbles: true, cancelable: true }));\n * table.state.cursor; // { row: 1, col: null }\n * ```\n */\nexport function handleKeydown<Row>(table: Table<Row>, root: Element, e: KeyboardEvent): void {\n const t = e.target;\n if (e.defaultPrevented || e.isComposing || e.ctrlKey || e.metaKey || e.altKey) return;\n if (!(t instanceof Element) || t.closest(TEXT_FIELD) !== null) return;\n const rows = Array.from(root.querySelectorAll<HTMLElement>(BODY_ROW));\n const sorts = Array.from(root.querySelectorAll<HTMLElement>(\"[data-sdv-body] [data-sdv-sort]\"));\n const near = t.closest(BODY_ROW);\n const rowEl = near !== null && root.contains(near) ? near : null; // never an outer table's row\n const s = table.state;\n const action = keyAction(e.key, {\n focused: rowEl === null ? null : Number(rowEl.getAttribute(\"data-row\")),\n onRow: rowEl === t,\n cursor: s.cursor,\n sorted: s.sort?.col ?? null,\n cols: sorts.map((b) => b.getAttribute(\"data-sdv-sort\") ?? \"\"),\n order: rows.map((r) => Number(r.getAttribute(\"data-row\"))),\n hotkeys: table.spec.interactive?.hotkeys !== false,\n });\n const box = action?.type === \"search\" ? root.querySelector<HTMLElement>(\"[data-sdv-global-filter]\") : null;\n if (action === null || (action.type === \"search\" && box === null)) return; // fix 1 (I1): no box, `/` is the browser's\n e.preventDefault();\n if (action.type === \"search\") box?.focus();\n else if (action.type === \"sort\")\n handleClick(table, sorts.find((b) => b.getAttribute(\"data-sdv-sort\") === action.col) ?? null);\n else if (action.type === \"toggle\") {\n if (!e.repeat) handleClick(table, rowEl); // fix 1: holding Enter or Space toggles once, not at key-repeat rate\n } else {\n // focus first: hydrate and <SdvTable/> restore focus to the focused row's data-row after the re-render\n rows.find((r) => r.getAttribute(\"data-row\") === String(action.row))?.focus();\n table.setCursor(action.row, action.col);\n }\n}\n"]}
|