@vio-live/web-sdk 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 +66 -24
- package/dist/{chunk-4CCGE7DE.js → chunk-7JSSYPRN.js} +1548 -1708
- package/dist/chunk-7JSSYPRN.js.map +1 -0
- package/dist/{chunk-5SPY7TH6.js → chunk-SOO2G6CF.js} +4 -4
- package/dist/chunk-SOO2G6CF.js.map +1 -0
- package/dist/core/index.js +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.js +1 -2
- package/dist/react/index.d.ts +23 -0
- package/dist/react/index.js +74 -0
- package/dist/react/index.js.map +1 -0
- package/dist/ui/index.d.ts +29 -4
- package/dist/ui/index.js +136 -2
- package/dist/ui/index.js.map +1 -1
- package/dist/{vio-checkout-D8B4Upk8.d.ts → vio-checkout-CrC5tvmh.d.ts} +0 -1
- package/package.json +18 -2
- package/dist/chunk-4CCGE7DE.js.map +0 -1
- package/dist/chunk-5SPY7TH6.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/tokens.ts","../src/ui/components/vio-product.ts","../src/ui/components/vio-product-carousel.ts","../src/ui/components/vio-product-detail.ts","../src/ui/components/vio-cart.ts","../src/ui/components/vio-checkout.ts","../src/ui/index.ts"],"names":["LitElement","html","css","property","state","customElement"],"mappings":";;;;;AAcO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,6CAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,GAAA;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU,GAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,OAAA;AAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,GAAA;AAAA,IACN,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM;AAAA;AAEV;AAOA,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA,gCAAA,EAGW,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,gCAAA,EAC5B,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,gCAAA,EAC9B,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,gCAAA,EAC7B,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;;AAAA;AAAA,wBAAA,EAGtC,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;;AAAA;AAAA,+BAAA,EAGzB,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,+BAAA,EAC5B,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,+BAAA,EAC7B,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;;AAAA;AAAA,gCAAA,EAG5B,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,gCAAA,EAC7B,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;;AAAA;AAAA,sBAAA,EAGxC,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,sBAAA,EACpB,SAAA,CAAU,KAAK,IAAI,CAAA;;AAAA;AAAA,mBAAA,EAGtB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;;AAAA;AAAA,0BAAA,EAGV,SAAA,CAAU,SAAS,KAAK,CAAA;;AAAA;AAAA,oBAAA,EAG9B,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;;AAAA;AAAA,qBAAA,EAGjB,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,qBAAA,EACnB,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,qBAAA,EACnB,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA;AAAA,CAAA;AAI1C,SAAS,YAAA,GAAqB;AAC5B,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,QAAA,CAAS,aAAA,CAAc,0BAA0B,CAAA,KAAM,IAAA,EAAM;AACjE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,YAAA,CAAa,YAAY,QAAQ,CAAA;AACvC,EAAA,KAAA,CAAM,WAAA,GAAc,cAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;AAEA,YAAA,EAAa;AClIN,IAAM,UAAA,GAAN,cAAyB,UAAA,CAAW;AAAA,EAApC,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEuB,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAA;AAER,IAAA,IAAA,CAAA,IAAA,GAAO,EAAA;AAEP,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAA;AAER,IAAA,IAAA,CAAA,QAAA,GAAW,EAAA;AAEa,IAAA,IAAA,CAAA,QAAA,GAAW,EAAA;AAEV,IAAA,IAAA,CAAA,SAAA,GAAY,EAAA;AAEZ,IAAA,IAAA,CAAA,SAAA,GAAY,EAAA;AAGT,IAAA,IAAA,CAAA,WAAA,GAAc,KAAA;AAG7D,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAEjB,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAA;AAElB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AAE7B,IAAA,IAAA,CAAQ,eAAA,GAAkB,MAAY,IAAA,CAAK,YAAA,EAAa;AAAA,EAAA;AAAA,EA+G/C,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,eAAe,CAAA;AAAA,EAC1D;AAAA,EAES,oBAAA,GAA6B;AACpC,IAAA,GAAA,CAAI,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAAA,EAC7B;AAAA,EAES,QAAQ,OAAA,EAAqC;AAEpD,IAAA,IAAI,OAAA,CAAQ,IAAI,WAAW,CAAA,IAAK,QAAQ,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,YAAA,EAAa;AAAA,EAC9E;AAAA;AAAA,EAGQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACjC,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,QAAQ,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAO,EAAG;AAClD,MAAA,IAAI,MAAA,CAAO,SAAS,GAAG,CAAA,IAAK,MAAM,CAAA,IAAK,IAAA,CAAK,cAAc,GAAA,EAAK;AAC/D,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,EAAO,IAAI,MAAA,CAAO,EAAE,SAAS,CAAA,KAAM,GAAA,EAAK,GAAA,IAAO,CAAA,CAAE,QAAA;AAAA,IACxE;AACA,IAAA,IAAA,CAAK,SAAS,GAAA,GAAM,CAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AAAA,EACjB;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,YAAY,mBAAA,EAAqB;AAAA,QACnC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK;AAAA;AACjB,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,UAAU,CAAA,EAAwB;AACxC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,CAAA,EAAgB;AAC5B,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,YAAY,iBAAA,EAAmB;AAAA,QACjC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK;AAAA;AACjB,OACD;AAAA,KACH;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB,GAAG,GAAG,CAAA;AAAA,EACR;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAO,IAAA;AAAA;AAAA;AAAA,eAAA,EAGM,KAAK,OAAO;AAAA,iBAAA,EACV,KAAK,SAAS;AAAA;AAAA;AAAA,mBAAA,EAGZ,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAE;AAAA;AAAA;AAAA,UAAA,EAGnD,IAAA,CAAK,QAAA,GACH,IAAA,CAAA,SAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAA,kBAAA,CAAA,GAC5D,EAAE;AAAA;AAAA,2BAAA,EAEa,IAAA,CAAK,SAAS,SAAA,GAAY,EAAE,IAAI,IAAA,CAAK,SAAA,GAAY,QAAQ,EAAE,CAAA;AAAA,mBAAA,EACnE,KAAK,KAAK;AAAA,uBAAA,EACN,IAAA,CAAK,MAAA,GAAS,uCAAA,GAAqC,aAAa;AAAA,kBAAA,EACrE,IAAA,CAAK,MAAA,GAAS,gBAAA,GAAmB,aAAa;AAAA;AAAA,YAAA,EAEpD,IAAA,CAAK,SACH,IAAA,CAAK,OAAA,GAAU,IACb,IAAA,CAAA,wBAAA,EAA+B,IAAA,CAAK,OAAO,CAAA,OAAA,CAAA,GAC3C,IAAA,CAAA;AAAA;AAAA,wBAAA,CAAA,GAGF,IAAA,CAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,CAIO;AAAA;AAAA;AAAA;AAAA,UAAA,EAIX,KAAK,KAAA,GAAQ,IAAA,CAAA,mBAAA,EAA0B,IAAA,CAAK,KAAK,WAAW,EAAE;AAAA,UAAA,EAC9D,KAAK,IAAA,GAAO,IAAA,CAAA,kBAAA,EAAyB,IAAA,CAAK,IAAI,WAAW,EAAE;AAAA,UAAA,EAC3D,KAAK,KAAA,GAAQ,IAAA,CAAA,mBAAA,EAA0B,IAAA,CAAK,KAAK,WAAW,EAAE;AAAA,UAAA,EAC9D,KAAK,QAAA,GAAW,IAAA,CAAA,sBAAA,EAA6B,IAAA,CAAK,QAAQ,WAAW,EAAE;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAIjF;AACF;AA7Qa,UAAA,CA4BK,MAAA,GAAS,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA1BG,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAFf,UAAA,CAEiB,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAJf,UAAA,CAIiB,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EANf,UAAA,CAMiB,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EARf,UAAA,CAQiB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEwB,eAAA,CAAA;AAAA,EAAnD,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,aAAa;AAAA,CAAA,EAVvC,UAAA,CAUyC,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEC,eAAA,CAAA;AAAA,EAApD,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAZxC,UAAA,CAY0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAApD,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAdxC,UAAA,CAc0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAGG,eAAA,CAAA;AAAA,EAAvD,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAgB;AAAA,CAAA,EAjB3C,UAAA,CAiB6C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAGvC,eAAA,CAAA;AAAA,EAAhB,KAAA;AAAM,CAAA,EApBI,UAAA,CAoBM,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhB,KAAA;AAAM,CAAA,EAtBI,UAAA,CAsBM,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhB,KAAA;AAAM,CAAA,EAxBI,UAAA,CAwBM,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAxBN,UAAA,GAAN,eAAA,CAAA;AAAA,EADN,cAAc,aAAa;AAAA,CAAA,EACf,UAAA,CAAA;ACgBN,IAAM,kBAAA,GAAN,cAAiCA,UAAAA,CAAW;AAAA,EAA5C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEuB,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAA;AAER,IAAA,IAAA,CAAA,OAAA,GAAU,EAAA;AAEV,IAAA,IAAA,CAAA,UAAA,GAAa,EAAA;AAEc,IAAA,IAAA,CAAA,UAAA,GAAa,EAAA;AAEZ,IAAA,IAAA,CAAA,WAAA,GAAc,SAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa,EAAA;AAEZ,IAAA,IAAA,CAAA,WAAA,GAAc,EAAA;AAEhB,IAAA,IAAA,CAAA,SAAA,GAAY,CAAA;AAUV,IAAA,IAAA,CAAA,WAAA,GAAc,EAAA;AAEzC,IAAA,IAAA,CAAA,QAAA,GAAW,KAAA;AAG9B,IAAA,IAAA,CAAQ,OAAA,GAAiE,IAAA;AACzE,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,UAAA,GAAa,EAAA;AAAA,EAAA;AAAA,EAkJrB,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAI,KAAK,WAAA,CAAY,IAAA,MAAU,IAAA,CAAK,UAAA,CAAW,MAAK,EAAG;AACrD,MAAA,KAAK,KAAK,SAAA,EAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAES,QAAQ,OAAA,EAAqC;AACpD,IAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,GAAA,CAAI,aAAa,KACzB,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IACxB,QAAQ,GAAA,CAAI,aAAa,CAAA,IACzB,OAAA,CAAQ,IAAI,WAAW,CAAA;AACzB,IAAA,IAAI,WAAA,KAAgB,KAAK,WAAA,CAAY,IAAA,MAAU,IAAA,CAAK,UAAA,CAAW,MAAK,CAAA,EAAI;AACtE,MAAA,KAAK,KAAK,SAAA,EAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,SAAA,GAA2B;AACvC,IAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,UAAA,GAAa,4DAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,MAAK,GAC/B,IAAA,CAAK,UAAU,IAAA,CAAK,WAAW,IAC/B,IAAA,CAAK,UAAA,CACF,MAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,SAAS,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAC,EACjC,MAAA,CAAO,CAAC,MAAM,CAAC,MAAA,CAAO,MAAM,CAAC,CAAC,EAC9B,GAAA,CAAI,CAAC,QAAQ,EAAE,SAAA,EAAW,KAAK,SAAA,EAAW,SAAA,EAAW,IAAG,CAAE,CAAA;AAEjE,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,IAAA,CAAK,UAAU,EAAC;AAChB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,SAAS,KAAK,EAAC;AAC3C,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,SAAS,CAAA;AACpB,QAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,GAAG,CAAA;AAAA,MAChC;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5B,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,SAAA,EAAW,GAAG,CAAA,KAAM;AAC9D,UAAA,MAAM,QAAA,GACJ,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAY,IAAA,EAAK,KAAM,EAAA,GAC5C,GAAA,CAAI,gBAAgB,IAAA,CAAK,WAAW,CAAA,GACpC,GAAA,CAAI,YAAY,SAAS,CAAA;AAC/B,UAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,QAAA,CAAS;AAAA,YACvD,WAAA,EAAa,GAAA;AAAA,YACb,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,OAAO,EAAE,WAAW,QAAA,EAAS;AAAA,QAC/B,CAAC;AAAA,OACH;AAGA,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAqB;AACxC,MAAA,KAAA,MAAW,EAAE,SAAA,EAAW,QAAA,EAAS,IAAK,OAAA,EAAS;AAC7C,QAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,MAChE;AACA,MAAA,IAAA,CAAK,UAAU,IAAA,CACZ,GAAA,CAAI,CAAC,EAAE,SAAA,EAAW,WAAU,KAAM;AACjC,QAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,GAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AACtD,QAAA,OAAO,OAAA,GAAU,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,IAAA;AAAA,MAC5C,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAoD,MAAM,IAAI,CAAA;AAAA,IAC3E,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,aAAa,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,IAEnE,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,UAAU,GAAA,EAA8D;AAC9E,IAAA,OAAO,GAAA,CACJ,MAAM,GAAG,CAAA,CACT,IAAI,CAAC,IAAA,KAAS,KAAK,IAAA,EAAM,EACzB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACvC,MAAA,MAAM,MAAM,QAAA,CAAA,CAAU,MAAA,IAAU,EAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAC9C,MAAA,MAAM,MAAM,QAAA,CAAA,CAAU,MAAA,IAAU,EAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAC9C,MAAA,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,GAAG,OAAO,IAAA;AACnD,MAAA,OAAO,EAAE,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAAA,IAC1C,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAqD,MAAM,IAAI,CAAA;AAAA,EAC5E;AAAA,EAEQ,kBAAkB,SAAA,EAAyB;AACjD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,YAAY,CAAA;AACrD,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,EAAM,WAAA,IAAe,GAAA,IAAO,EAAA;AAC1C,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,EAAE,IAAA,EAAM,YAAY,IAAA,GAAO,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EAC3E;AAAA,EAEQ,qBAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,OAAA,EAAS;AAEnC,MAAA,OAAOC,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA;AAAA,QACtC,MAAMA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA;AAAA,OAOP,CAAA,CAAA;AAAA,IACH;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,MAAA,OAAOA,IAAAA,CAAAA,EAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAU,KAAM;AAC5D,QAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,CAAC,CAAA,IAAK,EAAA;AAClC,QAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,SAAS,CAAA,IAAK,EAAE,KAAA,IAAS,EAAA;AACnE,QAAA,OAAOA,IAAAA;AAAA;AAAA,uBAAA,EAEU,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC;AAAA,uBAAA,EACZ,MAAA,CAAO,SAAS,CAAC;AAAA,kBAAA,EACtB,CAAA,CAAE,SAAS,EAAE;AAAA,iBAAA,EACd,EAAE,KAAK;AAAA,kBAAA,EACN,YAAA,CAAa,CAAC,CAAC;AAAA,qBAAA,EACZ,QAAQ;AAAA,sBAAA,EACP,GAAG;AAAA,0BAAA,EAAA,CACE,CAAA,CAAE,QAAA,EAAU,MAAA,IAAU,CAAA,IAAK,CAAC;AAAA;AAAA,QAAA,CAAA;AAAA,MAGnD,CAAC,CAAC,CAAA,CAAA;AAAA,IACJ;AAEA,IAAA,OAAOA,IAAAA,CAAAA,aAAAA,CAAAA;AAAA,EACT;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA,UAAA,EAGC,KAAK,KAAA,GAAQA,IAAAA,CAAAA,mBAAAA,EAA0B,IAAA,CAAK,KAAK,WAAW,EAAE;AAAA;AAAA,YAAA,EAE5D,KAAK,OAAA,GAAUA,IAAAA,CAAAA,oBAAAA,EAA2B,IAAA,CAAK,OAAO,UAAU,EAAE;AAAA,YAAA,EAClE,KAAK,UAAA,GAAaA,IAAAA,CAAAA,0BAAAA,EAAiC,IAAA,CAAK,UAAU,aAAa,EAAE;AAAA;AAAA;AAAA,QAAA,EAGrF,IAAA,CAAK,aACHA,IAAAA,CAAAA,wBAAAA,EAA+B,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,IAAA,CAAA,GAClE,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAKK,MAAM,IAAA,CAAK,iBAAA,CAAkB,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKnB,IAAA,CAAK,uBAAuB,CAAA;AAAA;AAAA;AAAA,iBAAA,EAGzC,MAAM,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EAM1C,IAAA,CAAK,cAAc,CAAC,IAAA,CAAK,UACvBA,IAAAA,CAAAA,yBAAAA,EAAgC,IAAA,CAAK,UAAU,CAAA,MAAA,CAAA,GAC/C,EAAE;AAAA,IAAA,CAAA;AAAA,EAEV;AACF;AAlWa,kBAAA,CAoCK,MAAA,GAASC,GAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAlCG,eAAA,CAAA;AAAA,EAA3BC,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAFf,kBAAA,CAEiB,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAJf,kBAAA,CAIiB,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EANf,kBAAA,CAMiB,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAE2B,eAAA,CAAA;AAAA,EAAtDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,gBAAgB;AAAA,CAAA,EAR1C,kBAAA,CAQ4C,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAEC,eAAA,CAAA;AAAA,EAAvDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,iBAAiB;AAAA,CAAA,EAV3C,kBAAA,CAU6C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAGF,eAAA,CAAA;AAAA,EAArDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,eAAe;AAAA,CAAA,EAbzC,kBAAA,CAa2C,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAEC,eAAA,CAAA;AAAA,EAAtDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,gBAAgB;AAAA,CAAA,EAf1C,kBAAA,CAe4C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAEF,eAAA,CAAA;AAAA,EAApDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAjBxC,kBAAA,CAiB0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAUE,eAAA,CAAA;AAAA,EAAtDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,gBAAgB;AAAA,CAAA,EA3B1C,kBAAA,CA2B4C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAE3B,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EA7Bf,kBAAA,CA6BiB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,MAAM,WAAW;AAAA,CAAA,EA/BP,kBAAA,CA+BiB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACX,eAAA,CAAA;AAAA,EAAhBC,KAAAA;AAAM,CAAA,EAhCI,kBAAA,CAgCM,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAjCI,kBAAA,CAiCM,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAlCI,kBAAA,CAkCM,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAlCN,kBAAA,GAAN,eAAA,CAAA;AAAA,EADNC,cAAc,sBAAsB;AAAA,CAAA,EACxB,kBAAA,CAAA;AA2Wb,SAAS,yBAAyB,SAAA,EAAuC;AACvE,EAAA,MAAM,OAAO,GAAA,CAAI,cAAA;AACjB,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,KAAK,cAAA,EAAgB,EAAA,KAAO,SAAA,EAAW,OAAO,KAAK,cAAA,CAAe,IAAA;AACtE,EAAA,OAAO,IAAA,CAAK,mBAAmB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,EAAG,IAAA;AAClE;ACjXO,IAAM,gBAAA,GAAN,cAA+BL,UAAAA,CAAW;AAAA,EAA1C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACuC,IAAA,IAAA,CAAA,IAAA,GAAO,KAAA;AACE,IAAA,IAAA,CAAA,SAAA,GAAY,EAAA;AACZ,IAAA,IAAA,CAAA,SAAA,GAAY,CAAA;AAEZ,IAAA,IAAA,CAAA,QAAA,GAAW,IAAA;AACpC,IAAA,IAAA,CAAA,QAAA,GAAW,KAAA;AAE9B,IAAA,IAAA,CAAQ,OAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,UAAA,GAAa,EAAA;AACrB,IAAA,IAAA,CAAQ,kBAAmC,EAAC;AAC5C,IAAA,IAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAC3B,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAEjB,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAE9B;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAuD,IAAA;AAE/D,IAAA,IAAA,CAAQ,iBAAA,GAAoB,CAAC,CAAA,KAAmB;AAC9C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,MAAA,MAAM,EAAA,GAAK,CAAA;AACX,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,EAAA,CAAG,MAAA,CAAO,WAAW,EAAE,CAAA;AAErD,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,EAAG;AAChC,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,EAAA,CAAG,MAAA,CAAO,WAAW,EAAE,CAAA;AACrD,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,IAAK,gBAAgB,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,SAAA,GAAY,GAAG,MAAA,CAAO,SAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,YAAA;AACjB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,KAAK,KAAK,YAAA,EAAa;AAAA,IACzB,CAAA;AAAA,EAAA;AAAA,EAmYS,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,QAAA,CAAS,gBAAA,CAAiB,mBAAA,EAAqB,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACvE;AAAA,EAES,oBAAA,GAA6B;AACpC,IAAA,QAAA,CAAS,mBAAA,CAAoB,mBAAA,EAAqB,IAAA,CAAK,iBAAiB,CAAA;AACxE,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAAA,EAC7B;AAAA,EAEA,IAAA,GAAa;AAAE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EAAK;AAAA,EAChC,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AAEZ,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,QAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,QAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,QAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,QAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAAA,MACpB;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAChD,IAAA,IAAI,OAAO,KAAA,CAAM,YAAY,CAAA,IAAK,CAAC,KAAK,SAAA,EAAW;AACjD,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AAC/C,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,QAAA,CAAS;AAAA,QACvD,WAAA,EAAa,CAAC,YAAY,CAAA;AAAA,QAC1B,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,GAAU,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AAG9B,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,MAAM,UAA2B,EAAC;AAClC,QAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS;AACtC,UAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AACzC,UAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG,OAAA,CAAQ,IAAI,IAAI,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,QACrD;AACA,QAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AAIvB,QAAA,KAAK,GAAA,CAAI,QAAA,CACN,kBAAA,CAAmB,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,CAChE,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,UAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AACtB,UAAA,IAAA,CAAK,aAAa,MAAA,CAAO,SAAA;AAAA,QAC3B,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,UAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,UAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,QACpB,CAAC,CAAA;AAAA,MACL;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,aAAa,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,IACnE,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGQ,eAAA,GAAyC;AAC/C,IAAA,IAAI,CAAC,KAAK,OAAA,IAAW,IAAA,CAAK,QAAQ,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,IAAA;AAChE,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG,OAAO,KAAK,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AAE1D,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AAC9C,MAAA,IAAI,CAAC,CAAA,CAAE,KAAA,EAAO,OAAO,KAAA;AACrB,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,QAAM,CAAC,QACjB,CAAA,CAAE,KAAA,CAAO,aAAY,CAAE,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa;AAAA,OACnD;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AAAA,EAC9C;AAAA,EAEA,IAAY,SAAA,GAAoB;AAC9B,IAAA,MAAM,CAAA,GAAI,KAAK,eAAA,EAAgB;AAC/B,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,IAAA,CAAK,OAAA,EAAS,KAAA;AACxC,IAAA,OAAO,KAAA,EAAO,iBAAA,IAAqB,KAAA,EAAO,MAAA,IAAU,CAAA;AAAA,EACtD;AAAA,EAEA,IAAY,SAAA,GAA2B;AACrC,IAAA,MAAM,CAAA,GAAI,KAAK,eAAA,EAAgB;AAC/B,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,IAAA,CAAK,OAAA,EAAS,KAAA;AACxC,IAAA,OAAO,KAAA,EAAO,qBAAA,IAAyB,KAAA,EAAO,UAAA,IAAc,IAAA;AAAA,EAC9D;AAAA,EAEA,IAAY,iBAAA,GAA4B;AACtC,IAAA,MAAM,CAAA,GAAI,KAAK,eAAA,EAAgB;AAC/B,IAAA,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,QAAA,IAAY,CAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,QAAA,IAAY,CAAA;AAAA,EACnC;AAAA,EAEQ,UAAA,GAA+E;AACrF,IAAA,MAAM,MAAM,IAAA,CAAK,iBAAA;AACjB,IAAA,IAAI,OAAO,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAK,cAAA,EAAe;AAC5D,IAAA,IAAI,GAAA,IAAO,GAAG,OAAO,EAAE,MAAM,CAAA,mBAAA,EAAc,GAAG,CAAA,IAAA,CAAA,EAAQ,GAAA,EAAK,WAAA,EAAY;AACvE,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAY,GAAA,EAAK,UAAA,EAAW;AAAA,EAC7C;AAAA,EAEQ,YAAA,CAAa,YAAoB,KAAA,EAAqB;AAC5D,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,iBAAiB,CAAC,UAAU,GAAG,KAAA,EAAM;AAAA,EACxE;AAAA,EAEQ,SAAA,GAA4B;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,EAAC;AAC3B,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,eAAA,EAAgB,EAAG,UAAU,EAAC;AACzD,IAAA,IAAI,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG,OAAO,aAAA;AACrC,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AAAA,EAEA,IAAY,WAAA,GAAwC;AAClD,IAAA,OAAO,IAAA,CAAK,SAAA,EAAU,CAAE,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGQ,gBAAA,GAAuC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAgB,cAAA;AACpC,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,cAAA,EAAgB,iBAAA,IAAqB,EAAC;AAC9D,IAAA,MAAM,WAAA,GACJ,OAAA,EAAS,EAAA,KAAO,IAAA,CAAK,YACjB,OAAA,CAAQ,IAAA,GACR,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,SAAS,CAAA,EAAG,IAAA;AACxD,IAAA,GAAA,CAAI,KAAK,UAAA,CAAW;AAAA,MAClB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAA;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,OAAA,EAAS;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,OAAA,EAAS,EAAA;AAAA,EAClB;AAAA,EAEA,MAAc,SAAA,GAA2B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,iBAAA,IAAqB,CAAA,IAAK,KAAK,MAAA,EAAQ;AACjE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,EAAiB;AACxC,MAAA,IAAA,CAAK,aAAA;AAAA,QACH,IAAI,YAAY,mBAAA,EAAqB;AAAA,UACnC,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ;AAAA,YACN,SAAA,EAAW,KAAK,OAAA,CAAQ,EAAA;AAAA,YACxB,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,UAAU,IAAA,CAAK,QAAA;AAAA,YACf;AAAA;AACF,SACD;AAAA,OACH;AACA,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,aAAA,GAA+B;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,iBAAA,IAAqB,CAAA,IAAK,KAAK,MAAA,EAAQ;AACjE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,IAAA,CAAK,aAAA;AAAA,QACH,IAAI,YAAY,mBAAA,EAAqB;AAAA,UACnC,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,WAAW,aAAA,EAAe,QAAA,EAAU,SAAS,IAAA;AAAK,SAC7E;AAAA,OACH;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,OAAA,IAAW,IAAA,CAAK,qBAAqB,CAAA,IAAK,CAAC,KAAK,cAAA,EAAgB;AAC1E,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAI;AACF,MAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAAA,IAClC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,GAAG,CAAA;AAAA,MAC9D;AACA,MAAA;AAAA,IACF;AAIA,IAAA,KAAK,IAAA,CAAK,eAAe,IAAA,EAAK;AAC9B,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAOC,IAAAA;AAAA,mCAAA,EAC0B,KAAK,KAAK,CAAA;AAAA;AAAA,mCAAA,EAEV,KAAK,KAAK,CAAA;AAAA;AAAA,qCAAA,EAER,IAAA,CAAK,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA;AAAA,uCAAA,EACvB,KAAK,KAAK,CAAA;AAAA;;AAAA,QAAA,EAGzC,IAAA,CAAK,YAAY;AAAA;AAAA,IAAA,CAAA;AAAA,EAGzB;AAAA,EAEQ,UAAA,GAAa;AACnB,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,OAAA,EAAS;AACnC,MAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAUT;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,OAAOA,IAAAA,CAAAA,6CAAAA,EAAoD,KAAK,UAAU,CAAA,MAAA,CAAA;AAAA,IAC5E;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAOA,IAAAA,CAAAA,CAAAA;AAE1B,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,EAAW;AAC9B,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA;AACrB,IAAA,MAAM,WAAA,GAAc,OAAA,KAAY,IAAA,IAAQ,OAAA,GAAU,IAAA,CAAK,SAAA;AACvD,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,IAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AAEzB,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAIG,WAAA,EAAa,MACXA,IAAAA,CAAAA,SAAAA,EAAgB,WAAA,CAAY,GAAG,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,GAAA,CAAA,GAC9C,EAAE;AAAA;AAAA,UAAA,EAEN,MAAA,CAAO,SAAS,CAAA,GACdA,IAAAA;AAAA;AAAA,kBAAA,EAEM,MAAA,CAAO,GAAA;AAAA,MACP,CAAC,KAAK,GAAA,KAAQA,IAAAA;AAAA;AAAA,6CAAA,EAEa,GAAA,KAAQ,IAAA,CAAK,gBAAA,GAAmB,QAAA,GAAW,EAAE,CAAA;AAAA,+BAAA,EAC3D,MAAO,IAAA,CAAK,gBAAA,GAAmB,GAAI;AAAA,mCAAA,EAC/B,CAAA,MAAA,EAAS,GAAA,GAAM,CAAC,CAAA,CAAE;AAAA;AAAA,iCAAA,EAEpB,IAAI,GAAG,CAAA;AAAA;AAAA,oBAAA;AAAA,KAGvB;AAAA;AAAA,cAAA,CAAA,GAGL,EAAE;AAAA;;AAAA;AAAA,UAAA,EAIJ,EAAE,KAAA,GAAQA,IAAAA,CAAAA,mBAAAA,EAA0B,CAAA,CAAE,KAAK,WAAW,EAAE;AAAA,2BAAA,EACvC,EAAE,KAAK,CAAA;;AAAA;AAAA,gCAAA,EAGF,YAAY,IAAA,CAAK,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,YAAA,EACtE,cACEA,IAAAA,CAAAA,yBAAAA,EAAgC,WAAA;AAAA,MAC9B,OAAA;AAAA,MACA,EAAE,KAAA,CAAM;AAAA,KACT,YACD,EAAE;AAAA;;AAAA,4BAAA,EAGY,KAAA,CAAM,GAAG,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA;;AAAA,UAAA,EAE1C,IAAA,CAAK,mBAAA,CAAoB,CAAA,CAAE,OAAO,CAAC;;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAMtB,MAAO,KAAK,QAAA,GAAW,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,QAAA,GAAW,CAAC,CAAE;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAKvC,KAAK,QAAQ,CAAA;AAAA;AAAA;AAAA,uBAAA,EAG5B,MACN,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAK,iBAAA,EAAmB,IAAA,CAAK,QAAA,GAAW,CAAC,CAAE;AAAA;AAAA,0BAAA,EAE3D,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAO5C,KAAK,SAAS;AAAA,wBAAA,EACX,IAAA,CAAK,iBAAA,IAAqB,CAAA,IAAK,IAAA,CAAK,MAAM;AAAA;AAAA,cAAA,EAEpD,KAAK,MAAA,GACH,kBAAA,GACA,KAAK,iBAAA,IAAqB,CAAA,GAC1B,YACA,mBAAmB;AAAA;AAAA;;AAAA,UAAA,EAIzB,IAAA,CAAK,iBAAA,GAAoB,CAAA,IAAK,IAAA,CAAK,UAAA,GACjCA,IAAAA;AAAA;AAAA;AAAA,yBAAA,EAGa,KAAK,eAAe;AAAA,4BAAA,EACjB,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAM3B,EAAE;AAAA,UAAA,EACJ,IAAA,CAAK,oBAAoB,CAAA,GACvBA,IAAAA;AAAA;AAAA;AAAA,yBAAA,EAGa,KAAK,aAAa;AAAA,4BAAA,EACf,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAU3B,EAAE;;AAAA,UAAA,EAEJ,EAAE,WAAA,GACAA,IAAAA;AAAA;AAAA;AAAA,2CAAA,EAG+B,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA;AAAA,cAAA,CAAA,GAG5D,EAAE;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAId;AAAA,EAEQ,oBAAoB,OAAA,EAA0B;AACpD,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACjC,IAAA,OAAOA,IAAAA,CAAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjC,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AACzC,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,MAAA,OAAOA,IAAAA;AAAA;AAAA,oCAAA,EAEyB,IAAI,IAAI,CAAA;AAAA;AAAA,YAAA,EAEhC,MAAA,CAAO,GAAA;AAAA,QACP,CAAC,GAAA,KAAQA,IAAAA;AAAA;AAAA;AAAA,yBAAA,EAGI,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC;AAAA,+BAAA,EAChC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,MAAM,GAAG;AAAA;AAAA,kBAAA,EAEnD,GAAG;AAAA;AAAA,cAAA;AAAA,OAGV;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAIT,CAAC,CAAC,CAAA,CAAA;AAAA,EACJ;AAAA;AAAA,EAGQ,UAAUA,KAAAA,EAAsB;AACtC,IAAA,OAAOA,KAAAA,CACJ,OAAA,CAAQ,cAAA,EAAgB,IAAI,CAAA,CAC5B,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA,CACzB,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CACrB,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,OAAA,EAAS,GAAG,EACpB,IAAA,EAAK;AAAA,EACV;AACF;AAl0Ba,gBAAA,CAkCK,MAAA,GAASC,GAAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAjCmB,eAAA,CAAA;AAAA,EAA3CC,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAM;AAAA,CAAA,EAD/B,gBAAA,CACiC,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AACS,eAAA,CAAA;AAAA,EAApDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAFxC,gBAAA,CAE0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAApDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAHxC,gBAAA,CAG0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAApDA,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,aAAa;AAAA,CAAA,EALxC,gBAAA,CAK0C,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACzB,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EANf,gBAAA,CAMiB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEX,eAAA,CAAA;AAAA,EAAhBC,KAAAA;AAAM,CAAA,EARI,gBAAA,CAQM,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EATI,gBAAA,CASM,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAVI,gBAAA,CAUM,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAXI,gBAAA,CAWM,SAAA,EAAA,iBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAZI,gBAAA,CAYM,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAbI,gBAAA,CAaM,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAdI,gBAAA,CAcM,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAhBI,gBAAA,CAgBM,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAhBN,gBAAA,GAAN,eAAA,CAAA;AAAA,EADNC,cAAc,oBAAoB;AAAA,CAAA,EACtB,gBAAA,CAAA;AAw0Bb,SAAS,gBAAgB,GAAA,EAAwB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,IACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,EAAC;AACV;AC31BO,IAAM,OAAA,GAAN,cAAsBL,UAAAA,CAAW;AAAA,EAAjC,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEuC,IAAA,IAAA,CAAA,IAAA,GAAO,KAAA;AACvB,IAAA,IAAA,CAAA,OAAA,GAAU,YAAA;AACmB,IAAA,IAAA,CAAA,aAAA,GAAgB,YAAA;AACnB,IAAA,IAAA,CAAA,UAAA,GAAa,qBAAA;AACV,IAAA,IAAA,CAAA,aAAA,GAAgB,KAAA;AAEhE,IAAA,IAAA,CAAQ,KAAA,uBAA2C,GAAA,EAAI;AACvD,IAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AAEpB,IAAA,IAAA,CAAQ,iBAAA,GAAoB,KAAA;AAG5B,IAAA,IAAA,CAAQ,cAAA,GAUN,IAAA;AAGX;AAAA,IAAA,IAAA,CAAQ,cAAA,GAA8E,IAAA;AAEtF;AAAA,IAAA,IAAA,CAAQ,aAAA,GAAgB,EAAA;AAExB,IAAA,IAAA,CAAQ,iBAAA,GAAoB,CAAC,CAAA,KAAmB;AAC9C,MAAA,MAAM,SAAU,CAAA,CAAoC,MAAA;AACpD,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,cAAA;AACpB,MAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AAAA,IAC1B,CAAA;AAAA,EAAA;AAAA,EA8US,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AAExB,IAAA,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA;AAC1B,IAAA,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC5D;AAAA,EAES,oBAAA,GAA6B;AACpC,IAAA,GAAA,CAAI,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,iBAAiB,CAAA;AAC7D,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAAA,EAC7B;AAAA,EAEA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AAAA,EAAM;AAAA,EAClC,IAAA,GAAa;AAAE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EAAK;AAAA,EAEvB,QAAQ,OAAA,EAAqC;AAEpD,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IAAK,KAAK,IAAA,EAAM;AACpC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AAAA,IACvB;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG;AACnC,MAAA,MAAM,QAAQ,IAAA,CAAK,mBAAA;AACnB,MAAA,IAAI,KAAA,KAAU,KAAK,aAAA,EAAe;AAChC,QAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,QAAA,KAAK,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,gBAAgB,KAAA,EAA8B;AAC1D,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,sBAAA,CAAuB,KAAA,EAAO,KAAK,eAAe,CAAA;AAEpF,MAAA,IAAI,IAAA,CAAK,kBAAkB,KAAA,EAAO;AAClC,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AACtB,MAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,SAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAGQ,UAAA,GAAmB;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,cAAA;AACpB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAO,SAAA,IAAa,IAAA,CAAK,cAAc,CAAA,EAAG;AAE1D,IAAA,MAAM,QAAA,GAAW,KAAK,iBAAA,EAAkB;AAGxC,IAAA,KAAK,MAAA,CAAO,IAAA,EAAK,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAClC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAA,CAAK,cAAA,GAAiB,QAAA;AACtB,MAAA,KAAA,MAAW,aAAa,CAAC,GAAG,KAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AAC9C,QAAA,GAAA,CAAI,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,MACrC;AACA,MAAA,IAAA,CAAK,aAAA;AAAA,QACH,IAAI,YAAY,qBAAA,EAAuB;AAAA,UACrC,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ,EAAE,MAAA,EAAQ,WAAA,EAAa,MAAA;AAAO,SACvC;AAAA,OACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,iBAAA,GAA4D;AAClE,IAAA,MAAM,QAAyD,EAAC;AAChE,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,OAAO,EAAA,CAAG,KAAA;AAAA,UACV,MAAM,EAAA,CAAG,IAAA;AAAA,UACT,UAAU,EAAA,CAAG,QAAA;AAAA,UACb,WAAW,EAAA,CAAG,SAAA;AAAA,UACd,UAAU,EAAA,CAAG;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAK,mBAAA,EAAqB,QAAA,EAAU,KAAK,eAAA,EAAgB;AAAA,EAClF;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,cAAc,CAAA,EAAG;AAC1B,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,IAAA,CAAK,MAAM,IAAA,EAAM,EAAE,CAAC,CAAA;AAC/C,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAClC,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,YAAY,mBAAA,EAAqB;AAAA,QACnC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,QAAQ,EAAE,SAAA,EAAW,gBAAgB,aAAA,EAAe,QAAA,EAAU,SAAS,IAAA;AAAK,OAC7E;AAAA,KACH;AAAA,EACF;AAAA,EAEA,IAAY,mBAAA,GAA8B;AACxC,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,KAAA,EAAO,GAAA,IAAO,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AAAA,IAC9D;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAY,eAAA,GAA0B;AACpC,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,SAAU,IAAA,CAAK,QAAA;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,YAAY,IAAA,EAAiE;AACnF,IAAA,GAAA,CAAI,IAAA,CAAK,eAAe,IAAA,CAAK,EAAA,EAAI,KAAK,SAAA,EAAW,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EACpE;AAAA,EAEQ,YAAY,IAAA,EAAiE;AACnF,IAAA,GAAA,CAAI,IAAA,CAAK,eAAe,IAAA,CAAK,EAAA,EAAI,KAAK,SAAA,EAAW,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EACpE;AAAA,EAEQ,SAAS,IAAA,EAA+C;AAC9D,IAAA,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,KAAK,SAAS,CAAA;AAAA,EAC7C;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,KAAc,CAAA;AACnC,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAA,CAAK,MAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AAE9E,IAAA,OAAOC,IAAAA;AAAA,mCAAA,EAC0B,KAAK,KAAK,CAAA;AAAA,qDAAA,EACQ,KAAK,OAAO,CAAA;AAAA,mCAAA,EAC9B,KAAK,KAAK,CAAA;AAAA;AAAA,8BAAA,EAEf,IAAA,CAAK,cAAA,GAAiB,OAAA,GAAU,IAAA,CAAK,OAAO,CAAA;AAAA,uCAAA,EACnC,KAAK,KAAK,CAAA;AAAA;;AAAA,QAAA,EAGzC,IAAA,CAAK,iBACH,IAAA,CAAK,kBAAA,KACL,OAAA,GACAA,IAAAA,CAAAA,mBAAAA,EAA0B,IAAA,CAAK,UAAU,CAAA,MAAA,CAAA,GACzCA,IAAAA;AAAA;AAAA,gBAAA,EAEM,YAAA,CAAa,GAAA;AAAA,MACb,CAAC,IAAA,KAASA,IAAAA;AAAA;AAAA,sBAAA,EAEJ,KAAK,WAAA,GACHA,IAAAA,CAAAA,2BAAAA,EAAkC,IAAA,CAAK,WAAW,WAClD,EAAE;AAAA,sBAAA,EACJ,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,CAAC,IAAA,KAASA,IAAAA;AAAA;AAAA;AAAA,8BAAA,EAGF,IAAA,CAAK,WACHA,IAAAA,CAAAA,SAAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,GAAA,CAAA,GAC9C,EAAE;AAAA;AAAA;AAAA,sDAAA,EAGoB,KAAK,KAAK,CAAA;AAAA,qDAAA,EACX,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,EAKnB,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAKrC,KAAK,QAAQ;AAAA;AAAA;AAAA,2CAAA,EAGJ,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,EAO5B,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAQlC,WAAA;AAAA,UACA,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AAAA,UACtB,IAAA,CAAK;AAAA,SACN;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA;AAAA,OAMZ;AAAA;AAAA,kBAAA;AAAA,KAGN;AAAA;AAAA;AAAA;AAAA,+CAAA,EAIgC,KAAK,aAAa,CAAA;AAAA;AAAA,oBAAA,EAE7C,WAAA,CAAY,IAAA,CAAK,mBAAA,EAAqB,IAAA,CAAK,eAAe,CAAC;AAAA;AAAA;AAAA,gBAAA,EAG/D,KAAK,iBAAA,GACHA,IAAAA;AAAA;AAAA;AAAA,+BAAA,EAGa,KAAK,UAAU;AAAA;AAAA;AAAA,8CAAA,EAGA,QAAG,CAAA;AAAA;AAAA,oBAAA,CAAA,GAG/B,EAAE;AAAA;AAAA;AAAA,yBAAA,EAGK,KAAK,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAWlC;AAAA;AAAA,IAAA,CAAA;AAAA,EAGX;AAAA,EAEQ,kBAAA,GAAqB;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAOA,IAAAA,CAAAA,CAAAA;AACf,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAMC,EAAE,KAAA,CAAM,GAAA;AAAA,MACR,CAAC,EAAA,KAAOA,IAAAA;AAAA;AAAA,sBAAA,EAEI,EAAA,CAAG,KAAA,GAAQ,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAA,EAAK,EAAA,CAAG,QAAQ,CAAA;AAAA,sBAAA,EACxD,YAAY,EAAA,CAAG,SAAA,GAAY,GAAG,QAAA,EAAU,EAAA,CAAG,QAAQ,CAAC,CAAA;AAAA;AAAA,YAAA;AAAA,KAGjE;AAAA;AAAA;AAAA,kBAAA,EAGS,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,6CAAA,EAGL,KAAK,iBAAiB,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAGnE;AACF;AAtoBa,OAAA,CAqCK,MAAA,GAASC,GAAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAnCmB,eAAA,CAAA;AAAA,EAA3CC,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAM;AAAA,CAAA,EAF/B,OAAA,CAEiC,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAChB,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAHf,OAAA,CAGiB,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAC6B,eAAA,CAAA;AAAA,EAAxDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,kBAAkB;AAAA,CAAA,EAJ5C,OAAA,CAI8C,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AACH,eAAA,CAAA;AAAA,EAArDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,eAAe;AAAA,CAAA,EALzC,OAAA,CAK2C,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AACG,eAAA,CAAA;AAAA,EAAxDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,kBAAkB;AAAA,CAAA,EAN5C,OAAA,CAM8C,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AAExC,eAAA,CAAA;AAAA,EAAhBC,KAAAA;AAAM,CAAA,EARI,OAAA,CAQM,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EATI,OAAA,CASM,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAXI,OAAA,CAWM,SAAA,EAAA,mBAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAdI,OAAA,CAcM,SAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;AAdN,OAAA,GAAN,eAAA,CAAA;AAAA,EADNC,cAAc,UAAU;AAAA,CAAA,EACZ,OAAA,CAAA;ACON,IAAM,WAAA,GAAN,cAA0BL,UAAAA,CAAW;AAAA,EAArC,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACuC,IAAA,IAAA,CAAA,IAAA,GAAO,KAAA;AACvB,IAAA,IAAA,CAAA,OAAA,GAAU,OAAA;AAEtC,IAAA,IAAA,CAAA,aAAA,GAAgB,oBAAA;AAE4B,IAAA,IAAA,CAAA,OAAA,GAAU,KAAA;AAE7C,IAAA,IAAA,CAAQ,aAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,QAAwB,EAAC;AACjC,IAAA,IAAA,CAAQ,iBAAA,GAAoB,KAAA;AAC5B,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AAC7B,IAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAC1B,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AACzB,IAAA,IAAA,CAAQ,eAAA,GAAwC,IAAA;AAChD,IAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AAEtC,IAAA,IAAA,CAAQ,cAAA,GAKN,IAAA;AAGX;AAAA,IAAA,IAAA,CAAQ,YAAA,GAA4C,IAAA;AACpD,IAAA,IAAA,CAAQ,mBAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,qBAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAEhB,IAAA,IAAA,CAAQ,mBAAuD,EAAC;AAChE,IAAA,IAAA,CAAQ,iBAAA,GAAoB,EAAA;AAC5B,IAAA,IAAA,CAAQ,iBAAA,GAAoB,KAAA;AAE5B,IAAA,IAAA,CAAQ,gBAAA,GACf,uBAAA,CAAwB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,EAAG,EAAA,IAAM,uBAAA,CAAwB,CAAC,CAAA,EAAG,EAAA,IAAM,EAAA;AACrF,IAAA,IAAA,CAAQ,IAAA,GAAwB;AAAA,MACvC,SAAA,EAAW,EAAA;AAAA,MACX,QAAA,EAAU,EAAA;AAAA,MACV,KAAA,EAAO,EAAA;AAAA,MACP,OAAA,EAAS,EAAA;AAAA,MACT,UAAA,EAAY,EAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,IAAA,CAAQ,qBAAA,GAAwB,CAAC,CAAA,KAAmB;AAClD,MAAA,MAAM,SAAU,CAAA,CAAwC,MAAA;AACxD,MAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,KAAA;AAC5B,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,KAAA;AAG1B,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACrB;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAQ,sBAAA,GAAyB,CAAC,CAAA,KAAmB;AACnD,MAAA,MAAM,SACJ,CAAA,CACA,MAAA;AAIF,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,WAAW,WAAA,EAAa;AACjE,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,EAAO,SAAA,IAAa,KAAK,aAAA,EAAe,SAAA;AACjE,MAAA,IAAI,aAAa,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,MAAA,EAAyB,SAAA,EAAW,OAAO,MAAM,CAAA;AAAA,IAC5E,CAAA;AAEA,IAAA,IAAA,CAAQ,mBAAA,GAAsB,CAAC,CAAA,KAAmB;AAChD,MAAA,MAAM,SAAU,CAAA,CAAqD,MAAA;AACrE,MAAA,IAAA,CAAK,YAAA,GACH,OAAO,MAAA,KAAW,QAAA,GACd,8CAA2C,MAAA,CAAO,KAAK,KACvD,MAAA,CAAO,KAAA;AAGb,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd,CAAA;AAAA,EAAA;AAAA,EAkcS,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,QAAA,CAAS,YAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,KAAA;AAC1B,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,qBAAqB,CAAA;AAClE,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AAC7E,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,CAAiB,eAAA,EAAiB,IAAA,CAAK,mBAAmB,CAAA;AACvE,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,KAAK,KAAK,eAAA,EAAgB;AAC1B,MAAA,KAAK,KAAK,aAAA,EAAc;AAAA,IAC1B;AAAA,EACF;AAAA,EAES,oBAAA,GAA6B;AACpC,IAAA,GAAA,CAAI,QAAA,CAAS,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,qBAAqB,CAAA;AACrE,IAAA,GAAA,CAAI,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AAChF,IAAA,GAAA,CAAI,QAAA,CAAS,mBAAA,CAAoB,eAAA,EAAiB,IAAA,CAAK,mBAAmB,CAAA;AAC1E,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAAA,EAC7B;AAAA,EAES,OAAA,GAAgB;AAIvB,IAAA,KAAK,KAAK,mBAAA,EAAoB;AAAA,EAChC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,IAAA,GAAa;AAAE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EAAK;AAAA,EAEhC,MAAc,eAAA,GAAiC;AAC7C,IAAA,GAAA,CAAI,SAAS,kBAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAM,GAAA,CAAI,QAAA,CAAS,oBAAoB,IAAI,CAAA;AAAA,EACtE;AAAA,EAEA,MAAc,aAAA,GAA+B;AAG3C,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,QAAA,CAAS,uBAAA,EAAwB;AAC7D,IAAA,IAAI,SAAA,KAAc,KAAK,eAAA,EAAiB;AACtC,MAAA,IAAI,CAAC,SAAA,EAAW,IAAA,CAAK,aAAA,EAAc;AACnC,MAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI,CAAC,KAAK,eAAA,IAAmB,CAAC,KAAK,IAAA,IAAQ,CAAC,KAAK,aAAA,EAAe;AAIhE,IAAA,IAAI,KAAK,aAAA,CAAc,aAAA,KAAkB,QAAA,IAAY,CAAC,KAAK,OAAA,EAAS;AACpE,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,CAAc,QAAA;AAGlC,IAAA,IACE,IAAA,CAAK,gBACL,IAAA,CAAK,mBAAA,KAAwB,UAC7B,IAAA,CAAK,qBAAA,KAA0B,KAAK,gBAAA,EACpC;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,KAAK,UAAA,EAAY,aAAA;AAAA,MACjC;AAAA,KACF;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA,CAAS,oBAAoB,SAAA,EAAW;AAAA,QAC/D,cAAc,IAAA,CAAK,OAAA;AAAA,QACnB,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AACD,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,MAAA,IAAA,CAAK,mBAAA,GAAsB,MAAA;AAC3B,MAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,gBAAA;AAClC,MAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,UAAA;AAC/B,MAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,QAAA;AAAA,IAClC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,GAAG,CAAA;AAAA,MACjE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,4BAClB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,CAAA;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,aAAa,OAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,IAAA,IAAA,CAAK,mBAAmB,EAAC;AACzB,IAAA,IAAA,CAAK,iBAAA,GAAoB,EAAA;AACzB,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,IAAY,cAAA,GAAiB;AAC3B,IAAA,OAAO,uBAAA,CAAwB,KAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,IAAA,CAAK,gBAAgB,CAAA,IAAK,IAAA;AAAA,EAChF;AAAA;AAAA,EAGQ,iBAAiB,EAAA,EAAkB;AACzC,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,EAAA,IAAM,IAAA,CAAK,cAAA,EAAgB;AACzD,IAAA,IAAA,CAAK,gBAAA,GAAmB,EAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAc,iBAAiB,UAAA,EAAmC;AAChE,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,sBAAsB,UAAA,EAAY;AACjE,IAAA,IAAA,CAAK,iBAAA,GAAoB,UAAA;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,GAAG,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,iBAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAI;AAGF,MAAA,MAAM,IAAA,CAAK,aAAa,SAAA,EAAU;AAAA,IACpC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,aAAA,CAA+C,OAAU,KAAA,EAAqB;AACpF,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,MAAM,CAAC,KAAK,GAAG,KAAA,EAAM;AAC3C,IAAA,GAAA,CAAI,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,MAAc,UAAA,GAA4B;AACxC,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAI;AAIF,MAAA,MAAM,GAAA,CAAI,SAAS,aAAA,CAAc,EAAE,SAAS,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAAA,IAClE,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,GAAG,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,MAAM,MAAA,EAA6B;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,KAAK,KAAK,UAAA,EAAW;AACrB,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,oBAAoB,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAA,GAAwB;AAC9B,IAAA,MAAM,IAAI,IAAA,CAAK,aAAA;AACf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,aAAA,EAAe;AAC5B,IAAA,IAAA,CAAK,YAAA,CAAa,CAAA,CAAE,aAAA,EAAe,CAAA,CAAE,SAAS,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAA,CAAa,MAAA,EAAuB,SAAA,EAAmB,MAAA,EAAwB;AAErF,IAAA,MAAM,CAAA,GAAK,UAAU,EAAC;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,MACrB,QAAA,EAAU,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY,EAAA;AAAA,MAC1C,KAAA,EACE,OAAO,CAAA,CAAE,YAAA,KAAiB,WAAW,CAAA,CAAE,YAAA,GAAgB,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY,CAAA;AAAA,MACzF,OAAA,EAAS,EAAE,KAAA,EAAO;AAAA,KACpB;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAGtB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,YAAY,qBAAA,EAAuB;AAAA,QACrC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA;AAAO,OACrC;AAAA,KACH;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EACrC;AAAA,EAEQ,YAAY,MAAA,EAAsC;AACxD,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,WAAA;AACH,QAAA,OAAO,WAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT;AACE,QAAA,OAAO,EAAA;AAAA;AACX,EACF;AAAA;AAAA,EAGQ,gBAAgB,MAAA,EAA4C;AAGlE,IAAA,OAAO,MAAA,KAAW,eAAe,MAAA,KAAW,QAAA;AAAA,EAC9C;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,aAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAO,EAAA;AACf,IAAA,OAAO,WAAA,CAAY,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGQ,aAAA,GAAwB;AAC9B,IAAA,OAAO,KAAK,OAAA,GAAA,CAAW,IAAA,CAAK,cAAA,EAAgB,KAAA,IAAS,KAAK,GAAA,GAAM,CAAA;AAAA,EAClE;AAAA;AAAA,EAGQ,aAAA,GAAwB;AAC9B,IAAA,MAAM,IAAI,IAAA,CAAK,aAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAO,EAAA;AACf,IAAA,OAAO,YAAY,CAAA,CAAE,QAAA,GAAW,KAAK,aAAA,EAAc,EAAG,EAAE,QAAQ,CAAA;AAAA,EAClE;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAOC,IAAAA;AAAA,mCAAA,EAC0B,KAAK,KAAK,CAAA;AAAA;AAAA,qBAAA,EAExB,KAAK,OAAA,GAAU,SAAA,GAAY,IAAA,CAAK,cAAA,GAAiB,eAAe,EAAE,CAAA;AAAA;AAAA,mBAAA,EAEpE,KAAK,OAAO;AAAA;AAAA,mCAAA,EAEI,KAAK,KAAK,CAAA;AAAA;AAAA,8BAAA,EAEf,IAAA,CAAK,cAAA,GAAiB,OAAA,GAAU,IAAA,CAAK,OAAO,CAAA;AAAA,uCAAA,EACnC,KAAK,KAAK,CAAA;AAAA;;AAAA;AAAA,UAAA,EAIvC,IAAA,CAAK,cAAA,GACH,IAAA,CAAK,kBAAA,EAAmB,GACxB,IAAA,CAAK,OAAA,GACH,IAAA,CAAK,mBAAA,EAAoB,GACzB,IAAA,CAAK,kBAAA,EAAoB;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAIvC;AAAA,EAEQ,kBAAA,GAAqB;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAKc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,eAAe,CAAC,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAA,CAAK,KAAA,GAC5EA,IAAAA,CAAAA,uBAAAA,EAA8B,IAAA,CAAK,IAAA,CAAK,KAAK,MAC7C,EAAE;AAAA;AAAA,QAAA,EAEN,GAAG,OAAA,GACDA,IAAAA,CAAAA,8CAAAA,EAAqD,CAAA,CAAE,OAAO,eAC9D,EAAE;AAAA,QAAA,EACJ,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,GACpBA,IAAAA;AAAA;AAAA,gBAAA,EAEM,EAAE,KAAA,CAAM,GAAA;AAAA,MACR,CAAC,EAAA,KAAOA,IAAAA;AAAA;AAAA,4BAAA,EAEI,EAAA,CAAG,KAAA,GAAQ,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAA,EAAK,EAAA,CAAG,QAAQ,CAAA;AAAA,4BAAA,EACxD,YAAY,EAAA,CAAG,SAAA,GAAY,GAAG,QAAA,EAAU,EAAA,CAAG,QAAQ,CAAC,CAAA;AAAA;AAAA,kBAAA;AAAA,KAGjE;AAAA;AAAA,2CAAA,EAE4B,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,YAAA,CAAA,GAIjE,EAAE;AAAA,6CAAA,EACiC,KAAK,KAAK,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAGvD;AAAA;AAAA,EAGQ,iBAAA,GAAoB;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY,KAAA;AACjD,IAAA,OAAOA,IAAAA;AAAA;AAAA,QAAA,EAED,KAAK,OAAA,GACHA,IAAAA;AAAA;AAAA,gBAAA,EAEM,uBAAA,CAAwB,GAAA;AAAA,MACxB,CAAC,CAAA,KAAMA,IAAAA;AAAA;AAAA,sCAAA,EAEe,IAAA,CAAK,gBAAA,KAAqB,CAAA,CAAE,EAAA,GAAK,WAAW,EAAE,CAAA;AAAA;AAAA,mCAAA,EAEjD,IAAA,CAAK,gBAAA,KAAqB,CAAA,CAAE,EAAE;AAAA,gCAAA,EACjC,KAAK,cAAc;AAAA,6BAAA,EACtB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,EAAE,CAAC;AAAA;AAAA;AAAA,2BAAA,EAGnC,CAAA,CAAE,MAAM,CAAA,UAAA,EAAa,CAAA,CAAE,WAAW,CAAA;AAAA;AAAA,+CAAA,EAEd,WAAA,CAAY,CAAA,CAAE,KAAA,GAAQ,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA;AAAA,kBAAA;AAAA,KAGpE;AAAA;AAAA,YAAA,CAAA,GAGL,EAAE;AAAA,QAAA,EACJ,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAC7BA,IAAAA;AAAA;AAAA,gBAAA,EAEM,KAAK,gBAAA,CAAiB,GAAA;AAAA,MACtB,CAAC,CAAA,KAAMA,IAAAA;AAAA;AAAA,wCAAA,EAEiB,IAAA,CAAK,iBAAA,KAAsB,CAAA,CAAE,UAAA,GAAa,WAAW,EAAE,CAAA;AAAA,6BAAA,EAClE,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,UAAU,CAAC;AAAA;AAAA,sBAAA,EAErD,EAAE,IAAI;AAAA;AAAA,kBAAA;AAAA,KAGb;AAAA;AAAA,YAAA,CAAA,GAGL,EAAE;AAAA;AAAA;AAAA;AAAA,iBAAA,EAIK,MAAM,KAAK,IAAA,CAAK,iBAAA,EAAmB;AAAA,oBAAA,EAChC,KAAK,iBAAA,IAAqB,CAAC,IAAA,CAAK,YAAA,IAAgB,KAAK,cAAc;AAAA;AAAA,UAAA,EAE7E,KAAK,iBAAA,GAAoB,iBAAA,GAAe,SAAS,IAAA,CAAK,aAAA,EAAe,CAAA,WAAA,CAAa;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAI5F;AAAA;AAAA,EAGQ,mBAAA,GAAsB;AAC5B,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA,QAAA,EAGD,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAClBA,IAAAA;AAAA;AAAA,gBAAA,EAEM,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,CAAC,IAAA,KAASA,IAAAA;AAAA;AAAA,4BAAA,EAEE,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,4BAAA,EAChE,YAAY,IAAA,CAAK,SAAA,GAAY,KAAK,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA;AAAA,kBAAA;AAAA,KAGvE;AAAA;AAAA,6BAAA,EAEc,KAAK,cAAA,GAAiB,CAAA,QAAA,EAAM,KAAK,cAAA,CAAe,MAAM,KAAK,EAAE,CAAA;AAAA,wBAAA,EAClE,WAAA,CAAY,KAAK,aAAA,EAAc,EAAG,KAAK,aAAA,EAAe,QAAA,IAAY,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA,2CAAA,EAGrD,IAAA,CAAK,eAAe,CAAA;AAAA;AAAA;AAAA,YAAA,CAAA,GAIrD,EAAE;AAAA,QAAA,EACJ,IAAA,CAAK,mBAAmB;AAAA,QAAA,EACxB,KAAK,YAAA,GACHA,IAAAA,CAAAA,2BAAAA,EAAkC,IAAA,CAAK,YAAY,WACnD,EAAE;AAAA;AAAA,IAAA,CAAA;AAAA,EAGZ;AAAA,EAEQ,kBAAA,GAAqB;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAe,aAAA;AACnC,IAAA,MAAM,kBAAkB,CAAC,CAAC,UAAU,CAAC,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAChE,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAUgB,IAAA,CAAK,KAAK,SAAS;AAAA,yBAAA,EACnB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,aAAc,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAQ9D,IAAA,CAAK,KAAK,QAAQ;AAAA,yBAAA,EAClB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,YAAa,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAS/D,IAAA,CAAK,KAAK,KAAK;AAAA,uBAAA,EACf,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,SAAU,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAQ1D,IAAA,CAAK,KAAK,OAAO;AAAA,uBAAA,EACjB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,WAAY,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAS1D,IAAA,CAAK,KAAK,UAAU;AAAA,yBAAA,EACpB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,cAAe,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAQ/D,IAAA,CAAK,KAAK,IAAI;AAAA,yBAAA,EACd,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,QAAS,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAUpE,KAAK,iBAAA,GACHA,IAAAA;AAAA;AAAA;AAAA,6BAAA,EAGa,MAAM,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC;AAAA,gCAAA,EAC1B,KAAK,kBAAkB;AAAA,mCAAA,EACpB,IAAA,CAAK,aAAA,EAAe,aAAA,KAAkB,WAAW;AAAA;AAAA,sBAAA,EAE9D,IAAA,CAAK,kBAAA,GAAqB,gBAAA,GAAW,MAAM;AAAA;AAAA,kBAAA,CAAA,GAGjD,EAAE;AAAA,cAAA,EACJ,KAAK,eAAA,GACHA,IAAAA;AAAA;AAAA;AAAA,6BAAA,EAGa,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC;AAAA,mCAAA,EACpB,IAAA,CAAK,aAAA,EAAe,aAAA,KAAkB,QAAQ;AAAA;AAAA;AAAA;AAAA,kBAAA,CAAA,GAKjE,EAAE;AAAA;AAAA;AAAA,uBAAA,EAGK,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC;AAAA,6BAAA,EACnB,IAAA,CAAK,aAAA,EAAe,aAAA,KAAkB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAMnD,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC;AAAA,6BAAA,EAClB,IAAA,CAAK,aAAA,EAAe,aAAA,KAAkB,MAAM;AAAA;AAAA;AAAA;AAAA,cAAA,EAI3D,CAAC,KAAK,iBAAA,GACJA,IAAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,CAAA,GAKA,EAAE;AAAA,cAAA,EACJ,eAAA,GACEA,IAAAA;AAAA;AAAA;AAAA,6BAAA,EAGa,KAAK,eAAe;AAAA;AAAA,4BAAA,EAErB,IAAA,CAAK,YAAY,CAAA,KAAA,EAAQ,KAAK,WAAA,CAAY,MAAA,IAAU,IAAI,CAAC;AAAA;AAAA,kBAAA,CAAA,GAGrE,EAAE;AAAA,cAAA,EACJ,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,iBAAA,KAAsB,EAAE;AAAA,cAAA,EACnD,KAAK,YAAA,GACHA,IAAAA,CAAAA,2BAAAA,EAAkC,IAAA,CAAK,YAAY,WACnD,EAAE;AAAA;AAAA;;AAAA,UAAA,EAIR,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAClBA,IAAAA;AAAA;AAAA,kBAAA,EAEM,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,CAAC,IAAA,KAASA,IAAAA;AAAA;AAAA;AAAA,0BAAA,EAGF,IAAA,CAAK,WACHA,IAAAA,CAAAA,SAAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,GAAA,CAAA,GAC9C,EAAE;AAAA;AAAA;AAAA,gCAAA,EAGE,KAAK,KAAK,CAAA;AAAA,6BAAA,EACb,KAAK,IAAI,CAAA;AAAA,iCAAA,EACL,KAAK,QAAQ,CAAA;AAAA;AAAA;AAAA,0BAAA,EAGpB,YAAY,IAAA,CAAK,SAAA,GAAY,KAAK,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,oBAAA;AAAA,KAInE;AAAA;AAAA,0CAAA,EAEyB,IAAA,CAAK,YAAY,CAAA;AAAA;AAAA;AAAA,4CAAA,EAGf,KAAK,aAAa,CAAA;AAAA;AAAA;AAAA,6CAAA,EAGjB,IAAA,CAAK,YAAY,CAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAIlD,EAAE;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAId;AACF;AAxmCa,WAAA,CA0FK,MAAA,GAASC,GAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","file":"chunk-4CCGE7DE.js","sourcesContent":["/**\n * Vio Design Tokens — editorial commerce aesthetic.\n *\n * Extracted from the Allermedia \"Mote & Livsstil\" reference (the target\n * pilot site). Mood: Vogue-like fashion magazine — serif headlines,\n * sans-serif body, near-monochrome palette, terracotta accent for\n * editorial labels (\"REDAKSJONENS FAVORITTER\").\n *\n * Tokens are exposed both as a typed TS object (`VioTokens`) and as\n * CSS custom properties on `:root` (auto-injected when this module is\n * imported in a browser). Consumers can override individual variables\n * to re-skin without touching SDK source.\n */\n\nexport const VioTokens = {\n color: {\n text: {\n primary: '#0a0a0a',\n secondary: '#666666',\n tertiary: '#999999',\n onPrimary: '#ffffff',\n },\n accent: {\n editorial: '#c14a3b', // \"REDAKSJONENS FAVORITTER\" red\n },\n surface: {\n base: '#ffffff',\n muted: '#f2f2f2', // product image background\n hover: '#fafafa',\n },\n border: {\n subtle: '#e5e5e5',\n default: '#cccccc',\n },\n },\n font: {\n serif: '\"Tinos\", \"Playfair Display\", Georgia, serif',\n sans: '\"Inter\", -apple-system, \"Helvetica Neue\", Arial, sans-serif',\n },\n size: {\n xs: '12px',\n sm: '14px',\n md: '16px',\n lg: '20px',\n xl: '24px',\n '2xl': '32px',\n '3xl': '40px',\n },\n weight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n tracking: {\n label: '0.1em', // uppercase labels (BRAND, RETAILER, REDAKSJONENS FAVORITTER)\n title: '0',\n },\n lineHeight: {\n tight: 1.1,\n snug: 1.3,\n normal: 1.5,\n },\n space: {\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '24px',\n xl: '32px',\n '2xl': '48px',\n '3xl': '64px',\n },\n radius: {\n none: '0',\n sm: '2px',\n md: '4px',\n lg: '8px',\n full: '9999px',\n },\n} as const\n\n/**\n * CSS Custom Properties — generated from VioTokens. Injected once into\n * the document head on first import. Consumers can override any\n * `--vio-*` var on their root or component selector to customise.\n */\nconst VIO_TOKENS_CSS = `\n :root {\n /* color — text */\n --vio-color-text: ${VioTokens.color.text.primary};\n --vio-color-text-secondary: ${VioTokens.color.text.secondary};\n --vio-color-text-tertiary: ${VioTokens.color.text.tertiary};\n --vio-color-text-on-primary:${VioTokens.color.text.onPrimary};\n\n /* color — accent */\n --vio-color-accent: ${VioTokens.color.accent.editorial};\n\n /* color — surface */\n --vio-color-surface: ${VioTokens.color.surface.base};\n --vio-color-surface-muted: ${VioTokens.color.surface.muted};\n --vio-color-surface-hover: ${VioTokens.color.surface.hover};\n\n /* color — border */\n --vio-color-border: ${VioTokens.color.border.subtle};\n --vio-color-border-default: ${VioTokens.color.border.default};\n\n /* font */\n --vio-font-serif: ${VioTokens.font.serif};\n --vio-font-sans: ${VioTokens.font.sans};\n\n /* size */\n --vio-size-xs: ${VioTokens.size.xs};\n --vio-size-sm: ${VioTokens.size.sm};\n --vio-size-md: ${VioTokens.size.md};\n --vio-size-lg: ${VioTokens.size.lg};\n --vio-size-xl: ${VioTokens.size.xl};\n\n /* tracking (uppercase letterspacing) */\n --vio-tracking-label: ${VioTokens.tracking.label};\n\n /* space */\n --vio-space-xs: ${VioTokens.space.xs};\n --vio-space-sm: ${VioTokens.space.sm};\n --vio-space-md: ${VioTokens.space.md};\n --vio-space-lg: ${VioTokens.space.lg};\n --vio-space-xl: ${VioTokens.space.xl};\n\n /* radius */\n --vio-radius-sm: ${VioTokens.radius.sm};\n --vio-radius-md: ${VioTokens.radius.md};\n --vio-radius-lg: ${VioTokens.radius.lg};\n }\n`\n\nfunction injectTokens(): void {\n if (typeof document === 'undefined') return\n if (document.querySelector('style[data-vio=\"tokens\"]') !== null) return\n const style = document.createElement('style')\n style.setAttribute('data-vio', 'tokens')\n style.textContent = VIO_TOKENS_CSS\n document.head.appendChild(style)\n}\n\ninjectTokens()\n","/**\n * <vio-product> — single product card matching the editorial style of the\n * Allermedia \"Shop Favorittene\" carousel. Image-forward, brand top,\n * sans-serif body, bold price, retailer at the bottom. Whole card is\n * clickable; emits `vio:product-click` with productId/sponsorId for the\n * host site to drive checkout opening.\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { Vio } from '../../core/client.js'\n\n@customElement('vio-product')\nexport class VioProduct extends LitElement {\n /** Brand label shown at the top (uppercase, gray, small). */\n @property({ type: String }) brand = ''\n /** Product display name. Two-line truncation. */\n @property({ type: String }) name = ''\n /** Pre-formatted price string (e.g. \"990 kr\"). Bold. */\n @property({ type: String }) price = ''\n /** Retailer / sponsor name shown at the bottom (uppercase, gray). */\n @property({ type: String }) retailer = ''\n /** Product image URL. Square aspect, gray bg if missing. */\n @property({ type: String, attribute: 'image-url' }) imageUrl = ''\n /** Vio product id, propagated to click event. */\n @property({ type: String, attribute: 'product-id' }) productId = ''\n /** Vio sponsor id, propagated to click event. */\n @property({ type: String, attribute: 'sponsor-id' }) sponsorId = ''\n /** Whether the product has selectable variants — the quick-add button then\n * opens the detail to pick one instead of adding directly. */\n @property({ type: Boolean, attribute: 'has-variants' }) hasVariants = false\n\n /** True when this product currently sits in the cart (persistent mark). */\n @state() private inCart = false\n /** Total units of this product in the cart (shown as a count when > 1). */\n @state() private cartQty = 0\n /** Transient flag driving the add \"pop\" animation. */\n @state() private justAdded = false\n\n private boundCartChange = (): void => this.updateInCart()\n\n static override styles = css`\n :host {\n display: block;\n box-sizing: border-box;\n width: 100%;\n cursor: pointer;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n -webkit-tap-highlight-color: transparent;\n }\n .card {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .image {\n position: relative;\n aspect-ratio: 1 / 1;\n width: 100%;\n background-color: var(--vio-color-surface-muted, #f2f2f2);\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n transition: opacity 0.2s ease;\n }\n :host(:hover) .image img { opacity: 0.92; }\n\n /* Quick add-to-cart button — overlaid bottom-right of the image, like the\n reference card's wishlist heart but wired to add the product to the cart. */\n .add-btn {\n position: absolute;\n right: 10px;\n bottom: 10px;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.96);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #0a0a0a;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.16);\n transition: transform 0.14s ease, background 0.14s ease, color 0.14s ease;\n padding: 0;\n z-index: 2;\n }\n .add-btn:hover { background: #fff; transform: scale(1.08); }\n .add-btn:active { transform: scale(0.95); }\n /* In cart → black circle with a white tick (matches the floating cart). */\n .add-btn.in-cart { background: #0a0a0a; color: #fff; }\n .add-btn.in-cart:hover { background: #222; }\n .add-btn.pop { animation: vio-add-pop 0.42s cubic-bezier(0.34, 1.56, 0.64, 1); }\n .add-btn svg { width: 18px; height: 18px; }\n .add-btn .add-count { font-size: 15px; font-weight: 700; line-height: 1; }\n @keyframes vio-add-pop {\n 0% { transform: scale(1); }\n 35% { transform: scale(1.32); }\n 60% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n }\n .image img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n .meta {\n padding-top: 14px;\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n .brand {\n font-size: var(--vio-size-xs, 12px);\n letter-spacing: var(--vio-tracking-label, 0.1em);\n text-transform: uppercase;\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n margin-bottom: 6px;\n }\n .name {\n font-size: var(--vio-size-md, 16px);\n font-weight: 500;\n line-height: 1.3;\n margin: 0 0 10px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n .price {\n font-size: var(--vio-size-md, 16px);\n font-weight: 700;\n margin-bottom: 16px;\n }\n .retailer {\n font-size: var(--vio-size-xs, 12px);\n letter-spacing: var(--vio-tracking-label, 0.1em);\n text-transform: uppercase;\n color: var(--vio-color-text-tertiary, #999);\n font-weight: 500;\n margin-top: auto;\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.updateInCart()\n Vio.cart.addEventListener('change', this.boundCartChange)\n }\n\n override disconnectedCallback(): void {\n Vio.cart.removeEventListener('change', this.boundCartChange)\n super.disconnectedCallback()\n }\n\n override updated(changed: Map<string, unknown>): void {\n // product-id / sponsor-id are set as attributes after construction.\n if (changed.has('productId') || changed.has('sponsorId')) this.updateInCart()\n }\n\n /** Reflect whether (and how many units of) this product sit in the cart. */\n private updateInCart(): void {\n const pid = Number(this.productId)\n if (!Number.isFinite(pid) || pid <= 0) {\n this.inCart = false\n this.cartQty = 0\n return\n }\n const sid = Number(this.sponsorId)\n let qty = 0\n for (const cart of Vio.cart.getAllCarts().values()) {\n if (Number.isFinite(sid) && sid > 0 && cart.sponsorId !== sid) continue\n for (const i of cart.items) if (Number(i.productId) === pid) qty += i.quantity\n }\n this.inCart = qty > 0\n this.cartQty = qty\n }\n\n private onClick(): void {\n this.dispatchEvent(\n new CustomEvent('vio:product-click', {\n bubbles: true,\n composed: true,\n detail: {\n productId: this.productId,\n sponsorId: this.sponsorId,\n brand: this.brand,\n name: this.name,\n price: this.price,\n retailer: this.retailer,\n imageUrl: this.imageUrl,\n },\n }),\n )\n }\n\n private onKeydown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n this.onClick()\n }\n }\n\n /** Quick add-to-cart. If the product has selectable variants, open the detail\n * to pick one instead (the host can't choose for the user). Otherwise emit\n * `vio:product-add` so the host adds it (bumping quantity on repeat taps). */\n private onAdd(e: Event): void {\n e.stopPropagation()\n if (this.hasVariants) {\n this.onClick()\n return\n }\n this.dispatchEvent(\n new CustomEvent('vio:product-add', {\n bubbles: true,\n composed: true,\n detail: {\n productId: this.productId,\n sponsorId: this.sponsorId,\n brand: this.brand,\n name: this.name,\n price: this.price,\n retailer: this.retailer,\n imageUrl: this.imageUrl,\n },\n }),\n )\n // Optimistic pop; the persistent \"in cart\" mark follows from the cart event.\n this.justAdded = true\n setTimeout(() => {\n this.justAdded = false\n }, 450)\n }\n\n override render() {\n return html`\n <div\n class=\"card\"\n @click=${this.onClick}\n @keydown=${this.onKeydown}\n role=\"button\"\n tabindex=\"0\"\n aria-label=${`${this.brand} ${this.name} ${this.price}`}\n >\n <div class=\"image\">\n ${this.imageUrl\n ? html`<img src=${this.imageUrl} alt=${this.name || this.brand} loading=\"lazy\" />`\n : ''}\n <button\n class=\"add-btn ${this.inCart ? 'in-cart' : ''} ${this.justAdded ? 'pop' : ''}\"\n @click=${this.onAdd}\n aria-label=${this.inCart ? 'I handlekurven – legg til en til' : 'Legg i kurv'}\n title=${this.inCart ? 'I handlekurven' : 'Legg i kurv'}\n >\n ${this.inCart\n ? this.cartQty > 1\n ? html`<span class=\"add-count\">${this.cartQty}</span>`\n : html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>`\n : html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\n </svg>`}\n </button>\n </div>\n <div class=\"meta\">\n ${this.brand ? html`<div class=\"brand\">${this.brand}</div>` : ''}\n ${this.name ? html`<div class=\"name\">${this.name}</div>` : ''}\n ${this.price ? html`<div class=\"price\">${this.price}</div>` : ''}\n ${this.retailer ? html`<div class=\"retailer\">${this.retailer}</div>` : ''}\n </div>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-product': VioProduct\n }\n}\n","/**\n * <vio-product-carousel> — horizontal product carousel matching the\n * Allermedia \"Shop Favorittene\" pattern.\n *\n * Two render modes:\n * 1. Slotted — the consumer puts <vio-product> children inside the tag\n * (manual / SSR-friendly).\n * 2. Auto-fetch — set `product-ids=\"123,456,789\"` plus either\n * `commerce-key=\"...\"` (explicit per-sponsor commerce apiKey) or\n * `sponsor-id=\"3\"` (looked up via Vio.bootstrap). The carousel\n * fetches products from Vio Commerce GraphQL and renders them.\n *\n * Visual layout in both modes:\n * - Editorial label (red, uppercase) above the heading\n * - Serif heading + inline gray disclaimer\n * - \"Se alle\" link right-aligned\n * - Snap-scroll viewport with round white chevron nav buttons\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { Vio } from '../../core/client.js'\nimport {\n displayPrice,\n primaryImageUrl,\n type Product,\n} from '../../core/types.js'\n\n@customElement('vio-product-carousel')\nexport class VioProductCarousel extends LitElement {\n /** Small uppercase label in accent color (e.g. \"REDAKSJONENS FAVORITTER\"). */\n @property({ type: String }) label = ''\n /** Big serif heading (e.g. \"Shop Favorittene\"). */\n @property({ type: String }) heading = ''\n /** Inline gray disclaimer next to the heading (e.g. \"annonselenker\"). */\n @property({ type: String }) disclaimer = ''\n /** URL for the \"Se alle\" link. Hidden if empty. */\n @property({ type: String, attribute: 'see-all-href' }) seeAllHref = ''\n /** Label for the see-all link. Defaults to Norwegian. */\n @property({ type: String, attribute: 'see-all-label' }) seeAllLabel = 'Se alle'\n\n /** Auto-fetch mode: comma-separated product ids (e.g. \"408895,408896\"). */\n @property({ type: String, attribute: 'product-ids' }) productIds = ''\n /** Auto-fetch mode option A: explicit per-sponsor commerce apiKey. */\n @property({ type: String, attribute: 'commerce-key' }) commerceKey = ''\n /** Auto-fetch mode option B: sponsor id looked up via Vio.bootstrap. */\n @property({ type: Number, attribute: 'sponsor-id' }) sponsorId = 0\n /**\n * Multi-sponsor mode: `\"sponsorId:productId,sponsorId:productId,…\"`. Each\n * pair resolves its own commerce client via `Vio.commerceFor(sponsorId)`;\n * fetches run in parallel and results are merged preserving input order.\n * Each rendered <vio-product> carries the per-item sponsor-id so taps go\n * to <vio-product-detail> with the right commerce context.\n *\n * Takes precedence over `product-ids` if both are set.\n */\n @property({ type: String, attribute: 'product-refs' }) productRefs = ''\n /** Currency for product prices. */\n @property({ type: String }) currency = 'NOK'\n\n @query('.scroller') private scroller!: HTMLElement\n @state() private fetched: Array<{ product: Product; sponsorId: number }> | null = null\n @state() private isLoading = false\n @state() private fetchError = ''\n\n static override styles = css`\n :host {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n padding: var(--vio-space-xl, 32px) 0;\n }\n .header {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--vio-space-md, 16px);\n margin-bottom: var(--vio-space-lg, 24px);\n padding: 0 var(--vio-space-lg, 24px);\n }\n .header-text { flex: 1; min-width: 0; }\n .label {\n font-size: var(--vio-size-xs, 12px);\n letter-spacing: var(--vio-tracking-label, 0.1em);\n text-transform: uppercase;\n color: var(--vio-color-accent, #c14a3b);\n font-weight: 500;\n margin-bottom: var(--vio-space-sm, 8px);\n }\n .heading-row {\n display: flex;\n align-items: baseline;\n gap: var(--vio-space-sm, 8px);\n flex-wrap: wrap;\n }\n .heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: clamp(28px, 4vw, 40px);\n font-weight: 400;\n line-height: 1.1;\n margin: 0;\n }\n .disclaimer {\n color: var(--vio-color-text-tertiary, #999);\n font-size: var(--vio-size-sm, 14px);\n font-style: italic;\n }\n .see-all {\n font-size: var(--vio-size-sm, 14px);\n color: var(--vio-color-text, #0a0a0a);\n text-decoration: underline;\n text-underline-offset: 4px;\n white-space: nowrap;\n font-weight: 500;\n }\n .see-all:hover { color: var(--vio-color-text-secondary, #666); }\n\n .viewport {\n position: relative;\n }\n .scroller {\n display: flex;\n gap: var(--vio-space-md, 16px);\n /* Extra left padding so the first card clears the prev chevron. */\n padding: 0 var(--vio-space-lg, 24px) 8px 72px;\n overflow-x: auto;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n -ms-overflow-style: none;\n -webkit-overflow-scrolling: touch;\n }\n @media (max-width: 600px) {\n .scroller { padding: 0 var(--vio-space-lg, 24px) 8px; }\n }\n .scroller::-webkit-scrollbar { display: none; }\n ::slotted(*),\n vio-product {\n flex: 0 0 240px;\n scroll-snap-align: start;\n }\n @media (max-width: 600px) {\n ::slotted(*),\n vio-product {\n /* Two complete cards per screen (+ a sliver of the next), matching the\n reference: card = (viewport − side padding − gap) / 2. */\n flex: 0 0 calc((100vw - 64px) / 2);\n }\n }\n\n .nav-btn {\n position: absolute;\n top: 30%;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: #fff;\n border: none;\n box-shadow: 0 2px 14px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: #0a0a0a;\n z-index: 2;\n transition: background 0.15s, transform 0.15s;\n font-family: inherit;\n padding: 0;\n }\n .nav-btn:hover { background: #fafafa; transform: scale(1.05); }\n .nav-btn:active { transform: scale(0.98); }\n .nav-btn.prev { left: 8px; }\n .nav-btn.next { right: 8px; }\n @media (max-width: 600px) {\n .nav-btn { display: none; }\n }\n\n .state {\n padding: 60px var(--vio-space-lg, 24px);\n text-align: center;\n color: var(--vio-color-text-secondary, #666);\n font-size: 14px;\n }\n .state.error { color: var(--vio-color-accent, #c14a3b); }\n .skeleton {\n flex: 0 0 240px;\n scroll-snap-align: start;\n }\n .skeleton-image {\n aspect-ratio: 1 / 1;\n background: var(--vio-color-surface-muted, #f2f2f2);\n animation: vio-pulse 1.6s ease-in-out infinite;\n }\n .skeleton-text {\n height: 12px;\n background: var(--vio-color-surface-muted, #f2f2f2);\n margin-top: 12px;\n animation: vio-pulse 1.6s ease-in-out infinite;\n }\n .skeleton-text.shorter { width: 60%; }\n @keyframes vio-pulse {\n 0%,\n 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n if (this.productRefs.trim() || this.productIds.trim()) {\n void this.autoFetch()\n }\n }\n\n override updated(changed: Map<string, unknown>): void {\n const propChanged =\n changed.has('productRefs') ||\n changed.has('productIds') ||\n changed.has('commerceKey') ||\n changed.has('sponsorId')\n if (propChanged && (this.productRefs.trim() || this.productIds.trim())) {\n void this.autoFetch()\n }\n }\n\n private async autoFetch(): Promise<void> {\n if (!Vio.isInitialized) {\n this.fetchError = 'Vio not initialized — call Vio.init({ apiKey }) first'\n return\n }\n this.isLoading = true\n this.fetchError = ''\n try {\n const refs = this.productRefs.trim()\n ? this.parseRefs(this.productRefs)\n : this.productIds\n .split(',')\n .map((s) => parseInt(s.trim(), 10))\n .filter((n) => !Number.isNaN(n))\n .map((id) => ({ sponsorId: this.sponsorId, productId: id }))\n\n if (refs.length === 0) {\n this.fetched = []\n return\n }\n\n // Group by sponsorId so we can issue one GraphQL request per sponsor.\n const bySponsor = new Map<number, number[]>()\n for (const r of refs) {\n const arr = bySponsor.get(r.sponsorId) ?? []\n arr.push(r.productId)\n bySponsor.set(r.sponsorId, arr)\n }\n\n const fetched = await Promise.all(\n Array.from(bySponsor.entries()).map(async ([sponsorId, ids]) => {\n const commerce =\n this.commerceKey && this.productRefs.trim() === ''\n ? Vio.commerceWithKey(this.commerceKey)\n : Vio.commerceFor(sponsorId)\n const products = await commerce.channel.product.getByIds({\n product_ids: ids,\n currency: this.currency,\n image_size: 'large',\n })\n return { sponsorId, products }\n }),\n )\n\n // Index for O(1) lookup, then re-emit in original ref order.\n const lookup = new Map<string, Product>()\n for (const { sponsorId, products } of fetched) {\n for (const p of products) lookup.set(`${sponsorId}:${p.id}`, p)\n }\n this.fetched = refs\n .map(({ sponsorId, productId }) => {\n const product = lookup.get(`${sponsorId}:${productId}`)\n return product ? { product, sponsorId } : null\n })\n .filter((x): x is { product: Product; sponsorId: number } => x !== null)\n } catch (err) {\n this.fetchError = err instanceof Error ? err.message : String(err)\n // Keep `fetched` null so slotted fallback can still render.\n } finally {\n this.isLoading = false\n }\n }\n\n private parseRefs(raw: string): Array<{ sponsorId: number; productId: number }> {\n return raw\n .split(',')\n .map((pair) => pair.trim())\n .filter((s) => s.length > 0)\n .map((pair) => {\n const [sidStr, pidStr] = pair.split(':')\n const sid = parseInt((sidStr ?? '').trim(), 10)\n const pid = parseInt((pidStr ?? '').trim(), 10)\n if (Number.isNaN(sid) || Number.isNaN(pid)) return null\n return { sponsorId: sid, productId: pid }\n })\n .filter((x): x is { sponsorId: number; productId: number } => x !== null)\n }\n\n private scrollByDirection(direction: 1 | -1): void {\n if (!this.scroller) return\n const item = this.scroller.querySelector(':scope > *') as HTMLElement | null\n const step = (item?.offsetWidth ?? 240) + 16\n this.scroller.scrollBy({ left: direction * step * 2, behavior: 'smooth' })\n }\n\n private renderScrollerContent() {\n if (this.isLoading && !this.fetched) {\n // Skeleton cards while fetching.\n return html`${Array.from({ length: 5 }).map(\n () => html`\n <div class=\"skeleton\">\n <div class=\"skeleton-image\"></div>\n <div class=\"skeleton-text\"></div>\n <div class=\"skeleton-text shorter\"></div>\n </div>\n `,\n )}`\n }\n if (this.fetched && this.fetched.length > 0) {\n return html`${this.fetched.map(({ product: p, sponsorId }) => {\n const img = primaryImageUrl(p) ?? ''\n const retailer = sponsorNameFromBootstrap(sponsorId) ?? p.brand ?? ''\n return html`\n <vio-product\n product-id=${String(p.id)}\n sponsor-id=${String(sponsorId)}\n brand=${p.brand ?? ''}\n name=${p.title}\n price=${displayPrice(p)}\n retailer=${retailer}\n image-url=${img}\n ?has-variants=${(p.variants?.length ?? 0) > 1}\n ></vio-product>\n `\n })}`\n }\n // Fallback to slotted children (manual mode) — also used when fetch fails.\n return html`<slot></slot>`\n }\n\n override render() {\n return html`\n <div class=\"header\">\n <div class=\"header-text\">\n ${this.label ? html`<div class=\"label\">${this.label}</div>` : ''}\n <div class=\"heading-row\">\n ${this.heading ? html`<h2 class=\"heading\">${this.heading}</h2>` : ''}\n ${this.disclaimer ? html`<span class=\"disclaimer\">(${this.disclaimer})</span>` : ''}\n </div>\n </div>\n ${this.seeAllHref\n ? html`<a class=\"see-all\" href=${this.seeAllHref}>${this.seeAllLabel}</a>`\n : ''}\n </div>\n <div class=\"viewport\">\n <button\n class=\"nav-btn prev\"\n @click=${() => this.scrollByDirection(-1)}\n aria-label=\"Forrige\"\n >\n ‹\n </button>\n <div class=\"scroller\">${this.renderScrollerContent()}</div>\n <button\n class=\"nav-btn next\"\n @click=${() => this.scrollByDirection(1)}\n aria-label=\"Neste\"\n >\n ›\n </button>\n </div>\n ${this.fetchError && !this.fetched\n ? html`<div class=\"state error\">${this.fetchError}</div>`\n : ''}\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-product-carousel': VioProductCarousel\n }\n}\n\n/** Resolve a sponsor's display name from `Vio.bootstrap()` cache. */\nfunction sponsorNameFromBootstrap(sponsorId: number): string | undefined {\n const boot = Vio.bootstrapCache\n if (!boot) return undefined\n if (boot.primarySponsor?.id === sponsorId) return boot.primarySponsor.name\n return boot.secondarySponsors?.find((s) => s.id === sponsorId)?.name\n}\n","/**\n * <vio-product-detail> — full-screen product detail modal.\n *\n * Auto-opens when `vio:product-click` fires anywhere in the document\n * (delegated). Fetches the full Product DTO via `Vio.commerceFor(sponsorId)`,\n * shows brand + name + price + description + image gallery + variant\n * pickers + stock indicator + add-to-cart CTA.\n *\n * For affiliate products (non-numeric productId), the modal skips —\n * those are handled by the host page's direct cart logic.\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { Vio } from '../../core/client.js'\nimport {\n formatPrice,\n type Product,\n type ProductImage,\n type ProductOption,\n type ProductVariant,\n} from '../../core/types.js'\n\ninterface SelectedOptions {\n [optionName: string]: string\n}\n\n@customElement('vio-product-detail')\nexport class VioProductDetail extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String, attribute: 'product-id' }) productId = ''\n @property({ type: Number, attribute: 'sponsor-id' }) sponsorId = 0\n /** Subscribe to `vio:product-click` on the document and auto-open. */\n @property({ type: Boolean, attribute: 'auto-open' }) autoOpen = true\n @property({ type: String }) currency = 'NOK'\n\n @state() private product: Product | null = null\n @state() private isLoading = false\n @state() private fetchError = ''\n @state() private selectedOptions: SelectedOptions = {}\n @state() private quantity = 1\n @state() private activeImageIndex = 0\n @state() private adding = false\n /** Apple Pay actually usable (real Stripe + registered domain) — set on load. */\n @state() private applePayOk = false\n /** Pre-prepared Apple Pay handle — show() fires synchronously on tap. */\n private applePayHandle: { show: () => Promise<void> } | null = null\n\n private boundProductClick = (e: Event): void => {\n if (!this.autoOpen) return\n const ev = e as CustomEvent<{ productId: string; sponsorId: string }>\n const productIdNum = parseInt(ev.detail.productId, 10)\n // Skip non-numeric IDs (affiliate products) — host handles those.\n if (Number.isNaN(productIdNum)) return\n const sponsorIdNum = parseInt(ev.detail.sponsorId, 10)\n if (Number.isNaN(sponsorIdNum) || sponsorIdNum <= 0) return\n this.productId = ev.detail.productId\n this.sponsorId = sponsorIdNum\n this.show()\n void this.fetchProduct()\n }\n\n static override styles = css`\n :host { display: contents; }\n\n .backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease;\n z-index: 1100;\n }\n :host([open]) .backdrop { opacity: 1; pointer-events: auto; }\n\n .modal {\n position: fixed;\n inset: 0;\n background: var(--vio-color-surface, #fff);\n transform: translateY(100%);\n transition: transform 0.35s cubic-bezier(0.32, 0.72, 0, 1);\n display: flex;\n flex-direction: column;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n z-index: 1101;\n overflow-y: auto;\n }\n :host([open]) .modal { transform: translateY(0); }\n\n .handle { display: none; }\n\n /* Mobile: bottom sheet (not fullscreen), rounded top, drag handle. */\n @media (max-width: 600px) {\n .modal {\n top: auto;\n height: 92vh;\n border-radius: 16px 16px 0 0;\n box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08);\n }\n .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n flex-shrink: 0;\n }\n .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: 2px;\n }\n }\n\n /* Desktop: right-side drawer (matches the cart/checkout), so the product\n shows \"al lado\" instead of a centered modal. Info stacks in one column. */\n @media (min-width: 601px) {\n .modal {\n inset: 0 0 0 auto;\n width: min(440px, 100%);\n max-width: 440px;\n border-radius: 0;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.1);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n }\n :host([open]) .modal { transform: translateX(0); }\n /* Content overrides are prefixed with .modal so they beat the base\n .body / .name / .gallery-main rules defined LATER in this stylesheet\n (equal specificity, later wins; the extra class tips the cascade). */\n .modal .body {\n max-width: none;\n grid-template-columns: 1fr;\n gap: 20px;\n padding: 20px 24px 40px;\n }\n .modal .name { font-size: 26px; line-height: 1.2; }\n .modal .gallery-main { width: 100%; }\n }\n\n .topbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px var(--vio-space-lg, 24px);\n position: sticky;\n top: 0;\n background: var(--vio-color-surface, #fff);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n z-index: 1;\n }\n .topbar-brand {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .close {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n line-height: 1;\n padding: 0;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .close:hover { color: var(--vio-color-text-secondary, #666); }\n\n .body {\n flex: 1;\n max-width: 1200px;\n width: 100%;\n margin: 0 auto;\n padding: 48px var(--vio-space-lg, 24px) 80px;\n box-sizing: border-box;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 64px;\n }\n @media (max-width: 800px) {\n .body { grid-template-columns: 1fr; gap: 32px; padding: 24px var(--vio-space-lg, 24px) 64px; }\n }\n\n /* Gallery */\n .gallery { display: flex; flex-direction: column; gap: 16px; }\n .gallery-main {\n aspect-ratio: 1;\n background: var(--vio-color-surface-muted, #f2f2f2);\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n }\n .gallery-main img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n padding: 24px;\n box-sizing: border-box;\n }\n .gallery-thumbs {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n }\n .gallery-thumb {\n width: 72px;\n height: 72px;\n background: var(--vio-color-surface-muted, #f2f2f2);\n border: 1px solid transparent;\n cursor: pointer;\n padding: 0;\n overflow: hidden;\n }\n .gallery-thumb img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n padding: 6px;\n box-sizing: border-box;\n }\n .gallery-thumb.active { border-color: var(--vio-color-text, #0a0a0a); }\n\n /* Info column */\n .info { display: flex; flex-direction: column; gap: 24px; }\n .brand {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .name {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: clamp(28px, 4vw, 40px);\n font-weight: 400;\n line-height: 1.15;\n margin: 0;\n letter-spacing: -0.01em;\n }\n .price-row {\n display: flex;\n align-items: baseline;\n gap: 16px;\n }\n .price {\n font-size: 24px;\n font-weight: 700;\n }\n .compare-at {\n font-size: 16px;\n color: var(--vio-color-text-tertiary, #999);\n text-decoration: line-through;\n }\n .stock {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 500;\n }\n .stock.in-stock { color: #2e7d32; }\n .stock.low-stock { color: #ed6c02; }\n .stock.out-of-stock { color: var(--vio-color-text-tertiary, #999); }\n\n /* Option pickers */\n .option-group { display: flex; flex-direction: column; gap: 8px; }\n .option-label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .option-values { display: flex; flex-wrap: wrap; gap: 8px; }\n .option-pill {\n padding: 10px 18px;\n background: #fff;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n cursor: pointer;\n font-family: inherit;\n font-size: 13px;\n font-weight: 500;\n color: inherit;\n transition: border-color 0.15s, background 0.15s;\n }\n .option-pill:hover { border-color: var(--vio-color-text, #0a0a0a); }\n .option-pill[aria-pressed='true'] {\n border-color: var(--vio-color-text, #0a0a0a);\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n }\n\n /* Qty + CTA row */\n .qty-cta-row {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 16px;\n align-items: stretch;\n }\n .qty-stepper {\n display: flex;\n align-items: center;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n }\n .qty-btn {\n width: 44px;\n height: 56px;\n background: #fff;\n border: none;\n cursor: pointer;\n font-size: 18px;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .qty-btn:hover { background: var(--vio-color-surface-hover, #fafafa); }\n .qty-value {\n width: 40px;\n text-align: center;\n font-weight: 600;\n }\n .add-to-cart {\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n border: none;\n padding: 18px 24px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n transition: background 0.15s;\n }\n .add-to-cart:hover:not(:disabled) { background: #222; }\n .add-to-cart:disabled {\n background: var(--vio-color-text-tertiary, #999);\n cursor: not-allowed;\n }\n /* Klarna express button — sits full-width below the add-to-cart row. */\n .buy-klarna {\n width: 100%;\n margin-top: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n background: #ffb3c7; /* Klarna pink */\n color: #0b051d;\n border: none;\n padding: 14px 24px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 700;\n cursor: pointer;\n font-family: inherit;\n transition: background 0.15s;\n }\n .buy-klarna .klarna-badge { height: 22px; width: auto; display: block; }\n .buy-klarna:hover:not(:disabled) { background: #ffa0b9; }\n .buy-klarna:disabled { opacity: 0.5; cursor: not-allowed; }\n /* Apple Pay express button — black, per Apple's button guidelines. Only\n shown in Safari (canApplePay). The glyph is the Apple logo (Safari). */\n .buy-applepay {\n width: 100%;\n margin-top: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n background: #000;\n color: #fff;\n border: none;\n padding: 15px 24px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n letter-spacing: 0.01em;\n }\n .buy-applepay:hover:not(:disabled) { background: #1a1a1a; }\n .buy-applepay:disabled { opacity: 0.5; cursor: not-allowed; }\n\n /* Description */\n .description {\n font-size: 14px;\n line-height: 1.6;\n color: var(--vio-color-text-secondary, #444);\n margin-top: 8px;\n }\n .description-label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n margin-bottom: 8px;\n }\n\n /* Skeleton loader: shimmer placeholders mirroring the product layout\n (image, brand, title, price, CTA) for a smooth load-in. */\n .skeleton {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 20px 24px 40px;\n }\n .skeleton > * {\n background: linear-gradient(\n 100deg,\n var(--vio-color-surface-muted, #f1f1f1) 30%,\n rgba(255, 255, 255, 0.65) 50%,\n var(--vio-color-surface-muted, #f1f1f1) 70%\n );\n background-size: 200% 100%;\n animation: vio-skeleton-shimmer 1.4s ease-in-out infinite;\n border-radius: 8px;\n }\n .sk-image { width: 100%; aspect-ratio: 1; border-radius: 12px; }\n .sk-line { height: 14px; }\n .sk-brand { width: 38%; height: 10px; margin-top: 6px; }\n .sk-title { width: 85%; height: 26px; }\n .sk-title-2 { width: 55%; height: 26px; }\n .sk-price { width: 30%; height: 20px; margin-top: 6px; }\n .sk-button { width: 100%; height: 54px; border-radius: 0; margin-top: 10px; }\n @keyframes vio-skeleton-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n @media (prefers-reduced-motion: reduce) {\n .skeleton > * {\n animation: none;\n background: var(--vio-color-surface-muted, #f1f1f1);\n }\n }\n .error {\n padding: 80px 24px;\n text-align: center;\n color: var(--vio-color-accent, #c14a3b);\n font-size: 14px;\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n document.addEventListener('vio:product-click', this.boundProductClick)\n }\n\n override disconnectedCallback(): void {\n document.removeEventListener('vio:product-click', this.boundProductClick)\n super.disconnectedCallback()\n }\n\n show(): void { this.open = true }\n close(): void {\n this.open = false\n // Reset state after the slide-out animation completes.\n setTimeout(() => {\n if (!this.open) {\n this.product = null\n this.selectedOptions = {}\n this.quantity = 1\n this.activeImageIndex = 0\n this.fetchError = ''\n }\n }, 400)\n }\n\n private async fetchProduct(): Promise<void> {\n const productIdNum = parseInt(this.productId, 10)\n if (Number.isNaN(productIdNum) || !this.sponsorId) {\n this.product = null\n return\n }\n this.isLoading = true\n this.fetchError = ''\n try {\n const commerce = Vio.commerceFor(this.sponsorId)\n const products = await commerce.channel.product.getByIds({\n product_ids: [productIdNum],\n currency: this.currency,\n image_size: 'large',\n })\n this.product = products[0] ?? null\n // Auto-select first value of each option (so qty + add fire correctly\n // even when the user doesn't actively pick).\n if (this.product) {\n const initial: SelectedOptions = {}\n for (const opt of this.product.options) {\n const values = normalizeValues(opt.values)\n if (values.length > 0) initial[opt.name] = values[0]!\n }\n this.selectedOptions = initial\n // Pre-prepare Apple Pay so its sheet can open synchronously on tap\n // (Apple blocks it otherwise). The button only shows if Apple Pay\n // actually works (real Stripe account + domain registered for Apple Pay).\n void Vio.checkout\n .prepareApplePayFor(this.unitPrice * this.quantity, this.currency)\n .then((handle) => {\n this.applePayHandle = handle\n this.applePayOk = handle.available\n })\n .catch(() => {\n this.applePayHandle = null\n this.applePayOk = false\n })\n }\n } catch (err) {\n this.fetchError = err instanceof Error ? err.message : String(err)\n } finally {\n this.isLoading = false\n }\n }\n\n /** Resolve the active variant from the selected option values. */\n private selectedVariant(): ProductVariant | null {\n if (!this.product || this.product.variants.length === 0) return null\n const vals = Object.values(this.selectedOptions)\n if (vals.length === 0) return this.product.variants[0] ?? null\n // Variant titles typically join option values with \" / \". Match all.\n const found = this.product.variants.find((v) => {\n if (!v.title) return false\n return vals.every((val) =>\n v.title!.toLowerCase().includes(val.toLowerCase()),\n )\n })\n return found ?? this.product.variants[0] ?? null\n }\n\n private get unitPrice(): number {\n const v = this.selectedVariant()\n const price = v?.price ?? this.product?.price\n return price?.amount_incl_taxes ?? price?.amount ?? 0\n }\n\n private get compareAt(): number | null {\n const v = this.selectedVariant()\n const price = v?.price ?? this.product?.price\n return price?.compare_at_incl_taxes ?? price?.compare_at ?? null\n }\n\n private get availableQuantity(): number {\n const v = this.selectedVariant()\n if (v) return v.quantity ?? 0\n return this.product?.quantity ?? 0\n }\n\n private stockLabel(): { text: string; cls: 'in-stock' | 'low-stock' | 'out-of-stock' } {\n const qty = this.availableQuantity\n if (qty <= 0) return { text: 'Utsolgt', cls: 'out-of-stock' }\n if (qty <= 3) return { text: `Få igjen — ${qty} stk`, cls: 'low-stock' }\n return { text: 'På lager', cls: 'in-stock' }\n }\n\n private selectOption(optionName: string, value: string): void {\n this.selectedOptions = { ...this.selectedOptions, [optionName]: value }\n }\n\n private allImages(): ProductImage[] {\n if (!this.product) return []\n const variantImages = this.selectedVariant()?.images ?? []\n if (variantImages.length > 0) return variantImages\n return this.product.images\n }\n\n private get activeImage(): ProductImage | undefined {\n return this.allImages()[this.activeImageIndex]\n }\n\n /** Add the current product + selected variant + qty to the cart. Returns the variant id used. */\n private addCurrentToCart(): number | undefined {\n if (!this.product) return undefined\n const variant = this.selectedVariant()\n const sponsor = Vio.bootstrapCache?.primarySponsor\n const secondaries = Vio.bootstrapCache?.secondarySponsors ?? []\n const sponsorName =\n sponsor?.id === this.sponsorId\n ? sponsor.name\n : secondaries.find((s) => s.id === this.sponsorId)?.name\n Vio.cart.addProduct({\n product: this.product,\n sponsorId: this.sponsorId,\n sponsorName,\n quantity: this.quantity,\n variantId: variant?.id,\n })\n return variant?.id\n }\n\n private async addToCart(): Promise<void> {\n if (!this.product || this.availableQuantity <= 0 || this.adding) return\n this.adding = true\n try {\n const variantId = this.addCurrentToCart()\n this.dispatchEvent(\n new CustomEvent('vio:added-to-cart', {\n bubbles: true,\n composed: true,\n detail: {\n productId: this.product.id,\n sponsorId: this.sponsorId,\n quantity: this.quantity,\n variantId,\n },\n }),\n )\n this.close()\n } finally {\n this.adding = false\n }\n }\n\n /**\n * Express buy: add to cart, then open the checkout overlay with Klarna\n * preselected. The host app handles `vio:checkout-open` (same event the cart\n * uses) — the `paymentMethod` hint tells it to preselect Klarna so its widget\n * loads immediately. Reuses the working Klarna Payments flow (no express SDK).\n */\n private async buyWithKlarna(): Promise<void> {\n if (!this.product || this.availableQuantity <= 0 || this.adding) return\n this.adding = true\n try {\n this.addCurrentToCart()\n this.close()\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: this.sponsorId, paymentMethod: 'klarna', express: true },\n }),\n )\n } finally {\n this.adding = false\n }\n }\n\n /**\n * Express buy with Apple Pay. Runs synchronously inside the click so the\n * Apple Pay sheet keeps the user gesture: add to cart → open checkout (sets\n * state) → launch the sheet. On authorize, `payment-complete` drives the\n * confirmation drawer (same path as the in-checkout Apple Pay button).\n */\n private buyWithApplePay(): void {\n if (!this.product || this.availableQuantity <= 0 || !this.applePayHandle) return\n this.addCurrentToCart()\n try {\n Vio.checkout.open(this.sponsorId)\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioProductDetail] checkout open failed:', err)\n }\n return\n }\n // Fire the pre-prepared Apple Pay sheet SYNCHRONOUSLY (no await before it)\n // so it stays inside the tap gesture — Apple blocks the sheet otherwise.\n // On approval, show() dispatches payment-complete → the confirmation drawer.\n void this.applePayHandle.show()\n this.close()\n }\n\n override render() {\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <div class=\"modal\" role=\"dialog\" aria-label=\"Produkt\">\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"topbar\">\n <span class=\"topbar-brand\">${this.product?.brand ?? ''}</span>\n <button class=\"close\" @click=${this.close} aria-label=\"Lukk\">×</button>\n </div>\n\n ${this.renderBody()}\n </div>\n `\n }\n\n private renderBody() {\n if (this.isLoading && !this.product) {\n return html`\n <div class=\"skeleton\" role=\"status\" aria-busy=\"true\" aria-label=\"Laster produkt\">\n <div class=\"sk-image\"></div>\n <div class=\"sk-line sk-brand\"></div>\n <div class=\"sk-line sk-title\"></div>\n <div class=\"sk-line sk-title-2\"></div>\n <div class=\"sk-line sk-price\"></div>\n <div class=\"sk-button\"></div>\n </div>\n `\n }\n if (this.fetchError) {\n return html`<div class=\"error\">Kunne ikke laste produkt: ${this.fetchError}</div>`\n }\n if (!this.product) return html``\n\n const p = this.product\n const stock = this.stockLabel()\n const compare = this.compareAt\n const showCompare = compare !== null && compare > this.unitPrice\n const images = this.allImages()\n const activeImage = this.activeImage\n\n return html`\n <div class=\"body\">\n <div class=\"gallery\">\n <div class=\"gallery-main\">\n ${activeImage?.url\n ? html`<img src=${activeImage.url} alt=${p.title} />`\n : ''}\n </div>\n ${images.length > 1\n ? html`\n <div class=\"gallery-thumbs\">\n ${images.map(\n (img, idx) => html`\n <button\n class=\"gallery-thumb ${idx === this.activeImageIndex ? 'active' : ''}\"\n @click=${() => (this.activeImageIndex = idx)}\n aria-label=${`Bilde ${idx + 1}`}\n >\n <img src=${img.url} alt=\"\" />\n </button>\n `,\n )}\n </div>\n `\n : ''}\n </div>\n\n <div class=\"info\">\n ${p.brand ? html`<div class=\"brand\">${p.brand}</div>` : ''}\n <h2 class=\"name\">${p.title}</h2>\n\n <div class=\"price-row\">\n <span class=\"price\">${formatPrice(this.unitPrice, p.price.currency_code)}</span>\n ${showCompare\n ? html`<span class=\"compare-at\">${formatPrice(\n compare,\n p.price.currency_code,\n )}</span>`\n : ''}\n </div>\n\n <div class=\"stock ${stock.cls}\">${stock.text}</div>\n\n ${this.renderOptionPickers(p.options)}\n\n <div class=\"qty-cta-row\">\n <div class=\"qty-stepper\">\n <button\n class=\"qty-btn\"\n @click=${() => (this.quantity = Math.max(1, this.quantity - 1))}\n aria-label=\"Reduser antall\"\n >\n −\n </button>\n <span class=\"qty-value\">${this.quantity}</span>\n <button\n class=\"qty-btn\"\n @click=${() =>\n (this.quantity = Math.min(this.availableQuantity, this.quantity + 1))}\n aria-label=\"Øk antall\"\n ?disabled=${this.quantity >= this.availableQuantity}\n >\n +\n </button>\n </div>\n <button\n class=\"add-to-cart\"\n @click=${this.addToCart}\n ?disabled=${this.availableQuantity <= 0 || this.adding}\n >\n ${this.adding\n ? 'Legger til…'\n : this.availableQuantity <= 0\n ? 'Utsolgt'\n : 'Legg i handlekurv'}\n </button>\n </div>\n\n ${this.availableQuantity > 0 && this.applePayOk\n ? html`\n <button\n class=\"buy-applepay\"\n @click=${this.buyWithApplePay}\n ?disabled=${this.adding}\n aria-label=\"Kjøp nå med Apple Pay\"\n >\n Kjøp nå med Pay\n </button>\n `\n : ''}\n ${this.availableQuantity > 0\n ? html`\n <button\n class=\"buy-klarna\"\n @click=${this.buyWithKlarna}\n ?disabled=${this.adding}\n >\n <span>Kjøp nå med</span>\n <img\n class=\"klarna-badge\"\n src=\"https://x.klarnacdn.net/payment-method/assets/badges/generic/klarna.svg\"\n alt=\"Klarna\"\n />\n </button>\n `\n : ''}\n\n ${p.description\n ? html`\n <div>\n <div class=\"description-label\">Beskrivelse</div>\n <div class=\"description\">${this.stripHtml(p.description)}</div>\n </div>\n `\n : ''}\n </div>\n </div>\n `\n }\n\n private renderOptionPickers(options: ProductOption[]) {\n if (options.length === 0) return ''\n return html`${options.map((opt) => {\n const values = normalizeValues(opt.values)\n if (values.length === 0) return ''\n return html`\n <div class=\"option-group\">\n <div class=\"option-label\">${opt.name}</div>\n <div class=\"option-values\">\n ${values.map(\n (val) => html`\n <button\n class=\"option-pill\"\n @click=${() => this.selectOption(opt.name, val)}\n aria-pressed=${this.selectedOptions[opt.name] === val}\n >\n ${val}\n </button>\n `,\n )}\n </div>\n </div>\n `\n })}`\n }\n\n /** Best-effort HTML strip for description. */\n private stripHtml(html: string): string {\n return html\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/p>/gi, '\\n\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .trim()\n }\n}\n\n/**\n * GraphQL sometimes returns `ProductOption.values` as a comma-joined string\n * (\"S,M,L,XL\") instead of an array. Normalize defensively.\n */\nfunction normalizeValues(raw: unknown): string[] {\n if (Array.isArray(raw)) {\n return raw.map((v) => String(v).trim()).filter((v) => v.length > 0)\n }\n if (typeof raw === 'string') {\n return raw\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0)\n }\n return []\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-product-detail': VioProductDetail\n }\n}\n","/**\n * <vio-cart> — slide-in cart drawer, reactively bound to `Vio.cart`.\n *\n * Subscribes to CartManager's `change` events on connect; auto-renders\n * the current multi-sponsor state. Tap \"Til kassen\" → opens the\n * <vio-checkout> overlay for the relevant sponsor and dispatches\n * `vio:checkout-open`.\n *\n * For the visual demo without `Vio.init`, the CartManager works standalone\n * (state is purely local + localStorage).\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { Vio } from '../../core/client.js'\nimport { formatPrice } from '../../core/types.js'\nimport type { CartChangeDetail } from '../../core/cart/cart-manager.js'\nimport type { SponsorCartState } from '../../core/cart/types.js'\n\n@customElement('vio-cart')\nexport class VioCart extends LitElement {\n /** Drawer visibility. Reflects to attribute for `:host([open])`. */\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String }) heading = 'Handlekurv'\n @property({ type: String, attribute: 'checkout-label' }) checkoutLabel = 'Til kassen'\n @property({ type: String, attribute: 'empty-label' }) emptyLabel = 'Handlekurven er tom'\n @property({ type: String, attribute: 'subtotal-label' }) subtotalLabel = 'Sum'\n\n @state() private carts: Map<number, SponsorCartState> = new Map()\n @state() private itemCount = 0\n /** True when Apple Pay is usable (Safari + device + Stripe configured). */\n @state() private applePayAvailable = false\n /** Set after an Apple Pay express purchase — switches the drawer to the\n * confirmation screen (so the rest of the cart/checkout is not shown). */\n @state() private confirmedOrder: {\n items: Array<{\n brand?: string\n name: string\n quantity: number\n unitPrice: number\n currency: string\n }>\n total: number\n currency: string\n } | null = null\n\n /** Pre-resolved Apple Pay handle; `show()` fires the sheet synchronously. */\n private applePayHandle: { available: boolean; show: () => Promise<unknown> } | null = null\n /** Cart total Apple Pay was last prepared for (avoids redundant prep). */\n private preparedTotal = -1\n\n private boundOnCartChange = (e: Event): void => {\n const detail = (e as CustomEvent<CartChangeDetail>).detail\n this.carts = detail.cartsBySponsor\n this.itemCount = detail.itemCount\n }\n\n static override styles = css`\n :host { display: contents; }\n\n .backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease;\n z-index: 998;\n }\n :host([open]) .backdrop { opacity: 1; pointer-events: auto; }\n\n .drawer {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(440px, 100%);\n background: var(--vio-color-surface, #fff);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n display: flex;\n flex-direction: column;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n z-index: 999;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.06);\n }\n :host([open]) .drawer { transform: translateX(0); }\n\n .handle { display: none; }\n\n /* Mobile: bottom sheet (slide up, rounded top, drag handle). */\n @media (max-width: 600px) {\n .drawer {\n top: auto;\n right: 0;\n left: 0;\n bottom: 0;\n width: 100%;\n height: 88vh;\n border-radius: 16px 16px 0 0;\n transform: translateY(100%);\n box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08);\n }\n :host([open]) .drawer { transform: translateY(0); }\n .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n }\n .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: 2px;\n }\n }\n\n .header {\n padding: var(--vio-space-lg, 24px);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 24px;\n font-weight: 400;\n margin: 0;\n }\n .close {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n line-height: 1;\n padding: 0;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .close:hover { color: var(--vio-color-text-secondary, #666); }\n\n .body {\n flex: 1;\n overflow-y: auto;\n }\n\n .sponsor-group {\n padding: var(--vio-space-md, 16px) var(--vio-space-lg, 24px);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n }\n .sponsor-group:last-child { border-bottom: none; }\n .sponsor-label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-tertiary, #999);\n font-weight: 500;\n margin: 0 0 var(--vio-space-md, 16px);\n }\n\n .item {\n display: grid;\n grid-template-columns: 80px 1fr;\n gap: var(--vio-space-md, 16px);\n padding: var(--vio-space-md, 16px) 0;\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n }\n .item:last-child { border-bottom: none; }\n .item-image {\n aspect-ratio: 1;\n background: var(--vio-color-surface-muted, #f2f2f2);\n overflow: hidden;\n }\n .item-image img { width: 100%; height: 100%; object-fit: cover; display: block; }\n .item-brand {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .item-name {\n font-size: 14px;\n margin: 4px 0;\n font-weight: 500;\n line-height: 1.3;\n }\n .item-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: var(--vio-space-sm, 8px);\n }\n .item-qty {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--vio-color-text-secondary, #666);\n font-size: 12px;\n }\n .qty-btn {\n width: 24px;\n height: 24px;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n background: #fff;\n border-radius: 2px;\n cursor: pointer;\n font-size: 12px;\n color: var(--vio-color-text, #0a0a0a);\n line-height: 1;\n padding: 0;\n font-family: inherit;\n }\n .qty-btn:hover { border-color: var(--vio-color-text, #0a0a0a); }\n .item-price { font-size: 14px; font-weight: 700; }\n\n .empty {\n padding: 80px var(--vio-space-lg, 24px);\n text-align: center;\n color: var(--vio-color-text-secondary, #666);\n font-size: 14px;\n }\n\n .footer {\n padding: var(--vio-space-lg, 24px);\n border-top: 1px solid var(--vio-color-border, #e5e5e5);\n background: var(--vio-color-surface, #fff);\n }\n .subtotal-row {\n display: flex;\n justify-content: space-between;\n margin-bottom: var(--vio-space-md, 16px);\n font-size: 14px;\n }\n .subtotal-label { color: var(--vio-color-text-secondary, #666); }\n .subtotal-value { font-weight: 700; font-size: 16px; }\n\n .checkout-btn {\n width: 100%;\n padding: 18px;\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n border: none;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n cursor: pointer;\n font-weight: 600;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n transition: background 0.15s;\n }\n .checkout-btn:hover:not(:disabled) { background: #222; }\n .checkout-btn:disabled {\n background: var(--vio-color-text-tertiary, #999);\n cursor: not-allowed;\n }\n\n /* Apple Pay express — pay the whole cart directly, above \"Til kassen\". */\n .applepay-btn {\n width: 100%;\n padding: 15px;\n margin-bottom: 10px;\n background: #000;\n color: #fff;\n border: none;\n border-radius: 8px;\n font-size: 19px;\n font-weight: 500;\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n transition: opacity 0.15s;\n }\n .applepay-btn:hover { opacity: 0.86; }\n .applepay-btn .ap-logo { font-size: 19px; line-height: 1; }\n /* Klarna express — pink brand button, same express row as Apple Pay. */\n .klarna-btn {\n width: 100%;\n padding: 15px;\n margin-bottom: 10px;\n background: #ffb3c7;\n color: #0a0a0a;\n border: none;\n border-radius: 8px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n transition: background 0.15s;\n }\n .klarna-btn:hover { background: #ffa1ba; }\n .klarna-btn .klarna-logo { height: 15px; width: auto; display: inline-block; }\n .express-divider {\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 4px 0 12px;\n color: var(--vio-color-text-tertiary, #999);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n }\n .express-divider::before,\n .express-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--vio-color-border, #e5e5e5);\n }\n\n /* In-drawer confirmation after Apple Pay (nothing else is shown). */\n .confirm {\n padding: 56px var(--vio-space-lg, 24px) 40px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n .confirm-check {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n background: #0a8a3f;\n color: #fff;\n font-size: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 20px;\n }\n .confirm h3 {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 24px;\n font-weight: 400;\n margin: 0 0 8px;\n }\n .confirm p {\n color: var(--vio-color-text-secondary, #666);\n font-size: 14px;\n margin: 0 0 24px;\n }\n .confirm-summary {\n width: 100%;\n border-top: 1px solid var(--vio-color-border, #e5e5e5);\n padding-top: 16px;\n margin-bottom: 28px;\n text-align: left;\n }\n .order-row {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 14px;\n margin-bottom: 10px;\n color: var(--vio-color-text, #0a0a0a);\n }\n .order-row.total {\n border-top: 1px solid var(--vio-color-border, #e5e5e5);\n padding-top: 12px;\n margin-top: 4px;\n font-weight: 700;\n }\n .confirm-close {\n width: 100%;\n padding: 16px;\n background: var(--vio-color-text, #0a0a0a);\n color: #fff;\n border: none;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n cursor: pointer;\n font-weight: 600;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n }\n .confirm-close:hover { background: #222; }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n // Seed initial state from manager.\n this.carts = Vio.cart.getAllCarts()\n this.itemCount = Vio.cart.itemCount\n Vio.cart.addEventListener('change', this.boundOnCartChange)\n }\n\n override disconnectedCallback(): void {\n Vio.cart.removeEventListener('change', this.boundOnCartChange)\n super.disconnectedCallback()\n }\n\n close(): void { this.open = false }\n show(): void { this.open = true }\n\n override updated(changed: Map<string, unknown>): void {\n // Fresh open → drop any previous confirmation, force an Apple Pay re-prep.\n if (changed.has('open') && this.open) {\n this.confirmedOrder = null\n this.preparedTotal = -1\n }\n // (Re)prepare Apple Pay whenever the open cart's total changes.\n if (this.open && this.itemCount > 0) {\n const total = this.totalAcrossSponsors\n if (total !== this.preparedTotal) {\n this.preparedTotal = total\n void this.refreshApplePay(total)\n }\n }\n }\n\n /** Pre-resolve the Apple Pay sheet for the current cart total. */\n private async refreshApplePay(total: number): Promise<void> {\n if (total <= 0) {\n this.applePayHandle = null\n this.applePayAvailable = false\n return\n }\n try {\n const handle = await Vio.checkout.prepareApplePayExpress(total, this.primaryCurrency)\n // A newer prep may have superseded this one while awaiting.\n if (this.preparedTotal !== total) return\n this.applePayHandle = handle\n this.applePayAvailable = handle.available\n } catch {\n this.applePayHandle = null\n this.applePayAvailable = false\n }\n }\n\n /** Apple Pay express — pay the whole cart, then show the confirmation. */\n private onApplePay(): void {\n const handle = this.applePayHandle\n if (!handle || !handle.available || this.itemCount === 0) return\n // Snapshot items + total BEFORE clearing the cart (confirmation needs them).\n const snapshot = this.buildConfirmation()\n // Fire the sheet synchronously inside the tap (Apple gesture rule); handle\n // the result asynchronously.\n void handle.show().then((result) => {\n if (!result) return // user cancelled / failed — keep the cart as-is\n this.confirmedOrder = snapshot\n for (const sponsorId of [...this.carts.keys()]) {\n Vio.cart.clearSponsorCart(sponsorId)\n }\n this.dispatchEvent(\n new CustomEvent('vio:payment-success', {\n bubbles: true,\n composed: true,\n detail: { method: 'apple-pay', result },\n }),\n )\n })\n }\n\n private buildConfirmation(): NonNullable<VioCart['confirmedOrder']> {\n const items: NonNullable<VioCart['confirmedOrder']>['items'] = []\n for (const cart of this.carts.values()) {\n for (const it of cart.items) {\n items.push({\n brand: it.brand,\n name: it.name,\n quantity: it.quantity,\n unitPrice: it.unitPrice,\n currency: it.currency,\n })\n }\n }\n return { items, total: this.totalAcrossSponsors, currency: this.primaryCurrency }\n }\n\n private closeConfirmation(): void {\n this.confirmedOrder = null\n this.close()\n }\n\n /** Klarna express — opens the side-drawer Klarna checkout for the whole cart,\n * skipping the address form (leveringsadresse) and method picker\n * (betalingsmetode). The host's checkout-open handler closes this cart and\n * opens <vio-checkout> in express mode with Klarna preselected. */\n private onKlarnaExpress(): void {\n if (this.itemCount === 0) return\n const firstSponsorId = [...this.carts.keys()][0]\n if (firstSponsorId === undefined) return\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: firstSponsorId, paymentMethod: 'klarna', express: true },\n }),\n )\n }\n\n private get totalAcrossSponsors(): number {\n let sum = 0\n for (const cart of this.carts.values()) {\n for (const item of cart.items) sum += item.unitPrice * item.quantity\n }\n return sum\n }\n\n private get primaryCurrency(): string {\n for (const cart of this.carts.values()) return cart.currency\n return 'NOK'\n }\n\n private onIncrement(item: { id: string; sponsorId: number; quantity: number }): void {\n Vio.cart.updateQuantity(item.id, item.sponsorId, item.quantity + 1)\n }\n\n private onDecrement(item: { id: string; sponsorId: number; quantity: number }): void {\n Vio.cart.updateQuantity(item.id, item.sponsorId, item.quantity - 1)\n }\n\n private onRemove(item: { id: string; sponsorId: number }): void {\n Vio.cart.removeItem(item.id, item.sponsorId)\n }\n\n override render() {\n const isEmpty = this.itemCount === 0\n const sponsorCarts = [...this.carts.values()].filter((c) => c.items.length > 0)\n\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <aside class=\"drawer\" role=\"dialog\" aria-label=${this.heading}>\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"header\">\n <h2 class=\"heading\">${this.confirmedOrder ? 'Takk!' : this.heading}</h2>\n <button class=\"close\" @click=${this.close} aria-label=\"Lukk\">×</button>\n </div>\n\n ${this.confirmedOrder\n ? this.renderConfirmation()\n : isEmpty\n ? html`<div class=\"empty\">${this.emptyLabel}</div>`\n : html`\n <div class=\"body\">\n ${sponsorCarts.map(\n (cart) => html`\n <div class=\"sponsor-group\">\n ${cart.sponsorName\n ? html`<div class=\"sponsor-label\">${cart.sponsorName}</div>`\n : ''}\n ${cart.items.map(\n (item) => html`\n <div class=\"item\">\n <div class=\"item-image\">\n ${item.imageUrl\n ? html`<img src=${item.imageUrl} alt=${item.name} />`\n : ''}\n </div>\n <div>\n <div class=\"item-brand\">${item.brand}</div>\n <div class=\"item-name\">${item.name}</div>\n <div class=\"item-row\">\n <span class=\"item-qty\">\n <button\n class=\"qty-btn\"\n @click=${() => this.onDecrement(item)}\n aria-label=\"Reduser\"\n >\n −\n </button>\n ${item.quantity}\n <button\n class=\"qty-btn\"\n @click=${() => this.onIncrement(item)}\n aria-label=\"Øk\"\n >\n +\n </button>\n <button\n class=\"qty-btn\"\n @click=${() => this.onRemove(item)}\n aria-label=\"Fjern\"\n style=\"margin-left: 8px;\"\n >\n ×\n </button>\n </span>\n <span class=\"item-price\">\n ${formatPrice(\n item.unitPrice * item.quantity,\n item.currency,\n )}\n </span>\n </div>\n </div>\n </div>\n `,\n )}\n </div>\n `,\n )}\n </div>\n <div class=\"footer\">\n <div class=\"subtotal-row\">\n <span class=\"subtotal-label\">${this.subtotalLabel}</span>\n <span class=\"subtotal-value\">\n ${formatPrice(this.totalAcrossSponsors, this.primaryCurrency)}\n </span>\n </div>\n ${this.applePayAvailable\n ? html`\n <button\n class=\"applepay-btn\"\n @click=${this.onApplePay}\n aria-label=\"Betal med Apple Pay\"\n >\n <span class=\"ap-logo\">${''}</span> Pay\n </button>\n `\n : ''}\n <button\n class=\"klarna-btn\"\n @click=${this.onKlarnaExpress}\n aria-label=\"Betal med Klarna\"\n >\n Kjøp med\n <img\n class=\"klarna-logo\"\n src=\"https://x.klarnacdn.net/payment-method/assets/badges/generic/klarna.svg\"\n alt=\"Klarna\"\n />\n </button>\n </div>\n `}\n </aside>\n `\n }\n\n private renderConfirmation() {\n const o = this.confirmedOrder\n if (!o) return html``\n return html`\n <div class=\"confirm\">\n <div class=\"confirm-check\" aria-hidden=\"true\">✓</div>\n <h3>Takk for handelen!</h3>\n <p>Betaling med Apple Pay er bekreftet.</p>\n <div class=\"confirm-summary\">\n ${o.items.map(\n (it) => html`\n <div class=\"order-row\">\n <span>${it.brand ? `${it.brand} ` : ''}${it.name} ×${it.quantity}</span>\n <span>${formatPrice(it.unitPrice * it.quantity, it.currency)}</span>\n </div>\n `,\n )}\n <div class=\"order-row total\">\n <span>Totalt</span>\n <span>${formatPrice(o.total, o.currency)}</span>\n </div>\n </div>\n <button class=\"confirm-close\" @click=${this.closeConfirmation}>Lukk</button>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-cart': VioCart\n }\n}\n","/**\n * <vio-checkout> — full-screen native checkout overlay, reactively bound\n * to `Vio.checkout` (CheckoutManager).\n *\n * Subscribes to checkout state on connect, renders address form + payment\n * method buttons + order summary. Apple Pay is auto-detected via Stripe\n * Payment Request — button is hidden when unavailable (e.g. Chrome on\n * non-Apple device, or no Stripe key configured).\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { Vio } from '../../core/client.js'\nimport { formatPrice } from '../../core/types.js'\nimport type { CartLineItem } from '../../core/cart/types.js'\nimport {\n KLARNA_SHIPPING_OPTIONS,\n type CheckoutChangeDetail,\n type KlarnaPaymentsHandle,\n} from '../../core/checkout/checkout-manager.js'\nimport type {\n CheckoutAddress,\n CheckoutState,\n PaymentMethod,\n} from '../../core/checkout/types.js'\n\n@customElement('vio-checkout')\nexport class VioCheckout extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String }) heading = 'Kasse'\n @property({ type: String, attribute: 'shipping-label' })\n shippingLabel = 'Beregnes ved kasse'\n /** Express mode — render only the Klarna widget (no address form / method grid). */\n @property({ type: Boolean, reflect: true }) express = false\n\n @state() private checkoutState: CheckoutState | null = null\n @state() private items: CartLineItem[] = []\n @state() private applePayAvailable = false\n @state() private applePayInProgress = false\n @state() private klarnaAvailable = false\n @state() private orderConfirmed = false\n @state() private confirmedMethod: PaymentMethod | null = null\n @state() private paymentError: string | null = null\n /** Snapshot of the placed order, for the confirmation screen. */\n @state() private confirmedOrder: {\n items: CartLineItem[]\n currency: string\n total: number\n orderId?: string\n } | null = null\n\n /** Active Klarna Payments widget handle + the subtotal it was mounted for. */\n private klarnaHandle: KlarnaPaymentsHandle | null = null\n private klarnaMountedAmount: number | null = null\n private klarnaMountedShipping: string | null = null\n private klarnaMounting = false\n /** Categories offered by the active Klarna session + the selected one. */\n @state() private klarnaCategories: KlarnaPaymentsHandle['categories'] = []\n @state() private klarnaSelectedCat = ''\n @state() private klarnaAuthorizing = false\n /** Chosen shipping option id (express flow) — drives the Klarna order total. */\n @state() private selectedShipping =\n KLARNA_SHIPPING_OPTIONS.find((o) => o.preselected)?.id ?? KLARNA_SHIPPING_OPTIONS[0]?.id ?? ''\n @state() private form: CheckoutAddress = {\n firstName: '',\n lastName: '',\n email: '',\n address: '',\n postalCode: '',\n city: '',\n }\n\n private boundOnCheckoutChange = (e: Event): void => {\n const detail = (e as CustomEvent<CheckoutChangeDetail>).detail\n this.checkoutState = detail.state\n this.items = Vio.checkout.items\n // Re-check vendor availability when state changes (e.g. checkout reopens\n // with a different sponsor / amount).\n if (this.checkoutState) {\n this.refreshApplePay()\n this.refreshKlarna()\n } else {\n this.applePayAvailable = false\n this.klarnaAvailable = false\n this.orderConfirmed = false\n this.confirmedMethod = null\n this.confirmedOrder = null\n this.paymentError = null\n this.express = false\n this.unmountKlarna()\n }\n }\n\n private boundOnPaymentComplete = (e: Event): void => {\n const detail = (\n e as CustomEvent<{ method: string; state?: { sponsorId: number }; result: unknown }>\n ).detail\n // Klarna (after server order creation) and Apple Pay (after the sheet\n // authorizes) both reach the same confirmation drawer. Other methods\n // (Vipps/Card) confirm via the plain CTA, not this event.\n if (detail.method !== 'klarna' && detail.method !== 'apple-pay') return\n const sponsorId = detail.state?.sponsorId ?? this.checkoutState?.sponsorId\n if (sponsorId == null) return\n this.confirmOrder(detail.method as PaymentMethod, sponsorId, detail.result)\n }\n\n private boundOnPaymentError = (e: Event): void => {\n const detail = (e as CustomEvent<{ method: string; error: string }>).detail\n this.paymentError =\n detail.method === 'klarna'\n ? `Klarna-betalingen kunne ikke fullføres: ${detail.error}`\n : detail.error\n // A redirect failure lands with the overlay closed — open it so the error\n // is visible rather than silently dropping the user on the home page.\n this.open = true\n }\n\n static override styles = css`\n :host { display: contents; }\n .backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease;\n z-index: 999;\n }\n :host([open]) .backdrop { opacity: 1; pointer-events: auto; }\n\n .modal {\n position: fixed;\n inset: 0;\n background: var(--vio-color-surface, #fff);\n transform: translateY(100%);\n transition: transform 0.35s cubic-bezier(0.32, 0.72, 0, 1);\n display: flex;\n flex-direction: column;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n z-index: 1000;\n overflow-y: auto;\n }\n :host([open]) .modal { transform: translateY(0); }\n\n /* Confirmation drawer — compact bottom sheet, not the full-screen overlay. */\n .modal.as-drawer {\n inset: auto 0 0 0;\n height: auto;\n max-height: 88vh;\n max-width: 460px;\n margin: 0 auto;\n border-radius: 16px 16px 0 0;\n box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.18);\n }\n .modal.as-drawer .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n flex-shrink: 0;\n }\n .modal.as-drawer .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: 2px;\n }\n\n /* Express (Apple Pay-style): right-side drawer, like the cart. Slides in\n from the right instead of the full-screen overlay. */\n .modal.as-side {\n inset: 0 0 0 auto;\n width: min(440px, 100%);\n max-width: 440px;\n transform: translateX(100%);\n border-radius: 0;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.1);\n }\n :host([open]) .modal.as-side { transform: translateX(0); }\n @media (max-width: 600px) {\n /* On phones, keep it a bottom sheet for reachability. */\n .modal.as-side {\n inset: auto 0 0 0;\n width: 100%;\n max-width: none;\n height: 92vh;\n transform: translateY(100%);\n border-radius: 16px 16px 0 0;\n }\n :host([open]) .modal.as-side { transform: translateY(0); }\n }\n\n /* Confirmation: a centered desktop dialog (the bottom-sheet looked like\n mobile on desktop). Falls back to a bottom sheet on phones. */\n .modal.as-confirm {\n inset: auto;\n top: 50%;\n left: 50%;\n width: min(92vw, 440px);\n max-width: 440px;\n height: auto;\n max-height: 88vh;\n border-radius: 16px;\n box-shadow: 0 30px 80px -24px rgba(0, 0, 0, 0.4);\n transform: translate(-50%, -50%) scale(0.96);\n opacity: 0;\n }\n :host([open]) .modal.as-confirm {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n @media (max-width: 600px) {\n .modal.as-confirm {\n inset: auto 0 0 0;\n top: auto;\n left: 0;\n width: 100%;\n max-width: none;\n border-radius: 16px 16px 0 0;\n transform: translateY(100%) scale(1);\n opacity: 1;\n }\n :host([open]) .modal.as-confirm { transform: translateY(0); }\n }\n\n .handle { display: none; }\n\n /* Mobile: bottom sheet with rounded top + drag handle. */\n @media (max-width: 600px) {\n .modal {\n top: auto;\n height: 92vh;\n border-radius: 16px 16px 0 0;\n box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08);\n }\n .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n flex-shrink: 0;\n }\n .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: 2px;\n }\n }\n\n .topbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px var(--vio-space-lg, 24px);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n position: sticky;\n top: 0;\n background: var(--vio-color-surface, #fff);\n z-index: 1;\n }\n .heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 24px;\n font-weight: 400;\n margin: 0;\n }\n .close {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n line-height: 1;\n padding: 0;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .close:hover { color: var(--vio-color-text-secondary, #666); }\n\n .body {\n max-width: 720px;\n margin: 0 auto;\n width: 100%;\n padding: 56px var(--vio-space-lg, 24px) 80px;\n box-sizing: border-box;\n }\n .section { margin-bottom: 56px; }\n .section-label {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-accent, #c14a3b);\n margin-bottom: 12px;\n font-weight: 500;\n }\n .section-heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 28px;\n margin: 0 0 var(--vio-space-lg, 24px);\n font-weight: 400;\n line-height: 1.2;\n }\n\n .form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--vio-space-md, 16px);\n }\n .field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: var(--vio-space-md, 16px);\n }\n .field label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .field input {\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n font-size: 16px;\n font-family: inherit;\n color: inherit;\n background: transparent;\n outline: none;\n transition: border-color 0.15s;\n }\n .field input:focus { border-bottom-color: var(--vio-color-text, #0a0a0a); }\n\n .payment-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--vio-space-md, 16px);\n }\n .payment-btn {\n padding: 20px;\n background: #fff;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n cursor: pointer;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: border-color 0.15s, background 0.15s;\n color: var(--vio-color-text, #0a0a0a);\n }\n .payment-btn:hover:not(:disabled) {\n border-color: var(--vio-color-text, #0a0a0a);\n background: var(--vio-color-surface-hover, #fafafa);\n }\n .payment-btn:disabled {\n cursor: progress;\n opacity: 0.6;\n }\n .payment-btn.primary {\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n grid-column: 1 / -1;\n border-color: var(--vio-color-text, #0a0a0a);\n padding: 22px;\n font-weight: 600;\n }\n .payment-btn.primary:hover:not(:disabled) { background: #222; border-color: #222; }\n .payment-btn[aria-pressed='true'] {\n border-color: var(--vio-color-accent, #c14a3b);\n }\n .apple-pay-note {\n grid-column: 1 / -1;\n font-size: 12px;\n color: var(--vio-color-text-tertiary, #999);\n text-align: center;\n margin-top: 4px;\n }\n /* Klarna Payments — inline widget panel, shown once Klarna is selected. */\n .klarna-panel {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 4px;\n }\n .klarna-cats {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n .klarna-cat {\n flex: 1 1 auto;\n padding: 8px 12px;\n border: 1px solid var(--vio-color-border, #ddd);\n border-radius: 8px;\n background: #fff;\n font-size: 13px;\n cursor: pointer;\n }\n .klarna-cat.active {\n border-color: var(--vio-color-text, #111);\n background: var(--vio-color-surface-2, #f6f6f6);\n font-weight: 600;\n }\n .klarna-widget {\n min-height: 48px;\n }\n .express-summary {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n }\n /* Shipping selector (express) — Standard / Express options. */\n .ship-select { display: flex; flex-direction: column; gap: 8px; }\n .ship-opt {\n display: flex; align-items: center; justify-content: space-between; gap: 12px;\n padding: 12px 14px; border: 1px solid var(--vio-color-border, #ddd);\n border-radius: 10px; background: #fff; cursor: pointer; font-family: inherit;\n text-align: left;\n }\n .ship-opt.active {\n border-color: var(--vio-color-text, #111);\n background: var(--vio-color-surface-2, #f6f6f6);\n }\n .ship-opt:disabled { opacity: 0.6; cursor: default; }\n .ship-meta { display: flex; flex-direction: column; gap: 2px; }\n .ship-meta b { font-weight: 600; font-size: 13px; }\n .ship-meta span { color: var(--vio-color-text-secondary, #666); font-size: 12px; }\n .ship-price { font-weight: 600; font-size: 13px; }\n .payment-error {\n grid-column: 1 / -1;\n padding: 12px 16px;\n background: #fdecea;\n border: 1px solid var(--vio-color-accent, #c14a3b);\n border-radius: 8px;\n font-size: 13px;\n color: var(--vio-color-accent, #c14a3b);\n text-align: center;\n }\n /* \"Betal\" CTA — sits full-width below the method grid once a method is\n picked. Reuses .payment-btn.primary (its grid-column spans the row). */\n .complete-cta { margin-top: 8px; }\n\n /* Order confirmation — compact, shown inside the drawer. */\n .confirmation {\n text-align: center;\n padding: 24px 24px 28px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n }\n .confirm-check {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n background: #2e7d32;\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n line-height: 1;\n }\n .confirm-title {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 28px;\n font-weight: 400;\n margin: 0;\n }\n .confirm-text {\n font-size: 14px;\n color: var(--vio-color-text-secondary, #666);\n max-width: 360px;\n line-height: 1.6;\n margin: 0;\n }\n .confirm-order-id {\n font-size: 13px;\n color: var(--vio-color-text-secondary, #666);\n }\n .confirm-order-id b {\n color: var(--vio-color-text, #0a0a0a);\n font-variant-numeric: tabular-nums;\n }\n .confirm-summary {\n width: 100%;\n max-width: 360px;\n border-top: 1px solid var(--vio-color-border, #eee);\n padding-top: 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n text-align: left;\n font-size: 13px;\n }\n .confirm-close {\n border: none;\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n padding: 16px 48px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n margin-top: 16px;\n }\n .confirm-close:hover { background: #222; }\n\n .order-summary {\n background: var(--vio-color-surface-muted, #f2f2f2);\n padding: var(--vio-space-lg, 24px);\n margin-top: var(--vio-space-xl, 32px);\n }\n .order-line {\n display: grid;\n grid-template-columns: 56px 1fr auto;\n gap: 12px;\n padding: 8px 0;\n align-items: center;\n }\n .order-line-img {\n aspect-ratio: 1;\n background: #fff;\n overflow: hidden;\n }\n .order-line-img img { width: 100%; height: 100%; object-fit: cover; display: block; }\n .order-line-meta { font-size: 13px; }\n .order-line-meta b { display: block; }\n .order-line-meta span {\n color: var(--vio-color-text-secondary, #666);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n }\n .order-line-price { font-weight: 700; font-size: 14px; }\n .order-row {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n font-size: 14px;\n }\n .order-row.total {\n border-top: 1px solid var(--vio-color-border-default, #ccc);\n margin-top: var(--vio-space-sm, 8px);\n padding-top: var(--vio-space-md, 16px);\n font-weight: 700;\n font-size: 16px;\n }\n\n @media (max-width: 600px) {\n .form-row { grid-template-columns: 1fr; gap: 0; }\n .payment-grid { grid-template-columns: 1fr; }\n .body { padding: 32px var(--vio-space-lg, 24px) 64px; }\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.checkoutState = Vio.checkout.currentState\n this.items = Vio.checkout.items\n Vio.checkout.addEventListener('change', this.boundOnCheckoutChange)\n Vio.checkout.addEventListener('payment-complete', this.boundOnPaymentComplete)\n Vio.checkout.addEventListener('payment-error', this.boundOnPaymentError)\n if (this.checkoutState) {\n void this.refreshApplePay()\n void this.refreshKlarna()\n }\n }\n\n override disconnectedCallback(): void {\n Vio.checkout.removeEventListener('change', this.boundOnCheckoutChange)\n Vio.checkout.removeEventListener('payment-complete', this.boundOnPaymentComplete)\n Vio.checkout.removeEventListener('payment-error', this.boundOnPaymentError)\n this.unmountKlarna()\n super.disconnectedCallback()\n }\n\n override updated(): void {\n // Mount the Klarna Express button once its slot is in the DOM, the\n // express flow is available, and the overlay is open. Re-mount when the\n // amount changes (the payment request is captured at mount time).\n void this.mountKlarnaIfNeeded()\n }\n\n close(): void {\n this.open = false\n this.express = false\n Vio.checkout.close()\n }\n\n show(): void { this.open = true }\n\n private async refreshApplePay(): Promise<void> {\n Vio.checkout.clearApplePayCache()\n this.applePayAvailable = await Vio.checkout.isApplePayAvailable('NO')\n }\n\n private async refreshKlarna(): Promise<void> {\n // Klarna Payments (classic widget) is available if its lib can load — it\n // uses a server-minted client_token, no public clientId / origin handshake.\n const available = await Vio.checkout.klarnaPaymentsAvailable()\n if (available !== this.klarnaAvailable) {\n if (!available) this.unmountKlarna()\n this.klarnaAvailable = available\n }\n }\n\n /** Mount (or re-mount on amount change) the Klarna Payments widget. */\n private async mountKlarnaIfNeeded(): Promise<void> {\n if (!this.klarnaAvailable || !this.open || !this.checkoutState) return\n // Only mount once Klarna is the chosen method — creating a session is a\n // backend call, so don't fire it until the user picks Klarna (or we're in\n // express mode, which is Klarna-only).\n if (this.checkoutState.paymentMethod !== 'klarna' && !this.express) return\n if (this.klarnaMounting) return\n const amount = this.checkoutState.subtotal\n // Re-mount when the amount OR the chosen shipping changes (a new shipping\n // option means a new session/total — Klarna's widget can't be updated live).\n if (\n this.klarnaHandle &&\n this.klarnaMountedAmount === amount &&\n this.klarnaMountedShipping === this.selectedShipping\n ) {\n return\n }\n const container = this.renderRoot?.querySelector(\n '#vio-klarna-payments-container',\n ) as HTMLElement | null\n if (!container) return\n\n this.klarnaMounting = true\n this.unmountKlarna()\n container.innerHTML = ''\n try {\n const handle = await Vio.checkout.mountKlarnaPayments(container, {\n withShipping: this.express,\n shippingId: this.selectedShipping,\n })\n this.klarnaHandle = handle\n this.klarnaMountedAmount = amount\n this.klarnaMountedShipping = this.selectedShipping\n this.klarnaCategories = handle.categories\n this.klarnaSelectedCat = handle.selected\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna Payments mount failed:', err)\n }\n this.paymentError = `Kunne ikke laste Klarna: ${\n err instanceof Error ? err.message : String(err)\n }`\n } finally {\n this.klarnaMounting = false\n }\n }\n\n private unmountKlarna(): void {\n if (this.klarnaHandle) {\n this.klarnaHandle.unmount()\n this.klarnaHandle = null\n }\n this.klarnaMountedAmount = null\n this.klarnaMountedShipping = null\n this.klarnaCategories = []\n this.klarnaSelectedCat = ''\n this.klarnaAuthorizing = false\n }\n\n /** Selected shipping option (express flow). */\n private get shippingOption() {\n return KLARNA_SHIPPING_OPTIONS.find((o) => o.id === this.selectedShipping) ?? null\n }\n\n /** Pick a shipping option → re-mounts the Klarna widget with the new total. */\n private onSelectShipping(id: string): void {\n if (this.selectedShipping === id || this.klarnaMounting) return\n this.selectedShipping = id\n }\n\n /** Switch the Klarna widget to a different payment_method_category. */\n private async onKlarnaCategory(identifier: string): Promise<void> {\n if (!this.klarnaHandle || this.klarnaSelectedCat === identifier) return\n this.klarnaSelectedCat = identifier\n try {\n await this.klarnaHandle.load(identifier)\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna category switch failed:', err)\n }\n }\n }\n\n /** Authorize the selected Klarna method → backend creates the order. */\n private async onKlarnaAuthorize(): Promise<void> {\n if (!this.klarnaHandle || this.klarnaAuthorizing) return\n this.paymentError = null\n this.klarnaAuthorizing = true\n try {\n // Resolves once the order is created (payment-complete) or surfaces a\n // payment-error event handled by boundOnPaymentError.\n await this.klarnaHandle.authorize()\n } finally {\n this.klarnaAuthorizing = false\n }\n }\n\n private onFieldChange<K extends keyof CheckoutAddress>(field: K, value: string): void {\n this.form = { ...this.form, [field]: value }\n Vio.checkout.setAddress(this.form)\n }\n\n private async onApplePay(): Promise<void> {\n if (this.applePayInProgress) return\n this.applePayInProgress = true\n try {\n // On authorize, startApplePay dispatches `payment-complete` →\n // boundOnPaymentComplete → confirmOrder shows the confirmation drawer\n // (and emits vio:payment-success). No manual close/emit here.\n await Vio.checkout.startApplePay({ country: 'NO', label: 'Vio' })\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Apple Pay flow ended:', err)\n }\n } finally {\n this.applePayInProgress = false\n }\n }\n\n private onPay(method: PaymentMethod): void {\n this.paymentError = null\n if (method === 'apple-pay') {\n void this.onApplePay()\n return\n }\n Vio.checkout.selectPaymentMethod(method)\n }\n\n /**\n * Complete the order for the selected method (Vipps / Card / plain Klarna).\n * Apple Pay and Klarna Express finish inside their own sheet/popup, so they\n * never reach here. No real PSP is wired for Vipps/Card in this iteration —\n * the capture happens backend-side in the full flow — so this confirms the\n * order state-only and shows the confirmation screen.\n */\n private onCompleteOrder(): void {\n const s = this.checkoutState\n if (!s || !s.paymentMethod) return\n this.confirmOrder(s.paymentMethod, s.sponsorId)\n }\n\n /**\n * Shared order confirmation — reached from both the plain \"Betal\" CTA\n * (Vipps/Card/Klarna) and the Klarna Express authorize callback. Shows\n * the confirmation screen, emits `vio:payment-success`, and clears the\n * paid sponsor's cart so the badge + drawer reflect the purchase.\n */\n private confirmOrder(method: PaymentMethod, sponsorId: number, result?: unknown): void {\n // Snapshot the order BEFORE clearing the cart — the confirmation needs it.\n const r = (result ?? {}) as { order?: { orderId?: string }; chargedTotal?: number }\n this.confirmedOrder = {\n items: [...this.items],\n currency: this.checkoutState?.currency ?? '',\n total:\n typeof r.chargedTotal === 'number' ? r.chargedTotal : (this.checkoutState?.subtotal ?? 0),\n orderId: r.order?.orderId,\n }\n this.confirmedMethod = method\n this.orderConfirmed = true\n // A redirect completion lands with the overlay closed — open it so the\n // confirmation screen is visible.\n this.open = true\n this.dispatchEvent(\n new CustomEvent('vio:payment-success', {\n bubbles: true,\n composed: true,\n detail: { method, sponsorId, result },\n }),\n )\n Vio.cart.clearSponsorCart(sponsorId)\n }\n\n private methodLabel(method: PaymentMethod | null): string {\n switch (method) {\n case 'apple-pay':\n return 'Apple Pay'\n case 'klarna':\n return 'Klarna'\n case 'vipps':\n return 'Vipps'\n case 'card':\n return 'kort'\n default:\n return ''\n }\n }\n\n /** True for methods that complete via a separate sheet/widget, not the CTA. */\n private isExpressMethod(method: PaymentMethod | undefined): boolean {\n // Apple Pay finishes in its sheet; Klarna finishes via its widget's\n // authorize() button — neither uses the generic \"Betal\" CTA.\n return method === 'apple-pay' || method === 'klarna'\n }\n\n private orderTotal(): string {\n const s = this.checkoutState\n if (!s) return ''\n return formatPrice(s.subtotal, s.currency)\n }\n\n /** Shipping cost (major units) applied in express mode, else 0. */\n private shippingMajor(): number {\n return this.express ? (this.shippingOption?.price ?? 0) / 100 : 0\n }\n\n /** Total to charge — items + shipping (express). */\n private payTotalLabel(): string {\n const s = this.checkoutState\n if (!s) return ''\n return formatPrice(s.subtotal + this.shippingMajor(), s.currency)\n }\n\n override render() {\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <div\n class=\"modal ${this.express ? 'as-side' : this.orderConfirmed ? 'as-confirm' : ''}\"\n role=\"dialog\"\n aria-label=${this.heading}\n >\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"topbar\">\n <h2 class=\"heading\">${this.orderConfirmed ? 'Takk!' : this.heading}</h2>\n <button class=\"close\" @click=${this.close} aria-label=\"Lukk\">×</button>\n </div>\n\n <div class=\"body\">\n ${this.orderConfirmed\n ? this.renderConfirmation()\n : this.express\n ? this.renderKlarnaExpress()\n : this.renderCheckoutBody()}\n </div>\n </div>\n `\n }\n\n private renderConfirmation() {\n const o = this.confirmedOrder\n return html`\n <section class=\"confirmation\">\n <div class=\"confirm-check\" aria-hidden=\"true\">✓</div>\n <h3 class=\"confirm-title\">Takk for bestillingen!</h3>\n <p class=\"confirm-text\">\n Betaling med ${this.methodLabel(this.confirmedMethod)} er bekreftet.${this.form.email\n ? html` Kvittering sendes til ${this.form.email}.`\n : ''}\n </p>\n ${o?.orderId\n ? html`<div class=\"confirm-order-id\">Ordrenummer: <b>${o.orderId}</b></div>`\n : ''}\n ${o && o.items.length > 0\n ? html`\n <div class=\"confirm-summary\">\n ${o.items.map(\n (it) => html`\n <div class=\"order-row\">\n <span>${it.brand ? `${it.brand} ` : ''}${it.name} ×${it.quantity}</span>\n <span>${formatPrice(it.unitPrice * it.quantity, it.currency)}</span>\n </div>\n `,\n )}\n <div class=\"order-row total\">\n <span>Totalt</span><span>${formatPrice(o.total, o.currency)}</span>\n </div>\n </div>\n `\n : ''}\n <button class=\"confirm-close\" @click=${this.close}>Lukk</button>\n </section>\n `\n }\n\n /** Klarna Payments widget panel: shipping + category chips + widget + pay button. */\n private renderKlarnaPanel() {\n const currency = this.checkoutState?.currency ?? 'NOK'\n return html`\n <div class=\"klarna-panel\">\n ${this.express\n ? html`\n <div class=\"ship-select\" role=\"radiogroup\" aria-label=\"Frakt\">\n ${KLARNA_SHIPPING_OPTIONS.map(\n (o) => html`\n <button\n class=\"ship-opt ${this.selectedShipping === o.id ? 'active' : ''}\"\n role=\"radio\"\n aria-checked=${this.selectedShipping === o.id}\n ?disabled=${this.klarnaMounting}\n @click=${() => this.onSelectShipping(o.id)}\n >\n <span class=\"ship-meta\">\n <b>${o.method}</b><span>${o.description}</span>\n </span>\n <span class=\"ship-price\">${formatPrice(o.price / 100, currency)}</span>\n </button>\n `,\n )}\n </div>\n `\n : ''}\n ${this.klarnaCategories.length > 1\n ? html`\n <div class=\"klarna-cats\">\n ${this.klarnaCategories.map(\n (c) => html`\n <button\n class=\"klarna-cat ${this.klarnaSelectedCat === c.identifier ? 'active' : ''}\"\n @click=${() => void this.onKlarnaCategory(c.identifier)}\n >\n ${c.name}\n </button>\n `,\n )}\n </div>\n `\n : ''}\n <div class=\"klarna-widget\" id=\"vio-klarna-payments-container\"></div>\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${() => void this.onKlarnaAuthorize()}\n ?disabled=${this.klarnaAuthorizing || !this.klarnaHandle || this.klarnaMounting}\n >\n ${this.klarnaAuthorizing ? 'Behandler…' : `Betal ${this.payTotalLabel()} med Klarna`}\n </button>\n </div>\n `\n }\n\n /** Express layout — only the Klarna widget + a compact order summary. */\n private renderKlarnaExpress() {\n return html`\n <section class=\"section\">\n <h3 class=\"section-heading\">Kjøp med Klarna</h3>\n ${this.items.length > 0\n ? html`\n <div class=\"express-summary\">\n ${this.items.map(\n (item) => html`\n <div class=\"order-row\">\n <span>${item.brand ? `${item.brand} ` : ''}${item.name} ×${item.quantity}</span>\n <span>${formatPrice(item.unitPrice * item.quantity, item.currency)}</span>\n </div>\n `,\n )}\n <div class=\"order-row\">\n <span>Frakt${this.shippingOption ? ` – ${this.shippingOption.method}` : ''}</span>\n <span>${formatPrice(this.shippingMajor(), this.checkoutState?.currency ?? 'NOK')}</span>\n </div>\n <div class=\"order-row total\">\n <span>Totalt</span><span>${this.payTotalLabel()}</span>\n </div>\n </div>\n `\n : ''}\n ${this.renderKlarnaPanel()}\n ${this.paymentError\n ? html`<div class=\"payment-error\">${this.paymentError}</div>`\n : ''}\n </section>\n `\n }\n\n private renderCheckoutBody() {\n const method = this.checkoutState?.paymentMethod\n const showCompleteCta = !!method && !this.isExpressMethod(method)\n return html`\n <section class=\"section\">\n <div class=\"section-label\">Steg 1</div>\n <h3 class=\"section-heading\">Leveringsadresse</h3>\n <div class=\"form-row\">\n <div class=\"field\">\n <label>Fornavn</label>\n <input\n type=\"text\"\n autocomplete=\"given-name\"\n .value=${this.form.firstName}\n @input=${(e: InputEvent) =>\n this.onFieldChange('firstName', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label>Etternavn</label>\n <input\n type=\"text\"\n autocomplete=\"family-name\"\n .value=${this.form.lastName}\n @input=${(e: InputEvent) =>\n this.onFieldChange('lastName', (e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n <div class=\"field\">\n <label>E-post</label>\n <input\n type=\"email\"\n autocomplete=\"email\"\n .value=${this.form.email}\n @input=${(e: InputEvent) =>\n this.onFieldChange('email', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label>Adresse</label>\n <input\n type=\"text\"\n autocomplete=\"street-address\"\n .value=${this.form.address}\n @input=${(e: InputEvent) =>\n this.onFieldChange('address', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"form-row\">\n <div class=\"field\">\n <label>Postnummer</label>\n <input\n type=\"text\"\n autocomplete=\"postal-code\"\n .value=${this.form.postalCode}\n @input=${(e: InputEvent) =>\n this.onFieldChange('postalCode', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label>Sted</label>\n <input\n type=\"text\"\n autocomplete=\"address-level2\"\n .value=${this.form.city}\n @input=${(e: InputEvent) =>\n this.onFieldChange('city', (e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-label\">Steg 2</div>\n <h3 class=\"section-heading\">Velg betalingsmåte</h3>\n <div class=\"payment-grid\">\n ${this.applePayAvailable\n ? html`\n <button\n class=\"payment-btn primary\"\n @click=${() => this.onPay('apple-pay')}\n ?disabled=${this.applePayInProgress}\n aria-pressed=${this.checkoutState?.paymentMethod === 'apple-pay'}\n >\n ${this.applePayInProgress ? 'Åpner…' : ' Pay'}\n </button>\n `\n : ''}\n ${this.klarnaAvailable\n ? html`\n <button\n class=\"payment-btn\"\n @click=${() => this.onPay('klarna')}\n aria-pressed=${this.checkoutState?.paymentMethod === 'klarna'}\n >\n Klarna\n </button>\n `\n : ''}\n <button\n class=\"payment-btn\"\n @click=${() => this.onPay('vipps')}\n aria-pressed=${this.checkoutState?.paymentMethod === 'vipps'}\n >\n Vipps\n </button>\n <button\n class=\"payment-btn\"\n @click=${() => this.onPay('card')}\n aria-pressed=${this.checkoutState?.paymentMethod === 'card'}\n >\n Kort\n </button>\n ${!this.applePayAvailable\n ? html`\n <div class=\"apple-pay-note\">\n Pay krever Safari på iOS eller macOS med Apple Pay konfigurert.\n </div>\n `\n : ''}\n ${showCompleteCta\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${this.onCompleteOrder}\n >\n Betal ${this.orderTotal()} med ${this.methodLabel(method ?? null)}\n </button>\n `\n : ''}\n ${method === 'klarna' ? this.renderKlarnaPanel() : ''}\n ${this.paymentError\n ? html`<div class=\"payment-error\">${this.paymentError}</div>`\n : ''}\n </div>\n </section>\n\n ${this.items.length > 0\n ? html`\n <section class=\"order-summary\">\n ${this.items.map(\n (item) => html`\n <div class=\"order-line\">\n <div class=\"order-line-img\">\n ${item.imageUrl\n ? html`<img src=${item.imageUrl} alt=${item.name} />`\n : ''}\n </div>\n <div class=\"order-line-meta\">\n <span>${item.brand}</span>\n <b>${item.name}</b>\n <span>×${item.quantity}</span>\n </div>\n <div class=\"order-line-price\">\n ${formatPrice(item.unitPrice * item.quantity, item.currency)}\n </div>\n </div>\n `,\n )}\n <div class=\"order-row\" style=\"margin-top: 16px;\">\n <span>Sum</span><span>${this.orderTotal()}</span>\n </div>\n <div class=\"order-row\">\n <span>Frakt</span><span>${this.shippingLabel}</span>\n </div>\n <div class=\"order-row total\">\n <span>Totalt</span><span>${this.orderTotal()}</span>\n </div>\n </section>\n `\n : ''}\n </div>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-checkout': VioCheckout\n }\n}\n","/**\n * Vio UI — Web Components + design tokens.\n *\n * Importing this file (directly or via the main `vio` entry) has two\n * side-effects:\n * 1. Injects design tokens as CSS custom properties on `:root`\n * 2. Registers all `<vio-*>` custom elements\n *\n * SSR-safe: every side-effect guards on `typeof document !== 'undefined'`.\n */\n\nimport './tokens.js'\n\n// Register custom elements (each side-effect imports its decorator)\nimport './components/vio-product.js'\nimport './components/vio-product-carousel.js'\nimport './components/vio-product-detail.js'\nimport './components/vio-cart.js'\nimport './components/vio-checkout.js'\n\nexport { VioTokens } from './tokens.js'\nexport { VioProduct } from './components/vio-product.js'\nexport { VioProductCarousel } from './components/vio-product-carousel.js'\nexport { VioProductDetail } from './components/vio-product-detail.js'\nexport { VioCart } from './components/vio-cart.js'\nexport { VioCheckout } from './components/vio-checkout.js'\n\nexport const VIO_UI_VERSION = '0.1.0'\n"]}
|