@dabalabs/agent 0.0.2-beta → 0.0.4-beta

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.
Files changed (40) hide show
  1. package/README.md +56 -3
  2. package/dist/chunk-3BQ6LE6X.cjs +222 -0
  3. package/dist/chunk-3BQ6LE6X.cjs.map +1 -0
  4. package/dist/{chunk-CMHPVBEF.js → chunk-ETI4LRM7.js} +841 -100
  5. package/dist/chunk-ETI4LRM7.js.map +1 -0
  6. package/dist/chunk-TYOHYQDK.js +220 -0
  7. package/dist/chunk-TYOHYQDK.js.map +1 -0
  8. package/dist/{chunk-IMPMGYCG.cjs → chunk-VAIC5ACS.cjs} +841 -99
  9. package/dist/chunk-VAIC5ACS.cjs.map +1 -0
  10. package/dist/custom-element.cjs +4 -4
  11. package/dist/custom-element.d.cts +191 -2
  12. package/dist/custom-element.d.ts +191 -2
  13. package/dist/custom-element.js +2 -2
  14. package/dist/daba-agent.cjs +5 -14
  15. package/dist/daba-agent.d.cts +2 -4
  16. package/dist/daba-agent.d.ts +2 -4
  17. package/dist/daba-agent.js +2 -3
  18. package/dist/daba-agent.min.js +141 -36
  19. package/dist/daba-agent.min.js.map +1 -1
  20. package/dist/react.cjs +41 -14
  21. package/dist/react.cjs.map +1 -1
  22. package/dist/react.d.cts +1 -1
  23. package/dist/react.d.ts +1 -1
  24. package/dist/react.js +38 -2
  25. package/dist/react.js.map +1 -1
  26. package/dist/{types-hdR_wQ1B.d.cts → types-BQRgqD4n.d.cts} +70 -4
  27. package/dist/{types-hdR_wQ1B.d.ts → types-BQRgqD4n.d.ts} +70 -4
  28. package/package.json +1 -1
  29. package/dist/chunk-7ENX2QZK.js +0 -193
  30. package/dist/chunk-7ENX2QZK.js.map +0 -1
  31. package/dist/chunk-CMHPVBEF.js.map +0 -1
  32. package/dist/chunk-GCU5OBSZ.js +0 -40
  33. package/dist/chunk-GCU5OBSZ.js.map +0 -1
  34. package/dist/chunk-HJPH4GNS.cjs +0 -196
  35. package/dist/chunk-HJPH4GNS.cjs.map +0 -1
  36. package/dist/chunk-IMPMGYCG.cjs.map +0 -1
  37. package/dist/chunk-JQMJMSFT.cjs +0 -46
  38. package/dist/chunk-JQMJMSFT.cjs.map +0 -1
  39. package/dist/custom-element-BZAUI4Dc.d.cts +0 -121
  40. package/dist/custom-element-PL2IXpG2.d.ts +0 -121
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/agent-api.ts","../src/voice/live-transport.ts","../src/environment.ts","../src/utils/page-context.ts","../src/actions/dom-actions.ts","../src/audio/audio-pcm.ts","../src/session/session-store.ts","../src/ui/styles.ts","../src/ui/brand.ts","../src/ui/badge.ts","../src/ui/cards.ts","../src/ui/markdown.ts","../src/ui/chat-window.ts","../src/i18n/locales.ts","../src/utils/hotkey.ts","../src/agent.ts"],"names":["cleanText","cssEscape","labelForField","icon","hotkeyLabel","mods"],"mappings":";AAcO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EAExC,WAAA,CAAY,WAAsB,KAAA,EAAiB;AACjD,IAAA,KAAA,CAAM,UAAU,OAAO,CAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF,CAAA;AAOA,SAAS,gBAAA,GAA4B;AACnC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,QAAA;AAC7B,EAAA,OACE,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,OAAA,IACT,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAEzB;AAEA,SAAS,cAAc,MAAA,EAAmC;AACxD,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,aAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,oBAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,WAAA;AAC3B,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,eAAA,CAAgB,QAAgB,aAAA,EAAgC;AACvE,EAAA,IAAI,aAAA,IAAiB,aAAA,KAAkB,cAAA,IAAkB,aAAA,KAAkB,WAAA,EAAa;AACtF,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,GAAA;AACH,MAAA,OAAO,gBAAA,KACH,qEAAA,GACA,yDAAA;AAAA,IACN,KAAK,GAAA;AACH,MAAA,OAAO,gBAAA,KACH,iFAAA,GACA,2EAAA;AAAA,IACN,KAAK,GAAA;AACH,MAAA,OAAO,gBAAA,KACH,mFAAA,GACA,wDAAA;AAAA,IACN;AACE,MAAA,OAAO,4EAAA;AAAA;AAEb;AAEA,SAAS,mBAAmB,UAAA,EAA4B;AACtD,EAAA,IAAI,kBAAiB,EAAG;AACtB,IAAA,OAAO,8BAA8B,UAAU,CAAA,4CAAA,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,4EAAA;AACT;AAEA,eAAe,aAAgB,QAAA,EAAgC;AAC7D,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO,EAAE,KAAA,EAAO,IAAA,EAAK,CAAE,CAAA;AAChE,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AAAA,MACnC,OAAA,EAAS,eAAA,CAAgB,QAAA,CAAS,MAAA,EAAQ,KAAK,KAAK;AAAA,KACtD;AACA,IAAA,MAAM,IAAI,eAAe,KAAK,CAAA;AAAA,EAChC;AACA,EAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAC9B;AAaA,SAAS,WAAW,KAAA,EAAyC;AAC3D,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACrE,KAAA,GACD,EAAC;AACP;AAKA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AACtC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,OAAA,KAAY,KAAK,IAAA,GAAO,OAAA;AACjC;AAEA,SAAS,QAAA,CAA2B,KAAA,EAAgB,OAAA,EAAuB,QAAA,EAAgB;AACzF,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,OAAO,SAAS,IAAA,IAAS,OAAA,CAA8B,QAAA,CAAS,IAAI,IAAK,IAAA,GAAa,QAAA;AACxF;AAKA,SAAS,cAAA,CAAiC,OAAgB,OAAA,EAAiC;AACzF,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,OAAO,SAAS,IAAA,IAAS,OAAA,CAA8B,QAAA,CAAS,IAAI,IAAK,IAAA,GAAa,IAAA;AACxF;AAIA,SAAS,WAAA,CAAY,OAAgB,QAAA,EAA4B;AAC/D,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,KAAA;AACvC,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAK,CAAA,EAAG,WAAA,EAAY;AAC5C,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AAC5B,EAAA,IAAI,IAAA,KAAS,SAAS,OAAO,KAAA;AAC7B,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAA0B;AAChD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,IAAA,IAAI,IAAA,KAAS,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,WAAA,GAAwC,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAA;AACxE,IAAM,eAAA,GAAgD,CAAC,SAAA,EAAW,QAAA,EAAU,MAAM,CAAA;AAClF,IAAM,eAAA,GAAgD;AAAA,EACpD,cAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,iBAAA,GAAoD,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAClF,IAAM,UAAA,GAAuC,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAClE,IAAM,iBAAA,GAAoB,CAAC,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AAanD,SAAS,cAAA,CAAe,WAAmB,OAAA,EAAoC;AAC7E,EAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAErC,EAAA,OAAO;AAAA;AAAA;AAAA,IAGL,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,IAAK,SAAA;AAAA;AAAA;AAAA,IAG1C,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,IAAK,EAAA;AAAA,IACjC,eAAA,EAAiB,UAAA,CAAW,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,IAIjD,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,aAAa,QAAQ,CAAA;AAAA,IAC/C,UAAA,EAAY;AAAA,MACV,WAAA,EAAa,UAAA,CAAW,UAAA,CAAW,YAAY,CAAA;AAAA,MAC/C,cAAA,EAAgB,UAAA,CAAW,UAAA,CAAW,eAAe,CAAA;AAAA,MACrD,YAAA,EAAc,UAAA,CAAW,UAAA,CAAW,aAAa,CAAA;AAAA,MACjD,SAAA,EAAW,UAAA,CAAW,UAAA,CAAW,UAAU,CAAA;AAAA,MAC3C,MAAA,EAAQ,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,MACpC,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,WAAW,CAAA;AAAA,MAC7C,OAAA,EAAS,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA;AAAA,MACvC,eAAA,EAAiB,UAAA,CAAW,UAAA,CAAW,iBAAiB,CAAA;AAAA,MACxD,aAAA,EAAe,UAAA,CAAW,UAAA,CAAW,cAAc,CAAA;AAAA,MACnD,aAAA,EAAe,QAAA,CAAS,UAAA,CAAW,cAAA,EAAgB,iBAAiB,SAAS,CAAA;AAAA,MAC7E,QAAA,EAAU,cAAA,CAAe,UAAA,CAAW,QAAA,EAAU,eAAe,CAAA;AAAA,MAC7D,KAAA,EAAO,QAAA,CAAS,UAAA,CAAW,KAAA,EAAO,mBAAmB,MAAM;AAAA,KAC7D;AAAA,IACA,KAAA,EAAO;AAAA;AAAA;AAAA,MAGL,OAAA,EAAS,WAAA,CAAY,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAAA,MACxC,QAAA,EAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAAA,MACnC,WAAA,EAAa,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA;AAAA,MACzC,QAAA,EAAU,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA;AAAA;AAAA;AAAA,MAGpC,SAAA,EAAW,QAAA,CAAS,KAAA,CAAM,UAAA,EAAY,mBAAmB,MAAM,CAAA;AAAA,MAC/D,gBAAA,EAAkB,cAAA,CAAe,KAAA,CAAM,iBAAiB;AAAA,KAC1D;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA;AAAA,MAC9C,SAAA,EAAW,QAAA,CAAS,MAAA,CAAO,SAAA,EAAW,YAAY,MAAM;AAAA;AAC1D,GACF;AACF;AAYA,eAAsB,gBAAA,CACpB,UAAA,EACA,SAAA,EACA,MAAA,EAC2B;AAC3B,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,YAAY,CAAA,kBAAA,EAAqB,kBAAA;AAAA,IAC9C;AAAA,GACD,CAAA,KAAA,EAAQ,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAEnC,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,mBAAmB,YAAY;AAAA,KAC1C;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAsB,QAAQ,CAAA;AACjD,EAAA,OAAO,cAAA,CAAe,WAAW,IAAI,CAAA;AACvC;AAEA,eAAsB,kBAAA,CACpB,UAAA,EACA,SAAA,EACA,MAAA,EACA,WAAA,EAC+C;AAC/C,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,YAAY,CAAA,kBAAA,EAAqB,kBAAA;AAAA,IAC9C;AAAA,GACD,CAAA,cAAA,EAAiB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAE5C,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,MAAM,GAAA,EAAK;AAAA,MAC1B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,IAAA,EAAM,CAAA,aAAA,EAAgB,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,KACtD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,mBAAmB,YAAY;AAAA,KAC1C;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAyC,QAAQ,CAAA;AACpE,EAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,KAAK,MAAA,EAAO;AAC1D;AAOA,eAAsB,iBAAA,CACpB,UAAA,EACA,SAAA,EACA,MAAA,EACA,aACA,QAAA,EACyC;AACzC,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,YAAY,CAAA,kBAAA,EAAqB,kBAAA;AAAA,IAC9C;AAAA,GACD,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB,EAAE,cAAc,WAAA,EAAa,GAAA,EAAK,UAAU,CAAA;AAE7E,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,MAAM,GAAA,EAAK;AAAA,MAC1B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,IAAA,EAAM,KAAK,QAAA;AAAS,KACrB,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,mBAAmB,YAAY;AAAA,KAC1C;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAwC,QAAQ,CAAA;AACnE,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,KAAK,KAAA,EAAM;AAC5C;AAEA,IAAM,UAAA,GAAsC;AAAA,EAC1C,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,WAAW,KAAA,EAAgC;AAClD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACjC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,IAAA,KAAS,IAAA,EAAM;AACrC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,IAAA;AACT;AAcA,SAAS,QAAQ,KAAA,EAA4B;AAC3C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,IAAI,UAAU,IAAA,EAAM;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,YAAY,MAAM,CAAA;AAAA,MAC3C,KAAA;AAAA,MACA,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,MAC/B,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,MACzB,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAAA,MAChC,YAAA,EAAc,UAAA,CAAW,GAAA,CAAI,aAAa,CAAA;AAAA,MAC1C,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,MAC/B,MAAA,EAAQ,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,GAAA,EAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAAA,MACvB,QAAA,EAAU,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAAA,MAClC,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AAAA,MACtC,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAgBA,eAAsB,YAAA,CACpB,UAAA,EACA,SAAA,EACA,MAAA,EACA,IAAA,EAOwB;AACxB,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,YAAY,CAAA,kBAAA,EAAqB,kBAAA;AAAA,IAC9C;AAAA,GACD,CAAA,UAAA,EAAa,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAExC,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,EAAA,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,OAAO,CAAA;AAChC,EAAA,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,IAAA,CAAK,cAAc,CAAA;AAC/C,EAAA,IAAI,KAAK,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,KAAK,WAAW,CAAA;AAC/D,EAAA,IAAI,KAAK,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,KAAK,UAAU,CAAA;AAC5D,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,SAAS,MAAM,CAAA;AAExC,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,MAAM,GAAA,EAAK;AAAA,MAC1B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,mBAAmB,YAAY;AAAA,KAC1C;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAsB,QAAQ,CAAA;AACjD,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,IAAK,EAAA;AAAA,IAChC,QAAA,EAAU,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AAAA,IACtC,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA;AAAA;AAAA,IAGxB,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,GACtC,GAAA,CAAI,WAAA,CACD,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,EAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,EACvE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAK,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CACjC,KAAA,CAAM,CAAA,EAAG,CAAC,IACb,EAAC;AAAA;AAAA;AAAA;AAAA,IAIL,cAAA,EAAgB,UAAA,CAAW,GAAA,CAAI,eAAe,KAAK,IAAA,CAAK;AAAA,GAC1D;AACF;;;ACxaA,IAAM,YAAA,GAAe,YAAA;AACrB,IAAM,cAAA,GAAiB,GAAA;AAEhB,IAAM,gBAAN,MAA8C;AAAA,EAOnD,YAA6B,OAAA,EAA+B;AAA/B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAN7B,IAAA,IAAA,CAAQ,EAAA,GAA+B,IAAA;AACvC,IAAA,IAAA,CAAQ,OAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,SAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,OAAA,GAAmC,IAAA;AAC3C,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAAA,EAE2C;AAAA,EAE7D,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,EAAA,KAAO,IAAA,IAAQ,CAAC,IAAA,CAAK,OAAA;AAAA,EACnC;AAAA,EAEA,MAAM,MAAM,WAAA,EAAoC;AAC9C,IAAA,IAAI,KAAK,EAAA,EAAI;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA;AAE3C,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,SAAA,GAAY,MAAM,SAAA,CAAU,YAAA,CAAa,aAAa,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IAC5E,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,OAAA,CAAQ;AAAA,QAC5B,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,IAAI,iBAAA,EAAkB;AACjC,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AAEV,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,cAAA,EAAe,EAAG;AACnD,MAAA,EAAA,CAAG,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IACnC;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,IAAA;AACxB,IAAA,EAAA,CAAG,OAAA,GAAU,CAAC,KAAA,KAAU;AACtB,MAAA,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,IACjE,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,iBAAA,CAAkB,YAAY,CAAA;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAC,KAAA,KAAU,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAC1D,IAAA,OAAA,CAAQ,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,SAAS,WAAW,CAAA;AAEjE,IAAA,EAAA,CAAG,0BAA0B,MAAM;AACjC,MAAA,IAAI,EAAA,CAAG,eAAA,KAAoB,QAAA,IAAY,EAAA,CAAG,oBAAoB,QAAA,EAAU;AACtE,QAAA,IAAA,CAAK,QAAA,EAAS;AACd,QAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAA,EAAS;AAAA,MACjC;AAAA,IACF,CAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,WAAA,EAAY;AACnC,MAAA,MAAM,EAAA,CAAG,oBAAoB,KAAK,CAAA;AAClC,MAAA,MAAM,IAAA,CAAK,oBAAoB,EAAE,CAAA;AAEjC,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,iBAAA;AAAA,QACpB,KAAK,OAAA,CAAQ,UAAA;AAAA,QACb,KAAK,OAAA,CAAQ,SAAA;AAAA,QACb,KAAK,OAAA,CAAQ,MAAA;AAAA,QACb,WAAA;AAAA,QACA,EAAA,CAAG,gBAAA,EAAkB,GAAA,IAAO,KAAA,CAAM,GAAA,IAAO;AAAA,OAC3C;AACA,MAAA,MAAM,GAAG,oBAAA,CAAqB,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,OAAA;AAAA,QACpB,OAAO,SAAA,IAAa,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,oCAAA;AAAqC,OACvF;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAA,EAAS;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,QAAgB,MAAA,EAAuB;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,eAAe,MAAA,EAAQ;AACzD,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,sBAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA;AAC/B,KACD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,iBAAA,EAAmB,CAAA;AAAA,EACvC;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAA,EAAS;AAAA,EACjC;AAAA,EAEQ,KAAK,OAAA,EAAwC;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,eAAe,MAAA,EAAQ;AACzD,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEQ,oBAAoB,EAAA,EAAsC;AAChE,IAAA,IAAI,EAAA,CAAG,iBAAA,KAAsB,UAAA,EAAY,OAAO,QAAQ,OAAA,EAAQ;AAChE,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,IAAI,EAAA,CAAG,sBAAsB,UAAA,EAAY;AACvC,UAAA,EAAA,CAAG,mBAAA,CAAoB,2BAA2B,IAAI,CAAA;AACtD,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AACA,MAAA,EAAA,CAAG,gBAAA,CAAiB,2BAA2B,IAAI,CAAA;AACnD,MAAA,MAAA,CAAO,WAAW,MAAM;AACtB,QAAA,EAAA,CAAG,mBAAA,CAAoB,2BAA2B,IAAI,CAAA;AACtD,QAAA,OAAA,EAAQ;AAAA,MACV,GAAG,cAAc,CAAA;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,iBAAiB,KAAA,EAA2B;AAClD,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAA,CAAK,OAAA;AAC1B,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,gCAAA;AACH,QAAA,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,KAAK,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,+BAAA;AACH,QAAA,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AACrC,QAAA;AAAA,MACF,KAAK,iCAAA;AACH,QAAA,QAAA,CAAS,SAAS,UAAU,CAAA;AAC5B,QAAA,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,GAAA,EAAK,KAAK,CAAA;AACvC,QAAA;AAAA,MACF,KAAK,gCAAA;AACH,QAAA,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,GAAA,EAAK,IAAI,CAAA;AACtC,QAAA,QAAA,CAAS,SAAS,WAAW,CAAA;AAC7B,QAAA;AAAA,MACF,KAAK,2BAAA;AACH,QAAA,IAAA,CAAK,aAAa,GAAG,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,QAAA,CAAS,OAAA,CAAQ;AAAA,UACf,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,SAC5B,CAAA;AACD,QAAA;AAAA,MACF;AAEE;AACJ,EACF;AAAA,EAEQ,cAAA,CAAe,IAAA,EAAwB,GAAA,EAA8B,KAAA,EAAsB;AACjG,IAAA,MAAM,IAAA,GAAQ,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,cAAc,GAAA,CAAI,IAAA;AACjD,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO;AACrB,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,IAAA,EAAM,IAAA,IAAQ,IAAI,KAAK,CAAA;AAAA,EAC5D;AAAA,EAEQ,aAAa,GAAA,EAAoC;AACvD,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB;AAC5C,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AACpB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,UAAA,CAAW;AAAA,MAC/B,MAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAO,KAAK,SAAA,IAAoC;AAAA,KACjD,CAAA;AAAA,EACH;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,IAAA,IAAA,CAAK,SAAA,EAAW,WAAU,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA;AAC3D,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,IAAA;AACzB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,EACZ;AACF,CAAA;;;ACxNA,IAAM,YAAA,GAAgD;AAAA,EACpD,UAAA,EAAY,0BAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAeO,SAAS,iBAAA,CAAkB,YAAqB,GAAA,EAAsB;AAC3E,EAAA,IAAI,YAAY,OAAO,UAAA;AACvB,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,IAAQ,QAAQ,EAAA,EAAI;AACnD,IAAA,OAAO,YAAA,CAAa,UAAA;AAAA,EACtB;AACA,EAAA,MAAM,aAAa,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAClD,EAAA,IAAI,UAAA,KAAe,SAAA,EAAW,OAAO,YAAA,CAAa,OAAA;AAClD,EAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,6BAA6B,GAAG,CAAA,gHAAA;AAAA,KAElC;AAAA,EACF;AACA,EAAA,OAAO,YAAA,CAAa,UAAA;AACtB;;;AC5CA,IAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAM,SAAA,GAAY,GAAA;AAClB,IAAM,UAAA,GAAa,EAAA;AAIZ,SAAS,gBAAA,GAA4B;AAC1C,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,KAAA;AAC5C,EAAA,OACE,QAAA,CAAS,gBAAgB,YAAA,CAAa,4BAA4B,KAClE,QAAA,CAAS,aAAA,CAAc,oCAAoC,CAAA,KAAM,IAAA;AAErE;AAEA,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACrC;AAEA,IAAM,0BAAA,GACJ,iKAAA;AAIF,SAAS,uBAAuB,EAAA,EAAsB;AACpD,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,0BAA0B,CAAA,KAAM,IAAA;AACpD;AAEA,IAAM,eAAA,GAA4B;AAAA,EAChC,gCAAA;AAAA,EACA,gDAAA;AAAA,EACA,wBAAA;AAAA,EACA,kEAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,YAAY,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,kBAAA,GAA6B;AACpC,EAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,gBAAA,CAAiB,IAAA,EAAM,WAAW,SAAA,EAAW;AAAA,IACnE,WAAW,IAAA,EAAM;AACf,MAAA,MAAM,SAAS,IAAA,CAAK,aAAA;AACpB,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,UAAA,CAAW,aAAA;AAC/B,MAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,MAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,OAAA,IAAW,QAAQ,UAAA,EAAY;AAC7D,QAAA,OAAO,UAAA,CAAW,aAAA;AAAA,MACpB;AACA,MAAA,IAAI,sBAAA,CAAuB,MAAM,CAAA,EAAG;AAClC,QAAA,OAAO,UAAA,CAAW,aAAA;AAAA,MACpB;AACA,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,MAAM,CAAA;AAC5C,MAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,IAAU,KAAA,CAAM,eAAe,QAAA,EAAU;AAC7D,QAAA,OAAO,UAAA,CAAW,aAAA;AAAA,MACpB;AACA,MAAA,OAAO,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA,CAAY,MAAK,GAAI,UAAA,CAAW,gBAAgB,UAAA,CAAW,WAAA;AAAA,IAC7F;AAAA,GACD,CAAA;AAED,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,MAAA,CAAO,UAAS,EAAG;AACxB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,eAAe,EAAE,CAAA;AAC3D,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,IAAA,KAAA,IAAS,IAAA,CAAK,MAAA;AACd,IAAA,IAAI,SAAS,mBAAA,EAAqB;AAAA,EACpC;AACA,EAAA,OAAO,aAAA,CAAc,OAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,mBAAmB,CAAA;AACrE;AAEA,SAAS,YAAA,GAAyB;AAChC,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAoC,SAAS,CAAC,CAAA;AAClF,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,sBAAA,CAAuB,CAAC,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA;AACvC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG;AAC9E,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC3B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA;AAQlC,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AACpC,MAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,YAAA,EAAc,GAAG,WAAW,CAAA,CAAE,KAAA,CAAM,GAAG,SAAS,CAAA;AAC7D;AAEA,SAAS,UAAU,EAAA,EAAoB;AACrC,EAAA,IAAI,OAAO,GAAA,KAAQ,WAAA,IAAe,OAAO,GAAA,CAAI,WAAW,UAAA,EAAY;AAClE,IAAA,OAAO,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,iBAAA,EAAmB,MAAM,CAAA;AAC7C;AAEA,SAAS,cAAc,EAAA,EAAyB;AAC9C,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,QAAQ,QAAA,CAAS,aAAA,CAAgC,cAAc,SAAA,CAAU,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACtF,IAAA,IAAI,SAAS,KAAA,CAAM,WAAA,EAAa,OAAO,SAAA,CAAU,MAAM,WAAW,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACvC,EAAA,IAAI,gBAAgB,YAAA,CAAa,WAAA,EAAa,OAAO,SAAA,CAAU,aAAa,WAAW,CAAA;AACvF,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW,OAAO,SAAA,CAAU,SAAS,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AACjD,EAAA,IAAI,WAAA,EAAa,OAAO,SAAA,CAAU,WAAW,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,EAAA,IAAI,MAAM,OAAO,IAAA;AACjB,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,iBAAA,GAA8B;AACrC,EAAA,MAAM,SAAS,KAAA,CAAM,IAAA;AAAA,IACnB,QAAA,CAAS,gBAAA;AAAA,MACP;AAAA;AACF,GACF;AACA,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,sBAAA,CAAuB,KAAK,CAAA,EAAG;AACnC,IAAA,MAAM,IAAA,GAAQ,KAAA,CAA2B,IAAA,IAAQ,KAAA,CAAM,QAAQ,WAAA,EAAY;AAC3E,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAA,IAAY,SAAS,QAAA,EAAU;AACjE,IAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAC7B,IAAA,IAAI,GAAA,CAAI,UAAU,UAAA,EAAY;AAAA,EAChC;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,QAAA,CAAS,KAAA,IAAS,YAAY,CAAA,CAAE,CAAA;AAC1D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAEzC,EAAA,MAAM,WAAW,kBAAA,EAAmB;AACpC,EAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AAEpD,EAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,EAAwB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAE3E,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA;AAAA,EAAyF,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC5G;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAC1B;;;ACzKA,SAASA,WAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACrC;AAEA,SAASC,WAAU,EAAA,EAAoB;AACrC,EAAA,IAAI,OAAO,GAAA,KAAQ,WAAA,IAAe,OAAO,GAAA,CAAI,WAAW,UAAA,EAAY;AAClE,IAAA,OAAO,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,iBAAA,EAAmB,MAAM,CAAA;AAC7C;AAEA,SAASC,eAAc,EAAA,EAAyB;AAC9C,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,QAAQ,QAAA,CAAS,aAAA,CAAgC,cAAcD,UAAAA,CAAU,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACtF,IAAA,IAAI,SAAS,KAAA,CAAM,WAAA,EAAa,OAAOD,UAAAA,CAAU,MAAM,WAAW,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACvC,EAAA,IAAI,gBAAgB,YAAA,CAAa,WAAA,EAAa,OAAOA,UAAAA,CAAU,aAAa,WAAW,CAAA;AACvF,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW,OAAOA,UAAAA,CAAU,SAAS,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AACjD,EAAA,IAAI,WAAA,EAAa,OAAOA,UAAAA,CAAU,WAAW,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,EAAA,IAAI,MAAM,OAAO,IAAA;AACjB,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,iBAAiB,EAAA,EAA0B;AAClD,EAAA,IAAI,EAAA,CAAG,aAAa,wBAAwB,CAAA,IAAK,GAAG,OAAA,CAAQ,0BAA0B,GAAG,OAAO,IAAA;AAChG,EAAA,IAAI,cAAc,gBAAA,EAAkB;AAClC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,WAAA,EAAY;AACjC,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAErD,IAAA,MAAM,gBAAgB,EAAA,CAAG,YAAA,CAAa,cAAc,CAAA,IAAK,IAAI,WAAA,EAAY;AACzE,IAAA,IACE,iBAAiB,kBAAA,IACjB,YAAA,KAAiB,kBACjB,YAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAC7B;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQE,cAAAA,CAAc,EAAE,CAAA,CAAE,WAAA,EAAY;AAC5C,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,UAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,eAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,kBAAkB,IAAA,CAAK,CAAC,OAAO,KAAA,CAAM,QAAA,CAAS,EAAE,CAAC,CAAA;AAC1D;AAEA,SAAS,gBAAgB,UAAA,EAAuF;AAC9G,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,WAAA,EAAY,CAAE,IAAA,EAAK;AAC5C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA;AAAA,IACvB,QAAA,CAAS,gBAAA;AAAA,MACP;AAAA;AACF,GACF;AAEA,EAAA,IAAI,cAAA,GAAoF,IAAA;AACxF,EAAA,IAAI,gBAAA,GAAsF,IAAA;AAE1F,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,gBAAA,CAAiB,EAAE,CAAA,EAAG;AAE1B,IAAA,MAAM,KAAA,GAAQA,cAAAA,CAAc,EAAE,CAAA,CAAE,WAAA,EAAY;AAC5C,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,cAAA,GAAiB,EAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,qBAAqB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAAA,EAAI;AACzE,MAAA,gBAAA,GAAmB,EAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,cAAA,IAAkB,gBAAA;AAC3B;AAEO,SAAS,aAAA,CAAc,YAAoB,KAAA,EAAiD;AACjG,EAAA,MAAM,KAAA,GAAQ,gBAAgB,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,oCAAA,EAAuC,UAAU,CAAA,EAAA,CAAA,EAAK;AAAA,EACrF;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,gBAAA,EAAmB,UAAU,CAAA,6BAAA,CAAA,EAAgC;AAAA,EAC5F;AAEA,EAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAC1C,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAAA,MACpC,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAA,CAAM,WAAA,EAAY,KAAM,QAAA,IAAY,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY,CAAE,IAAA,EAAK,KAAM;AAAA,KACrF;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAAA,QAChC,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,QAAQ,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,aAAa;AAAA,OAChG;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,wCAAA,EAA2C,KAAK,CAAA,EAAA,CAAA,EAAK;AAAA,IACpF;AAEA,IAAA,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAAA,EAChB;AAEA,EAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACzD,EAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAE1D,EAAA,MAAM,UAAA,GAAaA,cAAAA,CAAc,KAAK,CAAA,IAAK,UAAA;AAC3C,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,iBAAiB,UAAU,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAA,EAAK;AAC9E;AAEO,SAAS,UAAA,GAA+C;AAC7D,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAA+B,MAAM,CAAA;AAC3D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,sCAAA,EAAuC;AAAA,EACtE;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,aAAA;AAAA,IACrB;AAAA,GACF;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,SAAA,CAAU,KAAA,EAAM;AAChB,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,mCAAA,EAAoC;AAAA,EAClE;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,aAAA,KAAkB,UAAA,EAAY;AAC5C,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,qCAAA,EAAsC;AAAA,EACpE;AAEA,EAAA,IAAA,CAAK,MAAA,EAAO;AACZ,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,iBAAA,EAAkB;AAChD;AAOA,IAAM,yBAAA,GAA4B;AAAA,EAChC,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,kBAAA,GACJ,iGAAA;AAEF,SAAS,kBAAkB,EAAA,EAAsB;AAC/C,EAAA,OAAO,GAAG,YAAA,CAAa,wBAAwB,KAAK,EAAA,CAAG,OAAA,CAAQ,0BAA0B,CAAA,KAAM,IAAA;AACjG;AASA,SAAS,eAAe,KAAA,EAAkD;AACxE,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA;AACpB,EAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,CAAS,cAAA,CAAe,KAAK,CAAA,GAAI,KAAA,CAAM,cAAc,OAAO,CAAA;AACnF,EAAA,IAAI,kBAAkB,gBAAA,KAAqB,MAAA,CAAO,SAAS,OAAA,IAAW,MAAA,CAAO,SAAS,UAAA,CAAA,EAAa;AACjG,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAkB,EAAA,EAAqB;AAC9C,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AACzC,EAAA,IAAI,QAAQ,IAAA,CAAK,IAAA,EAAK,EAAG,OAAOF,WAAU,IAAI,CAAA;AAC9C,EAAA,IAAI,EAAA,YAAc,gBAAA,EAAkB,OAAOA,UAAAA,CAAU,EAAA,CAAG,SAAS,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,EAAE,CAAA;AAC/F,EAAA,OAAOA,UAAAA,CAAU,EAAA,CAAG,WAAA,IAAe,EAAE,CAAA;AACvC;AAUO,SAAS,cAAc,WAAA,EAA+D;AAC3F,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,WAAA,EAAY,CAAE,IAAA,EAAK;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAA8B,kBAAkB,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO;AACvG,IAAA,IAAI,iBAAA,CAAkB,EAAE,CAAA,EAAG,OAAO,KAAA;AAClC,IAAA,IAAI,EAAA,YAAc,gBAAA,EAAkB,OAAO,cAAA,CAAe,EAAE,CAAA,KAAM,IAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,IAAI,SAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,WAAA,GAAkC,IAAA;AACtC,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,EAAE,CAAA,CAAE,WAAA,EAAY;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,SAAA,GAAY,EAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI;AAClE,MAAA,WAAA,GAAc,EAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,SAAA,IAAa,WAAA;AAC3B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,iBAAA,CAAkB,KAAK,CAAA,EAAE;AACrD;AAEO,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,OAAO,0BAA0B,IAAA,CAAK,CAAC,OAAO,KAAA,CAAM,QAAA,CAAS,EAAE,CAAC,CAAA;AAClE;AAMO,SAAS,YAAA,CAAa,IAAiB,IAAA,EAAgD;AAC5F,EAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,mBAAA,EAAsB,IAAI,CAAA,8CAAA,CAAA,EAA4C;AAAA,EACrG;AACA,EAAA,EAAA,CAAG,KAAA,EAAM;AACT,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,CAAA,SAAA,EAAY,IAAI,CAAA,EAAA,CAAA,EAAK;AACnD;AAEO,SAAS,SAAS,WAAA,EAAsE;AAC7F,EAAA,MAAM,IAAA,GAAO,YAAY,IAAA,EAAK;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,0BAAA,EAA2B;AAEnE,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,IAAI,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,yBAAA,EAA4B,WAAW,CAAA,CAAA,EAAG;AAAA,EACzE;AAEA,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ;AAC/C,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,CAAA,+BAAA,EAAkC,SAAA,CAAU,MAAM,CAAA,gBAAA,CAAA,EAAmB;AAAA,EACpG;AAEA,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,SAAS,SAAA,CAAU,IAAA;AAC3E,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAoC,SAAS,CAAC,CAAA;AAEhF,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KACjB,CAAA,CAAE,YAAA,CAAa,wBAAwB,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,0BAA0B,CAAA,KAAM,IAAA;AAExF,EAAA,IAAI,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM;AAClC,IAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,KAAA;AACzB,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA;AAC1C,IAAA,IAAI,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,QAAQ,UAAA,CAAW,aAAa,GAAG,OAAO,KAAA;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,IAAI,GAAA,CAAI,EAAE,IAAA,EAAM,MAAA,CAAO,SAAS,IAAI,CAAA;AAC9C,MAAA,OAAO,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,MAAA,GAAS,EAAE,IAAA,KAAS,gBAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AACnC,IAAA,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM;AAC9B,MAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,KAAA;AACzB,MAAA,MAAM,OAAA,GAAU,CAAA,CAAE,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA;AAC1C,MAAA,IAAI,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,QAAQ,UAAA,CAAW,aAAa,GAAG,OAAO,KAAA;AACzE,MAAA,OAAA,CAAQ,CAAA,CAAE,eAAe,EAAA,EAAI,WAAA,GAAc,IAAA,EAAK,CAAE,SAAS,SAAS,CAAA;AAAA,IACtE,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,8BAAA,EAAiC,WAAW,CAAA,gBAAA,CAAA,EAAmB;AAAA,EAC9F;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,CAAA,cAAA,EAAiB,YAAY,IAAI,CAAA,MAAA,CAAA,EAAK,IAAA,EAAM,WAAA,CAAY,IAAA,EAAK;AAC3F;AAOA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,CAAA,CACJ,WAAA,EAAY,CACZ,IAAA,EAAK,CACL,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC3B;AAEA,SAAS,iBAAiB,MAAA,EAAoC;AAC5D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,EAAY,CAAE,IAAA,EAAK;AACxC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,cAAc,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAoC,cAAc,CAAC,CAAA;AAC3F,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,IAAA,MAAM,OAAOA,UAAAA,CAAU,CAAA,CAAE,WAAA,IAAe,EAAE,EAAE,WAAA,EAAY;AACxD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,KAAS,SAAS,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAClE,MAAA,MAAM,MAAM,CAAA,CAAE,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA,EAAI,MAAM,CAAC,CAAA;AACjD,MAAA,MAAM,EAAA,GAAK,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,GAAI,IAAA;AAC9C,MAAA,IAAI,IAAI,OAAO,EAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAA8B,wBAAwB,CAAC,CAAA;AAC5F,EAAA,IAAI,WAAA,GAAkC,IAAA;AACtC,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,OAAOA,UAAAA,CAAU,CAAA,CAAE,WAAA,IAAe,EAAE,EAAE,WAAA,EAAY;AACxD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,KAAS,OAAO,OAAO,CAAA;AAC3B,IAAA,IAAI,CAAC,WAAA,KAAgB,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,WAAA,GAAc,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,OAAO,QAAA,CAAS,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC/C;AAIA,SAAS,aAAa,EAAA,EAA0B;AAC9C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA,CAAE,SAAA;AAC9C,EAAA,OAAA,CAAQ,cAAc,MAAA,IAAU,SAAA,KAAc,aAAa,EAAA,CAAG,YAAA,GAAe,GAAG,YAAA,GAAe,CAAA;AACjG;AAUA,SAAS,mBAAA,GAAkC;AACzC,EAAA,MAAM,IAAA,GAAQ,QAAA,CAAS,gBAAA,IAAoB,QAAA,CAAS,eAAA;AACpD,EAAA,IAAI,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,GAAe,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,iBAA8B,GAAG,CAAC,CAAA,CAAE,MAAA,CAAO,YAAY,CAAA;AAC9F,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACpC,EAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,OAAA,EAAS,EAAA,KAAQ,GAAG,YAAA,GAAe,OAAA,CAAQ,YAAA,GAAe,EAAA,GAAK,OAAQ,CAAA;AACnG;AAEA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,OAAO,MAAA,KAAW,MAAA,GAAS,MAAA,CAAO,WAAA,GAAe,MAAA,CAAuB,YAAA;AAC1E;AAEA,SAAS,uBAAuB,MAAA,EAA4B;AAC1D,EAAA,OAAO,MAAA,KAAW,MAAA,GAAS,QAAA,CAAS,eAAA,CAAgB,eAAgB,MAAA,CAAuB,YAAA;AAC7F;AAEA,SAAS,UAAA,CAAW,QAAoB,GAAA,EAAmB;AACzD,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAA,CAAO,QAAA,CAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAAA,EAC7C,CAAA,MAAO;AACL,IAAC,OAAuB,QAAA,CAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAAA,EAC9D;AACF;AAEA,SAAS,UAAA,CAAW,QAAoB,GAAA,EAAmB;AACzD,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAA,CAAO,QAAA,CAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAAA,EAC7C,CAAA,MAAO;AACL,IAAC,OAAuB,QAAA,CAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAAA,EAC9D;AACF;AAEO,SAAS,UAAA,CAAW,WAAoB,MAAA,EAAmD;AAChG,EAAA,MAAM,YAAA,GAAA,CAAgB,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AACzC,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,EAAA,GAAK,iBAAiB,YAAY,CAAA;AACxC,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,mCAAA,EAAsC,YAAY,CAAA,eAAA,CAAA,EAAkB;AAAA,IACnG;AAIA,IAAA,EAAA,CAAG,eAAe,EAAE,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,SAAS,CAAA;AACxD,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,CAAA,aAAA,EAAgB,YAAY,CAAA,EAAA,CAAA,EAAK;AAAA,EAC/D;AAEA,EAAA,MAAM,YAAY,mBAAA,EAAoB;AACtC,EAAA,MAAM,cAAA,GAAiB,iBAAiB,SAAS,CAAA;AAEjD,EAAA,QAAA,CAAS,SAAA,IAAa,EAAA,EAAI,WAAA,EAAY;AAAG,IACvC,KAAK,KAAA;AACH,MAAA,UAAA,CAAW,WAAW,CAAC,CAAA;AACvB,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,kCAAA,EAAmC;AAAA,IACjE,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,SAAA,EAAW,sBAAA,CAAuB,SAAS,CAAC,CAAA;AACvD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,qCAAA,EAAsC;AAAA,IACpE,KAAK,IAAA;AACH,MAAA,UAAA,CAAW,WAAW,CAAC,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,IAAI,CAAC,CAAA;AACxD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,cAAA,EAAe;AAAA,IAC7C,KAAK,MAAA;AACH,MAAA,UAAA,CAAW,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,IAAI,CAAC,CAAA;AACvD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,gBAAA,EAAiB;AAAA,IAC/C;AACE,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA,uCAAA,CAAA,EAA0C;AAAA;AAE7E;;;ACxaO,SAAS,WAAW,KAAA,EAA2B;AACpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC/B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AACvB,IAAA,GAAA,IAAO,GAAA,GAAM,GAAA;AAAA,EACf;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,KAAA,CAAM,MAAM,CAAA;AACrC;AAEA,eAAsB,eAAA,CACpB,cACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa;AAAA,IACvD,KAAA,EAAO;AAAA,MACL,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,gBAAA,EAAkB,IAAA;AAAA,MAClB,gBAAA,EAAkB;AAAA;AACpB,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,uBAAA,CAAwB,MAAM,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,qBAAA,CAAsB,IAAA,EAAM,GAAG,CAAC,CAAA;AAE/D,EAAA,SAAA,CAAU,cAAA,GAAiB,CAAC,CAAA,KAAM;AAChC,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,cAAA,CAAe,CAAC,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAC5C,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAS,CAAA,GAAI,KAAA;AAAA,IACtC;AACA,IAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA;AAC5B,IAAA,OAAA,CAAQ,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAA,CAAO,QAAQ,SAAS,CAAA;AACxB,EAAA,SAAA,CAAU,OAAA,CAAQ,aAAa,WAAW,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,MAAM,MAAM;AACV,MAAA,SAAA,CAAU,UAAA,EAAW;AACrB,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAA,CAAO,WAAU,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AAAA,IAC5C;AAAA,GACF;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EAKrB,YAAY,GAAA,EAAmB;AAH/B,IAAA,IAAA,CAAQ,aAAA,GAAgB,CAAA;AACxB,IAAA,IAAA,CAAQ,iBAA0C,EAAC;AAGjD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAEO,WAAW,WAAA,EAA2B;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,WAAW,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,KAAA,CAAM,QAAQ,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AACnF,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAA;AAC/C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,OAAA,CAAQ,CAAC,IAAI,OAAA,CAAQ,CAAC,KAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,GAAS,KAAA,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,EAAG,OAAA,CAAQ,QAAQ,IAAM,CAAA;AAC9D,IAAA,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA;AAEpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAmB;AAC3C,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AAEnC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,WAAA;AACrB,IAAA,IAAI,IAAA,CAAK,gBAAgB,GAAA,EAAK;AAC5B,MAAA,IAAA,CAAK,aAAA,GAAgB,GAAA;AAAA,IACvB;AAEA,IAAA,MAAA,CAAO,KAAA,CAAM,KAAK,aAAa,CAAA;AAC/B,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,QAAA;AAC7B,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,MAAM,CAAA;AAE/B,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA;AAC9C,MAAA,IAAI,QAAQ,EAAA,EAAI,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACnD,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,SAAA,GAAqB;AAC1B,IAAA,OAAO,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAAA,EACtC;AAAA,EAEO,KAAA,GAAc;AACnB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,cAAA,EAAgB;AACrC,MAAA,IAAI;AACF,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACX,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,EACvB;AACF,CAAA;;;ACrHA,IAAM,kBAAA,GAAqB,sBAAA;AAC3B,IAAM,yBAAyB,EAAA,GAAK,GAAA;AAS7B,SAAS,cAAA,CAAe,SAAA,EAAmB,SAAA,EAAmB,KAAA,EAAqB;AACxF,EAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,EAAA,MAAM,OAAA,GAA4B;AAAA,IAChC,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,EAAA,EAAI,KAAK,GAAA;AAAI,GACf;AACA,EAAA,IAAI;AACF,IAAA,cAAA,CAAe,QAAQ,kBAAA,GAAqB,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAChF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,qBAAqB,SAAA,EAA4C;AAC/E,EAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,IAAA;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,kBAAA,GAAqB,SAAS,CAAA;AACjE,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,SAAA,IAAa,CAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,sBAAA,EAAwB;AAC5C,MAAA,qBAAA,CAAsB,SAAS,CAAA;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,sBAAsB,SAAA,EAAyB;AAC7D,EAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,EAAA,IAAI;AACF,IAAA,cAAA,CAAe,UAAA,CAAW,qBAAqB,SAAS,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAkBA,IAAM,qBAAA,GAAwB,wBAAA;AAE9B,IAAM,uBAAuB,EAAA,GAAK,IAAA;AAWlC,SAAS,aAAA,CAAc,WAAmB,cAAA,EAAgC;AACxE,EAAA,OAAO,CAAA,EAAG,qBAAqB,CAAA,EAAG,SAAS,IAAI,cAAc,CAAA,CAAA;AAC/D;AAEO,SAAS,iBAAA,CACd,SAAA,EACA,cAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,EAAA,IAAI,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAwB,CAAA;AACnD,EAAA,IAAI;AACF,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAG9B,IAAA,OAAO,GAAA,CAAI,MAAA,GAAS,oBAAA,IAAwB,KAAA,CAAM,SAAS,CAAA,EAAG;AAC5D,MAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AACrB,MAAA,GAAA,GAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IAC5B;AACA,IAAA,cAAA,CAAe,OAAA,CAAQ,aAAA,CAAc,SAAA,EAAW,cAAc,GAAG,GAAG,CAAA;AAAA,EACtE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,cAAA,CAAe,WAAmB,cAAA,EAA4C;AAC5F,EAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,EAAC;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,cAAA,CAAe,OAAA,CAAQ,aAAA,CAAc,SAAA,EAAW,cAAc,CAAC,CAAA;AAC3E,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,SAAU,EAAC;AACpC,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,MACZ,CAAC,CAAA,KACC,CAAC,CAAC,CAAA,IACF,OAAO,MAAM,QAAA,IACb,OAAQ,EAAuB,IAAA,KAAS,QAAA,IACxC,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAU,EAAuB,IAAI;AAAA,KACrE;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,eAAA,CAAgB,WAAmB,cAAA,EAA8B;AAC/E,EAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AAC3C,EAAA,IAAI;AACF,IAAA,cAAA,CAAe,UAAA,CAAW,aAAA,CAAc,SAAA,EAAW,cAAc,CAAC,CAAA;AAAA,EACpE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;AC/GA,IAAM,gBAAA,GAAmB,mBAAA;AA2BzB,IAAM,aAAA,GAAwC;AAAA,EAC5C,WAAA,EAAa,QAAA;AAAA,EACb,cAAA,EAAgB,iBAAA;AAAA,EAChB,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,SAAA;AAAA,EACd,aAAA,EAAe,gBAAA;AAAA,EACf,SAAA,EAAW,MAAA;AAAA,EACX,UAAA,EAAY,OAAA;AAAA,EACZ,WAAA,EAAa,QAAA;AAAA,EACb,UAAA,EAAY;AACd,CAAA;AAMA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAEA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAMD,IAAM,kBAAA,GAAqB,mCAAA;AAK3B,SAAS,cAAc,GAAA,EAA4B;AACjD,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,GAAA;AACjC,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAG,CAAA,IAAK,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAAA;AACrF,EAAA,OAAO,aAAa,GAAA,CAAI,IAAI,CAAA,GAAI,CAAA,aAAA,EAAgB,IAAI,CAAA,CAAA,GAAK,IAAA;AAC3D;AAmBO,SAAS,gBAAA,CACd,IACA,KAAA,EACM;AACN,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,MAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACrB,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK;AAC/B,IAAA,IAAI,CAAC,KAAA,IAAS,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC9C,IAAA,MAAM,QAAA,GAAW,cAAc,GAAG,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,UAAU,KAAK,CAAA;AAAA,EACpD;AACF;AAEA,IAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;AA21DP,SAAS,iBAAA,GAA0B;AACxC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,gBAAgB,CAAA,EAAG;AAC/C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,gBAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,KAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;;;ACz7DO,IAAM,oBAAA,GAAuB,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;;;ACrDpC,IAAM,WAAA,GAA+C;AAAA,EACnD,IAAA,EAAM,gBAAA;AAAA,EACN,UAAA,EAAY,kBAAA;AAAA,EACZ,SAAA,EAAW,iBAAA;AAAA,EACX,QAAA,EAAU,gBAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,UAAA,CACd,QAAA,EACA,IAAA,EACA,WAAA,EACA,qBACA,aAAA,EAC2C;AAC3C,EAAA,iBAAA,EAAkB;AAElB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC5C,EAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,EAAA,IAAA,CAAK,SAAA,GAAY,iEAAiE,QAAQ,CAAA,CAAA;AAC1F,EAAA,IAAA,CAAK,YAAA,CAAa,cAAc,6CAA6C,CAAA;AAI7E,EAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,IAAA;AACzB,EAAA,IAAI,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,uBAAuB,WAAW,CAAA;AAC1E,EAAA,IAAI,mBAAA,EAAqB,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,wBAAwB,mBAAmB,CAAA;AAC3F,EAAA,IAAI,aAAA,EAAe,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,0BAA0B,aAAa,CAAA;AAEjF,EAAA,MAAMG,KAAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAAA,MAAK,SAAA,GAAY,wBAAA;AACjB,EAAAA,MAAK,SAAA,GAAY,oBAAA;AACjB,EAAA,IAAA,CAAK,YAAYA,KAAI,CAAA;AAErB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,EAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,EAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAKpB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,EAAA,KAAA,CAAM,SAAA,GAAY,0DAAA;AAClB,EAAA,KAAA,CAAM,cAAc,WAAA,CAAY,IAAA;AAChC,EAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAEtB,EAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AACvB;AAEO,SAAS,WAAA,CACd,IAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAA,CAAK,SAAA,GAAY,CAAA,mCAAA,EAAsC,MAAM,CAAA,uBAAA,EAA0B,QAAQ,CAAA,CAAA;AAC/F,EAAA,IAAA,CAAK,KAAA,GAAQ,YAAY,MAAM,CAAA;AAC/B,EAAA,KAAA,CAAM,WAAA,GAAc,YAAY,MAAM,CAAA;AACxC;AAQO,SAAS,YAAA,CAAa,MAAmB,GAAA,EAAsC;AACpF,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAA2B,yBAAyB,CAAA;AACtE,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAA,CAAK,SAAA,GAAY,oBAAA;AACjB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,EAAA,GAAA,CAAI,GAAA,GAAM,EAAA;AACV,EAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,EAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAAE,IAAA,IAAA,CAAK,SAAA,GAAY,oBAAA;AAAA,EAAsB,CAAC,CAAA;AAC9E,EAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACV,EAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,EAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AACtB;;;AC9DA,SAAS,QAAQ,IAAA,EAAsB;AACrC,EAAA,OAAO,0KAA0K,IAAI,CAAA,MAAA,CAAA;AACvL;AAKA,IAAM,UAAA,GAA2C;AAAA,EAC/C,KAAA,EAAO,OAAA;AAAA,IACL,CAAA,+JAAA;AAAA,GACF;AAAA,EACA,IAAA,EAAM,OAAA;AAAA,IACJ,CAAA,yMAAA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,OAAA;AAAA,IACP,CAAA,qLAAA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,QAAQ,CAAA,2EAAA,CAA6E,CAAA;AAAA,EAC9F,MAAA,EAAQ,QAAQ,CAAA,2EAAA,CAA6E,CAAA;AAAA,EAC7F,IAAA,EAAM,QAAQ,CAAA,yGAAA,CAA2G;AAC3H,CAAA;AAEA,IAAM,gBAAgB,UAAA,CAAW,KAAA;AACjC,IAAM,QAAA,GAAW,QAAQ,CAAA,yFAAA,CAA2F,CAAA;AACpH,IAAM,SAAA,GAAY,OAAA;AAAA,EAChB,CAAA,gHAAA;AACF,CAAA;AAGA,IAAM,QAAA,GAAW,qBAAA;AACjB,IAAM,QAAA,GAAW,mCAAA;AAEjB,SAAS,MAAM,KAAA,EAA+B;AAC5C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AACpD;AAIA,SAAS,WAAW,IAAA,EAAkC;AACpD,EAAA,MAAM,GAAA,GAAM,MAAM,IAAI,CAAA;AACtB,EAAA,OAAO,CAAC,GAAA,IAAO,GAAA,KAAQ,MAAA,GAAS,MAAA,GAAY,GAAA;AAC9C;AAEA,SAAS,aAAa,GAAA,EAA0B;AAK9C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,GAAG,IAC5B,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,GAAG,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAI,CAAA,EAAG,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA,GACvF,IAAI,KAAK,GAAG,CAAA;AAChB,EAAA,OAAO,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,IAAI,IAAA,GAAO,MAAA;AACjD;AAcO,SAAS,cAAA,CAAe,GAAA,EAAa,IAAA,EAAc,QAAA,EAA2B;AACnF,EAAA,MAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACrB,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,IAAA,MAAM,UAAsC,EAAE,IAAA,EAAM,WAAW,KAAA,EAAO,OAAA,EAAS,KAAK,SAAA,EAAU;AAC9F,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,IAAA,GAAO,SAAA;AACf,MAAA,OAAA,CAAQ,MAAA,GAAS,SAAA;AAAA,IACnB;AACA,IAAA,OAAO,IAAI,KAAK,cAAA,CAAe,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAAA,EACzE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,SAAS,cAAA,CAAe,KAAa,IAAA,EAAsB;AACzD,EAAA,MAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACrB,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EACxG,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAA,CAAc,MAAgB,IAAA,EAAsB;AAC3D,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AACpD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAI,IAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AACrD,EAAA,IAAI,CAAC,KAAK,OAAO,SAAA;AAEjB,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,SAAA,EAAW,OAAO,SAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,eAAe,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA,KAAM,cAAA,CAAe,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AACtF,EAAA,IAAI,OAAA,EAAS;AAGX,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,EAAG,SAAS,CAAA,QAAA,EAAM,cAAA,CAAe,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,GAAK,SAAA;AAAA,EAC9E;AACA,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,QAAA,EAAM,OAAO,CAAA,CAAA;AAClC;AASA,SAAS,QAAQ,KAAA,EAAsC;AACrD,EAAA,MAAM,GAAA,GAAM,MAAM,KAAK,CAAA;AACvB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,IAAI,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,SAAS,IAAI,CAAA;AAClD,IAAA,IAAI,SAAS,QAAA,KAAa,OAAA,IAAW,QAAA,CAAS,QAAA,KAAa,UAAU,OAAO,IAAA;AAE5E,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,IAAA,EAAuB;AACzC,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAI,IAAA,EAAM,MAAA,CAAO,SAAS,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,QAAA,CAAS,MAAA;AAAA,EACxE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,SAAS,WAAA,CAAY,MAAA,EAAgB,SAAA,EAAmB,IAAA,EAA4B;AAClF,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,IAAA,IAAA,CAAK,YAAA,CAAa,cAAc,IAAI,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,YAAA,CAAa,eAAe,MAAM,CAAA;AAAA,EACzC;AACA,EAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CAAU,MAAA,EAAgB,IAAA,EAAc,IAAA,EAAc,QAAA,EAA+B;AAC5F,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,SAAA,GAAY,wBAAwB,QAAQ,CAAA,CAAA;AAChD,EAAA,GAAA,CAAI,WAAA,CAAY,WAAA,CAAY,MAAA,EAAQ,2BAAA,EAA6B,IAAI,CAAC,CAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,EAAA,KAAA,CAAM,SAAA,GAAY,2BAAA;AAClB,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,EAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CAAW,IAAA,EAAc,IAAA,EAAc,MAAA,EAAgB,QAAA,EAAqC;AACnG,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,SAAA,GAAY,2BAA2B,QAAQ,CAAA,CAAA;AACpD,EAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAEZ,EAAA,IAAA,CAAK,GAAA,GAAM,qBAAA;AAIX,EAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,QAAA;AACpC,EAAA,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,MAAA,EAAQ,8BAA8B,CAAC,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,EAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,SAAA,CAAU,MAAoB,OAAA,EAA8B;AACnE,EAAA,OAAO,SAAS,SAAA,IAAa,IAAA,KAAS,MAAA,GAAS,OAAA,CAAQ,WAAW,OAAA,CAAQ,QAAA;AAC5E;AAEO,SAAS,SAAA,CAAU,IAAA,EAAgB,OAAA,EAAsB,IAAA,EAA2B;AACzF,EAAA,MAAM,OAAqB,IAAA,IAAQ,UAAA,CAAW,KAAK,IAAI,CAAA,GAAI,KAAK,IAAA,GAAO,MAAA;AACvE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,SAAS,CAAA;AAChD,EAAA,OAAA,CAAQ,SAAA,GAAY,oCAAoC,IAAI,CAAA,CAAA;AAE5D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACnC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,GAAY,wBAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,MAAA;AAEd,IAAA,GAAA,CAAI,GAAA,GAAM,EAAA;AAGV,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,MAAM,GAAA,CAAI,QAAQ,CAAA;AAChD,IAAA,GAAA,CAAI,GAAA,GAAM,KAAA;AACV,IAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,uBAAA;AAEjB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,uBAAA;AACjB,EAAA,IAAA,CAAK,YAAY,WAAA,CAAY,UAAA,CAAW,IAAI,CAAA,EAAG,uBAAuB,CAAC,CAAA;AACvE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,SAAA,GAAY,wBAAA;AAIlB,EAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,SAAS,CAAA;AACpC,EAAA,KAAA,CAAM,YAAA,CAAa,cAAc,GAAG,CAAA;AACpC,EAAA,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AACpC,EAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAErB,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AACrC,EAAA,IAAI,IAAA,OAAW,WAAA,CAAY,SAAA,CAAU,eAAe,OAAA,CAAQ,SAAA,EAAW,IAAA,EAAM,4BAA4B,CAAC,CAAA;AAI1G,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,QAAK,CAAA;AACxF,EAAA,IAAI,KAAA,OAAY,WAAA,CAAY,SAAA,CAAU,UAAU,OAAA,CAAQ,aAAA,EAAe,KAAA,EAAO,6BAA6B,CAAC,CAAA;AAE5G,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAClC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC5C,IAAA,SAAA,CAAU,SAAA,GAAY,0BAAA;AACtB,IAAA,SAAA,CAAU,WAAA,GAAc,OAAA;AACxB,IAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,OAAO,EAAC;AACrD,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,uBAAA;AACjB,IAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AACpC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAC9B,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACxC,MAAA,IAAA,CAAK,SAAA,GAAY,6BAAA;AACjB,MAAA,IAAA,CAAK,WAAA,GAAc,SAAA;AACnB,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AAC9C,MAAA,UAAA,CAAW,SAAA,GAAY,6BAAA;AACvB,MAAA,UAAA,CAAW,WAAA,GAAc,SAAA;AACzB,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,IAAA,CAAK,iBAAA,EAAmB,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,0BAAA;AACpB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAC7B,EAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,WAAA,CAAY,UAAA,CAAW,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,EAAG,SAAA,EAAW,+BAA+B,CAAC,CAAA;AACpH,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAClC,EAAA,IAAI,MAAA,UAAgB,WAAA,CAAY,UAAA,CAAW,QAAQ,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,8BAA8B,CAAC,CAAA;AAC/G,EAAA,IAAI,OAAA,CAAQ,iBAAA,EAAmB,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAEvD,EAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AACxB,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,UAAA,CAAW,KAAA,EAAmB,OAAA,EAAsB,IAAA,EAAkC;AACpG,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,KAAK,KAAK,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AAExD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,kBAAA;AACjB,EAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,MAAM,CAAA;AAChC,EAAA,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AAElD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAGxB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACjC,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AAC7C,IAAA,OAAA,CAAQ,YAAA,CAAa,QAAQ,UAAU,CAAA;AACvC,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,IAAA,CAAK,oBAAoB,IAAA,GAAO,IAAA;AACzC;;;AClTA,IAAM,MAAA,GAAS,uBAAA;AACf,IAAM,QAAA,GAAW,yBAAA;AACjB,IAAM,OAAA,GAAU,iBAAA;AAChB,IAAM,KAAA,GAAQ,YAAA;AACd,IAAM,IAAA,GAAO,gCAAA;AACb,IAAM,SAAA,GAAY,kBAAA;AAClB,IAAM,SAAA,GAAY,qDAAA;AAMlB,IAAM,MAAA,GACJ,kIAAA;AAGF,IAAM,MAAA,GAAS,2CAAA;AACf,IAAM,KAAA,GAAQ,qDAAA;AAId,IAAM,KAAA,GAAQ,0BAAA;AAGd,IAAM,UAAA,GAAa,2FAAA;AAGnB,IAAM,SAAA,GAAY,0CAAA;AAClB,IAAM,gBAAA,GAAmB,CAAA;AAEzB,SAAS,QAAA,GAAmB;AAC1B,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,WAAA,EAAY;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAWO,SAAS,SAAS,GAAA,EAA4B;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,EAAK;AACvB,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,KAAM,OAAO,IAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAK,CAAA;AACzB,MAAA,MAAM,OAAO,QAAA,EAAS;AACtB,MAAA,OAAO,QAAQ,GAAA,CAAI,IAAA,CAAK,aAAY,KAAM,IAAA,GAAO,IAAI,IAAA,GAAO,IAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,MAAA,CAAO,IAAA,EAAc,IAAA,EAAc,IAAA,EAAoD;AAC9F,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,SAAA,GAAY,4CAA4C,IAAI,CAAA,CAAA;AAC9D,EAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,EAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAIhB,EAAA,CAAA,CAAE,GAAA,GAAM,UAAA;AACR,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,QAAQ,IAAA,EAAsB;AACrC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACxC,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,MAAM,CAAA,CAAA;AAC/D;AAGA,SAAS,OAAA,CAAQ,QAAqB,IAAA,EAAoB;AAExD,EAAA,MAAM,OAAc,EAAC;AACrB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAc,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,GAAA,IAAO,CAAA,GAAI,EAAE,KAAK,CAAA;AAEjF,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,IAAA,IAAI,IAAA,IAAQ,CAAC,KAAA,CAAM,CAAA,CAAE,KAAA,EAAQ,CAAA,CAAE,KAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA,EAAG;AACpD,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,OAAQ,GAAA,EAAK,CAAA,CAAE,QAAS,CAAA,CAAE,CAAC,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,CAAC,GAAG,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,IAC9F;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,KAAA,CAAM,CAAA,CAAE,KAAA,EAAQ,CAAA,CAAE,QAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAQ,KAAK,CAAA,CAAE,KAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,EAAQ,MAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,OAAA,EAAU,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,CAAA;AAAA,IAC5G;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,IAAA,MAAM,aAAa,CAAA,CAAE,CAAC,EAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,MAAA;AAC3C,IAAA,IAAI,aAAa,gBAAA,EAAkB;AACnC,IAAA,IAAI,CAAC,KAAA,CAAM,CAAA,CAAE,KAAA,EAAQ,CAAA,CAAE,QAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAQ,KAAK,CAAA,CAAE,KAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,EAAQ,MAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA;AAAA,IACtG;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AACzC,IAAA,MAAM,MAAA,GAAS,EAAE,CAAC,CAAA;AAClB,IAAA,MAAM,QAAQ,CAAA,CAAE,KAAA,GAAS,EAAE,CAAC,CAAA,CAAE,YAAY,MAAM,CAAA;AAChD,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,QAAQ,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA;AAAA,IAC/F;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAExC,IAAA,MAAM,OAAO,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,eAAe,EAAE,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAC9B,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACrC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAC7F,IAAA,MAAA,CAAO,WAAA,CAAY,EAAE,IAAI,CAAA;AACzB,IAAA,MAAA,GAAS,CAAA,CAAE,GAAA;AAAA,EACb;AACA,EAAA,IAAI,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAC1F;AAGO,SAAS,MAAA,CAAO,QAAqB,IAAA,EAAoB;AAC9D,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,IAAA,IAAI,KAAA,GAAQ,QAAQ,OAAA,CAAQ,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAA;AAE7D,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG;AACR,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,SAAA,GAAY,qBAAA;AACjB,MAAA,IAAA,CAAK,cAAc,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACnC,MAAA,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,CAAA,CAAE,CAAC,CAAA,EAAG;AAGf,MAAA,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,MAAA,CAAO,WAAA,CAAY,SAAS,cAAA,CAAe,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAAA,IAC5D,CAAA,MAAA,IAAW,CAAA,CAAE,CAAC,CAAA,EAAG;AACf,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,MAAA,IAAI,IAAA,SAAa,WAAA,CAAY,MAAA,CAAO,EAAE,CAAC,CAAA,EAAG,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,WAClD,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,CAAA,CAAE,CAAC,CAAA,EAAG;AACf,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AACnB,MAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,CAAA,CAAE,EAAE,CAAA,EAAG;AAChB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,MAAA,MAAA,CAAO,EAAA,EAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAChB,MAAA,MAAA,CAAO,YAAY,EAAE,CAAA;AAAA,IACvB;AACA,IAAA,MAAA,GAAS,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAAA,EACxB;AACA,EAAA,IAAI,MAAA,GAAS,KAAK,MAAA,EAAQ,OAAA,CAAQ,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9D;AAOA,SAAS,WAAW,GAAA,EAAuB;AACzC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,EAAK,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC7D,EAAA,OAAO,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAC7C;AAGO,SAAS,cAAA,CAAe,MAAmB,IAAA,EAA2B;AAC3E,EAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,IAAI,CAAA,CAAE,MAAM,IAAI,CAAA;AACrD,EAAA,IAAI,YAAsB,EAAC;AAC3B,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAI,KAAA,GAAiC,IAAA;AAErC,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACvB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,SAAA,GAAY,kBAAA;AACd,IAAA,MAAA,CAAO,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AAC7B,IAAA,CAAC,KAAA,IAAS,IAAA,EAAM,WAAA,CAAY,CAAC,CAAA;AAC7B,IAAA,SAAA,GAAY,EAAC;AAAA,EACf,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,QAAA,GAAW,EAAA,KAAO;AACpC,IAAA,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA,GAAS,QAAA,EAAU,KAAA,CAAM,GAAA,EAAI;AAAA,EAC9E,CAAA;AACA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,cAAA,EAAe;AACf,IAAA,KAAA,GAAQ,IAAA;AAAA,EACV,CAAA;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAEnC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,cAAA,EAAe;AACf,MAAA,UAAA,EAAW;AACX,MAAA,UAAA,EAAW;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACnB,MAAA,cAAA,EAAe;AACf,MAAA,UAAA,EAAW;AACX,MAAA,UAAA,EAAW;AACX,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,MAAA,EAAA,CAAG,SAAA,GAAY,mBAAA;AACf,MAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AAChF,MAAA,cAAA,EAAe;AACf,MAAA,UAAA,EAAW;AACX,MAAA,UAAA,EAAW;AACX,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,SAAA,GAAY,2BAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,KAAA,CAAM,SAAA,GAAY,sBAAA;AAClB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AAC3C,MAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACnC,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,QAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,QAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AAAA,MACxB;AACA,MAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AACzB,MAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,OAAO,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,SAAA,CAAU,KAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AAC3D,QAAA,CAAA,IAAK,CAAA;AACL,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,QAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AACvC,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,UAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,UAAA,EAAA,CAAG,YAAY,EAAE,CAAA;AAAA,QACnB;AACA,QAAA,KAAA,CAAM,YAAY,EAAE,CAAA;AAAA,MACtB;AACA,MAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACzB,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,cAAA,EAAe;AACf,QAAA,UAAA,EAAW;AACX,QAAA,KAAA,GAAQ,QAAA,CAAS,cAAc,YAAY,CAAA;AAC3C,QAAA,KAAA,CAAM,SAAA,GAAY,sBAAA;AAClB,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxB;AACA,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AAC1B,MAAA;AAAA,IACF,WAAW,KAAA,EAAO;AAChB,MAAA,UAAA,EAAW;AAAA,IACb;AAEA,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,cAAA,EAAe;AACf,MAAA,UAAA,EAAW;AACX,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACrC,MAAA,EAAA,CAAG,SAAA,GAAY,kBAAA;AACf,MAAA,MAAA,CAAO,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AACtB,MAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,IAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AACpD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,cAAA,EAAe;AACf,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA;AACvB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,UAAA,CAAW,MAAM,CAAA;AACjB,MAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAClC,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,MAAA,EAAQ;AACnC,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,OAAA,GAAU,OAAO,IAAI,CAAA;AACvD,QAAA,EAAA,CAAG,SAAA,GAAY,qBAAA;AACf,QAAA,MAAM,UAAA,GAAa,OAAO,EAAA,CAAG,gBAAA;AAC7B,QAAA,CAAC,UAAA,IAAc,IAAA,EAAM,WAAA,CAAY,EAAE,CAAA;AACnC,QAAA,KAAA,GAAQ,EAAE,IAAI,MAAA,EAAO;AACrB,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,MAClB;AACA,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,MAAA,MAAA,CAAO,EAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA;AAClB,MAAA,KAAA,CAAM,EAAA,CAAG,YAAY,EAAE,CAAA;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvC,MAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,EAAE,EAAA,CAAG,gBAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,GAAG,CAAC,CAAA;AAC7C,QAAA,MAAA,CAAO,IAAA,EAAqB,IAAA,CAAK,IAAA,EAAM,CAAA;AACvC,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,UAAA,EAAW;AACX,IAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,EAC5B;AACA,EAAA,cAAA,EAAe;AACf,EAAA,OAAO,IAAA;AACT;;;ACjRA,IAAM,IAAA,GAAO;AAAA,EACX,GAAA,EAAK,CAAA,gRAAA,CAAA;AAAA,EACL,KAAA,EAAO,CAAA,6MAAA,CAAA;AAAA,EACP,OAAA,EAAS,CAAA,8PAAA,CAAA;AAAA,EACT,IAAA,EAAM,CAAA,8KAAA,CAAA;AAAA,EACN,MAAA,EAAQ,CAAA,+MAAA,CAAA;AAAA,EACR,KAAA,EAAO,CAAA,mPAAA,CAAA;AAAA,EACP,IAAA,EAAM,CAAA,sVAAA,CAAA;AAAA,EACN,QAAA,EAAU,CAAA,uNAAA,CAAA;AAAA,EACV,IAAA,EAAM,CAAA,sOAAA,CAAA;AAAA,EACN,MAAA,EAAQ,CAAA,iRAAA,CAAA;AAAA,EACR,KAAA,EAAO,CAAA,gMAAA,CAAA;AAAA,EACP,OAAA,EAAS,CAAA,yJAAA,CAAA;AAAA,EACT,IAAA,EAAM,CAAA,uOAAA,CAAA;AAAA,EACN,GAAA,EAAK,CAAA,iOAAA;AACP,CAAA;AASA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,GAAA,EAAI;AAAA,EAC9B,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,EAC1B,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,GAAA,EAAI;AAAA,EAC5B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,EAC3B,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,GAAA,EAAI;AAAA,EACzB,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,GAAA;AACzB,CAAA;AAEA,SAAS,IAAA,CAAK,QAAgB,SAAA,EAAoC;AAChE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,EAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CAAW,MAAA,EAAgB,KAAA,EAAe,GAAA,EAAa,OAAA,EAAyC;AACvG,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,EAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,EAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,EAAA,GAAA,CAAI,YAAA,CAAa,cAAc,KAAK,CAAA;AACpC,EAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,IAAI,OAAA,EAAS,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,gBAAgB,OAAA,EAAgD;AAC9E,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA,EAAAC,YAAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,iBAAiB,IAAA,KAAS,MAAA;AAEhC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,EAAA,UAAA,CAAW,SAAA,GAAY,sEAAA;AACvB,EAAA,UAAA,CAAW,GAAA,GAAM,SAAA;AACjB,EAAA,UAAA,CAAW,IAAA,GAAO,IAAA;AAClB,EAAA,UAAA,CAAW,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACxC,EAAA,UAAA,CAAW,YAAA,CAAa,cAAc,KAAK,CAAA;AAG3C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,mBAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,EAAA,UAAA,CAAW,SAAA,GAAY,yBAAA;AAKvB,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACpD,EAAA,cAAA,CAAe,SAAA,GAAY,8BAAA;AAC3B,EAAA,UAAA,CAAW,YAAY,cAAc,CAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAmC;AACxD,IAAA,cAAA,CAAe,WAAA,GAAc,EAAA;AAC7B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,SAAA,GAAY,yBAAA;AACjB,MAAA,IAAA,CAAK,GAAA,GAAM,EAAA;AAIX,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAC,CAAA;AACxD,MAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,MAAA,cAAA,CAAe,YAAY,IAAI,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,WAAA,CAAY,IAAA,CAAK,oBAAA,EAAsB,yBAAyB,CAAC,CAAA;AAAA,IAClF;AAAA,EACF,CAAA;AACA,EAAA,aAAA,CAAc,OAAO,CAAA;AAErB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,EAAA,OAAA,CAAQ,SAAA,GAAY,0BAAA;AACpB,EAAA,OAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,EAAA,UAAA,CAAW,YAAY,OAAO,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,EAAA,QAAA,CAAS,SAAA,GAAY,2BAAA;AACrB,EAAA,UAAA,CAAW,YAAY,QAAQ,CAAA;AAE/B,EAAA,MAAA,CAAO,YAAY,UAAU,CAAA;AAE7B,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,EAAA,WAAA,CAAY,SAAA,GAAY,0BAAA;AAIxB,EAAA,MAAM,SAAS,UAAA,CAAW,IAAA,CAAK,KAAK,OAAA,CAAQ,UAAA,EAAY,sDAAsD,UAAU,CAAA;AACxH,EAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAEhB,EAAA,WAAA,CAAY,WAAA;AAAA,IACV,WAAW,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,eAAA,EAAiB,0BAA0B,iBAAiB;AAAA,GAC5F;AACA,EAAA,WAAA,CAAY,WAAA,CAAY,WAAW,IAAA,CAAK,KAAA,EAAO,QAAQ,KAAA,EAAO,wBAAA,EAA0B,YAAY,CAAC,CAAA;AACrG,EAAA,MAAA,CAAO,YAAY,WAAW,CAAA;AAC9B,EAAA,UAAA,CAAW,YAAY,MAAM,CAAA;AAG7B,EAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtD,EAAA,iBAAA,CAAkB,SAAA,GAAY,qBAAA;AAC9B,EAAA,iBAAA,CAAkB,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC5C,EAAA,iBAAA,CAAkB,YAAA,CAAa,aAAa,QAAQ,CAAA;AAEpD,EAAA,IAAI,OAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,aAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,aAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,QAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,UAAA,GAAiC,IAAA;AAErC,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAmC;AACvD,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,aAAA,CAAc,WAAA,GAAc,EAAA;AAC5B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,SAAA,GAAY,+CAAA;AAChB,MAAA,GAAA,CAAI,GAAA,GAAM,EAAA;AACV,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAC,CAAA;AACtD,MAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACV,MAAA,aAAA,CAAc,YAAY,GAAG,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,WAAA,CAAY,IAAA,CAAK,oBAAA,EAAsB,wBAAwB,CAAC,CAAA;AAAA,IAChF;AAAA,EACF,CAAA;AAEA,EAAA,SAAS,cAAc,OAAA,EAAyB;AAC9C,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,UAAA,CAAW,WAAA,GAAc,EAAA;AACzB,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,CAAA,KAAM;AAC7B,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,GAAI,WAAA,CAAY,MAAM,CAAA;AAChD,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC5C,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA,+CAAA,EAAkD,KAAA,CAAM,IAAI,CAAA,CAAA;AAC7E,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK,IAAA,CAAK,MAAM,IAAI,CAAA,EAAG,8BAA8B,CAAC,CAAA;AACvE,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,MAAA,KAAA,CAAM,WAAA,GAAc,MAAA;AACpB,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,MAAM,CAAC,CAAA;AACvD,MAAA,UAAA,CAAY,YAAY,IAAI,CAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,MAAA,GAAS,QAAQ,MAAA,KAAW,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,CAAM,YAAY,KAAA,EAAO;AAC3B,IAAA,OAAA,GAAU,QAAA,CAAS,cAAc,KAAK,CAAA;AACtC,IAAA,OAAA,CAAQ,SAAA,GAAY,kBAAA;AAEpB,IAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,SAAA,KAAc,OAAA,EAAS;AACjD,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,KAAA,CAAM,SAAA,GAAY,yBAAA;AAClB,MAAA,KAAA,CAAM,MAAM,KAAA,CAAM,QAAA;AAClB,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,MAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,MAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,MAAA,KAAA,CAAM,gBAAA,CAAiB,OAAA,EAAS,MAAM,KAAA,CAAM,QAAQ,CAAA;AACpD,MAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,cAAc,OAAA,EAAS;AACxD,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,SAAA,GAAY,yBAAA;AAChB,MAAA,GAAA,CAAI,MAAM,KAAA,CAAM,QAAA;AAChB,MAAA,GAAA,CAAI,GAAA,GAAM,EAAA;AACV,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,MAAM,GAAA,CAAI,QAAQ,CAAA;AAChD,MAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,QAAA,CAAS,cAAc,MAAM,CAAA;AAC7C,MAAA,aAAA,CAAc,SAAA,GAAY,6BAAA;AAC1B,MAAA,aAAA,CAAc,WAAA,CAAY,IAAA,CAAK,oBAAA,EAAsB,wBAAwB,CAAC,CAAA;AAC9E,MAAA,OAAA,CAAQ,YAAY,aAAa,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC3C,IAAA,QAAA,CAAS,SAAA,GAAY,4BAAA;AACrB,IAAA,QAAA,CAAS,cAAc,OAAA,CAAQ,aAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAE5B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC3C,IAAA,QAAA,CAAS,SAAA,GAAY,4BAAA;AACrB,IAAA,QAAA,CAAS,WAAA,GAAc,KAAA,CAAM,QAAA,IAAY,OAAA,CAAQ,oBAAA;AACjD,IAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAE5B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACtC,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,OAAA,CAAQ,uBAAA;AAC/C,IAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAEvB,IAAA,UAAA,GAAa,QAAA,CAAS,cAAc,KAAK,CAAA;AACzC,IAAA,UAAA,CAAW,SAAA,GAAY,2BAAA;AACvB,IAAA,UAAA,CAAW,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,gBAAgB,CAAA;AAC9D,IAAA,aAAA,CAAc,KAAA,CAAM,gBAAA,IAAoB,EAAE,CAAA;AAC1C,IAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAE9B,IAAA,aAAA,GAAgB,QAAA;AAChB,IAAA,QAAA,GAAW,GAAA;AACX,IAAA,iBAAA,CAAkB,YAAY,OAAO,CAAA;AAAA,EACvC;AAEA,EAAA,UAAA,CAAW,YAAY,iBAAiB,CAAA;AAOxC,EAAA,IAAI,UAAA,GAAiC,IAAA;AACrC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,UAAA,EAAY;AAChB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,KAAA,CAAM,SAAA,GAAY,8DAAA;AAClB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,SAAA,GAAY,0DAAA;AACnB,IAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACpC,IAAA,MAAA,CAAO,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,QAAQ,CAAA;AAClD,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,SAAA,GAAY,2BAAA;AACjB,MAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,KAAA;AACnB,MAAA,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,IAAA,KAAA,CAAM,SAAA,GAAY,4BAAA;AAClB,IAAA,KAAA,CAAM,cAAc,OAAA,CAAQ,QAAA;AAC5B,IAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AACvB,IAAA,iBAAA,CAAkB,YAAY,KAAK,CAAA;AACnC,IAAA,iBAAA,CAAkB,YAAY,iBAAA,CAAkB,YAAA;AAChD,IAAA,UAAA,GAAa,KAAA;AAAA,EACf,CAAA;AACA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,UAAA,EAAY,MAAA,EAAO;AACnB,IAAA,UAAA,GAAa,IAAA;AAAA,EACf,CAAA;AAOA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,EAAA,QAAA,CAAS,SAAA,GAAY,qBAAA;AAErB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC/C,EAAA,SAAA,CAAU,SAAA,GAAY,uBAAA;AAEtB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,SAAA,GAAY,kBAAA;AAClB,EAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,wBAAwB,CAAC,CAAA;AAE7D,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACnD,EAAA,YAAA,CAAa,IAAA,GAAO,MAAA;AACpB,EAAA,YAAA,CAAa,SAAA,GAAY,kBAAA;AACzB,EAAA,YAAA,CAAa,WAAA,GAAc,WAAA;AAC3B,EAAA,YAAA,CAAa,YAAA,CAAa,cAAc,WAAW,CAAA;AACnD,EAAA,YAAA,CAAa,YAAA,GAAe,KAAA;AAC5B,EAAA,KAAA,CAAM,YAAY,YAAY,CAAA;AAE9B,EAAA,MAAM,UAAU,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,MAAM,qBAAqB,CAAA;AACzE,EAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,EAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAEzB,EAAA,IAAI,cAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,cAAA,GAAiB,WAAW,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,UAAA,EAAY,4BAA4B,UAAU,CAAA;AAChG,IAAA,KAAA,CAAM,YAAY,cAAc,CAAA;AAAA,EAClC;AACA,EAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAO3B,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,SAAA,CAAU,SAAA,CAAU,OAAO,8BAAA,EAAgC,YAAA,CAAa,MAAM,IAAA,EAAK,CAAE,SAAS,CAAC,CAAA;AAAA,EACjG,CAAA;AACA,EAAA,YAAA,CAAa,gBAAA,CAAiB,SAAS,kBAAkB,CAAA;AACzD,EAAA,kBAAA,EAAmB;AAEnB,EAAA,SAAA,CAAU,gBAAA,CAAiB,QAAA,EAAU,CAAC,CAAA,KAAM;AAC1C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,IAAA,EAAK;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,YAAA,CAAa,KAAA,GAAQ,EAAA;AACrB,IAAA,kBAAA,EAAmB;AACnB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,YAAY,SAAS,CAAA;AAE9B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,mBAAA;AAEnB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACjD,EAAA,WAAA,CAAY,SAAA,GAAY,0BAAA;AAIxB,EAAA,WAAA,CAAY,cAAc,OAAA,CAAQ,SAAA;AAClC,EAAA,MAAA,CAAO,YAAY,WAAW,CAAA;AAE9B,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACjD,EAAA,WAAA,CAAY,SAAA,GAAY,0BAAA;AACxB,EAAA,IAAI,kBAAkBA,YAAAA,EAAa;AAIjC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,yBAAA;AACjB,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,yBAAyB,CAAC,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC/C,IAAA,SAAA,CAAU,WAAA,GAAc,OAAA,CAAQ,SAAA,CAAU,OAAA,CAAQ,YAAYA,YAAW,CAAA;AACzE,IAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAC1B,IAAA,WAAA,CAAY,YAAY,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,MAAA,CAAO,YAAY,WAAW,CAAA;AAC9B,EAAA,QAAA,CAAS,YAAY,MAAM,CAAA;AAC3B,EAAA,UAAA,CAAW,YAAY,QAAQ,CAAA;AAE/B,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAU,EAAA,EAAa;AACrB,MAAA,IAAI,IAAI,YAAA,EAAa;AAAA,WAChB,YAAA,EAAa;AAAA,IACpB,CAAA;AAAA,IACA,gBAAgB,OAAA,EAAkB;AAChC,MAAA,IAAI,SAAS,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,0BAAA,EAA4B,CAAC,OAAO,CAAA;AAC1E,MAAA,UAAA,CAAW,UAAU,MAAA,CAAO,0BAAA,EAA4B,OAAA,IAAW,CAAC,CAAC,OAAO,CAAA;AAAA,IAC9E,CAAA;AAAA,IACA,cAAc,IAAA,EAAc;AAC1B,MAAA,QAAA,CAAS,WAAA,GAAc,IAAA;AAAA,IACzB,CAAA;AAAA,IACA,YAAY,MAAA,EAAQ;AAClB,MAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,QAAA,aAAA,CAAc,OAAO,OAAO,CAAA;AAC5B,QAAA,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAA,CAAQ,cAAc,MAAA,CAAO,KAAA;AAC7B,QAAA,UAAA,CAAW,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,KAAK,CAAA;AAAA,MACpD;AAGA,MAAA,IAAI,MAAA,CAAO,WAAA,IAAe,CAAC,YAAA,CAAa,KAAA,EAAO;AAC7C,QAAA,YAAA,CAAa,cAAc,MAAA,CAAO,WAAA;AAClC,QAAA,YAAA,CAAa,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,WAAW,CAAA;AAAA,MAC5D;AACA,MAAA,MAAM,OAAO,MAAA,CAAO,KAAA;AACpB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,EAAS;AACvB,MAAA,IAAI,IAAA,CAAK,YAAY,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAA,EAAO;AACf,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,UAAA,CAAW,SAAA,CAAU,OAAO,0BAA0B,CAAA;AACtD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,aAAA,EAAe,aAAA,CAAc,cAAc,IAAA,CAAK,QAAA;AACrE,MAAA,IAAI,IAAA,CAAK,WAAA,IAAe,QAAA,EAAU,QAAA,CAAS,cAAc,IAAA,CAAK,WAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,gBAAA,EAAkB,aAAA,CAAc,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAChE;AAAA,GACF;AACF;AAUO,SAAS,aAAA,CACd,SAAA,EACA,IAAA,EACA,IAAA,EACA,OAAA,EAOa;AACb,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,SAAA,GAAY,sCAAsC,IAAI,CAAA,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,kCAAkC,IAAI,CAAA,CAAA;AAGzD,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAAA,cACrC,WAAA,GAAc,IAAA;AAC1B,EAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AAExB,EAAA,IAAI,OAAA,EAAS,KAAA,EAAO,MAAA,IAAU,OAAA,CAAQ,OAAA,EAAS;AAC7C,IAAA,MAAM,KAAA,GAAQ,WAAW,OAAA,CAAQ,KAAA,EAAO,QAAQ,OAAA,EAAS,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAC7E,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,WAAA,CAAY,KAAK,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,SAAS,OAAA,IAAW,OAAA,EAAS,WAAA,EAAa,MAAA,IAAU,QAAQ,YAAA,EAAc;AAC5E,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,wBAAA;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,WAAA,EAAa;AACnC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC5C,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,MAAA,IAAA,CAAK,SAAA,GAAY,uBAAA;AACjB,MAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,MAAA,IAAA,CAAK,iBAAiB,OAAA,EAAS,MAAM,OAAA,CAAQ,YAAA,CAAc,CAAC,CAAC,CAAA;AAC7D,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IACvB;AACA,IAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAC3B,EAAA,SAAA,CAAU,YAAY,SAAA,CAAU,YAAA;AAChC,EAAA,OAAO,MAAA;AACT;;;AC3bA,IAAM,OAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,cAAA;AAAA,IAChB,gBAAA,EAAkB,sBAAA;AAAA,IAClB,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,kBAAA;AAAA,IACZ,SAAA,EAAW,iBAAA;AAAA,IACX,SAAA,EAAW,iBAAA;AAAA,IACX,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,EAAU,gBAAA;AAAA,IACV,UAAA,EAAY,kBAAA;AAAA,IACZ,KAAA,EAAO,OAAA;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,eAAA,EAAiB,kBAAA;AAAA,IACjB,SAAA,EAAW,qBAAA;AAAA,IACX,YAAA,EAAc,yCAAA;AAAA,IACd,cAAA,EAAgB,2EAAA;AAAA,IAChB,YAAA,EAAc,kDAAA;AAAA,IACd,aAAA,EAAe,WAAA;AAAA,IACf,SAAA,EAAW,kBAAA;AAAA,IACX,oBAAA,EAAsB,iBAAA;AAAA,IACtB,uBAAA,EAAyB,kCAAA;AAAA,IACzB,gBAAA,EAAkB,qBAAA;AAAA,IAClB,SAAA,EAAW,aAAA;AAAA,IACX,QAAA,EAAU,WAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,SAAA,EAAW,MAAA;AAAA,IACX,aAAA,EAAe,UAAA;AAAA,IACf,KAAA,EAAO,WAAA;AAAA,IACP,UAAA,EAAY,8BAAA;AAAA,IACZ,gBAAA,EAAkB,sCAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,2EAAA;AAAA,IAChB,gBAAA,EAAkB,qEAAA;AAAA,IAClB,IAAA,EAAM,gCAAA;AAAA,IACN,UAAA,EAAY,gHAAA;AAAA,IACZ,SAAA,EAAW,4HAAA;AAAA,IACX,SAAA,EAAW,iFAAA;AAAA,IACX,QAAA,EAAU,2EAAA;AAAA,IACV,QAAA,EAAU,qEAAA;AAAA,IACV,UAAA,EAAY,2EAAA;AAAA,IACZ,KAAA,EAAO,gCAAA;AAAA,IACP,QAAA,EAAU,gCAAA;AAAA,IACV,eAAA,EAAiB,qEAAA;AAAA,IACjB,SAAA,EAAW,sDAAA;AAAA,IACX,YAAA,EAAc,4KAAA;AAAA,IACd,cAAA,EAAgB,sUAAA;AAAA,IAChB,YAAA,EAAc,6NAAA;AAAA,IACd,aAAA,EAAe,4CAAA;AAAA,IACf,SAAA,EAAW,wEAAA;AAAA,IACX,oBAAA,EAAsB,0GAAA;AAAA,IACtB,uBAAA,EAAyB,+JAAA;AAAA,IACzB,gBAAA,EAAkB,qEAAA;AAAA,IAClB,SAAA,EAAW,kFAAA;AAAA,IACX,QAAA,EAAU,+DAAA;AAAA,IACV,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,4CAAA;AAAA,IACX,aAAA,EAAe,sCAAA;AAAA,IACf,KAAA,EAAO,qEAAA;AAAA,IACP,UAAA,EAAY,qLAAA;AAAA,IACZ,gBAAA,EAAkB,2NAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,cAAA;AAAA,IAChB,gBAAA,EAAkB,0BAAA;AAAA,IAClB,IAAA,EAAM,SAAA;AAAA,IACN,UAAA,EAAY,oCAAA;AAAA,IACZ,SAAA,EAAW,mCAAA;AAAA,IACX,SAAA,EAAW,wBAAA;AAAA,IACX,QAAA,EAAU,oBAAA;AAAA,IACV,QAAA,EAAU,2BAAA;AAAA,IACV,UAAA,EAAY,iBAAA;AAAA,IACZ,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,eAAA,EAAiB,uBAAA;AAAA,IACjB,SAAA,EAAW,0BAAA;AAAA,IACX,YAAA,EAAc,mDAAA;AAAA,IACd,cAAA,EAAgB,gHAAA;AAAA,IAChB,YAAA,EAAc,+DAAA;AAAA,IACd,aAAA,EAAe,UAAA;AAAA,IACf,SAAA,EAAW,sBAAA;AAAA,IACX,oBAAA,EAAsB,8BAAA;AAAA,IACtB,uBAAA,EAAyB,sCAAA;AAAA,IACzB,gBAAA,EAAkB,2BAAA;AAAA,IAClB,SAAA,EAAW,mBAAA;AAAA,IACX,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,MAAA;AAAA,IACX,aAAA,EAAe,MAAA;AAAA,IACf,KAAA,EAAO,cAAA;AAAA,IACP,UAAA,EAAY,iDAAA;AAAA,IACZ,gBAAA,EAAkB,gDAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,iBAAA;AAAA,IAChB,gBAAA,EAAkB,wBAAA;AAAA,IAClB,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,iCAAA;AAAA,IACZ,SAAA,EAAW,iCAAA;AAAA,IACX,SAAA,EAAW,kBAAA;AAAA,IACX,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,EAAU,gBAAA;AAAA,IACV,UAAA,EAAY,kBAAA;AAAA,IACZ,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,WAAA;AAAA,IACV,eAAA,EAAiB,uBAAA;AAAA,IACjB,SAAA,EAAW,+BAAA;AAAA,IACX,YAAA,EAAc,2CAAA;AAAA,IACd,cAAA,EAAgB,yGAAA;AAAA,IAChB,YAAA,EAAc,qDAAA;AAAA,IACd,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,sBAAA;AAAA,IACX,oBAAA,EAAsB,+BAAA;AAAA,IACtB,uBAAA,EAAyB,gDAAA;AAAA,IACzB,gBAAA,EAAkB,qBAAA;AAAA,IAClB,SAAA,EAAW,gBAAA;AAAA,IACX,QAAA,EAAU,aAAA;AAAA,IACV,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,OAAA;AAAA,IACX,aAAA,EAAe,cAAA;AAAA,IACf,KAAA,EAAO,YAAA;AAAA,IACP,UAAA,EAAY,6CAAA;AAAA,IACZ,gBAAA,EAAkB,mDAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,cAAA;AAAA,IAChB,gBAAA,EAAkB,8BAAA;AAAA,IAClB,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,oBAAA;AAAA,IACZ,SAAA,EAAW,oBAAA;AAAA,IACX,SAAA,EAAW,kBAAA;AAAA,IACX,QAAA,EAAU,kBAAA;AAAA,IACV,QAAA,EAAU,eAAA;AAAA,IACV,UAAA,EAAY,iBAAA;AAAA,IACZ,KAAA,EAAO,cAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,eAAA,EAAiB,mBAAA;AAAA,IACjB,SAAA,EAAW,6BAAA;AAAA,IACX,YAAA,EAAc,0DAAA;AAAA,IACd,cAAA,EAAgB,oGAAA;AAAA,IAChB,YAAA,EAAc,8DAAA;AAAA,IACd,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,uBAAA;AAAA,IACX,oBAAA,EAAsB,sBAAA;AAAA,IACtB,uBAAA,EAAyB,8CAAA;AAAA,IACzB,gBAAA,EAAkB,uBAAA;AAAA,IAClB,SAAA,EAAW,mBAAA;AAAA,IACX,QAAA,EAAU,YAAA;AAAA,IACV,QAAA,EAAU,WAAA;AAAA,IACV,SAAA,EAAW,OAAA;AAAA,IACX,aAAA,EAAe,KAAA;AAAA,IACf,KAAA,EAAO,kBAAA;AAAA,IACP,UAAA,EAAY,qDAAA;AAAA,IACZ,gBAAA,EAAkB,gEAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,qEAAA;AAAA,IAChB,gBAAA,EAAkB,uFAAA;AAAA,IAClB,IAAA,EAAM,wDAAA;AAAA,IACN,UAAA,EAAY,gHAAA;AAAA,IACZ,SAAA,EAAW,wIAAA;AAAA,IACX,SAAA,EAAW,4CAAA;AAAA,IACX,QAAA,EAAU,sCAAA;AAAA,IACV,QAAA,EAAU,4CAAA;AAAA,IACV,UAAA,EAAY,0EAAA;AAAA,IACZ,KAAA,EAAO,4CAAA;AAAA,IACP,QAAA,EAAU,kDAAA;AAAA,IACV,eAAA,EAAiB,qEAAA;AAAA,IACjB,SAAA,EAAW,wEAAA;AAAA,IACX,YAAA,EAAc,qMAAA;AAAA,IACd,cAAA,EAAgB,+bAAA;AAAA,IAChB,YAAA,EAAc,6NAAA;AAAA,IACd,aAAA,EAAe,2EAAA;AAAA,IACf,SAAA,EAAW,kEAAA;AAAA,IACX,oBAAA,EAAsB,0FAAA;AAAA,IACtB,uBAAA,EAAyB,gNAAA;AAAA,IACzB,gBAAA,EAAkB,qHAAA;AAAA,IAClB,SAAA,EAAW,0GAAA;AAAA,IACX,QAAA,EAAU,wDAAA;AAAA,IACV,QAAA,EAAU,4CAAA;AAAA,IACV,SAAA,EAAW,0BAAA;AAAA,IACX,aAAA,EAAe,gCAAA;AAAA,IACf,KAAA,EAAO,wDAAA;AAAA,IACP,UAAA,EAAY,+PAAA;AAAA,IACZ,gBAAA,EAAkB,wPAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,6BAAA;AAAA,IAChB,gBAAA,EAAkB,sBAAA;AAAA,IAClB,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW,gBAAA;AAAA,IACX,QAAA,EAAU,+BAAA;AAAA,IACV,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,4BAAA;AAAA,IACZ,KAAA,EAAO,OAAA;AAAA,IACP,QAAA,EAAU,iBAAA;AAAA,IACV,eAAA,EAAiB,aAAA;AAAA,IACjB,SAAA,EAAW,6CAAA;AAAA,IACX,YAAA,EAAc,uDAAA;AAAA,IACd,cAAA,EAAgB,0GAAA;AAAA,IAChB,YAAA,EAAc,sGAAA;AAAA,IACd,aAAA,EAAe,UAAA;AAAA,IACf,SAAA,EAAW,gCAAA;AAAA,IACX,oBAAA,EAAsB,2CAAA;AAAA,IACtB,uBAAA,EAAyB,0DAAA;AAAA,IACzB,gBAAA,EAAkB,qBAAA;AAAA,IAClB,SAAA,EAAW,oBAAA;AAAA,IACX,QAAA,EAAU,wBAAA;AAAA,IACV,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,OAAA;AAAA,IACX,aAAA,EAAe,OAAA;AAAA,IACf,KAAA,EAAO,aAAA;AAAA,IACP,UAAA,EAAY,yDAAA;AAAA,IACZ,gBAAA,EAAkB,+DAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,sEAAA;AAAA,IAChB,gBAAA,EAAkB,8FAAA;AAAA,IAClB,IAAA,EAAM,sCAAA;AAAA,IACN,UAAA,EAAY,2GAAA;AAAA,IACZ,SAAA,EAAW,qGAAA;AAAA,IACX,SAAA,EAAW,oDAAA;AAAA,IACX,QAAA,EAAU,0DAAA;AAAA,IACV,QAAA,EAAU,0DAAA;AAAA,IACV,UAAA,EAAY,mFAAA;AAAA,IACZ,KAAA,EAAO,6CAAA;AAAA,IACP,QAAA,EAAU,yDAAA;AAAA,IACV,eAAA,EAAiB,mDAAA;AAAA,IACjB,SAAA,EAAW,mEAAA;AAAA,IACX,YAAA,EAAc,sNAAA;AAAA,IACd,cAAA,EAAgB,ubAAA;AAAA,IAChB,YAAA,EAAc,6NAAA;AAAA,IACd,aAAA,EAAe,yDAAA;AAAA,IACf,SAAA,EAAW,yEAAA;AAAA,IACX,oBAAA,EAAsB,mJAAA;AAAA,IACtB,uBAAA,EAAyB,iNAAA;AAAA,IACzB,gBAAA,EAAkB,8FAAA;AAAA,IAClB,SAAA,EAAW,4EAAA;AAAA,IACX,QAAA,EAAU,yDAAA;AAAA,IACV,QAAA,EAAU,sCAAA;AAAA,IACV,SAAA,EAAW,gCAAA;AAAA,IACX,aAAA,EAAe,0BAAA;AAAA,IACf,KAAA,EAAO,wFAAA;AAAA,IACP,UAAA,EAAY,2NAAA;AAAA,IACZ,gBAAA,EAAkB,yMAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,mDAAA;AAAA,IAChB,gBAAA,EAAkB,kFAAA;AAAA,IAClB,IAAA,EAAM,gCAAA;AAAA,IACN,UAAA,EAAY,+FAAA;AAAA,IACZ,SAAA,EAAW,yFAAA;AAAA,IACX,SAAA,EAAW,0DAAA;AAAA,IACX,QAAA,EAAU,0DAAA;AAAA,IACV,QAAA,EAAU,0DAAA;AAAA,IACV,UAAA,EAAY,yFAAA;AAAA,IACZ,KAAA,EAAO,6CAAA;AAAA,IACP,QAAA,EAAU,mDAAA;AAAA,IACV,eAAA,EAAiB,mDAAA;AAAA,IACjB,SAAA,EAAW,0FAAA;AAAA,IACX,YAAA,EAAc,sNAAA;AAAA,IACd,cAAA,EAAgB,wcAAA;AAAA,IAChB,YAAA,EAAc,iOAAA;AAAA,IACd,aAAA,EAAe,uCAAA;AAAA,IACf,SAAA,EAAW,yEAAA;AAAA,IACX,oBAAA,EAAsB,mJAAA;AAAA,IACtB,uBAAA,EAAyB,oMAAA;AAAA,IACzB,gBAAA,EAAkB,sEAAA;AAAA,IAClB,SAAA,EAAW,8FAAA;AAAA,IACX,QAAA,EAAU,6CAAA;AAAA,IACV,QAAA,EAAU,gCAAA;AAAA,IACV,SAAA,EAAW,sCAAA;AAAA,IACX,aAAA,EAAe,gCAAA;AAAA,IACf,KAAA,EAAO,yFAAA;AAAA,IACP,UAAA,EAAY,2NAAA;AAAA,IACZ,gBAAA,EAAkB,0KAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,iBAAA;AAAA,IAChB,gBAAA,EAAkB,4CAAA;AAAA,IAClB,IAAA,EAAM,cAAA;AAAA,IACN,UAAA,EAAY,sCAAA;AAAA,IACZ,SAAA,EAAW,sCAAA;AAAA,IACX,SAAA,EAAW,gCAAA;AAAA,IACX,QAAA,EAAU,gCAAA;AAAA,IACV,QAAA,EAAU,gCAAA;AAAA,IACV,UAAA,EAAY,gCAAA;AAAA,IACZ,KAAA,EAAO,cAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,eAAA,EAAiB,oBAAA;AAAA,IACjB,SAAA,EAAW,0CAAA;AAAA,IACX,YAAA,EAAc,8DAAA;AAAA,IACd,cAAA,EAAgB,8JAAA;AAAA,IAChB,YAAA,EAAc,4FAAA;AAAA,IACd,aAAA,EAAe,oBAAA;AAAA,IACf,SAAA,EAAW,8BAAA;AAAA,IACX,oBAAA,EAAsB,kDAAA;AAAA,IACtB,uBAAA,EAAyB,kGAAA;AAAA,IACzB,gBAAA,EAAkB,0BAAA;AAAA,IAClB,SAAA,EAAW,sCAAA;AAAA,IACX,QAAA,EAAU,0BAAA;AAAA,IACV,QAAA,EAAU,cAAA;AAAA,IACV,SAAA,EAAW,cAAA;AAAA,IACX,aAAA,EAAe,cAAA;AAAA,IACf,KAAA,EAAO,cAAA;AAAA,IACP,UAAA,EAAY,gFAAA;AAAA,IACZ,gBAAA,EAAkB,oEAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,kBAAA;AAAA,IAChB,gBAAA,EAAkB,4BAAA;AAAA,IAClB,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,0BAAA;AAAA,IACZ,SAAA,EAAW,wBAAA;AAAA,IACX,SAAA,EAAW,eAAA;AAAA,IACX,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,EAAU,eAAA;AAAA,IACV,UAAA,EAAY,kBAAA;AAAA,IACZ,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,WAAA;AAAA,IACV,eAAA,EAAiB,eAAA;AAAA,IACjB,SAAA,EAAW,4BAAA;AAAA,IACX,YAAA,EAAc,mCAAA;AAAA,IACd,cAAA,EAAgB,iGAAA;AAAA,IAChB,YAAA,EAAc,+DAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA,IACf,SAAA,EAAW,qBAAA;AAAA,IACX,oBAAA,EAAsB,oBAAA;AAAA,IACtB,uBAAA,EAAyB,6CAAA;AAAA,IACzB,gBAAA,EAAkB,qBAAA;AAAA,IAClB,SAAA,EAAW,aAAA;AAAA,IACX,QAAA,EAAU,WAAA;AAAA,IACV,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,MAAA;AAAA,IACX,aAAA,EAAe,OAAA;AAAA,IACf,KAAA,EAAO,kBAAA;AAAA,IACP,UAAA,EAAY,2CAAA;AAAA,IACZ,gBAAA,EAAkB,uDAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,EAAA,EAAI;AAAA,IACF,cAAA,EAAgB,YAAA;AAAA,IAChB,gBAAA,EAAkB,yBAAA;AAAA,IAClB,IAAA,EAAM,OAAA;AAAA,IACN,UAAA,EAAY,qBAAA;AAAA,IACZ,SAAA,EAAW,wBAAA;AAAA,IACX,SAAA,EAAW,oBAAA;AAAA,IACX,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,EAAU,iBAAA;AAAA,IACV,UAAA,EAAY,qBAAA;AAAA,IACZ,KAAA,EAAO,OAAA;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,eAAA,EAAiB,iBAAA;AAAA,IACjB,SAAA,EAAW,wBAAA;AAAA,IACX,YAAA,EAAc,uCAAA;AAAA,IACd,cAAA,EAAgB,yEAAA;AAAA,IAChB,YAAA,EAAc,uDAAA;AAAA,IACd,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,uBAAA;AAAA,IACX,oBAAA,EAAsB,2BAAA;AAAA,IACtB,uBAAA,EAAyB,sCAAA;AAAA,IACzB,gBAAA,EAAkB,4BAAA;AAAA,IAClB,SAAA,EAAW,eAAA;AAAA,IACX,QAAA,EAAU,mBAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,SAAA,EAAW,SAAA;AAAA,IACX,aAAA,EAAe,QAAA;AAAA,IACf,KAAA,EAAO,WAAA;AAAA,IACP,UAAA,EAAY,4CAAA;AAAA,IACZ,gBAAA,EAAkB,wCAAA;AAAA,IAClB,UAAA,EAAY;AAAA;AAEhB,CAAA;AAMA,IAAM,8BAAc,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAIzH,IAAM,WAAA,mBAAc,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAK5E,IAAM,iBAAyC,EAAE,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,IAAI,IAAA,EAAK;AAK9E,SAAS,aAAa,GAAA,EAA6B;AACjD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAA;AACpC,EAAA,OAAO,IAAI,IAAA,EAAK,CAAE,aAAY,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AACnD;AAEA,SAAS,cAAc,GAAA,EAAqB;AAC1C,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACjD,EAAA,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,KAAA;AAClC;AAIA,SAAS,WAAW,GAAA,EAAsC;AACxD,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,OAAO,MAAA,CAAO,UAAU,cAAA,CAAe,IAAA,CAAK,SAAS,GAAG,CAAA,GAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAC7E;AAiBO,SAAS,kBAAkB,SAAA,EAA4B;AAC5D,EAAA,MAAM,QAAA,GAAW,aAAa,SAAS,CAAA;AACvC,EAAA,IAAI,QAAA,IAAY,QAAA,KAAa,MAAA,EAAQ,OAAO,QAAA;AAE5C,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,QAAA,CAAS,eAAA,EAAiB;AAC/D,IAAA,MAAM,WAAW,YAAA,CAAa,QAAA,CAAS,eAAA,CAAgB,YAAA,CAAa,MAAM,CAAC,CAAA;AAC3E,IAAA,IAAI,QAAA,IAAY,QAAA,KAAa,MAAA,EAAQ,OAAO,QAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAC/C,IAAA,IAAI,SAAS,OAAO,OAAA;AAAA,EACtB;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAc,IAAA,EAAuB;AACnD,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,YAAY,GAAA,CAAI,aAAA,CAAc,GAAG,CAAC,GAAG,OAAO,IAAA;AAGhD,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAC5D;AAaO,SAAS,gBAAA,CAAiB,MAAc,SAAA,EAA0C;AACvF,EAAA,MAAM,QAAA,GAAW,aAAa,SAAS,CAAA;AACvC,EAAA,IAAI,QAAA,KAAa,KAAA,IAAS,QAAA,KAAa,KAAA,EAAO,OAAO,QAAA;AAErD,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG,OAAO,KAAA;AAEhC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,QAAA,CAAS,eAAA,EAAiB;AAC/D,IAAA,IAAI,YAAA,CAAa,SAAS,eAAA,CAAgB,YAAA,CAAa,KAAK,CAAC,CAAA,KAAM,OAAO,OAAO,KAAA;AAAA,EACnF;AAEA,EAAA,OAAO,KAAA;AACT;AAUO,SAAS,WAAW,IAAA,EAA2B;AACpD,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,OAAO,UAAA,CAAW,GAAG,CAAA,IAAK,UAAA,CAAW,cAAc,GAAG,CAAC,KAAK,OAAA,CAAQ,EAAA;AACtE;;;ACrjBO,SAAS,YAAY,MAAA,EAA8B;AACxD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACjE,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,SAAS,SAAS,CAAA;AAAA,IACxD,GAAA,EAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AAAA,IACzB,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA;AAAA,IAC7B,MAAM,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,MAAM,CAAA;AAAA,IACpD,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,CAAC,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA,EAAO,MAAM,EAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IAAK;AAAA,GAC7F;AACF;AAEO,SAAS,aAAA,CAAc,GAAkB,MAAA,EAA+B;AAC7E,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY;AAC9B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,KAAQ,OAAA,GAAU,GAAA,KAAQ,OAAO,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,GAAA,KAAQ,MAAA,CAAO,GAAA;AAC/F,EAAA,OACE,UAAA,IACA,CAAA,CAAE,OAAA,KAAY,MAAA,CAAO,QACrB,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,GAAA,IACpB,EAAE,QAAA,KAAa,MAAA,CAAO,KAAA,IACtB,CAAA,CAAE,YAAY,MAAA,CAAO,IAAA;AAEzB;AAEO,SAAS,iBAAiB,MAAA,EAAqC;AACpE,EAAA,IAAI,EAAE,MAAA,YAAkB,WAAA,CAAA,EAAc,OAAO,KAAA;AAC7C,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,EAAA,OAAO,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,IAAc,MAAA,CAAO,iBAAA;AACzD;AASO,SAAS,eAAA,GAA2B;AACzC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAC7C,EAAA,MAAM,EAAA,GAAM,UAAoE,aAAA,EAAe,QAAA;AAC/F,EAAA,MAAM,QAAA,GAAW,EAAA,IAAM,SAAA,CAAU,QAAA,IAAY,EAAA;AAC7C,EAAA,OAAO,uBAAA,CAAwB,KAAK,QAAQ,CAAA;AAC9C;AAeO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,eAAA,KAAoB,WAAA,GAAc,YAAA;AAC3C;AAOO,SAAS,YAAY,MAAA,EAAwB;AAClD,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,EAAA,MAAM,OAAA,GACJ,MAAA,CAAO,GAAA,KAAQ,OAAA,GAAU,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,WAAA,KAAgB,MAAA,CAAO,GAAA;AACjG,EAAA,IAAI,iBAAgB,EAAG;AACrB,IAAA,MAAMC,QAAO,CAAC,MAAA,CAAO,IAAA,IAAQ,QAAA,EAAK,OAAO,GAAA,IAAO,QAAA,EAAK,MAAA,CAAO,KAAA,IAAS,UAAK,MAAA,CAAO,IAAA,IAAQ,QAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5G,IAAA,OAAO,CAAC,GAAGA,KAAAA,EAAM,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,OAAO,CAAC,MAAA,CAAO,IAAA,IAAQ,MAAA,EAAQ,OAAO,GAAA,IAAO,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,SAAS,MAAA,CAAO,IAAA,IAAQ,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACvH,EAAA,OAAO,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACpC;;;AC5CA,IAAM,gBAAA,GAAsC,cAAA;AAC5C,IAAM,eAAA,GAAuC;AAAA,EAC3C,cAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,sBAAA,GAAyB,IAAA;AAC/B,IAAM,wBAAA,GAA2B,CAAA;AACjC,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,mBAAA,GAAqD,CAAC,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAgB5F,SAAS,gCAAgC,GAAA,EAAyB;AAChE,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,mBAAA,CAAoB,OAAA,CAAQ,CAAC,EAAA,KAAO,QAAA,CAAS,oBAAoB,EAAA,EAAI,OAAA,EAAS,IAAI,CAAC,CAAA;AACnF,IAAA,IAAI,GAAA,CAAI,KAAA,KAAU,SAAA,EAAW,KAAK,IAAI,MAAA,EAAO;AAAA,EAC/C,CAAA;AACA,EAAA,mBAAA,CAAoB,OAAA,CAAQ,CAAC,EAAA,KAAO,QAAA,CAAS,gBAAA,CAAiB,EAAA,EAAI,OAAA,EAAS,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3G;AAcA,IAAM,uBAAA,GAA0B,kBAAA;AAEhC,SAAS,iBAAA,GAA4B;AACnC,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,EAAQ,UAAA,IAAa;AAC7C,EAAA,IAAI,IAAA,EAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,EAAE,CAAA;AACtC,EAAA,OAAO,IAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC9E;AAEA,SAAS,qBAAA,CAAsB,WAAmB,EAAA,EAAkB;AAClE,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,uBAAA,GAA0B,SAAA,EAAW,EAAE,CAAA;AAAA,EACvE,CAAA,CAAA,MAAQ;AAAA,EAGR;AACF;AAEA,SAAS,mBAAmB,SAAA,EAA2B;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,0BAA0B,SAAS,CAAA;AAClF,IAAA,IAAI,QAAA,IAAY,uBAAA,CAAwB,IAAA,CAAK,QAAQ,GAAG,OAAO,QAAA;AAAA,EACjE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,EAAA,qBAAA,CAAsB,WAAW,EAAE,CAAA;AACnC,EAAA,OAAO,EAAA;AACT;AASO,IAAM,YAAN,MAAgB;AAAA,EAiCrB,YAAY,OAAA,EAA2B;AAvBvC,IAAA,IAAA,CAAiB,cAAA,GAAiB,CAAC,CAAA,KAAqB,IAAA,CAAK,cAAc,CAAC,CAAA;AAG5E,IAAA,IAAA,CAAQ,MAAA,GAA0B,MAAA;AAClC,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,EAAA,GAAuB,IAAA;AAC/B,IAAA,IAAA,CAAQ,YAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,GAAA,GAA+B,IAAA;AACvC,IAAA,IAAA,CAAQ,MAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,aAAA,GAAgB,CAAA;AACxB,IAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AACxB,IAAA,IAAA,CAAQ,WAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,mBAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,iBAAA,GAA6C,IAAA;AAKrD,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AACvB,IAAA,IAAA,CAAQ,YAAA,GAAwC,IAAA;AAChD,IAAA,IAAA,CAAQ,IAAA,GAA6B,IAAA;AAGnC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAEf,IAAA,MAAM,eAAe,OAAA,CAAQ,QAAA;AAC7B,IAAA,IAAI,QAAA,GAA8B,gBAAA;AAClC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,YAAY,CAAA,EAAG;AAC1C,QAAA,QAAA,GAAW,YAAA;AAAA,MACb,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,mCAAA,EAAsC,YAAY,CAAA,oBAAA,EAAuB,gBAAgB,CAAA,EAAA;AAAA,SAC3F;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAMhB,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,QAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,iBAAA,CAAkB,OAAA,CAAQ,UAAU,CAAA;AAClD,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,cAAA,GAAiB,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA;AAC1D,IAAA,IAAA,CAAK,aAAa,gBAAA,EAAiB;AAEnC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC5C,MAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC/C,MAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,MAAA,IAAA,CAAK,iBAAA,GAAoB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACrD,MAAA,IAAA,CAAK,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,MAAA,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC7C,MAAA,IAAA,CAAK,EAAA,GAAK;AAAA,QACR,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,QACxB,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA,EAAS,IAAA;AAAA,QACT,cAAA,EAAgB,IAAA;AAAA,QAChB,WAAW,MAAM;AAAA,QAAC,CAAA;AAAA,QAClB,iBAAiB,MAAM;AAAA,QAAC,CAAA;AAAA,QACxB,eAAe,MAAM;AAAA,QAAC,CAAA;AAAA,QACtB,aAAa,MAAM;AAAA,QAAC;AAAA,OACtB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,GACzB,SAAS,aAAA,CAA2B,OAAA,CAAQ,SAAS,CAAA,GACrD,OAAA,CAAQ,SAAA;AAEd,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAA,2CAAA,EAA8C,IAAA,CAAK,QAAQ,CAAA,CAAA;AAE/E,IAAA,MAAM,OAAA,GAAU,UAAA;AAAA,MACd,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,OAAA,CAAQ,WAAA;AAAA,MACR,OAAA,CAAQ,mBAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AACrB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,KAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAIzC,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,KAAK,KAAK,WAAA,EAAY;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,WAAA,CAAY,KAAK,KAAK,CAAA;AAE9B,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,IAAA,CAAK,MAAA,EAAQ,QAAQ,SAAS,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,GAAM,SAAA;AACd,IAAA,OAAA,CAAQ,OAAO,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,QAAQ,KAAA,EAAO,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,MAAA,EAAQ;AAC1D,MAAA,OAAA,CAAQ,YAAA,CAAa,iBAAA,EAAmB,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,gBAAA,CAAiB,OAAA,EAAS,QAAQ,KAA2C,CAAA;AAChG,IAAA,IAAI,OAAA,CAAQ,aAAa,gBAAA,CAAiB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAA,CAAQ,aAAa,CAAA;AAElF,IAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,MAC7B,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,cAAA;AAAA,MACrC,WAAA,EACE,OAAA,CAAQ,WAAA,KACP,IAAA,CAAK,IAAA,KAAS,SAAS,IAAA,CAAK,OAAA,CAAQ,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAA;AAAA,MACvE,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAA;AAAA,MACA,MAAM,IAAA,CAAK,MAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,EAAC;AAAA,MACzB,SAAS,OAAA,CAAQ,OAAA;AAAA;AAAA,MAEjB,WAAA,EAAa,QAAQ,MAAA,KAAW,IAAA,GAAO,OAAO,WAAA,CAAY,OAAA,CAAQ,MAAA,IAAU,aAAA,EAAe,CAAA;AAAA,MAC3F,YAAY,CAAC,IAAA,KAAS,KAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,MAC7C,UAAA,EAAY,MAAM,KAAK,IAAA,CAAK,WAAA,EAAY;AAAA,MACxC,YAAA,EAAc,MAAM,IAAA,CAAK,SAAA,EAAU;AAAA,MACnC,iBAAA,EAAmB,MAAM,IAAA,CAAK,iBAAA;AAAkB,KACjD,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,GAAK,MAAA;AACV,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,iBAAA;AAChC,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,OAAA,CAAQ,WAAA,CAAY,KAAK,UAAU,CAAA;AAEnC,IAAA,CAAC,SAAA,IAAa,QAAA,CAAS,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA;AAEhD,IAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/C,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,IAAA,EAAM;AAC3B,MAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,KAAK,KAAK,WAAA,EAAY;AACtB,IAAA,KAAK,KAAK,gBAAA,EAAiB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA0B;AAChC,IAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,KAAK,cAAc,CAAA;AACxE,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,GAAK,CAAA,CAAE,QAAuB,EAAC;AAClE,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,QACjB,EAAA,EAAI,CAAA,SAAA,EAAY,CAAA,CAAE,EAAE,CAAA,CAAA;AAAA,QACpB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,WAAW,CAAA,CAAE,EAAA;AAAA,QACb,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACD,CAAA;AACD,MAAA,aAAA,CAAc,IAAA,CAAK,iBAAA,EAAmB,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM;AAAA,QACpD,KAAA;AAAA,QACA,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,IAAA,CAAK,MAAA;AAAA,QACrB,WAAA,EAAa,MAAM,OAAA,CAAQ,CAAA,CAAE,WAAW,CAAA,GAAK,CAAA,CAAE,cAA2B,EAAC;AAAA,QAC3E,cAAc,CAAC,IAAA,KAAS,KAAK,IAAA,CAAK,SAAS,IAAI;AAAA,OAChD,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAgB,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEQ,cAAA,GAAuB;AAK7B,IAAA,qBAAA,CAAsB,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AACjE,IAAA,iBAAA;AAAA,MACE,KAAK,OAAA,CAAQ,SAAA;AAAA,MACb,IAAA,CAAK,cAAA;AAAA,MACL,IAAA,CAAK,QAAA,CACF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,WAAA,EAAa,CAAA,CAAE,WAAA,EAAa,EAAA,EAAI,CAAA,CAAE,SAAA,EAAU,CAAE;AAAA,KAC7G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,gBAAA,GAAkC;AAC9C,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAA,EAAY;AACvC,IAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA,CAAK,QAAQ,UAAA,EAAY,IAAA,CAAK,QAAQ,GAAG,CAAA;AAC9E,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,iBAAiB,UAAA,EAAY,IAAA,CAAK,QAAQ,SAAA,EAAW,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IACzF,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAEpB,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,aAAA;AAChC,IAAA,IAAI,CAAC,OAAA,EAAS;AAKd,IAAA,MAAM,IAAI,MAAA,CAAO,UAAA;AACjB,IAAA,gBAAA,CAAiB,OAAA,EAAS;AAAA,MACxB,MAAA,EAAQ,KAAK,OAAA,CAAQ,WAAA,IAAe,KAAK,OAAA,CAAQ,KAAA,EAAO,eAAe,CAAA,CAAE,WAAA;AAAA,MACzE,iBAAA,EAAmB,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,kBAAkB,CAAA,CAAE,cAAA;AAAA,MAC3D,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,gBAAgB,CAAA,CAAE,YAAA;AAAA,MAC/C,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,aAAa,CAAA,CAAE,SAAA;AAAA,MACzC,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA,CAAE,MAAA;AAAA,MACxC,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,cAAc,CAAA,CAAE;AAAA,KAC3C,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,SAAS,CAAA,CAAE,KAAA;AAC7C,IAAA,IAAI,SAAS,KAAA,KAAU,MAAA,EAAQ,OAAA,CAAQ,YAAA,CAAa,mBAAmB,KAAK,CAAA;AAM5E,IAAA,IAAI,CAAC,KAAK,OAAA,CAAQ,IAAA,IAAQ,OAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM;AAClE,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,WAAW,CAAA,CAAE,eAAA;AACzD,IAAA,IAAI,YAAA,EAAc,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,YAAY,CAAA;AAEvD,IAAA,IAAA,CAAK,GAAG,WAAA,CAAY;AAAA,MAClB,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,CAAA,CAAE,OAAA;AAAA,MACnC,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,MAAA,CAAO,KAAA;AAAA,MACpC,WAAA,EACE,IAAA,CAAK,OAAA,CAAQ,WAAA,KACZ,IAAA,CAAK,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAA;AAAA,MACvE,KAAA,EAAO;AAAA,QACL,SAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,OAAA,IAAW,OAAO,KAAA,CAAM,OAAA;AAAA,QACrD,UAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,QAAA,IAAY,OAAO,KAAA,CAAM,QAAA;AAAA,QACvD,aAAa,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,WAAA,IAAe,OAAO,KAAA,CAAM,WAAA;AAAA,QAC7D,UAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,QAAA,IAAY,OAAO,KAAA,CAAM,QAAA;AAAA,QACvD,WAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,SAAA,IAAa,OAAO,KAAA,CAAM,SAAA;AAAA,QACzD,kBAAkB,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,gBAAA,IAAoB,OAAO,KAAA,CAAM;AAAA;AACzE,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,GAAkB;AACxB,IAAA,MAAM,SAAA,GAAY,KAAK,IAAA,KAAS,MAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,SAAA;AACtB,IAAA,IAAI,KAAK,EAAA,CAAG,cAAA,OAAqB,EAAA,CAAG,cAAA,CAAe,SAAS,CAAC,SAAA;AAAA,EAC/D;AAAA,EAEQ,cAAc,CAAA,EAAwB;AAC5C,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAA,EAAY;AAOvC,IAAA,IAAI,iBAAiB,CAAA,CAAE,MAAM,KAAK,CAAA,CAAE,MAAA,KAAW,KAAK,YAAA,EAAc;AAClE,IAAA,IAAI,EAAE,MAAA,EAAQ;AACd,IAAA,MAAM,SAAS,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,eAAe,CAAA;AACjE,IAAA,IAAI,CAAC,aAAA,CAAc,CAAA,EAAG,MAAM,CAAA,EAAG;AAC/B,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,KAAK,KAAK,MAAA,EAAO;AAAA,EACnB;AAAA,EAEQ,UAAU,MAAA,EAA+B;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,WAAA,CAAY,KAAK,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC9D,IAAA,IAAA,CAAK,OAAA,CAAQ,iBAAiB,MAAM,CAAA;AAEpC,IAAA,IAAI,MAAA,KAAW,WAAA,IAAe,MAAA,KAAW,UAAA,EAAY;AACnD,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,gCAAgC,CAAA;AAAA,IAC5D,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,gCAAgC,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,UAAU,KAAA,EAAwB;AACxC,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AACrB,IAAA,aAAA,CAAc,KAAK,iBAAA,EAAmB,CAAA,OAAA,EAAU,KAAA,CAAM,OAAO,IAAI,QAAQ,CAAA;AAAA,EAC3E;AAAA,EAEA,IAAW,aAAA,GAAiC;AAC1C,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,IAAW,QAAA,GAAoB;AAC7B,IAAA,OAAO,KAAK,MAAA,KAAW,MAAA;AAAA,EACzB;AAAA,EAEA,IAAW,UAAA,GAAsB;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEO,QAAA,GAAiB;AACtB,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,MAAA,CAAO,2BAA2B,CAAA;AAI5D,IAAA,IAAA,CAAK,UAAA,CAAW,aAAA,EAAe,SAAA,CAAU,GAAA,CAAI,0BAA0B,CAAA;AACvE,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,IAAI,CAAA;AAAA,EAClC;AAAA,EAEO,SAAA,GAAkB;AACvB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,2BAA2B,CAAA;AACzD,IAAA,IAAA,CAAK,UAAA,CAAW,aAAA,EAAe,SAAA,CAAU,MAAA,CAAO,0BAA0B,CAAA;AAC1E,IAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,KAAK,CAAA;AAAA,EACnC;AAAA,EAEO,UAAA,GAAmB;AACxB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAa,SAAS,IAAA,EAA6B;AACjD,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAC,OAAA,IAAW,KAAK,YAAA,EAAc;AAEtD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAS;AAChC,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAgB,KAAK,CAAA;AAE7B,IAAA,MAAM,GAAA,GAAmB;AAAA,MACvB,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,MACtB,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AACtB,IAAA,aAAA,CAAc,IAAA,CAAK,iBAAA,EAAmB,OAAA,EAAS,MAAM,CAAA;AACrD,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAEjD,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACrE,MAAA,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,QACN,KAAK,SAAA,CAAU;AAAA,UACb,IAAA,EAAM,0BAAA;AAAA,UACN,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,MAAM,MAAA,EAAQ,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAA,EAAS,CAAA;AAAE,SACzF;AAAA,OACH;AACA,MAAA,IAAA,CAAK,EAAA,CAAG,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,iBAAA,EAAmB,CAAC,CAAA;AACxD,MAAA,IAAA,CAAK,UAAU,UAAU,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,EACpC;AAAA,EAEA,MAAc,gBAAgB,OAAA,EAAgC;AAC5D,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,EAAA,CAAG,UAAU,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC3C,IAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA,CAAK,QAAQ,UAAA,EAAY,IAAA,CAAK,QAAQ,GAAG,CAAA;AAE9E,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,UAAA,EAAY,KAAK,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ;AAAA,QACxF,OAAA;AAAA,QACA,gBAAgB,IAAA,CAAK,cAAA;AAAA;AAAA;AAAA,QAGrB,aAAa,kBAAA,EAAmB;AAAA,QAChC,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AAED,MAAA,MAAM,KAAA,GAAoB,KAAA,CAAM,KAAA,IAAS,EAAC;AAC1C,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,EAAC;AAC1C,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,QACjB,EAAA,EAAI,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,QACvB,IAAA,EAAM,OAAA;AAAA,QACN,MAAM,KAAA,CAAM,KAAA;AAAA,QACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,aAAA,CAAc,IAAA,CAAK,iBAAA,EAAmB,KAAA,CAAM,KAAA,EAAO,OAAA,EAAS;AAAA,QAC1D,KAAA;AAAA,QACA,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,IAAA,EAAM,KAAA,CAAM,QAAA,IAAY,IAAA,CAAK,MAAA;AAAA,QAC7B,WAAA;AAAA,QACA,cAAc,CAAC,IAAA,KAAS,KAAK,IAAA,CAAK,SAAS,IAAI;AAAA,OAChD,CAAA;AACD,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,OAAA,EAAS,KAAA,CAAM,OAAO,IAAI,CAAA;AACtD,MAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,IAChD,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GACJ,GAAA,YAAe,cAAA,GACX,GAAA,CAAI,SAAA,GACJ,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAC5D,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,OAAO,CAAA;AAC9B,MAAA,aAAA,CAAc,IAAA,CAAK,iBAAA,EAAmB,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAAA,IACjE,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,IAAA,CAAK,EAAA,CAAG,UAAU,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,EAAA,CAAG,cAAc,EAAE,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,iBAAA,GAA0B;AAC/B,IAAA,IAAI,KAAK,UAAA,EAAY;AACrB,IAAA,eAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAC3D,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,iBAAiB,iBAAA,EAAkB;AACxC,IAAA,qBAAA,CAAsB,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AACjE,IAAA,KAAA,MAAW,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC/D,MAAA,IAAI,KAAA,KAAU,IAAA,CAAK,EAAA,CAAG,OAAA,QAAe,MAAA,EAAO;AAAA,IAC9C;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAgB,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,EAAA,CAAG,UAAU,KAAK,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA,EAIA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAK,MAAA,EAAO;AAAA,EACpB;AAAA,EAEQ,qBAAA,CAAsB,IAAA,EAAwB,IAAA,EAAc,OAAA,EAAwB;AAC1F,IAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,IAAA,IAAQ,CAAC,KAAK,mBAAA,EAAqB;AAChE,MAAA,IAAA,CAAK,mBAAA,GAAsB,aAAA,CAAc,IAAA,CAAK,iBAAA,EAAmB,IAAI,IAAI,CAAA;AACzE,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,MAAA,IAAA,CAAK,oBAAoB,WAAA,IAAe,IAAA;AACxC,MAAA,IAAA,CAAK,iBAAA,CAAkB,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,YAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAa,MAAA,GAAwB;AAInC,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,CAAC,KAAK,UAAA,EAAY;AAC5C,MAAA,IAAA,CAAK,UAAA,EAAW;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,SAAA,CAAU;AAAA,QACb,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,WAAA,EAAY;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,YAAA,EAAa;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAY,cAAA,GAA0B;AACpC,IAAA,OAAA,CAAQ,KAAK,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,YAAA,EAAc,eAAe,UAAA,MAAgB,MAAA;AAAA,EACxF;AAAA,EAEA,MAAc,gBAAA,GAAkC;AAC9C,IAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA,CAAK,QAAQ,UAAA,EAAY,IAAA,CAAK,QAAQ,GAAG,CAAA;AAC9E,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,aAAA,CAAc;AAAA,MAC5B,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,MACxB,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,MACrB,QAAA,EAAU;AAAA,QACR,QAAA,EAAU,CAAC,MAAA,KAAW,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,QAC3C,YAAA,EAAc,CAAC,IAAA,EAAM,IAAA,EAAM,KAAA,KAAU;AACnC,UAAA,IAAA,CAAK,qBAAA,CAAsB,IAAA,EAAM,KAAA,GAAQ,EAAA,GAAK,MAAM,KAAK,CAAA;AACzD,UAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,QAC/C,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,IAAA,KAAS,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,QAC5C,OAAA,EAAS,CAAC,KAAA,KAAU,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,QACxC,UAAU,MAAM;AACd,UAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,UAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,QACzB;AAAA;AACF,KACD,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAoB,CAAA;AAAA,EAC5C;AAAA,EAEQ,aAAa,IAAA,EAA2B;AAC9C,IAAA,MAAM,EAAE,QAAQ,YAAA,EAAa,GAAI,KAAK,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AACtE,IAAA,IAAA,CAAK,IAAA,EAAM,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AAC7C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAA,CAAO,WAAW,MAAM;AACtB,QAAA,MAAA,CAAO,SAAS,IAAA,GAAO,YAAA;AAAA,MACzB,GAAG,iBAAiB,CAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA,IAAY,KAAK,UAAA,EAAY;AACxD,IAAA,IAAA,CAAK,UAAU,YAAY,CAAA;AAE3B,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA,CAAK,QAAQ,UAAA,EAAY,IAAA,CAAK,QAAQ,GAAG,CAAA;AAE9E,IAAA,IAAI;AAOF,MAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,MAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,MAAM,kBAAA;AAAA,QACjC,UAAA;AAAA,QACA,KAAK,OAAA,CAAQ,SAAA;AAAA,QACb,KAAK,OAAA,CAAQ,MAAA;AAAA,QACb;AAAA,OACF;AACA,MAAA,cAAA,CAAe,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,SAAA,EAAW,KAAK,CAAA;AACvD,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,KAAK,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GACJ,eAAe,cAAA,GAAiB,GAAA,CAAI,YAAY,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,oCAAA,EAAqC;AACnH,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA,IAAY,KAAK,UAAA,EAAY;AACxD,IAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC7D,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,qBAAA,CAAsB,IAAA,CAAK,QAAQ,SAAS,CAAA;AAE5C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,UAAU,YAAY,CAAA;AAC3B,IAAA,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,KAAA,EAAO,IAAI,CAAA;AAAA,EAC5C;AAAA,EAEQ,eAAA,CAAgB,OAAe,UAAA,EAA2B;AAChE,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAK,CAAA,EAAG,MAAM,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,IAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAC1G,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAU,SAAS,CAAA;AAClC,IAAA,EAAA,CAAG,UAAA,GAAa,aAAA;AAChB,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AAEV,IAAA,EAAA,CAAG,MAAA,GAAS,MAAM,KAAK,IAAA,CAAK,aAAa,UAAU,CAAA;AACnD,IAAA,EAAA,CAAG,SAAA,GAAY,CAAC,CAAA,KAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAC5C,IAAA,EAAA,CAAG,UAAU,MAAM;AACjB,MAAA,IAAA,CAAK,UAAU,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,yCAAyC,CAAA;AAAA,IACtF,CAAA;AACA,IAAA,EAAA,CAAG,OAAA,GAAU,CAAC,CAAA,KAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAc,aAAa,UAAA,EAAoC;AAC7D,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,EAAA,EAAI;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,eAAe,IAAI,YAAA,CAAa,EAAE,UAAA,EAAY,MAAQ,CAAA;AAC5D,MAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,MAAA,IAAI,YAAA,CAAa,UAAU,SAAA,EAAW;AACpC,QAAA,KAAK,aAAa,MAAA,EAAO;AACzB,QAAA,+BAAA,CAAgC,YAAY,CAAA;AAAA,MAC9C;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,YAAY,CAAA;AACxC,MAAA,IAAA,CAAK,GAAA,GAAM,MAAM,eAAA,CAAgB,YAAA,EAAc,CAAC,KAAA,EAAO,GAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,GAAG,CAAC,CAAA;AAC1F,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAS,kBAAA,EAAmB,EAAG,CAAC,CAAA;AAAA,MACtF;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,MAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAQN,MAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,MAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,MAAA,IAAI,cAAA,EAAgB;AAKlB,QAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,QAAA,KAAK,KAAK,YAAA,EAAa;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,UAAU,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,gDAAgD,CAAA;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,UAAA,CAAW,OAAoB,GAAA,EAAmB;AACxD,IAAA,IAAI,IAAA,CAAK,aAAa,CAAC,IAAA,CAAK,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAUzE,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAU,EAAG;AAC5B,MAAA,IAAI,MAAM,sBAAA,EAAwB;AAChC,QAAA,IAAA,CAAK,aAAA,EAAA;AACL,QAAA,IAAI,IAAA,CAAK,iBAAiB,wBAAA,EAA0B;AAClD,UAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,UAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,UAAA,IAAA,CAAK,EAAA,CAAG,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AAC/C,UAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,QAC5B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,KAAK,KAAK,CAAA;AAAA,EACpB;AAAA,EAEQ,gBAAgB,CAAA,EAAuB;AAC7C,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAChC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,6BAAA,EAA+B;AAClC,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,IAAI,KAAA,IAAS,KAAK,MAAA,EAAQ;AACxB,UAAA,IAAA,CAAK,UAAU,UAAU,CAAA;AACzB,UAAA,IAAA,CAAK,MAAA,CAAO,WAAW,KAAK,CAAA;AAAA,QAC9B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,mDAAA,EAAqD;AACxD,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,qBAAA,CAAsB,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAC/C,UAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAAA,QAClD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,uDAAA,EAAyD;AAC5D,QAAA,MAAM,aAAa,GAAA,CAAI,UAAA;AACvB,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,qBAAA,CAAsB,MAAA,EAAQ,EAAA,EAAI,IAAI,CAAA;AAC3C,UAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,MAAA,EAAQ,UAAA,EAAY,IAAI,CAAA;AAAA,QACtD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,wCAAA,EAA0C;AAC7C,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAChD,UAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAAA,QACnD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,uCAAA,EAAyC;AAC5C,QAAA,MAAM,aAAa,GAAA,CAAI,UAAA;AACvB,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,EAAA,EAAI,IAAI,CAAA;AAC5C,UAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,OAAA,EAAS,UAAA,EAAY,IAAI,CAAA;AAAA,QACvD;AACA,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,UAAA,EAAY,IAAA,CAAK,UAAU,WAAW,CAAA;AAC1D,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,eAAe,GAAiC,CAAA;AACrD,QAAA;AAAA,MACF,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,KAAA,EAAO,OAAA,IAAW,yBAAA,EAA2B,CAAA;AAChG,QAAA;AAAA,MACF;AAEE;AACJ,EACF;AAAA,EAEQ,WAAA,CACN,MACA,OAAA,EACqE;AACrE,IAAA,IAAI,OAAgC,EAAC;AACrC,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,IAAW,IAAI,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,EAAC;AAAA,IACV;AAEA,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,iBAAA,EAAmB;AACtB,QAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAC,CAAA;AAC/E,QAAA,aAAA,CAAc,KAAK,iBAAA,EAAmB,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,IAAI,QAAQ,CAAA;AAC7E,QAAA,OAAO,EAAE,MAAA,EAAO;AAAA,MAClB;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,QAAA,aAAA,CAAc,IAAA,CAAK,iBAAA,EAAmB,CAAA,0BAAA,CAAA,EAA8B,QAAQ,CAAA;AAC5E,QAAA,OAAO,EAAE,MAAA,EAAO;AAAA,MAClB;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,SAAS,QAAA,CAAY,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAC,CAAA;AACzD,QAAA,aAAA,CAAc,KAAK,iBAAA,EAAmB,CAAA,cAAA,EAAiB,IAAA,CAAK,WAAW,UAAK,QAAQ,CAAA;AACpF,QAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,OAAA,EAAS,MAAA,CAAO,OAAA,EAAQ,EAAG,YAAA,EAAc,MAAA,CAAO,IAAA,EAAK;AAAA,MACzF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AACjD,QAAA,MAAM,SAAA,GAAY,cAAc,WAAW,CAAA;AAC3C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAO;AAAA,YACL,QAAQ,EAAE,EAAA,EAAI,OAAO,OAAA,EAAS,CAAA,kCAAA,EAAqC,WAAW,CAAA,WAAA,CAAA;AAAc,WAC9F;AAAA,QACF;AACA,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,CAAA,4BAAA,EAA+B,UAAU,IAAI,CAAA;;AAAA,WAAA,CAAkB,CAAA;AAChG,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,CAAA,2BAAA,EAA8B,SAAA,CAAU,IAAI,CAAA,EAAA,CAAA,EAAK,EAAE;AAAA,QAC5F;AACA,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,SAAA,CAAU,EAAA,EAAI,UAAU,IAAI,CAAA;AACxD,QAAA,aAAA,CAAc,KAAK,iBAAA,EAAmB,CAAA,SAAA,EAAY,SAAA,CAAU,IAAI,IAAI,QAAQ,CAAA;AAC5E,QAAA,OAAO,EAAE,MAAA,EAAO;AAAA,MAClB;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,YAAY,IAAA,CAAK,SAAA,KAAc,SAAY,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,GAAI,MAAA;AAC1E,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA,KAAW,SAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA;AACjE,QAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,CAAW,SAAA,EAAW,MAAM,CAAA,EAAE;AAAA,MACjD;AAAA,MACA;AACE,QAAA,OAAO,EAAE,QAAQ,EAAE,EAAA,EAAI,OAAO,OAAA,EAAS,CAAA,cAAA,EAAiB,IAAI,CAAA,EAAA,CAAA,EAAK,EAAE;AAAA;AACvE,EACF;AAAA,EAEQ,eAAe,GAAA,EAA4B;AACjD,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,EAAE,QAAQ,YAAA,EAAa,GAAI,KAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAEzE,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,MACN,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,GAAG;AAAA,KAC9F;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAA,CAAO,WAAW,MAAM;AACtB,QAAA,MAAA,CAAO,SAAS,IAAA,GAAO,YAAA;AAAA,MACzB,GAAG,iBAAiB,CAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,EAAA,EAAI,KAAA,CAAM,oBAAA,EAAsB,cAAc,CAAA;AACnD,IAAA,qBAAA,CAAsB,IAAA,CAAK,QAAQ,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,kBAAkB,CAAA,EAAqB;AAC7C,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,KAAW,MAAA;AAClC,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,cAAA,EAAgB;AAQnC,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,KAAK,KAAK,YAAA,EAAa;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,GAAA,IAAQ,CAAA,CAAE,SAAS,IAAA,EAAM;AACtC,MAAA,IAAA,CAAK,QAAQ,OAAA,GAAU;AAAA,QACrB,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,EAAE,MAAA,IAAU;AAAA,OACtB,CAAA;AACD,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,yBAAyB,CAAA;AAClD,IAAA,IAAA,CAAK,WAAW,WAAA,GAAc,8BAAA;AAC9B,IAAA,MAAA,CAAO,WAAW,MAAM;AACtB,MAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,yBAAyB,CAAA;AACrD,MAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,QAAA,WAAA,CAAY,KAAK,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAAA,MAChE;AAAA,IACF,GAAG,GAAI,CAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,KAAK,IAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AACX,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,KAAK,IAAA,CAAK,aAAa,KAAA,EAAM;AAC7B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EAC5C;AAAA,EAEO,OAAA,GAAgB;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAC3D,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,MAAA,EAAO;AACjC,IAAA,IAAA,CAAK,MAAM,MAAA,EAAO;AAAA,EACpB;AACF","file":"chunk-CMHPVBEF.js","sourcesContent":["import type {\n DabaAgentMode,\n DabaAgentPosition,\n DabaCard,\n DabaCardKind,\n DabaCardMeta,\n DabaChatReply,\n DabaDirection,\n DabaError,\n DabaLauncherShape,\n DabaRemoteConfig,\n DabaThemePreference,\n} from \"../types\";\n\nexport class DabaFetchError extends Error {\n readonly dabaError: DabaError;\n constructor(dabaError: DabaError, cause?: unknown) {\n super(dabaError.message);\n this.dabaError = dabaError;\n this.cause = cause;\n }\n}\n\ninterface CreateAgentSessionResponse {\n session_id: string;\n ws_url: string;\n}\n\nfunction isDevEnvironment(): boolean {\n if (typeof window === \"undefined\") return false;\n const host = window.location.hostname;\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"[::1]\" ||\n host.endsWith(\".local\") ||\n host.endsWith(\".test\")\n );\n}\n\nfunction classifyError(status: number): DabaError[\"kind\"] {\n if (status === 401) return \"invalid_key\";\n if (status === 403) return \"origin_not_allowed\";\n if (status === 404) return \"not_found\";\n return \"network\";\n}\n\nfunction formatHttpError(status: number, serverMessage?: string): string {\n if (serverMessage && serverMessage !== \"Unauthorized\" && serverMessage !== \"Not Found\") {\n return serverMessage;\n }\n switch (status) {\n case 401:\n return isDevEnvironment()\n ? \"Invalid API key (401). Check your apiKey or data-api-key attribute.\"\n : \"Invalid API key. Please check your agent configuration.\";\n case 403:\n return isDevEnvironment()\n ? \"Origin not allowed for this API key (403). Verify allowed origins in dashboard.\"\n : \"Origin not allowed for this API key. Verify allowed origins in dashboard.\";\n case 404:\n return isDevEnvironment()\n ? \"Agent project not found (404). Check your projectId or data-project-id attribute.\"\n : \"Agent project not found. Please check your Project ID.\";\n default:\n return \"Assistant is temporarily unavailable. Please try again or contact support.\";\n }\n}\n\nfunction formatNetworkError(gatewayUrl: string): string {\n if (isDevEnvironment()) {\n return `Could not reach gateway at ${gatewayUrl}. Verify network connection and gateway URL.`;\n }\n return \"Assistant is temporarily unavailable. Please try again or contact support.\";\n}\n\nasync function parseOrThrow<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const body = await response.json().catch(() => ({ error: null }));\n const error: DabaError = {\n kind: classifyError(response.status),\n message: formatHttpError(response.status, body.error),\n };\n throw new DabaFetchError(error);\n }\n return (await response.json()) as T;\n}\n\n/**\n * The gateway's envelopes are read defensively rather than trusted as typed.\n *\n * They are filled server-side, but this bundle runs on sites we do not\n * control, behind caches and proxies, and is often older or newer than the\n * gateway answering it — so a key can arrive missing, null, or holding a\n * value this build predates. Every reader below is total: it answers with a\n * documented default instead of an `undefined` the rest of the widget would\n * have to guard, and an unrecognised enum resolves to that default rather\n * than travelling on into the DOM as a class name or a CSS colour.\n */\nfunction readRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\n/** Blank and whitespace-only strings are absent values, not values: an\n * `accent_color: \"\"` left behind by a cleared dashboard field must fall\n * back to the brand kit, not paint the panel with an invalid colour. */\nfunction readString(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed === \"\" ? null : trimmed;\n}\n\nfunction readEnum<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n const text = readString(value);\n return text !== null && (allowed as readonly string[]).includes(text) ? (text as T) : fallback;\n}\n\n/** For enums whose \"unset\" is itself meaningful — a null `position` means\n * the owner expressed no preference, which is what lets the embed's own\n * option stand. */\nfunction readEnumOrNull<T extends string>(value: unknown, allowed: readonly T[]): T | null {\n const text = readString(value);\n return text !== null && (allowed as readonly string[]).includes(text) ? (text as T) : null;\n}\n\n/** Accepts the JSON boolean the gateway sends, and the \"true\"/\"false\" a\n * proxy that round-trips the payload through form encoding hands back. */\nfunction readBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value === \"boolean\") return value;\n const text = readString(value)?.toLowerCase();\n if (text === \"true\") return true;\n if (text === \"false\") return false;\n return fallback;\n}\n\nfunction readStringList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const items: string[] = [];\n for (const entry of value) {\n const text = readString(entry);\n if (text !== null) items.push(text);\n }\n return items;\n}\n\nconst AGENT_MODES: readonly DabaAgentMode[] = [\"voice\", \"chat\", \"hybrid\"];\nconst LAUNCHER_SHAPES: readonly DabaLauncherShape[] = [\"rounded\", \"circle\", \"pill\"];\nconst AGENT_POSITIONS: readonly DabaAgentPosition[] = [\n \"bottom-right\",\n \"bottom-left\",\n \"top-right\",\n \"top-left\",\n];\nconst THEME_PREFERENCES: readonly DabaThemePreference[] = [\"auto\", \"light\", \"dark\"];\nconst DIRECTIONS: readonly DabaDirection[] = [\"auto\", \"ltr\", \"rtl\"];\nconst INTRO_MEDIA_TYPES = [\"video\", \"image\", \"none\"] as const;\n\n/**\n * Maps the snake_case envelope of `GET /v1/public/agents/:id` onto\n * `DabaRemoteConfig`.\n *\n * Total by construction, so the caller merges the result straight into its\n * own options and never null-guards the envelope. The leaf colour and label\n * fields stay nullable on purpose: `null` there means \"the owner set\n * nothing\", which is precisely what lets a widget option or the brand kit\n * win — substituting a default here would be indistinguishable from an\n * owner who deliberately picked that value.\n */\nfunction toRemoteConfig(projectId: string, payload: unknown): DabaRemoteConfig {\n const root = readRecord(payload);\n const appearance = readRecord(root.appearance);\n const intro = readRecord(root.intro);\n const locale = readRecord(root.locale);\n\n return {\n // Falling back to the id we asked for: whatever the response says, we\n // know which project this configuration belongs to.\n projectId: readString(root.project_id) ?? projectId,\n // \"\" rather than an invented name — the caller already owns the\n // fallback chain (the `title` option, then a localised default).\n title: readString(root.title) ?? \"\",\n greetingMessage: readString(root.greeting_message),\n // \"hybrid\" is the superset, so a mode this build does not recognise\n // still leaves the visitor a way to talk to the agent. Same reasoning\n // as the gateway's agent_project::normalize_mode.\n mode: readEnum(root.mode, AGENT_MODES, \"hybrid\"),\n appearance: {\n accentColor: readString(appearance.accent_color),\n accentContrast: readString(appearance.accent_contrast),\n surfaceColor: readString(appearance.surface_color),\n textColor: readString(appearance.text_color),\n radius: readString(appearance.radius),\n fontFamily: readString(appearance.font_family),\n logoUrl: readString(appearance.logo_url),\n launcherIconUrl: readString(appearance.launcher_icon_url),\n launcherLabel: readString(appearance.launcher_label),\n launcherShape: readEnum(appearance.launcher_shape, LAUNCHER_SHAPES, \"rounded\"),\n position: readEnumOrNull(appearance.position, AGENT_POSITIONS),\n theme: readEnum(appearance.theme, THEME_PREFERENCES, \"auto\"),\n },\n intro: {\n // Absent means on: the intro panel with its starter prompts is the\n // default experience, and the flag exists to switch it off.\n enabled: readBoolean(intro.enabled, true),\n headline: readString(intro.headline),\n subheadline: readString(intro.subheadline),\n mediaUrl: readString(intro.media_url),\n // A media type this build cannot name renders as nothing rather than\n // as a guessed <video> that may never load.\n mediaType: readEnum(intro.media_type, INTRO_MEDIA_TYPES, \"none\"),\n suggestedPrompts: readStringList(intro.suggested_prompts),\n },\n locale: {\n uiLanguage: readString(locale.ui_language) ?? \"auto\",\n direction: readEnum(locale.direction, DIRECTIONS, \"auto\"),\n },\n };\n}\n\n/**\n * The project's whole public configuration — mode, appearance, intro and\n * locale, not just its title.\n *\n * A partial or half-understood response still yields a complete\n * `DabaRemoteConfig` (see `toRemoteConfig`), so presentation never fails\n * closed on a missing key. Transport failures do still throw\n * `DabaFetchError`: a bad key or a blocked origin is a real fault the host\n * page should hear about, not something to paper over with defaults.\n */\nexport async function fetchAgentConfig(\n gatewayUrl: string,\n projectId: string,\n apiKey: string,\n): Promise<DabaRemoteConfig> {\n const cleanGateway = gatewayUrl.replace(/\\/+$/, \"\");\n const url = `${cleanGateway}/v1/public/agents/${encodeURIComponent(\n projectId,\n )}?key=${encodeURIComponent(apiKey)}`;\n\n let response: Response;\n try {\n response = await fetch(url, { method: \"GET\" });\n } catch (cause) {\n const error: DabaError = {\n kind: \"network\",\n message: formatNetworkError(cleanGateway),\n };\n throw new DabaFetchError(error, cause);\n }\n\n const data = await parseOrThrow<unknown>(response);\n return toRemoteConfig(projectId, data);\n}\n\nexport async function createAgentSession(\n gatewayUrl: string,\n projectId: string,\n apiKey: string,\n pageContext: string,\n): Promise<{ sessionId: string; wsUrl: string }> {\n const cleanGateway = gatewayUrl.replace(/\\/+$/, \"\");\n const url = `${cleanGateway}/v1/public/agents/${encodeURIComponent(\n projectId,\n )}/sessions?key=${encodeURIComponent(apiKey)}`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: `page_context=${encodeURIComponent(pageContext)}`,\n });\n } catch (cause) {\n const error: DabaError = {\n kind: \"network\",\n message: formatNetworkError(cleanGateway),\n };\n throw new DabaFetchError(error, cause);\n }\n\n const data = await parseOrThrow<CreateAgentSessionResponse>(response);\n return { sessionId: data.session_id, wsUrl: data.ws_url };\n}\n\ninterface CreateLiveSessionResponse {\n sdp: string;\n model: string;\n}\n\nexport async function createLiveSession(\n gatewayUrl: string,\n projectId: string,\n apiKey: string,\n pageContext: string,\n offerSdp: string,\n): Promise<{ sdp: string; model: string }> {\n const cleanGateway = gatewayUrl.replace(/\\/+$/, \"\");\n const url = `${cleanGateway}/v1/public/agents/${encodeURIComponent(\n projectId,\n )}/live-sessions?key=${encodeURIComponent(apiKey)}`;\n\n const body = new URLSearchParams({ page_context: pageContext, sdp: offerSdp });\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n } catch (cause) {\n const error: DabaError = {\n kind: \"network\",\n message: formatNetworkError(cleanGateway),\n };\n throw new DabaFetchError(error, cause);\n }\n\n const data = await parseOrThrow<CreateLiveSessionResponse>(response);\n return { sdp: data.sdp, model: data.model };\n}\n\nconst CARD_KINDS: readonly DabaCardKind[] = [\n \"article\",\n \"event\",\n \"news\",\n \"page\",\n \"contact\",\n \"action\",\n];\n\nfunction toCardMeta(value: unknown): DabaCardMeta[] {\n if (!Array.isArray(value)) return [];\n const meta: DabaCardMeta[] = [];\n for (const entry of value) {\n const row = readRecord(entry);\n const label = readString(row.label);\n const text = readString(row.value);\n if (label === null || text === null) continue;\n meta.push({ label, value: text });\n }\n return meta;\n}\n\n/**\n * Snake_case cards -> `DabaCard`, dropping what cannot be rendered.\n *\n * The gateway has already sanitised these (routes/public_agents.rs::\n * sanitize_cards is the anti-hallucination boundary, not this function).\n * What this pass buys is that a reply whose `cards` came back as a string,\n * an object, or a list of half-built rows still reaches the visitor as\n * text: a malformed array degrades to `[]` and an untitled card is\n * skipped, because a card with nothing to name it renders as a blank row.\n * Nothing here throws — losing the answer over a decoration would be the\n * worse failure.\n */\nfunction toCards(value: unknown): DabaCard[] {\n if (!Array.isArray(value)) return [];\n const cards: DabaCard[] = [];\n for (const entry of value) {\n const row = readRecord(entry);\n const title = readString(row.title);\n if (title === null) continue;\n cards.push({\n kind: readEnum(row.kind, CARD_KINDS, \"page\"),\n title,\n summary: readString(row.summary),\n date: readString(row.date),\n endDate: readString(row.end_date),\n locationName: readString(row.location_name),\n address: readString(row.address),\n mapUrl: readString(row.map_url),\n url: readString(row.url),\n imageUrl: readString(row.image_url),\n sourcePath: readString(row.source_path),\n meta: toCardMeta(row.meta),\n });\n }\n return cards;\n}\n\n/**\n * One text turn against the gateway. Plain HTTP: it never opens the\n * Realtime socket, never touches the AudioContext and never asks for the\n * microphone — that separation is the entire point of the chat path.\n *\n * The body is `application/x-www-form-urlencoded`, NOT JSON, for the same\n * reason the gateway's `create_agent_session` takes a `Form`: a JSON body\n * requires `Content-Type: application/json`, which makes this a CORS\n * \"non-simple\" request and triggers an OPTIONS preflight the widget router\n * has no route for. The preflight comes back 405 and the browser aborts\n * the real POST before it ever reaches the handler. None of that shows up\n * in Node tests or in curl, which send no preflight — anyone\n * \"modernising\" this to JSON breaks it silently, in browsers only.\n */\nexport async function sendChatTurn(\n gatewayUrl: string,\n projectId: string,\n apiKey: string,\n body: {\n message: string;\n conversationId: string;\n pageContext?: string;\n uiLanguage?: string;\n reset?: boolean;\n },\n): Promise<DabaChatReply> {\n const cleanGateway = gatewayUrl.replace(/\\/+$/, \"\");\n const url = `${cleanGateway}/v1/public/agents/${encodeURIComponent(\n projectId,\n )}/chat?key=${encodeURIComponent(apiKey)}`;\n\n const form = new URLSearchParams();\n form.set(\"message\", body.message);\n form.set(\"conversation_id\", body.conversationId);\n if (body.pageContext) form.set(\"page_context\", body.pageContext);\n if (body.uiLanguage) form.set(\"ui_language\", body.uiLanguage);\n if (body.reset) form.set(\"reset\", \"true\");\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: form,\n });\n } catch (cause) {\n const error: DabaError = {\n kind: \"network\",\n message: formatNetworkError(cleanGateway),\n };\n throw new DabaFetchError(error, cause);\n }\n\n const data = await parseOrThrow<unknown>(response);\n const row = readRecord(data);\n return {\n reply: readString(row.reply) ?? \"\",\n language: readString(row.language) ?? \"\",\n cards: toCards(row.cards),\n // Follow-ups are rendered as buttons; anything that is not a short\n // non-empty string is dropped rather than shown.\n suggestions: Array.isArray(row.suggestions)\n ? row.suggestions\n .filter((s): s is string => typeof s === \"string\" && s.trim().length > 0)\n .map((s) => s.trim().slice(0, 120))\n .slice(0, 4)\n : [],\n // The conversation id is widget-generated, so echoing ours back when\n // the reply omits it keeps the thread continuous instead of silently\n // starting a second one on the next turn.\n conversationId: readString(row.conversation_id) ?? body.conversationId,\n };\n}\n","import { createLiveSession } from \"../api/agent-api\";\nimport type { DabaAgentStatus, DabaError } from \"../types\";\n\nexport interface VoiceToolCall {\n callId: string;\n name: string;\n args: string;\n}\n\nexport interface VoiceTransportHandlers {\n onStatus(status: DabaAgentStatus): void;\n onTranscript(role: \"user\" | \"agent\", text: string, final: boolean): void;\n onToolCall(call: VoiceToolCall): void;\n onError(error: DabaError): void;\n onClosed(): void;\n}\n\nexport interface VoiceTransport {\n start(pageContext: string): Promise<void>;\n sendToolResult(callId: string, output: unknown): void;\n stop(): void;\n readonly isActive: boolean;\n}\n\nexport interface LiveTransportOptions {\n gatewayUrl: string;\n projectId: string;\n apiKey: string;\n handlers: VoiceTransportHandlers;\n}\n\nconst DATA_CHANNEL = \"oai-events\";\nconst ICE_TIMEOUT_MS = 2_000;\n\nexport class LiveTransport implements VoiceTransport {\n private pc: RTCPeerConnection | null = null;\n private channel: RTCDataChannel | null = null;\n private micStream: MediaStream | null = null;\n private audioEl: HTMLAudioElement | null = null;\n private stopped = false;\n\n constructor(private readonly options: LiveTransportOptions) {}\n\n get isActive(): boolean {\n return this.pc !== null && !this.stopped;\n }\n\n async start(pageContext: string): Promise<void> {\n if (this.pc) return;\n this.stopped = false;\n this.options.handlers.onStatus(\"connecting\");\n\n try {\n this.micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch {\n this.options.handlers.onError({\n kind: \"network\",\n message: \"Microphone access was denied or unavailable.\",\n });\n return;\n }\n\n const pc = new RTCPeerConnection();\n this.pc = pc;\n\n for (const track of this.micStream.getAudioTracks()) {\n pc.addTrack(track, this.micStream);\n }\n\n this.audioEl = document.createElement(\"audio\");\n this.audioEl.autoplay = true;\n pc.ontrack = (event) => {\n if (this.audioEl) this.audioEl.srcObject = event.streams[0] ?? null;\n };\n\n const channel = pc.createDataChannel(DATA_CHANNEL);\n this.channel = channel;\n channel.onmessage = (event) => this.onChannelMessage(event);\n channel.onopen = () => this.options.handlers.onStatus(\"listening\");\n\n pc.onconnectionstatechange = () => {\n if (pc.connectionState === \"failed\" || pc.connectionState === \"closed\") {\n this.teardown();\n this.options.handlers.onClosed();\n }\n };\n\n try {\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n await this.waitForIceGathering(pc);\n\n const { sdp } = await createLiveSession(\n this.options.gatewayUrl,\n this.options.projectId,\n this.options.apiKey,\n pageContext,\n pc.localDescription?.sdp ?? offer.sdp ?? \"\",\n );\n await pc.setRemoteDescription({ type: \"answer\", sdp });\n } catch (cause) {\n this.teardown();\n const error = cause as { dabaError?: DabaError };\n this.options.handlers.onError(\n error?.dabaError ?? { kind: \"network\", message: \"Failed to start the voice session.\" },\n );\n this.options.handlers.onClosed();\n }\n }\n\n sendToolResult(callId: string, output: unknown): void {\n if (!this.channel || this.channel.readyState !== \"open\") return;\n this.send({\n type: \"response.item.create\",\n item: {\n type: \"function_call_output\",\n call_id: callId,\n output: JSON.stringify(output),\n },\n });\n this.send({ type: \"response.create\" });\n }\n\n stop(): void {\n this.teardown();\n this.options.handlers.onClosed();\n }\n\n private send(payload: Record<string, unknown>): void {\n if (!this.channel || this.channel.readyState !== \"open\") return;\n this.channel.send(JSON.stringify(payload));\n }\n\n private waitForIceGathering(pc: RTCPeerConnection): Promise<void> {\n if (pc.iceGatheringState === \"complete\") return Promise.resolve();\n return new Promise((resolve) => {\n const done = () => {\n if (pc.iceGatheringState === \"complete\") {\n pc.removeEventListener(\"icegatheringstatechange\", done);\n resolve();\n }\n };\n pc.addEventListener(\"icegatheringstatechange\", done);\n window.setTimeout(() => {\n pc.removeEventListener(\"icegatheringstatechange\", done);\n resolve();\n }, ICE_TIMEOUT_MS);\n });\n }\n\n private onChannelMessage(event: MessageEvent): void {\n if (typeof event.data !== \"string\") return;\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(event.data);\n } catch {\n return;\n }\n\n const { handlers } = this.options;\n switch (msg.type) {\n case \"session.input_transcript.delta\":\n this.emitTranscript(\"user\", msg, false);\n break;\n case \"session.input_transcript.done\":\n this.emitTranscript(\"user\", msg, true);\n break;\n case \"session.output_transcript.delta\":\n handlers.onStatus(\"speaking\");\n this.emitTranscript(\"agent\", msg, false);\n break;\n case \"session.output_transcript.done\":\n this.emitTranscript(\"agent\", msg, true);\n handlers.onStatus(\"listening\");\n break;\n case \"response.output_item.done\":\n this.emitToolCall(msg);\n break;\n case \"error\": {\n const error = msg.error as { message?: string } | undefined;\n handlers.onError({\n kind: \"network\",\n message: error?.message ?? \"Voice session error.\",\n });\n break;\n }\n default:\n break;\n }\n }\n\n private emitTranscript(role: \"user\" | \"agent\", msg: Record<string, unknown>, final: boolean): void {\n const text = (msg.delta ?? msg.transcript ?? msg.text) as string | undefined;\n if (!text && !final) return;\n this.options.handlers.onTranscript(role, text ?? \"\", final);\n }\n\n private emitToolCall(msg: Record<string, unknown>): void {\n const item = msg.item as Record<string, unknown> | undefined;\n if (!item || item.type !== \"function_call\") return;\n const callId = item.call_id as string | undefined;\n const name = item.name as string | undefined;\n if (!callId || !name) return;\n this.options.handlers.onToolCall({\n callId,\n name,\n args: (item.arguments as string | undefined) ?? \"{}\",\n });\n }\n\n private teardown(): void {\n if (this.stopped) return;\n this.stopped = true;\n\n this.channel?.close();\n this.channel = null;\n\n this.micStream?.getTracks().forEach((track) => track.stop());\n this.micStream = null;\n\n if (this.audioEl) {\n this.audioEl.srcObject = null;\n this.audioEl = null;\n }\n\n this.pc?.close();\n this.pc = null;\n }\n}\n","/**\n * Which deployment tier this widget talks to.\n *\n * Production is the default in every direction: an embed that says\n * nothing about its environment is a customer's live site, and the one\n * outcome worth engineering against is a production page silently\n * pointing at staging. So the mapping is deliberately asymmetric —\n * \"staging\" must be asked for by name, and anything else resolves to\n * production.\n */\nexport type DabaEnvironment = \"production\" | \"staging\";\n\nconst GATEWAY_URLS: Record<DabaEnvironment, string> = {\n production: \"https://api.dabalabs.com\",\n staging: \"https://api-staging.dabalabs.com\",\n};\n\n/**\n * Resolve the gateway origin from the two ways a caller can express it.\n *\n * Precedence is explicit-over-implicit: an absolute `gatewayUrl` always\n * wins, because it is the only option that can name a host neither tier\n * covers (a self-hosted deployment, a branch preview, a local gateway).\n * `env` is the shorthand for the two hosts we run.\n *\n * An unrecognised `env` warns and falls back to production rather than\n * throwing: a typo like \"stagng\" must not take down a customer's page,\n * but it must also not quietly route live traffic somewhere unintended,\n * and the console is where an integrator will look.\n */\nexport function resolveGatewayUrl(gatewayUrl?: string, env?: string): string {\n if (gatewayUrl) return gatewayUrl;\n if (env === undefined || env === null || env === \"\") {\n return GATEWAY_URLS.production;\n }\n const normalised = String(env).trim().toLowerCase();\n if (normalised === \"staging\") return GATEWAY_URLS.staging;\n if (normalised !== \"production\") {\n console.warn(\n `[daba-agent] unknown env \"${env}\" — falling back to production. ` +\n `Use env: \"staging\" for the staging gateway, or pass an explicit gatewayUrl.`,\n );\n }\n return GATEWAY_URLS.production;\n}\n","const MAX_BODY_TEXT_CHARS = 4000;\nconst MAX_LINKS = 100;\nconst MAX_FIELDS = 30;\n\nconst IGNORE_ATTR = \"data-daba-agent-ignore\";\n\nexport function isPageRestricted(): boolean {\n if (typeof document === \"undefined\") return false;\n return (\n document.documentElement.hasAttribute(\"data-daba-agent-restricted\") ||\n document.querySelector('meta[name=\"daba-agent-restricted\"]') !== null\n );\n}\n\nfunction cleanText(s: string): string {\n return s.replace(/\\s+/g, \" \").trim();\n}\n\nconst SENSITIVE_ELEMENT_SELECTOR =\n '[data-daba-agent-ignore], input[type=\"password\"], input[type=\"hidden\"], ' +\n '[autocomplete=\"current-password\"], [autocomplete=\"new-password\"], ' +\n '[autocomplete^=\"cc-\"]';\n\nfunction isInsideIgnoredElement(el: Element): boolean {\n return el.closest(SENSITIVE_ELEMENT_SELECTOR) !== null;\n}\n\nconst SECRET_PATTERNS: RegExp[] = [\n /\\bdpk_live_[A-Za-z0-9_-]{10,}/g,\n /\\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{10,}/g,\n /\\bsk-[A-Za-z0-9]{10,}/g,\n /\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n /\\b\\d[\\d -]{11,22}\\d\\b/g,\n];\n\nfunction redactSecrets(text: string): string {\n let out = text;\n for (const pattern of SECRET_PATTERNS) {\n out = out.replace(pattern, \"[redacted]\");\n }\n return out;\n}\n\nfunction extractVisibleText(): string {\n const body = document.body;\n if (!body) return \"\";\n const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent) return NodeFilter.FILTER_REJECT;\n const tag = parent.tagName;\n if (tag === \"SCRIPT\" || tag === \"STYLE\" || tag === \"NOSCRIPT\") {\n return NodeFilter.FILTER_REJECT;\n }\n if (isInsideIgnoredElement(parent)) {\n return NodeFilter.FILTER_REJECT;\n }\n const style = window.getComputedStyle(parent);\n if (style.display === \"none\" || style.visibility === \"hidden\") {\n return NodeFilter.FILTER_REJECT;\n }\n return node.textContent && node.textContent.trim() ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n },\n });\n\n const chunks: string[] = [];\n let total = 0;\n while (walker.nextNode()) {\n const text = cleanText(walker.currentNode.textContent ?? \"\");\n if (!text) continue;\n chunks.push(text);\n total += text.length;\n if (total >= MAX_BODY_TEXT_CHARS) break;\n }\n return redactSecrets(chunks.join(\" \")).slice(0, MAX_BODY_TEXT_CHARS);\n}\n\nfunction extractLinks(): string[] {\n const anchors = Array.from(document.querySelectorAll<HTMLAnchorElement>(\"a[href]\"));\n const seen = new Set<string>();\n const contentLinks: string[] = [];\n const chromeLinks: string[] = [];\n for (const a of anchors) {\n if (isInsideIgnoredElement(a)) continue;\n const text = cleanText(a.textContent ?? \"\");\n const href = a.getAttribute(\"href\") ?? \"\";\n if (!text || !href || href.startsWith(\"#\") || href.startsWith(\"javascript:\")) continue;\n const key = `${text}|${href}`;\n if (seen.has(key)) continue;\n seen.add(key);\n const entry = `\"${text}\" -> ${href}`;\n // nav/header/footer chrome repeats on every page and almost never\n // names a specific item a visitor asks about by name (e.g. one\n // article out of many in a content grid) — it comes first in DOM\n // order on most sites, so without this a large grid's later items\n // fall off the MAX_LINKS cap before the model ever sees them, and\n // it has no way to navigate/scroll to something it was never told\n // exists. Main-content links get priority within the cap instead.\n if (a.closest(\"nav, header, footer\")) {\n chromeLinks.push(entry);\n } else {\n contentLinks.push(entry);\n }\n }\n return [...contentLinks, ...chromeLinks].slice(0, MAX_LINKS);\n}\n\nfunction cssEscape(id: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(id);\n }\n return id.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n\nfunction labelForField(el: HTMLElement): string {\n const id = el.getAttribute(\"id\");\n if (id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${cssEscape(id)}\"]`);\n if (label && label.textContent) return cleanText(label.textContent);\n }\n const closestLabel = el.closest(\"label\");\n if (closestLabel && closestLabel.textContent) return cleanText(closestLabel.textContent);\n const ariaLabel = el.getAttribute(\"aria-label\");\n if (ariaLabel) return cleanText(ariaLabel);\n const placeholder = el.getAttribute(\"placeholder\");\n if (placeholder) return cleanText(placeholder);\n const name = el.getAttribute(\"name\");\n if (name) return name;\n return \"\";\n}\n\nfunction extractFormFields(): string[] {\n const fields = Array.from(\n document.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\n \"form input, form textarea, form select\",\n ),\n );\n const out: string[] = [];\n for (const field of fields) {\n if (isInsideIgnoredElement(field)) continue;\n const type = (field as HTMLInputElement).type ?? field.tagName.toLowerCase();\n if (type === \"hidden\" || type === \"submit\" || type === \"button\") continue;\n const label = labelForField(field);\n if (!label) continue;\n out.push(`${label} (${type})`);\n if (out.length >= MAX_FIELDS) break;\n }\n return out;\n}\n\nexport function extractPageContext(): string {\n const parts: string[] = [];\n parts.push(`Page title: ${document.title || \"(untitled)\"}`);\n parts.push(`URL: ${window.location.href}`);\n\n const bodyText = extractVisibleText();\n if (bodyText) parts.push(`Visible text: ${bodyText}`);\n\n const links = extractLinks();\n if (links.length > 0) parts.push(`Links on this page:\\n${links.join(\"\\n\")}`);\n\n const fields = extractFormFields();\n if (fields.length > 0) {\n parts.push(\n `Form fields on this page (use fill_form_field with the exact label text shown here):\\n${fields.join(\"\\n\")}`,\n );\n }\n\n return parts.join(\"\\n\\n\");\n}\n","function cleanText(s: string): string {\n return s.replace(/\\s+/g, \" \").trim();\n}\n\nfunction cssEscape(id: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(id);\n }\n return id.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n\nfunction labelForField(el: HTMLElement): string {\n const id = el.getAttribute(\"id\");\n if (id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${cssEscape(id)}\"]`);\n if (label && label.textContent) return cleanText(label.textContent);\n }\n const closestLabel = el.closest(\"label\");\n if (closestLabel && closestLabel.textContent) return cleanText(closestLabel.textContent);\n const ariaLabel = el.getAttribute(\"aria-label\");\n if (ariaLabel) return cleanText(ariaLabel);\n const placeholder = el.getAttribute(\"placeholder\");\n if (placeholder) return cleanText(placeholder);\n const name = el.getAttribute(\"name\");\n if (name) return name;\n return \"\";\n}\n\nfunction isSensitiveField(el: HTMLElement): boolean {\n if (el.hasAttribute(\"data-daba-agent-ignore\") || el.closest(\"[data-daba-agent-ignore]\")) return true;\n if (el instanceof HTMLInputElement) {\n const type = el.type.toLowerCase();\n if (type === \"password\" || type === \"hidden\") return true;\n\n const autocomplete = (el.getAttribute(\"autocomplete\") ?? \"\").toLowerCase();\n if (\n autocomplete === \"current-password\" ||\n autocomplete === \"new-password\" ||\n autocomplete.startsWith(\"cc-\")\n ) {\n return true;\n }\n }\n\n const label = labelForField(el).toLowerCase();\n const sensitiveKeywords = [\n \"password\",\n \"passcode\",\n \"pin\",\n \"credit card\",\n \"card number\",\n \"cvv\",\n \"cvc\",\n \"security code\",\n \"ssn\",\n \"social security\",\n ];\n return sensitiveKeywords.some((kw) => label.includes(kw));\n}\n\nfunction findTargetField(labelQuery: string): HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null {\n const query = labelQuery.toLowerCase().trim();\n if (!query) return null;\n\n const candidates = Array.from(\n document.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\n \"input, textarea, select\",\n ),\n );\n\n let bestExactMatch: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n let bestPartialMatch: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n\n for (const el of candidates) {\n if (isSensitiveField(el)) continue;\n\n const label = labelForField(el).toLowerCase();\n if (!label) continue;\n\n if (label === query) {\n bestExactMatch = el;\n break;\n }\n\n if (!bestPartialMatch && (label.includes(query) || query.includes(label))) {\n bestPartialMatch = el;\n }\n }\n\n return bestExactMatch ?? bestPartialMatch;\n}\n\nexport function fillFormField(labelQuery: string, value: string): { ok: boolean; message: string } {\n const field = findTargetField(labelQuery);\n if (!field) {\n return { ok: false, message: `Could not find form field matching \"${labelQuery}\".` };\n }\n\n if (isSensitiveField(field)) {\n return { ok: false, message: `Field matching \"${labelQuery}\" is restricted for security.` };\n }\n\n if (field instanceof HTMLSelectElement) {\n const valLower = value.toLowerCase().trim();\n let match = Array.from(field.options).find(\n (opt) => opt.value.toLowerCase() === valLower || opt.text.toLowerCase().trim() === valLower,\n );\n\n if (!match) {\n match = Array.from(field.options).find(\n (opt) => opt.text.toLowerCase().includes(valLower) || valLower.includes(opt.text.toLowerCase()),\n );\n }\n\n if (!match) {\n return { ok: false, message: `No matching option in select field for \"${value}\".` };\n }\n\n field.value = match.value;\n } else {\n field.value = value;\n }\n\n field.dispatchEvent(new Event(\"input\", { bubbles: true }));\n field.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n const fieldLabel = labelForField(field) || labelQuery;\n return { ok: true, message: `Filled field \"${fieldLabel}\" with \"${value}\".` };\n}\n\nexport function submitForm(): { ok: boolean; message: string } {\n const form = document.querySelector<HTMLFormElement>(\"form\");\n if (!form) {\n return { ok: false, message: \"No form found on the page to submit.\" };\n }\n\n const submitBtn = form.querySelector<HTMLButtonElement | HTMLInputElement>(\n 'button[type=\"submit\"], input[type=\"submit\"]',\n );\n\n if (submitBtn) {\n submitBtn.click();\n return { ok: true, message: \"Form submitted via submit button.\" };\n }\n\n if (typeof form.requestSubmit === \"function\") {\n form.requestSubmit();\n return { ok: true, message: \"Form submitted via requestSubmit().\" };\n }\n\n form.submit();\n return { ok: true, message: \"Form submitted.\" };\n}\n\n// Deliberately not \"delete account\" wired up to click_element at all — a\n// misheard or misfired voice command must never be able to trigger a\n// destructive/irreversible action, confirm dialog or not. Kept separate\n// from findTargetField's sensitiveKeywords (that list is about *data*\n// exposure; this one is about consequence).\nconst DANGEROUS_ACTION_KEYWORDS = [\n \"delete\",\n \"remove account\",\n \"close account\",\n \"log out\",\n \"sign out\",\n \"cancel subscription\",\n \"cancel order\",\n \"unsubscribe\",\n \"deactivate\",\n];\n\nconst CLICKABLE_SELECTOR =\n 'button, [role=\"button\"], input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"], label';\n\nfunction isIgnoredForClick(el: Element): boolean {\n return el.hasAttribute(\"data-daba-agent-ignore\") || el.closest(\"[data-daba-agent-ignore]\") !== null;\n}\n\n// Storefronts almost never render size/color swatches as real <button>s —\n// the common pattern is a visually-hidden radio/checkbox input plus a\n// styled <label> that carries the visible text (clicking the label is\n// what actually toggles the input, same as a real visitor would). A plain\n// `label` selector would also match ordinary form-field labels (e.g. an\n// \"Email address\" label for a text input) that fillFormField already\n// owns — scope this to labels genuinely wired to a radio/checkbox only.\nfunction swatchInputFor(label: HTMLLabelElement): HTMLInputElement | null {\n const forId = label.htmlFor;\n const target = forId ? document.getElementById(forId) : label.querySelector(\"input\");\n if (target instanceof HTMLInputElement && (target.type === \"radio\" || target.type === \"checkbox\")) {\n return target;\n }\n return null;\n}\n\nfunction visibleButtonText(el: Element): string {\n const aria = el.getAttribute(\"aria-label\");\n if (aria && aria.trim()) return cleanText(aria);\n if (el instanceof HTMLInputElement) return cleanText(el.value || el.getAttribute(\"value\") || \"\");\n return cleanText(el.textContent ?? \"\");\n}\n\n// Finds a clickable candidate WITHOUT clicking it — agent.ts uses this to\n// show a confirm prompt (the actual click only fires after the visitor's\n// own explicit confirmation, never from voice alone) before calling\n// clickElement() below. Queries the live DOM at call time, same as\n// navigate()/submitForm() above — deliberately scoped to semantic\n// button-like elements (plus radio/checkbox swatch labels, see\n// swatchInputFor) rather than arbitrary divs/spans with a click handler,\n// which is what keeps a live query safe here.\nexport function findClickable(description: string): { el: HTMLElement; text: string } | null {\n const query = description.toLowerCase().trim();\n if (!query) return null;\n\n const candidates = Array.from(document.querySelectorAll<HTMLElement>(CLICKABLE_SELECTOR)).filter((el) => {\n if (isIgnoredForClick(el)) return false;\n if (el instanceof HTMLLabelElement) return swatchInputFor(el) !== null;\n return true;\n });\n\n let bestExact: HTMLElement | null = null;\n let bestPartial: HTMLElement | null = null;\n for (const el of candidates) {\n const text = visibleButtonText(el).toLowerCase();\n if (!text) continue;\n if (text === query) {\n bestExact = el;\n break;\n }\n if (!bestPartial && (text.includes(query) || query.includes(text))) {\n bestPartial = el;\n }\n }\n\n const match = bestExact ?? bestPartial;\n if (!match) return null;\n return { el: match, text: visibleButtonText(match) };\n}\n\nexport function isDangerousAction(text: string): boolean {\n const lower = text.toLowerCase();\n return DANGEROUS_ACTION_KEYWORDS.some((kw) => lower.includes(kw));\n}\n\n// Performs the actual click — call only after the visitor has explicitly\n// confirmed (see agent.ts's handleToolCall). Re-checks isDangerousAction\n// itself rather than trusting the caller, since this is the one function\n// that actually mutates the page.\nexport function clickElement(el: HTMLElement, text: string): { ok: boolean; message: string } {\n if (isDangerousAction(text)) {\n return { ok: false, message: `Refusing to click \"${text}\" — this looks like a destructive action.` };\n }\n el.click();\n return { ok: true, message: `Clicked \"${text}\".` };\n}\n\nexport function navigate(destination: string): { ok: boolean; message: string; href?: string } {\n const dest = destination.trim();\n if (!dest) return { ok: false, message: \"No destination provided.\" };\n\n let targetUrl: URL;\n try {\n targetUrl = new URL(dest, window.location.href);\n } catch {\n return { ok: false, message: `Invalid destination URL: ${destination}` };\n }\n\n if (targetUrl.origin !== window.location.origin) {\n return { ok: false, message: `Navigation to external origin \"${targetUrl.origin}\" is restricted.` };\n }\n\n const normalizedTarget = targetUrl.pathname + targetUrl.search + targetUrl.hash;\n const links = Array.from(document.querySelectorAll<HTMLAnchorElement>(\"a[href]\"));\n\n const isIgnored = (a: HTMLElement): boolean =>\n a.hasAttribute(\"data-daba-agent-ignore\") || a.closest(\"[data-daba-agent-ignore]\") !== null;\n\n let matchedLink = links.find((a) => {\n if (isIgnored(a)) return false;\n const rawHref = a.getAttribute(\"href\") ?? \"\";\n if (rawHref.startsWith(\"#\") || rawHref.startsWith(\"javascript:\")) return false;\n try {\n const u = new URL(a.href, window.location.href);\n return u.pathname + u.search + u.hash === normalizedTarget;\n } catch {\n return false;\n }\n });\n\n if (!matchedLink) {\n const destLower = dest.toLowerCase();\n matchedLink = links.find((a) => {\n if (isIgnored(a)) return false;\n const rawHref = a.getAttribute(\"href\") ?? \"\";\n if (rawHref.startsWith(\"#\") || rawHref.startsWith(\"javascript:\")) return false;\n return (a.textContent ?? \"\").toLowerCase().trim().includes(destLower);\n });\n }\n\n if (!matchedLink) {\n return { ok: false, message: `No link matching destination \"${destination}\" found on page.` };\n }\n\n return { ok: true, message: `Navigating to ${matchedLink.href}…`, href: matchedLink.href };\n}\n\n// Resolves a \"scroll to X\" target against the same on-page anchors a real\n// visitor would use: in-page nav links (href=\"#...\") first since that's\n// the site's own idea of what that section is called, then headings by\n// visible text, then a direct id match on a slugified query as a last\n// resort for a section with no nav link and a non-matching heading.\nfunction slugify(s: string): string {\n return s\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n}\n\nfunction findScrollTarget(target: string): HTMLElement | null {\n const query = target.toLowerCase().trim();\n if (!query) return null;\n\n const anchorLinks = Array.from(document.querySelectorAll<HTMLAnchorElement>('a[href^=\"#\"]'));\n for (const a of anchorLinks) {\n const text = cleanText(a.textContent ?? \"\").toLowerCase();\n if (!text) continue;\n if (text === query || text.includes(query) || query.includes(text)) {\n const id = (a.getAttribute(\"href\") ?? \"\").slice(1);\n const el = id ? document.getElementById(id) : null;\n if (el) return el;\n }\n }\n\n const headings = Array.from(document.querySelectorAll<HTMLElement>(\"h1, h2, h3, h4, h5, h6\"));\n let bestPartial: HTMLElement | null = null;\n for (const h of headings) {\n const text = cleanText(h.textContent ?? \"\").toLowerCase();\n if (!text) continue;\n if (text === query) return h;\n if (!bestPartial && (text.includes(query) || query.includes(text))) bestPartial = h;\n }\n if (bestPartial) return bestPartial;\n\n return document.getElementById(slugify(query));\n}\n\ntype Scrollable = Window | HTMLElement;\n\nfunction isScrollable(el: HTMLElement): boolean {\n const overflowY = window.getComputedStyle(el).overflowY;\n return (overflowY === \"auto\" || overflowY === \"scroll\") && el.scrollHeight > el.clientHeight + 1;\n}\n\n// Most sites let document/window scroll normally, but a real, common\n// pattern in fixed-height SPA shells (dashboards, some Next.js apps) puts\n// all scrollable content inside a nested `overflow-y: auto` container\n// instead — in that case window.scrollBy()/scrollTo() are silent no-ops:\n// they report success but nothing visibly moves, which is exactly the\n// \"scroll_page says ok but nothing happens\" bug this was built to fix.\n// Only runs the DOM-wide scan when the document itself genuinely isn't\n// scrollable, so the common case stays cheap.\nfunction findScrollContainer(): Scrollable {\n const root = (document.scrollingElement ?? document.documentElement) as HTMLElement;\n if (root.scrollHeight > root.clientHeight + 1) {\n return window;\n }\n const candidates = Array.from(document.querySelectorAll<HTMLElement>(\"*\")).filter(isScrollable);\n if (candidates.length === 0) return window;\n return candidates.reduce((largest, el) => (el.clientHeight > largest.clientHeight ? el : largest));\n}\n\nfunction scrollableHeight(target: Scrollable): number {\n return target === window ? window.innerHeight : (target as HTMLElement).clientHeight;\n}\n\nfunction scrollableScrollHeight(target: Scrollable): number {\n return target === window ? document.documentElement.scrollHeight : (target as HTMLElement).scrollHeight;\n}\n\nfunction doScrollBy(target: Scrollable, top: number): void {\n if (target === window) {\n window.scrollBy({ top, behavior: \"smooth\" });\n } else {\n (target as HTMLElement).scrollBy({ top, behavior: \"smooth\" });\n }\n}\n\nfunction doScrollTo(target: Scrollable, top: number): void {\n if (target === window) {\n window.scrollTo({ top, behavior: \"smooth\" });\n } else {\n (target as HTMLElement).scrollTo({ top, behavior: \"smooth\" });\n }\n}\n\nexport function scrollPage(direction?: string, target?: string): { ok: boolean; message: string } {\n const wantedTarget = (target ?? \"\").trim();\n if (wantedTarget) {\n const el = findScrollTarget(wantedTarget);\n if (!el) {\n return { ok: false, message: `Could not find a section matching \"${wantedTarget}\" to scroll to.` };\n }\n // scrollIntoView() walks up the real ancestor chain to find whichever\n // element actually scrolls, unlike scrollBy/scrollTo below — no\n // container detection needed here.\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n return { ok: true, message: `Scrolled to \"${wantedTarget}\".` };\n }\n\n const container = findScrollContainer();\n const viewportHeight = scrollableHeight(container);\n\n switch ((direction ?? \"\").toLowerCase()) {\n case \"top\":\n doScrollTo(container, 0);\n return { ok: true, message: \"Scrolled to the top of the page.\" };\n case \"bottom\":\n doScrollTo(container, scrollableScrollHeight(container));\n return { ok: true, message: \"Scrolled to the bottom of the page.\" };\n case \"up\":\n doScrollBy(container, -Math.round(viewportHeight * 0.85));\n return { ok: true, message: \"Scrolled up.\" };\n case \"down\":\n doScrollBy(container, Math.round(viewportHeight * 0.85));\n return { ok: true, message: \"Scrolled down.\" };\n default:\n return { ok: false, message: `No scroll direction or target provided.` };\n }\n}\n","export interface MicCaptureHandle {\n stop: () => void;\n}\n\nexport function computeRms(pcm16: Int16Array): number {\n if (pcm16.length === 0) return 0;\n let sum = 0;\n for (let i = 0; i < pcm16.length; i++) {\n const val = pcm16[i] / 32768;\n sum += val * val;\n }\n return Math.sqrt(sum / pcm16.length);\n}\n\nexport async function startMicCapture(\n audioContext: AudioContext,\n onFrame: (pcm16: ArrayBuffer, rms: number) => void,\n): Promise<MicCaptureHandle> {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n channelCount: 1,\n sampleRate: 24_000,\n echoCancellation: true,\n noiseSuppression: true,\n },\n });\n\n const source = audioContext.createMediaStreamSource(stream);\n const processor = audioContext.createScriptProcessor(4096, 1, 1);\n\n processor.onaudioprocess = (e) => {\n const input = e.inputBuffer.getChannelData(0);\n const pcm16 = new Int16Array(input.length);\n for (let i = 0; i < input.length; i++) {\n const s = Math.max(-1, Math.min(1, input[i]));\n pcm16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n const rms = computeRms(pcm16);\n onFrame(pcm16.buffer, rms);\n };\n\n source.connect(processor);\n processor.connect(audioContext.destination);\n\n return {\n stop: () => {\n processor.disconnect();\n source.disconnect();\n stream.getTracks().forEach((t) => t.stop());\n },\n };\n}\n\nexport class PcmPlayer {\n private readonly ctx: AudioContext;\n private nextStartTime = 0;\n private currentSources: AudioBufferSourceNode[] = [];\n\n constructor(ctx: AudioContext) {\n this.ctx = ctx;\n }\n\n public pushBase64(base64Pcm16: string): void {\n const binary = atob(base64Pcm16);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n const samples = new Int16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);\n const float32 = new Float32Array(samples.length);\n for (let i = 0; i < samples.length; i++) {\n float32[i] = samples[i] / (samples[i] < 0 ? 0x8000 : 0x7fff);\n }\n\n const buffer = this.ctx.createBuffer(1, float32.length, 24_000);\n buffer.getChannelData(0).set(float32);\n\n const source = this.ctx.createBufferSource();\n source.buffer = buffer;\n source.connect(this.ctx.destination);\n\n const now = this.ctx.currentTime;\n if (this.nextStartTime < now) {\n this.nextStartTime = now;\n }\n\n source.start(this.nextStartTime);\n this.nextStartTime += buffer.duration;\n this.currentSources.push(source);\n\n source.onended = () => {\n const idx = this.currentSources.indexOf(source);\n if (idx !== -1) this.currentSources.splice(idx, 1);\n };\n }\n\n // Whether any scheduled audio chunk is still audible right now. Chunks\n // are scheduled ahead of `ctx.currentTime` (see `nextStartTime` above),\n // so this can stay true for a couple of seconds after the last delta\n // arrived — that's the actual audible state, which is what barge-in\n // detection needs, not a proxy for it.\n public isPlaying(): boolean {\n return this.currentSources.length > 0;\n }\n\n public clear(): void {\n for (const src of this.currentSources) {\n try {\n src.stop();\n } catch {\n // Source already stopped\n }\n }\n this.currentSources = [];\n this.nextStartTime = 0;\n }\n}\n","const SESSION_KEY_PREFIX = \"daba-agent:reattach:\";\nconst MAX_REATTACH_WINDOW_MS = 30 * 1000;\n\ninterface PersistedSession {\n sessionId: string;\n wsUrl: string;\n timestamp?: number;\n ts?: number;\n}\n\nexport function persistSession(projectId: string, sessionId: string, wsUrl: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n const payload: PersistedSession = {\n sessionId,\n wsUrl,\n timestamp: Date.now(),\n ts: Date.now(),\n };\n try {\n sessionStorage.setItem(SESSION_KEY_PREFIX + projectId, JSON.stringify(payload));\n } catch {\n // SessionStorage quota or disabled\n }\n}\n\nexport function readPersistedSession(projectId: string): PersistedSession | null {\n if (typeof sessionStorage === \"undefined\") return null;\n try {\n const raw = sessionStorage.getItem(SESSION_KEY_PREFIX + projectId);\n if (!raw) return null;\n const payload = JSON.parse(raw) as PersistedSession;\n const ts = payload.ts ?? payload.timestamp ?? 0;\n if (Date.now() - ts > MAX_REATTACH_WINDOW_MS) {\n clearPersistedSession(projectId);\n return null;\n }\n return payload;\n } catch {\n return null;\n }\n}\n\nexport function clearPersistedSession(projectId: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n try {\n sessionStorage.removeItem(SESSION_KEY_PREFIX + projectId);\n } catch {\n // SessionStorage disabled\n }\n}\n\n/**\n * The visible transcript, so a reload or a navigation does not wipe it.\n *\n * The gateway already keeps the thread — it is keyed on the conversation id\n * the widget persists — so after a navigate() the model still remembers\n * the last four turns while the panel showed a blank intro. That is worse\n * than either forgetting or remembering: the visitor is being answered in\n * a context they cannot see. Storing what was rendered closes the gap.\n *\n * sessionStorage on purpose: a conversation is a visit, not an identity.\n * Keyed by conversation id as well as project, so a thread reset (new id)\n * naturally orphans the old transcript rather than needing to delete it.\n * Bounded twice — by message count and by serialized size — because a\n * long thread full of cards could otherwise blow the storage quota, and\n * the failure mode of an over-quota setItem is an exception mid-turn.\n */\nconst TRANSCRIPT_KEY_PREFIX = \"daba-agent:transcript:\";\nconst MAX_TRANSCRIPT_MESSAGES = 40;\nconst MAX_TRANSCRIPT_BYTES = 96 * 1024;\n\nexport interface PersistedMessage {\n role: \"user\" | \"agent\" | \"system\";\n text: string;\n cards?: unknown[];\n suggestions?: unknown[];\n lang?: string;\n ts: number;\n}\n\nfunction transcriptKey(projectId: string, conversationId: string): string {\n return `${TRANSCRIPT_KEY_PREFIX}${projectId}:${conversationId}`;\n}\n\nexport function persistTranscript(\n projectId: string,\n conversationId: string,\n messages: PersistedMessage[],\n): void {\n if (typeof sessionStorage === \"undefined\") return;\n let slice = messages.slice(-MAX_TRANSCRIPT_MESSAGES);\n try {\n let raw = JSON.stringify(slice);\n // Drop from the front until it fits — the oldest turns are the ones a\n // visitor is least likely to scroll back to.\n while (raw.length > MAX_TRANSCRIPT_BYTES && slice.length > 1) {\n slice = slice.slice(1);\n raw = JSON.stringify(slice);\n }\n sessionStorage.setItem(transcriptKey(projectId, conversationId), raw);\n } catch {\n // quota or disabled storage — the live panel is unaffected\n }\n}\n\nexport function readTranscript(projectId: string, conversationId: string): PersistedMessage[] {\n if (typeof sessionStorage === \"undefined\") return [];\n try {\n const raw = sessionStorage.getItem(transcriptKey(projectId, conversationId));\n if (!raw) return [];\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (m): m is PersistedMessage =>\n !!m &&\n typeof m === \"object\" &&\n typeof (m as PersistedMessage).text === \"string\" &&\n [\"user\", \"agent\", \"system\"].includes((m as PersistedMessage).role),\n );\n } catch {\n return [];\n }\n}\n\nexport function clearTranscript(projectId: string, conversationId: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n try {\n sessionStorage.removeItem(transcriptKey(projectId, conversationId));\n } catch {\n // disabled storage\n }\n}\n","/**\n * The widget's entire visual system, injected once as a single <style>.\n *\n * Three constraints shaped every decision in this file:\n *\n * 1. It lands in a STRANGER'S page. Their reset (`* { margin: 0 }`), their\n * `button { background: #333 }`, their `svg { fill: currentColor }` all\n * apply to our nodes too, and they may load after us. So the sheet opens\n * with a hardened reset whose specificity is engineered (see the comment\n * on the `:where()` reset) to outrank a host's element selectors while\n * still losing to our own component rules.\n * 2. It stays in the LIGHT DOM. A shadow root would isolate us for free, but\n * the public embed contract and the test suite both query `.daba-agent-*`\n * off `document`, so isolation has to be earned with CSS instead.\n * 3. Everything is a token. No rule below the token block names a colour, a\n * radius or a font directly, which is what reduces \"make this widget look\n * like our brand\" to setting four custom properties at runtime — see\n * `applyThemeTokens`.\n */\n\nconst STYLE_ELEMENT_ID = \"daba-agent-styles\";\n\n/*\n * THE TOKEN NAMES, without their `--daba-agent-` prefix. These are what\n * `applyThemeTokens` understands and the complete surface a host or the\n * remote config may repaint:\n *\n * accent brand colour: buttons, user bubbles, focus rings\n * accent-contrast ink drawn ON the accent (a pale accent needs dark ink)\n * accent-soft the tinted ground: chips, hovers, system bubbles\n * surface the panel's own background\n * surface-raised header, composer and card grounds\n * text primary ink\n * muted secondary ink\n * border hairlines\n * radius base corner radius; every other radius derives from it\n * shadow the panel/launcher elevation\n * font font stack for the whole widget\n *\n * Everything else in the token block is derived from these, so setting just\n * `accent` recolours hovers, rings, waveforms and card accents with it.\n */\n\n/** camelCase spellings of the tokens above. `DabaTheme` and the camelised\n * `appearance` block off the remote config both use these names, so either\n * object can be handed to `applyThemeTokens` as-is rather than being\n * transcribed at every call site. */\nconst TOKEN_ALIASES: Record<string, string> = {\n accentColor: \"accent\",\n accentContrast: \"accent-contrast\",\n accentSoft: \"accent-soft\",\n surfaceColor: \"surface\",\n surfaceRaised: \"surface-raised\",\n textColor: \"text\",\n mutedColor: \"muted\",\n borderColor: \"border\",\n fontFamily: \"font\",\n};\n\n/** Every token the sheet actually reads. `appearance` also carries logoUrl,\n * launcherShape, position and theme — structure, not colour, handled by the\n * elements themselves — so the write is gated on this set rather than\n * turning a config object into a drawer of inert custom properties. */\nconst KNOWN_TOKENS = new Set([\n \"accent\",\n \"accent-contrast\",\n \"accent-soft\",\n \"surface\",\n \"surface-raised\",\n \"text\",\n \"muted\",\n \"border\",\n \"radius\",\n \"shadow\",\n \"font\",\n // Derived, overridable by a host that wants finer control.\n \"font-title\",\n \"accent-strong\",\n \"accent-bright\",\n \"ring\",\n \"tint\",\n \"bubble\",\n \"danger\",\n \"warn\",\n \"radius-sm\",\n \"radius-pill\",\n \"kind-event\",\n \"kind-article\",\n \"kind-news\",\n \"kind-contact\",\n \"kind-action\",\n \"kind-page\",\n \"inset\",\n \"gap\",\n \"badge-size\",\n \"panel-w\",\n \"panel-h\",\n]);\n\n/** Theme values arrive off the wire from a project's remote config. None of\n * the tokens this sheet consumes ever needs a URL or a statement separator,\n * so a value carrying one is either a mistake or an attempt to smuggle an\n * extra declaration (or an image beacon) into the host page. */\nconst UNSAFE_TOKEN_VALUE = /[;{}<>]|url\\s*\\(|expression\\s*\\(/i;\n\n/** Resolves a theme key to the custom property it writes, or null if the\n * key names nothing this sheet reads. A `--`-prefixed key is passed through\n * untouched — the escape hatch for anything not in `KNOWN_TOKENS`. */\nfunction tokenProperty(key: string): string | null {\n if (key.startsWith(\"--\")) return key;\n const name = TOKEN_ALIASES[key] ?? key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n return KNOWN_TOKENS.has(name) ? `--daba-agent-${name}` : null;\n}\n\n/**\n * Write theme tokens onto an element — normally the widget wrapper, so the\n * whole subtree inherits them.\n *\n * Keys may be a token name (\"accent\", \"accent-contrast\"), a camelCase alias\n * (\"accentColor\", \"fontFamily\"), or a literal custom property\n * (\"--daba-agent-accent\"). Anything else is ignored, so a whole `appearance`\n * object can be passed in and only its colours land here.\n *\n * Empty, null and undefined values are SKIPPED, not cleared: the gateway\n * sends null for \"the owner did not configure this\", and clearing would\n * wipe out an integrator's own inline override along with it.\n *\n * Values land as inline custom properties, so they also beat the\n * dark-mode token block below — an explicit colour choice survives a\n * visitor's dark system theme, which is the intent.\n */\nexport function applyThemeTokens(\n el: HTMLElement,\n theme: Partial<Record<string, string | null | undefined>>,\n): void {\n for (const key of Object.keys(theme)) {\n const raw = theme[key];\n if (raw === null || raw === undefined) continue;\n const value = String(raw).trim();\n if (!value || UNSAFE_TOKEN_VALUE.test(value)) continue;\n const property = tokenProperty(key);\n if (property) el.style.setProperty(property, value);\n }\n}\n\nconst SHEET = `\n/* ==========================================================================\n 1. Tokens — the only place a literal colour, radius or font appears.\n ========================================================================== */\n.daba-agent-wrapper {\n --daba-agent-accent: #0c8c5e;\n --daba-agent-accent-contrast: #ffffff;\n /* The brand's pale mint ground, expressed as a mix rather than #e3fbf1 so\n a customer's own accent brings its own tint along instead of leaving\n green hovers scattered through a blue widget. */\n --daba-agent-accent-soft: color-mix(in srgb, var(--daba-agent-accent) 12%, var(--daba-agent-surface));\n --daba-agent-surface: #ffffff;\n --daba-agent-surface-raised: #fafafa;\n --daba-agent-text: #09090b;\n --daba-agent-muted: #64748b;\n --daba-agent-border: #e4e4e7;\n --daba-agent-radius: 18px;\n --daba-agent-shadow:\n 0 24px 60px -18px color-mix(in srgb, var(--daba-agent-text) 28%, transparent),\n 0 8px 24px -14px color-mix(in srgb, var(--daba-agent-text) 22%, transparent);\n --daba-agent-font: var(--font-roobert-body, ui-sans-serif, system-ui, -apple-system,\n \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Noto Sans Arabic\", sans-serif);\n\n /* Derived. Each one is a function of a token above, which is what makes\n four variables enough to reskin the whole widget. */\n --daba-agent-font-title: var(--font-roobert-title, var(--daba-agent-font));\n --daba-agent-accent-strong: color-mix(in srgb, var(--daba-agent-accent) 84%, var(--daba-agent-text));\n --daba-agent-accent-bright: color-mix(in srgb, var(--daba-agent-accent) 55%, #18e299);\n --daba-agent-ring: color-mix(in srgb, var(--daba-agent-accent) 38%, transparent);\n /* Tints ride on the ink colour, so they invert for free in dark mode. */\n --daba-agent-tint: color-mix(in srgb, var(--daba-agent-text) 6%, transparent);\n --daba-agent-bubble: color-mix(in srgb, var(--daba-agent-text) 5%, var(--daba-agent-surface));\n --daba-agent-danger: #dc2626;\n --daba-agent-warn: #f5a623;\n --daba-agent-radius-sm: calc(var(--daba-agent-radius) * 0.55);\n --daba-agent-radius-pill: 999px;\n\n /* Card accents. The only hues that are not the brand accent: a wall of\n six identical green cards is unreadable at a glance, and kind is the\n first thing a visitor scans for. Themeable like anything else. */\n --daba-agent-kind-event: #7c3aed;\n --daba-agent-kind-article: #0ea5e9;\n --daba-agent-kind-news: #f97316;\n --daba-agent-kind-contact: var(--daba-agent-accent);\n --daba-agent-kind-action: var(--daba-agent-accent);\n --daba-agent-kind-page: var(--daba-agent-muted);\n\n /* Geometry. --daba-agent-anchor is the inline alignment of the launcher\n against the panel; the RTL section flips it per corner. */\n --daba-agent-inset: 20px;\n --daba-agent-gap: 12px;\n --daba-agent-badge-size: 56px;\n --daba-agent-panel-w: 380px;\n --daba-agent-panel-h: 560px;\n --daba-agent-anchor: flex-end;\n}\n\n/* ==========================================================================\n 2. Isolation — surviving the host's stylesheet.\n ========================================================================== */\n\n/* Specificity is load-bearing here. \\`.daba-agent-wrapper :where(button, …)\\`\n scores (0,1,0): high enough to beat a host's \\`button { … }\\` at (0,0,1)\n even when their sheet loads after ours, and exactly equal to our own\n single-class component rules below — which therefore win on source order.\n Written as \\`.daba-agent-wrapper button\\` it would score (0,1,1) and quietly\n outrank \\`.daba-agent-input\\`, which is the bug this shape avoids.\n\n \\`all: revert\\` throws away every author-origin declaration the host made\n for these elements and hands back the plain user-agent element, which the\n declarations after it then restyle. SVG is deliberately absent from the\n list: fill/stroke arrive as presentation attributes, which \\`all: revert\\`\n would discard along with the host's rules, turning every line icon into a\n black blob. */\n.daba-agent-wrapper :where(button, input, textarea, select, form, fieldset, label,\na, p, span, strong, em, small, time, ul, ol, li, dl, dt, dd, figure, img, video,\nh1, h2, h3, h4, h5, h6) {\n all: revert;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n text-align: inherit;\n text-decoration: none;\n text-transform: none;\n list-style: none;\n vertical-align: baseline;\n min-width: 0;\n}\n\n.daba-agent-wrapper,\n.daba-agent-wrapper *,\n.daba-agent-wrapper *::before,\n.daba-agent-wrapper *::after {\n box-sizing: border-box;\n font-family: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n word-spacing: normal;\n text-indent: 0;\n text-shadow: none;\n float: none;\n animation-delay: 0s;\n}\n\n.daba-agent-wrapper :where(button, [role=\"button\"]) {\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n user-select: none;\n}\n\n.daba-agent-wrapper :where(input, textarea) {\n -webkit-appearance: none;\n appearance: none;\n border-radius: 0;\n}\n\n/* Geometry only. Paint properties are left alone on purpose — see the\n \\`all: revert\\` note above. */\n.daba-agent-wrapper :where(svg) {\n display: block;\n flex: none;\n max-width: 100%;\n overflow: visible;\n}\n\n.daba-agent-wrapper :where(img, video) {\n display: block;\n max-width: 100%;\n}\n\n/* ==========================================================================\n 3. Wrapper and corner placement.\n ========================================================================== */\n.daba-agent-wrapper {\n position: fixed;\n z-index: 2147483000;\n /* Own stacking context: a host's z-indexed header cannot then punch\n through the panel by accident. */\n isolation: isolate;\n display: flex;\n flex-direction: column;\n align-items: var(--daba-agent-anchor);\n gap: var(--daba-agent-gap);\n font-family: var(--daba-agent-font);\n font-size: 14px;\n font-weight: 400;\n line-height: 1.5;\n letter-spacing: normal;\n text-align: start;\n color: var(--daba-agent-text);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-variant-ligatures: none;\n /* The wrapper box is larger than what it paints (the gap between launcher\n and panel). Without this it would swallow clicks on the host's page. */\n pointer-events: none;\n}\n.daba-agent-wrapper > * {\n pointer-events: auto;\n}\n\n.daba-agent-wrapper--pos-bottom-right {\n inset: auto var(--daba-agent-inset) calc(var(--daba-agent-inset) + env(safe-area-inset-bottom, 0px)) auto;\n --daba-agent-anchor: flex-end;\n}\n.daba-agent-wrapper--pos-bottom-left {\n inset: auto auto calc(var(--daba-agent-inset) + env(safe-area-inset-bottom, 0px)) var(--daba-agent-inset);\n --daba-agent-anchor: flex-start;\n}\n/* Top corners stack in reverse so the launcher keeps the corner and the\n panel drops below it. */\n.daba-agent-wrapper--pos-top-right {\n inset: calc(var(--daba-agent-inset) + env(safe-area-inset-top, 0px)) var(--daba-agent-inset) auto auto;\n flex-direction: column-reverse;\n --daba-agent-anchor: flex-end;\n}\n.daba-agent-wrapper--pos-top-left {\n inset: calc(var(--daba-agent-inset) + env(safe-area-inset-top, 0px)) auto auto var(--daba-agent-inset);\n flex-direction: column-reverse;\n --daba-agent-anchor: flex-start;\n}\n\n/* ==========================================================================\n 4. Launcher badge.\n ========================================================================== */\n.daba-agent-badge {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: var(--daba-agent-badge-size);\n height: var(--daba-agent-badge-size);\n padding: 0;\n border: 0;\n border-radius: calc(var(--daba-agent-radius) * 0.95);\n background: var(--daba-agent-accent);\n color: var(--daba-agent-accent-contrast);\n box-shadow: var(--daba-agent-shadow);\n transition:\n transform 220ms cubic-bezier(0.16, 1, 0.3, 1),\n box-shadow 220ms cubic-bezier(0.16, 1, 0.3, 1),\n border-radius 220ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n.daba-agent-badge:hover {\n transform: translateY(-2px) scale(1.02);\n box-shadow:\n var(--daba-agent-shadow),\n 0 0 0 6px color-mix(in srgb, var(--daba-agent-accent) 14%, transparent);\n}\n.daba-agent-badge:active {\n transform: translateY(0) scale(0.97);\n}\n\n.daba-agent-badge--circle {\n border-radius: var(--daba-agent-radius-pill);\n}\n.daba-agent-badge--rounded {\n border-radius: calc(var(--daba-agent-radius) * 0.95);\n}\n.daba-agent-badge--pill {\n width: auto;\n height: calc(var(--daba-agent-badge-size) * 0.82);\n padding-inline: 8px 18px;\n gap: 10px;\n border-radius: var(--daba-agent-radius-pill);\n}\n\n.daba-agent-badge__icon {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n overflow: hidden;\n line-height: 0;\n}\n.daba-agent-badge--pill .daba-agent-badge__icon {\n width: calc(var(--daba-agent-badge-size) * 0.55);\n height: calc(var(--daba-agent-badge-size) * 0.55);\n border-radius: var(--daba-agent-radius-pill);\n flex: none;\n}\n.daba-agent-badge__icon > svg,\n.daba-agent-badge__icon > img,\n.daba-agent-badge__brand-icon {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: inherit;\n}\n.daba-agent-badge__brand-icon {\n flex: none;\n}\n\n.daba-agent-badge__label {\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.01em;\n white-space: nowrap;\n color: var(--daba-agent-accent-contrast);\n}\n/* Off-screen rather than display:none, so the status stays in the\n accessibility tree while the visible affordance is the dot + tooltip. */\n.daba-agent-badge__label--sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.daba-agent-badge__dot {\n display: inline-block;\n flex: none;\n width: 10px;\n height: 10px;\n border-radius: var(--daba-agent-radius-pill);\n border: 2px solid var(--daba-agent-surface);\n background: var(--daba-agent-accent-bright);\n}\n/* Only the launcher's own dot is a corner pip. The header reuses this class\n as an inline status light, and absolute positioning there would fling it\n to the wrapper's corner. */\n.daba-agent-badge > .daba-agent-badge__dot {\n position: absolute;\n inset-block-start: -2px;\n inset-inline-end: -2px;\n}\n\n.daba-agent-badge--idle .daba-agent-badge__dot {\n display: none;\n}\n.daba-agent-badge--listening .daba-agent-badge__dot,\n.daba-agent-badge--speaking .daba-agent-badge__dot {\n background: var(--daba-agent-accent-bright);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--daba-agent-accent-bright) 32%, transparent);\n animation: daba-agent-halo 1.6s ease-out infinite;\n}\n.daba-agent-badge--connecting .daba-agent-badge__dot,\n.daba-agent-badge--thinking .daba-agent-badge__dot {\n background: var(--daba-agent-warn);\n animation: daba-agent-pulse 1s ease-in-out infinite;\n}\n.daba-agent-badge--error .daba-agent-badge__dot {\n background: var(--daba-agent-danger);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--daba-agent-danger) 28%, transparent);\n}\n\n/* ==========================================================================\n 5. Panel.\n ========================================================================== */\n.daba-agent-window {\n display: flex;\n flex-direction: column;\n width: var(--daba-agent-panel-w);\n height: min(var(--daba-agent-panel-h), calc(100vh - 140px));\n max-width: calc(100vw - 24px);\n max-height: calc(100vh - 120px);\n background: var(--daba-agent-surface);\n color: var(--daba-agent-text);\n border: 1px solid var(--daba-agent-border);\n border-radius: var(--daba-agent-radius);\n box-shadow: var(--daba-agent-shadow);\n overflow: hidden;\n animation: daba-agent-panel-in 260ms cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.daba-agent-window--hidden {\n display: none !important;\n}\n/* Grow out of the launcher, not out of nowhere. */\n.daba-agent-wrapper--pos-bottom-right .daba-agent-window { transform-origin: bottom right; }\n.daba-agent-wrapper--pos-bottom-left .daba-agent-window { transform-origin: bottom left; }\n.daba-agent-wrapper--pos-top-right .daba-agent-window { transform-origin: top right; }\n.daba-agent-wrapper--pos-top-left .daba-agent-window { transform-origin: top left; }\n\n/* ---- header ---- */\n.daba-agent-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex: none;\n padding: 12px 14px;\n border-block-end: 1px solid var(--daba-agent-border);\n background: var(--daba-agent-surface-raised);\n}\n.daba-agent-header__left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n.daba-agent-header__logo {\n width: 28px;\n height: 28px;\n flex: none;\n border-radius: calc(var(--daba-agent-radius) * 0.45);\n object-fit: cover;\n background: var(--daba-agent-accent-soft);\n}\n.daba-agent-header__title {\n font-family: var(--daba-agent-font-title);\n font-size: 14.5px;\n font-weight: 700;\n letter-spacing: -0.015em;\n color: var(--daba-agent-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.daba-agent-header__right {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n}\n.daba-agent-header__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n flex: none;\n border: 1px solid var(--daba-agent-border);\n border-radius: calc(var(--daba-agent-radius) * 0.5);\n background: var(--daba-agent-surface);\n color: var(--daba-agent-muted);\n transition: background 140ms ease, color 140ms ease, border-color 140ms ease;\n}\n.daba-agent-header__btn:hover {\n background: var(--daba-agent-accent-soft);\n border-color: color-mix(in srgb, var(--daba-agent-accent) 45%, var(--daba-agent-border));\n color: var(--daba-agent-accent);\n}\n.daba-agent-header__btn--active,\n.daba-agent-composer__mic--active {\n background: var(--daba-agent-accent);\n border-color: var(--daba-agent-accent);\n color: var(--daba-agent-accent-contrast);\n}\n.daba-agent-header__btn--active:hover,\n.daba-agent-composer__mic--active:hover {\n background: var(--daba-agent-accent-strong);\n border-color: var(--daba-agent-accent-strong);\n color: var(--daba-agent-accent-contrast);\n}\n/* A live microphone is the one control a visitor must never lose track of. */\n.daba-agent-header__btn--mic.daba-agent-header__btn--active,\n.daba-agent-composer__mic--active {\n animation: daba-agent-mic-ring 1.8s ease-out infinite;\n}\n\n/* ==========================================================================\n 6. Transcript.\n ========================================================================== */\n.daba-agent-messages {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 10px;\n padding: 14px;\n overflow-y: auto;\n /* Keep a flick at the end of the transcript from scrolling the host page\n behind the panel. */\n overscroll-behavior: contain;\n scroll-behavior: smooth;\n background: var(--daba-agent-surface);\n scrollbar-width: thin;\n scrollbar-color: color-mix(in srgb, var(--daba-agent-text) 22%, transparent) transparent;\n}\n.daba-agent-messages::-webkit-scrollbar {\n width: 6px;\n}\n.daba-agent-messages::-webkit-scrollbar-thumb {\n background: color-mix(in srgb, var(--daba-agent-text) 18%, transparent);\n border-radius: var(--daba-agent-radius-pill);\n}\n.daba-agent-messages::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.daba-agent-msg {\n max-width: 86%;\n padding: 10px 13px;\n border-radius: var(--daba-agent-radius-sm);\n font-size: 13.5px;\n line-height: 1.5;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n animation: daba-agent-msg-in 220ms cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n/* flex-start/flex-end follow the inline direction, so the bubbles swap\n sides under RTL without a single physical override. */\n.daba-agent-msg--user {\n align-self: flex-end;\n background: var(--daba-agent-accent);\n color: var(--daba-agent-accent-contrast);\n font-weight: 500;\n border-end-end-radius: 5px;\n}\n.daba-agent-msg--agent {\n align-self: flex-start;\n background: var(--daba-agent-bubble);\n color: var(--daba-agent-text);\n border: 1px solid var(--daba-agent-border);\n border-end-start-radius: 5px;\n}\n.daba-agent-msg--system {\n align-self: center;\n max-width: 100%;\n padding: 5px 12px;\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-accent-soft);\n color: var(--daba-agent-accent-strong);\n font-size: 11.5px;\n font-weight: 600;\n text-align: center;\n}\n\n/* ---- typing indicator ---- */\n.daba-agent-typing {\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 12px 14px;\n border: 1px solid var(--daba-agent-border);\n border-radius: var(--daba-agent-radius-sm);\n border-end-start-radius: 5px;\n background: var(--daba-agent-bubble);\n animation: daba-agent-msg-in 220ms cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.daba-agent-typing > span,\n.daba-agent-typing__dot {\n display: block;\n width: 6px;\n height: 6px;\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-muted);\n animation: daba-agent-typing 1.3s ease-in-out infinite;\n}\n.daba-agent-typing > span:nth-child(2),\n.daba-agent-typing__dot:nth-child(2) { animation-delay: 0.18s; }\n.daba-agent-typing > span:nth-child(3),\n.daba-agent-typing__dot:nth-child(3) { animation-delay: 0.36s; }\n\n/* ==========================================================================\n 7. Intro — the empty state, and the biggest lever on a first message.\n ========================================================================== */\n.daba-agent-intro {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding-block: 6px 4px;\n animation: daba-agent-msg-in 300ms cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.daba-agent-intro__media {\n width: 100%;\n aspect-ratio: 16 / 10;\n object-fit: cover;\n border: 1px solid var(--daba-agent-border);\n border-radius: calc(var(--daba-agent-radius) * 0.75);\n background: var(--daba-agent-tint);\n}\n.daba-agent-intro__headline {\n font-family: var(--daba-agent-font-title);\n font-size: 18px;\n font-weight: 700;\n line-height: 1.25;\n letter-spacing: -0.02em;\n color: var(--daba-agent-text);\n text-wrap: balance;\n}\n.daba-agent-intro__sub {\n font-size: 13px;\n line-height: 1.55;\n color: var(--daba-agent-muted);\n}\n.daba-agent-intro__prompts {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-block-start: 2px;\n}\n.daba-agent-prompt-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 100%;\n padding: 8px 13px;\n border: 1px solid var(--daba-agent-border);\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-surface-raised);\n color: var(--daba-agent-text);\n font-size: 12.5px;\n font-weight: 500;\n line-height: 1.3;\n text-align: start;\n transition:\n background 140ms ease,\n border-color 140ms ease,\n color 140ms ease,\n transform 140ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n.daba-agent-prompt-chip:hover {\n background: var(--daba-agent-accent-soft);\n border-color: color-mix(in srgb, var(--daba-agent-accent) 45%, var(--daba-agent-border));\n color: var(--daba-agent-accent-strong);\n transform: translateY(-1px);\n}\n\n/* ==========================================================================\n 8. Cards.\n ========================================================================== */\n.daba-agent-cards {\n align-self: stretch;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.daba-agent-card {\n --daba-agent-card-accent: var(--daba-agent-kind-page);\n --daba-agent-card-pad: 12px;\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: var(--daba-agent-card-pad);\n border: 1px solid var(--daba-agent-border);\n border-radius: calc(var(--daba-agent-radius) * 0.72);\n background: var(--daba-agent-surface-raised);\n overflow: hidden;\n animation: daba-agent-msg-in 240ms cubic-bezier(0.16, 1, 0.3, 1) both;\n transition: border-color 160ms ease, box-shadow 160ms ease, transform 160ms ease;\n}\n.daba-agent-card:hover {\n border-color: color-mix(in srgb, var(--daba-agent-card-accent) 40%, var(--daba-agent-border));\n box-shadow: 0 6px 18px -12px color-mix(in srgb, var(--daba-agent-text) 45%, transparent);\n}\n/* The kind stripe. inset-inline-start keeps it on the reading edge in RTL. */\n.daba-agent-card::before {\n content: \"\";\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n width: 3px;\n background: var(--daba-agent-card-accent);\n}\n.daba-agent-card--event { --daba-agent-card-accent: var(--daba-agent-kind-event); }\n.daba-agent-card--article { --daba-agent-card-accent: var(--daba-agent-kind-article); }\n.daba-agent-card--news { --daba-agent-card-accent: var(--daba-agent-kind-news); }\n.daba-agent-card--contact { --daba-agent-card-accent: var(--daba-agent-kind-contact); }\n.daba-agent-card--action { --daba-agent-card-accent: var(--daba-agent-kind-action); }\n.daba-agent-card--page { --daba-agent-card-accent: var(--daba-agent-kind-page); }\n\n/* Media breaks out of the card padding rather than the card dropping its\n padding, so a card with and without an image share one layout. */\n.daba-agent-card__media {\n width: 100%;\n /* Beats the max-width:100% the media reset above hands every image —\n without this the breakout below is clamped back to the content box. */\n max-width: none;\n aspect-ratio: 16 / 9;\n object-fit: cover;\n background: var(--daba-agent-tint);\n}\n.daba-agent-card__media:first-child {\n width: calc(100% + var(--daba-agent-card-pad) * 2);\n margin: calc(var(--daba-agent-card-pad) * -1) calc(var(--daba-agent-card-pad) * -1) 2px;\n}\n.daba-agent-card__kind {\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--daba-agent-card-accent);\n}\n.daba-agent-card__title {\n font-family: var(--daba-agent-font-title);\n font-size: 13.5px;\n font-weight: 650;\n line-height: 1.35;\n letter-spacing: -0.01em;\n color: var(--daba-agent-text);\n overflow-wrap: anywhere;\n}\n.daba-agent-card__summary {\n display: -webkit-box;\n -webkit-line-clamp: 3;\n line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n font-size: 12.5px;\n line-height: 1.5;\n color: var(--daba-agent-muted);\n}\n.daba-agent-card__row {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 12px;\n line-height: 1.4;\n color: var(--daba-agent-muted);\n}\n.daba-agent-card__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n flex: none;\n color: var(--daba-agent-card-accent);\n}\n.daba-agent-card__icon > svg {\n width: 100%;\n height: 100%;\n}\n.daba-agent-card__actions {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-block-start: 4px;\n}\n.daba-agent-card__btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 12px;\n border: 1px solid var(--daba-agent-border);\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-surface);\n color: var(--daba-agent-text);\n font-size: 12px;\n font-weight: 600;\n transition: background 140ms ease, border-color 140ms ease, color 140ms ease;\n}\n.daba-agent-card__btn:hover {\n background: var(--daba-agent-accent-soft);\n border-color: color-mix(in srgb, var(--daba-agent-accent) 45%, var(--daba-agent-border));\n color: var(--daba-agent-accent-strong);\n}\n.daba-agent-card__btn--primary {\n background: var(--daba-agent-accent);\n border-color: var(--daba-agent-accent);\n color: var(--daba-agent-accent-contrast);\n}\n.daba-agent-card__btn--primary:hover {\n background: var(--daba-agent-accent-strong);\n border-color: var(--daba-agent-accent-strong);\n color: var(--daba-agent-accent-contrast);\n}\n\n/* ==========================================================================\n 9. Voice state.\n ========================================================================== */\n.daba-agent-voice-bar {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: none;\n padding: 9px 14px;\n border-block-end: 1px solid var(--daba-agent-border);\n background: var(--daba-agent-accent-soft);\n color: var(--daba-agent-accent-strong);\n font-size: 12px;\n font-weight: 600;\n}\n.daba-agent-waveform {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n height: 18px;\n flex: none;\n}\n.daba-agent-waveform > span,\n.daba-agent-waveform__bar {\n display: block;\n width: 3px;\n height: 6px;\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-accent);\n transform-origin: center;\n animation: daba-agent-wave 1.1s ease-in-out infinite;\n}\n.daba-agent-waveform > span:nth-child(2),\n.daba-agent-waveform__bar:nth-child(2) { animation-delay: 0.12s; }\n.daba-agent-waveform > span:nth-child(3),\n.daba-agent-waveform__bar:nth-child(3) { animation-delay: 0.24s; }\n.daba-agent-waveform > span:nth-child(4),\n.daba-agent-waveform__bar:nth-child(4) { animation-delay: 0.36s; }\n.daba-agent-waveform > span:nth-child(5),\n.daba-agent-waveform__bar:nth-child(5) { animation-delay: 0.48s; }\n\n/* ==========================================================================\n 10. Composer.\n ========================================================================== */\n.daba-agent-input-form {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: none;\n padding: 10px 12px;\n padding-block-end: calc(10px + env(safe-area-inset-bottom, 0px));\n border-block-start: 1px solid var(--daba-agent-border);\n background: var(--daba-agent-surface-raised);\n}\n.daba-agent-input {\n flex: 1 1 auto;\n min-width: 0;\n /* padding-inline + text-align:start is the whole RTL story for the field:\n the caret, the placeholder and the padding all follow the dir. */\n padding-block: 9px;\n padding-inline: 14px;\n border: 1px solid var(--daba-agent-border);\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-surface);\n color: var(--daba-agent-text);\n font-size: 13.5px;\n line-height: 1.4;\n text-align: start;\n outline: none;\n transition: border-color 140ms ease, box-shadow 140ms ease;\n}\n.daba-agent-input::placeholder {\n color: var(--daba-agent-muted);\n opacity: 0.85;\n}\n.daba-agent-input:focus {\n border-color: var(--daba-agent-accent);\n box-shadow: 0 0 0 3px var(--daba-agent-ring);\n}\n.daba-agent-composer__mic {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n border: 1px solid var(--daba-agent-border);\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-surface);\n color: var(--daba-agent-muted);\n transition: background 140ms ease, color 140ms ease, border-color 140ms ease;\n}\n.daba-agent-composer__mic:hover {\n background: var(--daba-agent-accent-soft);\n border-color: color-mix(in srgb, var(--daba-agent-accent) 45%, var(--daba-agent-border));\n color: var(--daba-agent-accent);\n}\n.daba-agent-send-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n border: 0;\n border-radius: var(--daba-agent-radius-pill);\n background: var(--daba-agent-accent);\n color: var(--daba-agent-accent-contrast);\n transition: background 140ms ease, transform 140ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n.daba-agent-send-btn:hover {\n background: var(--daba-agent-accent-strong);\n transform: scale(1.06);\n}\n.daba-agent-send-btn:disabled,\n.daba-agent-composer__mic:disabled,\n.daba-agent-header__btn:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n transform: none;\n}\n\n/* ==========================================================================\n 11. Errors.\n ========================================================================== */\n.daba-agent-error {\n align-self: stretch;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid color-mix(in srgb, var(--daba-agent-danger) 32%, transparent);\n border-radius: var(--daba-agent-radius-sm);\n background: color-mix(in srgb, var(--daba-agent-danger) 10%, var(--daba-agent-surface));\n color: color-mix(in srgb, var(--daba-agent-danger) 78%, var(--daba-agent-text));\n font-size: 12.5px;\n line-height: 1.45;\n}\n.daba-agent-retry {\n margin-inline-start: auto;\n padding: 5px 12px;\n border: 1px solid currentColor;\n border-radius: var(--daba-agent-radius-pill);\n background: transparent;\n color: inherit;\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n transition: background 140ms ease;\n}\n.daba-agent-retry:hover {\n background: color-mix(in srgb, var(--daba-agent-danger) 16%, transparent);\n}\n\n/* ==========================================================================\n 12. Focus. One ring, drawn in the accent, on everything reachable.\n ========================================================================== */\n.daba-agent-wrapper :where(button, input, textarea, select, a, [tabindex]):focus-visible {\n outline: 2px solid var(--daba-agent-accent);\n outline-offset: 2px;\n}\n.daba-agent-badge:focus-visible {\n outline: none;\n box-shadow: var(--daba-agent-shadow), 0 0 0 4px var(--daba-agent-ring);\n}\n\n/* ==========================================================================\n 13. RTL. Everything above is written with logical properties and\n direction-aware flex alignment, so this section only has to fix the two\n things CSS cannot infer: which physical corner a named position means,\n and which glyphs carry a direction of their own.\n ========================================================================== */\n.daba-agent-wrapper[dir=\"rtl\"].daba-agent-wrapper--pos-bottom-right,\n.daba-agent-wrapper[dir=\"rtl\"].daba-agent-wrapper--pos-top-right {\n --daba-agent-anchor: flex-start;\n}\n.daba-agent-wrapper[dir=\"rtl\"].daba-agent-wrapper--pos-bottom-left,\n.daba-agent-wrapper[dir=\"rtl\"].daba-agent-wrapper--pos-top-left {\n --daba-agent-anchor: flex-end;\n}\n/* A paper-plane points along the reading direction; an arrow in a card\n action points at where the reader is going. Both must flip. */\n.daba-agent-wrapper[dir=\"rtl\"] .daba-agent-send-btn svg,\n.daba-agent-wrapper[dir=\"rtl\"] .daba-agent-card__btn svg {\n transform: scaleX(-1);\n}\n/* The launcher's status pip sits on the outer corner in both directions. */\n.daba-agent-wrapper[dir=\"rtl\"] .daba-agent-badge > .daba-agent-badge__dot {\n inset-inline-end: -2px;\n}\n\n/* ==========================================================================\n 14. Dark mode, in all three states: system-dark, explicit dark, explicit\n light. Only tokens are redefined — no component rule below knows which\n mode it is in. The media query is guarded on [data-daba-theme=\"light\"] so\n an owner who chose light keeps light on a dark machine.\n ========================================================================== */\n\n/* Dark is opt-in by the project, never inferred from the visitor's OS. The\n design being matched is a white sheet, and an assistant that flips dark\n because a visitor's laptop is set that way is showing the visitor\n something the site owner never approved. */\n.daba-agent-wrapper[data-daba-theme=\"dark\"] {\n --daba-agent-surface: #0f1012;\n --daba-agent-surface-raised: #17181b;\n --daba-agent-text: #f4f4f5;\n --daba-agent-muted: #9aa5b4;\n --daba-agent-border: color-mix(in srgb, #ffffff 14%, transparent);\n --daba-agent-accent-soft: color-mix(in srgb, var(--daba-agent-accent) 22%, var(--daba-agent-surface));\n --daba-agent-accent-strong: color-mix(in srgb, var(--daba-agent-accent) 70%, #ffffff);\n --daba-agent-shadow:\n 0 28px 70px -20px rgba(0, 0, 0, 0.75),\n 0 10px 26px -16px rgba(0, 0, 0, 0.6);\n --daba-agent-kind-event: #a78bfa;\n --daba-agent-kind-article: #38bdf8;\n --daba-agent-kind-news: #fb923c;\n --daba-agent-danger: #f87171;\n}\n\n/* ==========================================================================\n 15. Small screens. A 380px panel floating in a 360px viewport is a worse\n experience than no panel, so below 480px it takes the whole screen.\n ========================================================================== */\n@media (max-width: 480px) {\n .daba-agent-wrapper {\n --daba-agent-inset: 14px;\n --daba-agent-badge-size: 52px;\n --daba-agent-panel-w: 100%;\n }\n .daba-agent-window {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n height: 100dvh;\n max-width: none;\n max-height: none;\n border: 0;\n border-radius: 0;\n }\n .daba-agent-input-form {\n padding-block-end: calc(12px + env(safe-area-inset-bottom, 0px));\n }\n .daba-agent-header {\n padding-block-start: calc(12px + env(safe-area-inset-top, 0px));\n }\n .daba-agent-msg {\n max-width: 92%;\n }\n}\n\n/* ==========================================================================\n 16. Motion.\n ========================================================================== */\n@keyframes daba-agent-panel-in {\n from { opacity: 0; transform: translateY(10px) scale(0.96); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n@keyframes daba-agent-msg-in {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes daba-agent-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n@keyframes daba-agent-halo {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--daba-agent-accent-bright) 45%, transparent); }\n 70% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--daba-agent-accent-bright) 0%, transparent); }\n 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--daba-agent-accent-bright) 0%, transparent); }\n}\n@keyframes daba-agent-mic-ring {\n 0% { box-shadow: 0 0 0 0 var(--daba-agent-ring); }\n 70% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--daba-agent-accent) 0%, transparent); }\n 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--daba-agent-accent) 0%, transparent); }\n}\n@keyframes daba-agent-typing {\n 0%, 60%, 100% { opacity: 0.35; transform: translateY(0); }\n 30% { opacity: 1; transform: translateY(-3px); }\n}\n@keyframes daba-agent-wave {\n 0%, 100% { height: 6px; opacity: 0.6; }\n 50% { height: 17px; opacity: 1; }\n}\n\n/* Reduced motion kills the animation, never the affordance: the waveform\n bars keep their resting height and the typing dots stay visible, so both\n still read as \"something is happening\". */\n@media (prefers-reduced-motion: reduce) {\n .daba-agent-wrapper,\n .daba-agent-wrapper *,\n .daba-agent-wrapper *::before,\n .daba-agent-wrapper *::after {\n animation-duration: 1ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 1ms !important;\n scroll-behavior: auto !important;\n }\n .daba-agent-messages {\n scroll-behavior: auto;\n }\n .daba-agent-badge:hover,\n .daba-agent-prompt-chip:hover,\n .daba-agent-send-btn:hover {\n transform: none;\n }\n .daba-agent-typing > span,\n .daba-agent-typing__dot {\n opacity: 0.7;\n }\n .daba-agent-waveform > span,\n .daba-agent-waveform__bar {\n height: 11px;\n }\n}\n/* ==========================================================================\n Panel chrome introduced by chat-window.ts.\n\n Every icon here is an inline <svg> carrying a viewBox and no width or\n height. That is deliberate — it lets one asset serve a 14px chip and a\n 40px launcher — but it means an SVG with no sized parent resolves to\n \"fill the container\", which is exactly how a 20px mark ends up painted\n across the whole panel. So every icon wrapper below is explicitly sized\n and the svg inside it is told to fill that box, never the other way\n round.\n ========================================================================== */\n.daba-agent-header__mark,\n.daba-agent-header__logo {\n width: 20px;\n height: 20px;\n flex: none;\n display: block;\n color: var(--daba-agent-accent);\n object-fit: contain;\n}\n.daba-agent-header__mark > svg { width: 100%; height: 100%; }\n\n.daba-agent-header__status {\n font-size: 11px;\n color: var(--daba-agent-muted);\n margin-inline-start: 6px;\n white-space: nowrap;\n}\n\n.daba-agent-intro__mark {\n width: 40px;\n height: 40px;\n display: block;\n margin: 0 auto 4px;\n color: var(--daba-agent-accent);\n}\n.daba-agent-intro__mark > svg { width: 100%; height: 100%; }\n\n.daba-agent-prompt-chip__icon {\n width: 13px;\n height: 13px;\n flex: none;\n color: var(--daba-agent-accent);\n}\n.daba-agent-prompt-chip__icon > svg { width: 100%; height: 100%; }\n\n/* Message + its cards travel together, so the cards inherit the row's\n alignment rather than each needing to know which side it is on. */\n.daba-agent-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-width: 100%;\n}\n.daba-agent-group--user { align-items: flex-end; }\n.daba-agent-group--agent,\n.daba-agent-group--system { align-items: flex-start; }\n.daba-agent-group--system { align-items: center; }\n\n/* The composer field: one rounded surface holding the search glyph, the\n input and the optional mic, so the whole thing reads as a single\n control instead of three adjacent ones. */\n.daba-agent-field {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 10px;\n border: 1px solid var(--daba-agent-border);\n border-radius: var(--daba-agent-radius-pill, 999px);\n background: var(--daba-agent-surface);\n transition: border-color .15s ease, box-shadow .15s ease;\n}\n.daba-agent-field:focus-within {\n border-color: var(--daba-agent-accent);\n box-shadow: 0 0 0 3px var(--daba-agent-ring, color-mix(in srgb, var(--daba-agent-accent) 20%, transparent));\n}\n.daba-agent-field__icon {\n width: 14px;\n height: 14px;\n flex: none;\n color: var(--daba-agent-muted);\n}\n.daba-agent-field__icon > svg { width: 100%; height: 100%; }\n.daba-agent-field .daba-agent-input {\n flex: 1;\n min-width: 0;\n border: none;\n background: transparent;\n box-shadow: none;\n padding: 10px 0;\n}\n.daba-agent-field .daba-agent-input:focus { border: none; box-shadow: none; }\n\n.daba-agent-composer__mic {\n width: 26px;\n height: 26px;\n flex: none;\n display: grid;\n place-items: center;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--daba-agent-muted);\n cursor: pointer;\n}\n.daba-agent-composer__mic > svg { width: 14px; height: 14px; }\n.daba-agent-composer__mic:hover {\n background: var(--daba-agent-accent-soft);\n color: var(--daba-agent-accent);\n}\n\n.daba-agent-footer {\n padding: 0 16px 10px;\n font-size: 10.5px;\n letter-spacing: .02em;\n color: var(--daba-agent-muted);\n text-align: center;\n opacity: .75;\n}\n\n.daba-agent-typing--hidden { display: none !important; }\n\n/* --- card internals ------------------------------------------------------ */\n.daba-agent-card__head {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.daba-agent-card__body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n.daba-agent-card__image {\n width: 100%;\n height: auto;\n max-height: 120px;\n object-fit: cover;\n border-radius: calc(var(--daba-agent-radius) - 8px);\n}\n.daba-agent-card__row-text { min-width: 0; }\n.daba-agent-card__meta {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 2px 10px;\n margin: 0;\n font-size: 11.5px;\n}\n.daba-agent-card__meta-label { color: var(--daba-agent-muted); margin: 0; }\n.daba-agent-card__meta-value { margin: 0; color: var(--daba-agent-text); }\n.daba-agent-card__action {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n/* The intro is hidden, not removed, once a conversation starts: keeping it\n in the tree means resetConversation() can bring the same element back\n with its listeners intact, rather than rebuilding the prompt chips. */\n.daba-agent-intro--hidden { display: none !important; }\n\n/* ==========================================================================\n The reference, exactly.\n\n One block, read directly off the design: a tall white sheet with hairline\n borders, near-black type and grey secondaries, colour only on the starter\n icons. The composer is a single bordered card with its meta row inside\n it. The mark sits centred on the empty screen and top-left once a\n conversation exists. Earlier passes are gone — this supersedes them.\n ========================================================================== */\n.daba-agent-window {\n --ref-ink: #1a1a1a;\n --ref-muted: #707070;\n --ref-faint: #9a9a9a;\n --ref-line: #e5e5e5;\n --ref-line-soft: #efefef;\n --ref-mark: #2b2b2b;\n --ref-user: #f2f2f2;\n\n width: 400px;\n height: 740px;\n /* The launcher sits above the panel in the same column, so the panel\n must leave room for it plus the viewport margins — otherwise on a\n laptop screen the two overlap at the corner. 40px badge + 12px gap\n + 20px top + 20px bottom, rounded up. */\n max-height: calc(100vh - 100px);\n max-width: calc(100vw - 24px);\n background: #ffffff;\n color: var(--ref-ink);\n border: 1px solid #e8e8e8;\n border-radius: 16px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, .08), 0 2px 8px rgba(0, 0, 0, .04);\n overflow: hidden;\n animation: daba-ref-open 240ms cubic-bezier(.2, .8, .2, 1) both;\n}\n@keyframes daba-ref-open {\n from { opacity: 0; transform: translateY(10px) scale(.985); }\n to { opacity: 1; transform: none; }\n}\n\n/* --- header: mark left, two controls right, nothing else ----------------- */\n.daba-agent-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 0;\n padding: 20px 20px 0;\n border: none;\n background: transparent;\n}\n.daba-agent-header__mark,\n.daba-agent-header__logo {\n width: 24px;\n height: 24px;\n color: var(--ref-mark);\n}\n.daba-agent-window--intro .daba-agent-header__mark,\n.daba-agent-window--intro .daba-agent-header__logo { visibility: hidden; }\n.daba-agent-header__title {\n position: absolute;\n width: 1px; height: 1px;\n padding: 0; margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.daba-agent-header__status { display: none; }\n.daba-agent-header__right { display: flex; align-items: center; gap: 6px; }\n.daba-agent-header__btn {\n width: 28px; height: 28px;\n border: none;\n background: transparent;\n color: var(--ref-faint);\n border-radius: 6px;\n transition: color .15s ease, background .15s ease;\n}\n.daba-agent-header__btn > svg { width: 18px; height: 18px; }\n.daba-agent-header__btn:hover { color: var(--ref-ink); background: #f4f4f4; border: none; }\n\n/* --- scroll area ---------------------------------------------------------- */\n.daba-agent-messages {\n flex: 1;\n min-height: 0;\n padding: 16px 20px;\n gap: 16px;\n background: transparent;\n}\n\n/* --- intro: centred, with the air the reference gives it ------------------ */\n.daba-agent-intro {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 64px 12px 12px;\n gap: 0;\n}\n.daba-agent-intro__mark {\n width: 44px; height: 44px;\n margin: 0 0 28px;\n color: var(--ref-mark);\n}\n.daba-agent-intro__greeting {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 400;\n color: var(--ref-muted);\n}\n.daba-agent-intro__headline {\n margin: 0 0 12px;\n font-size: 20px;\n font-weight: 600;\n line-height: 1.3;\n letter-spacing: -.01em;\n color: var(--ref-ink);\n text-wrap: balance;\n}\n.daba-agent-intro__sub {\n margin: 0 0 28px;\n max-width: 280px;\n font-size: 14.5px;\n line-height: 1.55;\n color: var(--ref-muted);\n text-wrap: balance;\n}\n.daba-agent-intro__prompts {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 10px;\n}\n.daba-agent-prompt-chip {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 9px 13px;\n border: 1px solid var(--ref-line);\n border-radius: 8px;\n background: #ffffff;\n color: var(--ref-ink);\n font-size: 13px;\n font-weight: 500;\n line-height: 1;\n cursor: pointer;\n transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;\n}\n.daba-agent-prompt-chip:hover {\n border-color: #d9d9d9;\n box-shadow: 0 2px 6px rgba(0, 0, 0, .06);\n transform: translateY(-1px);\n}\n.daba-agent-prompt-chip__icon { width: 15px; height: 15px; }\n.daba-agent-prompt-chip--a .daba-agent-prompt-chip__icon { color: #3da35d; }\n.daba-agent-prompt-chip--b .daba-agent-prompt-chip__icon { color: #3b82f6; }\n.daba-agent-prompt-chip--c .daba-agent-prompt-chip__icon { color: #8b5cf6; }\n.daba-agent-prompt-chip--d .daba-agent-prompt-chip__icon { color: #ec4899; }\n.daba-agent-prompt-chip--e .daba-agent-prompt-chip__icon { color: #f97316; }\n.daba-agent-prompt-chip--f .daba-agent-prompt-chip__icon { color: #4b4b4b; }\n\n/* --- bubbles -------------------------------------------------------------- */\n.daba-agent-group { gap: 10px; }\n.daba-agent-msg {\n max-width: 84%;\n padding: 13px 16px;\n border-radius: 10px;\n font-size: 15px;\n line-height: 1.5;\n color: var(--ref-ink);\n animation: daba-ref-msg 200ms cubic-bezier(.2, .8, .2, 1) both;\n}\n@keyframes daba-ref-msg {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: none; }\n}\n.daba-agent-msg--agent {\n background: #ffffff;\n border: 1px solid var(--ref-line);\n border-bottom-left-radius: 10px;\n}\n.daba-agent-msg--user {\n background: var(--ref-user);\n border: none;\n font-weight: 400;\n border-bottom-right-radius: 10px;\n}\n.daba-agent-msg--system {\n background: transparent;\n border: none;\n color: var(--ref-muted);\n font-size: 13px;\n padding: 0 4px;\n}\n\n.daba-agent-typing {\n margin: 0 20px 6px;\n padding: 9px 12px;\n border: 1px solid var(--ref-line);\n border-radius: 8px;\n background: #ffffff;\n width: max-content;\n}\n.daba-agent-typing > span { background: #8a8a8a; }\n\n/* --- cards, drawn like the reference's list items ------------------------- */\n.daba-agent-cards { gap: 10px; }\n.daba-agent-card {\n padding: 12px 14px;\n border: 1px solid var(--ref-line);\n border-radius: 10px;\n background: #ffffff;\n box-shadow: none;\n}\n.daba-agent-card::before { display: none; }\n.daba-agent-card__title { font-size: 14px; font-weight: 600; color: var(--ref-ink); }\n.daba-agent-card__row, .daba-agent-card__summary { font-size: 13px; color: var(--ref-muted); }\n.daba-agent-card__actions { gap: 14px; }\n.daba-agent-card__btn {\n font-size: 13px;\n font-weight: 500;\n color: var(--ref-ink);\n background: transparent;\n border: none;\n padding: 0;\n text-decoration: underline;\n text-underline-offset: 3px;\n text-decoration-color: #c9c9c9;\n}\n.daba-agent-card__btn:hover { text-decoration-color: var(--ref-ink); background: transparent; }\n.daba-agent-window {\n --daba-agent-kind-event: #3da35d;\n --daba-agent-kind-news: #3b82f6;\n --daba-agent-kind-article: #8b5cf6;\n --daba-agent-kind-contact: #0891b2;\n --daba-agent-kind-action: #f97316;\n --daba-agent-kind-page: #707070;\n}\n\n/* --- composer: one card, field on top, meta row inside it ----------------- */\n.daba-agent-composer {\n margin: 0 20px 20px;\n border: 1px solid var(--ref-line);\n border-radius: 12px;\n background: #ffffff;\n overflow: hidden;\n flex: none;\n transition: border-color .15s ease, box-shadow .15s ease;\n}\n.daba-agent-composer:focus-within {\n border-color: #d4d4d4;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, .04);\n}\n.daba-agent-input-form {\n display: block;\n padding: 0;\n border: none;\n background: transparent;\n}\n.daba-agent-field {\n display: flex;\n align-items: center;\n gap: 10px;\n min-height: 48px;\n padding: 0 14px 0 16px;\n border: none;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n}\n.daba-agent-field:focus-within { border: none; box-shadow: none; }\n.daba-agent-field__icon { width: 16px; height: 16px; color: var(--ref-faint); }\n.daba-agent-field .daba-agent-input {\n flex: 1;\n min-width: 0;\n padding: 12px 0;\n border: none;\n background: transparent;\n box-shadow: none;\n font-size: 14.5px;\n color: var(--ref-ink);\n}\n.daba-agent-field .daba-agent-input::placeholder { color: var(--ref-faint); }\n.daba-agent-composer__mic {\n width: 28px; height: 28px;\n color: var(--ref-faint);\n border-radius: 6px;\n}\n.daba-agent-composer__mic > svg { width: 16px; height: 16px; }\n.daba-agent-composer__mic:hover { color: var(--ref-ink); background: #f4f4f4; }\n\n.daba-agent-send-btn {\n width: 28px; height: 28px;\n border-radius: 6px;\n background: var(--ref-mark);\n color: #ffffff;\n opacity: 0;\n transform: scale(.85);\n pointer-events: none;\n transition: opacity .14s ease, transform .14s ease, background .14s ease;\n}\n.daba-agent-send-btn > svg { width: 14px; height: 14px; }\n.daba-agent-input-form--ready .daba-agent-send-btn {\n opacity: 1;\n transform: none;\n pointer-events: auto;\n}\n.daba-agent-send-btn:hover { background: #000000; transform: none; }\n\n.daba-agent-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 9px 16px 10px;\n border-top: 1px solid var(--ref-line-soft);\n background: transparent;\n font-size: 12.5px;\n color: var(--ref-muted);\n opacity: 1;\n text-align: initial;\n}\n.daba-agent-footer__brand {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--ref-muted);\n}\n.daba-agent-footer__chevron { width: 12px; height: 12px; color: var(--ref-faint); }\n.daba-agent-footer__chevron > svg { width: 100%; height: 100%; }\n.daba-agent-footer__right { display: inline-flex; align-items: center; gap: 14px; }\n.daba-agent-footer__item { display: inline-flex; align-items: center; gap: 5px; color: var(--ref-muted); white-space: nowrap; }\n.daba-agent-footer__icon { width: 13px; height: 13px; color: var(--ref-faint); }\n.daba-agent-footer__icon > svg { width: 100%; height: 100%; }\n\n/* --- RTL mirrors of the above ------------------------------------------- */\n.daba-agent-wrapper[dir=\"rtl\"] .daba-agent-field { padding: 0 16px 0 14px; }\n\n/* --- dark, same structure ------------------------------------------------- */\n.daba-agent-wrapper[data-daba-theme=\"dark\"] .daba-agent-window,\n.daba-agent-wrapper[data-daba-theme=\"dark\"] .daba-agent-msg--agent,\n.daba-agent-wrapper[data-daba-theme=\"dark\"] .daba-agent-card,\n.daba-agent-wrapper[data-daba-theme=\"dark\"] .daba-agent-composer,\n.daba-agent-wrapper[data-daba-theme=\"dark\"] .daba-agent-prompt-chip,\n.daba-agent-wrapper[data-daba-theme=\"dark\"] .daba-agent-typing {\n --ref-ink: #f4f4f5;\n --ref-muted: #a1a1aa;\n --ref-faint: #71717a;\n --ref-line: rgba(255,255,255,.12);\n --ref-line-soft: rgba(255,255,255,.08);\n --ref-mark: #f4f4f5;\n --ref-user: rgba(255,255,255,.08);\n background: #18181b;\n border-color: rgba(255,255,255,.12);\n}\n\n\n@media (max-width: 480px) {\n .daba-agent-window { width: 100%; height: 100%; max-height: none; max-width: none; border-radius: 0; }\n .daba-agent-intro { padding-top: 40px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .daba-agent-window, .daba-agent-msg { animation: none; }\n .daba-agent-prompt-chip, .daba-agent-send-btn { transition: none; }\n}\n\n/* --- one box, not a box in a box ------------------------------------------\n The base sheet gives the bare input a pill radius, a border and a focus\n ring so it can stand alone; inside the composer card every one of those\n becomes a second outline drawn inside the first. Reset all of it, in\n every state, at a specificity nothing below can lose to. */\n.daba-agent-window .daba-agent-composer .daba-agent-field,\n.daba-agent-window .daba-agent-composer .daba-agent-field:focus-within,\n.daba-agent-window .daba-agent-composer .daba-agent-input,\n.daba-agent-window .daba-agent-composer .daba-agent-input:focus,\n.daba-agent-window .daba-agent-composer .daba-agent-input:focus-visible {\n border: 0 !important;\n border-radius: 0 !important;\n box-shadow: none !important;\n outline: none !important;\n background: transparent !important;\n}\n\n/* --- launcher hides while the panel is open ------------------------------- */\n.daba-agent-wrapper--open .daba-agent-badge { display: none; }\n/* …and with nothing above it, the panel may use the room. */\n.daba-agent-wrapper--open .daba-agent-window { max-height: calc(100vh - 40px); }\n\n/* --- the mark is the launcher, at panel sizes ----------------------------- */\n.daba-agent-header__mark { width: 26px; height: 26px; border-radius: 6px; overflow: hidden; }\n.daba-agent-intro__mark { width: 52px; height: 52px; border-radius: 12px; overflow: hidden; }\n.daba-agent-header__mark > svg, .daba-agent-intro__mark > svg { width: 100%; height: 100%; display: block; }\n\n/* ==========================================================================\n Interaction: colour only, never movement, never shadow.\n\n Reconciled from three independent specs (Linear-style flat surfaces,\n Geist-style border elevation, HIG-style opacity states), taking the most\n restrained value wherever they disagreed. The customer rejected lift and\n shadow outright, and on reflection both were doing the same dishonest\n thing: implying depth on a sheet that has none.\n\n The whole system is one grey ladder off black on white — #fafafa 2%,\n #f7f7f7 3%, #f2f2f2 5%, #ebebeb 8%, #e5e5e5 10% (resting hairline),\n #d9d9d9 15% (panel edge), #d4d4d4 17% (border hover), #c7c7c7 22%\n (border active) — one easing, one duration, and transitions that name\n the paint properties they animate rather than a blanket 'all'. Hierarchy reads on\n a white host page because the panel's edge is one step darker than its\n interior hairlines, which is all a drop shadow was ever communicating.\n ========================================================================== */\n.daba-agent-wrapper {\n --daba-ease: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n --daba-ms: 120ms;\n}\n\n/* Nothing moves, nothing casts. Stated once, for every state. */\n.daba-agent-wrapper .daba-agent-window,\n.daba-agent-wrapper .daba-agent-badge,\n.daba-agent-wrapper .daba-agent-badge:hover,\n.daba-agent-wrapper .daba-agent-badge:active,\n.daba-agent-wrapper .daba-agent-badge:focus-visible,\n.daba-agent-wrapper .daba-agent-prompt-chip,\n.daba-agent-wrapper .daba-agent-prompt-chip:hover,\n.daba-agent-wrapper .daba-agent-prompt-chip:active,\n.daba-agent-wrapper .daba-agent-card,\n.daba-agent-wrapper .daba-agent-card:hover,\n.daba-agent-wrapper .daba-agent-send-btn,\n.daba-agent-wrapper .daba-agent-send-btn:hover,\n.daba-agent-wrapper .daba-agent-send-btn:active,\n.daba-agent-wrapper .daba-agent-header__btn,\n.daba-agent-wrapper .daba-agent-header__btn:hover,\n.daba-agent-wrapper .daba-agent-composer__mic,\n.daba-agent-wrapper .daba-agent-composer__mic:hover,\n.daba-agent-wrapper .daba-agent-composer,\n.daba-agent-wrapper .daba-agent-composer:focus-within {\n transform: none !important;\n box-shadow: none !important;\n}\n\n/* --- panel: elevation is its edge ----------------------------------------- */\n.daba-agent-window {\n border: 1px solid #d9d9d9;\n border-radius: 12px;\n background: #ffffff;\n}\n\n/* --- launcher: darkens toward black, same hue ----------------------------- */\n.daba-agent-badge {\n border-radius: 10px;\n transition: background-color var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-badge:hover { background: color-mix(in srgb, var(--daba-agent-accent) 92%, #000000); }\n.daba-agent-badge:active { background: color-mix(in srgb, var(--daba-agent-accent) 86%, #000000); transition-duration: 0ms; }\n.daba-agent-badge:focus-visible { outline: 2px solid #1a1a1a; outline-offset: 2px; }\n\n/* --- chips: border steps one shade, fill tints 3% ------------------------- */\n.daba-agent-prompt-chip {\n background-color: #ffffff;\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n color: #1a1a1a;\n transition: background-color var(--daba-ms) var(--daba-ease), border-color var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-prompt-chip:hover { background-color: #f7f7f7; border-color: #d4d4d4; color: #1a1a1a; }\n.daba-agent-prompt-chip:active { background-color: #f2f2f2; border-color: #c7c7c7; transition-duration: 0ms; }\n.daba-agent-prompt-chip:focus-visible { outline: 2px solid #1a1a1a; outline-offset: 2px; background-color: #ffffff; border-color: #e5e5e5; }\n\n/* --- icon buttons: borderless, so state is fill alone --------------------- */\n.daba-agent-header__btn,\n.daba-agent-composer__mic {\n background-color: transparent;\n border: 0;\n border-radius: 6px;\n color: #707070;\n transition: background-color var(--daba-ms) var(--daba-ease), color var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-header__btn:hover,\n.daba-agent-composer__mic:hover { background-color: #f2f2f2; color: #1a1a1a; border: 0; }\n.daba-agent-header__btn:active,\n.daba-agent-composer__mic:active { background-color: #ebebeb; color: #1a1a1a; transition-duration: 0ms; }\n.daba-agent-header__btn:focus-visible,\n.daba-agent-composer__mic:focus-visible { outline: 2px solid #1a1a1a; outline-offset: 2px; }\n\n/* --- send: enters by opacity, never by scale ------------------------------ */\n.daba-agent-send-btn {\n background-color: #1a1a1a;\n color: #ffffff;\n border: 0;\n border-radius: 6px;\n opacity: 0;\n pointer-events: none;\n transition: background-color var(--daba-ms) var(--daba-ease), opacity var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-input-form--ready .daba-agent-send-btn { opacity: 1; pointer-events: auto; }\n.daba-agent-send-btn:hover { background-color: #303030; }\n.daba-agent-send-btn:active { background-color: #0a0a0a; transition-duration: 0ms; }\n.daba-agent-send-btn:focus-visible { outline: 2px solid #1a1a1a; outline-offset: 2px; }\n\n/* --- cards are inert; only their text actions respond --------------------- */\n.daba-agent-card {\n background-color: #ffffff;\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n transition: none;\n}\n.daba-agent-card:hover { background-color: #ffffff; border-color: #e5e5e5; }\n.daba-agent-card__btn {\n color: #1a1a1a;\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 3px;\n text-decoration-color: #c7c7c7;\n transition: text-decoration-color var(--daba-ms) var(--daba-ease), color var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-card__btn:hover { color: #1a1a1a; text-decoration-color: #1a1a1a; background: transparent; }\n.daba-agent-card__btn:focus-visible { outline: 2px solid #1a1a1a; outline-offset: 2px; border-radius: 2px; }\n\n/* --- composer: focus is its edge, not a ring ------------------------------ */\n.daba-agent-composer {\n border: 1px solid #e5e5e5;\n border-radius: 12px;\n transition: border-color var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-composer:focus-within { border-color: #d4d4d4; }\n\n/* --- typing dots: opacity is the one motion the reference keeps ----------- */\n.daba-agent-typing > span { transition: none; }\n\n@media (prefers-reduced-motion: reduce) {\n .daba-agent-wrapper * { transition-duration: 0ms !important; animation-duration: 0ms !important; }\n}\n\n/* --- structured replies --------------------------------------------------- */\n.daba-agent-msg--agent .daba-agent-md__p { margin: 0; }\n.daba-agent-msg--agent .daba-agent-md__p + .daba-agent-md__p,\n.daba-agent-msg--agent .daba-agent-md__p + .daba-agent-md__list,\n.daba-agent-msg--agent .daba-agent-md__list + .daba-agent-md__p,\n.daba-agent-msg--agent .daba-agent-md__list + .daba-agent-md__h,\n.daba-agent-msg--agent .daba-agent-md__p + .daba-agent-md__h { margin-top: 10px; }\n.daba-agent-msg--agent .daba-agent-md__h {\n margin: 0 0 6px;\n font-size: 14px;\n font-weight: 600;\n color: #1a1a1a;\n}\n.daba-agent-msg--agent .daba-agent-md__list {\n margin: 0;\n padding-inline-start: 18px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.daba-agent-msg--agent .daba-agent-md__list .daba-agent-md__list { margin-top: 4px; }\n.daba-agent-msg--agent li { margin: 0; padding: 0; }\n.daba-agent-msg--agent strong { font-weight: 600; }\n\n/* Follow-ups: the same chip language as the starters, one size down. */\n.daba-agent-suggestions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n max-width: 92%;\n}\n.daba-agent-suggestion {\n padding: 7px 11px;\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n background-color: #ffffff;\n color: #1a1a1a;\n font-size: 12.5px;\n font-weight: 500;\n line-height: 1.3;\n text-align: start;\n cursor: pointer;\n transition: background-color var(--daba-ms) var(--daba-ease), border-color var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-suggestion:hover { background-color: #f7f7f7; border-color: #d4d4d4; }\n.daba-agent-suggestion:active { background-color: #f2f2f2; border-color: #c7c7c7; transition-duration: 0ms; }\n.daba-agent-suggestion:focus-visible { outline: 2px solid #1a1a1a; outline-offset: 2px; }\n\n/* --- live content inside replies ----------------------------------------- */\n.daba-agent-msg--agent a.daba-agent-md__link {\n color: #1a1a1a;\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 3px;\n text-decoration-color: #c7c7c7;\n transition: text-decoration-color var(--daba-ms) var(--daba-ease);\n}\n.daba-agent-msg--agent a.daba-agent-md__link:hover { text-decoration-color: #1a1a1a; }\n.daba-agent-msg--agent a.daba-agent-md__link:focus-visible { outline: 2px solid #1a1a1a; outline-offset: 2px; border-radius: 2px; }\n/* Numbers line up and never wrap mid-number. */\n.daba-agent-msg--agent a.daba-agent-md__link--tel { font-variant-numeric: tabular-nums; white-space: nowrap; }\n.daba-agent-msg--agent em { font-style: italic; }\n.daba-agent-msg--agent .daba-agent-md__code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 0.92em;\n padding: 1px 5px;\n border-radius: 4px;\n background: #f2f2f2;\n color: #1a1a1a;\n}\n.daba-agent-msg--agent .daba-agent-md__quote {\n margin: 8px 0 0;\n padding: 2px 0 2px 12px;\n border-inline-start: 2px solid #e5e5e5;\n color: #707070;\n}\n.daba-agent-msg--agent .daba-agent-md__hr {\n border: 0;\n border-top: 1px solid #e5e5e5;\n margin: 10px 0;\n}\n.daba-agent-msg--agent .daba-agent-md__table-wrap { overflow-x: auto; margin-top: 8px; }\n.daba-agent-msg--agent .daba-agent-md__table {\n border-collapse: collapse;\n width: 100%;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n}\n.daba-agent-msg--agent .daba-agent-md__table th,\n.daba-agent-msg--agent .daba-agent-md__table td {\n text-align: start;\n padding: 6px 8px;\n border-bottom: 1px solid #e5e5e5;\n vertical-align: top;\n}\n.daba-agent-msg--agent .daba-agent-md__table th { font-weight: 600; color: #1a1a1a; }\n.daba-agent-msg--agent .daba-agent-md__table td { color: #1a1a1a; }\n.daba-agent-msg--agent .daba-agent-md__table tbody tr:last-child td { border-bottom: 0; }\n\n/* --- thinking skeleton ---------------------------------------------------- */\n.daba-agent-skeleton {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 180px;\n padding: 14px 16px;\n}\n.daba-agent-skeleton__line {\n display: block;\n height: 10px;\n border-radius: 999px;\n background: linear-gradient(90deg, #ececec 0%, #f7f7f7 40%, #ececec 80%);\n background-size: 220% 100%;\n animation: daba-agent-shimmer 1.4s ease-in-out infinite;\n}\n.daba-agent-skeleton__line:nth-child(2) { animation-delay: .12s; }\n.daba-agent-skeleton__line:nth-child(3) { animation-delay: .24s; }\n@keyframes daba-agent-shimmer {\n 0% { background-position: 120% 0; }\n 100% { background-position: -120% 0; }\n}\n.daba-agent-thinking__label {\n font-size: 11.5px;\n color: var(--ref-muted, #707070);\n padding-inline-start: 4px;\n}\n@media (prefers-reduced-motion: reduce) {\n .daba-agent-skeleton__line { animation: none; background: #efefef; }\n}\n\n/* --- customer logos ------------------------------------------------------- */\n.daba-agent-header__mark-slot { display: inline-flex; align-items: center; }\n.daba-agent-intro__mark-slot { display: block; margin: 0 auto 28px; }\n.daba-agent-intro__mark-slot > .daba-agent-intro__mark { margin: 0; }\n.daba-agent-intro__logo { object-fit: contain; }\n.daba-agent-badge__img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: inherit;\n}\n\n`;\n\n/** Idempotent: the widget can be constructed many times on one page (a\n * React StrictMode double-mount, several agents in one dashboard) and the\n * sheet must be injected exactly once. */\nexport function injectAgentStyles(): void {\n if (document.getElementById(STYLE_ELEMENT_ID)) return;\n const style = document.createElement(\"style\");\n style.id = STYLE_ELEMENT_ID;\n style.textContent = SHEET;\n document.head.appendChild(style);\n}\n","/** The Dabalabs wordmark, for the panel header.\n *\n * Inlined rather than fetched. The widget runs on a stranger's page under\n * their Content-Security-Policy, and an <img src> pointing at our CDN is\n * exactly the request a strict `img-src 'self'` blocks — the panel would\n * lose its identity on precisely the enterprise sites most likely to have\n * such a policy. Inline SVG has no such dependency and costs one round\n * trip fewer.\n *\n * `currentColor` throughout, so the mark inherits the panel's text token\n * and stays legible in light mode, dark mode, and on a customer's own\n * surface colour without shipping three copies. The source asset is solid\n * black; that is the one substitution made here.\n */\nexport const DABA_WORDMARK_SVG = `<svg viewBox=\"0 0 509 187\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n<path d=\"M118 0.87793C122.903 0.87793 126.878 4.85281 126.878 9.75586V91.5596C126.905 92.3236 126.92 93.0916 126.92 93.8623C126.92 94.6325 126.905 95.3995 126.878 96.1631V96.4355C126.878 96.7771 126.856 97.1138 126.818 97.4453C124.96 130.826 97.3053 157.322 63.46 157.322C28.4122 157.322 0.000263921 128.91 0 93.8623C8.24653e-06 58.8143 28.412 30.4024 63.46 30.4023C81.3892 30.4023 97.5813 37.8376 109.122 49.793V9.75586C109.122 4.85281 113.097 0.87793 118 0.87793ZM63.46 48.1582C38.2181 48.1582 17.7559 68.6204 17.7559 93.8623C17.7561 119.104 38.2183 139.566 63.46 139.566C88.0677 139.566 108.129 120.119 109.122 95.7549V91.9678C108.129 67.6043 88.0673 48.1582 63.46 48.1582Z\"/>\n<path d=\"M263.6 0C268.503 0 272.478 3.97489 272.478 8.87793V48.9365C284.02 36.9686 300.22 29.5244 318.16 29.5244C353.208 29.5244 381.62 57.9364 381.62 92.9844C381.62 128.032 353.208 156.444 318.16 156.444C284.415 156.444 256.821 130.104 254.817 96.8623C254.776 96.5838 254.748 96.301 254.733 96.0146L254.722 95.5576V94.6514C254.707 94.0974 254.7 93.5417 254.7 92.9844C254.7 92.4265 254.707 91.8698 254.722 91.3154V8.87793C254.722 3.97502 258.697 0.000214415 263.6 0ZM318.16 47.2803C293.373 47.2803 273.196 67.0123 272.478 91.626V94.3408C273.195 118.955 293.372 138.688 318.16 138.688C343.402 138.688 363.864 118.226 363.864 92.9844C363.864 67.7425 343.402 47.2803 318.16 47.2803Z\"/>\n<path d=\"M190.46 29.8779C224.374 29.8781 252.073 56.4817 253.83 89.958C253.861 90.2604 253.878 90.5673 253.878 90.8779V91.042C253.905 91.8041 253.92 92.5701 253.92 93.3389C253.92 94.1071 253.905 94.8721 253.878 95.6338V177.555C253.878 182.458 249.903 186.433 245 186.433C240.097 186.433 236.122 182.458 236.122 177.555V137.406C224.581 149.362 208.389 156.799 190.46 156.799C155.412 156.799 127 128.387 127 93.3389C127 58.2909 155.412 29.8779 190.46 29.8779ZM190.46 47.6348C165.218 47.6348 144.756 68.097 144.756 93.3389C144.756 118.581 165.218 139.043 190.46 139.043C215.071 139.043 235.135 119.59 236.122 95.2207V91.4551C235.134 67.0867 215.071 47.6349 190.46 47.6348Z\"/>\n<path d=\"M445.46 29.8779C479.201 29.878 506.789 56.2105 508.801 89.4453C508.928 90.0447 508.997 90.6662 508.997 91.3037V177.98C508.997 182.884 505.022 186.858 500.119 186.858C495.216 186.858 491.241 182.883 491.241 177.98V137.282C479.693 149.31 463.451 156.799 445.46 156.799C410.412 156.799 382 128.387 382 93.3389C382 58.2909 410.412 29.8779 445.46 29.8779ZM445.46 47.6348C420.218 47.6348 399.756 68.097 399.756 93.3389C399.756 118.581 420.218 139.043 445.46 139.043C470.702 139.043 491.164 118.58 491.164 93.3389C491.164 68.0971 470.702 47.6349 445.46 47.6348Z\"/>\n</svg>`;\n\n/** Just the \"d\" bowl from the wordmark — the square-ish glyph that reads\n * at 20px where the full lockup turns to mud. Used wherever the mark has\n * to sit in a small round or square slot. */\nexport const DABA_MARK_SVG = `<svg viewBox=\"0 0 127 158\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n<path d=\"M118 0.87793C122.903 0.87793 126.878 4.85281 126.878 9.75586V91.5596C126.905 92.3236 126.92 93.0916 126.92 93.8623C126.92 94.6325 126.905 95.3995 126.878 96.1631V96.4355C126.878 96.7771 126.856 97.1138 126.818 97.4453C124.96 130.826 97.3053 157.322 63.46 157.322C28.4122 157.322 0.000263921 128.91 0 93.8623C8.24653e-06 58.8143 28.412 30.4024 63.46 30.4023C81.3892 30.4023 97.5813 37.8376 109.122 49.793V9.75586C109.122 4.85281 113.097 0.87793 118 0.87793ZM63.46 48.1582C38.2181 48.1582 17.7559 68.6204 17.7559 93.8623C17.7561 119.104 38.2183 139.566 63.46 139.566C88.0677 139.566 108.129 120.119 109.122 95.7549V91.9678C108.129 67.6043 88.0673 48.1582 63.46 48.1582Z\"/>\n</svg>`;\n\n/**\n * The launcher, reduced to what survives at 24px.\n *\n * The badge on the page is the shipped design asset in icon.ts — a green\n * rounded square, a white mask glyph, and grain/blur decoration that reads\n * at 40px and vanishes below it. A visitor who clicks that button and then\n * sees a different mark in the panel is looking at two products; this is\n * the same square and the same glyph, without the texture, so the header\n * and the intro screen carry the exact logo they just tapped.\n *\n * Colours follow the same custom properties the badge honours\n * (--daba-agent-icon-bg / --daba-agent-icon-mark), so a host that has\n * recoloured the launcher gets the identical recolour here.\n */\nexport const AGENT_BADGE_SVG = `<svg viewBox=\"0 0 469 469\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n<rect width=\"469\" height=\"469\" rx=\"70\" fill=\"var(--daba-agent-icon-bg, #0B8458)\"/>\n<path d=\"M234.833 374.667C312.061 374.667 374.667 312.061 374.667 234.833C374.667 157.606 312.061 95 234.833 95C157.606 95 95 157.606 95 234.833C95 312.061 157.606 374.667 234.833 374.667ZM116.241 234.833C116.241 178.636 150.381 142.791 174.804 142.791C201.687 142.791 213.593 194.159 213.593 234.833C213.593 275.508 201.687 326.876 174.804 326.876C150.381 326.876 116.241 291.031 116.241 234.833ZM294.863 142.791C319.285 142.791 353.426 178.636 353.426 234.833C353.426 291.031 319.285 326.876 294.863 326.876C267.98 326.876 256.074 275.508 256.074 234.833C256.074 194.159 267.98 142.791 294.863 142.791ZM234.833 353.426C258.295 353.426 277.314 347.483 277.314 340.151C277.314 332.819 258.295 326.876 234.833 326.876C211.372 326.876 192.352 332.819 192.352 340.151C192.352 347.483 211.372 353.426 234.833 353.426Z\" fill=\"var(--daba-agent-icon-mark, #ffffff)\"/>\n</svg>`;\n\n/**\n * The DabaAgent product logo — the same asset the marketing site uses for\n * the product — as a glyph in currentColor, and as the badge form: the\n * glyph in white on the launcher's green rounded square. The panel header,\n * the intro screen and the launcher all draw this, so a visitor taps one\n * mark and is greeted by the same one. Recolour follows the same custom\n * properties the launcher has always honoured.\n */\nexport const AGENT_LOGO_SVG = `<svg viewBox=\"0 0 147.502 147.502\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M73.751 0C114.483 0 147.502 33.0194 147.502 73.751C147.502 114.483 114.483 147.502 73.751 147.502C33.0194 147.502 0 114.483 0 73.751C8.24653e-06 33.0194 33.0194 8.2476e-06 73.751 0ZM73.751 116.118C60.7517 116.118 50.2141 120.334 50.2139 125.533C50.2139 130.733 60.7515 134.948 73.751 134.948C86.7504 134.948 97.2881 130.733 97.2881 125.533C97.2878 120.334 86.7502 116.118 73.751 116.118ZM38.9844 31.3828C27.962 31.3828 12.5537 47.8829 12.5537 73.751C12.5538 99.619 27.9621 116.118 38.9844 116.118C51.1171 116.118 56.4902 92.4737 56.4902 73.751C56.4902 55.0282 51.1171 31.3829 38.9844 31.3828ZM108.518 31.3828C96.3849 31.3831 91.0117 55.0283 91.0117 73.751C91.0117 92.4736 96.385 116.118 108.518 116.118C119.54 116.118 134.948 99.619 134.948 73.751C134.948 47.8829 119.54 31.3828 108.518 31.3828Z\"/></svg>`;\n\nexport const AGENT_LOGO_BADGE_SVG = `<svg viewBox=\"0 0 469 469\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n<rect width=\"469\" height=\"469\" rx=\"70\" fill=\"var(--daba-agent-icon-bg, #0B8458)\"/>\n<g transform=\"translate(94 94) scale(1.905)\"><path d=\"M73.751 0C114.483 0 147.502 33.0194 147.502 73.751C147.502 114.483 114.483 147.502 73.751 147.502C33.0194 147.502 0 114.483 0 73.751C8.24653e-06 33.0194 33.0194 8.2476e-06 73.751 0ZM73.751 116.118C60.7517 116.118 50.2141 120.334 50.2139 125.533C50.2139 130.733 60.7515 134.948 73.751 134.948C86.7504 134.948 97.2881 130.733 97.2881 125.533C97.2878 120.334 86.7502 116.118 73.751 116.118ZM38.9844 31.3828C27.962 31.3828 12.5537 47.8829 12.5537 73.751C12.5538 99.619 27.9621 116.118 38.9844 116.118C51.1171 116.118 56.4902 92.4737 56.4902 73.751C56.4902 55.0282 51.1171 31.3829 38.9844 31.3828ZM108.518 31.3828C96.3849 31.3831 91.0117 55.0283 91.0117 73.751C91.0117 92.4736 96.385 116.118 108.518 116.118C119.54 116.118 134.948 99.619 134.948 73.751C134.948 47.8829 119.54 31.3828 108.518 31.3828Z\" fill=\"var(--daba-agent-icon-mark, #ffffff)\"/></g>\n</svg>`;\n","import type { DabaAgentPosition, DabaAgentStatus, DabaAgentMode } from \"../types\";\nimport { injectAgentStyles } from \"./styles\";\nimport { AGENT_LOGO_BADGE_SVG } from \"./brand\";\n\nconst STATUS_TEXT: Record<DabaAgentStatus, string> = {\n idle: \"Click and talk\",\n connecting: \"Connecting…\",\n listening: \"Listening…\",\n thinking: \"Thinking…\",\n speaking: \"Speaking…\",\n};\n\nexport function buildBadge(\n position: DabaAgentPosition,\n mode: DabaAgentMode,\n accentColor?: string,\n iconBackgroundColor?: string,\n iconMarkColor?: string,\n): { root: HTMLElement; label: HTMLElement } {\n injectAgentStyles();\n\n const root = document.createElement(\"button\");\n root.type = \"button\";\n root.className = `daba-agent-badge daba-agent-badge--idle daba-agent-badge--pos-${position}`;\n root.setAttribute(\"aria-label\", \"Click and talk to AI Assistant (Ctrl+Space)\");\n // Native `title` — a tooltip on hover, no extra JS/positioning logic\n // needed, and kept in sync with status text the same way the old\n // always-visible label used to be (see updateBadge below).\n root.title = STATUS_TEXT.idle;\n if (accentColor) root.style.setProperty(\"--daba-agent-accent\", accentColor);\n if (iconBackgroundColor) root.style.setProperty(\"--daba-agent-icon-bg\", iconBackgroundColor);\n if (iconMarkColor) root.style.setProperty(\"--daba-agent-icon-mark\", iconMarkColor);\n\n const icon = document.createElement(\"span\");\n icon.className = \"daba-agent-badge__icon\";\n icon.innerHTML = AGENT_LOGO_BADGE_SVG;\n root.appendChild(icon);\n\n const dot = document.createElement(\"span\");\n dot.className = \"daba-agent-badge__dot\";\n root.appendChild(dot);\n\n // Kept off-screen (not display:none, so it stays in the accessibility\n // tree) — status text now lives in the `title` tooltip + the dot color,\n // not as always-visible text next to the icon.\n const label = document.createElement(\"span\");\n label.className = \"daba-agent-badge__label daba-agent-badge__label--sr-only\";\n label.textContent = STATUS_TEXT.idle;\n root.appendChild(label);\n\n return { root, label };\n}\n\nexport function updateBadge(\n root: HTMLElement,\n label: HTMLElement,\n status: DabaAgentStatus,\n position: DabaAgentPosition,\n): void {\n root.className = `daba-agent-badge daba-agent-badge--${status} daba-agent-badge--pos-${position}`;\n root.title = STATUS_TEXT[status];\n label.textContent = STATUS_TEXT[status];\n}\n\n/**\n * Replace the launcher's mark with a customer's own image. The gateway\n * only serves https or site-relative URLs here, so this is safe to set\n * straight onto an <img>. On a broken URL the shipped mark comes back:\n * a torn-image glyph on a customer's site is worse than our logo.\n */\nexport function setBadgeIcon(root: HTMLElement, url: string | null | undefined): void {\n const slot = root.querySelector<HTMLElement>(\".daba-agent-badge__icon\");\n if (!slot) return;\n if (!url) {\n slot.innerHTML = AGENT_LOGO_BADGE_SVG;\n return;\n }\n const img = document.createElement(\"img\");\n img.className = \"daba-agent-badge__img\";\n img.alt = \"\";\n img.decoding = \"async\";\n img.addEventListener(\"error\", () => { slot.innerHTML = AGENT_LOGO_BADGE_SVG; });\n img.src = url;\n slot.textContent = \"\";\n slot.appendChild(img);\n}\n","import type { DabaCard, DabaCardKind } from \"../types\";\nimport type { DabaStrings } from \"../i18n/locales\";\n\n/**\n * Cards — the structured half of a reply.\n *\n * When a visitor asks about an event, an article or a news item, the\n * answer is an *item*: a title, its date, and for an event where it is\n * and how to get there. A paragraph of prose cannot be scanned, cannot be\n * clicked and cannot be put in a calendar, which is why the whole feature\n * exists.\n *\n * SECURITY, the rule this file lives by: every value that came from the\n * model is written with `textContent`. The only `innerHTML` here is the\n * inline SVG defined below, which is a constant authored in this file and\n * never has anything interpolated into it. Card text is model-authored\n * prose derived from a customer's ingested site content, so a single\n * innerHTML on a card field would be a stored-XSS sink on *every* page\n * that embeds the widget — one poisoned sentence on one ingested page\n * would execute script on every customer site the bundle ships to.\n */\n\n/** Feather-style geometry, matching the icons already used in the header. */\nfunction svgIcon(body: string): string {\n return `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${body}</svg>`;\n}\n\n/** One mark per kind, so a list of mixed results is scannable by shape\n * before it is read. An unknown kind is rendered as a page (the same\n * fallback the gateway applies), never dropped. */\nconst KIND_ICONS: Record<DabaCardKind, string> = {\n event: svgIcon(\n `<rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/>`,\n ),\n news: svgIcon(\n `<path d=\"M4 5h12v14a2 2 0 0 0 2 2H5a1 1 0 0 1-1-1z\"/><path d=\"M16 8h4v11a2 2 0 0 1-2 2\"/><line x1=\"7\" y1=\"9\" x2=\"13\" y2=\"9\"/><line x1=\"7\" y1=\"13\" x2=\"13\" y2=\"13\"/><line x1=\"7\" y1=\"17\" x2=\"11\" y2=\"17\"/>`,\n ),\n article: svgIcon(\n `<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\"/><line x1=\"8\" y1=\"17\" x2=\"13\" y2=\"17\"/>`,\n ),\n contact: svgIcon(`<rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"/><path d=\"m22 6-10 7L2 6\"/>`),\n action: svgIcon(`<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M9 12h6\"/><path d=\"m13 9 3 3-3 3\"/>`),\n page: svgIcon(`<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/>`),\n};\n\nconst ICON_CALENDAR = KIND_ICONS.event;\nconst ICON_PIN = svgIcon(`<path d=\"M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/>`);\nconst ICON_OPEN = svgIcon(\n `<path d=\"M14 3h7v7\"/><path d=\"M21 3 10 14\"/><path d=\"M19 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h5\"/>`,\n);\n\n/** A bare `YYYY-MM-DD` carries no time; anything with `T`/space + `HH:MM` does. */\nconst DAY_ONLY = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst HAS_TIME = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}/;\n\nfunction clean(value?: string | null): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\n/** \"auto\" is the widget's own sentinel for \"follow the page\"; `Intl`\n * expresses that as no locale at all rather than as a tag. */\nfunction intlLocale(lang: string): string | undefined {\n const tag = clean(lang);\n return !tag || tag === \"auto\" ? undefined : tag;\n}\n\nfunction parseIsoDate(raw: string): Date | null {\n // `new Date(\"2026-09-04\")` is parsed as UTC midnight, which renders as\n // the day BEFORE anywhere west of Greenwich — an event would silently\n // move a day for half the world. A source with no time in it means a\n // calendar day, so build a local one.\n const parsed = DAY_ONLY.test(raw)\n ? new Date(Number(raw.slice(0, 4)), Number(raw.slice(5, 7)) - 1, Number(raw.slice(8, 10)))\n : new Date(raw);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\n/**\n * Format an ISO date for display in the resolved UI language.\n *\n * A card must never be lost to a formatting failure: a string the model\n * invented, a locale the browser has no data for, a platform that throws\n * on either — all of them fall back to showing the source text. A visitor\n * reading \"2026-09-04\" has still been told when the event is; a blank row\n * or a thrown error has told them nothing.\n *\n * `withTime` is a ceiling, not a demand — a date-only source never grows\n * a 12:00 AM that was not in the data.\n */\nexport function formatCardDate(iso: string, lang: string, withTime: boolean): string {\n const raw = clean(iso);\n if (!raw) return \"\";\n try {\n const parsed = parseIsoDate(raw);\n if (!parsed) return raw;\n const options: Intl.DateTimeFormatOptions = { year: \"numeric\", month: \"short\", day: \"numeric\" };\n if (withTime && HAS_TIME.test(raw)) {\n options.hour = \"numeric\";\n options.minute = \"2-digit\";\n }\n return new Intl.DateTimeFormat(intlLocale(lang), options).format(parsed);\n } catch {\n return raw;\n }\n}\n\nfunction formatCardTime(iso: string, lang: string): string {\n const raw = clean(iso);\n if (!raw) return \"\";\n try {\n const parsed = parseIsoDate(raw);\n if (!parsed) return raw;\n return new Intl.DateTimeFormat(intlLocale(lang), { hour: \"numeric\", minute: \"2-digit\" }).format(parsed);\n } catch {\n return raw;\n }\n}\n\n/** The one line a visitor scans for: when this is. Collapses a range that\n * starts and ends on the same day, because \"Sep 4 – Sep 4\" reads as two\n * separate things happening. */\nfunction buildWhenText(card: DabaCard, lang: string): string {\n const start = clean(card.date) || clean(card.endDate);\n if (!start) return \"\";\n const startText = formatCardDate(start, lang, true);\n const end = clean(card.date) ? clean(card.endDate) : \"\";\n if (!end) return startText;\n\n const endText = formatCardDate(end, lang, true);\n if (!endText || endText === startText) return startText;\n const sameDay = formatCardDate(start, lang, false) === formatCardDate(end, lang, false);\n if (sameDay) {\n // Show the day once and let the end contribute only its clock time —\n // and only when the source actually had one.\n return HAS_TIME.test(end) ? `${startText} – ${formatCardTime(end, lang)}` : startText;\n }\n return `${startText} – ${endText}`;\n}\n\n/**\n * The gateway is the real link boundary — `sanitize_cards` has already\n * reduced `url`/`imageUrl` to a site-relative path or a same-origin\n * http(s) URL and rebuilt `mapUrl` itself. This second check costs\n * nothing and means a widget pointed at an older or misconfigured\n * gateway still cannot put a `javascript:` URL behind a card button.\n */\nfunction safeUrl(value?: string | null): string | null {\n const raw = clean(value);\n if (!raw) return null;\n try {\n const resolved = new URL(raw, window.location.href);\n if (resolved.protocol !== \"http:\" && resolved.protocol !== \"https:\") return null;\n // Hand back the original form so a relative path stays relative.\n return raw;\n } catch {\n return null;\n }\n}\n\nfunction isExternal(href: string): boolean {\n try {\n return new URL(href, window.location.href).origin !== window.location.origin;\n } catch {\n return true;\n }\n}\n\n/** Wraps one of the constant SVG strings above. This is the only\n * `innerHTML` in the file — see the note at the top.\n *\n * An icon with no `name` is decoration and is hidden from assistive tech;\n * one with a name is the row's only label, since a calendar glyph beside\n * \"4 Sep 2026\" tells a screen-reader user nothing on its own. */\nfunction iconElement(markup: string, className: string, name?: string): HTMLElement {\n const span = document.createElement(\"span\");\n span.className = className;\n if (name) {\n span.setAttribute(\"role\", \"img\");\n span.setAttribute(\"aria-label\", name);\n } else {\n span.setAttribute(\"aria-hidden\", \"true\");\n }\n span.innerHTML = markup;\n return span;\n}\n\nfunction detailRow(markup: string, name: string, text: string, modifier: string): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = `daba-agent-card__row ${modifier}`;\n row.appendChild(iconElement(markup, \"daba-agent-card__row-icon\", name));\n const value = document.createElement(\"span\");\n value.className = \"daba-agent-card__row-text\";\n value.textContent = text;\n row.appendChild(value);\n return row;\n}\n\nfunction actionLink(href: string, text: string, markup: string, modifier: string): HTMLAnchorElement {\n const link = document.createElement(\"a\");\n link.className = `daba-agent-card__action ${modifier}`;\n link.href = href;\n // Never hand an embedding page's opener to a destination we did not write.\n link.rel = \"noopener noreferrer\";\n // A same-origin link is a link on the customer's own site, so navigating\n // in place is what the visitor expects. Anything else — a map, a partner\n // page — opens beside the page so the conversation survives the click.\n if (isExternal(href)) link.target = \"_blank\";\n link.appendChild(iconElement(markup, \"daba-agent-card__action-icon\"));\n const value = document.createElement(\"span\");\n value.textContent = text;\n link.appendChild(value);\n return link;\n}\n\n/** An article or a news item is read; everything else is opened. */\nfunction openLabel(kind: DabaCardKind, strings: DabaStrings): string {\n return kind === \"article\" || kind === \"news\" ? strings.readMore : strings.openLink;\n}\n\nexport function buildCard(card: DabaCard, strings: DabaStrings, lang: string): HTMLElement {\n const kind: DabaCardKind = card && KIND_ICONS[card.kind] ? card.kind : \"page\";\n const element = document.createElement(\"article\");\n element.className = `daba-agent-card daba-agent-card--${kind}`;\n\n const image = safeUrl(card.imageUrl);\n if (image) {\n const img = document.createElement(\"img\");\n img.className = \"daba-agent-card__image\";\n img.loading = \"lazy\";\n // Decorative: the title directly below already names the thing.\n img.alt = \"\";\n // A dead URL otherwise leaves a broken-image glyph in the middle of the\n // reply, which reads as the assistant itself being broken.\n img.addEventListener(\"error\", () => img.remove());\n img.src = image;\n element.appendChild(img);\n }\n\n const body = document.createElement(\"div\");\n body.className = \"daba-agent-card__body\";\n\n const head = document.createElement(\"div\");\n head.className = \"daba-agent-card__head\";\n head.appendChild(iconElement(KIND_ICONS[kind], \"daba-agent-card__icon\"));\n const title = document.createElement(\"div\");\n title.className = \"daba-agent-card__title\";\n // Announced as a heading without being one: the widget mounts into a\n // document whose outline belongs to the customer, and injecting real\n // <h3>s into it would rewrite that page's structure from a chat reply.\n title.setAttribute(\"role\", \"heading\");\n title.setAttribute(\"aria-level\", \"3\");\n title.textContent = clean(card.title);\n head.appendChild(title);\n body.appendChild(head);\n\n const when = buildWhenText(card, lang);\n if (when) body.appendChild(detailRow(ICON_CALENDAR, strings.dateLabel, when, \"daba-agent-card__row--when\"));\n\n // Not exclusive to events: a contact card carries an address too, and a\n // visitor asking \"where are you\" wants exactly this row.\n const place = [clean(card.locationName), clean(card.address)].filter(Boolean).join(\" · \");\n if (place) body.appendChild(detailRow(ICON_PIN, strings.locationLabel, place, \"daba-agent-card__row--where\"));\n\n const summary = clean(card.summary);\n if (summary) {\n const paragraph = document.createElement(\"p\");\n paragraph.className = \"daba-agent-card__summary\";\n paragraph.textContent = summary;\n body.appendChild(paragraph);\n }\n\n const meta = Array.isArray(card.meta) ? card.meta : [];\n if (meta.length) {\n const list = document.createElement(\"dl\");\n list.className = \"daba-agent-card__meta\";\n for (const entry of meta) {\n const metaLabel = clean(entry?.label);\n const metaValue = clean(entry?.value);\n if (!metaLabel && !metaValue) continue;\n const term = document.createElement(\"dt\");\n term.className = \"daba-agent-card__meta-label\";\n term.textContent = metaLabel;\n const definition = document.createElement(\"dd\");\n definition.className = \"daba-agent-card__meta-value\";\n definition.textContent = metaValue;\n list.appendChild(term);\n list.appendChild(definition);\n }\n if (list.childElementCount) body.appendChild(list);\n }\n\n const actions = document.createElement(\"div\");\n actions.className = \"daba-agent-card__actions\";\n const href = safeUrl(card.url);\n if (href) actions.appendChild(actionLink(href, openLabel(kind, strings), ICON_OPEN, \"daba-agent-card__action--open\"));\n const mapUrl = safeUrl(card.mapUrl);\n if (mapUrl) actions.appendChild(actionLink(mapUrl, strings.viewOnMap, ICON_PIN, \"daba-agent-card__action--map\"));\n if (actions.childElementCount) body.appendChild(actions);\n\n element.appendChild(body);\n return element;\n}\n\n/**\n * Build the list for one reply, or null when there is nothing to show —\n * so the caller can append the result unconditionally instead of\n * branching on every reply.\n */\nexport function buildCards(cards: DabaCard[], strings: DabaStrings, lang: string): HTMLElement | null {\n if (!Array.isArray(cards) || cards.length === 0) return null;\n\n const list = document.createElement(\"div\");\n list.className = \"daba-agent-cards\";\n list.setAttribute(\"role\", \"list\");\n list.setAttribute(\"aria-label\", strings.cardsLabel);\n\n for (const card of cards) {\n // The gateway already drops these, but a titleless card renders as a\n // silent empty box, so refuse it here too rather than trust upstream.\n if (!card || !clean(card.title)) continue;\n const element = buildCard(card, strings, lang);\n element.setAttribute(\"role\", \"listitem\");\n list.appendChild(element);\n }\n\n return list.childElementCount ? list : null;\n}\n","/**\n * A deliberately small, deliberately safe renderer for agent replies.\n *\n * The model may answer with structure — headings, lists, bold, tables — and\n * with things a visitor wants to act on: a page on this site, a phone\n * number, an email address. Each of those becomes the real thing here (an\n * anchor, a `tel:`, a `mailto:`) so a reply is something you can tap, not\n * just read.\n *\n * But the reply is model-authored text derived from site content, rendered\n * on a customer's page: it is the definition of untrusted input. So this\n * file never touches innerHTML and never parses HTML — every character of\n * text lands via textContent, and only the *structure* becomes elements.\n * And a link is only ever made clickable when it points at this site (a\n * relative path, or an absolute URL on the page's own host), or is a\n * `tel:`/`mailto:` built from validated digits or a validated address.\n * Anything else stays as plain text. That is the same boundary the\n * gateway draws for cards, applied to prose.\n */\n\nconst BULLET = /^(\\s*)([-*•])\\s+(.*)$/;\nconst NUMBERED = /^(\\s*)(\\d+)[.)]\\s+(.*)$/;\nconst HEADING = /^#{1,6}\\s+(.*)$/;\nconst QUOTE = /^>\\s?(.*)$/;\nconst RULE = /^\\s*(?:-{3,}|\\*{3,}|_{3,})\\s*$/;\nconst TABLE_ROW = /^\\s*\\|(.+)\\|\\s*$/;\nconst TABLE_SEP = /^\\s*\\|?\\s*:?-{2,}:?\\s*(?:\\|\\s*:?-{2,}:?\\s*)*\\|?\\s*$/;\n\n/* --- inline: structural tokens, in priority order --------------------------\n code first so nothing inside a code span is linkified or emboldened;\n images before links so `![alt](src)` is not read as a link with a stray\n `!`; bold before italic so `**x**` is not read as two italics. */\nconst INLINE =\n /(`[^`\\n]+`)|(!\\[([^\\]]*)\\]\\(([^)\\s]+)\\))|(\\[([^\\]]+)\\]\\(([^)\\s]+)\\))|(\\*\\*([^*\\n]+?)\\*\\*)|(\\*([^*\\s\\n](?:[^*\\n]*?[^*\\s\\n])?)\\*)/g;\n\n/* --- inline: things in plain text that deserve to be live ------------------ */\nconst URL_RE = /\\bhttps?:\\/\\/[^\\s<>()]+[^\\s<>().,;:!?'\"]/g;\nconst EMAIL = /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g;\n// A run of digits with the separators phone numbers use. Digit count is\n// checked afterwards so a year, a time or a price cannot match: the class\n// excludes \":\" and \",\", and seven digits is more than any of those carry.\nconst PHONE = /\\+?\\d[\\d\\s().-]{5,18}\\d/g;\n// Short service numbers (901, 999) only when the text says it is a number\n// to call — otherwise a four-digit year would become a phone link.\nconst SHORT_CODE = /\\b(?:call(?:\\s+cent(?:er|re))?|phone|dial|tel|hotline)\\W{0,4}(\\d{3,6})\\b(?![\\s().-]*\\d)/gi;\n// A bare site path such as `/tickets`: must start a word and begin with a\n// letter after the slash, so \"24/7\" and \"and/or\" do not qualify.\nconst SITE_PATH = /(^|[\\s(])(\\/[A-Za-z][A-Za-z0-9\\-._~/]*)/g;\nconst MIN_PHONE_DIGITS = 7;\n\nfunction pageHost(): string {\n try {\n return window.location.host.toLowerCase();\n } catch {\n return \"\";\n }\n}\n\n/**\n * The href a model-supplied link may carry, or null to render it as text.\n *\n * Site-relative paths pass. Absolute http(s) URLs pass only on this page's\n * own host. `//evil.example` is rejected explicitly — it starts with a slash\n * and would otherwise read as site-relative while resolving elsewhere.\n * Every other scheme — javascript:, data:, vbscript:, and anything the\n * model invents — never becomes an href.\n */\nexport function safeHref(raw: string): string | null {\n const value = raw.trim();\n if (!value || value.length > 2000) return null;\n if (value.startsWith(\"//\")) return null;\n if (value.startsWith(\"/\")) return value;\n if (/^https?:\\/\\//i.test(value)) {\n try {\n const url = new URL(value);\n const host = pageHost();\n return host && url.host.toLowerCase() === host ? url.href : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction anchor(text: string, href: string, kind: \"site\" | \"tel\" | \"mailto\"): HTMLAnchorElement {\n const a = document.createElement(\"a\");\n a.className = `daba-agent-md__link daba-agent-md__link--${kind}`;\n a.href = href;\n a.textContent = text;\n // Same-site links navigate in place, like any link on the customer's\n // own page would. tel:/mailto: hand off to the OS. Nothing opens a new\n // tab, because nothing here is ever off-site.\n a.rel = \"noopener\";\n return a;\n}\n\nfunction telHref(text: string): string {\n const digits = text.replace(/[^\\d]/g, \"\");\n return `tel:${text.trim().startsWith(\"+\") ? \"+\" : \"\"}${digits}`;\n}\n\n/** Plain text: turn URLs, site paths, emails and phone numbers live. */\nfunction linkify(target: HTMLElement, text: string): void {\n type Hit = { start: number; end: number; node: Node };\n const hits: Hit[] = [];\n const taken = (s: number, e: number) => hits.some((h) => s < h.end && e > h.start);\n\n for (const m of text.matchAll(URL_RE)) {\n const href = safeHref(m[0]);\n if (href && !taken(m.index!, m.index! + m[0].length)) {\n hits.push({ start: m.index!, end: m.index! + m[0].length, node: anchor(m[0], href, \"site\") });\n }\n }\n for (const m of text.matchAll(EMAIL)) {\n if (!taken(m.index!, m.index! + m[0].length)) {\n hits.push({ start: m.index!, end: m.index! + m[0].length, node: anchor(m[0], `mailto:${m[0]}`, \"mailto\") });\n }\n }\n for (const m of text.matchAll(PHONE)) {\n const digitCount = m[0].replace(/\\D/g, \"\").length;\n if (digitCount < MIN_PHONE_DIGITS) continue;\n if (!taken(m.index!, m.index! + m[0].length)) {\n hits.push({ start: m.index!, end: m.index! + m[0].length, node: anchor(m[0], telHref(m[0]), \"tel\") });\n }\n }\n for (const m of text.matchAll(SHORT_CODE)) {\n const digits = m[1];\n const start = m.index! + m[0].lastIndexOf(digits);\n if (!taken(start, start + digits.length)) {\n hits.push({ start, end: start + digits.length, node: anchor(digits, `tel:${digits}`, \"tel\") });\n }\n }\n for (const m of text.matchAll(SITE_PATH)) {\n // \"/tickets.\" — the sentence's full stop is not part of the path.\n const path = m[2].replace(/[.,;:!?)]+$/, \"\");\n const start = m.index! + m[1].length;\n if (!taken(start, start + path.length)) {\n hits.push({ start, end: start + path.length, node: anchor(path, path, \"site\") });\n }\n }\n\n hits.sort((a, b) => a.start - b.start);\n let cursor = 0;\n for (const h of hits) {\n if (h.start > cursor) target.appendChild(document.createTextNode(text.slice(cursor, h.start)));\n target.appendChild(h.node);\n cursor = h.end;\n }\n if (cursor < text.length) target.appendChild(document.createTextNode(text.slice(cursor)));\n}\n\n/** Inline markdown into `target`. Recursive, so a phone inside bold works. */\nexport function inline(target: HTMLElement, text: string): void {\n let cursor = 0;\n for (const m of text.matchAll(INLINE)) {\n const start = m.index!;\n if (start > cursor) linkify(target, text.slice(cursor, start));\n\n if (m[1]) {\n const code = document.createElement(\"code\");\n code.className = \"daba-agent-md__code\";\n code.textContent = m[1].slice(1, -1);\n target.appendChild(code);\n } else if (m[2]) {\n // An image is rendered as its alt text and nothing else: the widget\n // never loads media the model points at.\n if (m[3]) target.appendChild(document.createTextNode(m[3]));\n } else if (m[5]) {\n const href = safeHref(m[7]);\n if (href) target.appendChild(anchor(m[6], href, \"site\"));\n else inline(target, m[6]);\n } else if (m[8]) {\n const strong = document.createElement(\"strong\");\n inline(strong, m[9]);\n target.appendChild(strong);\n } else if (m[10]) {\n const em = document.createElement(\"em\");\n inline(em, m[11]);\n target.appendChild(em);\n }\n cursor = start + m[0].length;\n }\n if (cursor < text.length) linkify(target, text.slice(cursor));\n}\n\ninterface ListFrame {\n el: HTMLUListElement | HTMLOListElement;\n indent: number;\n}\n\nfunction splitCells(row: string): string[] {\n const inner = row.trim().replace(/^\\|/, \"\").replace(/\\|$/, \"\");\n return inner.split(\"|\").map((c) => c.trim());\n}\n\n/** Render `text` as children of `root`. Returns `root` for chaining. */\nexport function renderMarkdown(root: HTMLElement, text: string): HTMLElement {\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n let paragraph: string[] = [];\n const lists: ListFrame[] = [];\n let quote: HTMLQuoteElement | null = null;\n\n const flushParagraph = () => {\n if (!paragraph.length) return;\n const p = document.createElement(\"p\");\n p.className = \"daba-agent-md__p\";\n inline(p, paragraph.join(\" \"));\n (quote ?? root).appendChild(p);\n paragraph = [];\n };\n const closeLists = (toIndent = -1) => {\n while (lists.length && lists[lists.length - 1].indent > toIndent) lists.pop();\n };\n const closeQuote = () => {\n flushParagraph();\n quote = null;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n const line = raw.replace(/\\s+$/, \"\");\n\n if (!line.trim()) {\n flushParagraph();\n closeLists();\n closeQuote();\n continue;\n }\n\n if (RULE.test(line)) {\n flushParagraph();\n closeLists();\n closeQuote();\n const hr = document.createElement(\"hr\");\n hr.className = \"daba-agent-md__hr\";\n root.appendChild(hr);\n continue;\n }\n\n // A pipe table: this row plus a separator row beneath it.\n if (TABLE_ROW.test(line) && i + 1 < lines.length && TABLE_SEP.test(lines[i + 1])) {\n flushParagraph();\n closeLists();\n closeQuote();\n const wrap = document.createElement(\"div\");\n wrap.className = \"daba-agent-md__table-wrap\";\n const table = document.createElement(\"table\");\n table.className = \"daba-agent-md__table\";\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n for (const cell of splitCells(line)) {\n const th = document.createElement(\"th\");\n inline(th, cell);\n headRow.appendChild(th);\n }\n thead.appendChild(headRow);\n table.appendChild(thead);\n const tbody = document.createElement(\"tbody\");\n i += 1; // the separator\n while (i + 1 < lines.length && TABLE_ROW.test(lines[i + 1])) {\n i += 1;\n const tr = document.createElement(\"tr\");\n for (const cell of splitCells(lines[i])) {\n const td = document.createElement(\"td\");\n inline(td, cell);\n tr.appendChild(td);\n }\n tbody.appendChild(tr);\n }\n table.appendChild(tbody);\n wrap.appendChild(table);\n root.appendChild(wrap);\n continue;\n }\n\n const q = QUOTE.exec(line);\n if (q) {\n if (!quote) {\n flushParagraph();\n closeLists();\n quote = document.createElement(\"blockquote\");\n quote.className = \"daba-agent-md__quote\";\n root.appendChild(quote);\n }\n paragraph.push(q[1].trim());\n continue;\n } else if (quote) {\n closeQuote();\n }\n\n const h = HEADING.exec(line);\n if (h) {\n flushParagraph();\n closeLists();\n const el = document.createElement(\"p\");\n el.className = \"daba-agent-md__h\";\n inline(el, h[1].trim());\n root.appendChild(el);\n continue;\n }\n\n const item = BULLET.exec(line) ?? NUMBERED.exec(line);\n if (item) {\n flushParagraph();\n const indent = item[1].length;\n const ordered = NUMBERED.test(line);\n closeLists(indent);\n let frame = lists[lists.length - 1];\n if (!frame || frame.indent < indent) {\n const el = document.createElement(ordered ? \"ol\" : \"ul\");\n el.className = \"daba-agent-md__list\";\n const parentItem = frame?.el.lastElementChild;\n (parentItem ?? root).appendChild(el);\n frame = { el, indent };\n lists.push(frame);\n }\n const li = document.createElement(\"li\");\n inline(li, item[3]);\n frame.el.appendChild(li);\n continue;\n }\n\n // Plain text. A line indented under an open list item continues it.\n if (lists.length && raw.startsWith(\" \")) {\n const last = lists[lists.length - 1].el.lastElementChild;\n if (last) {\n last.appendChild(document.createTextNode(\" \"));\n inline(last as HTMLElement, line.trim());\n continue;\n }\n }\n closeLists();\n paragraph.push(line.trim());\n }\n flushParagraph();\n return root;\n}\n","import type { ChatMessage, DabaAgentMode, DabaCard, DabaIntro } from \"../types\";\nimport type { DabaStrings } from \"../i18n/locales\";\nimport { buildCards } from \"./cards\";\nimport { renderMarkdown } from \"./markdown\";\nimport { AGENT_LOGO_BADGE_SVG } from \"./brand\";\n\n/**\n * The panel.\n *\n * Two states, not two screens: an empty conversation shows the intro —\n * mark, greeting, and starter questions — and the first message replaces\n * it in place. Keeping them in one scroll container is what lets the\n * transition be a fade rather than a swap, and means the composer never\n * moves under a visitor's cursor.\n *\n * Every visible string arrives through `strings`; there is no English\n * literal in this file. Every value that came from a model or from a\n * project's own config is written with `textContent`. The only `innerHTML`\n * is for icons authored here — this renders inside a stranger's page, so\n * one interpolation would be an XSS sink on every customer at once.\n */\n\nexport interface ChatWindowOptions {\n title: string;\n placeholder: string;\n strings: DabaStrings;\n direction: \"ltr\" | \"rtl\";\n lang: string;\n mode: DabaAgentMode;\n intro: DabaIntro;\n logoUrl?: string | null;\n /** The shortcut as the visitor should read it, or null when disabled. */\n hotkeyLabel?: string | null;\n onSendText: (text: string) => void;\n onMicClick: () => void;\n onCloseClick: () => void;\n onNewConversation: () => void;\n}\n\nexport interface ChatWindowElements {\n chatWindow: HTMLElement;\n messagesContainer: HTMLElement;\n inputElement: HTMLInputElement;\n micBtn: HTMLElement;\n introEl: HTMLElement | null;\n composerMicBtn: HTMLElement | null;\n setTyping: (on: boolean) => void;\n setIntroVisible: (visible: boolean) => void;\n setStatusText: (text: string) => void;\n /** Apply project config that arrived after the panel was mounted. The\n * widget renders immediately on built-in defaults and the gateway's\n * answer lands a round trip later, so the intro copy and starter\n * questions have to be replaceable in place — rebuilding the panel\n * would blow away anything already typed. */\n applyConfig: (config: {\n title?: string;\n placeholder?: string;\n intro?: DabaIntro;\n /** A customer's logo for the header and intro; null restores ours. */\n logoUrl?: string | null;\n }) => void;\n}\n\nconst ICON = {\n mic: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"22\"/></svg>`,\n close: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`,\n refresh: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12a9 9 0 0 1 15-6.7L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-15 6.7L3 16\"/><path d=\"M3 21v-5h5\"/></svg>`,\n send: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/></svg>`,\n search: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></svg>`,\n spark: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3v4M12 17v4M3 12h4M17 12h4M5.6 5.6l2.8 2.8M15.6 15.6l2.8 2.8M18.4 5.6l-2.8 2.8M8.4 15.6l-2.8 2.8\"/></svg>`,\n grid: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><circle cx=\"5\" cy=\"5\" r=\"1.6\"/><circle cx=\"12\" cy=\"5\" r=\"1.6\"/><circle cx=\"19\" cy=\"5\" r=\"1.6\"/><circle cx=\"5\" cy=\"12\" r=\"1.6\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/><circle cx=\"19\" cy=\"12\" r=\"1.6\"/><circle cx=\"5\" cy=\"19\" r=\"1.6\"/><circle cx=\"12\" cy=\"19\" r=\"1.6\"/><circle cx=\"19\" cy=\"19\" r=\"1.6\"/></svg>`,\n calendar: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2.5\"/><path d=\"M3 10h18M8 3v4M16 3v4\"/></svg>`,\n news: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 5h12a2 2 0 0 1 2 2v11a2 2 0 0 0 2 2H6a2 2 0 0 1-2-2z\"/><path d=\"M8 9h6M8 13h6M8 17h4\"/></svg>`,\n ticket: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 9V7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v2a2 2 0 0 0 0 6v2a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-2a2 2 0 0 0 0-6z\"/><path d=\"M12 7v2M12 15v2\"/></svg>`,\n clock: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5V12l3 1.8\"/></svg>`,\n chevron: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>`,\n keys: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2.5\"/><path d=\"M7 10h.01M11 10h.01M15 10h.01M7 14h10\"/></svg>`,\n pin: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 21s7-5.7 7-11a7 7 0 1 0-14 0c0 5.3 7 11 7 11z\"/><circle cx=\"12\" cy=\"10\" r=\"2.5\"/></svg>`,\n};\n\n/**\n * Starter questions are free text a project owner writes, so there is no\n * category to look an icon up by. Rotating a fixed palette gives each chip\n * its own colour and glyph the way the reference design does, and — because\n * the sequence is positional — the same list always looks the same, which\n * a hash of the text would not guarantee.\n */\nconst CHIP_STYLES = [\n { icon: \"calendar\", tone: \"a\" },\n { icon: \"news\", tone: \"b\" },\n { icon: \"ticket\", tone: \"c\" },\n { icon: \"clock\", tone: \"d\" },\n { icon: \"pin\", tone: \"e\" },\n { icon: \"spark\", tone: \"f\" },\n] as const;\n\nfunction icon(markup: string, className: string): HTMLSpanElement {\n const span = document.createElement(\"span\");\n span.className = className;\n span.innerHTML = markup; // authored above, never interpolated\n return span;\n}\n\nfunction iconButton(markup: string, label: string, cls: string, onClick?: () => void): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = cls;\n btn.setAttribute(\"aria-label\", label);\n btn.title = label;\n btn.innerHTML = markup;\n if (onClick) btn.addEventListener(\"click\", onClick);\n return btn;\n}\n\nexport function buildChatWindow(options: ChatWindowOptions): ChatWindowElements {\n const {\n title,\n placeholder,\n strings,\n direction,\n lang,\n mode,\n intro,\n logoUrl,\n hotkeyLabel,\n onSendText,\n onMicClick,\n onCloseClick,\n onNewConversation,\n } = options;\n\n const voiceAvailable = mode !== \"chat\";\n\n const chatWindow = document.createElement(\"div\");\n chatWindow.className = \"daba-agent-window daba-agent-window--hidden daba-agent-window--intro\";\n chatWindow.dir = direction;\n chatWindow.lang = lang;\n chatWindow.setAttribute(\"role\", \"dialog\");\n chatWindow.setAttribute(\"aria-label\", title);\n\n // --- header -------------------------------------------------------------\n const header = document.createElement(\"div\");\n header.className = \"daba-agent-header\";\n\n const headerLeft = document.createElement(\"div\");\n headerLeft.className = \"daba-agent-header__left\";\n\n // The header mark is whatever the project says it is: a customer's own\n // logo when one is set, the DabaAgent logo otherwise. Held in a slot so\n // config that arrives after mount can swap it without rebuilding.\n const headerMarkSlot = document.createElement(\"span\");\n headerMarkSlot.className = \"daba-agent-header__mark-slot\";\n headerLeft.appendChild(headerMarkSlot);\n const setHeaderLogo = (url: string | null | undefined) => {\n headerMarkSlot.textContent = \"\";\n if (url) {\n const logo = document.createElement(\"img\");\n logo.className = \"daba-agent-header__logo\";\n logo.alt = \"\";\n // A broken logo box is worse than our own mark — a customer who\n // mistypes a URL gets the clean fallback, not a torn-image glyph\n // in their own product.\n logo.addEventListener(\"error\", () => setHeaderLogo(null));\n logo.src = url;\n headerMarkSlot.appendChild(logo);\n } else {\n headerMarkSlot.appendChild(icon(AGENT_LOGO_BADGE_SVG, \"daba-agent-header__mark\"));\n }\n };\n setHeaderLogo(logoUrl);\n\n const titleEl = document.createElement(\"span\");\n titleEl.className = \"daba-agent-header__title\";\n titleEl.textContent = title;\n headerLeft.appendChild(titleEl);\n\n const statusEl = document.createElement(\"span\");\n statusEl.className = \"daba-agent-header__status\";\n headerLeft.appendChild(statusEl);\n\n header.appendChild(headerLeft);\n\n const headerRight = document.createElement(\"div\");\n headerRight.className = \"daba-agent-header__right\";\n\n // The mic lives in the composer, next to the thing it is an alternative\n // to. A second copy in the header would be two controls for one action.\n const micBtn = iconButton(ICON.mic, strings.startVoice, \"daba-agent-header__btn daba-agent-header__btn--mic\", onMicClick);\n micBtn.hidden = true;\n\n headerRight.appendChild(\n iconButton(ICON.grid, strings.newConversation, \"daba-agent-header__btn\", onNewConversation),\n );\n headerRight.appendChild(iconButton(ICON.close, strings.close, \"daba-agent-header__btn\", onCloseClick));\n header.appendChild(headerRight);\n chatWindow.appendChild(header);\n\n // --- scroll area: intro + transcript ------------------------------------\n const messagesContainer = document.createElement(\"div\");\n messagesContainer.className = \"daba-agent-messages\";\n messagesContainer.setAttribute(\"role\", \"log\");\n messagesContainer.setAttribute(\"aria-live\", \"polite\");\n\n let introEl: HTMLElement | null = null;\n let introMarkSlot: HTMLElement | null = null;\n let introHeadline: HTMLElement | null = null;\n let introSub: HTMLElement | null = null;\n let promptList: HTMLElement | null = null;\n\n const setIntroLogo = (url: string | null | undefined) => {\n if (!introMarkSlot) return;\n introMarkSlot.textContent = \"\";\n if (url) {\n const img = document.createElement(\"img\");\n img.className = \"daba-agent-intro__mark daba-agent-intro__logo\";\n img.alt = \"\";\n img.addEventListener(\"error\", () => setIntroLogo(null));\n img.src = url;\n introMarkSlot.appendChild(img);\n } else {\n introMarkSlot.appendChild(icon(AGENT_LOGO_BADGE_SVG, \"daba-agent-intro__mark\"));\n }\n };\n\n function renderPrompts(prompts: string[]): void {\n if (!promptList) return;\n promptList.textContent = \"\";\n prompts.forEach((prompt, i) => {\n const style = CHIP_STYLES[i % CHIP_STYLES.length];\n const chip = document.createElement(\"button\");\n chip.type = \"button\";\n chip.className = `daba-agent-prompt-chip daba-agent-prompt-chip--${style.tone}`;\n chip.appendChild(icon(ICON[style.icon], \"daba-agent-prompt-chip__icon\"));\n const label = document.createElement(\"span\");\n label.textContent = prompt;\n chip.appendChild(label);\n chip.addEventListener(\"click\", () => onSendText(prompt));\n promptList!.appendChild(chip);\n });\n promptList.hidden = prompts.length === 0;\n }\n\n if (intro.enabled !== false) {\n introEl = document.createElement(\"div\");\n introEl.className = \"daba-agent-intro\";\n\n if (intro.mediaUrl && intro.mediaType === \"video\") {\n const video = document.createElement(\"video\");\n video.className = \"daba-agent-intro__media\";\n video.src = intro.mediaUrl;\n video.autoplay = true;\n video.muted = true;\n video.loop = true;\n video.playsInline = true;\n video.addEventListener(\"error\", () => video.remove());\n introEl.appendChild(video);\n } else if (intro.mediaUrl && intro.mediaType === \"image\") {\n const img = document.createElement(\"img\");\n img.className = \"daba-agent-intro__media\";\n img.src = intro.mediaUrl;\n img.alt = \"\";\n img.addEventListener(\"error\", () => img.remove());\n introEl.appendChild(img);\n } else {\n introMarkSlot = document.createElement(\"span\");\n introMarkSlot.className = \"daba-agent-intro__mark-slot\";\n introMarkSlot.appendChild(icon(AGENT_LOGO_BADGE_SVG, \"daba-agent-intro__mark\"));\n introEl.appendChild(introMarkSlot);\n }\n\n const greeting = document.createElement(\"p\");\n greeting.className = \"daba-agent-intro__greeting\";\n greeting.textContent = strings.introGreeting;\n introEl.appendChild(greeting);\n\n const headline = document.createElement(\"p\");\n headline.className = \"daba-agent-intro__headline\";\n headline.textContent = intro.headline || strings.introDefaultHeadline;\n introEl.appendChild(headline);\n\n const sub = document.createElement(\"p\");\n sub.className = \"daba-agent-intro__sub\";\n sub.textContent = intro.subheadline || strings.introDefaultSubheadline;\n introEl.appendChild(sub);\n\n promptList = document.createElement(\"div\");\n promptList.className = \"daba-agent-intro__prompts\";\n promptList.setAttribute(\"aria-label\", strings.suggestionsLabel);\n renderPrompts(intro.suggestedPrompts ?? []);\n introEl.appendChild(promptList);\n\n introHeadline = headline;\n introSub = sub;\n messagesContainer.appendChild(introEl);\n }\n\n chatWindow.appendChild(messagesContainer);\n\n // --- thinking skeleton --------------------------------------------------\n // A placeholder bubble in the transcript itself, where the reply will\n // land, rather than a dots pill parked at the bottom of the panel. It\n // says two things a spinner does not: an answer is coming, and it is\n // coming *here*.\n let thinkingEl: HTMLElement | null = null;\n const showThinking = () => {\n if (thinkingEl) return;\n const group = document.createElement(\"div\");\n group.className = \"daba-agent-group daba-agent-group--agent daba-agent-thinking\";\n const bubble = document.createElement(\"div\");\n bubble.className = \"daba-agent-msg daba-agent-msg--agent daba-agent-skeleton\";\n bubble.setAttribute(\"role\", \"status\");\n bubble.setAttribute(\"aria-label\", strings.thinking);\n for (const width of [\"84%\", \"62%\", \"38%\"]) {\n const line = document.createElement(\"span\");\n line.className = \"daba-agent-skeleton__line\";\n line.style.width = width;\n bubble.appendChild(line);\n }\n group.appendChild(bubble);\n const label = document.createElement(\"span\");\n label.className = \"daba-agent-thinking__label\";\n label.textContent = strings.thinking;\n group.appendChild(label);\n messagesContainer.appendChild(group);\n messagesContainer.scrollTop = messagesContainer.scrollHeight;\n thinkingEl = group;\n };\n const hideThinking = () => {\n thinkingEl?.remove();\n thinkingEl = null;\n };\n\n // --- composer -----------------------------------------------------------\n // One bordered card holding the field and the meta row beneath it, the\n // way the reference draws it — not a field on a band with a footer under\n // the band. The single border is what makes the bottom of the panel read\n // as one object.\n const composer = document.createElement(\"div\");\n composer.className = \"daba-agent-composer\";\n\n const inputForm = document.createElement(\"form\");\n inputForm.className = \"daba-agent-input-form\";\n\n const field = document.createElement(\"div\");\n field.className = \"daba-agent-field\";\n field.appendChild(icon(ICON.search, \"daba-agent-field__icon\"));\n\n const inputElement = document.createElement(\"input\");\n inputElement.type = \"text\";\n inputElement.className = \"daba-agent-input\";\n inputElement.placeholder = placeholder;\n inputElement.setAttribute(\"aria-label\", placeholder);\n inputElement.autocomplete = \"off\";\n field.appendChild(inputElement);\n\n const sendBtn = iconButton(ICON.send, strings.send, \"daba-agent-send-btn\");\n sendBtn.type = \"submit\";\n field.appendChild(sendBtn);\n\n let composerMicBtn: HTMLElement | null = null;\n if (voiceAvailable) {\n composerMicBtn = iconButton(ICON.mic, strings.startVoice, \"daba-agent-composer__mic\", onMicClick);\n field.appendChild(composerMicBtn);\n }\n inputForm.appendChild(field);\n\n // Progressive: the reference field shows a search glyph, the placeholder\n // and the mic — nothing else. A send button that is always present\n // competes with the mic and, on an empty field, promises an action that\n // would do nothing. It appears once there is something to send; Enter\n // submits either way.\n const syncSendVisibility = () => {\n inputForm.classList.toggle(\"daba-agent-input-form--ready\", inputElement.value.trim().length > 0);\n };\n inputElement.addEventListener(\"input\", syncSendVisibility);\n syncSendVisibility();\n\n inputForm.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n const text = inputElement.value.trim();\n if (!text) return;\n inputElement.value = \"\";\n syncSendVisibility();\n onSendText(text);\n });\n composer.appendChild(inputForm);\n\n const footer = document.createElement(\"div\");\n footer.className = \"daba-agent-footer\";\n\n const footerBrand = document.createElement(\"span\");\n footerBrand.className = \"daba-agent-footer__brand\";\n // Plain text, no chevron: the reference's footer-left is a version\n // selector, and a chevron promises a menu. This is a credit, not a\n // control, so it must not look like one.\n footerBrand.textContent = strings.poweredBy;\n footer.appendChild(footerBrand);\n\n const footerRight = document.createElement(\"span\");\n footerRight.className = \"daba-agent-footer__right\";\n if (voiceAvailable && hotkeyLabel) {\n // Names the affordance the visitor cannot see: the hotkey works from\n // anywhere on the page, and nothing else in the panel says so. The\n // label is the shortcut that is actually live on this platform.\n const hint = document.createElement(\"span\");\n hint.className = \"daba-agent-footer__item\";\n hint.appendChild(icon(ICON.keys, \"daba-agent-footer__icon\"));\n const hintLabel = document.createElement(\"span\");\n hintLabel.textContent = strings.voiceHint.replace(\"{hotkey}\", hotkeyLabel);\n hint.appendChild(hintLabel);\n footerRight.appendChild(hint);\n }\n footer.appendChild(footerRight);\n composer.appendChild(footer);\n chatWindow.appendChild(composer);\n\n return {\n chatWindow,\n messagesContainer,\n inputElement,\n micBtn,\n introEl,\n composerMicBtn,\n setTyping(on: boolean) {\n if (on) showThinking();\n else hideThinking();\n },\n setIntroVisible(visible: boolean) {\n if (introEl) introEl.classList.toggle(\"daba-agent-intro--hidden\", !visible);\n chatWindow.classList.toggle(\"daba-agent-window--intro\", visible && !!introEl);\n },\n setStatusText(text: string) {\n statusEl.textContent = text;\n },\n applyConfig(config) {\n if (config.logoUrl !== undefined) {\n setHeaderLogo(config.logoUrl);\n setIntroLogo(config.logoUrl);\n }\n if (config.title) {\n titleEl.textContent = config.title;\n chatWindow.setAttribute(\"aria-label\", config.title);\n }\n // Only while the box is still empty: overwriting a half-typed\n // question because a config fetch landed would be maddening.\n if (config.placeholder && !inputElement.value) {\n inputElement.placeholder = config.placeholder;\n inputElement.setAttribute(\"aria-label\", config.placeholder);\n }\n const next = config.intro;\n if (!next || !introEl) return;\n if (next.enabled === false) {\n introEl.remove();\n introEl = null;\n chatWindow.classList.remove(\"daba-agent-window--intro\");\n return;\n }\n if (next.headline && introHeadline) introHeadline.textContent = next.headline;\n if (next.subheadline && introSub) introSub.textContent = next.subheadline;\n if (next.suggestedPrompts) renderPrompts(next.suggestedPrompts);\n },\n };\n}\n\n/**\n * Append one message bubble, optionally with its structured items.\n *\n * `cards` render as a sibling block under the bubble rather than inside\n * it: a card is a different kind of object from a sentence, and nesting\n * them means every card inherits the bubble's max-width and ends up too\n * narrow to show a date and a place on one line.\n */\nexport function appendMessage(\n container: HTMLElement,\n text: string,\n role: ChatMessage[\"role\"],\n options?: {\n cards?: DabaCard[];\n strings?: DabaStrings;\n lang?: string;\n suggestions?: string[];\n onSuggestion?: (text: string) => void;\n },\n): HTMLElement {\n const group = document.createElement(\"div\");\n group.className = `daba-agent-group daba-agent-group--${role}`;\n\n const bubble = document.createElement(\"div\");\n bubble.className = `daba-agent-msg daba-agent-msg--${role}`;\n // The agent may answer with structure; the visitor's own words and\n // system notices are always plain text.\n if (role === \"agent\") renderMarkdown(bubble, text);\n else bubble.textContent = text;\n group.appendChild(bubble);\n\n if (options?.cards?.length && options.strings) {\n const cards = buildCards(options.cards, options.strings, options.lang ?? \"en\");\n if (cards) group.appendChild(cards);\n }\n\n if (role === \"agent\" && options?.suggestions?.length && options.onSuggestion) {\n const list = document.createElement(\"div\");\n list.className = \"daba-agent-suggestions\";\n for (const s of options.suggestions) {\n const chip = document.createElement(\"button\");\n chip.type = \"button\";\n chip.className = \"daba-agent-suggestion\";\n chip.textContent = s;\n chip.addEventListener(\"click\", () => options.onSuggestion!(s));\n list.appendChild(chip);\n }\n group.appendChild(list);\n }\n\n container.appendChild(group);\n container.scrollTop = container.scrollHeight;\n return bubble;\n}\n","import type { DabaDirection } from \"../types\";\n\n/**\n * The panel's own chrome, translated.\n *\n * This file is about labels the WIDGET draws — the placeholder, the\n * status line, the close button. It has nothing to do with what the\n * assistant replies in: the model answers in whatever language the\n * visitor wrote or spoke, and that is enforced server-side. The two are\n * deliberately independent, because a French visitor on an Arabic site\n * should get a French answer inside a panel that still matches the site\n * it is embedded in.\n *\n * Everything here is plain data and pure functions — no fetch, no Intl\n * polyfill, no dependency. A bundler that only pulls `stringsFor` still\n * has to keep the table (it is one object), but nothing else in the\n * widget is dragged along.\n */\nexport interface DabaStrings {\n assistantTitle: string;\n /** Chat-only placeholder. Hybrid mode uses `typeOrTalk` instead. */\n inputPlaceholder: string;\n send: string;\n startVoice: string;\n stopVoice: string;\n listening: string;\n thinking: string;\n speaking: string;\n connecting: string;\n close: string;\n minimize: string;\n newConversation: string;\n /** The complete phrase, brand name included — render it as-is and do\n * not concatenate. Word order around the brand differs per language\n * (\"مدعوم من Dabalabs\", \"Dabalabs tarafından sağlanır\"), so a caller\n * that appends the name itself gets it wrong in half of them. */\n poweredBy: string;\n errorGeneric: string;\n errorMicDenied: string;\n errorOffline: string;\n /** The line above the headline on the intro screen — a greeting, not a\n * sentence, so it reads naturally before whatever the project wrote. */\n introGreeting: string;\n /** Names the hotkey, which nothing else in the panel reveals. Carries a\n * {hotkey} placeholder: the shortcut differs by platform (⌥ Space on a\n * Mac, Ctrl+Space elsewhere) and is substituted at render time, so no\n * translation hardcodes a key combination that is wrong for half the\n * visitors. */\n voiceHint: string;\n /** Used only when the project has not set its own intro copy. */\n introDefaultHeadline: string;\n introDefaultSubheadline: string;\n suggestionsLabel: string;\n viewOnMap: string;\n readMore: string;\n openLink: string;\n dateLabel: string;\n locationLabel: string;\n retry: string;\n /** Placeholder in hybrid mode, where the box is both an input and a\n * doorway to the mic. */\n typeOrTalk: string;\n voiceUnavailable: string;\n /** Group label for the structured items attached to a reply. */\n cardsLabel: string;\n}\n\n/**\n * One entry per language, keyed by its primary subtag.\n *\n * Chinese ships Simplified; zh-TW/zh-HK fall back to it rather than to\n * English, which is the lesser of the two wrongs until Traditional is\n * worth its own entry.\n */\nconst STRINGS: Record<string, DabaStrings> = {\n en: {\n assistantTitle: \"AI Assistant\",\n inputPlaceholder: \"Ask a question…\",\n send: \"Send\",\n startVoice: \"Start voice chat\",\n stopVoice: \"Stop voice chat\",\n listening: \"Listening…\",\n thinking: \"Thinking…\",\n speaking: \"Speaking…\",\n connecting: \"Connecting…\",\n close: \"Close\",\n minimize: \"Minimize\",\n newConversation: \"New conversation\",\n poweredBy: \"Powered by Dabalabs\",\n errorGeneric: \"Something went wrong. Please try again.\",\n errorMicDenied: \"Microphone access was blocked. Allow it in your browser settings to talk.\",\n errorOffline: \"You appear to be offline. Check your connection.\",\n introGreeting: \"Hi there,\",\n voiceHint: \"{hotkey} to talk\",\n introDefaultHeadline: \"How can I help?\",\n introDefaultSubheadline: \"Ask me anything about this site.\",\n suggestionsLabel: \"Suggested questions\",\n viewOnMap: \"View on map\",\n readMore: \"Read more\",\n openLink: \"Open\",\n dateLabel: \"Date\",\n locationLabel: \"Location\",\n retry: \"Try again\",\n typeOrTalk: \"Type, or tap the mic to talk\",\n voiceUnavailable: \"Voice is unavailable on this device.\",\n cardsLabel: \"Results\",\n },\n ar: {\n assistantTitle: \"المساعد الذكي\",\n inputPlaceholder: \"اطرح سؤالاً…\",\n send: \"إرسال\",\n startVoice: \"بدء المحادثة الصوتية\",\n stopVoice: \"إيقاف المحادثة الصوتية\",\n listening: \"جارٍ الاستماع…\",\n thinking: \"جارٍ التفكير…\",\n speaking: \"جارٍ التحدث…\",\n connecting: \"جارٍ الاتصال…\",\n close: \"إغلاق\",\n minimize: \"تصغير\",\n newConversation: \"محادثة جديدة\",\n poweredBy: \"مدعوم من Dabalabs\",\n errorGeneric: \"حدث خطأ ما. يرجى المحاولة مرة أخرى.\",\n errorMicDenied: \"تم حظر الوصول إلى الميكروفون. اسمح به من إعدادات المتصفح للتحدث.\",\n errorOffline: \"يبدو أنك غير متصل بالإنترنت. تحقق من اتصالك.\",\n introGreeting: \"مرحباً،\",\n voiceHint: \"اضغط {hotkey} للتحدث\",\n introDefaultHeadline: \"كيف يمكنني مساعدتك؟\",\n introDefaultSubheadline: \"اسألني عن أي شيء يخص هذا الموقع.\",\n suggestionsLabel: \"أسئلة مقترحة\",\n viewOnMap: \"عرض على الخريطة\",\n readMore: \"اقرأ المزيد\",\n openLink: \"فتح\",\n dateLabel: \"التاريخ\",\n locationLabel: \"الموقع\",\n retry: \"أعد المحاولة\",\n typeOrTalk: \"اكتب أو اضغط على الميكروفون للتحدث\",\n voiceUnavailable: \"المحادثة الصوتية غير متاحة على هذا الجهاز.\",\n cardsLabel: \"النتائج\",\n },\n fr: {\n assistantTitle: \"Assistant IA\",\n inputPlaceholder: \"Posez une question…\",\n send: \"Envoyer\",\n startVoice: \"Démarrer la conversation vocale\",\n stopVoice: \"Arrêter la conversation vocale\",\n listening: \"À l'écoute…\",\n thinking: \"Réflexion…\",\n speaking: \"Réponse en cours…\",\n connecting: \"Connexion…\",\n close: \"Fermer\",\n minimize: \"Réduire\",\n newConversation: \"Nouvelle conversation\",\n poweredBy: \"Propulsé par Dabalabs\",\n errorGeneric: \"Une erreur s'est produite. Veuillez réessayer.\",\n errorMicDenied: \"L'accès au microphone a été bloqué. Autorisez-le dans les paramètres du navigateur pour parler.\",\n errorOffline: \"Vous semblez être hors ligne. Vérifiez votre connexion.\",\n introGreeting: \"Bonjour,\",\n voiceHint: \"{hotkey} pour parler\",\n introDefaultHeadline: \"Comment puis-je vous aider ?\",\n introDefaultSubheadline: \"Posez-moi vos questions sur ce site.\",\n suggestionsLabel: \"Questions suggérées\",\n viewOnMap: \"Voir sur la carte\",\n readMore: \"En savoir plus\",\n openLink: \"Ouvrir\",\n dateLabel: \"Date\",\n locationLabel: \"Lieu\",\n retry: \"Réessayer\",\n typeOrTalk: \"Écrivez, ou appuyez sur le micro pour parler\",\n voiceUnavailable: \"La voix n'est pas disponible sur cet appareil.\",\n cardsLabel: \"Résultats\",\n },\n es: {\n assistantTitle: \"Asistente de IA\",\n inputPlaceholder: \"Haz una pregunta…\",\n send: \"Enviar\",\n startVoice: \"Iniciar conversación por voz\",\n stopVoice: \"Detener conversación por voz\",\n listening: \"Escuchando…\",\n thinking: \"Pensando…\",\n speaking: \"Hablando…\",\n connecting: \"Conectando…\",\n close: \"Cerrar\",\n minimize: \"Minimizar\",\n newConversation: \"Nueva conversación\",\n poweredBy: \"Con tecnología de Dabalabs\",\n errorGeneric: \"Algo salió mal. Inténtalo de nuevo.\",\n errorMicDenied: \"Se bloqueó el acceso al micrófono. Permítelo en la configuración del navegador para hablar.\",\n errorOffline: \"Parece que no tienes conexión. Comprueba tu red.\",\n introGreeting: \"Hola,\",\n voiceHint: \"{hotkey} para hablar\",\n introDefaultHeadline: \"¿En qué puedo ayudarte?\",\n introDefaultSubheadline: \"Pregúntame lo que quieras sobre este sitio.\",\n suggestionsLabel: \"Preguntas sugeridas\",\n viewOnMap: \"Ver en el mapa\",\n readMore: \"Leer más\",\n openLink: \"Abrir\",\n dateLabel: \"Fecha\",\n locationLabel: \"Ubicación\",\n retry: \"Reintentar\",\n typeOrTalk: \"Escribe, o toca el micrófono para hablar\",\n voiceUnavailable: \"La voz no está disponible en este dispositivo.\",\n cardsLabel: \"Resultados\",\n },\n de: {\n assistantTitle: \"KI-Assistent\",\n inputPlaceholder: \"Stellen Sie eine Frage…\",\n send: \"Senden\",\n startVoice: \"Sprachchat starten\",\n stopVoice: \"Sprachchat beenden\",\n listening: \"Hört zu…\",\n thinking: \"Denkt nach…\",\n speaking: \"Spricht…\",\n connecting: \"Verbinden…\",\n close: \"Schließen\",\n minimize: \"Minimieren\",\n newConversation: \"Neue Unterhaltung\",\n poweredBy: \"Bereitgestellt von Dabalabs\",\n errorGeneric: \"Etwas ist schiefgelaufen. Bitte versuchen Sie es erneut.\",\n errorMicDenied: \"Der Mikrofonzugriff wurde blockiert. Erlauben Sie ihn in den Browsereinstellungen, um zu sprechen.\",\n errorOffline: \"Sie scheinen offline zu sein. Prüfen Sie Ihre Verbindung.\",\n introGreeting: \"Hallo,\",\n voiceHint: \"{hotkey} zum Sprechen\",\n introDefaultHeadline: \"Wie kann ich helfen?\",\n introDefaultSubheadline: \"Fragen Sie mich alles über diese Website.\",\n suggestionsLabel: \"Vorgeschlagene Fragen\",\n viewOnMap: \"Auf Karte ansehen\",\n readMore: \"Mehr lesen\",\n openLink: \"Öffnen\",\n dateLabel: \"Datum\",\n locationLabel: \"Ort\",\n retry: \"Erneut versuchen\",\n typeOrTalk: \"Schreiben oder aufs Mikrofon tippen, um zu sprechen\",\n voiceUnavailable: \"Die Sprachfunktion ist auf diesem Gerät nicht verfügbar.\",\n cardsLabel: \"Ergebnisse\",\n },\n ru: {\n assistantTitle: \"ИИ-ассистент\",\n inputPlaceholder: \"Задайте вопрос…\",\n send: \"Отправить\",\n startVoice: \"Начать голосовой чат\",\n stopVoice: \"Остановить голосовой чат\",\n listening: \"Слушаю…\",\n thinking: \"Думаю…\",\n speaking: \"Говорю…\",\n connecting: \"Подключение…\",\n close: \"Закрыть\",\n minimize: \"Свернуть\",\n newConversation: \"Новый диалог\",\n poweredBy: \"Работает на Dabalabs\",\n errorGeneric: \"Что-то пошло не так. Попробуйте ещё раз.\",\n errorMicDenied: \"Доступ к микрофону заблокирован. Разрешите его в настройках браузера, чтобы говорить.\",\n errorOffline: \"Похоже, вы не в сети. Проверьте подключение.\",\n introGreeting: \"Здравствуйте,\",\n voiceHint: \"{hotkey} — говорить\",\n introDefaultHeadline: \"Чем я могу помочь?\",\n introDefaultSubheadline: \"Спросите меня о чём угодно на этом сайте.\",\n suggestionsLabel: \"Предлагаемые вопросы\",\n viewOnMap: \"Посмотреть на карте\",\n readMore: \"Подробнее\",\n openLink: \"Открыть\",\n dateLabel: \"Дата\",\n locationLabel: \"Место\",\n retry: \"Повторить\",\n typeOrTalk: \"Напишите или нажмите на микрофон, чтобы говорить\",\n voiceUnavailable: \"Голосовой режим недоступен на этом устройстве.\",\n cardsLabel: \"Результаты\",\n },\n tr: {\n assistantTitle: \"Yapay Zekâ Asistanı\",\n inputPlaceholder: \"Bir soru sorun…\",\n send: \"Gönder\",\n startVoice: \"Sesli sohbeti başlat\",\n stopVoice: \"Sesli sohbeti durdur\",\n listening: \"Dinliyor…\",\n thinking: \"Düşünüyor…\",\n speaking: \"Konuşuyor…\",\n connecting: \"Bağlanıyor…\",\n close: \"Kapat\",\n minimize: \"Küçült\",\n newConversation: \"Yeni sohbet\",\n poweredBy: \"Dabalabs tarafından sağlanır\",\n errorGeneric: \"Bir şeyler ters gitti. Lütfen tekrar deneyin.\",\n errorMicDenied: \"Mikrofon erişimi engellendi. Konuşmak için tarayıcı ayarlarından izin verin.\",\n errorOffline: \"Çevrimdışı görünüyorsunuz. Bağlantınızı kontrol edin.\",\n introGreeting: \"Merhaba,\",\n voiceHint: \"Konuşmak için {hotkey}\",\n introDefaultHeadline: \"Nasıl yardımcı olabilirim?\",\n introDefaultSubheadline: \"Bu site hakkında bana her şeyi sorabilirsiniz.\",\n suggestionsLabel: \"Önerilen sorular\",\n viewOnMap: \"Haritada göster\",\n readMore: \"Devamını oku\",\n openLink: \"Aç\",\n dateLabel: \"Tarih\",\n locationLabel: \"Konum\",\n retry: \"Tekrar dene\",\n typeOrTalk: \"Yazın veya konuşmak için mikrofona dokunun\",\n voiceUnavailable: \"Sesli görüşme bu cihazda kullanılamıyor.\",\n cardsLabel: \"Sonuçlar\",\n },\n ur: {\n assistantTitle: \"اے آئی اسسٹنٹ\",\n inputPlaceholder: \"کوئی سوال پوچھیں…\",\n send: \"بھیجیں\",\n startVoice: \"صوتی گفتگو شروع کریں\",\n stopVoice: \"صوتی گفتگو بند کریں\",\n listening: \"سن رہا ہے…\",\n thinking: \"سوچ رہا ہے…\",\n speaking: \"بول رہا ہے…\",\n connecting: \"منسلک ہو رہا ہے…\",\n close: \"بند کریں\",\n minimize: \"چھوٹا کریں\",\n newConversation: \"نئی گفتگو\",\n poweredBy: \"Dabalabs کے تعاون سے\",\n errorGeneric: \"کچھ غلط ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔\",\n errorMicDenied: \"مائیکروفون تک رسائی بلاک کر دی گئی ہے۔ بات کرنے کے لیے براؤزر کی ترتیبات میں اجازت دیں۔\",\n errorOffline: \"لگتا ہے آپ آف لائن ہیں۔ اپنا کنکشن چیک کریں۔\",\n introGreeting: \"خوش آمدید،\",\n voiceHint: \"بولنے کے لیے {hotkey}\",\n introDefaultHeadline: \"میں آپ کی کیا مدد کر سکتا ہوں؟\",\n introDefaultSubheadline: \"اس سائٹ کے بارے میں مجھ سے کچھ بھی پوچھیں۔\",\n suggestionsLabel: \"تجویز کردہ سوالات\",\n viewOnMap: \"نقشے پر دیکھیں\",\n readMore: \"مزید پڑھیں\",\n openLink: \"کھولیں\",\n dateLabel: \"تاریخ\",\n locationLabel: \"مقام\",\n retry: \"دوبارہ کوشش کریں\",\n typeOrTalk: \"لکھیں یا بات کرنے کے لیے مائیکروفون دبائیں\",\n voiceUnavailable: \"اس ڈیوائس پر صوتی گفتگو دستیاب نہیں ہے۔\",\n cardsLabel: \"نتائج\",\n },\n hi: {\n assistantTitle: \"एआई सहायक\",\n inputPlaceholder: \"कोई सवाल पूछें…\",\n send: \"भेजें\",\n startVoice: \"वॉइस चैट शुरू करें\",\n stopVoice: \"वॉइस चैट बंद करें\",\n listening: \"सुन रहा है…\",\n thinking: \"सोच रहा है…\",\n speaking: \"बोल रहा है…\",\n connecting: \"कनेक्ट हो रहा है…\",\n close: \"बंद करें\",\n minimize: \"छोटा करें\",\n newConversation: \"नई बातचीत\",\n poweredBy: \"Dabalabs द्वारा संचालित\",\n errorGeneric: \"कुछ गड़बड़ हो गई। कृपया फिर से कोशिश करें।\",\n errorMicDenied: \"माइक्रोफ़ोन की अनुमति रोक दी गई है। बात करने के लिए ब्राउज़र सेटिंग्स में इसे अनुमति दें।\",\n errorOffline: \"आप ऑफ़लाइन लग रहे हैं। अपना कनेक्शन जाँचें।\",\n introGreeting: \"नमस्ते,\",\n voiceHint: \"बोलने के लिए {hotkey}\",\n introDefaultHeadline: \"मैं आपकी कैसे मदद कर सकता हूँ?\",\n introDefaultSubheadline: \"इस साइट के बारे में मुझसे कुछ भी पूछें।\",\n suggestionsLabel: \"सुझाए गए सवाल\",\n viewOnMap: \"मानचित्र पर देखें\",\n readMore: \"और पढ़ें\",\n openLink: \"खोलें\",\n dateLabel: \"तारीख़\",\n locationLabel: \"स्थान\",\n retry: \"फिर से कोशिश करें\",\n typeOrTalk: \"लिखें या बात करने के लिए माइक्रोफ़ोन दबाएँ\",\n voiceUnavailable: \"इस डिवाइस पर वॉइस उपलब्ध नहीं है।\",\n cardsLabel: \"परिणाम\",\n },\n zh: {\n assistantTitle: \"AI 助手\",\n inputPlaceholder: \"输入你的问题…\",\n send: \"发送\",\n startVoice: \"开始语音对话\",\n stopVoice: \"结束语音对话\",\n listening: \"正在聆听…\",\n thinking: \"正在思考…\",\n speaking: \"正在回答…\",\n connecting: \"正在连接…\",\n close: \"关闭\",\n minimize: \"最小化\",\n newConversation: \"新对话\",\n poweredBy: \"由 Dabalabs 提供支持\",\n errorGeneric: \"出了点问题,请重试。\",\n errorMicDenied: \"麦克风权限被拒绝。请在浏览器设置中允许后再使用语音。\",\n errorOffline: \"你似乎已离线,请检查网络连接。\",\n introGreeting: \"您好,\",\n voiceHint: \"按 {hotkey} 说话\",\n introDefaultHeadline: \"有什么可以帮你?\",\n introDefaultSubheadline: \"关于本网站,你可以问我任何问题。\",\n suggestionsLabel: \"推荐问题\",\n viewOnMap: \"在地图中查看\",\n readMore: \"阅读更多\",\n openLink: \"打开\",\n dateLabel: \"日期\",\n locationLabel: \"地点\",\n retry: \"重试\",\n typeOrTalk: \"输入问题,或点击麦克风说话\",\n voiceUnavailable: \"此设备不支持语音功能。\",\n cardsLabel: \"结果\",\n },\n pt: {\n assistantTitle: \"Assistente de IA\",\n inputPlaceholder: \"Faça uma pergunta…\",\n send: \"Enviar\",\n startVoice: \"Iniciar conversa por voz\",\n stopVoice: \"Parar conversa por voz\",\n listening: \"Ouvindo…\",\n thinking: \"Pensando…\",\n speaking: \"Falando…\",\n connecting: \"Conectando…\",\n close: \"Fechar\",\n minimize: \"Minimizar\",\n newConversation: \"Nova conversa\",\n poweredBy: \"Com tecnologia da Dabalabs\",\n errorGeneric: \"Algo deu errado. Tente novamente.\",\n errorMicDenied: \"O acesso ao microfone foi bloqueado. Permita-o nas configurações do navegador para falar.\",\n errorOffline: \"Parece que você está offline. Verifique sua conexão.\",\n introGreeting: \"Olá,\",\n voiceHint: \"{hotkey} para falar\",\n introDefaultHeadline: \"Como posso ajudar?\",\n introDefaultSubheadline: \"Pergunte-me qualquer coisa sobre este site.\",\n suggestionsLabel: \"Perguntas sugeridas\",\n viewOnMap: \"Ver no mapa\",\n readMore: \"Leia mais\",\n openLink: \"Abrir\",\n dateLabel: \"Data\",\n locationLabel: \"Local\",\n retry: \"Tentar novamente\",\n typeOrTalk: \"Escreva, ou toque no microfone para falar\",\n voiceUnavailable: \"A voz não está disponível neste dispositivo.\",\n cardsLabel: \"Resultados\",\n },\n id: {\n assistantTitle: \"Asisten AI\",\n inputPlaceholder: \"Ajukan pertanyaan…\",\n send: \"Kirim\",\n startVoice: \"Mulai obrolan suara\",\n stopVoice: \"Hentikan obrolan suara\",\n listening: \"Mendengarkan…\",\n thinking: \"Berpikir…\",\n speaking: \"Berbicara…\",\n connecting: \"Menghubungkan…\",\n close: \"Tutup\",\n minimize: \"Perkecil\",\n newConversation: \"Percakapan baru\",\n poweredBy: \"Didukung oleh Dabalabs\",\n errorGeneric: \"Terjadi kesalahan. Silakan coba lagi.\",\n errorMicDenied: \"Akses mikrofon diblokir. Izinkan di pengaturan browser untuk berbicara.\",\n errorOffline: \"Sepertinya Anda sedang offline. Periksa koneksi Anda.\",\n introGreeting: \"Halo,\",\n voiceHint: \"{hotkey} untuk bicara\",\n introDefaultHeadline: \"Ada yang bisa saya bantu?\",\n introDefaultSubheadline: \"Tanyakan apa saja tentang situs ini.\",\n suggestionsLabel: \"Pertanyaan yang disarankan\",\n viewOnMap: \"Lihat di peta\",\n readMore: \"Baca selengkapnya\",\n openLink: \"Buka\",\n dateLabel: \"Tanggal\",\n locationLabel: \"Lokasi\",\n retry: \"Coba lagi\",\n typeOrTalk: \"Ketik, atau ketuk mikrofon untuk berbicara\",\n voiceUnavailable: \"Suara tidak tersedia di perangkat ini.\",\n cardsLabel: \"Hasil\",\n },\n};\n\n/** Right-to-left primary subtags. Deliberately wider than the set we\n * ship strings for: an unsupported RTL language reads English copy, but\n * it must still lay out right-to-left, or the panel collides with the\n * site's own mirrored chrome. */\nconst RTL_SUBTAGS = new Set([\"ar\", \"arc\", \"ckb\", \"dv\", \"fa\", \"he\", \"iw\", \"ku\", \"prs\", \"ps\", \"sd\", \"ug\", \"ur\", \"yi\", \"ji\"]);\n\n/** Scripts that are right-to-left whatever language is written in them —\n * \"az-Arab\" and \"pa-Arab\" are RTL, \"az\" and \"pa\" are not. */\nconst RTL_SCRIPTS = new Set([\"arab\", \"hebr\", \"thaa\", \"syrc\", \"nkoo\", \"adlm\"]);\n\n/** Java/ICU-era codes still turn up in `<html lang>` when the value was\n * copied from a server-side locale. Fold them onto the modern subtag\n * before anything else looks at them. */\nconst LEGACY_SUBTAGS: Record<string, string> = { in: \"id\", iw: \"he\", ji: \"yi\" };\n\n/** Lowercase and hyphenate so \"ar_AE\", \"AR-ae\" and \"ar-AE\" are one tag.\n * BCP-47 is case-insensitive and `Intl` canonicalises for itself, so\n * losing the conventional casing costs nothing downstream. */\nfunction normalizeTag(tag?: string | null): string {\n if (typeof tag !== \"string\") return \"\";\n return tag.trim().toLowerCase().replace(/_/g, \"-\");\n}\n\nfunction primarySubtag(tag: string): string {\n const first = normalizeTag(tag).split(\"-\")[0] ?? \"\";\n return LEGACY_SUBTAGS[first] ?? first;\n}\n\n/** Own-property lookup, not `in` — a page whose `lang` is \"constructor\"\n * would otherwise hand back something off `Object.prototype`. */\nfunction tableEntry(key: string): DabaStrings | undefined {\n if (!key) return undefined;\n return Object.prototype.hasOwnProperty.call(STRINGS, key) ? STRINGS[key] : undefined;\n}\n\n/**\n * Decide which language the widget's chrome speaks.\n *\n * An explicit tag (from the integrator's options or the project's saved\n * locale) always wins. Otherwise the host page's `<html lang>` decides,\n * because that describes the SITE, which is what the panel is dressing\n * itself to match. `navigator.language` is only the fallback: it says\n * what the visitor's browser is set to, a different question, and one\n * that would put a French panel on an Arabic site.\n *\n * The full tag is returned, region and all (\"ar-ae\", not \"ar\"), so a\n * caller can hand it straight to `Intl` for date formatting and to the\n * panel's `lang` attribute. Matching down to the primary subtag happens\n * inside `stringsFor` and `resolveDirection`.\n */\nexport function resolveUiLanguage(requested?: string): string {\n const explicit = normalizeTag(requested);\n if (explicit && explicit !== \"auto\") return explicit;\n\n if (typeof document !== \"undefined\" && document.documentElement) {\n const declared = normalizeTag(document.documentElement.getAttribute(\"lang\"));\n if (declared && declared !== \"auto\") return declared;\n }\n\n if (typeof navigator !== \"undefined\") {\n const browser = normalizeTag(navigator.language);\n if (browser) return browser;\n }\n\n return \"en\";\n}\n\nexport function isRtlLanguage(lang: string): boolean {\n const tag = normalizeTag(lang);\n if (!tag) return false;\n const parts = tag.split(\"-\");\n if (RTL_SUBTAGS.has(primarySubtag(tag))) return true;\n // A script subtag can appear anywhere after the language, so scan the\n // whole tag rather than assuming position 2.\n return parts.slice(1).some((part) => RTL_SCRIPTS.has(part));\n}\n\n/**\n * Direction of the panel's own layout.\n *\n * An explicit \"ltr\"/\"rtl\" is honoured verbatim — an integrator who says\n * it means it. On \"auto\" the language decides, which is what makes the\n * panel mirror itself on an Arabic or Hebrew site with nothing\n * configured. The host's own `dir=\"rtl\"` is the last word: a site that\n * mirrors itself while tagging its language badly (or not at all) is\n * still unambiguously an RTL site, and a left-to-right panel would sit\n * in it backwards.\n */\nexport function resolveDirection(lang: string, requested?: DabaDirection): \"ltr\" | \"rtl\" {\n const explicit = normalizeTag(requested);\n if (explicit === \"rtl\" || explicit === \"ltr\") return explicit;\n\n if (isRtlLanguage(lang)) return \"rtl\";\n\n if (typeof document !== \"undefined\" && document.documentElement) {\n if (normalizeTag(document.documentElement.getAttribute(\"dir\")) === \"rtl\") return \"rtl\";\n }\n\n return \"ltr\";\n}\n\n/**\n * Chrome copy for a tag, matched exactly first (\"pt-br\" could earn its\n * own entry later without touching callers), then on the primary\n * subtag, then English. An unknown language always renders readable\n * English rather than empty labels — and `resolveDirection` still gives\n * it the correct direction, so an unsupported RTL language reads\n * English in a right-to-left panel.\n */\nexport function stringsFor(lang: string): DabaStrings {\n const tag = normalizeTag(lang);\n return tableEntry(tag) ?? tableEntry(primarySubtag(tag)) ?? STRINGS.en;\n}\n","export interface ParsedHotkey {\n ctrl: boolean;\n alt: boolean;\n shift: boolean;\n meta: boolean;\n key: string;\n}\n\nexport function parseHotkey(hotkey: string): ParsedHotkey {\n const parts = hotkey.toLowerCase().split(\"+\").map((p) => p.trim());\n return {\n ctrl: parts.includes(\"ctrl\") || parts.includes(\"control\"),\n alt: parts.includes(\"alt\"),\n shift: parts.includes(\"shift\"),\n meta: parts.includes(\"cmd\") || parts.includes(\"meta\"),\n key: parts.find((p) => ![\"ctrl\", \"control\", \"alt\", \"shift\", \"cmd\", \"meta\"].includes(p)) ?? \"\",\n };\n}\n\nexport function matchesHotkey(e: KeyboardEvent, hotkey: ParsedHotkey): boolean {\n const key = e.key.toLowerCase();\n const keyMatches = hotkey.key === \"space\" ? key === \" \" || e.code === \"Space\" : key === hotkey.key;\n return (\n keyMatches &&\n e.ctrlKey === hotkey.ctrl &&\n e.altKey === hotkey.alt &&\n e.shiftKey === hotkey.shift &&\n e.metaKey === hotkey.meta\n );\n}\n\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n return tag === \"INPUT\" || tag === \"TEXTAREA\" || target.isContentEditable;\n}\n\n/**\n * Whether the visitor is on an Apple keyboard layout.\n *\n * Matters for one thing: what the modifier keys are called and which\n * combinations the OS has already taken. Checked at call time, not module\n * load, so a test can stub the platform.\n */\nexport function isApplePlatform(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData?.platform;\n const platform = ua ?? navigator.platform ?? \"\";\n return /mac|iphone|ipad|ipod/i.test(platform);\n}\n\n/**\n * The shortcut used when the embed does not set one.\n *\n * Ctrl+Space is not usable on a Mac: macOS binds it to \"select the\n * previous input source\", so for anyone with two keyboards installed —\n * Arabic and English, say — the keypress switches layouts and never\n * reaches the page at all. Option+Space is unbound by default on macOS\n * and is what the desktop assistants people already use (ChatGPT,\n * Raycast) chose for the same reason. On Windows the situation is\n * reversed: Alt+Space opens the window's system menu, and Ctrl+Space is\n * free. So the default is per platform, and the hint in the panel shows\n * whichever one is live.\n */\nexport function defaultHotkey(): string {\n return isApplePlatform() ? \"alt+space\" : \"ctrl+space\";\n}\n\n/**\n * The shortcut as a visitor would read it: \"⌥ Space\" on a Mac, where the\n * key caps carry symbols, and \"Ctrl+Space\" elsewhere, where they carry\n * words. Modifier order follows each platform's own convention.\n */\nexport function hotkeyLabel(hotkey: string): string {\n const parsed = parseHotkey(hotkey);\n const keyName =\n parsed.key === \"space\" ? \"Space\" : parsed.key.length === 1 ? parsed.key.toUpperCase() : parsed.key;\n if (isApplePlatform()) {\n const mods = [parsed.ctrl && \"⌃\", parsed.alt && \"⌥\", parsed.shift && \"⇧\", parsed.meta && \"⌘\"].filter(Boolean);\n return [...mods, keyName].join(\" \");\n }\n const mods = [parsed.ctrl && \"Ctrl\", parsed.alt && \"Alt\", parsed.shift && \"Shift\", parsed.meta && \"Win\"].filter(Boolean);\n return [...mods, keyName].join(\"+\");\n}\n","import { LiveTransport, type VoiceToolCall } from \"./voice/live-transport\";\nimport { resolveGatewayUrl } from \"./environment\";\nimport { createAgentSession } from \"./api/agent-api\";\nimport { extractPageContext, isPageRestricted } from \"./utils/page-context\";\nimport {\n fillFormField,\n submitForm,\n navigate as domNavigate,\n findClickable,\n clickElement,\n scrollPage,\n} from \"./actions/dom-actions\";\nimport { startMicCapture, PcmPlayer, type MicCaptureHandle } from \"./audio/audio-pcm\";\nimport {\n persistSession,\n readPersistedSession,\n clearPersistedSession,\n persistTranscript,\n readTranscript,\n clearTranscript,\n} from \"./session/session-store\";\nimport { buildBadge, updateBadge, setBadgeIcon } from \"./ui/badge\";\nimport { buildChatWindow, appendMessage, type ChatWindowElements } from \"./ui/chat-window\";\nimport { applyThemeTokens } from \"./ui/styles\";\nimport { fetchAgentConfig, sendChatTurn, DabaFetchError } from \"./api/agent-api\";\nimport { resolveUiLanguage, resolveDirection, stringsFor, type DabaStrings } from \"./i18n/locales\";\nimport { parseHotkey, matchesHotkey, isEditableTarget, defaultHotkey, hotkeyLabel } from \"./utils/hotkey\";\nimport type {\n DabaAgentOptions,\n DabaAgentPosition,\n DabaAgentStatus,\n DabaError,\n DabaAgentMode,\n DabaCard,\n DabaIntro,\n DabaRemoteConfig,\n ChatMessage,\n} from \"./types\";\n\nconst DEFAULT_POSITION: DabaAgentPosition = \"bottom-right\";\nconst VALID_POSITIONS: DabaAgentPosition[] = [\n \"bottom-right\",\n \"bottom-left\",\n \"top-right\",\n \"top-left\",\n];\nconst BARGE_IN_RMS_THRESHOLD = 0.02;\nconst BARGE_IN_FRAMES_REQUIRED = 3;\nconst HARD_STOP_CLOSE_CODE = 4000;\nconst NAVIGATE_DELAY_MS = 600;\nconst AUDIO_UNLOCK_EVENTS: Array<keyof DocumentEventMap> = [\"click\", \"keydown\", \"touchstart\"];\n\n// A fresh AudioContext created without a user gesture on the CURRENT page\n// starts (or lands back in, after auto-reattach) \"suspended\" on most\n// browsers — everything else keeps working (mic capture, the WS itself,\n// status flipping to \"listening\"), but every scheduled reply is silently\n// dropped, which reads exactly as \"disconnected\" even though the session\n// is alive. This is unavoidable specifically for navigate()'s auto-\n// reattach: the click that started the original session happened on the\n// PREVIOUS page, and browsers don't carry user-activation across a real\n// navigation. Immediate resume() often still works (browsers commonly\n// grant it once this origin has real engagement from the visitor's\n// earlier interaction) — the gesture listener below is the fallback for\n// when it doesn't, unlocking on the visitor's very next interaction\n// anywhere on the page rather than requiring them to find and click the\n// badge specifically.\nfunction unlockAudioContextOnNextGesture(ctx: AudioContext): void {\n const handler = () => {\n AUDIO_UNLOCK_EVENTS.forEach((ev) => document.removeEventListener(ev, handler, true));\n if (ctx.state !== \"running\") void ctx.resume();\n };\n AUDIO_UNLOCK_EVENTS.forEach((ev) => document.addEventListener(ev, handler, { once: true, capture: true }));\n}\n\n/**\n * A stable id for one visitor's thread.\n *\n * The gateway keys conversation history on it, so it has to survive a page\n * navigation — the agent can move the visitor between pages mid-answer —\n * but must not be shared between projects on one site. sessionStorage\n * rather than localStorage: a conversation is a visit, not an identity,\n * and a thread resumed a week later would be stranger than a fresh one.\n *\n * The gateway constrains this to [A-Za-z0-9_-]{1,64}, so the fallback for\n * a browser without crypto.randomUUID stays inside that alphabet too.\n */\nconst CONVERSATION_KEY_PREFIX = \"daba-agent-conv:\";\n\nfunction newConversationId(): string {\n const uuid = globalThis.crypto?.randomUUID?.();\n if (uuid) return uuid.replace(/-/g, \"\");\n return `c${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction persistConversationId(projectId: string, id: string): void {\n try {\n window.sessionStorage.setItem(CONVERSATION_KEY_PREFIX + projectId, id);\n } catch {\n // Private mode, or a host that blocks storage. An in-memory id still\n // works for this page; only continuity across a navigation is lost.\n }\n}\n\nfunction readConversationId(projectId: string): string {\n try {\n const existing = window.sessionStorage.getItem(CONVERSATION_KEY_PREFIX + projectId);\n if (existing && /^[A-Za-z0-9_-]{1,64}$/.test(existing)) return existing;\n } catch {\n // fall through to a fresh id\n }\n const id = newConversationId();\n persistConversationId(projectId, id);\n return id;\n}\n\ninterface ToolCallMessage {\n type: \"tool_call\";\n call_id: string;\n name: string;\n arguments: string;\n}\n\nexport class DabaAgent {\n private readonly options: DabaAgentOptions;\n private readonly position: DabaAgentPosition;\n private mode: DabaAgentMode;\n private readonly badge: HTMLElement;\n private readonly badgeLabel: HTMLElement;\n private readonly chatWindow: HTMLElement;\n private readonly messagesContainer: HTMLElement;\n private readonly inputElement: HTMLInputElement;\n private readonly micBtn: HTMLElement;\n private readonly keydownHandler = (e: KeyboardEvent) => this.handleKeydown(e);\n private readonly restricted: boolean;\n\n private status: DabaAgentStatus = \"idle\";\n private isOpen = false;\n private destroyed = false;\n private ws: WebSocket | null = null;\n private audioContext: AudioContext | null = null;\n private mic: MicCaptureHandle | null = null;\n private player: PcmPlayer | null = null;\n private bargeInStreak = 0;\n private isReattaching = false;\n private messages: ChatMessage[] = [];\n private currentStreamBubble: HTMLElement | null = null;\n private currentStreamRole: \"user\" | \"agent\" | null = null;\n private readonly ui: ChatWindowElements;\n private readonly strings: DabaStrings;\n private readonly uiLang: string;\n private conversationId: string;\n private chatInFlight = false;\n private remoteConfig: DabaRemoteConfig | null = null;\n private live: LiveTransport | null = null;\n\n constructor(options: DabaAgentOptions) {\n this.options = options;\n\n const requestedPos = options.position;\n let position: DabaAgentPosition = DEFAULT_POSITION;\n if (requestedPos) {\n if (VALID_POSITIONS.includes(requestedPos)) {\n position = requestedPos;\n } else {\n console.error(\n `daba-agent: invalid data-position \"${requestedPos}\". Falling back to \"${DEFAULT_POSITION}\".`,\n );\n }\n }\n this.position = position;\n\n // Undefined here does NOT mean \"voice\" any more — it means \"the embed\n // did not say, so defer to the project\". The server value arrives with\n // the config fetch below; until then the widget renders in hybrid,\n // which is the only guess that leaves nothing unreachable.\n this.mode = options.mode ?? \"hybrid\";\n this.uiLang = resolveUiLanguage(options.uiLanguage);\n this.strings = stringsFor(this.uiLang);\n this.conversationId = readConversationId(options.projectId);\n this.restricted = isPageRestricted();\n\n if (this.restricted) {\n console.warn(\n \"daba-agent: this page has data-daba-agent-restricted set — the assistant will not read this page or start a session here.\",\n );\n this.badge = document.createElement(\"button\");\n this.badgeLabel = document.createElement(\"span\");\n this.chatWindow = document.createElement(\"div\");\n this.messagesContainer = document.createElement(\"div\");\n this.inputElement = document.createElement(\"input\");\n this.micBtn = document.createElement(\"button\");\n this.ui = {\n chatWindow: this.chatWindow,\n messagesContainer: this.messagesContainer,\n inputElement: this.inputElement,\n micBtn: this.micBtn,\n introEl: null,\n composerMicBtn: null,\n setTyping: () => {},\n setIntroVisible: () => {},\n setStatusText: () => {},\n applyConfig: () => {},\n };\n return;\n }\n\n const container =\n typeof options.container === \"string\"\n ? document.querySelector<HTMLElement>(options.container)\n : options.container;\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = `daba-agent-wrapper daba-agent-wrapper--pos-${this.position}`;\n\n const badgeUI = buildBadge(\n this.position,\n this.mode,\n options.accentColor,\n options.iconBackgroundColor,\n options.iconMarkColor,\n );\n this.badge = badgeUI.root;\n this.badgeLabel = badgeUI.label;\n this.badge.addEventListener(\"click\", () => {\n // Voice-only has no panel worth opening, so the badge IS the\n // push-to-talk control. Every other mode opens the panel, because a\n // visitor who can type expects a place to type.\n if (this.mode === \"voice\") {\n void this.toggleVoice();\n } else {\n this.toggleChat();\n }\n });\n wrapper.appendChild(this.badge);\n\n const direction = resolveDirection(this.uiLang, options.direction);\n wrapper.dir = direction;\n wrapper.lang = this.uiLang;\n if (options.theme?.theme && options.theme.theme !== \"auto\") {\n wrapper.setAttribute(\"data-daba-theme\", options.theme.theme);\n }\n if (options.theme) applyThemeTokens(wrapper, options.theme as Record<string, string | undefined>);\n if (options.accentColor) applyThemeTokens(wrapper, { accent: options.accentColor });\n\n const chatUI = buildChatWindow({\n title: options.title ?? this.strings.assistantTitle,\n placeholder:\n options.placeholder ??\n (this.mode === \"chat\" ? this.strings.inputPlaceholder : this.strings.typeOrTalk),\n strings: this.strings,\n direction,\n lang: this.uiLang,\n mode: this.mode,\n intro: options.intro ?? {},\n logoUrl: options.logoUrl,\n // null disables the shortcut entirely; the hint disappears with it.\n hotkeyLabel: options.hotkey === null ? null : hotkeyLabel(options.hotkey ?? defaultHotkey()),\n onSendText: (text) => void this.sendText(text),\n onMicClick: () => void this.toggleVoice(),\n onCloseClick: () => this.closeChat(),\n onNewConversation: () => this.resetConversation(),\n });\n this.ui = chatUI;\n this.chatWindow = chatUI.chatWindow;\n this.messagesContainer = chatUI.messagesContainer;\n this.inputElement = chatUI.inputElement;\n this.micBtn = chatUI.micBtn;\n wrapper.appendChild(this.chatWindow);\n\n (container ?? document.body).appendChild(wrapper);\n\n if (options.initialOpen || this.mode === \"chat\") {\n this.openChat();\n }\n\n if (options.hotkey !== null) {\n document.addEventListener(\"keydown\", this.keydownHandler);\n }\n\n this.restoreTranscript();\n void this.tryReattach();\n void this.loadRemoteConfig();\n }\n\n /** Put back what this thread already showed, so a reload or a\n * navigate() lands the visitor mid-conversation, not on a blank intro\n * while the model silently remembers the last four turns. */\n private restoreTranscript(): void {\n const saved = readTranscript(this.options.projectId, this.conversationId);\n if (!saved.length) return;\n for (const m of saved) {\n const cards = Array.isArray(m.cards) ? (m.cards as DabaCard[]) : [];\n this.messages.push({\n id: `restored-${m.ts}`,\n role: m.role,\n text: m.text,\n timestamp: m.ts,\n isFinal: true,\n cards,\n });\n appendMessage(this.messagesContainer, m.text, m.role, {\n cards,\n strings: this.strings,\n lang: m.lang ?? this.uiLang,\n suggestions: Array.isArray(m.suggestions) ? (m.suggestions as string[]) : [],\n onSuggestion: (text) => void this.sendText(text),\n });\n }\n this.ui.setIntroVisible(false);\n }\n\n private saveTranscript(): void {\n // Written as a pair with the id it is keyed on. If anything between\n // mount and now removed the id from storage, the transcript would be\n // saved under a key the next page load could never find — and the\n // visitor would get a blank intro while the model kept their context.\n persistConversationId(this.options.projectId, this.conversationId);\n persistTranscript(\n this.options.projectId,\n this.conversationId,\n this.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({ role: m.role, text: m.text, cards: m.cards, suggestions: m.suggestions, ts: m.timestamp })),\n );\n }\n\n /**\n * Pull the project's own mode, theme, intro and locale from the gateway.\n *\n * Fire-and-forget on purpose: the widget is fully usable before this\n * resolves and stays usable if it never does. A visitor must never be\n * left unable to type because a styling fetch was slow, so every failure\n * path here is a silent fall back to the built-in brand kit rather than\n * an error the visitor has to read.\n */\n private async loadRemoteConfig(): Promise<void> {\n if (this.destroyed || this.restricted) return;\n const gatewayUrl = resolveGatewayUrl(this.options.gatewayUrl, this.options.env);\n let config: DabaRemoteConfig;\n try {\n config = await fetchAgentConfig(gatewayUrl, this.options.projectId, this.options.apiKey);\n } catch {\n return;\n }\n if (this.destroyed) return;\n this.remoteConfig = config;\n\n const wrapper = this.chatWindow.parentElement as HTMLElement | null;\n if (!wrapper) return;\n\n // Explicit option beats served value, always. An integrator who wrote a\n // colour into their embed meant it, and a dashboard edit must not\n // silently override the page they are looking at.\n const a = config.appearance;\n applyThemeTokens(wrapper, {\n accent: this.options.accentColor ?? this.options.theme?.accentColor ?? a.accentColor,\n \"accent-contrast\": this.options.theme?.accentContrast ?? a.accentContrast,\n surface: this.options.theme?.surfaceColor ?? a.surfaceColor,\n text: this.options.theme?.textColor ?? a.textColor,\n radius: this.options.theme?.radius ?? a.radius,\n font: this.options.theme?.fontFamily ?? a.fontFamily,\n });\n\n const theme = this.options.theme?.theme ?? a.theme;\n if (theme && theme !== \"auto\") wrapper.setAttribute(\"data-daba-theme\", theme);\n\n // Mode is the one served value that changes what exists, not just how\n // it looks: a project set to voice-only must stop offering a text box,\n // and one set to chat must never reach for a microphone. Applied only\n // when the embed did not state a mode itself.\n if (!this.options.mode && config.mode && config.mode !== this.mode) {\n this.mode = config.mode;\n this.applyMode();\n }\n\n // The launcher takes the served icon unless the embed set its own.\n const launcherIcon = this.options.launcher?.iconUrl ?? a.launcherIconUrl;\n if (launcherIcon) setBadgeIcon(this.badge, launcherIcon);\n\n this.ui.applyConfig({\n logoUrl: this.options.logoUrl ?? a.logoUrl,\n title: this.options.title ?? config.title,\n placeholder:\n this.options.placeholder ??\n (this.mode === \"chat\" ? this.strings.inputPlaceholder : this.strings.typeOrTalk),\n intro: {\n enabled: this.options.intro?.enabled ?? config.intro.enabled,\n headline: this.options.intro?.headline ?? config.intro.headline,\n subheadline: this.options.intro?.subheadline ?? config.intro.subheadline,\n mediaUrl: this.options.intro?.mediaUrl ?? config.intro.mediaUrl,\n mediaType: this.options.intro?.mediaType ?? config.intro.mediaType,\n suggestedPrompts: this.options.intro?.suggestedPrompts ?? config.intro.suggestedPrompts,\n },\n });\n }\n\n /** Show or hide the voice controls to match the resolved mode. Removing\n * them rather than disabling them: a greyed-out microphone still\n * promises voice the project has switched off. */\n private applyMode(): void {\n const showVoice = this.mode !== \"chat\";\n this.micBtn.hidden = !showVoice;\n if (this.ui.composerMicBtn) this.ui.composerMicBtn.hidden = !showVoice;\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n if (this.destroyed || this.restricted) return;\n // The page's own inputs keep the shortcut: a visitor typing into a\n // search box must not have a Space stolen. The widget's composer is\n // the one exception — the hint that names the shortcut sits directly\n // beneath it, and the panel focuses it on open, so a guard that\n // covered it would make the shortcut dead exactly where it is\n // advertised.\n if (isEditableTarget(e.target) && e.target !== this.inputElement) return;\n if (e.repeat) return;\n const hotkey = parseHotkey(this.options.hotkey ?? defaultHotkey());\n if (!matchesHotkey(e, hotkey)) return;\n e.preventDefault();\n void this.toggle();\n }\n\n private setStatus(status: DabaAgentStatus): void {\n this.status = status;\n updateBadge(this.badge, this.badgeLabel, status, this.position);\n this.options.onStatusChange?.(status);\n\n if (status === \"listening\" || status === \"speaking\") {\n this.micBtn.classList.add(\"daba-agent-header__btn--active\");\n } else {\n this.micBtn.classList.remove(\"daba-agent-header__btn--active\");\n }\n }\n\n private emitError(error: DabaError): void {\n this.options.onError?.(error);\n this.setStatus(\"idle\");\n appendMessage(this.messagesContainer, `Error: ${error.message}`, \"system\");\n }\n\n public get currentStatus(): DabaAgentStatus {\n return this.status;\n }\n\n public get isActive(): boolean {\n return this.status !== \"idle\";\n }\n\n public get isChatOpen(): boolean {\n return this.isOpen;\n }\n\n public openChat(): void {\n if (this.isOpen || this.restricted) return;\n this.isOpen = true;\n this.chatWindow.classList.remove(\"daba-agent-window--hidden\");\n // The launcher hides while the panel is up: the reference shows a\n // standalone sheet, and a button whose only job is to open a thing\n // that is already open is a distraction at best.\n this.chatWindow.parentElement?.classList.add(\"daba-agent-wrapper--open\");\n this.inputElement.focus();\n this.options.onChatToggle?.(true);\n }\n\n public closeChat(): void {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.chatWindow.classList.add(\"daba-agent-window--hidden\");\n this.chatWindow.parentElement?.classList.remove(\"daba-agent-wrapper--open\");\n this.options.onChatToggle?.(false);\n }\n\n public toggleChat(): void {\n if (this.isOpen) {\n this.closeChat();\n } else {\n this.openChat();\n }\n }\n\n /**\n * Send one typed message.\n *\n * This used to call `startSession()`, which opens the Realtime\n * WebSocket, and `onSocketOpen` then unconditionally grabbed the\n * microphone — so typing a sentence demanded microphone permission and\n * was billed as voice minutes. Typing now goes over plain HTTP and\n * touches neither the mic, the AudioContext nor the socket.\n *\n * The one exception is a voice session that is ALREADY live: injecting\n * the text there keeps a single continuous conversation, which is what a\n * visitor switching medium mid-sentence expects. It is not a reason to\n * start a session that does not exist.\n */\n public async sendText(text: string): Promise<void> {\n const message = text.trim();\n if (this.restricted || !message || this.chatInFlight) return;\n\n if (!this.isOpen) this.openChat();\n this.ui.setIntroVisible(false);\n\n const msg: ChatMessage = {\n id: `user-${Date.now()}`,\n role: \"user\",\n text: message,\n timestamp: Date.now(),\n isFinal: true,\n };\n this.messages.push(msg);\n appendMessage(this.messagesContainer, message, \"user\");\n this.saveTranscript();\n this.options.onTranscript?.(\"user\", message, true);\n\n if (this.isActive && this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(\n JSON.stringify({\n type: \"conversation.item.create\",\n item: { type: \"message\", role: \"user\", content: [{ type: \"input_text\", text: message }] },\n }),\n );\n this.ws.send(JSON.stringify({ type: \"response.create\" }));\n this.setStatus(\"thinking\");\n return;\n }\n\n await this.sendChatMessage(message);\n }\n\n private async sendChatMessage(message: string): Promise<void> {\n this.chatInFlight = true;\n this.ui.setTyping(true);\n this.ui.setStatusText(this.strings.thinking);\n const gatewayUrl = resolveGatewayUrl(this.options.gatewayUrl, this.options.env);\n\n try {\n const reply = await sendChatTurn(gatewayUrl, this.options.projectId, this.options.apiKey, {\n message,\n conversationId: this.conversationId,\n // The page the visitor is standing on, so \"book this one\" resolves\n // to what is on screen rather than to the site in general.\n pageContext: extractPageContext(),\n uiLanguage: this.uiLang,\n });\n\n const cards: DabaCard[] = reply.cards ?? [];\n const suggestions = reply.suggestions ?? [];\n this.messages.push({\n id: `agent-${Date.now()}`,\n role: \"agent\",\n text: reply.reply,\n timestamp: Date.now(),\n isFinal: true,\n cards,\n suggestions,\n });\n appendMessage(this.messagesContainer, reply.reply, \"agent\", {\n cards,\n strings: this.strings,\n lang: reply.language || this.uiLang,\n suggestions,\n onSuggestion: (text) => void this.sendText(text),\n });\n this.saveTranscript();\n this.options.onTranscript?.(\"agent\", reply.reply, true);\n if (cards.length) this.options.onCards?.(cards);\n } catch (err) {\n const dabaErr: DabaError =\n err instanceof DabaFetchError\n ? err.dabaError\n : { kind: \"network\", message: this.strings.errorGeneric };\n this.options.onError?.(dabaErr);\n appendMessage(this.messagesContainer, dabaErr.message, \"system\");\n } finally {\n this.chatInFlight = false;\n this.ui.setTyping(false);\n this.ui.setStatusText(\"\");\n }\n }\n\n /**\n * Start a new conversation: clear the transcript, forget the history the\n * gateway is keyed on, and put the intro back. A fresh id rather than a\n * reset flag, so the old thread simply expires on its own TTL instead of\n * needing a round trip to delete.\n */\n public resetConversation(): void {\n if (this.restricted) return;\n clearTranscript(this.options.projectId, this.conversationId);\n this.messages = [];\n this.conversationId = newConversationId();\n persistConversationId(this.options.projectId, this.conversationId);\n for (const child of Array.from(this.messagesContainer.children)) {\n if (child !== this.ui.introEl) child.remove();\n }\n this.ui.setIntroVisible(true);\n this.ui.setTyping(false);\n }\n\n /** Voice, explicitly. Never reached in chat mode — the controls that\n * would call it are not rendered there. */\n private async toggleVoice(): Promise<void> {\n if (this.mode === \"chat\") return;\n await this.toggle();\n }\n\n private handleTranscriptDelta(role: \"user\" | \"agent\", text: string, isFinal: boolean): void {\n if (this.currentStreamRole !== role || !this.currentStreamBubble) {\n this.currentStreamBubble = appendMessage(this.messagesContainer, \"\", role);\n this.currentStreamRole = role;\n }\n\n if (this.currentStreamBubble) {\n this.currentStreamBubble.textContent += text;\n this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;\n }\n\n if (isFinal) {\n this.currentStreamBubble = null;\n this.currentStreamRole = null;\n }\n }\n\n public async toggle(): Promise<void> {\n // A public API a host may call regardless of mode. In chat mode there\n // is no session to toggle, so the useful interpretation of \"toggle the\n // agent\" is the panel.\n if (this.mode === \"chat\" && !this.restricted) {\n this.toggleChat();\n return;\n }\n if (this.restricted) {\n this.emitError({\n kind: \"restricted\",\n message: \"This page is marked as protected — the assistant can't run here.\",\n });\n return;\n }\n if (this.isActive) {\n this.stopSession();\n } else {\n await this.startSession();\n }\n }\n\n private get usesLiveEngine(): boolean {\n return (this.options.voiceEngine ?? this.remoteConfig?.voiceEngine ?? \"realtime\") === \"live\";\n }\n\n private async startLiveSession(): Promise<void> {\n const gatewayUrl = resolveGatewayUrl(this.options.gatewayUrl, this.options.env);\n this.live = new LiveTransport({\n gatewayUrl,\n projectId: this.options.projectId,\n apiKey: this.options.apiKey,\n handlers: {\n onStatus: (status) => this.setStatus(status),\n onTranscript: (role, text, final) => {\n this.handleTranscriptDelta(role, final ? \"\" : text, final);\n this.options.onTranscript?.(role, text, final);\n },\n onToolCall: (call) => this.runVoiceTool(call),\n onError: (error) => this.emitError(error),\n onClosed: () => {\n this.live = null;\n this.cleanupAfterClose();\n },\n },\n });\n await this.live.start(extractPageContext());\n }\n\n private runVoiceTool(call: VoiceToolCall): void {\n const { output, navigateHref } = this.executeTool(call.name, call.args);\n this.live?.sendToolResult(call.callId, output);\n if (navigateHref) {\n window.setTimeout(() => {\n window.location.href = navigateHref;\n }, NAVIGATE_DELAY_MS);\n }\n }\n\n private async startSession(): Promise<void> {\n if (this.destroyed || this.isActive || this.restricted) return;\n this.setStatus(\"connecting\");\n\n if (this.usesLiveEngine) {\n await this.startLiveSession();\n return;\n }\n\n const gatewayUrl = resolveGatewayUrl(this.options.gatewayUrl, this.options.env);\n\n try {\n // No separate metadata pre-check here: createAgentSession hits the\n // same require_api_key_and_origin + owns_project checks the\n // gateway's metadata route does, so a bad key/project fails with\n // the identical error class either way — a prior fetchAgentConfig\n // call was pure round-trip overhead with nothing consumed from its\n // response (title/greeting aren't used by this widget).\n const pageContext = extractPageContext();\n const { sessionId, wsUrl } = await createAgentSession(\n gatewayUrl,\n this.options.projectId,\n this.options.apiKey,\n pageContext,\n );\n persistSession(this.options.projectId, sessionId, wsUrl);\n this.attachWebSocket(wsUrl, false);\n } catch (err) {\n const dabaErr: DabaError =\n err instanceof DabaFetchError ? err.dabaError : { kind: \"network\", message: \"Failed to start the agent session.\" };\n this.emitError(dabaErr);\n }\n }\n\n private async tryReattach(): Promise<void> {\n if (this.destroyed || this.isActive || this.restricted) return;\n const persisted = readPersistedSession(this.options.projectId);\n if (!persisted) return;\n clearPersistedSession(this.options.projectId);\n\n this.isReattaching = true;\n this.setStatus(\"connecting\");\n this.attachWebSocket(persisted.wsUrl, true);\n }\n\n private attachWebSocket(wsUrl: string, isReattach: boolean): void {\n const fullWsUrl = `${wsUrl}${wsUrl.includes(\"?\") ? \"&\" : \"?\"}key=${encodeURIComponent(this.options.apiKey)}`;\n const ws = new WebSocket(fullWsUrl);\n ws.binaryType = \"arraybuffer\";\n this.ws = ws;\n\n ws.onopen = () => void this.onSocketOpen(isReattach);\n ws.onmessage = (e) => this.onSocketMessage(e);\n ws.onerror = () => {\n this.emitError({ kind: \"network\", message: \"Connection to the voice agent failed.\" });\n };\n ws.onclose = (e) => this.handleSocketClose(e);\n }\n\n private async onSocketOpen(isReattach: boolean): Promise<void> {\n if (this.destroyed || !this.ws) return;\n try {\n const audioContext = new AudioContext({ sampleRate: 24_000 });\n this.audioContext = audioContext;\n if (audioContext.state !== \"running\") {\n void audioContext.resume();\n unlockAudioContextOnNextGesture(audioContext);\n }\n this.player = new PcmPlayer(audioContext);\n this.mic = await startMicCapture(audioContext, (pcm16, rms) => this.onMicFrame(pcm16, rms));\n if (isReattach) {\n this.ws.send(JSON.stringify({ type: \"page_context\", context: extractPageContext() }));\n }\n this.isReattaching = false;\n this.setStatus(\"listening\");\n } catch {\n // A reattach (after navigate() lands on a fresh page load) failing to\n // grab the mic must not just dead-end the widget in an idle state\n // requiring a manual click — that's exactly the \"shows the agent as\n // off\" complaint. The old bridge is still alive server-side for the\n // ~20s grace window, but this browser tab can't use it without a mic,\n // so fall back to a brand-new session automatically rather than\n // leaving the visitor stuck.\n const wasReattaching = this.isReattaching;\n this.isReattaching = false;\n this.ws?.close();\n if (wasReattaching) {\n // cleanupAfterClose (not just ws.close()) so status is back to\n // \"idle\" before calling startSession() — otherwise its own\n // isActive guard silently no-ops, since ws.close() only resolves\n // to a real onclose event later, asynchronously.\n this.cleanupAfterClose();\n void this.startSession();\n } else {\n this.emitError({ kind: \"network\", message: \"Microphone access was denied or unavailable.\" });\n }\n }\n }\n\n private onMicFrame(pcm16: ArrayBuffer, rms: number): void {\n if (this.destroyed || !this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n // Gated on the player's actual audible state, not `this.status`.\n // response.output_audio_transcript.done (which flips status back to\n // \"listening\") frequently fires before the scheduled audio chunks it\n // describes finish playing — the player buffers ahead of real time —\n // so gating on status alone made barge-in silently stop working for\n // the tail of every reply: the visitor's interruption arrived while\n // audio was still audible but status already said \"listening\", so the\n // check below never even ran.\n if (this.player?.isPlaying()) {\n if (rms > BARGE_IN_RMS_THRESHOLD) {\n this.bargeInStreak++;\n if (this.bargeInStreak >= BARGE_IN_FRAMES_REQUIRED) {\n this.bargeInStreak = 0;\n this.player?.clear();\n this.ws.send(JSON.stringify({ type: \"cancel\" }));\n this.setStatus(\"listening\");\n }\n } else {\n this.bargeInStreak = 0;\n }\n }\n\n this.ws.send(pcm16);\n }\n\n private onSocketMessage(e: MessageEvent): void {\n if (typeof e.data !== \"string\") return;\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(e.data);\n } catch {\n return;\n }\n\n switch (msg.type) {\n case \"response.output_audio.delta\": {\n const delta = msg.delta as string | undefined;\n if (delta && this.player) {\n this.setStatus(\"speaking\");\n this.player.pushBase64(delta);\n }\n break;\n }\n case \"conversation.item.input_audio_transcription.delta\": {\n const delta = msg.delta as string | undefined;\n if (delta) {\n this.handleTranscriptDelta(\"user\", delta, false);\n this.options.onTranscript?.(\"user\", delta, false);\n }\n break;\n }\n case \"conversation.item.input_audio_transcription.completed\": {\n const transcript = msg.transcript as string | undefined;\n if (transcript) {\n this.handleTranscriptDelta(\"user\", \"\", true);\n this.options.onTranscript?.(\"user\", transcript, true);\n }\n break;\n }\n case \"response.output_audio_transcript.delta\": {\n const delta = msg.delta as string | undefined;\n if (delta) {\n this.handleTranscriptDelta(\"agent\", delta, false);\n this.options.onTranscript?.(\"agent\", delta, false);\n }\n break;\n }\n case \"response.output_audio_transcript.done\": {\n const transcript = msg.transcript as string | undefined;\n if (transcript) {\n this.handleTranscriptDelta(\"agent\", \"\", true);\n this.options.onTranscript?.(\"agent\", transcript, true);\n }\n if (this.status === \"speaking\") this.setStatus(\"listening\");\n break;\n }\n case \"tool_call\":\n this.handleToolCall(msg as unknown as ToolCallMessage);\n break;\n case \"error\": {\n const error = msg.error as { message?: string } | undefined;\n this.options.onError?.({ kind: \"network\", message: error?.message ?? \"Realtime session error.\" });\n break;\n }\n default:\n break;\n }\n }\n\n private executeTool(\n name: string,\n rawArgs: string,\n ): { output: { ok: boolean; message: string }; navigateHref?: string } {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(rawArgs || \"{}\");\n } catch {\n args = {};\n }\n\n switch (name) {\n case \"fill_form_field\": {\n const output = fillFormField(String(args.label ?? \"\"), String(args.value ?? \"\"));\n appendMessage(this.messagesContainer, `Filled field: ${args.label}`, \"system\");\n return { output };\n }\n case \"submit_form\": {\n const output = submitForm();\n appendMessage(this.messagesContainer, `Form submission confirmed.`, \"system\");\n return { output };\n }\n case \"navigate\": {\n const result = domNavigate(String(args.destination ?? \"\"));\n appendMessage(this.messagesContainer, `Navigating to ${args.destination}…`, \"system\");\n return { output: { ok: result.ok, message: result.message }, navigateHref: result.href };\n }\n case \"click_element\": {\n const description = String(args.description ?? \"\");\n const candidate = findClickable(description);\n if (!candidate) {\n return {\n output: { ok: false, message: `Could not find anything matching \"${description}\" to click.` },\n };\n }\n const confirmed = window.confirm(`Daba Agent wants to click: \"${candidate.text}\"\\n\\nAllow this?`);\n if (!confirmed) {\n return { output: { ok: false, message: `Visitor declined to click \"${candidate.text}\".` } };\n }\n const output = clickElement(candidate.el, candidate.text);\n appendMessage(this.messagesContainer, `Clicked: ${candidate.text}`, \"system\");\n return { output };\n }\n case \"scroll_page\": {\n const direction = args.direction !== undefined ? String(args.direction) : undefined;\n const target = args.target !== undefined ? String(args.target) : undefined;\n return { output: scrollPage(direction, target) };\n }\n default:\n return { output: { ok: false, message: `Unknown tool \"${name}\".` } };\n }\n }\n\n private handleToolCall(msg: ToolCallMessage): void {\n if (!this.ws) return;\n const { output, navigateHref } = this.executeTool(msg.name, msg.arguments);\n\n this.ws.send(\n JSON.stringify({ type: \"tool_result\", call_id: msg.call_id, output: JSON.stringify(output) }),\n );\n\n if (navigateHref) {\n window.setTimeout(() => {\n window.location.href = navigateHref;\n }, NAVIGATE_DELAY_MS);\n }\n }\n\n private stopSession(): void {\n this.ws?.close(HARD_STOP_CLOSE_CODE, \"user_stopped\");\n clearPersistedSession(this.options.projectId);\n this.cleanupAfterClose();\n }\n\n private handleSocketClose(e: CloseEvent): void {\n const wasActive = this.status !== \"idle\";\n const wasReattaching = this.isReattaching;\n this.isReattaching = false;\n this.cleanupAfterClose();\n if (!wasActive && !wasReattaching) return;\n\n // A reattach that never got as far as onSocketOpen (e.g. 4410 \"session\n // already ended\" once the ~20s server-side grace window has passed, or\n // any other abnormal close during the attempt) must self-heal into a\n // fresh session rather than leaving the widget idle after a navigate()\n // — a visitor who just asked the agent to go to another page shouldn't\n // need to click it again to keep talking.\n if (wasReattaching) {\n void this.startSession();\n return;\n }\n\n if (e.code !== 1000 && e.code !== 1005) {\n this.options.onError?.({\n kind: \"network\",\n message: e.reason || \"The voice connection closed unexpectedly.\",\n });\n this.flashBadgeError();\n }\n }\n\n private flashBadgeError(): void {\n this.badge.classList.add(\"daba-agent-badge--error\");\n this.badgeLabel.textContent = \"Unavailable — try again\";\n window.setTimeout(() => {\n this.badge.classList.remove(\"daba-agent-badge--error\");\n if (this.status === \"idle\") {\n updateBadge(this.badge, this.badgeLabel, \"idle\", this.position);\n }\n }, 4000);\n }\n\n private cleanupAfterClose(): void {\n this.mic?.stop();\n this.mic = null;\n this.player = null;\n if (this.audioContext) {\n void this.audioContext.close();\n this.audioContext = null;\n }\n this.ws = null;\n this.bargeInStreak = 0;\n if (!this.destroyed) this.setStatus(\"idle\");\n }\n\n public destroy(): void {\n this.destroyed = true;\n document.removeEventListener(\"keydown\", this.keydownHandler);\n this.stopSession();\n this.badge.parentElement?.remove();\n this.badge.remove();\n }\n}\n"]}