@lingjingai/script-editor 0.1.21 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +10 -1
- package/dist/index.js +344 -83
- package/dist/index.js.map +1 -1
- package/dist/style.css +10 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/selection.ts","../src/types.ts","../src/emotion-labels.ts","../src/utils.ts","../src/cn.ts","../src/toc/studio-toc.tsx","../src/primitives/highlighted-text.tsx","../src/primitives/editable-text.tsx","../src/hud/hud.tsx","../src/mutations/editor-utils.ts","../src/entity-distribution.ts","../src/stream/scroll-state-memo.ts","../src/primitives/popover.tsx","../src/primitives/row-menu.tsx","../src/stream/drag-context.tsx","../src/mutations/item-mutations.ts","../src/primitives/select-field.tsx","../src/scene/scene-cast-prop-rows.tsx","../src/scene/scene-header.tsx","../src/actor-color.ts","../src/scene/scene-item-row.tsx","../src/scene/scene-editor.tsx","../src/stream/flat-items.ts","../src/mutations/entity-mutations.ts","../src/stream/scene-preview-card.tsx","../src/stream/asset-state-timeline.tsx","../src/stream/asset-card.tsx","../src/stream/script-stream.tsx","../src/diff/diff-engine.ts","../src/reference.ts","../src/comment/quote-layer.tsx","../src/search/script-search-box.tsx","../src/search/search-index.ts","../src/search/script-search-layer.tsx","../src/ScriptEditor.tsx","../src/toc/nav-model.ts","../src/mutations/index.ts","../src/primitives/delete-confirm-button.tsx"],"names":["ScriptContentType","states","Fragment","jsx","createContext","useState","useContext","jsxs","ChevronRight","useEffect","useRef","useLayoutEffect","Trash2","withSceneUpdated","Plus","body","Check","useMemo","memo","createPortal","X","useCallback","GripVertical","i","j","ChevronLeft","selection","Eraser"],"mappings":";;;;;;;;;;;;;AAyCO,SAAS,kBAAA,CACd,MACA,EAAA,EACiC;AACjC,EAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAChB,EAAA,IAAI,SAAS,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,EAAA,EAAG;AAC1D,EAAA,IAAI,SAAS,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,YAAY,EAAA,EAAG;AACnE,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAG;AACpC;AAEO,SAAS,gBAAgB,IAAA,EAA4C;AAC1E,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AACzE,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW;AACrF,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC7C;AA8BO,IAAM,eAAA,GAAmC,EAAE,IAAA,EAAM,OAAA;AAGjD,SAAS,UAAA,CACd,KACA,MAAA,EACG;AACH,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,MAAA,EAAO;AAC1B;AAMO,SAAS,mBAAmB,CAAA,EAA4B;AAC7D,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA;AAAA,IAC5C,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,EAAE,UAAU,CAAA,CAAA;AAAA,IAChC,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,EAAE,UAAU,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA,EAAI,EAAE,MAAM,CAAA,CAAA;AAAA,IACtD,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,EAAE,OAAO,CAAA,CAAA;AAAA,IAC3B,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,EAAE,UAAU,CAAA,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,EAAE,MAAM,CAAA,CAAA;AAAA,IACzB,KAAK,WAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAA;AAAA;AAEb;AAGO,SAAS,qBAAA,CACd,GACA,CAAA,EACS;AACT,EAAA,OAAO,kBAAA,CAAmB,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAC,CAAA;AACvD;AAEO,SAAS,eAAA,CACd,SAAA,EACA,UAAA,EACA,QAAA,EACS;AACT,EAAA,OACE,UAAU,IAAA,KAAS,OAAA,IACnB,UAAU,UAAA,KAAe,UAAA,IACzB,UAAU,QAAA,KAAa,QAAA;AAE3B;AAEO,SAAS,cAAA,CACd,SAAA,EACA,UAAA,EACA,OAAA,EACA,MAAA,EACS;AACT,EAAA,OACE,SAAA,CAAU,IAAA,KAAS,MAAA,IACnB,SAAA,CAAU,UAAA,KAAe,cACzB,SAAA,CAAU,OAAA,KAAY,OAAA,IACtB,SAAA,CAAU,MAAA,KAAW,MAAA;AAEzB;AAEO,SAAS,uBAAuB,SAAA,EAA2C;AAChF,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,SAAA,EAAW,OAAO,SAAA,CAAU,UAAA;AACnD,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,OAAA,EAAS,OAAO,SAAA,CAAU,UAAA;AACjD,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ,OAAO,SAAA,CAAU,UAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,aAAA,CACd,WACA,UAAA,EACS;AACT,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,SAAA,EAAW,OAAO,UAAU,UAAA,KAAe,UAAA;AAClE,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,OAAA,EAAS,OAAO,UAAU,UAAA,KAAe,UAAA;AAChE,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ,OAAO,UAAU,UAAA,KAAe,UAAA;AAC/D,EAAA,OAAO,KAAA;AACT;;;AC1KO,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AACL,EAAAA,mBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,mBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,mBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,mBAAA,cAAA,CAAA,GAAe,eAAA;AAJL,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;;;ACEZ,IAAM,cAAA,GAAyC;AAAA,EAC7C,MAAA,EAAQ,oBAAA;AAAA,EACR,QAAA,EAAU,0BAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO,cAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,UAAA,EAAY,0BAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,aAAA,EAAe,cAAA;AAAA,EACf,IAAA,EAAM,cAAA;AAAA,EACN,SAAA,EAAW,cAAA;AAAA,EACX,cAAA,EAAgB,cAAA;AAAA,EAChB,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,WAAA,EAAa,cAAA;AAAA,EACb,IAAA,EAAM,cAAA;AAAA,EACN,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,0BAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,IAAA,EAAM,cAAA;AAAA,EACN,UAAA,EAAY,oBAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,YAAA,EAAc,cAAA;AAAA,EACd,MAAA,EAAQ,cAAA;AAAA,EACR,KAAA,EAAO,cAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,eAAA,EAAiB,0BAAA;AAAA,EACjB,OAAA,EAAS,cAAA;AAAA,EACT,eAAA,EAAiB,0BAAA;AAAA,EACjB,MAAA,EAAQ,0BAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,oBAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,cAAA;AAAA,EACX,OAAA,EAAS,oBAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA,EAAW,0BAAA;AAAA,EACX,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,IAAA,EAAM,cAAA;AAAA,EACN,SAAA,EAAW,oBAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,0BAAA;AAAA,EACT,aAAA,EAAe,oBAAA;AAAA,EACf,KAAA,EAAO,cAAA;AAAA,EACP,IAAA,EAAM,cAAA;AAAA,EACN,QAAA,EAAU,0BAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,0BAAA;AAAA,EACT,QAAA,EAAU,0BAAA;AAAA,EACV,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,0BAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,MAAA,EAAQ,gCAAA;AAAA,EACR,WAAA,EAAa,0BAAA;AAAA,EACb,QAAA,EAAU,0BAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,cAAA;AAAA,EACN,GAAA,EAAK,cAAA;AAAA,EACL,QAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAO,0BAAA;AAAA,EACP,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,0BAAA;AAAA,EACT,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,KAAA,EAAO,cAAA;AAAA,EACP,SAAA,EAAW,gCAAA;AAAA,EACX,gBAAA,EAAkB,oBAAA;AAAA,EAClB,QAAA,EAAU,0BAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,oBAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,cAAA;AAAA,EACX,QAAA,EAAU,0BAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO,cAAA;AAAA,EACP,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,oBAAA;AAAA,EACT,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,IAAA,EAAM,0BAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,WAAA,EAAa,oBAAA;AAAA,EACb,UAAA,EAAY,cAAA;AAAA,EACZ,QAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAO,cAAA;AAAA,EACP,SAAA,EAAW,cAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,QAAA,EAAU,0BAAA;AAAA,EACV,UAAA,EAAY,oBAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,cAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,gBAAA,EAAkB,kBAAA;AAAA,EAClB,MAAA,EAAQ,cAAA;AAAA,EACR,WAAA,EAAa,0BAAA;AAAA,EACb,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,iBAAA,EAAmB,gCAAA;AAAA,EACnB,UAAA,EAAY,0BAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,sBAAsB,OAAA,EAAkB;AACtD,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/C,EAAA,IAAI,CAAC,YAAY,OAAO,EAAA;AACxB,EAAA,IAAI,cAAA,CAAe,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAO,eAAe,UAAU,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,WACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,MAAA,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,IAAA,CAAK,IAAA,EAAK;AAAA,IAC5C,CAAC,CAAA,CACA,IAAA,CAAK,QAAG,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,QAAS,IAAA,EAAK;AACvB;;;ACnKA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,KAAA,EAAO,MAAK,IAAK,EAAA;AAC1B;AAEO,SAAS,WAAA,CAAY,MAAA,GAAwB,EAAC,EAAG;AACtD,EAAA,OAAO,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAC5E;AAEO,SAAS,cAAA,CAAe,SAAA,GAA8B,EAAC,EAAG;AAC/D,EAAA,OAAO,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa,CAAC,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG,QAAQ,CAAC,CAAC,CAAA;AAC3F;AAEO,SAAS,UAAA,CAAW,KAAA,GAAsB,EAAC,EAAG;AACnD,EAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACvE;AAEO,SAAS,aAAA,CAAc,QAAA,GAA4B,EAAC,EAAG;AAC5D,EAAA,OAAO,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,CAAC,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA;AACtF;AAEO,SAAS,oBAAoB,KAAA,EAAqB;AACvD,EAAA,OAAO,OAAO,UAAA,EAAY,IAAA,MAAU,KAAA,EAAO,IAAA,EAAM,MAAK,IAAK,gCAAA;AAC7D;AAEO,SAAS,uBAAuB,QAAA,EAA2B;AAChE,EAAA,OAAO,UAAU,aAAA,EAAe,IAAA,MAAU,QAAA,EAAU,IAAA,EAAM,MAAK,IAAK,gCAAA;AACtE;AAEO,SAAS,mBAAmB,IAAA,EAAmB;AACpD,EAAA,OAAO,MAAM,SAAA,EAAW,IAAA,MAAU,IAAA,EAAM,IAAA,EAAM,MAAK,IAAK,gCAAA;AAC1D;AAEO,SAAS,oBAAoB,KAAA,EAAoB;AACtD,EAAA,OAAO,KAAA,EAAO,UAAA,EAAY,IAAA,EAAK,IAAK,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK,IAAK,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AACxF;AAQO,SAAS,gBAAgB,KAAA,EAAc;AAC5C,EAAA,OAAO;AAAA,IACL,MAAA,EAAA,CAAS,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,MAAA,KAAW,EAAC;AAAA,IAClF,SAAA,EAAA,CAAY,KAAA,CAAM,OAAA,EAAS,SAAA,EAAW,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,SAAA,KAAc,EAAC;AAAA,IAC9F,KAAA,EAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,KAAA,KAAU;AAAC,GAChF;AACF;AAEO,SAAS,SAAA,CAAUC,SAAkC,OAAA,EAA4D;AACtH,EAAA,MAAM,EAAA,GAAK,SAAS,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,EAAA,IAAM,CAACA,OAAAA,EAAQ,OAAO,MAAA;AAC3B,EAAA,OAAOA,OAAAA,CAAO,KAAK,CAAC,KAAA,KAAA,CAAW,MAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,EAAE,CAAA;AACpE;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EACrD,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK;AACvC,CAAA;AAEA,SAAS,yBAAyB,KAAA,EAAe;AAC/C,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC9B,IAAA,MAAA,IAAU,IAAA,IAAQ,SAAU,IAAA,IAAQ,KAAA,GAAS,OAAO,YAAA,CAAa,IAAA,GAAO,KAAA,GAAS,EAAE,CAAA,GAAI,IAAA;AAAA,EACzF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAoB,KAAA,EAA8B;AACzD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,UAAK,OAAO,EAAA;AACzB,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAG,CAAA,EAAG,OAAO,EAAA,IAAM,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,CAAA,CAAA;AACtE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAG,CAAA,EAAG,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,IAAK,CAAA,IAAK,EAAA;AACxE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,QAAG,CAAA;AACpC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAI,CAAA,IAAK,CAAA;AACxC,IAAA,OAAO,SAAA,GAAY,GAAA,IAAO,mBAAA,CAAoB,KAAK,CAAA,IAAK,CAAA,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,QAAG,CAAA;AACpC,IAAA,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA,IAAK,CAAA,IAAK,MAAM,KAAA,GAAS,YAAA,CAAa,KAAK,CAAA,IAAK,CAAA,GAAK,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,IAAA;AAC/B;AAEA,SAAS,mBAAmB,SAAA,EAAkC;AAC5D,EAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,SAAA,CAAU,IAAA,EAAM,CAAA;AAC5D,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5B,IAAA,MAAM,MAAA,GAAS,OAAO,UAAU,CAAA;AAChC,IAAA,OAAO,OAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AAAA,EAC1D;AACA,EAAA,MAAM,OAAA,GAAU,oBAAoB,UAAU,CAAA;AAC9C,EAAA,OAAO,OAAA,IAAW,OAAA,GAAU,CAAA,GAAI,OAAA,GAAU,IAAA;AAC5C;AAEA,IAAM,mBAAA,GAAsB,4GAAA;AAC5B,IAAM,oBAAoB,IAAI,MAAA;AAAA,EAC5B,CAAA,eAAA,EAAa,mBAAmB,CAAA,yCAAA,EAAuC,mBAAmB,CAAA,IAAA,CAAA;AAAA,EAC1F;AACF,CAAA;AAEO,SAAS,gBAAA,CAAiB,SAAwB,KAAA,EAAe;AACtE,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,CAAQ,UAAA,EAAY,QAAQ,KAAK,CAAA;AACrD,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,iBAAiB,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAA,GAAS,mBAAmB,MAAA,CAAO,CAAC,KAAK,MAAA,CAAO,CAAC,KAAK,EAAE,CAAA;AAC9D,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AACA,IAAA,MAAM,UAAA,GAAa,yBAAyB,KAAK,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC9B,MAAA,IAAI,OAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,GAAG,OAAO,MAAA;AAAA,IACpD;AAAA,EACF;AACA,EAAA,OAAO,KAAA,GAAQ,CAAA;AACjB;AAEO,SAAS,qBAAA,CAAsB,SAAwB,KAAA,EAAe;AAC3E,EAAA,OAAO,MAAA,CAAO,iBAAiB,OAAA,EAAS,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACjE;AAEO,SAAS,eAAA,CAAgB,SAAwB,KAAA,EAAe;AACrE,EAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAK,qBAAA,CAAsB,OAAA,EAAS,KAAK,CAAC,CAAA,OAAA,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAClC,EAAA,IAAI,OAAO,OAAO,KAAA;AAElB,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,EAAY,IAAA,EAAK;AACpC,EAAA,IAAI,MAAM,CAAC,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAG,OAAO,EAAA;AACpC,EAAA,OAAO,QAAA;AACT;AAQO,SAAS,cAAA,CAAe,OAA0B,UAAA,EAA4B;AACnF,EAAA,MAAM,IAAI,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK,CAAE,MAAM,QAAQ,CAAA;AAChD,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,MAAM,IAAI,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,IAAI,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,GAAG,OAAO,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,UAAA,GAAa,CAAA;AACtB;AAEO,SAAS,mBAAA,CAAoB,OAA0B,UAAA,EAAoB;AAChF,EAAA,OAAO,CAAA,OAAA,EAAK,cAAA,CAAe,KAAA,EAAO,UAAU,CAAC,CAAA,CAAA;AAC/C;AAEO,SAAS,oBAAA,CAAqB,OAAc,UAAA,EAAoB;AACrE,EAAA,MAAM,UAAU,KAAA,CAAM,QAAA,EAAU,MAAK,IAAK,MAAA,CAAO,aAAa,CAAC,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAa,KAAA,KAAU,aAAa,QAAA,GAAM,QAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,EAAa,IAAA,IAAQ,KAAA;AAC3C,EAAA,MAAM,OAAA,GAAkC,EAAE,GAAA,EAAK,QAAA,EAAK,OAAO,QAAA,EAAK,IAAA,EAAM,QAAA,EAAK,IAAA,EAAM,QAAA,EAAI;AACrF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA;AACjC,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,MAAA,EAAM,IAAI,GAAG,KAAK,CAAA,CAAA;AACrC;AAEO,SAAS,0BAA0B,IAAA,EAAe;AACvD,EAAA,OAAO,IAAA,KAAA,UAAA,mBAAuC,IAAA,KAAA,eAAA;AAChD;AAEO,SAAS,qBAAA,CACd,WACA,UAAA,mBAAyC,IAAI,KAAI,EACjD,QAAA,mBAAqC,IAAI,GAAA,EAAI,EAC7C;AACA,EAAA,MAAM,EAAA,GAAK,YAAY,SAAS,CAAA;AAChC,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AACjC,EAAA,IAAI,SAAS,YAAA,EAAc,IAAA,IAAQ,OAAO,OAAA,CAAQ,aAAa,IAAA,EAAK;AACpE,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK;AAC9C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,OAAA,EAAS,SAAS,CAAA;AAC/C,EAAA,IAAI,UAAA,KAAe,WAAW,QAAA,EAAU;AACtC,IAAA,OAAO,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAC,CAAA,IAAK,QAAA;AAAA,EACxD;AACA,EAAA,MAAM,OAAA,GAAU,GAAG,UAAA,CAAW,MAAM,IAAI,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AACtD,EAAA,IAAI,OAAA,IAAW,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,SAAU,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,OAAO,CAAC,CAAA;AACtF,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,wBACd,IAAA,EACA,QAAA,EACA,UAAA,mBAAyC,IAAI,KAAI,EACjD;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrF,IAAA,OAAO,KAAK,KAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,sBAAsB,IAAA,CAAK,UAAA,EAAY,UAAA,EAAY,QAAQ,CAAC,CAAA,CAC1E,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,KAAK,CAAA;AAAA,EACf;AACA,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,QAAQ,CAAA,GAC1C,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,WAAA,CAAY,QAAQ,UAAU,CAAC,EAAE,MAAA,CAAO,OAAO,IAC9E,EAAC;AACL,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc,qBAAA,CAAsB,SAAA,EAAW,UAAA,EAAY,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,EACzG;AACA,EAAA,IAAI,KAAK,UAAA,EAAY,OAAO,sBAAsB,IAAA,CAAK,UAAA,EAAY,YAAY,QAAQ,CAAA;AACvF,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAClC,EAAA,OAAO,KAAA,GAAQ,mBAAA,CAAoB,KAAK,CAAA,GAAI,OAAA,IAAW,0BAAA;AACzD;AAEO,SAAS,yBAAyB,QAAA,EAAmB;AAC1D,EAAA,IAAI,QAAA,KAAa,gBAAgB,OAAO,cAAA;AACxC,EAAA,IAAI,QAAA,KAAa,WAAW,OAAO,cAAA;AACnC,EAAA,IAAI,QAAA,KAAa,SAAS,OAAO,cAAA;AACjC,EAAA,OAAO,EAAA;AACT;;;ACzOO,SAAS,MAAM,KAAA,EAAyD;AAC7E,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACvC;AC+BA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,wBACJ,IAAA,CAAAC,UAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA,mBACC,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,IAAA,IAAQ,SAAS,CAAA;AAAA,QAChD,WAAA,EAAa;AAAA;AAAA,KACf,GACE,IAAA;AAAA,oBACJ,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,aAAa,GAAA,EAAK,CAAA;AAAA,oBAClD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACvC,SAAS,IAAA,mBAAO,GAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EAAkB,iBAAM,CAAA,GAAU;AAAA,GAAA,EACrE,CAAA;AAEF,EAAA,OAAO,QAAA,uBACJ,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,WAAA,IAAe,OAAO,CAAA,EAAG,SAAS,QAAA,EAC/E,QAAA,EAAA,KAAA,EACH,CAAA,mBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,UAAA,EAAY,WAAA,IAAe,OAAO,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAEnE;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAsB,MAAM;AAClE,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,IAAI,SAAA,CAAU,SAAS,OAAA,IAAW,SAAA,CAAU,SAAS,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA;AAAA,SACxF,IAAA,CAAK,IAAI,CAAC,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH,EAAA,MAAM,OAAO,CAAC,GAAA,KAAyB,SAAS,UAAA,CAAW,GAAA,EAAK,SAAS,CAAC,CAAA;AAE1E,EAAA,MAAM,aAAA,GAAgB,UAAU,IAAA,KAAS,SAAA,IAAa,UAAU,IAAA,KAAS,OAAA,IAAW,UAAU,IAAA,KAAS,MAAA;AAEvG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAGb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,OAAO,QAAA,CAAS,MAAA;AAAA,QAChB,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,UAAU,MAAM,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAC,CAAC;AAAA;AAAA,KAC3C;AAAA,IACC,YAAA,GACC,QAAA,CAAS,MAAA,KAAW,CAAA,uBACjB,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,0BAAA,EAAI,CAAA,GAErC,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,EAAA,KAAO;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,KAAS,SAAA,IAAa,UAAU,UAAA,KAAe,EAAA;AAC1E,MAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,QAAA,IAAY,WAAW,CAAA,EACvD,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA,EAAG,YAAA,EAAW,6BACzF,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,WAAW,EAAA,CAAG,YAAA,EAAc,UAAU,SAAS,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,CAAA,EAClF,CAAA;AAAA,0BACA,IAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,EAAA,EAAI,CAAA,EACxG,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,8BAAA,EAA+B,WAAA,EAAa,GAAA,EAAK,CAAA;AAAA,gCACpE,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,qBAAA,CAAsB,OAAA,EAAS,EAAE,CAAA,EAAE,CAAA;AAAA,gCACrE,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAqB,QAAA,EAAA,eAAA,CAAgB,OAAA,EAAS,EAAE,CAAA,EAAE,CAAA;AAAA,4BAClE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,MAAA;AAAA,cAAO;AAAA,aAAA,EAAE;AAAA,WAAA,EACvD;AAAA,SAAA,EACF,CAAA;AAAA,QACC,MAAA,GACG,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAA,KAAO;AACxB,UAAA,MAAM,MAAA,GACJ,UAAU,IAAA,KAAS,OAAA,IAAW,UAAU,UAAA,KAAe,EAAA,IAAM,UAAU,QAAA,KAAa,EAAA;AACtF,UAAA,uBACE,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,MAAA,IAAU,WAAW,CAAA;AAAA,cACjE,OAAA,EAAS,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAS,UAAA,EAAY,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,CAAA;AAAA,cAEnE,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oCAChC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAA,EAAE,CAAA;AAAA,oCACrE,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,oBAAA,CAAqB,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA;AAAA,aAAA;AAAA,YAPjE,MAAM,EAAE,CAAA;AAAA,WAQf;AAAA,QAEJ,CAAC,CAAA,GACD;AAAA,OAAA,EAAA,EA7BI,CAAA,GAAA,EAAM,EAAE,CAAA,CA8BlB,CAAA;AAAA,IAEJ,CAAC,CAAA,GAED,IAAA;AAAA,IACH,YAAA,IAAgB,+BACf,IAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,YAAA,EACzD,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,CAAA,EAAG,CAAA;AAAA,MAAE;AAAA,KAAA,EACjD,CAAA,GACE,IAAA;AAAA,oBAEJ,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAU,0BAAA;AAAA,QACV,QAAQ,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAK,CAAA,CAAE,QAAA,IAAY,IAAI,IAAA,EAAK,EAAG,MAAM,mBAAA,CAAoB,CAAC,GAAE,CAAE,CAAA;AAAA,QACvG,WAAA,EAAa,UAAU,IAAA,KAAS,OAAA;AAAA,QAChC,UAAU,CAAC,EAAA,KAAO,UAAU,IAAA,KAAS,OAAA,IAAW,UAAU,OAAA,KAAY,EAAA;AAAA,QACtE,MAAA,EAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI;AAAA;AAAA,KACrD;AAAA,oBACA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAU,0BAAA;AAAA,QACV,QAAQ,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAK,CAAA,CAAE,WAAA,IAAe,IAAI,IAAA,EAAK,EAAG,MAAM,sBAAA,CAAuB,CAAC,GAAE,CAAE,CAAA;AAAA,QAChH,WAAA,EAAa,UAAU,IAAA,KAAS,UAAA;AAAA,QAChC,UAAU,CAAC,EAAA,KAAO,UAAU,IAAA,KAAS,UAAA,IAAc,UAAU,UAAA,KAAe,EAAA;AAAA,QAC5E,MAAA,EAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI;AAAA;AAAA,KAC3D;AAAA,oBACA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAU,0BAAA;AAAA,QACV,QAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAK,CAAA,CAAE,OAAA,IAAW,IAAI,IAAA,EAAK,EAAG,MAAM,kBAAA,CAAmB,CAAC,GAAE,CAAE,CAAA;AAAA,QACpG,WAAA,EAAa,UAAU,IAAA,KAAS,MAAA;AAAA,QAChC,UAAU,CAAC,EAAA,KAAO,UAAU,IAAA,KAAS,MAAA,IAAU,UAAU,MAAA,KAAW,EAAA;AAAA,QACpE,MAAA,EAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI;AAAA;AAAA;AACnD,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,IAAI,CAAA;AACrC,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACtC,EAAA,uBACE,IAAA,CAAAA,UAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAc,KAAA,EAAO,MAAM,MAAA,EAAQ,IAAA,EAAY,WAAA,EAA0B,QAAA,EAAU,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IACrI,IAAA,GACG,KAAA,CAAM,MAAA,KAAW,CAAA,mBACf,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,SAAA,EAAU,CAAA,GAC5C,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACT,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,WAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA,CAAE,EAAE,KAAK,WAAW,CAAA;AAAA,QACzE,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QAE1B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,WAAA,EAAa,GAAA,EAAK,CAAA;AAAA,0BAClE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,YAAE,IAAA,EAAK;AAAA;AAAA,OAAA;AAAA,MANzC,CAAA,CAAE;AAAA,KAQV,CAAA,GACH;AAAA,GAAA,EACN,CAAA;AAEJ;ACtOO,IAAM,gBAAA,GAAmB,cAAsB,EAAE,CAAA;AAEjD,SAAS,eAAA,CAAgB,EAAE,IAAA,EAAK,EAAmC;AACxE,EAAA,MAAM,SAAA,GAAY,WAAW,gBAAgB,CAAA;AAC7C,EAAA,uBAAOC,GAAAA,CAAAD,UAAAA,EAAA,EAAG,QAAA,EAAA,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA,EAAE,CAAA;AACnD;AAEO,SAAS,qBAAA,CAAsB,OAAe,KAAA,EAA0B;AAC7E,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,EAAkB;AAC3C,EAAA,MAAM,WAAA,GAAc,OAAO,iBAAA,EAAkB;AAC7C,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,WAAW,CAAA;AACxC,EAAA,OAAO,OAAO,CAAA,EAAG;AACf,IAAA,IAAI,GAAA,GAAM,MAAM,GAAA,CAAI,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,EAAM,GAAG,CAAC,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAA;AAAA,sBACFC,GAAAA,CAAC,MAAA,EAAA,EAAkC,SAAA,EAAU,kBAAA,EAC1C,gBAAM,KAAA,CAAM,GAAA,EAAK,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA,EAAA,EAD5B,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA,CAE/B;AAAA,KACF;AACA,IAAA,IAAA,GAAO,MAAM,MAAA,CAAO,MAAA;AACpB,IAAA,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,IAAA,GAAO,MAAM,MAAA,EAAQ,GAAA,CAAI,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AACnD,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,KAAA;AAChC;ACDO,IAAM,oBAAA,GAAuBC,cAAoC,IAAI,CAAA;AAK5E,IAAM,cAAA,GAAiB,GAAA;AAmBvB,SAAS,oBAAA,CAAqB,GAAW,CAAA,EAA0B;AACjE,EAAA,MAAM,CAAA,GAAI,QAAA;AAIV,EAAA,IAAI,OAAO,CAAA,CAAE,mBAAA,KAAwB,UAAA,EAAY;AAC/C,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,mBAAA,CAAoB,CAAA,EAAG,CAAC,CAAA;AACpC,IAAA,OAAO,CAAA,GAAI,EAAE,WAAA,GAAc,IAAA;AAAA,EAC7B;AACA,EAAA,IAAI,OAAO,CAAA,CAAE,sBAAA,KAA2B,UAAA,EAAY;AAClD,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,sBAAA,CAAuB,CAAA,EAAG,CAAC,CAAA;AACvC,IAAA,OAAO,CAAA,GAAI,EAAE,MAAA,GAAS,IAAA;AAAA,EACxB;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,SAAS,QAAQ,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,OAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,OAA+C,IAAI,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,aAAA,GAAgBC,WAAW,oBAAoB,CAAA;AACrD,EAAA,MAAM,SAAA,GAAYA,WAAW,gBAAgB,CAAA;AAO7C,EAAA,MAAM,YAAA,GAAe,OAA6C,IAAI,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,OAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AACjC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,cAAA,EAAe;AACf,IAAA,MAAM,OAAO,QAAA,CAAS,OAAA;AACtB,IAAA,IAAI,IAAA,KAAS,aAAa,OAAA,EAAS;AACjC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,cAAA,EAAe;AACf,IAAA,YAAA,CAAa,OAAA,GAAU,WAAW,MAAM;AACtC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,MAAA,SAAA,EAAU;AAAA,IACZ,GAAG,cAAc,CAAA;AAAA,EACnB,CAAA;AAIA,EAAA,SAAA,CAAU,MAAM,MAAM,SAAA,EAAU,EAAG,EAAE,CAAA;AAIrC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,EAAe;AAChC,IAAA,aAAA,CAAc,GAAA,EAAI;AAClB,IAAA,OAAO,MAAM,cAAc,GAAA,EAAI;AAAA,EACjC,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAa3B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,KAAU,aAAa,OAAA,EAAS;AACpC,IAAA,MAAM,YAAA,GAAe,OAAA,IAAW,KAAA,KAAU,YAAA,CAAa,OAAA;AACvD,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AAAA,EACzB,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,KAAK,CAAC,CAAA;AAI1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,aAAqB,IAAI,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,KAAK,QAAA,CAAS,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAI,SAAA,WAAoB,EAAE,CAAA;AAC1B,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,MAAM,GAAA,GAAM,KAAA,IAAS,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA;AAC7E,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,EACrB,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,SAAS,UAAU,CAAA,EAAqB;AACtC,IAAA,IAAI,QAAA,EAAU;AAEd,IAAA,MAAM,GAAA,GAAM,OAAO,YAAA,EAAa;AAChC,IAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,WAAA,EAAa;AAC7B,IAAA,QAAA,CAAS,OAAA,GAAU,oBAAA,CAAqB,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAC5D,IAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAC7B,IAAA,QAAA,CAAS,UAAU,YAAA,CAAa,OAAA;AAChC,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,SAAS,MAAA,GAAS;AAChB,IAAA,cAAA,EAAe;AACf,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,SAAA,IAAY;AACZ,IAAA,IAAI,KAAA,KAAU,aAAa,OAAA,EAAS;AAClC,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,SAAS,MAAA,GAAS;AAChB,IAAA,cAAA,EAAe;AACf,IAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAC7B,IAAA,QAAA,CAAS,UAAU,YAAA,CAAa,OAAA;AAChC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,SAAA,IAAY;AAAA,EACd;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,OAAA,GAAU,KAAA,GACZ,qBAAA,CAAsB,KAAA,EAAO,SAAS,CAAA,mBACtCH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,WAAA,IAAe,EAAA,EAAG,CAAA;AAClD,IAAA,uBACEA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACE,GAAG,SAAA;AAAA,QACJ,WAAW,gBAAA,IAAoB,SAAA,GAAY,MAAM,SAAA,GAAY,EAAA,CAAA,IAAO,WAAW,qBAAA,GAAwB,EAAA,CAAA;AAAA,QACvG,OAAA,EAAS,SAAA;AAAA,QAER,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,SAAA,EAAW,eAAA,IAAmB,SAAA,GAAY,GAAA,GAAM,SAAA,GAAY,EAAA,CAAA;AAAA,IAC5D,QAAA,EAAU,CAAC,CAAA,KAAiE;AAC1E,MAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,MAAA,QAAA,CAAS,CAAC,CAAA;AACV,MAAA,QAAA,CAAS,OAAA,GAAU,CAAA;AACnB,MAAA,IAAI,SAAA,EAAW,QAAA,CAAS,CAAA,CAAE,MAA6B,CAAA;AACvD,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,YAAA,EAAa;AAAA,IAC1C,CAAA;AAAA,IACA,oBAAoB,MAAM;AACxB,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,cAAA,EAAe;AAAA,IACjB,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,CAAA,KAAsE;AACvF,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,QAAA,CAAS,OAAA,GAAU,EAAE,aAAA,CAAc,KAAA;AACnC,MAAA,YAAA,EAAa;AAAA,IACf,CAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,CAAC,CAAA,KAA2B;AACrC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,EAAO;AAAA,MACT,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC5B,QAAA,IAAI,CAAC,SAAA,IAAa,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,EAAS;AACxC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,SAAA,mBACLA,GAAAA,CAAC,UAAA,EAAA,EAAU,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAA,mBAE/BA,GAAAA,CAAC,OAAA,EAAA,EAAO,GAAG,MAAA,EAAQ,MAAK,MAAA,EAAO,CAAA;AAEnC;AAEA,SAAS,SAAS,EAAA,EAA+B;AAC/C,EAAA,EAAA,CAAG,MAAM,MAAA,GAAS,MAAA;AAClB,EAAA,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,EAAA,CAAG,YAAA,GAAe,IAAA;AACtC;AC9OO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAQ,YAAA,EAAW,0BAAA,EAAO,WAAU,cAAA,EAC1C,QAAA,EAAA;AAAA,IACA,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,cAAA,EAAK;AAAA,IAC/B,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,0BAAA;AAAO,GAChC,CAAY,GAAA,CAAI,CAAC,GAAA,qBACfA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,QAAA;AAAA,MACL,cAAA,EAAc,UAAU,GAAA,CAAI,GAAA;AAAA,MAC5B,WAAW,EAAA,CAAG,kBAAA,EAAoB,KAAA,KAAU,GAAA,CAAI,OAAO,WAAW,CAAA;AAAA,MAClE,OAAA,EAAS,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,MAE9B,QAAA,EAAA,GAAA,CAAI;AAAA,KAAA;AAAA,IANA,GAAA,CAAI;AAAA,GAQZ,CAAA,EACH,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAiBG;AACD,EAAA,MAAM,QAAA,GAAW,aAAA,IAAiB,IAAA,IAAA,CAAS,KAAA,IAAS,IAAI,MAAA,GAAS,CAAA;AACjE,EAAA,uBACEI,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,GACC,gCACEJ,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,oBAAA;AAAA,UACV,OAAO,KAAA,IAAS,EAAA;AAAA,UAChB,WAAA,EAAY,gCAAA;AAAA,UACZ,QAAA,EAAU,aAAA;AAAA,UACV,MAAA,EAAQ;AAAA;AAAA,0BAGVA,GAAAA,CAAC,UAAK,SAAA,EAAU,2CAAA,EAA6C,iBAAM,CAAA,GAEnE,IAAA;AAAA,MACH,YAAA,mBACCI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EACb,QAAA,EAAA;AAAA,QAAA,QAAA,mBAAWJ,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,aAAA,EAAW,IAAA,EAAC,eAAC,CAAA,GAAU,IAAA;AAAA,QACrE;AAAA,OAAA,EACH,CAAA,GACE;AAAA,KAAA,EACN,CAAA;AAAA,oBACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,MAAA,EAAQ,UAAU,cAAA,EAAgB,CAAA;AAAA,MACtD,UAAU,MAAA,mBACTI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,cAAA,EAAe,QAAA,EAAU,CAAC,OAAA,EAAS,KAAA,EAAM,gBAAK,OAAA,EAAS,MAAA,EACrF,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EACnD,CAAA;AAAA,wBACAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,cAAA,EAAe,UAAU,CAAC,OAAA,EAAS,OAAM,cAAA,EAAK,OAAA,EAAS,QACrF,QAAA,kBAAAA,GAAAA,CAAC,SAAM,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EACnD;AAAA,OAAA,EACF,CAAA,GACE,IAAA;AAAA,MACH,0BAAUA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EAAwB,mBAAQ,CAAA,GAAS;AAAA,KAAA,EACrE;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,UAAA,GAAa,MAAA;AAAA,EACb,SAAA,GAAY,CAAA;AAAA,EACZ,cAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAaG;AACD,EAAA,MAAM,WAAW,UAAA,KAAe,MAAA;AAChC,EAAA,MAAM,UAAU,SAAA,GAAY,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,CAAC,EAAE,WAAA,IAAe,QAAA,CAAA;AACpC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,WAAW,OAAO,IAAA;AAEhD,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACb,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCA,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,KAAA,EAAO,CAAA,aAAA,EAAM,WAAW,CAAA,CAAA,EAAI,OAAA,EAAS,QAAA,EAC1F,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,sBACpDI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,QAAA,eAAA;AAAA,QAAI;AAAA,OAAA,EAAY;AAAA,KAAA,EAC/D,CAAA,GACE,IAAA;AAAA,IACH,OAAA,mBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,CAAA;AAAA,wBACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B;AAAA,OAAA,EAC9C,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAsB,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,MACvC,cAAA,KAAmB,QAAA,mBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,KAAA,EAAM,uFAAA,EAAkB,QAAA,EAAA,oBAAA,EAAG,CAAA,GAC9D,IAAA;AAAA,MACH,UAAA,mBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,qBAAoB,KAAA,EAAM,oBAAA,EAAM,SAAS,UAAA,EACvE,QAAA,kBAAAA,IAAC,WAAA,EAAA,EAAY,SAAA,EAAU,cAAa,WAAA,EAAa,IAAA,EAAM,GACzD,CAAA,GACE,IAAA;AAAA,MACH,UAAA,mBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,qBAAoB,KAAA,EAAM,oBAAA,EAAM,SAAS,UAAA,EACvE,QAAA,kBAAAA,IAACK,YAAAA,EAAA,EAAa,WAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EAC1D,CAAA,GACE,IAAA;AAAA,MACH,WAAA,mBACCL,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAU,CAAC,YAAA,EAAc,OAAA,EAAS,WAAA,EAAa,sCAEtG,CAAA,GACE,IAAA;AAAA,MACH,WAAA,mBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAU,CAAC,YAAA,EAAc,OAAA,EAAS,WAAA,EAAa,sCAEtG,CAAA,GACE;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,IACH,QAAA,IAAY,CAAC,OAAA,mBAAUA,IAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,CAAA,GAAK;AAAA,GAAA,EACjE,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,MAAA,EAAO,EAA2B;AACxD,EAAA,IAAI,MAAA,KAAW,QAAA;AACb,IAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACd,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,uBAAA,EAAwB,aAAa,IAAA,EAAM,CAAA;AAAA,MAAE;AAAA,KAAA,EAClE,CAAA;AAEJ,EAAA,IAAI,MAAA,KAAW,OAAA;AACb,IAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EACd,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,MAAE;AAAA,KAAA,EACpD,CAAA;AAEJ,EAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EACd,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,YAAA,EAAa,aAAa,IAAA,EAAM,CAAA;AAAA,IAAE;AAAA,GAAA,EAC3D,CAAA;AAEJ;;;ACxLA,SAAS,cAAc,IAAA,EAAqB;AAC1C,EAAA,OAAO,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAClC;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,YAAA,EACA,UAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,OAAA,CAAQ,KAAK,CAAA;AAClC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEA,SAAS,mBAAmB,KAAA,EAAe;AACzC,EAAA,OAAO,KAAA,CACJ,KAAA,CAAM,MAAM,CAAA,CACZ,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,OAAO,CAAA;AACnB;AAEA,SAAS,eAAA,CAAgB,OAAc,KAAA,EAAsD;AAC3F,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,OAAA,CAAQ,MAAA;AAAA,IAChC,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,OAAA,CAAQ,SAAA;AAAA,IACtC,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,OAAA,CAAQ;AAAA,GAChC;AACA,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,OAAA;AAAA,IACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,OAAO,OAAA,CAAQ;AAAA,GACjB;AACF;AAEO,SAAS,mBAAmB,KAAA,EAAc;AAC/C,EAAA,OAAA,CAAQ,gBAAgB,KAAK,CAAA,CAAE,UAAU,EAAC,EACvC,IAAI,CAAC,IAAA,KAAS,KAAK,QAAA,EAAU,IAAA,MAAU,EAAE,CAAA,CACzC,OAAO,OAAO,CAAA,CACd,KAAK,QAAG,CAAA;AACb;AAEO,SAAS,0BAA0B,KAAA,EAAc;AACtD,EAAA,MAAM,eAAe,KAAA,CAAM,YAAA,EAAc,IAAA,CAAK,OAAO,GAAG,IAAA,EAAK;AAC7D,EAAA,IAAI,cAAc,OAAO,YAAA;AACzB,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,SAAA,GAAY,CAAC,CAAA,EAAG,WAAA,EAAa,MAAK,IAAK,EAAA;AACvE;AAEO,SAAS,eAAA,CAAgB,SAAiB,kBAAA,EAAwC;AACvF,EAAA,OAAO;AAAA,IACL,SAAS,OAAA,CAAQ,IAAA,EAAK,IAAK,CAAA,EAAA,EAAK,qBAAqB,CAAC,CAAA,CAAA;AAAA,IACtD,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AACF;AAEO,SAAS,gBAAA,CAAiB,OAAA,EAA6B,oBAAA,EAA8B,kBAAA,EAA4B;AACtH,EAAA,MAAM,UAAA,GAAa,SAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,YAAY,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AAE7E,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,cAAc,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AACxE,EAAA,OAAO,CAAA,EAAG,MAAM,CAAC,CAAC,GAAG,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA,GAAI,CAAC,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAC/F;AAEO,SAAS,kBAAA,CAAmB,MAAqB,YAAA,EAA8B;AACpF,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,GAAW,YAAY,CAAA;AAC5C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK,CAAE,MAAM,aAAa,CAAA;AACxD,IAAA,IAAI,KAAA,EAAO,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,CAAA,IAAA,EAAO,OAAO,WAAA,GAAc,CAAC,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACxD;AAEA,SAAS,sBAAA,CAAuB,MAAqB,YAAA,EAAmC;AACtF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,GAAW,YAAY,CAAA;AAC5C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK;AACrC,IAAA,IAAI,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,2BAAA,CAA4B,IAAA,EAAqB,YAAA,EAAsB,WAAA,EAA6B;AAC3G,EAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,IAAA,EAAM,YAAY,CAAA;AACtD,EAAA,IAAI,YAAY,WAAA,CAAY,IAAA,EAAK,IAAK,kBAAA,CAAmB,MAAM,YAAY,CAAA;AAC3E,EAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,SAAS,GAAG,OAAO,SAAA;AAEjC,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,cAAc,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,kBAAA,CAAmB,MAAM,YAAY,CAAA;AAExD,EAAA,IAAI,UAAU,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAC9C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AACxE,IAAA,OAAA,IAAW,CAAA;AAAA,EACb;AACA,EAAA,OAAO,SAAA;AACT;AAMO,SAAS,oBAAA,CACd,WAAA,EACA,cAAA,EACA,oBAAA,EACA,kBAAA,EACQ;AACR,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,MAAM,cAAA,EAAgB;AAC/B,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,QAAA,EAAU,IAAA,EAAK;AAC7B,IAAA,IAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,EACrB;AACA,EAAA,IAAI,SAAA,GAAY,gBAAA,CAAiB,WAAA,EAAa,oBAAA,EAAsB,kBAAkB,CAAA;AACtF,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,IAAK,WAAW,GAAA,EAAM;AAC7C,IAAA,SAAA,GAAY,gBAAA,CAAiB,SAAA,EAAW,oBAAA,EAAsB,kBAAkB,CAAA;AAChF,IAAA,QAAA,IAAY,CAAA;AAAA,EACd;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,OAAA,EAA6B,oBAAA,EAA8B,kBAAA,EAA4B;AACtH,EAAA,MAAM,UAAA,GAAa,SAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,YAAY,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AAE7E,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,cAAc,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AACxE,EAAA,MAAM,IAAI,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,UAAA;AACnB,EAAA,OAAO,CAAA,EAAG,MAAM,CAAC,CAAC,GAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA;AACpC;AAEO,SAAS,qBAAqB,KAAA,EAA0B;AAC7D,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK;AACrC,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,CAAM,MAAM,CAAA;AAE9C,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,IAC7B,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK,IAAK,UAAA;AAAA,MAC7B,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,IAAK;AAAA,KAC7B;AAAA,IACA,YAAA,EAAc,QAAA,GAAW,CAAC,QAAQ,IAAI,EAAC;AAAA,IACvC,SAAA,EAAW,QAAA,GAAW,CAAC,EAAE,WAAA,EAAa,UAAU,QAAA,EAAU,IAAA,EAAM,CAAA,GAAI,EAAC;AAAA,IACrE,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,OAAA,MAAa,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,IAAA,EAAK,CAAE,CAAA;AAAA,IACvE,SAAS;AAAC,GACZ;AACF;AAEO,SAAS,oBAAoB,KAAA,EAA8B;AAChE,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,UAAA;AAAA,MACA,QAAA,EAAU,KAAA,CAAM,SAAA,CAAU,IAAA,EAAK;AAAA,MAC/B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,MAC5B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAK,KAC9B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA,CAAM,UAAA,CAAW,IAAA,EAAK,IAAA,QAAA;AAAA,IAC5B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAK,GAC9B;AACF;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,OACA,KAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,KAAA,CAAM,MAAK,EAAE;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,MAAA,EAAQ;AACzC,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,WAAA,EAAa;AAAA,UACX,GAAG,KAAA,CAAM,WAAA;AAAA,UACT,CAAC,KAAK,GAAG,KAAA,CAAM,IAAA;AAAK;AACtB,OACF;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,EAAK;AAC5B,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,GAAG,KAAA;AAAA,QACH,YAAA,EAAc,QAAA,GAAW,CAAC,QAAQ,IAAI;AAAC,OACzC,EAAG,EAAE,SAAA,EAAW,QAAA,GAAW,CAAC,EAAE,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,MAAM,OAAA,GAAU,mBAAmB,KAAK,CAAA;AACxC,MAAA,MAAM,uBAAuB,IAAI,GAAA;AAAA,QAAA,CAC9B,gBAAgB,KAAK,CAAA,CAAE,SAAS,EAAC,EAAG,IAAI,CAAC,IAAA,KAAS,CAAA,CAAE,IAAA,CAAK,WAAW,EAAA,EAAI,IAAA,IAAQ,IAAA,CAAK,QAAA,IAAY,IAAI,CAAC;AAAA,OACzG;AACA,MAAA,OAAO,gBAAgB,KAAA,EAAO;AAAA,QAC5B,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,UAC9B,OAAA,EAAS,MAAA;AAAA,UACT,QAAA,EAAU,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,SAChD,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,mBAAmB,KAAK,CAAA;AACzC,IAAA,MAAM,mBAAmB,IAAI,GAAA;AAAA,MAAA,CAC1B,gBAAgB,KAAK,CAAA,CAAE,UAAU,EAAC,EAAG,IAAI,CAAC,IAAA,KAAS,CAAA,CAAE,IAAA,CAAK,YAAY,EAAA,EAAI,IAAA,IAAQ,IAAA,CAAK,QAAA,IAAY,IAAI,CAAC;AAAA,KAC3G;AACA,IAAA,OAAO,gBAAgB,KAAA,EAAO;AAAA,MAC5B,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,QACjC,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA,IAAK;AAAA,OAC7C,CAAE;AAAA,KACH,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAMA,SAAS,yBACP,IAAA,EACA,YAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,UACA,OAAA,EACA;AACA,EAAA,MAAM,gBAAA,GAAmB,SAAS,IAAA,EAAK;AACvC,EAAA,MAAM,eAAA,GAAkB,OAAA,EAAS,IAAA,EAAK,IAAK,IAAA;AAC3C,EAAA,IAAI,CAAC,kBAAkB,OAAO,IAAA;AAE9B,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,IAAA,MAAM,IAAA,GAAQ,OAAA,CAAQ,KAAK,CAAA,IAAsE,EAAC;AAClG,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,IAAK,EAAA,EAAI,UAAS,CAAE,IAAA,EAAK,KAAM,gBAAA,EAAkB,OAAO,IAAA;AACvE,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,eAAA,EAAgB;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,KAAK,GAAG,gBAAA,EAAkB,QAAA,EAAU,iBAAiB,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,gBAAgB,KAAA,EAAO,EAAE,CAAC,KAAK,GAAG,MAAgD,CAAA;AAAA,EAC3F,CAAC,CAAA;AACH;AAEO,SAAS,qBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,SACA,OAAA,EACA;AACA,EAAA,OAAO,yBAAyB,IAAA,EAAM,YAAA,EAAc,YAAY,QAAA,EAAU,UAAA,EAAY,SAAS,OAAO,CAAA;AACxG;AAEO,SAAS,wBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,YACA,OAAA,EACA;AACA,EAAA,OAAO,yBAAyB,IAAA,EAAM,YAAA,EAAc,YAAY,WAAA,EAAa,aAAA,EAAe,YAAY,OAAO,CAAA;AACjH;AAEO,SAAS,oBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,QACA,OAAA,EACA;AACA,EAAA,OAAO,yBAAyB,IAAA,EAAM,YAAA,EAAc,YAAY,OAAA,EAAS,SAAA,EAAW,QAAQ,OAAO,CAAA;AACrG;AAEO,SAAS,sBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,OAAA,CAAQ,SAAS,IAAI,EAAE,GAAG,MAAM,OAAA,EAAS,OAAA,CAAQ,MAAK,EAAE;AACxD,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,oBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAIlB,IAAA,MAAM,OAAmB,EAAE,GAAG,MAAM,QAAA,EAAU,OAAA,CAAQ,MAAK,EAAE;AAC7D,IAAA,OAAO,IAAA,CAAK,UAAA;AACZ,IAAA,OAAO,IAAA,CAAK,QAAA;AACZ,IAAA,OAAO,IAAA,CAAK,KAAA;AACZ,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,sBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,MAAM,IAAA,GAAmB,EAAE,GAAG,IAAA,EAAK;AACnC,IAAA,IAAI,OAAA,OAAc,OAAA,GAAU,OAAA;AAAA,gBAChB,IAAA,CAAK,OAAA;AACjB,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,IAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAS,CAAA,EAAG,OAAO,KAAA;AAChC,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAOO,SAAS,UAAA,CAAW,MAAqB,OAAA,EAAiC;AAC/E,EAAA,MAAM,WAAW,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,IAAA,GAAO,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,MAAM,CAAC,CAAA;AAChG,EAAA,MAAM,QACJ,OAAO,IAAA,KAAS,WAAA,IAAe,OAAO,KAAK,GAAA,KAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,SAAS,MAAM,CAAA;AAClH,EAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,EAAE,UAAA,EAAY,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAC9E,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAGO,SAAS,aAAA,CAAc,MAAqB,YAAA,EAAqC;AACtF,EAAA,MAAM,SAAS,IAAA,CAAK,QAAA,GAAW,YAAY,CAAA,EAAG,UAAU,EAAC;AACzD,EAAA,OAAO,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,MAAA,CAAO,MAAA,EAAQ;AAAA,IACpD,WAAA,EAAa,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,KAAA,EAAM;AAAA,IAC9C,SAAS;AAAC,GACX,CAAA;AACH;AAEO,SAAS,WAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,KAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,KAAA;AAAA,IACH,UAAU,2BAAA,CAA4B,IAAA,EAAM,YAAA,EAAc,KAAA,CAAM,YAAY,EAAE;AAAA,GAChF;AACA,EAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,CAAA,EAAG,UAAU,CAAA;AACvC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEO,SAAS,UAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,gBAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,IAAI,gBAAA,IAAoB,CAAA,IAAK,gBAAA,IAAoB,OAAA,CAAQ,QAAQ,OAAO,IAAA;AAExE,EAAA,MAAM,UAAA,GAAoB;AAAA,IACxB,GAAG,KAAA;AAAA,IACH,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,gBAAgB;AAAA,GAC5C;AAIA,EAAA,MAAM,SAAA,GAAmB;AAAA,IACvB,GAAG,KAAA;AAAA,IACH,QAAA,EAAU,2BAAA,CAA4B,IAAA,EAAM,YAAA,EAAc,EAAE,CAAA;AAAA,IAC5D,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,gBAAgB;AAAA,GACzC;AAIA,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAElD,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,EAAG,UAAA,EAAY,SAAA,EAAW,GAAG,cAAc;AAAA,GACnF;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAWO,SAAS,kBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA;AACA,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,GAAa,CAAC,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,UAAU,CAAA;AAC7B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,GAAA,EAAK,OAAO,IAAA;AAE1B,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,MAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,OAAO,CAAC,GAAI,eAAA,CAAgB,IAAI,EAAE,MAAA,IAAU,EAAC,EAAI,GAAI,gBAAgB,GAAG,CAAA,CAAE,MAAA,IAAU,EAAG,CAAA,EAAG;AACnG,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AACnC,MAAA,IAAI,CAAC,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,MAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,OAAO,CAAC,GAAI,eAAA,CAAgB,IAAI,EAAE,SAAA,IAAa,EAAC,EAAI,GAAI,gBAAgB,GAAG,CAAA,CAAE,SAAA,IAAa,EAAG,CAAA,EAAG;AACzG,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,EAAa,IAAA,EAAK,IAAK,EAAA;AACtC,MAAA,IAAI,CAAC,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,MAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,OAAO,CAAC,GAAI,eAAA,CAAgB,IAAI,EAAE,KAAA,IAAS,EAAC,EAAI,GAAI,gBAAgB,GAAG,CAAA,CAAE,KAAA,IAAS,EAAG,CAAA,EAAG;AACjG,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAS,IAAA,EAAK,IAAK,EAAA;AAClC,MAAA,IAAI,CAAC,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,SAAS,WAAA,EAAY;AAC3B,EAAA,MAAM,YAAY,cAAA,EAAe;AACjC,EAAA,MAAM,QAAQ,UAAA,EAAW;AAEzB,EAAA,MAAM,SAAgB,eAAA,CAAgB;AAAA,IACpC,GAAG,IAAA;AAAA,IACH,OAAA,EAAS,CAAC,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC,EAAI,GAAI,GAAA,CAAI,OAAA,IAAW,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKzD,YAAA,EAAc;AAAA,GAChB,EAAG,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AAE/B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAExC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,UAAA,GAAa,CAAC,CAAA,EAAG,MAAA,EAAQ,GAAG,IAAI;AAAA,GAC9D;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEO,SAAS,WAAA,CAAY,IAAA,EAAqB,YAAA,EAAsB,UAAA,EAAoB;AACzF,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC3B,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEO,SAAS,eAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,IAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,CAAA,EAAG,IAAI,CAAA;AACjC,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,eAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,SAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAC,CAAA;AAC3B,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAOO,SAAS,aAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,IAAa,OAAA,CAAQ,QAAQ,OAAO,KAAA;AACzD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,IAAA,GAAO,SAAA,GAAY,SAAA,GAAY,SAAA,GAAY,CAAA,GAAI,SAAA;AACrD,IAAA,IAAI,IAAA,KAAS,WAAW,OAAO,KAAA;AAC/B,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA;AAC7B,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAcO,SAAS,cAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACe;AACf,EAAA,IAAI,KAAK,YAAA,KAAiB,EAAA,CAAG,gBAAgB,IAAA,CAAK,UAAA,KAAe,GAAG,UAAA,EAAY;AAC9E,IAAA,OAAO,aAAA,CAAc,MAAM,IAAA,CAAK,YAAA,EAAc,KAAK,UAAA,EAAY,IAAA,CAAK,SAAA,EAAW,EAAA,CAAG,IAAI,CAAA;AAAA,EACxF;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,YAAY,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,EAAA,CAAG,YAAY,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO,OAAO,IAAA;AAC7B,EAAA,MAAM,YAAY,CAAC,GAAI,KAAA,CAAM,MAAA,IAAU,EAAG,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,aAAa,CAAC,GAAI,QAAA,CAAS,OAAA,IAAW,EAAG,CAAA;AAC/C,EAAA,IAAI,KAAK,SAAA,GAAY,CAAA,IAAK,KAAK,SAAA,IAAa,UAAA,CAAW,QAAQ,OAAO,IAAA;AACtE,EAAA,MAAM,CAAC,KAAK,CAAA,GAAI,WAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACnD,EAAA,SAAA,CAAU,KAAK,UAAU,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,SAAS,UAAA,EAAW;AAChE,EAAA,QAAA,CAAS,KAAK,YAAY,CAAA,GAAI,EAAE,GAAG,KAAA,EAAO,QAAQ,SAAA,EAAU;AAG5D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,EAAA,CAAG,YAAY,CAAA;AACvC,EAAA,MAAM,YAAY,CAAC,GAAI,MAAA,CAAO,MAAA,IAAU,EAAG,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,EAAA,CAAG,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,aAAa,CAAC,GAAI,QAAA,CAAS,OAAA,IAAW,EAAG,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,CAAG,IAAA,EAAM,UAAA,CAAW,MAAM,CAAC,CAAA;AAC7D,EAAA,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA;AAChC,EAAA,SAAA,CAAU,GAAG,UAAU,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,SAAS,UAAA,EAAW;AAC9D,EAAA,QAAA,CAAS,GAAG,YAAY,CAAA,GAAI,EAAE,GAAG,MAAA,EAAQ,QAAQ,SAAA,EAAU;AAE3D,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAGO,SAAS,aAAA,CAAc,MAAqB,YAAA,EAAqC;AACtF,EAAA,MAAM,WAAW,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAC1C,EAAA,IAAI,YAAA,GAAe,CAAA,IAAK,YAAA,IAAgB,QAAA,CAAS,QAAQ,OAAO,IAAA;AAChE,EAAA,QAAA,CAAS,MAAA,CAAO,cAAc,CAAC,CAAA;AAC/B,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;;;AChpBA,SAAS,SAAA,CAAU,OAAA,EAAwB,EAAA,EAAY,KAAA,EAAc,EAAA,EAAY;AAC/E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA,EAAG,qBAAA,CAAsB,OAAA,EAAS,EAAE,CAAC,CAAA,MAAA,EAAM,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA;AAAA,IAChF,YAAA,EAAc,EAAA;AAAA,IACd,aAAA,EAAe,gBAAA,CAAiB,OAAA,EAAS,EAAE,CAAA;AAAA,IAC3C,UAAA,EAAY,EAAA;AAAA,IACZ,WAAA,EAAa,cAAA,CAAe,KAAA,EAAO,EAAE;AAAA,GACvC;AACF;AAEO,SAAS,sBAAA,CAAuB,MAAqB,OAAA,EAAqC;AAC/F,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,MAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,MAAA,MAAM,GAAA,GAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AAChF,MAAA,MAAM,SAAA,GAAY,CAAC,GAAA,IAAA,CAAQ,KAAA,CAAM,WAAW,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AACjG,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAK,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,UACjC,GAAG,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACnC,SAAS,GAAA,EAAK;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,yBAAA,CAA0B,MAAqB,UAAA,EAAwC;AACrG,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,MAAA,MAAM,KAAA,GAAA,CAAS,KAAA,CAAM,YAAA,IAAgB,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,IAAK,EAAA,EAAI,IAAA,EAAK,KAAM,UAAU,CAAA;AACpF,MAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,MAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,OAAW,UAAU,CAAA;AAC5F,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAK,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,UACvC,GAAG,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACnC,SAAS,MAAA,EAAQ;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,qBAAA,CAAsB,IAAA,EAAqB,MAAA,EAAgB,QAAA,EAAsC;AAC/G,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,MAAM,EAAA,GAAK,OAAO,IAAA,EAAK;AACvB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC3C,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,MAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,MAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,KAAA,IAAS,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,OAAW,EAAE,CAAA;AAC5E,MAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,MAAA;AAChB,MAAA,MAAM,OAAO,CAAC,KAAA,IAAS,EAAA,GAAA,CAAM,KAAA,CAAM,WAAW,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,OAAA,IAAW,IAAI,QAAA,CAAS,EAAE,CAAC,CAAA,GAAI,KAAA;AAChG,MAAA,MAAM,MAAA,GACJ,CAAC,KAAA,IAAS,CAAC,QAAQ,MAAA,GAAA,CACd,KAAA,CAAM,WAAW,EAAC,EAAG,KAAK,CAAC,CAAA,KAAA,CAAO,EAAE,OAAA,IAAW,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA,GAClF,KAAA;AACN,MAAA,IAAI,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAK,CAAA,KAAA,EAAQ,EAAA,IAAM,MAAM,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,UACrC,GAAG,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACnC,SAAS,MAAA,EAAQ;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AASO,SAAS,yBAAyB,YAAA,EAA2D;AAClG,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAgC;AAChD,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,IAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,EAAE,CAAA;AAC9D,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAA,CAAI,OAAA,EAAS,CAAA,CAC5B,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CACxB,IAAI,CAAC,CAAC,YAAA,EAAc,KAAK,CAAA,MAAO;AAAA,IAC/B,YAAA;AAAA,IACA,aAAA,EAAe,KAAA,CAAM,CAAC,CAAA,EAAG,iBAAiB,YAAA,GAAe,CAAA;AAAA,IACzD,KAAA,EAAO,MAAM,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU;AAAA,GACzD,CAAE,CAAA;AACN;AAQA,IAAM,aAAsC,EAAC;AAKtC,SAAS,cAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,EACyB;AACzB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAA,GAAS,wBAAA,CAAyB,sBAAA,CAAuB,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACzE,CAAA,MAAA,IAAW,UAAU,WAAA,EAAa;AAChC,IAAA,MAAA,GAAS,wBAAA,CAAyB,yBAAA,CAA0B,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EAC5E,CAAA,MAAO;AACL,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AAChF,IAAA,MAAA,GAAS,yBAAyB,qBAAA,CAAsB,IAAA,EAAM,SAAS,kBAAA,CAAmB,IAAI,CAAC,CAAC,CAAA;AAAA,EAClG;AACA,EAAA,OAAO,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,UAAA,GAAa,MAAA;AAC5C;AAKA,SAAS,aAAA,CAAc,GAA4B,CAAA,EAAqC;AACtF,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,EAAA,CAAG,YAAA,KAAiB,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,aAAA,KAAkB,EAAA,CAAG,aAAA,IAAiB,EAAA,CAAG,KAAA,CAAM,MAAA,KAAW,EAAA,CAAG,MAAM,MAAA,EAAQ;AACvH,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA;AACrB,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA;AACrB,MAAA,IACE,EAAA,CAAG,QAAQ,EAAA,CAAG,GAAA,IACd,GAAG,KAAA,KAAU,EAAA,CAAG,KAAA,IAChB,EAAA,CAAG,UAAA,KAAe,EAAA,CAAG,cACrB,EAAA,CAAG,WAAA,KAAgB,EAAA,CAAG,WAAA,IACtB,EAAA,CAAG,aAAA,KAAkB,GAAG,aAAA,IACxB,EAAA,CAAG,OAAA,KAAY,EAAA,CAAG,OAAA,EAClB;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,sBAAA,CACd,MACA,IAAA,EACsC;AACtC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqC;AACvD,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAa,IAAA,KAAkC;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,GAAA,IAAO,aAAA,CAAc,KAAK,IAAI,CAAA,GAAI,MAAM,IAAI,CAAA;AAAA,EAC7D,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG;AACjC,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACnC,IAAA,IAAI,EAAA,MAAQ,CAAA,OAAA,EAAU,EAAE,IAAI,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,EAAE,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG;AACpC,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK;AACtC,IAAA,IAAI,EAAA,MAAQ,CAAA,UAAA,EAAa,EAAE,IAAI,cAAA,CAAe,IAAA,EAAM,WAAA,EAAa,EAAE,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AAChC,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAClC,IAAA,IAAI,EAAA,MAAQ,CAAA,MAAA,EAAS,EAAE,IAAI,cAAA,CAAe,IAAA,EAAM,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,KAAA;AACT;ACnMA,IAAM,MAAA,uBAAa,GAAA,EAA2B;AAEvC,SAAS,gBAAgB,KAAA,EAAsD;AACpF,EAAA,OAAO,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AACrC;AAKO,SAAS,kBAAA,CACd,OACA,WAAA,EACM;AACN,EAAAM,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,GAAA,GAAM,WAAA;AACZ,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,CAAC,QAAA,KAAa;AAClC,QAAA,MAAA,CAAO,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AACzB;ACJO,SAAS,OAAA,CAAQ;AAAA,EACtB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR,IAAA,GAAO,QAAA;AAAA,EACP,SAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,OAAA,GAAUK,OAAwB,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWA,OAAuB,IAAI,CAAA;AAE5C,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,IAAA,OAAO,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,aAAa,KAAK,QAAA,CAAS,IAAA;AAAA,EAC7D,CAAA,GAAG;AAEH,EAAAC,gBAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,CAAQ,OAAA,EAAS;AAC/B,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,MAAA,MAAM,KAAK,MAAA,CAAO,UAAA;AAClB,MAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAGlB,MAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,OAAO,EAAA,EAAI;AAChC,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,EAAS,WAAA,IAAe,GAAA;AAChD,MAAA,MAAM,MAAA,GAAS,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,SAAS,GAAA,GAAM,EAAA;AAElD,MAAA,IAAI,OAAO,CAAA,CAAE,IAAA;AACb,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC1B,QAAA,SAAA,GAAY,kBAAA;AAAA,MACd,CAAA,MAAA,IAAW,UAAU,KAAA,EAAO;AAC1B,QAAA,IAAA,GAAO,CAAA,CAAE,KAAA;AACT,QAAA,SAAA,GAAY,mBAAA;AAAA,MACd;AAEA,MAAA,IAAI,CAAC,WAAW,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrD,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAEvB,MAAA,SAAA;AAAA,QACE,SACI,EAAE,MAAA,EAAQ,EAAA,GAAK,CAAA,CAAE,MAAM,CAAA,EAAG,IAAA,EAAM,SAAA,EAAU,GAC1C,EAAE,GAAA,EAAK,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,MAAM,SAAA;AAAU,OAC3C;AAAA,IACF,CAAA;AACA,IAAA,OAAA,EAAQ;AAER,IAAA,MAAM,GAAA,GAAM,sBAAsB,OAAO,CAAA;AAMzC,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,sBAAsB,MAAM;AACrC,QAAA,QAAA,GAAW,CAAA;AACX,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,QAAA,EAAU,IAAI,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,IAAI,QAAA,uBAA+B,QAAQ,CAAA;AAC3C,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,QAAA,EAAU,IAAI,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,KAAK,CAAC,CAAA;AAEtB,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,SAAS,WAAW,CAAA,EAAe;AACjC,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,CAAS,CAAC,KAAK,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AACA,IAAA,SAAS,MAAM,CAAA,EAAkB;AAC/B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACvC;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,UAAA,EAAY,IAAI,CAAA;AACvD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,KAAA,EAAO,IAAI,CAAA;AAChD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,UAAA,EAAY,IAAI,CAAA;AAC1D,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAA,EAAO,IAAI,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACEF,KAAC,MAAA,EAAA,EAAK,GAAA,EAAK,SAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA,EAC1D,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAClD,QAAQ,MAAA,GACL,YAAA;AAAA,sBACEJ,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,cAAc,CAAA;AAAA,UAC/C,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,KAAK,MAAA,EAAQ,GAAA;AAAA,YACb,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,IAAA,EAAM,QAAQ,IAAA,IAAQ,KAAA;AAAA,YACtB,WAAW,MAAA,EAAQ;AAAA,WACrB;AAAA,UAEC,mBAAS,EAAE,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAK,GAAG;AAAA;AAAA,OAC3C;AAAA,MACA;AAAA,KACF,GACA;AAAA,GAAA,EACN,CAAA;AAEJ;AC7HA,IAAM,KAAA,GAAiF;AAAA,EACrF,EAAE,KAAA,EAAA,UAAA,iBAAmC,KAAA,EAAO,cAAA,EAAM,MAAM,aAAA,EAAc;AAAA,EACtE,EAAE,KAAA,EAAA,QAAA,eAAiC,KAAA,EAAO,cAAA,EAAM,MAAM,IAAA,EAAK;AAAA,EAC3D,EAAE,KAAA,EAAA,eAAA,qBAAuC,KAAA,EAAO,cAAA,EAAM,MAAM,KAAA,EAAM;AAAA,EAClE,EAAE,KAAA,EAAA,WAAA,kBAAoC,KAAA,EAAO,cAAA,EAAM,MAAM,QAAA;AAC3D,CAAA;AAiBO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA,mBACCA,IAAAA,CAAAL,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBACrCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChB,QAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,KAAU,OAAA,CAAQ,OAAA;AAC/B,QAAA,uBACEI,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,EAAA,IAAM,OAAO,CAAA;AAAA,YACjD,SAAS,MAAM;AACb,cAAA,KAAA,EAAM;AACN,cAAA,IAAI,CAAC,EAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,EAAE,KAAK,CAAA;AAAA,YACnC,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,8BAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM;AAAA;AAAA,WAAA;AAAA,UATV,CAAA,CAAE;AAAA,SAUT;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IACH,QAAA,CAAS,IAAI,CAAC,KAAA,EAAO,uBACpBI,IAAAA,CAACL,UAAA,EACE,QAAA,EAAA;AAAA,MAAA,EAAA,GAAK,KAAK,OAAA,mBAAUC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAoB,CAAA,GAAK,IAAA;AAAA,MAC5D,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,uBACEI,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,IAAA,CAAK,UAAU,mBAAmB,CAAA;AAAA,YACtE,SAAS,MAAM;AACb,cAAA,KAAA,EAAM;AACN,cAAA,IAAA,CAAK,QAAA,EAAS;AAAA,YAChB,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,QAAK,SAAA,EAAW,EAAA,CAAG,kCAAkC,IAAA,CAAK,cAAc,CAAA,EAAG,WAAA,EAAa,GAAA,EAAK,CAAA;AAAA,cAC7F,IAAA,CAAK;AAAA;AAAA,WAAA;AAAA,UATD,IAAA,CAAK;AAAA,SAUZ;AAAA,MAEJ,CAAC;AAAA,KAAA,EAAA,EAlBY,EAmBf,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,IAAI,UAAU,OAAO,IAAA;AACrB,EAAA,MAAM,aAAA,GAA+B;AAAA,IACnC,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,gCAAA,EAAS,UAAU,aAAA,EAAc;AAAA,IACzD,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,gCAAA,EAAS,UAAU,aAAA;AAAc,GAC7D;AACA,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,sCAAA;AAAA,MACP,QAAA,EAAU,WAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH;AACA,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,kBAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,uBAChBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACJ,GAAG,eAAA;AAAA,UACJ,WAAW,EAAA,CAAG,cAAA,EAAgB,QAAQ,SAAA,EAAW,eAAA,EAAiB,aAAa,cAAc,CAAA;AAAA,UAC7F,KAAA,EAAM,wDAAA;AAAA,UACN,YAAA,EAAW,oBAAA;AAAA,UACX,OAAA,EAAS,MAAA;AAAA,UAET,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EAAoB,aAAa,GAAA,EAAK;AAAA;AAAA,OAChE;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA,EAAS,EAAE,OAAA,EAAS,WAAA,EAAa,UAAU,YAAA,EAAa;AAAA,UACxD,QAAA,EAAU,CAAC,aAAA,EAAe,CAAC,EAAE,IAAA,EAAMS,MAAAA,EAAQ,KAAA,EAAO,0BAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,CAAC;AAAA;AAAA;AAC/F;AAAA,GAEJ;AAEJ;ACzJO,IAAM,kBAAA,GAAqBR,cAAqC,IAAI,CAAA;AAEpE,SAAS,cAAA,GAAwC;AACtD,EAAA,OAAOE,WAAW,kBAAkB,CAAA;AACtC;;;AC7BA,SAASO,iBAAAA,CACP,IAAA,EACA,YAAA,EACA,UAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAW,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,OAAA,CAAQ,KAAK,CAAA;AAClC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAQO,SAAS,mBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,IAAA,EACe;AACf,EAAA,OAAOA,iBAAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,IAAA,MAAM,IAAA,GAAmB,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAC5C,IAAA,IAAI,CAAC,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA,CAAK,QAAA;AACZ,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,EAAU,MAAK,IAAK,oBAAA,CAAqB,OAAO,SAAS,CAAA;AAC9E,MAAA,IAAI,IAAA,KAAA,UAAA,iBAAqC;AACvC,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAKO,SAAS,kBAAA,CACd,MACA,gBAAA,EACY;AACZ,EAAA,IAAI,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACnC,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU,gBAAA,EAAkB,IAAA,EAAK,IAAK,EAAA;AAAA,MACtC,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAG;AAC7B;AAKO,SAAS,oBAAA,CAAqB,OAAc,WAAA,EAA6B;AAC9E,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,KAAA,IAAS,IAAI,WAAA,GAAc,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,IAAI,IAAA,IAAQ,0BAA0B,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,QAAA,EAAU,MAAK,EAAG;AACzE,MAAA,OAAO,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AClEO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAYG;AACD,EAAA,MAAM,SAAA,GAAYP,UAAAA,CAAW,gBAAgB,CAAA,CAAE,IAAA,EAAK;AACpD,EAAA,MAAM,aAAA,GACJ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,EAAG,KAAA,KACvC,KAAA,GAAQ,KAAA,GAAQ,eAAe,gBAAA,IAAoB,QAAA,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAC,SAAA,IAAa,aAAA,CAAc,mBAAkB,CAAE,QAAA,CAAS,SAAA,CAAU,iBAAA,EAAmB,CAAA;AAC3G,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,KAAA;AAAA,MACA,WAAW,EAAA,CAAG,cAAA,EAAgB,QAAQ,YAAA,EAAc,WAAA,IAAe,iBAAiB,SAAS,CAAA;AAAA,MAE5F,QAAA,EAAA;AAAA,QAAA,CAAC,SAAS,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,mBAC/CJ,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAe,QAAA,EAAA,WAAA,IAAe,gBAAA,IAAoB,UAAI,CAAA,GAC5D,IAAA;AAAA,QACH,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA,CAAC,QAAA,EAAA,EAAqB,KAAA,EAAO,CAAA,CAAE,KAAA,EAC5B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADQ,CAAA,CAAE,KAEf,CACD;AAAA;AAAA;AAAA,GACH;AAEJ;ACzBA,SAAS,aAAaF,OAAAA,EAA+C;AACnE,EAAA,OAAA,CAAQA,OAAAA,IAAU,EAAC,EAChB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,MAAK,EAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAE,CAAE,EAChF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAC1B;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,EAAAA,OAAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA,MAAM,IAAA,GAAO,aAAaA,OAAM,CAAA;AAChC,EAAA,MAAM,OAAA,GAAA,CAAW,cAAA,IAAkB,EAAA,EAAI,IAAA,EAAK;AAC5C,EAAA,uBACEM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,YAAA,EAAc,MAAA,IAAU,WAAW,CAAA,EAAG,KAAA,EAAO,MAAA,GAAS,CAAA,EAAG,IAAI,wBAAS,MAAA,EACvF,QAAA,EAAA;AAAA,IAAA,UAAA,mBACCJ,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,uCAAA,EAAwC,KAAA,EAAO,CAAA,aAAA,EAAM,IAAI,CAAA,CAAA,EAAI,OAAA,EAAS,YACpG,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,IAAA,EAAM,CAAA,EAC/B,CAAA,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,MAAM,CAAA,EAAE,CAAA;AAAA,oBAEnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAiB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oBAClCA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS,IAAA;AAAA,QACT,WAAA,EAAY,cAAA;AAAA,QACZ,QAAA;AAAA,QACA,SAAA,EAAU,kBAAA;AAAA,QACV,QAAA,EAAU,CAAC,CAAA,KAAM,aAAA,CAAc,KAAK,IAAI;AAAA;AAAA,KAC1C;AAAA,IACC,CAAC,2BACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,gBAAA;AAAA,QACV,KAAA,EAAO,kCAAS,IAAI,CAAA,CAAA;AAAA,QACpB,YAAA,EAAY,kCAAS,IAAI,CAAA,CAAA;AAAA,QACzB,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,EAAS;AAAA,QACX,CAAA;AAAA,QAEA,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK;AAAA;AAAA,KACnD,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,IAAI,UAAU,OAAO,IAAA;AACrB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,QAAA,CAAS,CAAA,CAAE,KAAK,CAAC,CAAA;AACtE,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,CAAC,EAAE,MAAA,EAAO,qBACjBA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,OAAM,0BAAA,EAAO,OAAA,EAAS,MAAA,EACrE,QAAA,kBAAAA,GAAAA,CAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,WAAA,EAAa,GAAA,EAAK,CAAA,EACpD,CAAA;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRX,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA,SAAA,CAAU,MAAA,KAAW,oBACpBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,SAAA,EAAU,IAEhD,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,qBACbA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,oBAAA;AAAA,UACV,SAAS,MAAM;AACb,YAAA,KAAA,EAAM;AACN,YAAA,KAAA,CAAM,EAAE,KAAK,CAAA;AAAA,UACf,CAAA;AAAA,UAEC,QAAA,EAAA,CAAA,CAAE;AAAA,SAAA;AAAA,QARE,CAAA,CAAE;AAAA,OAUV,CAAA,EAEL;AAAA;AAAA,GAEJ;AAEJ;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,IAAU,EAAC;AACvC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,IAAS,EAAC;AACrC,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACxF,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAErF,EAAA,MAAM,YAAA,GAA+B,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAC9D,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,EAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAE,CAAE,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AACxB,EAAA,MAAM,WAAA,GAA8B,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAC5D,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK,EAAG,KAAA,EAAO,kBAAA,CAAmB,CAAC,CAAA,EAAE,CAAE,CAAA,CAC9E,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAExB,EAAA,MAAM,YAAY,CAAC,KAAA,EAA2B,OAAA,KAC5C,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,YAAY,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AAE/F,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,sBACtCI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,CAAY,MAAA,KAAW,oBAAIJ,GAAAA,CAAC,UAAK,SAAA,EAAU,iBAAA,EAAkB,oBAAC,CAAA,GAAU,IAAA;AAAA,QACxE,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,KAAQ;AAC7B,UAAA,MAAM,EAAA,GAAA,CAAM,GAAA,CAAI,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACrC,UAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC7B,UAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,mBAAA,CAAoB,KAAK,CAAA,GAAI,EAAA;AAClD,UAAA,uBACEA,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cAEC,IAAA;AAAA,cACA,QAAQ,CAAC,KAAA;AAAA,cACT,QAAQ,KAAA,EAAO,MAAA;AAAA,cACf,gBAAgB,GAAA,CAAI,QAAA;AAAA,cACpB,QAAA;AAAA,cACA,UAAA,EAAY,eAAA,GAAkB,MAAM,eAAA,CAAgB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,MAAA,EAAQ,WAAA,EAAa,CAAA,GAAI,MAAA;AAAA,cAC3G,aAAA,EAAe,CAAC,IAAA,KACd,UAAA;AAAA,gBAAW,CAAC,GAAA,KACV,qBAAA,CAAsB,KAAK,YAAA,EAAc,UAAA,EAAY,IAAI,IAAI;AAAA,eAC/D;AAAA,cAEF,UAAU,MAAM;AACd,gBAAA,IAAI,oBAAA,EAAsB;AACxB,kBAAA,oBAAA,CAAqB;AAAA,oBACnB,IAAA,EAAM,OAAA;AAAA,oBACN,EAAA;AAAA,oBACA,IAAA;AAAA,oBACA,aAAa,KAAA,EAAO,WAAA;AAAA,oBACpB,YAAA;AAAA,oBACA;AAAA,mBACD,CAAA;AACD,kBAAA;AAAA,gBACF;AACA,gBAAA,SAAA,CAAU,UAAU,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAC,CAAA;AAAA,cAC7D;AAAA,aAAA;AAAA,YAzBK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,WA0BnB;AAAA,QAEJ,CAAC,CAAA;AAAA,wBACDA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,YAAA;AAAA,YACT,WAAA,EAAa,eAAA;AAAA,YACb,QAAA;AAAA,YACA,SAAA,EAAU,kDAAA;AAAA,YACV,KAAA,EAAO,CAAC,EAAA,KACN,eAAA,CAAgB,SAAS,EAAE,CAAA,GAAI,MAAA,GAAY,SAAA,CAAU,QAAA,EAAU,CAAC,GAAG,eAAA,EAAiB,EAAE,CAAC;AAAA;AAAA;AAE3F,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,sBACtCI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,UAAA,CAAW,MAAA,KAAW,oBAAIJ,GAAAA,CAAC,UAAK,SAAA,EAAU,iBAAA,EAAkB,oBAAC,CAAA,GAAU,IAAA;AAAA,QACvE,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,KAAQ;AAC5B,UAAA,MAAM,EAAA,GAAA,CAAM,GAAA,CAAI,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACpC,UAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC3B,UAAA,MAAM,IAAA,GAAO,IAAA,GAAO,kBAAA,CAAmB,IAAI,CAAA,GAAI,EAAA;AAC/C,UAAA,uBACEA,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cAEC,IAAA;AAAA,cACA,QAAQ,CAAC,IAAA;AAAA,cACT,QAAQ,IAAA,EAAM,MAAA;AAAA,cACd,gBAAgB,GAAA,CAAI,QAAA;AAAA,cACpB,QAAA;AAAA,cACA,UAAA,EAAY,eAAA,GAAkB,MAAM,eAAA,CAAgB,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAQ,WAAA,EAAa,CAAA,GAAI,MAAA;AAAA,cACzG,aAAA,EAAe,CAAC,IAAA,KACd,UAAA;AAAA,gBAAW,CAAC,GAAA,KACV,oBAAA,CAAqB,KAAK,YAAA,EAAc,UAAA,EAAY,IAAI,IAAI;AAAA,eAC9D;AAAA,cAEF,UAAU,MAAM;AACd,gBAAA,IAAI,oBAAA,EAAsB;AACxB,kBAAA,oBAAA,CAAqB;AAAA,oBACnB,IAAA,EAAM,MAAA;AAAA,oBACN,EAAA;AAAA,oBACA,IAAA;AAAA,oBACA,aAAa,IAAA,EAAM,WAAA;AAAA,oBACnB,YAAA;AAAA,oBACA;AAAA,mBACD,CAAA;AACD,kBAAA;AAAA,gBACF;AACA,gBAAA,SAAA,CAAU,SAAS,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAC,CAAA;AAAA,cAC3D;AAAA,aAAA;AAAA,YAzBK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,WA0BnB;AAAA,QAEJ,CAAC,CAAA;AAAA,wBACDA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,WAAA;AAAA,YACT,WAAA,EAAa,cAAA;AAAA,YACb,QAAA;AAAA,YACA,SAAA,EAAU,kDAAA;AAAA,YACV,KAAA,EAAO,CAAC,EAAA,KACN,cAAA,CAAe,SAAS,EAAE,CAAA,GAAI,MAAA,GAAY,SAAA,CAAU,OAAA,EAAS,CAAC,GAAG,cAAA,EAAgB,EAAE,CAAC;AAAA;AAAA;AAExF,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AChQA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,kBAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EACnD;AACA,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,KAAA,EAAO,gCAAA,EAAS,QAAA,EAAU,OAAA,EAAS,CAAA;AACnF,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAMS,MAAAA,EAAQ,KAAA,EAAO,4BAAQ,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,CAAA;AAC5E,EAAA,uBACET,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,oBAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,uBAChBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,oBAAA,EAAsB,QAAQ,SAAS,CAAA;AAAA,UACvE,KAAA,EAAM,oBAAA;AAAA,UACN,YAAA,EAAW,oBAAA;AAAA,UACX,OAAA,EAAS,MAAA;AAAA,UAER,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBAAMA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,QAAA,EAAU,CAAC,KAAK,CAAA,EAAG;AAAA;AAAA,GACjE;AAEJ;AAEA,IAAM,aAAA,GAAgC;AAAA,EACpC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO;AAAA,EACnC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,MAAA;AAC9B,CAAA;AACA,IAAM,YAAA,GAA+B;AAAA,EACnC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAC1B,CAAA;AAEA,IAAM,mBAAA,GAAsC;AAAA,EAC1C,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,QAAA,EAAI;AAAA,EAChC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,QAAA;AAC9B,CAAA;AACA,IAAM,kBAAA,GAAqC;AAAA,EACzC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,QAAA,EAAI;AAAA,EAC3B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAI;AAAA,EAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAI;AAAA,EAC5B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAA;AAC1B,CAAA;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,MAAA,GAAS,UAAA;AAAA,EACT,UAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAaG;AACD,EAAA,MAAM,iBAAA,GAAoB,0BAA0B,KAAK,CAAA;AACzD,EAAA,MAAM,QAAA,GAAW,iBAAA,GAAoB,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA,GAAI,MAAA;AAC1E,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAC,iBAAA,IAAqB,CAAC,QAAA;AAClD,EAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,KAAK,CAAA,CAAE,SAAA,CAAU,IAAA;AAAA,IACvD,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,MAAK,KAAM;AAAA,GAC1C,EAAG,QAAA;AAEH,EAAA,MAAM,eAAA,GAAkB,OAAA;AAAA,IACtB,MACE,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAC5B,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,KAAA,EAAA,CAAQ,GAAA,CAAI,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK,EAAG,KAAA,EAAO,sBAAA,CAAuB,GAAG,CAAA,EAAE,CAAE,CAAA,CAC5F,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAAA,IAC1B,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,oBAAA,GAAuB,OAAA;AAAA,IAC3B,MAAA,CACG,QAAA,EAAU,MAAA,IAAU,EAAC,EACnB,IAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,QAAA,IAAY,IAAI,IAAA,EAAK,EAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAE,CAAE,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAAA,IAC1B,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,CAAA,EAAG,cAAA,CAAe,KAAA,EAAO,UAAU,CAAC,CAAA,CAAA,CAAA;AAAA,UAC3C,gBAAA,EAAiB,iBAAA;AAAA,UACjB,UAAU,UAAA,GAAa,CAAA;AAAA,UACvB,QAAA;AAAA,UACA,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,QAAQ,kBAAA,CAAmB,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC,CAAA;AAAA,UACpF,QAAA,EAAU,MAAM,UAAA,CAAW,CAAC,QAAQ,WAAA,CAAY,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC;AAAA;AAAA,OAChF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,iBAAA;AAAA,UACP,OAAA,EAAS,eAAA;AAAA,UACT,QAAA;AAAA,UACA,WAAA,EAAY,cAAA;AAAA,UACZ,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,iBAAA,IAAqB,WAAW,CAAA;AAAA,UACjE,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,UAAA,EAAY,CAAC,CAAC;AAAA;AAAA,OACrG;AAAA,sBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,IAAA,IAAQ,KAAA;AAAA,YAClC,OAAA,EAAS,kBAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,MAAA,EAAQ,CAAC,CAAC;AAAA;AAAA,SACjG;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACrCA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,KAAA,IAAS,UAAA;AAAA,YACnC,OAAA,EAAS,mBAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA;AAClG,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,UAC/C,gBAAA,EAAkB,EAAA,CAAG,iBAAA,EAAmB,OAAA,IAAW,YAAY,CAAA;AAAA,UAC/D,UAAU,UAAA,GAAa,CAAA;AAAA,UACvB,QAAA;AAAA,UACA,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,QAAQ,kBAAA,CAAmB,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC,CAAA;AAAA,UACpF,QAAA,EAAU,MAAM,UAAA,CAAW,CAAC,QAAQ,WAAA,CAAY,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC;AAAA;AAAA,OAChF;AAAA,sBACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,KAAA,IAAS,UAAA;AAAA,YACnC,OAAA,EAAS,aAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KACT,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA,SAEnF;AAAA,wBACAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,iBAAA;AAAA,YACP,OAAA,EAAS,eAAA;AAAA,YACT,QAAA;AAAA,YACA,WAAA,EAAY,0BAAA;AAAA,YACZ,KAAA,EAAO,iBAAA,GAAoB,CAAA,aAAA,EAAM,iBAAiB,CAAA,mBAAA,CAAA,GAAS,MAAA;AAAA,YAC3D,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,iBAAA,IAAqB,WAAW,CAAA;AAAA,YAChE,QAAA,EAAU,CAAC,CAAA,KACT,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,UAAA,EAAY,CAAC,CAAC;AAAA;AAAA,SAEtF;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAkB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACnCA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,IAAA,IAAQ,KAAA;AAAA,YAClC,OAAA,EAAS,YAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KACT,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,MAAA,EAAQ,CAAC,CAAC;AAAA;AAAA,SAElF;AAAA,QACC,oBAAA,CAAqB,MAAA,GAAS,CAAA,mBAC7BA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAA,CAAQ,eAAA,IAAmB,EAAA,EAAI,IAAA,EAAK;AAAA,YACpC,OAAA,EAAS,oBAAA;AAAA,YACT,WAAA,EAAY,oBAAA;AAAA,YACZ,QAAA;AAAA,YACA,SAAA,EAAU,kBAAA;AAAA,YACV,QAAA,EAAU,CAAC,CAAA,KACT,UAAA;AAAA,cAAW,CAAC,QACV,wBAAA,CAAyB,GAAA,EAAK,cAAc,UAAA,EAAY,iBAAA,EAAmB,KAAK,IAAI;AAAA;AACtF;AAAA,SAEJ,GACE;AAAA,OAAA,EACN;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;ACnQA,IAAM,YAAA,GAAe,CAAA;AAErB,SAAS,YAAY,EAAA,EAAoB;AACvC,EAAA,IAAI,CAAA,GAAI,IAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,CAAA,GAAK,CAAA,GAAI,EAAA,GAAM,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACvB;AAEO,SAAS,cAAA,CACd,OAAA,EACA,IAAA,GAA6B,UAAA,EACrB;AACR,EAAA,MAAM,EAAA,GAAK,SAAS,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAO,IAAA,KAAS,UAAU,wBAAA,GAA2B,2BAAA;AAAA,EACvD;AACA,EAAA,MAAM,GAAA,GAAO,WAAA,CAAY,EAAE,CAAA,GAAI,YAAA,GAAgB,CAAA;AAC/C,EAAA,OAAO,yBAAyB,GAAG,CAAA,CAAA,CAAA;AACrC;ACUA,SAAS,uBAAA,CACP,IAAA,EACA,QAAA,EACA,WAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,UAAU,IAAA,CAAK,aAAA,IAAiB,EAAC,EACpC,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK,IAAK,OAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,IAAK,EAAA;AACvC,IAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,IAAA,MAAMF,UACJ,IAAA,KAAS,UAAA,GACL,YAAY,GAAA,CAAI,EAAE,GAAG,MAAA,GACrB,IAAA,KAAS,MAAA,GACP,OAAA,CAAQ,IAAI,EAAE,CAAA,EAAG,SACjB,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,MAAA;AAC1B,IAAA,MAAM,IAAA,GACJ,IAAA,KAAS,UAAA,GACL,sBAAA,CAAuB,WAAA,CAAY,IAAI,EAAE,CAAC,CAAA,IAAK,EAAA,GAC/C,IAAA,KAAS,MAAA,GACP,mBAAmB,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK,EAAA,GACvC,oBAAoB,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK,EAAA;AACjD,IAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,SAAA,CAAUA,OAAAA,EAAQ,MAAA,CAAO,aAAa,CAAC,CAAA,IAAK,MAAA,CAAO,aAAA,EAAe,IAAA,EAAK,IAAK,cAAA;AAC7G,IAAA,MAAM,EAAA,GAAK,mBAAA,CAAoB,SAAA,CAAUA,OAAAA,EAAQ,MAAA,CAAO,WAAW,CAAC,CAAA,IAAK,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK,IAAK,cAAA;AACvG,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,MAAA,EAAI,IAAI,WAAM,EAAE,CAAA,CAAA;AAAA,EAChC,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,IAAI,IAAA,CAAK,iBAAA,EAAmB,OAAA,IAAW,IAAA,CAAK,mBAAmB,QAAA,EAAU;AACvE,IAAA,MAAA,CAAO,KAAK,4CAAS,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAAyB;AACrD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,uBACEE,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBAClBA,IAAC,MAAA,EAAA,EAA2B,SAAA,EAAU,qBACnC,QAAA,EAAA,KAAA,EAAA,EADQ,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAExB,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAI;AAAA,EACrB,WAAA,uBAAkB,GAAA,EAAI;AAAA,EACtB,OAAA,uBAAc,GAAA,EAAI;AAAA,EAClB,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAqBG;AACD,EAAA,MAAM,OAAQ,IAAA,CAAK,IAAA,IAAA,UAAA;AACnB,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,EAAA;AAChC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AACzC,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,aAAa,OAAO,CAAA;AAIhF,EAAA,MAAM,YAAA,GACJ,IAAA,KAAA,UAAA,oBACC,IAAA,CAAK,QAAA,KAAa,SAAA,IAAA,CAAc,IAAA,CAAK,KAAA,EAAO,MAAA,IAAU,CAAA,IAAK,CAAA,IAAA,CAAM,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA,IAAK,CAAA,CAAA;AAGlG,EAAA,MAAM,eAAA,GACJ,YACC,MAAM;AACL,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,EAAK,IAAK,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,IAAK,EAAA;AACnF,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,GAAA,EAAK,WAAA,EAAa,IAAA,EAAK;AAEpC,IAAA,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,MAAA,KAAW,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK,EAAG,OAAO,GAAA,CAAI,SAAA,CAAU,IAAA,EAAK;AAC/F,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAClF,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,GAAG;AAEL,EAAA,MAAM,gBAAgB,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA,IAAK,OAAA,CAAQ,IAAI,eAAe,CAAA;AAElF,EAAA,MAAM,yBACJA,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAa,IAAA;AAAA,MACb,QAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AAAA,GACF;AAIF,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAChB,YAAA,mBACEI,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iCAAA;AAAA,MACV,KAAA,EAAO,gBAAgB,EAAE,KAAA,EAAO,eAAe,eAAA,EAAiB,IAAI,GAAE,GAAI,MAAA;AAAA,MAE1E,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,mBAAgB,IAAA,EAAM,uBAAA,CAAwB,MAAM,QAAA,EAAU,UAAU,KAAK,gCAAA,EAAS,CAAA;AAAA,QACtF,wBAAA,CAAyB,KAAK,QAAQ,CAAA,mBACrCI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UAAE,wBAAA,CAAyB,KAAK,QAAQ,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA,GAC9E;AAAA;AAAA;AAAA,sBAGNJ,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,eAAA;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,QAAA;AAAA,MACA,WAAA,EAAY,0BAAA;AAAA,MACZ,KAAA,EAAM,0BAAA;AAAA,MACN,WAAW,EAAA,CAAG,6BAAA,EAA+B,eAAA,IAAmB,CAAC,iBAAiB,WAAW,CAAA;AAAA,MAC7F,KAAA,EAAO,gBAAgB,EAAE,KAAA,EAAO,eAAe,eAAA,EAAiB,IAAI,GAAE,GAAI,MAAA;AAAA,MAC1E,QAAA,EAAU;AAAA;AAAA,GACZ;AAIJ,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,IAAIY,KAAAA;AACJ,IAAA,IAAI,IAAA,KAAA,UAAA,iBAAqC;AACvC,MAAAA,KAAAA,mBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,UAAU,CAAA;AAAA,wBACpBJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,IAAA,CAAK,WAAW,EAAA,EAAI,QAAA,EAAoB,aAAY,oBAAA,EAAM,MAAA,EAAQ,eAAe,CAAA,EACxG,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAS,IAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,QAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA;AAAA,YACA,WAAA,EAAY,gCAAA;AAAA,YACZ,SAAA,EAAU,gBAAA;AAAA,YACV;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,IAEJ,WAAW,IAAA,KAAA,eAAA,qBAAyC;AAClD,MAAAY,KAAAA,mBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,OAAO,CAAA;AAAA,wBACjBJ,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAS,IAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,QAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA;AAAA,YACA,WAAA,EAAY,4CAAA;AAAA,YACZ,SAAA,EAAU,iBAAA;AAAA,YACV;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,IAEJ,CAAA,MAAO;AACL,MAAAY,wBACEZ,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO,OAAA;AAAA,UACP,QAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA,EAAa,uCAAuC,gCAAA,GAAU,gCAAA;AAAA,UAC9D,SAAA,EAAW,EAAA,CAAG,kBAAA,EAAoB,IAAA,KAAA,WAAA,oBAAwC,cAAc,CAAA;AAAA,UACxF;AAAA;AAAA,OACF;AAAA,IAEJ;AACA,IAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,MACAQ,KAAAA;AAAA,sBACDZ,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,WAAA,EAAa;AAAA,KAAA,EACpC,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,KAAA,QAAA,eAAmC;AACrC,IAAA,IAAA,mBACEI,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EACX,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC3CA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAS,IAAA,EAAC,KAAA,EAAO,OAAA,EAAS,QAAA,EAAoB,QAAA,EAAoB,SAAA,EAAsB,WAAA,EAAY,gCAAA,EAAQ,MAAA,EAAgB;AAAA,KAAA,EAC5I,CAAA;AAAA,EAEJ,WAAW,IAAA,KAAA,WAAA,kBAAsC;AAC/C,IAAA,IAAA,mBACEA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uBAAA,EACX,QAAA,kBAAAA,IAAC,YAAA,EAAA,EAAa,SAAA,EAAS,IAAA,EAAC,KAAA,EAAO,SAAS,QAAA,EAAoB,QAAA,EAAoB,WAAsB,WAAA,EAAY,gCAAA,EAAQ,QAAgB,CAAA,EAC5I,CAAA;AAAA,EAEJ,CAAA,MAAO;AACL,IAAA,MAAM,OAAA,GAAU,IAAA,KAAA,eAAA;AAChB,IAAA,MAAM,IAAA,GAAO,UAAU,OAAA,GAAU,UAAA;AACjC,IAAA,MAAM,MAAM,OAAA,GAAW,OAAA,GAAU,CAAA,MAAA,EAAM,OAAO,KAAK,IAAA,GAAQ,OAAA;AAC3D,IAAA,IAAA,mBACEI,KAAC,GAAA,EAAA,EAAE,SAAA,EAAW,GAAG,qBAAA,EAAuB,OAAA,IAAW,UAAU,CAAA,EAC1D,QAAA,EAAA;AAAA,MAAA,YAAA,mBACCJ,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,qBAAA,EAAsB,KAAA,EAAO,aAAA,GAAgB,EAAE,KAAA,EAAO,cAAA,CAAe,eAAA,EAAiB,IAAI,CAAA,KAAM,MAAA,EAChH,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA,EAAG,CAAA,EAC9E,CAAA,mBAEAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,eAAA;AAAA,UACP,OAAA,EAAS,YAAA;AAAA,UACT,QAAA;AAAA,UACA,WAAA,EAAY,0BAAA;AAAA,UACZ,WAAW,EAAA,CAAG,iDAAA,EAAmD,eAAA,IAAmB,CAAC,iBAAiB,WAAW,CAAA;AAAA,UACjH,KAAA,EAAO,gBAAgB,EAAE,KAAA,EAAO,eAAe,eAAA,EAAiB,IAAI,GAAE,GAAI,MAAA;AAAA,UAC1E,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAED,CAAC,YAAA,mBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iBAAA,EAAkB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBAEhCJ,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,IAAA,CAAK,OAAA,IAAW,EAAA,EAAI,QAAA,EAAoB,WAAA,EAAa,OAAA,GAAU,IAAA,GAAO,cAAA,EAAM,QAAQ,aAAA,EAAe,CAAA;AAAA,QAAE;AAAA,OAAA,EAE5H,IACE,GAAA,mBACFI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iBAAA,EAAkB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAE,GAAA;AAAA,QAAI;AAAA,OAAA,EAAC,CAAA,GACvC,IAAA;AAAA,sBACJJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBACrCA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAS,IAAA,EAAC,KAAA,EAAO,OAAA,EAAS,QAAA,EAAoB,QAAA,EAAoB,SAAA,EAAsB,WAAA,EAAY,gCAAA,EAAQ,MAAA,EAAgB;AAAA,KAAA,EAC5I,CAAA;AAAA,EAEJ;AACA,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACA,IAAA;AAAA,oBACDJ,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,WAAA,EAAa;AAAA,GAAA,EACpC,CAAA;AAEJ;AAEO,IAAM,YAAA,GAAe,KAAK,gBAAgB,CAAA;AC1QjD,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,QAAA,EAAS,EAAmD;AAClG,EAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACd,QAAA,EAAA;AAAA,oBAAAJ,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,2BAA0B,KAAA,EAAM,0BAAA,EAAO,OAAA,EAAS,QAAA,EAC9E,0BAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EAC/C,CAAA;AAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,2BAA0B,KAAA,EAAM,0BAAA,EAAO,SAAS,QAAA,EAC9E,QAAA,kBAAAA,IAACa,KAAAA,EAAA,EAAM,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EACnD;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,YAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAkBG;AACD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIX,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,SAAQ,GAAI,IAAA;AACvD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAIlC,EAAA,MAAM,YAAA,GAAeY,QAAwB,MAAM;AACjD,IAAA,MAAM,MAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AACjC,MAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AAClC,MAAA,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAG,CAAA;AAAA,IAC7D;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAChC,MAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACjC,MAAA,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAC,CAAA,wBAAA,CAAA,EAAQ,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,OAAe,IAAA,KAA4B;AAC1C,MAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,KAAA,EAAO,KAAK,CAAA;AACnD,MAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,KAAA,EAAO,kBAAA,CAAmB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAC1G,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,YAAA,EAAc,UAAA,EAAY,KAAK;AAAA,GAC1C;AAEA,EAAA,MAAM,eAAe,WAAA,CAAY,MAAM,eAAe,IAAI,CAAA,EAAG,EAAE,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,EAAiB,QAAA,KACnC,SAAS,OAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA,EAAG,IAAA,IAAA,UAAA,gBAAwD;AAGhG,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,MAAM,SAAA,GACJ,GAAA,EAAK,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,YAAA,IAAgB,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,UAAA,GAAa,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA;AACnG,EAAA,MAAM,QAAA,GACJ,GAAA,EAAK,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,YAAA,IAAgB,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,UAAA,GAAa,GAAA,CAAI,OAAO,IAAA,GAAO,IAAA;AAEpG,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAAoB,GAAA,KAAgB;AACvD,IAAA,GAAA,EAAK,MAAM,EAAE,EAAA,EAAI,cAAc,EAAA,EAAI,UAAA,EAAY,KAAK,CAAA;AACpD,IAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAC/B,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,aAAA,CAA8B,OAAA,CAAQ,oBAAoB,CAAA;AAC1E,IAAA,IAAI,MAAM,CAAA,CAAE,YAAA,CAAa,YAAA,CAAa,IAAA,EAAM,IAAI,EAAE,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAoB,GAAA,KAAgB;AAC1D,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAC5B,IAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,aAAA,CAA8B,qBAAA,EAAsB;AACpE,IAAA,MAAM,QAAQ,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AACnD,IAAA,GAAA,CAAI,KAAA,CAAM,EAAE,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,KAAA,GAAQ,GAAA,GAAM,CAAA,GAAI,GAAA,EAAK,CAAA;AAAA,EAC7E,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAuB;AACzC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,GAAA,EAAK,IAAA,EAAK;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,OAAO,MAAM;AAAA,EAAC,CAAA;AAGpB,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,qBACpBd,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa,IAAA;AAAA,MACb,aAAA,EAAe,IAAA;AAAA,MACf,YAAA,EAAc,IAAA;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU;AAAA;AAAA,GACZ;AAEF,EAAA,MAAM,eAAe,CAAC,SAAA,KACpB,UAAA,EAAY,aAAA,CAAc,IAAI,SAAS,CAAA,EAAG,GAAA,CAAI,CAAC,GAAG,EAAA,qBAChDI,IAAAA,CAAC,KAAA,EAAA,EAAqC,WAAU,kDAAA,EAC9C,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA;AAAA,IACnG,CAAA,CAAE,IAAA,GAAO,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,mBAAIA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,4CAAA,EAAO;AAAA,GAAA,EAAA,EAFjE,SAAS,SAAS,CAAA,CAAA,EAAI,EAAE,CAAA,CAGlC,CACD,CAAA,IAAK,IAAA;AAER,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA,EAAY,MAAA;AAAA,QACZ,oBAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,oBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC1B,QAAA,MAAM,IAAA,GAAO,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACxC,QAAA,uBACAA,IAAAA,CAACL,QAAAA,EAAA,EACA,QAAA,EAAA;AAAA,UAAA,YAAA,CAAa,GAAG,CAAA;AAAA,0BACjBK,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,mBAAA;AAAA,gBACA,cAAc,GAAA,IAAO,aAAA;AAAA,gBACrB,aAAa,GAAA,IAAO,aAAA;AAAA,gBACpB,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,eAAA,GAAkB,kBAAA;AAAA,eACrD;AAAA,cACA,UAAA,EAAY,CAAC,CAAA,KAAM,cAAA,CAAe,GAAG,GAAG,CAAA;AAAA,cACxC,MAAA,EAAQ,UAAA;AAAA,cAEP,QAAA,EAAA;AAAA,gBAAA,IAAA,mBACCJ,GAAAA;AAAA,kBAAC,kBAAA;AAAA,kBAAA;AAAA,oBACC,QAAA,EAAU,MAAM,UAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AAAA,oBACzC,QAAA,EAAU,MAAM,UAAA,CAAY,QAAA,CAAS,IAAI;AAAA;AAAA,iBAC3C,GACE,IAAA;AAAA,gBACH,IAAA,EAAM,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,uBACjCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,YAAA,CAAa,IAAA,CAAK,IAAI,GAAE,CAAA,GACvD,IAAA;AAAA,gCACJA,GAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,IAAA;AAAA,oBACA,QAAA;AAAA,oBACA,UAAA;AAAA,oBACA,WAAA;AAAA,oBACA,OAAA;AAAA,oBACA,YAAA;AAAA,oBACA,MAAA;AAAA,oBACA,QAAA;AAAA,oBACA,UAAU,WAAA,KAAgB,GAAA;AAAA,oBAC1B,SAAA,EAAW,WAAA,KAAgB,GAAA,GAAM,YAAA,GAAe,MAAA;AAAA,oBAChD,UAAU,GAAA,GAAM,CAAA;AAAA,oBAChB,iBACE,QAAA,GACI,MAAA,GACA,EAAE,SAAA,EAAW,MAAM,WAAA,EAAa,CAAC,CAAA,KAAM,WAAA,CAAY,GAAG,GAAG,CAAA,EAAG,WAAW,MAAM,GAAA,EAAK,KAAI,EAAE;AAAA,oBAE9F,MAAA,EAAQ,CAAC,OAAA,KAAY;AACnB,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,QAAQ,sBAAA,CAAuB,GAAA,EAAK,cAAc,UAAA,EAAY,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,oBACrF,CAAA;AAAA,oBACA,WAAA,EAAa,CAAC,OAAA,KACZ,MAAA,CAAO,CAAC,GAAA,KAAQ,oBAAA,CAAqB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,oBAEnF,aAAA,EAAe,CAAC,OAAA,KACd,MAAA,CAAO,CAAC,GAAA,KAAQ,sBAAA,CAAuB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,oBAErF,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,QAAQ,mBAAA,CAAoB,GAAA,EAAK,cAAc,UAAA,EAAY,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,oBAC/E,CAAA;AAAA,oBACA,aAAA,EAAe,MAAM,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AAAA,oBACxC,aAAA,EAAe,MAAM,UAAA,CAAW,GAAA,GAAM,GAAG,GAAG,CAAA;AAAA,oBAC5C,WAAA,EACE,GAAA,GAAM,CAAA,GACF,MAAM;AACJ,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,UAAA,CAAW,KAAK,YAAA,EAAc,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,oBAChE,CAAA,GACA,MAAA;AAAA,oBAEN,UAAU,MAAM;AACd,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,eAAA,CAAgB,KAAK,YAAA,EAAc,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,oBACrE;AAAA;AAAA;AACF;AAAA;AAAA;AACF,SAAA,EAAA,EAnEe,CAAA,KAAA,EAAQ,GAAG,CAAA,CAoE1B,CAAA;AAAA,MAEF,CAAC,CAAA;AAAA,MACA,YAAA,CAAa,QAAQ,MAAM,CAAA;AAAA,MAC3B,QAAA,KAAa,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,mBAAIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,CAAA,GAAK,IAAA;AAAA,MAC7F,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,CAAC,2BACxBI,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,uBAAA;AAAA,UACV,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,EAAA,UAAA,gBAA6B;AAAA,UAErD,QAAA,EAAA;AAAA,4BAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OACjD,GACE,IAAA;AAAA,MACH,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,QAAA,mBAAWX,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,sCAAA,EAAM,CAAA,GAAO;AAAA,KAAA,EACpF;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,IAAM,WAAA,GAAce,KAAK,eAAe,CAAA;;;AC7Q/C,IAAM,YAAY,CAAC,CAAA,EAAW,MAAc,CAAA,GAAA,EAAM,CAAC,OAAO,CAAC,CAAA,CAAA;AAC3D,IAAM,eAAe,CAAC,CAAA,EAAW,OAAe,CAAA,GAAA,EAAM,CAAC,OAAO,EAAE,CAAA,CAAA;AAChE,IAAM,YAAY,CAAC,CAAA,EAAe,OAAe,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,CAAA;AAE3D,SAAS,MAAA,CAAO,KAAgC,QAAA,EAA0B;AACxE,EAAA,MAAM,CAAA,GAAA,CAAK,GAAA,IAAO,EAAA,EAAI,QAAA,GAAW,IAAA,EAAK;AACtC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,QAAA;AAC5B;AAEA,IAAM,cAA0C,EAAE,MAAA,EAAQ,gBAAM,SAAA,EAAW,cAAA,EAAM,OAAO,cAAA,EAAK;AACtF,IAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB,WAAA,CAAY,CAAC,CAAA;AAExD,SAAS,gBAAgB,IAAA,EAAwC;AACtE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAmB;AAC/B,IAAA,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,gBAAA,CAAiB,GAAA,CAAI,UAAU,IAAA,CAAK,UAAA,EAAY,KAAK,QAAQ,CAAA,EAAG,MAAM,MAAM,CAAA;AAC5E,MAAA,aAAA,CAAc,GAAA,CAAI,aAAa,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA,EAAG,MAAM,MAAM,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,YAAA,EAAc,gBAAA,CAAiB,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA;AACtG,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,OAAO,UAAA,EAAY,gBAAA,EAAkB,eAAe,gBAAA,EAAkB,aAAA,EAAe,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,EACxH;AAEA,EAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,WAAA,GAA6B,IAAA;AAEjC,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,MAAM,SAAA,GAAY,MAAM,EAAE,CAAA,OAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,MAAM,gBAAA,EAAkB,UAAA,EAAY,IAAI,CAAA;AAC/D,IAAA,IAAI,aAAA,KAAkB,MAAM,aAAA,GAAgB,SAAA;AAC5C,IAAA,WAAA,GAAc,SAAA;AACd,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,EAAE,CAAA,MAAA,CAAA;AACzB,MAAA,IAAA,CAAK,EAAE,GAAA,EAAK,QAAA,EAAU,MAAM,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA;AAC7D,MAAA,WAAA,GAAc,QAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,EAAA,KAAO;AAC5B,QAAA,MAAM,UAAU,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,CAAA,MAAA,EAAS,EAAE,CAAA,CAAE,CAAA;AACpD,QAAA,MAAM,MAAM,CAAA,KAAA,EAAQ,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,OAAO,CAAA,CAAA;AACzC,QAAA,IAAA,CAAK;AAAA,UACH,GAAA;AAAA,UACA,IAAA,EAAM,OAAA;AAAA,UACN,UAAA,EAAY,EAAA;AAAA,UACZ,QAAA,EAAU,EAAA;AAAA,UACV,OAAA;AAAA,UACA,SAAS,EAAA,KAAO,CAAA;AAAA,UAChB,KAAA,EAAO,EAAA,KAAO,MAAA,CAAO,MAAA,GAAS;AAAA,SAC/B,CAAA;AACD,QAAA,WAAA,GAAc,GAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAA,CAAK,EAAE,GAAA,EAAK,aAAA,EAAe,IAAA,EAAM,eAAe,CAAA;AAEhD,EAAA,MAAM,KAAA,GAAqD;AAAA,IACzD,EAAE,KAAA,EAAO,QAAA,EAAU,MAAM,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAA,CAAE,QAAA,EAAU,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,IAC5F,EAAE,KAAA,EAAO,WAAA,EAAa,MAAM,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAA,CAAE,WAAA,EAAa,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,IACrG,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAA,CAAE,OAAA,EAAS,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAAE,GAC3F;AACA,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,GAAA,EAAI,IAAK,KAAA,EAAO;AAClC,IAAA,IAAA,CAAK,EAAE,KAAK,CAAA,YAAA,EAAe,KAAK,IAAI,IAAA,EAAM,oBAAA,EAAsB,OAAO,CAAA;AACvE,IAAA,GAAA,CAAI,QAAQ,CAAC,OAAA,KAAY,IAAA,CAAK,EAAE,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,OAAO,IAAI,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,CAAC,CAAA;AAAA,EACzG;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,kBAAkB,aAAA,EAAe,gBAAA,EAAkB,eAAe,WAAA,EAAY;AAC5G;AAGO,SAAS,oBAAA,CAAqB,QAAoB,GAAA,EAAqC;AAC5F,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,UAAA,CAAW,GAAA,CAAI,MAAM,GAAA,CAAI,UAAU,SAAS,CAAA,IAAK,IAAA;AAAA,IACjE,KAAK,OAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,IAAI,UAAA,EAAY,GAAA,CAAI,QAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,IACjF,KAAK,MAAA,EAAQ;AAGX,MAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAW;AAC9B,QAAA,MAAM,KAAA,GAAQ,OAAO,gBAAA,CAAiB,GAAA,CAAI,UAAU,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,QAAQ,CAAC,CAAA;AACjF,QAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAAA,MAClC;AACA,MAAA,MAAM,EAAA,GAAA,CAAM,GAAA,CAAI,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACpC,MAAA,OAAO,EAAA,GAAK,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,YAAA,CAAa,IAAI,UAAA,EAAY,EAAE,CAAC,CAAA,IAAK,IAAA,GAAO,IAAA;AAAA,IACnF;AAAA,IACA,KAAK,OAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,UAAU,GAAA,CAAI,OAAO,CAAC,CAAA,IAAK,IAAA;AAAA,IAC1E,KAAK,UAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,aAAa,GAAA,CAAI,UAAU,CAAC,CAAA,IAAK,IAAA;AAAA,IAChF,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,SAAS,GAAA,CAAI,MAAM,CAAC,CAAA,IAAK,IAAA;AAAA,IACxE;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAOO,SAAS,oBAAA,CAAqB,QAAoB,GAAA,EAAqC;AAC5F,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,gBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,IACxD,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,UAAA,EAAY,KAAK,UAAA,EAAY,QAAA,EAAU,KAAK,QAAA,EAAS;AAAA,IAC/E,KAAK,YAAA;AACH,MAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AAC3E,MAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,IAAA,CAAK,OAAA,EAAQ;AACpF,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,OAAA,EAAQ;AAAA,IAC9C;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;ACzJA,IAAM,QAAA,GAAuE;AAAA,EAC3E,KAAA,EAAO,UAAA;AAAA,EACP,QAAA,EAAU,aAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AACA,IAAM,UAAA,GAA+E;AAAA,EACnF,KAAA,EAAO,YAAA;AAAA,EACP,QAAA,EAAU,eAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AACA,IAAM,UAAA,GAAmE;AAAA,EACvE,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AAIA,SAAS,SAAA,CACP,IAAA,EACA,IAAA,EACA,EAAA,EACA,EAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,EAAC;AAChC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC3B,IAAA,IAAA,CAAK,EAAE,OAAO,CAAA,IAAK,IAAI,IAAA,EAAK,KAAM,IAAI,OAAO,CAAA;AAC7C,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,GAAG,CAAC,CAAA;AAAA,EACb,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,CAAC,OAAO,GAAG,IAAA,EAAK;AACpC;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,IAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,CAAC,UAAA,CAAW,IAAI,CAAC,GAAG,MAAK,CAAE,CAAA;AAC9E;AAEO,SAAS,uBAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,WAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,OAAO,EAAE,GAAG,CAAA,EAAG,WAAA,EAAY,CAAE,CAAA;AACjE;AAEO,SAAS,uBACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,OAAA,EACA,OACA,KAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA,MAAO;AAAA,IACvC,GAAG,CAAA;AAAA,IACH,MAAA,EAAA,CAAS,CAAA,CAAE,MAAA,IAAU,EAAC,EAAG,GAAA;AAAA,MAAI,CAAC,CAAA,KAAA,CAC3B,CAAA,CAAE,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,OAAA,GAAU,EAAE,GAAG,CAAA,EAAG,CAAC,KAAK,GAAG,OAAM,GAAI;AAAA;AACrE,GACF,CAAE,CAAA;AACJ;AAEO,SAAS,cAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,KAAA,EACe;AACf,EAAA,OAAO,UAAU,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,GAAI,CAAA,CAAE,MAAA,IAAU,EAAC,EAAI,KAAK,GAAE,CAAE,CAAA;AAC1F;AAEO,SAAS,iBAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,OAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA,MAAO;AAAA,IACvC,GAAG,CAAA;AAAA,IACH,MAAA,EAAA,CAAS,CAAA,CAAE,MAAA,IAAU,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO;AAAA,GAC9E,CAAE,CAAA;AACJ;ACpEA,IAAM,QAAA,GAAmC,EAAE,QAAA,EAAU,QAAA,EAAK,UAAU,QAAA,EAAI;AACxE,IAAM,OAAA,GAAkC,EAAE,GAAA,EAAK,QAAA,EAAK,OAAO,QAAA,EAAK,IAAA,EAAM,QAAA,EAAK,IAAA,EAAM,QAAA,EAAI;AAGrF,SAAS,YAAA,CAAa,IAAA,EAAkB,QAAA,EAAgC,UAAA,EAA8C;AACpH,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,EAAU,IAAA,EAAK;AACpC,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,EAAK,IAAK,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,IAAK,EAAA;AACnF,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,GAAA,EAAK,WAAA,EAAa,IAAA,EAAK;AACpC,EAAA,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,MAAA,KAAW,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK,EAAG,OAAO,GAAA,CAAI,SAAA,CAAU,IAAA,EAAK;AAC/F,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAClF,EAAA,OAAO,EAAA;AACT;AAWO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM,QAAA,GAAWD,OAAAA,CAAQ,MAAM,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,IAAA,CAAK,MAAM,CAAC,CAAA;AACtE,EAAA,MAAM,WAAA,GAAcA,OAAAA,CAAQ,MAAM,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA,EAAG,CAAC,IAAA,CAAK,SAAS,CAAC,CAAA;AAClF,EAAA,MAAM,UAAA,GAAaA,OAAAA,CAAQ,MAAM,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAC,IAAA,CAAK,QAAQ,CAAC,CAAA;AAE9E,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,YAAY,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,MAAA,GAAS,MAAA,CAAO,UAAU,CAAA;AACjD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,KAAA,GAAQ,0BAA0B,KAAK,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAA,CAAW,QAAQ,sBAAA,CAAuB,WAAA,CAAY,IAAI,KAAK,CAAC,IAAI,EAAA,KAAO,gCAAA;AACjF,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,WAAA,IAAe,EAAC;AAClC,EAAA,MAAM,OAAO,CAAA,EAAG,QAAA,CAAS,IAAI,KAAA,IAAS,UAAU,KAAK,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA,IAAA,EAAI,QAAQ,GAAA,CAAI,IAAA,IAAQ,KAAK,CAAA,IAAK,GAAA,CAAI,QAAQ,EAAE,CAAA,CAAA;AACpH,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAIlC,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,UAAA,GAAa,IAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,WAAA,GAAc,GAAA;AAChE,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,IAAI,CAAC,CAAA;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,EAAA,GAAK,IAAA;AACrC,EAAA,MAAM,GAAA,GAAM,KAAA,GACR,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,CAAA,EAAG,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,EAAA,EAAG,GAC1E,EAAE,IAAA,EAAM,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,SAAA,EAAW,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,EAAA,EAAG;AAEjF,EAAA,MAAM,uBACJV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,GAAA,EAAI,EAAG,YAAA,EAAc,OAAA,EAAS,cAAc,OAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,QAAA,qBAAA,CAAsB,OAAA,EAAU,OAAO,YAAY,CAAA;AAAA,QAAE,QAAA;AAAA,QAAI,mBAAA,CAAoB,KAAA,EAAO,MAAA,CAAO,UAAU;AAAA,OAAA,EACxG,CAAA;AAAA,sBACAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QAAQ,GAAA;AAAA,wBAACJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EACvD;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACZ,QAAA,EAAA,OAAA,CAAQ,MAAA,KAAW,oBAClBA,GAAAA,CAAC,OAAE,SAAA,EAAU,iBAAA,EAAkB,8DAAQ,CAAA,GAEvC,OAAA,CAAQ,IAAI,CAAC,IAAA,EAAM,sBACjBA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OAAA;AAAA,MALK;AAAA,KAOR,CAAA,EAEL;AAAA,GAAA,EACF,CAAA;AAEF,EAAA,OAAOgB,YAAAA,CAAa,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,SAAS,IAAI,CAAA;AACxD;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,OAAQ,IAAA,CAAK,IAAA,IAAA,UAAA;AACnB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,IAAA,EAAK,IAAK,EAAA;AAExC,EAAA,IAAI,IAAA,KAAA,QAAA,eAAmC;AACrC,IAAA,uBACEZ,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAA,EACX,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,MACjC,OAAA,IAAW;AAAA,KAAA,EACd,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,IAAA,KAAA,WAAA,kBAAsC;AACxC,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gBAAA,EAAkB,qBAAW,QAAA,EAAI,CAAA;AAAA,EACvD;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA,KAAA,eAAA;AAChB,EAAA,MAAM,IAAA,GAAO,UAAU,OAAA,GAAU,UAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA,IAAK,0BAAA;AACvE,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,IAAA,CAAK,QAAQ,CAAA;AACvD,EAAA,MAAM,MAAM,OAAA,GAAW,OAAA,GAAU,CAAA,MAAA,EAAM,OAAO,KAAK,IAAA,GAAQ,OAAA;AAG3D,EAAA,MAAM,IAAA,GAAO,CAAC,CAAC,WAAA,KAAgB,kBAAkB,OAAA,IAAW,aAAA,KAAkB,WAAW,KAAA,KAAU,WAAA;AACnG,EAAA,MAAM,SAAA,GAAY,OAAQ,EAAE,QAAA,EAAU,eAAe,KAAA,EAAO,IAAI,GAAE,GAAsB,MAAA;AAExF,EAAA,uBACEI,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,OAAA,IAAW,UAAA,EAAY,IAAA,IAAQ,SAAS,CAAA,EAAG,KAAA,EAAO,SAAA,EAClF,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA,EAAE,EAC/E,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MACA,QAAA,mBAAWA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAE,QAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA,GAAU;AAAA,KAAA,EACzE,CAAA;AAAA,IACC,GAAA,mBAAMA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,MAAE,GAAA;AAAA,MAAI;AAAA,KAAA,EAAC,CAAA,GAAU,IAAA;AAAA,oBACxDJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAkB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,IAClC,OAAA,IAAW;AAAA,GAAA,EACd,CAAA;AAEJ;ACjKA,IAAM,UAAA,GAAa,gBAAA;AAEnB,IAAM,SAAA,GAAY,CAAA;AAIlB,IAAM,GAAA,GAAM,EAAA;AAGZ,IAAM,YAAA,GAAe,EAAA;AASd,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA,EAAAF,OAAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAII,SAA+B,IAAI,CAAA;AAG7D,EAAA,MAAM,UAAA,GAAaK,OAA6C,IAAI,CAAA;AACpE,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,WAAA,EAAY;AACZ,IAAA,UAAA,CAAW,UAAU,UAAA,CAAW,MAAM,QAAA,CAAS,IAAI,GAAG,GAAG,CAAA;AAAA,EAC3D,CAAA;AAIA,EAAA,MAAM,OAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AACxE,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AAEpB,EAAA,MAAM,UAAA,GAAaT,OAAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAgBA,OAAAA,CACnB,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,EAAA,EAAA,CAAK,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,EAAG,IAAA,EAAM,mBAAA,CAAoB,CAAC,CAAA,IAAK,gCAAA,EAAS,QAAA,EAAW,CAAA,GAAI,SAAA,GAAa,CAAA,EAAE,CAAE,CAAA,CACzH,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AAErB,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAwB;AAC5C,IAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACnC,IAAA,OAAO,CAAC,GAAA,IAAO,CAAC,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,EACzC,CAAA;AAGA,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,oBAAA,GAAQ,cAAA,EAAM,QAAA,EAAU,CAAA,EAAG,CAAA;AAAA,EACnF;AAWA,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,UAA4E,EAAC;AACnF,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,IAAA,CAAK,YAAA,GAAe,KAAK,CAAC,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,YAAA,EAAc,KAAA,CAAM,YAAA,EAAc,aAAA,EAAe,KAAA,CAAM,aAAA,EAAe,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,CAAA;AACvG,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAM,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AACzC,MAAA,CAAA,IAAK,CAAA;AAAA,IACP;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,CAAA;AAEnB,EAAA,MAAM,SAAS,CAAC,CAAA,KAAe,CAAA,CAAE,IAAA,GAAO,EAAE,KAAA,GAAQ,CAAA;AAClD,EAAA,MAAM,SAAS,CAAC,QAAA,KACd,aAAa,CAAA,GAAI,uBAAA,GAA0B,yBAAyB,QAAQ,CAAA,CAAA,CAAA;AAC9E,EAAA,MAAM,YAAY,CAAC,MAAA,KACjB,SAAS,MAAA,CAAO,CAAC,MAAO,MAAA,KAAW,UAAA,GAAa,aAAa,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,IAAA,CAAK,WAAW,EAAA,EAAI,IAAA,OAAW,MAAO,CAAA;AAElH,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,4BAAA,EAAM,CAAA;AAAA,sBAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAW,EAC9D,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZI,IAAAA,CAAC,MAAA,EAAA,EAA0B,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,EAAG,KAAA,EAAO,CAAA,OAAA,EAAK,CAAA,CAAE,aAAa,CAAA,OAAA,CAAA,EAAM,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAC7G,OAAO,CAAA,CAAE,aAAa,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EAAA,EADlC,CAAA,CAAE,YAEb,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IACC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAC9B,MAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAkB,SAAA,EAAU,iBAAA,EAC3B,QAAA,EAAA;AAAA,wBAAAA,KAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAuB,KAAA,EAAO,KAAK,IAAA,EACjD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAE,EAAG,CAAA;AAAA,0BAC/EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,eAAK,IAAA,EAAK,CAAA;AAAA,0BAClDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,eAAK,MAAA,EAAO;AAAA,SAAA,EACvD,CAAA;AAAA,wBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAE,EAC3F,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG,sBAChBJ,GAAAA,CAAC,UAAsB,SAAA,EAAU,gBAAA,EAAiB,KAAA,EAAO,EAAE,MAAM,CAAA,CAAE,IAAA,MAAxD,CAAA,IAAA,EAAO,CAAC,EAAwD,CAC5E,CAAA;AAAA,UACA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,YAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,YAAA,uBACEA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,iBAAA;AAAA,gBACV,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAE,eAAA;AAAA,cAFrD,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,aAGzB;AAAA,UAEJ,CAAC,CAAA;AAAA,UACA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,qBACTA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,iBAAA;AAAA,cACV,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,cACzB,KAAA,EAAO,EAAE,IAAA,CAAK,KAAA;AAAA,cACd,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,KAAK,YAAA,EAAc,CAAA,CAAE,KAAK,UAAU,CAAA;AAAA,cAC5D,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,gBAAA,WAAA,EAAY;AACZ,gBAAA,MAAM,CAAA,GAAI,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AAChD,gBAAA,QAAA,CAAS;AAAA,kBACP,YAAA,EAAc,EAAE,IAAA,CAAK,YAAA;AAAA,kBACrB,UAAA,EAAY,EAAE,IAAA,CAAK,UAAA;AAAA,kBACnB,IAAA,EAAM,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,kBACnE,IAAA,EAAM,CAAA,CAAE,aAAA,CAAc,OAAA,CAAqB,aAAa;AAAA,iBACzD,CAAA;AAAA,cACH,CAAA;AAAA,cACA,YAAA,EAAc,aAAA;AAAA,cAEb,YAAE,IAAA,CAAK;AAAA,aAAA;AAAA,YAlBH,EAAE,IAAA,CAAK;AAAA,WAoBf;AAAA,SAAA,EACH;AAAA,OAAA,EAAA,EA5CQ,KAAK,EA6Cf,CAAA;AAAA,IAEJ,CAAC,CAAA;AAAA,IACA,wBACCA,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,WAAA,EAAa,OAAA;AAAA,QACb,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAS;AAAA;AAAA,KACX,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;ACvKA,IAAM,IAAA,GAAiD;AAAA,EACrD,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,EACxB,SAAA,EAAW,EAAE,IAAA,EAAM,UAAA,EAAW;AAAA,EAC9B,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA;AACjB,CAAA;AAEA,SAAS,WAAW,EAAA,EAAoB;AACtC,EAAA,OAAO,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC5C;AAEA,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAW,SAAA,EAAU,EAAiD;AACjG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAS,KAAK,CAAA;AAEtC,EAAA,uBACEE,IAAAA,CAAAL,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,2BAAA,EAA4B,KAAA,EAAM,gCAAA,EAAQ,YAAA,EAAW,gCAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA,EACtH,QAAA,kBAAAA,GAAAA,CAACiB,CAAAA,EAAA,EAAE,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,GAAA,EAAK,CAAA,EAC9C,CAAA;AAAA,IACC,IAAA,mBACCjB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,IAAA,EAAK,cAAA,EAAe,WAAA,EAAa,MAAM,OAAA,CAAQ,KAAK,CAAA,EACxF,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,MAAA,EAAO,iBAAA,EAAgB,0BAAA,EAA2B,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAgB,EAC5I,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,IAAC,IAAA,EAAA,EAAG,EAAA,EAAG,0BAAA,EAA2B,SAAA,EAAU,qBAAoB,QAAA,EAAA,0BAAA,EAAI,CAAA;AAAA,wBACpEA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,eAAA,EAAgB,YAAA,EAAW,cAAA,EAAK,OAAA,EAAS,MAAM,QAAQ,KAAK,CAAA,EAC1F,0BAAAA,GAAAA,CAACiB,CAAAA,EAAA,EAAE,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,GAAA,EAAK,CAAA,EAC9C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAb,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA;AAAA,QAAA,gCAAA;AAAA,QAAM,SAAA,IAAa,gCAAA;AAAA,QAAQ;AAAA,OAAA,EAAE,CAAA;AAAA,sBAC7DA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,wBACnFA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,wCAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,OAAA,CAAQ,KAAK,CAAA;AACb,cAAA,SAAA,EAAU;AAAA,YACZ,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,GACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA;AACzB,EAAA,MAAM,MAAA,GAASc,QAAQ,MAAM;AAC3B,IAAA,IAAI,KAAA,KAAU,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,UAAU,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AACpG,IAAA,IAAI,KAAA,KAAU,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,aAAa,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AAC7G,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK,KAAM,OAAO,CAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,OAAO,CAAC,CAAA;AAE5D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAE9D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACEd,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA;AAAA,MAAA,kDAAA;AAAA,MAAS,KAAA;AAAA,MAAM,GAAA;AAAA,MAAE,OAAA;AAAA,MAAQ;AAAA,KAAA,EAAC,CAAA,EACrE,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,IAAA,GACJ,KAAA,KAAU,QAAA,GACN,mBAAA,CAAoB,MAAqB,CAAA,GACzC,KAAA,KAAU,WAAA,GACR,sBAAA,CAAuB,MAAwB,CAAA,GAC/C,kBAAA,CAAmB,MAAoB,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,OAAO,WAAA,IAAe,EAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,eAAe,IAAA,EAAK;AACxC,EAAA,MAAMN,OAAAA,GAAS,MAAA,CAAO,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAEhD,EAAA,uBACEE,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,kBAAAA,IAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAM,IACjC,QAAA,kBAAAI,IAAAA,CAAC,aAAQ,SAAA,EAAU,iBAAA,EAAkB,2BAAuB,IAAA,EAC1D,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EACd,QAAA,kBAAAA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,QAAA;AAAA,UACA,WAAA,EAAa,CAAA,kBAAA,EAAM,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA;AAAA,UACzC,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA,OACpE,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAC9CI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,eAAA,CAAgB,KAAK,CAAA,EAAE,CAAA;AAAA,wBAChEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,UAAW,eAAA;AAAA,UAAM,IAAA,CAAK,MAAA;AAAA,UAAO;AAAA,SAAA,EAChC,CAAA;AAAA,QACC,oBAAA,IAAwB,CAAC,QAAA,mBACxBJ,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,qBAAA;AAAA,YACV,KAAA,EAAM,gCAAA;AAAA,YACN,SAAS,MACP,oBAAA,CAAqB,EAAE,IAAA,EAAM,IAAI,OAAA,EAAS,IAAA,EAAM,IAAA,IAAQ,OAAA,EAAS,aAAa,WAAA,IAAe,MAAA,EAAW,cAAc,EAAA,EAAI,UAAA,EAAY,IAAI,CAAA;AAAA,YAG5I,0BAAAA,GAAAA,CAACS,MAAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK;AAAA;AAAA,SACnD,GACE;AAAA,OAAA,EACN;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAT,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,cAAA;AAAA,QACP,QAAA;AAAA,QACA,WAAA,EAAa,CAAA,wBAAA,EAAO,eAAA,CAAgB,KAAK,CAAC,CAAA,uCAAA,CAAA;AAAA,QAC1C,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,uBAAA,CAAwB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA,KAC3E,EACF,CAAA;AAAA,oBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA;AAAA,UAAA,eAAA;AAAA,0BAAGJ,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EAAoB,QAAA,EAAAF,QAAO,MAAA,EAAO;AAAA,SAAA,EAAO,CAAA;AAAA,QAC1G,CAAC,2BACAM,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,2BAAA;AAAA,YACV,SAAS,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,eAAe,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,EAAE,UAAU,UAAA,CAAW,OAAO,GAAG,UAAA,EAAY,oBAAA,EAAO,CAAC,CAAA;AAAA,YAEnH,QAAA,EAAA;AAAA,8BAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SACnD,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MACCb,OAAAA,CAAO,MAAA,GAAS,CAAA,mBACfE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAAF,OAAAA,CAAO,GAAA,CAAI,CAAC,OAAO,GAAA,KAAQ;AAC1B,QAAA,MAAM,OAAO,KAAA,CAAM,QAAA,IAAY,IAAI,IAAA,EAAK,IAAK,OAAO,GAAG,CAAA,CAAA;AACvD,QAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAc,SAAA,EAAU,uBAAA,EACvB,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,4BAAAJ,GAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,IAAA,IAAQ,EAAA;AAAA,gBACzC,QAAA;AAAA,gBACA,WAAA,EAAY,oBAAA;AAAA,gBACZ,SAAA,EAAU,4BAAA;AAAA,gBACV,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,sBAAA,CAAuB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,YAAA,EAAc,CAAC,CAAC;AAAA;AAAA,aAC7F;AAAA,YACC,CAAC,QAAA,IAAA,CAAa,KAAA,CAAM,YAAY,EAAA,EAAI,IAAA,qBACnCA,GAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,IAAA,IAAQ,EAAA;AAAA,gBAC7C,SAAA,EAAW,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,kBAAkB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,GAAG,CAAC;AAAA;AAAA,aACzE,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAS,IAAA;AAAA,cACT,KAAA,EAAO,MAAM,WAAA,IAAe,EAAA;AAAA,cAC5B,QAAA;AAAA,cACA,WAAA,EAAY,gCAAA;AAAA,cACZ,SAAA,EAAU,4BAAA;AAAA,cACV,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,sBAAA,CAAuB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,aAAA,EAAe,CAAC,CAAC;AAAA;AAAA;AAC9F,SAAA,EAAA,EAvBQ,GAwBV,CAAA;AAAA,MAEJ,CAAC,GACH,CAAA,GACE;AAAA,KAAA,EACN,CAAA;AAAA,IAEC,KAAK,MAAA,GAAS,CAAA;AAAA;AAAA;AAAA,sBAGbA,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA,EAAW,IAAA;AAAA,UACX,IAAA;AAAA,UACA,MAAA,EAAQF,OAAAA;AAAA,UACR,MAAA,EAAQ,CAAC,UAAA,EAAY,QAAA,KACnB,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,WAAW;AAAA;AAAA;AAEtF,QACE;AAAA,GAAA,EACN,GACA,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,MAAsB,IAAA,EAA+B;AACrE,EAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,OAAA,KAAY,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAC1G,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,oBAAA,KAAyB,IAAA,CAAK,oBAAA,EAAsB,OAAO,KAAA;AAOtI,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,OAAO,KAAA;AACpC,EAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU,OAAO,KAAK,IAAA,CAAK,MAAA,KAAW,KAAK,IAAA,CAAK,MAAA;AACnE,EAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa,OAAO,KAAK,IAAA,CAAK,SAAA,KAAc,KAAK,IAAA,CAAK,SAAA;AACzE,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,IAAA,CAAK,KAAA;AACvC;AAGO,IAAM,SAAA,GAAYiB,IAAAA,CAAK,aAAA,EAAe,QAAQ,CAAA;AC1M9C,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAsBG;AACD,EAAA,MAAM,MAAA,GAASD,QAAQ,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC5D,EAAA,MAAM,IAAA,GAAOA,OAAAA;AAAA,IACX,OAAO;AAAA,MACL,QAAA,EAAU,WAAA,CAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA;AAAA,MACxC,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,MAC9C,WAAA,EAAa,cAAA,CAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA;AAAA,MACjD,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,KAAA,IAAS,EAAE;AAAA,KACvC,CAAA;AAAA,IACA,CAAC,MAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,KAAA,CAAM,SAAA,EAAW,MAAM,KAAK;AAAA,GAC7D;AAQA,EAAA,MAAM,aAAA,GAAgB,iBAAiB,KAAK,CAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoBP,OAAyD,MAAS,CAAA;AAC5F,EAAA,MAAM,aAAA,GAAgBO,QAAQ,MAAM;AAOlC,IAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,aAAA,EAAe,iBAAA,CAAkB,OAAO,CAAA;AAC5E,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,SAAA,GAAYP,OAAuB,IAAI,CAAA;AAE7C,EAAA,kBAAA,CAAmB,gBAAgB,SAAS,CAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoBA,OAAO,CAAC,CAAA;AAClC,EAAA,MAAM,WAAA,GAAcA,OAAO,EAAE,CAAA;AAC7B,EAAA,MAAM,eAAA,GAAkBA,OAAe,EAAE,CAAA;AAGzC,EAAA,MAAM,MAAA,GAASW,WAAAA;AAAA,IACb,CAAC,GAAA,KAAyB,iBAAA,GAAoB,GAAG,CAAA;AAAA,IACjD,CAAC,iBAAiB;AAAA,GACpB;AAGA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIhB,SAA4B,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAA4B,IAAI,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgBK,OAA0B,IAAI,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgBA,OAA0B,IAAI,CAAA;AACpD,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,MAAM,GAAA,GAAMO,OAAAA;AAAA,IACV,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO,CAAC,CAAA,KAAM;AACZ,QAAA,aAAA,CAAc,CAAC,CAAA;AACf,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAA;AAAA,MAC7B,MAAM,MAAM;AACV,QAAA,MAAM,IAAI,aAAA,CAAc,OAAA;AACxB,QAAA,MAAM,IAAI,aAAA,CAAc,OAAA;AACxB,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,MAAA;AAAA,YAAO,CAAC,GAAA,KACN,cAAA;AAAA,cACE,GAAA;AAAA,cACA,EAAE,cAAc,CAAA,CAAE,EAAA,EAAI,YAAY,CAAA,CAAE,EAAA,EAAI,SAAA,EAAW,CAAA,CAAE,GAAA,EAAI;AAAA,cACzD,EAAE,cAAc,CAAA,CAAE,EAAA,EAAI,YAAY,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA;AAAK;AACvD,WACF;AAAA,QACF;AACA,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,KAAK,MAAM;AACT,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,KACF,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,UAAA,EAAY,MAAM;AAAA,GACjC;AAKA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,aAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,CAAO,WAAA;AAC3B,IAAA,OAAO,SAAS,GAAA,GAAM,SAAA,GAAY,KAAA,GAAQ,UAAA,GAAa,MAAM,QAAA,GAAW,QAAA;AAAA,EAC1E,CAAA;AAKA,EAAAR,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,mBAAmB,SAAS,CAAA;AACxC,IAAA,IAAI,SAAA,CAAU,WAAW,QAAA,EAAU;AACjC,MAAA,eAAA,CAAgB,OAAA,GAAU,GAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,KAAQ,gBAAgB,OAAA,EAAS;AACrC,IAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,MAAA,EAAQ,SAAS,CAAA;AAClD,IAAA,IAAI,OAAO,IAAA,EAAM;AACjB,IAAA,eAAA,CAAgB,OAAA,GAAU,GAAA;AAC1B,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACzC,IAAA,SAAA,CAAU,OAAA,EAAS,cAAc,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,CAAA;AAAA,EACnF,CAAA,EAAG,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AAEtB,EAAA,MAAM,mBAAA,GAAsB,CAAC,QAAA,KAAqB;AAChD,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,iBAAA,CAAkB,OAAA,EAAS;AAC5C,IAAA,IAAI,QAAA,KAAa,YAAY,OAAA,EAAS;AACtC,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,MAAA,EAAQ,QAAQ,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA,EAAG;AAC5C,IAAA,iBAAA,GAAoB,UAAA,CAAW,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,uBACEN,GAAAA,CAAC,kBAAA,CAAmB,UAAnB,EAA4B,KAAA,EAAO,KACpC,QAAA,kBAAAA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAU,2BAAA;AAAA,MACV,MAAM,MAAA,CAAO,KAAA;AAAA,MACb,gBAAA,EAAkB,gBAAgB,cAAc,CAAA;AAAA,MAChD,kBAAA,EAAoB,IAAA;AAAA,MACpB,YAAA,EAAc,CAAC,KAAA,KAAU,mBAAA,CAAoB,MAAM,UAAU,CAAA;AAAA,MAC7D,WAAA,EAAa,CAAC,MAAA,EAAQ,IAAA,KAAS;AAC7B,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,QAAQ,KAAK,IAAA;AAAM,UACjB,KAAK,gBAAA,EAAkB;AACrB,YAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA;AAChD,YAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,YAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,mBAAmB,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,cAAc,GACvE,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAC,QAAA,mBAAWJ,GAAAA,CAAC,WAAA,EAAA,EAAY,YAAY,IAAA,CAAK,UAAA,EAAY,QAAgB,CAAA,GAAK,IAAA;AAAA,8BAC5EA,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,YAAY,IAAA,CAAK,UAAA;AAAA,kBACjB,YAAA,EAAc,eAAA,CAAgB,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA;AAAA,kBACtD,cAAc,IAAA,CAAK,UAAA,KAAe,CAAA,GAAI,KAAA,CAAM,SAAS,EAAA,GAAK,MAAA;AAAA,kBAC1D,QAAA;AAAA,kBACA;AAAA;AAAA;AACF,aAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,UAEJ;AAAA,UACA,KAAK,eAAA;AACH,YAAA,IAAI,UAAU,OAAO,IAAA;AACrB,YAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,mBAAmB,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,GACvD,QAAA,kBAAAI,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,uBAAA;AAAA,gBACV,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,aAAA,CAAc,CAAA,EAAG,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,gBAE9D,QAAA,EAAA;AAAA,kCAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,eAEnD,CAAA,EACF,CAAA;AAAA,UAEJ,KAAK,OAAA,EAAS;AACZ,YAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA,EAAG,MAAA,GAAS,KAAK,QAAQ,CAAA;AACvE,YAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,YAAA,MAAM,OAAA,GACJ,SAAA,CAAU,IAAA,KAAS,OAAA,IACnB,SAAA,CAAU,eAAe,IAAA,CAAK,UAAA,IAC9B,SAAA,CAAU,QAAA,KAAa,IAAA,CAAK,QAAA;AAC9B,YAAA,MAAM,UAAU,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,CAAA;AAClD,YAAA,MAAM,SAAS,CAAC,QAAA,KAAa,gBAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,IAAK,KAAA,CAAA;AAC/D,YAAA,MAAM,YAAY,CAAC,QAAA,GAAW,WAAW,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,GAAI,MAAA;AAClE,YAAA,MAAM,eAAe,CAAC,QAAA,GAAW,iBAAA,EAAmB,GAAA,CAAI,OAAO,CAAA,GAAI,MAAA;AACnE,YAAA,MAAM,UAAA,GACJ,YAAA,IAAgB,cAAA,IAAkB,cAAA,GAC9B;AAAA,cACE,SAAS,YAAA,CAAa,OAAA;AAAA,cACtB,eAAe,YAAA,CAAa,aAAA;AAAA,cAC5B,QAAA,EAAU,cAAA;AAAA,cACV,QAAA,EAAU;AAAA,aACZ,GACA,MAAA;AACN,YAAA,uBACEX,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EAAmB,mBAAA,EAAiB,MACjD,QAAA,kBAAAI,IAAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,mBAAmB,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,SAAA,IAAa,YAAY,CAAA,EACjF,QAAA,EAAA;AAAA,cAAA,SAAA,IAAa,MAAA,mBACZA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EACb,QAAA,EAAA;AAAA,gCAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAA,KAAc,OAAA,IAAW,UAAU,CAAA,EAC3E,QAAA,EAAA,SAAA,KAAc,OAAA,GAAU,iBAAA,GAAU,iBAAA,EACrC,CAAA;AAAA,gCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,gCACzCA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,wBAAA;AAAA,oBACV,SAAS,MAAM,SAAA,CAAW,SAAS,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAAA,oBACjE,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,wBAAA;AAAA,oBACV,SAAS,MAAM,SAAA,CAAW,SAAS,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAAA,oBACjE,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF,CAAA,GACE,IAAA;AAAA,8BACJA,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,UAAA;AAAA,kBACA,cAAc,IAAA,CAAK,UAAA;AAAA,kBACnB,YAAY,IAAA,CAAK,QAAA;AAAA,kBACjB,KAAA;AAAA,kBACA,IAAA;AAAA,kBACA,MAAA;AAAA,kBACA,QAAA;AAAA,kBACA,OAAA;AAAA,kBACA,MAAA;AAAA,kBACA,eAAA,EAAiB,MAAA;AAAA,kBACjB;AAAA;AAAA;AACF,aAAA,EACF,CAAA,EACF,CAAA;AAAA,UAEJ;AAAA,UACA,KAAK,aAAA;AACH,YAAA,IAAI,UAAU,OAAO,IAAA;AACrB,YAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBACb,QAAA,kBAAAI,IAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,iBAAA,EAAkB,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,UAAA,CAAW,CAAC,CAAC,CAAA,EAC1F,QAAA,EAAA;AAAA,8BAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,cAAE;AAAA,aAAA,EACjD,CAAA,EACF,CAAA;AAAA,UAEJ,KAAK,oBAAA;AACH,YAAA,uBACEX,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,GAAE,CAAA,EACxE,CAAA;AAAA,UAEJ,KAAK,YAAA;AACH,YAAA,uBACEA,GAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,KAAA;AAAA,gBACN,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,MACE,aAAA,CAAc,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,CAAE,KACjD,cAAA,CAAe,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,gBAEhD,QAAA;AAAA,gBACA,MAAA;AAAA,gBACA,QAAA,EAAU,MAAA;AAAA,gBACV;AAAA;AAAA,aACF;AAAA,UAEJ;AACE,YAAA,OAAO,IAAA;AAAA;AACX,MACF;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;AAIA,SAAS,WAAA,CAAY;AAAA,EACnB,UAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,oBAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAO,qBACvBA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,GAAG,6BAAA,EAA+B,IAAA,IAAQ,SAAS,CAAA,EAAG,KAAA,EAAM,oBAAA,EAAM,YAAA,EAAW,oBAAA,EAAM,SAAS,MAAA,EAC3H,QAAA,kBAAAA,GAAAA,CAACmB,YAAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EAAoB,WAAA,EAAa,KAAK,CAAA,EAChE,CAAA;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRnB,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,CAAC,EAAE,IAAA,EAAMW,IAAAA,EAAM,KAAA,EAAO,8CAAW,QAAA,EAAU,MAAM,MAAA,CAAO,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,aAAa,CAAC,CAAC,GAAG,CAAA;AAAA,YAC/F,CAAC,EAAE,IAAA,EAAMF,QAAQ,KAAA,EAAO,0BAAA,EAAQ,UAAU,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,cAAc,CAAA,EAAG,UAAU,CAAC,CAAA,EAAG,MAAA,EAAQ,MAAM;AAAA;AAC7G;AAAA;AACF;AAAA,GAEJ;AAEJ;AAIA,SAAS,aAAA,CAAc;AAAA,EACrB,UAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,KAAiB,MAAA,mBAChBA,IAAAA,CAAAL,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBACzCA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBACZ,QAAA,kBAAAA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,YAAA;AAAA,UACP,QAAA;AAAA,UACA,WAAA,EAAY,oBAAA;AAAA,UACZ,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE;AAAA;AAAA,OACnD,EACF;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,YAAA;AAAA,QACP,QAAA;AAAA,QACA,WAAA,EAAY,0BAAA;AAAA,QACZ,MAAA,EAAQ,CAAC,CAAA,KACP,MAAA,CAAO,CAAC,CAAA,MAAO;AAAA,UACb,GAAG,CAAA;AAAA,UACH,UAAU,CAAA,CAAE,QAAA,EAAU,GAAA,CAAI,CAAC,IAAI,CAAA,KAAO,CAAA,KAAM,UAAA,GAAa,EAAE,GAAG,EAAA,EAAI,KAAA,EAAO,GAAE,GAAI,EAAG,KAAK,CAAA,CAAE;AAAA,SAC3F,CAAE;AAAA;AAAA,KAEN,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,eAAW,IAAA,EAAC;AAAA,GAAA,EACvD,CAAA;AAEJ;;;ACjZO,SAAS,cAAA,CAAe,YAAoB,OAAA,EAAqC;AACtF,EAAA,OAAO,GAAG,UAAU,CAAA,CAAA,EAAA,CAAK,OAAA,IAAW,EAAA,EAAI,MAAM,CAAA,CAAA;AAChD;AAEA,SAAS,WAAA,CAAY,QAAiB,KAAA,EAAyC;AAC7E,EAAA,MAAM,CAAA,GAAA,CAAK,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AAC9B,EAAA,MAAM,CAAA,GAAA,CAAK,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK;AAC7B,EAAA,OAAO,MAAM,CAAA,GAAI,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,EAAE;AACrD;AAEA,SAAS,eAAe,KAAA,EAAsB;AAI5C,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,IAClC,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW;AAAC,GAC5B,CAAA;AACH;AAEA,SAAS,UAAU,OAAA,EAAwD;AACzE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAmB;AACnC,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,EAAA,GAAA,CAAM,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACvC,IAAA,IAAI,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,YAAA,CACP,QAAA,EACA,GAAA,EACA,KAAA,EAC2B;AAC3B,EAAA,MAAM,IAAA,GAAO,YAAY,EAAC;AAC1B,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,EAAY,IAAA,EAAK;AAChC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAA,EAAY,IAAA,EAAK,KAAM,EAAE,CAAA;AACzD,IAAA,IAAI,MAAM,OAAO,IAAA;AAAA,EACnB;AACA,EAAA,OAAO,KAAK,KAAK,CAAA;AACnB;AAEO,SAAS,gBAAA,CACd,UACA,OAAA,EACW;AACX,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA6B;AACvD,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,aAAA,EAAe,YAAA,EAAc,KAAA,EAAO,CAAA,EAAE;AAAA,EACjD;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,QAAA,CAAS,KAAA,EAAO,QAAQ,KAAK,CAAA;AACvD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAA,CAAS,SAAA,EAAW,QAAQ,SAAS,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,QAAA,CAAS,KAAA,EAAO,QAAQ,KAAK,CAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,IAAY,EAAC;AACzC,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,OAAA,EAAS,EAAA,KAAO;AACnC,IAAA,MAAM,UAAU,SAAA,CAAU,YAAA,CAAa,SAAS,QAAA,EAAU,OAAA,EAAS,EAAE,CAAC,CAAA;AACtE,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AACxC,MAAA,MAAM,EAAA,GAAA,CAAM,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACvC,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC3B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,aAAA,CAAc,GAAA,CAAI,cAAA,CAAe,EAAA,EAAI,EAAE,GAAG,OAAO,CAAA;AAAA,MACnD,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AAIzB,QAAA;AAAA,MACF,WAAW,cAAA,CAAe,IAAI,CAAA,KAAM,cAAA,CAAe,KAAK,CAAA,EAAG;AACzD,QAAA,aAAA,CAAc,GAAA,CAAI,cAAA,CAAe,EAAA,EAAI,EAAE,GAAG,UAAU,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,CAAC,SAAS,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AACjD,IAAA,MAAM,SAAS,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,OAAA,EAAS,EAAE,CAAC,CAAA;AAC/D,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AACxC,MAAA,MAAM,EAAA,GAAA,CAAM,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACvC,MAAA,IAAI,MAAM,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,GAAG,YAAA,IAAgB,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAA,CACH,KAAA,GAAQ,CAAA,GAAI,CAAA,KACZ,SAAA,GAAY,CAAA,GAAI,CAAA,CAAA,IAChB,KAAA,GAAQ,CAAA,GAAI,CAAA,CAAA,GACb,aAAA,CAAc,IAAA,GACd,YAAA;AAEF,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,cAAc,KAAA,EAAM;AACvE;AAIO,SAAS,sBAAsB,SAAA,EAAuC;AAC3E,EAAA,MAAM,MAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,UAAU,aAAA,EAAe;AACjD,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AACzB,IAAA,IAAI,IAAI,CAAA,EAAG;AACX,IAAA,MAAM,aAAa,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC/B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG,GAAA,CAAI,KAAK,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,qBAAA,CACd,UACA,OAAA,EACkE;AAClE,EAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAA;AAC7C,EAAA,OAAO,EAAE,MAAA,EAAQ,qBAAA,CAAsB,EAAE,CAAA,EAAG,cAAc,EAAA,CAAG,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,KAAA,EAAM;AAC7F;AAMO,SAAS,uBAAA,CACd,QAAA,EACA,SAAA,EACA,UAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAA,CAAY,QAAA,CAAS,QAAA,IAAY,IAAI,KAAA,EAAM;AACjD,EAAA,MAAM,EAAA,GAAK,WAAW,IAAA,EAAK;AAC3B,EAAA,IAAI,EAAA,GAAK,EAAA,GAAK,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,EAAY,IAAA,EAAK,KAAM,EAAE,CAAA,GAAI,EAAA;AACvE,EAAA,IAAI,EAAA,GAAK,GAAG,EAAA,GAAK,UAAA,IAAc,KAAK,UAAA,GAAa,QAAA,CAAS,SAAS,UAAA,GAAa,EAAA;AAChF,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAC,KAAK,GAAG,CAAA;AACxD,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,QAAA,EAAS;AAAA,EACjC;AACA,EAAA,MAAM,EAAA,GAAK,SAAS,EAAE,CAAA;AACtB,EAAA,MAAM,MAAA,GAAA,CAAU,EAAA,CAAG,MAAA,IAAU,IAAI,KAAA,EAAM;AACvC,EAAA,MAAM,GAAA,GAAA,CAAO,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACxC,EAAA,MAAM,EAAA,GAAK,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,GAAG,CAAA,GAAI,EAAA;AAC9E,EAAA,IAAI,EAAA,IAAM,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,GAAI,KAAA;AAAA,OACrB,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,EAAA,QAAA,CAAS,EAAE,CAAA,GAAI,EAAE,GAAG,IAAI,MAAA,EAAO;AAC/B,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,QAAA,EAAS;AACjC;AAKO,SAAS,qBAAA,CACd,OAAA,EACA,UAAA,EACA,QAAA,EACA,aAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAA,CAAY,OAAA,CAAQ,QAAA,IAAY,IAAI,KAAA,EAAM;AAChD,EAAA,MAAM,EAAA,GAAK,SAAS,UAAU,CAAA;AAC9B,EAAA,IAAI,CAAC,IAAI,OAAO,OAAA;AAChB,EAAA,MAAM,MAAA,GAAA,CAAU,EAAA,CAAG,MAAA,IAAU,IAAI,KAAA,EAAM;AACvC,EAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,IAAY,MAAA,CAAO,QAAQ,OAAO,OAAA;AACtD,EAAA,IAAI,aAAA,EAAe,MAAA,CAAO,QAAQ,CAAA,GAAI,aAAA;AAAA,OACjC,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA;AAC9B,EAAA,QAAA,CAAS,UAAU,CAAA,GAAI,EAAE,GAAG,IAAI,MAAA,EAAO;AACvC,EAAA,OAAO,EAAE,GAAG,OAAA,EAAS,QAAA,EAAS;AAChC;AAGO,SAAS,iBAAA,CACd,QAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACc;AACd,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,EAAA,GAAK,aAAa,QAAA,CAAS,QAAA,EAAU,EAAE,UAAA,EAAY,SAAA,IAA8B,UAAU,CAAA;AACjG,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,OAAA,CAAQ,EAAA,CAAG,MAAA,IAAU,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,GAAG,CAAA,IAAK,IAAA;AAC7E;AAkBA,SAAS,UAAU,CAAA,EAAuB;AACxC,EAAA,OAAO,CAAC,EAAE,IAAA,IAAQ,EAAA,EAAA,CAAK,EAAE,OAAA,IAAW,EAAA,EAAI,MAAK,EAAG,CAAA,CAAE,YAAY,EAAA,EAAI,CAAA,CAAE,WAAW,EAAA,EAAI,CAAA,CAAE,YAAY,EAAE,CAAA,CAAE,KAAK,IAAG,CAAA;AAC/G;AAWO,SAAS,sBAAA,CAAuB,UAAwB,OAAA,EAAwC;AACrG,EAAA,MAAM,IAAI,QAAA,CAAS,MAAA;AACnB,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AAChC,EAAA,MAAM,KAAiB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAI,CAAA,EAAE,EAAG,MAAM,IAAI,MAAc,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3F,EAAA,KAAA,IAASoB,EAAAA,GAAI,CAAA,GAAI,CAAA,EAAGA,EAAAA,IAAK,GAAGA,EAAAA,EAAAA,EAAK;AAC/B,IAAA,KAAA,IAASC,EAAAA,GAAI,CAAA,GAAI,CAAA,EAAGA,EAAAA,IAAK,GAAGA,EAAAA,EAAAA,EAAK;AAC/B,MAAA,EAAA,CAAGD,EAAC,CAAA,CAAEC,EAAC,CAAA,GAAI,EAAA,CAAGD,EAAC,CAAA,KAAM,EAAA,CAAGC,EAAC,CAAA,GAAI,EAAA,CAAGD,EAAAA,GAAI,CAAC,CAAA,CAAEC,EAAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAGD,KAAI,CAAC,CAAA,CAAEC,EAAC,CAAA,EAAG,EAAA,CAAGD,EAAC,CAAA,CAAEC,EAAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IACzF;AAAA,EACF;AAEA,EAAA,MAAM,MAAY,EAAC;AACnB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AACrB,IAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,OAAA,EAAS,GAAG,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA,CAAA,EAAA;AAAA,IAAK,CAAA,MAAA,IACrD,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,CAAG,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK,CAAA,MACpE;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK;AAAA,EACzC;AACA,EAAA,OAAO,IAAI,CAAA,EAAG;AAAE,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,IAAA,CAAA,EAAA;AAAA,EAAK;AAChD,EAAA,OAAO,IAAI,CAAA,EAAG;AAAE,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,IAAA,CAAA,EAAA;AAAA,EAAK;AAEhD,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,IAAI,EAAA,CAAG,MAAM,OAAA,EAAS;AAAE,MAAA,IAAA,GAAO,GAAG,CAAA,GAAI,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACxD,IAAA,IAAI,EAAA,CAAG,MAAM,KAAA,EAAO;AAAE,MAAA,OAAA,CAAQ,KAAK,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA;AAAG,MAAA,IAAA,GAAO,GAAG,CAAA,GAAI,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACtG,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,IAAI,CAAC,CAAA,CAAE,MAAM,KAAA,EAAO;AAAE,MAAA,IAAA,CAAK,IAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAoB,CAAC,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK;AAC5F,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,IAAI,CAAC,CAAA,CAAE,MAAM,KAAA,EAAO;AAAE,MAAA,IAAA,CAAK,IAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAoB,CAAC,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK;AAC5F,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAC9C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,EAAE,OAAA,EAAS,IAAA,CAAK,CAAC,GAAG,IAAA,EAAM,UAAA,EAAY,iBAAiB,IAAA,CAAK,CAAC,GAAG,CAAA;AAC5G,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,SAAS,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA;AACzF,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,GAAS,IAAA,CAAK,KAAK,MAAA,GAAS,CAAC,IAAI,CAAA,GAAI,IAAA;AAC9D,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,eAAe,WAAA,EAAa,eAAA,EAAiB,IAAA,CAAK,CAAC,GAAG,CAAA;AAC9G,IAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,GAAO,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;AAIO,SAAS,iBAAA,CAAkB,aAAA,EAAsB,YAAA,EAAqB,IAAA,EAA6B;AACxG,EAAA,MAAM,QAAA,GAAA,CAAY,aAAA,CAAc,OAAA,IAAW,IAAI,KAAA,EAAM;AACrD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,IAAW,EAAC;AAC1C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC5D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAClC,IAAA,IAAI,IAAA,IAAQ,KAAK,eAAA,GAAkB,QAAA,CAAS,QAAQ,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA,GAAI,IAAA;AAAA,EACvF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAClC,IAAA,IAAI,IAAA,EAAM,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AAAA,EAC5E,WAAW,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAClE,IAAA,IAAI,IAAA,CAAK,kBAAkB,QAAA,CAAS,MAAA,WAAiB,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,EAAE,GAAG,aAAA,EAAe,OAAA,EAAS,QAAA,EAAS;AAC/C;AAKO,SAAS,iBAAA,CAAkB,YAAA,EAAqB,aAAA,EAA6B,IAAA,EAA6B;AAC/G,EAAA,MAAM,QAAA,GAAA,CAAY,YAAA,CAAa,OAAA,IAAW,IAAI,KAAA,EAAM;AACpD,EAAA,MAAM,QAAA,GAAW,aAAA,EAAe,OAAA,IAAW,EAAC;AAC5C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC5D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA;AAC1C,IAAA,IAAI,IAAA,IAAQ,KAAK,OAAA,GAAU,QAAA,CAAS,QAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AAAA,EACvE,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,IAAI,IAAA,CAAK,UAAU,QAAA,CAAS,MAAA,WAAiB,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,KAAS,IAAA,CAAK,mBAAmB,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA,GAAI,MAAA,CAAA;AAC3F,IAAA,IAAI,IAAA,EAAM,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,QAAA,EAAS;AAC9C;AAIO,SAAS,wBAAA,CAAyB,QAAA,EAAyB,OAAA,EAAwB,IAAA,EAAqC;AAC7H,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC3F,EAAA,MAAM,SAAA,GAAY,kBAAkB,QAAA,EAAU,GAAA,EAAK,YAAY,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAC5F,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,QAAA,GAAW,wBAAwB,QAAA,EAAU,GAAA,EAAK,YAAY,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA,GAAI,QAAA;AAAA,EACpG;AACA,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,SAAA,EAAW,QAAA,IAAY,WAAW,IAAI,CAAA;AACrE,EAAA,OAAO,wBAAwB,QAAA,EAAU,GAAA,EAAK,UAAA,EAAY,IAAA,CAAK,YAAY,IAAI,CAAA;AACjF;AAIO,SAAS,sBAAA,CAAuB,OAAA,EAAwB,QAAA,EAAgC,IAAA,EAAqC;AAClI,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,GAAA,EAAK,MAAA,EAAQ,SAAA,CAAU,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,MAAK,KAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA,IAAK,EAAA;AACrG,EAAA,IAAI,QAAA,GAAW,CAAA,IAAK,CAAC,GAAA,EAAK,QAAQ,OAAO,OAAA;AACzC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,kBAAkB,QAAA,EAAU,GAAA,CAAI,YAAY,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAC3F,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AACxD,EAAA,OAAO,qBAAA,CAAsB,OAAA,EAAS,IAAA,CAAK,UAAA,EAAY,UAAU,IAAI,CAAA;AACvE;AAIO,SAAS,eAAA,CACd,UACA,OAAA,EAC6F;AAC7F,EAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAA;AAC7C,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,MAAM,UAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,GAAG,aAAA,EAAe;AAC1C,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC1B,IAAA,MAAM,aAAa,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG;AAClC,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAA,CAAO,KAAK,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAClD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,QAAA,GAAW,UAAU,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,OAAO,CAAA;AAC9E,IAAA,MAAM,YAAY,iBAAA,CAAkB,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,YAAY,OAAO,CAAA;AACjF,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,EAAA,GAAK,uBAAuB,SAAA,EAAW,OAAA,IAAW,EAAC,EAAG,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AAClF,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,OAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,UAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,iBAAiB,CAAA,CAAE,eAAA;AAAA;AAAA;AAAA,QAGnB,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,eAAA,IAAmB,IAAA,GAAO,SAAA,EAAW,OAAA,GAAU,CAAA,CAAE,eAAe,CAAA,GAAI;AAAA,OACtG,CAAA;AAAA,IACH;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,OAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,UAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,SAAA;AAAA,QACN,SAAS,CAAA,CAAE,aAAA;AAAA,QACX,iBAAiB,CAAA,CAAE,eAAA;AAAA,QACnB,IAAA,EAAM,SAAA,EAAW,OAAA,GAAU,CAAA,CAAE,eAAe;AAAA,OAC7C,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,EAAA,CAAG,YAAA,EAAc,KAAA,EAAO,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA,GAAS,EAAA,CAAG,YAAA,EAAa;AACnH;;;AC5XA,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AAChE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAK,EAAG;AAC7C,IAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AACpD;AAGO,SAAS,6BACd,SAAA,EACwB;AACxB,EAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AACnC,EAAA,IAAI,UAAA,KAAe,WAAW,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,QAAA,EAAS;AAClF,EAAA,IAAI,UAAA,KAAe,cAAc,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,YAAY,QAAA,EAAS;AAC3F,EAAA,IAAI,UAAA,KAAe,UAAU,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAE/E,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AACzC,EAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AAC5C,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,QAAA,EAAS;AAAA,EAC/C;AACA,EAAA,IAAI,eAAe,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,WAAW,UAAA,EAAW;AAE9D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AACnC,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,WAAA,IAAe,UAAU,OAAA,EAAS;AACnE,IAAA,OAAO,EAAE,MAAM,WAAA,EAAY;AAAA,EAC7B;AAEA,EAAA,OAAO,IAAA;AACT;AClDO,SAAS,UAAA,CAAW;AAAA,EACzB,YAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAInB,SAAqB,IAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAASK,OAAO,CAAC,CAAA;AAEvB,EAAAD,UAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAIhB,IAAA,SAAS,MAAA,CAAO,UAAkB,QAAA,EAAkB;AAClD,MAAA,MAAM,GAAA,GAAM,OAAO,YAAA,EAAa;AAChC,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,eAAe,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAK9B,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,uBAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAA,YAAkB,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,aAAA;AAC7D,MAAA,MAAM,OAAO,YAAA,CAAa,OAAA;AAC1B,MAAA,IAAI,CAAC,QAAQ,CAAC,QAAA,IAAY,CAAC,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClD,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAC5C,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,QAAA,EAAS,CAAE,IAAA,EAAK;AACjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,KAAK,qBAAA,EAAsB;AAG5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,EAAG,QAAA,CAAS,QAAQ,GAAG,CAAA;AACrF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,QAAA,GAAW,QAAA,CAAS,GAAA,GAAM,CAAC,CAAA,EAAG,QAAA,CAAS,SAAS,CAAC,CAAA;AACnF,MAAA,MAAA,CAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IAC5B;AAEA,IAAA,SAAS,KAAK,CAAA,EAAe;AAC3B,MAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AACZ,MAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AAEZ,MAAA,qBAAA,CAAsB,MAAM,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,SAAS,OAAO,CAAA,EAAe;AAE7B,MAAA,IAAK,CAAA,CAAE,MAAA,EAAwB,OAAA,GAAU,kBAAkB,CAAA,EAAG;AAC9D,MAAA,MAAA,CAAO,IAAI,CAAA;AAAA,IACb;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,IAAI,CAAA;AACzC,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAC5C,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAAA,IACxD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,uBACEF,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,iBAAA;AAAA,MACV,OAAO,EAAE,GAAA,EAAK,IAAI,GAAA,EAAK,IAAA,EAAM,IAAI,IAAA,EAAK;AAAA,MACtC,SAAS,MAAM;AACb,QAAA,MAAA,CAAO,OAAA,IAAW,CAAA;AAClB,QAAA,mBAAA,CAAoB;AAAA,UAClB;AAAA,YACE,IAAI,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,MAAM,CAAA,CAAA;AAAA,YAC9C,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA,GAAM,GAAA,CAAI,IAAA;AAAA,YAChE,MAAM,GAAA,CAAI;AAAA;AACZ,SACD,CAAA;AACD,QAAA,MAAA,CAAO,YAAA,IAAgB,eAAA,EAAgB;AACvC,QAAA,MAAA,CAAO,IAAI,CAAA;AAAA,MACb,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,eAAA,EAAgB,aAAa,GAAA,EAAK,CAAA;AAAA,QAAE;AAAA;AAAA;AAAA,GAEpE;AAEJ;AChHO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,oBAC/CA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,oBAAA;AAAA,QACV,KAAA,EAAO,KAAA;AAAA,QACP,WAAA,EAAY,cAAA;AAAA,QACZ,YAAA,EAAW,0BAAA;AAAA,QACX,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC7C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,IAAI,CAAA,CAAE,UAAU,MAAA,EAAO;AAAA,iBAClB,MAAA,EAAO;AAAA,UACd,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF;AAAA;AAAA,KACF;AAAA,oBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,MAAA,KAAA,GAAQ,CAAA,GAAI,UAAU,CAAA,GAAI,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE;AAAA,KAAA,EACjC,CAAA;AAAA,oBACAJ,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAM,oBAAA,EAAM,QAAA,EAAU,KAAA,KAAU,GAAG,OAAA,EAAS,MAAA,EAC7F,0BAAAA,GAAAA,CAACsB,WAAAA,EAAA,EAAY,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EACzD,CAAA;AAAA,oBACAtB,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAM,oBAAA,EAAM,QAAA,EAAU,KAAA,KAAU,GAAG,OAAA,EAAS,MAAA,EAC7F,0BAAAA,GAAAA,CAACK,YAAAA,EAAA,EAAa,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EAC1D,CAAA;AAAA,oBACAL,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,KAAA,EAAM,0BAAA,EAAO,SAAS,OAAA,EACvE,QAAA,kBAAAA,IAACiB,CAAAA,EAAA,EAAE,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EAC/C;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC1BA,IAAM,WAAA,GAAsC;AAAA,EAC1C,QAAA,EAAU,aAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AACA,IAAM,UAAA,GAAqC;AAAA,EACzC,GAAA,EAAK,YAAA;AAAA,EACL,KAAA,EAAO,cAAA;AAAA,EACP,IAAA,EAAM,aAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,GAAA,CAAI,OAAiB,KAAA,EAAwC;AACpE,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,EAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B;AAEA,SAAS,aAAA,CAAcnB,SAAkC,OAAA,EAA4C;AACnG,EAAA,MAAM,EAAA,GAAK,SAAS,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,OAAO,mBAAA,CAAoBA,OAAAA,EAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,QAAA,EAAU,IAAA,EAAK,KAAM,EAAE,CAAC,CAAA;AACnF;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,iBAAA,EAAkB;AACxC;AAEA,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACA,IAAA,EAMQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,MAAM,iBAAA,GAAoB,0BAA0B,KAAK,CAAA;AACzD,EAAA,MAAM,WAAW,iBAAA,GAAoB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA,GAAI,MAAA;AAE/E,EAAA,GAAA,CAAI,OAAO,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAC,CAAC,CAAA;AAClD,EAAA,GAAA,CAAI,KAAA,EAAO,YAAY,KAAA,CAAM,WAAA,EAAa,SAAS,EAAE,CAAA,IAAK,KAAA,CAAM,WAAA,EAAa,KAAK,CAAA;AAClF,EAAA,GAAA,CAAI,KAAA,EAAO,QAAA,GAAW,sBAAA,CAAuB,QAAQ,IAAI,iBAAiB,CAAA;AAC1E,EAAA,GAAA,CAAI,KAAA,EAAO,WAAW,KAAA,CAAM,WAAA,EAAa,QAAQ,EAAE,CAAA,IAAK,KAAA,CAAM,WAAA,EAAa,IAAI,CAAA;AAE/E,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AACtC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,QAAA,EAAU,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,GAAA,CAAI,KAAA,EAAO,KAAA,GAAQ,mBAAA,CAAoB,KAAK,IAAI,EAAE,CAAA;AAClD,IAAA,GAAA,CAAI,OAAO,aAAA,CAAc,KAAA,EAAO,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACrC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAS,IAAA,EAAK;AAC7B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,GAAA,CAAI,KAAA,EAAO,IAAA,GAAO,kBAAA,CAAmB,IAAI,IAAI,EAAE,CAAA;AAC/C,IAAA,GAAA,CAAI,OAAO,aAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,OAAA,IAAW,EAAC,EAAG;AACtC,IAAA,iBAAA,CAAkB,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,KAAK,UAAU,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,iBAAA,CACP,KAAA,EACA,IAAA,EACA,QAAA,EACA,UAAA,EACM;AACN,EAAA,GAAA,CAAI,KAAA,EAAO,KAAK,OAAO,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,EAAO,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAC,CAAA;AAC9C,EAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,IAAI,CAAA,EAAG;AACxC,IAAA,GAAA,CAAI,KAAA,EAAO,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACnC,IAAA,GAAA,CAAI,KAAA,EAAO,wBAAwB,EAAE,UAAA,EAAY,KAAK,UAAA,EAAW,EAAG,QAAA,EAAU,UAAU,CAAC,CAAA;AACzF,IAAA,GAAA,CAAI,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,EACzB;AACF;AAEO,SAAS,yBAAyB,KAAA,EAA2C;AAClF,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,QAAA,EAAU,WAAA,CAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA;AAAA,IACxC,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,IAC9C,WAAA,EAAa,cAAA,CAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA;AAAA,IACjD,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,KAAA,IAAS,EAAE;AAAA,GACvC;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,IAAA,EAAK;AAChC,EAAA,IAAI,KAAA,IAAA,CAAU,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU,KAAK,CAAA,EAAG;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,CAAA;AAAE,KAC7C,CAAA;AAAA,EACH;AAEA,EAAA,CAAC,MAAM,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,UAAA,KAAe;AACtD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,WAAW,UAAU,CAAA,CAAA;AAAA,MAC1B,IAAA,EAAM,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AAAA,MACzC,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA;AAAW,KAC1C,CAAA;AACD,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,QAAA,KAAa;AAClD,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,QACpC,IAAA,EAAM,eAAA,CAAgB,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AAAA,QAC3C,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,QAAA;AAAS,OAClD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,uBAAA,CACd,SACA,KAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,UAAU,KAAA,CAAM,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AC7JO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,eAAA,GAAkBS,OAAO,KAAK,CAAA;AACpC,EAAA,MAAM,QAAA,GAAWA,OAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIL,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,CAAC,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAUY,QAAQ,MAAM,wBAAA,CAAyB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACtE,EAAA,MAAM,OAAA,GAAUA,OAAAA,CAAQ,MAAM,uBAAA,CAAwB,OAAA,EAAS,KAAK,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AACvF,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,EAAA,MAAM,OAAA,GAAU,QAAQ,CAAA,GAAI,IAAA,CAAK,IAAI,MAAA,EAAQ,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AAE1D,EAAA,MAAM,WAAA,GAAcI,WAAAA;AAAA,IAClB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,WAAW,QAAQ,CAAA;AACvD,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA,oBAAqB,IAAI,CAAA;AAAA,IACrE,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,iBAAA,EAAmB,SAAS;AAAA,GACxC;AAEA,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,MAAA,QAAA,CAAS,SAAS,MAAA,EAAO;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAcA,WAAAA,CAAY,MAAM,QAAQ,KAAK,CAAA,EAAG,EAAE,CAAA;AACxD,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,IAAA,KAAiB;AAChD,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,CAAC,CAAA;AAAA,EACb,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,WAAA,CAAA,CAAa,OAAA,GAAU,KAAK,KAAK,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,KAAK,CAAC,CAAA;AAChC,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,IAAI,QAAQ,CAAA,EAAG,WAAA,CAAA,CAAa,OAAA,GAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,KAAK,CAAC,CAAA;AAEhC,EAAAZ,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,IAAQ,KAAA,GAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,CAAA;AAAA,EAC5C,GAAG,CAAC,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,KAAK,CAAC,CAAA;AAEtC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,IAAA,EAAM,UAAA,EAAW;AAAA,EACpC,CAAA,EAAG,CAAC,QAAA,EAAU,IAAA,EAAM,UAAU,CAAC,CAAA;AAE/B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAA+B;AACrD,MAAA,eAAA,CAAgB,OAAA,GAAU,kBAAkB,IAAA,IAAQ,CAAC,CAAC,OAAA,CAAQ,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,IACxF,CAAA;AACA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB,cAAA,CAAe,EAAE,MAAM,CAAA;AAClE,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAkB,cAAA,CAAe,EAAE,MAAM,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,EAAE,EAAE,OAAA,IAAW,CAAA,CAAE,YAAY,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AAC9D,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,YAAA,GAAe,kBAAkB,IAAA,IAAQ,CAAC,CAAC,OAAA,CAAQ,OAAA,EAAS,SAAS,MAAM,CAAA;AACjF,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,IAAI,MAAA,YAAkB,WAAA,IAAe,MAAA,KAAW,QAAA,CAAS,IAAA,EAAM;AAC/D,QAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAAA,MAChC;AACA,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AACpD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AACpD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC/D,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AACvD,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AAAA,IACzD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,OAAO,CAAC,CAAA;AAElC,EAAA,uBACEF,IAAAA,CAAAL,UAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,mBACCC,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA,EAAe,WAAA;AAAA,QACf,MAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS;AAAA;AAAA,KACX,GACE,IAAA;AAAA,oBACJA,IAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,IAAA,GAAO,KAAA,GAAQ,EAAA,EAC9C,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AC5BO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,EAAW,mBAAA;AAAA,EACX,iBAAA;AAAA,EACA,MAAA,EAAQ,gBAAA;AAAA,EACR,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA,GAAM,SAAA;AAAA,EACN,aAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA,GAAa,MAAA;AAAA,EACb,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AAMpB,EAAA,MAAM,YAAA,GAAeO,OAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,kBAAA,GAAqBA,OAAO,eAAe,CAAA;AACjD,EAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAC7B,EAAA,MAAM,aAAA,GAAgBO,OAAAA;AAAA,IACpB,OAAO;AAAA,MACL,KAAK,MAAM;AACT,QAAA,IAAA,CAAK,aAAa,OAAA,IAAW,CAAA,MAAO,CAAA,EAAG,kBAAA,CAAmB,UAAU,IAAI,CAAA;AAAA,MAC1E,CAAA;AAAA,MACA,KAAK,MAAM;AACT,QAAA,YAAA,CAAa,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,CAAa,UAAU,CAAC,CAAA;AAC3D,QAAA,IAAI,YAAA,CAAa,OAAA,KAAY,CAAA,EAAG,kBAAA,CAAmB,UAAU,KAAK,CAAA;AAAA,MACpE;AAAA,KACF,CAAA;AAAA,IACA;AAAC,GACH;AAMA,EAAA,MAAM,cAAcP,MAAAA,CAAO,EAAE,QAAQ,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAC/D,EAAA,WAAA,CAAY,OAAA,GAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,OAAA,EAAQ;AACzD,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,EAAE,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IACE,CAAA,YAAa,WAAA,KACZ,CAAA,CAAE,OAAA,KAAY,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,UAAA,IAAc,CAAA,CAAE,OAAA,KAAY,QAAA,IAAY,CAAA,CAAE,iBAAA,CAAA,EAClF;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY;AAC9B,MAAA,MAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAS,EAAA,EAAI,OAAA,EAAS,EAAA,EAAG,GAAI,WAAA,CAAY,OAAA;AACvE,MAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,CAAC,CAAA,CAAE,QAAA,EAAU;AAC9B,QAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,EAAE;AAAA,MACJ,WAAY,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAA,IAAa,QAAQ,GAAA,EAAK;AACrD,QAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,EAAE;AAAA,MACJ;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIJ,SAA0B,eAAe,CAAA;AACrF,EAAA,MAAM,YAAY,mBAAA,IAAuB,cAAA;AACzC,EAAA,MAAM,YAAA,GAAegB,WAAAA;AAAA,IACnB,CAAC,IAAA,KAA0B;AACzB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,iBAAA,GAAoB,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIhB,SAAuB,UAAU,CAAA;AACvE,EAAA,MAAM,SAAS,gBAAA,IAAoB,WAAA;AACnC,EAAA,MAAM,SAAA,GAAYgB,WAAAA;AAAA,IAChB,CAAC,IAAA,KAAuB;AACtB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,cAAA,GAAiB,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,OAAA,GAAUX,OAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,cAAA,GAAiBO,QAAQ,MAAM;AACnC,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAkC;AAChD,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,MAAA,IAAU,IAAI,CAAA,CAAE,GAAA,CAAI,cAAA,CAAe,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,OAAO,CAAA,EAAG,EAAE,IAAI,CAAA;AACzF,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AAGjB,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAM;AACtC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoG;AACpH,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,OAAA,IAAW,EAAC,EAAG;AACnC,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,CAAA,CAAE,UAAA,EAAY,EAAE,OAAO,CAAA;AAClD,MAAA,IAAI,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACN,QAAA,CAAA,GAAI,EAAE,yBAAS,IAAI,GAAA,IAAO,aAAA,kBAAe,IAAI,KAAI,EAAE;AACnD,QAAA,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AACxB,QAAA,MAAM,MAAM,CAAA,CAAE,aAAA,CAAc,IAAI,CAAA,CAAE,OAAO,KAAK,EAAC;AAC/C,QAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,QAAA,CAAA,CAAE,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,GAAG,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAClB,EAAA,MAAM,gBAAA,GAAmBA,QAAQ,MAAM;AACrC,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,cAAA,CAAe,MAAM,CAAA;AACvC,IAAA,KAAA,MAAW,KAAK,iBAAA,CAAkB,IAAA,EAAK,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,cAAA,EAAgB,iBAAiB,CAAC,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAA,GACd,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS,MAAA,IAAU,CAAA,CAAA,IAAM,IAAA,CAAK,gBAAgB,CAAA,CAAA,GACvF,CAAA;AAEJ,EAAA,MAAM,iBAAA,GAAoBA,QAA2B,MAAM;AACzD,IAAA,IAAI,gBAAA,CAAiB,IAAA,KAAS,CAAA,EAAG,OAAO,EAAC;AACzC,IAAA,MAAM,MAAyB,EAAC;AAChC,IAAA,CAAC,MAAM,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC9C,MAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,QAAA,IAAI,iBAAiB,GAAA,CAAI,cAAA,CAAe,IAAI,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAG;AAC5D,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,EAAA,EAAI,QAAA,EAAU,IAAI,CAAA;AAAA,QAC1D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,EAAA,MAAM,SAAA,GAAYP,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIL,SAAS,CAAC,CAAA;AAE9C,EAAA,MAAM,OAAA,GAAUgB,WAAAA;AAAA,IACd,CAAC,GAAA,KAAgB;AACf,MAAA,MAAM,IAAA,GAAO,iBAAA;AACb,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAA,CAAQ,UAAA,GAAa,GAAA,GAAM,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AACrD,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,YAAA,CAAa,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,CAAC,iBAAA,EAAmB,UAAA,EAAY,YAAY;AAAA,GAC9C;AAKA,EAAA,MAAM,SAAA,GAAYJ,QAAQ,MAAM;AAC9B,IAAA,IAAI,CAAC,IAAA,IAAS,CAAC,IAAA,CAAK,aAAA,IAAiB,CAAC,IAAA,CAAK,aAAA,IAAkB,gBAAA,CAAiB,IAAA,KAAS,CAAA,EAAG,OAAO,MAAA;AACjG,IAAA,MAAM,MAAA,GAAS,CAAC,UAAA,EAAoB,OAAA,KAClC,cAAA,CAAe,IAAI,cAAA,CAAe,UAAA,EAAY,OAAO,CAAC,CAAA,IAAK,UAAA;AAC7D,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,cAAA;AAAA,MACX,QAAA,EAAU,CAAC,UAAA,EAAoB,OAAA,KAC7B,KAAK,aAAA,GAAgB,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,OAAO,GAAG,CAAA;AAAA,MACjF,QAAA,EAAU,CAAC,UAAA,EAAoB,OAAA,KAC7B,KAAK,aAAA,GAAgB,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,OAAO,GAAG;AAAA,KACnF;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,cAAA,EAAgB,gBAAgB,CAAC,CAAA;AAG3C,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC5B,IAAA,MAAM,GAAA,GAAM,4BAAA,CAA6B,qBAAA,CAAsB,SAAS,CAAA;AACxE,IAAA,IAAI,GAAA,EAAK,YAAA,CAAa,UAAA,CAAW,GAAA,EAAK,WAAW,CAAC,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,qBAAA,EAAuB,YAAY,CAAC,CAAA;AAExC,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,KAAA,EAAO,SAAS,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,KAAA,EAAO,SAAS,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,CAAC,YAAA,EAAc,IAAA,GAAO,MAAA,GAAS,EAAA,EAAI,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAExF,EAAA,MAAM,yBACJN,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAgB,IAAA,EAAM,cAAA;AAAA,MACtB,gBAAgB,IAAA,EAAM,cAAA;AAAA,MACtB,cAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA,EAAmB,YAAA;AAAA,MACnB;AAAA;AAAA,GACF;AAGF,EAAA,uBACEA,GAAAA,CAAC,oBAAA,CAAqB,UAArB,EAA8B,KAAA,EAAO,eACtC,QAAA,kBAAAI,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,SAAA;AAAA,MACX,GAAA,EAAK,OAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,QAAA,GAAA,KAAQ,4BACPJ,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,KAAA;AAAA,YACN,SAAA;AAAA,YACA,QAAA,EAAU,YAAA;AAAA,YACV,YAAA,EAAc,WAAW,MAAA,GAAY,MAAM,OAAO,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC;AAAA;AAAA,SACxE,GACE,IAAA;AAAA,wBACJI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,aAAA,EAAe,WAAW,MAAA,GAAY,aAAA;AAAA,cACtC,aAAA,EAAe,QAAA;AAAA,cACf,YAAA;AAAA,cACA,MAAA;AAAA,cACA,cAAA,EAAgB,SAAA;AAAA,cAChB,OAAA;AAAA,cACA,OAAA;AAAA,cACA,MAAA;AAAA,cACA,MAAA;AAAA,cACA,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,KAAK,SAAA,EACjC,QAAA,EAAA;AAAA,4BAAAJ,GAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACC,KAAA;AAAA,gBACA,QAAA;AAAA,gBACA,OAAA;AAAA,gBACA,SAAA;AAAA,gBACA,iBAAA,EAAmB,YAAA;AAAA,gBAElB,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YACC,sCACCA,GAAAA,CAAC,cAAW,YAAA,EAAc,SAAA,EAAW,qBAA0C,CAAA,GAC7E,IAAA;AAAA,4BACJA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,UAAA;AAAA,gBACA,SAAA;AAAA,gBACA,gBAAgB,IAAA,EAAM,cAAA;AAAA,gBACtB,YAAA,EAAc,CAAC,EAAE,IAAA,EAAM,eAAe,IAAA,EAAM,WAAA,CAAA;AAAA,gBAC5C,YAAY,iBAAA,CAAkB,MAAA,GAAS,IAAI,MAAM,OAAA,CAAQ,EAAE,CAAA,GAAI,MAAA;AAAA,gBAC/D,YAAY,iBAAA,CAAkB,MAAA,GAAS,IAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA;AAAA,gBAC9D,aAAa,IAAA,EAAM,WAAA;AAAA,gBACnB,aAAa,IAAA,EAAM,WAAA;AAAA,gBACnB,aAAa,YAAA,EAAc,KAAA;AAAA,gBAC3B,UAAU,YAAA,GAAe,MAAM,YAAA,CAAa,YAAA,CAAa,SAAS,CAAA,GAAI;AAAA;AAAA;AACxE,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;AAKA,SAAS,iBAAA,CAAkB,OAAsB,SAAA,EAA6C;AAC5F,EAAA,IAAI,SAAA,CAAU,SAAS,WAAA,EAAa;AAClC,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,mCAAA,EAAY,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,OAAA,EAAS;AAC9B,IAAA,MAAM,CAAA,GAAI,YAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,CAAE,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AAC/D,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAO,cAAA,EAAK,IAAA,EAAM,CAAA,GAAI,mBAAA,CAAoB,CAAC,CAAA,GAAI,SAAA,CAAU,OAAA,EAAS,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,UAAA,EAAY;AACjC,IAAA,MAAM,CAAA,GAAI,eAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA,CAAE,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA;AACxE,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAO,cAAA,EAAK,IAAA,EAAM,CAAA,GAAI,sBAAA,CAAuB,CAAC,CAAA,GAAI,SAAA,CAAU,UAAA,EAAY,CAAA;AAAA,EACtF;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAC7B,IAAA,MAAM,CAAA,GAAI,WAAW,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAE,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAC5D,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAO,cAAA,EAAK,IAAA,EAAM,CAAA,GAAI,kBAAA,CAAmB,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,EAC9E;AACA,EAAA,MAAM,KAAA,GACJ,SAAA,CAAU,IAAA,KAAS,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,IAAA,KAAS,MAAA,GAC7E,SAAA,CAAU,UAAA,GACV,IAAA;AACN,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA;AACjC,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EACd,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UAAG,qBAAA,CAAsB,IAAI,KAAK,CAAA;AAAA,UAAE;AAAA,SAAA,EAAE,CAAA;AAAA,wBACzEA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA;AAAA,UAAA,EAAA,CAAG,QAAQ,MAAA,IAAU,CAAA;AAAA,UAAE;AAAA,SAAA,EAAE;AAAA,OAAA,EAC7D,CAAA;AAAA,IAEJ;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,GAAA,CAAI,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAqC;AAC/D,EAAA,uBACEA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EACd,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,oBAC3CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAkB,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EACzC,CAAA;AAEJ;AAIA,SAAS,mBAAA,CACP,OACA,SAAA,EACsD;AACtD,EAAA,MAAM,IAAA,GACJ,SAAA,CAAU,IAAA,KAAS,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,IAAA,KAAS,MAAA,GAC7E,SAAA,CAAU,IAAA,GACV,MAAA;AACN,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,MAAM,CAAA,GAAI,YAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAC1D,IAAA,KAAA,GAAQ,CAAA,GAAI,mBAAA,CAAoB,CAAC,CAAA,GAAI,IAAA,CAAK,OAAA;AAAA,EAC5C,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,IAAA,MAAM,CAAA,GAAI,eAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AACnE,IAAA,KAAA,GAAQ,CAAA,GAAI,sBAAA,CAAuB,CAAC,CAAA,GAAI,IAAA,CAAK,UAAA;AAAA,EAC/C,CAAA,MAAO;AACL,IAAA,MAAM,CAAA,GAAI,WAAW,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACvD,IAAA,KAAA,GAAQ,CAAA,GAAI,kBAAA,CAAmB,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,EAC3C;AACA,EAAA,OAAO,EAAE,OAAO,SAAA,EAAW,UAAA,CAAW,gBAAgB,IAAI,CAAA,EAAG,WAAW,CAAA,EAAE;AAC5E;;;AC5WA,SAAS,IAAI,SAAA,EAAyE;AACpF,EAAA,OAAO,EAAE,GAAA,EAAK,kBAAA,CAAmB,SAAS,GAAG,SAAA,EAAU;AACzD;AAGO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,MAAM,QAAA,GAAA,CAAgC,MAAM,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,SAAS,UAAA,KAAe;AACvF,IAAA,MAAM,MAAA,GAAA,CAAU,QAAQ,MAAA,IAAU,IAAI,GAAA,CAAI,CAAC,OAAO,QAAA,KAA6B;AAC7E,MAAA,MAAMuB,UAAAA,GAA6B,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,QAAA,EAAS;AACzE,MAAA,OAAO;AAAA,QACL,GAAG,IAAIA,UAAS,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,IAAY,EAAA;AAAA,QAC3B,KAAA,EAAO,mBAAA,CAAoB,KAAA,EAAO,QAAQ,CAAA;AAAA,QAC1C,IAAA,EAAM,oBAAA,CAAqB,KAAA,EAAO,QAAQ;AAAA,OAC5C;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAM,SAAA,GAA6B,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAW;AACjE,IAAA,OAAO;AAAA,MACL,GAAG,IAAI,SAAS,CAAA;AAAA,MAChB,UAAA;AAAA,MACA,KAAA,EAAO,qBAAA,CAAsB,OAAA,EAAS,UAAU,CAAA;AAAA,MAChD,KAAA,EAAO,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AAAA,MAC1C,YAAY,MAAA,CAAO,MAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,UAA6B,KAAA,CAAM,MAAA,IAAU,EAAC,EACjD,GAAA,CAAI,CAAC,CAAA,KAAuB;AAC3B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACnC,IAAA,OAAO,EAAE,GAAG,GAAA,CAAI,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,mBAAA,CAAoB,CAAC,CAAA,EAAE;AAAA,EACpF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAErB,EAAA,MAAM,aAAgC,KAAA,CAAM,SAAA,IAAa,EAAC,EACvD,GAAA,CAAI,CAAC,CAAA,KAAuB;AAC3B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK;AACtC,IAAA,OAAO,EAAE,GAAG,GAAA,CAAI,EAAE,MAAM,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,sBAAA,CAAuB,CAAC,CAAA,EAAE;AAAA,EAC7F,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAErB,EAAA,MAAM,SAA4B,KAAA,CAAM,KAAA,IAAS,EAAC,EAC/C,GAAA,CAAI,CAAC,CAAA,KAAuB;AAC3B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAClC,IAAA,OAAO,EAAE,GAAG,GAAA,CAAI,EAAE,MAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,kBAAA,CAAmB,CAAC,CAAA,EAAE;AAAA,EACjF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAErB,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC1HA,IAAA,iBAAA,GAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;ACUA,IAAM,cAAA,GAAiB,IAAA;AAEhB,SAAS,mBAAA,CAAoB;AAAA,EAClC,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAQG;AACD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIrB,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,QAAA,GAAWK,OAA6C,IAAI,CAAA;AAElE,EAAAD,SAAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,IACrD,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AACA,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,EAAO;AACP,MAAA,KAAK,SAAA,EAAU;AACf,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACnD,IAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB,GAAG,cAAc,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,uBACEN,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA;AAAA,MACA,oBAAA,EAAoB,WAAA;AAAA,MACpB,mBAAiB,UAAA,IAAc,MAAA;AAAA,MAC/B,OAAA,EAAS,WAAA;AAAA,MACT,YAAA,EAAY,UAAA,GAAa,CAAA,0CAAA,EAAU,KAAK,CAAA,CAAA,GAAK,KAAA;AAAA,MAC7C,KAAA,EAAO,aAAa,0FAAA,GAAuB,KAAA;AAAA,MAC3C,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,UAAA,IAAc,eAAe,CAAA;AAAA,MAEvD,uCACCA,GAAAA,CAACa,KAAAA,EAAA,EAAM,WAAU,YAAA,EAAa,WAAA,EAAa,GAAA,EAAK,CAAA,mBAEhDb,GAAAA,CAACwB,MAAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK;AAAA;AAAA,GAErD;AAEJ","file":"index.js","sourcesContent":["/**\n * Studio 页的选中状态。\n * 剧集编辑是\"一集一页\":episode 选中打开集页、scene 选中打开同集并滚到对应场。\n */\n/**\n * Studio 主工作区视图:\n * - script 剧本写作(默认)\n * - review 审片:分镜 / Prompt / 视频对照表\n * - files 项目文件浏览器(不依赖剧集,由 StudioHeader 上的\"文件\"按钮切换)\n *\n * 历史上还有 storyboard / assets / prompt / video 等独立 tab,已合入 review。\n */\nexport type EpisodeWorkspaceView = \"script\" | \"review\" | \"files\";\n\n/**\n * 跨页跳转的来源标记。点击资产详情底部的\"出现在 X 处\"跳到 scene 时带上,\n * 让目标页可以渲染\"返回 XX\"入口并把用户送回原资产。\n */\nexport type StudioSelectionFrom =\n | { kind: \"actor\"; actorId: string }\n | { kind: \"location\"; locationId: string }\n | { kind: \"prop\"; propId: string };\n\n/**\n * selection 变化的驱动源。在 ScriptStream 中用于区分\"该不该触发滚动\":\n * - 'scroll' 来自滚动 spy(视口里出现新 item 自动上抛),收到时 ScriptStream 不再调 scrollToIndex\n * - 'sidebar' / 'diff' / 'reference' / 'chat' / 'init' / 'episode-toggle'\n * 来自人为/外部驱动,需要 ScriptStream 主动滚到目标 item\n *\n * 不打 origin 时按 'sidebar' 等价处理(保守滚动)。\n */\nexport type StudioSelectionOrigin =\n | \"sidebar\"\n | \"scroll\"\n | \"reference\"\n | \"diff\"\n | \"search\"\n | \"chat\"\n | \"init\"\n | \"episode-toggle\";\n\nexport function buildSelectionFrom(\n kind: StudioSelectionFrom[\"kind\"],\n id: string,\n): StudioSelectionFrom | undefined {\n if (!id) return undefined;\n if (kind === \"actor\") return { kind: \"actor\", actorId: id };\n if (kind === \"location\") return { kind: \"location\", locationId: id };\n return { kind: \"prop\", propId: id };\n}\n\nexport function fromToSelection(from: StudioSelectionFrom): StudioSelection {\n if (from.kind === \"actor\") return { kind: \"actor\", actorId: from.actorId };\n if (from.kind === \"location\") return { kind: \"location\", locationId: from.locationId };\n return { kind: \"prop\", propId: from.propId };\n}\n\n/** 公共字段:所有 selection variant 都可携带(origin 防双向联动死循环;from 资产回链)。 */\ntype SelectionMeta = {\n origin?: StudioSelectionOrigin;\n};\ntype SelectionMetaWithFrom = SelectionMeta & {\n from?: StudioSelectionFrom;\n};\n\nexport type StudioSelection =\n | (SelectionMeta & { kind: \"empty\" })\n | (SelectionMeta & { kind: \"worldview\" })\n | (SelectionMetaWithFrom & { kind: \"episode\"; episodeIdx: number })\n | (SelectionMetaWithFrom & {\n kind: \"scene\";\n episodeIdx: number;\n sceneIdx: number;\n })\n | (SelectionMetaWithFrom & {\n kind: \"clip\";\n episodeIdx: number;\n sceneIdx?: number;\n sceneId: string;\n clipId: string;\n })\n | (SelectionMeta & { kind: \"actor\"; actorId: string })\n | (SelectionMeta & { kind: \"location\"; locationId: string })\n | (SelectionMeta & { kind: \"prop\"; propId: string });\n\nexport const EMPTY_SELECTION: StudioSelection = { kind: \"empty\" };\n\n/** 把 selection 复制一份并打上 origin 标记。 */\nexport function withOrigin<T extends StudioSelection>(\n sel: T,\n origin: StudioSelectionOrigin,\n): T {\n return { ...sel, origin };\n}\n\n/**\n * 一个 selection「目标」的稳定字符串 key(忽略 origin / from)。既用于 scroll 同步\n * 去重,也是 isSameSelectionTarget 的唯一判定依据 —— 两者不再各写一套。\n */\nexport function selectionTargetKey(s: StudioSelection): string {\n switch (s.kind) {\n case \"scene\":\n return `scene:${s.episodeIdx}:${s.sceneIdx}`;\n case \"episode\":\n return `episode:${s.episodeIdx}`;\n case \"clip\":\n return `clip:${s.episodeIdx}:${s.sceneId}:${s.clipId}`;\n case \"actor\":\n return `actor:${s.actorId}`;\n case \"location\":\n return `location:${s.locationId}`;\n case \"prop\":\n return `prop:${s.propId}`;\n case \"worldview\":\n return \"worldview\";\n default:\n return \"empty\";\n }\n}\n\n/** 判定两个 selection 是否指向同一个目标(忽略 origin / from)。 */\nexport function isSameSelectionTarget(\n a: StudioSelection,\n b: StudioSelection,\n): boolean {\n return selectionTargetKey(a) === selectionTargetKey(b);\n}\n\nexport function isSceneSelected(\n selection: StudioSelection,\n episodeIdx: number,\n sceneIdx: number,\n): boolean {\n return (\n selection.kind === \"scene\" &&\n selection.episodeIdx === episodeIdx &&\n selection.sceneIdx === sceneIdx\n );\n}\n\nexport function isClipSelected(\n selection: StudioSelection,\n episodeIdx: number,\n sceneId: string,\n clipId: string,\n): boolean {\n return (\n selection.kind === \"clip\" &&\n selection.episodeIdx === episodeIdx &&\n selection.sceneId === sceneId &&\n selection.clipId === clipId\n );\n}\n\nexport function getSelectionEpisodeIdx(selection: StudioSelection): number | null {\n if (selection.kind === \"episode\") return selection.episodeIdx;\n if (selection.kind === \"scene\") return selection.episodeIdx;\n if (selection.kind === \"clip\") return selection.episodeIdx;\n return null;\n}\n\n/** 该剧集当前是否处于\"打开\"状态(集页或集内某场被选中)。 */\nexport function isEpisodeOpen(\n selection: StudioSelection,\n episodeIdx: number,\n): boolean {\n if (selection.kind === \"episode\") return selection.episodeIdx === episodeIdx;\n if (selection.kind === \"scene\") return selection.episodeIdx === episodeIdx;\n if (selection.kind === \"clip\") return selection.episodeIdx === episodeIdx;\n return false;\n}\n","export enum ScriptContentType {\n Action = \"action\",\n Dialogue = \"dialogue\",\n Narration = \"narration\",\n InnerThought = \"inner_thought\",\n}\n\nexport interface SceneEnvironment {\n space?: \"exterior\" | \"interior\" | string;\n time?: \"day\" | \"night\" | \"dawn\" | \"dusk\" | string;\n}\n\nexport interface ScriptItem {\n type?: ScriptContentType | string;\n content?: string;\n actor_id?: string;\n speaker_id?: string;\n speakers?: Array<{ speaker_id?: string }>;\n delivery?: \"single\" | \"simultaneous\" | \"overlap\" | \"group\" | string;\n lines?: Array<{ speaker_id?: string; content?: string }>;\n emotion?: string;\n state_changes?: StateChange[];\n transition_prompt?: TransitionPrompt;\n}\n\nexport interface AssetState {\n state_id?: string;\n state_name?: string;\n name?: string;\n description?: string;\n}\n\nexport type ScriptTargetKind = \"actor\" | \"location\" | \"prop\";\n\nexport interface StateChange {\n target_kind?: ScriptTargetKind | string;\n target_id?: string;\n from_state_id?: string | null;\n to_state_id?: string | null;\n effective_from?: \"before_action\" | \"after_action\" | string;\n}\n\nexport interface TransitionPrompt {\n target_kind?: ScriptTargetKind | string;\n target_id?: string;\n process?: string;\n contrast?: string;\n}\n\nexport interface SceneContext {\n actors?: Array<{ actor_id?: string; state_id?: string | null }>;\n locations?: Array<{ location_id?: string; state_id?: string | null }>;\n props?: Array<{ prop_id?: string; state_id?: string | null }>;\n}\n\nexport interface Scene {\n scene_id?: string;\n environment?: SceneEnvironment;\n location_ids?: string[];\n context?: SceneContext;\n actors?: Array<{ actor_id?: string; state_id?: string | null }>;\n locations?: Array<{ location_id?: string; state_id?: string | null }>;\n props?: Array<{ prop_id?: string; state_id?: string | null }>;\n actions?: ScriptItem[];\n}\n\nexport interface ScriptActor {\n actor_id?: string;\n actor_name?: string;\n name?: string;\n description?: string;\n states?: AssetState[];\n}\n\nexport interface ScriptLocation {\n location_id?: string;\n location_name?: string;\n name?: string;\n description?: string;\n states?: AssetState[];\n}\n\nexport interface ScriptProp {\n prop_id?: string;\n prop_name?: string;\n name?: string;\n description?: string;\n states?: AssetState[];\n}\n\nexport interface ScriptEpisode {\n episode_id?: string;\n title?: string | null;\n scenes?: Scene[];\n}\n\nexport interface ScriptSpeaker {\n speaker_id?: string;\n display_name?: string;\n source_kind?: \"actor\" | \"location\" | \"prop\" | \"system\" | \"broadcast\" | \"group\" | \"other\" | string;\n source_id?: string | null;\n voice_desc?: string;\n}\n\nexport interface ScriptProject {\n version?: number | string;\n title?: string;\n worldview?: string;\n worldview_raw?: string;\n style?: string;\n actors?: ScriptActor[];\n locations?: ScriptLocation[];\n props?: ScriptProp[];\n speakers?: ScriptSpeaker[];\n episodes?: ScriptEpisode[];\n}\n\nexport type ScriptData = ScriptProject;\n","// script.json 里的 emotion 实际上是自由文本标签,不是固定枚举。\n// 这里保留一个高频标签翻译表,未命中时回退原文。\nconst EMOTION_LABELS: Record<string, string> = {\n \"v.o.\": \"画外音\",\n absorbed: \"专注投入\",\n accusing: \"指责\",\n aggressive: \"咄咄逼人\",\n agonized: \"痛苦\",\n alarmed: \"警觉\",\n alert: \"警惕\",\n amused: \"玩味\",\n analytical: \"冷静分析\",\n anguished: \"悲痛\",\n appalled: \"骇然\",\n authoritative: \"权威\",\n awed: \"敬畏\",\n awestruck: \"震撼\",\n \"battle-ready\": \"临战\",\n begging: \"哀求\",\n bewildered: \"茫然\",\n bitter: \"怨恨\",\n boastful: \"得意\",\n broken: \"崩溃\",\n brutal: \"凶狠\",\n calculating: \"算计\",\n calm: \"冷静\",\n casual: \"随意\",\n cautious: \"谨慎\",\n chanting: \"齐声高呼\",\n choking: \"哽咽\",\n chuckling: \"低笑\",\n cold: \"冷淡\",\n commanding: \"命令式\",\n confident: \"自信\",\n confused: \"困惑\",\n contemptuous: \"轻蔑\",\n crazed: \"癫狂\",\n cruel: \"残酷\",\n crying: \"哭泣\",\n \"crying out\": \"失声喊叫\",\n \"crying softly\": \"轻声啜泣\",\n curious: \"好奇\",\n \"darkly amused\": \"阴冷玩味\",\n deadly: \"致命狠厉\",\n decisive: \"果决\",\n deductive: \"推理式\",\n defeated: \"挫败\",\n defensive: \"戒备\",\n defiant: \"不服输\",\n deliberate: \"沉着\",\n desperate: \"绝望\",\n determined: \"坚定\",\n disbelief: \"难以置信\",\n disbelieving: \"不敢相信\",\n disgusted: \"厌恶\",\n dismissive: \"不屑\",\n disturbed: \"不安\",\n drowsy: \"困倦\",\n ecstatic: \"狂喜\",\n enraged: \"暴怒\",\n excited: \"激动\",\n exhausted: \"疲惫\",\n fierce: \"凌厉\",\n firm: \"坚决\",\n flashback: \"回忆中\",\n focused: \"专注\",\n frantic: \"慌乱\",\n frightened: \"惊惧\",\n furious: \"愤怒\",\n gasping: \"喘息\",\n gleeful: \"得意洋洋\",\n grandstanding: \"作秀式\",\n grave: \"凝重\",\n grim: \"冷峻\",\n grinning: \"咧嘴而笑\",\n hoarse: \"沙哑\",\n hopeful: \"怀有希望\",\n hopeless: \"绝望无助\",\n horrified: \"惊骇\",\n hysterical: \"歇斯底里\",\n \"ice-cold\": \"冰冷\",\n iconic: \"标志性姿态\",\n incredulous: \"难以置信\",\n inspired: \"受到鼓舞\",\n intense: \"强烈\",\n lazy: \"懒散\",\n low: \"低声\",\n maniacal: \"疯狂\",\n manic: \"癫狂亢奋\",\n measured: \"克制\",\n menacing: \"阴狠\",\n merciless: \"毫不留情\",\n mocking: \"嘲讽\",\n murderous: \"杀气腾腾\",\n nervous: \"紧张\",\n ominous: \"不祥\",\n outraged: \"愤慨\",\n panicked: \"惊慌\",\n piercing: \"尖锐\",\n pleading: \"恳求\",\n pleased: \"满意\",\n precise: \"精准克制\",\n predatory: \"猎食者般\",\n probing: \"试探\",\n protective: \"保护欲强\",\n quiet: \"轻声\",\n realizing: \"恍然意识到\",\n \"recorded video\": \"录像中\",\n relieved: \"如释重负\",\n resolute: \"决然\",\n respectful: \"恭敬\",\n roaring: \"怒吼\",\n savage: \"凶残\",\n savoring: \"回味般\",\n scheming: \"算计\",\n screaming: \"尖叫\",\n seething: \"怒火翻涌\",\n serious: \"严肃\",\n shaking: \"发抖\",\n sharp: \"凌厉\",\n shocked: \"震惊\",\n shouting: \"大喊\",\n shoving: \"推搡中\",\n shrieking: \"尖声惊叫\",\n smiling: \"微笑\",\n smirking: \"冷笑\",\n smug: \"自鸣得意\",\n sobbing: \"抽泣\",\n \"sobbing uncontrollably\": \"泣不成声\",\n spiteful: \"恶意\",\n steady: \"沉稳\",\n steely: \"冷硬\",\n strained: \"紧绷\",\n stunned: \"怔住\",\n suffocating: \"窒息般\",\n suspicious: \"怀疑\",\n taunting: \"挑衅\",\n tense: \"紧绷\",\n terrified: \"惊恐\",\n threatening: \"威胁\",\n thrilled: \"兴奋不已\",\n thunderous: \"如雷般\",\n trembling: \"发颤\",\n triumphant: \"得胜\",\n \"to himself\": \"自言自语\",\n \"turning to mia\": \"转向 Mia\",\n uneasy: \"不安\",\n unflinching: \"毫不退缩\",\n unhinged: \"失控\",\n urgent: \"急切\",\n venomous: \"恶毒\",\n vicious: \"凶狠\",\n \"video recording\": \"视频记录中\",\n vindicated: \"扬眉吐气\",\n voiceover: \"旁白\",\n weak: \"虚弱\",\n whisper: \"低声\",\n whispering: \"耳语\",\n worried: \"担忧\",\n};\n\nexport function translateEmotionLabel(emotion?: string) {\n const normalized = emotion?.trim().toLowerCase();\n if (!normalized) return \"\";\n if (EMOTION_LABELS[normalized]) {\n return EMOTION_LABELS[normalized];\n }\n\n if (normalized.includes(\",\")) {\n return normalized\n .split(\",\")\n .map((part) => {\n const token = part.trim();\n return EMOTION_LABELS[token] || part.trim();\n })\n .join(\",\");\n }\n\n return emotion!.trim();\n}\n","import {\n ScriptContentType,\n type AssetState,\n type Scene,\n type ScriptActor,\n type ScriptEpisode,\n type ScriptItem,\n type ScriptLocation,\n type ScriptProp,\n type ScriptProject,\n type ScriptSpeaker,\n} from \"./types\";\nimport { translateEmotionLabel } from \"./emotion-labels\";\n\nexport { translateEmotionLabel };\n\nfunction normalizeId(value?: string | null) {\n return value?.trim() || \"\";\n}\n\nexport function getActorMap(actors: ScriptActor[] = []) {\n return new Map(actors.map((actor) => [normalizeId(actor.actor_id), actor]));\n}\n\nexport function getLocationMap(locations: ScriptLocation[] = []) {\n return new Map(locations.map((location) => [normalizeId(location.location_id), location]));\n}\n\nexport function getPropMap(props: ScriptProp[] = []) {\n return new Map(props.map((prop) => [normalizeId(prop.prop_id), prop]));\n}\n\nexport function getSpeakerMap(speakers: ScriptSpeaker[] = []) {\n return new Map(speakers.map((speaker) => [normalizeId(speaker.speaker_id), speaker]));\n}\n\nexport function getActorDisplayName(actor?: ScriptActor) {\n return actor?.actor_name?.trim() || actor?.name?.trim() || \"未命名角色\";\n}\n\nexport function getLocationDisplayName(location?: ScriptLocation) {\n return location?.location_name?.trim() || location?.name?.trim() || \"未命名场景\";\n}\n\nexport function getPropDisplayName(prop?: ScriptProp) {\n return prop?.prop_name?.trim() || prop?.name?.trim() || \"未命名道具\";\n}\n\nexport function getStateDisplayName(state?: AssetState) {\n return state?.state_name?.trim() || state?.name?.trim() || state?.state_id?.trim() || \"\";\n}\n\n/**\n * Reconcile the dual context storage. The refs live in BOTH scene.context.*\n * and the legacy mirror scene.* — prefer whichever has entries so an EMPTY\n * `context.actors: []` (e.g. from a partial upstream payload) does NOT shadow a\n * populated mirror (which would silently drop the scene's cast/props).\n */\nexport function getSceneContext(scene: Scene) {\n return {\n actors: (scene.context?.actors?.length ? scene.context.actors : scene.actors) ?? [],\n locations: (scene.context?.locations?.length ? scene.context.locations : scene.locations) ?? [],\n props: (scene.context?.props?.length ? scene.context.props : scene.props) ?? [],\n };\n}\n\nexport function findState(states: AssetState[] | undefined, stateId: string | null | undefined): AssetState | undefined {\n const id = stateId?.trim();\n if (!id || !states) return undefined;\n return states.find((state) => (state.state_id || \"\").trim() === id);\n}\n\nconst ZH_DIGIT_MAP: Record<string, number> = {\n \"零\": 0, \"〇\": 0, \"一\": 1, \"二\": 2, \"两\": 2, \"三\": 3, \"四\": 4,\n \"五\": 5, \"六\": 6, \"七\": 7, \"八\": 8, \"九\": 9,\n};\n\nfunction normalizeFullwidthDigits(value: string) {\n let result = \"\";\n for (const char of value) {\n const code = char.charCodeAt(0);\n result += code >= 0xFF10 && code <= 0xFF19 ? String.fromCharCode(code - 0xFF10 + 48) : char;\n }\n return result;\n}\n\nfunction parseChineseNumeral(value: string): number | null {\n const text = value.trim();\n if (!text) return null;\n if (text === \"十\") return 10;\n if (text.startsWith(\"十\")) return 10 + (ZH_DIGIT_MAP[text.slice(1)] ?? 0);\n if (text.endsWith(\"十\")) return (ZH_DIGIT_MAP[text.slice(0, -1)] ?? 0) * 10;\n if (text.includes(\"百\")) {\n const [left, right] = text.split(\"百\");\n const leftValue = ZH_DIGIT_MAP[left] ?? 0;\n return leftValue * 100 + (parseChineseNumeral(right) ?? 0);\n }\n if (text.includes(\"十\")) {\n const [left, right] = text.split(\"十\");\n return (ZH_DIGIT_MAP[left] ?? 0) * 10 + (right ? (ZH_DIGIT_MAP[right] ?? 0) : 0);\n }\n return ZH_DIGIT_MAP[text] ?? null;\n}\n\nfunction parseEpisodeMarker(rawDigits: string): number | null {\n const normalized = normalizeFullwidthDigits(rawDigits.trim());\n if (!normalized) return null;\n if (/^\\d+$/.test(normalized)) {\n const parsed = Number(normalized);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n }\n const chinese = parseChineseNumeral(normalized);\n return chinese && chinese > 0 ? chinese : null;\n}\n\nconst EPISODE_DIGIT_CHARS = \"0-90-9一二三四五六七八九十百千零〇两\";\nconst EPISODE_MARKER_RE = new RegExp(\n `(?:第\\\\s*([${EPISODE_DIGIT_CHARS}]+)\\\\s*集|(?:ep|episode)[_\\\\-#:. ]*([${EPISODE_DIGIT_CHARS}]+))`,\n \"i\",\n);\n\nexport function getEpisodeNumber(episode: ScriptEpisode, index: number) {\n const candidates = [episode.episode_id, episode.title];\n for (const candidate of candidates) {\n const value = candidate?.trim();\n if (!value) continue;\n const marker = value.match(EPISODE_MARKER_RE);\n if (marker) {\n const parsed = parseEpisodeMarker(marker[1] || marker[2] || \"\");\n if (parsed) return parsed;\n }\n const digitsOnly = normalizeFullwidthDigits(value);\n const plain = digitsOnly.match(/\\d+/);\n if (plain) {\n const parsed = Number(plain[0]);\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n }\n }\n return index + 1;\n}\n\nexport function getEpisodeNumberLabel(episode: ScriptEpisode, index: number) {\n return String(getEpisodeNumber(episode, index)).padStart(2, \"0\");\n}\n\nexport function getEpisodeTitle(episode: ScriptEpisode, index: number) {\n const fallback = `第 ${getEpisodeNumberLabel(episode, index)} 集`;\n const title = episode.title?.trim();\n if (title) return title;\n // only surface a human-looking episode_id; never the internal \"ep_xxx\" id\n const id = episode.episode_id?.trim();\n if (id && !/^ep_/i.test(id)) return id;\n return fallback;\n}\n\n/**\n * The scene's display number. Prefers the trailing digits of scene_id (the\n * stable, never-renumbered id assets are keyed by — e.g. \"scn_007\" → 7) and\n * falls back to the 1-based position. ONE definition so every surface (scene\n * header / TOC / reference grid / distribution) shows the same number.\n */\nexport function getSceneNumber(scene: Scene | undefined, sceneIndex: number): number {\n const m = scene?.scene_id?.trim().match(/(\\d+)$/);\n if (m) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n > 0) return n;\n }\n return sceneIndex + 1;\n}\n\nexport function getSceneNumberLabel(scene: Scene | undefined, sceneIndex: number) {\n return `场 ${getSceneNumber(scene, sceneIndex)}`;\n}\n\nexport function getSceneSidebarLabel(scene: Scene, sceneIndex: number) {\n const sceneId = scene.scene_id?.trim() || String(sceneIndex + 1);\n const space = scene.environment?.space === \"exterior\" ? \"外\" : \"内\";\n const timeKey = scene.environment?.time || \"day\";\n const timeMap: Record<string, string> = { day: \"日\", night: \"夜\", dawn: \"晨\", dusk: \"昏\" };\n const time = timeMap[timeKey] || timeKey;\n return `${sceneId} · ${time}${space}`;\n}\n\nexport function isActorBearingContentType(type?: string) {\n return type === ScriptContentType.Dialogue || type === ScriptContentType.InnerThought;\n}\n\nexport function getSpeakerDisplayName(\n speakerId: string | undefined,\n speakerMap: Map<string, ScriptSpeaker> = new Map(),\n actorMap: Map<string, ScriptActor> = new Map(),\n) {\n const id = normalizeId(speakerId);\n if (!id) return \"\";\n const speaker = speakerMap.get(id);\n if (speaker?.display_name?.trim()) return speaker.display_name.trim();\n const sourceKind = speaker?.source_kind?.trim();\n const sourceId = normalizeId(speaker?.source_id);\n if (sourceKind === \"actor\" && sourceId) {\n return getActorDisplayName(actorMap.get(sourceId)) || sourceId;\n }\n const actorId = id.startsWith(\"spk_\") ? id.slice(4) : \"\";\n if (actorId && actorMap.has(actorId)) return getActorDisplayName(actorMap.get(actorId));\n return id;\n}\n\nexport function getDialogueSpeakerLabel(\n item: ScriptItem,\n actorMap: Map<string, ScriptActor>,\n speakerMap: Map<string, ScriptSpeaker> = new Map(),\n) {\n if (item.delivery === \"overlap\" && Array.isArray(item.lines) && item.lines.length > 0) {\n return item.lines\n .map((line) => getSpeakerDisplayName(line.speaker_id, speakerMap, actorMap))\n .filter(Boolean)\n .join(\" / \");\n }\n const speakerIds = Array.isArray(item.speakers)\n ? item.speakers.map((speaker) => normalizeId(speaker.speaker_id)).filter(Boolean)\n : [];\n if (speakerIds.length > 0) {\n return speakerIds.map((speakerId) => getSpeakerDisplayName(speakerId, speakerMap, actorMap)).join(\" / \");\n }\n if (item.speaker_id) return getSpeakerDisplayName(item.speaker_id, speakerMap, actorMap);\n const actorId = normalizeId(item.actor_id);\n const actor = actorMap.get(actorId);\n return actor ? getActorDisplayName(actor) : actorId || \"未知角色\";\n}\n\nexport function getDialogueDeliveryLabel(delivery?: string) {\n if (delivery === \"simultaneous\") return \"同时\";\n if (delivery === \"overlap\") return \"重叠\";\n if (delivery === \"group\") return \"群体\";\n return \"\";\n}\n","/** Tiny classnames joiner (no dependency). Falsy entries are dropped. */\nexport function cn(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(\" \");\n}\n","/**\n * StudioToc — left navigation, reproducing agent-frontend's flat TOC:\n * 剧集 (episodes → scenes, level 2) ·\n * 角色 / 场景 / 道具 (entity groups, level 1)\n * (世界观 & 风格 moved to a top-bar button + dialog — no longer a TOC row.)\n * Group headers are 12.5px semibold foreground (NOT uppercase gray). Selecting\n * a row emits a StudioSelection (origin \"sidebar\").\n */\nimport { useState } from \"react\";\nimport {\n BookText,\n ChevronRight,\n FileText,\n MapPin,\n Package,\n Plus,\n Trash2,\n Users,\n type LucideIcon,\n} from \"lucide-react\";\nimport type { ScriptProject } from \"../types.js\";\nimport {\n getActorDisplayName,\n getEpisodeNumberLabel,\n getEpisodeTitle,\n getLocationDisplayName,\n getPropDisplayName,\n getSceneNumberLabel,\n getSceneSidebarLabel,\n} from \"../utils.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { withOrigin } from \"../selection.js\";\nimport { cn } from \"../cn.js\";\n\nfunction GroupHeader({\n icon: Icon,\n label,\n count,\n open,\n highlighted,\n onToggle,\n}: {\n icon: LucideIcon;\n label: string;\n count?: number;\n open?: boolean;\n highlighted?: boolean;\n onToggle?: () => void;\n}) {\n const inner = (\n <>\n {onToggle ? (\n <ChevronRight\n className={cn(\"lj-se-gh-chev\", open && \"is-open\")}\n strokeWidth={2}\n />\n ) : null}\n <Icon className=\"lj-se-gh-icon\" strokeWidth={1.5} />\n <span className=\"lj-se-gh-label\">{label}</span>\n {count != null ? <span className=\"lj-se-gh-count\">{count}</span> : null}\n </>\n );\n return onToggle ? (\n <button type=\"button\" className={cn(\"lj-se-gh\", highlighted && \"is-hl\")} onClick={onToggle}>\n {inner}\n </button>\n ) : (\n <div className={cn(\"lj-se-gh\", highlighted && \"is-hl\")}>{inner}</div>\n );\n}\n\nexport function StudioToc({\n data,\n selection,\n onSelect,\n onAddEpisode,\n}: {\n data: ScriptProject;\n selection: StudioSelection;\n onSelect: (selection: StudioSelection) => void;\n onAddEpisode?: () => void;\n}) {\n const episodes = data.episodes ?? [];\n const [episodesOpen, setEpisodesOpen] = useState(true);\n const [openEpisodes, setOpenEpisodes] = useState<Set<number>>(() => {\n const init = new Set<number>();\n if (selection.kind === \"scene\" || selection.kind === \"episode\") init.add(selection.episodeIdx);\n else init.add(0);\n return init;\n });\n const toggleEp = (i: number) =>\n setOpenEpisodes((prev) => {\n const next = new Set(prev);\n next.has(i) ? next.delete(i) : next.add(i);\n return next;\n });\n const pick = (sel: StudioSelection) => onSelect(withOrigin(sel, \"sidebar\"));\n\n const epHighlighted = selection.kind === \"episode\" || selection.kind === \"scene\" || selection.kind === \"clip\";\n\n return (\n <nav className=\"lj-se-toc\">\n {/* 世界观 & 风格 现已移至顶栏按钮 + 弹窗,不再作为目录项。 */}\n {/* 剧集 */}\n <GroupHeader\n icon={BookText}\n label=\"剧集\"\n count={episodes.length}\n open={episodesOpen}\n highlighted={epHighlighted}\n onToggle={() => setEpisodesOpen((v) => !v)}\n />\n {episodesOpen ? (\n episodes.length === 0 ? (\n <div className=\"lj-se-toc-empty\">尚无剧集</div>\n ) : (\n episodes.map((episode, ei) => {\n const scenes = episode.scenes ?? [];\n const epOpen = openEpisodes.has(ei);\n const epActive = selection.kind === \"episode\" && selection.episodeIdx === ei;\n return (\n <div key={`ep-${ei}`}>\n <div className={cn(\"lj-se-eprow\", epActive && \"is-active\")}>\n <button type=\"button\" className=\"lj-se-eprow-chev\" onClick={() => toggleEp(ei)} aria-label=\"展开/收起\">\n <ChevronRight className={cn(\"lj-se-ic-3\", epOpen && \"is-open\")} strokeWidth={2} />\n </button>\n <button type=\"button\" className=\"lj-se-eprow-main\" onClick={() => pick({ kind: \"episode\", episodeIdx: ei })}>\n <FileText className=\"lj-se-ic-3 lj-se-eprow-glyph\" strokeWidth={1.5} />\n <span className=\"lj-se-eprow-num\">{getEpisodeNumberLabel(episode, ei)}</span>\n <span className=\"lj-se-eprow-title\">{getEpisodeTitle(episode, ei)}</span>\n <span className=\"lj-se-eprow-count\">{scenes.length} 场</span>\n </button>\n </div>\n {epOpen\n ? scenes.map((scene, si) => {\n const active =\n selection.kind === \"scene\" && selection.episodeIdx === ei && selection.sceneIdx === si;\n return (\n <button\n key={`sc-${si}`}\n type=\"button\"\n className={cn(\"lj-se-tocitem lj-se-toc-l2\", active && \"is-active\")}\n onClick={() => pick({ kind: \"scene\", episodeIdx: ei, sceneIdx: si })}\n >\n <span className=\"lj-se-toc-dot\">·</span>\n <span className=\"lj-se-tocitem-label\">{getSceneNumberLabel(scene, si)}</span>\n <span className=\"lj-se-tocitem-meta\">{getSceneSidebarLabel(scene, si)}</span>\n </button>\n );\n })\n : null}\n </div>\n );\n })\n )\n ) : null}\n {episodesOpen && onAddEpisode ? (\n <button type=\"button\" className=\"lj-se-toc-addep\" onClick={onAddEpisode}>\n <Plus className=\"lj-se-ic-3\" strokeWidth={2} /> 新增一集\n </button>\n ) : null}\n\n <EntityGroup\n icon={Users}\n label=\"角色\"\n emptyText=\"尚无角色\"\n items={(data.actors ?? []).map((a) => ({ id: (a.actor_id ?? \"\").trim(), name: getActorDisplayName(a) }))}\n highlighted={selection.kind === \"actor\"}\n isActive={(id) => selection.kind === \"actor\" && selection.actorId === id}\n onPick={(id) => pick({ kind: \"actor\", actorId: id })}\n />\n <EntityGroup\n icon={MapPin}\n label=\"场景\"\n emptyText=\"尚无场景\"\n items={(data.locations ?? []).map((l) => ({ id: (l.location_id ?? \"\").trim(), name: getLocationDisplayName(l) }))}\n highlighted={selection.kind === \"location\"}\n isActive={(id) => selection.kind === \"location\" && selection.locationId === id}\n onPick={(id) => pick({ kind: \"location\", locationId: id })}\n />\n <EntityGroup\n icon={Package}\n label=\"道具\"\n emptyText=\"尚无道具\"\n items={(data.props ?? []).map((p) => ({ id: (p.prop_id ?? \"\").trim(), name: getPropDisplayName(p) }))}\n highlighted={selection.kind === \"prop\"}\n isActive={(id) => selection.kind === \"prop\" && selection.propId === id}\n onPick={(id) => pick({ kind: \"prop\", propId: id })}\n />\n </nav>\n );\n}\n\nfunction EntityGroup({\n icon: Icon,\n label,\n emptyText,\n items,\n highlighted,\n isActive,\n onPick,\n}: {\n icon: LucideIcon;\n label: string;\n emptyText: string;\n items: Array<{ id: string; name: string }>;\n highlighted: boolean;\n isActive: (id: string) => boolean;\n onPick: (id: string) => void;\n}) {\n const [open, setOpen] = useState(true);\n const valid = items.filter((i) => i.id);\n return (\n <>\n <GroupHeader icon={Icon} label={label} count={valid.length} open={open} highlighted={highlighted} onToggle={() => setOpen((v) => !v)} />\n {open\n ? valid.length === 0\n ? <div className=\"lj-se-toc-empty\">{emptyText}</div>\n : valid.map((i) => (\n <button\n key={i.id}\n type=\"button\"\n className={cn(\"lj-se-tocitem lj-se-toc-l1\", isActive(i.id) && \"is-active\")}\n onClick={() => onPick(i.id)}\n >\n <Icon className=\"lj-se-tocitem-icon lj-se-ic-3\" strokeWidth={1.5} />\n <span className=\"lj-se-tocitem-label\">{i.name}</span>\n </button>\n ))\n : null}\n </>\n );\n}\n","import { createContext, useContext, type ReactElement, type ReactNode } from \"react\";\n\nexport const HighlightContext = createContext<string>(\"\");\n\nexport function HighlightedText({ text }: { text: string }): ReactElement {\n const highlight = useContext(HighlightContext);\n return <>{renderHighlightedText(text, highlight)}</>;\n}\n\nexport function renderHighlightedText(value: string, query: string): ReactNode {\n const needle = query.trim();\n if (!needle) return value;\n const lowerValue = value.toLocaleLowerCase();\n const lowerNeedle = needle.toLocaleLowerCase();\n const out: ReactNode[] = [];\n let from = 0;\n let hit = lowerValue.indexOf(lowerNeedle);\n while (hit >= 0) {\n if (hit > from) out.push(value.slice(from, hit));\n out.push(\n <mark key={`${hit}-${out.length}`} className=\"lj-se-search-hit\">\n {value.slice(hit, hit + needle.length)}\n </mark>,\n );\n from = hit + needle.length;\n hit = lowerValue.indexOf(lowerNeedle, from);\n }\n if (from < value.length) out.push(value.slice(from));\n return out.length > 0 ? out : value;\n}\n","/**\n * EditableText — the \"editor feel\" primitive.\n *\n * Default (display) mode renders the value as PLAIN TEXT (a <span>), so the\n * browser's native text selection spans across adjacent blocks → you can select\n * and copy text across multiple lines. Only on a plain click (not a drag-select)\n * does the block become a focused <textarea>/<input>, with the caret dropped at\n * the click point. While typing, the draft is pushed up via a debounced live\n * commit (so the host's autosave starts ticking without waiting for blur);\n * blur / Enter (single-line) / Cmd-Enter (multiline) flush immediately. Esc\n * reverts. `autoEdit` starts in edit mode (freshly inserted rows).\n *\n * This replaces agent-frontend's always-rendered textarea (which blocked\n * cross-block selection).\n */\nimport { createContext, useContext, useEffect, useLayoutEffect, useRef, useState, type ReactElement } from \"react\";\nimport { HighlightContext, renderHighlightedText } from \"./highlighted-text.js\";\n\n/**\n * Lets the editor signal \"an editor is open\" WITHOUT the host sniffing internal\n * CSS class names. ScriptEditor provides it and ref-counts active editors;\n * every EditableText inc/decrements while in edit mode. Null (no provider) →\n * no-op, so the primitive still works standalone.\n */\nexport interface EditingSignal {\n inc: () => void;\n dec: () => void;\n}\nexport const EditingSignalContext = createContext<EditingSignal | null>(null);\n\n/** debounce window for pushing the in-progress draft up while still editing —\n * long enough to coalesce a burst of keystrokes into one re-render, short\n * enough that autosave feels live. Blur/Enter still flush immediately. */\nconst LIVE_COMMIT_MS = 400;\n\nexport interface EditableTextProps {\n value: string;\n onSave: (next: string) => void;\n placeholder?: string;\n /** multiline → <textarea> (auto-grow); else single-line <input>. */\n multiline?: boolean;\n disabled?: boolean;\n className?: string;\n /** start in edit mode + focus (for newly inserted rows) */\n autoEdit?: boolean;\n /** fires whenever edit mode is left (commit OR cancel) — lets the parent\n * clear a one-shot autoEdit flag so a later row reshuffle can't re-trigger it. */\n onEditEnd?: () => void;\n /** forwarded to the display span (e.g. data-quote-target) */\n spanProps?: React.HTMLAttributes<HTMLSpanElement>;\n}\n\nfunction caretOffsetFromPoint(x: number, y: number): number | null {\n const d = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n caretPositionFromPoint?: (x: number, y: number) => { offset: number } | null;\n };\n if (typeof d.caretRangeFromPoint === \"function\") {\n const r = d.caretRangeFromPoint(x, y);\n return r ? r.startOffset : null;\n }\n if (typeof d.caretPositionFromPoint === \"function\") {\n const p = d.caretPositionFromPoint(x, y);\n return p ? p.offset : null;\n }\n return null;\n}\n\nexport function EditableText({\n value,\n onSave,\n placeholder,\n multiline = false,\n disabled = false,\n className,\n autoEdit = false,\n onEditEnd,\n spanProps,\n}: EditableTextProps): ReactElement {\n const [editing, setEditing] = useState(autoEdit);\n const [draft, setDraft] = useState(value);\n const caretRef = useRef<number | null>(null);\n const inputRef = useRef<HTMLTextAreaElement & HTMLInputElement>(null);\n const committedRef = useRef(value);\n const editingSignal = useContext(EditingSignalContext);\n const highlight = useContext(HighlightContext);\n\n // ── debounced live commit ───────────────────────────────────────────────\n // Push the draft up while typing (debounced) so the host's autosave starts\n // ticking without waiting for blur. Read the latest draft / onSave from\n // refs so the timer callback never closes over stale values, and never fire\n // mid-IME-composition (Chinese/Japanese) — wait for compositionend.\n const liveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const composingRef = useRef(false);\n const draftRef = useRef(value);\n const onSaveRef = useRef(onSave);\n onSaveRef.current = onSave;\n\n const clearLiveTimer = () => {\n if (liveTimerRef.current) {\n clearTimeout(liveTimerRef.current);\n liveTimerRef.current = null;\n }\n };\n const flushLive = () => {\n clearLiveTimer();\n const next = draftRef.current;\n if (next !== committedRef.current) {\n committedRef.current = next;\n onSaveRef.current(next);\n }\n };\n const scheduleLive = () => {\n clearLiveTimer();\n liveTimerRef.current = setTimeout(() => {\n liveTimerRef.current = null;\n if (composingRef.current) return; // a later compositionend reschedules\n flushLive();\n }, LIVE_COMMIT_MS);\n };\n\n // flush any pending live edit on unmount so navigating away / scrolling the\n // row out mid-edit doesn't drop the last typed-but-not-yet-committed change.\n useEffect(() => () => flushLive(), []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // While this field is in edit mode, mark the editor as \"being edited\" so the\n // host can pause adopting external (AI) revisions. Decrements on exit/unmount.\n useEffect(() => {\n if (!editing || !editingSignal) return;\n editingSignal.inc();\n return () => editingSignal.dec();\n }, [editing, editingSignal]);\n\n // Keep the commit baseline in sync with external `value` — even WHILE editing.\n // - not editing, or editing-but-untouched (draft === baseline): adopt the new\n // value outright (e.g. an AI revision landed) so stale text isn't committed\n // over it.\n // - editing AND the user has typed (genuine concurrent edit): keep BOTH their\n // draft and the original baseline. We deliberately do NOT advance the\n // baseline to the external value here: doing so used to make a commit whose\n // draft happened to equal the external value silently skip onSave (losing\n // the user's edit). Leaving the baseline put guarantees the user's edit\n // always commits (last-writer-wins, recorded in undo/diff/autosave) instead\n // of being dropped. A true 3-way merge / conflict prompt is deferred to v2.\n useEffect(() => {\n if (value === committedRef.current) return;\n const userDiverged = editing && draft !== committedRef.current;\n if (userDiverged) return;\n setDraft(value);\n committedRef.current = value;\n }, [value, editing, draft]);\n\n // enter edit mode when autoEdit flips true (freshly inserted row), so the\n // editor opens even if the prop changes after mount.\n useEffect(() => {\n if (autoEdit) setEditing(true);\n }, [autoEdit]);\n\n // focus + place caret + autosize when entering edit mode\n useLayoutEffect(() => {\n if (!editing) return;\n const el = inputRef.current;\n if (!el) return;\n if (multiline) autoSize(el);\n el.focus();\n const caret = caretRef.current;\n const pos = caret == null ? el.value.length : Math.min(caret, el.value.length);\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* input type may not support selection range */\n }\n caretRef.current = null;\n }, [editing, multiline]);\n\n function beginEdit(e: React.MouseEvent) {\n if (disabled) return;\n // don't hijack a drag-select: only enter edit on a collapsed selection\n const sel = window.getSelection();\n if (sel && !sel.isCollapsed) return;\n caretRef.current = caretOffsetFromPoint(e.clientX, e.clientY);\n setDraft(committedRef.current);\n draftRef.current = committedRef.current;\n setEditing(true);\n }\n\n function commit() {\n clearLiveTimer();\n setEditing(false);\n onEditEnd?.();\n if (draft !== committedRef.current) {\n committedRef.current = draft;\n onSave(draft);\n }\n }\n function cancel() {\n clearLiveTimer();\n setDraft(committedRef.current);\n draftRef.current = committedRef.current;\n setEditing(false);\n onEditEnd?.();\n }\n\n if (!editing) {\n const content = value\n ? renderHighlightedText(value, highlight)\n : <span className=\"lj-se-ph\">{placeholder ?? \"\"}</span>;\n return (\n <span\n {...spanProps}\n className={\"lj-se-editable\" + (className ? \" \" + className : \"\") + (disabled ? \" lj-se-editable--ro\" : \"\")}\n onClick={beginEdit}\n >\n {content}\n </span>\n );\n }\n\n const common = {\n ref: inputRef as never,\n value: draft,\n className: \"lj-se-editing\" + (className ? \" \" + className : \"\"),\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n const v = e.target.value;\n setDraft(v);\n draftRef.current = v;\n if (multiline) autoSize(e.target as HTMLTextAreaElement);\n if (!composingRef.current) scheduleLive();\n },\n onCompositionStart: () => {\n composingRef.current = true;\n clearLiveTimer(); // hold off until the IME word is finished\n },\n onCompositionEnd: (e: React.CompositionEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n composingRef.current = false;\n draftRef.current = e.currentTarget.value;\n scheduleLive();\n },\n onBlur: commit,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n } else if (e.key === \"Enter\") {\n if (!multiline || e.metaKey || e.ctrlKey) {\n e.preventDefault();\n commit();\n }\n }\n },\n };\n\n return multiline ? (\n <textarea {...common} rows={1} />\n ) : (\n <input {...common} type=\"text\" />\n );\n}\n\nfunction autoSize(el: HTMLTextAreaElement): void {\n el.style.height = \"auto\";\n el.style.height = el.scrollHeight + \"px\";\n}\n","/**\n * HUD — reproduces agent-frontend's two-part chrome:\n * - CanvasTopBar: a sticky h-9 top bar with the current selection context on\n * the left and the FormatToggle (标准 / 亚洲格式) + undo/redo on the right.\n * - SaveCapsule: a floating, bottom-center pill (rounded-full, popover bg, ring\n * + shadow) that surfaces save status and any pending AI diff (count +\n * accept/reject), exactly like the old EditorHudCapsule's collapsed pill.\n */\nimport {\n AlertCircle,\n ArrowLeft,\n Check,\n ChevronLeft,\n ChevronRight,\n Loader2,\n Redo2,\n Undo2,\n} from \"lucide-react\";\nimport type { ScriptFormat } from \"../scene/scene-item-row.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { cn } from \"../cn.js\";\n\nexport type SaveStatus = \"idle\" | \"saving\" | \"saved\" | \"error\";\n\nexport function FormatToggle({\n value,\n onChange,\n}: {\n value: ScriptFormat;\n onChange: (next: ScriptFormat) => void;\n}) {\n return (\n <div role=\"group\" aria-label=\"剧本格式\" className=\"lj-se-format\">\n {([\n { key: \"standard\", label: \"标准\" },\n { key: \"asian\", label: \"亚洲格式\" },\n ] as const).map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n aria-pressed={value === opt.key}\n className={cn(\"lj-se-format-btn\", value === opt.key && \"is-active\")}\n onClick={() => onChange(opt.key)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport function CanvasTopBar({\n title,\n onTitleChange,\n titleDisabled,\n contextLabel,\n format,\n onFormatChange,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n actions,\n}: {\n /** the script's name (ScriptProject.title). Shown at the far left. */\n title?: string;\n /** when provided, the title becomes click-to-edit; the host persists the new\n * value however it likes (the editor never touches storage). Omit → read-only. */\n onTitleChange?: (next: string) => void;\n titleDisabled?: boolean;\n contextLabel?: React.ReactNode;\n format: ScriptFormat;\n onFormatChange: (format: ScriptFormat) => void;\n canUndo?: boolean;\n canRedo?: boolean;\n onUndo?: () => void;\n onRedo?: () => void;\n /** host-injected actions rendered at the far right (e.g. 删除剧本 / 中间产物).\n * Kept business-decoupled: the package only renders whatever node is passed. */\n actions?: React.ReactNode;\n}) {\n const hasTitle = onTitleChange != null || (title ?? \"\").length > 0;\n return (\n <header className=\"lj-se-topbar\">\n <div className=\"lj-se-topbar-left\">\n {hasTitle ? (\n onTitleChange ? (\n <EditableText\n className=\"lj-se-topbar-title\"\n value={title ?? \"\"}\n placeholder=\"未命名剧本\"\n disabled={titleDisabled}\n onSave={onTitleChange}\n />\n ) : (\n <span className=\"lj-se-topbar-title lj-se-topbar-title--ro\">{title}</span>\n )\n ) : null}\n {contextLabel ? (\n <span className=\"lj-se-topbar-ctx\">\n {hasTitle ? <span className=\"lj-se-topbar-sep\" aria-hidden>/</span> : null}\n {contextLabel}\n </span>\n ) : null}\n </div>\n <div className=\"lj-se-topbar-right\">\n <FormatToggle value={format} onChange={onFormatChange} />\n {onUndo || onRedo ? (\n <div className=\"lj-se-topbar-undo\">\n <button type=\"button\" className=\"lj-se-rowbtn\" disabled={!canUndo} title=\"撤销\" onClick={onUndo}>\n <Undo2 className=\"lj-se-ic-4\" strokeWidth={1.75} />\n </button>\n <button type=\"button\" className=\"lj-se-rowbtn\" disabled={!canRedo} title=\"重做\" onClick={onRedo}>\n <Redo2 className=\"lj-se-ic-4\" strokeWidth={1.75} />\n </button>\n </div>\n ) : null}\n {actions ? <div className=\"lj-se-topbar-actions\">{actions}</div> : null}\n </div>\n </header>\n );\n}\n\nexport function SaveCapsule({\n saveStatus = \"idle\",\n diffCount = 0,\n baselineStatus,\n canApplyDiff,\n onDiffPrev,\n onDiffNext,\n onAcceptAll,\n onRejectAll,\n returnLabel,\n onReturn,\n}: {\n saveStatus?: SaveStatus;\n diffCount?: number;\n /** \"memory\" → baseline only in memory (lost on reload); shows a hint */\n baselineStatus?: \"ok\" | \"memory\";\n canApplyDiff?: boolean;\n onDiffPrev?: () => void;\n onDiffNext?: () => void;\n onAcceptAll?: () => void;\n onRejectAll?: () => void;\n /** \"返回 X\" breadcrumb after an asset→scene jump */\n returnLabel?: string;\n onReturn?: () => void;\n}) {\n const showSave = saveStatus !== \"idle\";\n const hasDiff = diffCount > 0;\n const hasReturn = !!(returnLabel && onReturn);\n if (!showSave && !hasDiff && !hasReturn) return null;\n\n return (\n <div className=\"lj-se-capsule-anchor\">\n <div className=\"lj-se-capsule\">\n {hasReturn ? (\n <button type=\"button\" className=\"lj-se-capsule-return\" title={`返回 ${returnLabel}`} onClick={onReturn}>\n <ArrowLeft className=\"lj-se-ic-4\" strokeWidth={2.5} />\n <span className=\"lj-se-capsule-return-label\">返回 {returnLabel}</span>\n </button>\n ) : null}\n {hasDiff ? (\n <div className=\"lj-se-capsule-diff\">\n <span className=\"lj-se-capsule-ping\">\n <span className=\"lj-se-capsule-dot\" />\n <span className=\"lj-se-capsule-dot is-ping\" />\n </span>\n <span className=\"lj-se-capsule-count\">{diffCount}</span>\n <span className=\"lj-se-capsule-muted\">改动</span>\n {baselineStatus === \"memory\" ? (\n <span className=\"lj-se-capsule-warn\" title=\"基线仅存于内存,刷新页面会丢失\">仅本次</span>\n ) : null}\n {onDiffPrev ? (\n <button type=\"button\" className=\"lj-se-capsule-nav\" title=\"上一处\" onClick={onDiffPrev}>\n <ChevronLeft className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n ) : null}\n {onDiffNext ? (\n <button type=\"button\" className=\"lj-se-capsule-nav\" title=\"下一处\" onClick={onDiffNext}>\n <ChevronRight className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n ) : null}\n {onRejectAll ? (\n <button type=\"button\" className=\"lj-se-capsule-reject\" disabled={!canApplyDiff} onClick={onRejectAll}>\n 全部拒绝\n </button>\n ) : null}\n {onAcceptAll ? (\n <button type=\"button\" className=\"lj-se-capsule-accept\" disabled={!canApplyDiff} onClick={onAcceptAll}>\n 全部接受\n </button>\n ) : null}\n </div>\n ) : null}\n {showSave && !hasDiff ? <SaveStateRow status={saveStatus} /> : null}\n </div>\n </div>\n );\n}\n\nfunction SaveStateRow({ status }: { status: SaveStatus }) {\n if (status === \"saving\")\n return (\n <span className=\"lj-se-capsule-save is-saving\">\n <Loader2 className=\"lj-se-ic-4 lj-se-spin\" strokeWidth={2.25} /> 保存中\n </span>\n );\n if (status === \"saved\")\n return (\n <span className=\"lj-se-capsule-save is-saved\">\n <Check className=\"lj-se-ic-4\" strokeWidth={2.5} /> 已保存\n </span>\n );\n return (\n <span className=\"lj-se-capsule-save is-error\">\n <AlertCircle className=\"lj-se-ic-4\" strokeWidth={2.25} /> 出错\n </span>\n );\n}\n","/**\n * Pure ScriptProject mutations.\n *\n * ⚠️ INVARIANT — every mutation here MUST be immutable: never write into an\n * existing scene / item / array in place; always return fresh spread-copied\n * objects along the path from the root to the change (see cloneEpisodes /\n * withSceneUpdated). Two things silently depend on it:\n * 1. diff-engine's `base === scene` fast path — it treats a scene that keeps\n * its baseline-snapshot reference as unchanged and skips serializing it; an\n * in-place edit would keep the reference and the change would vanish from\n * the diff overlay.\n * 2. AssetCard / SceneEditor React.memo — they skip re-render when their slice\n * keeps the same reference; an in-place edit would render stale UI.\n * If you add a mutation, return new objects — do NOT `scene.actions.push(...)`\n * or `Object.assign(scene, …)`.\n */\nimport { ScriptContentType, type Scene, type ScriptItem, type ScriptProject } from \"../types\";\nimport { getSceneContext } from \"../utils.js\";\n\nexport interface SceneDraft {\n sceneId: string;\n location: string;\n space: string;\n time: string;\n actors: string;\n}\n\nexport interface ItemDraft {\n kind: \"dialogue\" | \"action\";\n actorName: string;\n emotion: string;\n content: string;\n actionType: string;\n}\n\nfunction cloneEpisodes(data: ScriptProject) {\n return [...(data.episodes || [])];\n}\n\nfunction withSceneUpdated(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n updater: (scene: Scene) => Scene\n): ScriptProject {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const scene = scenes[sceneIndex];\n if (!scene) return data;\n scenes[sceneIndex] = updater(scene);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\nfunction normalizeCommaList(value: string) {\n return value\n .split(/[,,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction setSceneContext(scene: Scene, patch: Partial<NonNullable<Scene[\"context\"]>>): Scene {\n const current = getSceneContext(scene);\n const context = {\n actors: patch.actors ?? current.actors,\n locations: patch.locations ?? current.locations,\n props: patch.props ?? current.props,\n };\n return {\n ...scene,\n context,\n actors: context.actors,\n locations: context.locations,\n props: context.props,\n };\n}\n\nexport function getSceneActorsText(scene: Scene) {\n return (getSceneContext(scene).actors || [])\n .map((item) => item.actor_id?.trim() || \"\")\n .filter(Boolean)\n .join(\",\");\n}\n\nexport function getPrimarySceneLocationId(scene: Scene) {\n const firstFromIds = scene.location_ids?.find(Boolean)?.trim();\n if (firstFromIds) return firstFromIds;\n return getSceneContext(scene).locations?.[0]?.location_id?.trim() || \"\";\n}\n\nexport function buildSceneDraft(sceneId: string, fallbackSceneIndex: number): SceneDraft {\n return {\n sceneId: sceneId.trim() || `1-${fallbackSceneIndex + 1}`,\n location: \"\",\n space: \"interior\",\n time: \"day\",\n actors: \"\",\n };\n}\n\nexport function incrementSceneId(sceneId: string | undefined, fallbackEpisodeIndex: number, fallbackSceneIndex: number) {\n const normalized = sceneId?.trim();\n if (!normalized) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n\n const match = normalized.match(/^(.*?)(\\d+)$/);\n if (!match) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n return `${match[1]}${String(Number.parseInt(match[2], 10) + 1).padStart(match[2].length, \"0\")}`;\n}\n\nexport function nextEpisodeSceneId(data: ScriptProject, episodeIndex: number): string {\n let maxSceneNum = 0;\n const episode = data.episodes?.[episodeIndex];\n for (const scene of episode?.scenes || []) {\n const match = scene.scene_id?.trim().match(/^scn_(\\d+)$/);\n if (match) maxSceneNum = Math.max(maxSceneNum, Number.parseInt(match[1], 10));\n }\n return `scn_${String(maxSceneNum + 1).padStart(3, \"0\")}`;\n}\n\nfunction collectEpisodeSceneIds(data: ScriptProject, episodeIndex: number): Set<string> {\n const sceneIds = new Set<string>();\n const episode = data.episodes?.[episodeIndex];\n for (const scene of episode?.scenes || []) {\n const sceneId = scene.scene_id?.trim();\n if (sceneId) sceneIds.add(sceneId);\n }\n return sceneIds;\n}\n\nfunction nextAvailableEpisodeSceneId(data: ScriptProject, episodeIndex: number, suggestedId: string): string {\n const used = collectEpisodeSceneIds(data, episodeIndex);\n let candidate = suggestedId.trim() || nextEpisodeSceneId(data, episodeIndex);\n if (!used.has(candidate)) return candidate;\n\n const match = candidate.match(/^(.*?)(\\d+)$/);\n if (!match) return nextEpisodeSceneId(data, episodeIndex);\n\n let nextNum = Number.parseInt(match[2], 10) + 1;\n while (used.has(candidate)) {\n candidate = `${match[1]}${String(nextNum).padStart(match[2].length, \"0\")}`;\n nextNum += 1;\n }\n return candidate;\n}\n\n/**\n * 基于 prev 递增,并在 existingScenes 里做冲突检测;若建议 id 已占用,继续递增直到不冲突。\n * 上限 1000 次避免异常 id 格式引起死循环。\n */\nexport function nextAvailableSceneId(\n prevSceneId: string | undefined,\n existingScenes: Scene[],\n fallbackEpisodeIndex: number,\n fallbackSceneIndex: number,\n): string {\n const used = new Set<string>();\n for (const sc of existingScenes) {\n const id = sc.scene_id?.trim();\n if (id) used.add(id);\n }\n let candidate = incrementSceneId(prevSceneId, fallbackEpisodeIndex, fallbackSceneIndex);\n let attempts = 0;\n while (used.has(candidate) && attempts < 1000) {\n candidate = incrementSceneId(candidate, fallbackEpisodeIndex, fallbackSceneIndex);\n attempts += 1;\n }\n return candidate;\n}\n\nexport function decrementSceneId(sceneId: string | undefined, fallbackEpisodeIndex: number, fallbackSceneIndex: number) {\n const normalized = sceneId?.trim();\n if (!normalized) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n\n const match = normalized.match(/^(.*?)(\\d+)$/);\n if (!match) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n const n = Number.parseInt(match[2], 10);\n if (n <= 1) return normalized;\n return `${match[1]}${String(n - 1)}`;\n}\n\nexport function createSceneFromDraft(draft: SceneDraft): Scene {\n const location = draft.location.trim();\n const actors = normalizeCommaList(draft.actors);\n\n return {\n scene_id: draft.sceneId.trim(),\n environment: {\n space: draft.space.trim() || \"interior\",\n time: draft.time.trim() || \"day\",\n },\n location_ids: location ? [location] : [],\n locations: location ? [{ location_id: location, state_id: null }] : [],\n actors: actors.map((actorId) => ({ actor_id: actorId, state_id: null })),\n actions: [],\n };\n}\n\nexport function createItemFromDraft(draft: ItemDraft): ScriptItem {\n if (draft.kind === \"dialogue\") {\n return {\n type: ScriptContentType.Dialogue,\n actor_id: draft.actorName.trim(),\n emotion: draft.emotion.trim(),\n content: draft.content.trim(),\n };\n }\n\n return {\n type: draft.actionType.trim() || ScriptContentType.Action,\n content: draft.content.trim(),\n };\n}\n\nexport function updateSceneField(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n field: \"scene_id\" | \"space\" | \"time\" | \"location\" | \"actors\" | \"props\",\n value: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n if (field === \"scene_id\") {\n return { ...scene, scene_id: value.trim() };\n }\n\n if (field === \"space\" || field === \"time\") {\n return {\n ...scene,\n environment: {\n ...scene.environment,\n [field]: value.trim(),\n },\n };\n }\n\n if (field === \"location\") {\n const location = value.trim();\n return setSceneContext({\n ...scene,\n location_ids: location ? [location] : [],\n }, { locations: location ? [{ location_id: location, state_id: null }] : [] });\n }\n\n if (field === \"props\") {\n const propIds = normalizeCommaList(value);\n const existingPropStateMap = new Map(\n (getSceneContext(scene).props || []).map((item) => [(item.prop_id || \"\").trim(), item.state_id ?? null])\n );\n return setSceneContext(scene, {\n props: propIds.map((propId) => ({\n prop_id: propId,\n state_id: existingPropStateMap.get(propId) ?? null,\n })),\n });\n }\n\n const actorIds = normalizeCommaList(value);\n const existingStateMap = new Map(\n (getSceneContext(scene).actors || []).map((item) => [(item.actor_id || \"\").trim(), item.state_id ?? null])\n );\n return setSceneContext(scene, {\n actors: actorIds.map((actorId) => ({\n actor_id: actorId,\n state_id: existingStateMap.get(actorId) ?? null,\n })),\n });\n });\n}\n\ntype AssetRefField = \"actors\" | \"locations\" | \"props\";\n\ntype AssetRefIdKey = \"actor_id\" | \"location_id\" | \"prop_id\";\n\nfunction updateSceneAssetRefState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n field: AssetRefField,\n idKey: AssetRefIdKey,\n targetId: string,\n stateId: string | null\n) {\n const normalizedTarget = targetId.trim();\n const normalizedState = stateId?.trim() || null;\n if (!normalizedTarget) return data;\n\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const context = getSceneContext(scene);\n const list = (context[field] as Array<Record<string, string | null | undefined>> | undefined) || [];\n let matched = false;\n const next = list.map((item) => {\n if ((item[idKey] || \"\").toString().trim() !== normalizedTarget) return item;\n matched = true;\n return { ...item, state_id: normalizedState };\n });\n if (!matched) {\n next.push({ [idKey]: normalizedTarget, state_id: normalizedState });\n }\n return setSceneContext(scene, { [field]: next } as Partial<NonNullable<Scene[\"context\"]>>);\n });\n}\n\nexport function updateSceneActorState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n actorId: string,\n stateId: string | null\n) {\n return updateSceneAssetRefState(data, episodeIndex, sceneIndex, \"actors\", \"actor_id\", actorId, stateId);\n}\n\nexport function updateSceneLocationState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n locationId: string,\n stateId: string | null\n) {\n return updateSceneAssetRefState(data, episodeIndex, sceneIndex, \"locations\", \"location_id\", locationId, stateId);\n}\n\nexport function updateScenePropState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n propId: string,\n stateId: string | null\n) {\n return updateSceneAssetRefState(data, episodeIndex, sceneIndex, \"props\", \"prop_id\", propId, stateId);\n}\n\nexport function updateSceneItemContent(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n content: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const item = actions[itemIndex];\n if (!item) return scene;\n actions[itemIndex] = { ...item, content: content.trim() };\n return { ...scene, actions };\n });\n}\n\nexport function updateSceneItemActor(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n actorId: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const item = actions[itemIndex];\n if (!item) return scene;\n // picking an actor makes this a single-actor line — drop the structured\n // speaker-identity fields (speaker_id / speakers / lines) so the chosen\n // actor becomes authoritative for the displayed cue.\n const next: ScriptItem = { ...item, actor_id: actorId.trim() };\n delete next.speaker_id;\n delete next.speakers;\n delete next.lines;\n actions[itemIndex] = next;\n return { ...scene, actions };\n });\n}\n\nexport function updateSceneItemEmotion(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n emotion: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const item = actions[itemIndex];\n if (!item) return scene;\n const trimmed = emotion.trim();\n const next: ScriptItem = { ...item };\n if (trimmed) next.emotion = trimmed;\n else delete next.emotion;\n actions[itemIndex] = next;\n return { ...scene, actions };\n });\n}\n\nexport function replaceSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n item: ScriptItem\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n if (!actions[itemIndex]) return scene;\n actions[itemIndex] = item;\n return { ...scene, actions };\n });\n}\n\n/**\n * Append a new (empty) episode at the end, or insert at `atIndex`. The new\n * episode starts with no scenes — the empty-episode affordance lets the user\n * add the first scene.\n */\nexport function addEpisode(data: ScriptProject, atIndex?: number): ScriptProject {\n const episodes = [...(data.episodes || [])];\n const index = atIndex == null ? episodes.length : Math.max(0, Math.min(atIndex, episodes.length));\n const stamp =\n typeof Date !== \"undefined\" && typeof Date.now === \"function\" ? Date.now().toString(36) : String(episodes.length);\n episodes.splice(index, 0, { episode_id: `ep_${stamp}`, title: \"\", scenes: [] });\n return { ...data, episodes };\n}\n\n/** Append a fresh blank scene to an episode (used by the empty-episode CTA). */\nexport function addBlankScene(data: ScriptProject, episodeIndex: number): ScriptProject {\n const scenes = data.episodes?.[episodeIndex]?.scenes ?? [];\n return insertScene(data, episodeIndex, scenes.length, {\n environment: { space: \"interior\", time: \"day\" },\n actions: [],\n });\n}\n\nexport function insertScene(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n scene: Scene\n) {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const finalScene = {\n ...scene,\n scene_id: nextAvailableEpisodeSceneId(data, episodeIndex, scene.scene_id || \"\"),\n };\n scenes.splice(sceneIndex, 0, finalScene);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\nexport function splitScene(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n splitAtItemIndex: number\n) {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const scene = scenes[sceneIndex];\n if (!scene) return data;\n\n const actions = scene.actions || [];\n if (splitAtItemIndex <= 0 || splitAtItemIndex >= actions.length) return data;\n\n const frontScene: Scene = {\n ...scene,\n actions: actions.slice(0, splitAtItemIndex),\n };\n // back scene 的 id:用去重版本,避免非 scn_ 命名的项目里 nextEpisodeSceneId 恒返回\n // scn_001 而与已有场次(或多次拆分)撞 id。nextAvailableEpisodeSceneId 会在本集\n // 已用 id 上冲突检测并递增。\n const backScene: Scene = {\n ...scene,\n scene_id: nextAvailableEpisodeSceneId(data, episodeIndex, \"\"),\n actions: actions.slice(splitAtItemIndex),\n };\n\n // 后续场次保持原 id(不再做链式 renumber:链式会让已生成资产 / 视频的 scene 引用全部失效,\n // 代价远大于\"id 看起来连续\"的收益)。\n const renumberedTail = scenes.slice(sceneIndex + 1);\n\n episodes[episodeIndex] = {\n ...episode,\n scenes: [...scenes.slice(0, sceneIndex), frontScene, backScene, ...renumberedTail],\n };\n return { ...data, episodes };\n}\n\n/**\n * 把 sceneIndex 对应的场并入 sceneIndex - 1。\n * - actions 顺序拼接\n * - actors / locations / props 按 id 去重合并(保留前场已有的 state_id)\n * - 保留前场 scene_id 和 environment\n * - **不再**对后续 scene_id 链式 -1:下游(video_map / asset state / 参考素材目录等)按\n * scene_id 做主键,扰动 scene_id 会让已生成资产 / 视频孤立,代价远大于\"id 连续\"的收益。\n * - sceneIndex <= 0 时无效,返回原 data\n */\nexport function mergeSceneIntoPrev(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n) {\n if (sceneIndex <= 0) return data;\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const prev = scenes[sceneIndex - 1];\n const cur = scenes[sceneIndex];\n if (!prev || !cur) return data;\n\n const mergeActors = () => {\n const seen = new Set<string>();\n const out: NonNullable<Scene[\"actors\"]> = [];\n for (const ref of [...(getSceneContext(prev).actors ?? []), ...(getSceneContext(cur).actors ?? [])]) {\n const id = ref.actor_id?.trim() || \"\";\n if (!id || seen.has(id)) continue;\n seen.add(id);\n out.push(ref);\n }\n return out;\n };\n const mergeLocations = () => {\n const seen = new Set<string>();\n const out: NonNullable<Scene[\"locations\"]> = [];\n for (const ref of [...(getSceneContext(prev).locations ?? []), ...(getSceneContext(cur).locations ?? [])]) {\n const id = ref.location_id?.trim() || \"\";\n if (!id || seen.has(id)) continue;\n seen.add(id);\n out.push(ref);\n }\n return out;\n };\n const mergeProps = () => {\n const seen = new Set<string>();\n const out: NonNullable<Scene[\"props\"]> = [];\n for (const ref of [...(getSceneContext(prev).props ?? []), ...(getSceneContext(cur).props ?? [])]) {\n const id = ref.prop_id?.trim() || \"\";\n if (!id || seen.has(id)) continue;\n seen.add(id);\n out.push(ref);\n }\n return out;\n };\n const actors = mergeActors();\n const locations = mergeLocations();\n const props = mergeProps();\n\n const merged: Scene = setSceneContext({\n ...prev,\n actions: [...(prev.actions ?? []), ...(cur.actions ?? [])],\n // drop the stale flat location_ids (copied from prev): it would disagree\n // with the merged context.locations, and getPrimarySceneLocationId reads\n // location_ids first → would silently lose cur's location. Reads fall back\n // to context.locations which now holds the full merged set.\n location_ids: undefined,\n }, { actors, locations, props });\n\n const tail = scenes.slice(sceneIndex + 1);\n\n episodes[episodeIndex] = {\n ...episode,\n scenes: [...scenes.slice(0, sceneIndex - 1), merged, ...tail],\n };\n return { ...data, episodes };\n}\n\nexport function deleteScene(data: ScriptProject, episodeIndex: number, sceneIndex: number) {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n scenes.splice(sceneIndex, 1);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\nexport function insertSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n item: ScriptItem\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n actions.splice(itemIndex, 0, item);\n return { ...scene, actions };\n });\n}\n\nexport function deleteSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n actions.splice(itemIndex, 1);\n return { ...scene, actions };\n });\n}\n\n/**\n * Reorder a row within a scene: pull the item at `fromIndex` out and re-insert\n * it so it lands at insertion slot `toIndex` (0..length). No-op when the move\n * wouldn't change order.\n */\nexport function moveSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n fromIndex: number,\n toIndex: number\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n if (fromIndex < 0 || fromIndex >= actions.length) return scene;\n const clampedTo = Math.max(0, Math.min(toIndex, actions.length));\n // adjust target when removing an earlier item shifts indices left\n const dest = clampedTo > fromIndex ? clampedTo - 1 : clampedTo;\n if (dest === fromIndex) return scene;\n const [moved] = actions.splice(fromIndex, 1);\n actions.splice(dest, 0, moved);\n return { ...scene, actions };\n });\n}\n\nexport interface ItemLocation {\n episodeIndex: number;\n sceneIndex: number;\n itemIndex: number;\n}\n\n/**\n * Move a row to a target insertion slot, within the same scene OR across\n * scenes. Cross-scene moves pull the item from the source scene's actions and\n * splice it into the target scene's actions (the row's actor/emotion/etc. ride\n * along unchanged). scene_id is never touched.\n */\nexport function moveScriptItem(\n data: ScriptProject,\n from: ItemLocation,\n to: { episodeIndex: number; sceneIndex: number; slot: number }\n): ScriptProject {\n if (from.episodeIndex === to.episodeIndex && from.sceneIndex === to.sceneIndex) {\n return moveSceneItem(data, from.episodeIndex, from.sceneIndex, from.itemIndex, to.slot);\n }\n const episodes = cloneEpisodes(data);\n const srcEp = episodes[from.episodeIndex];\n const dstEp = episodes[to.episodeIndex];\n if (!srcEp || !dstEp) return data;\n const srcScenes = [...(srcEp.scenes || [])];\n const srcScene = srcScenes[from.sceneIndex];\n if (!srcScene) return data;\n const srcActions = [...(srcScene.actions || [])];\n if (from.itemIndex < 0 || from.itemIndex >= srcActions.length) return data;\n const [moved] = srcActions.splice(from.itemIndex, 1);\n srcScenes[from.sceneIndex] = { ...srcScene, actions: srcActions };\n episodes[from.episodeIndex] = { ...srcEp, scenes: srcScenes };\n\n // re-read target episode/scene from the (possibly same-episode) updated array\n const dstEp2 = episodes[to.episodeIndex];\n const dstScenes = [...(dstEp2.scenes || [])];\n const dstScene = dstScenes[to.sceneIndex];\n if (!dstScene) return data;\n const dstActions = [...(dstScene.actions || [])];\n const slot = Math.max(0, Math.min(to.slot, dstActions.length));\n dstActions.splice(slot, 0, moved);\n dstScenes[to.sceneIndex] = { ...dstScene, actions: dstActions };\n episodes[to.episodeIndex] = { ...dstEp2, scenes: dstScenes };\n\n return { ...data, episodes };\n}\n\n/** Remove an entire episode. */\nexport function deleteEpisode(data: ScriptProject, episodeIndex: number): ScriptProject {\n const episodes = [...(data.episodes || [])];\n if (episodeIndex < 0 || episodeIndex >= episodes.length) return data;\n episodes.splice(episodeIndex, 1);\n return { ...data, episodes };\n}\n","/**\n * Pure \"where does this asset appear\" computation — ported from agent-frontend.\n * Drives the bidirectional reference grid on each asset card (asset → scenes).\n */\nimport type { ScriptEpisode, Scene, ScriptProject } from \"./types.js\";\nimport {\n getEpisodeNumber,\n getEpisodeNumberLabel,\n getPropDisplayName,\n getSceneContext,\n getSceneNumber,\n getSceneNumberLabel,\n} from \"./utils.js\";\n\nexport interface DistributionItem {\n key: string;\n label: string;\n episodeIndex: number;\n /** display episode number (parsed from episode_id/title, shared util) */\n episodeNumber: number;\n sceneIndex: number;\n /** display scene number (trailing digits of scene_id, shared util) */\n sceneNumber: number;\n stateId?: string | null;\n}\n\n/** Build the shared display fields for one (episode, scene) reference, so every\n * distribution row shows the SAME episode/scene numbers as the rest of the UI. */\nfunction refFields(episode: ScriptEpisode, ei: number, scene: Scene, si: number) {\n return {\n label: `${getEpisodeNumberLabel(episode, ei)} · ${getSceneNumberLabel(scene, si)}`,\n episodeIndex: ei,\n episodeNumber: getEpisodeNumber(episode, ei),\n sceneIndex: si,\n sceneNumber: getSceneNumber(scene, si),\n };\n}\n\nexport function buildActorDistribution(data: ScriptProject, actorId: string): DistributionItem[] {\n const items: DistributionItem[] = [];\n (data.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n const ctx = getSceneContext(scene);\n const ref = (ctx.actors ?? []).find((i) => (i.actor_id ?? \"\").trim() === actorId);\n const inActions = !ref && (scene.actions ?? []).some((i) => (i.actor_id ?? \"\").trim() === actorId);\n if (ref || inActions) {\n items.push({\n key: `actor-${actorId}-${ei}-${si}`,\n ...refFields(episode, ei, scene, si),\n stateId: ref?.state_id,\n });\n }\n });\n });\n return items;\n}\n\nexport function buildLocationDistribution(data: ScriptProject, locationId: string): DistributionItem[] {\n const items: DistributionItem[] = [];\n (data.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n const inIds = (scene.location_ids ?? []).some((i) => (i ?? \"\").trim() === locationId);\n const ctx = getSceneContext(scene);\n const ctxRef = (ctx.locations ?? []).find((i) => (i.location_id ?? \"\").trim() === locationId);\n if (inIds || ctxRef) {\n items.push({\n key: `location-${locationId}-${ei}-${si}`,\n ...refFields(episode, ei, scene, si),\n stateId: ctxRef?.state_id,\n });\n }\n });\n });\n return items;\n}\n\nexport function buildPropDistribution(data: ScriptProject, propId: string, propName: string): DistributionItem[] {\n const items: DistributionItem[] = [];\n const id = propId.trim();\n const needle = propName.trim().toLowerCase();\n (data.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n const ctx = getSceneContext(scene);\n const ctxRef = (ctx.props ?? []).find((i) => (i.prop_id ?? \"\").trim() === id);\n const byRef = !!ctxRef;\n const byId = !byRef && id ? (scene.actions ?? []).some((i) => (i.content ?? \"\").includes(id)) : false;\n const byName =\n !byRef && !byId && needle\n ? (scene.actions ?? []).some((i) => (i.content ?? \"\").toLowerCase().includes(needle))\n : false;\n if (byRef || byId || byName) {\n items.push({\n key: `prop-${id || needle}-${ei}-${si}`,\n ...refFields(episode, ei, scene, si),\n stateId: ctxRef?.state_id,\n });\n }\n });\n });\n return items;\n}\n\nexport interface ReferenceEpisodeGroup {\n episodeIndex: number;\n /** display episode number (shared util) — what the grid chip renders */\n episodeNumber: number;\n items: DistributionItem[];\n}\n\nexport function groupReferencesByEpisode(distribution: DistributionItem[]): ReferenceEpisodeGroup[] {\n const map = new Map<number, DistributionItem[]>();\n for (const item of distribution) {\n if (!map.has(item.episodeIndex)) map.set(item.episodeIndex, []);\n map.get(item.episodeIndex)!.push(item);\n }\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([episodeIndex, items]) => ({\n episodeIndex,\n episodeNumber: items[0]?.episodeNumber ?? episodeIndex + 1,\n items: items.sort((a, b) => a.sceneIndex - b.sceneIndex),\n }));\n}\n\nexport type AssetDistGroup = \"actors\" | \"locations\" | \"props\";\n\n/** shared empty result so a zero-appearance / unknown-id asset always gets the\n * SAME refs array reference — otherwise AssetCard's reference-equality memo\n * would re-render it on every keystroke (e.g. a blank-id asset that is never\n * in the index and falls through to this builder each render). */\nconst EMPTY_REFS: ReferenceEpisodeGroup[] = [];\n\n/** One asset's episode-grouped reference list. Used both inside the index and\n * as the stream's fresh-`value` fallback for an asset that isn't in the\n * (deferred) index yet — e.g. one just added this render. */\nexport function buildAssetRefs(\n data: ScriptProject,\n group: AssetDistGroup,\n assetId: string,\n): ReferenceEpisodeGroup[] {\n let groups: ReferenceEpisodeGroup[];\n if (group === \"actors\") {\n groups = groupReferencesByEpisode(buildActorDistribution(data, assetId));\n } else if (group === \"locations\") {\n groups = groupReferencesByEpisode(buildLocationDistribution(data, assetId));\n } else {\n const prop = (data.props ?? []).find((p) => (p.prop_id ?? \"\").trim() === assetId);\n groups = groupReferencesByEpisode(buildPropDistribution(data, assetId, getPropDisplayName(prop)));\n }\n return groups.length === 0 ? EMPTY_REFS : groups;\n}\n\n/** Structural equality on an asset's grouped refs (every field the grid renders).\n * Lets buildDistributionIndex reuse a prior array reference when an asset's\n * appearances didn't change, so AssetCard's reference-equality memo can skip. */\nfunction sameRefGroups(a: ReferenceEpisodeGroup[], b: ReferenceEpisodeGroup[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const ga = a[i];\n const gb = b[i];\n if (ga.episodeIndex !== gb.episodeIndex || ga.episodeNumber !== gb.episodeNumber || ga.items.length !== gb.items.length) {\n return false;\n }\n for (let j = 0; j < ga.items.length; j++) {\n const ia = ga.items[j];\n const ib = gb.items[j];\n if (\n ia.key !== ib.key ||\n ia.label !== ib.label ||\n ia.sceneIndex !== ib.sceneIndex ||\n ia.sceneNumber !== ib.sceneNumber ||\n ia.episodeNumber !== ib.episodeNumber ||\n ia.stateId !== ib.stateId\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Build every asset's episode-grouped reference list in ONE pass per `value`\n * (keyed `${group}:${id}`), so the stream computes distributions once instead\n * of each visible AssetCard re-scanning all scenes on every keystroke.\n *\n * Pass the PREVIOUS index as `prev` to get reference-stable results: an asset\n * whose distribution is structurally unchanged keeps its old array reference, so\n * the only cards that re-render are the ones whose appearances actually changed.\n */\nexport function buildDistributionIndex(\n data: ScriptProject,\n prev?: Map<string, ReferenceEpisodeGroup[]>,\n): Map<string, ReferenceEpisodeGroup[]> {\n const index = new Map<string, ReferenceEpisodeGroup[]>();\n const put = (key: string, next: ReferenceEpisodeGroup[]) => {\n const old = prev?.get(key);\n index.set(key, old && sameRefGroups(old, next) ? old : next);\n };\n for (const a of data.actors ?? []) {\n const id = (a.actor_id ?? \"\").trim();\n if (id) put(`actors:${id}`, buildAssetRefs(data, \"actors\", id));\n }\n for (const l of data.locations ?? []) {\n const id = (l.location_id ?? \"\").trim();\n if (id) put(`locations:${id}`, buildAssetRefs(data, \"locations\", id));\n }\n for (const p of data.props ?? []) {\n const id = (p.prop_id ?? \"\").trim();\n if (id) put(`props:${id}`, buildAssetRefs(data, \"props\", id));\n }\n return index;\n}\n","/**\n * Virtualized-stream scroll-position memory.\n *\n * Virtuoso can't be restored by a plain scrollTop — it needs its internal\n * StateSnapshot (anchor item index + offset + already-measured row heights),\n * otherwise restoring across mount/unmount jumps. We save the snapshot per\n * `scope` (the host's project key) on unmount and feed it back via\n * `<Virtuoso restoreStateFrom={readScrollState(scope)} />` on the next mount of\n * the same scope — so switching away (e.g. a tab change) and back lands you\n * where you were.\n *\n * In-memory only (lost on a full page reload) — deliberately not wired to\n * sessionStorage, to avoid leaking state across boundaries.\n */\nimport { useEffect } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { StateSnapshot, VirtuosoHandle } from \"react-virtuoso\";\n\nconst states = new Map<string, StateSnapshot>();\n\nexport function readScrollState(scope: string | undefined): StateSnapshot | undefined {\n return scope ? states.get(scope) : undefined;\n}\n\n/** Save the stream's Virtuoso state to `scope` on unmount (getState's callback\n * writes the module map synchronously, since a setState after unmount is a\n * no-op). Restored at the next mount via readScrollState(scope). */\nexport function useScrollStateMemo(\n scope: string | undefined,\n virtuosoRef: RefObject<VirtuosoHandle | null>,\n): void {\n useEffect(() => {\n if (!scope) return;\n const ref = virtuosoRef;\n return () => {\n ref.current?.getState((snapshot) => {\n states.set(scope, snapshot);\n });\n };\n }, [scope, virtuosoRef]);\n}\n","/**\n * Popover — dependency-free, token-scoped, and clip-proof.\n *\n * The panel is PORTALED into the nearest `.lj-se-root` and positioned with\n * `position: fixed` against the trigger's rect. Portaling out of the (virtual-\n * ized) row escapes the stacking/overflow traps that would otherwise let later\n * list items paint over the menu; portaling into `.lj-se-root` (not body) keeps\n * the editor's CSS variables in scope. Flips upward when there isn't room\n * below; repositions on scroll/resize; closes on outside-click or Esc.\n */\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../cn.js\";\n\nexport interface PopoverProps {\n trigger: (args: { open: boolean; toggle: () => void }) => ReactNode;\n children: (args: { close: () => void }) => ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"bottom\" | \"top\";\n className?: string;\n panelClassName?: string;\n}\n\ninterface Coords {\n top?: number;\n bottom?: number;\n left: number;\n transform?: string;\n}\n\nexport function Popover({\n trigger,\n children,\n align = \"start\",\n side = \"bottom\",\n className,\n panelClassName,\n}: PopoverProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState<Coords | null>(null);\n const rootRef = useRef<HTMLSpanElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n\n const target = (() => {\n if (typeof document === \"undefined\") return null;\n return rootRef.current?.closest(\".lj-se-root\") ?? document.body;\n })();\n\n useLayoutEffect(() => {\n if (!open || !rootRef.current) return;\n const measure = () => {\n const el = rootRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n // trigger scrolled fully out of the viewport → close instead of leaving\n // the fixed panel pinned to an offscreen / recycled rect.\n if (r.bottom <= 0 || r.top >= vh) {\n setOpen(false);\n return;\n }\n const panelW = panelRef.current?.offsetWidth ?? 232;\n const flipUp = side === \"top\" || r.bottom + 320 > vh;\n\n let left = r.left;\n let transform: string | undefined;\n if (align === \"center\") {\n left = r.left + r.width / 2;\n transform = \"translateX(-50%)\";\n } else if (align === \"end\") {\n left = r.right;\n transform = \"translateX(-100%)\";\n }\n // keep within the viewport horizontally\n if (!transform) left = Math.min(left, vw - panelW - 8);\n left = Math.max(8, left);\n\n setCoords(\n flipUp\n ? { bottom: vh - r.top + 4, left, transform }\n : { top: r.bottom + 4, left, transform },\n );\n };\n measure();\n // re-measure once the panel has a real width (for center/end clamping)\n const raf = requestAnimationFrame(measure);\n // On scroll/resize, REPOSITION the fixed panel to stay glued to its trigger\n // (so programmatic selection scrolls and trackpad inertia don't dismiss a\n // just-opened menu) — but rAF-throttled to AT MOST one measure per frame, so\n // a fast scroll over the virtualized list doesn't force layout twice per\n // event. (capture: true also catches the inner virtualized scroll container.)\n let throttle = 0;\n const onReflow = () => {\n if (throttle) return;\n throttle = requestAnimationFrame(() => {\n throttle = 0;\n measure();\n });\n };\n window.addEventListener(\"scroll\", onReflow, true);\n window.addEventListener(\"resize\", onReflow);\n return () => {\n cancelAnimationFrame(raf);\n if (throttle) cancelAnimationFrame(throttle);\n window.removeEventListener(\"scroll\", onReflow, true);\n window.removeEventListener(\"resize\", onReflow);\n };\n }, [open, side, align]);\n\n useEffect(() => {\n if (!open) return;\n function onDocClick(e: MouseEvent) {\n const t = e.target as Node;\n if (rootRef.current?.contains(t) || panelRef.current?.contains(t)) return;\n setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") setOpen(false);\n }\n document.addEventListener(\"mousedown\", onDocClick, true);\n document.addEventListener(\"keydown\", onKey, true);\n return () => {\n document.removeEventListener(\"mousedown\", onDocClick, true);\n document.removeEventListener(\"keydown\", onKey, true);\n };\n }, [open]);\n\n return (\n <span ref={rootRef} className={cn(\"lj-se-pop-root\", className)}>\n {trigger({ open, toggle: () => setOpen((v) => !v) })}\n {open && target\n ? createPortal(\n <div\n ref={panelRef}\n role=\"menu\"\n className={cn(\"lj-se-pop-panel\", panelClassName)}\n style={{\n position: \"fixed\",\n top: coords?.top,\n bottom: coords?.bottom,\n left: coords?.left ?? -9999,\n transform: coords?.transform,\n }}\n >\n {children({ close: () => setOpen(false) })}\n </div>,\n target,\n )\n : null}\n </span>\n );\n}\n","/**\n * RowControlHandle — the left-margin \"control mark\" for one script row, plus\n * RowMenuPanel, the data-driven menu body shared by every structural popover\n * (row ops here, scene ops in scene-header, episode ops in script-stream) so the\n * three menus can't drift apart.\n *\n * Craft notes (this is meant to feel like ink on paper, not a chrome button):\n * - invisible at rest; fades to a faint ink mark when its row is hovered;\n * - on its own hover it deepens + grows a soft warm halo (radial, no border)\n * and lifts slightly — all eased, no hard states;\n * - opens a parchment-toned menu holding every structural op for the row:\n * change-type (segmented), insert above/below, split-scene-here, delete.\n *\n * Pure: emits intents; SceneEditor wires them to mutations.\n */\nimport { Fragment } from \"react\";\nimport {\n ArrowDown,\n ArrowUp,\n BookOpen,\n Brain,\n Film,\n GripVertical,\n MessageCircle,\n Scissors,\n Trash2,\n} from \"lucide-react\";\nimport { ScriptContentType } from \"../types.js\";\nimport { Popover } from \"./popover.js\";\nimport { cn } from \"../cn.js\";\n\ntype IconComponent = React.ComponentType<{ className?: string; strokeWidth?: number }>;\n\nconst TYPES: Array<{ value: ScriptContentType; label: string; icon: IconComponent }> = [\n { value: ScriptContentType.Dialogue, label: \"对白\", icon: MessageCircle },\n { value: ScriptContentType.Action, label: \"动作\", icon: Film },\n { value: ScriptContentType.InnerThought, label: \"心声\", icon: Brain },\n { value: ScriptContentType.Narration, label: \"旁白\", icon: BookOpen },\n];\n\nexport interface RowMenuItem {\n icon: IconComponent;\n label: string;\n onSelect: () => void;\n /** styles the item as destructive (warm-red) */\n danger?: boolean;\n /** extra class on the glyph (e.g. the scissors rotation) */\n glyphClassName?: string;\n}\n\n/**\n * The shared parchment menu body. `sections` are rendered with a hairline\n * divider between them (and after the optional change-type segment); each\n * action closes the popover before firing.\n */\nexport function RowMenuPanel({\n close,\n typeSeg,\n sections,\n}: {\n close: () => void;\n /** optional \"改为\" segmented type switcher at the top */\n typeSeg?: { current?: ScriptContentType | string; onChange: (type: ScriptContentType) => void };\n sections: RowMenuItem[][];\n}) {\n return (\n <div className=\"lj-se-rowmenu-inner\">\n {typeSeg ? (\n <>\n <div className=\"lj-se-rowmenu-cap\">改为</div>\n <div className=\"lj-se-typeseg\">\n {TYPES.map((t) => {\n const Icon = t.icon;\n const on = t.value === typeSeg.current;\n return (\n <button\n key={t.value}\n type=\"button\"\n className={cn(\"lj-se-typeseg-item\", on && \"is-on\")}\n onClick={() => {\n close();\n if (!on) typeSeg.onChange(t.value);\n }}\n >\n <Icon className=\"lj-se-ic-4\" strokeWidth={1.5} />\n <span>{t.label}</span>\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n {sections.map((items, si) => (\n <Fragment key={si}>\n {si > 0 || typeSeg ? <div className=\"lj-se-rowmenu-div\" /> : null}\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cn(\"lj-se-rowmenu-item\", item.danger && \"lj-se-rowmenu-del\")}\n onClick={() => {\n close();\n item.onSelect();\n }}\n >\n <Icon className={cn(\"lj-se-ic-4 lj-se-rowmenu-glyph\", item.glyphClassName)} strokeWidth={1.5} />\n {item.label}\n </button>\n );\n })}\n </Fragment>\n ))}\n </div>\n );\n}\n\nexport function RowControlHandle({\n currentType,\n canSplit,\n disabled,\n dragHandleProps,\n onChangeType,\n onInsertAbove,\n onInsertBelow,\n onSplitHere,\n onDelete,\n}: {\n currentType?: ScriptContentType | string;\n canSplit?: boolean;\n disabled?: boolean;\n /** spread onto the grip to make it a native drag handle (reorder rows) */\n dragHandleProps?: React.HTMLAttributes<HTMLButtonElement> & { draggable?: boolean };\n onChangeType: (type: ScriptContentType) => void;\n onInsertAbove: () => void;\n onInsertBelow: () => void;\n onSplitHere?: () => void;\n onDelete: () => void;\n}) {\n if (disabled) return null;\n const insertSection: RowMenuItem[] = [\n { icon: ArrowUp, label: \"在上方插入\", onSelect: onInsertAbove },\n { icon: ArrowDown, label: \"在下方插入\", onSelect: onInsertBelow },\n ];\n if (canSplit && onSplitHere) {\n insertSection.push({\n icon: Scissors,\n label: \"从此另起一场\",\n onSelect: onSplitHere,\n glyphClassName: \"lj-se-scissors-rot\",\n });\n }\n return (\n <Popover\n align=\"start\"\n side=\"bottom\"\n className=\"lj-se-handle-pop\"\n panelClassName=\"lj-se-rowmenu\"\n trigger={({ open, toggle }) => (\n <button\n type=\"button\"\n {...dragHandleProps}\n className={cn(\"lj-se-handle\", open && \"is-open\", dragHandleProps?.draggable && \"is-draggable\")}\n title=\"拖动排序 · 点击操作\"\n aria-label=\"行操作\"\n onClick={toggle}\n >\n <GripVertical className=\"lj-se-handle-grip\" strokeWidth={1.5} />\n </button>\n )}\n >\n {({ close }) => (\n <RowMenuPanel\n close={close}\n typeSeg={{ current: currentType, onChange: onChangeType }}\n sections={[insertSection, [{ icon: Trash2, label: \"删除这行\", onSelect: onDelete, danger: true }]]}\n />\n )}\n </Popover>\n );\n}\n","/**\n * Shared row-drag state across the whole stream so a row can be dragged from\n * one scene and dropped into another. SceneEditor reports drag start / hover /\n * drop through this context; ScriptStream owns the state and commits the move\n * (same-scene or cross-scene) via a single moveScriptItem patch.\n */\nimport { createContext, useContext } from \"react\";\n\nexport interface DragSource {\n ep: number;\n sc: number;\n idx: number;\n}\nexport interface DropTarget {\n ep: number;\n sc: number;\n slot: number;\n}\n\nexport interface DragReorderApi {\n source: DragSource | null;\n dropAt: DropTarget | null;\n begin: (s: DragSource) => void;\n hover: (t: DropTarget) => void;\n drop: () => void;\n end: () => void;\n}\n\nexport const DragReorderContext = createContext<DragReorderApi | null>(null);\n\nexport function useDragReorder(): DragReorderApi | null {\n return useContext(DragReorderContext);\n}\n","import { ScriptContentType, type Scene, type ScriptItem, type ScriptProject } from \"../types\";\nimport { isActorBearingContentType } from \"../utils\";\n\nfunction withSceneUpdated(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n updater: (scene: Scene) => Scene,\n): ScriptProject {\n const episodes = [...(data.episodes || [])];\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const scene = scenes[sceneIndex];\n if (!scene) return data;\n scenes[sceneIndex] = updater(scene);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\n/**\n * 切换某条行的 type,静默清理不相关字段:\n * - 切到 dialogue / inner_thought:保留或继承 actor_id\n * - 切到非人物行:删 actor_id / emotion\n * - 切到 inner_thought:删 dialogue 专用的 emotion\n */\nexport function updateSceneItemType(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n type: ScriptContentType,\n): ScriptProject {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const current = actions[itemIndex];\n if (!current) return scene;\n const next: ScriptItem = { ...current, type };\n if (!isActorBearingContentType(type)) {\n delete next.actor_id;\n delete next.emotion;\n } else {\n next.actor_id = next.actor_id?.trim() || pickInheritedActorId(scene, itemIndex);\n if (type !== ScriptContentType.Dialogue) {\n delete next.emotion;\n }\n }\n actions[itemIndex] = next;\n return { ...scene, actions };\n });\n}\n\n/**\n * 为 TypePicker 选完类型后构建一条空 item。新建对白/心声时可继承上一条人物行。\n */\nexport function buildNewScriptItem(\n type: ScriptContentType,\n inheritedActorId?: string,\n): ScriptItem {\n if (isActorBearingContentType(type)) {\n return {\n type,\n actor_id: inheritedActorId?.trim() || \"\",\n content: \"\",\n };\n }\n return { type, content: \"\" };\n}\n\n/**\n * 从 scene.actions 中取距离 beforeIndex 最近的上一条对白/心声 actor_id,没有则返回空串。\n */\nexport function pickInheritedActorId(scene: Scene, beforeIndex: number): string {\n const actions = scene.actions || [];\n for (let i = beforeIndex - 1; i >= 0; i -= 1) {\n const item = actions[i];\n if (item && isActorBearingContentType(item.type) && item.actor_id?.trim()) {\n return item.actor_id.trim();\n }\n }\n return \"\";\n}\n","/**\n * SelectField — a native <select> styled to read like inline text (no chrome,\n * dotted-underline on hover). Used for enum-ish picks: INT/EXT, time of day,\n * location / actor reference, asset state. Native select gives free keyboard\n * + accessibility; we only restyle it.\n */\nimport { useContext } from \"react\";\nimport { cn } from \"../cn.js\";\nimport { HighlightContext } from \"./highlighted-text.js\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\nexport function SelectField({\n value,\n options,\n onChange,\n disabled,\n title,\n placeholder,\n mono,\n className,\n style,\n emptyOptionLabel,\n}: {\n value: string;\n options: SelectOption[];\n onChange: (next: string) => void;\n disabled?: boolean;\n title?: string;\n placeholder?: string;\n mono?: boolean;\n className?: string;\n style?: React.CSSProperties;\n /** shown as a leading disabled option when value is empty */\n emptyOptionLabel?: string;\n}) {\n const highlight = useContext(HighlightContext).trim();\n const selectedLabel =\n options.find((o) => o.value === value)?.label ??\n (value ? value : placeholder ?? emptyOptionLabel ?? \"—\");\n const highlighted = !!highlight && selectedLabel.toLocaleLowerCase().includes(highlight.toLocaleLowerCase());\n return (\n <select\n disabled={disabled}\n value={value}\n title={title}\n onChange={(e) => onChange(e.target.value)}\n style={style}\n className={cn(\"lj-se-select\", mono && \"lj-se-mono\", highlighted && \"is-search-hit\", className)}\n >\n {!value || !options.some((o) => o.value === value) ? (\n <option value={value}>{placeholder ?? emptyOptionLabel ?? \"—\"}</option>\n ) : null}\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n );\n}\n","/**\n * CAST + PROP reference rows for a scene. Each chip shows the asset name (actor\n * chips tinted by per-actor cue color), an inline state <select>, and a 2-step\n * delete. An add-popover appends a not-yet-referenced asset. Pure: all writes\n * go through onSaveData mutations; asset deletion can be routed to the host via\n * onRequestAssetDelete.\n */\nimport { Eraser, Plus } from \"lucide-react\";\nimport type { Scene, ScriptActor, ScriptProject, ScriptProp } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport {\n updateSceneActorState,\n updateSceneField,\n updateScenePropState,\n} from \"../mutations/editor-utils.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getPropDisplayName,\n getPropMap,\n getSceneContext,\n getStateDisplayName,\n} from \"../utils.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { Popover } from \"../primitives/popover.js\";\nimport { HighlightedText } from \"../primitives/highlighted-text.js\";\nimport { cn } from \"../cn.js\";\n\nexport interface AssetDeleteRequest {\n kind: \"actor\" | \"location\" | \"prop\";\n id: string;\n name: string;\n description?: string;\n /** -1 when the request originates from the asset library card (no scene) */\n episodeIndex: number;\n sceneIndex: number;\n}\n\nfunction stateOptions(states: ScriptActor[\"states\"]): SelectOption[] {\n return (states ?? [])\n .map((s) => ({ value: (s.state_id ?? \"\").trim(), label: getStateDisplayName(s) }))\n .filter((o) => o.value);\n}\n\nfunction AssetStateChip({\n name,\n orphan,\n states,\n currentStateId,\n disabled,\n onChangeState,\n onDelete,\n onNavigate,\n}: {\n name: string;\n orphan?: boolean;\n states: ScriptActor[\"states\"];\n currentStateId?: string | null;\n disabled: boolean;\n onChangeState: (next: string | null) => void;\n onDelete: () => void;\n /** jump to this asset's card in the stream (scene→asset navigation) */\n onNavigate?: () => void;\n}) {\n const opts = stateOptions(states);\n const trimmed = (currentStateId ?? \"\").trim();\n return (\n <span className={cn(\"lj-se-chip\", orphan && \"is-orphan\")} title={orphan ? `${name} 不存在` : undefined}>\n {onNavigate ? (\n <button type=\"button\" className=\"lj-se-chip-name lj-se-chip-name--link\" title={`跳到 ${name}`} onClick={onNavigate}>\n <HighlightedText text={name} />\n </button>\n ) : (\n <span className=\"lj-se-chip-name\"><HighlightedText text={name} /></span>\n )}\n <span className=\"lj-se-chip-sep\">·</span>\n <SelectField\n value={trimmed}\n options={opts}\n placeholder=\"默认\"\n disabled={disabled}\n className=\"lj-se-chip-state\"\n onChange={(v) => onChangeState(v || null)}\n />\n {!disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-chip-del\"\n title={`从本场移除 ${name}`}\n aria-label={`从本场移除 ${name}`}\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n >\n <Eraser className=\"lj-se-ic-3\" strokeWidth={1.5} />\n </button>\n ) : null}\n </span>\n );\n}\n\nfunction AddRefControl({\n options,\n existingIds,\n disabled,\n emptyHint,\n onAdd,\n}: {\n options: SelectOption[];\n existingIds: string[];\n disabled: boolean;\n emptyHint: string;\n onAdd: (id: string) => void;\n}) {\n if (disabled) return null;\n const available = options.filter((o) => !existingIds.includes(o.value));\n return (\n <Popover\n trigger={({ toggle }) => (\n <button type=\"button\" className=\"lj-se-chip-add\" title=\"添加引用\" onClick={toggle}>\n <Plus className=\"lj-se-icon-sm\" strokeWidth={1.5} />\n </button>\n )}\n >\n {({ close }) => (\n <div className=\"lj-se-addmenu\">\n {available.length === 0 ? (\n <div className=\"lj-se-addmenu-empty\">{emptyHint}</div>\n ) : (\n available.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n className=\"lj-se-addmenu-item\"\n onClick={() => {\n close();\n onAdd(o.value);\n }}\n >\n {o.label}\n </button>\n ))\n )}\n </div>\n )}\n </Popover>\n );\n}\n\nexport function SceneCastPropRows({\n scene,\n episodeIndex,\n sceneIndex,\n actorMap,\n propMap,\n disabled,\n onSaveData,\n onRequestAssetDelete,\n onNavigateAsset,\n}: {\n scene: Scene;\n episodeIndex: number;\n sceneIndex: number;\n actorMap: ReturnType<typeof getActorMap>;\n propMap: ReturnType<typeof getPropMap>;\n disabled: boolean;\n onSaveData: (updater: (current: ScriptProject) => ScriptProject) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n /** scene→asset navigation: jump to the asset's card in the stream */\n onNavigateAsset?: (sel: StudioSelection) => void;\n}) {\n const context = getSceneContext(scene);\n const sceneActors = context.actors ?? [];\n const sceneProps = context.props ?? [];\n const currentActorIds = sceneActors.map((i) => (i.actor_id ?? \"\").trim()).filter(Boolean);\n const currentPropIds = sceneProps.map((i) => (i.prop_id ?? \"\").trim()).filter(Boolean);\n\n const actorOptions: SelectOption[] = Array.from(actorMap.values())\n .map((a) => ({ value: (a.actor_id ?? \"\").trim(), label: getActorDisplayName(a) }))\n .filter((o) => o.value);\n const propOptions: SelectOption[] = Array.from(propMap.values())\n .map((p) => ({ value: (p.prop_id ?? \"\").trim(), label: getPropDisplayName(p) }))\n .filter((o) => o.value);\n\n const writeRefs = (field: \"actors\" | \"props\", nextIds: string[]) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, field, nextIds.join(\",\")));\n\n return (\n <div className=\"lj-se-refs\">\n <div className=\"lj-se-ref-row\">\n <span className=\"lj-se-ref-label\">CAST</span>\n <div className=\"lj-se-ref-chips\">\n {sceneActors.length === 0 ? <span className=\"lj-se-ref-empty\">—</span> : null}\n {sceneActors.map((ref, idx) => {\n const id = (ref.actor_id ?? \"\").trim();\n if (!id) return null;\n const actor = actorMap.get(id);\n const name = actor ? getActorDisplayName(actor) : id;\n return (\n <AssetStateChip\n key={`${id}-${idx}`}\n name={name}\n orphan={!actor}\n states={actor?.states}\n currentStateId={ref.state_id}\n disabled={disabled}\n onNavigate={onNavigateAsset ? () => onNavigateAsset({ kind: \"actor\", actorId: id, origin: \"reference\" }) : undefined}\n onChangeState={(next) =>\n onSaveData((cur) =>\n updateSceneActorState(cur, episodeIndex, sceneIndex, id, next),\n )\n }\n onDelete={() => {\n if (onRequestAssetDelete) {\n onRequestAssetDelete({\n kind: \"actor\",\n id,\n name,\n description: actor?.description,\n episodeIndex,\n sceneIndex,\n });\n return;\n }\n writeRefs(\"actors\", currentActorIds.filter((x) => x !== id));\n }}\n />\n );\n })}\n <AddRefControl\n options={actorOptions}\n existingIds={currentActorIds}\n disabled={disabled}\n emptyHint=\"没有可添加的角色\"\n onAdd={(id) =>\n currentActorIds.includes(id) ? undefined : writeRefs(\"actors\", [...currentActorIds, id])\n }\n />\n </div>\n </div>\n\n <div className=\"lj-se-ref-row\">\n <span className=\"lj-se-ref-label\">PROP</span>\n <div className=\"lj-se-ref-chips\">\n {sceneProps.length === 0 ? <span className=\"lj-se-ref-empty\">—</span> : null}\n {sceneProps.map((ref, idx) => {\n const id = (ref.prop_id ?? \"\").trim();\n if (!id) return null;\n const prop = propMap.get(id);\n const name = prop ? getPropDisplayName(prop) : id;\n return (\n <AssetStateChip\n key={`${id}-${idx}`}\n name={name}\n orphan={!prop}\n states={prop?.states}\n currentStateId={ref.state_id}\n disabled={disabled}\n onNavigate={onNavigateAsset ? () => onNavigateAsset({ kind: \"prop\", propId: id, origin: \"reference\" }) : undefined}\n onChangeState={(next) =>\n onSaveData((cur) =>\n updateScenePropState(cur, episodeIndex, sceneIndex, id, next),\n )\n }\n onDelete={() => {\n if (onRequestAssetDelete) {\n onRequestAssetDelete({\n kind: \"prop\",\n id,\n name,\n description: prop?.description,\n episodeIndex,\n sceneIndex,\n });\n return;\n }\n writeRefs(\"props\", currentPropIds.filter((x) => x !== id));\n }}\n />\n );\n })}\n <AddRefControl\n options={propOptions}\n existingIds={currentPropIds}\n disabled={disabled}\n emptyHint=\"没有可添加的道具\"\n onAdd={(id) =>\n currentPropIds.includes(id) ? undefined : writeRefs(\"props\", [...currentPropIds, id])\n }\n />\n </div>\n </div>\n </div>\n );\n}\n","/**\n * SceneHeader — scene number + slug (\"INT./EXT. · LOCATION — TIME\") + location\n * state + delete, plus the CAST/PROP reference rows. All picks are inline\n * <select> styled as text; scene number is NOT renumbered on structural edits\n * (assets are keyed by scene_id).\n */\nimport type { ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { ArrowUpToLine, Trash2 } from \"lucide-react\";\nimport type { Scene, ScriptProject } from \"../types.js\";\nimport {\n deleteScene,\n getPrimarySceneLocationId,\n mergeSceneIntoPrev,\n updateSceneField,\n updateSceneLocationState,\n} from \"../mutations/editor-utils.js\";\nimport {\n getActorMap,\n getLocationDisplayName,\n getLocationMap,\n getPropMap,\n getSceneContext,\n getSceneNumber,\n getStateDisplayName,\n} from \"../utils.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { Popover } from \"../primitives/popover.js\";\nimport { RowMenuPanel, type RowMenuItem } from \"../primitives/row-menu.js\";\nimport { SceneCastPropRows, type AssetDeleteRequest } from \"./scene-cast-prop-rows.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { cn } from \"../cn.js\";\n\n/**\n * The scene number doubles as the scene's control hub — hovering warms it with\n * a soft ink halo; clicking opens scene-level structural ops (merge into the\n * previous scene / delete the whole scene). Keeps every structural command on\n * the left margin, in the paper's own ink.\n */\nfunction SceneNumberMenu({\n label,\n triggerClassName,\n canMerge,\n disabled,\n onMerge,\n onDelete,\n}: {\n label: ReactNode;\n triggerClassName: string;\n canMerge: boolean;\n disabled: boolean;\n onMerge: () => void;\n onDelete: () => void;\n}) {\n if (disabled) {\n return <span className={triggerClassName}>{label}</span>;\n }\n const items: RowMenuItem[] = [];\n if (canMerge) items.push({ icon: ArrowUpToLine, label: \"并入上一场\", onSelect: onMerge });\n items.push({ icon: Trash2, label: \"删除整场\", onSelect: onDelete, danger: true });\n return (\n <Popover\n align=\"start\"\n side=\"bottom\"\n className=\"lj-se-scenenum-pop\"\n panelClassName=\"lj-se-rowmenu\"\n trigger={({ open, toggle }) => (\n <button\n type=\"button\"\n className={cn(triggerClassName, \"lj-se-scenenum-btn\", open && \"is-open\")}\n title=\"场操作\"\n aria-label=\"场操作\"\n onClick={toggle}\n >\n {label}\n </button>\n )}\n >\n {({ close }) => <RowMenuPanel close={close} sections={[items]} />}\n </Popover>\n );\n}\n\nconst SPACE_OPTIONS: SelectOption[] = [\n { value: \"interior\", label: \"INT.\" },\n { value: \"exterior\", label: \"EXT.\" },\n];\nconst TIME_OPTIONS: SelectOption[] = [\n { value: \"day\", label: \"DAY\" },\n { value: \"night\", label: \"NIGHT\" },\n { value: \"dawn\", label: \"DAWN\" },\n { value: \"dusk\", label: \"DUSK\" },\n];\n// Asian print labels: 时/空 in Chinese\nconst ASIAN_SPACE_OPTIONS: SelectOption[] = [\n { value: \"interior\", label: \"内\" },\n { value: \"exterior\", label: \"外\" },\n];\nconst ASIAN_TIME_OPTIONS: SelectOption[] = [\n { value: \"day\", label: \"日\" },\n { value: \"night\", label: \"夜\" },\n { value: \"dawn\", label: \"晨\" },\n { value: \"dusk\", label: \"暮\" },\n];\n\nexport function SceneHeader({\n scene,\n episodeIndex,\n sceneIndex,\n actorMap,\n locationMap,\n propMap,\n disabled,\n focused = false,\n format = \"standard\",\n onSaveData,\n onRequestAssetDelete,\n onNavigateAsset,\n}: {\n scene: Scene;\n episodeIndex: number;\n sceneIndex: number;\n actorMap: ReturnType<typeof getActorMap>;\n locationMap: ReturnType<typeof getLocationMap>;\n propMap: ReturnType<typeof getPropMap>;\n disabled: boolean;\n focused?: boolean;\n format?: \"standard\" | \"asian\";\n onSaveData: (updater: (current: ScriptProject) => ScriptProject) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n onNavigateAsset?: (sel: StudioSelection) => void;\n}) {\n const primaryLocationId = getPrimarySceneLocationId(scene);\n const location = primaryLocationId ? locationMap.get(primaryLocationId) : undefined;\n const hasOrphanLocation = !!primaryLocationId && !location;\n const locationStateId = getSceneContext(scene).locations.find(\n (i) => (i.location_id ?? \"\").trim() === primaryLocationId,\n )?.state_id;\n\n const locationOptions = useMemo<SelectOption[]>(\n () =>\n Array.from(locationMap.values())\n .map((loc) => ({ value: (loc.location_id ?? \"\").trim(), label: getLocationDisplayName(loc) }))\n .filter((o) => o.value),\n [locationMap],\n );\n const locationStateOptions = useMemo<SelectOption[]>(\n () =>\n (location?.states ?? [])\n .map((s) => ({ value: (s.state_id ?? \"\").trim(), label: getStateDisplayName(s) }))\n .filter((o) => o.value),\n [location],\n );\n\n // ── Asian print heading: \"n. 地点 日/内\" (compact, no cast/prop rows) ──\n if (format === \"asian\") {\n return (\n <div className=\"lj-se-asian-head group\">\n <SceneNumberMenu\n label={`${getSceneNumber(scene, sceneIndex)}.`}\n triggerClassName=\"lj-se-asian-num\"\n canMerge={sceneIndex > 0}\n disabled={disabled}\n onMerge={() => onSaveData((cur) => mergeSceneIntoPrev(cur, episodeIndex, sceneIndex))}\n onDelete={() => onSaveData((cur) => deleteScene(cur, episodeIndex, sceneIndex))}\n />\n <SelectField\n value={primaryLocationId}\n options={locationOptions}\n disabled={disabled}\n placeholder=\"地点\"\n className={cn(\"lj-se-asian-loc\", hasOrphanLocation && \"is-orphan\")}\n onChange={(v) => onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"location\", v))}\n />\n <span className=\"lj-se-asian-slug\">\n <SelectField\n mono\n value={scene.environment?.time || \"day\"}\n options={ASIAN_TIME_OPTIONS}\n disabled={disabled}\n onChange={(v) => onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"time\", v))}\n />\n <span className=\"lj-se-asian-slash\">/</span>\n <SelectField\n mono\n value={scene.environment?.space || \"interior\"}\n options={ASIAN_SPACE_OPTIONS}\n disabled={disabled}\n onChange={(v) => onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"space\", v))}\n />\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"lj-se-scene-head group\">\n <div className=\"lj-se-scene-headrow\">\n <SceneNumberMenu\n label={String(getSceneNumber(scene, sceneIndex))}\n triggerClassName={cn(\"lj-se-scene-num\", focused && \"is-focused\")}\n canMerge={sceneIndex > 0}\n disabled={disabled}\n onMerge={() => onSaveData((cur) => mergeSceneIntoPrev(cur, episodeIndex, sceneIndex))}\n onDelete={() => onSaveData((cur) => deleteScene(cur, episodeIndex, sceneIndex))}\n />\n <div className=\"lj-se-scene-slug\">\n <SelectField\n mono\n value={scene.environment?.space || \"interior\"}\n options={SPACE_OPTIONS}\n disabled={disabled}\n onChange={(v) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"space\", v))\n }\n />\n <SelectField\n value={primaryLocationId}\n options={locationOptions}\n disabled={disabled}\n placeholder=\"选择地点\"\n title={hasOrphanLocation ? `地点 ${primaryLocationId} 不存在` : undefined}\n className={cn(\"lj-se-slug-loc\", hasOrphanLocation && \"is-orphan\")}\n onChange={(v) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"location\", v))\n }\n />\n <span className=\"lj-se-slug-dash\">—</span>\n <SelectField\n mono\n value={scene.environment?.time || \"day\"}\n options={TIME_OPTIONS}\n disabled={disabled}\n onChange={(v) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"time\", v))\n }\n />\n {locationStateOptions.length > 0 ? (\n <SelectField\n value={(locationStateId ?? \"\").trim()}\n options={locationStateOptions}\n placeholder=\"无状态\"\n disabled={disabled}\n className=\"lj-se-slug-state\"\n onChange={(v) =>\n onSaveData((cur) =>\n updateSceneLocationState(cur, episodeIndex, sceneIndex, primaryLocationId, v || null),\n )\n }\n />\n ) : null}\n </div>\n </div>\n\n <SceneCastPropRows\n scene={scene}\n episodeIndex={episodeIndex}\n sceneIndex={sceneIndex}\n actorMap={actorMap}\n propMap={propMap}\n disabled={disabled}\n onSaveData={onSaveData}\n onRequestAssetDelete={onRequestAssetDelete}\n onNavigateAsset={onNavigateAsset}\n />\n </div>\n );\n}\n","/**\n * 角色对话名色板:按 actor_id 稳定 hash 到 8 色之一。\n * 色板定义在 globals.css 的 --actor-cue-1..8(亮/暗各一份),\n * 已调过亮度与饱和度,保证在牛皮纸底色上可读且互相错开。\n *\n * 没有 actor_id 时退回 --paper-cue-dialogue / --paper-cue-inner。\n */\n\nconst PALETTE_SIZE = 8;\n\nfunction hashActorId(id: string): number {\n let h = 5381;\n for (let i = 0; i < id.length; i++) {\n h = (h * 33) ^ id.charCodeAt(i);\n }\n return Math.abs(h | 0);\n}\n\nexport function getActorCueVar(\n actorId: string | null | undefined,\n tone: \"dialogue\" | \"inner\" = \"dialogue\",\n): string {\n const id = actorId?.trim();\n if (!id) {\n return tone === \"inner\" ? \"var(--lj-se-cue-inner)\" : \"var(--lj-se-cue-dialogue)\";\n }\n const idx = (hashActorId(id) % PALETTE_SIZE) + 1;\n return `var(--lj-se-actor-cue-${idx})`;\n}\n","/**\n * SceneItemRow — one action / dialogue / inner-thought / narration line.\n *\n * Renders in two formats (both EDITABLE via the click-to-edit primitive):\n * - \"standard\": centered speaker cue + centered dialogue (screenplay look)\n * - \"asian\": compact inline \"角色(情绪):内容\" print look\n *\n * Free text (content, emotion) uses <EditableText>; the speaker/actor is an\n * inline <select>. Hover reveals a type-change picker + 2-step delete.\n * Memoized so editing one row in a long scene re-renders only that row.\n */\nimport { memo } from \"react\";\nimport type { ScriptItem } from \"../types.js\";\nimport { ScriptContentType } from \"../types.js\";\nimport {\n findState,\n getActorDisplayName,\n getActorMap,\n getDialogueDeliveryLabel,\n getDialogueSpeakerLabel,\n getLocationDisplayName,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n getSpeakerMap,\n getStateDisplayName,\n isActorBearingContentType,\n translateEmotionLabel,\n} from \"../utils.js\";\nimport { getActorCueVar } from \"../actor-color.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { RowControlHandle } from \"../primitives/row-menu.js\";\nimport { HighlightedText } from \"../primitives/highlighted-text.js\";\nimport { cn } from \"../cn.js\";\n\nexport type ScriptFormat = \"standard\" | \"asian\";\n\nfunction formatStateChangeLabels(\n item: ScriptItem,\n actorMap: ReturnType<typeof getActorMap>,\n locationMap: ReturnType<typeof getLocationMap>,\n propMap: ReturnType<typeof getPropMap>,\n): string[] {\n const labels = (item.state_changes ?? [])\n .map((change) => {\n const kind = change.target_kind?.trim() || \"actor\";\n const id = change.target_id?.trim() || \"\";\n if (!id) return \"\";\n const states =\n kind === \"location\"\n ? locationMap.get(id)?.states\n : kind === \"prop\"\n ? propMap.get(id)?.states\n : actorMap.get(id)?.states;\n const name =\n kind === \"location\"\n ? getLocationDisplayName(locationMap.get(id)) || id\n : kind === \"prop\"\n ? getPropDisplayName(propMap.get(id)) || id\n : getActorDisplayName(actorMap.get(id)) || id;\n const from = getStateDisplayName(findState(states, change.from_state_id)) || change.from_state_id?.trim() || \"未设\";\n const to = getStateDisplayName(findState(states, change.to_state_id)) || change.to_state_id?.trim() || \"未设\";\n return `${name}:${from} → ${to}`;\n })\n .filter(Boolean);\n if (item.transition_prompt?.process || item.transition_prompt?.contrast) {\n labels.push(\"画面变化已设置\");\n }\n return labels;\n}\n\nfunction StateBadges({ labels }: { labels: string[] }) {\n if (labels.length === 0) return null;\n return (\n <div className=\"lj-se-state-badges\">\n {labels.map((label, i) => (\n <span key={`${label}-${i}`} className=\"lj-se-state-badge\">\n {label}\n </span>\n ))}\n </div>\n );\n}\n\nfunction SceneItemRowImpl({\n item,\n actorMap,\n speakerMap = new Map(),\n locationMap = new Map(),\n propMap = new Map(),\n actorOptions,\n format,\n disabled,\n autoEdit,\n onEditEnd,\n canSplit,\n dragHandleProps,\n onSave,\n onSaveActor,\n onSaveEmotion,\n onChangeType,\n onInsertAbove,\n onInsertBelow,\n onSplitHere,\n onDelete,\n}: {\n item: ScriptItem;\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap?: ReturnType<typeof getSpeakerMap>;\n locationMap?: ReturnType<typeof getLocationMap>;\n propMap?: ReturnType<typeof getPropMap>;\n actorOptions: SelectOption[];\n format: ScriptFormat;\n disabled: boolean;\n autoEdit?: boolean;\n onEditEnd?: () => void;\n canSplit?: boolean;\n dragHandleProps?: React.HTMLAttributes<HTMLButtonElement> & { draggable?: boolean };\n onSave: (value: string) => void;\n onSaveActor: (actorId: string) => void;\n onSaveEmotion: (emotion: string) => void;\n onChangeType: (type: ScriptContentType) => void;\n onInsertAbove: () => void;\n onInsertBelow: () => void;\n onSplitHere?: () => void;\n onDelete: () => void;\n}) {\n const type = (item.type as ScriptContentType) ?? ScriptContentType.Dialogue;\n const content = item.content ?? \"\";\n const actorId = item.actor_id?.trim() || \"\";\n const emotion = translateEmotionLabel(item.emotion);\n const stateLabels = formatStateChangeLabels(item, actorMap, locationMap, propMap);\n // Only genuinely multi-speaker lines (overlap / per-line speakers / >1 speaker)\n // stay read-only. A SINGLE-speaker line is editable via the actor picker even\n // if it uses the structured speaker_id model.\n const multiSpeaker =\n type === ScriptContentType.Dialogue &&\n (item.delivery === \"overlap\" || (item.lines?.length ?? 0) > 0 || (item.speakers?.length ?? 0) > 1);\n // Resolve speaker_id → its source actor so the picker reflects the current\n // speaker (single-speaker structured lines store the actor under speaker_id).\n const resolvedActorId =\n actorId ||\n (() => {\n const spkId = item.speaker_id?.trim() || item.speakers?.[0]?.speaker_id?.trim() || \"\";\n if (!spkId) return \"\";\n const spk = speakerMap.get(spkId);\n const kind = spk?.source_kind?.trim();\n // the speaker's source can be an actor OR a prop (radio / TV / phone …)\n if ((kind === \"actor\" || kind === \"prop\") && spk?.source_id?.trim()) return spk.source_id.trim();\n if (spkId.startsWith(\"spk_\") && actorMap.has(spkId.slice(4))) return spkId.slice(4);\n return \"\";\n })();\n // resolve to an actor OR a prop — the cue/value works for either\n const resolvedActor = actorMap.get(resolvedActorId) ?? propMap.get(resolvedActorId);\n\n const handle = (\n <RowControlHandle\n currentType={type}\n canSplit={canSplit}\n disabled={disabled}\n dragHandleProps={dragHandleProps}\n onChangeType={onChangeType}\n onInsertAbove={onInsertAbove}\n onInsertBelow={onInsertBelow}\n onSplitHere={onSplitHere}\n onDelete={onDelete}\n />\n );\n\n // ── actor / speaker cue (dialogue + inner) ──────────────────────────────\n const actorCue = (tone: \"dialogue\" | \"inner\") =>\n multiSpeaker ? (\n <span\n className=\"lj-se-cue lj-se-cue--structured\"\n style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}\n >\n <HighlightedText text={getDialogueSpeakerLabel(item, actorMap, speakerMap) || \"未知发声源\"} />\n {getDialogueDeliveryLabel(item.delivery) ? (\n <span className=\"lj-se-cue-delivery\">({getDialogueDeliveryLabel(item.delivery)})</span>\n ) : null}\n </span>\n ) : (\n <SelectField\n value={resolvedActorId}\n options={actorOptions}\n disabled={disabled}\n placeholder=\"未知角色\"\n title=\"切换角色\"\n className={cn(\"lj-se-cue lj-se-cue--select\", resolvedActorId && !resolvedActor && \"is-orphan\")}\n style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}\n onChange={onSaveActor}\n />\n );\n\n // ── STANDARD format ─────────────────────────────────────────────────────\n if (format === \"standard\") {\n let body: React.ReactNode;\n if (type === ScriptContentType.Dialogue) {\n body = (\n <div className=\"lj-se-std-dialogue\">\n {actorCue(\"dialogue\")}\n <div className=\"lj-se-std-emotion\">\n <EditableText value={item.emotion ?? \"\"} disabled={disabled} placeholder=\"情绪…\" onSave={onSaveEmotion} />\n </div>\n <EditableText\n multiline\n value={content}\n disabled={disabled}\n autoEdit={autoEdit}\n onEditEnd={onEditEnd}\n placeholder=\"输入对白…\"\n className=\"lj-se-std-line\"\n onSave={onSave}\n />\n </div>\n );\n } else if (type === ScriptContentType.InnerThought) {\n body = (\n <div className=\"lj-se-std-dialogue\">\n {actorCue(\"inner\")}\n <EditableText\n multiline\n value={content}\n disabled={disabled}\n autoEdit={autoEdit}\n onEditEnd={onEditEnd}\n placeholder=\"输入心理活动…\"\n className=\"lj-se-std-inner\"\n onSave={onSave}\n />\n </div>\n );\n } else {\n body = (\n <EditableText\n multiline\n value={content}\n disabled={disabled}\n autoEdit={autoEdit}\n onEditEnd={onEditEnd}\n placeholder={type === ScriptContentType.Narration ? \"输入旁白…\" : \"输入动作…\"}\n className={cn(\"lj-se-std-action\", type === ScriptContentType.Narration && \"is-narration\")}\n onSave={onSave}\n />\n );\n }\n return (\n <div className=\"lj-se-row group\">\n {handle}\n {body}\n <StateBadges labels={stateLabels} />\n </div>\n );\n }\n\n // ── ASIAN format (compact inline print) ─────────────────────────────────\n let body: React.ReactNode;\n if (type === ScriptContentType.Action) {\n body = (\n <p className=\"lj-se-asian-action\">\n <span className=\"lj-se-asian-action-mark\">△</span>\n <EditableText multiline value={content} disabled={disabled} autoEdit={autoEdit} onEditEnd={onEditEnd} placeholder=\"输入动作…\" onSave={onSave} />\n </p>\n );\n } else if (type === ScriptContentType.Narration) {\n body = (\n <p className=\"lj-se-asian-narration\">\n <EditableText multiline value={content} disabled={disabled} autoEdit={autoEdit} onEditEnd={onEditEnd} placeholder=\"输入旁白…\" onSave={onSave} />\n </p>\n );\n } else {\n const isInner = type === ScriptContentType.InnerThought;\n const tone = isInner ? \"inner\" : \"dialogue\";\n const tag = isInner ? (emotion ? `OS·${emotion}` : \"OS\") : emotion;\n body = (\n <p className={cn(\"lj-se-asian-cueline\", isInner && \"is-inner\")}>\n {multiSpeaker ? (\n <strong className=\"lj-se-asian-speaker\" style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}>\n <HighlightedText text={getDialogueSpeakerLabel(item, actorMap, speakerMap)} />\n </strong>\n ) : (\n <SelectField\n value={resolvedActorId}\n options={actorOptions}\n disabled={disabled}\n placeholder=\"未知角色\"\n className={cn(\"lj-se-asian-speaker lj-se-asian-speaker--select\", resolvedActorId && !resolvedActor && \"is-orphan\")}\n style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}\n onChange={onSaveActor}\n />\n )}\n {!multiSpeaker ? (\n <span className=\"lj-se-asian-tag\">\n (\n <EditableText value={item.emotion ?? \"\"} disabled={disabled} placeholder={isInner ? \"OS\" : \"情绪\"} onSave={onSaveEmotion} />\n )\n </span>\n ) : tag ? (\n <span className=\"lj-se-asian-tag\">({tag})</span>\n ) : null}\n <span className=\"lj-se-asian-colon\">:</span>\n <EditableText multiline value={content} disabled={disabled} autoEdit={autoEdit} onEditEnd={onEditEnd} placeholder=\"输入对白…\" onSave={onSave} />\n </p>\n );\n }\n return (\n <div className=\"lj-se-row lj-se-row--asian group\">\n {handle}\n {body}\n <StateBadges labels={stateLabels} />\n </div>\n );\n}\n\nexport const SceneItemRow = memo(SceneItemRowImpl);\n\nexport { isActorBearingContentType };\n","/**\n * SceneEditor — one scene: header (slug + cast/prop) + the action rows. Every\n * structural op (insert / change-type / split / delete) lives on the left via\n * each row's RowControlHandle; the scene's own ops (merge / delete) live on the\n * scene number. Pure: every change is a (prev)=>next patch on the whole\n * ScriptProject via onEdit. scene_id is never renumbered by these ops.\n */\nimport { Fragment, memo, useCallback, useMemo, useState } from \"react\";\nimport { Check, Plus, X } from \"lucide-react\";\nimport { cn } from \"../cn.js\";\nimport type { Scene, ScriptItem, ScriptProject } from \"../types.js\";\nimport type { DiffActionMark } from \"../diff/diff-engine.js\";\nimport { ScriptContentType } from \"../types.js\";\nimport {\n deleteSceneItem,\n insertSceneItem,\n splitScene,\n updateSceneItemActor,\n updateSceneItemContent,\n updateSceneItemEmotion,\n} from \"../mutations/editor-utils.js\";\nimport { useDragReorder } from \"../stream/drag-context.js\";\nimport {\n buildNewScriptItem,\n pickInheritedActorId,\n updateSceneItemType,\n} from \"../mutations/item-mutations.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n getSpeakerMap,\n} from \"../utils.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { SceneHeader } from \"./scene-header.js\";\nimport { SceneItemRow, type ScriptFormat } from \"./scene-item-row.js\";\nimport type { AssetDeleteRequest } from \"./scene-cast-prop-rows.js\";\nimport type { StudioSelection } from \"../selection.js\";\n\ntype Maps = {\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap: ReturnType<typeof getSpeakerMap>;\n locationMap: ReturnType<typeof getLocationMap>;\n propMap: ReturnType<typeof getPropMap>;\n};\n\n/** the per-line ✓/✗ that sits at the right edge of a changed / ghost row */\nfunction DiffActionControls({ onAccept, onReject }: { onAccept: () => void; onReject: () => void }) {\n return (\n <span className=\"lj-se-actiondiff-ctrl\">\n <button type=\"button\" className=\"lj-se-actiondiff-reject\" title=\"拒绝这行\" onClick={onReject}>\n <X className=\"lj-se-ic-3\" strokeWidth={2.75} />\n </button>\n <button type=\"button\" className=\"lj-se-actiondiff-accept\" title=\"接受这行\" onClick={onAccept}>\n <Check className=\"lj-se-ic-3\" strokeWidth={2.75} />\n </button>\n </span>\n );\n}\n\nfunction SceneEditorImpl({\n episodeIndex,\n sceneIndex,\n scene,\n maps,\n format,\n disabled,\n focused = false,\n actionDiff,\n onEdit,\n onNavigateAsset,\n onRequestAssetDelete,\n}: {\n episodeIndex: number;\n sceneIndex: number;\n scene: Scene;\n maps: Maps;\n format: ScriptFormat;\n disabled: boolean;\n focused?: boolean;\n /** action-level diff for this scene: highlighted rows + removed ghosts + ✓/✗ */\n actionDiff?: {\n byIndex: Map<number, DiffActionMark>;\n removedBefore: Map<number, DiffActionMark[]>;\n onAccept: (mark: DiffActionMark) => void;\n onReject: (mark: DiffActionMark) => void;\n };\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n onNavigateAsset?: (sel: StudioSelection) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n}) {\n const [pendingEdit, setPendingEdit] = useState<number | null>(null);\n const { actorMap, speakerMap, locationMap, propMap } = maps;\n const actions = scene.actions ?? [];\n\n // dialogue speaker candidates = actors + props (a prop like a radio / TV /\n // phone can \"speak\"); props get a (道具)suffix to disambiguate in the list.\n const actorOptions = useMemo<SelectOption[]>(() => {\n const out: SelectOption[] = [];\n for (const a of actorMap.values()) {\n const v = (a.actor_id ?? \"\").trim();\n if (v) out.push({ value: v, label: getActorDisplayName(a) });\n }\n for (const p of propMap.values()) {\n const v = (p.prop_id ?? \"\").trim();\n if (v) out.push({ value: v, label: `${getPropDisplayName(p)}(道具)` });\n }\n return out;\n }, [actorMap, propMap]);\n\n const insertAt = useCallback(\n (index: number, type: ScriptContentType) => {\n const inherited = pickInheritedActorId(scene, index);\n onEdit((cur) => insertSceneItem(cur, episodeIndex, sceneIndex, index, buildNewScriptItem(type, inherited)));\n setPendingEdit(index);\n },\n [onEdit, episodeIndex, sceneIndex, scene],\n );\n\n const clearPending = useCallback(() => setPendingEdit(null), []);\n\n const insertSame = (atIndex: number, refIndex: number) =>\n insertAt(atIndex, (actions[refIndex]?.type as ScriptContentType) ?? ScriptContentType.Dialogue);\n\n // ── drag-to-reorder (shared across scenes via context) ──────────────────\n const dnd = useDragReorder();\n const dragIndex =\n dnd?.source && dnd.source.ep === episodeIndex && dnd.source.sc === sceneIndex ? dnd.source.idx : null;\n const dropSlot =\n dnd?.dropAt && dnd.dropAt.ep === episodeIndex && dnd.dropAt.sc === sceneIndex ? dnd.dropAt.slot : null;\n\n const onDragStart = (e: React.DragEvent, idx: number) => {\n dnd?.begin({ ep: episodeIndex, sc: sceneIndex, idx });\n e.dataTransfer.effectAllowed = \"move\";\n try {\n e.dataTransfer.setData(\"text/plain\", String(idx));\n } catch {\n /* some browsers restrict setData timing */\n }\n // drag ghost = the whole row slot, not just the grip\n const slot = (e.currentTarget as HTMLElement).closest(\".lj-se-action-slot\");\n if (slot) e.dataTransfer.setDragImage(slot, 16, 16);\n };\n\n const onSlotDragOver = (e: React.DragEvent, idx: number) => {\n if (!dnd?.source) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const after = e.clientY > rect.top + rect.height / 2;\n dnd.hover({ ep: episodeIndex, sc: sceneIndex, slot: after ? idx + 1 : idx });\n };\n\n const onSlotDrop = (e: React.DragEvent) => {\n e.preventDefault();\n dnd?.drop();\n };\n\n const noop = () => {};\n // read-only render of an OLD (baseline) action — the deleted line of a\n // modified pair, and the removed \"ghost\" rows.\n const renderOldRow = (item: ScriptItem) => (\n <SceneItemRow\n item={item}\n actorMap={actorMap}\n speakerMap={speakerMap}\n locationMap={locationMap}\n propMap={propMap}\n actorOptions={actorOptions}\n format={format}\n disabled\n onSave={noop}\n onSaveActor={noop}\n onSaveEmotion={noop}\n onChangeType={noop}\n onInsertAbove={noop}\n onInsertBelow={noop}\n onDelete={noop}\n />\n );\n const renderGhosts = (beforeIdx: number) =>\n actionDiff?.removedBefore.get(beforeIdx)?.map((m, gi) => (\n <div key={`ghost-${beforeIdx}-${gi}`} className=\"lj-se-action-slot lj-se-diff-old lj-se-ghost-row\">\n <DiffActionControls onAccept={() => actionDiff.onAccept(m)} onReject={() => actionDiff.onReject(m)} />\n {m.item ? renderOldRow(m.item) : <p className=\"lj-se-ghost-empty\">(已删除空行)</p>}\n </div>\n )) ?? null;\n\n return (\n <div className=\"lj-se-scene\">\n <SceneHeader\n scene={scene}\n episodeIndex={episodeIndex}\n sceneIndex={sceneIndex}\n actorMap={actorMap}\n locationMap={locationMap}\n propMap={propMap}\n disabled={disabled}\n focused={focused}\n format={format}\n onSaveData={onEdit}\n onRequestAssetDelete={onRequestAssetDelete}\n onNavigateAsset={onNavigateAsset}\n />\n\n <div className=\"lj-se-actions\">\n {actions.map((item, idx) => {\n const mark = actionDiff?.byIndex.get(idx);\n return (\n <Fragment key={`item-${idx}`}>\n {renderGhosts(idx)}\n <div\n className={cn(\n \"lj-se-action-slot\",\n dragIndex === idx && \"is-dragging\",\n dropSlot === idx && \"drop-before\",\n mark && (mark.kind === \"added\" ? \"is-diff-added\" : \"is-diff-modified\"),\n )}\n onDragOver={(e) => onSlotDragOver(e, idx)}\n onDrop={onSlotDrop}\n >\n {mark ? (\n <DiffActionControls\n onAccept={() => actionDiff!.onAccept(mark)}\n onReject={() => actionDiff!.onReject(mark)}\n />\n ) : null}\n {mark?.kind === \"modified\" && mark.item ? (\n <div className=\"lj-se-diff-old\">{renderOldRow(mark.item)}</div>\n ) : null}\n <SceneItemRow\n item={item}\n actorMap={actorMap}\n speakerMap={speakerMap}\n locationMap={locationMap}\n propMap={propMap}\n actorOptions={actorOptions}\n format={format}\n disabled={disabled}\n autoEdit={pendingEdit === idx}\n onEditEnd={pendingEdit === idx ? clearPending : undefined}\n canSplit={idx > 0}\n dragHandleProps={\n disabled\n ? undefined\n : { draggable: true, onDragStart: (e) => onDragStart(e, idx), onDragEnd: () => dnd?.end() }\n }\n onSave={(content) => {\n clearPending();\n onEdit((cur) => updateSceneItemContent(cur, episodeIndex, sceneIndex, idx, content));\n }}\n onSaveActor={(actorId) =>\n onEdit((cur) => updateSceneItemActor(cur, episodeIndex, sceneIndex, idx, actorId))\n }\n onSaveEmotion={(emotion) =>\n onEdit((cur) => updateSceneItemEmotion(cur, episodeIndex, sceneIndex, idx, emotion))\n }\n onChangeType={(type) => {\n clearPending();\n onEdit((cur) => updateSceneItemType(cur, episodeIndex, sceneIndex, idx, type));\n }}\n onInsertAbove={() => insertSame(idx, idx)}\n onInsertBelow={() => insertSame(idx + 1, idx)}\n onSplitHere={\n idx > 0\n ? () => {\n clearPending();\n onEdit((cur) => splitScene(cur, episodeIndex, sceneIndex, idx));\n }\n : undefined\n }\n onDelete={() => {\n clearPending();\n onEdit((cur) => deleteSceneItem(cur, episodeIndex, sceneIndex, idx));\n }}\n />\n </div>\n </Fragment>\n );\n })}\n {renderGhosts(actions.length)}\n {dropSlot === actions.length && actions.length > 0 ? <div className=\"lj-se-dropline-end\" /> : null}\n {actions.length === 0 && !disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-scene-add-first\"\n onClick={() => insertAt(0, ScriptContentType.Dialogue)}\n >\n <Plus className=\"lj-se-ic-3\" strokeWidth={2} /> 添加内容\n </button>\n ) : null}\n {actions.length === 0 && disabled ? <p className=\"lj-se-scene-empty\">本场尚无内容</p> : null}\n </div>\n </div>\n );\n}\n\n/**\n * Memoized so editing one scene re-renders only that scene — other scenes keep\n * the same `scene`/`maps`/callback refs and skip. (Requires callers to pass\n * stable onEdit/onNavigateAsset/onRequestAssetDelete.)\n */\nexport const SceneEditor = memo(SceneEditorImpl);\n\n// re-export for the stream layer\nexport type { ScriptFormat };\n","/**\n * Flattens a ScriptProject into ONE continuous, stable-keyed item list for the\n * virtualized stream — mirroring agent-frontend's single global scroll:\n * each episode (episode-header → scene → scene → …)\n * → asset groups (角色 / 场景 / 道具: group-header → asset-card × N)\n * Plus selection ↔ flatIndex lookups (two-way) for scroll/scrollspy sync.\n * (世界观 & 风格 is edited in a dialog now, not inline — see ScriptEditor.)\n */\nimport type { ScriptProject } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\n\nexport type AssetGroup = \"actors\" | \"locations\" | \"props\";\n\nexport type FlatItem =\n | { key: string; kind: \"episode-header\"; episodeIdx: number }\n | { key: string; kind: \"scene\"; episodeIdx: number; sceneIdx: number; sceneId: string; isStart: boolean; isEnd: boolean }\n | { key: string; kind: \"episode-empty\"; episodeIdx: number }\n | { key: string; kind: \"asset-group-header\"; group: AssetGroup }\n | { key: string; kind: \"asset-card\"; group: AssetGroup; assetId: string }\n | { key: string; kind: \"add-episode\" };\n\nexport interface FlatStream {\n items: FlatItem[];\n indexByKey: Map<string, number>;\n sceneIndexLookup: Map<string, number>;\n /** `${episodeIdx}:${sceneId}` → flat index, so a clip/scene selection that\n * carries only the (stable) scene_id can still resolve a scroll target. */\n sceneIdLookup: Map<string, number>;\n assetIndexLookup: Map<string, number>;\n /** the episodes region renders as ONE continuous paper; these mark its\n * rounded top / bottom edges (episode headers in between stay seamless). */\n paperStartKey: string | null;\n paperEndKey: string | null;\n}\n\nconst SCENE_KEY = (e: number, s: number) => `ep:${e}:sc:${s}`;\nconst SCENE_ID_KEY = (e: number, id: string) => `ep:${e}:id:${id}`;\nconst ASSET_KEY = (g: AssetGroup, id: string) => `${g}:${id}`;\n\nfunction safeId(raw: string | undefined | null, fallback: string): string {\n const t = (raw ?? \"\").toString().trim();\n return t.length > 0 ? t : fallback;\n}\n\nconst GROUP_LABEL: Record<AssetGroup, string> = { actors: \"角色\", locations: \"场景\", props: \"道具\" };\nexport const assetGroupLabel = (g: AssetGroup) => GROUP_LABEL[g];\n\nexport function buildFlatStream(data: ScriptProject | null): FlatStream {\n const items: FlatItem[] = [];\n const indexByKey = new Map<string, number>();\n const sceneIndexLookup = new Map<string, number>();\n const sceneIdLookup = new Map<string, number>();\n const assetIndexLookup = new Map<string, number>();\n const push = (item: FlatItem) => {\n indexByKey.set(item.key, items.length);\n if (item.kind === \"scene\") {\n sceneIndexLookup.set(SCENE_KEY(item.episodeIdx, item.sceneIdx), items.length);\n sceneIdLookup.set(SCENE_ID_KEY(item.episodeIdx, item.sceneId), items.length);\n }\n if (item.kind === \"asset-card\") assetIndexLookup.set(ASSET_KEY(item.group, item.assetId), items.length);\n items.push(item);\n };\n\n if (!data) {\n return { items, indexByKey, sceneIndexLookup, sceneIdLookup, assetIndexLookup, paperStartKey: null, paperEndKey: null };\n }\n\n let paperStartKey: string | null = null;\n let paperEndKey: string | null = null;\n\n (data.episodes ?? []).forEach((episode, ei) => {\n const headerKey = `ep:${ei}:header`;\n push({ key: headerKey, kind: \"episode-header\", episodeIdx: ei });\n if (paperStartKey === null) paperStartKey = headerKey; // first episode header opens the paper\n paperEndKey = headerKey; // tentatively; a scene below will override\n const scenes = episode.scenes ?? [];\n if (scenes.length === 0) {\n const emptyKey = `ep:${ei}:empty`;\n push({ key: emptyKey, kind: \"episode-empty\", episodeIdx: ei });\n paperEndKey = emptyKey; // the empty-episode affordance closes the paper\n } else {\n scenes.forEach((scene, si) => {\n const sceneId = safeId(scene.scene_id, `__idx:${si}`);\n const key = `sc:ep${ei}:sc${si}:${sceneId}`;\n push({\n key,\n kind: \"scene\",\n episodeIdx: ei,\n sceneIdx: si,\n sceneId,\n isStart: si === 0,\n isEnd: si === scenes.length - 1,\n });\n paperEndKey = key; // last scene pushed closes the paper\n });\n }\n });\n\n // \"+ new episode\" affordance sits just below the script, above the assets\n push({ key: \"add-episode\", kind: \"add-episode\" });\n\n const specs: Array<{ group: AssetGroup; ids: string[] }> = [\n { group: \"actors\", ids: (data.actors ?? []).map((a, i) => safeId(a.actor_id, `__idx:${i}`)) },\n { group: \"locations\", ids: (data.locations ?? []).map((l, i) => safeId(l.location_id, `__idx:${i}`)) },\n { group: \"props\", ids: (data.props ?? []).map((p, i) => safeId(p.prop_id, `__idx:${i}`)) },\n ];\n for (const { group, ids } of specs) {\n push({ key: `asset-group:${group}`, kind: \"asset-group-header\", group });\n ids.forEach((assetId) => push({ key: `asset:${group}:${assetId}`, kind: \"asset-card\", group, assetId }));\n }\n\n return { items, indexByKey, sceneIndexLookup, sceneIdLookup, assetIndexLookup, paperStartKey, paperEndKey };\n}\n\n/** selection → first locatable flat index (or null). */\nexport function selectionToFlatIndex(stream: FlatStream, sel: StudioSelection): number | null {\n switch (sel.kind) {\n case \"episode\":\n return stream.indexByKey.get(`ep:${sel.episodeIdx}:header`) ?? null;\n case \"scene\":\n return stream.sceneIndexLookup.get(SCENE_KEY(sel.episodeIdx, sel.sceneIdx)) ?? null;\n case \"clip\": {\n // prefer the positional index; fall back to the stable scene_id so a clip\n // selection that knows only the id (reference/chat origin) still scrolls.\n if (sel.sceneIdx !== undefined) {\n const byIdx = stream.sceneIndexLookup.get(SCENE_KEY(sel.episodeIdx, sel.sceneIdx));\n if (byIdx !== undefined) return byIdx;\n }\n const id = (sel.sceneId ?? \"\").trim();\n return id ? stream.sceneIdLookup.get(SCENE_ID_KEY(sel.episodeIdx, id)) ?? null : null;\n }\n case \"actor\":\n return stream.assetIndexLookup.get(ASSET_KEY(\"actors\", sel.actorId)) ?? null;\n case \"location\":\n return stream.assetIndexLookup.get(ASSET_KEY(\"locations\", sel.locationId)) ?? null;\n case \"prop\":\n return stream.assetIndexLookup.get(ASSET_KEY(\"props\", sel.propId)) ?? null;\n default:\n return null;\n }\n}\n\n/**\n * flatIndex → selection. Transitional items (episode-empty, asset-group-header)\n * return null so the scrollspy keeps the previous selection while passing over\n * them (no flicker).\n */\nexport function flatIndexToSelection(stream: FlatStream, idx: number): StudioSelection | null {\n const item = stream.items[idx];\n if (!item) return null;\n switch (item.kind) {\n case \"episode-header\":\n return { kind: \"episode\", episodeIdx: item.episodeIdx };\n case \"scene\":\n return { kind: \"scene\", episodeIdx: item.episodeIdx, sceneIdx: item.sceneIdx };\n case \"asset-card\":\n if (item.group === \"actors\") return { kind: \"actor\", actorId: item.assetId };\n if (item.group === \"locations\") return { kind: \"location\", locationId: item.assetId };\n return { kind: \"prop\", propId: item.assetId };\n default:\n return null;\n }\n}\n","/**\n * Pure mutations for the entity dictionary (actors / locations / props) and\n * their asset states. Operate directly on ScriptProject; identity-preserving\n * for untouched entries.\n */\nimport type { AssetState, ScriptActor, ScriptLocation, ScriptProject, ScriptProp } from \"../types.js\";\n\nexport type EntityKind = \"actor\" | \"location\" | \"prop\";\n\nconst ID_FIELD: Record<EntityKind, \"actor_id\" | \"location_id\" | \"prop_id\"> = {\n actor: \"actor_id\",\n location: \"location_id\",\n prop: \"prop_id\",\n};\nconst NAME_FIELD: Record<EntityKind, \"actor_name\" | \"location_name\" | \"prop_name\"> = {\n actor: \"actor_name\",\n location: \"location_name\",\n prop: \"prop_name\",\n};\nconst LIST_FIELD: Record<EntityKind, \"actors\" | \"locations\" | \"props\"> = {\n actor: \"actors\",\n location: \"locations\",\n prop: \"props\",\n};\n\ntype AnyEntity = ScriptActor & ScriptLocation & ScriptProp;\n\nfunction mapEntity(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n fn: (e: AnyEntity) => AnyEntity,\n): ScriptProject {\n const listKey = LIST_FIELD[kind];\n const idField = ID_FIELD[kind];\n const list = (data[listKey] ?? []) as AnyEntity[];\n let changed = false;\n const next = list.map((e) => {\n if ((e[idField] ?? \"\").trim() !== id) return e;\n changed = true;\n return fn(e);\n });\n if (!changed) return data;\n return { ...data, [listKey]: next };\n}\n\nexport function updateEntityName(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n name: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({ ...e, [NAME_FIELD[kind]]: name }));\n}\n\nexport function updateEntityDescription(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n description: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({ ...e, description }));\n}\n\nexport function updateEntityStateField(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n stateId: string,\n field: \"state_name\" | \"description\",\n value: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({\n ...e,\n states: (e.states ?? []).map((s) =>\n (s.state_id ?? \"\").trim() === stateId ? { ...s, [field]: value } : s,\n ),\n }));\n}\n\nexport function addEntityState(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n state: AssetState,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({ ...e, states: [...(e.states ?? []), state] }));\n}\n\nexport function removeEntityState(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n stateId: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({\n ...e,\n states: (e.states ?? []).filter((s) => (s.state_id ?? \"\").trim() !== stateId),\n }));\n}\n","/**\n * ScenePreviewCard — a read-only, asian-print render of one scene, shown when\n * hovering a node in the AssetStateTimeline. Mirrors SceneItemRow's \"asian\"\n * format (compact \"角色(情绪):内容\" print look) but strips all editing\n * affordances. Different line types are visually distinguished (action △ /\n * narration / dialogue / inner-thought OS) and the speaker carries its stable\n * per-actor cue color, so the preview reads like the real script.\n *\n * Rendered through a body portal at a fixed viewport position so neither the\n * timeline's horizontal scroll nor the virtualized stream clips it; the card is\n * pointer-events:none so it never steals hover from the node beneath it.\n */\nimport { useMemo, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { ScriptItem, ScriptProject } from \"../types.js\";\nimport { ScriptContentType } from \"../types.js\";\nimport {\n getActorMap,\n getDialogueDeliveryLabel,\n getDialogueSpeakerLabel,\n getEpisodeNumberLabel,\n getLocationDisplayName,\n getLocationMap,\n getSceneNumberLabel,\n getSpeakerMap,\n translateEmotionLabel,\n} from \"../utils.js\";\nimport { getPrimarySceneLocationId } from \"../mutations/editor-utils.js\";\nimport { getActorCueVar } from \"../actor-color.js\";\nimport { cn } from \"../cn.js\";\n\nconst SPACE_ZH: Record<string, string> = { interior: \"内\", exterior: \"外\" };\nconst TIME_ZH: Record<string, string> = { day: \"日\", night: \"夜\", dawn: \"晨\", dusk: \"暮\" };\n\n/** best-effort actor/prop id behind a line, for the cue color (mirrors SceneItemRow) */\nfunction resolveCueId(item: ScriptItem, actorMap: Map<string, unknown>, speakerMap: ReturnType<typeof getSpeakerMap>) {\n const actorId = item.actor_id?.trim();\n if (actorId) return actorId;\n const spkId = item.speaker_id?.trim() || item.speakers?.[0]?.speaker_id?.trim() || \"\";\n if (!spkId) return \"\";\n const spk = speakerMap.get(spkId);\n const kind = spk?.source_kind?.trim();\n if ((kind === \"actor\" || kind === \"prop\") && spk?.source_id?.trim()) return spk.source_id.trim();\n if (spkId.startsWith(\"spk_\") && actorMap.has(spkId.slice(4))) return spkId.slice(4);\n return \"\";\n}\n\nexport interface PreviewAnchor {\n episodeIndex: number;\n sceneIndex: number;\n rect: { top: number; bottom: number; left: number; width: number };\n /** the .lj-se-root subtree to portal into, so the editor's --lj-se-* tokens\n * (and the dark variant) cascade — body would leave the card unstyled. */\n host: HTMLElement | null;\n}\n\nexport function ScenePreviewCard({\n data,\n anchor,\n highlightId,\n highlightKind,\n onEnter,\n onLeave,\n}: {\n data: ScriptProject;\n anchor: PreviewAnchor;\n /** the card's own asset — its lines get a <mark>-like tint so they're easy to spot */\n highlightId?: string;\n highlightKind?: \"actor\" | \"location\" | \"prop\";\n /** keep the card open while the cursor is over it (so long scenes can be read/scrolled) */\n onEnter?: () => void;\n onLeave?: () => void;\n}) {\n const actorMap = useMemo(() => getActorMap(data.actors), [data.actors]);\n const locationMap = useMemo(() => getLocationMap(data.locations), [data.locations]);\n const speakerMap = useMemo(() => getSpeakerMap(data.speakers), [data.speakers]);\n\n const episode = data.episodes?.[anchor.episodeIndex];\n const scene = episode?.scenes?.[anchor.sceneIndex];\n if (!scene) return null;\n\n const locId = getPrimarySceneLocationId(scene);\n const locName = (locId ? getLocationDisplayName(locationMap.get(locId)) : \"\") || \"未指定地点\";\n const env = scene.environment ?? {};\n const slug = `${SPACE_ZH[env.space ?? \"interior\"] ?? env.space ?? \"\"}·${TIME_ZH[env.time ?? \"day\"] ?? env.time ?? \"\"}`;\n const actions = scene.actions ?? [];\n\n // Position: anchor below the node, flip above when low in the viewport. The\n // card is pointer-events:none so this never interferes with hovering nodes.\n const W = 360;\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 1280;\n const vh = typeof window !== \"undefined\" ? window.innerHeight : 800;\n const left = Math.min(Math.max(8, anchor.rect.left + anchor.rect.width / 2 - W / 2), vw - W - 8);\n const above = anchor.rect.top > vh * 0.55;\n const pos = above\n ? { left, bottom: vh - anchor.rect.top + 8, maxHeight: anchor.rect.top - 16 }\n : { left, top: anchor.rect.bottom + 8, maxHeight: vh - anchor.rect.bottom - 16 };\n\n const card = (\n <div className=\"lj-se-spv\" style={{ width: W, ...pos }} onMouseEnter={onEnter} onMouseLeave={onLeave}>\n <div className=\"lj-se-spv-head\">\n <span className=\"lj-se-spv-num\">\n {getEpisodeNumberLabel(episode!, anchor.episodeIndex)} · {getSceneNumberLabel(scene, anchor.sceneIndex)}\n </span>\n <span className=\"lj-se-spv-slug\">\n {locName} <span className=\"lj-se-spv-slug-env\">{slug}</span>\n </span>\n </div>\n <div className=\"lj-se-spv-body\">\n {actions.length === 0 ? (\n <p className=\"lj-se-spv-empty\">(本场暂无内容)</p>\n ) : (\n actions.map((item, i) => (\n <PreviewLine\n key={i}\n item={item}\n actorMap={actorMap}\n speakerMap={speakerMap}\n highlightId={highlightId}\n highlightKind={highlightKind}\n />\n ))\n )}\n </div>\n </div>\n );\n return createPortal(card, anchor.host ?? document.body);\n}\n\nfunction PreviewLine({\n item,\n actorMap,\n speakerMap,\n highlightId,\n highlightKind,\n}: {\n item: ScriptItem;\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap: ReturnType<typeof getSpeakerMap>;\n highlightId?: string;\n highlightKind?: \"actor\" | \"location\" | \"prop\";\n}) {\n const type = (item.type as ScriptContentType) ?? ScriptContentType.Dialogue;\n const content = item.content?.trim() ?? \"\";\n\n if (type === ScriptContentType.Action) {\n return (\n <p className=\"lj-se-spv-action\">\n <span className=\"lj-se-spv-mark\">△</span>\n {content || \"…\"}\n </p>\n );\n }\n if (type === ScriptContentType.Narration) {\n return <p className=\"lj-se-spv-narr\">{content || \"…\"}</p>;\n }\n\n // dialogue / inner-thought\n const isInner = type === ScriptContentType.InnerThought;\n const tone = isInner ? \"inner\" : \"dialogue\";\n const cueId = resolveCueId(item, actorMap, speakerMap);\n const speaker = getDialogueSpeakerLabel(item, actorMap, speakerMap) || \"未知角色\";\n const emotion = translateEmotionLabel(item.emotion);\n const delivery = getDialogueDeliveryLabel(item.delivery);\n const tag = isInner ? (emotion ? `OS·${emotion}` : \"OS\") : emotion;\n // This line \"belongs to\" the card's asset when the speaker resolves to it —\n // tint it (in the asset's own cue color) so you can locate it at a glance.\n const mine = !!highlightId && (highlightKind === \"actor\" || highlightKind === \"prop\") && cueId === highlightId;\n const mineStyle = mine ? ({ \"--mine\": getActorCueVar(cueId, tone) } as CSSProperties) : undefined;\n\n return (\n <p className={cn(\"lj-se-spv-cue\", isInner && \"is-inner\", mine && \"is-mine\")} style={mineStyle}>\n <strong className=\"lj-se-spv-speaker\" style={{ color: getActorCueVar(cueId, tone) }}>\n {speaker}\n {delivery ? <span className=\"lj-se-spv-delivery\">({delivery})</span> : null}\n </strong>\n {tag ? <span className=\"lj-se-spv-tag\">({tag})</span> : null}\n <span className=\"lj-se-spv-colon\">:</span>\n {content || \"…\"}\n </p>\n );\n}\n","/**\n * AssetStateTimeline — the state→scene REVERSE-LOOKUP view on an asset card.\n *\n * Where AssetReferenceGrid answers \"which scenes does this asset appear in?\",\n * this answers \"which scenes is this asset in state X?\" — by laying out one\n * swimlane per defined state, with the asset's scene appearances plotted left→\n * right in narrative order (episode → scene). Reading a lane horizontally shows\n * a state's span; reading a column vertically shows the state at that scene; an\n * appearance whose state_id is unset/unknown drops into a trailing 未标注 lane\n * (so漏标 surfaces). Clicking a node jumps the stream to that scene.\n *\n * Pure presentation over the precomputed `refs` (which now carry `stateId` for\n * actors/locations/props) — no scene re-scanning here.\n */\nimport { useRef, useState, type CSSProperties } from \"react\";\nimport type { DistributionItem, ReferenceEpisodeGroup } from \"../entity-distribution.js\";\nimport type { AssetState, ScriptProject } from \"../types.js\";\nimport { getStateDisplayName } from \"../utils.js\";\nimport { ScenePreviewCard, type PreviewAnchor } from \"./scene-preview-card.js\";\n\nconst UNASSIGNED = \"__unassigned__\";\n/** how many distinct cue colors exist (--lj-se-actor-cue-1..8) */\nconst CUE_COUNT = 8;\n/** fixed per-scene column width (px). The track is `columns × COL` wide and the\n * whole timeline scrolls horizontally, so 100+ appearances stay readable\n * instead of crushing into an unclickable blob. */\nconst COL = 32;\n/** minimum width (px) an episode block needs so its 第NN集 label shows in full;\n * a short episode widens its columns up to this, longer ones stay at COL each. */\nconst MIN_EP_WIDTH = 48;\n\ninterface Lane {\n id: string;\n name: string;\n /** 1..8 → actor-cue var; 0 → neutral muted (未标注 lane) */\n cueIndex: number;\n}\n\nexport function AssetStateTimeline({\n data,\n assetId,\n assetKind,\n refs,\n states,\n onJump,\n}: {\n /** full project — the hover preview reads scene content from it */\n data: ScriptProject;\n /** the card's own asset — its lines get highlighted in the hover preview */\n assetId: string;\n assetKind: \"actor\" | \"location\" | \"prop\";\n refs: ReferenceEpisodeGroup[];\n states: AssetState[];\n onJump: (episodeIdx: number, sceneIdx: number) => void;\n}) {\n const [hover, setHover] = useState<PreviewAnchor | null>(null);\n // Small close delay so moving the cursor off a node INTO the preview card\n // (crossing the gap) doesn't drop it — both node and card keep it open.\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n const scheduleClose = () => {\n cancelClose();\n closeTimer.current = setTimeout(() => setHover(null), 140);\n };\n\n // Flatten to a single narrative-ordered column list. refs are episode-sorted\n // and scene-sorted within an episode, so concatenation is already in order.\n const cols: DistributionItem[] = [];\n for (const group of refs) for (const item of group.items) cols.push(item);\n const n = cols.length;\n if (n === 0) return null;\n\n const definedIds = states.map((s) => (s.state_id ?? \"\").trim()).filter(Boolean);\n const lanes: Lane[] = states\n .map((s, i) => ({ id: (s.state_id ?? \"\").trim(), name: getStateDisplayName(s) || \"未命名状态\", cueIndex: (i % CUE_COUNT) + 1 }))\n .filter((l) => l.id);\n\n const isUnassigned = (c: DistributionItem) => {\n const sid = (c.stateId ?? \"\").trim();\n return !sid || !definedIds.includes(sid);\n };\n // Trailing catch-all lane. With no defined states it's the only lane, so it\n // reads as a plain appearance track (\"出现\") rather than a missing-state flag.\n if (cols.some(isUnassigned)) {\n lanes.push({ id: UNASSIGNED, name: lanes.length > 0 ? \"未标注\" : \"出现\", cueIndex: 0 });\n }\n\n // Per-column geometry with adaptive widths: an episode with few scenes widens\n // its columns just enough to fit the full 第NN集 header label, so the axis never\n // truncates; the same width flows into the track below so header and lanes stay\n // column-aligned. Multi-scene episodes keep the base COL width.\n interface ColMeta {\n item: DistributionItem;\n left: number;\n width: number;\n }\n const colMetas: ColMeta[] = [];\n const epHeads: { episodeIndex: number; episodeNumber: number; width: number }[] = [];\n let x = 0;\n for (const group of refs) {\n const count = group.items.length;\n const w = Math.max(COL, Math.ceil(MIN_EP_WIDTH / count));\n epHeads.push({ episodeIndex: group.episodeIndex, episodeNumber: group.episodeNumber, width: count * w });\n for (const item of group.items) {\n colMetas.push({ item, left: x, width: w });\n x += w;\n }\n }\n const trackWidth = x;\n\n const center = (m: ColMeta) => m.left + m.width / 2;\n const cueVar = (cueIndex: number) =>\n cueIndex === 0 ? \"var(--lj-se-muted-fg)\" : `var(--lj-se-actor-cue-${cueIndex})`;\n const laneMetas = (laneId: string) =>\n colMetas.filter((m) => (laneId === UNASSIGNED ? isUnassigned(m.item) : (m.item.stateId ?? \"\").trim() === laneId));\n\n return (\n <div className=\"lj-se-sttl\">\n <div className=\"lj-se-sttl-axis\">\n <span className=\"lj-se-sttl-axis-lab\">状态 \ 场</span>\n <span className=\"lj-se-sttl-axis-eps\" style={{ width: trackWidth }}>\n {epHeads.map((g) => (\n <span key={g.episodeIndex} className=\"lj-se-sttl-ep\" style={{ width: g.width }} title={`第 ${g.episodeNumber} 集`}>\n 第{String(g.episodeNumber).padStart(2, \"0\")}集\n </span>\n ))}\n </span>\n </div>\n {lanes.map((lane) => {\n const mine = laneMetas(lane.id);\n return (\n <div key={lane.id} className=\"lj-se-sttl-lane\">\n <span className=\"lj-se-sttl-lane-head\" title={lane.name}>\n <span className=\"lj-se-sttl-dot\" style={{ background: cueVar(lane.cueIndex) }} />\n <span className=\"lj-se-sttl-lane-name\">{lane.name}</span>\n <span className=\"lj-se-sttl-lane-count\">{mine.length}</span>\n </span>\n <span className=\"lj-se-sttl-track\" style={{ width: trackWidth, \"--cue\": cueVar(lane.cueIndex) } as CSSProperties}>\n {colMetas.map((m, i) => (\n <span key={`col-${i}`} className=\"lj-se-sttl-col\" style={{ left: m.left }} />\n ))}\n {mine.map((m, k) => {\n const next = mine[k + 1];\n if (!next) return null;\n return (\n <span\n key={`flow-${m.item.key}`}\n className=\"lj-se-sttl-flow\"\n style={{ left: center(m), width: center(next) - center(m) }}\n />\n );\n })}\n {mine.map((m) => (\n <button\n key={m.item.key}\n type=\"button\"\n className=\"lj-se-sttl-node\"\n style={{ left: center(m) }}\n title={m.item.label}\n onClick={() => onJump(m.item.episodeIndex, m.item.sceneIndex)}\n onMouseEnter={(e) => {\n cancelClose();\n const r = e.currentTarget.getBoundingClientRect();\n setHover({\n episodeIndex: m.item.episodeIndex,\n sceneIndex: m.item.sceneIndex,\n rect: { top: r.top, bottom: r.bottom, left: r.left, width: r.width },\n host: e.currentTarget.closest<HTMLElement>(\".lj-se-root\"),\n });\n }}\n onMouseLeave={scheduleClose}\n >\n {m.item.sceneNumber}\n </button>\n ))}\n </span>\n </div>\n );\n })}\n {hover ? (\n <ScenePreviewCard\n data={data}\n anchor={hover}\n highlightId={assetId}\n highlightKind={assetKind}\n onEnter={cancelClose}\n onLeave={scheduleClose}\n />\n ) : null}\n </div>\n );\n}\n","/**\n * AssetCard — an actor / location / prop rendered as a card in the global\n * scroll (below the episodes), mirroring agent-frontend. Shows editable name +\n * description, a kind badge, the \"appears in N scenes / M episodes\" summary,\n * editable asset-state cards, and the bidirectional reference grid (jump to the\n * scenes where it appears). Memoized so editing a scene doesn't re-render every\n * card.\n */\nimport { memo, useMemo, useState } from \"react\";\nimport { Plus, Trash2, X } from \"lucide-react\";\nimport type { ScriptActor, ScriptLocation, ScriptProject, ScriptProp } from \"../types.js\";\nimport type { AssetGroup } from \"./flat-items.js\";\nimport { assetGroupLabel } from \"./flat-items.js\";\nimport {\n addEntityState,\n removeEntityState,\n updateEntityDescription,\n updateEntityName,\n updateEntityStateField,\n type EntityKind,\n} from \"../mutations/entity-mutations.js\";\nimport type { ReferenceEpisodeGroup } from \"../entity-distribution.js\";\nimport { getActorDisplayName, getLocationDisplayName, getPropDisplayName } from \"../utils.js\";\nimport { buildSelectionFrom, type StudioSelection } from \"../selection.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { AssetStateTimeline } from \"./asset-state-timeline.js\";\nimport type { AssetDeleteRequest } from \"../scene/scene-cast-prop-rows.js\";\nimport { HighlightContext } from \"../primitives/highlighted-text.js\";\n\nconst META: Record<AssetGroup, { kind: EntityKind }> = {\n actors: { kind: \"actor\" },\n locations: { kind: \"location\" },\n props: { kind: \"prop\" },\n};\n\nfunction newStateId(id: string): string {\n return `st_${id}_${Date.now().toString(36)}`;\n}\n\nfunction StateDeleteButton({ stateName, onConfirm }: { stateName: string; onConfirm: () => void }) {\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <button type=\"button\" className=\"lj-se-assetcard-state-del\" title=\"删除该状态\" aria-label=\"删除该状态\" onClick={() => setOpen(true)}>\n <X className=\"lj-se-ic-3\" strokeWidth={1.8} />\n </button>\n {open ? (\n <div className=\"lj-se-modal-backdrop\" role=\"presentation\" onMouseDown={() => setOpen(false)}>\n <div className=\"lj-se-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"lj-se-delete-state-title\" onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"lj-se-modal-head\">\n <h2 id=\"lj-se-delete-state-title\" className=\"lj-se-modal-title\">删除状态</h2>\n <button type=\"button\" className=\"lj-se-modal-x\" aria-label=\"关闭\" onClick={() => setOpen(false)}>\n <X className=\"lj-se-ic-3\" strokeWidth={1.8} />\n </button>\n </div>\n <p className=\"lj-se-modal-body\">确认删除「{stateName || \"未命名状态\"}」?</p>\n <div className=\"lj-se-modal-actions\">\n <button type=\"button\" className=\"lj-se-modal-btn\" onClick={() => setOpen(false)}>取消</button>\n <button\n type=\"button\"\n className=\"lj-se-modal-btn lj-se-modal-btn-danger\"\n onClick={() => {\n setOpen(false);\n onConfirm();\n }}\n >\n 删除\n </button>\n </div>\n </div>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AssetCardImpl({\n data,\n group,\n assetId,\n refs,\n disabled = false,\n onEdit,\n onSelect,\n onRequestAssetDelete,\n}: {\n data: ScriptProject;\n group: AssetGroup;\n assetId: string;\n /** episode-grouped references, precomputed once per value in the stream\n * (buildDistributionIndex) — never re-scanned per card. */\n refs: ReferenceEpisodeGroup[];\n disabled?: boolean;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n onSelect: (sel: StudioSelection) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n}) {\n const kind = META[group].kind;\n const entity = useMemo(() => {\n if (group === \"actors\") return (data.actors ?? []).find((a) => (a.actor_id ?? \"\").trim() === assetId) as ScriptActor | undefined;\n if (group === \"locations\") return (data.locations ?? []).find((l) => (l.location_id ?? \"\").trim() === assetId) as ScriptLocation | undefined;\n return (data.props ?? []).find((p) => (p.prop_id ?? \"\").trim() === assetId) as ScriptProp | undefined;\n }, [data.actors, data.locations, data.props, group, assetId]);\n\n const sceneCount = refs.reduce((n, g) => n + g.items.length, 0);\n\n if (!entity) {\n return (\n <div className=\"lj-se-assetcard-row\">\n <div className=\"lj-se-assetcard-missing\">该资产已不存在({group}:{assetId})</div>\n </div>\n );\n }\n\n const name =\n group === \"actors\"\n ? getActorDisplayName(entity as ScriptActor)\n : group === \"locations\"\n ? getLocationDisplayName(entity as ScriptLocation)\n : getPropDisplayName(entity as ScriptProp);\n const rawDescription = entity.description ?? \"\";\n const description = rawDescription.trim();\n const states = entity.states ?? [];\n const fromRef = buildSelectionFrom(kind, assetId);\n\n return (\n <div className=\"lj-se-assetcard-row\">\n <HighlightContext.Provider value=\"\">\n <article className=\"lj-se-assetcard\" data-no-quote-selection>\n <div className=\"lj-se-assetcard-head\">\n <span className=\"lj-se-assetcard-name\">\n <EditableText\n value={name}\n disabled={disabled}\n placeholder={`未命名${assetGroupLabel(group)}`}\n onSave={(v) => onEdit((p) => updateEntityName(p, kind, assetId, v))}\n />\n </span>\n <span className=\"lj-se-assetcard-id\">{assetId}</span>\n <span className=\"lj-se-assetcard-actions\">\n <span className=\"lj-se-assetcard-badge\">{assetGroupLabel(group)}</span>\n <span className=\"lj-se-assetcard-badge\">\n {sceneCount} 场 · {refs.length} 集\n </span>\n {onRequestAssetDelete && !disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-assetcard-del\"\n title=\"删除该资产\"\n onClick={() =>\n onRequestAssetDelete({ kind, id: assetId, name: name || assetId, description: description || undefined, episodeIndex: -1, sceneIndex: -1 })\n }\n >\n <Trash2 className=\"lj-se-ic-3\" strokeWidth={1.5} />\n </button>\n ) : null}\n </span>\n </div>\n\n <div className=\"lj-se-assetcard-desc\">\n <EditableText\n multiline\n value={rawDescription}\n disabled={disabled}\n placeholder={`描述这个${assetGroupLabel(group)}的外观 / 设定…`}\n onSave={(v) => onEdit((p) => updateEntityDescription(p, kind, assetId, v))}\n />\n </div>\n\n <div className=\"lj-se-assetcard-states\">\n <div className=\"lj-se-assetcard-states-head\">\n <span className=\"lj-se-assetcard-states-label\">状态 <span className=\"lj-se-field-hint\">{states.length}</span></span>\n {!disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-assetcard-state-add\"\n onClick={() => onEdit((p) => addEntityState(p, kind, assetId, { state_id: newStateId(assetId), state_name: \"新状态\" }))}\n >\n <Plus className=\"lj-se-ic-3\" strokeWidth={1.5} /> 状态\n </button>\n ) : null}\n </div>\n {states.length > 0 ? (\n <div className=\"lj-se-assetcard-state-cards\">\n {states.map((state, idx) => {\n const sid = (state.state_id ?? \"\").trim() || `idx-${idx}`;\n return (\n <div key={sid} className=\"lj-se-assetcard-state\">\n <div className=\"lj-se-assetcard-state-top\">\n <EditableText\n value={state.state_name ?? state.name ?? \"\"}\n disabled={disabled}\n placeholder=\"状态名\"\n className=\"lj-se-assetcard-state-name\"\n onSave={(v) => onEdit((p) => updateEntityStateField(p, kind, assetId, sid, \"state_name\", v))}\n />\n {!disabled && (state.state_id ?? \"\").trim() ? (\n <StateDeleteButton\n stateName={state.state_name ?? state.name ?? \"\"}\n onConfirm={() => onEdit((p) => removeEntityState(p, kind, assetId, sid))}\n />\n ) : null}\n </div>\n <EditableText\n multiline\n value={state.description ?? \"\"}\n disabled={disabled}\n placeholder=\"状态描述…\"\n className=\"lj-se-assetcard-state-desc\"\n onSave={(v) => onEdit((p) => updateEntityStateField(p, kind, assetId, sid, \"description\", v))}\n />\n </div>\n );\n })}\n </div>\n ) : null}\n </div>\n\n {refs.length > 0 ? (\n // state→scene reverse-lookup timeline: which state appears in which\n // scene, and how it flows. Stateless assets degrade to one \"出现\" lane.\n <AssetStateTimeline\n data={data}\n assetId={assetId}\n assetKind={kind}\n refs={refs}\n states={states}\n onJump={(episodeIdx, sceneIdx) =>\n onSelect({ kind: \"scene\", episodeIdx, sceneIdx, from: fromRef, origin: \"sidebar\" })\n }\n />\n ) : null}\n </article>\n </HighlightContext.Provider>\n </div>\n );\n}\n\nfunction areEqual(prev: AssetCardProps, next: AssetCardProps): boolean {\n if (prev.group !== next.group || prev.assetId !== next.assetId || prev.disabled !== next.disabled) return false;\n if (prev.onEdit !== next.onEdit || prev.onSelect !== next.onSelect || prev.onRequestAssetDelete !== next.onRequestAssetDelete) return false;\n // The card renders ONLY its own entity slice (name/description/states) + the\n // precomputed `refs` (its scene appearances). It does NOT read data.episodes\n // directly, so a scene edit that doesn't touch THIS asset keeps both its entity\n // array AND its refs reference-stable (refs reuse via buildDistributionIndex's\n // prev cache) → the card skips. Only the asset(s) whose appearances/fields\n // actually changed re-render.\n if (prev.refs !== next.refs) return false;\n if (prev.group === \"actors\") return prev.data.actors === next.data.actors;\n if (prev.group === \"locations\") return prev.data.locations === next.data.locations;\n return prev.data.props === next.data.props;\n}\n\ntype AssetCardProps = Parameters<typeof AssetCardImpl>[0];\nexport const AssetCard = memo(AssetCardImpl, areEqual);\n","/**\n * ScriptStream — the single continuous, virtualized script surface. One flat\n * list carries worldview → episodes(header + scenes) → asset groups(header +\n * cards), exactly like agent-frontend's global scroll. Scenes render inside\n * fused paper segments; assets render as cards below. Selection ↔ scroll is\n * two-way (external selection scrolls in; scrolling drives scrollspy out), with\n * a programmatic-scroll lock to avoid feedback.\n */\nimport { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Virtuoso, type VirtuosoHandle } from \"react-virtuoso\";\nimport { GripVertical, Plus, Trash2 } from \"lucide-react\";\nimport type { ScriptProject } from \"../types.js\";\nimport { addBlankScene, addEpisode, deleteEpisode, moveScriptItem } from \"../mutations/editor-utils.js\";\nimport { buildAssetRefs, buildDistributionIndex, type ReferenceEpisodeGroup } from \"../entity-distribution.js\";\nimport type { DiffActionMark } from \"../diff/diff-engine.js\";\nimport { readScrollState, useScrollStateMemo } from \"./scroll-state-memo.js\";\n\n/** per-scene action-level diff: current-index → mark, + removed ghosts bucketed\n * by the current index they sit before. */\nexport interface SceneActionDiffEntry {\n byIndex: Map<number, DiffActionMark>;\n removedBefore: Map<number, DiffActionMark[]>;\n}\nimport { Popover } from \"../primitives/popover.js\";\nimport { RowMenuPanel } from \"../primitives/row-menu.js\";\nimport {\n DragReorderContext,\n type DragReorderApi,\n type DragSource,\n type DropTarget,\n} from \"./drag-context.js\";\nimport {\n getActorMap,\n getEpisodeTitle,\n getLocationMap,\n getPropMap,\n getSpeakerMap,\n} from \"../utils.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { isSameSelectionTarget, selectionTargetKey, withOrigin } from \"../selection.js\";\nimport { SceneEditor } from \"../scene/scene-editor.js\";\nimport type { ScriptFormat } from \"../scene/scene-item-row.js\";\nimport type { AssetDeleteRequest } from \"../scene/scene-cast-prop-rows.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { AssetCard } from \"./asset-card.js\";\nimport {\n assetGroupLabel,\n buildFlatStream,\n flatIndexToSelection,\n selectionToFlatIndex,\n} from \"./flat-items.js\";\nimport { cn } from \"../cn.js\";\n\nexport function ScriptStream({\n value,\n format,\n disabled,\n selection,\n changedSceneKeys,\n sceneDiff,\n actionDiffByScene,\n onAcceptAction,\n onRejectAction,\n scrollScopeKey,\n onEdit,\n onSelectionChange,\n onRequestAssetDelete,\n}: {\n value: ScriptProject;\n format: ScriptFormat;\n disabled: boolean;\n selection: StudioSelection;\n changedSceneKeys?: Set<string>;\n /** per-scene diff controls (present only when the host supports onPatchBaseline) */\n sceneDiff?: {\n kindByKey: Map<string, \"added\" | \"modified\">;\n onAccept: (episodeIdx: number, sceneId: string) => void;\n onReject: (episodeIdx: number, sceneId: string) => void;\n };\n /** action-level diff per scene (keyed by sceneChangeKey) */\n actionDiffByScene?: Map<string, SceneActionDiffEntry>;\n onAcceptAction?: (mark: DiffActionMark) => void;\n onRejectAction?: (mark: DiffActionMark) => void;\n /** stable per-scope key (e.g. projectGroupNo); remembers/restores scroll\n * position across editor unmount/remount */\n scrollScopeKey?: string;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n onSelectionChange?: (next: StudioSelection) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n}) {\n const stream = useMemo(() => buildFlatStream(value), [value]);\n const maps = useMemo(\n () => ({\n actorMap: getActorMap(value.actors ?? []),\n speakerMap: getSpeakerMap(value.speakers ?? []),\n locationMap: getLocationMap(value.locations ?? []),\n propMap: getPropMap(value.props ?? []),\n }),\n [value.actors, value.speakers, value.locations, value.props],\n );\n\n // asset→scene reference index, built ONCE per value (not per visible card),\n // and DEFERRED off the keystroke hot path: while typing, urgent renders reuse\n // the previous index and the rescan runs at idle (the reference grid lagging a\n // beat behind is fine; the card's own editable fields use the fresh `value`).\n // Threading the previous index in keeps unchanged assets' refs reference-stable\n // so AssetCard's memo only re-renders the cards whose appearances changed.\n const deferredValue = useDeferredValue(value);\n const prevDistributions = useRef<Map<string, ReferenceEpisodeGroup[]> | undefined>(undefined);\n const distributions = useMemo(() => {\n // Writing the cache ref during render is intentional and correctness-safe:\n // buildDistributionIndex only reuses a prev array when sameRefGroups says it\n // is STRUCTURALLY equal to the freshly-computed-from-`deferredValue` result.\n // So a `prev` left over from a discarded/StrictMode render can at worst cost\n // a missed reuse (one extra re-render, self-correcting next pass) — it can\n // never surface stale refs. Do NOT \"fix\" this into a plain memo.\n const next = buildDistributionIndex(deferredValue, prevDistributions.current);\n prevDistributions.current = next;\n return next;\n }, [deferredValue]);\n\n const handleRef = useRef<VirtuosoHandle>(null);\n // remember scroll position per scope across editor unmount/remount\n useScrollStateMemo(scrollScopeKey, handleRef);\n const programmaticUntil = useRef(0);\n const lastEmitted = useRef(-1);\n const lastScrolledKey = useRef<string>(\"\");\n\n // stable so the memoized SceneEditor can skip non-edited scenes\n const select = useCallback(\n (sel: StudioSelection) => onSelectionChange?.(sel),\n [onSelectionChange],\n );\n\n // ── shared cross-scene drag state ───────────────────────────────────────\n const [dragSource, setDragSource] = useState<DragSource | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n const dragSourceRef = useRef<DragSource | null>(null);\n const dropTargetRef = useRef<DropTarget | null>(null);\n dragSourceRef.current = dragSource;\n dropTargetRef.current = dropTarget;\n const dnd = useMemo<DragReorderApi>(\n () => ({\n source: dragSource,\n dropAt: dropTarget,\n begin: (s) => {\n setDragSource(s);\n setDropTarget(null);\n },\n hover: (t) => setDropTarget(t),\n drop: () => {\n const s = dragSourceRef.current;\n const d = dropTargetRef.current;\n if (s && d) {\n onEdit((cur) =>\n moveScriptItem(\n cur,\n { episodeIndex: s.ep, sceneIndex: s.sc, itemIndex: s.idx },\n { episodeIndex: d.ep, sceneIndex: d.sc, slot: d.slot },\n ),\n );\n }\n setDragSource(null);\n setDropTarget(null);\n },\n end: () => {\n setDragSource(null);\n setDropTarget(null);\n },\n }),\n [dragSource, dropTarget, onEdit],\n );\n\n /** One continuous paper across the whole episodes region: only the very first\n * header rounds the top and the very last scene rounds the bottom; episode\n * headers in between stay seamless (inline banners). */\n const paperEdge = (key: string) => {\n const start = key === stream.paperStartKey;\n const end = key === stream.paperEndKey;\n return start && end ? \"is-sole\" : start ? \"is-start\" : end ? \"is-end\" : \"is-mid\";\n };\n\n // external selection → scroll into view. Keyed by the selection TARGET (not\n // the stream object, which is rebuilt on every edit) so editing does NOT\n // re-trigger a scroll / re-arm the programmatic lock for the same selection.\n useEffect(() => {\n const key = selectionTargetKey(selection);\n if (selection.origin === \"scroll\") {\n lastScrolledKey.current = key;\n return;\n }\n if (key === lastScrolledKey.current) return;\n const idx = selectionToFlatIndex(stream, selection);\n if (idx == null) return;\n lastScrolledKey.current = key;\n programmaticUntil.current = Date.now() + 200;\n handleRef.current?.scrollToIndex({ index: idx, align: \"start\", behavior: \"auto\" });\n }, [selection, stream]);\n\n const emitScrollSelection = (topIndex: number) => {\n if (Date.now() < programmaticUntil.current) return;\n if (topIndex === lastEmitted.current) return;\n lastEmitted.current = topIndex;\n const next = flatIndexToSelection(stream, topIndex);\n if (!next) return;\n if (isSameSelectionTarget(next, selection)) return;\n onSelectionChange?.(withOrigin(next, \"scroll\"));\n };\n\n return (\n <DragReorderContext.Provider value={dnd}>\n <Virtuoso\n ref={handleRef}\n className=\"lj-se-stream lj-se-scroll\"\n data={stream.items}\n restoreStateFrom={readScrollState(scrollScopeKey)}\n increaseViewportBy={1500}\n rangeChanged={(range) => emitScrollSelection(range.startIndex)}\n itemContent={(_index, item) => {\n if (!item) return null;\n switch (item.kind) {\n case \"episode-header\": {\n const episode = value.episodes?.[item.episodeIdx];\n if (!episode) return null;\n return (\n <div className=\"lj-se-stream-row\">\n <div className={cn(\"lj-se-paper-seg\", paperEdge(item.key), \"lj-se-ep-seg\")}>\n <div className=\"lj-se-epbanner-wrap\">\n {!disabled ? <EpisodeMenu episodeIdx={item.episodeIdx} onEdit={onEdit} /> : null}\n <EpisodeBanner\n episodeIdx={item.episodeIdx}\n episodeTitle={getEpisodeTitle(episode, item.episodeIdx)}\n projectTitle={item.episodeIdx === 0 ? value.title ?? \"\" : undefined}\n disabled={disabled}\n onEdit={onEdit}\n />\n </div>\n </div>\n </div>\n );\n }\n case \"episode-empty\":\n if (disabled) return null;\n return (\n <div className=\"lj-se-stream-row\">\n <div className={cn(\"lj-se-paper-seg\", paperEdge(item.key))}>\n <button\n type=\"button\"\n className=\"lj-se-scene-add-first\"\n onClick={() => onEdit((p) => addBlankScene(p, item.episodeIdx))}\n >\n <Plus className=\"lj-se-ic-3\" strokeWidth={2} /> 添加场次\n </button>\n </div>\n </div>\n );\n case \"scene\": {\n const scene = value.episodes?.[item.episodeIdx]?.scenes?.[item.sceneIdx];\n if (!scene) return null;\n const focused =\n selection.kind === \"scene\" &&\n selection.episodeIdx === item.episodeIdx &&\n selection.sceneIdx === item.sceneIdx;\n const diffKey = `${item.episodeIdx}:${item.sceneId}`;\n const inDiff = !disabled && (changedSceneKeys?.has(diffKey) ?? false);\n const wholeKind = !disabled ? sceneDiff?.kindByKey.get(diffKey) : undefined;\n const sceneActions = !disabled ? actionDiffByScene?.get(diffKey) : undefined;\n const actionDiff =\n sceneActions && onAcceptAction && onRejectAction\n ? {\n byIndex: sceneActions.byIndex,\n removedBefore: sceneActions.removedBefore,\n onAccept: onAcceptAction,\n onReject: onRejectAction,\n }\n : undefined;\n return (\n <div className=\"lj-se-stream-row\" data-quote-source>\n <div className={cn(\"lj-se-paper-seg\", paperEdge(item.key), wholeKind && \"is-changed\")}>\n {sceneDiff && inDiff ? (\n <div className=\"lj-se-scenediff\">\n <span className={cn(\"lj-se-scenediff-tag\", wholeKind === \"added\" && \"is-added\")}>\n {wholeKind === \"added\" ? \"AI 新增\" : \"AI 改动\"}\n </span>\n <span className=\"lj-se-scenediff-spacer\" />\n <button\n type=\"button\"\n className=\"lj-se-scenediff-reject\"\n onClick={() => sceneDiff!.onReject(item.episodeIdx, item.sceneId)}\n >\n 整场拒绝\n </button>\n <button\n type=\"button\"\n className=\"lj-se-scenediff-accept\"\n onClick={() => sceneDiff!.onAccept(item.episodeIdx, item.sceneId)}\n >\n 整场接受\n </button>\n </div>\n ) : null}\n <SceneEditor\n actionDiff={actionDiff}\n episodeIndex={item.episodeIdx}\n sceneIndex={item.sceneIdx}\n scene={scene}\n maps={maps}\n format={format}\n disabled={disabled}\n focused={focused}\n onEdit={onEdit}\n onNavigateAsset={select}\n onRequestAssetDelete={onRequestAssetDelete}\n />\n </div>\n </div>\n );\n }\n case \"add-episode\":\n if (disabled) return null;\n return (\n <div className=\"lj-se-addep-row\">\n <button type=\"button\" className=\"lj-se-addep-btn\" onClick={() => onEdit((p) => addEpisode(p))}>\n <Plus className=\"lj-se-ic-4\" strokeWidth={2} /> 新增一集\n </button>\n </div>\n );\n case \"asset-group-header\":\n return (\n <div className=\"lj-se-assetgroup-head\">\n <span className=\"lj-se-assetgroup-title\">{assetGroupLabel(item.group)}</span>\n </div>\n );\n case \"asset-card\":\n return (\n <AssetCard\n data={value}\n group={item.group}\n assetId={item.assetId}\n refs={\n distributions.get(`${item.group}:${item.assetId}`) ??\n buildAssetRefs(value, item.group, item.assetId)\n }\n disabled={disabled}\n onEdit={onEdit}\n onSelect={select}\n onRequestAssetDelete={onRequestAssetDelete}\n />\n );\n default:\n return null;\n }\n }}\n />\n </DragReorderContext.Provider>\n );\n}\n\n/** Episode control hub — a left-margin grip aligned to the banner; opens\n * scene-level structural ops for the whole episode (add below / delete). */\nfunction EpisodeMenu({\n episodeIdx,\n onEdit,\n}: {\n episodeIdx: number;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n}) {\n return (\n <Popover\n align=\"start\"\n side=\"bottom\"\n className=\"lj-se-ephandle-pop\"\n panelClassName=\"lj-se-rowmenu\"\n trigger={({ open, toggle }) => (\n <button type=\"button\" className={cn(\"lj-se-handle lj-se-ephandle\", open && \"is-open\")} title=\"集操作\" aria-label=\"集操作\" onClick={toggle}>\n <GripVertical className=\"lj-se-handle-grip\" strokeWidth={1.5} />\n </button>\n )}\n >\n {({ close }) => (\n <RowMenuPanel\n close={close}\n sections={[\n [{ icon: Plus, label: \"在下方新增一集\", onSelect: () => onEdit((p) => addEpisode(p, episodeIdx + 1)) }],\n [{ icon: Trash2, label: \"删除整集\", onSelect: () => onEdit((p) => deleteEpisode(p, episodeIdx)), danger: true }],\n ]}\n />\n )}\n </Popover>\n );\n}\n\n/** Episode title page printed on the paper top — project title (episode 0\n * only) + episode title + decorative divider, all click-to-edit. */\nfunction EpisodeBanner({\n episodeIdx,\n episodeTitle,\n projectTitle,\n disabled,\n onEdit,\n}: {\n episodeIdx: number;\n episodeTitle: string;\n projectTitle?: string;\n disabled: boolean;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n}) {\n return (\n <div className=\"lj-se-epbanner\">\n {projectTitle !== undefined ? (\n <>\n <div className=\"lj-se-epbanner-kicker\">剧本</div>\n <h1 className=\"lj-se-epbanner-script\">\n <EditableText\n value={projectTitle}\n disabled={disabled}\n placeholder=\"未命名\"\n onSave={(v) => onEdit((p) => ({ ...p, title: v }))}\n />\n </h1>\n </>\n ) : null}\n <h2 className=\"lj-se-epbanner-ep\">\n <EditableText\n value={episodeTitle}\n disabled={disabled}\n placeholder=\"未命名集\"\n onSave={(v) =>\n onEdit((p) => ({\n ...p,\n episodes: p.episodes?.map((ep, i) => (i === episodeIdx ? { ...ep, title: v } : ep)) ?? p.episodes,\n }))\n }\n />\n </h2>\n <span className=\"lj-se-epbanner-divider\" aria-hidden />\n </div>\n );\n}\n","/**\n * Coarse, pure diff between a baseline ScriptProject (pre-AI-revision) and the\n * current one. Surfaces changed top-level fields and changed/added scenes so\n * the overlay can show counts, navigate to changes, and accept/reject all.\n * Scenes are matched by scene_id within an episode.\n */\nimport type { Scene, ScriptEpisode, ScriptItem, ScriptProject } from \"../types.js\";\nimport { getSceneContext } from \"../utils.js\";\n\nexport interface FieldChange {\n before: string;\n after: string;\n}\n\nexport type SceneChangeKind = \"added\" | \"modified\";\n\n/** A host-flagged changed scene the editor should render (highlight + per-scene\n * accept/reject). The host decides WHICH scenes are marked (provenance: e.g.\n * only agent-changed scenes, not the user's own manual edits). */\nexport interface DiffSceneMark {\n episodeIdx: number;\n sceneId: string;\n kind: SceneChangeKind;\n}\n\nexport interface ChangeSet {\n title?: FieldChange;\n worldview?: FieldChange;\n style?: FieldChange;\n /** \"epIdx:sceneId\" → kind, for scenes present in the current value */\n changedScenes: Map<string, SceneChangeKind>;\n /** scenes present in baseline but gone from current */\n removedCount: number;\n /** total surfaced changes */\n count: number;\n}\n\nexport function sceneChangeKey(episodeIdx: number, sceneId: string | undefined): string {\n return `${episodeIdx}:${(sceneId ?? \"\").trim()}`;\n}\n\nfunction fieldChange(before?: string, after?: string): FieldChange | undefined {\n const b = (before ?? \"\").trim();\n const a = (after ?? \"\").trim();\n return b === a ? undefined : { before: b, after: a };\n}\n\nfunction serializeScene(scene: Scene): string {\n // normalize the dual context storage via getSceneContext so a scene that\n // stores refs only in the flat mirror compares equal to one that stores them\n // under context (avoids false \"modified\"); fixed key order keeps it stable.\n const ctx = getSceneContext(scene);\n return JSON.stringify({\n environment: scene.environment ?? null,\n actors: ctx.actors,\n locations: ctx.locations,\n props: ctx.props,\n actions: scene.actions ?? [],\n });\n}\n\nfunction sceneById(episode: ScriptEpisode | undefined): Map<string, Scene> {\n const map = new Map<string, Scene>();\n for (const scene of episode?.scenes ?? []) {\n const id = (scene.scene_id ?? \"\").trim();\n if (id) map.set(id, scene);\n }\n return map;\n}\n\n/** Resolve an episode in `episodes` matching `ref` by episode_id, falling back\n * to the positional index — so an episode inserted/removed/reordered ahead of\n * this one doesn't misalign every subsequent episode's scene diff. */\nfunction matchEpisode(\n episodes: ScriptEpisode[] | undefined,\n ref: ScriptEpisode,\n index: number,\n): ScriptEpisode | undefined {\n const list = episodes ?? [];\n const id = ref.episode_id?.trim();\n if (id) {\n const byId = list.find((e) => e.episode_id?.trim() === id);\n if (byId) return byId;\n }\n return list[index];\n}\n\nexport function computeChangeSet(\n baseline: ScriptProject | null,\n current: ScriptProject,\n): ChangeSet {\n const changedScenes = new Map<string, SceneChangeKind>();\n let removedCount = 0;\n\n if (!baseline) {\n return { changedScenes, removedCount, count: 0 };\n }\n\n const title = fieldChange(baseline.title, current.title);\n const worldview = fieldChange(baseline.worldview, current.worldview);\n const style = fieldChange(baseline.style, current.style);\n\n const curEpisodes = current.episodes ?? [];\n curEpisodes.forEach((episode, ei) => {\n const baseMap = sceneById(matchEpisode(baseline.episodes, episode, ei));\n for (const scene of episode.scenes ?? []) {\n const id = (scene.scene_id ?? \"\").trim();\n if (!id) continue;\n const base = baseMap.get(id);\n if (!base) {\n changedScenes.set(sceneChangeKey(ei, id), \"added\");\n } else if (base === scene) {\n // immutable edits only replace the changed scene's object on the path\n // from the root, so an unchanged scene keeps the SAME reference as in\n // the baseline snapshot — skip the (expensive) serialize entirely.\n continue;\n } else if (serializeScene(base) !== serializeScene(scene)) {\n changedScenes.set(sceneChangeKey(ei, id), \"modified\");\n }\n }\n });\n\n // removed scenes (in baseline, absent in current)\n (baseline.episodes ?? []).forEach((episode, ei) => {\n const curMap = sceneById(matchEpisode(curEpisodes, episode, ei));\n for (const scene of episode.scenes ?? []) {\n const id = (scene.scene_id ?? \"\").trim();\n if (id && !curMap.has(id)) removedCount += 1;\n }\n });\n\n const count =\n (title ? 1 : 0) +\n (worldview ? 1 : 0) +\n (style ? 1 : 0) +\n changedScenes.size +\n removedCount;\n\n return { title, worldview, style, changedScenes, removedCount, count };\n}\n\n/** Convert a ChangeSet's changed-scene map into the editor's DiffSceneMark[]\n * (the `diff.scenes` render descriptor). Keys are `${episodeIdx}:${sceneId}`. */\nexport function changeSetToDiffScenes(changeSet: ChangeSet): DiffSceneMark[] {\n const out: DiffSceneMark[] = [];\n for (const [key, kind] of changeSet.changedScenes) {\n const i = key.indexOf(\":\");\n if (i < 0) continue;\n const episodeIdx = Number(key.slice(0, i));\n const sceneId = key.slice(i + 1);\n if (Number.isFinite(episodeIdx)) out.push({ episodeIdx, sceneId, kind });\n }\n return out;\n}\n\n/** Convenience for hosts using the simple \"baseline vs current\" diff model:\n * returns the render-descriptor data (scenes + counts) the `diff` adapter wants.\n * Hosts wanting provenance (user vs agent) compute `scenes` themselves instead. */\nexport function buildDiffFromBaseline(\n baseline: ScriptProject | null,\n current: ScriptProject,\n): { scenes: DiffSceneMark[]; removedCount: number; count: number } {\n const cs = computeChangeSet(baseline, current);\n return { scenes: changeSetToDiffScenes(cs), removedCount: cs.removedCount, count: cs.count };\n}\n\n/** PER-SCENE ACCEPT — return a baseline patched so its matching scene equals\n * `scene` (the current version), dropping just that scene from the diff. Matches\n * the episode by episode_id (fallback index) and the scene by scene_id; inserts\n * when the baseline lacked it (an added scene). Immutable. */\nexport function acceptSceneIntoBaseline(\n baseline: ScriptProject,\n episodeId: string | undefined,\n episodeIdx: number,\n scene: Scene,\n): ScriptProject {\n const episodes = (baseline.episodes ?? []).slice();\n const id = episodeId?.trim();\n let ei = id ? episodes.findIndex((e) => e.episode_id?.trim() === id) : -1;\n if (ei < 0) ei = episodeIdx >= 0 && episodeIdx < episodes.length ? episodeIdx : -1;\n if (ei < 0) {\n episodes.push({ episode_id: episodeId, scenes: [scene] });\n return { ...baseline, episodes };\n }\n const ep = episodes[ei];\n const scenes = (ep.scenes ?? []).slice();\n const sid = (scene.scene_id ?? \"\").trim();\n const si = sid ? scenes.findIndex((s) => (s.scene_id ?? \"\").trim() === sid) : -1;\n if (si >= 0) scenes[si] = scene;\n else scenes.push(scene);\n episodes[ei] = { ...ep, scenes };\n return { ...baseline, episodes };\n}\n\n/** PER-SCENE REJECT — return current with the scene at (episodeIdx, sceneIdx)\n * reverted to its baseline version, or removed if it was added (no baseline\n * counterpart). Immutable. */\nexport function rejectSceneToBaseline(\n current: ScriptProject,\n episodeIdx: number,\n sceneIdx: number,\n baselineScene: Scene | null,\n): ScriptProject {\n const episodes = (current.episodes ?? []).slice();\n const ep = episodes[episodeIdx];\n if (!ep) return current;\n const scenes = (ep.scenes ?? []).slice();\n if (sceneIdx < 0 || sceneIdx >= scenes.length) return current;\n if (baselineScene) scenes[sceneIdx] = baselineScene;\n else scenes.splice(sceneIdx, 1);\n episodes[episodeIdx] = { ...ep, scenes };\n return { ...current, episodes };\n}\n\n/** Look up the baseline scene matching (episodeId/idx, sceneId), or null. */\nexport function findBaselineScene(\n baseline: ScriptProject | null,\n episodeId: string | undefined,\n episodeIdx: number,\n sceneId: string,\n): Scene | null {\n if (!baseline) return null;\n const ep = matchEpisode(baseline.episodes, { episode_id: episodeId } as ScriptEpisode, episodeIdx);\n if (!ep) return null;\n const sid = sceneId.trim();\n if (!sid) return null;\n return (ep.scenes ?? []).find((s) => (s.scene_id ?? \"\").trim() === sid) ?? null;\n}\n\n// ── ACTION-LEVEL DIFF (LCS) ──────────────────────────────────────────────────\n\n/** One changed action (line) the editor renders: highlight + ✓/✗.\n * - added/modified: `itemIdx` is the index in the CURRENT scene.\n * - removed: `itemIdx` is the position the ghost row sits BEFORE in the current list.\n * `item` is the OLD baseline action (set for \"modified\" and \"removed\") so the\n * editor can render the deleted line above the new one (unified-diff view). */\nexport interface DiffActionMark {\n episodeIdx: number;\n sceneId: string;\n kind: \"added\" | \"modified\" | \"removed\";\n itemIdx: number;\n baselineItemIdx?: number;\n item?: ScriptItem;\n}\n\nfunction actionSig(a: ScriptItem): string {\n return [a.type ?? \"\", (a.content ?? \"\").trim(), a.actor_id ?? \"\", a.emotion ?? \"\", a.delivery ?? \"\"].join(\"\u0000\");\n}\n\nexport interface SceneActionDiff {\n changed: Array<{ itemIdx: number; kind: \"added\" | \"modified\"; baselineItemIdx?: number }>;\n removed: Array<{ beforeItemIdx: number; baselineItemIdx: number }>;\n}\n\n/** LCS-align two action lists → per-line added / modified / removed. Adjacent\n * delete+insert runs are paired as \"modified\" (so an in-place line edit shows\n * as one modified row, not remove+add); LCS keeps insertions from shifting all\n * following lines into false \"modified\"s. */\nexport function computeSceneActionDiff(baseline: ScriptItem[], current: ScriptItem[]): SceneActionDiff {\n const m = baseline.length;\n const n = current.length;\n const bs = baseline.map(actionSig);\n const cs = current.map(actionSig);\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n dp[i][j] = bs[i] === cs[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n type Op = { t: \"match\"; j: number } | { t: \"del\"; i: number } | { t: \"ins\"; j: number };\n const ops: Op[] = [];\n let i = 0;\n let j = 0;\n while (i < m && j < n) {\n if (bs[i] === cs[j]) { ops.push({ t: \"match\", j }); i++; j++; }\n else if (dp[i + 1][j] >= dp[i][j + 1]) { ops.push({ t: \"del\", i }); i++; }\n else { ops.push({ t: \"ins\", j }); j++; }\n }\n while (i < m) { ops.push({ t: \"del\", i }); i++; }\n while (j < n) { ops.push({ t: \"ins\", j }); j++; }\n\n const changed: SceneActionDiff[\"changed\"] = [];\n const removed: SceneActionDiff[\"removed\"] = [];\n let curJ = 0;\n let p = 0;\n while (p < ops.length) {\n const op = ops[p];\n if (op.t === \"match\") { curJ = op.j + 1; p++; continue; }\n if (op.t === \"ins\") { changed.push({ itemIdx: op.j, kind: \"added\" }); curJ = op.j + 1; p++; continue; }\n const dels: number[] = [];\n while (p < ops.length && ops[p].t === \"del\") { dels.push((ops[p] as { i: number }).i); p++; }\n const inss: number[] = [];\n while (p < ops.length && ops[p].t === \"ins\") { inss.push((ops[p] as { j: number }).j); p++; }\n const pair = Math.min(dels.length, inss.length);\n for (let q = 0; q < pair; q++) changed.push({ itemIdx: inss[q], kind: \"modified\", baselineItemIdx: dels[q] });\n for (let q = pair; q < inss.length; q++) changed.push({ itemIdx: inss[q], kind: \"added\" });\n const ghostBefore = inss.length ? inss[inss.length - 1] + 1 : curJ;\n for (let q = pair; q < dels.length; q++) removed.push({ beforeItemIdx: ghostBefore, baselineItemIdx: dels[q] });\n if (inss.length) curJ = inss[inss.length - 1] + 1;\n }\n return { changed, removed };\n}\n\n/** Apply an action ACCEPT onto a baseline scene (returns a new scene): the\n * baseline catches up to current for that line, so it stops being a diff. */\nexport function applyActionAccept(baselineScene: Scene, currentScene: Scene, mark: DiffActionMark): Scene {\n const bActions = (baselineScene.actions ?? []).slice();\n const cActions = currentScene.actions ?? [];\n if (mark.kind === \"modified\" && mark.baselineItemIdx != null) {\n const item = cActions[mark.itemIdx];\n if (item && mark.baselineItemIdx < bActions.length) bActions[mark.baselineItemIdx] = item;\n } else if (mark.kind === \"added\") {\n const item = cActions[mark.itemIdx];\n if (item) bActions.splice(Math.min(mark.itemIdx, bActions.length), 0, item);\n } else if (mark.kind === \"removed\" && mark.baselineItemIdx != null) {\n if (mark.baselineItemIdx < bActions.length) bActions.splice(mark.baselineItemIdx, 1);\n }\n return { ...baselineScene, actions: bActions };\n}\n\n/** Apply an action REJECT onto a current scene (returns a new scene): the\n * working value reverts to the baseline for that line (or drops an added line /\n * restores a removed one). */\nexport function applyActionReject(currentScene: Scene, baselineScene: Scene | null, mark: DiffActionMark): Scene {\n const cActions = (currentScene.actions ?? []).slice();\n const bActions = baselineScene?.actions ?? [];\n if (mark.kind === \"modified\" && mark.baselineItemIdx != null) {\n const item = bActions[mark.baselineItemIdx];\n if (item && mark.itemIdx < cActions.length) cActions[mark.itemIdx] = item;\n } else if (mark.kind === \"added\") {\n if (mark.itemIdx < cActions.length) cActions.splice(mark.itemIdx, 1);\n } else if (mark.kind === \"removed\") {\n const item = mark.item ?? (mark.baselineItemIdx != null ? bActions[mark.baselineItemIdx] : undefined);\n if (item) cActions.splice(Math.min(mark.itemIdx, cActions.length), 0, item);\n }\n return { ...currentScene, actions: cActions };\n}\n\n/** Project-level action ACCEPT — advance the baseline for one line. Thin for\n * hosts: `patchBaseline(prev => acceptActionIntoBaseline(prev, current, mark))`. */\nexport function acceptActionIntoBaseline(baseline: ScriptProject, current: ScriptProject, mark: DiffActionMark): ScriptProject {\n const cEp = current.episodes?.[mark.episodeIdx];\n const curScene = cEp?.scenes?.find((s) => (s.scene_id ?? \"\").trim() === mark.sceneId.trim());\n const baseScene = findBaselineScene(baseline, cEp?.episode_id, mark.episodeIdx, mark.sceneId);\n if (!baseScene) {\n return curScene ? acceptSceneIntoBaseline(baseline, cEp?.episode_id, mark.episodeIdx, curScene) : baseline;\n }\n const next = applyActionAccept(baseScene, curScene ?? baseScene, mark);\n return acceptSceneIntoBaseline(baseline, cEp?.episode_id, mark.episodeIdx, next);\n}\n\n/** Project-level action REJECT — revert the working value for one line. Thin:\n * `onEdit(cur => rejectActionToBaseline(cur, baseline, mark))`. */\nexport function rejectActionToBaseline(current: ScriptProject, baseline: ScriptProject | null, mark: DiffActionMark): ScriptProject {\n const cEp = current.episodes?.[mark.episodeIdx];\n const sceneIdx = cEp?.scenes?.findIndex((s) => (s.scene_id ?? \"\").trim() === mark.sceneId.trim()) ?? -1;\n if (sceneIdx < 0 || !cEp?.scenes) return current;\n const curScene = cEp.scenes[sceneIdx];\n const baseScene = findBaselineScene(baseline, cEp.episode_id, mark.episodeIdx, mark.sceneId);\n const next = applyActionReject(curScene, baseScene, mark);\n return rejectSceneToBaseline(current, mark.episodeIdx, sceneIdx, next);\n}\n\n/** Convenience for the simple baseline model: full action-level descriptor data\n * (whole-scene marks for added scenes; per-line marks for modified scenes). */\nexport function buildActionDiff(\n baseline: ScriptProject | null,\n current: ScriptProject,\n): { scenes: DiffSceneMark[]; actions: DiffActionMark[]; removedCount: number; count: number } {\n const cs = computeChangeSet(baseline, current);\n const scenes: DiffSceneMark[] = [];\n const actions: DiffActionMark[] = [];\n for (const [key, kind] of cs.changedScenes) {\n const ci = key.indexOf(\":\");\n const episodeIdx = Number(key.slice(0, ci));\n const sceneId = key.slice(ci + 1);\n if (!Number.isFinite(episodeIdx)) continue;\n if (kind === \"added\") {\n scenes.push({ episodeIdx, sceneId, kind: \"added\" });\n continue;\n }\n const ep = current.episodes?.[episodeIdx];\n const curScene = ep?.scenes?.find((s) => (s.scene_id ?? \"\").trim() === sceneId);\n const baseScene = findBaselineScene(baseline, ep?.episode_id, episodeIdx, sceneId);\n if (!curScene) continue;\n const sd = computeSceneActionDiff(baseScene?.actions ?? [], curScene.actions ?? []);\n for (const c of sd.changed) {\n actions.push({\n episodeIdx,\n sceneId,\n kind: c.kind,\n itemIdx: c.itemIdx,\n baselineItemIdx: c.baselineItemIdx,\n // modified carries the OLD baseline action so the editor can render the\n // deleted line above the new one (unified-diff view)\n item: c.kind === \"modified\" && c.baselineItemIdx != null ? baseScene?.actions?.[c.baselineItemIdx] : undefined,\n });\n }\n for (const r of sd.removed) {\n actions.push({\n episodeIdx,\n sceneId,\n kind: \"removed\",\n itemIdx: r.beforeItemIdx,\n baselineItemIdx: r.baselineItemIdx,\n item: baseScene?.actions?.[r.baselineItemIdx],\n });\n }\n }\n return { scenes, actions, removedCount: cs.removedCount, count: scenes.length + actions.length + cs.removedCount };\n}\n","/**\n * Reference focus — the INVERSE of \"quote to chat\". The host pushes a\n * ScriptReferenceFocusRequest (e.g. when a chat message / comment that quotes\n * the script is clicked); the editor maps the reference's `source` to a\n * StudioSelection and scrolls/selects it. `requestId` is a nonce so re-focusing\n * the same target re-triggers.\n */\nimport type { StudioSelection } from \"./selection.js\";\n\n/** Where a quoted reference points INTO the script. All fields optional/loose\n * to tolerate host payloads (numbers may arrive as strings). */\nexport interface ScriptReferenceLocator {\n id?: string;\n text?: string;\n source?: {\n kind?: string; // \"actor\" | \"location\" | \"prop\" | …\n id?: string;\n episodeIdx?: number | string;\n sceneIdx?: number | string;\n itemIdx?: number | string;\n field?: string; // \"title\" | \"worldview\" | \"style\" | \"description\" | \"scene.header\" | …\n } | null;\n}\n\nexport interface ScriptReferenceFocusRequest {\n /** nonce — bump to re-focus the same target */\n requestId: number;\n reference: ScriptReferenceLocator;\n}\n\nfunction asNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return null;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\n/** Map a reference locator → the selection the editor should focus, or null. */\nexport function selectionFromScriptReference(\n reference: ScriptReferenceLocator,\n): StudioSelection | null {\n const source = reference.source;\n if (!source) return null;\n\n const sourceKind = asString(source.kind);\n const sourceId = asString(source.id);\n if (sourceKind === \"actor\" && sourceId) return { kind: \"actor\", actorId: sourceId };\n if (sourceKind === \"location\" && sourceId) return { kind: \"location\", locationId: sourceId };\n if (sourceKind === \"prop\" && sourceId) return { kind: \"prop\", propId: sourceId };\n\n const episodeIdx = asNumber(source.episodeIdx);\n const sceneIdx = asNumber(source.sceneIdx);\n if (episodeIdx !== null && sceneIdx !== null) {\n return { kind: \"scene\", episodeIdx, sceneIdx };\n }\n if (episodeIdx !== null) return { kind: \"episode\", episodeIdx };\n\n const field = asString(source.field);\n if (field === \"title\" || field === \"worldview\" || field === \"style\") {\n return { kind: \"worldview\" };\n }\n\n return null;\n}\n","/**\n * QuoteLayer — turns a native text selection inside the script surface into a\n * \"quote to chat\" affordance. When the user selects text within a\n * [data-quote-source] region, a small floating button appears near the\n * selection; clicking pushes the quoted text to the host's chat composer.\n *\n * Works WITH the click-to-edit primitive: because display text is plain spans,\n * native selection spans across rows, so quotes can cover multiple lines.\n */\nimport { useEffect, useRef, useState } from \"react\";\nimport { MessageSquareQuote } from \"lucide-react\";\nimport type { ChatReference } from \"../adapters.js\";\n\ninterface Pos {\n top: number;\n left: number;\n text: string;\n}\n\nexport function QuoteLayer({\n containerRef,\n onAddChatReferences,\n}: {\n containerRef: React.RefObject<HTMLElement | null>;\n onAddChatReferences: (refs: ChatReference[]) => void;\n}) {\n const [pos, setPos] = useState<Pos | null>(null);\n const seqRef = useRef(0);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // anchor the chip near where the pointer was released, not at the\n // selection's bounding box (which floats far away on multi-line quotes).\n function update(pointerX: number, pointerY: number) {\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || sel.rangeCount === 0) {\n setPos(null);\n return;\n }\n const range = sel.getRangeAt(0);\n // use the selection's anchor (where it STARTED) rather than the range's\n // commonAncestorContainer — a cross-scene selection's common ancestor is\n // the unmarked stream container, which would fail the data-quote-source\n // test and hide the chip exactly for multi-scene quotes.\n const anchor = sel.anchorNode ?? range.commonAncestorContainer;\n const anchorEl = anchor instanceof Element ? anchor : anchor.parentElement;\n const host = containerRef.current;\n if (!host || !anchorEl || !host.contains(anchorEl)) {\n setPos(null);\n return;\n }\n // only within an editable text source, not inside an active textarea\n if (!anchorEl.closest(\"[data-quote-source]\")) {\n setPos(null);\n return;\n }\n const text = sel.toString().trim();\n if (!text) {\n setPos(null);\n return;\n }\n const hostRect = host.getBoundingClientRect();\n // pop the chip from just above-right of the release point (its bottom-left\n // corner sits near the cursor), clamped to stay inside the canvas\n const left = Math.min(Math.max(8, pointerX - hostRect.left + 6), hostRect.width - 150);\n const top = Math.min(Math.max(36, pointerY - hostRect.top - 6), hostRect.height - 8);\n setPos({ top, left, text });\n }\n\n function onUp(e: MouseEvent) {\n const x = e.clientX;\n const y = e.clientY;\n // defer so the selection is finalized\n requestAnimationFrame(() => update(x, y));\n }\n function onDown(e: MouseEvent) {\n // clicking the button itself shouldn't clear before handler runs\n if ((e.target as HTMLElement)?.closest?.(\".lj-se-quote-btn\")) return;\n setPos(null);\n }\n\n document.addEventListener(\"mouseup\", onUp);\n document.addEventListener(\"mousedown\", onDown, true);\n return () => {\n document.removeEventListener(\"mouseup\", onUp);\n document.removeEventListener(\"mousedown\", onDown, true);\n };\n }, [containerRef]);\n\n if (!pos) return null;\n\n return (\n <button\n type=\"button\"\n className=\"lj-se-quote-btn\"\n style={{ top: pos.top, left: pos.left }}\n onClick={() => {\n seqRef.current += 1;\n onAddChatReferences([\n {\n id: `quote-${seqRef.current}-${pos.text.length}`,\n label: pos.text.length > 24 ? pos.text.slice(0, 24) + \"…\" : pos.text,\n text: pos.text,\n },\n ]);\n window.getSelection()?.removeAllRanges();\n setPos(null);\n }}\n >\n <MessageSquareQuote className=\"lj-se-icon-sm\" strokeWidth={1.5} />\n 引用到对话\n </button>\n );\n}\n","import type { RefObject } from \"react\";\nimport { ChevronLeft, ChevronRight, Search, X } from \"lucide-react\";\n\nexport function ScriptSearchBox({\n query,\n current,\n total,\n inputRef,\n onQueryChange,\n onPrev,\n onNext,\n onClose,\n}: {\n query: string;\n current: number;\n total: number;\n inputRef: RefObject<HTMLInputElement | null>;\n onQueryChange: (query: string) => void;\n onPrev: () => void;\n onNext: () => void;\n onClose: () => void;\n}) {\n return (\n <div className=\"lj-se-search\">\n <Search className=\"lj-se-ic-3\" strokeWidth={2} />\n <input\n ref={inputRef}\n className=\"lj-se-search-input\"\n value={query}\n placeholder=\"搜索\"\n aria-label=\"搜索剧本\"\n onChange={(e) => onQueryChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (e.shiftKey) onPrev();\n else onNext();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }}\n />\n <span className=\"lj-se-search-count\">\n {total > 0 ? current + 1 : 0}/{total}\n </span>\n <button type=\"button\" className=\"lj-se-search-btn\" title=\"上一处\" disabled={total === 0} onClick={onPrev}>\n <ChevronLeft className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n <button type=\"button\" className=\"lj-se-search-btn\" title=\"下一处\" disabled={total === 0} onClick={onNext}>\n <ChevronRight className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n <button type=\"button\" className=\"lj-se-search-btn\" title=\"关闭搜索\" onClick={onClose}>\n <X className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n </div>\n );\n}\n","import type { AssetState, Scene, ScriptItem, ScriptProject } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { getPrimarySceneLocationId } from \"../mutations/editor-utils.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getDialogueSpeakerLabel,\n getEpisodeTitle,\n getLocationDisplayName,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n getSceneContext,\n getSceneNumber,\n getSpeakerMap,\n getStateDisplayName,\n isActorBearingContentType,\n translateEmotionLabel,\n} from \"../utils.js\";\n\nexport interface ScriptSearchEntry {\n key: string;\n text: string;\n selection: StudioSelection;\n}\n\nexport interface ScriptSearchMatch {\n entry: ScriptSearchEntry;\n index: number;\n}\n\nconst SPACE_LABEL: Record<string, string> = {\n interior: \"INT. 内\",\n exterior: \"EXT. 外\",\n};\nconst TIME_LABEL: Record<string, string> = {\n day: \"DAY 日\",\n night: \"NIGHT 夜\",\n dawn: \"DAWN 晨\",\n dusk: \"DUSK 暮\",\n};\n\nfunction add(parts: string[], value: string | null | undefined): void {\n const text = value?.trim();\n if (text) parts.push(text);\n}\n\nfunction findStateName(states: AssetState[] | undefined, stateId: string | null | undefined): string {\n const id = stateId?.trim();\n if (!id) return \"\";\n return getStateDisplayName(states?.find((state) => state.state_id?.trim() === id));\n}\n\nfunction normalize(value: string): string {\n return value.trim().toLocaleLowerCase();\n}\n\nfunction sceneSearchText(\n scene: Scene,\n sceneIdx: number,\n maps: {\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap: ReturnType<typeof getSpeakerMap>;\n locationMap: ReturnType<typeof getLocationMap>;\n propMap: ReturnType<typeof getPropMap>;\n },\n): string {\n const parts: string[] = [];\n const context = getSceneContext(scene);\n const primaryLocationId = getPrimarySceneLocationId(scene);\n const location = primaryLocationId ? maps.locationMap.get(primaryLocationId) : undefined;\n\n add(parts, String(getSceneNumber(scene, sceneIdx)));\n add(parts, SPACE_LABEL[scene.environment?.space ?? \"\"] ?? scene.environment?.space);\n add(parts, location ? getLocationDisplayName(location) : primaryLocationId);\n add(parts, TIME_LABEL[scene.environment?.time ?? \"\"] ?? scene.environment?.time);\n\n for (const ref of context.actors ?? []) {\n const id = ref.actor_id?.trim();\n if (!id) continue;\n const actor = maps.actorMap.get(id);\n add(parts, actor ? getActorDisplayName(actor) : id);\n add(parts, findStateName(actor?.states, ref.state_id));\n }\n for (const ref of context.props ?? []) {\n const id = ref.prop_id?.trim();\n if (!id) continue;\n const prop = maps.propMap.get(id);\n add(parts, prop ? getPropDisplayName(prop) : id);\n add(parts, findStateName(prop?.states, ref.state_id));\n }\n\n for (const item of scene.actions ?? []) {\n addItemSearchText(parts, item, maps.actorMap, maps.speakerMap);\n }\n return parts.join(\"\\n\");\n}\n\nfunction addItemSearchText(\n parts: string[],\n item: ScriptItem,\n actorMap: ReturnType<typeof getActorMap>,\n speakerMap: ReturnType<typeof getSpeakerMap>,\n): void {\n add(parts, item.content);\n add(parts, translateEmotionLabel(item.emotion));\n if (isActorBearingContentType(item.type)) {\n add(parts, getDialogueSpeakerLabel(item, actorMap, speakerMap));\n }\n for (const line of item.lines ?? []) {\n add(parts, getDialogueSpeakerLabel({ speaker_id: line.speaker_id }, actorMap, speakerMap));\n add(parts, line.content);\n }\n}\n\nexport function buildScriptSearchEntries(value: ScriptProject): ScriptSearchEntry[] {\n const entries: ScriptSearchEntry[] = [];\n const maps = {\n actorMap: getActorMap(value.actors ?? []),\n speakerMap: getSpeakerMap(value.speakers ?? []),\n locationMap: getLocationMap(value.locations ?? []),\n propMap: getPropMap(value.props ?? []),\n };\n\n const title = value.title?.trim();\n if (title && (value.episodes?.length ?? 0) > 0) {\n entries.push({\n key: \"title\",\n text: title,\n selection: { kind: \"episode\", episodeIdx: 0 },\n });\n }\n\n (value.episodes ?? []).forEach((episode, episodeIdx) => {\n entries.push({\n key: `episode:${episodeIdx}`,\n text: getEpisodeTitle(episode, episodeIdx),\n selection: { kind: \"episode\", episodeIdx },\n });\n (episode.scenes ?? []).forEach((scene, sceneIdx) => {\n entries.push({\n key: `scene:${episodeIdx}:${sceneIdx}`,\n text: sceneSearchText(scene, sceneIdx, maps),\n selection: { kind: \"scene\", episodeIdx, sceneIdx },\n });\n });\n });\n\n return entries;\n}\n\nexport function findScriptSearchMatches(\n entries: ScriptSearchEntry[],\n query: string,\n): ScriptSearchMatch[] {\n const needle = normalize(query);\n if (!needle) return [];\n const matches: ScriptSearchMatch[] = [];\n for (const entry of entries) {\n if (normalize(entry.text).includes(needle)) {\n matches.push({ entry, index: matches.length });\n }\n }\n return matches;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode, type RefObject } from \"react\";\nimport type { ScriptProject } from \"../types.js\";\nimport { isSameSelectionTarget, withOrigin, type StudioSelection } from \"../selection.js\";\nimport { ScriptSearchBox } from \"./script-search-box.js\";\nimport { HighlightContext } from \"../primitives/highlighted-text.js\";\nimport { buildScriptSearchEntries, findScriptSearchMatches } from \"./search-index.js\";\n\nexport function ScriptSearchLayer({\n value,\n disabled,\n rootRef,\n selection,\n onSelectionChange,\n children,\n}: {\n value: ScriptProject;\n disabled: boolean;\n rootRef: RefObject<HTMLDivElement | null>;\n selection: StudioSelection;\n onSelectionChange: (next: StudioSelection) => void;\n children: ReactNode;\n}) {\n const editorActiveRef = useRef(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [cursor, setCursor] = useState(0);\n\n const entries = useMemo(() => buildScriptSearchEntries(value), [value]);\n const matches = useMemo(() => findScriptSearchMatches(entries, query), [entries, query]);\n const total = matches.length;\n const current = total > 0 ? Math.min(cursor, total - 1) : 0;\n\n const selectMatch = useCallback(\n (index: number) => {\n const match = matches[index];\n if (!match) return;\n const next = withOrigin(match.entry.selection, \"search\");\n setCursor(index);\n if (!isSameSelectionTarget(next, selection)) onSelectionChange(next);\n },\n [matches, onSelectionChange, selection],\n );\n\n const openSearch = useCallback(() => {\n setOpen(true);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n });\n }, []);\n\n const closeSearch = useCallback(() => setOpen(false), []);\n const updateQuery = useCallback((next: string) => {\n setQuery(next);\n setCursor(0);\n }, []);\n const nextMatch = useCallback(() => {\n if (total > 0) selectMatch((current + 1) % total);\n }, [current, selectMatch, total]);\n const prevMatch = useCallback(() => {\n if (total > 0) selectMatch((current - 1 + total) % total);\n }, [current, selectMatch, total]);\n\n useEffect(() => {\n if (open && total > 0) selectMatch(current);\n }, [current, open, selectMatch, total]);\n\n useEffect(() => {\n if (!disabled && open) openSearch();\n }, [disabled, open, openSearch]);\n\n useEffect(() => {\n if (disabled) return;\n const rememberActive = (target: EventTarget | null) => {\n editorActiveRef.current = target instanceof Node && !!rootRef.current?.contains(target);\n };\n const onPointerDown = (e: PointerEvent) => rememberActive(e.target);\n const onFocusIn = (e: FocusEvent) => rememberActive(e.target);\n const onKeyDown = (e: KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== \"f\") return;\n const target = e.target;\n const targetInside = target instanceof Node && !!rootRef.current?.contains(target);\n if (!targetInside) {\n if (target instanceof HTMLElement && target !== document.body) return;\n if (!editorActiveRef.current) return;\n }\n e.preventDefault();\n openSearch();\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"focusin\", onFocusIn, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"focusin\", onFocusIn, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [disabled, openSearch, rootRef]);\n\n return (\n <>\n {open ? (\n <ScriptSearchBox\n query={query}\n current={current}\n total={total}\n inputRef={inputRef}\n onQueryChange={updateQuery}\n onPrev={prevMatch}\n onNext={nextMatch}\n onClose={closeSearch}\n />\n ) : null}\n <HighlightContext.Provider value={open ? query : \"\"}>\n {children}\n </HighlightContext.Provider>\n </>\n );\n}\n","/**\n * ScriptEditor — the package's main entry. A pure, business-decoupled\n * screenplay editor over a ScriptProject:\n * value + onEdit(patch) — the only data contract\n * selection/onSelectionChange, format/onFormatChange — controlled-optional\n * adapters (diff / asset / comments) — business injected by the host. The\n * editor never couples to an agent: it only exposes capabilities/events.\n *\n * Layout: left TOC · top HUD · center (worldview | entity | virtualized script\n * one continuous stream: worldview → episodes/scenes → asset cards). The\n * floating SaveCapsule (save status + AI-revision diff + 返回 breadcrumb) and a\n * quote-to-chat layer mount when their adapters/handlers are present.\n */\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ScriptProject } from \"./types.js\";\nimport {\n EMPTY_SELECTION,\n fromToSelection,\n withOrigin,\n type StudioSelection,\n type StudioSelectionFrom,\n} from \"./selection.js\";\nimport { StudioToc } from \"./toc/studio-toc.js\";\nimport { CanvasTopBar, SaveCapsule, type SaveStatus } from \"./hud/hud.js\";\nimport { ScriptStream } from \"./stream/script-stream.js\";\nimport { sceneChangeKey, type DiffActionMark } from \"./diff/diff-engine.js\";\nimport { addEpisode } from \"./mutations/editor-utils.js\";\nimport { selectionFromScriptReference, type ScriptReferenceFocusRequest } from \"./reference.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getEpisodeNumberLabel,\n getLocationDisplayName,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n} from \"./utils.js\";\nimport type { ScriptFormat } from \"./scene/scene-item-row.js\";\nimport type { ScriptEditorAdapters } from \"./adapters.js\";\nimport { QuoteLayer } from \"./comment/quote-layer.js\";\nimport { EditingSignalContext, type EditingSignal } from \"./primitives/editable-text.js\";\nimport { ScriptSearchLayer } from \"./search/script-search-layer.js\";\n\nexport interface ScriptEditorProps extends ScriptEditorAdapters {\n value: ScriptProject;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n selection?: StudioSelection;\n onSelectionChange?: (next: StudioSelection) => void;\n format?: ScriptFormat;\n onFormatChange?: (format: ScriptFormat) => void;\n disabled?: boolean;\n className?: string;\n dark?: boolean;\n /** built-in left directory. Default \"sidebar\" renders the bundled 256px TOC\n * column; \"none\" → directory-less mode: the editor renders top bar + canvas\n * only (full width) and the host drives navigation via controlled\n * selection/onSelectionChange + the exported buildScriptNav(value) model.\n * 0.1.18+ */\n toc?: \"sidebar\" | \"none\";\n /** when provided, the script title (value.title) becomes click-to-edit in the\n * top bar; the host persists the new value (the editor never touches storage,\n * matching the value + onEdit contract — just one more delegated hook). Omit →\n * the title shows read-only (or nothing when value.title is empty). */\n onTitleChange?: (next: string) => void;\n /** host-injected actions for the top bar's right edge (e.g. 删除剧本 /\n * 查看中间产物). The package only renders the node — all business stays host-side. */\n topBarActions?: React.ReactNode;\n // HUD wiring (host owns autosave + undo stack)\n saveStatus?: SaveStatus;\n canUndo?: boolean;\n canRedo?: boolean;\n onUndo?: () => void;\n onRedo?: () => void;\n /** fires true when an in-editor field opens for editing and false when the\n * last one closes — lets the host pause adopting external revisions without\n * reaching into the package's DOM / class names. */\n onEditingChange?: (editing: boolean) => void;\n /** host-pushed \"jump into the script\" signal (inverse of quote-to-chat):\n * bump requestId + supply a reference → editor selects & scrolls to it. */\n referenceFocusRequest?: ScriptReferenceFocusRequest | null;\n /** stable per-scope key (e.g. projectGroupNo) — remembers & restores the\n * scroll position across editor unmount/remount (tab switch / project nav). */\n scrollScopeKey?: string;\n}\n\nexport function ScriptEditor({\n value,\n onEdit,\n selection: controlledSelection,\n onSelectionChange,\n format: controlledFormat,\n onFormatChange,\n disabled = false,\n className,\n dark,\n toc = \"sidebar\",\n onTitleChange,\n topBarActions,\n saveStatus = \"idle\",\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n onEditingChange,\n referenceFocusRequest,\n scrollScopeKey,\n diff,\n asset,\n onAddChatReferences,\n onRequestAssetDelete,\n}: ScriptEditorProps) {\n void asset; // asset rendering hooks reserved for v2; display handled in chips\n\n // ── editing signal — ref-count active EditableText fields and notify the host\n // on 0↔1 transitions (read onEditingChange from a ref so the signal object\n // stays referentially stable and consumers don't re-render). ──────────────\n const editingCount = useRef(0);\n const onEditingChangeRef = useRef(onEditingChange);\n onEditingChangeRef.current = onEditingChange;\n const editingSignal = useMemo<EditingSignal>(\n () => ({\n inc: () => {\n if ((editingCount.current += 1) === 1) onEditingChangeRef.current?.(true);\n },\n dec: () => {\n editingCount.current = Math.max(0, editingCount.current - 1);\n if (editingCount.current === 0) onEditingChangeRef.current?.(false);\n },\n }),\n [],\n );\n\n // ── undo / redo keyboard shortcuts (Cmd/Ctrl+Z, Cmd/Ctrl+Shift+Z or Ctrl+Y) ─\n // built into the editor so every host gets them for free. Skips when focus\n // is in a text field (let the browser do input-level undo). Latest handlers\n // via a ref → listener attaches once.\n const undoKeysRef = useRef({ onUndo, onRedo, canUndo, canRedo });\n undoKeysRef.current = { onUndo, onRedo, canUndo, canRedo };\n useEffect(() => {\n if (disabled) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey)) return;\n const t = e.target;\n if (\n t instanceof HTMLElement &&\n (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.tagName === \"SELECT\" || t.isContentEditable)\n ) {\n return; // let native input-level undo handle it\n }\n const key = e.key.toLowerCase();\n const { onUndo: u, onRedo: r, canUndo: cu, canRedo: cr } = undoKeysRef.current;\n if (key === \"z\" && !e.shiftKey) {\n if (!u || !cu) return;\n e.preventDefault();\n u();\n } else if ((key === \"z\" && e.shiftKey) || key === \"y\") {\n if (!r || !cr) return;\n e.preventDefault();\n r();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [disabled]);\n\n // ── controlled-optional selection / format ──────────────────────────────\n const [innerSelection, setInnerSelection] = useState<StudioSelection>(EMPTY_SELECTION);\n const selection = controlledSelection ?? innerSelection;\n const setSelection = useCallback(\n (next: StudioSelection) => {\n setInnerSelection(next);\n onSelectionChange?.(next);\n },\n [onSelectionChange],\n );\n\n const [innerFormat, setInnerFormat] = useState<ScriptFormat>(\"standard\");\n const format = controlledFormat ?? innerFormat;\n const setFormat = useCallback(\n (next: ScriptFormat) => {\n setInnerFormat(next);\n onFormatChange?.(next);\n },\n [onFormatChange],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n // ── diff (host-computed marks; the editor only RENDERS) ─────────────────────\n const sceneKindByKey = useMemo(() => {\n const m = new Map<string, \"added\" | \"modified\">();\n for (const s of diff?.scenes ?? []) m.set(sceneChangeKey(s.episodeIdx, s.sceneId), s.kind);\n return m;\n }, [diff?.scenes]);\n // action-level marks grouped per scene: current-index → mark, plus removed\n // ghosts bucketed by the current index they sit before.\n const actionDiffByScene = useMemo(() => {\n const map = new Map<string, { byIndex: Map<number, DiffActionMark>; removedBefore: Map<number, DiffActionMark[]> }>();\n for (const m of diff?.actions ?? []) {\n const key = sceneChangeKey(m.episodeIdx, m.sceneId);\n let e = map.get(key);\n if (!e) {\n e = { byIndex: new Map(), removedBefore: new Map() };\n map.set(key, e);\n }\n if (m.kind === \"removed\") {\n const arr = e.removedBefore.get(m.itemIdx) ?? [];\n arr.push(m);\n e.removedBefore.set(m.itemIdx, arr);\n } else {\n e.byIndex.set(m.itemIdx, m);\n }\n }\n return map;\n }, [diff?.actions]);\n const changedSceneKeys = useMemo(() => {\n const s = new Set(sceneKindByKey.keys());\n for (const k of actionDiffByScene.keys()) s.add(k);\n return s;\n }, [sceneKindByKey, actionDiffByScene]);\n const diffCount = diff\n ? diff.count ?? diff.scenes.length + (diff.actions?.length ?? 0) + (diff.removedCount ?? 0)\n : 0;\n\n const changedSelections = useMemo<StudioSelection[]>(() => {\n if (changedSceneKeys.size === 0) return [];\n const out: StudioSelection[] = [];\n (value.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n if (changedSceneKeys.has(sceneChangeKey(ei, scene.scene_id))) {\n out.push({ kind: \"scene\", episodeIdx: ei, sceneIdx: si });\n }\n });\n });\n return out;\n }, [value, changedSceneKeys]);\n\n const canvasRef = useRef<HTMLDivElement>(null);\n const [diffCursor, setDiffCursor] = useState(0);\n\n const navDiff = useCallback(\n (dir: 1 | -1) => {\n const list = changedSelections;\n if (list.length === 0) return;\n const next = (diffCursor + dir + list.length) % list.length;\n setDiffCursor(next);\n setSelection(withOrigin(list[next], \"diff\"));\n },\n [changedSelections, diffCursor, setSelection],\n );\n\n // per-scene accept/reject → delegate to the host (it owns baseline + value).\n // Present for any changed scene (whole-scene OR action-level) so the scene bar\n // offers \"accept/reject the whole scene\" alongside per-line ✓/✗.\n const sceneDiff = useMemo(() => {\n if (!diff || (!diff.onAcceptScene && !diff.onRejectScene) || changedSceneKeys.size === 0) return undefined;\n const kindAt = (episodeIdx: number, sceneId: string) =>\n sceneKindByKey.get(sceneChangeKey(episodeIdx, sceneId)) ?? \"modified\";\n return {\n kindByKey: sceneKindByKey,\n onAccept: (episodeIdx: number, sceneId: string) =>\n diff.onAcceptScene?.({ episodeIdx, sceneId, kind: kindAt(episodeIdx, sceneId) }),\n onReject: (episodeIdx: number, sceneId: string) =>\n diff.onRejectScene?.({ episodeIdx, sceneId, kind: kindAt(episodeIdx, sceneId) }),\n };\n }, [diff, sceneKindByKey, changedSceneKeys]);\n\n // ── reference focus — host pushes a jump-into-script request ────────────────\n useEffect(() => {\n if (!referenceFocusRequest) return;\n const sel = selectionFromScriptReference(referenceFocusRequest.reference);\n if (sel) setSelection(withOrigin(sel, \"reference\"));\n }, [referenceFocusRequest, setSelection]);\n\n const contextLabel = buildContextLabel(value, selection);\n const returnTarget = resolveReturnTarget(value, selection);\n const rootClass = [\"lj-se-root\", dark ? \"dark\" : \"\", className].filter(Boolean).join(\" \");\n\n const center = (\n <ScriptStream\n value={value}\n format={format}\n disabled={disabled}\n selection={selection}\n changedSceneKeys={changedSceneKeys}\n sceneDiff={sceneDiff}\n actionDiffByScene={actionDiffByScene}\n onAcceptAction={diff?.onAcceptAction}\n onRejectAction={diff?.onRejectAction}\n scrollScopeKey={scrollScopeKey}\n onEdit={onEdit}\n onSelectionChange={setSelection}\n onRequestAssetDelete={onRequestAssetDelete}\n />\n );\n\n return (\n <EditingSignalContext.Provider value={editingSignal}>\n <div\n className={rootClass}\n ref={rootRef}\n >\n {toc === \"sidebar\" ? (\n <StudioToc\n data={value}\n selection={selection}\n onSelect={setSelection}\n onAddEpisode={disabled ? undefined : () => onEdit((p) => addEpisode(p))}\n />\n ) : null}\n <div className=\"lj-se-main\">\n <CanvasTopBar\n title={value.title}\n onTitleChange={disabled ? undefined : onTitleChange}\n titleDisabled={disabled}\n contextLabel={contextLabel}\n format={format}\n onFormatChange={setFormat}\n canUndo={canUndo}\n canRedo={canRedo}\n onUndo={onUndo}\n onRedo={onRedo}\n actions={topBarActions}\n />\n <div className=\"lj-se-canvas\" ref={canvasRef}>\n <ScriptSearchLayer\n value={value}\n disabled={disabled}\n rootRef={rootRef}\n selection={selection}\n onSelectionChange={setSelection}\n >\n {center}\n </ScriptSearchLayer>\n {onAddChatReferences ? (\n <QuoteLayer containerRef={canvasRef} onAddChatReferences={onAddChatReferences} />\n ) : null}\n <SaveCapsule\n saveStatus={saveStatus}\n diffCount={diffCount}\n baselineStatus={diff?.baselineStatus}\n canApplyDiff={!!(diff?.onAcceptAll || diff?.onRejectAll)}\n onDiffPrev={changedSelections.length > 0 ? () => navDiff(-1) : undefined}\n onDiffNext={changedSelections.length > 0 ? () => navDiff(1) : undefined}\n onAcceptAll={diff?.onAcceptAll}\n onRejectAll={diff?.onRejectAll}\n returnLabel={returnTarget?.label}\n onReturn={returnTarget ? () => setSelection(returnTarget.selection) : undefined}\n />\n </div>\n </div>\n </div>\n </EditingSignalContext.Provider>\n );\n}\n\n/** Build the top-bar context label from the current selection. Returns null for\n * the generic/empty case — the always-visible title already says \"which doc\",\n * so a redundant \"剧本\" breadcrumb would just be noise. */\nfunction buildContextLabel(value: ScriptProject, selection: StudioSelection): React.ReactNode {\n if (selection.kind === \"worldview\") {\n return <span className=\"lj-se-ctx-kicker\">世界观 & 风格</span>;\n }\n if (selection.kind === \"actor\") {\n const a = getActorMap(value.actors ?? []).get(selection.actorId);\n return <Ctx kicker=\"角色\" name={a ? getActorDisplayName(a) : selection.actorId} />;\n }\n if (selection.kind === \"location\") {\n const l = getLocationMap(value.locations ?? []).get(selection.locationId);\n return <Ctx kicker=\"场景\" name={l ? getLocationDisplayName(l) : selection.locationId} />;\n }\n if (selection.kind === \"prop\") {\n const p = getPropMap(value.props ?? []).get(selection.propId);\n return <Ctx kicker=\"道具\" name={p ? getPropDisplayName(p) : selection.propId} />;\n }\n const epIdx =\n selection.kind === \"episode\" || selection.kind === \"scene\" || selection.kind === \"clip\"\n ? selection.episodeIdx\n : null;\n if (epIdx != null) {\n const ep = value.episodes?.[epIdx];\n if (ep) {\n return (\n <span className=\"lj-se-ctx\">\n <span className=\"lj-se-ctx-kicker\">第 {getEpisodeNumberLabel(ep, epIdx)} 集</span>\n <span className=\"lj-se-ctx-meta\">{ep.scenes?.length ?? 0} 场</span>\n </span>\n );\n }\n }\n return null;\n}\n\nfunction Ctx({ kicker, name }: { kicker: string; name: string }) {\n return (\n <span className=\"lj-se-ctx\">\n <span className=\"lj-se-ctx-kicker\">{kicker}</span>\n <span className=\"lj-se-ctx-name\">{name}</span>\n </span>\n );\n}\n\n/** When the current selection carries a `from` breadcrumb (set by an asset→scene\n * jump), build the \"返回 X\" target so the capsule can send the user back. */\nfunction resolveReturnTarget(\n value: ScriptProject,\n selection: StudioSelection,\n): { label: string; selection: StudioSelection } | null {\n const from: StudioSelectionFrom | undefined =\n selection.kind === \"episode\" || selection.kind === \"scene\" || selection.kind === \"clip\"\n ? selection.from\n : undefined;\n if (!from) return null;\n let label: string;\n if (from.kind === \"actor\") {\n const a = getActorMap(value.actors ?? []).get(from.actorId);\n label = a ? getActorDisplayName(a) : from.actorId;\n } else if (from.kind === \"location\") {\n const l = getLocationMap(value.locations ?? []).get(from.locationId);\n label = l ? getLocationDisplayName(l) : from.locationId;\n } else {\n const p = getPropMap(value.props ?? []).get(from.propId);\n label = p ? getPropDisplayName(p) : from.propId;\n }\n return { label, selection: withOrigin(fromToSelection(from), \"reference\") };\n}\n","/**\n * Headless navigation model — surfaces the script's TOC tree (the same\n * episodes/scenes/entity structure `StudioToc` renders) as plain data so a host\n * in directory-less mode (`<ScriptEditor toc=\"none\" />`) can build its OWN\n * navigation UI: breadcrumb dropdown, ⌘K command palette, mobile sheet, etc.\n *\n * Each node carries:\n * - `key` — `selectionTargetKey` of its selection; compare against\n * `selectionTargetKey(currentSelection)` to mark the active node.\n * - `selection` — a ready-to-use `StudioSelection` (no origin). On click do\n * `onSelectionChange(withOrigin(node.selection, \"sidebar\"))`.\n *\n * Labels reuse the exact same helpers as `StudioToc`, so a custom nav stays\n * label-identical to the built-in one. Pure function, zero side effects.\n */\nimport type { ScriptProject } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { selectionTargetKey } from \"../selection.js\";\nimport {\n getActorDisplayName,\n getEpisodeNumberLabel,\n getEpisodeTitle,\n getLocationDisplayName,\n getPropDisplayName,\n getSceneNumberLabel,\n getSceneSidebarLabel,\n} from \"../utils.js\";\n\nexport interface ScriptNavScene {\n key: string;\n episodeIdx: number;\n sceneIdx: number;\n sceneId: string;\n /** e.g. \"场 7\" */\n label: string;\n /** e.g. \"scn_007 · 夜内\" */\n meta: string;\n selection: StudioSelection;\n}\n\nexport interface ScriptNavEpisode {\n key: string;\n episodeIdx: number;\n /** zero-padded episode number, e.g. \"01\" */\n label: string;\n /** human title (falls back to \"第 NN 集\") */\n title: string;\n sceneCount: number;\n scenes: ScriptNavScene[];\n selection: StudioSelection;\n}\n\nexport interface ScriptNavEntity {\n key: string;\n id: string;\n name: string;\n selection: StudioSelection;\n}\n\nexport interface ScriptNav {\n episodes: ScriptNavEpisode[];\n actors: ScriptNavEntity[];\n locations: ScriptNavEntity[];\n props: ScriptNavEntity[];\n}\n\nfunction nav(selection: StudioSelection): { key: string; selection: StudioSelection } {\n return { key: selectionTargetKey(selection), selection };\n}\n\n/** Derive the navigation tree from a ScriptProject (see file header). */\nexport function buildScriptNav(value: ScriptProject): ScriptNav {\n const episodes: ScriptNavEpisode[] = (value.episodes ?? []).map((episode, episodeIdx) => {\n const scenes = (episode.scenes ?? []).map((scene, sceneIdx): ScriptNavScene => {\n const selection: StudioSelection = { kind: \"scene\", episodeIdx, sceneIdx };\n return {\n ...nav(selection),\n episodeIdx,\n sceneIdx,\n sceneId: scene.scene_id ?? \"\",\n label: getSceneNumberLabel(scene, sceneIdx),\n meta: getSceneSidebarLabel(scene, sceneIdx),\n };\n });\n const selection: StudioSelection = { kind: \"episode\", episodeIdx };\n return {\n ...nav(selection),\n episodeIdx,\n label: getEpisodeNumberLabel(episode, episodeIdx),\n title: getEpisodeTitle(episode, episodeIdx),\n sceneCount: scenes.length,\n scenes,\n };\n });\n\n const actors: ScriptNavEntity[] = (value.actors ?? [])\n .map((a): ScriptNavEntity => {\n const id = (a.actor_id ?? \"\").trim();\n return { ...nav({ kind: \"actor\", actorId: id }), id, name: getActorDisplayName(a) };\n })\n .filter((e) => e.id);\n\n const locations: ScriptNavEntity[] = (value.locations ?? [])\n .map((l): ScriptNavEntity => {\n const id = (l.location_id ?? \"\").trim();\n return { ...nav({ kind: \"location\", locationId: id }), id, name: getLocationDisplayName(l) };\n })\n .filter((e) => e.id);\n\n const props: ScriptNavEntity[] = (value.props ?? [])\n .map((p): ScriptNavEntity => {\n const id = (p.prop_id ?? \"\").trim();\n return { ...nav({ kind: \"prop\", propId: id }), id, name: getPropDisplayName(p) };\n })\n .filter((e) => e.id);\n\n return {\n episodes,\n actors,\n locations,\n props,\n };\n}\n","export * from \"./editor-utils.js\";\nexport * from \"./item-mutations.js\";\nexport * from \"./entity-mutations.js\";\n","/**\n * DeleteConfirmButton — two-step destructive action, matching agent-frontend:\n * an Eraser icon that, on first click, swaps to an emerald Check; a second click\n * within 2.5s confirms. Auto-cancels after the TTL. The button stays invisible\n * until the parent row/scene is hovered (opacity driven by `.group` hover).\n */\nimport { useEffect, useRef, useState } from \"react\";\nimport { Check, Eraser } from \"lucide-react\";\nimport { cn } from \"../cn.js\";\n\nconst CONFIRM_TTL_MS = 2500;\n\nexport function DeleteConfirmButton({\n onConfirm,\n disabled,\n targetScope,\n title = \"删除?\",\n}: {\n onConfirm: () => void | Promise<void>;\n disabled?: boolean;\n /** drives the parent's hover-tint via data-delete-target */\n targetScope?: \"row\" | \"scene\";\n title?: string;\n /** legacy prop, no longer rendered (kept for call-site compat) */\n description?: string;\n}) {\n const [confirming, setConfirming] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n const cancel = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n setConfirming(false);\n };\n\n const handleClick = () => {\n if (confirming) {\n cancel();\n void onConfirm();\n return;\n }\n setConfirming(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setConfirming(false);\n timerRef.current = null;\n }, CONFIRM_TTL_MS);\n };\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n data-delete-target={targetScope}\n data-confirming={confirming || undefined}\n onClick={handleClick}\n aria-label={confirming ? `再点一次确认:${title}` : title}\n title={confirming ? \"再点一次确认(2.5 秒后自动取消)\" : title}\n className={cn(\"lj-se-del\", confirming && \"is-confirming\")}\n >\n {confirming ? (\n <Check className=\"lj-se-icon\" strokeWidth={2.2} />\n ) : (\n <Eraser className=\"lj-se-icon\" strokeWidth={1.5} />\n )}\n </button>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/selection.ts","../src/types.ts","../src/emotion-labels.ts","../src/utils.ts","../src/cn.ts","../src/toc/studio-toc.tsx","../src/primitives/highlighted-text.tsx","../src/primitives/editable-text.tsx","../src/hud/hud.tsx","../src/mutations/editor-utils.ts","../src/entity-distribution.ts","../src/stream/scroll-state-memo.ts","../src/primitives/popover.tsx","../src/primitives/row-menu.tsx","../src/stream/drag-context.tsx","../src/mutations/item-mutations.ts","../src/primitives/select-field.tsx","../src/scene/scene-cast-prop-rows.tsx","../src/scene/scene-header.tsx","../src/actor-color.ts","../src/scene/scene-item-row.tsx","../src/scene/scene-editor.tsx","../src/stream/flat-items.ts","../src/mutations/entity-mutations.ts","../src/stream/scene-preview-card.tsx","../src/stream/asset-state-timeline.tsx","../src/stream/asset-card.tsx","../src/stream/script-stream.tsx","../src/diff/diff-engine.ts","../src/reference.ts","../src/comment/quote-layer.tsx","../src/search/script-search-box.tsx","../src/search/search-index.ts","../src/search/script-search-layer.tsx","../src/ScriptEditor.tsx","../src/toc/nav-model.ts","../src/mutations/index.ts","../src/primitives/delete-confirm-button.tsx"],"names":["ScriptContentType","states","Fragment","jsx","createContext","useState","useContext","jsxs","ChevronRight","useEffect","useRef","useLayoutEffect","Trash2","withSceneUpdated","Plus","body","Check","useMemo","memo","createPortal","x","moved","X","useCallback","GripVertical","i","j","ChevronLeft","selection","Eraser"],"mappings":";;;;;;;;;;;;;AAyCO,SAAS,kBAAA,CACd,MACA,EAAA,EACiC;AACjC,EAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAChB,EAAA,IAAI,SAAS,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,EAAA,EAAG;AAC1D,EAAA,IAAI,SAAS,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,YAAY,EAAA,EAAG;AACnE,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAG;AACpC;AAEO,SAAS,gBAAgB,IAAA,EAA4C;AAC1E,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AACzE,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW;AACrF,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC7C;AA8BO,IAAM,eAAA,GAAmC,EAAE,IAAA,EAAM,OAAA;AAGjD,SAAS,UAAA,CACd,KACA,MAAA,EACG;AACH,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,MAAA,EAAO;AAC1B;AAMO,SAAS,mBAAmB,CAAA,EAA4B;AAC7D,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA;AAAA,IAC5C,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,EAAE,UAAU,CAAA,CAAA;AAAA,IAChC,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,EAAE,UAAU,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA,EAAI,EAAE,MAAM,CAAA,CAAA;AAAA,IACtD,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,EAAE,OAAO,CAAA,CAAA;AAAA,IAC3B,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,EAAE,UAAU,CAAA,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,EAAE,MAAM,CAAA,CAAA;AAAA,IACzB,KAAK,WAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAA;AAAA;AAEb;AAGO,SAAS,qBAAA,CACd,GACA,CAAA,EACS;AACT,EAAA,OAAO,kBAAA,CAAmB,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAC,CAAA;AACvD;AAEO,SAAS,eAAA,CACd,SAAA,EACA,UAAA,EACA,QAAA,EACS;AACT,EAAA,OACE,UAAU,IAAA,KAAS,OAAA,IACnB,UAAU,UAAA,KAAe,UAAA,IACzB,UAAU,QAAA,KAAa,QAAA;AAE3B;AAEO,SAAS,cAAA,CACd,SAAA,EACA,UAAA,EACA,OAAA,EACA,MAAA,EACS;AACT,EAAA,OACE,SAAA,CAAU,IAAA,KAAS,MAAA,IACnB,SAAA,CAAU,UAAA,KAAe,cACzB,SAAA,CAAU,OAAA,KAAY,OAAA,IACtB,SAAA,CAAU,MAAA,KAAW,MAAA;AAEzB;AAEO,SAAS,uBAAuB,SAAA,EAA2C;AAChF,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,SAAA,EAAW,OAAO,SAAA,CAAU,UAAA;AACnD,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,OAAA,EAAS,OAAO,SAAA,CAAU,UAAA;AACjD,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ,OAAO,SAAA,CAAU,UAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,aAAA,CACd,WACA,UAAA,EACS;AACT,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,SAAA,EAAW,OAAO,UAAU,UAAA,KAAe,UAAA;AAClE,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,OAAA,EAAS,OAAO,UAAU,UAAA,KAAe,UAAA;AAChE,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,MAAA,EAAQ,OAAO,UAAU,UAAA,KAAe,UAAA;AAC/D,EAAA,OAAO,KAAA;AACT;;;AC1KO,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AACL,EAAAA,mBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,mBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,mBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,mBAAA,cAAA,CAAA,GAAe,eAAA;AAJL,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;;;ACEZ,IAAM,cAAA,GAAyC;AAAA,EAC7C,MAAA,EAAQ,oBAAA;AAAA,EACR,QAAA,EAAU,0BAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO,cAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,UAAA,EAAY,0BAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,aAAA,EAAe,cAAA;AAAA,EACf,IAAA,EAAM,cAAA;AAAA,EACN,SAAA,EAAW,cAAA;AAAA,EACX,cAAA,EAAgB,cAAA;AAAA,EAChB,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,WAAA,EAAa,cAAA;AAAA,EACb,IAAA,EAAM,cAAA;AAAA,EACN,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,0BAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,IAAA,EAAM,cAAA;AAAA,EACN,UAAA,EAAY,oBAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,YAAA,EAAc,cAAA;AAAA,EACd,MAAA,EAAQ,cAAA;AAAA,EACR,KAAA,EAAO,cAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,eAAA,EAAiB,0BAAA;AAAA,EACjB,OAAA,EAAS,cAAA;AAAA,EACT,eAAA,EAAiB,0BAAA;AAAA,EACjB,MAAA,EAAQ,0BAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,oBAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,cAAA;AAAA,EACX,OAAA,EAAS,oBAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA,EAAW,0BAAA;AAAA,EACX,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,IAAA,EAAM,cAAA;AAAA,EACN,SAAA,EAAW,oBAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,0BAAA;AAAA,EACT,aAAA,EAAe,oBAAA;AAAA,EACf,KAAA,EAAO,cAAA;AAAA,EACP,IAAA,EAAM,cAAA;AAAA,EACN,QAAA,EAAU,0BAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,0BAAA;AAAA,EACT,QAAA,EAAU,0BAAA;AAAA,EACV,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,0BAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,MAAA,EAAQ,gCAAA;AAAA,EACR,WAAA,EAAa,0BAAA;AAAA,EACb,QAAA,EAAU,0BAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,cAAA;AAAA,EACN,GAAA,EAAK,cAAA;AAAA,EACL,QAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAO,0BAAA;AAAA,EACP,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,0BAAA;AAAA,EACT,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,KAAA,EAAO,cAAA;AAAA,EACP,SAAA,EAAW,gCAAA;AAAA,EACX,gBAAA,EAAkB,oBAAA;AAAA,EAClB,QAAA,EAAU,0BAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,oBAAA;AAAA,EACV,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,cAAA;AAAA,EACX,QAAA,EAAU,0BAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO,cAAA;AAAA,EACP,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,oBAAA;AAAA,EACT,SAAA,EAAW,0BAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,IAAA,EAAM,0BAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,WAAA,EAAa,oBAAA;AAAA,EACb,UAAA,EAAY,cAAA;AAAA,EACZ,QAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAO,cAAA;AAAA,EACP,SAAA,EAAW,cAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,QAAA,EAAU,0BAAA;AAAA,EACV,UAAA,EAAY,oBAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,UAAA,EAAY,cAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,gBAAA,EAAkB,kBAAA;AAAA,EAClB,MAAA,EAAQ,cAAA;AAAA,EACR,WAAA,EAAa,0BAAA;AAAA,EACb,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,iBAAA,EAAmB,gCAAA;AAAA,EACnB,UAAA,EAAY,0BAAA;AAAA,EACZ,SAAA,EAAW,cAAA;AAAA,EACX,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,sBAAsB,OAAA,EAAkB;AACtD,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/C,EAAA,IAAI,CAAC,YAAY,OAAO,EAAA;AACxB,EAAA,IAAI,cAAA,CAAe,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAO,eAAe,UAAU,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,WACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,MAAA,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,IAAA,CAAK,IAAA,EAAK;AAAA,IAC5C,CAAC,CAAA,CACA,IAAA,CAAK,QAAG,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,QAAS,IAAA,EAAK;AACvB;;;ACnKA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,KAAA,EAAO,MAAK,IAAK,EAAA;AAC1B;AAEO,SAAS,WAAA,CAAY,MAAA,GAAwB,EAAC,EAAG;AACtD,EAAA,OAAO,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAC5E;AAEO,SAAS,cAAA,CAAe,SAAA,GAA8B,EAAC,EAAG;AAC/D,EAAA,OAAO,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa,CAAC,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG,QAAQ,CAAC,CAAC,CAAA;AAC3F;AAEO,SAAS,UAAA,CAAW,KAAA,GAAsB,EAAC,EAAG;AACnD,EAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACvE;AAEO,SAAS,aAAA,CAAc,QAAA,GAA4B,EAAC,EAAG;AAC5D,EAAA,OAAO,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,CAAC,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA;AACtF;AAEO,SAAS,oBAAoB,KAAA,EAAqB;AACvD,EAAA,OAAO,OAAO,UAAA,EAAY,IAAA,MAAU,KAAA,EAAO,IAAA,EAAM,MAAK,IAAK,gCAAA;AAC7D;AAEO,SAAS,uBAAuB,QAAA,EAA2B;AAChE,EAAA,OAAO,UAAU,aAAA,EAAe,IAAA,MAAU,QAAA,EAAU,IAAA,EAAM,MAAK,IAAK,gCAAA;AACtE;AAEO,SAAS,mBAAmB,IAAA,EAAmB;AACpD,EAAA,OAAO,MAAM,SAAA,EAAW,IAAA,MAAU,IAAA,EAAM,IAAA,EAAM,MAAK,IAAK,gCAAA;AAC1D;AAEO,SAAS,oBAAoB,KAAA,EAAoB;AACtD,EAAA,OAAO,KAAA,EAAO,UAAA,EAAY,IAAA,EAAK,IAAK,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK,IAAK,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AACxF;AAQO,SAAS,gBAAgB,KAAA,EAAc;AAC5C,EAAA,OAAO;AAAA,IACL,MAAA,EAAA,CAAS,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,MAAA,KAAW,EAAC;AAAA,IAClF,SAAA,EAAA,CAAY,KAAA,CAAM,OAAA,EAAS,SAAA,EAAW,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,SAAA,KAAc,EAAC;AAAA,IAC9F,KAAA,EAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,KAAA,KAAU;AAAC,GAChF;AACF;AAEO,SAAS,SAAA,CAAUC,SAAkC,OAAA,EAA4D;AACtH,EAAA,MAAM,EAAA,GAAK,SAAS,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,EAAA,IAAM,CAACA,OAAAA,EAAQ,OAAO,MAAA;AAC3B,EAAA,OAAOA,OAAAA,CAAO,KAAK,CAAC,KAAA,KAAA,CAAW,MAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,EAAE,CAAA;AACpE;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EACrD,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK,CAAA;AAAA,EAAG,QAAA,EAAK;AACvC,CAAA;AAEA,SAAS,yBAAyB,KAAA,EAAe;AAC/C,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC9B,IAAA,MAAA,IAAU,IAAA,IAAQ,SAAU,IAAA,IAAQ,KAAA,GAAS,OAAO,YAAA,CAAa,IAAA,GAAO,KAAA,GAAS,EAAE,CAAA,GAAI,IAAA;AAAA,EACzF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAoB,KAAA,EAA8B;AACzD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,UAAK,OAAO,EAAA;AACzB,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAG,CAAA,EAAG,OAAO,EAAA,IAAM,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,CAAA,CAAA;AACtE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAG,CAAA,EAAG,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,IAAK,CAAA,IAAK,EAAA;AACxE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,QAAG,CAAA;AACpC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAI,CAAA,IAAK,CAAA;AACxC,IAAA,OAAO,SAAA,GAAY,GAAA,IAAO,mBAAA,CAAoB,KAAK,CAAA,IAAK,CAAA,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,QAAG,CAAA;AACpC,IAAA,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA,IAAK,CAAA,IAAK,MAAM,KAAA,GAAS,YAAA,CAAa,KAAK,CAAA,IAAK,CAAA,GAAK,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,IAAA;AAC/B;AAEA,SAAS,mBAAmB,SAAA,EAAkC;AAC5D,EAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,SAAA,CAAU,IAAA,EAAM,CAAA;AAC5D,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5B,IAAA,MAAM,MAAA,GAAS,OAAO,UAAU,CAAA;AAChC,IAAA,OAAO,OAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AAAA,EAC1D;AACA,EAAA,MAAM,OAAA,GAAU,oBAAoB,UAAU,CAAA;AAC9C,EAAA,OAAO,OAAA,IAAW,OAAA,GAAU,CAAA,GAAI,OAAA,GAAU,IAAA;AAC5C;AAEA,IAAM,mBAAA,GAAsB,4GAAA;AAC5B,IAAM,oBAAoB,IAAI,MAAA;AAAA,EAC5B,CAAA,eAAA,EAAa,mBAAmB,CAAA,yCAAA,EAAuC,mBAAmB,CAAA,IAAA,CAAA;AAAA,EAC1F;AACF,CAAA;AAEO,SAAS,gBAAA,CAAiB,SAAwB,KAAA,EAAe;AACtE,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,CAAQ,UAAA,EAAY,QAAQ,KAAK,CAAA;AACrD,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,iBAAiB,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAA,GAAS,mBAAmB,MAAA,CAAO,CAAC,KAAK,MAAA,CAAO,CAAC,KAAK,EAAE,CAAA;AAC9D,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AACA,IAAA,MAAM,UAAA,GAAa,yBAAyB,KAAK,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC9B,MAAA,IAAI,OAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,GAAG,OAAO,MAAA;AAAA,IACpD;AAAA,EACF;AACA,EAAA,OAAO,KAAA,GAAQ,CAAA;AACjB;AAEO,SAAS,qBAAA,CAAsB,SAAwB,KAAA,EAAe;AAC3E,EAAA,OAAO,MAAA,CAAO,iBAAiB,OAAA,EAAS,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACjE;AAEO,SAAS,eAAA,CAAgB,SAAwB,KAAA,EAAe;AACrE,EAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAK,qBAAA,CAAsB,OAAA,EAAS,KAAK,CAAC,CAAA,OAAA,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAClC,EAAA,IAAI,OAAO,OAAO,KAAA;AAElB,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,EAAY,IAAA,EAAK;AACpC,EAAA,IAAI,MAAM,CAAC,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAG,OAAO,EAAA;AACpC,EAAA,OAAO,QAAA;AACT;AAQO,SAAS,cAAA,CAAe,OAA0B,UAAA,EAA4B;AACnF,EAAA,MAAM,IAAI,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK,CAAE,MAAM,QAAQ,CAAA;AAChD,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,MAAM,IAAI,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,IAAI,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,GAAG,OAAO,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,UAAA,GAAa,CAAA;AACtB;AAEO,SAAS,mBAAA,CAAoB,OAA0B,UAAA,EAAoB;AAChF,EAAA,OAAO,CAAA,OAAA,EAAK,cAAA,CAAe,KAAA,EAAO,UAAU,CAAC,CAAA,CAAA;AAC/C;AAEO,SAAS,oBAAA,CAAqB,OAAc,UAAA,EAAoB;AACrE,EAAA,MAAM,UAAU,KAAA,CAAM,QAAA,EAAU,MAAK,IAAK,MAAA,CAAO,aAAa,CAAC,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAa,KAAA,KAAU,aAAa,QAAA,GAAM,QAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,EAAa,IAAA,IAAQ,KAAA;AAC3C,EAAA,MAAM,OAAA,GAAkC,EAAE,GAAA,EAAK,QAAA,EAAK,OAAO,QAAA,EAAK,IAAA,EAAM,QAAA,EAAK,IAAA,EAAM,QAAA,EAAI;AACrF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA;AACjC,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,MAAA,EAAM,IAAI,GAAG,KAAK,CAAA,CAAA;AACrC;AAEO,SAAS,0BAA0B,IAAA,EAAe;AACvD,EAAA,OAAO,IAAA,KAAA,UAAA,mBAAuC,IAAA,KAAA,eAAA;AAChD;AAEO,SAAS,qBAAA,CACd,WACA,UAAA,mBAAyC,IAAI,KAAI,EACjD,QAAA,mBAAqC,IAAI,GAAA,EAAI,EAC7C;AACA,EAAA,MAAM,EAAA,GAAK,YAAY,SAAS,CAAA;AAChC,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AACjC,EAAA,IAAI,SAAS,YAAA,EAAc,IAAA,IAAQ,OAAO,OAAA,CAAQ,aAAa,IAAA,EAAK;AACpE,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK;AAC9C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,OAAA,EAAS,SAAS,CAAA;AAC/C,EAAA,IAAI,UAAA,KAAe,WAAW,QAAA,EAAU;AACtC,IAAA,OAAO,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAC,CAAA,IAAK,QAAA;AAAA,EACxD;AACA,EAAA,MAAM,OAAA,GAAU,GAAG,UAAA,CAAW,MAAM,IAAI,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AACtD,EAAA,IAAI,OAAA,IAAW,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,SAAU,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,OAAO,CAAC,CAAA;AACtF,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,wBACd,IAAA,EACA,QAAA,EACA,UAAA,mBAAyC,IAAI,KAAI,EACjD;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrF,IAAA,OAAO,KAAK,KAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,sBAAsB,IAAA,CAAK,UAAA,EAAY,UAAA,EAAY,QAAQ,CAAC,CAAA,CAC1E,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,KAAK,CAAA;AAAA,EACf;AACA,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,QAAQ,CAAA,GAC1C,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,WAAA,CAAY,QAAQ,UAAU,CAAC,EAAE,MAAA,CAAO,OAAO,IAC9E,EAAC;AACL,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc,qBAAA,CAAsB,SAAA,EAAW,UAAA,EAAY,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,EACzG;AACA,EAAA,IAAI,KAAK,UAAA,EAAY,OAAO,sBAAsB,IAAA,CAAK,UAAA,EAAY,YAAY,QAAQ,CAAA;AACvF,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAClC,EAAA,OAAO,KAAA,GAAQ,mBAAA,CAAoB,KAAK,CAAA,GAAI,OAAA,IAAW,0BAAA;AACzD;AAEO,SAAS,yBAAyB,QAAA,EAAmB;AAC1D,EAAA,IAAI,QAAA,KAAa,gBAAgB,OAAO,cAAA;AACxC,EAAA,IAAI,QAAA,KAAa,WAAW,OAAO,cAAA;AACnC,EAAA,IAAI,QAAA,KAAa,SAAS,OAAO,cAAA;AACjC,EAAA,OAAO,EAAA;AACT;;;ACzOO,SAAS,MAAM,KAAA,EAAyD;AAC7E,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACvC;AC+BA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,wBACJ,IAAA,CAAAC,UAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA,mBACC,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,IAAA,IAAQ,SAAS,CAAA;AAAA,QAChD,WAAA,EAAa;AAAA;AAAA,KACf,GACE,IAAA;AAAA,oBACJ,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,aAAa,GAAA,EAAK,CAAA;AAAA,oBAClD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACvC,SAAS,IAAA,mBAAO,GAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EAAkB,iBAAM,CAAA,GAAU;AAAA,GAAA,EACrE,CAAA;AAEF,EAAA,OAAO,QAAA,uBACJ,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,WAAA,IAAe,OAAO,CAAA,EAAG,SAAS,QAAA,EAC/E,QAAA,EAAA,KAAA,EACH,CAAA,mBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,UAAA,EAAY,WAAA,IAAe,OAAO,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAEnE;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAsB,MAAM;AAClE,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,IAAI,SAAA,CAAU,SAAS,OAAA,IAAW,SAAA,CAAU,SAAS,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA;AAAA,SACxF,IAAA,CAAK,IAAI,CAAC,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH,EAAA,MAAM,OAAO,CAAC,GAAA,KAAyB,SAAS,UAAA,CAAW,GAAA,EAAK,SAAS,CAAC,CAAA;AAE1E,EAAA,MAAM,aAAA,GAAgB,UAAU,IAAA,KAAS,SAAA,IAAa,UAAU,IAAA,KAAS,OAAA,IAAW,UAAU,IAAA,KAAS,MAAA;AAEvG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAGb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,OAAO,QAAA,CAAS,MAAA;AAAA,QAChB,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,UAAU,MAAM,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAC,CAAC;AAAA;AAAA,KAC3C;AAAA,IACC,YAAA,GACC,QAAA,CAAS,MAAA,KAAW,CAAA,uBACjB,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,0BAAA,EAAI,CAAA,GAErC,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,EAAA,KAAO;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,KAAS,SAAA,IAAa,UAAU,UAAA,KAAe,EAAA;AAC1E,MAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,QAAA,IAAY,WAAW,CAAA,EACvD,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA,EAAG,YAAA,EAAW,6BACzF,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,WAAW,EAAA,CAAG,YAAA,EAAc,UAAU,SAAS,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,CAAA,EAClF,CAAA;AAAA,0BACA,IAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,EAAA,EAAI,CAAA,EACxG,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,8BAAA,EAA+B,WAAA,EAAa,GAAA,EAAK,CAAA;AAAA,gCACpE,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,qBAAA,CAAsB,OAAA,EAAS,EAAE,CAAA,EAAE,CAAA;AAAA,gCACrE,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAqB,QAAA,EAAA,eAAA,CAAgB,OAAA,EAAS,EAAE,CAAA,EAAE,CAAA;AAAA,4BAClE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,MAAA;AAAA,cAAO;AAAA,aAAA,EAAE;AAAA,WAAA,EACvD;AAAA,SAAA,EACF,CAAA;AAAA,QACC,MAAA,GACG,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAA,KAAO;AACxB,UAAA,MAAM,MAAA,GACJ,UAAU,IAAA,KAAS,OAAA,IAAW,UAAU,UAAA,KAAe,EAAA,IAAM,UAAU,QAAA,KAAa,EAAA;AACtF,UAAA,uBACE,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,MAAA,IAAU,WAAW,CAAA;AAAA,cACjE,OAAA,EAAS,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAS,UAAA,EAAY,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,CAAA;AAAA,cAEnE,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oCAChC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAA,EAAE,CAAA;AAAA,oCACrE,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,oBAAA,CAAqB,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA;AAAA,aAAA;AAAA,YAPjE,MAAM,EAAE,CAAA;AAAA,WAQf;AAAA,QAEJ,CAAC,CAAA,GACD;AAAA,OAAA,EAAA,EA7BI,CAAA,GAAA,EAAM,EAAE,CAAA,CA8BlB,CAAA;AAAA,IAEJ,CAAC,CAAA,GAED,IAAA;AAAA,IACH,YAAA,IAAgB,+BACf,IAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,YAAA,EACzD,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,CAAA,EAAG,CAAA;AAAA,MAAE;AAAA,KAAA,EACjD,CAAA,GACE,IAAA;AAAA,oBAEJ,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAU,0BAAA;AAAA,QACV,QAAQ,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAK,CAAA,CAAE,QAAA,IAAY,IAAI,IAAA,EAAK,EAAG,MAAM,mBAAA,CAAoB,CAAC,GAAE,CAAE,CAAA;AAAA,QACvG,WAAA,EAAa,UAAU,IAAA,KAAS,OAAA;AAAA,QAChC,UAAU,CAAC,EAAA,KAAO,UAAU,IAAA,KAAS,OAAA,IAAW,UAAU,OAAA,KAAY,EAAA;AAAA,QACtE,MAAA,EAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI;AAAA;AAAA,KACrD;AAAA,oBACA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAU,0BAAA;AAAA,QACV,QAAQ,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAK,CAAA,CAAE,WAAA,IAAe,IAAI,IAAA,EAAK,EAAG,MAAM,sBAAA,CAAuB,CAAC,GAAE,CAAE,CAAA;AAAA,QAChH,WAAA,EAAa,UAAU,IAAA,KAAS,UAAA;AAAA,QAChC,UAAU,CAAC,EAAA,KAAO,UAAU,IAAA,KAAS,UAAA,IAAc,UAAU,UAAA,KAAe,EAAA;AAAA,QAC5E,MAAA,EAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI;AAAA;AAAA,KAC3D;AAAA,oBACA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAU,0BAAA;AAAA,QACV,QAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAK,CAAA,CAAE,OAAA,IAAW,IAAI,IAAA,EAAK,EAAG,MAAM,kBAAA,CAAmB,CAAC,GAAE,CAAE,CAAA;AAAA,QACpG,WAAA,EAAa,UAAU,IAAA,KAAS,MAAA;AAAA,QAChC,UAAU,CAAC,EAAA,KAAO,UAAU,IAAA,KAAS,MAAA,IAAU,UAAU,MAAA,KAAW,EAAA;AAAA,QACpE,MAAA,EAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI;AAAA;AAAA;AACnD,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,IAAI,CAAA;AACrC,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACtC,EAAA,uBACE,IAAA,CAAAA,UAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAc,KAAA,EAAO,MAAM,MAAA,EAAQ,IAAA,EAAY,WAAA,EAA0B,QAAA,EAAU,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IACrI,IAAA,GACG,KAAA,CAAM,MAAA,KAAW,CAAA,mBACf,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,SAAA,EAAU,CAAA,GAC5C,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACT,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,WAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA,CAAE,EAAE,KAAK,WAAW,CAAA;AAAA,QACzE,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QAE1B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,WAAA,EAAa,GAAA,EAAK,CAAA;AAAA,0BAClE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,YAAE,IAAA,EAAK;AAAA;AAAA,OAAA;AAAA,MANzC,CAAA,CAAE;AAAA,KAQV,CAAA,GACH;AAAA,GAAA,EACN,CAAA;AAEJ;ACtOO,IAAM,gBAAA,GAAmB,cAAsB,EAAE,CAAA;AAEjD,SAAS,eAAA,CAAgB,EAAE,IAAA,EAAK,EAAmC;AACxE,EAAA,MAAM,SAAA,GAAY,WAAW,gBAAgB,CAAA;AAC7C,EAAA,uBAAOC,GAAAA,CAAAD,UAAAA,EAAA,EAAG,QAAA,EAAA,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA,EAAE,CAAA;AACnD;AAEO,SAAS,qBAAA,CAAsB,OAAe,KAAA,EAA0B;AAC7E,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,EAAkB;AAC3C,EAAA,MAAM,WAAA,GAAc,OAAO,iBAAA,EAAkB;AAC7C,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,WAAW,CAAA;AACxC,EAAA,OAAO,OAAO,CAAA,EAAG;AACf,IAAA,IAAI,GAAA,GAAM,MAAM,GAAA,CAAI,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,EAAM,GAAG,CAAC,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAA;AAAA,sBACFC,GAAAA,CAAC,MAAA,EAAA,EAAkC,SAAA,EAAU,kBAAA,EAC1C,gBAAM,KAAA,CAAM,GAAA,EAAK,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA,EAAA,EAD5B,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA,CAE/B;AAAA,KACF;AACA,IAAA,IAAA,GAAO,MAAM,MAAA,CAAO,MAAA;AACpB,IAAA,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,IAAA,GAAO,MAAM,MAAA,EAAQ,GAAA,CAAI,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AACnD,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,KAAA;AAChC;ACDO,IAAM,oBAAA,GAAuBC,cAAoC,IAAI,CAAA;AAK5E,IAAM,cAAA,GAAiB,GAAA;AAmBvB,SAAS,oBAAA,CAAqB,GAAW,CAAA,EAA0B;AACjE,EAAA,MAAM,CAAA,GAAI,QAAA;AAIV,EAAA,IAAI,OAAO,CAAA,CAAE,mBAAA,KAAwB,UAAA,EAAY;AAC/C,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,mBAAA,CAAoB,CAAA,EAAG,CAAC,CAAA;AACpC,IAAA,OAAO,CAAA,GAAI,EAAE,WAAA,GAAc,IAAA;AAAA,EAC7B;AACA,EAAA,IAAI,OAAO,CAAA,CAAE,sBAAA,KAA2B,UAAA,EAAY;AAClD,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,sBAAA,CAAuB,CAAA,EAAG,CAAC,CAAA;AACvC,IAAA,OAAO,CAAA,GAAI,EAAE,MAAA,GAAS,IAAA;AAAA,EACxB;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,SAAS,QAAQ,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,OAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,OAA+C,IAAI,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,aAAA,GAAgBC,WAAW,oBAAoB,CAAA;AACrD,EAAA,MAAM,SAAA,GAAYA,WAAW,gBAAgB,CAAA;AAO7C,EAAA,MAAM,YAAA,GAAe,OAA6C,IAAI,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,OAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AACjC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,cAAA,EAAe;AACf,IAAA,MAAM,OAAO,QAAA,CAAS,OAAA;AACtB,IAAA,IAAI,IAAA,KAAS,aAAa,OAAA,EAAS;AACjC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,cAAA,EAAe;AACf,IAAA,YAAA,CAAa,OAAA,GAAU,WAAW,MAAM;AACtC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,MAAA,SAAA,EAAU;AAAA,IACZ,GAAG,cAAc,CAAA;AAAA,EACnB,CAAA;AAIA,EAAA,SAAA,CAAU,MAAM,MAAM,SAAA,EAAU,EAAG,EAAE,CAAA;AAIrC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,EAAe;AAChC,IAAA,aAAA,CAAc,GAAA,EAAI;AAClB,IAAA,OAAO,MAAM,cAAc,GAAA,EAAI;AAAA,EACjC,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAa3B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,KAAU,aAAa,OAAA,EAAS;AACpC,IAAA,MAAM,YAAA,GAAe,OAAA,IAAW,KAAA,KAAU,YAAA,CAAa,OAAA;AACvD,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AAAA,EACzB,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,KAAK,CAAC,CAAA;AAI1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,aAAqB,IAAI,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,KAAK,QAAA,CAAS,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAI,SAAA,WAAoB,EAAE,CAAA;AAC1B,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,MAAM,GAAA,GAAM,KAAA,IAAS,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA;AAC7E,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,EACrB,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,SAAS,UAAU,CAAA,EAAqB;AACtC,IAAA,IAAI,QAAA,EAAU;AAEd,IAAA,MAAM,GAAA,GAAM,OAAO,YAAA,EAAa;AAChC,IAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,WAAA,EAAa;AAC7B,IAAA,QAAA,CAAS,OAAA,GAAU,oBAAA,CAAqB,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAC5D,IAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAC7B,IAAA,QAAA,CAAS,UAAU,YAAA,CAAa,OAAA;AAChC,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,SAAS,MAAA,GAAS;AAChB,IAAA,cAAA,EAAe;AACf,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,SAAA,IAAY;AACZ,IAAA,IAAI,KAAA,KAAU,aAAa,OAAA,EAAS;AAClC,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,SAAS,MAAA,GAAS;AAChB,IAAA,cAAA,EAAe;AACf,IAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAC7B,IAAA,QAAA,CAAS,UAAU,YAAA,CAAa,OAAA;AAChC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,SAAA,IAAY;AAAA,EACd;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,OAAA,GAAU,KAAA,GACZ,qBAAA,CAAsB,KAAA,EAAO,SAAS,CAAA,mBACtCH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,WAAA,IAAe,EAAA,EAAG,CAAA;AAClD,IAAA,uBACEA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACE,GAAG,SAAA;AAAA,QACJ,WAAW,gBAAA,IAAoB,SAAA,GAAY,MAAM,SAAA,GAAY,EAAA,CAAA,IAAO,WAAW,qBAAA,GAAwB,EAAA,CAAA;AAAA,QACvG,OAAA,EAAS,SAAA;AAAA,QAER,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,SAAA,EAAW,eAAA,IAAmB,SAAA,GAAY,GAAA,GAAM,SAAA,GAAY,EAAA,CAAA;AAAA,IAC5D,QAAA,EAAU,CAAC,CAAA,KAAiE;AAC1E,MAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,MAAA,QAAA,CAAS,CAAC,CAAA;AACV,MAAA,QAAA,CAAS,OAAA,GAAU,CAAA;AACnB,MAAA,IAAI,SAAA,EAAW,QAAA,CAAS,CAAA,CAAE,MAA6B,CAAA;AACvD,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,YAAA,EAAa;AAAA,IAC1C,CAAA;AAAA,IACA,oBAAoB,MAAM;AACxB,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,cAAA,EAAe;AAAA,IACjB,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,CAAA,KAAsE;AACvF,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,QAAA,CAAS,OAAA,GAAU,EAAE,aAAA,CAAc,KAAA;AACnC,MAAA,YAAA,EAAa;AAAA,IACf,CAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,CAAC,CAAA,KAA2B;AACrC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,EAAO;AAAA,MACT,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC5B,QAAA,IAAI,CAAC,SAAA,IAAa,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,EAAS;AACxC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,SAAA,mBACLA,GAAAA,CAAC,UAAA,EAAA,EAAU,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAA,mBAE/BA,GAAAA,CAAC,OAAA,EAAA,EAAO,GAAG,MAAA,EAAQ,MAAK,MAAA,EAAO,CAAA;AAEnC;AAEA,SAAS,SAAS,EAAA,EAA+B;AAC/C,EAAA,EAAA,CAAG,MAAM,MAAA,GAAS,MAAA;AAClB,EAAA,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,EAAA,CAAG,YAAA,GAAe,IAAA;AACtC;AC9OO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAQ,YAAA,EAAW,0BAAA,EAAO,WAAU,cAAA,EAC1C,QAAA,EAAA;AAAA,IACA,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,cAAA,EAAK;AAAA,IAC/B,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,0BAAA;AAAO,GAChC,CAAY,GAAA,CAAI,CAAC,GAAA,qBACfA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,QAAA;AAAA,MACL,cAAA,EAAc,UAAU,GAAA,CAAI,GAAA;AAAA,MAC5B,WAAW,EAAA,CAAG,kBAAA,EAAoB,KAAA,KAAU,GAAA,CAAI,OAAO,WAAW,CAAA;AAAA,MAClE,OAAA,EAAS,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,MAE9B,QAAA,EAAA,GAAA,CAAI;AAAA,KAAA;AAAA,IANA,GAAA,CAAI;AAAA,GAQZ,CAAA,EACH,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAiBG;AACD,EAAA,MAAM,QAAA,GAAW,aAAA,IAAiB,IAAA,IAAA,CAAS,KAAA,IAAS,IAAI,MAAA,GAAS,CAAA;AACjE,EAAA,uBACEI,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,GACC,gCACEJ,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,oBAAA;AAAA,UACV,OAAO,KAAA,IAAS,EAAA;AAAA,UAChB,WAAA,EAAY,gCAAA;AAAA,UACZ,QAAA,EAAU,aAAA;AAAA,UACV,MAAA,EAAQ;AAAA;AAAA,0BAGVA,GAAAA,CAAC,UAAK,SAAA,EAAU,2CAAA,EAA6C,iBAAM,CAAA,GAEnE,IAAA;AAAA,MACH,YAAA,mBACCI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EACb,QAAA,EAAA;AAAA,QAAA,QAAA,mBAAWJ,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,aAAA,EAAW,IAAA,EAAC,eAAC,CAAA,GAAU,IAAA;AAAA,QACrE;AAAA,OAAA,EACH,CAAA,GACE;AAAA,KAAA,EACN,CAAA;AAAA,oBACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,MAAA,EAAQ,UAAU,cAAA,EAAgB,CAAA;AAAA,MACtD,UAAU,MAAA,mBACTI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,cAAA,EAAe,QAAA,EAAU,CAAC,OAAA,EAAS,KAAA,EAAM,gBAAK,OAAA,EAAS,MAAA,EACrF,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EACnD,CAAA;AAAA,wBACAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,cAAA,EAAe,UAAU,CAAC,OAAA,EAAS,OAAM,cAAA,EAAK,OAAA,EAAS,QACrF,QAAA,kBAAAA,GAAAA,CAAC,SAAM,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EACnD;AAAA,OAAA,EACF,CAAA,GACE,IAAA;AAAA,MACH,0BAAUA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EAAwB,mBAAQ,CAAA,GAAS;AAAA,KAAA,EACrE;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,UAAA,GAAa,MAAA;AAAA,EACb,SAAA,GAAY,CAAA;AAAA,EACZ,cAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAaG;AACD,EAAA,MAAM,WAAW,UAAA,KAAe,MAAA;AAChC,EAAA,MAAM,UAAU,SAAA,GAAY,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,CAAC,EAAE,WAAA,IAAe,QAAA,CAAA;AACpC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,WAAW,OAAO,IAAA;AAEhD,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACb,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCA,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,KAAA,EAAO,CAAA,aAAA,EAAM,WAAW,CAAA,CAAA,EAAI,OAAA,EAAS,QAAA,EAC1F,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,sBACpDI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,QAAA,eAAA;AAAA,QAAI;AAAA,OAAA,EAAY;AAAA,KAAA,EAC/D,CAAA,GACE,IAAA;AAAA,IACH,OAAA,mBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,CAAA;AAAA,wBACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B;AAAA,OAAA,EAC9C,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAsB,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,MACvC,cAAA,KAAmB,QAAA,mBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,KAAA,EAAM,uFAAA,EAAkB,QAAA,EAAA,oBAAA,EAAG,CAAA,GAC9D,IAAA;AAAA,MACH,UAAA,mBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,qBAAoB,KAAA,EAAM,oBAAA,EAAM,SAAS,UAAA,EACvE,QAAA,kBAAAA,IAAC,WAAA,EAAA,EAAY,SAAA,EAAU,cAAa,WAAA,EAAa,IAAA,EAAM,GACzD,CAAA,GACE,IAAA;AAAA,MACH,UAAA,mBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,qBAAoB,KAAA,EAAM,oBAAA,EAAM,SAAS,UAAA,EACvE,QAAA,kBAAAA,IAACK,YAAAA,EAAA,EAAa,WAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EAC1D,CAAA,GACE,IAAA;AAAA,MACH,WAAA,mBACCL,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAU,CAAC,YAAA,EAAc,OAAA,EAAS,WAAA,EAAa,sCAEtG,CAAA,GACE,IAAA;AAAA,MACH,WAAA,mBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAU,CAAC,YAAA,EAAc,OAAA,EAAS,WAAA,EAAa,sCAEtG,CAAA,GACE;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,IACH,QAAA,IAAY,CAAC,OAAA,mBAAUA,IAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,CAAA,GAAK;AAAA,GAAA,EACjE,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,MAAA,EAAO,EAA2B;AACxD,EAAA,IAAI,MAAA,KAAW,QAAA;AACb,IAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACd,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,uBAAA,EAAwB,aAAa,IAAA,EAAM,CAAA;AAAA,MAAE;AAAA,KAAA,EAClE,CAAA;AAEJ,EAAA,IAAI,MAAA,KAAW,OAAA;AACb,IAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EACd,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,MAAE;AAAA,KAAA,EACpD,CAAA;AAEJ,EAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EACd,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,YAAA,EAAa,aAAa,IAAA,EAAM,CAAA;AAAA,IAAE;AAAA,GAAA,EAC3D,CAAA;AAEJ;;;ACxLA,SAAS,cAAc,IAAA,EAAqB;AAC1C,EAAA,OAAO,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAClC;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,YAAA,EACA,UAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,OAAA,CAAQ,KAAK,CAAA;AAClC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEA,SAAS,mBAAmB,KAAA,EAAe;AACzC,EAAA,OAAO,KAAA,CACJ,KAAA,CAAM,MAAM,CAAA,CACZ,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,OAAO,CAAA;AACnB;AAEA,SAAS,eAAA,CAAgB,OAAc,KAAA,EAAsD;AAC3F,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,OAAA,CAAQ,MAAA;AAAA,IAChC,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,OAAA,CAAQ,SAAA;AAAA,IACtC,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,OAAA,CAAQ;AAAA,GAChC;AACA,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,OAAA;AAAA,IACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,OAAO,OAAA,CAAQ;AAAA,GACjB;AACF;AAEO,SAAS,mBAAmB,KAAA,EAAc;AAC/C,EAAA,OAAA,CAAQ,gBAAgB,KAAK,CAAA,CAAE,UAAU,EAAC,EACvC,IAAI,CAAC,IAAA,KAAS,KAAK,QAAA,EAAU,IAAA,MAAU,EAAE,CAAA,CACzC,OAAO,OAAO,CAAA,CACd,KAAK,QAAG,CAAA;AACb;AAEO,SAAS,0BAA0B,KAAA,EAAc;AACtD,EAAA,MAAM,eAAe,KAAA,CAAM,YAAA,EAAc,IAAA,CAAK,OAAO,GAAG,IAAA,EAAK;AAC7D,EAAA,IAAI,cAAc,OAAO,YAAA;AACzB,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,SAAA,GAAY,CAAC,CAAA,EAAG,WAAA,EAAa,MAAK,IAAK,EAAA;AACvE;AAEO,SAAS,eAAA,CAAgB,SAAiB,kBAAA,EAAwC;AACvF,EAAA,OAAO;AAAA,IACL,SAAS,OAAA,CAAQ,IAAA,EAAK,IAAK,CAAA,EAAA,EAAK,qBAAqB,CAAC,CAAA,CAAA;AAAA,IACtD,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AACF;AAEO,SAAS,gBAAA,CAAiB,OAAA,EAA6B,oBAAA,EAA8B,kBAAA,EAA4B;AACtH,EAAA,MAAM,UAAA,GAAa,SAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,YAAY,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AAE7E,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,cAAc,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AACxE,EAAA,OAAO,CAAA,EAAG,MAAM,CAAC,CAAC,GAAG,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA,GAAI,CAAC,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAC/F;AAEO,SAAS,kBAAA,CAAmB,MAAqB,YAAA,EAA8B;AACpF,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,GAAW,YAAY,CAAA;AAC5C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK,CAAE,MAAM,aAAa,CAAA;AACxD,IAAA,IAAI,KAAA,EAAO,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,CAAA,IAAA,EAAO,OAAO,WAAA,GAAc,CAAC,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACxD;AAEA,SAAS,sBAAA,CAAuB,MAAqB,YAAA,EAAmC;AACtF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,GAAW,YAAY,CAAA;AAC5C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK;AACrC,IAAA,IAAI,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,2BAAA,CAA4B,IAAA,EAAqB,YAAA,EAAsB,WAAA,EAA6B;AAC3G,EAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,IAAA,EAAM,YAAY,CAAA;AACtD,EAAA,IAAI,YAAY,WAAA,CAAY,IAAA,EAAK,IAAK,kBAAA,CAAmB,MAAM,YAAY,CAAA;AAC3E,EAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,SAAS,GAAG,OAAO,SAAA;AAEjC,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,cAAc,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,kBAAA,CAAmB,MAAM,YAAY,CAAA;AAExD,EAAA,IAAI,UAAU,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAC9C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AACxE,IAAA,OAAA,IAAW,CAAA;AAAA,EACb;AACA,EAAA,OAAO,SAAA;AACT;AAMO,SAAS,oBAAA,CACd,WAAA,EACA,cAAA,EACA,oBAAA,EACA,kBAAA,EACQ;AACR,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,MAAM,cAAA,EAAgB;AAC/B,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,QAAA,EAAU,IAAA,EAAK;AAC7B,IAAA,IAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,EACrB;AACA,EAAA,IAAI,SAAA,GAAY,gBAAA,CAAiB,WAAA,EAAa,oBAAA,EAAsB,kBAAkB,CAAA;AACtF,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,IAAK,WAAW,GAAA,EAAM;AAC7C,IAAA,SAAA,GAAY,gBAAA,CAAiB,SAAA,EAAW,oBAAA,EAAsB,kBAAkB,CAAA;AAChF,IAAA,QAAA,IAAY,CAAA;AAAA,EACd;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,OAAA,EAA6B,oBAAA,EAA8B,kBAAA,EAA4B;AACtH,EAAA,MAAM,UAAA,GAAa,SAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,YAAY,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AAE7E,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,cAAc,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA,EAAG,uBAAuB,CAAC,CAAA,CAAA,EAAI,qBAAqB,CAAC,CAAA,CAAA;AACxE,EAAA,MAAM,IAAI,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,UAAA;AACnB,EAAA,OAAO,CAAA,EAAG,MAAM,CAAC,CAAC,GAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA;AACpC;AAEO,SAAS,qBAAqB,KAAA,EAA0B;AAC7D,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK;AACrC,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,CAAM,MAAM,CAAA;AAE9C,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,IAC7B,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK,IAAK,UAAA;AAAA,MAC7B,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,IAAK;AAAA,KAC7B;AAAA,IACA,YAAA,EAAc,QAAA,GAAW,CAAC,QAAQ,IAAI,EAAC;AAAA,IACvC,SAAA,EAAW,QAAA,GAAW,CAAC,EAAE,WAAA,EAAa,UAAU,QAAA,EAAU,IAAA,EAAM,CAAA,GAAI,EAAC;AAAA,IACrE,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,OAAA,MAAa,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,IAAA,EAAK,CAAE,CAAA;AAAA,IACvE,SAAS;AAAC,GACZ;AACF;AAEO,SAAS,oBAAoB,KAAA,EAA8B;AAChE,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,UAAA;AAAA,MACA,QAAA,EAAU,KAAA,CAAM,SAAA,CAAU,IAAA,EAAK;AAAA,MAC/B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,MAC5B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAK,KAC9B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA,CAAM,UAAA,CAAW,IAAA,EAAK,IAAA,QAAA;AAAA,IAC5B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAK,GAC9B;AACF;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,OACA,KAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,KAAA,CAAM,MAAK,EAAE;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,MAAA,EAAQ;AACzC,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,WAAA,EAAa;AAAA,UACX,GAAG,KAAA,CAAM,WAAA;AAAA,UACT,CAAC,KAAK,GAAG,KAAA,CAAM,IAAA;AAAK;AACtB,OACF;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,EAAK;AAC5B,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,GAAG,KAAA;AAAA,QACH,YAAA,EAAc,QAAA,GAAW,CAAC,QAAQ,IAAI;AAAC,OACzC,EAAG,EAAE,SAAA,EAAW,QAAA,GAAW,CAAC,EAAE,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,MAAM,OAAA,GAAU,mBAAmB,KAAK,CAAA;AACxC,MAAA,MAAM,uBAAuB,IAAI,GAAA;AAAA,QAAA,CAC9B,gBAAgB,KAAK,CAAA,CAAE,SAAS,EAAC,EAAG,IAAI,CAAC,IAAA,KAAS,CAAA,CAAE,IAAA,CAAK,WAAW,EAAA,EAAI,IAAA,IAAQ,IAAA,CAAK,QAAA,IAAY,IAAI,CAAC;AAAA,OACzG;AACA,MAAA,OAAO,gBAAgB,KAAA,EAAO;AAAA,QAC5B,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,UAC9B,OAAA,EAAS,MAAA;AAAA,UACT,QAAA,EAAU,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,SAChD,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,mBAAmB,KAAK,CAAA;AACzC,IAAA,MAAM,mBAAmB,IAAI,GAAA;AAAA,MAAA,CAC1B,gBAAgB,KAAK,CAAA,CAAE,UAAU,EAAC,EAAG,IAAI,CAAC,IAAA,KAAS,CAAA,CAAE,IAAA,CAAK,YAAY,EAAA,EAAI,IAAA,IAAQ,IAAA,CAAK,QAAA,IAAY,IAAI,CAAC;AAAA,KAC3G;AACA,IAAA,OAAO,gBAAgB,KAAA,EAAO;AAAA,MAC5B,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,QACjC,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA,IAAK;AAAA,OAC7C,CAAE;AAAA,KACH,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AASA,SAAS,wBAAA,CAAyB,KAAA,EAAc,OAAA,EAAiB,OAAA,EAA+B;AAC9F,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAS;AAClD,IAAA,IAAA,CAAK,KAAK,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,SAAS,OAAO,IAAA;AACrD,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,IAAA,MAAU,OAAA,EAAS,OAAO,IAAA;AAChD,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AAAA,EACtC,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,MAAA,CAAO,KAAK,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,UAAU,eAAA,CAAgB,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,GAAI,KAAA;AACxD;AAEA,SAAS,2BAAA,CAA4B,KAAA,EAAc,UAAA,EAAoB,OAAA,EAA+B;AACpG,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,aAAa,OAAA,CAAQ,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAS;AACxD,IAAA,IAAA,CAAK,KAAK,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK,KAAM,YAAY,OAAO,IAAA;AAC3D,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,IAAA,MAAU,OAAA,EAAS,OAAO,IAAA;AAChD,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AAAA,EACtC,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,SAAA,CAAU,KAAK,EAAE,WAAA,EAAa,UAAA,EAAY,QAAA,EAAU,SAAS,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,UAAU,eAAA,CAAgB,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,GAAI,KAAA;AAC3D;AAEA,SAAS,uBAAA,CAAwB,KAAA,EAAc,MAAA,EAAgB,OAAA,EAA+B;AAC5F,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,SAAS,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAS;AAChD,IAAA,IAAA,CAAK,KAAK,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK,KAAM,QAAQ,OAAO,IAAA;AACnD,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,IAAA,MAAU,OAAA,EAAS,OAAO,IAAA;AAChD,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AAAA,EACtC,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,KAAA,CAAM,KAAK,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,UAAU,eAAA,CAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,GAAI,KAAA;AACvD;AAEA,SAAS,yBACP,IAAA,EACA,YAAA,EACA,UAAA,EACA,IAAA,EACA,UACA,OAAA,EACA;AACA,EAAA,MAAM,gBAAA,GAAmB,SAAS,IAAA,EAAK;AACvC,EAAA,MAAM,eAAA,GAAkB,OAAA,EAAS,IAAA,EAAK,IAAK,IAAA;AAC3C,EAAA,IAAI,CAAC,kBAAkB,OAAO,IAAA;AAE9B,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,IAAI,SAAS,OAAA,EAAS,OAAO,wBAAA,CAAyB,KAAA,EAAO,kBAAkB,eAAe,CAAA;AAC9F,IAAA,IAAI,SAAS,UAAA,EAAY,OAAO,2BAAA,CAA4B,KAAA,EAAO,kBAAkB,eAAe,CAAA;AACpG,IAAA,OAAO,uBAAA,CAAwB,KAAA,EAAO,gBAAA,EAAkB,eAAe,CAAA;AAAA,EACzE,CAAC,CAAA;AACH;AAEO,SAAS,qBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,SACA,OAAA,EACA;AACA,EAAA,OAAO,yBAAyB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,OAAA,EAAS,SAAS,OAAO,CAAA;AAC3F;AAEO,SAAS,wBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,YACA,OAAA,EACA;AACA,EAAA,OAAO,yBAAyB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,UAAA,EAAY,YAAY,OAAO,CAAA;AACjG;AAEO,SAAS,oBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,QACA,OAAA,EACA;AACA,EAAA,OAAO,yBAAyB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,MAAA,EAAQ,QAAQ,OAAO,CAAA;AACzF;AAEO,SAAS,6BAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,EACA,SACA,OAAA,EACe;AACf,EAAA,MAAM,iBAAA,GAAoB,QAAQ,IAAA,EAAK;AACvC,EAAA,IAAI,CAAC,iBAAA,IAAqB,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AACvD,EAAA,MAAM,eAAA,GAAkB,OAAA,EAAS,IAAA,EAAK,IAAK,IAAA;AAC3C,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,YAAA,GAAe,CAAA,IAAK,MAAA,CAAO,aAAa,CAAA,EAAG;AACtD,IAAA,IAAI,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,uBAAa,GAAA,EAAY;AACzB,MAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,UAAU,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,QAAA,GAAA,CAAY,KAAK,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,SAAS,YAAA,KAAiB;AACpE,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA;AAC/C,IAAA,IAAI,CAAC,cAAc,OAAO,OAAA;AAC1B,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,CAAC,OAAO,UAAA,KAAe;AACxD,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,UAAU,GAAG,OAAO,KAAA;AAC1C,MAAA,MAAM,YACJ,IAAA,KAAS,OAAA,GACL,yBAAyB,KAAA,EAAO,iBAAA,EAAmB,eAAe,CAAA,GAClE,IAAA,KAAS,UAAA,GACP,2BAAA,CAA4B,OAAO,iBAAA,EAAmB,eAAe,IACrE,uBAAA,CAAwB,KAAA,EAAO,mBAAmB,eAAe,CAAA;AACzE,MAAA,IAAI,cAAc,KAAA,EAAO;AACvB,QAAA,cAAA,GAAiB,IAAA;AACjB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AACA,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,UAAU,cAAA,GAAiB,EAAE,GAAG,OAAA,EAAS,QAAO,GAAI,OAAA;AAAA,EAC7D,CAAC,CAAA;AAED,EAAA,OAAO,OAAA,GAAU,EAAE,GAAG,IAAA,EAAM,UAAS,GAAI,IAAA;AAC3C;AAEO,SAAS,sBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,OAAA,CAAQ,SAAS,IAAI,EAAE,GAAG,MAAM,OAAA,EAAS,OAAA,CAAQ,MAAK,EAAE;AACxD,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,oBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAIlB,IAAA,MAAM,OAAmB,EAAE,GAAG,MAAM,QAAA,EAAU,OAAA,CAAQ,MAAK,EAAE;AAC7D,IAAA,OAAO,IAAA,CAAK,UAAA;AACZ,IAAA,OAAO,IAAA,CAAK,QAAA;AACZ,IAAA,OAAO,IAAA,CAAK,KAAA;AACZ,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,sBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,MAAM,IAAA,GAAmB,EAAE,GAAG,IAAA,EAAK;AACnC,IAAA,IAAI,OAAA,OAAc,OAAA,GAAU,OAAA;AAAA,gBAChB,IAAA,CAAK,OAAA;AACjB,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,IAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAS,CAAA,EAAG,OAAO,KAAA;AAChC,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAOO,SAAS,UAAA,CAAW,MAAqB,OAAA,EAAiC;AAC/E,EAAA,MAAM,WAAW,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,IAAA,GAAO,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,MAAM,CAAC,CAAA;AAChG,EAAA,MAAM,QACJ,OAAO,IAAA,KAAS,WAAA,IAAe,OAAO,KAAK,GAAA,KAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,SAAS,MAAM,CAAA;AAClH,EAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,EAAE,UAAA,EAAY,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAC9E,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAGO,SAAS,aAAA,CAAc,MAAqB,YAAA,EAAqC;AACtF,EAAA,MAAM,SAAS,IAAA,CAAK,QAAA,GAAW,YAAY,CAAA,EAAG,UAAU,EAAC;AACzD,EAAA,OAAO,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,MAAA,CAAO,MAAA,EAAQ;AAAA,IACpD,WAAA,EAAa,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,KAAA,EAAM;AAAA,IAC9C,SAAS;AAAC,GACX,CAAA;AACH;AAEO,SAAS,WAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,KAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,KAAA;AAAA,IACH,UAAU,2BAAA,CAA4B,IAAA,EAAM,YAAA,EAAc,KAAA,CAAM,YAAY,EAAE;AAAA,GAChF;AACA,EAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,CAAA,EAAG,UAAU,CAAA;AACvC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEO,SAAS,UAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,gBAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,IAAI,gBAAA,IAAoB,CAAA,IAAK,gBAAA,IAAoB,OAAA,CAAQ,QAAQ,OAAO,IAAA;AAExE,EAAA,MAAM,UAAA,GAAoB;AAAA,IACxB,GAAG,KAAA;AAAA,IACH,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,gBAAgB;AAAA,GAC5C;AAIA,EAAA,MAAM,SAAA,GAAmB;AAAA,IACvB,GAAG,KAAA;AAAA,IACH,QAAA,EAAU,2BAAA,CAA4B,IAAA,EAAM,YAAA,EAAc,EAAE,CAAA;AAAA,IAC5D,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,gBAAgB;AAAA,GACzC;AAIA,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAElD,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,EAAG,UAAA,EAAY,SAAA,EAAW,GAAG,cAAc;AAAA,GACnF;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAWO,SAAS,kBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA;AACA,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,GAAa,CAAC,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,UAAU,CAAA;AAC7B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,GAAA,EAAK,OAAO,IAAA;AAE1B,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,MAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,OAAO,CAAC,GAAI,eAAA,CAAgB,IAAI,EAAE,MAAA,IAAU,EAAC,EAAI,GAAI,gBAAgB,GAAG,CAAA,CAAE,MAAA,IAAU,EAAG,CAAA,EAAG;AACnG,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AACnC,MAAA,IAAI,CAAC,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,MAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,OAAO,CAAC,GAAI,eAAA,CAAgB,IAAI,EAAE,SAAA,IAAa,EAAC,EAAI,GAAI,gBAAgB,GAAG,CAAA,CAAE,SAAA,IAAa,EAAG,CAAA,EAAG;AACzG,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,EAAa,IAAA,EAAK,IAAK,EAAA;AACtC,MAAA,IAAI,CAAC,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,MAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,OAAO,CAAC,GAAI,eAAA,CAAgB,IAAI,EAAE,KAAA,IAAS,EAAC,EAAI,GAAI,gBAAgB,GAAG,CAAA,CAAE,KAAA,IAAS,EAAG,CAAA,EAAG;AACjG,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAS,IAAA,EAAK,IAAK,EAAA;AAClC,MAAA,IAAI,CAAC,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,SAAS,WAAA,EAAY;AAC3B,EAAA,MAAM,YAAY,cAAA,EAAe;AACjC,EAAA,MAAM,QAAQ,UAAA,EAAW;AAEzB,EAAA,MAAM,SAAgB,eAAA,CAAgB;AAAA,IACpC,GAAG,IAAA;AAAA,IACH,OAAA,EAAS,CAAC,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC,EAAI,GAAI,GAAA,CAAI,OAAA,IAAW,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKzD,YAAA,EAAc;AAAA,GAChB,EAAG,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AAE/B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAExC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,UAAA,GAAa,CAAC,CAAA,EAAG,MAAA,EAAQ,GAAG,IAAI;AAAA,GAC9D;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEO,SAAS,WAAA,CAAY,IAAA,EAAqB,YAAA,EAAsB,UAAA,EAAoB;AACzF,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC3B,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAEO,SAAS,eAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,IAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,CAAA,EAAG,IAAI,CAAA;AACjC,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,eAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,SAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAC,CAAA;AAC3B,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAOO,SAAS,aAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,OAAA,EACA;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,IAAa,OAAA,CAAQ,QAAQ,OAAO,KAAA;AACzD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,IAAA,GAAO,SAAA,GAAY,SAAA,GAAY,SAAA,GAAY,CAAA,GAAI,SAAA;AACrD,IAAA,IAAI,IAAA,KAAS,WAAW,OAAO,KAAA;AAC/B,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA;AAC7B,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAcO,SAAS,cAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACe;AACf,EAAA,IAAI,KAAK,YAAA,KAAiB,EAAA,CAAG,gBAAgB,IAAA,CAAK,UAAA,KAAe,GAAG,UAAA,EAAY;AAC9E,IAAA,OAAO,aAAA,CAAc,MAAM,IAAA,CAAK,YAAA,EAAc,KAAK,UAAA,EAAY,IAAA,CAAK,SAAA,EAAW,EAAA,CAAG,IAAI,CAAA;AAAA,EACxF;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,YAAY,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,EAAA,CAAG,YAAY,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO,OAAO,IAAA;AAC7B,EAAA,MAAM,YAAY,CAAC,GAAI,KAAA,CAAM,MAAA,IAAU,EAAG,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,aAAa,CAAC,GAAI,QAAA,CAAS,OAAA,IAAW,EAAG,CAAA;AAC/C,EAAA,IAAI,KAAK,SAAA,GAAY,CAAA,IAAK,KAAK,SAAA,IAAa,UAAA,CAAW,QAAQ,OAAO,IAAA;AACtE,EAAA,MAAM,CAAC,KAAK,CAAA,GAAI,WAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACnD,EAAA,SAAA,CAAU,KAAK,UAAU,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,SAAS,UAAA,EAAW;AAChE,EAAA,QAAA,CAAS,KAAK,YAAY,CAAA,GAAI,EAAE,GAAG,KAAA,EAAO,QAAQ,SAAA,EAAU;AAG5D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,EAAA,CAAG,YAAY,CAAA;AACvC,EAAA,MAAM,YAAY,CAAC,GAAI,MAAA,CAAO,MAAA,IAAU,EAAG,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,EAAA,CAAG,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,aAAa,CAAC,GAAI,QAAA,CAAS,OAAA,IAAW,EAAG,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,CAAG,IAAA,EAAM,UAAA,CAAW,MAAM,CAAC,CAAA;AAC7D,EAAA,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA;AAChC,EAAA,SAAA,CAAU,GAAG,UAAU,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,SAAS,UAAA,EAAW;AAC9D,EAAA,QAAA,CAAS,GAAG,YAAY,CAAA,GAAI,EAAE,GAAG,MAAA,EAAQ,QAAQ,SAAA,EAAU;AAE3D,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAGO,SAAS,aAAA,CAAc,MAAqB,YAAA,EAAqC;AACtF,EAAA,MAAM,WAAW,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAC1C,EAAA,IAAI,YAAA,GAAe,CAAA,IAAK,YAAA,IAAgB,QAAA,CAAS,QAAQ,OAAO,IAAA;AAChE,EAAA,QAAA,CAAS,MAAA,CAAO,cAAc,CAAC,CAAA;AAC/B,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;;;AC9uBA,SAAS,SAAA,CAAU,OAAA,EAAwB,EAAA,EAAY,KAAA,EAAc,EAAA,EAAY;AAC/E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA,EAAG,qBAAA,CAAsB,OAAA,EAAS,EAAE,CAAC,CAAA,MAAA,EAAM,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA;AAAA,IAChF,YAAA,EAAc,EAAA;AAAA,IACd,aAAA,EAAe,gBAAA,CAAiB,OAAA,EAAS,EAAE,CAAA;AAAA,IAC3C,UAAA,EAAY,EAAA;AAAA,IACZ,WAAA,EAAa,cAAA,CAAe,KAAA,EAAO,EAAE;AAAA,GACvC;AACF;AAEO,SAAS,sBAAA,CAAuB,MAAqB,OAAA,EAAqC;AAC/F,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,MAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,MAAA,MAAM,GAAA,GAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AAChF,MAAA,MAAM,SAAA,GAAY,CAAC,GAAA,IAAA,CAAQ,KAAA,CAAM,WAAW,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AACjG,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAK,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,UACjC,GAAG,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACnC,SAAS,GAAA,EAAK;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,yBAAA,CAA0B,MAAqB,UAAA,EAAwC;AACrG,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,MAAA,MAAM,KAAA,GAAA,CAAS,KAAA,CAAM,YAAA,IAAgB,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,IAAK,EAAA,EAAI,IAAA,EAAK,KAAM,UAAU,CAAA;AACpF,MAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,MAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,OAAW,UAAU,CAAA;AAC5F,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAK,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,UACvC,GAAG,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACnC,SAAS,MAAA,EAAQ;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,qBAAA,CAAsB,IAAA,EAAqB,MAAA,EAAgB,QAAA,EAAsC;AAC/G,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,MAAM,EAAA,GAAK,OAAO,IAAA,EAAK;AACvB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC3C,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,MAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,MAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,KAAA,IAAS,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,OAAW,EAAE,CAAA;AAC5E,MAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,MAAA;AAChB,MAAA,MAAM,OAAO,CAAC,KAAA,IAAS,EAAA,GAAA,CAAM,KAAA,CAAM,WAAW,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,OAAA,IAAW,IAAI,QAAA,CAAS,EAAE,CAAC,CAAA,GAAI,KAAA;AAChG,MAAA,MAAM,MAAA,GACJ,CAAC,KAAA,IAAS,CAAC,QAAQ,MAAA,GAAA,CACd,KAAA,CAAM,WAAW,EAAC,EAAG,KAAK,CAAC,CAAA,KAAA,CAAO,EAAE,OAAA,IAAW,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA,GAClF,KAAA;AACN,MAAA,IAAI,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAK,CAAA,KAAA,EAAQ,EAAA,IAAM,MAAM,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AAAA,UACrC,GAAG,SAAA,CAAU,OAAA,EAAS,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,UACnC,SAAS,MAAA,EAAQ;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AASO,SAAS,yBAAyB,YAAA,EAA2D;AAClG,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAgC;AAChD,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,IAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,EAAE,CAAA;AAC9D,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAA,CAAI,OAAA,EAAS,CAAA,CAC5B,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CACxB,IAAI,CAAC,CAAC,YAAA,EAAc,KAAK,CAAA,MAAO;AAAA,IAC/B,YAAA;AAAA,IACA,aAAA,EAAe,KAAA,CAAM,CAAC,CAAA,EAAG,iBAAiB,YAAA,GAAe,CAAA;AAAA,IACzD,KAAA,EAAO,MAAM,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU;AAAA,GACzD,CAAE,CAAA;AACN;AAQA,IAAM,aAAsC,EAAC;AAKtC,SAAS,cAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,EACyB;AACzB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAA,GAAS,wBAAA,CAAyB,sBAAA,CAAuB,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACzE,CAAA,MAAA,IAAW,UAAU,WAAA,EAAa;AAChC,IAAA,MAAA,GAAS,wBAAA,CAAyB,yBAAA,CAA0B,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EAC5E,CAAA,MAAO;AACL,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AAChF,IAAA,MAAA,GAAS,yBAAyB,qBAAA,CAAsB,IAAA,EAAM,SAAS,kBAAA,CAAmB,IAAI,CAAC,CAAC,CAAA;AAAA,EAClG;AACA,EAAA,OAAO,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,UAAA,GAAa,MAAA;AAC5C;AAKA,SAAS,aAAA,CAAc,GAA4B,CAAA,EAAqC;AACtF,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,EAAA,CAAG,YAAA,KAAiB,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,aAAA,KAAkB,EAAA,CAAG,aAAA,IAAiB,EAAA,CAAG,KAAA,CAAM,MAAA,KAAW,EAAA,CAAG,MAAM,MAAA,EAAQ;AACvH,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA;AACrB,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA;AACrB,MAAA,IACE,EAAA,CAAG,QAAQ,EAAA,CAAG,GAAA,IACd,GAAG,KAAA,KAAU,EAAA,CAAG,KAAA,IAChB,EAAA,CAAG,UAAA,KAAe,EAAA,CAAG,cACrB,EAAA,CAAG,WAAA,KAAgB,EAAA,CAAG,WAAA,IACtB,EAAA,CAAG,aAAA,KAAkB,GAAG,aAAA,IACxB,EAAA,CAAG,OAAA,KAAY,EAAA,CAAG,OAAA,EAClB;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,sBAAA,CACd,MACA,IAAA,EACsC;AACtC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqC;AACvD,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAa,IAAA,KAAkC;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,GAAA,IAAO,aAAA,CAAc,KAAK,IAAI,CAAA,GAAI,MAAM,IAAI,CAAA;AAAA,EAC7D,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG;AACjC,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACnC,IAAA,IAAI,EAAA,MAAQ,CAAA,OAAA,EAAU,EAAE,IAAI,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,EAAE,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG;AACpC,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK;AACtC,IAAA,IAAI,EAAA,MAAQ,CAAA,UAAA,EAAa,EAAE,IAAI,cAAA,CAAe,IAAA,EAAM,WAAA,EAAa,EAAE,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AAChC,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAClC,IAAA,IAAI,EAAA,MAAQ,CAAA,MAAA,EAAS,EAAE,IAAI,cAAA,CAAe,IAAA,EAAM,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,KAAA;AACT;ACnMA,IAAM,MAAA,uBAAa,GAAA,EAA2B;AAEvC,SAAS,gBAAgB,KAAA,EAAsD;AACpF,EAAA,OAAO,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AACrC;AAKO,SAAS,kBAAA,CACd,OACA,WAAA,EACM;AACN,EAAAM,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,GAAA,GAAM,WAAA;AACZ,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,CAAC,QAAA,KAAa;AAClC,QAAA,MAAA,CAAO,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AACzB;ACJO,SAAS,OAAA,CAAQ;AAAA,EACtB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR,IAAA,GAAO,QAAA;AAAA,EACP,SAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,OAAA,GAAUK,OAAwB,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWA,OAAuB,IAAI,CAAA;AAE5C,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,IAAA,OAAO,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,aAAa,KAAK,QAAA,CAAS,IAAA;AAAA,EAC7D,CAAA,GAAG;AAEH,EAAAC,gBAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,CAAQ,OAAA,EAAS;AAC/B,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,MAAA,MAAM,KAAK,MAAA,CAAO,UAAA;AAClB,MAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAGlB,MAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,OAAO,EAAA,EAAI;AAChC,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,EAAS,WAAA,IAAe,GAAA;AAChD,MAAA,MAAM,MAAA,GAAS,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,SAAS,GAAA,GAAM,EAAA;AAElD,MAAA,IAAI,OAAO,CAAA,CAAE,IAAA;AACb,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC1B,QAAA,SAAA,GAAY,kBAAA;AAAA,MACd,CAAA,MAAA,IAAW,UAAU,KAAA,EAAO;AAC1B,QAAA,IAAA,GAAO,CAAA,CAAE,KAAA;AACT,QAAA,SAAA,GAAY,mBAAA;AAAA,MACd;AAEA,MAAA,IAAI,CAAC,WAAW,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrD,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAEvB,MAAA,SAAA;AAAA,QACE,SACI,EAAE,MAAA,EAAQ,EAAA,GAAK,CAAA,CAAE,MAAM,CAAA,EAAG,IAAA,EAAM,SAAA,EAAU,GAC1C,EAAE,GAAA,EAAK,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,MAAM,SAAA;AAAU,OAC3C;AAAA,IACF,CAAA;AACA,IAAA,OAAA,EAAQ;AAER,IAAA,MAAM,GAAA,GAAM,sBAAsB,OAAO,CAAA;AAMzC,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,sBAAsB,MAAM;AACrC,QAAA,QAAA,GAAW,CAAA;AACX,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,QAAA,EAAU,IAAI,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,IAAI,QAAA,uBAA+B,QAAQ,CAAA;AAC3C,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,QAAA,EAAU,IAAI,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,KAAK,CAAC,CAAA;AAEtB,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,SAAS,WAAW,CAAA,EAAe;AACjC,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,CAAS,CAAC,KAAK,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AACA,IAAA,SAAS,MAAM,CAAA,EAAkB;AAC/B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACvC;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,UAAA,EAAY,IAAI,CAAA;AACvD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,KAAA,EAAO,IAAI,CAAA;AAChD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,UAAA,EAAY,IAAI,CAAA;AAC1D,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAA,EAAO,IAAI,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACEF,KAAC,MAAA,EAAA,EAAK,GAAA,EAAK,SAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA,EAC1D,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAClD,QAAQ,MAAA,GACL,YAAA;AAAA,sBACEJ,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,cAAc,CAAA;AAAA,UAC/C,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,KAAK,MAAA,EAAQ,GAAA;AAAA,YACb,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,IAAA,EAAM,QAAQ,IAAA,IAAQ,KAAA;AAAA,YACtB,WAAW,MAAA,EAAQ;AAAA,WACrB;AAAA,UAEC,mBAAS,EAAE,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAK,GAAG;AAAA;AAAA,OAC3C;AAAA,MACA;AAAA,KACF,GACA;AAAA,GAAA,EACN,CAAA;AAEJ;AC7HA,IAAM,KAAA,GAAiF;AAAA,EACrF,EAAE,KAAA,EAAA,UAAA,iBAAmC,KAAA,EAAO,cAAA,EAAM,MAAM,aAAA,EAAc;AAAA,EACtE,EAAE,KAAA,EAAA,QAAA,eAAiC,KAAA,EAAO,cAAA,EAAM,MAAM,IAAA,EAAK;AAAA,EAC3D,EAAE,KAAA,EAAA,eAAA,qBAAuC,KAAA,EAAO,cAAA,EAAM,MAAM,KAAA,EAAM;AAAA,EAClE,EAAE,KAAA,EAAA,WAAA,kBAAoC,KAAA,EAAO,cAAA,EAAM,MAAM,QAAA;AAC3D,CAAA;AAiBO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA,mBACCA,IAAAA,CAAAL,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBACrCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChB,QAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,KAAU,OAAA,CAAQ,OAAA;AAC/B,QAAA,uBACEI,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,EAAA,IAAM,OAAO,CAAA;AAAA,YACjD,SAAS,MAAM;AACb,cAAA,KAAA,EAAM;AACN,cAAA,IAAI,CAAC,EAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,EAAE,KAAK,CAAA;AAAA,YACnC,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,8BAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM;AAAA;AAAA,WAAA;AAAA,UATV,CAAA,CAAE;AAAA,SAUT;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IACH,QAAA,CAAS,IAAI,CAAC,KAAA,EAAO,uBACpBI,IAAAA,CAACL,UAAA,EACE,QAAA,EAAA;AAAA,MAAA,EAAA,GAAK,KAAK,OAAA,mBAAUC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAoB,CAAA,GAAK,IAAA;AAAA,MAC5D,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,uBACEI,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,IAAA,CAAK,UAAU,mBAAmB,CAAA;AAAA,YACtE,SAAS,MAAM;AACb,cAAA,KAAA,EAAM;AACN,cAAA,IAAA,CAAK,QAAA,EAAS;AAAA,YAChB,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,QAAK,SAAA,EAAW,EAAA,CAAG,kCAAkC,IAAA,CAAK,cAAc,CAAA,EAAG,WAAA,EAAa,GAAA,EAAK,CAAA;AAAA,cAC7F,IAAA,CAAK;AAAA;AAAA,WAAA;AAAA,UATD,IAAA,CAAK;AAAA,SAUZ;AAAA,MAEJ,CAAC;AAAA,KAAA,EAAA,EAlBY,EAmBf,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,IAAI,UAAU,OAAO,IAAA;AACrB,EAAA,MAAM,aAAA,GAA+B;AAAA,IACnC,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,gCAAA,EAAS,UAAU,aAAA,EAAc;AAAA,IACzD,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,gCAAA,EAAS,UAAU,aAAA;AAAc,GAC7D;AACA,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,sCAAA;AAAA,MACP,QAAA,EAAU,WAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH;AACA,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,kBAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,uBAChBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACJ,GAAG,eAAA;AAAA,UACJ,WAAW,EAAA,CAAG,cAAA,EAAgB,QAAQ,SAAA,EAAW,eAAA,EAAiB,aAAa,cAAc,CAAA;AAAA,UAC7F,KAAA,EAAM,wDAAA;AAAA,UACN,YAAA,EAAW,oBAAA;AAAA,UACX,OAAA,EAAS,MAAA;AAAA,UAET,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EAAoB,aAAa,GAAA,EAAK;AAAA;AAAA,OAChE;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA,EAAS,EAAE,OAAA,EAAS,WAAA,EAAa,UAAU,YAAA,EAAa;AAAA,UACxD,QAAA,EAAU,CAAC,aAAA,EAAe,CAAC,EAAE,IAAA,EAAMS,MAAAA,EAAQ,KAAA,EAAO,0BAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,CAAC;AAAA;AAAA;AAC/F;AAAA,GAEJ;AAEJ;ACzJO,IAAM,kBAAA,GAAqBR,cAAqC,IAAI,CAAA;AAEpE,SAAS,cAAA,GAAwC;AACtD,EAAA,OAAOE,WAAW,kBAAkB,CAAA;AACtC;;;AC7BA,SAASO,iBAAAA,CACP,IAAA,EACA,YAAA,EACA,UAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAW,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,SAAS,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,SAAS,CAAC,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,OAAA,CAAQ,KAAK,CAAA;AAClC,EAAA,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,SAAS,MAAA,EAAO;AAC9C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAC7B;AAQO,SAAS,mBAAA,CACd,IAAA,EACA,YAAA,EACA,UAAA,EACA,WACA,IAAA,EACe;AACf,EAAA,OAAOA,iBAAAA,CAAiB,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,CAAC,KAAA,KAAU;AACjE,IAAA,MAAM,UAAU,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,IAAA,MAAM,IAAA,GAAmB,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAC5C,IAAA,IAAI,CAAC,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA,CAAK,QAAA;AACZ,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,EAAU,MAAK,IAAK,oBAAA,CAAqB,OAAO,SAAS,CAAA;AAC9E,MAAA,IAAI,IAAA,KAAA,UAAA,iBAAqC;AACvC,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC7B,CAAC,CAAA;AACH;AAKO,SAAS,kBAAA,CACd,MACA,gBAAA,EACY;AACZ,EAAA,IAAI,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACnC,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU,gBAAA,EAAkB,IAAA,EAAK,IAAK,EAAA;AAAA,MACtC,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAG;AAC7B;AAKO,SAAS,oBAAA,CAAqB,OAAc,WAAA,EAA6B;AAC9E,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,KAAA,IAAS,IAAI,WAAA,GAAc,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,IAAI,IAAA,IAAQ,0BAA0B,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,QAAA,EAAU,MAAK,EAAG;AACzE,MAAA,OAAO,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AClEO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAYG;AACD,EAAA,MAAM,SAAA,GAAYP,UAAAA,CAAW,gBAAgB,CAAA,CAAE,IAAA,EAAK;AACpD,EAAA,MAAM,aAAA,GACJ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,EAAG,KAAA,KACvC,KAAA,GAAQ,KAAA,GAAQ,eAAe,gBAAA,IAAoB,QAAA,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAC,SAAA,IAAa,aAAA,CAAc,mBAAkB,CAAE,QAAA,CAAS,SAAA,CAAU,iBAAA,EAAmB,CAAA;AAC3G,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,KAAA;AAAA,MACA,WAAW,EAAA,CAAG,cAAA,EAAgB,QAAQ,YAAA,EAAc,WAAA,IAAe,iBAAiB,SAAS,CAAA;AAAA,MAE5F,QAAA,EAAA;AAAA,QAAA,CAAC,SAAS,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,mBAC/CJ,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAe,QAAA,EAAA,WAAA,IAAe,gBAAA,IAAoB,UAAI,CAAA,GAC5D,IAAA;AAAA,QACH,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA,CAAC,QAAA,EAAA,EAAqB,KAAA,EAAO,CAAA,CAAE,KAAA,EAC5B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADQ,CAAA,CAAE,KAEf,CACD;AAAA;AAAA;AAAA,GACH;AAEJ;ACzBA,SAAS,aAAaF,OAAAA,EAA+C;AACnE,EAAA,OAAA,CAAQA,OAAAA,IAAU,EAAC,EAChB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,MAAK,EAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAE,CAAE,EAChF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAC1B;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,EAAAA,OAAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA,MAAM,IAAA,GAAO,aAAaA,OAAM,CAAA;AAChC,EAAA,MAAM,OAAA,GAAA,CAAW,cAAA,IAAkB,EAAA,EAAI,IAAA,EAAK;AAC5C,EAAA,uBACEM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,YAAA,EAAc,MAAA,IAAU,WAAW,CAAA,EAAG,KAAA,EAAO,MAAA,GAAS,CAAA,EAAG,IAAI,wBAAS,MAAA,EACvF,QAAA,EAAA;AAAA,IAAA,UAAA,mBACCJ,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,uCAAA,EAAwC,KAAA,EAAO,CAAA,aAAA,EAAM,IAAI,CAAA,CAAA,EAAI,OAAA,EAAS,YACpG,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,IAAA,EAAM,CAAA,EAC/B,CAAA,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,MAAM,CAAA,EAAE,CAAA;AAAA,oBAEnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAiB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oBAClCA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS,IAAA;AAAA,QACT,WAAA,EAAY,cAAA;AAAA,QACZ,QAAA;AAAA,QACA,SAAA,EAAU,kBAAA;AAAA,QACV,QAAA,EAAU,CAAC,CAAA,KAAM,aAAA,CAAc,KAAK,IAAI;AAAA;AAAA,KAC1C;AAAA,IACC,CAAC,2BACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,gBAAA;AAAA,QACV,KAAA,EAAO,kCAAS,IAAI,CAAA,CAAA;AAAA,QACpB,YAAA,EAAY,kCAAS,IAAI,CAAA,CAAA;AAAA,QACzB,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,EAAS;AAAA,QACX,CAAA;AAAA,QAEA,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK;AAAA;AAAA,KACnD,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,IAAI,UAAU,OAAO,IAAA;AACrB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,QAAA,CAAS,CAAA,CAAE,KAAK,CAAC,CAAA;AACtE,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,CAAC,EAAE,MAAA,EAAO,qBACjBA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,OAAM,0BAAA,EAAO,OAAA,EAAS,MAAA,EACrE,QAAA,kBAAAA,GAAAA,CAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,WAAA,EAAa,GAAA,EAAK,CAAA,EACpD,CAAA;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRX,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA,SAAA,CAAU,MAAA,KAAW,oBACpBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,SAAA,EAAU,IAEhD,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,qBACbA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,oBAAA;AAAA,UACV,SAAS,MAAM;AACb,YAAA,KAAA,EAAM;AACN,YAAA,KAAA,CAAM,EAAE,KAAK,CAAA;AAAA,UACf,CAAA;AAAA,UAEC,QAAA,EAAA,CAAA,CAAE;AAAA,SAAA;AAAA,QARE,CAAA,CAAE;AAAA,OAUV,CAAA,EAEL;AAAA;AAAA,GAEJ;AAEJ;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,IAAU,EAAC;AACvC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,IAAS,EAAC;AACrC,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACxF,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAErF,EAAA,MAAM,YAAA,GAA+B,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAC9D,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,EAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAE,CAAE,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AACxB,EAAA,MAAM,WAAA,GAA8B,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAC5D,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK,EAAG,KAAA,EAAO,kBAAA,CAAmB,CAAC,CAAA,EAAE,CAAE,CAAA,CAC9E,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAExB,EAAA,MAAM,YAAY,CAAC,KAAA,EAA2B,OAAA,KAC5C,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,YAAY,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AAE/F,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,sBACtCI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,CAAY,MAAA,KAAW,oBAAIJ,GAAAA,CAAC,UAAK,SAAA,EAAU,iBAAA,EAAkB,oBAAC,CAAA,GAAU,IAAA;AAAA,QACxE,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,KAAQ;AAC7B,UAAA,MAAM,EAAA,GAAA,CAAM,GAAA,CAAI,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACrC,UAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC7B,UAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,mBAAA,CAAoB,KAAK,CAAA,GAAI,EAAA;AAClD,UAAA,uBACEA,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cAEC,IAAA;AAAA,cACA,QAAQ,CAAC,KAAA;AAAA,cACT,QAAQ,KAAA,EAAO,MAAA;AAAA,cACf,gBAAgB,GAAA,CAAI,QAAA;AAAA,cACpB,QAAA;AAAA,cACA,UAAA,EAAY,eAAA,GAAkB,MAAM,eAAA,CAAgB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,MAAA,EAAQ,WAAA,EAAa,CAAA,GAAI,MAAA;AAAA,cAC3G,aAAA,EAAe,CAAC,IAAA,KACd,UAAA;AAAA,gBAAW,CAAC,GAAA,KACV,qBAAA,CAAsB,KAAK,YAAA,EAAc,UAAA,EAAY,IAAI,IAAI;AAAA,eAC/D;AAAA,cAEF,UAAU,MAAM;AACd,gBAAA,IAAI,oBAAA,EAAsB;AACxB,kBAAA,oBAAA,CAAqB;AAAA,oBACnB,IAAA,EAAM,OAAA;AAAA,oBACN,EAAA;AAAA,oBACA,IAAA;AAAA,oBACA,aAAa,KAAA,EAAO,WAAA;AAAA,oBACpB,YAAA;AAAA,oBACA;AAAA,mBACD,CAAA;AACD,kBAAA;AAAA,gBACF;AACA,gBAAA,SAAA,CAAU,UAAU,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAC,CAAA;AAAA,cAC7D;AAAA,aAAA;AAAA,YAzBK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,WA0BnB;AAAA,QAEJ,CAAC,CAAA;AAAA,wBACDA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,YAAA;AAAA,YACT,WAAA,EAAa,eAAA;AAAA,YACb,QAAA;AAAA,YACA,SAAA,EAAU,kDAAA;AAAA,YACV,KAAA,EAAO,CAAC,EAAA,KACN,eAAA,CAAgB,SAAS,EAAE,CAAA,GAAI,MAAA,GAAY,SAAA,CAAU,QAAA,EAAU,CAAC,GAAG,eAAA,EAAiB,EAAE,CAAC;AAAA;AAAA;AAE3F,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,sBACtCI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,UAAA,CAAW,MAAA,KAAW,oBAAIJ,GAAAA,CAAC,UAAK,SAAA,EAAU,iBAAA,EAAkB,oBAAC,CAAA,GAAU,IAAA;AAAA,QACvE,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,KAAQ;AAC5B,UAAA,MAAM,EAAA,GAAA,CAAM,GAAA,CAAI,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACpC,UAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC3B,UAAA,MAAM,IAAA,GAAO,IAAA,GAAO,kBAAA,CAAmB,IAAI,CAAA,GAAI,EAAA;AAC/C,UAAA,uBACEA,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cAEC,IAAA;AAAA,cACA,QAAQ,CAAC,IAAA;AAAA,cACT,QAAQ,IAAA,EAAM,MAAA;AAAA,cACd,gBAAgB,GAAA,CAAI,QAAA;AAAA,cACpB,QAAA;AAAA,cACA,UAAA,EAAY,eAAA,GAAkB,MAAM,eAAA,CAAgB,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAQ,WAAA,EAAa,CAAA,GAAI,MAAA;AAAA,cACzG,aAAA,EAAe,CAAC,IAAA,KACd,UAAA;AAAA,gBAAW,CAAC,GAAA,KACV,oBAAA,CAAqB,KAAK,YAAA,EAAc,UAAA,EAAY,IAAI,IAAI;AAAA,eAC9D;AAAA,cAEF,UAAU,MAAM;AACd,gBAAA,IAAI,oBAAA,EAAsB;AACxB,kBAAA,oBAAA,CAAqB;AAAA,oBACnB,IAAA,EAAM,MAAA;AAAA,oBACN,EAAA;AAAA,oBACA,IAAA;AAAA,oBACA,aAAa,IAAA,EAAM,WAAA;AAAA,oBACnB,YAAA;AAAA,oBACA;AAAA,mBACD,CAAA;AACD,kBAAA;AAAA,gBACF;AACA,gBAAA,SAAA,CAAU,SAAS,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAC,CAAA;AAAA,cAC3D;AAAA,aAAA;AAAA,YAzBK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,WA0BnB;AAAA,QAEJ,CAAC,CAAA;AAAA,wBACDA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,WAAA;AAAA,YACT,WAAA,EAAa,cAAA;AAAA,YACb,QAAA;AAAA,YACA,SAAA,EAAU,kDAAA;AAAA,YACV,KAAA,EAAO,CAAC,EAAA,KACN,cAAA,CAAe,SAAS,EAAE,CAAA,GAAI,MAAA,GAAY,SAAA,CAAU,OAAA,EAAS,CAAC,GAAG,cAAA,EAAgB,EAAE,CAAC;AAAA;AAAA;AAExF,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AChQA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,kBAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EACnD;AACA,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,KAAA,EAAO,gCAAA,EAAS,QAAA,EAAU,OAAA,EAAS,CAAA;AACnF,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAMS,MAAAA,EAAQ,KAAA,EAAO,4BAAQ,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,CAAA;AAC5E,EAAA,uBACET,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,oBAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,uBAChBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,oBAAA,EAAsB,QAAQ,SAAS,CAAA;AAAA,UACvE,KAAA,EAAM,oBAAA;AAAA,UACN,YAAA,EAAW,oBAAA;AAAA,UACX,OAAA,EAAS,MAAA;AAAA,UAER,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBAAMA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,QAAA,EAAU,CAAC,KAAK,CAAA,EAAG;AAAA;AAAA,GACjE;AAEJ;AAEA,IAAM,aAAA,GAAgC;AAAA,EACpC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO;AAAA,EACnC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,MAAA;AAC9B,CAAA;AACA,IAAM,YAAA,GAA+B;AAAA,EACnC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAC1B,CAAA;AAEA,IAAM,mBAAA,GAAsC;AAAA,EAC1C,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,QAAA,EAAI;AAAA,EAChC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,QAAA;AAC9B,CAAA;AACA,IAAM,kBAAA,GAAqC;AAAA,EACzC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,QAAA,EAAI;AAAA,EAC3B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAI;AAAA,EAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAI;AAAA,EAC5B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAA;AAC1B,CAAA;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,MAAA,GAAS,UAAA;AAAA,EACT,UAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAaG;AACD,EAAA,MAAM,iBAAA,GAAoB,0BAA0B,KAAK,CAAA;AACzD,EAAA,MAAM,QAAA,GAAW,iBAAA,GAAoB,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA,GAAI,MAAA;AAC1E,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAC,iBAAA,IAAqB,CAAC,QAAA;AAClD,EAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,KAAK,CAAA,CAAE,SAAA,CAAU,IAAA;AAAA,IACvD,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,MAAK,KAAM;AAAA,GAC1C,EAAG,QAAA;AAEH,EAAA,MAAM,eAAA,GAAkB,OAAA;AAAA,IACtB,MACE,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAC5B,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,KAAA,EAAA,CAAQ,GAAA,CAAI,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK,EAAG,KAAA,EAAO,sBAAA,CAAuB,GAAG,CAAA,EAAE,CAAE,CAAA,CAC5F,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAAA,IAC1B,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,oBAAA,GAAuB,OAAA;AAAA,IAC3B,MAAA,CACG,QAAA,EAAU,MAAA,IAAU,EAAC,EACnB,IAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAA,CAAQ,CAAA,CAAE,QAAA,IAAY,IAAI,IAAA,EAAK,EAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAE,CAAE,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAAA,IAC1B,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,CAAA,EAAG,cAAA,CAAe,KAAA,EAAO,UAAU,CAAC,CAAA,CAAA,CAAA;AAAA,UAC3C,gBAAA,EAAiB,iBAAA;AAAA,UACjB,UAAU,UAAA,GAAa,CAAA;AAAA,UACvB,QAAA;AAAA,UACA,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,QAAQ,kBAAA,CAAmB,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC,CAAA;AAAA,UACpF,QAAA,EAAU,MAAM,UAAA,CAAW,CAAC,QAAQ,WAAA,CAAY,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC;AAAA;AAAA,OAChF;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,iBAAA;AAAA,UACP,OAAA,EAAS,eAAA;AAAA,UACT,QAAA;AAAA,UACA,WAAA,EAAY,cAAA;AAAA,UACZ,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,iBAAA,IAAqB,WAAW,CAAA;AAAA,UACjE,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,UAAA,EAAY,CAAC,CAAC;AAAA;AAAA,OACrG;AAAA,sBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,IAAA,IAAQ,KAAA;AAAA,YAClC,OAAA,EAAS,kBAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,MAAA,EAAQ,CAAC,CAAC;AAAA;AAAA,SACjG;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACrCA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,KAAA,IAAS,UAAA;AAAA,YACnC,OAAA,EAAS,mBAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA;AAClG,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,UAC/C,gBAAA,EAAkB,EAAA,CAAG,iBAAA,EAAmB,OAAA,IAAW,YAAY,CAAA;AAAA,UAC/D,UAAU,UAAA,GAAa,CAAA;AAAA,UACvB,QAAA;AAAA,UACA,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,QAAQ,kBAAA,CAAmB,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC,CAAA;AAAA,UACpF,QAAA,EAAU,MAAM,UAAA,CAAW,CAAC,QAAQ,WAAA,CAAY,GAAA,EAAK,YAAA,EAAc,UAAU,CAAC;AAAA;AAAA,OAChF;AAAA,sBACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,KAAA,IAAS,UAAA;AAAA,YACnC,OAAA,EAAS,aAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KACT,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA,SAEnF;AAAA,wBACAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,iBAAA;AAAA,YACP,OAAA,EAAS,eAAA;AAAA,YACT,QAAA;AAAA,YACA,WAAA,EAAY,0BAAA;AAAA,YACZ,KAAA,EAAO,iBAAA,GAAoB,CAAA,aAAA,EAAM,iBAAiB,CAAA,mBAAA,CAAA,GAAS,MAAA;AAAA,YAC3D,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,iBAAA,IAAqB,WAAW,CAAA;AAAA,YAChE,QAAA,EAAU,CAAC,CAAA,KACT,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,UAAA,EAAY,CAAC,CAAC;AAAA;AAAA,SAEtF;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAkB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACnCA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAI,IAAA;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,IAAA,IAAQ,KAAA;AAAA,YAClC,OAAA,EAAS,YAAA;AAAA,YACT,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KACT,UAAA,CAAW,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,MAAA,EAAQ,CAAC,CAAC;AAAA;AAAA,SAElF;AAAA,QACC,oBAAA,CAAqB,MAAA,GAAS,CAAA,mBAC7BA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAA,CAAQ,eAAA,IAAmB,EAAA,EAAI,IAAA,EAAK;AAAA,YACpC,OAAA,EAAS,oBAAA;AAAA,YACT,WAAA,EAAY,oBAAA;AAAA,YACZ,QAAA;AAAA,YACA,SAAA,EAAU,kBAAA;AAAA,YACV,QAAA,EAAU,CAAC,CAAA,KACT,UAAA;AAAA,cAAW,CAAC,QACV,wBAAA,CAAyB,GAAA,EAAK,cAAc,UAAA,EAAY,iBAAA,EAAmB,KAAK,IAAI;AAAA;AACtF;AAAA,SAEJ,GACE;AAAA,OAAA,EACN;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;ACnQA,IAAM,YAAA,GAAe,CAAA;AAErB,SAAS,YAAY,EAAA,EAAoB;AACvC,EAAA,IAAI,CAAA,GAAI,IAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,CAAA,GAAK,CAAA,GAAI,EAAA,GAAM,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACvB;AAEO,SAAS,cAAA,CACd,OAAA,EACA,IAAA,GAA6B,UAAA,EACrB;AACR,EAAA,MAAM,EAAA,GAAK,SAAS,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAO,IAAA,KAAS,UAAU,wBAAA,GAA2B,2BAAA;AAAA,EACvD;AACA,EAAA,MAAM,GAAA,GAAO,WAAA,CAAY,EAAE,CAAA,GAAI,YAAA,GAAgB,CAAA;AAC/C,EAAA,OAAO,yBAAyB,GAAG,CAAA,CAAA,CAAA;AACrC;ACUA,SAAS,uBAAA,CACP,IAAA,EACA,QAAA,EACA,WAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,UAAU,IAAA,CAAK,aAAA,IAAiB,EAAC,EACpC,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK,IAAK,OAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,IAAK,EAAA;AACvC,IAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,IAAA,MAAMF,UACJ,IAAA,KAAS,UAAA,GACL,YAAY,GAAA,CAAI,EAAE,GAAG,MAAA,GACrB,IAAA,KAAS,MAAA,GACP,OAAA,CAAQ,IAAI,EAAE,CAAA,EAAG,SACjB,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,MAAA;AAC1B,IAAA,MAAM,IAAA,GACJ,IAAA,KAAS,UAAA,GACL,sBAAA,CAAuB,WAAA,CAAY,IAAI,EAAE,CAAC,CAAA,IAAK,EAAA,GAC/C,IAAA,KAAS,MAAA,GACP,mBAAmB,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK,EAAA,GACvC,oBAAoB,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK,EAAA;AACjD,IAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,SAAA,CAAUA,OAAAA,EAAQ,MAAA,CAAO,aAAa,CAAC,CAAA,IAAK,MAAA,CAAO,aAAA,EAAe,IAAA,EAAK,IAAK,cAAA;AAC7G,IAAA,MAAM,EAAA,GAAK,mBAAA,CAAoB,SAAA,CAAUA,OAAAA,EAAQ,MAAA,CAAO,WAAW,CAAC,CAAA,IAAK,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK,IAAK,cAAA;AACvG,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,MAAA,EAAI,IAAI,WAAM,EAAE,CAAA,CAAA;AAAA,EAChC,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,IAAI,IAAA,CAAK,iBAAA,EAAmB,OAAA,IAAW,IAAA,CAAK,mBAAmB,QAAA,EAAU;AACvE,IAAA,MAAA,CAAO,KAAK,4CAAS,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAAyB;AACrD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,uBACEE,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBAClBA,IAAC,MAAA,EAAA,EAA2B,SAAA,EAAU,qBACnC,QAAA,EAAA,KAAA,EAAA,EADQ,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAExB,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAI;AAAA,EACrB,WAAA,uBAAkB,GAAA,EAAI;AAAA,EACtB,OAAA,uBAAc,GAAA,EAAI;AAAA,EAClB,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAqBG;AACD,EAAA,MAAM,OAAQ,IAAA,CAAK,IAAA,IAAA,UAAA;AACnB,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,EAAA;AAChC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AACzC,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,aAAa,OAAO,CAAA;AAIhF,EAAA,MAAM,YAAA,GACJ,IAAA,KAAA,UAAA,oBACC,IAAA,CAAK,QAAA,KAAa,SAAA,IAAA,CAAc,IAAA,CAAK,KAAA,EAAO,MAAA,IAAU,CAAA,IAAK,CAAA,IAAA,CAAM,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA,IAAK,CAAA,CAAA;AAGlG,EAAA,MAAM,eAAA,GACJ,YACC,MAAM;AACL,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,EAAK,IAAK,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,IAAK,EAAA;AACnF,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,GAAA,EAAK,WAAA,EAAa,IAAA,EAAK;AAEpC,IAAA,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,MAAA,KAAW,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK,EAAG,OAAO,GAAA,CAAI,SAAA,CAAU,IAAA,EAAK;AAC/F,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAClF,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,GAAG;AAEL,EAAA,MAAM,gBAAgB,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA,IAAK,OAAA,CAAQ,IAAI,eAAe,CAAA;AAElF,EAAA,MAAM,yBACJA,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAa,IAAA;AAAA,MACb,QAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AAAA,GACF;AAIF,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAChB,YAAA,mBACEI,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iCAAA;AAAA,MACV,KAAA,EAAO,gBAAgB,EAAE,KAAA,EAAO,eAAe,eAAA,EAAiB,IAAI,GAAE,GAAI,MAAA;AAAA,MAE1E,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,mBAAgB,IAAA,EAAM,uBAAA,CAAwB,MAAM,QAAA,EAAU,UAAU,KAAK,gCAAA,EAAS,CAAA;AAAA,QACtF,wBAAA,CAAyB,KAAK,QAAQ,CAAA,mBACrCI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UAAE,wBAAA,CAAyB,KAAK,QAAQ,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA,GAC9E;AAAA;AAAA;AAAA,sBAGNJ,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,eAAA;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,QAAA;AAAA,MACA,WAAA,EAAY,0BAAA;AAAA,MACZ,KAAA,EAAM,0BAAA;AAAA,MACN,WAAW,EAAA,CAAG,6BAAA,EAA+B,eAAA,IAAmB,CAAC,iBAAiB,WAAW,CAAA;AAAA,MAC7F,KAAA,EAAO,gBAAgB,EAAE,KAAA,EAAO,eAAe,eAAA,EAAiB,IAAI,GAAE,GAAI,MAAA;AAAA,MAC1E,QAAA,EAAU;AAAA;AAAA,GACZ;AAIJ,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,IAAIY,KAAAA;AACJ,IAAA,IAAI,IAAA,KAAA,UAAA,iBAAqC;AACvC,MAAAA,KAAAA,mBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,UAAU,CAAA;AAAA,wBACpBJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,IAAA,CAAK,WAAW,EAAA,EAAI,QAAA,EAAoB,aAAY,oBAAA,EAAM,MAAA,EAAQ,eAAe,CAAA,EACxG,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAS,IAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,QAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA;AAAA,YACA,WAAA,EAAY,gCAAA;AAAA,YACZ,SAAA,EAAU,gBAAA;AAAA,YACV;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,IAEJ,WAAW,IAAA,KAAA,eAAA,qBAAyC;AAClD,MAAAY,KAAAA,mBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,OAAO,CAAA;AAAA,wBACjBJ,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAS,IAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,QAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA;AAAA,YACA,WAAA,EAAY,4CAAA;AAAA,YACZ,SAAA,EAAU,iBAAA;AAAA,YACV;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,IAEJ,CAAA,MAAO;AACL,MAAAY,wBACEZ,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO,OAAA;AAAA,UACP,QAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA,EAAa,uCAAuC,gCAAA,GAAU,gCAAA;AAAA,UAC9D,SAAA,EAAW,EAAA,CAAG,kBAAA,EAAoB,IAAA,KAAA,WAAA,oBAAwC,cAAc,CAAA;AAAA,UACxF;AAAA;AAAA,OACF;AAAA,IAEJ;AACA,IAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,MACAQ,KAAAA;AAAA,sBACDZ,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,WAAA,EAAa;AAAA,KAAA,EACpC,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,KAAA,QAAA,eAAmC;AACrC,IAAA,IAAA,mBACEI,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EACX,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC3CA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAS,IAAA,EAAC,KAAA,EAAO,OAAA,EAAS,QAAA,EAAoB,QAAA,EAAoB,SAAA,EAAsB,WAAA,EAAY,gCAAA,EAAQ,MAAA,EAAgB;AAAA,KAAA,EAC5I,CAAA;AAAA,EAEJ,WAAW,IAAA,KAAA,WAAA,kBAAsC;AAC/C,IAAA,IAAA,mBACEA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uBAAA,EACX,QAAA,kBAAAA,IAAC,YAAA,EAAA,EAAa,SAAA,EAAS,IAAA,EAAC,KAAA,EAAO,SAAS,QAAA,EAAoB,QAAA,EAAoB,WAAsB,WAAA,EAAY,gCAAA,EAAQ,QAAgB,CAAA,EAC5I,CAAA;AAAA,EAEJ,CAAA,MAAO;AACL,IAAA,MAAM,OAAA,GAAU,IAAA,KAAA,eAAA;AAChB,IAAA,MAAM,IAAA,GAAO,UAAU,OAAA,GAAU,UAAA;AACjC,IAAA,MAAM,MAAM,OAAA,GAAW,OAAA,GAAU,CAAA,MAAA,EAAM,OAAO,KAAK,IAAA,GAAQ,OAAA;AAC3D,IAAA,IAAA,mBACEI,KAAC,GAAA,EAAA,EAAE,SAAA,EAAW,GAAG,qBAAA,EAAuB,OAAA,IAAW,UAAU,CAAA,EAC1D,QAAA,EAAA;AAAA,MAAA,YAAA,mBACCJ,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,qBAAA,EAAsB,KAAA,EAAO,aAAA,GAAgB,EAAE,KAAA,EAAO,cAAA,CAAe,eAAA,EAAiB,IAAI,CAAA,KAAM,MAAA,EAChH,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA,EAAG,CAAA,EAC9E,CAAA,mBAEAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,eAAA;AAAA,UACP,OAAA,EAAS,YAAA;AAAA,UACT,QAAA;AAAA,UACA,WAAA,EAAY,0BAAA;AAAA,UACZ,WAAW,EAAA,CAAG,iDAAA,EAAmD,eAAA,IAAmB,CAAC,iBAAiB,WAAW,CAAA;AAAA,UACjH,KAAA,EAAO,gBAAgB,EAAE,KAAA,EAAO,eAAe,eAAA,EAAiB,IAAI,GAAE,GAAI,MAAA;AAAA,UAC1E,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAED,CAAC,YAAA,mBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iBAAA,EAAkB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBAEhCJ,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,IAAA,CAAK,OAAA,IAAW,EAAA,EAAI,QAAA,EAAoB,WAAA,EAAa,OAAA,GAAU,IAAA,GAAO,cAAA,EAAM,QAAQ,aAAA,EAAe,CAAA;AAAA,QAAE;AAAA,OAAA,EAE5H,IACE,GAAA,mBACFI,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iBAAA,EAAkB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAE,GAAA;AAAA,QAAI;AAAA,OAAA,EAAC,CAAA,GACvC,IAAA;AAAA,sBACJJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBACrCA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAS,IAAA,EAAC,KAAA,EAAO,OAAA,EAAS,QAAA,EAAoB,QAAA,EAAoB,SAAA,EAAsB,WAAA,EAAY,gCAAA,EAAQ,MAAA,EAAgB;AAAA,KAAA,EAC5I,CAAA;AAAA,EAEJ;AACA,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACA,IAAA;AAAA,oBACDJ,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,WAAA,EAAa;AAAA,GAAA,EACpC,CAAA;AAEJ;AAEO,IAAM,YAAA,GAAe,KAAK,gBAAgB,CAAA;AC1QjD,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,QAAA,EAAS,EAAmD;AAClG,EAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACd,QAAA,EAAA;AAAA,oBAAAJ,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,2BAA0B,KAAA,EAAM,0BAAA,EAAO,OAAA,EAAS,QAAA,EAC9E,0BAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EAC/C,CAAA;AAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,2BAA0B,KAAA,EAAM,0BAAA,EAAO,SAAS,QAAA,EAC9E,QAAA,kBAAAA,IAACa,KAAAA,EAAA,EAAM,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EACnD;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,YAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAkBG;AACD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIX,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,SAAQ,GAAI,IAAA;AACvD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAIlC,EAAA,MAAM,YAAA,GAAeY,QAAwB,MAAM;AACjD,IAAA,MAAM,MAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AACjC,MAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AAClC,MAAA,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,mBAAA,CAAoB,CAAC,CAAA,EAAG,CAAA;AAAA,IAC7D;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAChC,MAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACjC,MAAA,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAC,CAAA,wBAAA,CAAA,EAAQ,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,OAAe,IAAA,KAA4B;AAC1C,MAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,KAAA,EAAO,KAAK,CAAA;AACnD,MAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,KAAA,EAAO,kBAAA,CAAmB,IAAA,EAAM,SAAS,CAAC,CAAC,CAAA;AAC1G,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,YAAA,EAAc,UAAA,EAAY,KAAK;AAAA,GAC1C;AAEA,EAAA,MAAM,eAAe,WAAA,CAAY,MAAM,eAAe,IAAI,CAAA,EAAG,EAAE,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,EAAiB,QAAA,KACnC,SAAS,OAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA,EAAG,IAAA,IAAA,UAAA,gBAAwD;AAGhG,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,MAAM,SAAA,GACJ,GAAA,EAAK,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,YAAA,IAAgB,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,UAAA,GAAa,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA;AACnG,EAAA,MAAM,QAAA,GACJ,GAAA,EAAK,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,YAAA,IAAgB,GAAA,CAAI,MAAA,CAAO,EAAA,KAAO,UAAA,GAAa,GAAA,CAAI,OAAO,IAAA,GAAO,IAAA;AAEpG,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAAoB,GAAA,KAAgB;AACvD,IAAA,GAAA,EAAK,MAAM,EAAE,EAAA,EAAI,cAAc,EAAA,EAAI,UAAA,EAAY,KAAK,CAAA;AACpD,IAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAC/B,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,aAAA,CAA8B,OAAA,CAAQ,oBAAoB,CAAA;AAC1E,IAAA,IAAI,MAAM,CAAA,CAAE,YAAA,CAAa,YAAA,CAAa,IAAA,EAAM,IAAI,EAAE,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAoB,GAAA,KAAgB;AAC1D,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAC5B,IAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,aAAA,CAA8B,qBAAA,EAAsB;AACpE,IAAA,MAAM,QAAQ,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AACnD,IAAA,GAAA,CAAI,KAAA,CAAM,EAAE,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,KAAA,GAAQ,GAAA,GAAM,CAAA,GAAI,GAAA,EAAK,CAAA;AAAA,EAC7E,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAuB;AACzC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,GAAA,EAAK,IAAA,EAAK;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,OAAO,MAAM;AAAA,EAAC,CAAA;AAGpB,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,qBACpBd,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa,IAAA;AAAA,MACb,aAAA,EAAe,IAAA;AAAA,MACf,YAAA,EAAc,IAAA;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU;AAAA;AAAA,GACZ;AAEF,EAAA,MAAM,eAAe,CAAC,SAAA,KACpB,UAAA,EAAY,aAAA,CAAc,IAAI,SAAS,CAAA,EAAG,GAAA,CAAI,CAAC,GAAG,EAAA,qBAChDI,IAAAA,CAAC,KAAA,EAAA,EAAqC,WAAU,kDAAA,EAC9C,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA;AAAA,IACnG,CAAA,CAAE,IAAA,GAAO,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,mBAAIA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,4CAAA,EAAO;AAAA,GAAA,EAAA,EAFjE,SAAS,SAAS,CAAA,CAAA,EAAI,EAAE,CAAA,CAGlC,CACD,CAAA,IAAK,IAAA;AAER,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA,EAAY,MAAA;AAAA,QACZ,oBAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,oBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC1B,QAAA,MAAM,IAAA,GAAO,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACxC,QAAA,uBACAA,IAAAA,CAACL,QAAAA,EAAA,EACA,QAAA,EAAA;AAAA,UAAA,YAAA,CAAa,GAAG,CAAA;AAAA,0BACjBK,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,mBAAA;AAAA,gBACA,cAAc,GAAA,IAAO,aAAA;AAAA,gBACrB,aAAa,GAAA,IAAO,aAAA;AAAA,gBACpB,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,eAAA,GAAkB,kBAAA;AAAA,eACrD;AAAA,cACA,UAAA,EAAY,CAAC,CAAA,KAAM,cAAA,CAAe,GAAG,GAAG,CAAA;AAAA,cACxC,MAAA,EAAQ,UAAA;AAAA,cAEP,QAAA,EAAA;AAAA,gBAAA,IAAA,mBACCJ,GAAAA;AAAA,kBAAC,kBAAA;AAAA,kBAAA;AAAA,oBACC,QAAA,EAAU,MAAM,UAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AAAA,oBACzC,QAAA,EAAU,MAAM,UAAA,CAAY,QAAA,CAAS,IAAI;AAAA;AAAA,iBAC3C,GACE,IAAA;AAAA,gBACH,IAAA,EAAM,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,uBACjCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,YAAA,CAAa,IAAA,CAAK,IAAI,GAAE,CAAA,GACvD,IAAA;AAAA,gCACJA,GAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,IAAA;AAAA,oBACA,QAAA;AAAA,oBACA,UAAA;AAAA,oBACA,WAAA;AAAA,oBACA,OAAA;AAAA,oBACA,YAAA;AAAA,oBACA,MAAA;AAAA,oBACA,QAAA;AAAA,oBACA,UAAU,WAAA,KAAgB,GAAA;AAAA,oBAC1B,SAAA,EAAW,WAAA,KAAgB,GAAA,GAAM,YAAA,GAAe,MAAA;AAAA,oBAChD,UAAU,GAAA,GAAM,CAAA;AAAA,oBAChB,iBACE,QAAA,GACI,MAAA,GACA,EAAE,SAAA,EAAW,MAAM,WAAA,EAAa,CAAC,CAAA,KAAM,WAAA,CAAY,GAAG,GAAG,CAAA,EAAG,WAAW,MAAM,GAAA,EAAK,KAAI,EAAE;AAAA,oBAE9F,MAAA,EAAQ,CAAC,OAAA,KAAY;AACnB,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,QAAQ,sBAAA,CAAuB,GAAA,EAAK,cAAc,UAAA,EAAY,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,oBACrF,CAAA;AAAA,oBACA,WAAA,EAAa,CAAC,OAAA,KACZ,MAAA,CAAO,CAAC,GAAA,KAAQ,oBAAA,CAAqB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,oBAEnF,aAAA,EAAe,CAAC,OAAA,KACd,MAAA,CAAO,CAAC,GAAA,KAAQ,sBAAA,CAAuB,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,oBAErF,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,QAAQ,mBAAA,CAAoB,GAAA,EAAK,cAAc,UAAA,EAAY,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,oBAC/E,CAAA;AAAA,oBACA,aAAA,EAAe,MAAM,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AAAA,oBACxC,aAAA,EAAe,MAAM,UAAA,CAAW,GAAA,GAAM,GAAG,GAAG,CAAA;AAAA,oBAC5C,WAAA,EACE,GAAA,GAAM,CAAA,GACF,MAAM;AACJ,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,UAAA,CAAW,KAAK,YAAA,EAAc,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,oBAChE,CAAA,GACA,MAAA;AAAA,oBAEN,UAAU,MAAM;AACd,sBAAA,YAAA,EAAa;AACb,sBAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,eAAA,CAAgB,KAAK,YAAA,EAAc,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,oBACrE;AAAA;AAAA;AACF;AAAA;AAAA;AACF,SAAA,EAAA,EAnEe,CAAA,KAAA,EAAQ,GAAG,CAAA,CAoE1B,CAAA;AAAA,MAEF,CAAC,CAAA;AAAA,MACA,YAAA,CAAa,QAAQ,MAAM,CAAA;AAAA,MAC3B,QAAA,KAAa,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,mBAAIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,CAAA,GAAK,IAAA;AAAA,MAC7F,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,CAAC,2BACxBI,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,uBAAA;AAAA,UACV,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,EAAA,UAAA,gBAA6B;AAAA,UAErD,QAAA,EAAA;AAAA,4BAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OACjD,GACE,IAAA;AAAA,MACH,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,QAAA,mBAAWX,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,sCAAA,EAAM,CAAA,GAAO;AAAA,KAAA,EACpF;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,IAAM,WAAA,GAAce,KAAK,eAAe,CAAA;;;AC7Q/C,IAAM,YAAY,CAAC,CAAA,EAAW,MAAc,CAAA,GAAA,EAAM,CAAC,OAAO,CAAC,CAAA,CAAA;AAC3D,IAAM,eAAe,CAAC,CAAA,EAAW,OAAe,CAAA,GAAA,EAAM,CAAC,OAAO,EAAE,CAAA,CAAA;AAChE,IAAM,YAAY,CAAC,CAAA,EAAe,OAAe,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,CAAA;AAE3D,SAAS,MAAA,CAAO,KAAgC,QAAA,EAA0B;AACxE,EAAA,MAAM,CAAA,GAAA,CAAK,GAAA,IAAO,EAAA,EAAI,QAAA,GAAW,IAAA,EAAK;AACtC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,QAAA;AAC5B;AAEA,IAAM,cAA0C,EAAE,MAAA,EAAQ,gBAAM,SAAA,EAAW,cAAA,EAAM,OAAO,cAAA,EAAK;AACtF,IAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB,WAAA,CAAY,CAAC,CAAA;AAExD,SAAS,gBAAgB,IAAA,EAAwC;AACtE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAmB;AAC/B,IAAA,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,gBAAA,CAAiB,GAAA,CAAI,UAAU,IAAA,CAAK,UAAA,EAAY,KAAK,QAAQ,CAAA,EAAG,MAAM,MAAM,CAAA;AAC5E,MAAA,aAAA,CAAc,GAAA,CAAI,aAAa,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA,EAAG,MAAM,MAAM,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,YAAA,EAAc,gBAAA,CAAiB,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA;AACtG,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,OAAO,UAAA,EAAY,gBAAA,EAAkB,eAAe,gBAAA,EAAkB,aAAA,EAAe,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,EACxH;AAEA,EAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,WAAA,GAA6B,IAAA;AAEjC,EAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC7C,IAAA,MAAM,SAAA,GAAY,MAAM,EAAE,CAAA,OAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,MAAM,gBAAA,EAAkB,UAAA,EAAY,IAAI,CAAA;AAC/D,IAAA,IAAI,aAAA,KAAkB,MAAM,aAAA,GAAgB,SAAA;AAC5C,IAAA,WAAA,GAAc,SAAA;AACd,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,EAAE,CAAA,MAAA,CAAA;AACzB,MAAA,IAAA,CAAK,EAAE,GAAA,EAAK,QAAA,EAAU,MAAM,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA;AAC7D,MAAA,WAAA,GAAc,QAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,EAAA,KAAO;AAC5B,QAAA,MAAM,UAAU,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,CAAA,MAAA,EAAS,EAAE,CAAA,CAAE,CAAA;AACpD,QAAA,MAAM,MAAM,CAAA,KAAA,EAAQ,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,OAAO,CAAA,CAAA;AACzC,QAAA,IAAA,CAAK;AAAA,UACH,GAAA;AAAA,UACA,IAAA,EAAM,OAAA;AAAA,UACN,UAAA,EAAY,EAAA;AAAA,UACZ,QAAA,EAAU,EAAA;AAAA,UACV,OAAA;AAAA,UACA,SAAS,EAAA,KAAO,CAAA;AAAA,UAChB,KAAA,EAAO,EAAA,KAAO,MAAA,CAAO,MAAA,GAAS;AAAA,SAC/B,CAAA;AACD,QAAA,WAAA,GAAc,GAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAA,CAAK,EAAE,GAAA,EAAK,aAAA,EAAe,IAAA,EAAM,eAAe,CAAA;AAEhD,EAAA,MAAM,KAAA,GAAqD;AAAA,IACzD,EAAE,KAAA,EAAO,QAAA,EAAU,MAAM,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAA,CAAE,QAAA,EAAU,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,IAC5F,EAAE,KAAA,EAAO,WAAA,EAAa,MAAM,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAA,CAAE,WAAA,EAAa,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,IACrG,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAA,CAAE,OAAA,EAAS,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAAE,GAC3F;AACA,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,GAAA,EAAI,IAAK,KAAA,EAAO;AAClC,IAAA,IAAA,CAAK,EAAE,KAAK,CAAA,YAAA,EAAe,KAAK,IAAI,IAAA,EAAM,oBAAA,EAAsB,OAAO,CAAA;AACvE,IAAA,GAAA,CAAI,QAAQ,CAAC,OAAA,KAAY,IAAA,CAAK,EAAE,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,OAAO,IAAI,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,CAAC,CAAA;AAAA,EACzG;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,kBAAkB,aAAA,EAAe,gBAAA,EAAkB,eAAe,WAAA,EAAY;AAC5G;AAGO,SAAS,oBAAA,CAAqB,QAAoB,GAAA,EAAqC;AAC5F,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,UAAA,CAAW,GAAA,CAAI,MAAM,GAAA,CAAI,UAAU,SAAS,CAAA,IAAK,IAAA;AAAA,IACjE,KAAK,OAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,IAAI,UAAA,EAAY,GAAA,CAAI,QAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,IACjF,KAAK,MAAA,EAAQ;AAGX,MAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAW;AAC9B,QAAA,MAAM,KAAA,GAAQ,OAAO,gBAAA,CAAiB,GAAA,CAAI,UAAU,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,QAAQ,CAAC,CAAA;AACjF,QAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAAA,MAClC;AACA,MAAA,MAAM,EAAA,GAAA,CAAM,GAAA,CAAI,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACpC,MAAA,OAAO,EAAA,GAAK,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,YAAA,CAAa,IAAI,UAAA,EAAY,EAAE,CAAC,CAAA,IAAK,IAAA,GAAO,IAAA;AAAA,IACnF;AAAA,IACA,KAAK,OAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,UAAU,GAAA,CAAI,OAAO,CAAC,CAAA,IAAK,IAAA;AAAA,IAC1E,KAAK,UAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,aAAa,GAAA,CAAI,UAAU,CAAC,CAAA,IAAK,IAAA;AAAA,IAChF,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,iBAAiB,GAAA,CAAI,SAAA,CAAU,SAAS,GAAA,CAAI,MAAM,CAAC,CAAA,IAAK,IAAA;AAAA,IACxE;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAOO,SAAS,oBAAA,CAAqB,QAAoB,GAAA,EAAqC;AAC5F,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,gBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,IACxD,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,UAAA,EAAY,KAAK,UAAA,EAAY,QAAA,EAAU,KAAK,QAAA,EAAS;AAAA,IAC/E,KAAK,YAAA;AACH,MAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AAC3E,MAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,IAAA,CAAK,OAAA,EAAQ;AACpF,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,OAAA,EAAQ;AAAA,IAC9C;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;ACzJA,IAAM,QAAA,GAAuE;AAAA,EAC3E,KAAA,EAAO,UAAA;AAAA,EACP,QAAA,EAAU,aAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AACA,IAAM,UAAA,GAA+E;AAAA,EACnF,KAAA,EAAO,YAAA;AAAA,EACP,QAAA,EAAU,eAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AACA,IAAM,UAAA,GAAmE;AAAA,EACvE,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AAIA,SAAS,SAAA,CACP,IAAA,EACA,IAAA,EACA,EAAA,EACA,EAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,EAAC;AAChC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC3B,IAAA,IAAA,CAAK,EAAE,OAAO,CAAA,IAAK,IAAI,IAAA,EAAK,KAAM,IAAI,OAAO,CAAA;AAC7C,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,GAAG,CAAC,CAAA;AAAA,EACb,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,CAAC,OAAO,GAAG,IAAA,EAAK;AACpC;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,IAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,CAAC,UAAA,CAAW,IAAI,CAAC,GAAG,MAAK,CAAE,CAAA;AAC9E;AAEO,SAAS,uBAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,WAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,OAAO,EAAE,GAAG,CAAA,EAAG,WAAA,EAAY,CAAE,CAAA;AACjE;AAEO,SAAS,uBACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,OAAA,EACA,OACA,KAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA,MAAO;AAAA,IACvC,GAAG,CAAA;AAAA,IACH,MAAA,EAAA,CAAS,CAAA,CAAE,MAAA,IAAU,EAAC,EAAG,GAAA;AAAA,MAAI,CAAC,CAAA,KAAA,CAC3B,CAAA,CAAE,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,OAAA,GAAU,EAAE,GAAG,CAAA,EAAG,CAAC,KAAK,GAAG,OAAM,GAAI;AAAA;AACrE,GACF,CAAE,CAAA;AACJ;AAEO,SAAS,cAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,KAAA,EACe;AACf,EAAA,OAAO,UAAU,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,GAAI,CAAA,CAAE,MAAA,IAAU,EAAC,EAAI,KAAK,GAAE,CAAE,CAAA;AAC1F;AAEO,SAAS,iBAAA,CACd,IAAA,EACA,IAAA,EACA,EAAA,EACA,OAAA,EACe;AACf,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA,MAAO;AAAA,IACvC,GAAG,CAAA;AAAA,IACH,MAAA,EAAA,CAAS,CAAA,CAAE,MAAA,IAAU,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO;AAAA,GAC9E,CAAE,CAAA;AACJ;ACpEA,IAAM,QAAA,GAAmC,EAAE,QAAA,EAAU,QAAA,EAAK,UAAU,QAAA,EAAI;AACxE,IAAM,OAAA,GAAkC,EAAE,GAAA,EAAK,QAAA,EAAK,OAAO,QAAA,EAAK,IAAA,EAAM,QAAA,EAAK,IAAA,EAAM,QAAA,EAAI;AAGrF,SAAS,YAAA,CAAa,IAAA,EAAkB,QAAA,EAAgC,UAAA,EAA8C;AACpH,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,EAAU,IAAA,EAAK;AACpC,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,EAAK,IAAK,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,IAAK,EAAA;AACnF,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,GAAA,EAAK,WAAA,EAAa,IAAA,EAAK;AACpC,EAAA,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,MAAA,KAAW,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK,EAAG,OAAO,GAAA,CAAI,SAAA,CAAU,IAAA,EAAK;AAC/F,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,IAAK,SAAS,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAClF,EAAA,OAAO,EAAA;AACT;AAWO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM,QAAA,GAAWD,OAAAA,CAAQ,MAAM,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,IAAA,CAAK,MAAM,CAAC,CAAA;AACtE,EAAA,MAAM,WAAA,GAAcA,OAAAA,CAAQ,MAAM,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA,EAAG,CAAC,IAAA,CAAK,SAAS,CAAC,CAAA;AAClF,EAAA,MAAM,UAAA,GAAaA,OAAAA,CAAQ,MAAM,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAC,IAAA,CAAK,QAAQ,CAAC,CAAA;AAE9E,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,YAAY,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,MAAA,GAAS,MAAA,CAAO,UAAU,CAAA;AACjD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,KAAA,GAAQ,0BAA0B,KAAK,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAA,CAAW,QAAQ,sBAAA,CAAuB,WAAA,CAAY,IAAI,KAAK,CAAC,IAAI,EAAA,KAAO,gCAAA;AACjF,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,WAAA,IAAe,EAAC;AAClC,EAAA,MAAM,OAAO,CAAA,EAAG,QAAA,CAAS,IAAI,KAAA,IAAS,UAAU,KAAK,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA,IAAA,EAAI,QAAQ,GAAA,CAAI,IAAA,IAAQ,KAAK,CAAA,IAAK,GAAA,CAAI,QAAQ,EAAE,CAAA,CAAA;AACpH,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAIlC,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,UAAA,GAAa,IAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,WAAA,GAAc,GAAA;AAChE,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,IAAI,CAAC,CAAA;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,EAAA,GAAK,IAAA;AACrC,EAAA,MAAM,GAAA,GAAM,KAAA,GACR,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,CAAA,EAAG,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,EAAA,EAAG,GAC1E,EAAE,IAAA,EAAM,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,SAAA,EAAW,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,EAAA,EAAG;AAEjF,EAAA,MAAM,uBACJV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,GAAA,EAAI,EAAG,YAAA,EAAc,OAAA,EAAS,cAAc,OAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,QAAA,qBAAA,CAAsB,OAAA,EAAU,OAAO,YAAY,CAAA;AAAA,QAAE,QAAA;AAAA,QAAI,mBAAA,CAAoB,KAAA,EAAO,MAAA,CAAO,UAAU;AAAA,OAAA,EACxG,CAAA;AAAA,sBACAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QAAQ,GAAA;AAAA,wBAACJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EACvD;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACZ,QAAA,EAAA,OAAA,CAAQ,MAAA,KAAW,oBAClBA,GAAAA,CAAC,OAAE,SAAA,EAAU,iBAAA,EAAkB,8DAAQ,CAAA,GAEvC,OAAA,CAAQ,IAAI,CAAC,IAAA,EAAM,sBACjBA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OAAA;AAAA,MALK;AAAA,KAOR,CAAA,EAEL;AAAA,GAAA,EACF,CAAA;AAEF,EAAA,OAAOgB,YAAAA,CAAa,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,SAAS,IAAI,CAAA;AACxD;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,OAAQ,IAAA,CAAK,IAAA,IAAA,UAAA;AACnB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,IAAA,EAAK,IAAK,EAAA;AAExC,EAAA,IAAI,IAAA,KAAA,QAAA,eAAmC;AACrC,IAAA,uBACEZ,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAA,EACX,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,MACjC,OAAA,IAAW;AAAA,KAAA,EACd,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,IAAA,KAAA,WAAA,kBAAsC;AACxC,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gBAAA,EAAkB,qBAAW,QAAA,EAAI,CAAA;AAAA,EACvD;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA,KAAA,eAAA;AAChB,EAAA,MAAM,IAAA,GAAO,UAAU,OAAA,GAAU,UAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA,IAAK,0BAAA;AACvE,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,IAAA,CAAK,QAAQ,CAAA;AACvD,EAAA,MAAM,MAAM,OAAA,GAAW,OAAA,GAAU,CAAA,MAAA,EAAM,OAAO,KAAK,IAAA,GAAQ,OAAA;AAG3D,EAAA,MAAM,IAAA,GAAO,CAAC,CAAC,WAAA,KAAgB,kBAAkB,OAAA,IAAW,aAAA,KAAkB,WAAW,KAAA,KAAU,WAAA;AACnG,EAAA,MAAM,SAAA,GAAY,OAAQ,EAAE,QAAA,EAAU,eAAe,KAAA,EAAO,IAAI,GAAE,GAAsB,MAAA;AAExF,EAAA,uBACEI,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,OAAA,IAAW,UAAA,EAAY,IAAA,IAAQ,SAAS,CAAA,EAAG,KAAA,EAAO,SAAA,EAClF,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA,EAAE,EAC/E,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MACA,QAAA,mBAAWA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAE,QAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA,GAAU;AAAA,KAAA,EACzE,CAAA;AAAA,IACC,GAAA,mBAAMA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,MAAE,GAAA;AAAA,MAAI;AAAA,KAAA,EAAC,CAAA,GAAU,IAAA;AAAA,oBACxDJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAkB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,IAClC,OAAA,IAAW;AAAA,GAAA,EACd,CAAA;AAEJ;AC/JA,IAAM,UAAA,GAAa,gBAAA;AACnB,IAAM,cAAA,GAAiB,CAAA;AAEvB,IAAM,SAAA,GAAY,CAAA;AAIlB,IAAM,GAAA,GAAM,EAAA;AAGZ,IAAM,YAAA,GAAe,EAAA;AAgCd,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA,EAAAF,OAAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAII,SAA+B,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,cAAc,eAAe,CAAA,GAAIA,SAAsB,sBAAM,IAAI,KAAK,CAAA;AAC7E,EAAA,MAAM,CAAC,cAAc,eAAe,CAAA,GAAIA,SAAsB,sBAAM,IAAI,KAAK,CAAA;AAC7E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,SAA2B,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA2B,IAAI,CAAA;AACjE,EAAA,MAAM,OAAA,GAAUK,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAUA,OAAwB,IAAI,CAAA;AAC5C,EAAA,MAAM,MAAA,GAASA,OAAyB,IAAI,CAAA;AAC5C,EAAA,MAAM,gBAAA,GAAmBA,OAAO,KAAK,CAAA;AAGrC,EAAA,MAAM,UAAA,GAAaA,OAA6C,IAAI,CAAA;AACpE,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,WAAA,EAAY;AACZ,IAAA,UAAA,CAAW,UAAU,UAAA,CAAW,MAAM,QAAA,CAAS,IAAI,GAAG,GAAG,CAAA;AAAA,EAC3D,CAAA;AACA,EAAAD,UAAU,MAAM,MAAM,WAAA,EAAY,EAAG,EAAE,CAAA;AAIvC,EAAA,MAAM,OAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AACxE,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AAEpB,EAAA,MAAM,UAAA,GAAaR,OAAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAgBA,OAAAA,CACnB,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,EAAA,EAAA,CAAK,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,EAAG,IAAA,EAAM,mBAAA,CAAoB,CAAC,CAAA,IAAK,gCAAA,EAAS,QAAA,EAAW,CAAA,GAAI,SAAA,GAAa,CAAA,EAAE,CAAE,CAAA,CACzH,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AAErB,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAwB;AAC5C,IAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACnC,IAAA,OAAO,CAAC,GAAA,IAAO,CAAC,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,EACzC,CAAA;AAGA,EAAA,IAAI,IAAA,CAAK,KAAK,YAAY,CAAA,IAAM,CAAC,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA,EAAI;AAC9D,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,oBAAA,GAAQ,cAAA,EAAM,QAAA,EAAU,CAAA,EAAG,CAAA;AAAA,EACnF;AAWA,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA8B;AACpD,EAAA,MAAM,UAA4E,EAAC;AACnF,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,IAAA,CAAK,YAAA,GAAe,KAAK,CAAC,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,YAAA,EAAc,KAAA,CAAM,YAAA,EAAc,aAAA,EAAe,KAAA,CAAM,aAAA,EAAe,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,CAAA;AACvG,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAM,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AACzC,MAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAC5B,MAAA,CAAA,IAAK,CAAA;AAAA,IACP;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,CAAA;AACnB,EAAAQ,UAAU,MAAM;AACd,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AACzE,MAAA,OAAO,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,SAAS,CAAC,CAAA,KAAe,CAAA,CAAE,IAAA,GAAO,EAAE,KAAA,GAAQ,CAAA;AAClD,EAAA,MAAM,SAAS,CAAC,QAAA,KACd,aAAa,CAAA,GAAI,uBAAA,GAA0B,yBAAyB,QAAQ,CAAA,CAAA,CAAA;AAC9E,EAAA,MAAM,YAAY,CAAC,MAAA,KACjB,SAAS,MAAA,CAAO,CAAC,MAAO,MAAA,KAAW,UAAA,GAAa,aAAa,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,IAAA,CAAK,WAAW,EAAA,EAAI,IAAA,OAAW,MAAO,CAAA;AAClH,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AACpD,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAoB,MAAA,KAAW,aAAa,IAAA,GAAO,MAAA;AAC3E,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KACtB,KAAA,CAAM,KAAK,IAAI,CAAA,CACZ,GAAA,CAAI,CAAC,GAAA,KAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAA,CAC/B,MAAA,CAAO,CAAC,IAAA,KAAmC,CAAC,CAAC,IAAI,CAAA,CACjD,IAAI,CAAC,IAAA,MAAU,EAAE,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,UAAA,EAAY,IAAA,CAAK,YAAW,CAAE,CAAA;AACrF,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,EAAiB,OAAA,KAAoB;AACzD,IAAA,MAAM,OAAO,QAAA,CAAS,gBAAA,CAAiB,SAAS,OAAO,CAAA,EAAG,QAAqB,kBAAkB,CAAA;AACjG,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,UAAA;AAC7B,IAAA,OAAO,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAI,MAAA,GAAS,IAAA;AAAA,EAClD,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAAuB;AAC9C,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AACtD,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AACvD,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AACrD,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AACxD,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,OAAA,CAAQ,SAAS,gBAAA,CAA8B,sBAAsB,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AACvF,MAAA,MAAM,CAAA,GAAI,KAAK,qBAAA,EAAsB;AACrC,MAAA,MAAMW,EAAAA,GAAI,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC7B,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,CAAA;AAC7B,MAAA,IAAIA,MAAK,IAAA,IAAQA,EAAAA,IAAK,SAAS,CAAA,IAAK,GAAA,IAAO,KAAK,MAAA,EAAQ;AACtD,QAAA,MAAM,GAAA,GAAM,KAAK,OAAA,CAAQ,WAAA;AACzB,QAAA,IAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,MACvB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB,CAAA;AACA,EAAA,MAAM,WAAW,MAAiC;AAChD,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,CAAQ,SAAS,OAAO,MAAA;AACrC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAsB;AAChD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,GAAI,CAAA,CAAE,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,UAAA;AAAA,MACpE,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,GAAI,CAAA,CAAE,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,SAAA;AAAA,MAClE,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAA,GAAW,IAAI,MAAM,CAAA;AAAA,MACzC,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAA,GAAW,IAAI,MAAM;AAAA,KAC5C;AAAA,EACF,CAAA;AACA,EAAA,MAAM,iBAAA,GAAoB,CAAC,SAAA,KAAsB;AAC/C,IAAA,IAAI,OAAA,CAAQ,SAAS,iBAAA,CAAkB,SAAS,GAAG,OAAA,CAAQ,OAAA,CAAQ,sBAAsB,SAAS,CAAA;AAClG,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,IAAA,eAAA,iBAAgB,IAAI,KAAK,CAAA;AACzB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,MAAA,CAAO,IAAI,CAAA;AACX,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AACA,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,EAAyC,GAAA,KAAgB;AACtF,IAAA,IAAI,QAAA,IAAY,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,WAAA,EAAY;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,GAAI,IAAI,GAAA,CAAI,YAAY,CAAA,mBAAI,IAAI,GAAA,CAAI,CAAC,GAAG,CAAC,CAAA;AAC1E,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,MAChB,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,QAAQ,CAAA,CAAE,OAAA;AAAA,MACV,QAAQ,CAAA,CAAE,OAAA;AAAA,MACV,IAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,OAAA,CAAQ,OAAA,EAAS,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AAAA,EAChD,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAsB;AACvC,IAAA,IAAI,KAAK,IAAA,KAAS,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,IAAI,CAAA,OAAA,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,UAAU,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAC9C,IAAA,OAAO,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,GAAI,UAAA;AAAA,EAC3C,CAAA;AACA,EAAA,MAAM,sBAAA,GAAyB,CAAC,CAAA,KAAsC;AACpE,IAAA,IAAI,QAAA,IAAY,CAAA,CAAE,MAAA,KAAW,CAAA,IAAM,CAAA,CAAE,MAAA,YAAkB,WAAA,IAAe,CAAA,CAAE,MAAA,CAAO,OAAA,CAAQ,sBAAsB,CAAA,EAAI;AACjH,IAAA,MAAM,IAAA,GAAkB;AAAA,MACtB,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,QAAQ,CAAA,CAAE,OAAA;AAAA,MACV,QAAQ,CAAA,CAAE,OAAA;AAAA,MACV,UAAU,CAAA,CAAE,OAAA;AAAA,MACZ,UAAU,CAAA,CAAE,OAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AACA,IAAA,eAAA,iBAAgB,IAAI,KAAK,CAAA;AACzB,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,IAAA,MAAA,CAAO,IAAI,CAAA;AACX,IAAA,OAAA,CAAQ,OAAA,EAAS,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AAAA,EAChD,CAAA;AACA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAyC;AAClE,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,IAAA,EAAM,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AACnC,MAAA,MAAMC,MAAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,MAAM,CAAA,IAAK,cAAA;AAC9E,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAYA,MAAAA,EAAO;AAC3B,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA,eAAA,CAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACpC;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,CAAa,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AACxE,QAAA,aAAA,CAAc,YAAA,CAAa,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,MAClD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,IAAI,OAAA,EAAS,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AACxC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,OAAA,GAAU,OAAA,CAAQ,MAAM,CAAA,IAAK,cAAA;AACrG,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA,CAAE,OAAA,EAAS,KAAA,EAAM;AAC9E,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AACjB,IAAA,MAAA,CAAO,OAAO,CAAA;AACd,IAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,eAAA,CAAgB,OAAO,CAAA;AAAA,EAC5C,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAyC;AAChE,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,IAAA,EAAM,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AACnC,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,SAAS,UAAA,IAAc,YAAA,CAAa,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAC9D,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACxC,UAAA,IAAI,QAAQ,MAAA,GAAS,CAAA,SAAU,OAAA,EAAS,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,QAChE;AACA,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,QAAA,MAAA,CAAO,WAAW,MAAM;AACtB,UAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAAA,QAC7B,GAAG,CAAC,CAAA;AACJ,QAAA,CAAA,CAAE,cAAA,EAAe;AAAA,MACnB;AACA,MAAA,iBAAA,CAAkB,EAAE,SAAS,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,IAAI,OAAA,EAAS,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AACxC,IAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,eAAA,CAAgB,OAAO,CAAA;AAAA,SACrC,eAAA,iBAAgB,IAAI,GAAA,EAAK,CAAA;AAC9B,IAAA,iBAAA,CAAkB,EAAE,SAAS,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,uBACEd,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,GAAG,YAAA,EAAc,CAAC,YAAY,aAAA,EAAe,YAAA,CAAa,IAAA,GAAO,CAAA,IAAK,aAAa,CAAA;AAAA,MAC9F,aAAA,EAAe,iBAAA;AAAA,MACf,WAAA,EAAa,eAAA;AAAA,MACb,eAAA,EAAiB,CAAC,CAAA,KAAM,iBAAA,CAAkB,EAAE,SAAS,CAAA;AAAA,MAErD,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,4BAAA,EAAM,CAAA;AAAA,0BAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAW,EAC9D,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZI,IAAAA,CAAC,MAAA,EAAA,EAA0B,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,EAAG,KAAA,EAAO,CAAA,OAAA,EAAK,CAAA,CAAE,aAAa,CAAA,OAAA,CAAA,EAAM,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YAC7G,OAAO,CAAA,CAAE,aAAa,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,YAAE;AAAA,WAAA,EAAA,EADlC,CAAA,CAAE,YAEb,CACD,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,QACC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,UAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAC9B,UAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAkB,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,UAAA,KAAe,IAAA,CAAK,EAAA,IAAM,SAAS,CAAA,EAAG,mBAAA,EAAmB,KAAK,EAAA,EAChH,QAAA,EAAA;AAAA,4BAAAA,KAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAuB,KAAA,EAAO,KAAK,IAAA,EACjD,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAE,EAAG,CAAA;AAAA,8BAC/EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,eAAK,IAAA,EAAK,CAAA;AAAA,8BAClDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,eAAK,MAAA,EAAO;AAAA,aAAA,EACvD,CAAA;AAAA,4BACAI,IAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kBAAA;AAAA,gBACV,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,SAAS,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAE;AAAA,gBAC3D,aAAA,EAAe,sBAAA;AAAA,gBAEd,QAAA,EAAA;AAAA,kBAAA,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG,sBAChBJ,GAAAA,CAAC,UAAsB,SAAA,EAAU,gBAAA,EAAiB,KAAA,EAAO,EAAE,MAAM,CAAA,CAAE,IAAA,MAAxD,CAAA,IAAA,EAAO,CAAC,EAAwD,CAC5E,CAAA;AAAA,kBACA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,oBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,oBAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,oBAAA,uBACEA,GAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBAEC,SAAA,EAAU,iBAAA;AAAA,wBACV,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAE,uBAAA;AAAA,sBAFrD,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,qBAGzB;AAAA,kBAEJ,CAAC,CAAA;AAAA,kBACA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,qBACTA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,SAAA,EAAW,EAAA;AAAA,wBACT,iBAAA;AAAA,wBACA,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,aAAA;AAAA,wBAChC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK;AAAA,uBAClC;AAAA,sBACA,oBAAA,EAAoB,EAAE,IAAA,CAAK,GAAA;AAAA,sBAC3B,cAAA,EAAc,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,sBACzC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,sBACzB,KAAA,EAAO,EAAE,IAAA,CAAK,KAAA;AAAA,sBACd,eAAe,CAAC,CAAA,KAAM,sBAAsB,CAAA,EAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,sBACzD,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,wBAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,0BAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,0BAAA,CAAA,CAAE,cAAA,EAAe;AACjB,0BAAA;AAAA,wBACF;AACA,wBAAA,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,YAAA,EAAc,CAAA,CAAE,KAAK,UAAU,CAAA;AAAA,sBAC/C,CAAA;AAAA,sBACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,wBAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC/B,wBAAA,WAAA,EAAY;AACZ,wBAAA,MAAM,CAAA,GAAI,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AAChD,wBAAA,QAAA,CAAS;AAAA,0BACP,YAAA,EAAc,EAAE,IAAA,CAAK,YAAA;AAAA,0BACrB,UAAA,EAAY,EAAE,IAAA,CAAK,UAAA;AAAA,0BACnB,IAAA,EAAM,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,0BACnE,IAAA,EAAM,CAAA,CAAE,aAAA,CAAc,OAAA,CAAqB,aAAa;AAAA,yBACzD,CAAA;AAAA,sBACH,CAAA;AAAA,sBACA,YAAA,EAAc,aAAA;AAAA,sBAEb,YAAE,IAAA,CAAK;AAAA,qBAAA;AAAA,oBAjCH,EAAE,IAAA,CAAK;AAAA,mBAmCf;AAAA;AAAA;AAAA;AACH,WAAA,EAAA,EA/DQ,KAAK,EAgEf,CAAA;AAAA,QAEJ,CAAC,CAAA;AAAA,QACA,GAAA,mBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAwB,KAAA,EAAO,QAAA,EAAS,EAAG,CAAA,GAAK,IAAA;AAAA,QACtE,4BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,CAAU,GAAG,GAAA,EAAK,SAAA,CAAU,GAAE,EAClF,QAAA,EAAA,SAAA,CAAU,OACb,CAAA,GACE,IAAA;AAAA,QACH,wBACCA,GAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,MAAA,EAAQ,KAAA;AAAA,YACR,WAAA,EAAa,OAAA;AAAA,YACb,aAAA,EAAe,SAAA;AAAA,YACf,OAAA,EAAS,WAAA;AAAA,YACT,OAAA,EAAS;AAAA;AAAA,SACX,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AC1XA,IAAM,IAAA,GAAiD;AAAA,EACrD,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,EACxB,SAAA,EAAW,EAAE,IAAA,EAAM,UAAA,EAAW;AAAA,EAC9B,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA;AACjB,CAAA;AAEA,SAAS,WAAW,EAAA,EAAoB;AACtC,EAAA,OAAO,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC5C;AAEA,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAW,SAAA,EAAU,EAAiD;AACjG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAS,KAAK,CAAA;AAEtC,EAAA,uBACEE,IAAAA,CAAAL,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,2BAAA,EAA4B,KAAA,EAAM,gCAAA,EAAQ,YAAA,EAAW,gCAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA,EACtH,QAAA,kBAAAA,GAAAA,CAACmB,CAAAA,EAAA,EAAE,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,GAAA,EAAK,CAAA,EAC9C,CAAA;AAAA,IACC,IAAA,mBACCnB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,IAAA,EAAK,cAAA,EAAe,WAAA,EAAa,MAAM,OAAA,CAAQ,KAAK,CAAA,EACxF,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,MAAA,EAAO,iBAAA,EAAgB,0BAAA,EAA2B,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAgB,EAC5I,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,IAAC,IAAA,EAAA,EAAG,EAAA,EAAG,0BAAA,EAA2B,SAAA,EAAU,qBAAoB,QAAA,EAAA,0BAAA,EAAI,CAAA;AAAA,wBACpEA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,eAAA,EAAgB,YAAA,EAAW,cAAA,EAAK,OAAA,EAAS,MAAM,QAAQ,KAAK,CAAA,EAC1F,0BAAAA,GAAAA,CAACmB,CAAAA,EAAA,EAAE,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,GAAA,EAAK,CAAA,EAC9C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAf,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA;AAAA,QAAA,gCAAA;AAAA,QAAM,SAAA,IAAa,gCAAA;AAAA,QAAQ;AAAA,OAAA,EAAE,CAAA;AAAA,sBAC7DA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,wBACnFA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,wCAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,OAAA,CAAQ,KAAK,CAAA;AACb,cAAA,SAAA,EAAU;AAAA,YACZ,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,GACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA;AACzB,EAAA,MAAM,MAAA,GAASc,QAAQ,MAAM;AAC3B,IAAA,IAAI,KAAA,KAAU,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,UAAU,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AACpG,IAAA,IAAI,KAAA,KAAU,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,aAAa,EAAC,EAAG,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,OAAW,OAAO,CAAA;AAC7G,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK,KAAM,OAAO,CAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,OAAO,CAAC,CAAA;AAE5D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAE9D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACEd,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA;AAAA,MAAA,kDAAA;AAAA,MAAS,KAAA;AAAA,MAAM,GAAA;AAAA,MAAE,OAAA;AAAA,MAAQ;AAAA,KAAA,EAAC,CAAA,EACrE,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,IAAA,GACJ,KAAA,KAAU,QAAA,GACN,mBAAA,CAAoB,MAAqB,CAAA,GACzC,KAAA,KAAU,WAAA,GACR,sBAAA,CAAuB,MAAwB,CAAA,GAC/C,kBAAA,CAAmB,MAAoB,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,OAAO,WAAA,IAAe,EAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,eAAe,IAAA,EAAK;AACxC,EAAA,MAAMN,OAAAA,GAAS,MAAA,CAAO,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAEhD,EAAA,uBACEE,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,kBAAAA,IAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAM,IACjC,QAAA,kBAAAI,IAAAA,CAAC,aAAQ,SAAA,EAAU,iBAAA,EAAkB,2BAAuB,IAAA,EAC1D,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EACd,QAAA,kBAAAA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,QAAA;AAAA,UACA,WAAA,EAAa,CAAA,kBAAA,EAAM,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA;AAAA,UACzC,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA,OACpE,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAC9CI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,eAAA,CAAgB,KAAK,CAAA,EAAE,CAAA;AAAA,wBAChEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,UAAW,eAAA;AAAA,UAAM,IAAA,CAAK,MAAA;AAAA,UAAO;AAAA,SAAA,EAChC,CAAA;AAAA,QACC,oBAAA,IAAwB,CAAC,QAAA,mBACxBJ,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,qBAAA;AAAA,YACV,KAAA,EAAM,gCAAA;AAAA,YACN,SAAS,MACP,oBAAA,CAAqB,EAAE,IAAA,EAAM,IAAI,OAAA,EAAS,IAAA,EAAM,IAAA,IAAQ,OAAA,EAAS,aAAa,WAAA,IAAe,MAAA,EAAW,cAAc,EAAA,EAAI,UAAA,EAAY,IAAI,CAAA;AAAA,YAG5I,0BAAAA,GAAAA,CAACS,MAAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK;AAAA;AAAA,SACnD,GACE;AAAA,OAAA,EACN;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAT,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,cAAA;AAAA,QACP,QAAA;AAAA,QACA,WAAA,EAAa,CAAA,wBAAA,EAAO,eAAA,CAAgB,KAAK,CAAC,CAAA,uCAAA,CAAA;AAAA,QAC1C,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,uBAAA,CAAwB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,CAAC,CAAC;AAAA;AAAA,KAC3E,EACF,CAAA;AAAA,oBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA;AAAA,UAAA,eAAA;AAAA,0BAAGJ,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EAAoB,QAAA,EAAAF,QAAO,MAAA,EAAO;AAAA,SAAA,EAAO,CAAA;AAAA,QAC1G,CAAC,2BACAM,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,2BAAA;AAAA,YACV,SAAS,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,eAAe,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,EAAE,UAAU,UAAA,CAAW,OAAO,GAAG,UAAA,EAAY,oBAAA,EAAO,CAAC,CAAA;AAAA,YAEnH,QAAA,EAAA;AAAA,8BAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SACnD,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MACCb,OAAAA,CAAO,MAAA,GAAS,CAAA,mBACfE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAAF,OAAAA,CAAO,GAAA,CAAI,CAAC,OAAO,GAAA,KAAQ;AAC1B,QAAA,MAAM,OAAO,KAAA,CAAM,QAAA,IAAY,IAAI,IAAA,EAAK,IAAK,OAAO,GAAG,CAAA,CAAA;AACvD,QAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAc,SAAA,EAAU,uBAAA,EACvB,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,4BAAAJ,GAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,IAAA,IAAQ,EAAA;AAAA,gBACzC,QAAA;AAAA,gBACA,WAAA,EAAY,oBAAA;AAAA,gBACZ,SAAA,EAAU,4BAAA;AAAA,gBACV,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,sBAAA,CAAuB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,YAAA,EAAc,CAAC,CAAC;AAAA;AAAA,aAC7F;AAAA,YACC,CAAC,QAAA,IAAA,CAAa,KAAA,CAAM,YAAY,EAAA,EAAI,IAAA,qBACnCA,GAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,IAAA,IAAQ,EAAA;AAAA,gBAC7C,SAAA,EAAW,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,kBAAkB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,GAAG,CAAC;AAAA;AAAA,aACzE,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAS,IAAA;AAAA,cACT,KAAA,EAAO,MAAM,WAAA,IAAe,EAAA;AAAA,cAC5B,QAAA;AAAA,cACA,WAAA,EAAY,gCAAA;AAAA,cACZ,SAAA,EAAU,4BAAA;AAAA,cACV,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,sBAAA,CAAuB,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,aAAA,EAAe,CAAC,CAAC;AAAA;AAAA;AAC9F,SAAA,EAAA,EAvBQ,GAwBV,CAAA;AAAA,MAEJ,CAAC,GACH,CAAA,GACE;AAAA,KAAA,EACN,CAAA;AAAA,IAEC,KAAK,MAAA,GAAS,CAAA;AAAA;AAAA;AAAA,sBAGbA,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA,EAAW,IAAA;AAAA,UACX,IAAA;AAAA,UACA,MAAA,EAAQF,OAAAA;AAAA,UACR,QAAA;AAAA,UACA,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,KAChB,MAAA,CAAO,CAAC,CAAA,KAAM,6BAAA,CAA8B,CAAA,EAAG,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,UAEjF,MAAA,EAAQ,CAAC,UAAA,EAAY,QAAA,KACnB,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,WAAW;AAAA;AAAA;AAEtF,QACE;AAAA,GAAA,EACN,GACA,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,MAAsB,IAAA,EAA+B;AACrE,EAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,OAAA,KAAY,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAC1G,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,oBAAA,KAAyB,IAAA,CAAK,oBAAA,EAAsB,OAAO,KAAA;AAOtI,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,OAAO,KAAA;AACpC,EAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU,OAAO,KAAK,IAAA,CAAK,MAAA,KAAW,KAAK,IAAA,CAAK,MAAA;AACnE,EAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa,OAAO,KAAK,IAAA,CAAK,SAAA,KAAc,KAAK,IAAA,CAAK,SAAA;AACzE,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,IAAA,CAAK,KAAA;AACvC;AAGO,IAAM,SAAA,GAAYiB,IAAAA,CAAK,aAAA,EAAe,QAAQ,CAAA;AC/M9C,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAsBG;AACD,EAAA,MAAM,MAAA,GAASD,QAAQ,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC5D,EAAA,MAAM,IAAA,GAAOA,OAAAA;AAAA,IACX,OAAO;AAAA,MACL,QAAA,EAAU,WAAA,CAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA;AAAA,MACxC,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,MAC9C,WAAA,EAAa,cAAA,CAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA;AAAA,MACjD,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,KAAA,IAAS,EAAE;AAAA,KACvC,CAAA;AAAA,IACA,CAAC,MAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,KAAA,CAAM,SAAA,EAAW,MAAM,KAAK;AAAA,GAC7D;AAQA,EAAA,MAAM,aAAA,GAAgB,iBAAiB,KAAK,CAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoBP,OAAyD,MAAS,CAAA;AAC5F,EAAA,MAAM,aAAA,GAAgBO,QAAQ,MAAM;AAOlC,IAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,aAAA,EAAe,iBAAA,CAAkB,OAAO,CAAA;AAC5E,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,SAAA,GAAYP,OAAuB,IAAI,CAAA;AAE7C,EAAA,kBAAA,CAAmB,gBAAgB,SAAS,CAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoBA,OAAO,CAAC,CAAA;AAClC,EAAA,MAAM,WAAA,GAAcA,OAAO,EAAE,CAAA;AAC7B,EAAA,MAAM,eAAA,GAAkBA,OAAe,EAAE,CAAA;AAGzC,EAAA,MAAM,MAAA,GAASa,WAAAA;AAAA,IACb,CAAC,GAAA,KAAyB,iBAAA,GAAoB,GAAG,CAAA;AAAA,IACjD,CAAC,iBAAiB;AAAA,GACpB;AAGA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIlB,SAA4B,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAA4B,IAAI,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgBK,OAA0B,IAAI,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgBA,OAA0B,IAAI,CAAA;AACpD,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,MAAM,GAAA,GAAMO,OAAAA;AAAA,IACV,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO,CAAC,CAAA,KAAM;AACZ,QAAA,aAAA,CAAc,CAAC,CAAA;AACf,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAA;AAAA,MAC7B,MAAM,MAAM;AACV,QAAA,MAAM,IAAI,aAAA,CAAc,OAAA;AACxB,QAAA,MAAM,IAAI,aAAA,CAAc,OAAA;AACxB,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,MAAA;AAAA,YAAO,CAAC,GAAA,KACN,cAAA;AAAA,cACE,GAAA;AAAA,cACA,EAAE,cAAc,CAAA,CAAE,EAAA,EAAI,YAAY,CAAA,CAAE,EAAA,EAAI,SAAA,EAAW,CAAA,CAAE,GAAA,EAAI;AAAA,cACzD,EAAE,cAAc,CAAA,CAAE,EAAA,EAAI,YAAY,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA;AAAK;AACvD,WACF;AAAA,QACF;AACA,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,KAAK,MAAM;AACT,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,KACF,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,UAAA,EAAY,MAAM;AAAA,GACjC;AAKA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,aAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,CAAO,WAAA;AAC3B,IAAA,OAAO,SAAS,GAAA,GAAM,SAAA,GAAY,KAAA,GAAQ,UAAA,GAAa,MAAM,QAAA,GAAW,QAAA;AAAA,EAC1E,CAAA;AAKA,EAAAR,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,mBAAmB,SAAS,CAAA;AACxC,IAAA,IAAI,SAAA,CAAU,WAAW,QAAA,EAAU;AACjC,MAAA,eAAA,CAAgB,OAAA,GAAU,GAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,KAAQ,gBAAgB,OAAA,EAAS;AACrC,IAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,MAAA,EAAQ,SAAS,CAAA;AAClD,IAAA,IAAI,OAAO,IAAA,EAAM;AACjB,IAAA,eAAA,CAAgB,OAAA,GAAU,GAAA;AAC1B,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACzC,IAAA,SAAA,CAAU,OAAA,EAAS,cAAc,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,CAAA;AAAA,EACnF,CAAA,EAAG,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AAEtB,EAAA,MAAM,mBAAA,GAAsB,CAAC,QAAA,KAAqB;AAChD,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,iBAAA,CAAkB,OAAA,EAAS;AAC5C,IAAA,IAAI,QAAA,KAAa,YAAY,OAAA,EAAS;AACtC,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,MAAA,EAAQ,QAAQ,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA,EAAG;AAC5C,IAAA,iBAAA,GAAoB,UAAA,CAAW,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,uBACEN,GAAAA,CAAC,kBAAA,CAAmB,UAAnB,EAA4B,KAAA,EAAO,KACpC,QAAA,kBAAAA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAU,2BAAA;AAAA,MACV,MAAM,MAAA,CAAO,KAAA;AAAA,MACb,gBAAA,EAAkB,gBAAgB,cAAc,CAAA;AAAA,MAChD,kBAAA,EAAoB,IAAA;AAAA,MACpB,YAAA,EAAc,CAAC,KAAA,KAAU,mBAAA,CAAoB,MAAM,UAAU,CAAA;AAAA,MAC7D,WAAA,EAAa,CAAC,MAAA,EAAQ,IAAA,KAAS;AAC7B,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,QAAQ,KAAK,IAAA;AAAM,UACjB,KAAK,gBAAA,EAAkB;AACrB,YAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA;AAChD,YAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,YAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,mBAAmB,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,cAAc,GACvE,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAC,QAAA,mBAAWJ,GAAAA,CAAC,WAAA,EAAA,EAAY,YAAY,IAAA,CAAK,UAAA,EAAY,QAAgB,CAAA,GAAK,IAAA;AAAA,8BAC5EA,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,YAAY,IAAA,CAAK,UAAA;AAAA,kBACjB,YAAA,EAAc,eAAA,CAAgB,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA;AAAA,kBACtD,cAAc,IAAA,CAAK,UAAA,KAAe,CAAA,GAAI,KAAA,CAAM,SAAS,EAAA,GAAK,MAAA;AAAA,kBAC1D,QAAA;AAAA,kBACA;AAAA;AAAA;AACF,aAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,UAEJ;AAAA,UACA,KAAK,eAAA;AACH,YAAA,IAAI,UAAU,OAAO,IAAA;AACrB,YAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,mBAAmB,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,GACvD,QAAA,kBAAAI,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,uBAAA;AAAA,gBACV,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,aAAA,CAAc,CAAA,EAAG,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,gBAE9D,QAAA,EAAA;AAAA,kCAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,eAEnD,CAAA,EACF,CAAA;AAAA,UAEJ,KAAK,OAAA,EAAS;AACZ,YAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA,EAAG,MAAA,GAAS,KAAK,QAAQ,CAAA;AACvE,YAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,YAAA,MAAM,OAAA,GACJ,SAAA,CAAU,IAAA,KAAS,OAAA,IACnB,SAAA,CAAU,eAAe,IAAA,CAAK,UAAA,IAC9B,SAAA,CAAU,QAAA,KAAa,IAAA,CAAK,QAAA;AAC9B,YAAA,MAAM,UAAU,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,CAAA;AAClD,YAAA,MAAM,SAAS,CAAC,QAAA,KAAa,gBAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,IAAK,KAAA,CAAA;AAC/D,YAAA,MAAM,YAAY,CAAC,QAAA,GAAW,WAAW,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,GAAI,MAAA;AAClE,YAAA,MAAM,eAAe,CAAC,QAAA,GAAW,iBAAA,EAAmB,GAAA,CAAI,OAAO,CAAA,GAAI,MAAA;AACnE,YAAA,MAAM,UAAA,GACJ,YAAA,IAAgB,cAAA,IAAkB,cAAA,GAC9B;AAAA,cACE,SAAS,YAAA,CAAa,OAAA;AAAA,cACtB,eAAe,YAAA,CAAa,aAAA;AAAA,cAC5B,QAAA,EAAU,cAAA;AAAA,cACV,QAAA,EAAU;AAAA,aACZ,GACA,MAAA;AACN,YAAA,uBACEX,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EAAmB,mBAAA,EAAiB,MACjD,QAAA,kBAAAI,IAAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,mBAAmB,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,SAAA,IAAa,YAAY,CAAA,EACjF,QAAA,EAAA;AAAA,cAAA,SAAA,IAAa,MAAA,mBACZA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EACb,QAAA,EAAA;AAAA,gCAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAA,KAAc,OAAA,IAAW,UAAU,CAAA,EAC3E,QAAA,EAAA,SAAA,KAAc,OAAA,GAAU,iBAAA,GAAU,iBAAA,EACrC,CAAA;AAAA,gCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,gCACzCA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,wBAAA;AAAA,oBACV,SAAS,MAAM,SAAA,CAAW,SAAS,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAAA,oBACjE,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,wBAAA;AAAA,oBACV,SAAS,MAAM,SAAA,CAAW,SAAS,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAAA,oBACjE,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF,CAAA,GACE,IAAA;AAAA,8BACJA,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,UAAA;AAAA,kBACA,cAAc,IAAA,CAAK,UAAA;AAAA,kBACnB,YAAY,IAAA,CAAK,QAAA;AAAA,kBACjB,KAAA;AAAA,kBACA,IAAA;AAAA,kBACA,MAAA;AAAA,kBACA,QAAA;AAAA,kBACA,OAAA;AAAA,kBACA,MAAA;AAAA,kBACA,eAAA,EAAiB,MAAA;AAAA,kBACjB;AAAA;AAAA;AACF,aAAA,EACF,CAAA,EACF,CAAA;AAAA,UAEJ;AAAA,UACA,KAAK,aAAA;AACH,YAAA,IAAI,UAAU,OAAO,IAAA;AACrB,YAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBACb,QAAA,kBAAAI,IAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,iBAAA,EAAkB,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,UAAA,CAAW,CAAC,CAAC,CAAA,EAC1F,QAAA,EAAA;AAAA,8BAAAJ,IAACW,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,cAAE;AAAA,aAAA,EACjD,CAAA,EACF,CAAA;AAAA,UAEJ,KAAK,oBAAA;AACH,YAAA,uBACEX,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,GAAE,CAAA,EACxE,CAAA;AAAA,UAEJ,KAAK,YAAA;AACH,YAAA,uBACEA,GAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,KAAA;AAAA,gBACN,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,MACE,aAAA,CAAc,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,CAAE,KACjD,cAAA,CAAe,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,gBAEhD,QAAA;AAAA,gBACA,MAAA;AAAA,gBACA,QAAA,EAAU,MAAA;AAAA,gBACV;AAAA;AAAA,aACF;AAAA,UAEJ;AACE,YAAA,OAAO,IAAA;AAAA;AACX,MACF;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;AAIA,SAAS,WAAA,CAAY;AAAA,EACnB,UAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,oBAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAO,qBACvBA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,GAAG,6BAAA,EAA+B,IAAA,IAAQ,SAAS,CAAA,EAAG,KAAA,EAAM,oBAAA,EAAM,YAAA,EAAW,oBAAA,EAAM,SAAS,MAAA,EAC3H,QAAA,kBAAAA,GAAAA,CAACqB,YAAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EAAoB,WAAA,EAAa,KAAK,CAAA,EAChE,CAAA;AAAA,MAGD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRrB,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,CAAC,EAAE,IAAA,EAAMW,IAAAA,EAAM,KAAA,EAAO,8CAAW,QAAA,EAAU,MAAM,MAAA,CAAO,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,aAAa,CAAC,CAAC,GAAG,CAAA;AAAA,YAC/F,CAAC,EAAE,IAAA,EAAMF,QAAQ,KAAA,EAAO,0BAAA,EAAQ,UAAU,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,cAAc,CAAA,EAAG,UAAU,CAAC,CAAA,EAAG,MAAA,EAAQ,MAAM;AAAA;AAC7G;AAAA;AACF;AAAA,GAEJ;AAEJ;AAIA,SAAS,aAAA,CAAc;AAAA,EACrB,UAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,KAAiB,MAAA,mBAChBA,IAAAA,CAAAL,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBACzCA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBACZ,QAAA,kBAAAA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,YAAA;AAAA,UACP,QAAA;AAAA,UACA,WAAA,EAAY,oBAAA;AAAA,UACZ,MAAA,EAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE;AAAA;AAAA,OACnD,EACF;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,YAAA;AAAA,QACP,QAAA;AAAA,QACA,WAAA,EAAY,0BAAA;AAAA,QACZ,MAAA,EAAQ,CAAC,CAAA,KACP,MAAA,CAAO,CAAC,CAAA,MAAO;AAAA,UACb,GAAG,CAAA;AAAA,UACH,UAAU,CAAA,CAAE,QAAA,EAAU,GAAA,CAAI,CAAC,IAAI,CAAA,KAAO,CAAA,KAAM,UAAA,GAAa,EAAE,GAAG,EAAA,EAAI,KAAA,EAAO,GAAE,GAAI,EAAG,KAAK,CAAA,CAAE;AAAA,SAC3F,CAAE;AAAA;AAAA,KAEN,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,eAAW,IAAA,EAAC;AAAA,GAAA,EACvD,CAAA;AAEJ;;;ACjZO,SAAS,cAAA,CAAe,YAAoB,OAAA,EAAqC;AACtF,EAAA,OAAO,GAAG,UAAU,CAAA,CAAA,EAAA,CAAK,OAAA,IAAW,EAAA,EAAI,MAAM,CAAA,CAAA;AAChD;AAEA,SAAS,WAAA,CAAY,QAAiB,KAAA,EAAyC;AAC7E,EAAA,MAAM,CAAA,GAAA,CAAK,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AAC9B,EAAA,MAAM,CAAA,GAAA,CAAK,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK;AAC7B,EAAA,OAAO,MAAM,CAAA,GAAI,MAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,EAAE;AACrD;AAEA,SAAS,eAAe,KAAA,EAAsB;AAI5C,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,IAClC,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW;AAAC,GAC5B,CAAA;AACH;AAEA,SAAS,UAAU,OAAA,EAAwD;AACzE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAmB;AACnC,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,EAAA,GAAA,CAAM,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACvC,IAAA,IAAI,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,YAAA,CACP,QAAA,EACA,GAAA,EACA,KAAA,EAC2B;AAC3B,EAAA,MAAM,IAAA,GAAO,YAAY,EAAC;AAC1B,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,EAAY,IAAA,EAAK;AAChC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAA,EAAY,IAAA,EAAK,KAAM,EAAE,CAAA;AACzD,IAAA,IAAI,MAAM,OAAO,IAAA;AAAA,EACnB;AACA,EAAA,OAAO,KAAK,KAAK,CAAA;AACnB;AAEO,SAAS,gBAAA,CACd,UACA,OAAA,EACW;AACX,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA6B;AACvD,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,aAAA,EAAe,YAAA,EAAc,KAAA,EAAO,CAAA,EAAE;AAAA,EACjD;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,QAAA,CAAS,KAAA,EAAO,QAAQ,KAAK,CAAA;AACvD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAA,CAAS,SAAA,EAAW,QAAQ,SAAS,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,QAAA,CAAS,KAAA,EAAO,QAAQ,KAAK,CAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,IAAY,EAAC;AACzC,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,OAAA,EAAS,EAAA,KAAO;AACnC,IAAA,MAAM,UAAU,SAAA,CAAU,YAAA,CAAa,SAAS,QAAA,EAAU,OAAA,EAAS,EAAE,CAAC,CAAA;AACtE,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AACxC,MAAA,MAAM,EAAA,GAAA,CAAM,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACvC,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC3B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,aAAA,CAAc,GAAA,CAAI,cAAA,CAAe,EAAA,EAAI,EAAE,GAAG,OAAO,CAAA;AAAA,MACnD,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AAIzB,QAAA;AAAA,MACF,WAAW,cAAA,CAAe,IAAI,CAAA,KAAM,cAAA,CAAe,KAAK,CAAA,EAAG;AACzD,QAAA,aAAA,CAAc,GAAA,CAAI,cAAA,CAAe,EAAA,EAAI,EAAE,GAAG,UAAU,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,CAAC,SAAS,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AACjD,IAAA,MAAM,SAAS,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,OAAA,EAAS,EAAE,CAAC,CAAA;AAC/D,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AACxC,MAAA,MAAM,EAAA,GAAA,CAAM,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACvC,MAAA,IAAI,MAAM,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,GAAG,YAAA,IAAgB,CAAA;AAAA,IAC7C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAA,CACH,KAAA,GAAQ,CAAA,GAAI,CAAA,KACZ,SAAA,GAAY,CAAA,GAAI,CAAA,CAAA,IAChB,KAAA,GAAQ,CAAA,GAAI,CAAA,CAAA,GACb,aAAA,CAAc,IAAA,GACd,YAAA;AAEF,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,cAAc,KAAA,EAAM;AACvE;AAIO,SAAS,sBAAsB,SAAA,EAAuC;AAC3E,EAAA,MAAM,MAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,UAAU,aAAA,EAAe;AACjD,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AACzB,IAAA,IAAI,IAAI,CAAA,EAAG;AACX,IAAA,MAAM,aAAa,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC/B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG,GAAA,CAAI,KAAK,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,qBAAA,CACd,UACA,OAAA,EACkE;AAClE,EAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAA;AAC7C,EAAA,OAAO,EAAE,MAAA,EAAQ,qBAAA,CAAsB,EAAE,CAAA,EAAG,cAAc,EAAA,CAAG,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,KAAA,EAAM;AAC7F;AAMO,SAAS,uBAAA,CACd,QAAA,EACA,SAAA,EACA,UAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAA,CAAY,QAAA,CAAS,QAAA,IAAY,IAAI,KAAA,EAAM;AACjD,EAAA,MAAM,EAAA,GAAK,WAAW,IAAA,EAAK;AAC3B,EAAA,IAAI,EAAA,GAAK,EAAA,GAAK,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,EAAY,IAAA,EAAK,KAAM,EAAE,CAAA,GAAI,EAAA;AACvE,EAAA,IAAI,EAAA,GAAK,GAAG,EAAA,GAAK,UAAA,IAAc,KAAK,UAAA,GAAa,QAAA,CAAS,SAAS,UAAA,GAAa,EAAA;AAChF,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAC,KAAK,GAAG,CAAA;AACxD,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,QAAA,EAAS;AAAA,EACjC;AACA,EAAA,MAAM,EAAA,GAAK,SAAS,EAAE,CAAA;AACtB,EAAA,MAAM,MAAA,GAAA,CAAU,EAAA,CAAG,MAAA,IAAU,IAAI,KAAA,EAAM;AACvC,EAAA,MAAM,GAAA,GAAA,CAAO,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACxC,EAAA,MAAM,EAAA,GAAK,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,GAAG,CAAA,GAAI,EAAA;AAC9E,EAAA,IAAI,EAAA,IAAM,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,GAAI,KAAA;AAAA,OACrB,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,EAAA,QAAA,CAAS,EAAE,CAAA,GAAI,EAAE,GAAG,IAAI,MAAA,EAAO;AAC/B,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,QAAA,EAAS;AACjC;AAKO,SAAS,qBAAA,CACd,OAAA,EACA,UAAA,EACA,QAAA,EACA,aAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAA,CAAY,OAAA,CAAQ,QAAA,IAAY,IAAI,KAAA,EAAM;AAChD,EAAA,MAAM,EAAA,GAAK,SAAS,UAAU,CAAA;AAC9B,EAAA,IAAI,CAAC,IAAI,OAAO,OAAA;AAChB,EAAA,MAAM,MAAA,GAAA,CAAU,EAAA,CAAG,MAAA,IAAU,IAAI,KAAA,EAAM;AACvC,EAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,IAAY,MAAA,CAAO,QAAQ,OAAO,OAAA;AACtD,EAAA,IAAI,aAAA,EAAe,MAAA,CAAO,QAAQ,CAAA,GAAI,aAAA;AAAA,OACjC,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA;AAC9B,EAAA,QAAA,CAAS,UAAU,CAAA,GAAI,EAAE,GAAG,IAAI,MAAA,EAAO;AACvC,EAAA,OAAO,EAAE,GAAG,OAAA,EAAS,QAAA,EAAS;AAChC;AAGO,SAAS,iBAAA,CACd,QAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACc;AACd,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,EAAA,GAAK,aAAa,QAAA,CAAS,QAAA,EAAU,EAAE,UAAA,EAAY,SAAA,IAA8B,UAAU,CAAA;AACjG,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,OAAA,CAAQ,EAAA,CAAG,MAAA,IAAU,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,GAAG,CAAA,IAAK,IAAA;AAC7E;AAkBA,SAAS,UAAU,CAAA,EAAuB;AACxC,EAAA,OAAO,CAAC,EAAE,IAAA,IAAQ,EAAA,EAAA,CAAK,EAAE,OAAA,IAAW,EAAA,EAAI,MAAK,EAAG,CAAA,CAAE,YAAY,EAAA,EAAI,CAAA,CAAE,WAAW,EAAA,EAAI,CAAA,CAAE,YAAY,EAAE,CAAA,CAAE,KAAK,IAAG,CAAA;AAC/G;AAWO,SAAS,sBAAA,CAAuB,UAAwB,OAAA,EAAwC;AACrG,EAAA,MAAM,IAAI,QAAA,CAAS,MAAA;AACnB,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AAChC,EAAA,MAAM,KAAiB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAI,CAAA,EAAE,EAAG,MAAM,IAAI,MAAc,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3F,EAAA,KAAA,IAASsB,EAAAA,GAAI,CAAA,GAAI,CAAA,EAAGA,EAAAA,IAAK,GAAGA,EAAAA,EAAAA,EAAK;AAC/B,IAAA,KAAA,IAASC,EAAAA,GAAI,CAAA,GAAI,CAAA,EAAGA,EAAAA,IAAK,GAAGA,EAAAA,EAAAA,EAAK;AAC/B,MAAA,EAAA,CAAGD,EAAC,CAAA,CAAEC,EAAC,CAAA,GAAI,EAAA,CAAGD,EAAC,CAAA,KAAM,EAAA,CAAGC,EAAC,CAAA,GAAI,EAAA,CAAGD,EAAAA,GAAI,CAAC,CAAA,CAAEC,EAAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAGD,KAAI,CAAC,CAAA,CAAEC,EAAC,CAAA,EAAG,EAAA,CAAGD,EAAC,CAAA,CAAEC,EAAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IACzF;AAAA,EACF;AAEA,EAAA,MAAM,MAAY,EAAC;AACnB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AACrB,IAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,OAAA,EAAS,GAAG,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA,CAAA,EAAA;AAAA,IAAK,CAAA,MAAA,IACrD,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,CAAG,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK,CAAA,MACpE;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK;AAAA,EACzC;AACA,EAAA,OAAO,IAAI,CAAA,EAAG;AAAE,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,IAAA,CAAA,EAAA;AAAA,EAAK;AAChD,EAAA,OAAO,IAAI,CAAA,EAAG;AAAE,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAG,IAAA,CAAA,EAAA;AAAA,EAAK;AAEhD,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,IAAI,EAAA,CAAG,MAAM,OAAA,EAAS;AAAE,MAAA,IAAA,GAAO,GAAG,CAAA,GAAI,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACxD,IAAA,IAAI,EAAA,CAAG,MAAM,KAAA,EAAO;AAAE,MAAA,OAAA,CAAQ,KAAK,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA;AAAG,MAAA,IAAA,GAAO,GAAG,CAAA,GAAI,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACtG,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,IAAI,CAAC,CAAA,CAAE,MAAM,KAAA,EAAO;AAAE,MAAA,IAAA,CAAK,IAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAoB,CAAC,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK;AAC5F,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,IAAI,CAAC,CAAA,CAAE,MAAM,KAAA,EAAO;AAAE,MAAA,IAAA,CAAK,IAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAoB,CAAC,CAAA;AAAG,MAAA,CAAA,EAAA;AAAA,IAAK;AAC5F,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAC9C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,EAAE,OAAA,EAAS,IAAA,CAAK,CAAC,GAAG,IAAA,EAAM,UAAA,EAAY,iBAAiB,IAAA,CAAK,CAAC,GAAG,CAAA;AAC5G,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,SAAS,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA;AACzF,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,GAAS,IAAA,CAAK,KAAK,MAAA,GAAS,CAAC,IAAI,CAAA,GAAI,IAAA;AAC9D,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,eAAe,WAAA,EAAa,eAAA,EAAiB,IAAA,CAAK,CAAC,GAAG,CAAA;AAC9G,IAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,GAAO,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;AAIO,SAAS,iBAAA,CAAkB,aAAA,EAAsB,YAAA,EAAqB,IAAA,EAA6B;AACxG,EAAA,MAAM,QAAA,GAAA,CAAY,aAAA,CAAc,OAAA,IAAW,IAAI,KAAA,EAAM;AACrD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,IAAW,EAAC;AAC1C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC5D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAClC,IAAA,IAAI,IAAA,IAAQ,KAAK,eAAA,GAAkB,QAAA,CAAS,QAAQ,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA,GAAI,IAAA;AAAA,EACvF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAClC,IAAA,IAAI,IAAA,EAAM,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AAAA,EAC5E,WAAW,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAClE,IAAA,IAAI,IAAA,CAAK,kBAAkB,QAAA,CAAS,MAAA,WAAiB,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,EAAE,GAAG,aAAA,EAAe,OAAA,EAAS,QAAA,EAAS;AAC/C;AAKO,SAAS,iBAAA,CAAkB,YAAA,EAAqB,aAAA,EAA6B,IAAA,EAA6B;AAC/G,EAAA,MAAM,QAAA,GAAA,CAAY,YAAA,CAAa,OAAA,IAAW,IAAI,KAAA,EAAM;AACpD,EAAA,MAAM,QAAA,GAAW,aAAA,EAAe,OAAA,IAAW,EAAC;AAC5C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC5D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA;AAC1C,IAAA,IAAI,IAAA,IAAQ,KAAK,OAAA,GAAU,QAAA,CAAS,QAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AAAA,EACvE,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,IAAI,IAAA,CAAK,UAAU,QAAA,CAAS,MAAA,WAAiB,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,KAAS,IAAA,CAAK,mBAAmB,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA,GAAI,MAAA,CAAA;AAC3F,IAAA,IAAI,IAAA,EAAM,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,QAAA,EAAS;AAC9C;AAIO,SAAS,wBAAA,CAAyB,QAAA,EAAyB,OAAA,EAAwB,IAAA,EAAqC;AAC7H,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC3F,EAAA,MAAM,SAAA,GAAY,kBAAkB,QAAA,EAAU,GAAA,EAAK,YAAY,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAC5F,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,QAAA,GAAW,wBAAwB,QAAA,EAAU,GAAA,EAAK,YAAY,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA,GAAI,QAAA;AAAA,EACpG;AACA,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,SAAA,EAAW,QAAA,IAAY,WAAW,IAAI,CAAA;AACrE,EAAA,OAAO,wBAAwB,QAAA,EAAU,GAAA,EAAK,UAAA,EAAY,IAAA,CAAK,YAAY,IAAI,CAAA;AACjF;AAIO,SAAS,sBAAA,CAAuB,OAAA,EAAwB,QAAA,EAAgC,IAAA,EAAqC;AAClI,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,GAAA,EAAK,MAAA,EAAQ,SAAA,CAAU,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,MAAK,KAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA,IAAK,EAAA;AACrG,EAAA,IAAI,QAAA,GAAW,CAAA,IAAK,CAAC,GAAA,EAAK,QAAQ,OAAO,OAAA;AACzC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,kBAAkB,QAAA,EAAU,GAAA,CAAI,YAAY,IAAA,CAAK,UAAA,EAAY,KAAK,OAAO,CAAA;AAC3F,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AACxD,EAAA,OAAO,qBAAA,CAAsB,OAAA,EAAS,IAAA,CAAK,UAAA,EAAY,UAAU,IAAI,CAAA;AACvE;AAIO,SAAS,eAAA,CACd,UACA,OAAA,EAC6F;AAC7F,EAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAA;AAC7C,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,MAAM,UAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,GAAG,aAAA,EAAe;AAC1C,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC1B,IAAA,MAAM,aAAa,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG;AAClC,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAA,CAAO,KAAK,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAClD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,QAAA,GAAW,UAAU,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK,KAAM,OAAO,CAAA;AAC9E,IAAA,MAAM,YAAY,iBAAA,CAAkB,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,YAAY,OAAO,CAAA;AACjF,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,EAAA,GAAK,uBAAuB,SAAA,EAAW,OAAA,IAAW,EAAC,EAAG,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AAClF,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,OAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,UAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,iBAAiB,CAAA,CAAE,eAAA;AAAA;AAAA;AAAA,QAGnB,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,eAAA,IAAmB,IAAA,GAAO,SAAA,EAAW,OAAA,GAAU,CAAA,CAAE,eAAe,CAAA,GAAI;AAAA,OACtG,CAAA;AAAA,IACH;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,OAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,UAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,SAAA;AAAA,QACN,SAAS,CAAA,CAAE,aAAA;AAAA,QACX,iBAAiB,CAAA,CAAE,eAAA;AAAA,QACnB,IAAA,EAAM,SAAA,EAAW,OAAA,GAAU,CAAA,CAAE,eAAe;AAAA,OAC7C,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,EAAA,CAAG,YAAA,EAAc,KAAA,EAAO,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA,GAAS,EAAA,CAAG,YAAA,EAAa;AACnH;;;AC5XA,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AAChE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAK,EAAG;AAC7C,IAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AACpD;AAGO,SAAS,6BACd,SAAA,EACwB;AACxB,EAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AACnC,EAAA,IAAI,UAAA,KAAe,WAAW,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,QAAA,EAAS;AAClF,EAAA,IAAI,UAAA,KAAe,cAAc,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,YAAY,QAAA,EAAS;AAC3F,EAAA,IAAI,UAAA,KAAe,UAAU,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAE/E,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AACzC,EAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AAC5C,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,QAAA,EAAS;AAAA,EAC/C;AACA,EAAA,IAAI,eAAe,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,WAAW,UAAA,EAAW;AAE9D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AACnC,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,WAAA,IAAe,UAAU,OAAA,EAAS;AACnE,IAAA,OAAO,EAAE,MAAM,WAAA,EAAY;AAAA,EAC7B;AAEA,EAAA,OAAO,IAAA;AACT;AClDO,SAAS,UAAA,CAAW;AAAA,EACzB,YAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIrB,SAAqB,IAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAASK,OAAO,CAAC,CAAA;AAEvB,EAAAD,UAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAIhB,IAAA,SAAS,MAAA,CAAO,UAAkB,QAAA,EAAkB;AAClD,MAAA,MAAM,GAAA,GAAM,OAAO,YAAA,EAAa;AAChC,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,eAAe,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAK9B,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,uBAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAA,YAAkB,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,aAAA;AAC7D,MAAA,MAAM,OAAO,YAAA,CAAa,OAAA;AAC1B,MAAA,IAAI,CAAC,QAAQ,CAAC,QAAA,IAAY,CAAC,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClD,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAC5C,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,QAAA,EAAS,CAAE,IAAA,EAAK;AACjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,KAAK,qBAAA,EAAsB;AAG5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,EAAG,QAAA,CAAS,QAAQ,GAAG,CAAA;AACrF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,QAAA,GAAW,QAAA,CAAS,GAAA,GAAM,CAAC,CAAA,EAAG,QAAA,CAAS,SAAS,CAAC,CAAA;AACnF,MAAA,MAAA,CAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IAC5B;AAEA,IAAA,SAAS,KAAK,CAAA,EAAe;AAC3B,MAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AACZ,MAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AAEZ,MAAA,qBAAA,CAAsB,MAAM,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,SAAS,OAAO,CAAA,EAAe;AAE7B,MAAA,IAAK,CAAA,CAAE,MAAA,EAAwB,OAAA,GAAU,kBAAkB,CAAA,EAAG;AAC9D,MAAA,MAAA,CAAO,IAAI,CAAA;AAAA,IACb;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,IAAI,CAAA;AACzC,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAC5C,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAAA,IACxD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,uBACEF,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,iBAAA;AAAA,MACV,OAAO,EAAE,GAAA,EAAK,IAAI,GAAA,EAAK,IAAA,EAAM,IAAI,IAAA,EAAK;AAAA,MACtC,SAAS,MAAM;AACb,QAAA,MAAA,CAAO,OAAA,IAAW,CAAA;AAClB,QAAA,mBAAA,CAAoB;AAAA,UAClB;AAAA,YACE,IAAI,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,MAAM,CAAA,CAAA;AAAA,YAC9C,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA,GAAM,GAAA,CAAI,IAAA;AAAA,YAChE,MAAM,GAAA,CAAI;AAAA;AACZ,SACD,CAAA;AACD,QAAA,MAAA,CAAO,YAAA,IAAgB,eAAA,EAAgB;AACvC,QAAA,MAAA,CAAO,IAAI,CAAA;AAAA,MACb,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,eAAA,EAAgB,aAAa,GAAA,EAAK,CAAA;AAAA,QAAE;AAAA;AAAA;AAAA,GAEpE;AAEJ;AChHO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,CAAA,EAAG,CAAA;AAAA,oBAC/CA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,oBAAA;AAAA,QACV,KAAA,EAAO,KAAA;AAAA,QACP,WAAA,EAAY,cAAA;AAAA,QACZ,YAAA,EAAW,0BAAA;AAAA,QACX,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC7C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,IAAI,CAAA,CAAE,UAAU,MAAA,EAAO;AAAA,iBAClB,MAAA,EAAO;AAAA,UACd,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF;AAAA;AAAA,KACF;AAAA,oBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,MAAA,KAAA,GAAQ,CAAA,GAAI,UAAU,CAAA,GAAI,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE;AAAA,KAAA,EACjC,CAAA;AAAA,oBACAJ,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAM,oBAAA,EAAM,QAAA,EAAU,KAAA,KAAU,GAAG,OAAA,EAAS,MAAA,EAC7F,0BAAAA,GAAAA,CAACwB,WAAAA,EAAA,EAAY,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EACzD,CAAA;AAAA,oBACAxB,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAM,oBAAA,EAAM,QAAA,EAAU,KAAA,KAAU,GAAG,OAAA,EAAS,MAAA,EAC7F,0BAAAA,GAAAA,CAACK,YAAAA,EAAA,EAAa,SAAA,EAAU,YAAA,EAAa,WAAA,EAAa,IAAA,EAAM,CAAA,EAC1D,CAAA;AAAA,oBACAL,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,KAAA,EAAM,0BAAA,EAAO,SAAS,OAAA,EACvE,QAAA,kBAAAA,IAACmB,CAAAA,EAAA,EAAE,WAAU,YAAA,EAAa,WAAA,EAAa,MAAM,CAAA,EAC/C;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC1BA,IAAM,WAAA,GAAsC;AAAA,EAC1C,QAAA,EAAU,aAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AACA,IAAM,UAAA,GAAqC;AAAA,EACzC,GAAA,EAAK,YAAA;AAAA,EACL,KAAA,EAAO,cAAA;AAAA,EACP,IAAA,EAAM,aAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,GAAA,CAAI,OAAiB,KAAA,EAAwC;AACpE,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,EAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B;AAEA,SAAS,aAAA,CAAcrB,SAAkC,OAAA,EAA4C;AACnG,EAAA,MAAM,EAAA,GAAK,SAAS,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,OAAO,mBAAA,CAAoBA,OAAAA,EAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,QAAA,EAAU,IAAA,EAAK,KAAM,EAAE,CAAC,CAAA;AACnF;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,iBAAA,EAAkB;AACxC;AAEA,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACA,IAAA,EAMQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,EAAA,MAAM,iBAAA,GAAoB,0BAA0B,KAAK,CAAA;AACzD,EAAA,MAAM,WAAW,iBAAA,GAAoB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA,GAAI,MAAA;AAE/E,EAAA,GAAA,CAAI,OAAO,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAC,CAAC,CAAA;AAClD,EAAA,GAAA,CAAI,KAAA,EAAO,YAAY,KAAA,CAAM,WAAA,EAAa,SAAS,EAAE,CAAA,IAAK,KAAA,CAAM,WAAA,EAAa,KAAK,CAAA;AAClF,EAAA,GAAA,CAAI,KAAA,EAAO,QAAA,GAAW,sBAAA,CAAuB,QAAQ,IAAI,iBAAiB,CAAA;AAC1E,EAAA,GAAA,CAAI,KAAA,EAAO,WAAW,KAAA,CAAM,WAAA,EAAa,QAAQ,EAAE,CAAA,IAAK,KAAA,CAAM,WAAA,EAAa,IAAI,CAAA;AAE/E,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AACtC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,QAAA,EAAU,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,GAAA,CAAI,KAAA,EAAO,KAAA,GAAQ,mBAAA,CAAoB,KAAK,IAAI,EAAE,CAAA;AAClD,IAAA,GAAA,CAAI,OAAO,aAAA,CAAc,KAAA,EAAO,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACrC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAS,IAAA,EAAK;AAC7B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,GAAA,CAAI,KAAA,EAAO,IAAA,GAAO,kBAAA,CAAmB,IAAI,IAAI,EAAE,CAAA;AAC/C,IAAA,GAAA,CAAI,OAAO,aAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,OAAA,IAAW,EAAC,EAAG;AACtC,IAAA,iBAAA,CAAkB,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,KAAK,UAAU,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,iBAAA,CACP,KAAA,EACA,IAAA,EACA,QAAA,EACA,UAAA,EACM;AACN,EAAA,GAAA,CAAI,KAAA,EAAO,KAAK,OAAO,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,EAAO,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAC,CAAA;AAC9C,EAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,IAAI,CAAA,EAAG;AACxC,IAAA,GAAA,CAAI,KAAA,EAAO,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACnC,IAAA,GAAA,CAAI,KAAA,EAAO,wBAAwB,EAAE,UAAA,EAAY,KAAK,UAAA,EAAW,EAAG,QAAA,EAAU,UAAU,CAAC,CAAA;AACzF,IAAA,GAAA,CAAI,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,EACzB;AACF;AAEO,SAAS,yBAAyB,KAAA,EAA2C;AAClF,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,QAAA,EAAU,WAAA,CAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA;AAAA,IACxC,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,IAC9C,WAAA,EAAa,cAAA,CAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA;AAAA,IACjD,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,KAAA,IAAS,EAAE;AAAA,GACvC;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,IAAA,EAAK;AAChC,EAAA,IAAI,KAAA,IAAA,CAAU,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU,KAAK,CAAA,EAAG;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,CAAA;AAAE,KAC7C,CAAA;AAAA,EACH;AAEA,EAAA,CAAC,MAAM,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,UAAA,KAAe;AACtD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,WAAW,UAAU,CAAA,CAAA;AAAA,MAC1B,IAAA,EAAM,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AAAA,MACzC,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA;AAAW,KAC1C,CAAA;AACD,IAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,QAAA,KAAa;AAClD,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,QACpC,IAAA,EAAM,eAAA,CAAgB,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AAAA,QAC3C,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,QAAA;AAAS,OAClD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,uBAAA,CACd,SACA,KAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,UAAU,KAAA,CAAM,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AC7JO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,eAAA,GAAkBS,OAAO,KAAK,CAAA;AACpC,EAAA,MAAM,QAAA,GAAWA,OAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIL,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,CAAC,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAUY,QAAQ,MAAM,wBAAA,CAAyB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACtE,EAAA,MAAM,OAAA,GAAUA,OAAAA,CAAQ,MAAM,uBAAA,CAAwB,OAAA,EAAS,KAAK,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AACvF,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,EAAA,MAAM,OAAA,GAAU,QAAQ,CAAA,GAAI,IAAA,CAAK,IAAI,MAAA,EAAQ,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AAE1D,EAAA,MAAM,WAAA,GAAcM,WAAAA;AAAA,IAClB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,WAAW,QAAQ,CAAA;AACvD,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA,oBAAqB,IAAI,CAAA;AAAA,IACrE,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,iBAAA,EAAmB,SAAS;AAAA,GACxC;AAEA,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,MAAA,QAAA,CAAS,SAAS,MAAA,EAAO;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAcA,WAAAA,CAAY,MAAM,QAAQ,KAAK,CAAA,EAAG,EAAE,CAAA;AACxD,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,IAAA,KAAiB;AAChD,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,CAAC,CAAA;AAAA,EACb,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,WAAA,CAAA,CAAa,OAAA,GAAU,KAAK,KAAK,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,KAAK,CAAC,CAAA;AAChC,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,IAAI,QAAQ,CAAA,EAAG,WAAA,CAAA,CAAa,OAAA,GAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,KAAK,CAAC,CAAA;AAEhC,EAAAd,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,IAAQ,KAAA,GAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,CAAA;AAAA,EAC5C,GAAG,CAAC,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,KAAK,CAAC,CAAA;AAEtC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,IAAA,EAAM,UAAA,EAAW;AAAA,EACpC,CAAA,EAAG,CAAC,QAAA,EAAU,IAAA,EAAM,UAAU,CAAC,CAAA;AAE/B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAA+B;AACrD,MAAA,eAAA,CAAgB,OAAA,GAAU,kBAAkB,IAAA,IAAQ,CAAC,CAAC,OAAA,CAAQ,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,IACxF,CAAA;AACA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB,cAAA,CAAe,EAAE,MAAM,CAAA;AAClE,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAkB,cAAA,CAAe,EAAE,MAAM,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,EAAE,EAAE,OAAA,IAAW,CAAA,CAAE,YAAY,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AAC9D,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,YAAA,GAAe,kBAAkB,IAAA,IAAQ,CAAC,CAAC,OAAA,CAAQ,OAAA,EAAS,SAAS,MAAM,CAAA;AACjF,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,IAAI,MAAA,YAAkB,WAAA,IAAe,MAAA,KAAW,QAAA,CAAS,IAAA,EAAM;AAC/D,QAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAAA,MAChC;AACA,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AACpD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AACpD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC/D,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AACvD,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AAAA,IACzD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,OAAO,CAAC,CAAA;AAElC,EAAA,uBACEF,IAAAA,CAAAL,UAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,mBACCC,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA,EAAe,WAAA;AAAA,QACf,MAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS;AAAA;AAAA,KACX,GACE,IAAA;AAAA,oBACJA,IAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,IAAA,GAAO,KAAA,GAAQ,EAAA,EAC9C,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AC5BO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,EAAW,mBAAA;AAAA,EACX,iBAAA;AAAA,EACA,MAAA,EAAQ,gBAAA;AAAA,EACR,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA,GAAM,SAAA;AAAA,EACN,aAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA,GAAa,MAAA;AAAA,EACb,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AAMpB,EAAA,MAAM,YAAA,GAAeO,OAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,kBAAA,GAAqBA,OAAO,eAAe,CAAA;AACjD,EAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAC7B,EAAA,MAAM,aAAA,GAAgBO,OAAAA;AAAA,IACpB,OAAO;AAAA,MACL,KAAK,MAAM;AACT,QAAA,IAAA,CAAK,aAAa,OAAA,IAAW,CAAA,MAAO,CAAA,EAAG,kBAAA,CAAmB,UAAU,IAAI,CAAA;AAAA,MAC1E,CAAA;AAAA,MACA,KAAK,MAAM;AACT,QAAA,YAAA,CAAa,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,CAAa,UAAU,CAAC,CAAA;AAC3D,QAAA,IAAI,YAAA,CAAa,OAAA,KAAY,CAAA,EAAG,kBAAA,CAAmB,UAAU,KAAK,CAAA;AAAA,MACpE;AAAA,KACF,CAAA;AAAA,IACA;AAAC,GACH;AAMA,EAAA,MAAM,cAAcP,MAAAA,CAAO,EAAE,QAAQ,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAC/D,EAAA,WAAA,CAAY,OAAA,GAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,OAAA,EAAQ;AACzD,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,EAAE,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IACE,CAAA,YAAa,WAAA,KACZ,CAAA,CAAE,OAAA,KAAY,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,UAAA,IAAc,CAAA,CAAE,OAAA,KAAY,QAAA,IAAY,CAAA,CAAE,iBAAA,CAAA,EAClF;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY;AAC9B,MAAA,MAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAS,EAAA,EAAI,OAAA,EAAS,EAAA,EAAG,GAAI,WAAA,CAAY,OAAA;AACvE,MAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,CAAC,CAAA,CAAE,QAAA,EAAU;AAC9B,QAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,EAAE;AAAA,MACJ,WAAY,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAA,IAAa,QAAQ,GAAA,EAAK;AACrD,QAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,EAAE;AAAA,MACJ;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIJ,SAA0B,eAAe,CAAA;AACrF,EAAA,MAAM,YAAY,mBAAA,IAAuB,cAAA;AACzC,EAAA,MAAM,YAAA,GAAekB,WAAAA;AAAA,IACnB,CAAC,IAAA,KAA0B;AACzB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,iBAAA,GAAoB,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIlB,SAAuB,UAAU,CAAA;AACvE,EAAA,MAAM,SAAS,gBAAA,IAAoB,WAAA;AACnC,EAAA,MAAM,SAAA,GAAYkB,WAAAA;AAAA,IAChB,CAAC,IAAA,KAAuB;AACtB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,cAAA,GAAiB,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,OAAA,GAAUb,OAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,cAAA,GAAiBO,QAAQ,MAAM;AACnC,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAkC;AAChD,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,MAAA,IAAU,IAAI,CAAA,CAAE,GAAA,CAAI,cAAA,CAAe,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,OAAO,CAAA,EAAG,EAAE,IAAI,CAAA;AACzF,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AAGjB,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAM;AACtC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoG;AACpH,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,OAAA,IAAW,EAAC,EAAG;AACnC,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,CAAA,CAAE,UAAA,EAAY,EAAE,OAAO,CAAA;AAClD,MAAA,IAAI,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACN,QAAA,CAAA,GAAI,EAAE,yBAAS,IAAI,GAAA,IAAO,aAAA,kBAAe,IAAI,KAAI,EAAE;AACnD,QAAA,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AACxB,QAAA,MAAM,MAAM,CAAA,CAAE,aAAA,CAAc,IAAI,CAAA,CAAE,OAAO,KAAK,EAAC;AAC/C,QAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,QAAA,CAAA,CAAE,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,GAAG,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAClB,EAAA,MAAM,gBAAA,GAAmBA,QAAQ,MAAM;AACrC,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,cAAA,CAAe,MAAM,CAAA;AACvC,IAAA,KAAA,MAAW,KAAK,iBAAA,CAAkB,IAAA,EAAK,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,cAAA,EAAgB,iBAAiB,CAAC,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAA,GACd,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS,MAAA,IAAU,CAAA,CAAA,IAAM,IAAA,CAAK,gBAAgB,CAAA,CAAA,GACvF,CAAA;AAEJ,EAAA,MAAM,iBAAA,GAAoBA,QAA2B,MAAM;AACzD,IAAA,IAAI,gBAAA,CAAiB,IAAA,KAAS,CAAA,EAAG,OAAO,EAAC;AACzC,IAAA,MAAM,MAAyB,EAAC;AAChC,IAAA,CAAC,MAAM,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,SAAS,EAAA,KAAO;AAC9C,MAAA,CAAC,QAAQ,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAC5C,QAAA,IAAI,iBAAiB,GAAA,CAAI,cAAA,CAAe,IAAI,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAG;AAC5D,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,EAAA,EAAI,QAAA,EAAU,IAAI,CAAA;AAAA,QAC1D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,EAAA,MAAM,SAAA,GAAYP,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIL,SAAS,CAAC,CAAA;AAE9C,EAAA,MAAM,OAAA,GAAUkB,WAAAA;AAAA,IACd,CAAC,GAAA,KAAgB;AACf,MAAA,MAAM,IAAA,GAAO,iBAAA;AACb,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAA,CAAQ,UAAA,GAAa,GAAA,GAAM,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AACrD,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,YAAA,CAAa,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,CAAC,iBAAA,EAAmB,UAAA,EAAY,YAAY;AAAA,GAC9C;AAKA,EAAA,MAAM,SAAA,GAAYN,QAAQ,MAAM;AAC9B,IAAA,IAAI,CAAC,IAAA,IAAS,CAAC,IAAA,CAAK,aAAA,IAAiB,CAAC,IAAA,CAAK,aAAA,IAAkB,gBAAA,CAAiB,IAAA,KAAS,CAAA,EAAG,OAAO,MAAA;AACjG,IAAA,MAAM,MAAA,GAAS,CAAC,UAAA,EAAoB,OAAA,KAClC,cAAA,CAAe,IAAI,cAAA,CAAe,UAAA,EAAY,OAAO,CAAC,CAAA,IAAK,UAAA;AAC7D,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,cAAA;AAAA,MACX,QAAA,EAAU,CAAC,UAAA,EAAoB,OAAA,KAC7B,KAAK,aAAA,GAAgB,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,OAAO,GAAG,CAAA;AAAA,MACjF,QAAA,EAAU,CAAC,UAAA,EAAoB,OAAA,KAC7B,KAAK,aAAA,GAAgB,EAAE,UAAA,EAAY,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,OAAO,GAAG;AAAA,KACnF;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,cAAA,EAAgB,gBAAgB,CAAC,CAAA;AAG3C,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC5B,IAAA,MAAM,GAAA,GAAM,4BAAA,CAA6B,qBAAA,CAAsB,SAAS,CAAA;AACxE,IAAA,IAAI,GAAA,EAAK,YAAA,CAAa,UAAA,CAAW,GAAA,EAAK,WAAW,CAAC,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,qBAAA,EAAuB,YAAY,CAAC,CAAA;AAExC,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,KAAA,EAAO,SAAS,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,KAAA,EAAO,SAAS,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,CAAC,YAAA,EAAc,IAAA,GAAO,MAAA,GAAS,EAAA,EAAI,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAExF,EAAA,MAAM,yBACJN,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAgB,IAAA,EAAM,cAAA;AAAA,MACtB,gBAAgB,IAAA,EAAM,cAAA;AAAA,MACtB,cAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA,EAAmB,YAAA;AAAA,MACnB;AAAA;AAAA,GACF;AAGF,EAAA,uBACEA,GAAAA,CAAC,oBAAA,CAAqB,UAArB,EAA8B,KAAA,EAAO,eACtC,QAAA,kBAAAI,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,SAAA;AAAA,MACX,GAAA,EAAK,OAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,QAAA,GAAA,KAAQ,4BACPJ,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,KAAA;AAAA,YACN,SAAA;AAAA,YACA,QAAA,EAAU,YAAA;AAAA,YACV,YAAA,EAAc,WAAW,MAAA,GAAY,MAAM,OAAO,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC;AAAA;AAAA,SACxE,GACE,IAAA;AAAA,wBACJI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,aAAA,EAAe,WAAW,MAAA,GAAY,aAAA;AAAA,cACtC,aAAA,EAAe,QAAA;AAAA,cACf,YAAA;AAAA,cACA,MAAA;AAAA,cACA,cAAA,EAAgB,SAAA;AAAA,cAChB,OAAA;AAAA,cACA,OAAA;AAAA,cACA,MAAA;AAAA,cACA,MAAA;AAAA,cACA,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,KAAK,SAAA,EACjC,QAAA,EAAA;AAAA,4BAAAJ,GAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACC,KAAA;AAAA,gBACA,QAAA;AAAA,gBACA,OAAA;AAAA,gBACA,SAAA;AAAA,gBACA,iBAAA,EAAmB,YAAA;AAAA,gBAElB,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YACC,sCACCA,GAAAA,CAAC,cAAW,YAAA,EAAc,SAAA,EAAW,qBAA0C,CAAA,GAC7E,IAAA;AAAA,4BACJA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,UAAA;AAAA,gBACA,SAAA;AAAA,gBACA,gBAAgB,IAAA,EAAM,cAAA;AAAA,gBACtB,YAAA,EAAc,CAAC,EAAE,IAAA,EAAM,eAAe,IAAA,EAAM,WAAA,CAAA;AAAA,gBAC5C,YAAY,iBAAA,CAAkB,MAAA,GAAS,IAAI,MAAM,OAAA,CAAQ,EAAE,CAAA,GAAI,MAAA;AAAA,gBAC/D,YAAY,iBAAA,CAAkB,MAAA,GAAS,IAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA;AAAA,gBAC9D,aAAa,IAAA,EAAM,WAAA;AAAA,gBACnB,aAAa,IAAA,EAAM,WAAA;AAAA,gBACnB,aAAa,YAAA,EAAc,KAAA;AAAA,gBAC3B,UAAU,YAAA,GAAe,MAAM,YAAA,CAAa,YAAA,CAAa,SAAS,CAAA,GAAI;AAAA;AAAA;AACxE,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;AAKA,SAAS,iBAAA,CAAkB,OAAsB,SAAA,EAA6C;AAC5F,EAAA,IAAI,SAAA,CAAU,SAAS,WAAA,EAAa;AAClC,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,mCAAA,EAAY,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,OAAA,EAAS;AAC9B,IAAA,MAAM,CAAA,GAAI,YAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,CAAE,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AAC/D,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAO,cAAA,EAAK,IAAA,EAAM,CAAA,GAAI,mBAAA,CAAoB,CAAC,CAAA,GAAI,SAAA,CAAU,OAAA,EAAS,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,UAAA,EAAY;AACjC,IAAA,MAAM,CAAA,GAAI,eAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA,CAAE,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA;AACxE,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAO,cAAA,EAAK,IAAA,EAAM,CAAA,GAAI,sBAAA,CAAuB,CAAC,CAAA,GAAI,SAAA,CAAU,UAAA,EAAY,CAAA;AAAA,EACtF;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAC7B,IAAA,MAAM,CAAA,GAAI,WAAW,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAE,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAC5D,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAO,cAAA,EAAK,IAAA,EAAM,CAAA,GAAI,kBAAA,CAAmB,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,EAC9E;AACA,EAAA,MAAM,KAAA,GACJ,SAAA,CAAU,IAAA,KAAS,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,IAAA,KAAS,MAAA,GAC7E,SAAA,CAAU,UAAA,GACV,IAAA;AACN,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA;AACjC,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,uBACEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EACd,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UAAG,qBAAA,CAAsB,IAAI,KAAK,CAAA;AAAA,UAAE;AAAA,SAAA,EAAE,CAAA;AAAA,wBACzEA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA;AAAA,UAAA,EAAA,CAAG,QAAQ,MAAA,IAAU,CAAA;AAAA,UAAE;AAAA,SAAA,EAAE;AAAA,OAAA,EAC7D,CAAA;AAAA,IAEJ;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,GAAA,CAAI,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAqC;AAC/D,EAAA,uBACEA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EACd,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,oBAC3CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAkB,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EACzC,CAAA;AAEJ;AAIA,SAAS,mBAAA,CACP,OACA,SAAA,EACsD;AACtD,EAAA,MAAM,IAAA,GACJ,SAAA,CAAU,IAAA,KAAS,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,IAAA,KAAS,MAAA,GAC7E,SAAA,CAAU,IAAA,GACV,MAAA;AACN,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,MAAM,CAAA,GAAI,YAAY,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAC1D,IAAA,KAAA,GAAQ,CAAA,GAAI,mBAAA,CAAoB,CAAC,CAAA,GAAI,IAAA,CAAK,OAAA;AAAA,EAC5C,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,IAAA,MAAM,CAAA,GAAI,eAAe,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AACnE,IAAA,KAAA,GAAQ,CAAA,GAAI,sBAAA,CAAuB,CAAC,CAAA,GAAI,IAAA,CAAK,UAAA;AAAA,EAC/C,CAAA,MAAO;AACL,IAAA,MAAM,CAAA,GAAI,WAAW,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACvD,IAAA,KAAA,GAAQ,CAAA,GAAI,kBAAA,CAAmB,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,EAC3C;AACA,EAAA,OAAO,EAAE,OAAO,SAAA,EAAW,UAAA,CAAW,gBAAgB,IAAI,CAAA,EAAG,WAAW,CAAA,EAAE;AAC5E;;;AC5WA,SAAS,IAAI,SAAA,EAAyE;AACpF,EAAA,OAAO,EAAE,GAAA,EAAK,kBAAA,CAAmB,SAAS,GAAG,SAAA,EAAU;AACzD;AAGO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,MAAM,QAAA,GAAA,CAAgC,MAAM,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,SAAS,UAAA,KAAe;AACvF,IAAA,MAAM,MAAA,GAAA,CAAU,QAAQ,MAAA,IAAU,IAAI,GAAA,CAAI,CAAC,OAAO,QAAA,KAA6B;AAC7E,MAAA,MAAMyB,UAAAA,GAA6B,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,QAAA,EAAS;AACzE,MAAA,OAAO;AAAA,QACL,GAAG,IAAIA,UAAS,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,IAAY,EAAA;AAAA,QAC3B,KAAA,EAAO,mBAAA,CAAoB,KAAA,EAAO,QAAQ,CAAA;AAAA,QAC1C,IAAA,EAAM,oBAAA,CAAqB,KAAA,EAAO,QAAQ;AAAA,OAC5C;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAM,SAAA,GAA6B,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAW;AACjE,IAAA,OAAO;AAAA,MACL,GAAG,IAAI,SAAS,CAAA;AAAA,MAChB,UAAA;AAAA,MACA,KAAA,EAAO,qBAAA,CAAsB,OAAA,EAAS,UAAU,CAAA;AAAA,MAChD,KAAA,EAAO,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AAAA,MAC1C,YAAY,MAAA,CAAO,MAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,UAA6B,KAAA,CAAM,MAAA,IAAU,EAAC,EACjD,GAAA,CAAI,CAAC,CAAA,KAAuB;AAC3B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACnC,IAAA,OAAO,EAAE,GAAG,GAAA,CAAI,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,mBAAA,CAAoB,CAAC,CAAA,EAAE;AAAA,EACpF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAErB,EAAA,MAAM,aAAgC,KAAA,CAAM,SAAA,IAAa,EAAC,EACvD,GAAA,CAAI,CAAC,CAAA,KAAuB;AAC3B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK;AACtC,IAAA,OAAO,EAAE,GAAG,GAAA,CAAI,EAAE,MAAM,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,sBAAA,CAAuB,CAAC,CAAA,EAAE;AAAA,EAC7F,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAErB,EAAA,MAAM,SAA4B,KAAA,CAAM,KAAA,IAAS,EAAC,EAC/C,GAAA,CAAI,CAAC,CAAA,KAAuB;AAC3B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAClC,IAAA,OAAO,EAAE,GAAG,GAAA,CAAI,EAAE,MAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,kBAAA,CAAmB,CAAC,CAAA,EAAE;AAAA,EACjF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAErB,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC1HA,IAAA,iBAAA,GAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;ACUA,IAAM,cAAA,GAAiB,IAAA;AAEhB,SAAS,mBAAA,CAAoB;AAAA,EAClC,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAQG;AACD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIvB,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,QAAA,GAAWK,OAA6C,IAAI,CAAA;AAElE,EAAAD,SAAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,IACrD,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AACA,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,EAAO;AACP,MAAA,KAAK,SAAA,EAAU;AACf,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACnD,IAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB,GAAG,cAAc,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,uBACEN,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA;AAAA,MACA,oBAAA,EAAoB,WAAA;AAAA,MACpB,mBAAiB,UAAA,IAAc,MAAA;AAAA,MAC/B,OAAA,EAAS,WAAA;AAAA,MACT,YAAA,EAAY,UAAA,GAAa,CAAA,0CAAA,EAAU,KAAK,CAAA,CAAA,GAAK,KAAA;AAAA,MAC7C,KAAA,EAAO,aAAa,0FAAA,GAAuB,KAAA;AAAA,MAC3C,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,UAAA,IAAc,eAAe,CAAA;AAAA,MAEvD,uCACCA,GAAAA,CAACa,KAAAA,EAAA,EAAM,WAAU,YAAA,EAAa,WAAA,EAAa,GAAA,EAAK,CAAA,mBAEhDb,GAAAA,CAAC0B,MAAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,aAAa,GAAA,EAAK;AAAA;AAAA,GAErD;AAEJ","file":"index.js","sourcesContent":["/**\n * Studio 页的选中状态。\n * 剧集编辑是\"一集一页\":episode 选中打开集页、scene 选中打开同集并滚到对应场。\n */\n/**\n * Studio 主工作区视图:\n * - script 剧本写作(默认)\n * - review 审片:分镜 / Prompt / 视频对照表\n * - files 项目文件浏览器(不依赖剧集,由 StudioHeader 上的\"文件\"按钮切换)\n *\n * 历史上还有 storyboard / assets / prompt / video 等独立 tab,已合入 review。\n */\nexport type EpisodeWorkspaceView = \"script\" | \"review\" | \"files\";\n\n/**\n * 跨页跳转的来源标记。点击资产详情底部的\"出现在 X 处\"跳到 scene 时带上,\n * 让目标页可以渲染\"返回 XX\"入口并把用户送回原资产。\n */\nexport type StudioSelectionFrom =\n | { kind: \"actor\"; actorId: string }\n | { kind: \"location\"; locationId: string }\n | { kind: \"prop\"; propId: string };\n\n/**\n * selection 变化的驱动源。在 ScriptStream 中用于区分\"该不该触发滚动\":\n * - 'scroll' 来自滚动 spy(视口里出现新 item 自动上抛),收到时 ScriptStream 不再调 scrollToIndex\n * - 'sidebar' / 'diff' / 'reference' / 'chat' / 'init' / 'episode-toggle'\n * 来自人为/外部驱动,需要 ScriptStream 主动滚到目标 item\n *\n * 不打 origin 时按 'sidebar' 等价处理(保守滚动)。\n */\nexport type StudioSelectionOrigin =\n | \"sidebar\"\n | \"scroll\"\n | \"reference\"\n | \"diff\"\n | \"search\"\n | \"chat\"\n | \"init\"\n | \"episode-toggle\";\n\nexport function buildSelectionFrom(\n kind: StudioSelectionFrom[\"kind\"],\n id: string,\n): StudioSelectionFrom | undefined {\n if (!id) return undefined;\n if (kind === \"actor\") return { kind: \"actor\", actorId: id };\n if (kind === \"location\") return { kind: \"location\", locationId: id };\n return { kind: \"prop\", propId: id };\n}\n\nexport function fromToSelection(from: StudioSelectionFrom): StudioSelection {\n if (from.kind === \"actor\") return { kind: \"actor\", actorId: from.actorId };\n if (from.kind === \"location\") return { kind: \"location\", locationId: from.locationId };\n return { kind: \"prop\", propId: from.propId };\n}\n\n/** 公共字段:所有 selection variant 都可携带(origin 防双向联动死循环;from 资产回链)。 */\ntype SelectionMeta = {\n origin?: StudioSelectionOrigin;\n};\ntype SelectionMetaWithFrom = SelectionMeta & {\n from?: StudioSelectionFrom;\n};\n\nexport type StudioSelection =\n | (SelectionMeta & { kind: \"empty\" })\n | (SelectionMeta & { kind: \"worldview\" })\n | (SelectionMetaWithFrom & { kind: \"episode\"; episodeIdx: number })\n | (SelectionMetaWithFrom & {\n kind: \"scene\";\n episodeIdx: number;\n sceneIdx: number;\n })\n | (SelectionMetaWithFrom & {\n kind: \"clip\";\n episodeIdx: number;\n sceneIdx?: number;\n sceneId: string;\n clipId: string;\n })\n | (SelectionMeta & { kind: \"actor\"; actorId: string })\n | (SelectionMeta & { kind: \"location\"; locationId: string })\n | (SelectionMeta & { kind: \"prop\"; propId: string });\n\nexport const EMPTY_SELECTION: StudioSelection = { kind: \"empty\" };\n\n/** 把 selection 复制一份并打上 origin 标记。 */\nexport function withOrigin<T extends StudioSelection>(\n sel: T,\n origin: StudioSelectionOrigin,\n): T {\n return { ...sel, origin };\n}\n\n/**\n * 一个 selection「目标」的稳定字符串 key(忽略 origin / from)。既用于 scroll 同步\n * 去重,也是 isSameSelectionTarget 的唯一判定依据 —— 两者不再各写一套。\n */\nexport function selectionTargetKey(s: StudioSelection): string {\n switch (s.kind) {\n case \"scene\":\n return `scene:${s.episodeIdx}:${s.sceneIdx}`;\n case \"episode\":\n return `episode:${s.episodeIdx}`;\n case \"clip\":\n return `clip:${s.episodeIdx}:${s.sceneId}:${s.clipId}`;\n case \"actor\":\n return `actor:${s.actorId}`;\n case \"location\":\n return `location:${s.locationId}`;\n case \"prop\":\n return `prop:${s.propId}`;\n case \"worldview\":\n return \"worldview\";\n default:\n return \"empty\";\n }\n}\n\n/** 判定两个 selection 是否指向同一个目标(忽略 origin / from)。 */\nexport function isSameSelectionTarget(\n a: StudioSelection,\n b: StudioSelection,\n): boolean {\n return selectionTargetKey(a) === selectionTargetKey(b);\n}\n\nexport function isSceneSelected(\n selection: StudioSelection,\n episodeIdx: number,\n sceneIdx: number,\n): boolean {\n return (\n selection.kind === \"scene\" &&\n selection.episodeIdx === episodeIdx &&\n selection.sceneIdx === sceneIdx\n );\n}\n\nexport function isClipSelected(\n selection: StudioSelection,\n episodeIdx: number,\n sceneId: string,\n clipId: string,\n): boolean {\n return (\n selection.kind === \"clip\" &&\n selection.episodeIdx === episodeIdx &&\n selection.sceneId === sceneId &&\n selection.clipId === clipId\n );\n}\n\nexport function getSelectionEpisodeIdx(selection: StudioSelection): number | null {\n if (selection.kind === \"episode\") return selection.episodeIdx;\n if (selection.kind === \"scene\") return selection.episodeIdx;\n if (selection.kind === \"clip\") return selection.episodeIdx;\n return null;\n}\n\n/** 该剧集当前是否处于\"打开\"状态(集页或集内某场被选中)。 */\nexport function isEpisodeOpen(\n selection: StudioSelection,\n episodeIdx: number,\n): boolean {\n if (selection.kind === \"episode\") return selection.episodeIdx === episodeIdx;\n if (selection.kind === \"scene\") return selection.episodeIdx === episodeIdx;\n if (selection.kind === \"clip\") return selection.episodeIdx === episodeIdx;\n return false;\n}\n","export enum ScriptContentType {\n Action = \"action\",\n Dialogue = \"dialogue\",\n Narration = \"narration\",\n InnerThought = \"inner_thought\",\n}\n\nexport interface SceneEnvironment {\n space?: \"exterior\" | \"interior\" | string;\n time?: \"day\" | \"night\" | \"dawn\" | \"dusk\" | string;\n}\n\nexport interface ScriptItem {\n type?: ScriptContentType | string;\n content?: string;\n actor_id?: string;\n speaker_id?: string;\n speakers?: Array<{ speaker_id?: string }>;\n delivery?: \"single\" | \"simultaneous\" | \"overlap\" | \"group\" | string;\n lines?: Array<{ speaker_id?: string; content?: string }>;\n emotion?: string;\n state_changes?: StateChange[];\n transition_prompt?: TransitionPrompt;\n}\n\nexport interface AssetState {\n state_id?: string;\n state_name?: string;\n name?: string;\n description?: string;\n}\n\nexport type ScriptTargetKind = \"actor\" | \"location\" | \"prop\";\n\nexport interface StateChange {\n target_kind?: ScriptTargetKind | string;\n target_id?: string;\n from_state_id?: string | null;\n to_state_id?: string | null;\n effective_from?: \"before_action\" | \"after_action\" | string;\n}\n\nexport interface TransitionPrompt {\n target_kind?: ScriptTargetKind | string;\n target_id?: string;\n process?: string;\n contrast?: string;\n}\n\nexport interface SceneContext {\n actors?: Array<{ actor_id?: string; state_id?: string | null }>;\n locations?: Array<{ location_id?: string; state_id?: string | null }>;\n props?: Array<{ prop_id?: string; state_id?: string | null }>;\n}\n\nexport interface Scene {\n scene_id?: string;\n environment?: SceneEnvironment;\n location_ids?: string[];\n context?: SceneContext;\n actors?: Array<{ actor_id?: string; state_id?: string | null }>;\n locations?: Array<{ location_id?: string; state_id?: string | null }>;\n props?: Array<{ prop_id?: string; state_id?: string | null }>;\n actions?: ScriptItem[];\n}\n\nexport interface ScriptActor {\n actor_id?: string;\n actor_name?: string;\n name?: string;\n description?: string;\n states?: AssetState[];\n}\n\nexport interface ScriptLocation {\n location_id?: string;\n location_name?: string;\n name?: string;\n description?: string;\n states?: AssetState[];\n}\n\nexport interface ScriptProp {\n prop_id?: string;\n prop_name?: string;\n name?: string;\n description?: string;\n states?: AssetState[];\n}\n\nexport interface ScriptEpisode {\n episode_id?: string;\n title?: string | null;\n scenes?: Scene[];\n}\n\nexport interface ScriptSpeaker {\n speaker_id?: string;\n display_name?: string;\n source_kind?: \"actor\" | \"location\" | \"prop\" | \"system\" | \"broadcast\" | \"group\" | \"other\" | string;\n source_id?: string | null;\n voice_desc?: string;\n}\n\nexport interface ScriptProject {\n version?: number | string;\n title?: string;\n worldview?: string;\n worldview_raw?: string;\n style?: string;\n actors?: ScriptActor[];\n locations?: ScriptLocation[];\n props?: ScriptProp[];\n speakers?: ScriptSpeaker[];\n episodes?: ScriptEpisode[];\n}\n\nexport type ScriptData = ScriptProject;\n","// script.json 里的 emotion 实际上是自由文本标签,不是固定枚举。\n// 这里保留一个高频标签翻译表,未命中时回退原文。\nconst EMOTION_LABELS: Record<string, string> = {\n \"v.o.\": \"画外音\",\n absorbed: \"专注投入\",\n accusing: \"指责\",\n aggressive: \"咄咄逼人\",\n agonized: \"痛苦\",\n alarmed: \"警觉\",\n alert: \"警惕\",\n amused: \"玩味\",\n analytical: \"冷静分析\",\n anguished: \"悲痛\",\n appalled: \"骇然\",\n authoritative: \"权威\",\n awed: \"敬畏\",\n awestruck: \"震撼\",\n \"battle-ready\": \"临战\",\n begging: \"哀求\",\n bewildered: \"茫然\",\n bitter: \"怨恨\",\n boastful: \"得意\",\n broken: \"崩溃\",\n brutal: \"凶狠\",\n calculating: \"算计\",\n calm: \"冷静\",\n casual: \"随意\",\n cautious: \"谨慎\",\n chanting: \"齐声高呼\",\n choking: \"哽咽\",\n chuckling: \"低笑\",\n cold: \"冷淡\",\n commanding: \"命令式\",\n confident: \"自信\",\n confused: \"困惑\",\n contemptuous: \"轻蔑\",\n crazed: \"癫狂\",\n cruel: \"残酷\",\n crying: \"哭泣\",\n \"crying out\": \"失声喊叫\",\n \"crying softly\": \"轻声啜泣\",\n curious: \"好奇\",\n \"darkly amused\": \"阴冷玩味\",\n deadly: \"致命狠厉\",\n decisive: \"果决\",\n deductive: \"推理式\",\n defeated: \"挫败\",\n defensive: \"戒备\",\n defiant: \"不服输\",\n deliberate: \"沉着\",\n desperate: \"绝望\",\n determined: \"坚定\",\n disbelief: \"难以置信\",\n disbelieving: \"不敢相信\",\n disgusted: \"厌恶\",\n dismissive: \"不屑\",\n disturbed: \"不安\",\n drowsy: \"困倦\",\n ecstatic: \"狂喜\",\n enraged: \"暴怒\",\n excited: \"激动\",\n exhausted: \"疲惫\",\n fierce: \"凌厉\",\n firm: \"坚决\",\n flashback: \"回忆中\",\n focused: \"专注\",\n frantic: \"慌乱\",\n frightened: \"惊惧\",\n furious: \"愤怒\",\n gasping: \"喘息\",\n gleeful: \"得意洋洋\",\n grandstanding: \"作秀式\",\n grave: \"凝重\",\n grim: \"冷峻\",\n grinning: \"咧嘴而笑\",\n hoarse: \"沙哑\",\n hopeful: \"怀有希望\",\n hopeless: \"绝望无助\",\n horrified: \"惊骇\",\n hysterical: \"歇斯底里\",\n \"ice-cold\": \"冰冷\",\n iconic: \"标志性姿态\",\n incredulous: \"难以置信\",\n inspired: \"受到鼓舞\",\n intense: \"强烈\",\n lazy: \"懒散\",\n low: \"低声\",\n maniacal: \"疯狂\",\n manic: \"癫狂亢奋\",\n measured: \"克制\",\n menacing: \"阴狠\",\n merciless: \"毫不留情\",\n mocking: \"嘲讽\",\n murderous: \"杀气腾腾\",\n nervous: \"紧张\",\n ominous: \"不祥\",\n outraged: \"愤慨\",\n panicked: \"惊慌\",\n piercing: \"尖锐\",\n pleading: \"恳求\",\n pleased: \"满意\",\n precise: \"精准克制\",\n predatory: \"猎食者般\",\n probing: \"试探\",\n protective: \"保护欲强\",\n quiet: \"轻声\",\n realizing: \"恍然意识到\",\n \"recorded video\": \"录像中\",\n relieved: \"如释重负\",\n resolute: \"决然\",\n respectful: \"恭敬\",\n roaring: \"怒吼\",\n savage: \"凶残\",\n savoring: \"回味般\",\n scheming: \"算计\",\n screaming: \"尖叫\",\n seething: \"怒火翻涌\",\n serious: \"严肃\",\n shaking: \"发抖\",\n sharp: \"凌厉\",\n shocked: \"震惊\",\n shouting: \"大喊\",\n shoving: \"推搡中\",\n shrieking: \"尖声惊叫\",\n smiling: \"微笑\",\n smirking: \"冷笑\",\n smug: \"自鸣得意\",\n sobbing: \"抽泣\",\n \"sobbing uncontrollably\": \"泣不成声\",\n spiteful: \"恶意\",\n steady: \"沉稳\",\n steely: \"冷硬\",\n strained: \"紧绷\",\n stunned: \"怔住\",\n suffocating: \"窒息般\",\n suspicious: \"怀疑\",\n taunting: \"挑衅\",\n tense: \"紧绷\",\n terrified: \"惊恐\",\n threatening: \"威胁\",\n thrilled: \"兴奋不已\",\n thunderous: \"如雷般\",\n trembling: \"发颤\",\n triumphant: \"得胜\",\n \"to himself\": \"自言自语\",\n \"turning to mia\": \"转向 Mia\",\n uneasy: \"不安\",\n unflinching: \"毫不退缩\",\n unhinged: \"失控\",\n urgent: \"急切\",\n venomous: \"恶毒\",\n vicious: \"凶狠\",\n \"video recording\": \"视频记录中\",\n vindicated: \"扬眉吐气\",\n voiceover: \"旁白\",\n weak: \"虚弱\",\n whisper: \"低声\",\n whispering: \"耳语\",\n worried: \"担忧\",\n};\n\nexport function translateEmotionLabel(emotion?: string) {\n const normalized = emotion?.trim().toLowerCase();\n if (!normalized) return \"\";\n if (EMOTION_LABELS[normalized]) {\n return EMOTION_LABELS[normalized];\n }\n\n if (normalized.includes(\",\")) {\n return normalized\n .split(\",\")\n .map((part) => {\n const token = part.trim();\n return EMOTION_LABELS[token] || part.trim();\n })\n .join(\",\");\n }\n\n return emotion!.trim();\n}\n","import {\n ScriptContentType,\n type AssetState,\n type Scene,\n type ScriptActor,\n type ScriptEpisode,\n type ScriptItem,\n type ScriptLocation,\n type ScriptProp,\n type ScriptProject,\n type ScriptSpeaker,\n} from \"./types\";\nimport { translateEmotionLabel } from \"./emotion-labels\";\n\nexport { translateEmotionLabel };\n\nfunction normalizeId(value?: string | null) {\n return value?.trim() || \"\";\n}\n\nexport function getActorMap(actors: ScriptActor[] = []) {\n return new Map(actors.map((actor) => [normalizeId(actor.actor_id), actor]));\n}\n\nexport function getLocationMap(locations: ScriptLocation[] = []) {\n return new Map(locations.map((location) => [normalizeId(location.location_id), location]));\n}\n\nexport function getPropMap(props: ScriptProp[] = []) {\n return new Map(props.map((prop) => [normalizeId(prop.prop_id), prop]));\n}\n\nexport function getSpeakerMap(speakers: ScriptSpeaker[] = []) {\n return new Map(speakers.map((speaker) => [normalizeId(speaker.speaker_id), speaker]));\n}\n\nexport function getActorDisplayName(actor?: ScriptActor) {\n return actor?.actor_name?.trim() || actor?.name?.trim() || \"未命名角色\";\n}\n\nexport function getLocationDisplayName(location?: ScriptLocation) {\n return location?.location_name?.trim() || location?.name?.trim() || \"未命名场景\";\n}\n\nexport function getPropDisplayName(prop?: ScriptProp) {\n return prop?.prop_name?.trim() || prop?.name?.trim() || \"未命名道具\";\n}\n\nexport function getStateDisplayName(state?: AssetState) {\n return state?.state_name?.trim() || state?.name?.trim() || state?.state_id?.trim() || \"\";\n}\n\n/**\n * Reconcile the dual context storage. The refs live in BOTH scene.context.*\n * and the legacy mirror scene.* — prefer whichever has entries so an EMPTY\n * `context.actors: []` (e.g. from a partial upstream payload) does NOT shadow a\n * populated mirror (which would silently drop the scene's cast/props).\n */\nexport function getSceneContext(scene: Scene) {\n return {\n actors: (scene.context?.actors?.length ? scene.context.actors : scene.actors) ?? [],\n locations: (scene.context?.locations?.length ? scene.context.locations : scene.locations) ?? [],\n props: (scene.context?.props?.length ? scene.context.props : scene.props) ?? [],\n };\n}\n\nexport function findState(states: AssetState[] | undefined, stateId: string | null | undefined): AssetState | undefined {\n const id = stateId?.trim();\n if (!id || !states) return undefined;\n return states.find((state) => (state.state_id || \"\").trim() === id);\n}\n\nconst ZH_DIGIT_MAP: Record<string, number> = {\n \"零\": 0, \"〇\": 0, \"一\": 1, \"二\": 2, \"两\": 2, \"三\": 3, \"四\": 4,\n \"五\": 5, \"六\": 6, \"七\": 7, \"八\": 8, \"九\": 9,\n};\n\nfunction normalizeFullwidthDigits(value: string) {\n let result = \"\";\n for (const char of value) {\n const code = char.charCodeAt(0);\n result += code >= 0xFF10 && code <= 0xFF19 ? String.fromCharCode(code - 0xFF10 + 48) : char;\n }\n return result;\n}\n\nfunction parseChineseNumeral(value: string): number | null {\n const text = value.trim();\n if (!text) return null;\n if (text === \"十\") return 10;\n if (text.startsWith(\"十\")) return 10 + (ZH_DIGIT_MAP[text.slice(1)] ?? 0);\n if (text.endsWith(\"十\")) return (ZH_DIGIT_MAP[text.slice(0, -1)] ?? 0) * 10;\n if (text.includes(\"百\")) {\n const [left, right] = text.split(\"百\");\n const leftValue = ZH_DIGIT_MAP[left] ?? 0;\n return leftValue * 100 + (parseChineseNumeral(right) ?? 0);\n }\n if (text.includes(\"十\")) {\n const [left, right] = text.split(\"十\");\n return (ZH_DIGIT_MAP[left] ?? 0) * 10 + (right ? (ZH_DIGIT_MAP[right] ?? 0) : 0);\n }\n return ZH_DIGIT_MAP[text] ?? null;\n}\n\nfunction parseEpisodeMarker(rawDigits: string): number | null {\n const normalized = normalizeFullwidthDigits(rawDigits.trim());\n if (!normalized) return null;\n if (/^\\d+$/.test(normalized)) {\n const parsed = Number(normalized);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n }\n const chinese = parseChineseNumeral(normalized);\n return chinese && chinese > 0 ? chinese : null;\n}\n\nconst EPISODE_DIGIT_CHARS = \"0-90-9一二三四五六七八九十百千零〇两\";\nconst EPISODE_MARKER_RE = new RegExp(\n `(?:第\\\\s*([${EPISODE_DIGIT_CHARS}]+)\\\\s*集|(?:ep|episode)[_\\\\-#:. ]*([${EPISODE_DIGIT_CHARS}]+))`,\n \"i\",\n);\n\nexport function getEpisodeNumber(episode: ScriptEpisode, index: number) {\n const candidates = [episode.episode_id, episode.title];\n for (const candidate of candidates) {\n const value = candidate?.trim();\n if (!value) continue;\n const marker = value.match(EPISODE_MARKER_RE);\n if (marker) {\n const parsed = parseEpisodeMarker(marker[1] || marker[2] || \"\");\n if (parsed) return parsed;\n }\n const digitsOnly = normalizeFullwidthDigits(value);\n const plain = digitsOnly.match(/\\d+/);\n if (plain) {\n const parsed = Number(plain[0]);\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n }\n }\n return index + 1;\n}\n\nexport function getEpisodeNumberLabel(episode: ScriptEpisode, index: number) {\n return String(getEpisodeNumber(episode, index)).padStart(2, \"0\");\n}\n\nexport function getEpisodeTitle(episode: ScriptEpisode, index: number) {\n const fallback = `第 ${getEpisodeNumberLabel(episode, index)} 集`;\n const title = episode.title?.trim();\n if (title) return title;\n // only surface a human-looking episode_id; never the internal \"ep_xxx\" id\n const id = episode.episode_id?.trim();\n if (id && !/^ep_/i.test(id)) return id;\n return fallback;\n}\n\n/**\n * The scene's display number. Prefers the trailing digits of scene_id (the\n * stable, never-renumbered id assets are keyed by — e.g. \"scn_007\" → 7) and\n * falls back to the 1-based position. ONE definition so every surface (scene\n * header / TOC / reference grid / distribution) shows the same number.\n */\nexport function getSceneNumber(scene: Scene | undefined, sceneIndex: number): number {\n const m = scene?.scene_id?.trim().match(/(\\d+)$/);\n if (m) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n > 0) return n;\n }\n return sceneIndex + 1;\n}\n\nexport function getSceneNumberLabel(scene: Scene | undefined, sceneIndex: number) {\n return `场 ${getSceneNumber(scene, sceneIndex)}`;\n}\n\nexport function getSceneSidebarLabel(scene: Scene, sceneIndex: number) {\n const sceneId = scene.scene_id?.trim() || String(sceneIndex + 1);\n const space = scene.environment?.space === \"exterior\" ? \"外\" : \"内\";\n const timeKey = scene.environment?.time || \"day\";\n const timeMap: Record<string, string> = { day: \"日\", night: \"夜\", dawn: \"晨\", dusk: \"昏\" };\n const time = timeMap[timeKey] || timeKey;\n return `${sceneId} · ${time}${space}`;\n}\n\nexport function isActorBearingContentType(type?: string) {\n return type === ScriptContentType.Dialogue || type === ScriptContentType.InnerThought;\n}\n\nexport function getSpeakerDisplayName(\n speakerId: string | undefined,\n speakerMap: Map<string, ScriptSpeaker> = new Map(),\n actorMap: Map<string, ScriptActor> = new Map(),\n) {\n const id = normalizeId(speakerId);\n if (!id) return \"\";\n const speaker = speakerMap.get(id);\n if (speaker?.display_name?.trim()) return speaker.display_name.trim();\n const sourceKind = speaker?.source_kind?.trim();\n const sourceId = normalizeId(speaker?.source_id);\n if (sourceKind === \"actor\" && sourceId) {\n return getActorDisplayName(actorMap.get(sourceId)) || sourceId;\n }\n const actorId = id.startsWith(\"spk_\") ? id.slice(4) : \"\";\n if (actorId && actorMap.has(actorId)) return getActorDisplayName(actorMap.get(actorId));\n return id;\n}\n\nexport function getDialogueSpeakerLabel(\n item: ScriptItem,\n actorMap: Map<string, ScriptActor>,\n speakerMap: Map<string, ScriptSpeaker> = new Map(),\n) {\n if (item.delivery === \"overlap\" && Array.isArray(item.lines) && item.lines.length > 0) {\n return item.lines\n .map((line) => getSpeakerDisplayName(line.speaker_id, speakerMap, actorMap))\n .filter(Boolean)\n .join(\" / \");\n }\n const speakerIds = Array.isArray(item.speakers)\n ? item.speakers.map((speaker) => normalizeId(speaker.speaker_id)).filter(Boolean)\n : [];\n if (speakerIds.length > 0) {\n return speakerIds.map((speakerId) => getSpeakerDisplayName(speakerId, speakerMap, actorMap)).join(\" / \");\n }\n if (item.speaker_id) return getSpeakerDisplayName(item.speaker_id, speakerMap, actorMap);\n const actorId = normalizeId(item.actor_id);\n const actor = actorMap.get(actorId);\n return actor ? getActorDisplayName(actor) : actorId || \"未知角色\";\n}\n\nexport function getDialogueDeliveryLabel(delivery?: string) {\n if (delivery === \"simultaneous\") return \"同时\";\n if (delivery === \"overlap\") return \"重叠\";\n if (delivery === \"group\") return \"群体\";\n return \"\";\n}\n","/** Tiny classnames joiner (no dependency). Falsy entries are dropped. */\nexport function cn(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(\" \");\n}\n","/**\n * StudioToc — left navigation, reproducing agent-frontend's flat TOC:\n * 剧集 (episodes → scenes, level 2) ·\n * 角色 / 场景 / 道具 (entity groups, level 1)\n * (世界观 & 风格 moved to a top-bar button + dialog — no longer a TOC row.)\n * Group headers are 12.5px semibold foreground (NOT uppercase gray). Selecting\n * a row emits a StudioSelection (origin \"sidebar\").\n */\nimport { useState } from \"react\";\nimport {\n BookText,\n ChevronRight,\n FileText,\n MapPin,\n Package,\n Plus,\n Trash2,\n Users,\n type LucideIcon,\n} from \"lucide-react\";\nimport type { ScriptProject } from \"../types.js\";\nimport {\n getActorDisplayName,\n getEpisodeNumberLabel,\n getEpisodeTitle,\n getLocationDisplayName,\n getPropDisplayName,\n getSceneNumberLabel,\n getSceneSidebarLabel,\n} from \"../utils.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { withOrigin } from \"../selection.js\";\nimport { cn } from \"../cn.js\";\n\nfunction GroupHeader({\n icon: Icon,\n label,\n count,\n open,\n highlighted,\n onToggle,\n}: {\n icon: LucideIcon;\n label: string;\n count?: number;\n open?: boolean;\n highlighted?: boolean;\n onToggle?: () => void;\n}) {\n const inner = (\n <>\n {onToggle ? (\n <ChevronRight\n className={cn(\"lj-se-gh-chev\", open && \"is-open\")}\n strokeWidth={2}\n />\n ) : null}\n <Icon className=\"lj-se-gh-icon\" strokeWidth={1.5} />\n <span className=\"lj-se-gh-label\">{label}</span>\n {count != null ? <span className=\"lj-se-gh-count\">{count}</span> : null}\n </>\n );\n return onToggle ? (\n <button type=\"button\" className={cn(\"lj-se-gh\", highlighted && \"is-hl\")} onClick={onToggle}>\n {inner}\n </button>\n ) : (\n <div className={cn(\"lj-se-gh\", highlighted && \"is-hl\")}>{inner}</div>\n );\n}\n\nexport function StudioToc({\n data,\n selection,\n onSelect,\n onAddEpisode,\n}: {\n data: ScriptProject;\n selection: StudioSelection;\n onSelect: (selection: StudioSelection) => void;\n onAddEpisode?: () => void;\n}) {\n const episodes = data.episodes ?? [];\n const [episodesOpen, setEpisodesOpen] = useState(true);\n const [openEpisodes, setOpenEpisodes] = useState<Set<number>>(() => {\n const init = new Set<number>();\n if (selection.kind === \"scene\" || selection.kind === \"episode\") init.add(selection.episodeIdx);\n else init.add(0);\n return init;\n });\n const toggleEp = (i: number) =>\n setOpenEpisodes((prev) => {\n const next = new Set(prev);\n next.has(i) ? next.delete(i) : next.add(i);\n return next;\n });\n const pick = (sel: StudioSelection) => onSelect(withOrigin(sel, \"sidebar\"));\n\n const epHighlighted = selection.kind === \"episode\" || selection.kind === \"scene\" || selection.kind === \"clip\";\n\n return (\n <nav className=\"lj-se-toc\">\n {/* 世界观 & 风格 现已移至顶栏按钮 + 弹窗,不再作为目录项。 */}\n {/* 剧集 */}\n <GroupHeader\n icon={BookText}\n label=\"剧集\"\n count={episodes.length}\n open={episodesOpen}\n highlighted={epHighlighted}\n onToggle={() => setEpisodesOpen((v) => !v)}\n />\n {episodesOpen ? (\n episodes.length === 0 ? (\n <div className=\"lj-se-toc-empty\">尚无剧集</div>\n ) : (\n episodes.map((episode, ei) => {\n const scenes = episode.scenes ?? [];\n const epOpen = openEpisodes.has(ei);\n const epActive = selection.kind === \"episode\" && selection.episodeIdx === ei;\n return (\n <div key={`ep-${ei}`}>\n <div className={cn(\"lj-se-eprow\", epActive && \"is-active\")}>\n <button type=\"button\" className=\"lj-se-eprow-chev\" onClick={() => toggleEp(ei)} aria-label=\"展开/收起\">\n <ChevronRight className={cn(\"lj-se-ic-3\", epOpen && \"is-open\")} strokeWidth={2} />\n </button>\n <button type=\"button\" className=\"lj-se-eprow-main\" onClick={() => pick({ kind: \"episode\", episodeIdx: ei })}>\n <FileText className=\"lj-se-ic-3 lj-se-eprow-glyph\" strokeWidth={1.5} />\n <span className=\"lj-se-eprow-num\">{getEpisodeNumberLabel(episode, ei)}</span>\n <span className=\"lj-se-eprow-title\">{getEpisodeTitle(episode, ei)}</span>\n <span className=\"lj-se-eprow-count\">{scenes.length} 场</span>\n </button>\n </div>\n {epOpen\n ? scenes.map((scene, si) => {\n const active =\n selection.kind === \"scene\" && selection.episodeIdx === ei && selection.sceneIdx === si;\n return (\n <button\n key={`sc-${si}`}\n type=\"button\"\n className={cn(\"lj-se-tocitem lj-se-toc-l2\", active && \"is-active\")}\n onClick={() => pick({ kind: \"scene\", episodeIdx: ei, sceneIdx: si })}\n >\n <span className=\"lj-se-toc-dot\">·</span>\n <span className=\"lj-se-tocitem-label\">{getSceneNumberLabel(scene, si)}</span>\n <span className=\"lj-se-tocitem-meta\">{getSceneSidebarLabel(scene, si)}</span>\n </button>\n );\n })\n : null}\n </div>\n );\n })\n )\n ) : null}\n {episodesOpen && onAddEpisode ? (\n <button type=\"button\" className=\"lj-se-toc-addep\" onClick={onAddEpisode}>\n <Plus className=\"lj-se-ic-3\" strokeWidth={2} /> 新增一集\n </button>\n ) : null}\n\n <EntityGroup\n icon={Users}\n label=\"角色\"\n emptyText=\"尚无角色\"\n items={(data.actors ?? []).map((a) => ({ id: (a.actor_id ?? \"\").trim(), name: getActorDisplayName(a) }))}\n highlighted={selection.kind === \"actor\"}\n isActive={(id) => selection.kind === \"actor\" && selection.actorId === id}\n onPick={(id) => pick({ kind: \"actor\", actorId: id })}\n />\n <EntityGroup\n icon={MapPin}\n label=\"场景\"\n emptyText=\"尚无场景\"\n items={(data.locations ?? []).map((l) => ({ id: (l.location_id ?? \"\").trim(), name: getLocationDisplayName(l) }))}\n highlighted={selection.kind === \"location\"}\n isActive={(id) => selection.kind === \"location\" && selection.locationId === id}\n onPick={(id) => pick({ kind: \"location\", locationId: id })}\n />\n <EntityGroup\n icon={Package}\n label=\"道具\"\n emptyText=\"尚无道具\"\n items={(data.props ?? []).map((p) => ({ id: (p.prop_id ?? \"\").trim(), name: getPropDisplayName(p) }))}\n highlighted={selection.kind === \"prop\"}\n isActive={(id) => selection.kind === \"prop\" && selection.propId === id}\n onPick={(id) => pick({ kind: \"prop\", propId: id })}\n />\n </nav>\n );\n}\n\nfunction EntityGroup({\n icon: Icon,\n label,\n emptyText,\n items,\n highlighted,\n isActive,\n onPick,\n}: {\n icon: LucideIcon;\n label: string;\n emptyText: string;\n items: Array<{ id: string; name: string }>;\n highlighted: boolean;\n isActive: (id: string) => boolean;\n onPick: (id: string) => void;\n}) {\n const [open, setOpen] = useState(true);\n const valid = items.filter((i) => i.id);\n return (\n <>\n <GroupHeader icon={Icon} label={label} count={valid.length} open={open} highlighted={highlighted} onToggle={() => setOpen((v) => !v)} />\n {open\n ? valid.length === 0\n ? <div className=\"lj-se-toc-empty\">{emptyText}</div>\n : valid.map((i) => (\n <button\n key={i.id}\n type=\"button\"\n className={cn(\"lj-se-tocitem lj-se-toc-l1\", isActive(i.id) && \"is-active\")}\n onClick={() => onPick(i.id)}\n >\n <Icon className=\"lj-se-tocitem-icon lj-se-ic-3\" strokeWidth={1.5} />\n <span className=\"lj-se-tocitem-label\">{i.name}</span>\n </button>\n ))\n : null}\n </>\n );\n}\n","import { createContext, useContext, type ReactElement, type ReactNode } from \"react\";\n\nexport const HighlightContext = createContext<string>(\"\");\n\nexport function HighlightedText({ text }: { text: string }): ReactElement {\n const highlight = useContext(HighlightContext);\n return <>{renderHighlightedText(text, highlight)}</>;\n}\n\nexport function renderHighlightedText(value: string, query: string): ReactNode {\n const needle = query.trim();\n if (!needle) return value;\n const lowerValue = value.toLocaleLowerCase();\n const lowerNeedle = needle.toLocaleLowerCase();\n const out: ReactNode[] = [];\n let from = 0;\n let hit = lowerValue.indexOf(lowerNeedle);\n while (hit >= 0) {\n if (hit > from) out.push(value.slice(from, hit));\n out.push(\n <mark key={`${hit}-${out.length}`} className=\"lj-se-search-hit\">\n {value.slice(hit, hit + needle.length)}\n </mark>,\n );\n from = hit + needle.length;\n hit = lowerValue.indexOf(lowerNeedle, from);\n }\n if (from < value.length) out.push(value.slice(from));\n return out.length > 0 ? out : value;\n}\n","/**\n * EditableText — the \"editor feel\" primitive.\n *\n * Default (display) mode renders the value as PLAIN TEXT (a <span>), so the\n * browser's native text selection spans across adjacent blocks → you can select\n * and copy text across multiple lines. Only on a plain click (not a drag-select)\n * does the block become a focused <textarea>/<input>, with the caret dropped at\n * the click point. While typing, the draft is pushed up via a debounced live\n * commit (so the host's autosave starts ticking without waiting for blur);\n * blur / Enter (single-line) / Cmd-Enter (multiline) flush immediately. Esc\n * reverts. `autoEdit` starts in edit mode (freshly inserted rows).\n *\n * This replaces agent-frontend's always-rendered textarea (which blocked\n * cross-block selection).\n */\nimport { createContext, useContext, useEffect, useLayoutEffect, useRef, useState, type ReactElement } from \"react\";\nimport { HighlightContext, renderHighlightedText } from \"./highlighted-text.js\";\n\n/**\n * Lets the editor signal \"an editor is open\" WITHOUT the host sniffing internal\n * CSS class names. ScriptEditor provides it and ref-counts active editors;\n * every EditableText inc/decrements while in edit mode. Null (no provider) →\n * no-op, so the primitive still works standalone.\n */\nexport interface EditingSignal {\n inc: () => void;\n dec: () => void;\n}\nexport const EditingSignalContext = createContext<EditingSignal | null>(null);\n\n/** debounce window for pushing the in-progress draft up while still editing —\n * long enough to coalesce a burst of keystrokes into one re-render, short\n * enough that autosave feels live. Blur/Enter still flush immediately. */\nconst LIVE_COMMIT_MS = 400;\n\nexport interface EditableTextProps {\n value: string;\n onSave: (next: string) => void;\n placeholder?: string;\n /** multiline → <textarea> (auto-grow); else single-line <input>. */\n multiline?: boolean;\n disabled?: boolean;\n className?: string;\n /** start in edit mode + focus (for newly inserted rows) */\n autoEdit?: boolean;\n /** fires whenever edit mode is left (commit OR cancel) — lets the parent\n * clear a one-shot autoEdit flag so a later row reshuffle can't re-trigger it. */\n onEditEnd?: () => void;\n /** forwarded to the display span (e.g. data-quote-target) */\n spanProps?: React.HTMLAttributes<HTMLSpanElement>;\n}\n\nfunction caretOffsetFromPoint(x: number, y: number): number | null {\n const d = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n caretPositionFromPoint?: (x: number, y: number) => { offset: number } | null;\n };\n if (typeof d.caretRangeFromPoint === \"function\") {\n const r = d.caretRangeFromPoint(x, y);\n return r ? r.startOffset : null;\n }\n if (typeof d.caretPositionFromPoint === \"function\") {\n const p = d.caretPositionFromPoint(x, y);\n return p ? p.offset : null;\n }\n return null;\n}\n\nexport function EditableText({\n value,\n onSave,\n placeholder,\n multiline = false,\n disabled = false,\n className,\n autoEdit = false,\n onEditEnd,\n spanProps,\n}: EditableTextProps): ReactElement {\n const [editing, setEditing] = useState(autoEdit);\n const [draft, setDraft] = useState(value);\n const caretRef = useRef<number | null>(null);\n const inputRef = useRef<HTMLTextAreaElement & HTMLInputElement>(null);\n const committedRef = useRef(value);\n const editingSignal = useContext(EditingSignalContext);\n const highlight = useContext(HighlightContext);\n\n // ── debounced live commit ───────────────────────────────────────────────\n // Push the draft up while typing (debounced) so the host's autosave starts\n // ticking without waiting for blur. Read the latest draft / onSave from\n // refs so the timer callback never closes over stale values, and never fire\n // mid-IME-composition (Chinese/Japanese) — wait for compositionend.\n const liveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const composingRef = useRef(false);\n const draftRef = useRef(value);\n const onSaveRef = useRef(onSave);\n onSaveRef.current = onSave;\n\n const clearLiveTimer = () => {\n if (liveTimerRef.current) {\n clearTimeout(liveTimerRef.current);\n liveTimerRef.current = null;\n }\n };\n const flushLive = () => {\n clearLiveTimer();\n const next = draftRef.current;\n if (next !== committedRef.current) {\n committedRef.current = next;\n onSaveRef.current(next);\n }\n };\n const scheduleLive = () => {\n clearLiveTimer();\n liveTimerRef.current = setTimeout(() => {\n liveTimerRef.current = null;\n if (composingRef.current) return; // a later compositionend reschedules\n flushLive();\n }, LIVE_COMMIT_MS);\n };\n\n // flush any pending live edit on unmount so navigating away / scrolling the\n // row out mid-edit doesn't drop the last typed-but-not-yet-committed change.\n useEffect(() => () => flushLive(), []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // While this field is in edit mode, mark the editor as \"being edited\" so the\n // host can pause adopting external (AI) revisions. Decrements on exit/unmount.\n useEffect(() => {\n if (!editing || !editingSignal) return;\n editingSignal.inc();\n return () => editingSignal.dec();\n }, [editing, editingSignal]);\n\n // Keep the commit baseline in sync with external `value` — even WHILE editing.\n // - not editing, or editing-but-untouched (draft === baseline): adopt the new\n // value outright (e.g. an AI revision landed) so stale text isn't committed\n // over it.\n // - editing AND the user has typed (genuine concurrent edit): keep BOTH their\n // draft and the original baseline. We deliberately do NOT advance the\n // baseline to the external value here: doing so used to make a commit whose\n // draft happened to equal the external value silently skip onSave (losing\n // the user's edit). Leaving the baseline put guarantees the user's edit\n // always commits (last-writer-wins, recorded in undo/diff/autosave) instead\n // of being dropped. A true 3-way merge / conflict prompt is deferred to v2.\n useEffect(() => {\n if (value === committedRef.current) return;\n const userDiverged = editing && draft !== committedRef.current;\n if (userDiverged) return;\n setDraft(value);\n committedRef.current = value;\n }, [value, editing, draft]);\n\n // enter edit mode when autoEdit flips true (freshly inserted row), so the\n // editor opens even if the prop changes after mount.\n useEffect(() => {\n if (autoEdit) setEditing(true);\n }, [autoEdit]);\n\n // focus + place caret + autosize when entering edit mode\n useLayoutEffect(() => {\n if (!editing) return;\n const el = inputRef.current;\n if (!el) return;\n if (multiline) autoSize(el);\n el.focus();\n const caret = caretRef.current;\n const pos = caret == null ? el.value.length : Math.min(caret, el.value.length);\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* input type may not support selection range */\n }\n caretRef.current = null;\n }, [editing, multiline]);\n\n function beginEdit(e: React.MouseEvent) {\n if (disabled) return;\n // don't hijack a drag-select: only enter edit on a collapsed selection\n const sel = window.getSelection();\n if (sel && !sel.isCollapsed) return;\n caretRef.current = caretOffsetFromPoint(e.clientX, e.clientY);\n setDraft(committedRef.current);\n draftRef.current = committedRef.current;\n setEditing(true);\n }\n\n function commit() {\n clearLiveTimer();\n setEditing(false);\n onEditEnd?.();\n if (draft !== committedRef.current) {\n committedRef.current = draft;\n onSave(draft);\n }\n }\n function cancel() {\n clearLiveTimer();\n setDraft(committedRef.current);\n draftRef.current = committedRef.current;\n setEditing(false);\n onEditEnd?.();\n }\n\n if (!editing) {\n const content = value\n ? renderHighlightedText(value, highlight)\n : <span className=\"lj-se-ph\">{placeholder ?? \"\"}</span>;\n return (\n <span\n {...spanProps}\n className={\"lj-se-editable\" + (className ? \" \" + className : \"\") + (disabled ? \" lj-se-editable--ro\" : \"\")}\n onClick={beginEdit}\n >\n {content}\n </span>\n );\n }\n\n const common = {\n ref: inputRef as never,\n value: draft,\n className: \"lj-se-editing\" + (className ? \" \" + className : \"\"),\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n const v = e.target.value;\n setDraft(v);\n draftRef.current = v;\n if (multiline) autoSize(e.target as HTMLTextAreaElement);\n if (!composingRef.current) scheduleLive();\n },\n onCompositionStart: () => {\n composingRef.current = true;\n clearLiveTimer(); // hold off until the IME word is finished\n },\n onCompositionEnd: (e: React.CompositionEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n composingRef.current = false;\n draftRef.current = e.currentTarget.value;\n scheduleLive();\n },\n onBlur: commit,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n } else if (e.key === \"Enter\") {\n if (!multiline || e.metaKey || e.ctrlKey) {\n e.preventDefault();\n commit();\n }\n }\n },\n };\n\n return multiline ? (\n <textarea {...common} rows={1} />\n ) : (\n <input {...common} type=\"text\" />\n );\n}\n\nfunction autoSize(el: HTMLTextAreaElement): void {\n el.style.height = \"auto\";\n el.style.height = el.scrollHeight + \"px\";\n}\n","/**\n * HUD — reproduces agent-frontend's two-part chrome:\n * - CanvasTopBar: a sticky h-9 top bar with the current selection context on\n * the left and the FormatToggle (标准 / 亚洲格式) + undo/redo on the right.\n * - SaveCapsule: a floating, bottom-center pill (rounded-full, popover bg, ring\n * + shadow) that surfaces save status and any pending AI diff (count +\n * accept/reject), exactly like the old EditorHudCapsule's collapsed pill.\n */\nimport {\n AlertCircle,\n ArrowLeft,\n Check,\n ChevronLeft,\n ChevronRight,\n Loader2,\n Redo2,\n Undo2,\n} from \"lucide-react\";\nimport type { ScriptFormat } from \"../scene/scene-item-row.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { cn } from \"../cn.js\";\n\nexport type SaveStatus = \"idle\" | \"saving\" | \"saved\" | \"error\";\n\nexport function FormatToggle({\n value,\n onChange,\n}: {\n value: ScriptFormat;\n onChange: (next: ScriptFormat) => void;\n}) {\n return (\n <div role=\"group\" aria-label=\"剧本格式\" className=\"lj-se-format\">\n {([\n { key: \"standard\", label: \"标准\" },\n { key: \"asian\", label: \"亚洲格式\" },\n ] as const).map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n aria-pressed={value === opt.key}\n className={cn(\"lj-se-format-btn\", value === opt.key && \"is-active\")}\n onClick={() => onChange(opt.key)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport function CanvasTopBar({\n title,\n onTitleChange,\n titleDisabled,\n contextLabel,\n format,\n onFormatChange,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n actions,\n}: {\n /** the script's name (ScriptProject.title). Shown at the far left. */\n title?: string;\n /** when provided, the title becomes click-to-edit; the host persists the new\n * value however it likes (the editor never touches storage). Omit → read-only. */\n onTitleChange?: (next: string) => void;\n titleDisabled?: boolean;\n contextLabel?: React.ReactNode;\n format: ScriptFormat;\n onFormatChange: (format: ScriptFormat) => void;\n canUndo?: boolean;\n canRedo?: boolean;\n onUndo?: () => void;\n onRedo?: () => void;\n /** host-injected actions rendered at the far right (e.g. 删除剧本 / 中间产物).\n * Kept business-decoupled: the package only renders whatever node is passed. */\n actions?: React.ReactNode;\n}) {\n const hasTitle = onTitleChange != null || (title ?? \"\").length > 0;\n return (\n <header className=\"lj-se-topbar\">\n <div className=\"lj-se-topbar-left\">\n {hasTitle ? (\n onTitleChange ? (\n <EditableText\n className=\"lj-se-topbar-title\"\n value={title ?? \"\"}\n placeholder=\"未命名剧本\"\n disabled={titleDisabled}\n onSave={onTitleChange}\n />\n ) : (\n <span className=\"lj-se-topbar-title lj-se-topbar-title--ro\">{title}</span>\n )\n ) : null}\n {contextLabel ? (\n <span className=\"lj-se-topbar-ctx\">\n {hasTitle ? <span className=\"lj-se-topbar-sep\" aria-hidden>/</span> : null}\n {contextLabel}\n </span>\n ) : null}\n </div>\n <div className=\"lj-se-topbar-right\">\n <FormatToggle value={format} onChange={onFormatChange} />\n {onUndo || onRedo ? (\n <div className=\"lj-se-topbar-undo\">\n <button type=\"button\" className=\"lj-se-rowbtn\" disabled={!canUndo} title=\"撤销\" onClick={onUndo}>\n <Undo2 className=\"lj-se-ic-4\" strokeWidth={1.75} />\n </button>\n <button type=\"button\" className=\"lj-se-rowbtn\" disabled={!canRedo} title=\"重做\" onClick={onRedo}>\n <Redo2 className=\"lj-se-ic-4\" strokeWidth={1.75} />\n </button>\n </div>\n ) : null}\n {actions ? <div className=\"lj-se-topbar-actions\">{actions}</div> : null}\n </div>\n </header>\n );\n}\n\nexport function SaveCapsule({\n saveStatus = \"idle\",\n diffCount = 0,\n baselineStatus,\n canApplyDiff,\n onDiffPrev,\n onDiffNext,\n onAcceptAll,\n onRejectAll,\n returnLabel,\n onReturn,\n}: {\n saveStatus?: SaveStatus;\n diffCount?: number;\n /** \"memory\" → baseline only in memory (lost on reload); shows a hint */\n baselineStatus?: \"ok\" | \"memory\";\n canApplyDiff?: boolean;\n onDiffPrev?: () => void;\n onDiffNext?: () => void;\n onAcceptAll?: () => void;\n onRejectAll?: () => void;\n /** \"返回 X\" breadcrumb after an asset→scene jump */\n returnLabel?: string;\n onReturn?: () => void;\n}) {\n const showSave = saveStatus !== \"idle\";\n const hasDiff = diffCount > 0;\n const hasReturn = !!(returnLabel && onReturn);\n if (!showSave && !hasDiff && !hasReturn) return null;\n\n return (\n <div className=\"lj-se-capsule-anchor\">\n <div className=\"lj-se-capsule\">\n {hasReturn ? (\n <button type=\"button\" className=\"lj-se-capsule-return\" title={`返回 ${returnLabel}`} onClick={onReturn}>\n <ArrowLeft className=\"lj-se-ic-4\" strokeWidth={2.5} />\n <span className=\"lj-se-capsule-return-label\">返回 {returnLabel}</span>\n </button>\n ) : null}\n {hasDiff ? (\n <div className=\"lj-se-capsule-diff\">\n <span className=\"lj-se-capsule-ping\">\n <span className=\"lj-se-capsule-dot\" />\n <span className=\"lj-se-capsule-dot is-ping\" />\n </span>\n <span className=\"lj-se-capsule-count\">{diffCount}</span>\n <span className=\"lj-se-capsule-muted\">改动</span>\n {baselineStatus === \"memory\" ? (\n <span className=\"lj-se-capsule-warn\" title=\"基线仅存于内存,刷新页面会丢失\">仅本次</span>\n ) : null}\n {onDiffPrev ? (\n <button type=\"button\" className=\"lj-se-capsule-nav\" title=\"上一处\" onClick={onDiffPrev}>\n <ChevronLeft className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n ) : null}\n {onDiffNext ? (\n <button type=\"button\" className=\"lj-se-capsule-nav\" title=\"下一处\" onClick={onDiffNext}>\n <ChevronRight className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n ) : null}\n {onRejectAll ? (\n <button type=\"button\" className=\"lj-se-capsule-reject\" disabled={!canApplyDiff} onClick={onRejectAll}>\n 全部拒绝\n </button>\n ) : null}\n {onAcceptAll ? (\n <button type=\"button\" className=\"lj-se-capsule-accept\" disabled={!canApplyDiff} onClick={onAcceptAll}>\n 全部接受\n </button>\n ) : null}\n </div>\n ) : null}\n {showSave && !hasDiff ? <SaveStateRow status={saveStatus} /> : null}\n </div>\n </div>\n );\n}\n\nfunction SaveStateRow({ status }: { status: SaveStatus }) {\n if (status === \"saving\")\n return (\n <span className=\"lj-se-capsule-save is-saving\">\n <Loader2 className=\"lj-se-ic-4 lj-se-spin\" strokeWidth={2.25} /> 保存中\n </span>\n );\n if (status === \"saved\")\n return (\n <span className=\"lj-se-capsule-save is-saved\">\n <Check className=\"lj-se-ic-4\" strokeWidth={2.5} /> 已保存\n </span>\n );\n return (\n <span className=\"lj-se-capsule-save is-error\">\n <AlertCircle className=\"lj-se-ic-4\" strokeWidth={2.25} /> 出错\n </span>\n );\n}\n","/**\n * Pure ScriptProject mutations.\n *\n * ⚠️ INVARIANT — every mutation here MUST be immutable: never write into an\n * existing scene / item / array in place; always return fresh spread-copied\n * objects along the path from the root to the change (see cloneEpisodes /\n * withSceneUpdated). Two things silently depend on it:\n * 1. diff-engine's `base === scene` fast path — it treats a scene that keeps\n * its baseline-snapshot reference as unchanged and skips serializing it; an\n * in-place edit would keep the reference and the change would vanish from\n * the diff overlay.\n * 2. AssetCard / SceneEditor React.memo — they skip re-render when their slice\n * keeps the same reference; an in-place edit would render stale UI.\n * If you add a mutation, return new objects — do NOT `scene.actions.push(...)`\n * or `Object.assign(scene, …)`.\n */\nimport { ScriptContentType, type Scene, type ScriptItem, type ScriptProject } from \"../types\";\nimport { getSceneContext } from \"../utils.js\";\n\nexport interface SceneDraft {\n sceneId: string;\n location: string;\n space: string;\n time: string;\n actors: string;\n}\n\nexport interface ItemDraft {\n kind: \"dialogue\" | \"action\";\n actorName: string;\n emotion: string;\n content: string;\n actionType: string;\n}\n\nfunction cloneEpisodes(data: ScriptProject) {\n return [...(data.episodes || [])];\n}\n\nfunction withSceneUpdated(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n updater: (scene: Scene) => Scene\n): ScriptProject {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const scene = scenes[sceneIndex];\n if (!scene) return data;\n scenes[sceneIndex] = updater(scene);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\nfunction normalizeCommaList(value: string) {\n return value\n .split(/[,,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction setSceneContext(scene: Scene, patch: Partial<NonNullable<Scene[\"context\"]>>): Scene {\n const current = getSceneContext(scene);\n const context = {\n actors: patch.actors ?? current.actors,\n locations: patch.locations ?? current.locations,\n props: patch.props ?? current.props,\n };\n return {\n ...scene,\n context,\n actors: context.actors,\n locations: context.locations,\n props: context.props,\n };\n}\n\nexport function getSceneActorsText(scene: Scene) {\n return (getSceneContext(scene).actors || [])\n .map((item) => item.actor_id?.trim() || \"\")\n .filter(Boolean)\n .join(\",\");\n}\n\nexport function getPrimarySceneLocationId(scene: Scene) {\n const firstFromIds = scene.location_ids?.find(Boolean)?.trim();\n if (firstFromIds) return firstFromIds;\n return getSceneContext(scene).locations?.[0]?.location_id?.trim() || \"\";\n}\n\nexport function buildSceneDraft(sceneId: string, fallbackSceneIndex: number): SceneDraft {\n return {\n sceneId: sceneId.trim() || `1-${fallbackSceneIndex + 1}`,\n location: \"\",\n space: \"interior\",\n time: \"day\",\n actors: \"\",\n };\n}\n\nexport function incrementSceneId(sceneId: string | undefined, fallbackEpisodeIndex: number, fallbackSceneIndex: number) {\n const normalized = sceneId?.trim();\n if (!normalized) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n\n const match = normalized.match(/^(.*?)(\\d+)$/);\n if (!match) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n return `${match[1]}${String(Number.parseInt(match[2], 10) + 1).padStart(match[2].length, \"0\")}`;\n}\n\nexport function nextEpisodeSceneId(data: ScriptProject, episodeIndex: number): string {\n let maxSceneNum = 0;\n const episode = data.episodes?.[episodeIndex];\n for (const scene of episode?.scenes || []) {\n const match = scene.scene_id?.trim().match(/^scn_(\\d+)$/);\n if (match) maxSceneNum = Math.max(maxSceneNum, Number.parseInt(match[1], 10));\n }\n return `scn_${String(maxSceneNum + 1).padStart(3, \"0\")}`;\n}\n\nfunction collectEpisodeSceneIds(data: ScriptProject, episodeIndex: number): Set<string> {\n const sceneIds = new Set<string>();\n const episode = data.episodes?.[episodeIndex];\n for (const scene of episode?.scenes || []) {\n const sceneId = scene.scene_id?.trim();\n if (sceneId) sceneIds.add(sceneId);\n }\n return sceneIds;\n}\n\nfunction nextAvailableEpisodeSceneId(data: ScriptProject, episodeIndex: number, suggestedId: string): string {\n const used = collectEpisodeSceneIds(data, episodeIndex);\n let candidate = suggestedId.trim() || nextEpisodeSceneId(data, episodeIndex);\n if (!used.has(candidate)) return candidate;\n\n const match = candidate.match(/^(.*?)(\\d+)$/);\n if (!match) return nextEpisodeSceneId(data, episodeIndex);\n\n let nextNum = Number.parseInt(match[2], 10) + 1;\n while (used.has(candidate)) {\n candidate = `${match[1]}${String(nextNum).padStart(match[2].length, \"0\")}`;\n nextNum += 1;\n }\n return candidate;\n}\n\n/**\n * 基于 prev 递增,并在 existingScenes 里做冲突检测;若建议 id 已占用,继续递增直到不冲突。\n * 上限 1000 次避免异常 id 格式引起死循环。\n */\nexport function nextAvailableSceneId(\n prevSceneId: string | undefined,\n existingScenes: Scene[],\n fallbackEpisodeIndex: number,\n fallbackSceneIndex: number,\n): string {\n const used = new Set<string>();\n for (const sc of existingScenes) {\n const id = sc.scene_id?.trim();\n if (id) used.add(id);\n }\n let candidate = incrementSceneId(prevSceneId, fallbackEpisodeIndex, fallbackSceneIndex);\n let attempts = 0;\n while (used.has(candidate) && attempts < 1000) {\n candidate = incrementSceneId(candidate, fallbackEpisodeIndex, fallbackSceneIndex);\n attempts += 1;\n }\n return candidate;\n}\n\nexport function decrementSceneId(sceneId: string | undefined, fallbackEpisodeIndex: number, fallbackSceneIndex: number) {\n const normalized = sceneId?.trim();\n if (!normalized) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n\n const match = normalized.match(/^(.*?)(\\d+)$/);\n if (!match) return `${fallbackEpisodeIndex + 1}-${fallbackSceneIndex + 1}`;\n const n = Number.parseInt(match[2], 10);\n if (n <= 1) return normalized;\n return `${match[1]}${String(n - 1)}`;\n}\n\nexport function createSceneFromDraft(draft: SceneDraft): Scene {\n const location = draft.location.trim();\n const actors = normalizeCommaList(draft.actors);\n\n return {\n scene_id: draft.sceneId.trim(),\n environment: {\n space: draft.space.trim() || \"interior\",\n time: draft.time.trim() || \"day\",\n },\n location_ids: location ? [location] : [],\n locations: location ? [{ location_id: location, state_id: null }] : [],\n actors: actors.map((actorId) => ({ actor_id: actorId, state_id: null })),\n actions: [],\n };\n}\n\nexport function createItemFromDraft(draft: ItemDraft): ScriptItem {\n if (draft.kind === \"dialogue\") {\n return {\n type: ScriptContentType.Dialogue,\n actor_id: draft.actorName.trim(),\n emotion: draft.emotion.trim(),\n content: draft.content.trim(),\n };\n }\n\n return {\n type: draft.actionType.trim() || ScriptContentType.Action,\n content: draft.content.trim(),\n };\n}\n\nexport function updateSceneField(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n field: \"scene_id\" | \"space\" | \"time\" | \"location\" | \"actors\" | \"props\",\n value: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n if (field === \"scene_id\") {\n return { ...scene, scene_id: value.trim() };\n }\n\n if (field === \"space\" || field === \"time\") {\n return {\n ...scene,\n environment: {\n ...scene.environment,\n [field]: value.trim(),\n },\n };\n }\n\n if (field === \"location\") {\n const location = value.trim();\n return setSceneContext({\n ...scene,\n location_ids: location ? [location] : [],\n }, { locations: location ? [{ location_id: location, state_id: null }] : [] });\n }\n\n if (field === \"props\") {\n const propIds = normalizeCommaList(value);\n const existingPropStateMap = new Map(\n (getSceneContext(scene).props || []).map((item) => [(item.prop_id || \"\").trim(), item.state_id ?? null])\n );\n return setSceneContext(scene, {\n props: propIds.map((propId) => ({\n prop_id: propId,\n state_id: existingPropStateMap.get(propId) ?? null,\n })),\n });\n }\n\n const actorIds = normalizeCommaList(value);\n const existingStateMap = new Map(\n (getSceneContext(scene).actors || []).map((item) => [(item.actor_id || \"\").trim(), item.state_id ?? null])\n );\n return setSceneContext(scene, {\n actors: actorIds.map((actorId) => ({\n actor_id: actorId,\n state_id: existingStateMap.get(actorId) ?? null,\n })),\n });\n });\n}\n\nexport type SceneAssetStateBindingKind = \"actor\" | \"location\" | \"prop\";\n\nexport interface SceneAssetStateBindingTarget {\n episodeIndex: number;\n sceneIndex: number;\n}\n\nfunction updateSceneActorRefState(scene: Scene, actorId: string, stateId: string | null): Scene {\n const context = getSceneContext(scene);\n let matched = false;\n let changed = false;\n const actors = (context.actors ?? []).map((item) => {\n if ((item.actor_id ?? \"\").trim() !== actorId) return item;\n matched = true;\n if ((item.state_id ?? null) === stateId) return item;\n changed = true;\n return { ...item, state_id: stateId };\n });\n if (!matched) {\n changed = true;\n actors.push({ actor_id: actorId, state_id: stateId });\n }\n return changed ? setSceneContext(scene, { actors }) : scene;\n}\n\nfunction updateSceneLocationRefState(scene: Scene, locationId: string, stateId: string | null): Scene {\n const context = getSceneContext(scene);\n let matched = false;\n let changed = false;\n const locations = (context.locations ?? []).map((item) => {\n if ((item.location_id ?? \"\").trim() !== locationId) return item;\n matched = true;\n if ((item.state_id ?? null) === stateId) return item;\n changed = true;\n return { ...item, state_id: stateId };\n });\n if (!matched) {\n changed = true;\n locations.push({ location_id: locationId, state_id: stateId });\n }\n return changed ? setSceneContext(scene, { locations }) : scene;\n}\n\nfunction updateScenePropRefState(scene: Scene, propId: string, stateId: string | null): Scene {\n const context = getSceneContext(scene);\n let matched = false;\n let changed = false;\n const props = (context.props ?? []).map((item) => {\n if ((item.prop_id ?? \"\").trim() !== propId) return item;\n matched = true;\n if ((item.state_id ?? null) === stateId) return item;\n changed = true;\n return { ...item, state_id: stateId };\n });\n if (!matched) {\n changed = true;\n props.push({ prop_id: propId, state_id: stateId });\n }\n return changed ? setSceneContext(scene, { props }) : scene;\n}\n\nfunction updateSceneAssetRefState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n kind: SceneAssetStateBindingKind,\n targetId: string,\n stateId: string | null\n) {\n const normalizedTarget = targetId.trim();\n const normalizedState = stateId?.trim() || null;\n if (!normalizedTarget) return data;\n\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n if (kind === \"actor\") return updateSceneActorRefState(scene, normalizedTarget, normalizedState);\n if (kind === \"location\") return updateSceneLocationRefState(scene, normalizedTarget, normalizedState);\n return updateScenePropRefState(scene, normalizedTarget, normalizedState);\n });\n}\n\nexport function updateSceneActorState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n actorId: string,\n stateId: string | null\n) {\n return updateSceneAssetRefState(data, episodeIndex, sceneIndex, \"actor\", actorId, stateId);\n}\n\nexport function updateSceneLocationState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n locationId: string,\n stateId: string | null\n) {\n return updateSceneAssetRefState(data, episodeIndex, sceneIndex, \"location\", locationId, stateId);\n}\n\nexport function updateScenePropState(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n propId: string,\n stateId: string | null\n) {\n return updateSceneAssetRefState(data, episodeIndex, sceneIndex, \"prop\", propId, stateId);\n}\n\nexport function updateSceneAssetStateBindings(\n data: ScriptProject,\n kind: SceneAssetStateBindingKind,\n assetId: string,\n targets: SceneAssetStateBindingTarget[],\n stateId: string | null,\n): ScriptProject {\n const normalizedAssetId = assetId.trim();\n if (!normalizedAssetId || targets.length === 0) return data;\n const normalizedState = stateId?.trim() || null;\n const byEpisode = new Map<number, Set<number>>();\n for (const target of targets) {\n if (target.episodeIndex < 0 || target.sceneIndex < 0) continue;\n let scenes = byEpisode.get(target.episodeIndex);\n if (!scenes) {\n scenes = new Set<number>();\n byEpisode.set(target.episodeIndex, scenes);\n }\n scenes.add(target.sceneIndex);\n }\n if (byEpisode.size === 0) return data;\n\n let changed = false;\n const episodes = (data.episodes ?? []).map((episode, episodeIndex) => {\n const sceneIndexes = byEpisode.get(episodeIndex);\n if (!sceneIndexes) return episode;\n let episodeChanged = false;\n const scenes = episode.scenes?.map((scene, sceneIndex) => {\n if (!sceneIndexes.has(sceneIndex)) return scene;\n const nextScene =\n kind === \"actor\"\n ? updateSceneActorRefState(scene, normalizedAssetId, normalizedState)\n : kind === \"location\"\n ? updateSceneLocationRefState(scene, normalizedAssetId, normalizedState)\n : updateScenePropRefState(scene, normalizedAssetId, normalizedState);\n if (nextScene !== scene) {\n episodeChanged = true;\n changed = true;\n }\n return nextScene;\n });\n return scenes && episodeChanged ? { ...episode, scenes } : episode;\n });\n\n return changed ? { ...data, episodes } : data;\n}\n\nexport function updateSceneItemContent(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n content: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const item = actions[itemIndex];\n if (!item) return scene;\n actions[itemIndex] = { ...item, content: content.trim() };\n return { ...scene, actions };\n });\n}\n\nexport function updateSceneItemActor(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n actorId: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const item = actions[itemIndex];\n if (!item) return scene;\n // picking an actor makes this a single-actor line — drop the structured\n // speaker-identity fields (speaker_id / speakers / lines) so the chosen\n // actor becomes authoritative for the displayed cue.\n const next: ScriptItem = { ...item, actor_id: actorId.trim() };\n delete next.speaker_id;\n delete next.speakers;\n delete next.lines;\n actions[itemIndex] = next;\n return { ...scene, actions };\n });\n}\n\nexport function updateSceneItemEmotion(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n emotion: string\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const item = actions[itemIndex];\n if (!item) return scene;\n const trimmed = emotion.trim();\n const next: ScriptItem = { ...item };\n if (trimmed) next.emotion = trimmed;\n else delete next.emotion;\n actions[itemIndex] = next;\n return { ...scene, actions };\n });\n}\n\nexport function replaceSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n item: ScriptItem\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n if (!actions[itemIndex]) return scene;\n actions[itemIndex] = item;\n return { ...scene, actions };\n });\n}\n\n/**\n * Append a new (empty) episode at the end, or insert at `atIndex`. The new\n * episode starts with no scenes — the empty-episode affordance lets the user\n * add the first scene.\n */\nexport function addEpisode(data: ScriptProject, atIndex?: number): ScriptProject {\n const episodes = [...(data.episodes || [])];\n const index = atIndex == null ? episodes.length : Math.max(0, Math.min(atIndex, episodes.length));\n const stamp =\n typeof Date !== \"undefined\" && typeof Date.now === \"function\" ? Date.now().toString(36) : String(episodes.length);\n episodes.splice(index, 0, { episode_id: `ep_${stamp}`, title: \"\", scenes: [] });\n return { ...data, episodes };\n}\n\n/** Append a fresh blank scene to an episode (used by the empty-episode CTA). */\nexport function addBlankScene(data: ScriptProject, episodeIndex: number): ScriptProject {\n const scenes = data.episodes?.[episodeIndex]?.scenes ?? [];\n return insertScene(data, episodeIndex, scenes.length, {\n environment: { space: \"interior\", time: \"day\" },\n actions: [],\n });\n}\n\nexport function insertScene(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n scene: Scene\n) {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const finalScene = {\n ...scene,\n scene_id: nextAvailableEpisodeSceneId(data, episodeIndex, scene.scene_id || \"\"),\n };\n scenes.splice(sceneIndex, 0, finalScene);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\nexport function splitScene(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n splitAtItemIndex: number\n) {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const scene = scenes[sceneIndex];\n if (!scene) return data;\n\n const actions = scene.actions || [];\n if (splitAtItemIndex <= 0 || splitAtItemIndex >= actions.length) return data;\n\n const frontScene: Scene = {\n ...scene,\n actions: actions.slice(0, splitAtItemIndex),\n };\n // back scene 的 id:用去重版本,避免非 scn_ 命名的项目里 nextEpisodeSceneId 恒返回\n // scn_001 而与已有场次(或多次拆分)撞 id。nextAvailableEpisodeSceneId 会在本集\n // 已用 id 上冲突检测并递增。\n const backScene: Scene = {\n ...scene,\n scene_id: nextAvailableEpisodeSceneId(data, episodeIndex, \"\"),\n actions: actions.slice(splitAtItemIndex),\n };\n\n // 后续场次保持原 id(不再做链式 renumber:链式会让已生成资产 / 视频的 scene 引用全部失效,\n // 代价远大于\"id 看起来连续\"的收益)。\n const renumberedTail = scenes.slice(sceneIndex + 1);\n\n episodes[episodeIndex] = {\n ...episode,\n scenes: [...scenes.slice(0, sceneIndex), frontScene, backScene, ...renumberedTail],\n };\n return { ...data, episodes };\n}\n\n/**\n * 把 sceneIndex 对应的场并入 sceneIndex - 1。\n * - actions 顺序拼接\n * - actors / locations / props 按 id 去重合并(保留前场已有的 state_id)\n * - 保留前场 scene_id 和 environment\n * - **不再**对后续 scene_id 链式 -1:下游(video_map / asset state / 参考素材目录等)按\n * scene_id 做主键,扰动 scene_id 会让已生成资产 / 视频孤立,代价远大于\"id 连续\"的收益。\n * - sceneIndex <= 0 时无效,返回原 data\n */\nexport function mergeSceneIntoPrev(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n) {\n if (sceneIndex <= 0) return data;\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const prev = scenes[sceneIndex - 1];\n const cur = scenes[sceneIndex];\n if (!prev || !cur) return data;\n\n const mergeActors = () => {\n const seen = new Set<string>();\n const out: NonNullable<Scene[\"actors\"]> = [];\n for (const ref of [...(getSceneContext(prev).actors ?? []), ...(getSceneContext(cur).actors ?? [])]) {\n const id = ref.actor_id?.trim() || \"\";\n if (!id || seen.has(id)) continue;\n seen.add(id);\n out.push(ref);\n }\n return out;\n };\n const mergeLocations = () => {\n const seen = new Set<string>();\n const out: NonNullable<Scene[\"locations\"]> = [];\n for (const ref of [...(getSceneContext(prev).locations ?? []), ...(getSceneContext(cur).locations ?? [])]) {\n const id = ref.location_id?.trim() || \"\";\n if (!id || seen.has(id)) continue;\n seen.add(id);\n out.push(ref);\n }\n return out;\n };\n const mergeProps = () => {\n const seen = new Set<string>();\n const out: NonNullable<Scene[\"props\"]> = [];\n for (const ref of [...(getSceneContext(prev).props ?? []), ...(getSceneContext(cur).props ?? [])]) {\n const id = ref.prop_id?.trim() || \"\";\n if (!id || seen.has(id)) continue;\n seen.add(id);\n out.push(ref);\n }\n return out;\n };\n const actors = mergeActors();\n const locations = mergeLocations();\n const props = mergeProps();\n\n const merged: Scene = setSceneContext({\n ...prev,\n actions: [...(prev.actions ?? []), ...(cur.actions ?? [])],\n // drop the stale flat location_ids (copied from prev): it would disagree\n // with the merged context.locations, and getPrimarySceneLocationId reads\n // location_ids first → would silently lose cur's location. Reads fall back\n // to context.locations which now holds the full merged set.\n location_ids: undefined,\n }, { actors, locations, props });\n\n const tail = scenes.slice(sceneIndex + 1);\n\n episodes[episodeIndex] = {\n ...episode,\n scenes: [...scenes.slice(0, sceneIndex - 1), merged, ...tail],\n };\n return { ...data, episodes };\n}\n\nexport function deleteScene(data: ScriptProject, episodeIndex: number, sceneIndex: number) {\n const episodes = cloneEpisodes(data);\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n scenes.splice(sceneIndex, 1);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\nexport function insertSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n item: ScriptItem\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n actions.splice(itemIndex, 0, item);\n return { ...scene, actions };\n });\n}\n\nexport function deleteSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n actions.splice(itemIndex, 1);\n return { ...scene, actions };\n });\n}\n\n/**\n * Reorder a row within a scene: pull the item at `fromIndex` out and re-insert\n * it so it lands at insertion slot `toIndex` (0..length). No-op when the move\n * wouldn't change order.\n */\nexport function moveSceneItem(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n fromIndex: number,\n toIndex: number\n) {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n if (fromIndex < 0 || fromIndex >= actions.length) return scene;\n const clampedTo = Math.max(0, Math.min(toIndex, actions.length));\n // adjust target when removing an earlier item shifts indices left\n const dest = clampedTo > fromIndex ? clampedTo - 1 : clampedTo;\n if (dest === fromIndex) return scene;\n const [moved] = actions.splice(fromIndex, 1);\n actions.splice(dest, 0, moved);\n return { ...scene, actions };\n });\n}\n\nexport interface ItemLocation {\n episodeIndex: number;\n sceneIndex: number;\n itemIndex: number;\n}\n\n/**\n * Move a row to a target insertion slot, within the same scene OR across\n * scenes. Cross-scene moves pull the item from the source scene's actions and\n * splice it into the target scene's actions (the row's actor/emotion/etc. ride\n * along unchanged). scene_id is never touched.\n */\nexport function moveScriptItem(\n data: ScriptProject,\n from: ItemLocation,\n to: { episodeIndex: number; sceneIndex: number; slot: number }\n): ScriptProject {\n if (from.episodeIndex === to.episodeIndex && from.sceneIndex === to.sceneIndex) {\n return moveSceneItem(data, from.episodeIndex, from.sceneIndex, from.itemIndex, to.slot);\n }\n const episodes = cloneEpisodes(data);\n const srcEp = episodes[from.episodeIndex];\n const dstEp = episodes[to.episodeIndex];\n if (!srcEp || !dstEp) return data;\n const srcScenes = [...(srcEp.scenes || [])];\n const srcScene = srcScenes[from.sceneIndex];\n if (!srcScene) return data;\n const srcActions = [...(srcScene.actions || [])];\n if (from.itemIndex < 0 || from.itemIndex >= srcActions.length) return data;\n const [moved] = srcActions.splice(from.itemIndex, 1);\n srcScenes[from.sceneIndex] = { ...srcScene, actions: srcActions };\n episodes[from.episodeIndex] = { ...srcEp, scenes: srcScenes };\n\n // re-read target episode/scene from the (possibly same-episode) updated array\n const dstEp2 = episodes[to.episodeIndex];\n const dstScenes = [...(dstEp2.scenes || [])];\n const dstScene = dstScenes[to.sceneIndex];\n if (!dstScene) return data;\n const dstActions = [...(dstScene.actions || [])];\n const slot = Math.max(0, Math.min(to.slot, dstActions.length));\n dstActions.splice(slot, 0, moved);\n dstScenes[to.sceneIndex] = { ...dstScene, actions: dstActions };\n episodes[to.episodeIndex] = { ...dstEp2, scenes: dstScenes };\n\n return { ...data, episodes };\n}\n\n/** Remove an entire episode. */\nexport function deleteEpisode(data: ScriptProject, episodeIndex: number): ScriptProject {\n const episodes = [...(data.episodes || [])];\n if (episodeIndex < 0 || episodeIndex >= episodes.length) return data;\n episodes.splice(episodeIndex, 1);\n return { ...data, episodes };\n}\n","/**\n * Pure \"where does this asset appear\" computation — ported from agent-frontend.\n * Drives the bidirectional reference grid on each asset card (asset → scenes).\n */\nimport type { ScriptEpisode, Scene, ScriptProject } from \"./types.js\";\nimport {\n getEpisodeNumber,\n getEpisodeNumberLabel,\n getPropDisplayName,\n getSceneContext,\n getSceneNumber,\n getSceneNumberLabel,\n} from \"./utils.js\";\n\nexport interface DistributionItem {\n key: string;\n label: string;\n episodeIndex: number;\n /** display episode number (parsed from episode_id/title, shared util) */\n episodeNumber: number;\n sceneIndex: number;\n /** display scene number (trailing digits of scene_id, shared util) */\n sceneNumber: number;\n stateId?: string | null;\n}\n\n/** Build the shared display fields for one (episode, scene) reference, so every\n * distribution row shows the SAME episode/scene numbers as the rest of the UI. */\nfunction refFields(episode: ScriptEpisode, ei: number, scene: Scene, si: number) {\n return {\n label: `${getEpisodeNumberLabel(episode, ei)} · ${getSceneNumberLabel(scene, si)}`,\n episodeIndex: ei,\n episodeNumber: getEpisodeNumber(episode, ei),\n sceneIndex: si,\n sceneNumber: getSceneNumber(scene, si),\n };\n}\n\nexport function buildActorDistribution(data: ScriptProject, actorId: string): DistributionItem[] {\n const items: DistributionItem[] = [];\n (data.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n const ctx = getSceneContext(scene);\n const ref = (ctx.actors ?? []).find((i) => (i.actor_id ?? \"\").trim() === actorId);\n const inActions = !ref && (scene.actions ?? []).some((i) => (i.actor_id ?? \"\").trim() === actorId);\n if (ref || inActions) {\n items.push({\n key: `actor-${actorId}-${ei}-${si}`,\n ...refFields(episode, ei, scene, si),\n stateId: ref?.state_id,\n });\n }\n });\n });\n return items;\n}\n\nexport function buildLocationDistribution(data: ScriptProject, locationId: string): DistributionItem[] {\n const items: DistributionItem[] = [];\n (data.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n const inIds = (scene.location_ids ?? []).some((i) => (i ?? \"\").trim() === locationId);\n const ctx = getSceneContext(scene);\n const ctxRef = (ctx.locations ?? []).find((i) => (i.location_id ?? \"\").trim() === locationId);\n if (inIds || ctxRef) {\n items.push({\n key: `location-${locationId}-${ei}-${si}`,\n ...refFields(episode, ei, scene, si),\n stateId: ctxRef?.state_id,\n });\n }\n });\n });\n return items;\n}\n\nexport function buildPropDistribution(data: ScriptProject, propId: string, propName: string): DistributionItem[] {\n const items: DistributionItem[] = [];\n const id = propId.trim();\n const needle = propName.trim().toLowerCase();\n (data.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n const ctx = getSceneContext(scene);\n const ctxRef = (ctx.props ?? []).find((i) => (i.prop_id ?? \"\").trim() === id);\n const byRef = !!ctxRef;\n const byId = !byRef && id ? (scene.actions ?? []).some((i) => (i.content ?? \"\").includes(id)) : false;\n const byName =\n !byRef && !byId && needle\n ? (scene.actions ?? []).some((i) => (i.content ?? \"\").toLowerCase().includes(needle))\n : false;\n if (byRef || byId || byName) {\n items.push({\n key: `prop-${id || needle}-${ei}-${si}`,\n ...refFields(episode, ei, scene, si),\n stateId: ctxRef?.state_id,\n });\n }\n });\n });\n return items;\n}\n\nexport interface ReferenceEpisodeGroup {\n episodeIndex: number;\n /** display episode number (shared util) — what the grid chip renders */\n episodeNumber: number;\n items: DistributionItem[];\n}\n\nexport function groupReferencesByEpisode(distribution: DistributionItem[]): ReferenceEpisodeGroup[] {\n const map = new Map<number, DistributionItem[]>();\n for (const item of distribution) {\n if (!map.has(item.episodeIndex)) map.set(item.episodeIndex, []);\n map.get(item.episodeIndex)!.push(item);\n }\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([episodeIndex, items]) => ({\n episodeIndex,\n episodeNumber: items[0]?.episodeNumber ?? episodeIndex + 1,\n items: items.sort((a, b) => a.sceneIndex - b.sceneIndex),\n }));\n}\n\nexport type AssetDistGroup = \"actors\" | \"locations\" | \"props\";\n\n/** shared empty result so a zero-appearance / unknown-id asset always gets the\n * SAME refs array reference — otherwise AssetCard's reference-equality memo\n * would re-render it on every keystroke (e.g. a blank-id asset that is never\n * in the index and falls through to this builder each render). */\nconst EMPTY_REFS: ReferenceEpisodeGroup[] = [];\n\n/** One asset's episode-grouped reference list. Used both inside the index and\n * as the stream's fresh-`value` fallback for an asset that isn't in the\n * (deferred) index yet — e.g. one just added this render. */\nexport function buildAssetRefs(\n data: ScriptProject,\n group: AssetDistGroup,\n assetId: string,\n): ReferenceEpisodeGroup[] {\n let groups: ReferenceEpisodeGroup[];\n if (group === \"actors\") {\n groups = groupReferencesByEpisode(buildActorDistribution(data, assetId));\n } else if (group === \"locations\") {\n groups = groupReferencesByEpisode(buildLocationDistribution(data, assetId));\n } else {\n const prop = (data.props ?? []).find((p) => (p.prop_id ?? \"\").trim() === assetId);\n groups = groupReferencesByEpisode(buildPropDistribution(data, assetId, getPropDisplayName(prop)));\n }\n return groups.length === 0 ? EMPTY_REFS : groups;\n}\n\n/** Structural equality on an asset's grouped refs (every field the grid renders).\n * Lets buildDistributionIndex reuse a prior array reference when an asset's\n * appearances didn't change, so AssetCard's reference-equality memo can skip. */\nfunction sameRefGroups(a: ReferenceEpisodeGroup[], b: ReferenceEpisodeGroup[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const ga = a[i];\n const gb = b[i];\n if (ga.episodeIndex !== gb.episodeIndex || ga.episodeNumber !== gb.episodeNumber || ga.items.length !== gb.items.length) {\n return false;\n }\n for (let j = 0; j < ga.items.length; j++) {\n const ia = ga.items[j];\n const ib = gb.items[j];\n if (\n ia.key !== ib.key ||\n ia.label !== ib.label ||\n ia.sceneIndex !== ib.sceneIndex ||\n ia.sceneNumber !== ib.sceneNumber ||\n ia.episodeNumber !== ib.episodeNumber ||\n ia.stateId !== ib.stateId\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Build every asset's episode-grouped reference list in ONE pass per `value`\n * (keyed `${group}:${id}`), so the stream computes distributions once instead\n * of each visible AssetCard re-scanning all scenes on every keystroke.\n *\n * Pass the PREVIOUS index as `prev` to get reference-stable results: an asset\n * whose distribution is structurally unchanged keeps its old array reference, so\n * the only cards that re-render are the ones whose appearances actually changed.\n */\nexport function buildDistributionIndex(\n data: ScriptProject,\n prev?: Map<string, ReferenceEpisodeGroup[]>,\n): Map<string, ReferenceEpisodeGroup[]> {\n const index = new Map<string, ReferenceEpisodeGroup[]>();\n const put = (key: string, next: ReferenceEpisodeGroup[]) => {\n const old = prev?.get(key);\n index.set(key, old && sameRefGroups(old, next) ? old : next);\n };\n for (const a of data.actors ?? []) {\n const id = (a.actor_id ?? \"\").trim();\n if (id) put(`actors:${id}`, buildAssetRefs(data, \"actors\", id));\n }\n for (const l of data.locations ?? []) {\n const id = (l.location_id ?? \"\").trim();\n if (id) put(`locations:${id}`, buildAssetRefs(data, \"locations\", id));\n }\n for (const p of data.props ?? []) {\n const id = (p.prop_id ?? \"\").trim();\n if (id) put(`props:${id}`, buildAssetRefs(data, \"props\", id));\n }\n return index;\n}\n","/**\n * Virtualized-stream scroll-position memory.\n *\n * Virtuoso can't be restored by a plain scrollTop — it needs its internal\n * StateSnapshot (anchor item index + offset + already-measured row heights),\n * otherwise restoring across mount/unmount jumps. We save the snapshot per\n * `scope` (the host's project key) on unmount and feed it back via\n * `<Virtuoso restoreStateFrom={readScrollState(scope)} />` on the next mount of\n * the same scope — so switching away (e.g. a tab change) and back lands you\n * where you were.\n *\n * In-memory only (lost on a full page reload) — deliberately not wired to\n * sessionStorage, to avoid leaking state across boundaries.\n */\nimport { useEffect } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { StateSnapshot, VirtuosoHandle } from \"react-virtuoso\";\n\nconst states = new Map<string, StateSnapshot>();\n\nexport function readScrollState(scope: string | undefined): StateSnapshot | undefined {\n return scope ? states.get(scope) : undefined;\n}\n\n/** Save the stream's Virtuoso state to `scope` on unmount (getState's callback\n * writes the module map synchronously, since a setState after unmount is a\n * no-op). Restored at the next mount via readScrollState(scope). */\nexport function useScrollStateMemo(\n scope: string | undefined,\n virtuosoRef: RefObject<VirtuosoHandle | null>,\n): void {\n useEffect(() => {\n if (!scope) return;\n const ref = virtuosoRef;\n return () => {\n ref.current?.getState((snapshot) => {\n states.set(scope, snapshot);\n });\n };\n }, [scope, virtuosoRef]);\n}\n","/**\n * Popover — dependency-free, token-scoped, and clip-proof.\n *\n * The panel is PORTALED into the nearest `.lj-se-root` and positioned with\n * `position: fixed` against the trigger's rect. Portaling out of the (virtual-\n * ized) row escapes the stacking/overflow traps that would otherwise let later\n * list items paint over the menu; portaling into `.lj-se-root` (not body) keeps\n * the editor's CSS variables in scope. Flips upward when there isn't room\n * below; repositions on scroll/resize; closes on outside-click or Esc.\n */\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../cn.js\";\n\nexport interface PopoverProps {\n trigger: (args: { open: boolean; toggle: () => void }) => ReactNode;\n children: (args: { close: () => void }) => ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"bottom\" | \"top\";\n className?: string;\n panelClassName?: string;\n}\n\ninterface Coords {\n top?: number;\n bottom?: number;\n left: number;\n transform?: string;\n}\n\nexport function Popover({\n trigger,\n children,\n align = \"start\",\n side = \"bottom\",\n className,\n panelClassName,\n}: PopoverProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState<Coords | null>(null);\n const rootRef = useRef<HTMLSpanElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n\n const target = (() => {\n if (typeof document === \"undefined\") return null;\n return rootRef.current?.closest(\".lj-se-root\") ?? document.body;\n })();\n\n useLayoutEffect(() => {\n if (!open || !rootRef.current) return;\n const measure = () => {\n const el = rootRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n // trigger scrolled fully out of the viewport → close instead of leaving\n // the fixed panel pinned to an offscreen / recycled rect.\n if (r.bottom <= 0 || r.top >= vh) {\n setOpen(false);\n return;\n }\n const panelW = panelRef.current?.offsetWidth ?? 232;\n const flipUp = side === \"top\" || r.bottom + 320 > vh;\n\n let left = r.left;\n let transform: string | undefined;\n if (align === \"center\") {\n left = r.left + r.width / 2;\n transform = \"translateX(-50%)\";\n } else if (align === \"end\") {\n left = r.right;\n transform = \"translateX(-100%)\";\n }\n // keep within the viewport horizontally\n if (!transform) left = Math.min(left, vw - panelW - 8);\n left = Math.max(8, left);\n\n setCoords(\n flipUp\n ? { bottom: vh - r.top + 4, left, transform }\n : { top: r.bottom + 4, left, transform },\n );\n };\n measure();\n // re-measure once the panel has a real width (for center/end clamping)\n const raf = requestAnimationFrame(measure);\n // On scroll/resize, REPOSITION the fixed panel to stay glued to its trigger\n // (so programmatic selection scrolls and trackpad inertia don't dismiss a\n // just-opened menu) — but rAF-throttled to AT MOST one measure per frame, so\n // a fast scroll over the virtualized list doesn't force layout twice per\n // event. (capture: true also catches the inner virtualized scroll container.)\n let throttle = 0;\n const onReflow = () => {\n if (throttle) return;\n throttle = requestAnimationFrame(() => {\n throttle = 0;\n measure();\n });\n };\n window.addEventListener(\"scroll\", onReflow, true);\n window.addEventListener(\"resize\", onReflow);\n return () => {\n cancelAnimationFrame(raf);\n if (throttle) cancelAnimationFrame(throttle);\n window.removeEventListener(\"scroll\", onReflow, true);\n window.removeEventListener(\"resize\", onReflow);\n };\n }, [open, side, align]);\n\n useEffect(() => {\n if (!open) return;\n function onDocClick(e: MouseEvent) {\n const t = e.target as Node;\n if (rootRef.current?.contains(t) || panelRef.current?.contains(t)) return;\n setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") setOpen(false);\n }\n document.addEventListener(\"mousedown\", onDocClick, true);\n document.addEventListener(\"keydown\", onKey, true);\n return () => {\n document.removeEventListener(\"mousedown\", onDocClick, true);\n document.removeEventListener(\"keydown\", onKey, true);\n };\n }, [open]);\n\n return (\n <span ref={rootRef} className={cn(\"lj-se-pop-root\", className)}>\n {trigger({ open, toggle: () => setOpen((v) => !v) })}\n {open && target\n ? createPortal(\n <div\n ref={panelRef}\n role=\"menu\"\n className={cn(\"lj-se-pop-panel\", panelClassName)}\n style={{\n position: \"fixed\",\n top: coords?.top,\n bottom: coords?.bottom,\n left: coords?.left ?? -9999,\n transform: coords?.transform,\n }}\n >\n {children({ close: () => setOpen(false) })}\n </div>,\n target,\n )\n : null}\n </span>\n );\n}\n","/**\n * RowControlHandle — the left-margin \"control mark\" for one script row, plus\n * RowMenuPanel, the data-driven menu body shared by every structural popover\n * (row ops here, scene ops in scene-header, episode ops in script-stream) so the\n * three menus can't drift apart.\n *\n * Craft notes (this is meant to feel like ink on paper, not a chrome button):\n * - invisible at rest; fades to a faint ink mark when its row is hovered;\n * - on its own hover it deepens + grows a soft warm halo (radial, no border)\n * and lifts slightly — all eased, no hard states;\n * - opens a parchment-toned menu holding every structural op for the row:\n * change-type (segmented), insert above/below, split-scene-here, delete.\n *\n * Pure: emits intents; SceneEditor wires them to mutations.\n */\nimport { Fragment } from \"react\";\nimport {\n ArrowDown,\n ArrowUp,\n BookOpen,\n Brain,\n Film,\n GripVertical,\n MessageCircle,\n Scissors,\n Trash2,\n} from \"lucide-react\";\nimport { ScriptContentType } from \"../types.js\";\nimport { Popover } from \"./popover.js\";\nimport { cn } from \"../cn.js\";\n\ntype IconComponent = React.ComponentType<{ className?: string; strokeWidth?: number }>;\n\nconst TYPES: Array<{ value: ScriptContentType; label: string; icon: IconComponent }> = [\n { value: ScriptContentType.Dialogue, label: \"对白\", icon: MessageCircle },\n { value: ScriptContentType.Action, label: \"动作\", icon: Film },\n { value: ScriptContentType.InnerThought, label: \"心声\", icon: Brain },\n { value: ScriptContentType.Narration, label: \"旁白\", icon: BookOpen },\n];\n\nexport interface RowMenuItem {\n icon: IconComponent;\n label: string;\n onSelect: () => void;\n /** styles the item as destructive (warm-red) */\n danger?: boolean;\n /** extra class on the glyph (e.g. the scissors rotation) */\n glyphClassName?: string;\n}\n\n/**\n * The shared parchment menu body. `sections` are rendered with a hairline\n * divider between them (and after the optional change-type segment); each\n * action closes the popover before firing.\n */\nexport function RowMenuPanel({\n close,\n typeSeg,\n sections,\n}: {\n close: () => void;\n /** optional \"改为\" segmented type switcher at the top */\n typeSeg?: { current?: ScriptContentType | string; onChange: (type: ScriptContentType) => void };\n sections: RowMenuItem[][];\n}) {\n return (\n <div className=\"lj-se-rowmenu-inner\">\n {typeSeg ? (\n <>\n <div className=\"lj-se-rowmenu-cap\">改为</div>\n <div className=\"lj-se-typeseg\">\n {TYPES.map((t) => {\n const Icon = t.icon;\n const on = t.value === typeSeg.current;\n return (\n <button\n key={t.value}\n type=\"button\"\n className={cn(\"lj-se-typeseg-item\", on && \"is-on\")}\n onClick={() => {\n close();\n if (!on) typeSeg.onChange(t.value);\n }}\n >\n <Icon className=\"lj-se-ic-4\" strokeWidth={1.5} />\n <span>{t.label}</span>\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n {sections.map((items, si) => (\n <Fragment key={si}>\n {si > 0 || typeSeg ? <div className=\"lj-se-rowmenu-div\" /> : null}\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cn(\"lj-se-rowmenu-item\", item.danger && \"lj-se-rowmenu-del\")}\n onClick={() => {\n close();\n item.onSelect();\n }}\n >\n <Icon className={cn(\"lj-se-ic-4 lj-se-rowmenu-glyph\", item.glyphClassName)} strokeWidth={1.5} />\n {item.label}\n </button>\n );\n })}\n </Fragment>\n ))}\n </div>\n );\n}\n\nexport function RowControlHandle({\n currentType,\n canSplit,\n disabled,\n dragHandleProps,\n onChangeType,\n onInsertAbove,\n onInsertBelow,\n onSplitHere,\n onDelete,\n}: {\n currentType?: ScriptContentType | string;\n canSplit?: boolean;\n disabled?: boolean;\n /** spread onto the grip to make it a native drag handle (reorder rows) */\n dragHandleProps?: React.HTMLAttributes<HTMLButtonElement> & { draggable?: boolean };\n onChangeType: (type: ScriptContentType) => void;\n onInsertAbove: () => void;\n onInsertBelow: () => void;\n onSplitHere?: () => void;\n onDelete: () => void;\n}) {\n if (disabled) return null;\n const insertSection: RowMenuItem[] = [\n { icon: ArrowUp, label: \"在上方插入\", onSelect: onInsertAbove },\n { icon: ArrowDown, label: \"在下方插入\", onSelect: onInsertBelow },\n ];\n if (canSplit && onSplitHere) {\n insertSection.push({\n icon: Scissors,\n label: \"从此另起一场\",\n onSelect: onSplitHere,\n glyphClassName: \"lj-se-scissors-rot\",\n });\n }\n return (\n <Popover\n align=\"start\"\n side=\"bottom\"\n className=\"lj-se-handle-pop\"\n panelClassName=\"lj-se-rowmenu\"\n trigger={({ open, toggle }) => (\n <button\n type=\"button\"\n {...dragHandleProps}\n className={cn(\"lj-se-handle\", open && \"is-open\", dragHandleProps?.draggable && \"is-draggable\")}\n title=\"拖动排序 · 点击操作\"\n aria-label=\"行操作\"\n onClick={toggle}\n >\n <GripVertical className=\"lj-se-handle-grip\" strokeWidth={1.5} />\n </button>\n )}\n >\n {({ close }) => (\n <RowMenuPanel\n close={close}\n typeSeg={{ current: currentType, onChange: onChangeType }}\n sections={[insertSection, [{ icon: Trash2, label: \"删除这行\", onSelect: onDelete, danger: true }]]}\n />\n )}\n </Popover>\n );\n}\n","/**\n * Shared row-drag state across the whole stream so a row can be dragged from\n * one scene and dropped into another. SceneEditor reports drag start / hover /\n * drop through this context; ScriptStream owns the state and commits the move\n * (same-scene or cross-scene) via a single moveScriptItem patch.\n */\nimport { createContext, useContext } from \"react\";\n\nexport interface DragSource {\n ep: number;\n sc: number;\n idx: number;\n}\nexport interface DropTarget {\n ep: number;\n sc: number;\n slot: number;\n}\n\nexport interface DragReorderApi {\n source: DragSource | null;\n dropAt: DropTarget | null;\n begin: (s: DragSource) => void;\n hover: (t: DropTarget) => void;\n drop: () => void;\n end: () => void;\n}\n\nexport const DragReorderContext = createContext<DragReorderApi | null>(null);\n\nexport function useDragReorder(): DragReorderApi | null {\n return useContext(DragReorderContext);\n}\n","import { ScriptContentType, type Scene, type ScriptItem, type ScriptProject } from \"../types\";\nimport { isActorBearingContentType } from \"../utils\";\n\nfunction withSceneUpdated(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n updater: (scene: Scene) => Scene,\n): ScriptProject {\n const episodes = [...(data.episodes || [])];\n const episode = episodes[episodeIndex];\n if (!episode) return data;\n const scenes = [...(episode.scenes || [])];\n const scene = scenes[sceneIndex];\n if (!scene) return data;\n scenes[sceneIndex] = updater(scene);\n episodes[episodeIndex] = { ...episode, scenes };\n return { ...data, episodes };\n}\n\n/**\n * 切换某条行的 type,静默清理不相关字段:\n * - 切到 dialogue / inner_thought:保留或继承 actor_id\n * - 切到非人物行:删 actor_id / emotion\n * - 切到 inner_thought:删 dialogue 专用的 emotion\n */\nexport function updateSceneItemType(\n data: ScriptProject,\n episodeIndex: number,\n sceneIndex: number,\n itemIndex: number,\n type: ScriptContentType,\n): ScriptProject {\n return withSceneUpdated(data, episodeIndex, sceneIndex, (scene) => {\n const actions = [...(scene.actions || [])];\n const current = actions[itemIndex];\n if (!current) return scene;\n const next: ScriptItem = { ...current, type };\n if (!isActorBearingContentType(type)) {\n delete next.actor_id;\n delete next.emotion;\n } else {\n next.actor_id = next.actor_id?.trim() || pickInheritedActorId(scene, itemIndex);\n if (type !== ScriptContentType.Dialogue) {\n delete next.emotion;\n }\n }\n actions[itemIndex] = next;\n return { ...scene, actions };\n });\n}\n\n/**\n * 为 TypePicker 选完类型后构建一条空 item。新建对白/心声时可继承上一条人物行。\n */\nexport function buildNewScriptItem(\n type: ScriptContentType,\n inheritedActorId?: string,\n): ScriptItem {\n if (isActorBearingContentType(type)) {\n return {\n type,\n actor_id: inheritedActorId?.trim() || \"\",\n content: \"\",\n };\n }\n return { type, content: \"\" };\n}\n\n/**\n * 从 scene.actions 中取距离 beforeIndex 最近的上一条对白/心声 actor_id,没有则返回空串。\n */\nexport function pickInheritedActorId(scene: Scene, beforeIndex: number): string {\n const actions = scene.actions || [];\n for (let i = beforeIndex - 1; i >= 0; i -= 1) {\n const item = actions[i];\n if (item && isActorBearingContentType(item.type) && item.actor_id?.trim()) {\n return item.actor_id.trim();\n }\n }\n return \"\";\n}\n","/**\n * SelectField — a native <select> styled to read like inline text (no chrome,\n * dotted-underline on hover). Used for enum-ish picks: INT/EXT, time of day,\n * location / actor reference, asset state. Native select gives free keyboard\n * + accessibility; we only restyle it.\n */\nimport { useContext } from \"react\";\nimport { cn } from \"../cn.js\";\nimport { HighlightContext } from \"./highlighted-text.js\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\nexport function SelectField({\n value,\n options,\n onChange,\n disabled,\n title,\n placeholder,\n mono,\n className,\n style,\n emptyOptionLabel,\n}: {\n value: string;\n options: SelectOption[];\n onChange: (next: string) => void;\n disabled?: boolean;\n title?: string;\n placeholder?: string;\n mono?: boolean;\n className?: string;\n style?: React.CSSProperties;\n /** shown as a leading disabled option when value is empty */\n emptyOptionLabel?: string;\n}) {\n const highlight = useContext(HighlightContext).trim();\n const selectedLabel =\n options.find((o) => o.value === value)?.label ??\n (value ? value : placeholder ?? emptyOptionLabel ?? \"—\");\n const highlighted = !!highlight && selectedLabel.toLocaleLowerCase().includes(highlight.toLocaleLowerCase());\n return (\n <select\n disabled={disabled}\n value={value}\n title={title}\n onChange={(e) => onChange(e.target.value)}\n style={style}\n className={cn(\"lj-se-select\", mono && \"lj-se-mono\", highlighted && \"is-search-hit\", className)}\n >\n {!value || !options.some((o) => o.value === value) ? (\n <option value={value}>{placeholder ?? emptyOptionLabel ?? \"—\"}</option>\n ) : null}\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n );\n}\n","/**\n * CAST + PROP reference rows for a scene. Each chip shows the asset name (actor\n * chips tinted by per-actor cue color), an inline state <select>, and a 2-step\n * delete. An add-popover appends a not-yet-referenced asset. Pure: all writes\n * go through onSaveData mutations; asset deletion can be routed to the host via\n * onRequestAssetDelete.\n */\nimport { Eraser, Plus } from \"lucide-react\";\nimport type { Scene, ScriptActor, ScriptProject, ScriptProp } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport {\n updateSceneActorState,\n updateSceneField,\n updateScenePropState,\n} from \"../mutations/editor-utils.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getPropDisplayName,\n getPropMap,\n getSceneContext,\n getStateDisplayName,\n} from \"../utils.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { Popover } from \"../primitives/popover.js\";\nimport { HighlightedText } from \"../primitives/highlighted-text.js\";\nimport { cn } from \"../cn.js\";\n\nexport interface AssetDeleteRequest {\n kind: \"actor\" | \"location\" | \"prop\";\n id: string;\n name: string;\n description?: string;\n /** -1 when the request originates from the asset library card (no scene) */\n episodeIndex: number;\n sceneIndex: number;\n}\n\nfunction stateOptions(states: ScriptActor[\"states\"]): SelectOption[] {\n return (states ?? [])\n .map((s) => ({ value: (s.state_id ?? \"\").trim(), label: getStateDisplayName(s) }))\n .filter((o) => o.value);\n}\n\nfunction AssetStateChip({\n name,\n orphan,\n states,\n currentStateId,\n disabled,\n onChangeState,\n onDelete,\n onNavigate,\n}: {\n name: string;\n orphan?: boolean;\n states: ScriptActor[\"states\"];\n currentStateId?: string | null;\n disabled: boolean;\n onChangeState: (next: string | null) => void;\n onDelete: () => void;\n /** jump to this asset's card in the stream (scene→asset navigation) */\n onNavigate?: () => void;\n}) {\n const opts = stateOptions(states);\n const trimmed = (currentStateId ?? \"\").trim();\n return (\n <span className={cn(\"lj-se-chip\", orphan && \"is-orphan\")} title={orphan ? `${name} 不存在` : undefined}>\n {onNavigate ? (\n <button type=\"button\" className=\"lj-se-chip-name lj-se-chip-name--link\" title={`跳到 ${name}`} onClick={onNavigate}>\n <HighlightedText text={name} />\n </button>\n ) : (\n <span className=\"lj-se-chip-name\"><HighlightedText text={name} /></span>\n )}\n <span className=\"lj-se-chip-sep\">·</span>\n <SelectField\n value={trimmed}\n options={opts}\n placeholder=\"默认\"\n disabled={disabled}\n className=\"lj-se-chip-state\"\n onChange={(v) => onChangeState(v || null)}\n />\n {!disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-chip-del\"\n title={`从本场移除 ${name}`}\n aria-label={`从本场移除 ${name}`}\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n >\n <Eraser className=\"lj-se-ic-3\" strokeWidth={1.5} />\n </button>\n ) : null}\n </span>\n );\n}\n\nfunction AddRefControl({\n options,\n existingIds,\n disabled,\n emptyHint,\n onAdd,\n}: {\n options: SelectOption[];\n existingIds: string[];\n disabled: boolean;\n emptyHint: string;\n onAdd: (id: string) => void;\n}) {\n if (disabled) return null;\n const available = options.filter((o) => !existingIds.includes(o.value));\n return (\n <Popover\n trigger={({ toggle }) => (\n <button type=\"button\" className=\"lj-se-chip-add\" title=\"添加引用\" onClick={toggle}>\n <Plus className=\"lj-se-icon-sm\" strokeWidth={1.5} />\n </button>\n )}\n >\n {({ close }) => (\n <div className=\"lj-se-addmenu\">\n {available.length === 0 ? (\n <div className=\"lj-se-addmenu-empty\">{emptyHint}</div>\n ) : (\n available.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n className=\"lj-se-addmenu-item\"\n onClick={() => {\n close();\n onAdd(o.value);\n }}\n >\n {o.label}\n </button>\n ))\n )}\n </div>\n )}\n </Popover>\n );\n}\n\nexport function SceneCastPropRows({\n scene,\n episodeIndex,\n sceneIndex,\n actorMap,\n propMap,\n disabled,\n onSaveData,\n onRequestAssetDelete,\n onNavigateAsset,\n}: {\n scene: Scene;\n episodeIndex: number;\n sceneIndex: number;\n actorMap: ReturnType<typeof getActorMap>;\n propMap: ReturnType<typeof getPropMap>;\n disabled: boolean;\n onSaveData: (updater: (current: ScriptProject) => ScriptProject) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n /** scene→asset navigation: jump to the asset's card in the stream */\n onNavigateAsset?: (sel: StudioSelection) => void;\n}) {\n const context = getSceneContext(scene);\n const sceneActors = context.actors ?? [];\n const sceneProps = context.props ?? [];\n const currentActorIds = sceneActors.map((i) => (i.actor_id ?? \"\").trim()).filter(Boolean);\n const currentPropIds = sceneProps.map((i) => (i.prop_id ?? \"\").trim()).filter(Boolean);\n\n const actorOptions: SelectOption[] = Array.from(actorMap.values())\n .map((a) => ({ value: (a.actor_id ?? \"\").trim(), label: getActorDisplayName(a) }))\n .filter((o) => o.value);\n const propOptions: SelectOption[] = Array.from(propMap.values())\n .map((p) => ({ value: (p.prop_id ?? \"\").trim(), label: getPropDisplayName(p) }))\n .filter((o) => o.value);\n\n const writeRefs = (field: \"actors\" | \"props\", nextIds: string[]) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, field, nextIds.join(\",\")));\n\n return (\n <div className=\"lj-se-refs\">\n <div className=\"lj-se-ref-row\">\n <span className=\"lj-se-ref-label\">CAST</span>\n <div className=\"lj-se-ref-chips\">\n {sceneActors.length === 0 ? <span className=\"lj-se-ref-empty\">—</span> : null}\n {sceneActors.map((ref, idx) => {\n const id = (ref.actor_id ?? \"\").trim();\n if (!id) return null;\n const actor = actorMap.get(id);\n const name = actor ? getActorDisplayName(actor) : id;\n return (\n <AssetStateChip\n key={`${id}-${idx}`}\n name={name}\n orphan={!actor}\n states={actor?.states}\n currentStateId={ref.state_id}\n disabled={disabled}\n onNavigate={onNavigateAsset ? () => onNavigateAsset({ kind: \"actor\", actorId: id, origin: \"reference\" }) : undefined}\n onChangeState={(next) =>\n onSaveData((cur) =>\n updateSceneActorState(cur, episodeIndex, sceneIndex, id, next),\n )\n }\n onDelete={() => {\n if (onRequestAssetDelete) {\n onRequestAssetDelete({\n kind: \"actor\",\n id,\n name,\n description: actor?.description,\n episodeIndex,\n sceneIndex,\n });\n return;\n }\n writeRefs(\"actors\", currentActorIds.filter((x) => x !== id));\n }}\n />\n );\n })}\n <AddRefControl\n options={actorOptions}\n existingIds={currentActorIds}\n disabled={disabled}\n emptyHint=\"没有可添加的角色\"\n onAdd={(id) =>\n currentActorIds.includes(id) ? undefined : writeRefs(\"actors\", [...currentActorIds, id])\n }\n />\n </div>\n </div>\n\n <div className=\"lj-se-ref-row\">\n <span className=\"lj-se-ref-label\">PROP</span>\n <div className=\"lj-se-ref-chips\">\n {sceneProps.length === 0 ? <span className=\"lj-se-ref-empty\">—</span> : null}\n {sceneProps.map((ref, idx) => {\n const id = (ref.prop_id ?? \"\").trim();\n if (!id) return null;\n const prop = propMap.get(id);\n const name = prop ? getPropDisplayName(prop) : id;\n return (\n <AssetStateChip\n key={`${id}-${idx}`}\n name={name}\n orphan={!prop}\n states={prop?.states}\n currentStateId={ref.state_id}\n disabled={disabled}\n onNavigate={onNavigateAsset ? () => onNavigateAsset({ kind: \"prop\", propId: id, origin: \"reference\" }) : undefined}\n onChangeState={(next) =>\n onSaveData((cur) =>\n updateScenePropState(cur, episodeIndex, sceneIndex, id, next),\n )\n }\n onDelete={() => {\n if (onRequestAssetDelete) {\n onRequestAssetDelete({\n kind: \"prop\",\n id,\n name,\n description: prop?.description,\n episodeIndex,\n sceneIndex,\n });\n return;\n }\n writeRefs(\"props\", currentPropIds.filter((x) => x !== id));\n }}\n />\n );\n })}\n <AddRefControl\n options={propOptions}\n existingIds={currentPropIds}\n disabled={disabled}\n emptyHint=\"没有可添加的道具\"\n onAdd={(id) =>\n currentPropIds.includes(id) ? undefined : writeRefs(\"props\", [...currentPropIds, id])\n }\n />\n </div>\n </div>\n </div>\n );\n}\n","/**\n * SceneHeader — scene number + slug (\"INT./EXT. · LOCATION — TIME\") + location\n * state + delete, plus the CAST/PROP reference rows. All picks are inline\n * <select> styled as text; scene number is NOT renumbered on structural edits\n * (assets are keyed by scene_id).\n */\nimport type { ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { ArrowUpToLine, Trash2 } from \"lucide-react\";\nimport type { Scene, ScriptProject } from \"../types.js\";\nimport {\n deleteScene,\n getPrimarySceneLocationId,\n mergeSceneIntoPrev,\n updateSceneField,\n updateSceneLocationState,\n} from \"../mutations/editor-utils.js\";\nimport {\n getActorMap,\n getLocationDisplayName,\n getLocationMap,\n getPropMap,\n getSceneContext,\n getSceneNumber,\n getStateDisplayName,\n} from \"../utils.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { Popover } from \"../primitives/popover.js\";\nimport { RowMenuPanel, type RowMenuItem } from \"../primitives/row-menu.js\";\nimport { SceneCastPropRows, type AssetDeleteRequest } from \"./scene-cast-prop-rows.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { cn } from \"../cn.js\";\n\n/**\n * The scene number doubles as the scene's control hub — hovering warms it with\n * a soft ink halo; clicking opens scene-level structural ops (merge into the\n * previous scene / delete the whole scene). Keeps every structural command on\n * the left margin, in the paper's own ink.\n */\nfunction SceneNumberMenu({\n label,\n triggerClassName,\n canMerge,\n disabled,\n onMerge,\n onDelete,\n}: {\n label: ReactNode;\n triggerClassName: string;\n canMerge: boolean;\n disabled: boolean;\n onMerge: () => void;\n onDelete: () => void;\n}) {\n if (disabled) {\n return <span className={triggerClassName}>{label}</span>;\n }\n const items: RowMenuItem[] = [];\n if (canMerge) items.push({ icon: ArrowUpToLine, label: \"并入上一场\", onSelect: onMerge });\n items.push({ icon: Trash2, label: \"删除整场\", onSelect: onDelete, danger: true });\n return (\n <Popover\n align=\"start\"\n side=\"bottom\"\n className=\"lj-se-scenenum-pop\"\n panelClassName=\"lj-se-rowmenu\"\n trigger={({ open, toggle }) => (\n <button\n type=\"button\"\n className={cn(triggerClassName, \"lj-se-scenenum-btn\", open && \"is-open\")}\n title=\"场操作\"\n aria-label=\"场操作\"\n onClick={toggle}\n >\n {label}\n </button>\n )}\n >\n {({ close }) => <RowMenuPanel close={close} sections={[items]} />}\n </Popover>\n );\n}\n\nconst SPACE_OPTIONS: SelectOption[] = [\n { value: \"interior\", label: \"INT.\" },\n { value: \"exterior\", label: \"EXT.\" },\n];\nconst TIME_OPTIONS: SelectOption[] = [\n { value: \"day\", label: \"DAY\" },\n { value: \"night\", label: \"NIGHT\" },\n { value: \"dawn\", label: \"DAWN\" },\n { value: \"dusk\", label: \"DUSK\" },\n];\n// Asian print labels: 时/空 in Chinese\nconst ASIAN_SPACE_OPTIONS: SelectOption[] = [\n { value: \"interior\", label: \"内\" },\n { value: \"exterior\", label: \"外\" },\n];\nconst ASIAN_TIME_OPTIONS: SelectOption[] = [\n { value: \"day\", label: \"日\" },\n { value: \"night\", label: \"夜\" },\n { value: \"dawn\", label: \"晨\" },\n { value: \"dusk\", label: \"暮\" },\n];\n\nexport function SceneHeader({\n scene,\n episodeIndex,\n sceneIndex,\n actorMap,\n locationMap,\n propMap,\n disabled,\n focused = false,\n format = \"standard\",\n onSaveData,\n onRequestAssetDelete,\n onNavigateAsset,\n}: {\n scene: Scene;\n episodeIndex: number;\n sceneIndex: number;\n actorMap: ReturnType<typeof getActorMap>;\n locationMap: ReturnType<typeof getLocationMap>;\n propMap: ReturnType<typeof getPropMap>;\n disabled: boolean;\n focused?: boolean;\n format?: \"standard\" | \"asian\";\n onSaveData: (updater: (current: ScriptProject) => ScriptProject) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n onNavigateAsset?: (sel: StudioSelection) => void;\n}) {\n const primaryLocationId = getPrimarySceneLocationId(scene);\n const location = primaryLocationId ? locationMap.get(primaryLocationId) : undefined;\n const hasOrphanLocation = !!primaryLocationId && !location;\n const locationStateId = getSceneContext(scene).locations.find(\n (i) => (i.location_id ?? \"\").trim() === primaryLocationId,\n )?.state_id;\n\n const locationOptions = useMemo<SelectOption[]>(\n () =>\n Array.from(locationMap.values())\n .map((loc) => ({ value: (loc.location_id ?? \"\").trim(), label: getLocationDisplayName(loc) }))\n .filter((o) => o.value),\n [locationMap],\n );\n const locationStateOptions = useMemo<SelectOption[]>(\n () =>\n (location?.states ?? [])\n .map((s) => ({ value: (s.state_id ?? \"\").trim(), label: getStateDisplayName(s) }))\n .filter((o) => o.value),\n [location],\n );\n\n // ── Asian print heading: \"n. 地点 日/内\" (compact, no cast/prop rows) ──\n if (format === \"asian\") {\n return (\n <div className=\"lj-se-asian-head group\">\n <SceneNumberMenu\n label={`${getSceneNumber(scene, sceneIndex)}.`}\n triggerClassName=\"lj-se-asian-num\"\n canMerge={sceneIndex > 0}\n disabled={disabled}\n onMerge={() => onSaveData((cur) => mergeSceneIntoPrev(cur, episodeIndex, sceneIndex))}\n onDelete={() => onSaveData((cur) => deleteScene(cur, episodeIndex, sceneIndex))}\n />\n <SelectField\n value={primaryLocationId}\n options={locationOptions}\n disabled={disabled}\n placeholder=\"地点\"\n className={cn(\"lj-se-asian-loc\", hasOrphanLocation && \"is-orphan\")}\n onChange={(v) => onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"location\", v))}\n />\n <span className=\"lj-se-asian-slug\">\n <SelectField\n mono\n value={scene.environment?.time || \"day\"}\n options={ASIAN_TIME_OPTIONS}\n disabled={disabled}\n onChange={(v) => onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"time\", v))}\n />\n <span className=\"lj-se-asian-slash\">/</span>\n <SelectField\n mono\n value={scene.environment?.space || \"interior\"}\n options={ASIAN_SPACE_OPTIONS}\n disabled={disabled}\n onChange={(v) => onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"space\", v))}\n />\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"lj-se-scene-head group\">\n <div className=\"lj-se-scene-headrow\">\n <SceneNumberMenu\n label={String(getSceneNumber(scene, sceneIndex))}\n triggerClassName={cn(\"lj-se-scene-num\", focused && \"is-focused\")}\n canMerge={sceneIndex > 0}\n disabled={disabled}\n onMerge={() => onSaveData((cur) => mergeSceneIntoPrev(cur, episodeIndex, sceneIndex))}\n onDelete={() => onSaveData((cur) => deleteScene(cur, episodeIndex, sceneIndex))}\n />\n <div className=\"lj-se-scene-slug\">\n <SelectField\n mono\n value={scene.environment?.space || \"interior\"}\n options={SPACE_OPTIONS}\n disabled={disabled}\n onChange={(v) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"space\", v))\n }\n />\n <SelectField\n value={primaryLocationId}\n options={locationOptions}\n disabled={disabled}\n placeholder=\"选择地点\"\n title={hasOrphanLocation ? `地点 ${primaryLocationId} 不存在` : undefined}\n className={cn(\"lj-se-slug-loc\", hasOrphanLocation && \"is-orphan\")}\n onChange={(v) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"location\", v))\n }\n />\n <span className=\"lj-se-slug-dash\">—</span>\n <SelectField\n mono\n value={scene.environment?.time || \"day\"}\n options={TIME_OPTIONS}\n disabled={disabled}\n onChange={(v) =>\n onSaveData((cur) => updateSceneField(cur, episodeIndex, sceneIndex, \"time\", v))\n }\n />\n {locationStateOptions.length > 0 ? (\n <SelectField\n value={(locationStateId ?? \"\").trim()}\n options={locationStateOptions}\n placeholder=\"无状态\"\n disabled={disabled}\n className=\"lj-se-slug-state\"\n onChange={(v) =>\n onSaveData((cur) =>\n updateSceneLocationState(cur, episodeIndex, sceneIndex, primaryLocationId, v || null),\n )\n }\n />\n ) : null}\n </div>\n </div>\n\n <SceneCastPropRows\n scene={scene}\n episodeIndex={episodeIndex}\n sceneIndex={sceneIndex}\n actorMap={actorMap}\n propMap={propMap}\n disabled={disabled}\n onSaveData={onSaveData}\n onRequestAssetDelete={onRequestAssetDelete}\n onNavigateAsset={onNavigateAsset}\n />\n </div>\n );\n}\n","/**\n * 角色对话名色板:按 actor_id 稳定 hash 到 8 色之一。\n * 色板定义在 globals.css 的 --actor-cue-1..8(亮/暗各一份),\n * 已调过亮度与饱和度,保证在牛皮纸底色上可读且互相错开。\n *\n * 没有 actor_id 时退回 --paper-cue-dialogue / --paper-cue-inner。\n */\n\nconst PALETTE_SIZE = 8;\n\nfunction hashActorId(id: string): number {\n let h = 5381;\n for (let i = 0; i < id.length; i++) {\n h = (h * 33) ^ id.charCodeAt(i);\n }\n return Math.abs(h | 0);\n}\n\nexport function getActorCueVar(\n actorId: string | null | undefined,\n tone: \"dialogue\" | \"inner\" = \"dialogue\",\n): string {\n const id = actorId?.trim();\n if (!id) {\n return tone === \"inner\" ? \"var(--lj-se-cue-inner)\" : \"var(--lj-se-cue-dialogue)\";\n }\n const idx = (hashActorId(id) % PALETTE_SIZE) + 1;\n return `var(--lj-se-actor-cue-${idx})`;\n}\n","/**\n * SceneItemRow — one action / dialogue / inner-thought / narration line.\n *\n * Renders in two formats (both EDITABLE via the click-to-edit primitive):\n * - \"standard\": centered speaker cue + centered dialogue (screenplay look)\n * - \"asian\": compact inline \"角色(情绪):内容\" print look\n *\n * Free text (content, emotion) uses <EditableText>; the speaker/actor is an\n * inline <select>. Hover reveals a type-change picker + 2-step delete.\n * Memoized so editing one row in a long scene re-renders only that row.\n */\nimport { memo } from \"react\";\nimport type { ScriptItem } from \"../types.js\";\nimport { ScriptContentType } from \"../types.js\";\nimport {\n findState,\n getActorDisplayName,\n getActorMap,\n getDialogueDeliveryLabel,\n getDialogueSpeakerLabel,\n getLocationDisplayName,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n getSpeakerMap,\n getStateDisplayName,\n isActorBearingContentType,\n translateEmotionLabel,\n} from \"../utils.js\";\nimport { getActorCueVar } from \"../actor-color.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { RowControlHandle } from \"../primitives/row-menu.js\";\nimport { HighlightedText } from \"../primitives/highlighted-text.js\";\nimport { cn } from \"../cn.js\";\n\nexport type ScriptFormat = \"standard\" | \"asian\";\n\nfunction formatStateChangeLabels(\n item: ScriptItem,\n actorMap: ReturnType<typeof getActorMap>,\n locationMap: ReturnType<typeof getLocationMap>,\n propMap: ReturnType<typeof getPropMap>,\n): string[] {\n const labels = (item.state_changes ?? [])\n .map((change) => {\n const kind = change.target_kind?.trim() || \"actor\";\n const id = change.target_id?.trim() || \"\";\n if (!id) return \"\";\n const states =\n kind === \"location\"\n ? locationMap.get(id)?.states\n : kind === \"prop\"\n ? propMap.get(id)?.states\n : actorMap.get(id)?.states;\n const name =\n kind === \"location\"\n ? getLocationDisplayName(locationMap.get(id)) || id\n : kind === \"prop\"\n ? getPropDisplayName(propMap.get(id)) || id\n : getActorDisplayName(actorMap.get(id)) || id;\n const from = getStateDisplayName(findState(states, change.from_state_id)) || change.from_state_id?.trim() || \"未设\";\n const to = getStateDisplayName(findState(states, change.to_state_id)) || change.to_state_id?.trim() || \"未设\";\n return `${name}:${from} → ${to}`;\n })\n .filter(Boolean);\n if (item.transition_prompt?.process || item.transition_prompt?.contrast) {\n labels.push(\"画面变化已设置\");\n }\n return labels;\n}\n\nfunction StateBadges({ labels }: { labels: string[] }) {\n if (labels.length === 0) return null;\n return (\n <div className=\"lj-se-state-badges\">\n {labels.map((label, i) => (\n <span key={`${label}-${i}`} className=\"lj-se-state-badge\">\n {label}\n </span>\n ))}\n </div>\n );\n}\n\nfunction SceneItemRowImpl({\n item,\n actorMap,\n speakerMap = new Map(),\n locationMap = new Map(),\n propMap = new Map(),\n actorOptions,\n format,\n disabled,\n autoEdit,\n onEditEnd,\n canSplit,\n dragHandleProps,\n onSave,\n onSaveActor,\n onSaveEmotion,\n onChangeType,\n onInsertAbove,\n onInsertBelow,\n onSplitHere,\n onDelete,\n}: {\n item: ScriptItem;\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap?: ReturnType<typeof getSpeakerMap>;\n locationMap?: ReturnType<typeof getLocationMap>;\n propMap?: ReturnType<typeof getPropMap>;\n actorOptions: SelectOption[];\n format: ScriptFormat;\n disabled: boolean;\n autoEdit?: boolean;\n onEditEnd?: () => void;\n canSplit?: boolean;\n dragHandleProps?: React.HTMLAttributes<HTMLButtonElement> & { draggable?: boolean };\n onSave: (value: string) => void;\n onSaveActor: (actorId: string) => void;\n onSaveEmotion: (emotion: string) => void;\n onChangeType: (type: ScriptContentType) => void;\n onInsertAbove: () => void;\n onInsertBelow: () => void;\n onSplitHere?: () => void;\n onDelete: () => void;\n}) {\n const type = (item.type as ScriptContentType) ?? ScriptContentType.Dialogue;\n const content = item.content ?? \"\";\n const actorId = item.actor_id?.trim() || \"\";\n const emotion = translateEmotionLabel(item.emotion);\n const stateLabels = formatStateChangeLabels(item, actorMap, locationMap, propMap);\n // Only genuinely multi-speaker lines (overlap / per-line speakers / >1 speaker)\n // stay read-only. A SINGLE-speaker line is editable via the actor picker even\n // if it uses the structured speaker_id model.\n const multiSpeaker =\n type === ScriptContentType.Dialogue &&\n (item.delivery === \"overlap\" || (item.lines?.length ?? 0) > 0 || (item.speakers?.length ?? 0) > 1);\n // Resolve speaker_id → its source actor so the picker reflects the current\n // speaker (single-speaker structured lines store the actor under speaker_id).\n const resolvedActorId =\n actorId ||\n (() => {\n const spkId = item.speaker_id?.trim() || item.speakers?.[0]?.speaker_id?.trim() || \"\";\n if (!spkId) return \"\";\n const spk = speakerMap.get(spkId);\n const kind = spk?.source_kind?.trim();\n // the speaker's source can be an actor OR a prop (radio / TV / phone …)\n if ((kind === \"actor\" || kind === \"prop\") && spk?.source_id?.trim()) return spk.source_id.trim();\n if (spkId.startsWith(\"spk_\") && actorMap.has(spkId.slice(4))) return spkId.slice(4);\n return \"\";\n })();\n // resolve to an actor OR a prop — the cue/value works for either\n const resolvedActor = actorMap.get(resolvedActorId) ?? propMap.get(resolvedActorId);\n\n const handle = (\n <RowControlHandle\n currentType={type}\n canSplit={canSplit}\n disabled={disabled}\n dragHandleProps={dragHandleProps}\n onChangeType={onChangeType}\n onInsertAbove={onInsertAbove}\n onInsertBelow={onInsertBelow}\n onSplitHere={onSplitHere}\n onDelete={onDelete}\n />\n );\n\n // ── actor / speaker cue (dialogue + inner) ──────────────────────────────\n const actorCue = (tone: \"dialogue\" | \"inner\") =>\n multiSpeaker ? (\n <span\n className=\"lj-se-cue lj-se-cue--structured\"\n style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}\n >\n <HighlightedText text={getDialogueSpeakerLabel(item, actorMap, speakerMap) || \"未知发声源\"} />\n {getDialogueDeliveryLabel(item.delivery) ? (\n <span className=\"lj-se-cue-delivery\">({getDialogueDeliveryLabel(item.delivery)})</span>\n ) : null}\n </span>\n ) : (\n <SelectField\n value={resolvedActorId}\n options={actorOptions}\n disabled={disabled}\n placeholder=\"未知角色\"\n title=\"切换角色\"\n className={cn(\"lj-se-cue lj-se-cue--select\", resolvedActorId && !resolvedActor && \"is-orphan\")}\n style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}\n onChange={onSaveActor}\n />\n );\n\n // ── STANDARD format ─────────────────────────────────────────────────────\n if (format === \"standard\") {\n let body: React.ReactNode;\n if (type === ScriptContentType.Dialogue) {\n body = (\n <div className=\"lj-se-std-dialogue\">\n {actorCue(\"dialogue\")}\n <div className=\"lj-se-std-emotion\">\n <EditableText value={item.emotion ?? \"\"} disabled={disabled} placeholder=\"情绪…\" onSave={onSaveEmotion} />\n </div>\n <EditableText\n multiline\n value={content}\n disabled={disabled}\n autoEdit={autoEdit}\n onEditEnd={onEditEnd}\n placeholder=\"输入对白…\"\n className=\"lj-se-std-line\"\n onSave={onSave}\n />\n </div>\n );\n } else if (type === ScriptContentType.InnerThought) {\n body = (\n <div className=\"lj-se-std-dialogue\">\n {actorCue(\"inner\")}\n <EditableText\n multiline\n value={content}\n disabled={disabled}\n autoEdit={autoEdit}\n onEditEnd={onEditEnd}\n placeholder=\"输入心理活动…\"\n className=\"lj-se-std-inner\"\n onSave={onSave}\n />\n </div>\n );\n } else {\n body = (\n <EditableText\n multiline\n value={content}\n disabled={disabled}\n autoEdit={autoEdit}\n onEditEnd={onEditEnd}\n placeholder={type === ScriptContentType.Narration ? \"输入旁白…\" : \"输入动作…\"}\n className={cn(\"lj-se-std-action\", type === ScriptContentType.Narration && \"is-narration\")}\n onSave={onSave}\n />\n );\n }\n return (\n <div className=\"lj-se-row group\">\n {handle}\n {body}\n <StateBadges labels={stateLabels} />\n </div>\n );\n }\n\n // ── ASIAN format (compact inline print) ─────────────────────────────────\n let body: React.ReactNode;\n if (type === ScriptContentType.Action) {\n body = (\n <p className=\"lj-se-asian-action\">\n <span className=\"lj-se-asian-action-mark\">△</span>\n <EditableText multiline value={content} disabled={disabled} autoEdit={autoEdit} onEditEnd={onEditEnd} placeholder=\"输入动作…\" onSave={onSave} />\n </p>\n );\n } else if (type === ScriptContentType.Narration) {\n body = (\n <p className=\"lj-se-asian-narration\">\n <EditableText multiline value={content} disabled={disabled} autoEdit={autoEdit} onEditEnd={onEditEnd} placeholder=\"输入旁白…\" onSave={onSave} />\n </p>\n );\n } else {\n const isInner = type === ScriptContentType.InnerThought;\n const tone = isInner ? \"inner\" : \"dialogue\";\n const tag = isInner ? (emotion ? `OS·${emotion}` : \"OS\") : emotion;\n body = (\n <p className={cn(\"lj-se-asian-cueline\", isInner && \"is-inner\")}>\n {multiSpeaker ? (\n <strong className=\"lj-se-asian-speaker\" style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}>\n <HighlightedText text={getDialogueSpeakerLabel(item, actorMap, speakerMap)} />\n </strong>\n ) : (\n <SelectField\n value={resolvedActorId}\n options={actorOptions}\n disabled={disabled}\n placeholder=\"未知角色\"\n className={cn(\"lj-se-asian-speaker lj-se-asian-speaker--select\", resolvedActorId && !resolvedActor && \"is-orphan\")}\n style={resolvedActor ? { color: getActorCueVar(resolvedActorId, tone) } : undefined}\n onChange={onSaveActor}\n />\n )}\n {!multiSpeaker ? (\n <span className=\"lj-se-asian-tag\">\n (\n <EditableText value={item.emotion ?? \"\"} disabled={disabled} placeholder={isInner ? \"OS\" : \"情绪\"} onSave={onSaveEmotion} />\n )\n </span>\n ) : tag ? (\n <span className=\"lj-se-asian-tag\">({tag})</span>\n ) : null}\n <span className=\"lj-se-asian-colon\">:</span>\n <EditableText multiline value={content} disabled={disabled} autoEdit={autoEdit} onEditEnd={onEditEnd} placeholder=\"输入对白…\" onSave={onSave} />\n </p>\n );\n }\n return (\n <div className=\"lj-se-row lj-se-row--asian group\">\n {handle}\n {body}\n <StateBadges labels={stateLabels} />\n </div>\n );\n}\n\nexport const SceneItemRow = memo(SceneItemRowImpl);\n\nexport { isActorBearingContentType };\n","/**\n * SceneEditor — one scene: header (slug + cast/prop) + the action rows. Every\n * structural op (insert / change-type / split / delete) lives on the left via\n * each row's RowControlHandle; the scene's own ops (merge / delete) live on the\n * scene number. Pure: every change is a (prev)=>next patch on the whole\n * ScriptProject via onEdit. scene_id is never renumbered by these ops.\n */\nimport { Fragment, memo, useCallback, useMemo, useState } from \"react\";\nimport { Check, Plus, X } from \"lucide-react\";\nimport { cn } from \"../cn.js\";\nimport type { Scene, ScriptItem, ScriptProject } from \"../types.js\";\nimport type { DiffActionMark } from \"../diff/diff-engine.js\";\nimport { ScriptContentType } from \"../types.js\";\nimport {\n deleteSceneItem,\n insertSceneItem,\n splitScene,\n updateSceneItemActor,\n updateSceneItemContent,\n updateSceneItemEmotion,\n} from \"../mutations/editor-utils.js\";\nimport { useDragReorder } from \"../stream/drag-context.js\";\nimport {\n buildNewScriptItem,\n pickInheritedActorId,\n updateSceneItemType,\n} from \"../mutations/item-mutations.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n getSpeakerMap,\n} from \"../utils.js\";\nimport { SelectField, type SelectOption } from \"../primitives/select-field.js\";\nimport { SceneHeader } from \"./scene-header.js\";\nimport { SceneItemRow, type ScriptFormat } from \"./scene-item-row.js\";\nimport type { AssetDeleteRequest } from \"./scene-cast-prop-rows.js\";\nimport type { StudioSelection } from \"../selection.js\";\n\ntype Maps = {\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap: ReturnType<typeof getSpeakerMap>;\n locationMap: ReturnType<typeof getLocationMap>;\n propMap: ReturnType<typeof getPropMap>;\n};\n\n/** the per-line ✓/✗ that sits at the right edge of a changed / ghost row */\nfunction DiffActionControls({ onAccept, onReject }: { onAccept: () => void; onReject: () => void }) {\n return (\n <span className=\"lj-se-actiondiff-ctrl\">\n <button type=\"button\" className=\"lj-se-actiondiff-reject\" title=\"拒绝这行\" onClick={onReject}>\n <X className=\"lj-se-ic-3\" strokeWidth={2.75} />\n </button>\n <button type=\"button\" className=\"lj-se-actiondiff-accept\" title=\"接受这行\" onClick={onAccept}>\n <Check className=\"lj-se-ic-3\" strokeWidth={2.75} />\n </button>\n </span>\n );\n}\n\nfunction SceneEditorImpl({\n episodeIndex,\n sceneIndex,\n scene,\n maps,\n format,\n disabled,\n focused = false,\n actionDiff,\n onEdit,\n onNavigateAsset,\n onRequestAssetDelete,\n}: {\n episodeIndex: number;\n sceneIndex: number;\n scene: Scene;\n maps: Maps;\n format: ScriptFormat;\n disabled: boolean;\n focused?: boolean;\n /** action-level diff for this scene: highlighted rows + removed ghosts + ✓/✗ */\n actionDiff?: {\n byIndex: Map<number, DiffActionMark>;\n removedBefore: Map<number, DiffActionMark[]>;\n onAccept: (mark: DiffActionMark) => void;\n onReject: (mark: DiffActionMark) => void;\n };\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n onNavigateAsset?: (sel: StudioSelection) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n}) {\n const [pendingEdit, setPendingEdit] = useState<number | null>(null);\n const { actorMap, speakerMap, locationMap, propMap } = maps;\n const actions = scene.actions ?? [];\n\n // dialogue speaker candidates = actors + props (a prop like a radio / TV /\n // phone can \"speak\"); props get a (道具)suffix to disambiguate in the list.\n const actorOptions = useMemo<SelectOption[]>(() => {\n const out: SelectOption[] = [];\n for (const a of actorMap.values()) {\n const v = (a.actor_id ?? \"\").trim();\n if (v) out.push({ value: v, label: getActorDisplayName(a) });\n }\n for (const p of propMap.values()) {\n const v = (p.prop_id ?? \"\").trim();\n if (v) out.push({ value: v, label: `${getPropDisplayName(p)}(道具)` });\n }\n return out;\n }, [actorMap, propMap]);\n\n const insertAt = useCallback(\n (index: number, type: ScriptContentType) => {\n const inherited = pickInheritedActorId(scene, index);\n onEdit((cur) => insertSceneItem(cur, episodeIndex, sceneIndex, index, buildNewScriptItem(type, inherited)));\n setPendingEdit(index);\n },\n [onEdit, episodeIndex, sceneIndex, scene],\n );\n\n const clearPending = useCallback(() => setPendingEdit(null), []);\n\n const insertSame = (atIndex: number, refIndex: number) =>\n insertAt(atIndex, (actions[refIndex]?.type as ScriptContentType) ?? ScriptContentType.Dialogue);\n\n // ── drag-to-reorder (shared across scenes via context) ──────────────────\n const dnd = useDragReorder();\n const dragIndex =\n dnd?.source && dnd.source.ep === episodeIndex && dnd.source.sc === sceneIndex ? dnd.source.idx : null;\n const dropSlot =\n dnd?.dropAt && dnd.dropAt.ep === episodeIndex && dnd.dropAt.sc === sceneIndex ? dnd.dropAt.slot : null;\n\n const onDragStart = (e: React.DragEvent, idx: number) => {\n dnd?.begin({ ep: episodeIndex, sc: sceneIndex, idx });\n e.dataTransfer.effectAllowed = \"move\";\n try {\n e.dataTransfer.setData(\"text/plain\", String(idx));\n } catch {\n /* some browsers restrict setData timing */\n }\n // drag ghost = the whole row slot, not just the grip\n const slot = (e.currentTarget as HTMLElement).closest(\".lj-se-action-slot\");\n if (slot) e.dataTransfer.setDragImage(slot, 16, 16);\n };\n\n const onSlotDragOver = (e: React.DragEvent, idx: number) => {\n if (!dnd?.source) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const after = e.clientY > rect.top + rect.height / 2;\n dnd.hover({ ep: episodeIndex, sc: sceneIndex, slot: after ? idx + 1 : idx });\n };\n\n const onSlotDrop = (e: React.DragEvent) => {\n e.preventDefault();\n dnd?.drop();\n };\n\n const noop = () => {};\n // read-only render of an OLD (baseline) action — the deleted line of a\n // modified pair, and the removed \"ghost\" rows.\n const renderOldRow = (item: ScriptItem) => (\n <SceneItemRow\n item={item}\n actorMap={actorMap}\n speakerMap={speakerMap}\n locationMap={locationMap}\n propMap={propMap}\n actorOptions={actorOptions}\n format={format}\n disabled\n onSave={noop}\n onSaveActor={noop}\n onSaveEmotion={noop}\n onChangeType={noop}\n onInsertAbove={noop}\n onInsertBelow={noop}\n onDelete={noop}\n />\n );\n const renderGhosts = (beforeIdx: number) =>\n actionDiff?.removedBefore.get(beforeIdx)?.map((m, gi) => (\n <div key={`ghost-${beforeIdx}-${gi}`} className=\"lj-se-action-slot lj-se-diff-old lj-se-ghost-row\">\n <DiffActionControls onAccept={() => actionDiff.onAccept(m)} onReject={() => actionDiff.onReject(m)} />\n {m.item ? renderOldRow(m.item) : <p className=\"lj-se-ghost-empty\">(已删除空行)</p>}\n </div>\n )) ?? null;\n\n return (\n <div className=\"lj-se-scene\">\n <SceneHeader\n scene={scene}\n episodeIndex={episodeIndex}\n sceneIndex={sceneIndex}\n actorMap={actorMap}\n locationMap={locationMap}\n propMap={propMap}\n disabled={disabled}\n focused={focused}\n format={format}\n onSaveData={onEdit}\n onRequestAssetDelete={onRequestAssetDelete}\n onNavigateAsset={onNavigateAsset}\n />\n\n <div className=\"lj-se-actions\">\n {actions.map((item, idx) => {\n const mark = actionDiff?.byIndex.get(idx);\n return (\n <Fragment key={`item-${idx}`}>\n {renderGhosts(idx)}\n <div\n className={cn(\n \"lj-se-action-slot\",\n dragIndex === idx && \"is-dragging\",\n dropSlot === idx && \"drop-before\",\n mark && (mark.kind === \"added\" ? \"is-diff-added\" : \"is-diff-modified\"),\n )}\n onDragOver={(e) => onSlotDragOver(e, idx)}\n onDrop={onSlotDrop}\n >\n {mark ? (\n <DiffActionControls\n onAccept={() => actionDiff!.onAccept(mark)}\n onReject={() => actionDiff!.onReject(mark)}\n />\n ) : null}\n {mark?.kind === \"modified\" && mark.item ? (\n <div className=\"lj-se-diff-old\">{renderOldRow(mark.item)}</div>\n ) : null}\n <SceneItemRow\n item={item}\n actorMap={actorMap}\n speakerMap={speakerMap}\n locationMap={locationMap}\n propMap={propMap}\n actorOptions={actorOptions}\n format={format}\n disabled={disabled}\n autoEdit={pendingEdit === idx}\n onEditEnd={pendingEdit === idx ? clearPending : undefined}\n canSplit={idx > 0}\n dragHandleProps={\n disabled\n ? undefined\n : { draggable: true, onDragStart: (e) => onDragStart(e, idx), onDragEnd: () => dnd?.end() }\n }\n onSave={(content) => {\n clearPending();\n onEdit((cur) => updateSceneItemContent(cur, episodeIndex, sceneIndex, idx, content));\n }}\n onSaveActor={(actorId) =>\n onEdit((cur) => updateSceneItemActor(cur, episodeIndex, sceneIndex, idx, actorId))\n }\n onSaveEmotion={(emotion) =>\n onEdit((cur) => updateSceneItemEmotion(cur, episodeIndex, sceneIndex, idx, emotion))\n }\n onChangeType={(type) => {\n clearPending();\n onEdit((cur) => updateSceneItemType(cur, episodeIndex, sceneIndex, idx, type));\n }}\n onInsertAbove={() => insertSame(idx, idx)}\n onInsertBelow={() => insertSame(idx + 1, idx)}\n onSplitHere={\n idx > 0\n ? () => {\n clearPending();\n onEdit((cur) => splitScene(cur, episodeIndex, sceneIndex, idx));\n }\n : undefined\n }\n onDelete={() => {\n clearPending();\n onEdit((cur) => deleteSceneItem(cur, episodeIndex, sceneIndex, idx));\n }}\n />\n </div>\n </Fragment>\n );\n })}\n {renderGhosts(actions.length)}\n {dropSlot === actions.length && actions.length > 0 ? <div className=\"lj-se-dropline-end\" /> : null}\n {actions.length === 0 && !disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-scene-add-first\"\n onClick={() => insertAt(0, ScriptContentType.Dialogue)}\n >\n <Plus className=\"lj-se-ic-3\" strokeWidth={2} /> 添加内容\n </button>\n ) : null}\n {actions.length === 0 && disabled ? <p className=\"lj-se-scene-empty\">本场尚无内容</p> : null}\n </div>\n </div>\n );\n}\n\n/**\n * Memoized so editing one scene re-renders only that scene — other scenes keep\n * the same `scene`/`maps`/callback refs and skip. (Requires callers to pass\n * stable onEdit/onNavigateAsset/onRequestAssetDelete.)\n */\nexport const SceneEditor = memo(SceneEditorImpl);\n\n// re-export for the stream layer\nexport type { ScriptFormat };\n","/**\n * Flattens a ScriptProject into ONE continuous, stable-keyed item list for the\n * virtualized stream — mirroring agent-frontend's single global scroll:\n * each episode (episode-header → scene → scene → …)\n * → asset groups (角色 / 场景 / 道具: group-header → asset-card × N)\n * Plus selection ↔ flatIndex lookups (two-way) for scroll/scrollspy sync.\n * (世界观 & 风格 is edited in a dialog now, not inline — see ScriptEditor.)\n */\nimport type { ScriptProject } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\n\nexport type AssetGroup = \"actors\" | \"locations\" | \"props\";\n\nexport type FlatItem =\n | { key: string; kind: \"episode-header\"; episodeIdx: number }\n | { key: string; kind: \"scene\"; episodeIdx: number; sceneIdx: number; sceneId: string; isStart: boolean; isEnd: boolean }\n | { key: string; kind: \"episode-empty\"; episodeIdx: number }\n | { key: string; kind: \"asset-group-header\"; group: AssetGroup }\n | { key: string; kind: \"asset-card\"; group: AssetGroup; assetId: string }\n | { key: string; kind: \"add-episode\" };\n\nexport interface FlatStream {\n items: FlatItem[];\n indexByKey: Map<string, number>;\n sceneIndexLookup: Map<string, number>;\n /** `${episodeIdx}:${sceneId}` → flat index, so a clip/scene selection that\n * carries only the (stable) scene_id can still resolve a scroll target. */\n sceneIdLookup: Map<string, number>;\n assetIndexLookup: Map<string, number>;\n /** the episodes region renders as ONE continuous paper; these mark its\n * rounded top / bottom edges (episode headers in between stay seamless). */\n paperStartKey: string | null;\n paperEndKey: string | null;\n}\n\nconst SCENE_KEY = (e: number, s: number) => `ep:${e}:sc:${s}`;\nconst SCENE_ID_KEY = (e: number, id: string) => `ep:${e}:id:${id}`;\nconst ASSET_KEY = (g: AssetGroup, id: string) => `${g}:${id}`;\n\nfunction safeId(raw: string | undefined | null, fallback: string): string {\n const t = (raw ?? \"\").toString().trim();\n return t.length > 0 ? t : fallback;\n}\n\nconst GROUP_LABEL: Record<AssetGroup, string> = { actors: \"角色\", locations: \"场景\", props: \"道具\" };\nexport const assetGroupLabel = (g: AssetGroup) => GROUP_LABEL[g];\n\nexport function buildFlatStream(data: ScriptProject | null): FlatStream {\n const items: FlatItem[] = [];\n const indexByKey = new Map<string, number>();\n const sceneIndexLookup = new Map<string, number>();\n const sceneIdLookup = new Map<string, number>();\n const assetIndexLookup = new Map<string, number>();\n const push = (item: FlatItem) => {\n indexByKey.set(item.key, items.length);\n if (item.kind === \"scene\") {\n sceneIndexLookup.set(SCENE_KEY(item.episodeIdx, item.sceneIdx), items.length);\n sceneIdLookup.set(SCENE_ID_KEY(item.episodeIdx, item.sceneId), items.length);\n }\n if (item.kind === \"asset-card\") assetIndexLookup.set(ASSET_KEY(item.group, item.assetId), items.length);\n items.push(item);\n };\n\n if (!data) {\n return { items, indexByKey, sceneIndexLookup, sceneIdLookup, assetIndexLookup, paperStartKey: null, paperEndKey: null };\n }\n\n let paperStartKey: string | null = null;\n let paperEndKey: string | null = null;\n\n (data.episodes ?? []).forEach((episode, ei) => {\n const headerKey = `ep:${ei}:header`;\n push({ key: headerKey, kind: \"episode-header\", episodeIdx: ei });\n if (paperStartKey === null) paperStartKey = headerKey; // first episode header opens the paper\n paperEndKey = headerKey; // tentatively; a scene below will override\n const scenes = episode.scenes ?? [];\n if (scenes.length === 0) {\n const emptyKey = `ep:${ei}:empty`;\n push({ key: emptyKey, kind: \"episode-empty\", episodeIdx: ei });\n paperEndKey = emptyKey; // the empty-episode affordance closes the paper\n } else {\n scenes.forEach((scene, si) => {\n const sceneId = safeId(scene.scene_id, `__idx:${si}`);\n const key = `sc:ep${ei}:sc${si}:${sceneId}`;\n push({\n key,\n kind: \"scene\",\n episodeIdx: ei,\n sceneIdx: si,\n sceneId,\n isStart: si === 0,\n isEnd: si === scenes.length - 1,\n });\n paperEndKey = key; // last scene pushed closes the paper\n });\n }\n });\n\n // \"+ new episode\" affordance sits just below the script, above the assets\n push({ key: \"add-episode\", kind: \"add-episode\" });\n\n const specs: Array<{ group: AssetGroup; ids: string[] }> = [\n { group: \"actors\", ids: (data.actors ?? []).map((a, i) => safeId(a.actor_id, `__idx:${i}`)) },\n { group: \"locations\", ids: (data.locations ?? []).map((l, i) => safeId(l.location_id, `__idx:${i}`)) },\n { group: \"props\", ids: (data.props ?? []).map((p, i) => safeId(p.prop_id, `__idx:${i}`)) },\n ];\n for (const { group, ids } of specs) {\n push({ key: `asset-group:${group}`, kind: \"asset-group-header\", group });\n ids.forEach((assetId) => push({ key: `asset:${group}:${assetId}`, kind: \"asset-card\", group, assetId }));\n }\n\n return { items, indexByKey, sceneIndexLookup, sceneIdLookup, assetIndexLookup, paperStartKey, paperEndKey };\n}\n\n/** selection → first locatable flat index (or null). */\nexport function selectionToFlatIndex(stream: FlatStream, sel: StudioSelection): number | null {\n switch (sel.kind) {\n case \"episode\":\n return stream.indexByKey.get(`ep:${sel.episodeIdx}:header`) ?? null;\n case \"scene\":\n return stream.sceneIndexLookup.get(SCENE_KEY(sel.episodeIdx, sel.sceneIdx)) ?? null;\n case \"clip\": {\n // prefer the positional index; fall back to the stable scene_id so a clip\n // selection that knows only the id (reference/chat origin) still scrolls.\n if (sel.sceneIdx !== undefined) {\n const byIdx = stream.sceneIndexLookup.get(SCENE_KEY(sel.episodeIdx, sel.sceneIdx));\n if (byIdx !== undefined) return byIdx;\n }\n const id = (sel.sceneId ?? \"\").trim();\n return id ? stream.sceneIdLookup.get(SCENE_ID_KEY(sel.episodeIdx, id)) ?? null : null;\n }\n case \"actor\":\n return stream.assetIndexLookup.get(ASSET_KEY(\"actors\", sel.actorId)) ?? null;\n case \"location\":\n return stream.assetIndexLookup.get(ASSET_KEY(\"locations\", sel.locationId)) ?? null;\n case \"prop\":\n return stream.assetIndexLookup.get(ASSET_KEY(\"props\", sel.propId)) ?? null;\n default:\n return null;\n }\n}\n\n/**\n * flatIndex → selection. Transitional items (episode-empty, asset-group-header)\n * return null so the scrollspy keeps the previous selection while passing over\n * them (no flicker).\n */\nexport function flatIndexToSelection(stream: FlatStream, idx: number): StudioSelection | null {\n const item = stream.items[idx];\n if (!item) return null;\n switch (item.kind) {\n case \"episode-header\":\n return { kind: \"episode\", episodeIdx: item.episodeIdx };\n case \"scene\":\n return { kind: \"scene\", episodeIdx: item.episodeIdx, sceneIdx: item.sceneIdx };\n case \"asset-card\":\n if (item.group === \"actors\") return { kind: \"actor\", actorId: item.assetId };\n if (item.group === \"locations\") return { kind: \"location\", locationId: item.assetId };\n return { kind: \"prop\", propId: item.assetId };\n default:\n return null;\n }\n}\n","/**\n * Pure mutations for the entity dictionary (actors / locations / props) and\n * their asset states. Operate directly on ScriptProject; identity-preserving\n * for untouched entries.\n */\nimport type { AssetState, ScriptActor, ScriptLocation, ScriptProject, ScriptProp } from \"../types.js\";\n\nexport type EntityKind = \"actor\" | \"location\" | \"prop\";\n\nconst ID_FIELD: Record<EntityKind, \"actor_id\" | \"location_id\" | \"prop_id\"> = {\n actor: \"actor_id\",\n location: \"location_id\",\n prop: \"prop_id\",\n};\nconst NAME_FIELD: Record<EntityKind, \"actor_name\" | \"location_name\" | \"prop_name\"> = {\n actor: \"actor_name\",\n location: \"location_name\",\n prop: \"prop_name\",\n};\nconst LIST_FIELD: Record<EntityKind, \"actors\" | \"locations\" | \"props\"> = {\n actor: \"actors\",\n location: \"locations\",\n prop: \"props\",\n};\n\ntype AnyEntity = ScriptActor & ScriptLocation & ScriptProp;\n\nfunction mapEntity(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n fn: (e: AnyEntity) => AnyEntity,\n): ScriptProject {\n const listKey = LIST_FIELD[kind];\n const idField = ID_FIELD[kind];\n const list = (data[listKey] ?? []) as AnyEntity[];\n let changed = false;\n const next = list.map((e) => {\n if ((e[idField] ?? \"\").trim() !== id) return e;\n changed = true;\n return fn(e);\n });\n if (!changed) return data;\n return { ...data, [listKey]: next };\n}\n\nexport function updateEntityName(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n name: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({ ...e, [NAME_FIELD[kind]]: name }));\n}\n\nexport function updateEntityDescription(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n description: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({ ...e, description }));\n}\n\nexport function updateEntityStateField(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n stateId: string,\n field: \"state_name\" | \"description\",\n value: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({\n ...e,\n states: (e.states ?? []).map((s) =>\n (s.state_id ?? \"\").trim() === stateId ? { ...s, [field]: value } : s,\n ),\n }));\n}\n\nexport function addEntityState(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n state: AssetState,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({ ...e, states: [...(e.states ?? []), state] }));\n}\n\nexport function removeEntityState(\n data: ScriptProject,\n kind: EntityKind,\n id: string,\n stateId: string,\n): ScriptProject {\n return mapEntity(data, kind, id, (e) => ({\n ...e,\n states: (e.states ?? []).filter((s) => (s.state_id ?? \"\").trim() !== stateId),\n }));\n}\n","/**\n * ScenePreviewCard — a read-only, asian-print render of one scene, shown when\n * hovering a node in the AssetStateTimeline. Mirrors SceneItemRow's \"asian\"\n * format (compact \"角色(情绪):内容\" print look) but strips all editing\n * affordances. Different line types are visually distinguished (action △ /\n * narration / dialogue / inner-thought OS) and the speaker carries its stable\n * per-actor cue color, so the preview reads like the real script.\n *\n * Rendered through a body portal at a fixed viewport position so neither the\n * timeline's horizontal scroll nor the virtualized stream clips it; the card is\n * pointer-events:none so it never steals hover from the node beneath it.\n */\nimport { useMemo, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { ScriptItem, ScriptProject } from \"../types.js\";\nimport { ScriptContentType } from \"../types.js\";\nimport {\n getActorMap,\n getDialogueDeliveryLabel,\n getDialogueSpeakerLabel,\n getEpisodeNumberLabel,\n getLocationDisplayName,\n getLocationMap,\n getSceneNumberLabel,\n getSpeakerMap,\n translateEmotionLabel,\n} from \"../utils.js\";\nimport { getPrimarySceneLocationId } from \"../mutations/editor-utils.js\";\nimport { getActorCueVar } from \"../actor-color.js\";\nimport { cn } from \"../cn.js\";\n\nconst SPACE_ZH: Record<string, string> = { interior: \"内\", exterior: \"外\" };\nconst TIME_ZH: Record<string, string> = { day: \"日\", night: \"夜\", dawn: \"晨\", dusk: \"暮\" };\n\n/** best-effort actor/prop id behind a line, for the cue color (mirrors SceneItemRow) */\nfunction resolveCueId(item: ScriptItem, actorMap: Map<string, unknown>, speakerMap: ReturnType<typeof getSpeakerMap>) {\n const actorId = item.actor_id?.trim();\n if (actorId) return actorId;\n const spkId = item.speaker_id?.trim() || item.speakers?.[0]?.speaker_id?.trim() || \"\";\n if (!spkId) return \"\";\n const spk = speakerMap.get(spkId);\n const kind = spk?.source_kind?.trim();\n if ((kind === \"actor\" || kind === \"prop\") && spk?.source_id?.trim()) return spk.source_id.trim();\n if (spkId.startsWith(\"spk_\") && actorMap.has(spkId.slice(4))) return spkId.slice(4);\n return \"\";\n}\n\nexport interface PreviewAnchor {\n episodeIndex: number;\n sceneIndex: number;\n rect: { top: number; bottom: number; left: number; width: number };\n /** the .lj-se-root subtree to portal into, so the editor's --lj-se-* tokens\n * (and the dark variant) cascade — body would leave the card unstyled. */\n host: HTMLElement | null;\n}\n\nexport function ScenePreviewCard({\n data,\n anchor,\n highlightId,\n highlightKind,\n onEnter,\n onLeave,\n}: {\n data: ScriptProject;\n anchor: PreviewAnchor;\n /** the card's own asset — its lines get a <mark>-like tint so they're easy to spot */\n highlightId?: string;\n highlightKind?: \"actor\" | \"location\" | \"prop\";\n /** keep the card open while the cursor is over it (so long scenes can be read/scrolled) */\n onEnter?: () => void;\n onLeave?: () => void;\n}) {\n const actorMap = useMemo(() => getActorMap(data.actors), [data.actors]);\n const locationMap = useMemo(() => getLocationMap(data.locations), [data.locations]);\n const speakerMap = useMemo(() => getSpeakerMap(data.speakers), [data.speakers]);\n\n const episode = data.episodes?.[anchor.episodeIndex];\n const scene = episode?.scenes?.[anchor.sceneIndex];\n if (!scene) return null;\n\n const locId = getPrimarySceneLocationId(scene);\n const locName = (locId ? getLocationDisplayName(locationMap.get(locId)) : \"\") || \"未指定地点\";\n const env = scene.environment ?? {};\n const slug = `${SPACE_ZH[env.space ?? \"interior\"] ?? env.space ?? \"\"}·${TIME_ZH[env.time ?? \"day\"] ?? env.time ?? \"\"}`;\n const actions = scene.actions ?? [];\n\n // Position: anchor below the node, flip above when low in the viewport. The\n // card is pointer-events:none so this never interferes with hovering nodes.\n const W = 360;\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 1280;\n const vh = typeof window !== \"undefined\" ? window.innerHeight : 800;\n const left = Math.min(Math.max(8, anchor.rect.left + anchor.rect.width / 2 - W / 2), vw - W - 8);\n const above = anchor.rect.top > vh * 0.55;\n const pos = above\n ? { left, bottom: vh - anchor.rect.top + 8, maxHeight: anchor.rect.top - 16 }\n : { left, top: anchor.rect.bottom + 8, maxHeight: vh - anchor.rect.bottom - 16 };\n\n const card = (\n <div className=\"lj-se-spv\" style={{ width: W, ...pos }} onMouseEnter={onEnter} onMouseLeave={onLeave}>\n <div className=\"lj-se-spv-head\">\n <span className=\"lj-se-spv-num\">\n {getEpisodeNumberLabel(episode!, anchor.episodeIndex)} · {getSceneNumberLabel(scene, anchor.sceneIndex)}\n </span>\n <span className=\"lj-se-spv-slug\">\n {locName} <span className=\"lj-se-spv-slug-env\">{slug}</span>\n </span>\n </div>\n <div className=\"lj-se-spv-body\">\n {actions.length === 0 ? (\n <p className=\"lj-se-spv-empty\">(本场暂无内容)</p>\n ) : (\n actions.map((item, i) => (\n <PreviewLine\n key={i}\n item={item}\n actorMap={actorMap}\n speakerMap={speakerMap}\n highlightId={highlightId}\n highlightKind={highlightKind}\n />\n ))\n )}\n </div>\n </div>\n );\n return createPortal(card, anchor.host ?? document.body);\n}\n\nfunction PreviewLine({\n item,\n actorMap,\n speakerMap,\n highlightId,\n highlightKind,\n}: {\n item: ScriptItem;\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap: ReturnType<typeof getSpeakerMap>;\n highlightId?: string;\n highlightKind?: \"actor\" | \"location\" | \"prop\";\n}) {\n const type = (item.type as ScriptContentType) ?? ScriptContentType.Dialogue;\n const content = item.content?.trim() ?? \"\";\n\n if (type === ScriptContentType.Action) {\n return (\n <p className=\"lj-se-spv-action\">\n <span className=\"lj-se-spv-mark\">△</span>\n {content || \"…\"}\n </p>\n );\n }\n if (type === ScriptContentType.Narration) {\n return <p className=\"lj-se-spv-narr\">{content || \"…\"}</p>;\n }\n\n // dialogue / inner-thought\n const isInner = type === ScriptContentType.InnerThought;\n const tone = isInner ? \"inner\" : \"dialogue\";\n const cueId = resolveCueId(item, actorMap, speakerMap);\n const speaker = getDialogueSpeakerLabel(item, actorMap, speakerMap) || \"未知角色\";\n const emotion = translateEmotionLabel(item.emotion);\n const delivery = getDialogueDeliveryLabel(item.delivery);\n const tag = isInner ? (emotion ? `OS·${emotion}` : \"OS\") : emotion;\n // This line \"belongs to\" the card's asset when the speaker resolves to it —\n // tint it (in the asset's own cue color) so you can locate it at a glance.\n const mine = !!highlightId && (highlightKind === \"actor\" || highlightKind === \"prop\") && cueId === highlightId;\n const mineStyle = mine ? ({ \"--mine\": getActorCueVar(cueId, tone) } as CSSProperties) : undefined;\n\n return (\n <p className={cn(\"lj-se-spv-cue\", isInner && \"is-inner\", mine && \"is-mine\")} style={mineStyle}>\n <strong className=\"lj-se-spv-speaker\" style={{ color: getActorCueVar(cueId, tone) }}>\n {speaker}\n {delivery ? <span className=\"lj-se-spv-delivery\">({delivery})</span> : null}\n </strong>\n {tag ? <span className=\"lj-se-spv-tag\">({tag})</span> : null}\n <span className=\"lj-se-spv-colon\">:</span>\n {content || \"…\"}\n </p>\n );\n}\n","/**\n * AssetStateTimeline — the state→scene REVERSE-LOOKUP view on an asset card.\n *\n * Where AssetReferenceGrid answers \"which scenes does this asset appear in?\",\n * this answers \"which scenes is this asset in state X?\" — by laying out one\n * swimlane per defined state, with the asset's scene appearances plotted left→\n * right in narrative order (episode → scene). Reading a lane horizontally shows\n * a state's span; reading a column vertically shows the state at that scene; an\n * appearance whose state_id is unset/unknown drops into a trailing 未标注 lane\n * (so漏标 surfaces). Clicking a node jumps the stream to that scene.\n *\n * Presentation stays over precomputed `refs` (which carry `stateId` for\n * actors/locations/props), and edits are committed through the host's onBind.\n */\nimport { useEffect, useRef, useState, type CSSProperties, type PointerEvent as ReactPointerEvent } from \"react\";\nimport type { DistributionItem, ReferenceEpisodeGroup } from \"../entity-distribution.js\";\nimport type { SceneAssetStateBindingTarget } from \"../mutations/editor-utils.js\";\nimport type { AssetState, ScriptProject } from \"../types.js\";\nimport { cn } from \"../cn.js\";\nimport { getStateDisplayName } from \"../utils.js\";\nimport { ScenePreviewCard, type PreviewAnchor } from \"./scene-preview-card.js\";\n\nconst UNASSIGNED = \"__unassigned__\";\nconst DRAG_THRESHOLD = 4;\n/** how many distinct cue colors exist (--lj-se-actor-cue-1..8) */\nconst CUE_COUNT = 8;\n/** fixed per-scene column width (px). The track is `columns × COL` wide and the\n * whole timeline scrolls horizontally, so 100+ appearances stay readable\n * instead of crushing into an unclickable blob. */\nconst COL = 32;\n/** minimum width (px) an episode block needs so its 第NN集 label shows in full;\n * a short episode widens its columns up to this, longer ones stay at COL each. */\nconst MIN_EP_WIDTH = 48;\n\ninterface Lane {\n id: string;\n name: string;\n /** 1..8 → actor-cue var; 0 → neutral muted (未标注 lane) */\n cueIndex: number;\n}\n\ninterface NodeDrag {\n pointerId: number;\n startX: number;\n startY: number;\n keys: Set<string>;\n dragging: boolean;\n}\n\ninterface BoxSelect {\n pointerId: number;\n startX: number;\n startY: number;\n currentX: number;\n currentY: number;\n moved: boolean;\n}\n\ninterface DragGhost {\n x: number;\n y: number;\n label: string;\n}\n\nexport function AssetStateTimeline({\n data,\n assetId,\n assetKind,\n refs,\n states,\n disabled = false,\n onBind,\n onJump,\n}: {\n /** full project — the hover preview reads scene content from it */\n data: ScriptProject;\n /** the card's own asset — its lines get highlighted in the hover preview */\n assetId: string;\n assetKind: \"actor\" | \"location\" | \"prop\";\n refs: ReferenceEpisodeGroup[];\n states: AssetState[];\n disabled?: boolean;\n onBind: (targets: SceneAssetStateBindingTarget[], stateId: string | null) => void;\n onJump: (episodeIdx: number, sceneIdx: number) => void;\n}) {\n const [hover, setHover] = useState<PreviewAnchor | null>(null);\n const [selectedKeys, setSelectedKeys] = useState<Set<string>>(() => new Set());\n const [draggingKeys, setDraggingKeys] = useState<Set<string>>(() => new Set());\n const [dropLaneId, setDropLaneId] = useState<string | null>(null);\n const [box, setBox] = useState<BoxSelect | null>(null);\n const [dragGhost, setDragGhost] = useState<DragGhost | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<NodeDrag | null>(null);\n const boxRef = useRef<BoxSelect | null>(null);\n const suppressClickRef = useRef(false);\n // Small close delay so moving the cursor off a node INTO the preview card\n // (crossing the gap) doesn't drop it — both node and card keep it open.\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n const scheduleClose = () => {\n cancelClose();\n closeTimer.current = setTimeout(() => setHover(null), 140);\n };\n useEffect(() => () => cancelClose(), []);\n\n // Flatten to a single narrative-ordered column list. refs are episode-sorted\n // and scene-sorted within an episode, so concatenation is already in order.\n const cols: DistributionItem[] = [];\n for (const group of refs) for (const item of group.items) cols.push(item);\n const n = cols.length;\n if (n === 0) return null;\n\n const definedIds = states.map((s) => (s.state_id ?? \"\").trim()).filter(Boolean);\n const lanes: Lane[] = states\n .map((s, i) => ({ id: (s.state_id ?? \"\").trim(), name: getStateDisplayName(s) || \"未命名状态\", cueIndex: (i % CUE_COUNT) + 1 }))\n .filter((l) => l.id);\n\n const isUnassigned = (c: DistributionItem) => {\n const sid = (c.stateId ?? \"\").trim();\n return !sid || !definedIds.includes(sid);\n };\n // Trailing catch-all lane. With no defined states it's the only lane, so it\n // reads as a plain appearance track (\"出现\") rather than a missing-state flag.\n if (cols.some(isUnassigned) || (!disabled && lanes.length > 0)) {\n lanes.push({ id: UNASSIGNED, name: lanes.length > 0 ? \"未标注\" : \"出现\", cueIndex: 0 });\n }\n\n // Per-column geometry with adaptive widths: an episode with few scenes widens\n // its columns just enough to fit the full 第NN集 header label, so the axis never\n // truncates; the same width flows into the track below so header and lanes stay\n // column-aligned. Multi-scene episodes keep the base COL width.\n interface ColMeta {\n item: DistributionItem;\n left: number;\n width: number;\n }\n const colMetas: ColMeta[] = [];\n const itemByKey = new Map<string, DistributionItem>();\n const epHeads: { episodeIndex: number; episodeNumber: number; width: number }[] = [];\n let x = 0;\n for (const group of refs) {\n const count = group.items.length;\n const w = Math.max(COL, Math.ceil(MIN_EP_WIDTH / count));\n epHeads.push({ episodeIndex: group.episodeIndex, episodeNumber: group.episodeNumber, width: count * w });\n for (const item of group.items) {\n colMetas.push({ item, left: x, width: w });\n itemByKey.set(item.key, item);\n x += w;\n }\n }\n const trackWidth = x;\n useEffect(() => {\n setSelectedKeys((prev) => {\n const next = new Set(Array.from(prev).filter((key) => itemByKey.has(key)));\n return next.size === prev.size ? prev : next;\n });\n }, [refs]);\n\n const center = (m: ColMeta) => m.left + m.width / 2;\n const cueVar = (cueIndex: number) =>\n cueIndex === 0 ? \"var(--lj-se-muted-fg)\" : `var(--lj-se-actor-cue-${cueIndex})`;\n const laneMetas = (laneId: string) =>\n colMetas.filter((m) => (laneId === UNASSIGNED ? isUnassigned(m.item) : (m.item.stateId ?? \"\").trim() === laneId));\n const laneIds = new Set(lanes.map((lane) => lane.id));\n const stateIdForLane = (laneId: string) => (laneId === UNASSIGNED ? null : laneId);\n const targetsForKeys = (keys: Set<string>): SceneAssetStateBindingTarget[] =>\n Array.from(keys)\n .map((key) => itemByKey.get(key))\n .filter((item): item is DistributionItem => !!item)\n .map((item) => ({ episodeIndex: item.episodeIndex, sceneIndex: item.sceneIndex }));\n const findLaneIdAt = (clientX: number, clientY: number) => {\n const lane = document.elementFromPoint(clientX, clientY)?.closest<HTMLElement>(\".lj-se-sttl-lane\");\n const laneId = lane?.dataset.sttlLaneId;\n return laneId && laneIds.has(laneId) ? laneId : null;\n };\n const selectKeysInBox = (nextBox: BoxSelect) => {\n const left = Math.min(nextBox.startX, nextBox.currentX);\n const right = Math.max(nextBox.startX, nextBox.currentX);\n const top = Math.min(nextBox.startY, nextBox.currentY);\n const bottom = Math.max(nextBox.startY, nextBox.currentY);\n const next = new Set<string>();\n rootRef.current?.querySelectorAll<HTMLElement>(\"[data-sttl-node-key]\").forEach((node) => {\n const r = node.getBoundingClientRect();\n const x = r.left + r.width / 2;\n const y = r.top + r.height / 2;\n if (x >= left && x <= right && y >= top && y <= bottom) {\n const key = node.dataset.sttlNodeKey;\n if (key) next.add(key);\n }\n });\n setSelectedKeys(next);\n };\n const boxStyle = (): CSSProperties | undefined => {\n if (!box || !rootRef.current) return undefined;\n const r = rootRef.current.getBoundingClientRect();\n return {\n left: Math.min(box.startX, box.currentX) - r.left + rootRef.current.scrollLeft,\n top: Math.min(box.startY, box.currentY) - r.top + rootRef.current.scrollTop,\n width: Math.abs(box.currentX - box.startX),\n height: Math.abs(box.currentY - box.startY),\n };\n };\n const clearPointerState = (pointerId: number) => {\n if (rootRef.current?.hasPointerCapture(pointerId)) rootRef.current.releasePointerCapture(pointerId);\n dragRef.current = null;\n boxRef.current = null;\n setDraggingKeys(new Set());\n setDropLaneId(null);\n setBox(null);\n setDragGhost(null);\n };\n const handleNodePointerDown = (e: ReactPointerEvent<HTMLButtonElement>, key: string) => {\n if (disabled || e.button !== 0) return;\n e.stopPropagation();\n cancelClose();\n setHover(null);\n const keys = selectedKeys.has(key) ? new Set(selectedKeys) : new Set([key]);\n setSelectedKeys(keys);\n dragRef.current = {\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n keys,\n dragging: false,\n };\n rootRef.current?.setPointerCapture(e.pointerId);\n };\n const dragLabel = (keys: Set<string>) => {\n if (keys.size !== 1) return `${keys.size} 场`;\n const item = itemByKey.get(Array.from(keys)[0]);\n return item ? String(item.sceneNumber) : \"1 场\";\n };\n const handleTrackPointerDown = (e: ReactPointerEvent<HTMLElement>) => {\n if (disabled || e.button !== 0 || (e.target instanceof HTMLElement && e.target.closest(\"[data-sttl-node-key]\"))) return;\n const next: BoxSelect = {\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n currentX: e.clientX,\n currentY: e.clientY,\n moved: false,\n };\n setSelectedKeys(new Set());\n boxRef.current = next;\n setBox(next);\n rootRef.current?.setPointerCapture(e.pointerId);\n };\n const handlePointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (drag?.pointerId === e.pointerId) {\n const moved = Math.hypot(e.clientX - drag.startX, e.clientY - drag.startY) >= DRAG_THRESHOLD;\n if (!drag.dragging && moved) {\n drag.dragging = true;\n setDraggingKeys(new Set(drag.keys));\n }\n if (drag.dragging) {\n e.preventDefault();\n setDragGhost({ x: e.clientX, y: e.clientY, label: dragLabel(drag.keys) });\n setDropLaneId(findLaneIdAt(e.clientX, e.clientY));\n }\n return;\n }\n\n const nextBox = boxRef.current;\n if (nextBox?.pointerId !== e.pointerId) return;\n const moved = nextBox.moved || Math.hypot(e.clientX - nextBox.startX, e.clientY - nextBox.startY) >= DRAG_THRESHOLD;\n const updated = { ...nextBox, currentX: e.clientX, currentY: e.clientY, moved };\n boxRef.current = updated;\n setBox(updated);\n if (updated.moved) selectKeysInBox(updated);\n };\n const handlePointerUp = (e: ReactPointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (drag?.pointerId === e.pointerId) {\n if (drag.dragging) {\n const laneId = dropLaneId ?? findLaneIdAt(e.clientX, e.clientY);\n if (laneId) {\n const targets = targetsForKeys(drag.keys);\n if (targets.length > 0) onBind(targets, stateIdForLane(laneId));\n }\n suppressClickRef.current = true;\n window.setTimeout(() => {\n suppressClickRef.current = false;\n }, 0);\n e.preventDefault();\n }\n clearPointerState(e.pointerId);\n return;\n }\n\n const nextBox = boxRef.current;\n if (nextBox?.pointerId !== e.pointerId) return;\n if (nextBox.moved) selectKeysInBox(nextBox);\n else setSelectedKeys(new Set());\n clearPointerState(e.pointerId);\n };\n\n return (\n <div\n ref={rootRef}\n className={cn(\"lj-se-sttl\", !disabled && \"is-editable\", draggingKeys.size > 0 && \"is-dragging\")}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={(e) => clearPointerState(e.pointerId)}\n >\n <div className=\"lj-se-sttl-axis\">\n <span className=\"lj-se-sttl-axis-lab\">状态 \ 场</span>\n <span className=\"lj-se-sttl-axis-eps\" style={{ width: trackWidth }}>\n {epHeads.map((g) => (\n <span key={g.episodeIndex} className=\"lj-se-sttl-ep\" style={{ width: g.width }} title={`第 ${g.episodeNumber} 集`}>\n 第{String(g.episodeNumber).padStart(2, \"0\")}集\n </span>\n ))}\n </span>\n </div>\n {lanes.map((lane) => {\n const mine = laneMetas(lane.id);\n return (\n <div key={lane.id} className={cn(\"lj-se-sttl-lane\", dropLaneId === lane.id && \"is-drop\")} data-sttl-lane-id={lane.id}>\n <span className=\"lj-se-sttl-lane-head\" title={lane.name}>\n <span className=\"lj-se-sttl-dot\" style={{ background: cueVar(lane.cueIndex) }} />\n <span className=\"lj-se-sttl-lane-name\">{lane.name}</span>\n <span className=\"lj-se-sttl-lane-count\">{mine.length}</span>\n </span>\n <span\n className=\"lj-se-sttl-track\"\n style={{ width: trackWidth, \"--cue\": cueVar(lane.cueIndex) } as CSSProperties}\n onPointerDown={handleTrackPointerDown}\n >\n {colMetas.map((m, i) => (\n <span key={`col-${i}`} className=\"lj-se-sttl-col\" style={{ left: m.left }} />\n ))}\n {mine.map((m, k) => {\n const next = mine[k + 1];\n if (!next) return null;\n return (\n <span\n key={`flow-${m.item.key}`}\n className=\"lj-se-sttl-flow\"\n style={{ left: center(m), width: center(next) - center(m) }}\n />\n );\n })}\n {mine.map((m) => (\n <button\n key={m.item.key}\n type=\"button\"\n className={cn(\n \"lj-se-sttl-node\",\n selectedKeys.has(m.item.key) && \"is-selected\",\n draggingKeys.has(m.item.key) && \"is-dragging\",\n )}\n data-sttl-node-key={m.item.key}\n aria-pressed={selectedKeys.has(m.item.key)}\n style={{ left: center(m) }}\n title={m.item.label}\n onPointerDown={(e) => handleNodePointerDown(e, m.item.key)}\n onClick={(e) => {\n if (suppressClickRef.current) {\n suppressClickRef.current = false;\n e.preventDefault();\n return;\n }\n onJump(m.item.episodeIndex, m.item.sceneIndex);\n }}\n onMouseEnter={(e) => {\n if (dragRef.current?.dragging) return;\n cancelClose();\n const r = e.currentTarget.getBoundingClientRect();\n setHover({\n episodeIndex: m.item.episodeIndex,\n sceneIndex: m.item.sceneIndex,\n rect: { top: r.top, bottom: r.bottom, left: r.left, width: r.width },\n host: e.currentTarget.closest<HTMLElement>(\".lj-se-root\"),\n });\n }}\n onMouseLeave={scheduleClose}\n >\n {m.item.sceneNumber}\n </button>\n ))}\n </span>\n </div>\n );\n })}\n {box ? <span className=\"lj-se-sttl-select-box\" style={boxStyle()} /> : null}\n {dragGhost ? (\n <span className=\"lj-se-sttl-drag-ghost\" style={{ left: dragGhost.x, top: dragGhost.y }}>\n {dragGhost.label}\n </span>\n ) : null}\n {hover ? (\n <ScenePreviewCard\n data={data}\n anchor={hover}\n highlightId={assetId}\n highlightKind={assetKind}\n onEnter={cancelClose}\n onLeave={scheduleClose}\n />\n ) : null}\n </div>\n );\n}\n","/**\n * AssetCard — an actor / location / prop rendered as a card in the global\n * scroll (below the episodes), mirroring agent-frontend. Shows editable name +\n * description, a kind badge, the \"appears in N scenes / M episodes\" summary,\n * editable asset-state cards, and the bidirectional reference grid (jump to the\n * scenes where it appears). Memoized so editing a scene doesn't re-render every\n * card.\n */\nimport { memo, useMemo, useState } from \"react\";\nimport { Plus, Trash2, X } from \"lucide-react\";\nimport type { ScriptActor, ScriptLocation, ScriptProject, ScriptProp } from \"../types.js\";\nimport type { AssetGroup } from \"./flat-items.js\";\nimport { assetGroupLabel } from \"./flat-items.js\";\nimport {\n addEntityState,\n removeEntityState,\n updateEntityDescription,\n updateEntityName,\n updateEntityStateField,\n type EntityKind,\n} from \"../mutations/entity-mutations.js\";\nimport { updateSceneAssetStateBindings } from \"../mutations/editor-utils.js\";\nimport type { ReferenceEpisodeGroup } from \"../entity-distribution.js\";\nimport { getActorDisplayName, getLocationDisplayName, getPropDisplayName } from \"../utils.js\";\nimport { buildSelectionFrom, type StudioSelection } from \"../selection.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { AssetStateTimeline } from \"./asset-state-timeline.js\";\nimport type { AssetDeleteRequest } from \"../scene/scene-cast-prop-rows.js\";\nimport { HighlightContext } from \"../primitives/highlighted-text.js\";\n\nconst META: Record<AssetGroup, { kind: EntityKind }> = {\n actors: { kind: \"actor\" },\n locations: { kind: \"location\" },\n props: { kind: \"prop\" },\n};\n\nfunction newStateId(id: string): string {\n return `st_${id}_${Date.now().toString(36)}`;\n}\n\nfunction StateDeleteButton({ stateName, onConfirm }: { stateName: string; onConfirm: () => void }) {\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <button type=\"button\" className=\"lj-se-assetcard-state-del\" title=\"删除该状态\" aria-label=\"删除该状态\" onClick={() => setOpen(true)}>\n <X className=\"lj-se-ic-3\" strokeWidth={1.8} />\n </button>\n {open ? (\n <div className=\"lj-se-modal-backdrop\" role=\"presentation\" onMouseDown={() => setOpen(false)}>\n <div className=\"lj-se-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"lj-se-delete-state-title\" onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"lj-se-modal-head\">\n <h2 id=\"lj-se-delete-state-title\" className=\"lj-se-modal-title\">删除状态</h2>\n <button type=\"button\" className=\"lj-se-modal-x\" aria-label=\"关闭\" onClick={() => setOpen(false)}>\n <X className=\"lj-se-ic-3\" strokeWidth={1.8} />\n </button>\n </div>\n <p className=\"lj-se-modal-body\">确认删除「{stateName || \"未命名状态\"}」?</p>\n <div className=\"lj-se-modal-actions\">\n <button type=\"button\" className=\"lj-se-modal-btn\" onClick={() => setOpen(false)}>取消</button>\n <button\n type=\"button\"\n className=\"lj-se-modal-btn lj-se-modal-btn-danger\"\n onClick={() => {\n setOpen(false);\n onConfirm();\n }}\n >\n 删除\n </button>\n </div>\n </div>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AssetCardImpl({\n data,\n group,\n assetId,\n refs,\n disabled = false,\n onEdit,\n onSelect,\n onRequestAssetDelete,\n}: {\n data: ScriptProject;\n group: AssetGroup;\n assetId: string;\n /** episode-grouped references, precomputed once per value in the stream\n * (buildDistributionIndex) — never re-scanned per card. */\n refs: ReferenceEpisodeGroup[];\n disabled?: boolean;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n onSelect: (sel: StudioSelection) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n}) {\n const kind = META[group].kind;\n const entity = useMemo(() => {\n if (group === \"actors\") return (data.actors ?? []).find((a) => (a.actor_id ?? \"\").trim() === assetId) as ScriptActor | undefined;\n if (group === \"locations\") return (data.locations ?? []).find((l) => (l.location_id ?? \"\").trim() === assetId) as ScriptLocation | undefined;\n return (data.props ?? []).find((p) => (p.prop_id ?? \"\").trim() === assetId) as ScriptProp | undefined;\n }, [data.actors, data.locations, data.props, group, assetId]);\n\n const sceneCount = refs.reduce((n, g) => n + g.items.length, 0);\n\n if (!entity) {\n return (\n <div className=\"lj-se-assetcard-row\">\n <div className=\"lj-se-assetcard-missing\">该资产已不存在({group}:{assetId})</div>\n </div>\n );\n }\n\n const name =\n group === \"actors\"\n ? getActorDisplayName(entity as ScriptActor)\n : group === \"locations\"\n ? getLocationDisplayName(entity as ScriptLocation)\n : getPropDisplayName(entity as ScriptProp);\n const rawDescription = entity.description ?? \"\";\n const description = rawDescription.trim();\n const states = entity.states ?? [];\n const fromRef = buildSelectionFrom(kind, assetId);\n\n return (\n <div className=\"lj-se-assetcard-row\">\n <HighlightContext.Provider value=\"\">\n <article className=\"lj-se-assetcard\" data-no-quote-selection>\n <div className=\"lj-se-assetcard-head\">\n <span className=\"lj-se-assetcard-name\">\n <EditableText\n value={name}\n disabled={disabled}\n placeholder={`未命名${assetGroupLabel(group)}`}\n onSave={(v) => onEdit((p) => updateEntityName(p, kind, assetId, v))}\n />\n </span>\n <span className=\"lj-se-assetcard-id\">{assetId}</span>\n <span className=\"lj-se-assetcard-actions\">\n <span className=\"lj-se-assetcard-badge\">{assetGroupLabel(group)}</span>\n <span className=\"lj-se-assetcard-badge\">\n {sceneCount} 场 · {refs.length} 集\n </span>\n {onRequestAssetDelete && !disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-assetcard-del\"\n title=\"删除该资产\"\n onClick={() =>\n onRequestAssetDelete({ kind, id: assetId, name: name || assetId, description: description || undefined, episodeIndex: -1, sceneIndex: -1 })\n }\n >\n <Trash2 className=\"lj-se-ic-3\" strokeWidth={1.5} />\n </button>\n ) : null}\n </span>\n </div>\n\n <div className=\"lj-se-assetcard-desc\">\n <EditableText\n multiline\n value={rawDescription}\n disabled={disabled}\n placeholder={`描述这个${assetGroupLabel(group)}的外观 / 设定…`}\n onSave={(v) => onEdit((p) => updateEntityDescription(p, kind, assetId, v))}\n />\n </div>\n\n <div className=\"lj-se-assetcard-states\">\n <div className=\"lj-se-assetcard-states-head\">\n <span className=\"lj-se-assetcard-states-label\">状态 <span className=\"lj-se-field-hint\">{states.length}</span></span>\n {!disabled ? (\n <button\n type=\"button\"\n className=\"lj-se-assetcard-state-add\"\n onClick={() => onEdit((p) => addEntityState(p, kind, assetId, { state_id: newStateId(assetId), state_name: \"新状态\" }))}\n >\n <Plus className=\"lj-se-ic-3\" strokeWidth={1.5} /> 状态\n </button>\n ) : null}\n </div>\n {states.length > 0 ? (\n <div className=\"lj-se-assetcard-state-cards\">\n {states.map((state, idx) => {\n const sid = (state.state_id ?? \"\").trim() || `idx-${idx}`;\n return (\n <div key={sid} className=\"lj-se-assetcard-state\">\n <div className=\"lj-se-assetcard-state-top\">\n <EditableText\n value={state.state_name ?? state.name ?? \"\"}\n disabled={disabled}\n placeholder=\"状态名\"\n className=\"lj-se-assetcard-state-name\"\n onSave={(v) => onEdit((p) => updateEntityStateField(p, kind, assetId, sid, \"state_name\", v))}\n />\n {!disabled && (state.state_id ?? \"\").trim() ? (\n <StateDeleteButton\n stateName={state.state_name ?? state.name ?? \"\"}\n onConfirm={() => onEdit((p) => removeEntityState(p, kind, assetId, sid))}\n />\n ) : null}\n </div>\n <EditableText\n multiline\n value={state.description ?? \"\"}\n disabled={disabled}\n placeholder=\"状态描述…\"\n className=\"lj-se-assetcard-state-desc\"\n onSave={(v) => onEdit((p) => updateEntityStateField(p, kind, assetId, sid, \"description\", v))}\n />\n </div>\n );\n })}\n </div>\n ) : null}\n </div>\n\n {refs.length > 0 ? (\n // state→scene reverse-lookup timeline: which state appears in which\n // scene, and how it flows. Stateless assets degrade to one \"出现\" lane.\n <AssetStateTimeline\n data={data}\n assetId={assetId}\n assetKind={kind}\n refs={refs}\n states={states}\n disabled={disabled}\n onBind={(targets, stateId) =>\n onEdit((p) => updateSceneAssetStateBindings(p, kind, assetId, targets, stateId))\n }\n onJump={(episodeIdx, sceneIdx) =>\n onSelect({ kind: \"scene\", episodeIdx, sceneIdx, from: fromRef, origin: \"sidebar\" })\n }\n />\n ) : null}\n </article>\n </HighlightContext.Provider>\n </div>\n );\n}\n\nfunction areEqual(prev: AssetCardProps, next: AssetCardProps): boolean {\n if (prev.group !== next.group || prev.assetId !== next.assetId || prev.disabled !== next.disabled) return false;\n if (prev.onEdit !== next.onEdit || prev.onSelect !== next.onSelect || prev.onRequestAssetDelete !== next.onRequestAssetDelete) return false;\n // The card renders ONLY its own entity slice (name/description/states) + the\n // precomputed `refs` (its scene appearances). It does NOT read data.episodes\n // directly, so a scene edit that doesn't touch THIS asset keeps both its entity\n // array AND its refs reference-stable (refs reuse via buildDistributionIndex's\n // prev cache) → the card skips. Only the asset(s) whose appearances/fields\n // actually changed re-render.\n if (prev.refs !== next.refs) return false;\n if (prev.group === \"actors\") return prev.data.actors === next.data.actors;\n if (prev.group === \"locations\") return prev.data.locations === next.data.locations;\n return prev.data.props === next.data.props;\n}\n\ntype AssetCardProps = Parameters<typeof AssetCardImpl>[0];\nexport const AssetCard = memo(AssetCardImpl, areEqual);\n","/**\n * ScriptStream — the single continuous, virtualized script surface. One flat\n * list carries worldview → episodes(header + scenes) → asset groups(header +\n * cards), exactly like agent-frontend's global scroll. Scenes render inside\n * fused paper segments; assets render as cards below. Selection ↔ scroll is\n * two-way (external selection scrolls in; scrolling drives scrollspy out), with\n * a programmatic-scroll lock to avoid feedback.\n */\nimport { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Virtuoso, type VirtuosoHandle } from \"react-virtuoso\";\nimport { GripVertical, Plus, Trash2 } from \"lucide-react\";\nimport type { ScriptProject } from \"../types.js\";\nimport { addBlankScene, addEpisode, deleteEpisode, moveScriptItem } from \"../mutations/editor-utils.js\";\nimport { buildAssetRefs, buildDistributionIndex, type ReferenceEpisodeGroup } from \"../entity-distribution.js\";\nimport type { DiffActionMark } from \"../diff/diff-engine.js\";\nimport { readScrollState, useScrollStateMemo } from \"./scroll-state-memo.js\";\n\n/** per-scene action-level diff: current-index → mark, + removed ghosts bucketed\n * by the current index they sit before. */\nexport interface SceneActionDiffEntry {\n byIndex: Map<number, DiffActionMark>;\n removedBefore: Map<number, DiffActionMark[]>;\n}\nimport { Popover } from \"../primitives/popover.js\";\nimport { RowMenuPanel } from \"../primitives/row-menu.js\";\nimport {\n DragReorderContext,\n type DragReorderApi,\n type DragSource,\n type DropTarget,\n} from \"./drag-context.js\";\nimport {\n getActorMap,\n getEpisodeTitle,\n getLocationMap,\n getPropMap,\n getSpeakerMap,\n} from \"../utils.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { isSameSelectionTarget, selectionTargetKey, withOrigin } from \"../selection.js\";\nimport { SceneEditor } from \"../scene/scene-editor.js\";\nimport type { ScriptFormat } from \"../scene/scene-item-row.js\";\nimport type { AssetDeleteRequest } from \"../scene/scene-cast-prop-rows.js\";\nimport { EditableText } from \"../primitives/editable-text.js\";\nimport { AssetCard } from \"./asset-card.js\";\nimport {\n assetGroupLabel,\n buildFlatStream,\n flatIndexToSelection,\n selectionToFlatIndex,\n} from \"./flat-items.js\";\nimport { cn } from \"../cn.js\";\n\nexport function ScriptStream({\n value,\n format,\n disabled,\n selection,\n changedSceneKeys,\n sceneDiff,\n actionDiffByScene,\n onAcceptAction,\n onRejectAction,\n scrollScopeKey,\n onEdit,\n onSelectionChange,\n onRequestAssetDelete,\n}: {\n value: ScriptProject;\n format: ScriptFormat;\n disabled: boolean;\n selection: StudioSelection;\n changedSceneKeys?: Set<string>;\n /** per-scene diff controls (present only when the host supports onPatchBaseline) */\n sceneDiff?: {\n kindByKey: Map<string, \"added\" | \"modified\">;\n onAccept: (episodeIdx: number, sceneId: string) => void;\n onReject: (episodeIdx: number, sceneId: string) => void;\n };\n /** action-level diff per scene (keyed by sceneChangeKey) */\n actionDiffByScene?: Map<string, SceneActionDiffEntry>;\n onAcceptAction?: (mark: DiffActionMark) => void;\n onRejectAction?: (mark: DiffActionMark) => void;\n /** stable per-scope key (e.g. projectGroupNo); remembers/restores scroll\n * position across editor unmount/remount */\n scrollScopeKey?: string;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n onSelectionChange?: (next: StudioSelection) => void;\n onRequestAssetDelete?: (target: AssetDeleteRequest) => void;\n}) {\n const stream = useMemo(() => buildFlatStream(value), [value]);\n const maps = useMemo(\n () => ({\n actorMap: getActorMap(value.actors ?? []),\n speakerMap: getSpeakerMap(value.speakers ?? []),\n locationMap: getLocationMap(value.locations ?? []),\n propMap: getPropMap(value.props ?? []),\n }),\n [value.actors, value.speakers, value.locations, value.props],\n );\n\n // asset→scene reference index, built ONCE per value (not per visible card),\n // and DEFERRED off the keystroke hot path: while typing, urgent renders reuse\n // the previous index and the rescan runs at idle (the reference grid lagging a\n // beat behind is fine; the card's own editable fields use the fresh `value`).\n // Threading the previous index in keeps unchanged assets' refs reference-stable\n // so AssetCard's memo only re-renders the cards whose appearances changed.\n const deferredValue = useDeferredValue(value);\n const prevDistributions = useRef<Map<string, ReferenceEpisodeGroup[]> | undefined>(undefined);\n const distributions = useMemo(() => {\n // Writing the cache ref during render is intentional and correctness-safe:\n // buildDistributionIndex only reuses a prev array when sameRefGroups says it\n // is STRUCTURALLY equal to the freshly-computed-from-`deferredValue` result.\n // So a `prev` left over from a discarded/StrictMode render can at worst cost\n // a missed reuse (one extra re-render, self-correcting next pass) — it can\n // never surface stale refs. Do NOT \"fix\" this into a plain memo.\n const next = buildDistributionIndex(deferredValue, prevDistributions.current);\n prevDistributions.current = next;\n return next;\n }, [deferredValue]);\n\n const handleRef = useRef<VirtuosoHandle>(null);\n // remember scroll position per scope across editor unmount/remount\n useScrollStateMemo(scrollScopeKey, handleRef);\n const programmaticUntil = useRef(0);\n const lastEmitted = useRef(-1);\n const lastScrolledKey = useRef<string>(\"\");\n\n // stable so the memoized SceneEditor can skip non-edited scenes\n const select = useCallback(\n (sel: StudioSelection) => onSelectionChange?.(sel),\n [onSelectionChange],\n );\n\n // ── shared cross-scene drag state ───────────────────────────────────────\n const [dragSource, setDragSource] = useState<DragSource | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n const dragSourceRef = useRef<DragSource | null>(null);\n const dropTargetRef = useRef<DropTarget | null>(null);\n dragSourceRef.current = dragSource;\n dropTargetRef.current = dropTarget;\n const dnd = useMemo<DragReorderApi>(\n () => ({\n source: dragSource,\n dropAt: dropTarget,\n begin: (s) => {\n setDragSource(s);\n setDropTarget(null);\n },\n hover: (t) => setDropTarget(t),\n drop: () => {\n const s = dragSourceRef.current;\n const d = dropTargetRef.current;\n if (s && d) {\n onEdit((cur) =>\n moveScriptItem(\n cur,\n { episodeIndex: s.ep, sceneIndex: s.sc, itemIndex: s.idx },\n { episodeIndex: d.ep, sceneIndex: d.sc, slot: d.slot },\n ),\n );\n }\n setDragSource(null);\n setDropTarget(null);\n },\n end: () => {\n setDragSource(null);\n setDropTarget(null);\n },\n }),\n [dragSource, dropTarget, onEdit],\n );\n\n /** One continuous paper across the whole episodes region: only the very first\n * header rounds the top and the very last scene rounds the bottom; episode\n * headers in between stay seamless (inline banners). */\n const paperEdge = (key: string) => {\n const start = key === stream.paperStartKey;\n const end = key === stream.paperEndKey;\n return start && end ? \"is-sole\" : start ? \"is-start\" : end ? \"is-end\" : \"is-mid\";\n };\n\n // external selection → scroll into view. Keyed by the selection TARGET (not\n // the stream object, which is rebuilt on every edit) so editing does NOT\n // re-trigger a scroll / re-arm the programmatic lock for the same selection.\n useEffect(() => {\n const key = selectionTargetKey(selection);\n if (selection.origin === \"scroll\") {\n lastScrolledKey.current = key;\n return;\n }\n if (key === lastScrolledKey.current) return;\n const idx = selectionToFlatIndex(stream, selection);\n if (idx == null) return;\n lastScrolledKey.current = key;\n programmaticUntil.current = Date.now() + 200;\n handleRef.current?.scrollToIndex({ index: idx, align: \"start\", behavior: \"auto\" });\n }, [selection, stream]);\n\n const emitScrollSelection = (topIndex: number) => {\n if (Date.now() < programmaticUntil.current) return;\n if (topIndex === lastEmitted.current) return;\n lastEmitted.current = topIndex;\n const next = flatIndexToSelection(stream, topIndex);\n if (!next) return;\n if (isSameSelectionTarget(next, selection)) return;\n onSelectionChange?.(withOrigin(next, \"scroll\"));\n };\n\n return (\n <DragReorderContext.Provider value={dnd}>\n <Virtuoso\n ref={handleRef}\n className=\"lj-se-stream lj-se-scroll\"\n data={stream.items}\n restoreStateFrom={readScrollState(scrollScopeKey)}\n increaseViewportBy={1500}\n rangeChanged={(range) => emitScrollSelection(range.startIndex)}\n itemContent={(_index, item) => {\n if (!item) return null;\n switch (item.kind) {\n case \"episode-header\": {\n const episode = value.episodes?.[item.episodeIdx];\n if (!episode) return null;\n return (\n <div className=\"lj-se-stream-row\">\n <div className={cn(\"lj-se-paper-seg\", paperEdge(item.key), \"lj-se-ep-seg\")}>\n <div className=\"lj-se-epbanner-wrap\">\n {!disabled ? <EpisodeMenu episodeIdx={item.episodeIdx} onEdit={onEdit} /> : null}\n <EpisodeBanner\n episodeIdx={item.episodeIdx}\n episodeTitle={getEpisodeTitle(episode, item.episodeIdx)}\n projectTitle={item.episodeIdx === 0 ? value.title ?? \"\" : undefined}\n disabled={disabled}\n onEdit={onEdit}\n />\n </div>\n </div>\n </div>\n );\n }\n case \"episode-empty\":\n if (disabled) return null;\n return (\n <div className=\"lj-se-stream-row\">\n <div className={cn(\"lj-se-paper-seg\", paperEdge(item.key))}>\n <button\n type=\"button\"\n className=\"lj-se-scene-add-first\"\n onClick={() => onEdit((p) => addBlankScene(p, item.episodeIdx))}\n >\n <Plus className=\"lj-se-ic-3\" strokeWidth={2} /> 添加场次\n </button>\n </div>\n </div>\n );\n case \"scene\": {\n const scene = value.episodes?.[item.episodeIdx]?.scenes?.[item.sceneIdx];\n if (!scene) return null;\n const focused =\n selection.kind === \"scene\" &&\n selection.episodeIdx === item.episodeIdx &&\n selection.sceneIdx === item.sceneIdx;\n const diffKey = `${item.episodeIdx}:${item.sceneId}`;\n const inDiff = !disabled && (changedSceneKeys?.has(diffKey) ?? false);\n const wholeKind = !disabled ? sceneDiff?.kindByKey.get(diffKey) : undefined;\n const sceneActions = !disabled ? actionDiffByScene?.get(diffKey) : undefined;\n const actionDiff =\n sceneActions && onAcceptAction && onRejectAction\n ? {\n byIndex: sceneActions.byIndex,\n removedBefore: sceneActions.removedBefore,\n onAccept: onAcceptAction,\n onReject: onRejectAction,\n }\n : undefined;\n return (\n <div className=\"lj-se-stream-row\" data-quote-source>\n <div className={cn(\"lj-se-paper-seg\", paperEdge(item.key), wholeKind && \"is-changed\")}>\n {sceneDiff && inDiff ? (\n <div className=\"lj-se-scenediff\">\n <span className={cn(\"lj-se-scenediff-tag\", wholeKind === \"added\" && \"is-added\")}>\n {wholeKind === \"added\" ? \"AI 新增\" : \"AI 改动\"}\n </span>\n <span className=\"lj-se-scenediff-spacer\" />\n <button\n type=\"button\"\n className=\"lj-se-scenediff-reject\"\n onClick={() => sceneDiff!.onReject(item.episodeIdx, item.sceneId)}\n >\n 整场拒绝\n </button>\n <button\n type=\"button\"\n className=\"lj-se-scenediff-accept\"\n onClick={() => sceneDiff!.onAccept(item.episodeIdx, item.sceneId)}\n >\n 整场接受\n </button>\n </div>\n ) : null}\n <SceneEditor\n actionDiff={actionDiff}\n episodeIndex={item.episodeIdx}\n sceneIndex={item.sceneIdx}\n scene={scene}\n maps={maps}\n format={format}\n disabled={disabled}\n focused={focused}\n onEdit={onEdit}\n onNavigateAsset={select}\n onRequestAssetDelete={onRequestAssetDelete}\n />\n </div>\n </div>\n );\n }\n case \"add-episode\":\n if (disabled) return null;\n return (\n <div className=\"lj-se-addep-row\">\n <button type=\"button\" className=\"lj-se-addep-btn\" onClick={() => onEdit((p) => addEpisode(p))}>\n <Plus className=\"lj-se-ic-4\" strokeWidth={2} /> 新增一集\n </button>\n </div>\n );\n case \"asset-group-header\":\n return (\n <div className=\"lj-se-assetgroup-head\">\n <span className=\"lj-se-assetgroup-title\">{assetGroupLabel(item.group)}</span>\n </div>\n );\n case \"asset-card\":\n return (\n <AssetCard\n data={value}\n group={item.group}\n assetId={item.assetId}\n refs={\n distributions.get(`${item.group}:${item.assetId}`) ??\n buildAssetRefs(value, item.group, item.assetId)\n }\n disabled={disabled}\n onEdit={onEdit}\n onSelect={select}\n onRequestAssetDelete={onRequestAssetDelete}\n />\n );\n default:\n return null;\n }\n }}\n />\n </DragReorderContext.Provider>\n );\n}\n\n/** Episode control hub — a left-margin grip aligned to the banner; opens\n * scene-level structural ops for the whole episode (add below / delete). */\nfunction EpisodeMenu({\n episodeIdx,\n onEdit,\n}: {\n episodeIdx: number;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n}) {\n return (\n <Popover\n align=\"start\"\n side=\"bottom\"\n className=\"lj-se-ephandle-pop\"\n panelClassName=\"lj-se-rowmenu\"\n trigger={({ open, toggle }) => (\n <button type=\"button\" className={cn(\"lj-se-handle lj-se-ephandle\", open && \"is-open\")} title=\"集操作\" aria-label=\"集操作\" onClick={toggle}>\n <GripVertical className=\"lj-se-handle-grip\" strokeWidth={1.5} />\n </button>\n )}\n >\n {({ close }) => (\n <RowMenuPanel\n close={close}\n sections={[\n [{ icon: Plus, label: \"在下方新增一集\", onSelect: () => onEdit((p) => addEpisode(p, episodeIdx + 1)) }],\n [{ icon: Trash2, label: \"删除整集\", onSelect: () => onEdit((p) => deleteEpisode(p, episodeIdx)), danger: true }],\n ]}\n />\n )}\n </Popover>\n );\n}\n\n/** Episode title page printed on the paper top — project title (episode 0\n * only) + episode title + decorative divider, all click-to-edit. */\nfunction EpisodeBanner({\n episodeIdx,\n episodeTitle,\n projectTitle,\n disabled,\n onEdit,\n}: {\n episodeIdx: number;\n episodeTitle: string;\n projectTitle?: string;\n disabled: boolean;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n}) {\n return (\n <div className=\"lj-se-epbanner\">\n {projectTitle !== undefined ? (\n <>\n <div className=\"lj-se-epbanner-kicker\">剧本</div>\n <h1 className=\"lj-se-epbanner-script\">\n <EditableText\n value={projectTitle}\n disabled={disabled}\n placeholder=\"未命名\"\n onSave={(v) => onEdit((p) => ({ ...p, title: v }))}\n />\n </h1>\n </>\n ) : null}\n <h2 className=\"lj-se-epbanner-ep\">\n <EditableText\n value={episodeTitle}\n disabled={disabled}\n placeholder=\"未命名集\"\n onSave={(v) =>\n onEdit((p) => ({\n ...p,\n episodes: p.episodes?.map((ep, i) => (i === episodeIdx ? { ...ep, title: v } : ep)) ?? p.episodes,\n }))\n }\n />\n </h2>\n <span className=\"lj-se-epbanner-divider\" aria-hidden />\n </div>\n );\n}\n","/**\n * Coarse, pure diff between a baseline ScriptProject (pre-AI-revision) and the\n * current one. Surfaces changed top-level fields and changed/added scenes so\n * the overlay can show counts, navigate to changes, and accept/reject all.\n * Scenes are matched by scene_id within an episode.\n */\nimport type { Scene, ScriptEpisode, ScriptItem, ScriptProject } from \"../types.js\";\nimport { getSceneContext } from \"../utils.js\";\n\nexport interface FieldChange {\n before: string;\n after: string;\n}\n\nexport type SceneChangeKind = \"added\" | \"modified\";\n\n/** A host-flagged changed scene the editor should render (highlight + per-scene\n * accept/reject). The host decides WHICH scenes are marked (provenance: e.g.\n * only agent-changed scenes, not the user's own manual edits). */\nexport interface DiffSceneMark {\n episodeIdx: number;\n sceneId: string;\n kind: SceneChangeKind;\n}\n\nexport interface ChangeSet {\n title?: FieldChange;\n worldview?: FieldChange;\n style?: FieldChange;\n /** \"epIdx:sceneId\" → kind, for scenes present in the current value */\n changedScenes: Map<string, SceneChangeKind>;\n /** scenes present in baseline but gone from current */\n removedCount: number;\n /** total surfaced changes */\n count: number;\n}\n\nexport function sceneChangeKey(episodeIdx: number, sceneId: string | undefined): string {\n return `${episodeIdx}:${(sceneId ?? \"\").trim()}`;\n}\n\nfunction fieldChange(before?: string, after?: string): FieldChange | undefined {\n const b = (before ?? \"\").trim();\n const a = (after ?? \"\").trim();\n return b === a ? undefined : { before: b, after: a };\n}\n\nfunction serializeScene(scene: Scene): string {\n // normalize the dual context storage via getSceneContext so a scene that\n // stores refs only in the flat mirror compares equal to one that stores them\n // under context (avoids false \"modified\"); fixed key order keeps it stable.\n const ctx = getSceneContext(scene);\n return JSON.stringify({\n environment: scene.environment ?? null,\n actors: ctx.actors,\n locations: ctx.locations,\n props: ctx.props,\n actions: scene.actions ?? [],\n });\n}\n\nfunction sceneById(episode: ScriptEpisode | undefined): Map<string, Scene> {\n const map = new Map<string, Scene>();\n for (const scene of episode?.scenes ?? []) {\n const id = (scene.scene_id ?? \"\").trim();\n if (id) map.set(id, scene);\n }\n return map;\n}\n\n/** Resolve an episode in `episodes` matching `ref` by episode_id, falling back\n * to the positional index — so an episode inserted/removed/reordered ahead of\n * this one doesn't misalign every subsequent episode's scene diff. */\nfunction matchEpisode(\n episodes: ScriptEpisode[] | undefined,\n ref: ScriptEpisode,\n index: number,\n): ScriptEpisode | undefined {\n const list = episodes ?? [];\n const id = ref.episode_id?.trim();\n if (id) {\n const byId = list.find((e) => e.episode_id?.trim() === id);\n if (byId) return byId;\n }\n return list[index];\n}\n\nexport function computeChangeSet(\n baseline: ScriptProject | null,\n current: ScriptProject,\n): ChangeSet {\n const changedScenes = new Map<string, SceneChangeKind>();\n let removedCount = 0;\n\n if (!baseline) {\n return { changedScenes, removedCount, count: 0 };\n }\n\n const title = fieldChange(baseline.title, current.title);\n const worldview = fieldChange(baseline.worldview, current.worldview);\n const style = fieldChange(baseline.style, current.style);\n\n const curEpisodes = current.episodes ?? [];\n curEpisodes.forEach((episode, ei) => {\n const baseMap = sceneById(matchEpisode(baseline.episodes, episode, ei));\n for (const scene of episode.scenes ?? []) {\n const id = (scene.scene_id ?? \"\").trim();\n if (!id) continue;\n const base = baseMap.get(id);\n if (!base) {\n changedScenes.set(sceneChangeKey(ei, id), \"added\");\n } else if (base === scene) {\n // immutable edits only replace the changed scene's object on the path\n // from the root, so an unchanged scene keeps the SAME reference as in\n // the baseline snapshot — skip the (expensive) serialize entirely.\n continue;\n } else if (serializeScene(base) !== serializeScene(scene)) {\n changedScenes.set(sceneChangeKey(ei, id), \"modified\");\n }\n }\n });\n\n // removed scenes (in baseline, absent in current)\n (baseline.episodes ?? []).forEach((episode, ei) => {\n const curMap = sceneById(matchEpisode(curEpisodes, episode, ei));\n for (const scene of episode.scenes ?? []) {\n const id = (scene.scene_id ?? \"\").trim();\n if (id && !curMap.has(id)) removedCount += 1;\n }\n });\n\n const count =\n (title ? 1 : 0) +\n (worldview ? 1 : 0) +\n (style ? 1 : 0) +\n changedScenes.size +\n removedCount;\n\n return { title, worldview, style, changedScenes, removedCount, count };\n}\n\n/** Convert a ChangeSet's changed-scene map into the editor's DiffSceneMark[]\n * (the `diff.scenes` render descriptor). Keys are `${episodeIdx}:${sceneId}`. */\nexport function changeSetToDiffScenes(changeSet: ChangeSet): DiffSceneMark[] {\n const out: DiffSceneMark[] = [];\n for (const [key, kind] of changeSet.changedScenes) {\n const i = key.indexOf(\":\");\n if (i < 0) continue;\n const episodeIdx = Number(key.slice(0, i));\n const sceneId = key.slice(i + 1);\n if (Number.isFinite(episodeIdx)) out.push({ episodeIdx, sceneId, kind });\n }\n return out;\n}\n\n/** Convenience for hosts using the simple \"baseline vs current\" diff model:\n * returns the render-descriptor data (scenes + counts) the `diff` adapter wants.\n * Hosts wanting provenance (user vs agent) compute `scenes` themselves instead. */\nexport function buildDiffFromBaseline(\n baseline: ScriptProject | null,\n current: ScriptProject,\n): { scenes: DiffSceneMark[]; removedCount: number; count: number } {\n const cs = computeChangeSet(baseline, current);\n return { scenes: changeSetToDiffScenes(cs), removedCount: cs.removedCount, count: cs.count };\n}\n\n/** PER-SCENE ACCEPT — return a baseline patched so its matching scene equals\n * `scene` (the current version), dropping just that scene from the diff. Matches\n * the episode by episode_id (fallback index) and the scene by scene_id; inserts\n * when the baseline lacked it (an added scene). Immutable. */\nexport function acceptSceneIntoBaseline(\n baseline: ScriptProject,\n episodeId: string | undefined,\n episodeIdx: number,\n scene: Scene,\n): ScriptProject {\n const episodes = (baseline.episodes ?? []).slice();\n const id = episodeId?.trim();\n let ei = id ? episodes.findIndex((e) => e.episode_id?.trim() === id) : -1;\n if (ei < 0) ei = episodeIdx >= 0 && episodeIdx < episodes.length ? episodeIdx : -1;\n if (ei < 0) {\n episodes.push({ episode_id: episodeId, scenes: [scene] });\n return { ...baseline, episodes };\n }\n const ep = episodes[ei];\n const scenes = (ep.scenes ?? []).slice();\n const sid = (scene.scene_id ?? \"\").trim();\n const si = sid ? scenes.findIndex((s) => (s.scene_id ?? \"\").trim() === sid) : -1;\n if (si >= 0) scenes[si] = scene;\n else scenes.push(scene);\n episodes[ei] = { ...ep, scenes };\n return { ...baseline, episodes };\n}\n\n/** PER-SCENE REJECT — return current with the scene at (episodeIdx, sceneIdx)\n * reverted to its baseline version, or removed if it was added (no baseline\n * counterpart). Immutable. */\nexport function rejectSceneToBaseline(\n current: ScriptProject,\n episodeIdx: number,\n sceneIdx: number,\n baselineScene: Scene | null,\n): ScriptProject {\n const episodes = (current.episodes ?? []).slice();\n const ep = episodes[episodeIdx];\n if (!ep) return current;\n const scenes = (ep.scenes ?? []).slice();\n if (sceneIdx < 0 || sceneIdx >= scenes.length) return current;\n if (baselineScene) scenes[sceneIdx] = baselineScene;\n else scenes.splice(sceneIdx, 1);\n episodes[episodeIdx] = { ...ep, scenes };\n return { ...current, episodes };\n}\n\n/** Look up the baseline scene matching (episodeId/idx, sceneId), or null. */\nexport function findBaselineScene(\n baseline: ScriptProject | null,\n episodeId: string | undefined,\n episodeIdx: number,\n sceneId: string,\n): Scene | null {\n if (!baseline) return null;\n const ep = matchEpisode(baseline.episodes, { episode_id: episodeId } as ScriptEpisode, episodeIdx);\n if (!ep) return null;\n const sid = sceneId.trim();\n if (!sid) return null;\n return (ep.scenes ?? []).find((s) => (s.scene_id ?? \"\").trim() === sid) ?? null;\n}\n\n// ── ACTION-LEVEL DIFF (LCS) ──────────────────────────────────────────────────\n\n/** One changed action (line) the editor renders: highlight + ✓/✗.\n * - added/modified: `itemIdx` is the index in the CURRENT scene.\n * - removed: `itemIdx` is the position the ghost row sits BEFORE in the current list.\n * `item` is the OLD baseline action (set for \"modified\" and \"removed\") so the\n * editor can render the deleted line above the new one (unified-diff view). */\nexport interface DiffActionMark {\n episodeIdx: number;\n sceneId: string;\n kind: \"added\" | \"modified\" | \"removed\";\n itemIdx: number;\n baselineItemIdx?: number;\n item?: ScriptItem;\n}\n\nfunction actionSig(a: ScriptItem): string {\n return [a.type ?? \"\", (a.content ?? \"\").trim(), a.actor_id ?? \"\", a.emotion ?? \"\", a.delivery ?? \"\"].join(\"\u0000\");\n}\n\nexport interface SceneActionDiff {\n changed: Array<{ itemIdx: number; kind: \"added\" | \"modified\"; baselineItemIdx?: number }>;\n removed: Array<{ beforeItemIdx: number; baselineItemIdx: number }>;\n}\n\n/** LCS-align two action lists → per-line added / modified / removed. Adjacent\n * delete+insert runs are paired as \"modified\" (so an in-place line edit shows\n * as one modified row, not remove+add); LCS keeps insertions from shifting all\n * following lines into false \"modified\"s. */\nexport function computeSceneActionDiff(baseline: ScriptItem[], current: ScriptItem[]): SceneActionDiff {\n const m = baseline.length;\n const n = current.length;\n const bs = baseline.map(actionSig);\n const cs = current.map(actionSig);\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n dp[i][j] = bs[i] === cs[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n type Op = { t: \"match\"; j: number } | { t: \"del\"; i: number } | { t: \"ins\"; j: number };\n const ops: Op[] = [];\n let i = 0;\n let j = 0;\n while (i < m && j < n) {\n if (bs[i] === cs[j]) { ops.push({ t: \"match\", j }); i++; j++; }\n else if (dp[i + 1][j] >= dp[i][j + 1]) { ops.push({ t: \"del\", i }); i++; }\n else { ops.push({ t: \"ins\", j }); j++; }\n }\n while (i < m) { ops.push({ t: \"del\", i }); i++; }\n while (j < n) { ops.push({ t: \"ins\", j }); j++; }\n\n const changed: SceneActionDiff[\"changed\"] = [];\n const removed: SceneActionDiff[\"removed\"] = [];\n let curJ = 0;\n let p = 0;\n while (p < ops.length) {\n const op = ops[p];\n if (op.t === \"match\") { curJ = op.j + 1; p++; continue; }\n if (op.t === \"ins\") { changed.push({ itemIdx: op.j, kind: \"added\" }); curJ = op.j + 1; p++; continue; }\n const dels: number[] = [];\n while (p < ops.length && ops[p].t === \"del\") { dels.push((ops[p] as { i: number }).i); p++; }\n const inss: number[] = [];\n while (p < ops.length && ops[p].t === \"ins\") { inss.push((ops[p] as { j: number }).j); p++; }\n const pair = Math.min(dels.length, inss.length);\n for (let q = 0; q < pair; q++) changed.push({ itemIdx: inss[q], kind: \"modified\", baselineItemIdx: dels[q] });\n for (let q = pair; q < inss.length; q++) changed.push({ itemIdx: inss[q], kind: \"added\" });\n const ghostBefore = inss.length ? inss[inss.length - 1] + 1 : curJ;\n for (let q = pair; q < dels.length; q++) removed.push({ beforeItemIdx: ghostBefore, baselineItemIdx: dels[q] });\n if (inss.length) curJ = inss[inss.length - 1] + 1;\n }\n return { changed, removed };\n}\n\n/** Apply an action ACCEPT onto a baseline scene (returns a new scene): the\n * baseline catches up to current for that line, so it stops being a diff. */\nexport function applyActionAccept(baselineScene: Scene, currentScene: Scene, mark: DiffActionMark): Scene {\n const bActions = (baselineScene.actions ?? []).slice();\n const cActions = currentScene.actions ?? [];\n if (mark.kind === \"modified\" && mark.baselineItemIdx != null) {\n const item = cActions[mark.itemIdx];\n if (item && mark.baselineItemIdx < bActions.length) bActions[mark.baselineItemIdx] = item;\n } else if (mark.kind === \"added\") {\n const item = cActions[mark.itemIdx];\n if (item) bActions.splice(Math.min(mark.itemIdx, bActions.length), 0, item);\n } else if (mark.kind === \"removed\" && mark.baselineItemIdx != null) {\n if (mark.baselineItemIdx < bActions.length) bActions.splice(mark.baselineItemIdx, 1);\n }\n return { ...baselineScene, actions: bActions };\n}\n\n/** Apply an action REJECT onto a current scene (returns a new scene): the\n * working value reverts to the baseline for that line (or drops an added line /\n * restores a removed one). */\nexport function applyActionReject(currentScene: Scene, baselineScene: Scene | null, mark: DiffActionMark): Scene {\n const cActions = (currentScene.actions ?? []).slice();\n const bActions = baselineScene?.actions ?? [];\n if (mark.kind === \"modified\" && mark.baselineItemIdx != null) {\n const item = bActions[mark.baselineItemIdx];\n if (item && mark.itemIdx < cActions.length) cActions[mark.itemIdx] = item;\n } else if (mark.kind === \"added\") {\n if (mark.itemIdx < cActions.length) cActions.splice(mark.itemIdx, 1);\n } else if (mark.kind === \"removed\") {\n const item = mark.item ?? (mark.baselineItemIdx != null ? bActions[mark.baselineItemIdx] : undefined);\n if (item) cActions.splice(Math.min(mark.itemIdx, cActions.length), 0, item);\n }\n return { ...currentScene, actions: cActions };\n}\n\n/** Project-level action ACCEPT — advance the baseline for one line. Thin for\n * hosts: `patchBaseline(prev => acceptActionIntoBaseline(prev, current, mark))`. */\nexport function acceptActionIntoBaseline(baseline: ScriptProject, current: ScriptProject, mark: DiffActionMark): ScriptProject {\n const cEp = current.episodes?.[mark.episodeIdx];\n const curScene = cEp?.scenes?.find((s) => (s.scene_id ?? \"\").trim() === mark.sceneId.trim());\n const baseScene = findBaselineScene(baseline, cEp?.episode_id, mark.episodeIdx, mark.sceneId);\n if (!baseScene) {\n return curScene ? acceptSceneIntoBaseline(baseline, cEp?.episode_id, mark.episodeIdx, curScene) : baseline;\n }\n const next = applyActionAccept(baseScene, curScene ?? baseScene, mark);\n return acceptSceneIntoBaseline(baseline, cEp?.episode_id, mark.episodeIdx, next);\n}\n\n/** Project-level action REJECT — revert the working value for one line. Thin:\n * `onEdit(cur => rejectActionToBaseline(cur, baseline, mark))`. */\nexport function rejectActionToBaseline(current: ScriptProject, baseline: ScriptProject | null, mark: DiffActionMark): ScriptProject {\n const cEp = current.episodes?.[mark.episodeIdx];\n const sceneIdx = cEp?.scenes?.findIndex((s) => (s.scene_id ?? \"\").trim() === mark.sceneId.trim()) ?? -1;\n if (sceneIdx < 0 || !cEp?.scenes) return current;\n const curScene = cEp.scenes[sceneIdx];\n const baseScene = findBaselineScene(baseline, cEp.episode_id, mark.episodeIdx, mark.sceneId);\n const next = applyActionReject(curScene, baseScene, mark);\n return rejectSceneToBaseline(current, mark.episodeIdx, sceneIdx, next);\n}\n\n/** Convenience for the simple baseline model: full action-level descriptor data\n * (whole-scene marks for added scenes; per-line marks for modified scenes). */\nexport function buildActionDiff(\n baseline: ScriptProject | null,\n current: ScriptProject,\n): { scenes: DiffSceneMark[]; actions: DiffActionMark[]; removedCount: number; count: number } {\n const cs = computeChangeSet(baseline, current);\n const scenes: DiffSceneMark[] = [];\n const actions: DiffActionMark[] = [];\n for (const [key, kind] of cs.changedScenes) {\n const ci = key.indexOf(\":\");\n const episodeIdx = Number(key.slice(0, ci));\n const sceneId = key.slice(ci + 1);\n if (!Number.isFinite(episodeIdx)) continue;\n if (kind === \"added\") {\n scenes.push({ episodeIdx, sceneId, kind: \"added\" });\n continue;\n }\n const ep = current.episodes?.[episodeIdx];\n const curScene = ep?.scenes?.find((s) => (s.scene_id ?? \"\").trim() === sceneId);\n const baseScene = findBaselineScene(baseline, ep?.episode_id, episodeIdx, sceneId);\n if (!curScene) continue;\n const sd = computeSceneActionDiff(baseScene?.actions ?? [], curScene.actions ?? []);\n for (const c of sd.changed) {\n actions.push({\n episodeIdx,\n sceneId,\n kind: c.kind,\n itemIdx: c.itemIdx,\n baselineItemIdx: c.baselineItemIdx,\n // modified carries the OLD baseline action so the editor can render the\n // deleted line above the new one (unified-diff view)\n item: c.kind === \"modified\" && c.baselineItemIdx != null ? baseScene?.actions?.[c.baselineItemIdx] : undefined,\n });\n }\n for (const r of sd.removed) {\n actions.push({\n episodeIdx,\n sceneId,\n kind: \"removed\",\n itemIdx: r.beforeItemIdx,\n baselineItemIdx: r.baselineItemIdx,\n item: baseScene?.actions?.[r.baselineItemIdx],\n });\n }\n }\n return { scenes, actions, removedCount: cs.removedCount, count: scenes.length + actions.length + cs.removedCount };\n}\n","/**\n * Reference focus — the INVERSE of \"quote to chat\". The host pushes a\n * ScriptReferenceFocusRequest (e.g. when a chat message / comment that quotes\n * the script is clicked); the editor maps the reference's `source` to a\n * StudioSelection and scrolls/selects it. `requestId` is a nonce so re-focusing\n * the same target re-triggers.\n */\nimport type { StudioSelection } from \"./selection.js\";\n\n/** Where a quoted reference points INTO the script. All fields optional/loose\n * to tolerate host payloads (numbers may arrive as strings). */\nexport interface ScriptReferenceLocator {\n id?: string;\n text?: string;\n source?: {\n kind?: string; // \"actor\" | \"location\" | \"prop\" | …\n id?: string;\n episodeIdx?: number | string;\n sceneIdx?: number | string;\n itemIdx?: number | string;\n field?: string; // \"title\" | \"worldview\" | \"style\" | \"description\" | \"scene.header\" | …\n } | null;\n}\n\nexport interface ScriptReferenceFocusRequest {\n /** nonce — bump to re-focus the same target */\n requestId: number;\n reference: ScriptReferenceLocator;\n}\n\nfunction asNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return null;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\n/** Map a reference locator → the selection the editor should focus, or null. */\nexport function selectionFromScriptReference(\n reference: ScriptReferenceLocator,\n): StudioSelection | null {\n const source = reference.source;\n if (!source) return null;\n\n const sourceKind = asString(source.kind);\n const sourceId = asString(source.id);\n if (sourceKind === \"actor\" && sourceId) return { kind: \"actor\", actorId: sourceId };\n if (sourceKind === \"location\" && sourceId) return { kind: \"location\", locationId: sourceId };\n if (sourceKind === \"prop\" && sourceId) return { kind: \"prop\", propId: sourceId };\n\n const episodeIdx = asNumber(source.episodeIdx);\n const sceneIdx = asNumber(source.sceneIdx);\n if (episodeIdx !== null && sceneIdx !== null) {\n return { kind: \"scene\", episodeIdx, sceneIdx };\n }\n if (episodeIdx !== null) return { kind: \"episode\", episodeIdx };\n\n const field = asString(source.field);\n if (field === \"title\" || field === \"worldview\" || field === \"style\") {\n return { kind: \"worldview\" };\n }\n\n return null;\n}\n","/**\n * QuoteLayer — turns a native text selection inside the script surface into a\n * \"quote to chat\" affordance. When the user selects text within a\n * [data-quote-source] region, a small floating button appears near the\n * selection; clicking pushes the quoted text to the host's chat composer.\n *\n * Works WITH the click-to-edit primitive: because display text is plain spans,\n * native selection spans across rows, so quotes can cover multiple lines.\n */\nimport { useEffect, useRef, useState } from \"react\";\nimport { MessageSquareQuote } from \"lucide-react\";\nimport type { ChatReference } from \"../adapters.js\";\n\ninterface Pos {\n top: number;\n left: number;\n text: string;\n}\n\nexport function QuoteLayer({\n containerRef,\n onAddChatReferences,\n}: {\n containerRef: React.RefObject<HTMLElement | null>;\n onAddChatReferences: (refs: ChatReference[]) => void;\n}) {\n const [pos, setPos] = useState<Pos | null>(null);\n const seqRef = useRef(0);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // anchor the chip near where the pointer was released, not at the\n // selection's bounding box (which floats far away on multi-line quotes).\n function update(pointerX: number, pointerY: number) {\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || sel.rangeCount === 0) {\n setPos(null);\n return;\n }\n const range = sel.getRangeAt(0);\n // use the selection's anchor (where it STARTED) rather than the range's\n // commonAncestorContainer — a cross-scene selection's common ancestor is\n // the unmarked stream container, which would fail the data-quote-source\n // test and hide the chip exactly for multi-scene quotes.\n const anchor = sel.anchorNode ?? range.commonAncestorContainer;\n const anchorEl = anchor instanceof Element ? anchor : anchor.parentElement;\n const host = containerRef.current;\n if (!host || !anchorEl || !host.contains(anchorEl)) {\n setPos(null);\n return;\n }\n // only within an editable text source, not inside an active textarea\n if (!anchorEl.closest(\"[data-quote-source]\")) {\n setPos(null);\n return;\n }\n const text = sel.toString().trim();\n if (!text) {\n setPos(null);\n return;\n }\n const hostRect = host.getBoundingClientRect();\n // pop the chip from just above-right of the release point (its bottom-left\n // corner sits near the cursor), clamped to stay inside the canvas\n const left = Math.min(Math.max(8, pointerX - hostRect.left + 6), hostRect.width - 150);\n const top = Math.min(Math.max(36, pointerY - hostRect.top - 6), hostRect.height - 8);\n setPos({ top, left, text });\n }\n\n function onUp(e: MouseEvent) {\n const x = e.clientX;\n const y = e.clientY;\n // defer so the selection is finalized\n requestAnimationFrame(() => update(x, y));\n }\n function onDown(e: MouseEvent) {\n // clicking the button itself shouldn't clear before handler runs\n if ((e.target as HTMLElement)?.closest?.(\".lj-se-quote-btn\")) return;\n setPos(null);\n }\n\n document.addEventListener(\"mouseup\", onUp);\n document.addEventListener(\"mousedown\", onDown, true);\n return () => {\n document.removeEventListener(\"mouseup\", onUp);\n document.removeEventListener(\"mousedown\", onDown, true);\n };\n }, [containerRef]);\n\n if (!pos) return null;\n\n return (\n <button\n type=\"button\"\n className=\"lj-se-quote-btn\"\n style={{ top: pos.top, left: pos.left }}\n onClick={() => {\n seqRef.current += 1;\n onAddChatReferences([\n {\n id: `quote-${seqRef.current}-${pos.text.length}`,\n label: pos.text.length > 24 ? pos.text.slice(0, 24) + \"…\" : pos.text,\n text: pos.text,\n },\n ]);\n window.getSelection()?.removeAllRanges();\n setPos(null);\n }}\n >\n <MessageSquareQuote className=\"lj-se-icon-sm\" strokeWidth={1.5} />\n 引用到对话\n </button>\n );\n}\n","import type { RefObject } from \"react\";\nimport { ChevronLeft, ChevronRight, Search, X } from \"lucide-react\";\n\nexport function ScriptSearchBox({\n query,\n current,\n total,\n inputRef,\n onQueryChange,\n onPrev,\n onNext,\n onClose,\n}: {\n query: string;\n current: number;\n total: number;\n inputRef: RefObject<HTMLInputElement | null>;\n onQueryChange: (query: string) => void;\n onPrev: () => void;\n onNext: () => void;\n onClose: () => void;\n}) {\n return (\n <div className=\"lj-se-search\">\n <Search className=\"lj-se-ic-3\" strokeWidth={2} />\n <input\n ref={inputRef}\n className=\"lj-se-search-input\"\n value={query}\n placeholder=\"搜索\"\n aria-label=\"搜索剧本\"\n onChange={(e) => onQueryChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (e.shiftKey) onPrev();\n else onNext();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }}\n />\n <span className=\"lj-se-search-count\">\n {total > 0 ? current + 1 : 0}/{total}\n </span>\n <button type=\"button\" className=\"lj-se-search-btn\" title=\"上一处\" disabled={total === 0} onClick={onPrev}>\n <ChevronLeft className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n <button type=\"button\" className=\"lj-se-search-btn\" title=\"下一处\" disabled={total === 0} onClick={onNext}>\n <ChevronRight className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n <button type=\"button\" className=\"lj-se-search-btn\" title=\"关闭搜索\" onClick={onClose}>\n <X className=\"lj-se-ic-3\" strokeWidth={2.25} />\n </button>\n </div>\n );\n}\n","import type { AssetState, Scene, ScriptItem, ScriptProject } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { getPrimarySceneLocationId } from \"../mutations/editor-utils.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getDialogueSpeakerLabel,\n getEpisodeTitle,\n getLocationDisplayName,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n getSceneContext,\n getSceneNumber,\n getSpeakerMap,\n getStateDisplayName,\n isActorBearingContentType,\n translateEmotionLabel,\n} from \"../utils.js\";\n\nexport interface ScriptSearchEntry {\n key: string;\n text: string;\n selection: StudioSelection;\n}\n\nexport interface ScriptSearchMatch {\n entry: ScriptSearchEntry;\n index: number;\n}\n\nconst SPACE_LABEL: Record<string, string> = {\n interior: \"INT. 内\",\n exterior: \"EXT. 外\",\n};\nconst TIME_LABEL: Record<string, string> = {\n day: \"DAY 日\",\n night: \"NIGHT 夜\",\n dawn: \"DAWN 晨\",\n dusk: \"DUSK 暮\",\n};\n\nfunction add(parts: string[], value: string | null | undefined): void {\n const text = value?.trim();\n if (text) parts.push(text);\n}\n\nfunction findStateName(states: AssetState[] | undefined, stateId: string | null | undefined): string {\n const id = stateId?.trim();\n if (!id) return \"\";\n return getStateDisplayName(states?.find((state) => state.state_id?.trim() === id));\n}\n\nfunction normalize(value: string): string {\n return value.trim().toLocaleLowerCase();\n}\n\nfunction sceneSearchText(\n scene: Scene,\n sceneIdx: number,\n maps: {\n actorMap: ReturnType<typeof getActorMap>;\n speakerMap: ReturnType<typeof getSpeakerMap>;\n locationMap: ReturnType<typeof getLocationMap>;\n propMap: ReturnType<typeof getPropMap>;\n },\n): string {\n const parts: string[] = [];\n const context = getSceneContext(scene);\n const primaryLocationId = getPrimarySceneLocationId(scene);\n const location = primaryLocationId ? maps.locationMap.get(primaryLocationId) : undefined;\n\n add(parts, String(getSceneNumber(scene, sceneIdx)));\n add(parts, SPACE_LABEL[scene.environment?.space ?? \"\"] ?? scene.environment?.space);\n add(parts, location ? getLocationDisplayName(location) : primaryLocationId);\n add(parts, TIME_LABEL[scene.environment?.time ?? \"\"] ?? scene.environment?.time);\n\n for (const ref of context.actors ?? []) {\n const id = ref.actor_id?.trim();\n if (!id) continue;\n const actor = maps.actorMap.get(id);\n add(parts, actor ? getActorDisplayName(actor) : id);\n add(parts, findStateName(actor?.states, ref.state_id));\n }\n for (const ref of context.props ?? []) {\n const id = ref.prop_id?.trim();\n if (!id) continue;\n const prop = maps.propMap.get(id);\n add(parts, prop ? getPropDisplayName(prop) : id);\n add(parts, findStateName(prop?.states, ref.state_id));\n }\n\n for (const item of scene.actions ?? []) {\n addItemSearchText(parts, item, maps.actorMap, maps.speakerMap);\n }\n return parts.join(\"\\n\");\n}\n\nfunction addItemSearchText(\n parts: string[],\n item: ScriptItem,\n actorMap: ReturnType<typeof getActorMap>,\n speakerMap: ReturnType<typeof getSpeakerMap>,\n): void {\n add(parts, item.content);\n add(parts, translateEmotionLabel(item.emotion));\n if (isActorBearingContentType(item.type)) {\n add(parts, getDialogueSpeakerLabel(item, actorMap, speakerMap));\n }\n for (const line of item.lines ?? []) {\n add(parts, getDialogueSpeakerLabel({ speaker_id: line.speaker_id }, actorMap, speakerMap));\n add(parts, line.content);\n }\n}\n\nexport function buildScriptSearchEntries(value: ScriptProject): ScriptSearchEntry[] {\n const entries: ScriptSearchEntry[] = [];\n const maps = {\n actorMap: getActorMap(value.actors ?? []),\n speakerMap: getSpeakerMap(value.speakers ?? []),\n locationMap: getLocationMap(value.locations ?? []),\n propMap: getPropMap(value.props ?? []),\n };\n\n const title = value.title?.trim();\n if (title && (value.episodes?.length ?? 0) > 0) {\n entries.push({\n key: \"title\",\n text: title,\n selection: { kind: \"episode\", episodeIdx: 0 },\n });\n }\n\n (value.episodes ?? []).forEach((episode, episodeIdx) => {\n entries.push({\n key: `episode:${episodeIdx}`,\n text: getEpisodeTitle(episode, episodeIdx),\n selection: { kind: \"episode\", episodeIdx },\n });\n (episode.scenes ?? []).forEach((scene, sceneIdx) => {\n entries.push({\n key: `scene:${episodeIdx}:${sceneIdx}`,\n text: sceneSearchText(scene, sceneIdx, maps),\n selection: { kind: \"scene\", episodeIdx, sceneIdx },\n });\n });\n });\n\n return entries;\n}\n\nexport function findScriptSearchMatches(\n entries: ScriptSearchEntry[],\n query: string,\n): ScriptSearchMatch[] {\n const needle = normalize(query);\n if (!needle) return [];\n const matches: ScriptSearchMatch[] = [];\n for (const entry of entries) {\n if (normalize(entry.text).includes(needle)) {\n matches.push({ entry, index: matches.length });\n }\n }\n return matches;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode, type RefObject } from \"react\";\nimport type { ScriptProject } from \"../types.js\";\nimport { isSameSelectionTarget, withOrigin, type StudioSelection } from \"../selection.js\";\nimport { ScriptSearchBox } from \"./script-search-box.js\";\nimport { HighlightContext } from \"../primitives/highlighted-text.js\";\nimport { buildScriptSearchEntries, findScriptSearchMatches } from \"./search-index.js\";\n\nexport function ScriptSearchLayer({\n value,\n disabled,\n rootRef,\n selection,\n onSelectionChange,\n children,\n}: {\n value: ScriptProject;\n disabled: boolean;\n rootRef: RefObject<HTMLDivElement | null>;\n selection: StudioSelection;\n onSelectionChange: (next: StudioSelection) => void;\n children: ReactNode;\n}) {\n const editorActiveRef = useRef(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [cursor, setCursor] = useState(0);\n\n const entries = useMemo(() => buildScriptSearchEntries(value), [value]);\n const matches = useMemo(() => findScriptSearchMatches(entries, query), [entries, query]);\n const total = matches.length;\n const current = total > 0 ? Math.min(cursor, total - 1) : 0;\n\n const selectMatch = useCallback(\n (index: number) => {\n const match = matches[index];\n if (!match) return;\n const next = withOrigin(match.entry.selection, \"search\");\n setCursor(index);\n if (!isSameSelectionTarget(next, selection)) onSelectionChange(next);\n },\n [matches, onSelectionChange, selection],\n );\n\n const openSearch = useCallback(() => {\n setOpen(true);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n });\n }, []);\n\n const closeSearch = useCallback(() => setOpen(false), []);\n const updateQuery = useCallback((next: string) => {\n setQuery(next);\n setCursor(0);\n }, []);\n const nextMatch = useCallback(() => {\n if (total > 0) selectMatch((current + 1) % total);\n }, [current, selectMatch, total]);\n const prevMatch = useCallback(() => {\n if (total > 0) selectMatch((current - 1 + total) % total);\n }, [current, selectMatch, total]);\n\n useEffect(() => {\n if (open && total > 0) selectMatch(current);\n }, [current, open, selectMatch, total]);\n\n useEffect(() => {\n if (!disabled && open) openSearch();\n }, [disabled, open, openSearch]);\n\n useEffect(() => {\n if (disabled) return;\n const rememberActive = (target: EventTarget | null) => {\n editorActiveRef.current = target instanceof Node && !!rootRef.current?.contains(target);\n };\n const onPointerDown = (e: PointerEvent) => rememberActive(e.target);\n const onFocusIn = (e: FocusEvent) => rememberActive(e.target);\n const onKeyDown = (e: KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey) || e.key.toLowerCase() !== \"f\") return;\n const target = e.target;\n const targetInside = target instanceof Node && !!rootRef.current?.contains(target);\n if (!targetInside) {\n if (target instanceof HTMLElement && target !== document.body) return;\n if (!editorActiveRef.current) return;\n }\n e.preventDefault();\n openSearch();\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"focusin\", onFocusIn, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"focusin\", onFocusIn, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [disabled, openSearch, rootRef]);\n\n return (\n <>\n {open ? (\n <ScriptSearchBox\n query={query}\n current={current}\n total={total}\n inputRef={inputRef}\n onQueryChange={updateQuery}\n onPrev={prevMatch}\n onNext={nextMatch}\n onClose={closeSearch}\n />\n ) : null}\n <HighlightContext.Provider value={open ? query : \"\"}>\n {children}\n </HighlightContext.Provider>\n </>\n );\n}\n","/**\n * ScriptEditor — the package's main entry. A pure, business-decoupled\n * screenplay editor over a ScriptProject:\n * value + onEdit(patch) — the only data contract\n * selection/onSelectionChange, format/onFormatChange — controlled-optional\n * adapters (diff / asset / comments) — business injected by the host. The\n * editor never couples to an agent: it only exposes capabilities/events.\n *\n * Layout: left TOC · top HUD · center (worldview | entity | virtualized script\n * one continuous stream: worldview → episodes/scenes → asset cards). The\n * floating SaveCapsule (save status + AI-revision diff + 返回 breadcrumb) and a\n * quote-to-chat layer mount when their adapters/handlers are present.\n */\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ScriptProject } from \"./types.js\";\nimport {\n EMPTY_SELECTION,\n fromToSelection,\n withOrigin,\n type StudioSelection,\n type StudioSelectionFrom,\n} from \"./selection.js\";\nimport { StudioToc } from \"./toc/studio-toc.js\";\nimport { CanvasTopBar, SaveCapsule, type SaveStatus } from \"./hud/hud.js\";\nimport { ScriptStream } from \"./stream/script-stream.js\";\nimport { sceneChangeKey, type DiffActionMark } from \"./diff/diff-engine.js\";\nimport { addEpisode } from \"./mutations/editor-utils.js\";\nimport { selectionFromScriptReference, type ScriptReferenceFocusRequest } from \"./reference.js\";\nimport {\n getActorDisplayName,\n getActorMap,\n getEpisodeNumberLabel,\n getLocationDisplayName,\n getLocationMap,\n getPropDisplayName,\n getPropMap,\n} from \"./utils.js\";\nimport type { ScriptFormat } from \"./scene/scene-item-row.js\";\nimport type { ScriptEditorAdapters } from \"./adapters.js\";\nimport { QuoteLayer } from \"./comment/quote-layer.js\";\nimport { EditingSignalContext, type EditingSignal } from \"./primitives/editable-text.js\";\nimport { ScriptSearchLayer } from \"./search/script-search-layer.js\";\n\nexport interface ScriptEditorProps extends ScriptEditorAdapters {\n value: ScriptProject;\n onEdit: (patch: (prev: ScriptProject) => ScriptProject) => void;\n selection?: StudioSelection;\n onSelectionChange?: (next: StudioSelection) => void;\n format?: ScriptFormat;\n onFormatChange?: (format: ScriptFormat) => void;\n disabled?: boolean;\n className?: string;\n dark?: boolean;\n /** built-in left directory. Default \"sidebar\" renders the bundled 256px TOC\n * column; \"none\" → directory-less mode: the editor renders top bar + canvas\n * only (full width) and the host drives navigation via controlled\n * selection/onSelectionChange + the exported buildScriptNav(value) model.\n * 0.1.18+ */\n toc?: \"sidebar\" | \"none\";\n /** when provided, the script title (value.title) becomes click-to-edit in the\n * top bar; the host persists the new value (the editor never touches storage,\n * matching the value + onEdit contract — just one more delegated hook). Omit →\n * the title shows read-only (or nothing when value.title is empty). */\n onTitleChange?: (next: string) => void;\n /** host-injected actions for the top bar's right edge (e.g. 删除剧本 /\n * 查看中间产物). The package only renders the node — all business stays host-side. */\n topBarActions?: React.ReactNode;\n // HUD wiring (host owns autosave + undo stack)\n saveStatus?: SaveStatus;\n canUndo?: boolean;\n canRedo?: boolean;\n onUndo?: () => void;\n onRedo?: () => void;\n /** fires true when an in-editor field opens for editing and false when the\n * last one closes — lets the host pause adopting external revisions without\n * reaching into the package's DOM / class names. */\n onEditingChange?: (editing: boolean) => void;\n /** host-pushed \"jump into the script\" signal (inverse of quote-to-chat):\n * bump requestId + supply a reference → editor selects & scrolls to it. */\n referenceFocusRequest?: ScriptReferenceFocusRequest | null;\n /** stable per-scope key (e.g. projectGroupNo) — remembers & restores the\n * scroll position across editor unmount/remount (tab switch / project nav). */\n scrollScopeKey?: string;\n}\n\nexport function ScriptEditor({\n value,\n onEdit,\n selection: controlledSelection,\n onSelectionChange,\n format: controlledFormat,\n onFormatChange,\n disabled = false,\n className,\n dark,\n toc = \"sidebar\",\n onTitleChange,\n topBarActions,\n saveStatus = \"idle\",\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n onEditingChange,\n referenceFocusRequest,\n scrollScopeKey,\n diff,\n asset,\n onAddChatReferences,\n onRequestAssetDelete,\n}: ScriptEditorProps) {\n void asset; // asset rendering hooks reserved for v2; display handled in chips\n\n // ── editing signal — ref-count active EditableText fields and notify the host\n // on 0↔1 transitions (read onEditingChange from a ref so the signal object\n // stays referentially stable and consumers don't re-render). ──────────────\n const editingCount = useRef(0);\n const onEditingChangeRef = useRef(onEditingChange);\n onEditingChangeRef.current = onEditingChange;\n const editingSignal = useMemo<EditingSignal>(\n () => ({\n inc: () => {\n if ((editingCount.current += 1) === 1) onEditingChangeRef.current?.(true);\n },\n dec: () => {\n editingCount.current = Math.max(0, editingCount.current - 1);\n if (editingCount.current === 0) onEditingChangeRef.current?.(false);\n },\n }),\n [],\n );\n\n // ── undo / redo keyboard shortcuts (Cmd/Ctrl+Z, Cmd/Ctrl+Shift+Z or Ctrl+Y) ─\n // built into the editor so every host gets them for free. Skips when focus\n // is in a text field (let the browser do input-level undo). Latest handlers\n // via a ref → listener attaches once.\n const undoKeysRef = useRef({ onUndo, onRedo, canUndo, canRedo });\n undoKeysRef.current = { onUndo, onRedo, canUndo, canRedo };\n useEffect(() => {\n if (disabled) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey)) return;\n const t = e.target;\n if (\n t instanceof HTMLElement &&\n (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.tagName === \"SELECT\" || t.isContentEditable)\n ) {\n return; // let native input-level undo handle it\n }\n const key = e.key.toLowerCase();\n const { onUndo: u, onRedo: r, canUndo: cu, canRedo: cr } = undoKeysRef.current;\n if (key === \"z\" && !e.shiftKey) {\n if (!u || !cu) return;\n e.preventDefault();\n u();\n } else if ((key === \"z\" && e.shiftKey) || key === \"y\") {\n if (!r || !cr) return;\n e.preventDefault();\n r();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [disabled]);\n\n // ── controlled-optional selection / format ──────────────────────────────\n const [innerSelection, setInnerSelection] = useState<StudioSelection>(EMPTY_SELECTION);\n const selection = controlledSelection ?? innerSelection;\n const setSelection = useCallback(\n (next: StudioSelection) => {\n setInnerSelection(next);\n onSelectionChange?.(next);\n },\n [onSelectionChange],\n );\n\n const [innerFormat, setInnerFormat] = useState<ScriptFormat>(\"standard\");\n const format = controlledFormat ?? innerFormat;\n const setFormat = useCallback(\n (next: ScriptFormat) => {\n setInnerFormat(next);\n onFormatChange?.(next);\n },\n [onFormatChange],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n // ── diff (host-computed marks; the editor only RENDERS) ─────────────────────\n const sceneKindByKey = useMemo(() => {\n const m = new Map<string, \"added\" | \"modified\">();\n for (const s of diff?.scenes ?? []) m.set(sceneChangeKey(s.episodeIdx, s.sceneId), s.kind);\n return m;\n }, [diff?.scenes]);\n // action-level marks grouped per scene: current-index → mark, plus removed\n // ghosts bucketed by the current index they sit before.\n const actionDiffByScene = useMemo(() => {\n const map = new Map<string, { byIndex: Map<number, DiffActionMark>; removedBefore: Map<number, DiffActionMark[]> }>();\n for (const m of diff?.actions ?? []) {\n const key = sceneChangeKey(m.episodeIdx, m.sceneId);\n let e = map.get(key);\n if (!e) {\n e = { byIndex: new Map(), removedBefore: new Map() };\n map.set(key, e);\n }\n if (m.kind === \"removed\") {\n const arr = e.removedBefore.get(m.itemIdx) ?? [];\n arr.push(m);\n e.removedBefore.set(m.itemIdx, arr);\n } else {\n e.byIndex.set(m.itemIdx, m);\n }\n }\n return map;\n }, [diff?.actions]);\n const changedSceneKeys = useMemo(() => {\n const s = new Set(sceneKindByKey.keys());\n for (const k of actionDiffByScene.keys()) s.add(k);\n return s;\n }, [sceneKindByKey, actionDiffByScene]);\n const diffCount = diff\n ? diff.count ?? diff.scenes.length + (diff.actions?.length ?? 0) + (diff.removedCount ?? 0)\n : 0;\n\n const changedSelections = useMemo<StudioSelection[]>(() => {\n if (changedSceneKeys.size === 0) return [];\n const out: StudioSelection[] = [];\n (value.episodes ?? []).forEach((episode, ei) => {\n (episode.scenes ?? []).forEach((scene, si) => {\n if (changedSceneKeys.has(sceneChangeKey(ei, scene.scene_id))) {\n out.push({ kind: \"scene\", episodeIdx: ei, sceneIdx: si });\n }\n });\n });\n return out;\n }, [value, changedSceneKeys]);\n\n const canvasRef = useRef<HTMLDivElement>(null);\n const [diffCursor, setDiffCursor] = useState(0);\n\n const navDiff = useCallback(\n (dir: 1 | -1) => {\n const list = changedSelections;\n if (list.length === 0) return;\n const next = (diffCursor + dir + list.length) % list.length;\n setDiffCursor(next);\n setSelection(withOrigin(list[next], \"diff\"));\n },\n [changedSelections, diffCursor, setSelection],\n );\n\n // per-scene accept/reject → delegate to the host (it owns baseline + value).\n // Present for any changed scene (whole-scene OR action-level) so the scene bar\n // offers \"accept/reject the whole scene\" alongside per-line ✓/✗.\n const sceneDiff = useMemo(() => {\n if (!diff || (!diff.onAcceptScene && !diff.onRejectScene) || changedSceneKeys.size === 0) return undefined;\n const kindAt = (episodeIdx: number, sceneId: string) =>\n sceneKindByKey.get(sceneChangeKey(episodeIdx, sceneId)) ?? \"modified\";\n return {\n kindByKey: sceneKindByKey,\n onAccept: (episodeIdx: number, sceneId: string) =>\n diff.onAcceptScene?.({ episodeIdx, sceneId, kind: kindAt(episodeIdx, sceneId) }),\n onReject: (episodeIdx: number, sceneId: string) =>\n diff.onRejectScene?.({ episodeIdx, sceneId, kind: kindAt(episodeIdx, sceneId) }),\n };\n }, [diff, sceneKindByKey, changedSceneKeys]);\n\n // ── reference focus — host pushes a jump-into-script request ────────────────\n useEffect(() => {\n if (!referenceFocusRequest) return;\n const sel = selectionFromScriptReference(referenceFocusRequest.reference);\n if (sel) setSelection(withOrigin(sel, \"reference\"));\n }, [referenceFocusRequest, setSelection]);\n\n const contextLabel = buildContextLabel(value, selection);\n const returnTarget = resolveReturnTarget(value, selection);\n const rootClass = [\"lj-se-root\", dark ? \"dark\" : \"\", className].filter(Boolean).join(\" \");\n\n const center = (\n <ScriptStream\n value={value}\n format={format}\n disabled={disabled}\n selection={selection}\n changedSceneKeys={changedSceneKeys}\n sceneDiff={sceneDiff}\n actionDiffByScene={actionDiffByScene}\n onAcceptAction={diff?.onAcceptAction}\n onRejectAction={diff?.onRejectAction}\n scrollScopeKey={scrollScopeKey}\n onEdit={onEdit}\n onSelectionChange={setSelection}\n onRequestAssetDelete={onRequestAssetDelete}\n />\n );\n\n return (\n <EditingSignalContext.Provider value={editingSignal}>\n <div\n className={rootClass}\n ref={rootRef}\n >\n {toc === \"sidebar\" ? (\n <StudioToc\n data={value}\n selection={selection}\n onSelect={setSelection}\n onAddEpisode={disabled ? undefined : () => onEdit((p) => addEpisode(p))}\n />\n ) : null}\n <div className=\"lj-se-main\">\n <CanvasTopBar\n title={value.title}\n onTitleChange={disabled ? undefined : onTitleChange}\n titleDisabled={disabled}\n contextLabel={contextLabel}\n format={format}\n onFormatChange={setFormat}\n canUndo={canUndo}\n canRedo={canRedo}\n onUndo={onUndo}\n onRedo={onRedo}\n actions={topBarActions}\n />\n <div className=\"lj-se-canvas\" ref={canvasRef}>\n <ScriptSearchLayer\n value={value}\n disabled={disabled}\n rootRef={rootRef}\n selection={selection}\n onSelectionChange={setSelection}\n >\n {center}\n </ScriptSearchLayer>\n {onAddChatReferences ? (\n <QuoteLayer containerRef={canvasRef} onAddChatReferences={onAddChatReferences} />\n ) : null}\n <SaveCapsule\n saveStatus={saveStatus}\n diffCount={diffCount}\n baselineStatus={diff?.baselineStatus}\n canApplyDiff={!!(diff?.onAcceptAll || diff?.onRejectAll)}\n onDiffPrev={changedSelections.length > 0 ? () => navDiff(-1) : undefined}\n onDiffNext={changedSelections.length > 0 ? () => navDiff(1) : undefined}\n onAcceptAll={diff?.onAcceptAll}\n onRejectAll={diff?.onRejectAll}\n returnLabel={returnTarget?.label}\n onReturn={returnTarget ? () => setSelection(returnTarget.selection) : undefined}\n />\n </div>\n </div>\n </div>\n </EditingSignalContext.Provider>\n );\n}\n\n/** Build the top-bar context label from the current selection. Returns null for\n * the generic/empty case — the always-visible title already says \"which doc\",\n * so a redundant \"剧本\" breadcrumb would just be noise. */\nfunction buildContextLabel(value: ScriptProject, selection: StudioSelection): React.ReactNode {\n if (selection.kind === \"worldview\") {\n return <span className=\"lj-se-ctx-kicker\">世界观 & 风格</span>;\n }\n if (selection.kind === \"actor\") {\n const a = getActorMap(value.actors ?? []).get(selection.actorId);\n return <Ctx kicker=\"角色\" name={a ? getActorDisplayName(a) : selection.actorId} />;\n }\n if (selection.kind === \"location\") {\n const l = getLocationMap(value.locations ?? []).get(selection.locationId);\n return <Ctx kicker=\"场景\" name={l ? getLocationDisplayName(l) : selection.locationId} />;\n }\n if (selection.kind === \"prop\") {\n const p = getPropMap(value.props ?? []).get(selection.propId);\n return <Ctx kicker=\"道具\" name={p ? getPropDisplayName(p) : selection.propId} />;\n }\n const epIdx =\n selection.kind === \"episode\" || selection.kind === \"scene\" || selection.kind === \"clip\"\n ? selection.episodeIdx\n : null;\n if (epIdx != null) {\n const ep = value.episodes?.[epIdx];\n if (ep) {\n return (\n <span className=\"lj-se-ctx\">\n <span className=\"lj-se-ctx-kicker\">第 {getEpisodeNumberLabel(ep, epIdx)} 集</span>\n <span className=\"lj-se-ctx-meta\">{ep.scenes?.length ?? 0} 场</span>\n </span>\n );\n }\n }\n return null;\n}\n\nfunction Ctx({ kicker, name }: { kicker: string; name: string }) {\n return (\n <span className=\"lj-se-ctx\">\n <span className=\"lj-se-ctx-kicker\">{kicker}</span>\n <span className=\"lj-se-ctx-name\">{name}</span>\n </span>\n );\n}\n\n/** When the current selection carries a `from` breadcrumb (set by an asset→scene\n * jump), build the \"返回 X\" target so the capsule can send the user back. */\nfunction resolveReturnTarget(\n value: ScriptProject,\n selection: StudioSelection,\n): { label: string; selection: StudioSelection } | null {\n const from: StudioSelectionFrom | undefined =\n selection.kind === \"episode\" || selection.kind === \"scene\" || selection.kind === \"clip\"\n ? selection.from\n : undefined;\n if (!from) return null;\n let label: string;\n if (from.kind === \"actor\") {\n const a = getActorMap(value.actors ?? []).get(from.actorId);\n label = a ? getActorDisplayName(a) : from.actorId;\n } else if (from.kind === \"location\") {\n const l = getLocationMap(value.locations ?? []).get(from.locationId);\n label = l ? getLocationDisplayName(l) : from.locationId;\n } else {\n const p = getPropMap(value.props ?? []).get(from.propId);\n label = p ? getPropDisplayName(p) : from.propId;\n }\n return { label, selection: withOrigin(fromToSelection(from), \"reference\") };\n}\n","/**\n * Headless navigation model — surfaces the script's TOC tree (the same\n * episodes/scenes/entity structure `StudioToc` renders) as plain data so a host\n * in directory-less mode (`<ScriptEditor toc=\"none\" />`) can build its OWN\n * navigation UI: breadcrumb dropdown, ⌘K command palette, mobile sheet, etc.\n *\n * Each node carries:\n * - `key` — `selectionTargetKey` of its selection; compare against\n * `selectionTargetKey(currentSelection)` to mark the active node.\n * - `selection` — a ready-to-use `StudioSelection` (no origin). On click do\n * `onSelectionChange(withOrigin(node.selection, \"sidebar\"))`.\n *\n * Labels reuse the exact same helpers as `StudioToc`, so a custom nav stays\n * label-identical to the built-in one. Pure function, zero side effects.\n */\nimport type { ScriptProject } from \"../types.js\";\nimport type { StudioSelection } from \"../selection.js\";\nimport { selectionTargetKey } from \"../selection.js\";\nimport {\n getActorDisplayName,\n getEpisodeNumberLabel,\n getEpisodeTitle,\n getLocationDisplayName,\n getPropDisplayName,\n getSceneNumberLabel,\n getSceneSidebarLabel,\n} from \"../utils.js\";\n\nexport interface ScriptNavScene {\n key: string;\n episodeIdx: number;\n sceneIdx: number;\n sceneId: string;\n /** e.g. \"场 7\" */\n label: string;\n /** e.g. \"scn_007 · 夜内\" */\n meta: string;\n selection: StudioSelection;\n}\n\nexport interface ScriptNavEpisode {\n key: string;\n episodeIdx: number;\n /** zero-padded episode number, e.g. \"01\" */\n label: string;\n /** human title (falls back to \"第 NN 集\") */\n title: string;\n sceneCount: number;\n scenes: ScriptNavScene[];\n selection: StudioSelection;\n}\n\nexport interface ScriptNavEntity {\n key: string;\n id: string;\n name: string;\n selection: StudioSelection;\n}\n\nexport interface ScriptNav {\n episodes: ScriptNavEpisode[];\n actors: ScriptNavEntity[];\n locations: ScriptNavEntity[];\n props: ScriptNavEntity[];\n}\n\nfunction nav(selection: StudioSelection): { key: string; selection: StudioSelection } {\n return { key: selectionTargetKey(selection), selection };\n}\n\n/** Derive the navigation tree from a ScriptProject (see file header). */\nexport function buildScriptNav(value: ScriptProject): ScriptNav {\n const episodes: ScriptNavEpisode[] = (value.episodes ?? []).map((episode, episodeIdx) => {\n const scenes = (episode.scenes ?? []).map((scene, sceneIdx): ScriptNavScene => {\n const selection: StudioSelection = { kind: \"scene\", episodeIdx, sceneIdx };\n return {\n ...nav(selection),\n episodeIdx,\n sceneIdx,\n sceneId: scene.scene_id ?? \"\",\n label: getSceneNumberLabel(scene, sceneIdx),\n meta: getSceneSidebarLabel(scene, sceneIdx),\n };\n });\n const selection: StudioSelection = { kind: \"episode\", episodeIdx };\n return {\n ...nav(selection),\n episodeIdx,\n label: getEpisodeNumberLabel(episode, episodeIdx),\n title: getEpisodeTitle(episode, episodeIdx),\n sceneCount: scenes.length,\n scenes,\n };\n });\n\n const actors: ScriptNavEntity[] = (value.actors ?? [])\n .map((a): ScriptNavEntity => {\n const id = (a.actor_id ?? \"\").trim();\n return { ...nav({ kind: \"actor\", actorId: id }), id, name: getActorDisplayName(a) };\n })\n .filter((e) => e.id);\n\n const locations: ScriptNavEntity[] = (value.locations ?? [])\n .map((l): ScriptNavEntity => {\n const id = (l.location_id ?? \"\").trim();\n return { ...nav({ kind: \"location\", locationId: id }), id, name: getLocationDisplayName(l) };\n })\n .filter((e) => e.id);\n\n const props: ScriptNavEntity[] = (value.props ?? [])\n .map((p): ScriptNavEntity => {\n const id = (p.prop_id ?? \"\").trim();\n return { ...nav({ kind: \"prop\", propId: id }), id, name: getPropDisplayName(p) };\n })\n .filter((e) => e.id);\n\n return {\n episodes,\n actors,\n locations,\n props,\n };\n}\n","export * from \"./editor-utils.js\";\nexport * from \"./item-mutations.js\";\nexport * from \"./entity-mutations.js\";\n","/**\n * DeleteConfirmButton — two-step destructive action, matching agent-frontend:\n * an Eraser icon that, on first click, swaps to an emerald Check; a second click\n * within 2.5s confirms. Auto-cancels after the TTL. The button stays invisible\n * until the parent row/scene is hovered (opacity driven by `.group` hover).\n */\nimport { useEffect, useRef, useState } from \"react\";\nimport { Check, Eraser } from \"lucide-react\";\nimport { cn } from \"../cn.js\";\n\nconst CONFIRM_TTL_MS = 2500;\n\nexport function DeleteConfirmButton({\n onConfirm,\n disabled,\n targetScope,\n title = \"删除?\",\n}: {\n onConfirm: () => void | Promise<void>;\n disabled?: boolean;\n /** drives the parent's hover-tint via data-delete-target */\n targetScope?: \"row\" | \"scene\";\n title?: string;\n /** legacy prop, no longer rendered (kept for call-site compat) */\n description?: string;\n}) {\n const [confirming, setConfirming] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n const cancel = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n setConfirming(false);\n };\n\n const handleClick = () => {\n if (confirming) {\n cancel();\n void onConfirm();\n return;\n }\n setConfirming(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setConfirming(false);\n timerRef.current = null;\n }, CONFIRM_TTL_MS);\n };\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n data-delete-target={targetScope}\n data-confirming={confirming || undefined}\n onClick={handleClick}\n aria-label={confirming ? `再点一次确认:${title}` : title}\n title={confirming ? \"再点一次确认(2.5 秒后自动取消)\" : title}\n className={cn(\"lj-se-del\", confirming && \"is-confirming\")}\n >\n {confirming ? (\n <Check className=\"lj-se-icon\" strokeWidth={2.2} />\n ) : (\n <Eraser className=\"lj-se-icon\" strokeWidth={1.5} />\n )}\n </button>\n );\n}\n"]}
|