@beyondwork/docx-react-component 1.0.29 → 1.0.30
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/package.json +65 -96
- package/src/README.md +85 -0
- package/src/api/README.md +26 -0
- package/src/api/public-types.ts +1952 -0
- package/src/api/session-state.ts +62 -0
- package/src/compare/diff-engine.ts +623 -0
- package/src/compare/export-redlines.ts +280 -0
- package/src/compare/index.ts +25 -0
- package/src/compare/snapshot.ts +97 -0
- package/src/component-inventory.md +99 -0
- package/src/core/README.md +10 -0
- package/src/core/commands/README.md +3 -0
- package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
- package/src/core/commands/image-commands.ts +373 -0
- package/src/core/commands/index.ts +1879 -0
- package/src/core/commands/list-commands.ts +565 -0
- package/src/core/commands/paragraph-layout-commands.ts +339 -0
- package/src/core/commands/review-commands.ts +108 -0
- package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
- package/src/core/commands/structural-helpers.ts +309 -0
- package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
- package/src/core/commands/table-structure-commands.ts +854 -0
- package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
- package/src/core/schema/README.md +3 -0
- package/src/core/schema/text-schema.ts +516 -0
- package/src/core/search/search-text.ts +357 -0
- package/src/core/selection/README.md +3 -0
- package/src/core/selection/mapping.ts +289 -0
- package/src/core/selection/review-anchors.ts +183 -0
- package/src/core/state/README.md +3 -0
- package/src/core/state/editor-state.ts +892 -0
- package/src/core/state/text-transaction.ts +869 -0
- package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
- package/src/formats/xlsx/io/parse-sheet.ts +459 -0
- package/src/formats/xlsx/io/parse-styles.ts +59 -0
- package/src/formats/xlsx/io/parse-workbook.ts +75 -0
- package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
- package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
- package/src/formats/xlsx/io/serialize-styles.ts +98 -0
- package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
- package/src/formats/xlsx/io/xlsx-session.ts +314 -0
- package/src/formats/xlsx/model/cell.ts +189 -0
- package/src/formats/xlsx/model/sheet.ts +326 -0
- package/src/formats/xlsx/model/styles.ts +118 -0
- package/src/formats/xlsx/model/workbook.ts +453 -0
- package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
- package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
- package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
- package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
- package/src/index.ts +142 -0
- package/src/io/README.md +10 -0
- package/src/io/docx-session.ts +3175 -0
- package/src/io/export/README.md +3 -0
- package/src/io/export/export-session.ts +220 -0
- package/src/io/export/minimal-docx.ts +115 -0
- package/src/io/export/reattach-preserved-parts.ts +54 -0
- package/src/io/export/serialize-comments.ts +947 -0
- package/src/io/export/serialize-footnotes.ts +394 -0
- package/src/io/export/serialize-headers-footers.ts +368 -0
- package/src/io/export/serialize-main-document.ts +1342 -0
- package/src/io/export/serialize-numbering.ts +218 -0
- package/src/io/export/serialize-revisions.ts +389 -0
- package/src/io/export/serialize-runtime-revisions.ts +463 -0
- package/src/io/export/serialize-tables.ts +174 -0
- package/src/io/export/split-review-boundaries.ts +356 -0
- package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
- package/src/io/export/table-properties-xml.ts +318 -0
- package/src/io/normalize/README.md +3 -0
- package/src/io/normalize/normalize-text.ts +670 -0
- package/src/io/ooxml/README.md +3 -0
- package/src/io/ooxml/highlight-colors.ts +39 -0
- package/src/io/ooxml/numbering-sentinels.ts +44 -0
- package/src/io/ooxml/parse-comments.ts +852 -0
- package/src/io/ooxml/parse-complex-content.ts +287 -0
- package/src/io/ooxml/parse-fields.ts +834 -0
- package/src/io/ooxml/parse-footnotes.ts +952 -0
- package/src/io/ooxml/parse-headers-footers.ts +1212 -0
- package/src/io/ooxml/parse-inline-media.ts +461 -0
- package/src/io/ooxml/parse-main-document.ts +2947 -0
- package/src/io/ooxml/parse-numbering.ts +747 -0
- package/src/io/ooxml/parse-revisions.ts +1045 -0
- package/src/io/ooxml/parse-settings.ts +184 -0
- package/src/io/ooxml/parse-shapes.ts +296 -0
- package/src/io/ooxml/parse-styles.ts +639 -0
- package/src/io/ooxml/parse-tables.ts +627 -0
- package/src/io/ooxml/parse-theme.ts +346 -0
- package/src/io/ooxml/part-manifest.ts +136 -0
- package/src/io/ooxml/revision-boundaries.ts +475 -0
- package/src/io/ooxml/workflow-payload.ts +544 -0
- package/src/io/opc/README.md +3 -0
- package/src/io/opc/corrupt-package.ts +166 -0
- package/src/io/opc/docx-package.ts +74 -0
- package/src/io/opc/package-reader.ts +325 -0
- package/src/io/opc/package-writer.ts +273 -0
- package/src/io/source-package-provenance.ts +241 -0
- package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
- package/src/legal/cross-references.ts +414 -0
- package/src/legal/defined-terms.ts +203 -0
- package/src/legal/index.ts +32 -0
- package/src/legal/signature-blocks.ts +259 -0
- package/src/model/README.md +3 -0
- package/src/model/canonical-document.ts +2722 -0
- package/src/model/cds-1.0.0.ts +212 -0
- package/src/model/snapshot.ts +760 -0
- package/src/preservation/README.md +3 -0
- package/src/preservation/markup-compatibility.ts +48 -0
- package/src/preservation/opaque-fragment-store.ts +89 -0
- package/src/preservation/opaque-region.ts +233 -0
- package/src/preservation/package-preservation.ts +113 -0
- package/src/preservation/preserved-part-manifest.ts +56 -0
- package/src/preservation/relationship-retention.ts +57 -0
- package/src/preservation/store.ts +255 -0
- package/src/review/README.md +16 -0
- package/src/review/store/README.md +3 -0
- package/src/review/store/comment-anchors.ts +70 -0
- package/src/review/store/comment-remapping.ts +154 -0
- package/src/review/store/comment-store.ts +349 -0
- package/src/review/store/comment-thread.ts +109 -0
- package/src/review/store/revision-actions.ts +423 -0
- package/src/review/store/revision-store.ts +323 -0
- package/src/review/store/revision-types.ts +182 -0
- package/src/review/store/runtime-comment-store.ts +43 -0
- package/src/runtime/README.md +3 -0
- package/src/runtime/ai-action-policy.ts +764 -0
- package/src/runtime/context-analytics.ts +824 -0
- package/src/runtime/document-layout.ts +332 -0
- package/src/runtime/document-locations.ts +521 -0
- package/src/runtime/document-navigation.ts +616 -0
- package/src/runtime/document-outline.ts +440 -0
- package/src/runtime/document-runtime.ts +4055 -0
- package/src/runtime/document-search.ts +145 -0
- package/src/runtime/event-refresh-hints.ts +137 -0
- package/src/runtime/numbering-prefix.ts +244 -0
- package/src/runtime/page-layout-estimation.ts +305 -0
- package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
- package/src/runtime/resolved-numbering-geometry.ts +293 -0
- package/src/runtime/review-runtime.ts +44 -0
- package/src/runtime/revision-runtime.ts +107 -0
- package/src/runtime/session-capabilities.ts +192 -0
- package/src/runtime/story-context.ts +164 -0
- package/src/runtime/story-targeting.ts +162 -0
- package/src/runtime/suggestions-snapshot.ts +137 -0
- package/src/runtime/surface-projection.ts +1553 -0
- package/src/runtime/table-commands.ts +173 -0
- package/src/runtime/table-schema.ts +309 -0
- package/src/runtime/table-style-resolver.ts +409 -0
- package/src/runtime/view-state.ts +493 -0
- package/src/runtime/virtualized-rendering.ts +258 -0
- package/src/runtime/workflow-markup.ts +393 -0
- package/src/ui/README.md +30 -0
- package/src/ui/WordReviewEditor.tsx +5268 -0
- package/src/ui/browser-export.ts +52 -0
- package/src/ui/comments/README.md +3 -0
- package/src/ui/compatibility/README.md +3 -0
- package/src/ui/editor-command-bag.ts +127 -0
- package/src/ui/editor-runtime-boundary.ts +1558 -0
- package/src/ui/editor-shell-view.tsx +144 -0
- package/src/ui/editor-surface/README.md +3 -0
- package/src/ui/editor-surface-controller.tsx +66 -0
- package/src/ui/headless/comment-decoration-model.ts +124 -0
- package/src/ui/headless/preserve-editor-selection.ts +5 -0
- package/src/ui/headless/revision-decoration-model.ts +128 -0
- package/src/ui/headless/selection-helpers.ts +54 -0
- package/src/ui/headless/selection-tool-context.ts +19 -0
- package/src/ui/headless/selection-tool-resolver.ts +752 -0
- package/src/ui/headless/selection-tool-types.ts +129 -0
- package/src/ui/headless/selection-toolbar-model.ts +11 -0
- package/src/ui/headless/use-editor-keyboard.ts +103 -0
- package/src/ui/review/README.md +3 -0
- package/src/ui/runtime-shortcut-dispatch.ts +365 -0
- package/src/ui/runtime-snapshot-selectors.ts +197 -0
- package/src/ui/shared/revision-filters.ts +31 -0
- package/src/ui/status/README.md +3 -0
- package/src/ui/theme/README.md +3 -0
- package/src/ui/toolbar/README.md +3 -0
- package/src/ui/workflow-surface-blocked-rails.ts +94 -0
- package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
- package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
- package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
- package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +298 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +200 -0
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
- package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
- package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
- package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
- package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +65 -0
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
- package/src/ui-tailwind/index.ts +62 -0
- package/src/ui-tailwind/page-chrome-model.ts +27 -0
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
- package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +122 -0
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
- package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
- package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1133 -0
- package/src/ui-tailwind/tw-review-workspace.tsx +1460 -0
- package/src/validation/README.md +3 -0
- package/src/validation/compatibility-engine.ts +878 -0
- package/src/validation/compatibility-report.ts +161 -0
- package/src/validation/diagnostics.ts +204 -0
- package/src/validation/docx-comment-proof.ts +720 -0
- package/src/validation/import-diagnostics.ts +128 -0
- package/src/validation/low-priority-word-surfaces.ts +373 -0
- package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
- package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
- package/dist/chunk-2FJS5GZM.js +0 -763
- package/dist/chunk-2FJS5GZM.js.map +0 -1
- package/dist/chunk-2OQBZS3F.js +0 -446
- package/dist/chunk-2OQBZS3F.js.map +0 -1
- package/dist/chunk-2S7W4KFO.js +0 -127
- package/dist/chunk-2S7W4KFO.js.map +0 -1
- package/dist/chunk-2TG72QSW.js +0 -3874
- package/dist/chunk-2TG72QSW.js.map +0 -1
- package/dist/chunk-36QNIZBO.js +0 -532
- package/dist/chunk-36QNIZBO.js.map +0 -1
- package/dist/chunk-4AQOYAW4.js +0 -3069
- package/dist/chunk-4AQOYAW4.js.map +0 -1
- package/dist/chunk-4D5EWJ3P.js +0 -77
- package/dist/chunk-4D5EWJ3P.js.map +0 -1
- package/dist/chunk-5FN54NDH.js +0 -2257
- package/dist/chunk-5FN54NDH.js.map +0 -1
- package/dist/chunk-BOYGQYRQ.js +0 -7306
- package/dist/chunk-BOYGQYRQ.js.map +0 -1
- package/dist/chunk-CN3XMECL.js +0 -212
- package/dist/chunk-CN3XMECL.js.map +0 -1
- package/dist/chunk-EBI3BX6U.js +0 -164
- package/dist/chunk-EBI3BX6U.js.map +0 -1
- package/dist/chunk-EILUG3VB.js +0 -1275
- package/dist/chunk-EILUG3VB.js.map +0 -1
- package/dist/chunk-FUDY333O.js +0 -70
- package/dist/chunk-FUDY333O.js.map +0 -1
- package/dist/chunk-GBVOWFIK.js +0 -1237
- package/dist/chunk-GBVOWFIK.js.map +0 -1
- package/dist/chunk-H4TQ3H3Y.js +0 -262
- package/dist/chunk-H4TQ3H3Y.js.map +0 -1
- package/dist/chunk-JGB3IXZO.js +0 -189
- package/dist/chunk-JGB3IXZO.js.map +0 -1
- package/dist/chunk-KD2QRQPY.js +0 -4342
- package/dist/chunk-KD2QRQPY.js.map +0 -1
- package/dist/chunk-KLMXQVYK.js +0 -369
- package/dist/chunk-KLMXQVYK.js.map +0 -1
- package/dist/chunk-KZUG5KFQ.js +0 -214
- package/dist/chunk-KZUG5KFQ.js.map +0 -1
- package/dist/chunk-QDAQ4CJU.js +0 -345
- package/dist/chunk-QDAQ4CJU.js.map +0 -1
- package/dist/chunk-RMH72RZI.js.map +0 -1
- package/dist/chunk-SWKWQZXM.js +0 -117
- package/dist/chunk-SWKWQZXM.js.map +0 -1
- package/dist/chunk-TJBP2K4T.js.map +0 -1
- package/dist/chunk-TLCEAQDQ.js +0 -542
- package/dist/chunk-TLCEAQDQ.js.map +0 -1
- package/dist/chunk-UZXBISGO.js.map +0 -1
- package/dist/chunk-WGBAKP3Q.js +0 -3220
- package/dist/chunk-WGBAKP3Q.js.map +0 -1
- package/dist/compare/index.cjs +0 -5475
- package/dist/compare/index.cjs.map +0 -1
- package/dist/compare/index.d.cts +0 -114
- package/dist/compare/index.d.ts +0 -114
- package/dist/compare/index.js +0 -731
- package/dist/compare/index.js.map +0 -1
- package/dist/core/commands/formatting-commands.cjs +0 -828
- package/dist/core/commands/formatting-commands.cjs.map +0 -1
- package/dist/core/commands/formatting-commands.d.cts +0 -63
- package/dist/core/commands/formatting-commands.d.ts +0 -63
- package/dist/core/commands/formatting-commands.js +0 -37
- package/dist/core/commands/formatting-commands.js.map +0 -1
- package/dist/core/commands/image-commands.cjs +0 -2023
- package/dist/core/commands/image-commands.cjs.map +0 -1
- package/dist/core/commands/image-commands.d.cts +0 -58
- package/dist/core/commands/image-commands.d.ts +0 -58
- package/dist/core/commands/image-commands.js +0 -18
- package/dist/core/commands/image-commands.js.map +0 -1
- package/dist/core/commands/section-layout-commands.cjs.map +0 -1
- package/dist/core/commands/section-layout-commands.d.cts +0 -62
- package/dist/core/commands/section-layout-commands.d.ts +0 -62
- package/dist/core/commands/section-layout-commands.js +0 -21
- package/dist/core/commands/section-layout-commands.js.map +0 -1
- package/dist/core/commands/style-commands.cjs.map +0 -1
- package/dist/core/commands/style-commands.d.cts +0 -13
- package/dist/core/commands/style-commands.d.ts +0 -13
- package/dist/core/commands/style-commands.js +0 -9
- package/dist/core/commands/style-commands.js.map +0 -1
- package/dist/core/commands/table-structure-commands.cjs +0 -1883
- package/dist/core/commands/table-structure-commands.cjs.map +0 -1
- package/dist/core/commands/table-structure-commands.d.cts +0 -59
- package/dist/core/commands/table-structure-commands.d.ts +0 -59
- package/dist/core/commands/table-structure-commands.js +0 -12
- package/dist/core/commands/table-structure-commands.js.map +0 -1
- package/dist/core/commands/text-commands.cjs +0 -2391
- package/dist/core/commands/text-commands.cjs.map +0 -1
- package/dist/core/commands/text-commands.d.cts +0 -24
- package/dist/core/commands/text-commands.d.ts +0 -24
- package/dist/core/commands/text-commands.js +0 -28
- package/dist/core/commands/text-commands.js.map +0 -1
- package/dist/core/selection/mapping.cjs +0 -200
- package/dist/core/selection/mapping.cjs.map +0 -1
- package/dist/core/selection/mapping.d.cts +0 -2
- package/dist/core/selection/mapping.d.ts +0 -2
- package/dist/core/selection/mapping.js +0 -31
- package/dist/core/selection/mapping.js.map +0 -1
- package/dist/core/state/editor-state.cjs +0 -2278
- package/dist/core/state/editor-state.cjs.map +0 -1
- package/dist/core/state/editor-state.d.cts +0 -2
- package/dist/core/state/editor-state.d.ts +0 -2
- package/dist/core/state/editor-state.js +0 -26
- package/dist/core/state/editor-state.js.map +0 -1
- package/dist/index.cjs +0 -38553
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -15
- package/dist/index.d.ts +0 -15
- package/dist/index.js +0 -7856
- package/dist/index.js.map +0 -1
- package/dist/io/docx-session.cjs +0 -16236
- package/dist/io/docx-session.cjs.map +0 -1
- package/dist/io/docx-session.d.cts +0 -21
- package/dist/io/docx-session.d.ts +0 -21
- package/dist/io/docx-session.js +0 -18
- package/dist/io/docx-session.js.map +0 -1
- package/dist/legal/index.cjs +0 -3900
- package/dist/legal/index.cjs.map +0 -1
- package/dist/legal/index.d.cts +0 -86
- package/dist/legal/index.d.ts +0 -86
- package/dist/legal/index.js +0 -616
- package/dist/legal/index.js.map +0 -1
- package/dist/public-types-7ZL_94cz.d.ts +0 -1573
- package/dist/public-types-CeMaDueh.d.cts +0 -1573
- package/dist/public-types.cjs +0 -19
- package/dist/public-types.cjs.map +0 -1
- package/dist/public-types.d.cts +0 -2
- package/dist/public-types.d.ts +0 -2
- package/dist/public-types.js +0 -1
- package/dist/public-types.js.map +0 -1
- package/dist/runtime/document-runtime.cjs +0 -11140
- package/dist/runtime/document-runtime.cjs.map +0 -1
- package/dist/runtime/document-runtime.d.cts +0 -231
- package/dist/runtime/document-runtime.d.ts +0 -231
- package/dist/runtime/document-runtime.js +0 -21
- package/dist/runtime/document-runtime.js.map +0 -1
- package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
- package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
- package/dist/ui-tailwind/index.cjs +0 -4833
- package/dist/ui-tailwind/index.cjs.map +0 -1
- package/dist/ui-tailwind/index.d.cts +0 -617
- package/dist/ui-tailwind/index.d.ts +0 -617
- package/dist/ui-tailwind/index.js +0 -575
- package/dist/ui-tailwind/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/document-runtime.ts","../../src/core/selection/mapping.ts","../../src/model/cds-1.0.0.ts","../../src/model/canonical-document.ts","../../src/model/snapshot.ts","../../src/core/state/editor-state.ts","../../src/api/session-state.ts","../../src/core/commands/review-commands.ts","../../src/core/schema/text-schema.ts","../../src/preservation/store.ts","../../src/runtime/story-context.ts","../../src/runtime/story-targeting.ts","../../src/runtime/numbering-prefix.ts","../../src/runtime/surface-projection.ts","../../src/core/state/text-transaction.ts","../../src/core/commands/text-commands.ts","../../src/core/selection/review-anchors.ts","../../src/review/store/comment-remapping.ts","../../src/review/store/revision-types.ts","../../src/review/store/revision-store.ts","../../src/review/store/revision-actions.ts","../../src/runtime/revision-runtime.ts","../../src/core/commands/index.ts","../../src/io/ooxml/parse-fields.ts","../../src/legal/bookmarks.ts","../../src/review/store/comment-anchors.ts","../../src/review/store/comment-store.ts","../../src/review/store/runtime-comment-store.ts","../../src/validation/compatibility-engine.ts","../../src/validation/diagnostics.ts","../../src/validation/compatibility-report.ts","../../src/core/search/search-text.ts","../../src/runtime/workflow-markup.ts","../../src/runtime/page-layout-estimation.ts","../../src/runtime/document-layout.ts","../../src/runtime/view-state.ts","../../src/runtime/document-navigation.ts","../../src/ui-tailwind/editor-surface/perf-probe.ts"],"sourcesContent":["import {\n createEditorState,\n createPersistedEditorSnapshot,\n deriveDocumentStats,\n createSelectionSnapshot,\n type CanonicalDocumentEnvelope,\n type CommentEntryRecord,\n type CommentThreadRecord,\n type CompatibilityFeatureEntry as InternalCompatibilityFeatureEntry,\n type CompatibilityReport as InternalCompatibilityReport,\n type EditorError as InternalEditorError,\n type EditorState,\n type EditorWarning as InternalEditorWarning,\n} from \"../core/state/editor-state.ts\";\nimport type {\n AddCommentParams,\n CommentSidebarSnapshot,\n CommentSidebarThreadSnapshot,\n CompatibilityReport,\n DocumentMode,\n DocumentNavigationSnapshot,\n EditorSessionState,\n EditorAnchorProjection,\n EditorError,\n EditorStoryTarget,\n EditorViewStateSnapshot,\n EditorWarning,\n FieldEntrySnapshot,\n FieldSnapshot,\n HeaderFooterLinkPatch,\n ExportDocxOptions,\n ExportResult,\n HostAnnotationOverlay,\n HostAnnotationSnapshot,\n InteractionGuardSnapshot,\n PageLayoutSnapshot,\n PersistedEditorSnapshot,\n ProtectionSnapshot,\n RuntimeRenderSnapshot,\n SelectionSnapshot,\n StyleCatalogSnapshot,\n TocRefreshOptions,\n TocRefreshResult,\n TrackedChangeEntrySnapshot,\n TrackedChangesSnapshot,\n UpdateFieldsOptions,\n UpdateFieldsResult,\n ViewMode,\n WorkflowCandidateRange,\n WorkflowCandidateRangeOptions,\n WorkflowBlockedCommandReason,\n WorkflowMarkupSnapshot,\n WorkflowOverlay,\n WorkflowScopeSnapshot,\n WorkspaceMode,\n WordReviewEditorEvent,\n ZoomLevel,\n} from \"../api/public-types\";\nimport {\n editorSessionStateFromPersistedSnapshot,\n persistedSnapshotFromEditorSessionState,\n} from \"../api/session-state.ts\";\nimport {\n executeEditorCommand,\n selectionChanged,\n type CommandOrigin,\n type EditorCommand,\n type EditorTransaction,\n} from \"../core/commands/index.ts\";\nimport {\n createDetachedAnchor,\n createEmptyMapping,\n createNodeAnchor,\n createRangeAnchor,\n mapRange,\n MAIN_STORY_TARGET,\n storyTargetsEqual,\n type EditorAnchorProjection as InternalEditorAnchorProjection,\n} from \"../core/selection/mapping.ts\";\nimport { canCreateDocxCommentAnchor } from \"../core/selection/review-anchors.ts\";\nimport { buildBookmarkNameMap } from \"../legal/bookmarks.ts\";\nimport {\n describeOpaqueFragment,\n findOpaqueFragmentsIntersectingRange,\n} from \"../preservation/store.ts\";\nimport { createCommentSidebarProjection } from \"../review/store/comment-store.ts\";\nimport { createCommentStoreFromRuntimeComments } from \"../review/store/runtime-comment-store.ts\";\nimport {\n createRevisionSidebarProjection,\n type RevisionStore,\n} from \"../review/store/revision-store.ts\";\nimport { buildCompatibilityReport } from \"../validation/compatibility-engine.ts\";\nimport { mergeCompatibilityReports } from \"../validation/compatibility-report.ts\";\nimport { createEditorSurfaceSnapshot } from \"./surface-projection.ts\";\nimport {\n collectWorkflowMarkupSnapshot,\n deriveWorkflowCandidateRangesFromMarkup,\n} from \"./workflow-markup.ts\";\nimport {\n createDocumentNavigationSnapshot,\n findPageForOffset,\n} from \"./document-navigation.ts\";\nimport {\n buildPageLayoutSnapshot,\n buildResolvedSections,\n resolveActiveSection,\n} from \"./document-layout.ts\";\nimport { normalizeHeaderFooterTarget } from \"./story-context.ts\";\nimport {\n getStoryBlocks,\n replaceStoryBlocks,\n storyTargetKey,\n} from \"./story-targeting.ts\";\nimport {\n createViewState,\n setViewMode as applyViewMode,\n setDocumentMode as applyDocumentMode,\n setWorkspaceMode as applyWorkspaceMode,\n setZoomLevel as applyZoomLevel,\n setFocused as applyFocused,\n setCaretAffinity as applyCaretAffinity,\n setActivePageRegion as applyActivePageRegion,\n setActiveObjectFrame as applyActiveObjectFrame,\n createEditorViewStateSnapshot,\n type ViewState,\n} from \"./view-state.ts\";\nimport type {\n BlockNode,\n FieldNode,\n FieldRefreshStatus,\n InlineNode,\n PageMargins,\n ParagraphNode,\n SubPartsCatalog,\n} from \"../model/canonical-document.ts\";\nimport {\n buildFieldRegistry,\n isSupportedFieldFamily,\n parseTocLevelRange,\n resolveRefFieldText,\n} from \"../io/ooxml/parse-fields.ts\";\nimport {\n incrementInvalidationCounter,\n recordPerfSample,\n} from \"../ui-tailwind/editor-surface/perf-probe.ts\";\n\nexport type Unsubscribe = () => void;\n\ntype RuntimeReadySource = \"docx\" | \"session\" | \"snapshot\" | \"datastore\" | \"canonical\";\n\nexport type DocumentRuntimeEvent =\n | (Omit<Extract<WordReviewEditorEvent, { type: \"ready\" }>, \"source\"> & {\n source: RuntimeReadySource;\n })\n | Exclude<WordReviewEditorEvent, { type: \"ready\" }>;\n\nexport type ActiveStoryTextCommand =\n | Extract<EditorCommand, { type: \"text.insert\" }>\n | Extract<EditorCommand, { type: \"text.delete-backward\" }>\n | Extract<EditorCommand, { type: \"text.delete-forward\" }>\n | Extract<EditorCommand, { type: \"text.insert-tab\" }>\n | Extract<EditorCommand, { type: \"text.insert-hard-break\" }>\n | Extract<EditorCommand, { type: \"paragraph.split\" }>;\n\nexport interface DocumentRuntime {\n subscribe(listener: () => void): Unsubscribe;\n subscribeToEvents(listener: (event: DocumentRuntimeEvent) => void): Unsubscribe;\n getRenderSnapshot(): RuntimeRenderSnapshot;\n getCanonicalDocument(): CanonicalDocumentEnvelope;\n getSourcePackage(): EditorSessionState[\"sourcePackage\"] | undefined;\n replaceText(text: string, target?: EditorAnchorProjection): void;\n applyActiveStoryTextCommand(command: ActiveStoryTextCommand): void;\n dispatch(command: EditorCommand): void;\n emitBlockedCommand(command: string, reasons: WorkflowBlockedCommandReason[]): void;\n undo(): void;\n redo(): void;\n focus(): void;\n blur(): void;\n setDefaultAuthorId?(authorId?: string): void;\n addComment(params: AddCommentParams): string;\n openComment(commentId: string): void;\n resolveComment(commentId: string): void;\n reopenComment(commentId: string): void;\n addCommentReply(commentId: string, body: string, authorId?: string): void;\n editCommentBody(commentId: string, body: string): void;\n acceptChange(changeId: string): void;\n rejectChange(changeId: string): void;\n acceptAllChanges(): void;\n rejectAllChanges(): void;\n openStory(target: EditorStoryTarget): boolean;\n closeStory(): void;\n getActiveStory(): EditorStoryTarget;\n getViewState(): EditorViewStateSnapshot;\n setViewMode(mode: ViewMode): void;\n setDocumentMode(mode: DocumentMode): void;\n getProtectionSnapshot(): ProtectionSnapshot;\n setWorkspaceMode(mode: WorkspaceMode): void;\n setZoom(level: ZoomLevel): void;\n getPageLayoutSnapshot(): PageLayoutSnapshot | null;\n getDocumentNavigationSnapshot(): DocumentNavigationSnapshot;\n getFieldSnapshot(): FieldSnapshot;\n updateFields(options?: UpdateFieldsOptions): UpdateFieldsResult;\n updateTableOfContents(options?: TocRefreshOptions): TocRefreshResult;\n getSessionState(): EditorSessionState;\n getPersistedSnapshot(): PersistedEditorSnapshot;\n getCompatibilityReport(): CompatibilityReport;\n getWarnings(): EditorWarning[];\n exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;\n setWorkflowOverlay(overlay: WorkflowOverlay): void;\n clearWorkflowOverlay(): void;\n getWorkflowScopeSnapshot(): WorkflowScopeSnapshot | null;\n getInteractionGuardSnapshot(): InteractionGuardSnapshot;\n getWorkflowMarkupSnapshot(): WorkflowMarkupSnapshot;\n setHostAnnotationOverlay(overlay: HostAnnotationOverlay): void;\n clearHostAnnotationOverlay(): void;\n getHostAnnotationSnapshot(): HostAnnotationSnapshot;\n getWorkflowCandidateRanges(options?: WorkflowCandidateRangeOptions): WorkflowCandidateRange[];\n replaceWorkflowMarkupText(markupId: string, text: string): void;\n}\n\nexport interface CreateDocumentRuntimeOptions {\n documentId: string;\n initialSessionState?: EditorSessionState;\n initialSnapshot?: PersistedEditorSnapshot;\n initialCanonicalDocument?: CanonicalDocumentEnvelope;\n sourceLabel?: string;\n sourceKind?: RuntimeReadySource;\n readOnly?: boolean;\n editorBuild?: string;\n defaultAuthorId?: string;\n fatalError?: EditorError;\n clock?: () => string;\n exportDocx?: (\n sessionState: EditorSessionState,\n options?: ExportDocxOptions,\n ) => Promise<ExportResult>;\n onEvent?: (event: DocumentRuntimeEvent) => void;\n onWarning?: (warning: EditorWarning) => void;\n onError?: (error: EditorError) => void;\n initialViewState?: Partial<ViewState>;\n protectionSnapshot?: ProtectionSnapshot;\n}\n\ninterface HistoryState {\n past: EditorState[];\n future: EditorState[];\n}\n\nexport function createDocumentRuntime(\n options: CreateDocumentRuntimeOptions,\n): DocumentRuntime {\n const clock = options.clock ?? (() => new Date().toISOString());\n const editorBuild = options.editorBuild ?? \"dev\";\n let defaultAuthorId = options.defaultAuthorId;\n const sessionId = createSessionId(options.documentId, clock());\n const listeners = new Set<() => void>();\n const eventListeners = new Set<(event: DocumentRuntimeEvent) => void>();\n const history: HistoryState = {\n past: [],\n future: [],\n };\n\n let activeStory: EditorStoryTarget = MAIN_STORY_TARGET;\n const storySelections = new Map<string, EditorState[\"selection\"]>();\n let viewState: ViewState = createViewState(options.initialViewState);\n let protectionSnapshot: ProtectionSnapshot =\n options.protectionSnapshot ??\n options.initialSessionState?.protectionSnapshot ??\n options.initialSnapshot?.protectionSnapshot ?? {\n hasDocumentProtection: false,\n enforcementActive: false,\n ranges: [],\n enforcedRangeCount: 0,\n preservedRangeCount: 0,\n };\n let workflowOverlay: WorkflowOverlay | null = null;\n let hostAnnotationOverlay: HostAnnotationOverlay | null = null;\n const initialPersistedSnapshot = options.initialSessionState\n ? persistedSnapshotFromEditorSessionState(options.initialSessionState, {\n savedAt: options.initialSessionState.updatedAt,\n })\n : options.initialSnapshot;\n\n let state = createEditorState({\n documentId: options.documentId,\n sessionId,\n sourceLabel: options.sourceLabel,\n readOnly: options.readOnly,\n persistedSnapshot: initialPersistedSnapshot as never,\n canonicalDocument: options.initialCanonicalDocument,\n fatalError: options.fatalError as never,\n });\n storySelections.set(storyTargetKey(MAIN_STORY_TARGET), state.selection);\n let cachedSurface:\n | {\n revisionToken: string;\n activeStoryKey: string;\n snapshot: RuntimeRenderSnapshot[\"surface\"];\n }\n | undefined;\n let cachedCompatibility:\n | {\n revisionToken: string;\n warnings: EditorState[\"warnings\"];\n fatalError: EditorState[\"fatalError\"];\n report: RuntimeRenderSnapshot[\"compatibility\"];\n }\n | undefined;\n let cachedComments:\n | {\n comments: CanonicalDocumentEnvelope[\"review\"][\"comments\"];\n activeCommentId: EditorState[\"runtime\"][\"activeCommentId\"];\n snapshot: CommentSidebarSnapshot;\n }\n | undefined;\n let cachedTrackedChanges:\n | {\n revisions: CanonicalDocumentEnvelope[\"review\"][\"revisions\"];\n revisionToken: string;\n snapshot: TrackedChangesSnapshot;\n }\n | undefined;\n let cachedPageLayout:\n | {\n revisionToken: string;\n activeStoryKey: string;\n activeSectionIndex: number | string;\n snapshot: PageLayoutSnapshot | null;\n }\n | undefined;\n let cachedNavigation:\n | {\n revisionToken: string;\n activeStoryKey: string;\n selectionHead: number;\n snapshot: DocumentNavigationSnapshot;\n }\n | undefined;\n let cachedViewStateSnapshot:\n | {\n revisionToken: string;\n activeStoryKey: string;\n selection: EditorState[\"selection\"];\n viewStateRef: ViewState;\n pageLayout: PageLayoutSnapshot | null | undefined;\n snapshot: EditorViewStateSnapshot;\n }\n | undefined;\n let cachedInteractionGuardSnapshot:\n | {\n revisionToken: string;\n activeStoryKey: string;\n selection: EditorState[\"selection\"];\n readOnly: boolean;\n documentMode: DocumentMode;\n protectionSnapshot: ProtectionSnapshot;\n workflowOverlay: WorkflowOverlay | null;\n snapshot: InteractionGuardSnapshot;\n }\n | undefined;\n let cachedWorkflowScopeSnapshot:\n | {\n workflowOverlay: WorkflowOverlay;\n interactionGuardSnapshot: InteractionGuardSnapshot;\n snapshot: WorkflowScopeSnapshot;\n }\n | undefined;\n let cachedWorkflowMarkupSnapshot:\n | {\n revisionToken: string;\n activeStoryKey: string;\n protectionSnapshot: ProtectionSnapshot;\n preservation: CanonicalDocumentEnvelope[\"preservation\"];\n snapshot: WorkflowMarkupSnapshot;\n }\n | undefined;\n\n function getCachedSurface(\n document: CanonicalDocumentEnvelope,\n nextActiveStory: EditorStoryTarget,\n ): RuntimeRenderSnapshot[\"surface\"] {\n const activeStoryKey = storyTargetKey(nextActiveStory);\n if (\n cachedSurface &&\n cachedSurface.revisionToken === state.revisionToken &&\n cachedSurface.activeStoryKey === activeStoryKey\n ) {\n return cachedSurface.snapshot;\n }\n\n const snapshot = createEditorSurfaceSnapshot(document, state.selection, nextActiveStory);\n recordPerfSample(\"snapshot.surface\");\n incrementInvalidationCounter(\"runtime.snapshot.surfaceMisses\");\n cachedSurface = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedCompatibilityReport(\n nextState: EditorState,\n ): RuntimeRenderSnapshot[\"compatibility\"] {\n if (\n cachedCompatibility &&\n cachedCompatibility.revisionToken === nextState.revisionToken &&\n cachedCompatibility.warnings === nextState.warnings &&\n cachedCompatibility.fatalError === nextState.fatalError\n ) {\n return cachedCompatibility.report;\n }\n\n const derived = createDerivedCompatibility(nextState);\n recordPerfSample(\"snapshot.compatibility\");\n incrementInvalidationCounter(\"runtime.snapshot.compatibilityMisses\");\n const report = {\n blockExport: derived.blockExport,\n blockExportReasons: listBlockExportReasons(derived),\n warningCount: derived.warnings.length,\n errorCount: derived.errors.length,\n featureEntries: derived.featureEntries.map((entry) =>\n toPublicCompatibilityFeatureEntry(entry),\n ),\n };\n cachedCompatibility = {\n revisionToken: nextState.revisionToken,\n warnings: nextState.warnings,\n fatalError: nextState.fatalError,\n report,\n };\n return report;\n }\n\n function getCachedCommentSidebarSnapshot(nextState: EditorState): CommentSidebarSnapshot {\n if (\n cachedComments &&\n cachedComments.comments === nextState.document.review.comments &&\n cachedComments.activeCommentId === nextState.runtime.activeCommentId\n ) {\n return cachedComments.snapshot;\n }\n\n const snapshot = toPublicCommentSidebarSnapshot(nextState);\n cachedComments = {\n comments: nextState.document.review.comments,\n activeCommentId: nextState.runtime.activeCommentId,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedTrackedChangesSnapshot(\n nextState: EditorState,\n _surface: RuntimeRenderSnapshot[\"surface\"],\n ): TrackedChangesSnapshot {\n if (\n cachedTrackedChanges &&\n cachedTrackedChanges.revisions === nextState.document.review.revisions &&\n cachedTrackedChanges.revisionToken === nextState.revisionToken\n ) {\n return cachedTrackedChanges.snapshot;\n }\n\n const snapshot = toPublicTrackedChangesSnapshot(nextState);\n cachedTrackedChanges = {\n revisions: nextState.document.review.revisions,\n revisionToken: nextState.revisionToken,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedDocumentNavigationSnapshot(\n nextState: EditorState,\n nextActiveStory: EditorStoryTarget,\n ): DocumentNavigationSnapshot {\n const activeStoryKey = storyTargetKey(nextActiveStory);\n if (\n cachedNavigation &&\n cachedNavigation.revisionToken === nextState.revisionToken &&\n cachedNavigation.activeStoryKey === activeStoryKey\n ) {\n if (cachedNavigation.selectionHead === nextState.selection.head) {\n return cachedNavigation.snapshot;\n }\n\n const snapshot = createDocumentNavigationSnapshot(\n nextState.document,\n nextState.selection.head,\n nextActiveStory,\n );\n if (\n snapshot.activePageIndex === cachedNavigation.snapshot.activePageIndex &&\n snapshot.activeSectionIndex === cachedNavigation.snapshot.activeSectionIndex\n ) {\n cachedNavigation = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n selectionHead: nextState.selection.head,\n snapshot: cachedNavigation.snapshot,\n };\n return cachedNavigation.snapshot;\n }\n cachedNavigation = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n selectionHead: nextState.selection.head,\n snapshot,\n };\n return snapshot;\n }\n\n const snapshot = createDocumentNavigationSnapshot(\n nextState.document,\n nextState.selection.head,\n nextActiveStory,\n );\n recordPerfSample(\"snapshot.navigation\");\n incrementInvalidationCounter(\"runtime.snapshot.navigationMisses\");\n cachedNavigation = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n selectionHead: nextState.selection.head,\n snapshot,\n };\n return snapshot;\n }\n\n function resolvePageLayoutActiveSectionIndex(\n nextState: EditorState,\n nextActiveStory: EditorStoryTarget,\n ): number | string {\n if (nextActiveStory.kind === \"main\") {\n return getCachedDocumentNavigationSnapshot(nextState, nextActiveStory).activeSectionIndex;\n }\n\n if (\"sectionIndex\" in nextActiveStory && typeof nextActiveStory.sectionIndex === \"number\") {\n return nextActiveStory.sectionIndex;\n }\n\n return storyTargetKey(nextActiveStory);\n }\n\n function getCachedPageLayoutSnapshot(\n nextState: EditorState,\n nextActiveStory: EditorStoryTarget,\n ): PageLayoutSnapshot | null {\n const activeStoryKey = storyTargetKey(nextActiveStory);\n const activeSectionIndex = resolvePageLayoutActiveSectionIndex(\n nextState,\n nextActiveStory,\n );\n if (\n cachedPageLayout &&\n cachedPageLayout.revisionToken === nextState.revisionToken &&\n cachedPageLayout.activeStoryKey === activeStoryKey &&\n cachedPageLayout.activeSectionIndex === activeSectionIndex\n ) {\n return cachedPageLayout.snapshot;\n }\n\n const snapshot = derivePageLayoutSnapshot(nextState, nextActiveStory, storySelections);\n cachedPageLayout = {\n revisionToken: nextState.revisionToken,\n activeStoryKey,\n activeSectionIndex,\n snapshot,\n };\n return snapshot;\n }\n\n function evaluateWorkflowBlockedReasons(\n selection: EditorState[\"selection\"],\n commandType?: string,\n ): WorkflowBlockedCommandReason[] {\n const reasons: WorkflowBlockedCommandReason[] = [];\n const selectionBounds = {\n from: Math.min(selection.anchor, selection.head),\n to: Math.max(selection.anchor, selection.head),\n };\n const selectionRange = expandSelectionRange(selectionBounds);\n const opaqueReason = deriveOpaqueWorkflowBlockedReason(selectionRange);\n\n if (opaqueReason) {\n reasons.push(opaqueReason);\n }\n\n if (state.readOnly) {\n reasons.push({\n code: \"document_read_only\",\n message: \"Document is in read-only mode.\",\n });\n }\n\n if (viewState.documentMode === \"viewing\") {\n reasons.push({\n code: \"document_viewing_mode\",\n message: \"Document is in viewing mode.\",\n });\n }\n\n if (\n isBlockedByProtection(protectionSnapshot, selection)\n ) {\n reasons.push({\n code: \"protected_range\",\n message: \"Selection falls within a protected range.\",\n });\n }\n\n const effectiveDocumentMode = getEffectiveDocumentMode(selection);\n\n if (effectiveDocumentMode === \"suggesting\" && commandType) {\n if (\n activeStory.kind !== \"main\" &&\n SUGGESTING_SECONDARY_STORY_UNSUPPORTED_COMMANDS.has(commandType)\n ) {\n reasons.push({\n code: \"suggesting_unsupported\",\n message: \"Suggesting mode is not yet export-safe in this story.\",\n });\n }\n if (SUGGESTING_UNSUPPORTED_COMMANDS.has(commandType)) {\n reasons.push({\n code: \"suggesting_unsupported\",\n message: `\"${commandType}\" is not supported in suggesting mode.`,\n });\n }\n }\n\n if (workflowOverlay) {\n const matchingScope = getMatchingWorkflowScope(selection);\n\n if (!matchingScope && workflowOverlay.scopes.length > 0) {\n reasons.push({\n code: \"outside_workflow_scope\",\n message: \"Selection is outside any active workflow scope.\",\n });\n } else if (matchingScope) {\n if (matchingScope.mode === \"comment\") {\n const isCommentCommand =\n commandType?.startsWith(\"comment.\") ?? false;\n if (!isCommentCommand) {\n reasons.push({\n code: \"workflow_comment_only\",\n message: `Scope \"${matchingScope.label ?? matchingScope.scopeId}\" allows comments only.`,\n scopeId: matchingScope.scopeId,\n workItemId: matchingScope.workItemId,\n });\n }\n } else if (matchingScope.mode === \"view\") {\n reasons.push({\n code: \"workflow_view_only\",\n message: `Scope \"${matchingScope.label ?? matchingScope.scopeId}\" is view-only.`,\n scopeId: matchingScope.scopeId,\n workItemId: matchingScope.workItemId,\n });\n }\n }\n }\n\n return reasons;\n }\n\n function getMatchingWorkflowScope(\n selection: EditorState[\"selection\"],\n ): WorkflowOverlay[\"scopes\"][number] | null {\n if (!workflowOverlay) {\n return null;\n }\n\n const selectionBounds = {\n from: Math.min(selection.anchor, selection.head),\n to: Math.max(selection.anchor, selection.head),\n };\n const activeScopes = getEffectiveWorkflowScopes(workflowOverlay);\n return activeScopes.find((scope) => {\n if (scope.anchor.kind === \"detached\") return false;\n const scopeFrom = scope.anchor.kind === \"range\" ? scope.anchor.from : scope.anchor.at;\n const scopeTo = scope.anchor.kind === \"range\" ? scope.anchor.to : scope.anchor.at;\n return selectionBounds.from >= scopeFrom && selectionBounds.to <= scopeTo;\n }) ?? null;\n }\n\n function getEffectiveDocumentMode(\n selection: EditorState[\"selection\"],\n ): DocumentMode {\n if (viewState.documentMode === \"viewing\") {\n return \"viewing\";\n }\n const matchingScope = getMatchingWorkflowScope(selection);\n if (matchingScope?.mode === \"suggest\") {\n return \"suggesting\";\n }\n return viewState.documentMode;\n }\n\n function expandSelectionRange(\n range: { from: number; to: number },\n ): { from: number; to: number } {\n return {\n from: range.from,\n to: range.to > range.from ? range.to : range.from + 1,\n };\n }\n\n function deriveOpaqueWorkflowBlockedReason(\n range: { from: number; to: number },\n ): WorkflowBlockedCommandReason | null {\n const targetPartPath = getStoryTargetOpaquePartPath(activeStory);\n if (!targetPartPath) {\n return null;\n }\n const fragments = findOpaqueFragmentsIntersectingRange(\n state.document.preservation,\n range,\n ).filter((fragment) => fragment.packagePartName === targetPartPath);\n\n if (fragments.length === 0) {\n return null;\n }\n\n const blockedImportFeatureKeys = new Set([\n \"alt-chunk\",\n \"alternate-content\",\n \"custom-xml\",\n ]);\n const blockedImportFragment =\n fragments.find((fragment) =>\n blockedImportFeatureKeys.has(describeOpaqueFragment(fragment).featureKey),\n ) ?? null;\n const fragment = blockedImportFragment ?? fragments[0]!;\n const descriptor = describeOpaqueFragment(fragment);\n const isBlockedImport = blockedImportFragment !== null;\n\n return {\n code: isBlockedImport ? \"workflow_blocked_import\" : \"workflow_preserve_only\",\n message: isBlockedImport\n ? `${descriptor.label} remains a blocked import and cannot be edited.`\n : `${descriptor.label} remains preserve-only and cannot be edited.`,\n anchor: toPublicAnchorProjection(\n createRangeAnchor(fragment.lastKnownRange.from, fragment.lastKnownRange.to, {\n start: -1,\n end: 1,\n }),\n ),\n storyTarget: activeStory,\n };\n }\n\n function getStoryTargetOpaquePartPath(storyTarget: EditorStoryTarget): string | null {\n if (storyTarget.kind === \"main\") {\n return \"/word/document.xml\";\n }\n if (storyTarget.kind === \"header\") {\n return state.document.subParts?.headers.find(\n (header) =>\n header.relationshipId === storyTarget.relationshipId\n && header.variant === storyTarget.variant\n && header.sectionIndex === storyTarget.sectionIndex,\n )?.partPath ?? null;\n }\n if (storyTarget.kind === \"footer\") {\n return state.document.subParts?.footers.find(\n (footer) =>\n footer.relationshipId === storyTarget.relationshipId\n && footer.variant === storyTarget.variant\n && footer.sectionIndex === storyTarget.sectionIndex,\n )?.partPath ?? null;\n }\n if (storyTarget.kind === \"footnote\") {\n return \"/word/footnotes.xml\";\n }\n if (storyTarget.kind === \"endnote\") {\n return \"/word/endnotes.xml\";\n }\n return null;\n }\n\n function deriveWorkflowScopeSnapshot(): WorkflowScopeSnapshot | null {\n if (!workflowOverlay) return null;\n const blockedReasons = getCachedInteractionGuardSnapshot().blockedReasons;\n const activeItem = workflowOverlay.activeWorkItemId\n ? workflowOverlay.workItems?.find(\n (item) => item.workItemId === workflowOverlay!.activeWorkItemId,\n )\n : undefined;\n return {\n overlayPresent: true,\n activeWorkItemId: workflowOverlay.activeWorkItemId ?? null,\n activeWorkItem: activeItem,\n scopes: workflowOverlay.scopes,\n candidates: workflowOverlay.candidates ?? [],\n blockedReasons,\n };\n }\n\n function deriveHostAnnotationSnapshot(): HostAnnotationSnapshot {\n return {\n totalCount: hostAnnotationOverlay?.annotations.length ?? 0,\n annotations: structuredClone(hostAnnotationOverlay?.annotations ?? []),\n };\n }\n\n function getEffectiveWorkflowScopes(overlay: WorkflowOverlay): WorkflowOverlay[\"scopes\"] {\n const activeWorkItemId = overlay.activeWorkItemId ?? null;\n const activeWorkItemScopeIds =\n activeWorkItemId === null\n ? null\n : new Set(\n overlay.workItems?.find((item) => item.workItemId === activeWorkItemId)?.scopeIds ?? [],\n );\n\n return overlay.scopes.filter((scope) => {\n const scopeStoryTarget = scope.storyTarget ?? MAIN_STORY_TARGET;\n if (!storyTargetsEqual(scopeStoryTarget, activeStory)) {\n return false;\n }\n\n if (activeWorkItemId === null) {\n return true;\n }\n\n return (\n scope.workItemId === activeWorkItemId ||\n activeWorkItemScopeIds?.has(scope.scopeId) === true\n );\n });\n }\n\n function getCachedInteractionGuardSnapshot(): InteractionGuardSnapshot {\n const activeStoryKey = storyTargetKey(activeStory);\n if (\n cachedInteractionGuardSnapshot &&\n cachedInteractionGuardSnapshot.revisionToken === state.revisionToken &&\n cachedInteractionGuardSnapshot.activeStoryKey === activeStoryKey &&\n cachedInteractionGuardSnapshot.selection === state.selection &&\n cachedInteractionGuardSnapshot.readOnly === state.readOnly &&\n cachedInteractionGuardSnapshot.documentMode === viewState.documentMode &&\n cachedInteractionGuardSnapshot.protectionSnapshot === protectionSnapshot &&\n cachedInteractionGuardSnapshot.workflowOverlay === workflowOverlay\n ) {\n return cachedInteractionGuardSnapshot.snapshot;\n }\n\n const blockedReasons = evaluateWorkflowBlockedReasons(state.selection);\n const matchingScope = getMatchingWorkflowScope(state.selection);\n const primaryBlockedReason = blockedReasons[0];\n const snapshot: InteractionGuardSnapshot = {\n effectiveMode: primaryBlockedReason\n ? (\n primaryBlockedReason.code === \"workflow_comment_only\"\n ? \"comment\"\n : primaryBlockedReason.code === \"workflow_view_only\"\n ? \"view\"\n : \"blocked\"\n )\n : getEffectiveDocumentMode(state.selection) === \"suggesting\"\n ? \"suggest\"\n : matchingScope?.mode ?? \"edit\",\n ...(matchingScope?.scopeId ? { matchedScopeId: matchingScope.scopeId } : {}),\n ...(matchingScope?.mode ? { matchedScopeMode: matchingScope.mode } : {}),\n ...(primaryBlockedReason ? { disabledReason: primaryBlockedReason.message } : {}),\n blockedReasons,\n };\n cachedInteractionGuardSnapshot = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n selection: state.selection,\n readOnly: state.readOnly,\n documentMode: viewState.documentMode,\n protectionSnapshot,\n workflowOverlay,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedWorkflowScopeSnapshot(): WorkflowScopeSnapshot | null {\n if (!workflowOverlay) {\n return null;\n }\n\n const interactionGuardSnapshot = getCachedInteractionGuardSnapshot();\n if (\n cachedWorkflowScopeSnapshot &&\n cachedWorkflowScopeSnapshot.workflowOverlay === workflowOverlay &&\n cachedWorkflowScopeSnapshot.interactionGuardSnapshot === interactionGuardSnapshot\n ) {\n return cachedWorkflowScopeSnapshot.snapshot;\n }\n\n const snapshot = deriveWorkflowScopeSnapshot()!;\n cachedWorkflowScopeSnapshot = {\n workflowOverlay,\n interactionGuardSnapshot,\n snapshot,\n };\n return snapshot;\n }\n\n function getCachedWorkflowMarkupSnapshot(): WorkflowMarkupSnapshot {\n const activeStoryKey = storyTargetKey(activeStory);\n if (\n cachedWorkflowMarkupSnapshot &&\n cachedWorkflowMarkupSnapshot.revisionToken === state.revisionToken &&\n cachedWorkflowMarkupSnapshot.activeStoryKey === activeStoryKey &&\n cachedWorkflowMarkupSnapshot.protectionSnapshot === protectionSnapshot &&\n cachedWorkflowMarkupSnapshot.preservation === state.document.preservation\n ) {\n return cachedWorkflowMarkupSnapshot.snapshot;\n }\n\n const snapshot = collectWorkflowMarkupSnapshot({\n renderSnapshot: cachedRenderSnapshot,\n fieldSnapshot: buildFieldSnapshot(state.document),\n protectionSnapshot,\n preservation: state.document.preservation,\n });\n cachedWorkflowMarkupSnapshot = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n protectionSnapshot,\n preservation: state.document.preservation,\n snapshot,\n };\n return snapshot;\n }\n\n function refreshRenderSnapshot(): RuntimeRenderSnapshot {\n const surface = getCachedSurface(state.document, activeStory);\n return {\n documentId: state.documentId,\n sessionId: state.sessionId,\n sourceLabel: state.sourceLabel,\n revisionToken: state.revisionToken,\n isReady: state.phase === \"ready\",\n isDirty: state.isDirty,\n readOnly: state.readOnly,\n documentMode: viewState.documentMode,\n selection: toPublicSelectionSnapshot(state.selection, activeStory),\n activeStory,\n pageLayout: getCachedPageLayoutSnapshot(state, activeStory) ?? undefined,\n documentStats: toPublicDocumentStats(state),\n comments: getCachedCommentSidebarSnapshot(state),\n trackedChanges: getCachedTrackedChangesSnapshot(state, surface),\n compatibility: getCachedCompatibilityReport(state),\n warnings: state.warnings.map((warning) => toPublicWarning(warning)),\n fatalError: state.fatalError ? toPublicError(state.fatalError) : undefined,\n commandState: {\n canUndo: history.past.length > 0,\n canRedo: history.future.length > 0,\n readOnly: state.readOnly,\n },\n surface,\n protectionSnapshot,\n };\n }\n\n function getCachedViewStateSnapshot(): EditorViewStateSnapshot {\n const activeStoryKey = storyTargetKey(activeStory);\n const pageLayout = cachedRenderSnapshot.pageLayout;\n if (\n cachedViewStateSnapshot &&\n cachedViewStateSnapshot.revisionToken === state.revisionToken &&\n cachedViewStateSnapshot.activeStoryKey === activeStoryKey &&\n cachedViewStateSnapshot.selection === state.selection &&\n cachedViewStateSnapshot.viewStateRef === viewState &&\n cachedViewStateSnapshot.pageLayout === pageLayout\n ) {\n return cachedViewStateSnapshot.snapshot;\n }\n\n const surface = cachedRenderSnapshot.surface;\n const mainSurface =\n activeStory.kind === \"main\"\n ? surface\n : getCachedSurface(state.document, MAIN_STORY_TARGET);\n const snapshot = createEditorViewStateSnapshot(\n viewState,\n activeStory,\n toPublicSelectionSnapshot(state.selection, activeStory),\n surface,\n mainSurface,\n pageLayout,\n state.document.numbering,\n );\n cachedViewStateSnapshot = {\n revisionToken: state.revisionToken,\n activeStoryKey,\n selection: state.selection,\n viewStateRef: viewState,\n pageLayout,\n snapshot,\n };\n return snapshot;\n }\n\n let cachedRenderSnapshot = refreshRenderSnapshot();\n\n emit({\n type: \"ready\",\n documentId: state.documentId,\n sessionId: state.sessionId,\n source:\n options.sourceKind ??\n (options.initialSessionState\n ? \"session\"\n : options.initialSnapshot\n ? \"snapshot\"\n : \"canonical\"),\n stats: toPublicDocumentStats(state),\n compatibility: toPublicCompatibilityReport(createDerivedCompatibility(state)),\n comments: cachedRenderSnapshot.comments,\n trackedChanges: cachedRenderSnapshot.trackedChanges,\n });\n if (options.fatalError) {\n emit({\n type: \"error\",\n documentId: state.documentId,\n error: options.fatalError,\n });\n }\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n subscribeToEvents(listener) {\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n },\n getRenderSnapshot() {\n return cachedRenderSnapshot;\n },\n getCanonicalDocument() {\n return state.document;\n },\n getSourcePackage() {\n return state.sourcePackage;\n },\n emitBlockedCommand(command, reasons) {\n emit({\n type: \"command_blocked\",\n documentId: state.documentId,\n command,\n reasons,\n });\n },\n dispatch(command) {\n const commandSelection = getCommandSelection(command, state.selection);\n if (isMutationCommand(command)) {\n const blockedReasons = evaluateWorkflowBlockedReasons(\n commandSelection,\n command.type,\n );\n if (blockedReasons.length > 0) {\n emit({\n type: \"command_blocked\",\n documentId: state.documentId,\n command: command.type,\n reasons: blockedReasons,\n });\n return;\n }\n }\n\n if (command.type === \"history.undo\") {\n if (viewState.documentMode === \"viewing\") return;\n applyHistory(\"undo\");\n return;\n }\n\n if (command.type === \"history.redo\") {\n if (viewState.documentMode === \"viewing\") return;\n applyHistory(\"redo\");\n return;\n }\n try {\n const transaction = executeEditorCommand(state, command, {\n timestamp: command.origin?.timestamp ?? clock(),\n documentMode: getEffectiveDocumentMode(commandSelection),\n defaultAuthorId: defaultAuthorId ?? undefined,\n });\n commit(transaction);\n } catch (error) {\n emitError(toRuntimeError(error));\n }\n },\n undo() {\n this.dispatch({\n type: \"history.undo\",\n origin: createOrigin(\"runtime\", clock()),\n });\n },\n redo() {\n this.dispatch({\n type: \"history.redo\",\n origin: createOrigin(\"runtime\", clock()),\n });\n },\n focus() {\n viewState = applyFocused(viewState, true);\n this.dispatch({\n type: \"runtime.focus\",\n focused: true,\n origin: createOrigin(\"api\", clock()),\n });\n },\n blur() {\n viewState = applyFocused(viewState, false);\n this.dispatch({\n type: \"runtime.focus\",\n focused: false,\n origin: createOrigin(\"api\", clock()),\n });\n },\n setDefaultAuthorId(authorId) {\n defaultAuthorId = authorId;\n },\n replaceText(text, target) {\n try {\n const timestamp = clock();\n applyTextCommandInActiveStory(\n {\n type: \"text.insert\",\n text,\n origin: createOrigin(\"api\", timestamp),\n },\n {\n selection: target ? createSelectionFromPublicAnchor(target) : state.selection,\n blockedCommandName: \"replaceText\",\n },\n );\n } catch (error) {\n emitError(toRuntimeError(error));\n }\n },\n applyActiveStoryTextCommand(command) {\n try {\n applyTextCommandInActiveStory(command);\n } catch (error) {\n emitError(toRuntimeError(error));\n }\n },\n addComment(params) {\n if (viewState.documentMode === \"viewing\") {\n throw new Error(\"Cannot add comments in viewing mode.\");\n }\n const commentId = createEntityId(\"comment\", state.document.review.comments, clock());\n const anchor = params.anchor\n ? toInternalAnchorProjection(params.anchor)\n : state.selection.activeRange;\n const selection = params.anchor\n ? createSelectionFromPublicAnchor(params.anchor)\n : state.selection;\n if (!canCreateDocxCommentAnchor(state.document.content, anchor)) {\n const message =\n \"DOCX comments must use a non-empty range that stays within a single paragraph.\";\n emitError({\n errorId: createSessionId(\"comment-anchor\", clock()),\n code: \"validation_failed\",\n isFatal: false,\n message,\n source: \"runtime\",\n });\n throw new Error(message);\n }\n const authorId = params.authorId ?? defaultAuthorId ?? \"unknown\";\n const createdAt = clock();\n const entries: CommentEntryRecord[] = [\n {\n entryId: `${commentId}-entry-1`,\n authorId,\n body: params.body ?? \"\",\n createdAt,\n },\n ];\n const comment: CommentThreadRecord = {\n commentId,\n anchor,\n createdAt,\n createdBy: authorId,\n authorId,\n body: params.body ?? \"\",\n entries,\n status: anchor.kind === \"detached\" ? \"detached\" : \"open\",\n warningIds: [],\n isResolved: false,\n metadata: {\n source: \"runtime\",\n },\n };\n\n this.dispatch({\n type: \"comment.add\",\n comment,\n selection,\n origin: createOrigin(\"api\", clock()),\n });\n\n return commentId;\n },\n openComment(commentId) {\n this.dispatch({\n type: \"comment.open\",\n commentId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n resolveComment(commentId) {\n this.dispatch({\n type: \"comment.resolve\",\n commentId,\n resolvedBy: defaultAuthorId ?? \"unknown\",\n origin: createOrigin(\"api\", clock()),\n });\n },\n reopenComment(commentId) {\n this.dispatch({\n type: \"comment.reopen\",\n commentId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n addCommentReply(commentId, body, authorId) {\n this.dispatch({\n type: \"comment.add-reply\",\n commentId,\n body,\n authorId: authorId ?? defaultAuthorId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n editCommentBody(commentId, body) {\n this.dispatch({\n type: \"comment.edit-body\",\n commentId,\n body,\n origin: createOrigin(\"api\", clock()),\n });\n },\n acceptChange(changeId) {\n this.dispatch({\n type: \"change.accept\",\n changeId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n rejectChange(changeId) {\n this.dispatch({\n type: \"change.reject\",\n changeId,\n origin: createOrigin(\"api\", clock()),\n });\n },\n acceptAllChanges() {\n this.dispatch({\n type: \"change.accept-all\",\n origin: createOrigin(\"api\", clock()),\n });\n },\n rejectAllChanges() {\n this.dispatch({\n type: \"change.reject-all\",\n origin: createOrigin(\"api\", clock()),\n });\n },\n openStory(target) {\n const normalizedTarget =\n target.kind === \"header\" || target.kind === \"footer\"\n ? normalizeHeaderFooterTarget(\n state.document,\n target,\n cachedRenderSnapshot.pageLayout?.sectionIndex,\n ) ?? target\n : target;\n if (storyTargetsEqual(activeStory, normalizedTarget)) {\n return true;\n }\n if (!isValidStoryTarget(state, normalizedTarget)) {\n return false;\n }\n switchActiveStory(normalizedTarget);\n return true;\n },\n closeStory() {\n if (activeStory.kind === \"main\") {\n return;\n }\n switchActiveStory(MAIN_STORY_TARGET);\n },\n getActiveStory() {\n return activeStory;\n },\n getViewState() {\n return getCachedViewStateSnapshot();\n },\n setViewMode(mode) {\n viewState = applyViewMode(viewState, mode);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n setDocumentMode(mode) {\n viewState = applyDocumentMode(viewState, mode);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n getProtectionSnapshot() {\n return cachedRenderSnapshot.protectionSnapshot;\n },\n setWorkspaceMode(mode) {\n viewState = applyWorkspaceMode(viewState, mode);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n setZoom(level) {\n viewState = applyZoomLevel(viewState, level);\n cachedRenderSnapshot = refreshRenderSnapshot();\n for (const listener of listeners) {\n listener();\n }\n },\n getPageLayoutSnapshot() {\n return getCachedPageLayoutSnapshot(state, activeStory);\n },\n getDocumentNavigationSnapshot() {\n return getCachedDocumentNavigationSnapshot(state, activeStory);\n },\n getFieldSnapshot() {\n return buildFieldSnapshot(state.document);\n },\n updateFields(options?: UpdateFieldsOptions): UpdateFieldsResult {\n const refreshed = refreshDocumentFields(\n state.document,\n state.selection.head,\n activeStory,\n options,\n );\n if (refreshed.changed) {\n this.dispatch({\n type: \"document.replace\",\n document: refreshed.document,\n mapping: createEmptyMapping(),\n protectionSelection: refreshed.protectionSelection,\n origin: createOrigin(\"api\", clock()),\n });\n }\n const snapshot = buildFieldSnapshot(refreshed.document);\n return {\n totalCount: snapshot.totalCount,\n updatedCount: refreshed.updatedCount,\n preserveOnlyCount: snapshot.preserveOnlyCount,\n };\n },\n updateTableOfContents(options?: TocRefreshOptions): TocRefreshResult {\n const refreshed = refreshDocumentTableOfContents(\n state.document,\n state.selection.head,\n activeStory,\n options,\n );\n if (refreshed.changed) {\n this.dispatch({\n type: \"document.replace\",\n document: refreshed.document,\n mapping: createEmptyMapping(),\n protectionSelection: refreshed.protectionSelection,\n origin: createOrigin(\"api\", clock()),\n });\n }\n return refreshed.result;\n },\n getSessionState() {\n const compatibility = createDerivedCompatibility(state);\n return editorSessionStateFromPersistedSnapshot(\n createPersistedEditorSnapshot(state, {\n editorBuild,\n savedAt: clock(),\n compatibility,\n protectionSnapshot,\n }) as unknown as PersistedEditorSnapshot,\n );\n },\n getPersistedSnapshot() {\n return persistedSnapshotFromEditorSessionState(this.getSessionState(), {\n savedAt: clock(),\n });\n },\n getCompatibilityReport() {\n return toPublicCompatibilityReport(createDerivedCompatibility(state));\n },\n getWarnings() {\n return state.warnings.map((warning) => toPublicWarning(warning));\n },\n async exportDocx(exportOptions) {\n if (!options.exportDocx) {\n const error: InternalEditorError = {\n errorId: createEntityId(\"error\", {}, clock()),\n code: \"export_failed\",\n isFatal: false,\n message: \"DOCX export requires an injected exporter until the IO substrate lands.\",\n source: \"export\",\n details: {\n requestedOptions: exportOptions ?? {},\n },\n };\n emitError(error);\n throw new Error(error.message);\n }\n\n const result = await options.exportDocx(this.getSessionState(), exportOptions);\n\n emit({\n type: \"export_completed\",\n documentId: state.documentId,\n result,\n });\n\n return result;\n },\n setWorkflowOverlay(overlay) {\n workflowOverlay = structuredClone(overlay);\n cachedRenderSnapshot = refreshRenderSnapshot();\n const snapshot = deriveWorkflowScopeSnapshot()!;\n emit({\n type: \"workflow_overlay_changed\",\n documentId: state.documentId,\n snapshot,\n });\n if (workflowOverlay.activeWorkItemId !== undefined) {\n emit({\n type: \"workflow_active_work_item_changed\",\n documentId: state.documentId,\n activeWorkItemId: workflowOverlay.activeWorkItemId ?? null,\n });\n }\n for (const listener of listeners) {\n listener();\n }\n },\n clearWorkflowOverlay() {\n workflowOverlay = null;\n cachedRenderSnapshot = refreshRenderSnapshot();\n emit({\n type: \"workflow_active_work_item_changed\",\n documentId: state.documentId,\n activeWorkItemId: null,\n });\n emit({\n type: \"workflow_overlay_changed\",\n documentId: state.documentId,\n snapshot: {\n overlayPresent: false,\n activeWorkItemId: null,\n scopes: [],\n candidates: [],\n blockedReasons: [],\n },\n });\n for (const listener of listeners) {\n listener();\n }\n },\n getWorkflowScopeSnapshot() {\n return getCachedWorkflowScopeSnapshot();\n },\n getInteractionGuardSnapshot() {\n return getCachedInteractionGuardSnapshot();\n },\n getWorkflowMarkupSnapshot() {\n return getCachedWorkflowMarkupSnapshot();\n },\n setHostAnnotationOverlay(overlay) {\n hostAnnotationOverlay = structuredClone(overlay);\n emit({\n type: \"host_annotation_overlay_changed\",\n documentId: state.documentId,\n snapshot: deriveHostAnnotationSnapshot(),\n });\n for (const listener of listeners) {\n listener();\n }\n },\n clearHostAnnotationOverlay() {\n hostAnnotationOverlay = null;\n emit({\n type: \"host_annotation_overlay_changed\",\n documentId: state.documentId,\n snapshot: deriveHostAnnotationSnapshot(),\n });\n for (const listener of listeners) {\n listener();\n }\n },\n getHostAnnotationSnapshot() {\n return deriveHostAnnotationSnapshot();\n },\n getWorkflowCandidateRanges(options) {\n return deriveWorkflowCandidateRangesFromMarkup(this.getWorkflowMarkupSnapshot(), options);\n },\n replaceWorkflowMarkupText(markupId, text) {\n const target = this\n .getWorkflowMarkupSnapshot()\n .items.find((item) => item.markupId === markupId);\n if (!target || target.anchor.kind === \"detached\") {\n return;\n }\n const targetStory = target.storyTarget ?? MAIN_STORY_TARGET;\n if (!storyTargetsEqual(activeStory, targetStory)) {\n if (targetStory.kind === \"main\") {\n this.closeStory();\n } else if (!this.openStory(targetStory)) {\n return;\n }\n }\n this.replaceText(text, target.anchor);\n },\n };\n\n function applyHistory(direction: \"undo\" | \"redo\"): void {\n const source = direction === \"undo\" ? history.past : history.future;\n const target = source.pop();\n\n if (!target) {\n return;\n }\n\n const counterpart = direction === \"undo\" ? history.future : history.past;\n counterpart.push(state);\n\n const previous = state;\n // Undo/redo changes the document — must mint a new revisionToken so\n // autosave/export checkpoint dedup treats it as fresh content.\n state = finalizeState(target, true, clock(), previous.revision);\n storySelections.set(storyTargetKey(activeStory), state.selection);\n cachedRenderSnapshot = refreshRenderSnapshot();\n notify(previous, state, {\n nextState: state,\n mapping: { steps: [] },\n effects: {\n warningsAdded: [],\n warningsCleared: [],\n },\n historyBoundary: \"skip\",\n markDirty: true,\n });\n }\n\n function commit(transaction: EditorTransaction): void {\n const previous = state;\n\n if (transaction.historyBoundary === \"push\") {\n history.past.push(state);\n history.future = [];\n }\n\n protectionSnapshot = remapProtectionSnapshot(protectionSnapshot, transaction.mapping);\n state = finalizeState(transaction.nextState, transaction.markDirty, clock());\n storySelections.set(storyTargetKey(activeStory), state.selection);\n cachedRenderSnapshot = refreshRenderSnapshot();\n notify(previous, state, transaction);\n }\n\n function notify(\n previous: EditorState,\n next: EditorState,\n transaction: EditorTransaction,\n ): void {\n if (previous.isDirty !== next.isDirty) {\n emit({\n type: \"dirty_changed\",\n documentId: next.documentId,\n isDirty: next.isDirty,\n });\n }\n\n if (selectionChanged(previous.selection, next.selection)) {\n emit({\n type: \"selection_changed\",\n documentId: next.documentId,\n selection: toPublicSelectionSnapshot(next.selection, activeStory),\n });\n }\n\n if (transaction.effects.commentAdded) {\n emit({\n type: \"comment_added\",\n documentId: next.documentId,\n commentId: transaction.effects.commentAdded.commentId,\n anchor: toPublicAnchorProjection(transaction.effects.commentAdded.anchor),\n });\n }\n\n if (transaction.effects.commentResolved) {\n emit({\n type: \"comment_resolved\",\n documentId: next.documentId,\n commentId: transaction.effects.commentResolved.commentId,\n });\n }\n\n if (transaction.effects.changeAccepted) {\n emit({\n type: \"change_accepted\",\n documentId: next.documentId,\n changeId: transaction.effects.changeAccepted.changeId,\n });\n }\n\n if (transaction.effects.changeRejected) {\n emit({\n type: \"change_rejected\",\n documentId: next.documentId,\n changeId: transaction.effects.changeRejected.changeId,\n });\n }\n\n if (transaction.effects.revisionAuthored) {\n emit({\n type: \"change_authored\",\n documentId: next.documentId,\n changeId: transaction.effects.revisionAuthored.changeId,\n kind: transaction.effects.revisionAuthored.kind,\n });\n }\n\n if (transaction.effects.commandBlocked) {\n emit({\n type: \"command_blocked\",\n documentId: next.documentId,\n command: transaction.effects.commandBlocked.code,\n reasons: [{\n code: transaction.effects.commandBlocked.code as WorkflowBlockedCommandReason[\"code\"],\n message: transaction.effects.commandBlocked.message,\n }],\n });\n }\n\n for (const warning of transaction.effects.warningsAdded) {\n const publicWarning = toPublicWarning(warning);\n emit({\n type: \"warning_added\",\n documentId: next.documentId,\n warning: publicWarning,\n });\n options.onWarning?.(publicWarning);\n }\n\n for (const cleared of transaction.effects.warningsCleared) {\n emit({\n type: \"warning_cleared\",\n documentId: next.documentId,\n warningId: cleared.warningId,\n code: cleared.code,\n });\n }\n\n for (const listener of listeners) {\n listener();\n }\n }\n\n function applyTextCommandInActiveStory(\n command: ActiveStoryTextCommand,\n options: {\n selection?: EditorState[\"selection\"];\n blockedCommandName?: string;\n } = {},\n ): void {\n const selection = options.selection ?? state.selection;\n const blockedReasons = evaluateWorkflowBlockedReasons(selection, command.type);\n if (blockedReasons.length > 0) {\n emit({\n type: \"command_blocked\",\n documentId: state.documentId,\n command: options.blockedCommandName ?? command.type,\n reasons: blockedReasons,\n });\n return;\n }\n\n const timestamp = command.origin?.timestamp ?? clock();\n const context = {\n timestamp,\n documentMode: getEffectiveDocumentMode(selection),\n defaultAuthorId: defaultAuthorId ?? undefined,\n } as const;\n const baseState = selection === state.selection\n ? state\n : {\n ...state,\n selection,\n };\n\n if (activeStory.kind === \"main\") {\n commit(executeEditorCommand(baseState, command, context));\n return;\n }\n\n const localState = createEditorState({\n documentId: state.documentId,\n sessionId,\n sourceLabel: state.sourceLabel,\n readOnly: state.readOnly,\n canonicalDocument: {\n ...state.document,\n content: {\n type: \"doc\",\n children: [...getStoryBlocks(state.document, activeStory)],\n },\n review: createSecondaryStoryLocalReviewState(state.document.review, activeStory),\n },\n compatibility: state.compatibility,\n warnings: state.warnings,\n fatalError: state.fatalError,\n });\n localState.selection = selection;\n const localTransaction = executeEditorCommand(localState, command, context);\n\n if (!localTransaction.markDirty) {\n notify(state, state, {\n nextState: state,\n mapping: createEmptyMapping(),\n effects: localTransaction.effects,\n historyBoundary: \"skip\",\n markDirty: false,\n });\n return;\n }\n\n const nextDocument = replaceStoryBlocks(\n state.document,\n activeStory,\n localTransaction.nextState.document.content.children,\n );\n const nextDocumentWithReview = {\n ...nextDocument,\n review: mergeSecondaryStoryReviewState(\n state.document.review,\n localTransaction.nextState.document.review,\n localTransaction.effects,\n activeStory,\n ),\n };\n const fullTransaction = executeEditorCommand(\n baseState,\n {\n type: \"document.replace\",\n document: nextDocumentWithReview,\n selection: localTransaction.nextState.selection,\n mapping: createEmptyMapping(),\n protectionSelection: selection,\n origin: command.origin,\n },\n context,\n );\n\n commit({\n ...fullTransaction,\n effects: mergeTransactionEffects(fullTransaction.effects, localTransaction.effects),\n });\n }\n\n function mergeTransactionEffects(\n base: EditorTransaction[\"effects\"],\n local: EditorTransaction[\"effects\"],\n ): EditorTransaction[\"effects\"] {\n return {\n warningsAdded: [...base.warningsAdded, ...local.warningsAdded],\n warningsCleared: [...base.warningsCleared, ...local.warningsCleared],\n commentAdded: base.commentAdded ?? local.commentAdded,\n commentResolved: base.commentResolved ?? local.commentResolved,\n commentReopened: base.commentReopened ?? local.commentReopened,\n commentReplyAdded: base.commentReplyAdded ?? local.commentReplyAdded,\n commentBodyEdited: base.commentBodyEdited ?? local.commentBodyEdited,\n changeAccepted: base.changeAccepted ?? local.changeAccepted,\n changeRejected: base.changeRejected ?? local.changeRejected,\n revisionAuthored: base.revisionAuthored ?? local.revisionAuthored,\n commandBlocked: base.commandBlocked ?? local.commandBlocked,\n };\n }\n\n function mergeSecondaryStoryReviewState(\n currentReview: EditorState[\"document\"][\"review\"],\n localReview: EditorState[\"document\"][\"review\"],\n effects: EditorTransaction[\"effects\"],\n storyTarget: EditorStoryTarget,\n ): EditorState[\"document\"][\"review\"] {\n const nextReview: EditorState[\"document\"][\"review\"] = {\n comments: { ...currentReview.comments },\n revisions: { ...currentReview.revisions },\n };\n\n const currentStoryRevisionIds = Object.values(currentReview.revisions)\n .filter((revision) => storyTargetsEqual(getRevisionStoryTarget(revision), storyTarget))\n .map((revision) => revision.changeId);\n for (const revisionId of currentStoryRevisionIds) {\n delete nextReview.revisions[revisionId];\n }\n for (const revision of Object.values(localReview.revisions)) {\n nextReview.revisions[revision.changeId] = {\n ...revision,\n metadata: {\n ...revision.metadata,\n storyTarget: createRevisionStoryTargetRecord(storyTarget),\n },\n };\n }\n\n if (effects.commentAdded) {\n const commentId = effects.commentAdded.commentId;\n const comment = localReview.comments[commentId];\n if (comment) {\n nextReview.comments[commentId] = comment;\n }\n }\n\n return nextReview;\n }\n\n function emit(event: DocumentRuntimeEvent): void {\n options.onEvent?.(event);\n for (const listener of eventListeners) {\n listener(event);\n }\n }\n\n function emitError(error: InternalEditorError): void {\n const nextState: EditorState = {\n ...state,\n phase: error.isFatal ? \"error\" : state.phase,\n fatalError: error.isFatal ? error : state.fatalError,\n };\n state = nextState;\n storySelections.set(storyTargetKey(activeStory), state.selection);\n cachedRenderSnapshot = refreshRenderSnapshot();\n const publicError = toPublicError(error);\n options.onError?.(publicError);\n emit({\n type: \"error\",\n documentId: state.documentId,\n error: publicError,\n });\n for (const listener of listeners) {\n listener();\n }\n }\n\n function switchActiveStory(target: EditorStoryTarget): void {\n const previousStory = activeStory;\n const previousSelection = state.selection;\n storySelections.set(storyTargetKey(previousStory), previousSelection);\n\n const restoredSelection =\n storySelections.get(storyTargetKey(target)) ?? createSelectionSnapshot(0, 0);\n activeStory = target;\n state = {\n ...state,\n selection: restoredSelection,\n };\n storySelections.set(storyTargetKey(target), restoredSelection);\n cachedRenderSnapshot = refreshRenderSnapshot();\n\n if (selectionChanged(previousSelection, restoredSelection)) {\n emit({\n type: \"selection_changed\",\n documentId: state.documentId,\n selection: toPublicSelectionSnapshot(restoredSelection, activeStory),\n });\n }\n\n emit({\n type: \"story_changed\",\n documentId: state.documentId,\n activeStory,\n });\n for (const listener of listeners) {\n listener();\n }\n }\n}\n\nfunction createSessionId(documentId: string, timestamp: string): string {\n return `session-${documentId}-${timestamp.replace(/[^0-9]/gu, \"\")}`;\n}\n\nfunction createOrigin(\n source: CommandOrigin[\"source\"],\n timestamp: string,\n): CommandOrigin {\n return {\n source,\n timestamp,\n };\n}\n\nfunction createEntityId(\n prefix: string,\n existing: Record<string, unknown>,\n timestamp: string,\n): string {\n let counter = Object.keys(existing).length;\n let nextId = `${prefix}-${timestamp.replace(/[^0-9]/gu, \"\")}-${counter}`;\n\n while (existing[nextId]) {\n counter += 1;\n nextId = `${prefix}-${timestamp.replace(/[^0-9]/gu, \"\")}-${counter}`;\n }\n\n return nextId;\n}\n\nfunction finalizeState(\n state: EditorState,\n markDirty: boolean,\n timestamp: string,\n baseRevision?: number,\n): EditorState {\n // Only increment revision on actual document mutations (markDirty=true).\n // Selection-only changes must not churn the revisionToken, which would\n // cause autosave/checkpoint dedup to treat cursor movement as new content.\n const revision = markDirty ? (baseRevision ?? state.revision) + 1 : state.revision;\n\n return {\n ...state,\n document: {\n ...state.document,\n updatedAt: markDirty ? timestamp : state.document.updatedAt,\n },\n selection: state.selection,\n revision,\n revisionToken: `${state.sessionId}:${revision}`,\n isDirty: state.isDirty || markDirty,\n };\n}\n\nfunction toRuntimeError(error: unknown): InternalEditorError {\n if (typeof error === \"object\" && error && \"message\" in error) {\n return {\n errorId: createSessionId(\"runtime-error\", new Date().toISOString()),\n code: \"internal_invariant\",\n isFatal: false,\n message: String((error as { message?: unknown }).message ?? \"Runtime error\"),\n source: \"runtime\",\n };\n }\n\n return {\n errorId: createSessionId(\"runtime-error\", new Date().toISOString()),\n code: \"internal_invariant\",\n isFatal: false,\n message: \"Runtime error\",\n source: \"runtime\",\n };\n}\n\nfunction toPublicDocumentStats(state: Pick<EditorState, \"document\">) {\n const stats = deriveDocumentStats(state);\n return {\n storyLength: stats.characterCount,\n commentCount: stats.commentCount,\n revisionCount: stats.revisionCount,\n opaqueFragmentCount: countOpaqueFragments(state.document.preservation.opaqueFragments),\n };\n}\n\nfunction toPublicSelectionSnapshot(\n selection: EditorState[\"selection\"],\n storyTarget?: EditorStoryTarget,\n): SelectionSnapshot {\n return {\n anchor: selection.anchor,\n head: selection.head,\n isCollapsed: selection.isCollapsed,\n activeRange: toPublicAnchorProjection(selection.activeRange),\n ...(storyTarget && storyTarget.kind !== \"main\" ? { storyTarget } : {}),\n };\n}\n\nfunction toPublicAnchorProjection(\n anchor: InternalEditorAnchorProjection,\n): EditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\":\n return {\n kind: \"range\",\n from: anchor.range.from,\n to: anchor.range.to,\n assoc: anchor.assoc,\n };\n case \"node\":\n return {\n kind: \"node\",\n at: anchor.at,\n assoc: anchor.assoc,\n };\n case \"detached\":\n return {\n kind: \"detached\",\n lastKnownRange: anchor.lastKnownRange,\n reason: anchor.reason,\n };\n }\n}\n\nfunction toInternalAnchorProjection(\n anchor: EditorAnchorProjection,\n): InternalEditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\":\n return createRangeAnchor(anchor.from, anchor.to, anchor.assoc);\n case \"node\":\n return createNodeAnchor(anchor.at, anchor.assoc);\n case \"detached\":\n return createDetachedAnchor(anchor.lastKnownRange, anchor.reason);\n }\n}\n\nfunction createSelectionFromPublicAnchor(\n anchor: EditorAnchorProjection,\n): import(\"../core/state/editor-state.ts\").SelectionSnapshot {\n switch (anchor.kind) {\n case \"range\":\n return createSelectionSnapshot(anchor.from, anchor.to);\n case \"node\":\n return createSelectionSnapshot(anchor.at, anchor.at);\n case \"detached\":\n return createSelectionSnapshot(\n anchor.lastKnownRange.from,\n anchor.lastKnownRange.to,\n );\n }\n}\n\nfunction toPublicCompatibilityReport(\n report: InternalCompatibilityReport,\n): CompatibilityReport {\n return {\n reportVersion: report.reportVersion,\n generatedAt: report.generatedAt,\n blockExport: report.blockExport,\n featureEntries: report.featureEntries.map((entry) =>\n toPublicCompatibilityFeatureEntry(entry),\n ),\n warnings: report.warnings.map((warning) => toPublicWarning(warning)),\n errors: report.errors.map((error) => toPublicError(error)),\n };\n}\n\nfunction toPublicCompatibilityFeatureEntry(\n entry: InternalCompatibilityFeatureEntry,\n) {\n return {\n ...entry,\n affectedAnchor: entry.affectedAnchor\n ? toPublicAnchorProjection(entry.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicWarning(warning: InternalEditorWarning): EditorWarning {\n return {\n ...warning,\n affectedAnchor: warning.affectedAnchor\n ? toPublicAnchorProjection(warning.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicError(error: InternalEditorError): EditorError {\n return { ...error };\n}\n\nfunction countOpaqueFragments(opaqueFragments: Record<string, unknown>): number {\n return Object.keys(opaqueFragments).length;\n}\n\nfunction createDerivedCompatibility(state: EditorState): InternalCompatibilityReport {\n const derived = buildCompatibilityReport({\n document: state.document,\n warnings: state.warnings,\n fatalError: state.fatalError,\n generatedAt: state.document.updatedAt,\n });\n\n return mergeCompatibilityReports([state.compatibility as never, derived as never], {\n generatedAt: state.document.updatedAt,\n blockExport: state.compatibility.blockExport || derived.blockExport,\n }) as InternalCompatibilityReport;\n}\n\nfunction toPublicCommentSidebarSnapshot(\n state: EditorState,\n): CommentSidebarSnapshot {\n const projection = createCommentSidebarProjection(\n createCommentStoreFromRuntimeComments(state.document.review.comments),\n state.runtime.activeCommentId,\n );\n\n return {\n activeCommentId: state.runtime.activeCommentId,\n openCommentIds: projection.openCommentIds,\n resolvedCommentIds: projection.resolvedCommentIds,\n detachedCommentIds: projection.detachedCommentIds,\n totalCount: projection.totalCount,\n threads: projection.threads.map((thread): CommentSidebarThreadSnapshot => {\n const sourceThread = state.document.review.comments[thread.commentId];\n const projectedEntries =\n sourceThread?.entries?.map((entry) => ({\n entryId: entry.entryId,\n authorId: entry.authorId,\n body: entry.body,\n createdAt: entry.createdAt,\n })) ??\n (sourceThread?.body\n ? [\n {\n entryId: `${thread.commentId}-entry-1`,\n authorId:\n sourceThread.authorId ?? sourceThread.createdBy ?? \"unknown\",\n body: sourceThread.body,\n createdAt: sourceThread.createdAt,\n },\n ]\n : []);\n\n return {\n commentId: thread.commentId,\n status: thread.status,\n anchor: toPublicAnchorProjection(\n sourceThread?.anchor ??\n createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n ),\n excerpt: thread.excerpt,\n entryCount: thread.entryCount,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n warningCount: thread.warningCount,\n anchorLabel: thread.anchorLabel,\n isActive: thread.isActive,\n resolvedAt: thread.resolvedAt,\n resolvedBy: thread.resolvedBy,\n entries: projectedEntries,\n };\n }),\n };\n}\n\nfunction toPublicTrackedChangesSnapshot(\n state: EditorState,\n): TrackedChangesSnapshot {\n const projection = createRevisionSidebarProjection(\n createRevisionStoreFromDocument(state),\n );\n const storyPlainTextCache = new Map<string, string>();\n\n return {\n pendingChangeIds: projection.activeRevisionIds,\n acceptedChangeIds: projection.acceptedRevisionIds,\n rejectedChangeIds: projection.rejectedRevisionIds,\n detachedChangeIds: projection.detachedRevisionIds,\n actionableChangeIds: projection.actionableRevisionIds,\n preserveOnlyChangeIds: projection.preserveOnlyRevisionIds,\n totalCount: projection.totalCount,\n revisions: projection.revisions.map((revision): TrackedChangeEntrySnapshot => {\n const sourceRevision = state.document.review.revisions[revision.revisionId];\n const storyTarget = getRevisionStoryTarget(sourceRevision);\n const preview = describeRevisionPreview(\n revision,\n sourceRevision?.anchor ??\n createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n getStoryPlainText(state.document, storyTarget, storyPlainTextCache),\n );\n\n return {\n revisionId: revision.revisionId,\n kind: revision.kind,\n label: revision.label,\n status: revision.status,\n actionability: revision.actionability,\n storyTarget,\n anchor: toPublicAnchorProjection(\n sourceRevision?.anchor ??\n createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n ),\n anchorLabel: revision.anchorLabel,\n createdAt: revision.createdAt,\n authorId: revision.authorId,\n warningCount: revision.warningCount,\n canAccept: revision.canAccept,\n canReject: revision.canReject,\n importedRevisionForm: sourceRevision?.metadata?.importedRevisionForm,\n preserveOnlyReason: revision.preserveOnlyReason,\n excerpt: preview.excerpt,\n detail: preview.detail,\n };\n }),\n };\n}\n\nfunction createRevisionStoreFromDocument(\n state: Pick<EditorState, \"document\">,\n): RevisionStore {\n return {\n version: \"revision-store/1\",\n revisions: Object.fromEntries(\n Object.values(state.document.review.revisions).map((revision) => [\n revision.changeId,\n {\n revisionId: revision.changeId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId ?? \"unknown\",\n createdAt: revision.createdAt,\n status:\n revision.status === \"open\"\n ? \"active\"\n : revision.status,\n warningIds: [...(revision.warningIds ?? [])],\n metadata: {\n source: revision.metadata?.source ?? \"runtime\",\n storyTarget: revision.metadata?.storyTarget,\n preserveOnlyReason: revision.metadata?.preserveOnlyReason,\n importedRevisionForm: revision.metadata?.importedRevisionForm,\n originalRevisionType: revision.metadata?.originalRevisionType,\n ooxmlRevisionId: revision.metadata?.ooxmlRevisionId,\n },\n },\n ]),\n ),\n };\n}\n\nfunction getRevisionStoryTarget(\n revision: EditorState[\"document\"][\"review\"][\"revisions\"][string] | undefined,\n): EditorStoryTarget {\n const storyTarget = revision?.metadata?.storyTarget;\n return storyTarget ? { ...storyTarget } : MAIN_STORY_TARGET;\n}\n\nfunction createSecondaryStoryLocalReviewState(\n review: EditorState[\"document\"][\"review\"],\n storyTarget: EditorStoryTarget,\n): EditorState[\"document\"][\"review\"] {\n return {\n comments: {},\n revisions: Object.fromEntries(\n Object.values(review.revisions)\n .filter((revision) => storyTargetsEqual(getRevisionStoryTarget(revision), storyTarget))\n .map((revision) => [\n revision.changeId,\n {\n ...revision,\n metadata: {\n ...revision.metadata,\n storyTarget: createRevisionStoryTargetRecord(storyTarget),\n },\n },\n ]),\n ),\n };\n}\n\nfunction getStoryPlainText(\n document: CanonicalDocumentEnvelope,\n storyTarget: EditorStoryTarget,\n cache: Map<string, string>,\n): string {\n const key = storyTargetKey(storyTarget);\n const cached = cache.get(key);\n if (cached !== undefined) {\n return cached;\n }\n const plainText = createEditorSurfaceSnapshot(\n document,\n createSelectionSnapshot(0, 0),\n storyTarget,\n ).plainText;\n cache.set(key, plainText);\n return plainText;\n}\n\nfunction createRevisionStoryTargetRecord(\n storyTarget: EditorStoryTarget,\n): NonNullable<NonNullable<EditorState[\"document\"][\"review\"][\"revisions\"][string][\"metadata\"]>[\"storyTarget\"]> {\n return { ...storyTarget };\n}\n\nfunction listBlockExportReasons(\n report: InternalCompatibilityReport,\n): string[] {\n return [\n ...report.featureEntries\n .filter((entry) => entry.featureClass === \"unsupported-fatal\")\n .map((entry) => entry.message),\n ...report.errors\n .filter((error) => error.isFatal)\n .map((error) => error.message),\n ];\n}\n\nfunction describeRevisionPreview(\n revision: ReturnType<typeof createRevisionSidebarProjection>[\"revisions\"][number],\n anchor: InternalEditorAnchorProjection,\n plainText: string,\n): { excerpt: string; detail: string } {\n const { from, to } = toAnchorBounds(anchor);\n const excerpt = summarizeRevisionExcerpt(plainText, from, to, revision.label);\n\n if (revision.actionability === \"preserve-only\") {\n return {\n excerpt,\n detail:\n revision.preserveOnlyReason ??\n \"Visible for review, but this change remains preserve-only in the current runtime.\",\n };\n }\n\n if (revision.status === \"accepted\") {\n return {\n excerpt,\n detail: \"Accepted in the live review runtime and retained here for audit visibility.\",\n };\n }\n\n if (revision.status === \"rejected\") {\n return {\n excerpt,\n detail: \"Rejected in the live review runtime and retained here for audit visibility.\",\n };\n }\n\n return {\n excerpt,\n detail:\n revision.kind === \"deletion\"\n ? \"Deleted content stays reviewable here until it is accepted or rejected.\"\n : \"Runtime-backed change. Review it here or reopen the anchor in the canvas.\",\n };\n}\n\nfunction toAnchorBounds(anchor: InternalEditorAnchorProjection): { from: number; to: number } {\n switch (anchor.kind) {\n case \"range\":\n return {\n from: Math.min(anchor.range.from, anchor.range.to),\n to: Math.max(anchor.range.from, anchor.range.to),\n };\n case \"node\":\n return {\n from: anchor.at,\n to: anchor.at + 1,\n };\n case \"detached\":\n return {\n from: Math.min(anchor.lastKnownRange.from, anchor.lastKnownRange.to),\n to: Math.max(anchor.lastKnownRange.from, anchor.lastKnownRange.to),\n };\n }\n}\n\nfunction summarizeRevisionExcerpt(\n plainText: string,\n from: number,\n to: number,\n fallback: string,\n): string {\n const normalizedFrom = Math.max(0, Math.min(from, plainText.length));\n const normalizedTo = Math.max(normalizedFrom, Math.min(to, plainText.length));\n const collapsed = plainText\n .slice(normalizedFrom, normalizedTo)\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!collapsed) {\n return fallback;\n }\n\n return collapsed.length > 96 ? `${collapsed.slice(0, 93)}...` : collapsed;\n}\n\nfunction isValidStoryTarget(\n state: EditorState,\n target: EditorStoryTarget,\n): boolean {\n if (target.kind === \"main\") return true;\n const subParts = state.document.subParts;\n if (!subParts) return false;\n\n switch (target.kind) {\n case \"header\":\n return Boolean(normalizeHeaderFooterTarget(state.document, target));\n case \"footer\":\n return Boolean(normalizeHeaderFooterTarget(state.document, target));\n case \"footnote\":\n return Boolean(subParts.footnoteCollection?.footnotes?.[target.noteId]);\n case \"endnote\":\n return Boolean(subParts.footnoteCollection?.endnotes?.[target.noteId]);\n }\n}\n\nfunction derivePageLayoutSnapshot(\n state: EditorState,\n activeStory: EditorStoryTarget,\n storySelections?: ReadonlyMap<string, EditorState[\"selection\"]>,\n): PageLayoutSnapshot | null {\n const subParts = state.document.subParts;\n const sections = buildResolvedSections(state.document);\n if (!subParts && sections.length === 0) {\n return null;\n }\n\n const activeSection = resolveActiveSection(\n state,\n activeStory,\n sections,\n storySelections,\n );\n return buildPageLayoutSnapshot(\n activeSection?.index ?? 0,\n activeSection?.properties ?? subParts?.finalSectionProperties,\n subParts,\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/** Commands that are safe in viewing mode (no document mutation). */\nconst NON_MUTATION_COMMANDS = new Set([\n \"selection.set\",\n \"runtime.set-read-only\",\n \"runtime.focus\",\n \"warning.add\",\n \"warning.clear\",\n \"comment.open\",\n]);\n\n/** Mutation commands that are not yet supported in suggesting mode. */\nconst SUGGESTING_UNSUPPORTED_COMMANDS = new Set([\n \"paragraph.split\",\n]);\n\nconst SUGGESTING_SECONDARY_STORY_UNSUPPORTED_COMMANDS = new Set([\n \"text.insert\",\n \"text.delete-backward\",\n \"text.delete-forward\",\n \"text.insert-tab\",\n \"text.insert-hard-break\",\n]);\n\nfunction isMutationCommand(command: EditorCommand): boolean {\n return !NON_MUTATION_COMMANDS.has(command.type);\n}\n\n// ── Field snapshot helpers ──────────────────────────────────────────────────\n\nfunction buildFieldSnapshot(document: CanonicalDocumentEnvelope): FieldSnapshot {\n const entries: FieldEntrySnapshot[] = [];\n let index = 0;\n for (const block of document.content.children) {\n index = collectFieldsFromBlock(block, entries, index);\n }\n index = collectFieldsFromSubParts(document.subParts, entries, index);\n const supportedCount = entries.filter((e) => e.supported).length;\n return {\n totalCount: entries.length,\n supportedCount,\n preserveOnlyCount: entries.length - supportedCount,\n fields: entries,\n };\n}\n\nfunction collectFieldsFromBlock(\n block: BlockNode,\n entries: FieldEntrySnapshot[],\n index: number,\n): number {\n if (block.type === \"paragraph\") {\n for (const child of block.children) {\n index = collectFieldsFromInline(child, entries, index);\n }\n } else if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const child of cell.children) {\n index = collectFieldsFromBlock(child, entries, index);\n }\n }\n }\n } else if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n for (const child of block.children) {\n index = collectFieldsFromBlock(child, entries, index);\n }\n }\n return index;\n}\n\nfunction collectFieldsFromInline(\n node: InlineNode,\n entries: FieldEntrySnapshot[],\n index: number,\n): number {\n if (node.type === \"field\") {\n const fieldFamily = node.fieldFamily ?? \"UNKNOWN\";\n const supported = isSupportedFieldFamily(fieldFamily);\n const displayText = extractFieldDisplayText(node);\n entries.push({\n index,\n fieldFamily,\n supported,\n instruction: node.instruction,\n fieldTarget: node.fieldTarget,\n refreshStatus: node.refreshStatus ?? (supported ? \"stale\" : \"preserve-only\"),\n displayText,\n });\n index++;\n // Also walk children — fields can contain nested fields\n for (const child of node.children) {\n index = collectFieldsFromInline(child, entries, index);\n }\n } else if (node.type === \"hyperlink\") {\n for (const child of node.children) {\n index = collectFieldsFromInline(child, entries, index);\n }\n }\n return index;\n}\n\nfunction extractFieldDisplayText(field: FieldNode): string {\n return flattenInlineDisplayText(field.children);\n}\n\nfunction flattenInlineDisplayText(children: readonly InlineNode[]): string {\n return children\n .map((child) => {\n switch (child.type) {\n case \"text\":\n return child.text;\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n case \"column_break\":\n return \"\\n\";\n case \"hyperlink\":\n case \"field\":\n return flattenInlineDisplayText(child.children);\n case \"footnote_ref\":\n return child.noteId;\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\nfunction refreshDocumentFields(\n document: CanonicalDocumentEnvelope,\n selectionHead: number,\n activeStory: EditorStoryTarget,\n options?: UpdateFieldsOptions,\n): {\n document: CanonicalDocumentEnvelope;\n updatedCount: number;\n changed: boolean;\n protectionSelection?: import(\"../core/state/editor-state.ts\").SelectionSnapshot;\n} {\n const supportedOnly = options?.supportedOnly ?? true;\n const bookmarkMap = buildBookmarkNameMap(document);\n const paragraphs = collectParagraphContexts(document.content.children);\n const navigation = createDocumentNavigationSnapshot(document, selectionHead, activeStory);\n let updatedCount = 0;\n let changed = false;\n let changedFrom: number | undefined;\n let changedTo: number | undefined;\n\n const nextChildren = refreshBlocksWithCursor(document.content.children, (field, range) => {\n if (!field.fieldFamily || !isSupportedFieldFamily(field.fieldFamily)) {\n return field;\n }\n if (supportedOnly && field.fieldFamily === \"TOC\") {\n return field;\n }\n const display = resolveSupportedFieldDisplay(\n field,\n document,\n bookmarkMap,\n paragraphs,\n navigation,\n );\n if (!display) {\n return field;\n }\n updatedCount += 1;\n const nextField: FieldNode = {\n ...field,\n children: buildInlineNodesFromDisplayText(display.displayText),\n refreshStatus: display.refreshStatus,\n };\n if (\n nextField.refreshStatus !== field.refreshStatus ||\n flattenInlineDisplayText(nextField.children) !== flattenInlineDisplayText(field.children)\n ) {\n changed = true;\n changedFrom = changedFrom === undefined ? range.from : Math.min(changedFrom, range.from);\n changedTo = changedTo === undefined ? range.to : Math.max(changedTo, range.to);\n }\n return nextField;\n }).blocks;\n if (!changed) {\n return { document, updatedCount, changed: false };\n }\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n ...document.content,\n children: nextChildren,\n },\n };\n const nextRegistry = buildFieldRegistry({\n content: nextDocument.content,\n styles: nextDocument.styles,\n subParts: nextDocument.subParts,\n });\n nextDocument.fieldRegistry = nextRegistry;\n let protectionSelection:\n | import(\"../core/state/editor-state.ts\").SelectionSnapshot\n | undefined;\n if (changedFrom !== undefined && changedTo !== undefined) {\n protectionSelection = createSelectionSnapshot(changedFrom, changedTo);\n }\n return {\n document: nextDocument,\n updatedCount,\n changed: true,\n ...(protectionSelection ? { protectionSelection } : {}),\n };\n}\n\nfunction refreshDocumentTableOfContents(\n document: CanonicalDocumentEnvelope,\n selectionHead: number,\n activeStory: EditorStoryTarget,\n options?: TocRefreshOptions,\n): {\n document: CanonicalDocumentEnvelope;\n result: TocRefreshResult;\n changed: boolean;\n protectionSelection?: import(\"../core/state/editor-state.ts\").SelectionSnapshot;\n} {\n const navigation = createDocumentNavigationSnapshot(document, selectionHead, activeStory);\n let changed = false;\n let resultEntries: Array<{ level: number; text: string; pageIndex: number }> = [];\n let changedFrom: number | undefined;\n let changedTo: number | undefined;\n const nextChildren = refreshBlocksWithCursor(document.content.children, (field, range) => {\n if (field.fieldFamily !== \"TOC\") {\n return field;\n }\n const levelRange = options?.maxLevel\n ? { from: 1, to: options.maxLevel }\n : parseTocLevelRange(field.instruction);\n const entries = navigation.headings\n .filter((heading) => heading.level >= levelRange.from && heading.level <= levelRange.to)\n .map((heading) => ({\n level: heading.level,\n text: heading.text,\n pageIndex: heading.pageIndex,\n }));\n if (resultEntries.length === 0) {\n resultEntries = entries;\n }\n const nextField: FieldNode = {\n ...field,\n children: buildTocInlineNodes(entries),\n refreshStatus: \"current\",\n };\n if (flattenInlineDisplayText(nextField.children) !== flattenInlineDisplayText(field.children)) {\n changed = true;\n changedFrom = changedFrom === undefined ? range.from : Math.min(changedFrom, range.from);\n changedTo = changedTo === undefined ? range.to : Math.max(changedTo, range.to);\n }\n return nextField;\n }).blocks;\n if (!changed) {\n return {\n document,\n result: { entryCount: resultEntries.length, entries: resultEntries },\n changed: false,\n };\n }\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n ...document.content,\n children: nextChildren,\n },\n };\n const nextRegistry = buildFieldRegistry({\n content: nextDocument.content,\n styles: nextDocument.styles,\n subParts: nextDocument.subParts,\n });\n nextDocument.fieldRegistry = nextRegistry.tocStructure\n ? {\n ...nextRegistry,\n tocStructure: {\n ...nextRegistry.tocStructure,\n status: \"current\",\n },\n }\n : nextRegistry;\n let protectionSelection:\n | import(\"../core/state/editor-state.ts\").SelectionSnapshot\n | undefined;\n if (changedFrom !== undefined && changedTo !== undefined) {\n protectionSelection = createSelectionSnapshot(changedFrom, changedTo);\n }\n\n return {\n document: nextDocument,\n result: { entryCount: resultEntries.length, entries: resultEntries },\n changed: true,\n ...(protectionSelection ? { protectionSelection } : {}),\n };\n}\n\nfunction refreshBlocksWithCursor(\n blocks: readonly BlockNode[],\n visitField: (field: FieldNode, range: { from: number; to: number }) => FieldNode,\n cursor = 0,\n previousParagraph = false,\n): {\n blocks: BlockNode[];\n cursor: number;\n previousParagraph: boolean;\n} {\n const nextBlocks = blocks.map((block) => {\n if (block.type === \"paragraph\") {\n const paragraphStart = previousParagraph ? cursor + 1 : cursor;\n const refreshedChildren = refreshInlineNodesWithCursor(\n block.children,\n visitField,\n paragraphStart,\n );\n cursor = paragraphStart + refreshedChildren.cursor;\n previousParagraph = true;\n return {\n ...block,\n children: refreshedChildren.nodes,\n };\n }\n if (block.type === \"table\") {\n cursor += 1;\n previousParagraph = false;\n return {\n ...block,\n rows: block.rows.map((row) => ({\n ...row,\n cells: row.cells.map((cell) => ({\n ...cell,\n children: (() => {\n const refreshed = refreshBlocksWithCursor(cell.children, visitField, cursor, false);\n cursor = refreshed.cursor;\n return refreshed.blocks;\n })(),\n })),\n })),\n };\n }\n if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n const refreshed = refreshBlocksWithCursor(\n block.children,\n visitField,\n cursor,\n previousParagraph,\n );\n cursor = refreshed.cursor;\n previousParagraph = refreshed.previousParagraph;\n return {\n ...block,\n children: refreshed.blocks,\n };\n }\n cursor += 1;\n previousParagraph = false;\n return block;\n });\n return { blocks: nextBlocks, cursor, previousParagraph };\n}\n\nfunction refreshInlineNodesWithCursor(\n nodes: readonly InlineNode[],\n visitField: (field: FieldNode, range: { from: number; to: number }) => FieldNode,\n cursor = 0,\n): {\n nodes: InlineNode[];\n cursor: number;\n} {\n const nextNodes = nodes.map((node) => {\n if (node.type === \"field\") {\n const fieldStart = cursor;\n const refreshedChildren = refreshInlineNodesWithCursor(node.children, visitField, cursor);\n const fieldLength = measureInlineNodes(node.children);\n cursor = fieldStart + fieldLength;\n return visitField({\n ...node,\n children: refreshedChildren.nodes,\n }, {\n from: fieldStart,\n to: fieldStart + fieldLength,\n });\n }\n if (node.type === \"hyperlink\") {\n cursor += measureInlineNodes(node.children);\n return {\n ...node,\n // Hyperlinks only contain text-like children in the canonical model.\n children: [...node.children],\n };\n }\n cursor += measureInlineNode(node);\n return node;\n });\n return { nodes: nextNodes, cursor };\n}\n\nfunction buildInlineNodesFromDisplayText(text: string): InlineNode[] {\n if (text.length === 0) {\n return [];\n }\n const children: InlineNode[] = [];\n let buffer = \"\";\n const flushBuffer = () => {\n if (buffer.length > 0) {\n children.push({ type: \"text\", text: buffer });\n buffer = \"\";\n }\n };\n for (const character of text) {\n if (character === \"\\t\") {\n flushBuffer();\n children.push({ type: \"tab\" });\n continue;\n }\n if (character === \"\\n\") {\n flushBuffer();\n children.push({ type: \"hard_break\" });\n continue;\n }\n buffer += character;\n }\n flushBuffer();\n return children;\n}\n\nfunction buildTocInlineNodes(\n entries: ReadonlyArray<{ level: number; text: string; pageIndex: number }>,\n): InlineNode[] {\n const children: InlineNode[] = [];\n entries.forEach((entry, index) => {\n children.push({ type: \"text\", text: entry.text });\n children.push({ type: \"tab\" });\n children.push({ type: \"text\", text: String(entry.pageIndex + 1) });\n if (index < entries.length - 1) {\n children.push({ type: \"hard_break\" });\n }\n });\n return children;\n}\n\nfunction collectFieldsFromSubParts(\n subParts: SubPartsCatalog | undefined,\n entries: FieldEntrySnapshot[],\n index: number,\n): number {\n if (!subParts) {\n return index;\n }\n let nextIndex = index;\n for (const header of subParts.headers ?? []) {\n for (const block of header.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n for (const footer of subParts.footers ?? []) {\n for (const block of footer.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n if (subParts.footnoteCollection) {\n for (const note of Object.values(subParts.footnoteCollection.footnotes)) {\n for (const block of note.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n for (const note of Object.values(subParts.footnoteCollection.endnotes)) {\n for (const block of note.blocks) {\n nextIndex = collectFieldsFromBlock(block, entries, nextIndex);\n }\n }\n }\n return nextIndex;\n}\n\nfunction resolveSupportedFieldDisplay(\n field: FieldNode,\n document: CanonicalDocumentEnvelope,\n bookmarkMap: Map<string, { bookmarkId: string; paragraphIndex: number }>,\n paragraphs: readonly ParagraphContext[],\n navigation: DocumentNavigationSnapshot,\n): { displayText: string; refreshStatus: FieldRefreshStatus } | undefined {\n if (!field.fieldFamily || !isSupportedFieldFamily(field.fieldFamily)) {\n return undefined;\n }\n if (!field.fieldTarget) {\n return field.fieldFamily === \"TOC\"\n ? undefined\n : { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n if (field.fieldFamily === \"REF\") {\n const result = resolveRefFieldText(document, bookmarkMap, field.fieldTarget);\n return result\n ? { displayText: result.text, refreshStatus: result.refreshStatus }\n : { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n const bookmark = bookmarkMap.get(field.fieldTarget);\n if (!bookmark) {\n return { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n if (field.fieldFamily === \"PAGEREF\") {\n const paragraph = paragraphs[bookmark.paragraphIndex];\n if (!paragraph) {\n return { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n const pageIndex = findPageForOffset(navigation.pages, paragraph.startOffset);\n return { displayText: String(pageIndex + 1), refreshStatus: \"current\" };\n }\n if (field.fieldFamily === \"NOTEREF\") {\n const paragraph = paragraphs[bookmark.paragraphIndex]?.paragraph;\n if (!paragraph) {\n return { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n const noteText = resolveNoteReferenceText(paragraph, bookmark.bookmarkId);\n return noteText\n ? { displayText: noteText, refreshStatus: \"current\" }\n : { displayText: \"\", refreshStatus: \"unresolvable\" };\n }\n return undefined;\n}\n\ninterface ParagraphContext {\n paragraph: ParagraphNode;\n startOffset: number;\n}\n\nfunction collectParagraphContexts(blocks: readonly BlockNode[]): ParagraphContext[] {\n const paragraphs: ParagraphContext[] = [];\n collectParagraphContextsFromBlocks(blocks, paragraphs, 0, false);\n return paragraphs;\n}\n\nfunction collectParagraphContextsFromBlocks(\n blocks: readonly BlockNode[],\n paragraphs: ParagraphContext[],\n cursor: number,\n previousParagraph: boolean,\n): { cursor: number; previousParagraph: boolean } {\n let nextCursor = cursor;\n let nextPreviousParagraph = previousParagraph;\n for (const block of blocks) {\n if (block.type === \"paragraph\") {\n if (nextPreviousParagraph) {\n nextCursor += 1;\n }\n paragraphs.push({ paragraph: block, startOffset: nextCursor });\n nextCursor += measureInlineNodes(block.children);\n nextPreviousParagraph = true;\n continue;\n }\n if (block.type === \"table\") {\n nextCursor += 1;\n nextPreviousParagraph = false;\n for (const row of block.rows) {\n for (const cell of row.cells) {\n const result = collectParagraphContextsFromBlocks(\n cell.children,\n paragraphs,\n nextCursor,\n false,\n );\n nextCursor = result.cursor;\n }\n }\n continue;\n }\n if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n const result = collectParagraphContextsFromBlocks(\n block.children,\n paragraphs,\n nextCursor,\n nextPreviousParagraph,\n );\n nextCursor = result.cursor;\n nextPreviousParagraph = result.previousParagraph;\n continue;\n }\n nextCursor += 1;\n nextPreviousParagraph = false;\n }\n return { cursor: nextCursor, previousParagraph: nextPreviousParagraph };\n}\n\nfunction measureInlineNodes(nodes: readonly InlineNode[]): number {\n return nodes.reduce((size, node) => size + measureInlineNode(node), 0);\n}\n\nfunction measureInlineNode(node: InlineNode): number {\n switch (node.type) {\n case \"text\":\n return node.text.length;\n case \"tab\":\n case \"hard_break\":\n case \"column_break\":\n case \"footnote_ref\":\n case \"image\":\n case \"opaque_inline\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n return 1;\n case \"hyperlink\":\n case \"field\":\n return measureInlineNodes(node.children);\n default:\n return 1;\n }\n}\n\nfunction resolveNoteReferenceText(paragraph: ParagraphNode, bookmarkId: string): string | undefined {\n let inside = false;\n let sawBoundary = false;\n for (const child of paragraph.children) {\n if (child.type === \"bookmark_start\" && child.bookmarkId === bookmarkId) {\n inside = true;\n sawBoundary = true;\n continue;\n }\n if (child.type === \"bookmark_end\" && child.bookmarkId === bookmarkId) {\n break;\n }\n if (!inside) {\n continue;\n }\n if (child.type === \"footnote_ref\") {\n return child.noteId;\n }\n }\n return sawBoundary ? undefined : undefined;\n}\n\nfunction getCommandSelection(\n command: EditorCommand,\n fallbackSelection: import(\"../core/state/editor-state.ts\").SelectionSnapshot,\n): import(\"../core/state/editor-state.ts\").SelectionSnapshot {\n if (\"protectionSelection\" in command && command.protectionSelection) {\n return command.protectionSelection;\n }\n if (\"selection\" in command && command.selection) {\n return command.selection;\n }\n return fallbackSelection;\n}\n\nfunction isBlockedByProtection(\n protection: ProtectionSnapshot,\n selection: import(\"../core/state/editor-state.ts\").SelectionSnapshot,\n): boolean {\n const enforcedRanges = protection.ranges.filter(\n (range): range is typeof range & { start: number; end: number } =>\n range.enforced && typeof range.start === \"number\" && typeof range.end === \"number\",\n );\n if (enforcedRanges.length === 0) {\n return false;\n }\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n return !enforcedRanges.some((range) =>\n from >= range.start && to <= range.end,\n );\n}\n\nfunction remapProtectionSnapshot(\n protection: ProtectionSnapshot,\n mapping: import(\"../core/selection/mapping.ts\").TransactionMapping,\n): ProtectionSnapshot {\n if (mapping.steps.length === 0 || protection.ranges.length === 0) {\n return protection;\n }\n let changed = false;\n const nextRanges = protection.ranges.map((range) => {\n if (\n !range.enforced ||\n typeof range.start !== \"number\" ||\n typeof range.end !== \"number\"\n ) {\n return range;\n }\n const mapped = mapRange(\n { from: range.start, to: range.end },\n { start: -1, end: 1 },\n mapping,\n );\n if (mapped.kind === \"detached\") {\n changed = true;\n return {\n ...range,\n start: undefined,\n end: undefined,\n enforced: false,\n enforcementReason:\n \"preserve-only: permission range could not be remapped after runtime edits\",\n };\n }\n if (mapped.range.from !== range.start || mapped.range.to !== range.end) {\n changed = true;\n return {\n ...range,\n start: mapped.range.from,\n end: mapped.range.to,\n };\n }\n return range;\n });\n if (!changed) {\n return protection;\n }\n return {\n ...protection,\n ranges: nextRanges,\n enforcedRangeCount: nextRanges.filter((range) => range.enforced).length,\n preservedRangeCount: nextRanges.filter((range) => !range.enforced).length,\n };\n}\n","import type { EditorStoryTarget } from \"../../api/public-types\";\n\nexport type Position = number;\nexport type Assoc = -1 | 1;\n\nexport interface DocRange {\n from: Position;\n to: Position;\n}\n\nexport interface BoundaryAssoc {\n start: Assoc;\n end: Assoc;\n}\n\nexport interface RangeAnchor {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n}\n\nexport interface NodeAnchor {\n kind: \"node\";\n at: Position;\n assoc: Assoc;\n}\n\nexport interface DetachedAnchor {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n}\n\nexport type EditorAnchorProjection = RangeAnchor | NodeAnchor | DetachedAnchor;\n\nexport interface MappingStep {\n from: Position;\n to: Position;\n insertSize: number;\n}\n\nexport interface MappingResult {\n position: Position;\n deleted: boolean;\n}\n\nexport interface TransactionMapping {\n steps: MappingStep[];\n metadata?: {\n invalidatesStructures?: boolean;\n affectsComments?: boolean;\n affectsRevisions?: boolean;\n affectsOpaqueFragments?: boolean;\n [key: string]: unknown;\n };\n}\n\nexport const DEFAULT_BOUNDARY_ASSOC: BoundaryAssoc = {\n start: 1,\n end: -1,\n};\n\nexport function createRangeAnchor(\n from: Position,\n to = from,\n assoc: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC,\n): RangeAnchor {\n return {\n kind: \"range\",\n range: normalizeRange({ from, to }),\n assoc,\n };\n}\n\nexport function createNodeAnchor(at: Position, assoc: Assoc = 1): NodeAnchor {\n return {\n kind: \"node\",\n at,\n assoc,\n };\n}\n\nexport function createDetachedAnchor(\n lastKnownRange: DocRange,\n reason: DetachedAnchor[\"reason\"],\n): DetachedAnchor {\n return {\n kind: \"detached\",\n lastKnownRange: normalizeRange(lastKnownRange),\n reason,\n };\n}\n\nexport function createEmptyMapping(): TransactionMapping {\n return {\n steps: [],\n };\n}\n\nexport function normalizeRange(range: DocRange): DocRange {\n return range.from <= range.to\n ? { from: range.from, to: range.to }\n : { from: range.to, to: range.from };\n}\n\nexport function getEffectiveRange(anchor: EditorAnchorProjection): DocRange {\n if (anchor.kind === \"range\") {\n return anchor.range;\n }\n if (anchor.kind === \"node\") {\n return { from: anchor.at, to: anchor.at };\n }\n return anchor.lastKnownRange;\n}\n\nexport function mapPosition(\n position: Position,\n assoc: Assoc,\n mapping: TransactionMapping,\n): MappingResult {\n let mappedPosition = position;\n let deleted = false;\n\n for (const step of mapping.steps) {\n const next = mapPositionThroughStep(mappedPosition, assoc, step);\n mappedPosition = next.position;\n deleted = deleted || next.deleted;\n }\n\n return {\n position: mappedPosition,\n deleted,\n };\n}\n\nexport function mapAnchor(\n anchor: EditorAnchorProjection,\n mapping: TransactionMapping,\n): EditorAnchorProjection {\n if (anchor.kind === \"detached\") {\n return anchor;\n }\n\n if (anchor.kind === \"node\") {\n const mapped = mapPosition(anchor.at, anchor.assoc, mapping);\n\n if (mapped.deleted) {\n return createDetachedAnchor(\n { from: anchor.at, to: anchor.at + 1 },\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createNodeAnchor(mapped.position, anchor.assoc);\n }\n\n const from = mapPosition(anchor.range.from, anchor.assoc.start, mapping);\n const to = mapPosition(anchor.range.to, anchor.assoc.end, mapping);\n const mappedRange = normalizeRange({ from: from.position, to: to.position });\n\n if (from.deleted && to.deleted && mappedRange.from === mappedRange.to) {\n return createDetachedAnchor(\n anchor.range,\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createRangeAnchor(mappedRange.from, mappedRange.to, anchor.assoc);\n}\n\nexport function mapRange(\n range: DocRange,\n assoc: BoundaryAssoc,\n mapping: TransactionMapping,\n): RangeAnchor | DetachedAnchor {\n const mapped = mapAnchor(createRangeAnchor(range.from, range.to, assoc), mapping);\n return mapped.kind === \"node\" ? createRangeAnchor(mapped.at, mapped.at, assoc) : mapped;\n}\n\nexport function areAnchorsEqual(\n left: EditorAnchorProjection,\n right: EditorAnchorProjection,\n): boolean {\n if (left.kind !== right.kind) {\n return false;\n }\n\n if (left.kind === \"detached\" && right.kind === \"detached\") {\n return (\n left.reason === right.reason &&\n left.lastKnownRange.from === right.lastKnownRange.from &&\n left.lastKnownRange.to === right.lastKnownRange.to\n );\n }\n\n if (left.kind === \"node\" && right.kind === \"node\") {\n return left.at === right.at && left.assoc === right.assoc;\n }\n\n if (left.kind === \"range\" && right.kind === \"range\") {\n return (\n left.range.from === right.range.from &&\n left.range.to === right.range.to &&\n left.assoc.start === right.assoc.start &&\n left.assoc.end === right.assoc.end\n );\n }\n\n return false;\n}\n\nexport function storyTargetsEqual(\n left: EditorStoryTarget | undefined,\n right: EditorStoryTarget | undefined,\n): boolean {\n if (left === right) return true;\n if (!left || !right) return left === right;\n if (left.kind !== right.kind) return false;\n if (left.kind === \"main\") return true;\n if (left.kind === \"header\" && right.kind === \"header\") {\n return (\n left.relationshipId === right.relationshipId &&\n left.variant === right.variant &&\n (left.sectionIndex === undefined ||\n right.sectionIndex === undefined\n ? true\n : left.sectionIndex === right.sectionIndex)\n );\n }\n if (left.kind === \"footer\" && right.kind === \"footer\") {\n return (\n left.relationshipId === right.relationshipId &&\n left.variant === right.variant &&\n (left.sectionIndex === undefined ||\n right.sectionIndex === undefined\n ? true\n : left.sectionIndex === right.sectionIndex)\n );\n }\n if (left.kind === \"footnote\" && right.kind === \"footnote\") {\n return left.noteId === right.noteId;\n }\n if (left.kind === \"endnote\" && right.kind === \"endnote\") {\n return left.noteId === right.noteId;\n }\n return false;\n}\n\nexport const MAIN_STORY_TARGET: EditorStoryTarget = { kind: \"main\" };\n\nfunction mapPositionThroughStep(\n position: Position,\n assoc: Assoc,\n step: MappingStep,\n): MappingResult {\n if (position < step.from) {\n return { position, deleted: false };\n }\n\n if (position > step.to) {\n return {\n position: position + step.insertSize - (step.to - step.from),\n deleted: false,\n };\n }\n\n if (position === step.from) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n if (position === step.to) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: true,\n };\n}\n","export const CDS_SCHEMA_VERSION = \"cds/1.0.0\" as const;\nexport const LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION =\n \"persisted-editor-snapshot/1\" as const;\nexport const PERSISTED_EDITOR_SNAPSHOT_VERSION =\n \"persisted-editor-snapshot/2\" as const;\nexport const COMPATIBILITY_REPORT_VERSION = \"compatibility-report/1\" as const;\n\nexport type CDS_SchemaVersion = typeof CDS_SCHEMA_VERSION;\nexport type PersistedEditorSnapshotVersion =\n | typeof LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION\n | typeof PERSISTED_EDITOR_SNAPSHOT_VERSION;\nexport type CompatibilityReportVersion = typeof COMPATIBILITY_REPORT_VERSION;\n\nexport type Id = string;\nexport type UUID = string;\nexport type ISO8601DateTime = string;\nexport type Base64 = string;\nexport type PartName = string;\nexport type RelationshipId = string;\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\n\nexport interface JsonObject {\n [key: string]: JsonValue | undefined;\n}\n\nexport interface ModelValidationIssue {\n path: string;\n message: string;\n}\n\nexport class ModelValidationError extends Error {\n readonly issues: readonly ModelValidationIssue[];\n\n constructor(message: string, issues: readonly ModelValidationIssue[]) {\n super(message);\n this.name = \"ModelValidationError\";\n this.issues = issues;\n }\n}\n\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst ISO_8601_UTC_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/;\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isUuid(value: unknown): value is UUID {\n return typeof value === \"string\" && UUID_PATTERN.test(value);\n}\n\nexport function isIso8601UtcTimestamp(\n value: unknown,\n): value is ISO8601DateTime {\n return (\n typeof value === \"string\" &&\n ISO_8601_UTC_PATTERN.test(value) &&\n !Number.isNaN(Date.parse(value))\n );\n}\n\nexport function asPlainObject(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): Record<string, unknown> | null {\n if (!isPlainObject(value)) {\n issues.push({ path, message: \"Expected a plain object.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectString(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n if (!isNonEmptyString(value)) {\n issues.push({ path, message: \"Expected a non-empty string.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectStringAllowEmpty(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n if (typeof value !== \"string\") {\n issues.push({ path, message: \"Expected a string.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectExactString<T extends string>(\n value: unknown,\n expected: T,\n path: string,\n issues: ModelValidationIssue[],\n): T | null {\n if (value !== expected) {\n issues.push({\n path,\n message: `Expected ${JSON.stringify(expected)}.`,\n });\n return null;\n }\n\n return expected;\n}\n\nexport function expectIso8601UtcTimestamp(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): ISO8601DateTime | null {\n if (!isIso8601UtcTimestamp(value)) {\n issues.push({\n path,\n message: \"Expected an ISO 8601 UTC timestamp string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function expectUuid(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): UUID | null {\n if (!isUuid(value)) {\n issues.push({\n path,\n message: \"Expected an RFC 4122 UUID string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function sortRecordKeys<T>(\n record: Record<string, T>,\n): Array<[string, T]> {\n return Object.entries(record).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n}\n\nexport function assertValid(\n issues: readonly ModelValidationIssue[],\n message: string,\n): void {\n if (issues.length > 0) {\n throw new ModelValidationError(message, issues);\n }\n}\n\nfunction toStableJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => toStableJsonValue(item));\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(\"Cannot serialize non-JSON value.\");\n }\n\n const sortedEntries = sortRecordKeys(value).filter(\n ([, entryValue]) => entryValue !== undefined,\n );\n const result: JsonObject = {};\n\n for (const [key, entryValue] of sortedEntries) {\n result[key] = toStableJsonValue(entryValue);\n }\n\n return result;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(toStableJsonValue(value));\n}\n","import {\n CDS_SCHEMA_VERSION,\n type ISO8601DateTime,\n type ModelValidationIssue,\n type UUID,\n asPlainObject,\n assertValid,\n expectExactString,\n expectIso8601UtcTimestamp,\n expectString,\n expectStringAllowEmpty,\n expectUuid,\n stableStringify,\n} from \"./cds-1.0.0.ts\";\n\nconst CANONICAL_DOCUMENT_TOP_LEVEL_KEYS = [\n \"schemaVersion\",\n \"docId\",\n \"createdAt\",\n \"updatedAt\",\n \"metadata\",\n \"styles\",\n \"numbering\",\n \"media\",\n \"content\",\n \"review\",\n \"preservation\",\n \"diagnostics\",\n] as const;\n\nconst CANONICAL_DOCUMENT_OPTIONAL_KEYS = [\"subParts\", \"fieldRegistry\"] as const;\n\nconst ID_PATTERNS = {\n styleId: /^[A-Za-z_][A-Za-z0-9._-]{0,127}$/,\n abstractNumberingId: /^abstract-num:[A-Za-z0-9._-]{1,120}$/,\n numberingInstanceId: /^num:[A-Za-z0-9._-]{1,120}$/,\n mediaId: /^media:[A-Za-z0-9._/-]{1,120}$/,\n commentId:\n /^(?:comment:[A-Za-z0-9._-]{1,120}|comment-[A-Za-z0-9._-]{1,120}|[0-9]{1,18})$/,\n revisionId:\n /^(?:revision:[A-Za-z0-9._-]{1,120}|change-[A-Za-z0-9._-]{1,120})$/,\n fragmentId: /^fragment:[A-Za-z0-9._-]{1,120}$/,\n warningId: /^warning:[A-Za-z0-9._:-]{1,120}$/,\n diagnosticId: /^diagnostic:[A-Za-z0-9._-]{1,120}$/,\n packagePartName: /^\\/[A-Za-z0-9_.\\-\\/]+\\.[A-Za-z0-9]+$/,\n relationshipId: /^rId[A-Za-z0-9._-]{1,120}$/,\n} as const;\n\ntype StableIdDomain = keyof typeof ID_PATTERNS;\n\nexport interface CanonicalDocument {\n schemaVersion: typeof CDS_SCHEMA_VERSION;\n docId: UUID;\n createdAt: ISO8601DateTime;\n updatedAt: ISO8601DateTime;\n metadata: DocumentMetadata;\n styles: StylesCatalog;\n numbering: NumberingCatalog;\n media: MediaCatalog;\n content: DocumentRootNode;\n review: ReviewStore;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n subParts?: SubPartsCatalog;\n /** Package-backed field registry for supported field families. */\n fieldRegistry?: FieldRegistry;\n}\n\nexport interface DocumentMetadata {\n title?: string;\n subject?: string;\n description?: string;\n language?: string;\n keywords?: string[];\n category?: string;\n importMode?: string;\n customProperties: Record<string, string>;\n}\n\nexport interface StylesCatalog {\n paragraphs: Record<string, ParagraphStyleDefinition>;\n characters: Record<string, CharacterStyleDefinition>;\n tables: Record<string, TableStyleDefinition>;\n latentStyles?: Record<string, LatentStyleDefinition>;\n fromPackage?: boolean;\n}\n\nexport interface ParagraphStyleDefinition {\n styleId: string;\n basedOn?: string;\n nextStyle?: string;\n outlineLevel?: number;\n displayName: string;\n kind: \"paragraph\";\n isDefault: boolean;\n}\n\nexport interface CharacterStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"character\";\n isDefault: boolean;\n}\n\nexport interface TableStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"table\";\n isDefault: boolean;\n}\n\nexport interface LatentStyleDefinition {\n name: string;\n locked?: boolean;\n semiHidden?: boolean;\n unhideWhenUsed?: boolean;\n qFormat?: boolean;\n uiPriority?: number;\n}\n\nexport interface NumberingCatalog {\n abstractDefinitions: Record<string, AbstractNumberingDefinition>;\n instances: Record<string, NumberingInstance>;\n}\n\nexport interface AbstractNumberingDefinition {\n abstractNumberingId: string;\n levels: NumberingLevelDefinition[];\n}\n\nexport interface NumberingLevelDefinition {\n level: number;\n format: string;\n text: string;\n startAt?: number;\n paragraphStyleId?: string;\n isLegalNumbering?: boolean;\n suffix?: \"tab\" | \"space\" | \"nothing\";\n}\n\nexport interface NumberingInstance {\n numberingInstanceId: string;\n abstractNumberingId: string;\n overrides: NumberingLevelOverride[];\n}\n\nexport interface NumberingLevelOverride {\n level: number;\n startAt?: number;\n}\n\nexport interface MediaCatalog {\n items: Record<string, MediaItem>;\n}\n\nexport interface MediaItem {\n mediaId: string;\n contentType: string;\n filename: string;\n relationshipId?: string;\n packagePartName: string;\n altText?: string;\n display?: \"inline\" | \"floating\";\n widthEmu?: number;\n heightEmu?: number;\n}\n\n// ---- Sub-part canonical types ----\n\nexport type HeaderFooterVariant = \"default\" | \"first\" | \"even\";\n\nexport interface HeaderDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n sectionIndex?: number;\n}\n\nexport interface FooterDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n sectionIndex?: number;\n}\n\nexport interface FootnoteDefinition {\n noteId: string;\n kind: \"footnote\" | \"endnote\";\n blocks: BlockNode[];\n}\n\nexport interface FootnoteCollection {\n footnotes: Record<string, FootnoteDefinition>;\n endnotes: Record<string, FootnoteDefinition>;\n}\n\nexport interface ThemeColorScheme {\n name: string;\n colors: Record<string, string>;\n}\n\nexport interface ThemeFontScheme {\n name: string;\n majorFont?: string;\n minorFont?: string;\n}\n\nexport interface ThemeDefinition {\n name?: string;\n colorScheme?: ThemeColorScheme;\n fontScheme?: ThemeFontScheme;\n}\n\nexport interface DocumentSettings {\n evenAndOddHeaders?: boolean;\n zoomLevel?: \"pageWidth\" | \"onePage\" | number;\n}\n\nexport interface SubPartsCatalog {\n headers: HeaderDocument[];\n footers: FooterDocument[];\n footnoteCollection?: FootnoteCollection;\n theme?: ThemeDefinition;\n finalSectionProperties?: SectionProperties;\n resolvedTheme?: ResolvedTheme;\n settings?: DocumentSettings;\n}\n\nexport interface ResolvedTheme {\n colors: Record<string, string>;\n majorFont?: string;\n minorFont?: string;\n}\n\n// ---- Inline footnote reference node ----\n\nexport interface FootnoteRefNode {\n type: \"footnote_ref\";\n noteId: string;\n noteKind: \"footnote\" | \"endnote\";\n}\n\nexport type DocumentNode =\n | DocumentRootNode\n | ParagraphNode\n | TableNode\n | TableRowNode\n | TableCellNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | TextNode\n | HardBreakNode\n | TabNode\n | ColumnBreakNode\n | SymbolNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | SectionBreakNode\n | OpaqueInlineNode\n | OpaqueBlockNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface DocumentRootNode {\n type: \"doc\";\n children: BlockNode[];\n}\n\nexport type BlockNode =\n | ParagraphNode\n | TableNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | SectionBreakNode\n | OpaqueBlockNode;\n\nexport interface ParagraphSpacing {\n before?: number;\n after?: number;\n line?: number;\n lineRule?: \"auto\" | \"exact\" | \"atLeast\";\n}\n\nexport interface ParagraphIndentation {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n}\n\nexport interface TabStop {\n position: number;\n align: \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\" | \"clear\";\n leader?: \"none\" | \"dot\" | \"hyphen\" | \"underscore\" | \"heavy\" | \"middleDot\";\n}\n\nexport interface ParagraphBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n bar?: BorderSpec;\n between?: BorderSpec;\n}\n\nexport interface ParagraphShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface ParagraphNode {\n type: \"paragraph\";\n styleId?: string;\n numbering?: {\n numberingInstanceId: string;\n level: number;\n };\n alignment?: \"left\" | \"center\" | \"right\" | \"both\" | \"distribute\";\n spacing?: ParagraphSpacing;\n contextualSpacing?: boolean;\n indentation?: ParagraphIndentation;\n tabStops?: TabStop[];\n keepNext?: boolean;\n keepLines?: boolean;\n outlineLevel?: number;\n pageBreakBefore?: boolean;\n widowControl?: boolean;\n borders?: ParagraphBorders;\n shading?: ParagraphShading;\n bidi?: boolean;\n suppressLineNumbers?: boolean;\n cnfStyle?: string;\n children: InlineNode[];\n}\n\nexport interface BorderSpec {\n value?: string;\n size?: number;\n space?: number;\n color?: string;\n}\n\nexport interface TableBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableCellBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableWidth {\n value: number;\n type: \"dxa\" | \"auto\" | \"pct\" | \"nil\";\n}\n\nexport interface CellShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface TableCellMargins {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport interface TableLook {\n val?: string;\n firstRow?: boolean;\n lastRow?: boolean;\n firstColumn?: boolean;\n lastColumn?: boolean;\n noHBand?: boolean;\n noVBand?: boolean;\n}\n\nexport interface TableNode {\n type: \"table\";\n styleId?: string;\n propertiesXml?: string;\n gridColumns: number[];\n rows: TableRowNode[];\n width?: TableWidth;\n alignment?: \"left\" | \"center\" | \"right\";\n borders?: TableBorders;\n cellMargins?: TableCellMargins;\n tblLook?: TableLook;\n}\n\nexport interface TableRowNode {\n type: \"table_row\";\n propertiesXml?: string;\n cells: TableCellNode[];\n gridBefore?: number;\n widthBefore?: TableWidth;\n gridAfter?: number;\n widthAfter?: TableWidth;\n height?: number;\n heightRule?: \"auto\" | \"atLeast\" | \"exact\";\n isHeader?: boolean;\n}\n\nexport interface TableCellNode {\n type: \"table_cell\";\n propertiesXml?: string;\n gridSpan?: number;\n verticalMerge?: \"restart\" | \"continue\";\n children: BlockNode[];\n width?: TableWidth;\n borders?: TableCellBorders;\n shading?: CellShading;\n verticalAlign?: \"top\" | \"center\" | \"bottom\";\n}\n\nexport interface SdtCheckboxState {\n checked: boolean;\n checkedChar?: string;\n uncheckedChar?: string;\n}\n\nexport interface SdtDatePickerState {\n fullDate?: string;\n dateFormat?: string;\n lid?: string;\n}\n\nexport interface SdtDropdownListItem {\n displayText?: string;\n value: string;\n}\n\nexport interface SdtNode {\n type: \"sdt\";\n properties: {\n sdtType?: string;\n alias?: string;\n tag?: string;\n lock?: string;\n propertiesXml?: string;\n checkbox?: SdtCheckboxState;\n datePicker?: SdtDatePickerState;\n dropdownList?: SdtDropdownListItem[];\n comboBox?: SdtDropdownListItem[];\n showingPlcHdr?: boolean;\n };\n children: BlockNode[];\n}\n\nexport interface CustomXmlNode {\n type: \"custom_xml\";\n uri?: string;\n element?: string;\n children: BlockNode[];\n}\n\nexport interface AltChunkNode {\n type: \"alt_chunk\";\n relationshipId: string;\n}\n\n/**\n * Supported field families that receive first-class canonical treatment.\n * These families have stable registry IDs, dependency metadata, and\n * runtime-owned refresh behavior.\n */\nexport type SupportedFieldFamily = \"REF\" | \"PAGEREF\" | \"NOTEREF\" | \"TOC\";\n\n/**\n * Unsupported field families that remain preserve-only.\n * They survive round-trip but do not participate in runtime refresh.\n */\nexport type PreserveOnlyFieldFamily =\n | \"PAGE\"\n | \"NUMPAGES\"\n | \"DATE\"\n | \"TIME\"\n | \"AUTHOR\"\n | \"FILENAME\"\n | \"MERGEFIELD\"\n | \"IF\"\n | \"SEQ\"\n | \"INDEX\"\n | \"TC\"\n | \"STYLEREF\"\n | \"FORMULA\"\n | \"UNKNOWN\";\n\nexport type FieldFamily = SupportedFieldFamily | PreserveOnlyFieldFamily;\n\n/** Runtime refresh status for a field instance. */\nexport type FieldRefreshStatus =\n | \"current\"\n | \"stale\"\n | \"unresolvable\"\n | \"preserve-only\";\n\nexport interface FieldNode {\n type: \"field\";\n fieldType: \"simple\" | \"complex\";\n instruction: string;\n children: InlineNode[];\n /** Classified field family. Undefined for legacy snapshots. */\n fieldFamily?: FieldFamily;\n /** Target bookmark name for REF/PAGEREF/NOTEREF fields. */\n fieldTarget?: string;\n /** Runtime refresh status. Undefined for legacy or preserve-only fields. */\n refreshStatus?: FieldRefreshStatus;\n}\n\n// ─── Field registry ─────────────────────────────────────────────────────────\n\n/**\n * Package-backed field registry that catalogs every field instance in the\n * document, grouped by supported vs preserve-only families.\n *\n * Supported field entries carry dependency metadata (bookmark targets) and\n * participate in deterministic refresh. Preserve-only entries survive\n * round-trip but are not refreshable.\n */\nexport interface FieldRegistry {\n /** Supported field instances that participate in refresh. */\n supported: FieldRegistryEntry[];\n /** Preserve-only field instances cataloged for round-trip safety. */\n preserveOnly: FieldRegistryEntry[];\n /** Generated TOC structure extracted from heading-driven TOC fields. */\n tocStructure?: TocStructure;\n}\n\nexport interface FieldRegistryEntry {\n /** Stable document-order index of this field (0-based). */\n fieldIndex: number;\n /** Classified field family. */\n fieldFamily: FieldFamily;\n /** Whether the field is in the supported refresh slice. */\n supported: boolean;\n /** Field instruction text. */\n instruction: string;\n /** Target bookmark name for REF/PAGEREF/NOTEREF fields. */\n fieldTarget?: string;\n /** Current display text extracted from field content. */\n displayText: string;\n /** Paragraph index in document order where this field appears. */\n paragraphIndex: number;\n /** Runtime refresh status. */\n refreshStatus: FieldRefreshStatus;\n}\n\n/**\n * Generated table-of-contents structure extracted from TOC fields and\n * heading-styled paragraphs in the document.\n */\nexport interface TocStructure {\n /** The raw TOC field instruction (e.g. \"TOC \\\\o \\\"1-3\\\" \\\\h\"). */\n instruction: string;\n /** Heading level range the TOC covers. */\n levelRange: { from: number; to: number };\n /** Ordered TOC entries derived from heading paragraphs. */\n entries: TocEntry[];\n /** Whether the TOC content is current with the heading structure. */\n status: \"current\" | \"stale\";\n}\n\nexport interface TocEntry {\n /** Heading text. */\n text: string;\n /** Heading outline level (1-9). */\n level: number;\n /** Paragraph index of the heading in document order. */\n paragraphIndex: number;\n /** Style ID of the heading paragraph, if available. */\n styleId?: string;\n /** Bookmark name anchoring this heading, if present. */\n bookmarkName?: string;\n}\n\nexport interface BookmarkStartNode {\n type: \"bookmark_start\";\n bookmarkId: string;\n name: string;\n}\n\nexport interface BookmarkEndNode {\n type: \"bookmark_end\";\n bookmarkId: string;\n}\n\nexport interface SectionBreakNode {\n type: \"section_break\";\n sectionPropertiesXml?: string;\n /**\n * @deprecated Legacy field from older snapshots. New exports should use\n * sectionPropertiesXml and only contain raw <w:sectPr> content.\n */\n propertiesXml?: string;\n sectionProperties?: SectionProperties;\n}\n\nexport interface SectionProperties {\n pageSize?: PageSize;\n pageMargins?: PageMargins;\n columns?: ColumnProperties;\n pageNumbering?: PageNumbering;\n lineNumbering?: SectionLineNumbering;\n pageBorders?: SectionPageBorders;\n documentGrid?: SectionDocumentGrid;\n headerReferences?: HeaderFooterReference[];\n footerReferences?: HeaderFooterReference[];\n sectionType?: \"continuous\" | \"nextPage\" | \"evenPage\" | \"oddPage\" | \"nextColumn\";\n titlePage?: boolean;\n}\n\nexport interface PageSize {\n width: number;\n height: number;\n orientation?: \"portrait\" | \"landscape\";\n}\n\nexport interface PageMargins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n header?: number;\n footer?: number;\n gutter?: number;\n}\n\nexport interface ColumnProperties {\n count?: number;\n space?: number;\n equalWidth?: boolean;\n columns?: Array<{ width: number; space?: number }>;\n separator?: boolean;\n}\n\nexport interface PageNumbering {\n format?: string;\n start?: number;\n chapStyle?: string;\n chapSep?: string;\n}\n\nexport interface SectionLineNumbering {\n countBy?: number;\n start?: number;\n distance?: number;\n restart?: \"newPage\" | \"newSection\" | \"continuous\";\n}\n\nexport interface SectionPageBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n offsetFrom?: \"page\" | \"text\";\n display?: \"allPages\" | \"firstPage\" | \"notFirstPage\";\n zOrder?: \"front\" | \"back\";\n}\n\nexport interface SectionDocumentGrid {\n type?: \"default\" | \"lines\" | \"linesAndChars\" | \"snapToChars\";\n linePitch?: number;\n charSpace?: number;\n}\n\nexport interface HeaderFooterReference {\n variant: HeaderFooterVariant;\n relationshipId: string;\n}\n\nexport type InlineNode =\n | TextNode\n | HardBreakNode\n | ColumnBreakNode\n | TabNode\n | SymbolNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | OpaqueInlineNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface TextNode {\n type: \"text\";\n text: string;\n marks?: TextMark[];\n}\n\nexport type TextMark =\n | { type: \"bold\" }\n | { type: \"italic\" }\n | { type: \"underline\" }\n | { type: \"strikethrough\" }\n | { type: \"doubleStrikethrough\" }\n | { type: \"vanish\" }\n | { type: \"lang\"; val: string }\n | { type: \"highlight\"; color: string; val: string }\n | { type: \"backgroundColor\"; color: string }\n | { type: \"charSpacing\"; val: number }\n | { type: \"kerning\"; val: number }\n | { type: \"emboss\" }\n | { type: \"imprint\" }\n | { type: \"shadow\" }\n | { type: \"position\"; val: number }\n | { type: \"textFill\"; xml: string }\n | { type: \"fontFamily\"; val: string }\n | { type: \"fontSize\"; val: number }\n | { type: \"textColor\"; color: string }\n | { type: \"smallCaps\" }\n | { type: \"allCaps\" };\n\nexport interface HardBreakNode {\n type: \"hard_break\";\n}\n\nexport interface ColumnBreakNode {\n type: \"column_break\";\n}\n\nexport interface TabNode {\n type: \"tab\";\n}\n\nexport interface SymbolNode {\n type: \"symbol\";\n char: string;\n font?: string;\n marks?: TextMark[];\n}\n\nexport interface HyperlinkNode {\n type: \"hyperlink\";\n href: string;\n children: Array<TextNode | HardBreakNode | ColumnBreakNode | TabNode | SymbolNode>;\n}\n\nexport interface ImageNode {\n type: \"image\";\n mediaId: string;\n altText?: string;\n placementXml?: string;\n display?: \"inline\" | \"floating\";\n floating?: FloatingImageProperties;\n}\n\nexport interface FloatingImageProperties {\n horizontalPosition?: FloatingAxisPosition;\n verticalPosition?: FloatingAxisPosition;\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n}\n\nexport interface FloatingAxisPosition {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n}\n\nexport interface OpaqueInlineNode {\n type: \"opaque_inline\";\n fragmentId: string;\n warningId: string;\n}\n\n// ---- Complex rendering inline nodes (read-only previews) ----\n\n/**\n * Read-only preview of a chart (c:chart). The original drawing XML is stored in\n * rawXml for lossless round-trip export. If a fallback image was present in\n * mc:AlternateContent it is referenced by previewMediaId.\n */\nexport interface ChartPreviewNode {\n type: \"chart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only preview of a SmartArt diagram (dgm:*). The original drawing XML is\n * stored in rawXml for lossless round-trip export.\n */\nexport interface SmartArtPreviewNode {\n type: \"smartart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a wps:wsp WordprocessingShape. Text content is\n * extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface ShapeNode {\n type: \"shape\";\n text?: string;\n geometry?: string;\n isTextBox?: boolean;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of WordArt — a wps:wsp shape with a text-geometry preset.\n * Text is extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface WordArtNode {\n type: \"wordart\";\n text: string;\n geometry?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a VML shape (v:shape, v:rect, v:textbox) from a w:pict\n * element. Text is extracted for display. The original w:pict XML is preserved\n * in rawXml for lossless round-trip export.\n */\nexport interface VmlShapeNode {\n type: \"vml_shape\";\n text?: string;\n shapeType?: string;\n rawXml: string;\n}\n\nexport interface OpaqueBlockNode {\n type: \"opaque_block\";\n fragmentId: string;\n warningId: string;\n rawXml?: string;\n}\n\nexport interface DocRange {\n from: number;\n to: number;\n}\n\nexport interface BoundaryAssoc {\n start: -1 | 1;\n end: -1 | 1;\n}\n\nexport type CanonicalAnchor =\n | {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n }\n | {\n kind: \"node\";\n at: number;\n assoc: -1 | 1;\n }\n | {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n };\n\nexport interface ReviewStore {\n comments: Record<string, CommentThread>;\n revisions: Record<string, RevisionRecord>;\n}\n\nexport interface CommentThread {\n commentId: string;\n status: \"open\" | \"resolved\" | \"detached\";\n anchor: CanonicalAnchor;\n createdAt: ISO8601DateTime;\n createdBy?: string;\n authorId?: string;\n body?: string;\n entries?: CommentEntry[];\n resolution?: CommentResolution;\n resolvedAt?: ISO8601DateTime;\n warningIds: string[];\n isResolved?: boolean;\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n createdAt: ISO8601DateTime;\n body: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: ISO8601DateTime;\n resolvedBy: string;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface RevisionPropertyChangeData {\n xmlTag: \"pPrChange\" | \"sectPrChange\" | \"tblPrChange\" | \"rPrChange\";\n beforeXml: string;\n}\n\nexport interface RevisionMoveData {\n moveId: string;\n direction: \"from\" | \"to\";\n}\n\nexport type RevisionStoryTargetRecord =\n | { kind: \"main\" }\n | {\n kind: \"header\";\n relationshipId: string;\n variant: \"default\" | \"first\" | \"even\";\n sectionIndex?: number;\n }\n | {\n kind: \"footer\";\n relationshipId: string;\n variant: \"default\" | \"first\" | \"even\";\n sectionIndex?: number;\n }\n | { kind: \"footnote\"; noteId: string }\n | { kind: \"endnote\"; noteId: string };\n\nexport interface RevisionRecord {\n changeId: string;\n kind: \"insertion\" | \"deletion\" | \"formatting\" | \"move\" | \"property-change\";\n anchor: CanonicalAnchor;\n authorId?: string;\n createdAt: ISO8601DateTime;\n warningIds?: string[];\n metadata?: RevisionMetadataRecord;\n status: \"open\" | \"accepted\" | \"rejected\" | \"detached\";\n}\n\nexport interface RevisionMetadataRecord {\n source?: \"runtime\" | \"import\";\n storyTarget?: RevisionStoryTargetRecord;\n preserveOnlyReason?: string;\n importedRevisionForm?:\n | \"run-insertion\"\n | \"run-deletion\"\n | \"paragraph-insertion\"\n | \"paragraph-deletion\";\n originalRevisionType?: string;\n ooxmlRevisionId?: string;\n propertyChangeData?: RevisionPropertyChangeData;\n moveData?: RevisionMoveData;\n}\n\nexport interface PreservationStore {\n opaqueFragments: Record<string, OpaqueFragmentRecord>;\n packageParts: Record<string, PreservedPackagePart>;\n}\n\nexport interface OpaqueFragmentRecord {\n fragmentId: string;\n payloadKind: \"xml-subtree\" | \"package-part\";\n payloadReference: string;\n featureClass: \"preserve-only\";\n lastKnownRange: DocRange;\n warningId: string;\n packagePartName?: string;\n relationshipId?: string;\n}\n\nexport interface PreservedPackagePart {\n packagePartName: string;\n contentType: string;\n relationshipIds: string[];\n}\n\nexport interface DiagnosticStore {\n warnings: DiagnosticWarningEntry[];\n errors: DiagnosticErrorEntry[];\n}\n\nexport interface DiagnosticWarningEntry {\n diagnosticId: string;\n warningId: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n message: string;\n}\n\nexport interface DiagnosticErrorEntry {\n diagnosticId: string;\n code:\n | \"load_failed\"\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: unknown;\n}\n\nexport function createCanonicalDocument(\n input: Omit<CanonicalDocument, \"schemaVersion\">,\n): CanonicalDocument {\n const document: CanonicalDocument = {\n schemaVersion: CDS_SCHEMA_VERSION,\n ...input,\n };\n\n assertCanonicalDocument(document);\n return document;\n}\n\nexport function serializeCanonicalDocument(document: CanonicalDocument): string {\n assertCanonicalDocument(document);\n return stableStringify(document);\n}\n\nexport function createCanonicalDocumentSignature(document: unknown): string {\n return stableStringify(document);\n}\n\nexport function parseCanonicalDocument(json: string): CanonicalDocument {\n const parsed = JSON.parse(json) as unknown;\n assertCanonicalDocument(parsed);\n return parsed;\n}\n\nexport function projectCanonicalDocument(\n document: CanonicalDocument,\n): CanonicalDocument {\n assertCanonicalDocument(document);\n return JSON.parse(stableStringify(document)) as CanonicalDocument;\n}\n\nexport function assertCanonicalDocument(\n value: unknown,\n): asserts value is CanonicalDocument {\n const issues = validateCanonicalDocument(value);\n assertValid(issues, \"Invalid canonical document.\");\n}\n\nexport function validateCanonicalDocument(\n value: unknown,\n): ModelValidationIssue[] {\n const issues: ModelValidationIssue[] = [];\n const record = asPlainObject(value, \"$\", issues);\n if (!record) {\n return issues;\n }\n\n validateExactObjectKeys(record, CANONICAL_DOCUMENT_TOP_LEVEL_KEYS, \"$\", issues, CANONICAL_DOCUMENT_OPTIONAL_KEYS);\n expectExactString(record.schemaVersion, CDS_SCHEMA_VERSION, \"$.schemaVersion\", issues);\n expectUuid(record.docId, \"$.docId\", issues);\n expectIso8601UtcTimestamp(record.createdAt, \"$.createdAt\", issues);\n expectIso8601UtcTimestamp(record.updatedAt, \"$.updatedAt\", issues);\n\n validateMetadata(record.metadata, \"$.metadata\", issues);\n validateStylesCatalog(record.styles, \"$.styles\", issues);\n validateNumberingCatalog(record.numbering, \"$.numbering\", issues);\n validateMediaCatalog(record.media, \"$.media\", issues);\n validateDocumentNode(record.content, \"$.content\", issues);\n validateReviewStore(record.review, \"$.review\", issues);\n validatePreservationStore(record.preservation, \"$.preservation\", issues);\n validateDiagnosticStore(record.diagnostics, \"$.diagnostics\", issues);\n if (record.subParts !== undefined) {\n validateSubPartsCatalog(record.subParts, \"$.subParts\", issues);\n }\n validateDocumentReferences(record, issues);\n\n return issues;\n}\n\nfunction validateMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const customProperties = asPlainObject(record.customProperties, `${path}.customProperties`, issues);\n if (!customProperties) {\n return;\n }\n\n for (const [propertyKey, propertyValue] of Object.entries(customProperties)) {\n if (typeof propertyValue !== \"string\") {\n issues.push({\n path: `${path}.customProperties.${propertyKey}`,\n message: \"customProperties values must be strings.\",\n });\n }\n }\n}\n\nfunction validateStylesCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n validateStyleMap(record.paragraphs, `${path}.paragraphs`, issues);\n validateStyleMap(record.characters, `${path}.characters`, issues);\n validateStyleMap(record.tables, `${path}.tables`, issues);\n if (record.latentStyles !== undefined) {\n validateLatentStyleMap(record.latentStyles, `${path}.latentStyles`, issues);\n }\n}\n\nfunction validateStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleId, definition] of Object.entries(record)) {\n expectDomainString(styleId, \"styleId\", `${path}.${styleId}`, issues);\n const definitionRecord = asPlainObject(definition, `${path}.${styleId}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.styleId !== styleId) {\n issues.push({\n path: `${path}.${styleId}.styleId`,\n message: \"styleId must match the map key.\",\n });\n }\n }\n}\n\nfunction validateLatentStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleName, definition] of Object.entries(record)) {\n const definitionRecord = asPlainObject(definition, `${path}.${styleName}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.name !== styleName) {\n issues.push({\n path: `${path}.${styleName}.name`,\n message: \"name must match the map key.\",\n });\n }\n if (definitionRecord.uiPriority !== undefined && typeof definitionRecord.uiPriority !== \"number\") {\n issues.push({\n path: `${path}.${styleName}.uiPriority`,\n message: \"uiPriority must be a number.\",\n });\n }\n }\n}\n\nfunction validateNumberingCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const abstractDefinitions = asPlainObject(\n record.abstractDefinitions,\n `${path}.abstractDefinitions`,\n issues,\n );\n if (abstractDefinitions) {\n for (const [abstractId, definition] of Object.entries(abstractDefinitions)) {\n expectDomainString(\n abstractId,\n \"abstractNumberingId\",\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n const definitionRecord = asPlainObject(\n definition,\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n if (definitionRecord && definitionRecord.abstractNumberingId !== abstractId) {\n issues.push({\n path: `${path}.abstractDefinitions.${abstractId}.abstractNumberingId`,\n message: \"abstractNumberingId must match the map key.\",\n });\n }\n }\n }\n\n const instances = asPlainObject(record.instances, `${path}.instances`, issues);\n if (instances) {\n for (const [instanceId, instance] of Object.entries(instances)) {\n expectDomainString(\n instanceId,\n \"numberingInstanceId\",\n `${path}.instances.${instanceId}`,\n issues,\n );\n const instanceRecord = asPlainObject(\n instance,\n `${path}.instances.${instanceId}`,\n issues,\n );\n if (!instanceRecord) {\n continue;\n }\n if (instanceRecord.numberingInstanceId !== instanceId) {\n issues.push({\n path: `${path}.instances.${instanceId}.numberingInstanceId`,\n message: \"numberingInstanceId must match the map key.\",\n });\n }\n expectDomainString(\n instanceRecord.abstractNumberingId,\n \"abstractNumberingId\",\n `${path}.instances.${instanceId}.abstractNumberingId`,\n issues,\n );\n }\n }\n}\n\nfunction validateMediaCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const items = asPlainObject(record.items, `${path}.items`, issues);\n if (!items) {\n return;\n }\n\n for (const [mediaId, item] of Object.entries(items)) {\n expectDomainString(mediaId, \"mediaId\", `${path}.items.${mediaId}`, issues);\n const itemRecord = asPlainObject(item, `${path}.items.${mediaId}`, issues);\n if (!itemRecord) {\n continue;\n }\n if (itemRecord.mediaId !== mediaId) {\n issues.push({\n path: `${path}.items.${mediaId}.mediaId`,\n message: \"mediaId must match the map key.\",\n });\n }\n expectDomainString(\n itemRecord.packagePartName,\n \"packagePartName\",\n `${path}.items.${mediaId}.packagePartName`,\n issues,\n );\n if (itemRecord.relationshipId !== undefined) {\n expectDomainString(\n itemRecord.relationshipId,\n \"relationshipId\",\n `${path}.items.${mediaId}.relationshipId`,\n issues,\n );\n }\n }\n}\n\nfunction validateDocumentNode(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const type = expectString(record.type, `${path}.type`, issues);\n if (!type) {\n return;\n }\n\n switch (type) {\n case \"doc\":\n case \"paragraph\":\n case \"sdt\":\n case \"custom_xml\":\n case \"hyperlink\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n if (type === \"paragraph\" && record.styleId !== undefined) {\n expectDomainString(record.styleId, \"styleId\", `${path}.styleId`, issues);\n }\n if (type === \"paragraph\" && record.numbering !== undefined) {\n const numbering = asPlainObject(record.numbering, `${path}.numbering`, issues);\n if (numbering) {\n expectDomainString(\n numbering.numberingInstanceId,\n \"numberingInstanceId\",\n `${path}.numbering.numberingInstanceId`,\n issues,\n );\n if (typeof numbering.level !== \"number\") {\n issues.push({\n path: `${path}.numbering.level`,\n message: \"level must be a number.\",\n });\n }\n }\n }\n if (type === \"hyperlink\") {\n expectString(record.href, `${path}.href`, issues);\n }\n return;\n case \"alt_chunk\":\n expectDomainString(record.relationshipId, \"relationshipId\", `${path}.relationshipId`, issues);\n return;\n case \"image\":\n expectDomainString(record.mediaId, \"mediaId\", `${path}.mediaId`, issues);\n if (record.placementXml !== undefined) {\n expectString(record.placementXml, `${path}.placementXml`, issues);\n }\n if (record.display !== undefined) {\n const display = expectString(record.display, `${path}.display`, issues);\n if (display && display !== \"inline\" && display !== \"floating\") {\n issues.push({\n path: `${path}.display`,\n message: \"display must be 'inline' or 'floating'.\",\n });\n }\n }\n if (record.floating !== undefined) {\n validateFloatingImageProperties(record.floating, `${path}.floating`, issues);\n }\n return;\n case \"opaque_inline\":\n case \"opaque_block\":\n expectDomainString(record.fragmentId, \"fragmentId\", `${path}.fragmentId`, issues);\n expectDomainString(record.warningId, \"warningId\", `${path}.warningId`, issues);\n if (record.rawXml !== undefined) {\n expectString(record.rawXml, `${path}.rawXml`, issues);\n }\n return;\n case \"table\":\n if (!Array.isArray(record.gridColumns)) {\n issues.push({ path: `${path}.gridColumns`, message: \"gridColumns must be an array.\" });\n }\n if (!Array.isArray(record.rows)) {\n issues.push({ path: `${path}.rows`, message: \"rows must be an array.\" });\n } else {\n record.rows.forEach((row, rowIndex) =>\n validateDocumentNode(row, `${path}.rows[${rowIndex}]`, issues),\n );\n }\n return;\n case \"table_row\":\n if (!Array.isArray(record.cells)) {\n issues.push({ path: `${path}.cells`, message: \"cells must be an array.\" });\n } else {\n record.cells.forEach((cell, cellIndex) =>\n validateDocumentNode(cell, `${path}.cells[${cellIndex}]`, issues),\n );\n }\n return;\n case \"table_cell\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, childIndex) =>\n validateDocumentNode(child, `${path}.children[${childIndex}]`, issues),\n );\n }\n return;\n case \"field\":\n expectString(record.fieldType, `${path}.fieldType`, issues);\n expectString(record.instruction, `${path}.instruction`, issues);\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n return;\n case \"bookmark_start\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n expectString(record.name, `${path}.name`, issues);\n return;\n case \"bookmark_end\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n return;\n case \"section_break\":\n return;\n case \"text\":\n if (typeof record.text !== \"string\") {\n issues.push({\n path: `${path}.text`,\n message: \"text must be a string.\",\n });\n }\n return;\n case \"hard_break\":\n case \"column_break\":\n case \"tab\":\n return;\n case \"symbol\":\n expectString(record.char, `${path}.char`, issues);\n if (record.font !== undefined) {\n expectString(record.font, `${path}.font`, issues);\n }\n return;\n case \"footnote_ref\":\n expectString(record.noteId, `${path}.noteId`, issues);\n if (record.noteKind !== \"footnote\" && record.noteKind !== \"endnote\") {\n issues.push({\n path: `${path}.noteKind`,\n message: \"noteKind must be 'footnote' or 'endnote'.\",\n });\n }\n return;\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n expectString(record.rawXml, `${path}.rawXml`, issues);\n return;\n default:\n issues.push({\n path: `${path}.type`,\n message: `Unsupported node type ${JSON.stringify(type)}.`,\n });\n }\n}\n\nfunction validateFloatingImageProperties(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.horizontalPosition !== undefined) {\n validateFloatingAxisPosition(record.horizontalPosition, `${path}.horizontalPosition`, issues);\n }\n if (record.verticalPosition !== undefined) {\n validateFloatingAxisPosition(record.verticalPosition, `${path}.verticalPosition`, issues);\n }\n if (record.wrap !== undefined) {\n const wrap = expectString(record.wrap, `${path}.wrap`, issues);\n if (\n wrap &&\n wrap !== \"none\" &&\n wrap !== \"square\" &&\n wrap !== \"tight\" &&\n wrap !== \"through\" &&\n wrap !== \"topAndBottom\"\n ) {\n issues.push({\n path: `${path}.wrap`,\n message: \"wrap must be one of none, square, tight, through, or topAndBottom.\",\n });\n }\n }\n}\n\nfunction validateFloatingAxisPosition(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.relativeFrom !== undefined) {\n expectString(record.relativeFrom, `${path}.relativeFrom`, issues);\n }\n if (record.align !== undefined) {\n expectString(record.align, `${path}.align`, issues);\n }\n if (record.offset !== undefined && typeof record.offset !== \"number\") {\n issues.push({\n path: `${path}.offset`,\n message: \"offset must be a number.\",\n });\n }\n}\n\nfunction validateReviewStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const comments = asPlainObject(record.comments, `${path}.comments`, issues);\n if (comments) {\n for (const [commentId, thread] of Object.entries(comments)) {\n expectDomainString(commentId, \"commentId\", `${path}.comments.${commentId}`, issues);\n const threadRecord = asPlainObject(thread, `${path}.comments.${commentId}`, issues);\n if (!threadRecord) {\n continue;\n }\n if (threadRecord.commentId !== commentId) {\n issues.push({\n path: `${path}.comments.${commentId}.commentId`,\n message: \"commentId must match the map key.\",\n });\n }\n validateAnchor(threadRecord.anchor, `${path}.comments.${commentId}.anchor`, issues);\n expectIso8601UtcTimestamp(\n threadRecord.createdAt,\n `${path}.comments.${commentId}.createdAt`,\n issues,\n );\n validateCommentStatus(threadRecord.status, `${path}.comments.${commentId}.status`, issues);\n if (threadRecord.createdBy !== undefined) {\n expectString(\n threadRecord.createdBy,\n `${path}.comments.${commentId}.createdBy`,\n issues,\n );\n }\n if (threadRecord.authorId !== undefined) {\n expectString(\n threadRecord.authorId,\n `${path}.comments.${commentId}.authorId`,\n issues,\n );\n }\n if (threadRecord.body !== undefined) {\n expectStringAllowEmpty(\n threadRecord.body,\n `${path}.comments.${commentId}.body`,\n issues,\n );\n }\n if (!Array.isArray(threadRecord.warningIds)) {\n issues.push({\n path: `${path}.comments.${commentId}.warningIds`,\n message: \"warningIds must be an array.\",\n });\n } else {\n threadRecord.warningIds.forEach((warningId, index) =>\n expectDomainString(\n warningId,\n \"warningId\",\n `${path}.comments.${commentId}.warningIds[${index}]`,\n issues,\n ),\n );\n }\n if (threadRecord.entries !== undefined) {\n validateCommentEntries(\n threadRecord.entries,\n `${path}.comments.${commentId}.entries`,\n issues,\n );\n }\n if (threadRecord.resolution !== undefined) {\n validateCommentResolution(\n threadRecord.resolution,\n `${path}.comments.${commentId}.resolution`,\n issues,\n );\n }\n if (threadRecord.resolvedAt !== undefined) {\n expectIso8601UtcTimestamp(\n threadRecord.resolvedAt,\n `${path}.comments.${commentId}.resolvedAt`,\n issues,\n );\n }\n if (\n threadRecord.isResolved !== undefined &&\n typeof threadRecord.isResolved !== \"boolean\"\n ) {\n issues.push({\n path: `${path}.comments.${commentId}.isResolved`,\n message: \"isResolved must be a boolean.\",\n });\n }\n if (threadRecord.metadata !== undefined) {\n validateCommentThreadMetadata(\n threadRecord.metadata,\n `${path}.comments.${commentId}.metadata`,\n issues,\n );\n }\n }\n }\n\n const revisions = asPlainObject(record.revisions, `${path}.revisions`, issues);\n if (revisions) {\n for (const [revisionId, revision] of Object.entries(revisions)) {\n expectDomainString(revisionId, \"revisionId\", `${path}.revisions.${revisionId}`, issues);\n const revisionRecord = asPlainObject(\n revision,\n `${path}.revisions.${revisionId}`,\n issues,\n );\n if (!revisionRecord) {\n continue;\n }\n if (revisionRecord.changeId !== revisionId) {\n issues.push({\n path: `${path}.revisions.${revisionId}.changeId`,\n message: \"changeId must match the map key.\",\n });\n }\n validateAnchor(revisionRecord.anchor, `${path}.revisions.${revisionId}.anchor`, issues);\n validateRevisionKind(revisionRecord.kind, `${path}.revisions.${revisionId}.kind`, issues);\n validateRevisionStatus(\n revisionRecord.status,\n `${path}.revisions.${revisionId}.status`,\n issues,\n );\n expectIso8601UtcTimestamp(\n revisionRecord.createdAt,\n `${path}.revisions.${revisionId}.createdAt`,\n issues,\n );\n if (revisionRecord.authorId !== undefined) {\n expectString(\n revisionRecord.authorId,\n `${path}.revisions.${revisionId}.authorId`,\n issues,\n );\n }\n if (revisionRecord.warningIds !== undefined) {\n validateWarningIds(\n revisionRecord.warningIds,\n `${path}.revisions.${revisionId}.warningIds`,\n issues,\n );\n }\n if (revisionRecord.metadata !== undefined) {\n validateRevisionMetadata(\n revisionRecord.metadata,\n `${path}.revisions.${revisionId}.metadata`,\n issues,\n );\n }\n }\n }\n}\n\nfunction validateCommentStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (value === \"open\" || value === \"resolved\" || value === \"detached\") {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, resolved, or detached.\",\n });\n}\n\nfunction validateCommentEntries(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"entries must be an array.\",\n });\n return;\n }\n\n value.forEach((entry, index) => {\n const record = asPlainObject(entry, `${path}[${index}]`, issues);\n if (!record) {\n return;\n }\n expectString(record.entryId, `${path}[${index}].entryId`, issues);\n expectString(record.authorId, `${path}[${index}].authorId`, issues);\n expectStringAllowEmpty(record.body, `${path}[${index}].body`, issues);\n expectIso8601UtcTimestamp(record.createdAt, `${path}[${index}].createdAt`, issues);\n if (record.metadata !== undefined) {\n validateCommentEntryMetadata(record.metadata, `${path}[${index}].metadata`, issues);\n }\n });\n}\n\nfunction validateCommentEntryMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const field of [\n \"ooxmlCommentId\",\n \"paraId\",\n \"parentParaId\",\n \"durableId\",\n \"initials\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n}\n\nfunction validateCommentResolution(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n expectIso8601UtcTimestamp(record.resolvedAt, `${path}.resolvedAt`, issues);\n expectString(record.resolvedBy, `${path}.resolvedBy`, issues);\n}\n\nfunction validateCommentThreadMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n if (record.rootOoxmlCommentId !== undefined) {\n expectString(record.rootOoxmlCommentId, `${path}.rootOoxmlCommentId`, issues);\n }\n if (record.rootParaId !== undefined) {\n expectString(record.rootParaId, `${path}.rootParaId`, issues);\n }\n}\n\nfunction validateRevisionKind(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"insertion\" ||\n value === \"deletion\" ||\n value === \"formatting\" ||\n value === \"move\" ||\n value === \"property-change\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"kind must be insertion, deletion, formatting, move, or property-change.\",\n });\n}\n\nfunction validateRevisionStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"open\" ||\n value === \"accepted\" ||\n value === \"rejected\" ||\n value === \"detached\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, accepted, rejected, or detached.\",\n });\n}\n\nfunction validateWarningIds(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"warningIds must be an array.\",\n });\n return;\n }\n\n value.forEach((warningId, index) =>\n expectDomainString(warningId, \"warningId\", `${path}[${index}]`, issues),\n );\n}\n\nfunction validateRevisionMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n for (const field of [\n \"preserveOnlyReason\",\n \"importedRevisionForm\",\n \"originalRevisionType\",\n \"ooxmlRevisionId\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n\n if (record.propertyChangeData !== undefined) {\n const pcd = asPlainObject(record.propertyChangeData, `${path}.propertyChangeData`, issues);\n if (pcd) {\n expectString(pcd.xmlTag, `${path}.propertyChangeData.xmlTag`, issues);\n expectString(pcd.beforeXml, `${path}.propertyChangeData.beforeXml`, issues);\n }\n }\n\n if (record.moveData !== undefined) {\n const md = asPlainObject(record.moveData, `${path}.moveData`, issues);\n if (md) {\n expectString(md.moveId, `${path}.moveData.moveId`, issues);\n expectString(md.direction, `${path}.moveData.direction`, issues);\n }\n }\n}\n\nfunction validatePreservationStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const opaqueFragments = asPlainObject(\n record.opaqueFragments,\n `${path}.opaqueFragments`,\n issues,\n );\n if (opaqueFragments) {\n for (const [fragmentId, fragment] of Object.entries(opaqueFragments)) {\n expectDomainString(fragmentId, \"fragmentId\", `${path}.opaqueFragments.${fragmentId}`, issues);\n const fragmentRecord = asPlainObject(\n fragment,\n `${path}.opaqueFragments.${fragmentId}`,\n issues,\n );\n if (!fragmentRecord) {\n continue;\n }\n if (fragmentRecord.fragmentId !== fragmentId) {\n issues.push({\n path: `${path}.opaqueFragments.${fragmentId}.fragmentId`,\n message: \"fragmentId must match the map key.\",\n });\n }\n validateRange(\n fragmentRecord.lastKnownRange,\n `${path}.opaqueFragments.${fragmentId}.lastKnownRange`,\n issues,\n );\n expectDomainString(\n fragmentRecord.warningId,\n \"warningId\",\n `${path}.opaqueFragments.${fragmentId}.warningId`,\n issues,\n );\n if (fragmentRecord.packagePartName !== undefined) {\n expectDomainString(\n fragmentRecord.packagePartName,\n \"packagePartName\",\n `${path}.opaqueFragments.${fragmentId}.packagePartName`,\n issues,\n );\n }\n if (fragmentRecord.relationshipId !== undefined) {\n expectDomainString(\n fragmentRecord.relationshipId,\n \"relationshipId\",\n `${path}.opaqueFragments.${fragmentId}.relationshipId`,\n issues,\n );\n }\n }\n }\n\n const packageParts = asPlainObject(record.packageParts, `${path}.packageParts`, issues);\n if (packageParts) {\n for (const [packagePartName, packagePart] of Object.entries(packageParts)) {\n expectDomainString(\n packagePartName,\n \"packagePartName\",\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n const packagePartRecord = asPlainObject(\n packagePart,\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n if (!packagePartRecord) {\n continue;\n }\n if (packagePartRecord.packagePartName !== packagePartName) {\n issues.push({\n path: `${path}.packageParts.${packagePartName}.packagePartName`,\n message: \"packagePartName must match the map key.\",\n });\n }\n if (Array.isArray(packagePartRecord.relationshipIds)) {\n packagePartRecord.relationshipIds.forEach((relationshipId, index) =>\n expectDomainString(\n relationshipId,\n \"relationshipId\",\n `${path}.packageParts.${packagePartName}.relationshipIds[${index}]`,\n issues,\n ),\n );\n }\n }\n }\n}\n\nfunction validateDiagnosticStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (Array.isArray(record.warnings)) {\n record.warnings.forEach((warning, index) => {\n const warningRecord = asPlainObject(warning, `${path}.warnings[${index}]`, issues);\n if (!warningRecord) {\n return;\n }\n expectDomainString(\n warningRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.warnings[${index}].diagnosticId`,\n issues,\n );\n expectDomainString(\n warningRecord.warningId,\n \"warningId\",\n `${path}.warnings[${index}].warningId`,\n issues,\n );\n });\n }\n\n if (Array.isArray(record.errors)) {\n record.errors.forEach((error, index) => {\n const errorRecord = asPlainObject(error, `${path}.errors[${index}]`, issues);\n if (!errorRecord) {\n return;\n }\n expectDomainString(\n errorRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.errors[${index}].diagnosticId`,\n issues,\n );\n });\n }\n}\n\nfunction validateAnchor(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const kind = expectString(record.kind, `${path}.kind`, issues);\n if (!kind) {\n return;\n }\n\n if (kind === \"range\") {\n validateRange(record.range, `${path}.range`, issues);\n validateBoundaryAssoc(record.assoc, `${path}.assoc`, issues);\n } else if (kind === \"node\") {\n if (typeof record.at !== \"number\") {\n issues.push({\n path: `${path}.at`,\n message: \"node anchors must contain a numeric at value.\",\n });\n }\n if (record.assoc !== -1 && record.assoc !== 1) {\n issues.push({\n path: `${path}.assoc`,\n message: \"node anchor assoc must be -1 or 1.\",\n });\n }\n } else if (kind === \"detached\") {\n validateRange(record.lastKnownRange, `${path}.lastKnownRange`, issues);\n if (\n record.reason !== \"deleted\" &&\n record.reason !== \"invalidatedByStructureChange\" &&\n record.reason !== \"importAmbiguity\"\n ) {\n issues.push({\n path: `${path}.reason`,\n message: \"detached anchor reason must be deleted, invalidatedByStructureChange, or importAmbiguity.\",\n });\n }\n } else {\n issues.push({\n path: `${path}.kind`,\n message: \"anchor kind must be range, node, or detached.\",\n });\n }\n}\n\nfunction validateBoundaryAssoc(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.start !== -1 && record.start !== 1) {\n issues.push({\n path: `${path}.start`,\n message: \"assoc.start must be -1 or 1.\",\n });\n }\n if (record.end !== -1 && record.end !== 1) {\n issues.push({\n path: `${path}.end`,\n message: \"assoc.end must be -1 or 1.\",\n });\n }\n}\n\nfunction validateDocumentReferences(\n record: Record<string, unknown>,\n issues: ModelValidationIssue[],\n): void {\n const paragraphStyleIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.styles, \"$.styles\", [])?.paragraphs, \"$.styles.paragraphs\", []) ?? {}),\n );\n const numberingInstanceIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.numbering, \"$.numbering\", [])?.instances, \"$.numbering.instances\", []) ?? {}),\n );\n const abstractNumberingIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.numbering, \"$.numbering\", [])?.abstractDefinitions, \"$.numbering.abstractDefinitions\", []) ?? {}),\n );\n const mediaIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.media, \"$.media\", [])?.items, \"$.media.items\", []) ?? {}),\n );\n const warningIds = new Set(\n (Array.isArray(asPlainObject(record.diagnostics, \"$.diagnostics\", [])?.warnings)\n ? (asPlainObject(record.diagnostics, \"$.diagnostics\", [])?.warnings as Array<Record<string, unknown>>)\n : []\n ).flatMap((warning) => typeof warning.warningId === \"string\" ? [warning.warningId] : []),\n );\n const fragmentIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.preservation, \"$.preservation\", [])?.opaqueFragments, \"$.preservation.opaqueFragments\", []) ?? {}),\n );\n const noteIds = collectNoteIds(record);\n\n const numberingInstances = asPlainObject(\n asPlainObject(record.numbering, \"$.numbering\", [])?.instances,\n \"$.numbering.instances\",\n [],\n );\n if (numberingInstances) {\n for (const [instanceId, instance] of Object.entries(numberingInstances)) {\n const instanceRecord = asPlainObject(instance, `$.numbering.instances.${instanceId}`, []);\n if (\n instanceRecord &&\n typeof instanceRecord.abstractNumberingId === \"string\" &&\n !abstractNumberingIds.has(instanceRecord.abstractNumberingId)\n ) {\n issues.push({\n path: `$.numbering.instances.${instanceId}.abstractNumberingId`,\n message: \"abstractNumberingId must reference an existing abstract numbering definition.\",\n });\n }\n }\n }\n\n validateDocumentNodeReferences(record.content, \"$.content\", issues, {\n paragraphStyleIds,\n numberingInstanceIds,\n mediaIds,\n warningIds,\n fragmentIds,\n noteIds,\n });\n validateSubPartReferences(record.subParts, \"$.subParts\", issues, {\n paragraphStyleIds,\n numberingInstanceIds,\n mediaIds,\n warningIds,\n fragmentIds,\n noteIds,\n });\n validateReviewReferences(record.review, \"$.review\", issues, warningIds);\n}\n\nfunction validateDocumentNodeReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n references: {\n paragraphStyleIds: ReadonlySet<string>;\n numberingInstanceIds: ReadonlySet<string>;\n mediaIds: ReadonlySet<string>;\n warningIds: ReadonlySet<string>;\n fragmentIds: ReadonlySet<string>;\n noteIds: ReadonlySet<string>;\n },\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const type = typeof record.type === \"string\" ? record.type : undefined;\n if (type === \"paragraph\") {\n if (\n typeof record.styleId === \"string\" &&\n !references.paragraphStyleIds.has(record.styleId)\n ) {\n issues.push({\n path: `${path}.styleId`,\n message: \"styleId must reference an existing paragraph style definition.\",\n });\n }\n const numbering = asPlainObject(record.numbering, `${path}.numbering`, []);\n if (\n numbering &&\n typeof numbering.numberingInstanceId === \"string\" &&\n !references.numberingInstanceIds.has(numbering.numberingInstanceId)\n ) {\n issues.push({\n path: `${path}.numbering.numberingInstanceId`,\n message: \"numberingInstanceId must reference an existing numbering instance.\",\n });\n }\n } else if (type === \"image\") {\n if (typeof record.mediaId === \"string\" && !references.mediaIds.has(record.mediaId)) {\n issues.push({\n path: `${path}.mediaId`,\n message: \"mediaId must reference an existing media catalog item.\",\n });\n }\n } else if (type === \"opaque_inline\" || type === \"opaque_block\") {\n if (typeof record.fragmentId === \"string\" && !references.fragmentIds.has(record.fragmentId)) {\n issues.push({\n path: `${path}.fragmentId`,\n message: \"fragmentId must reference an existing opaque fragment.\",\n });\n }\n if (typeof record.warningId === \"string\" && !references.warningIds.has(record.warningId)) {\n issues.push({\n path: `${path}.warningId`,\n message: \"warningId must reference an existing diagnostic warning.\",\n });\n }\n } else if (type === \"footnote_ref\") {\n if (typeof record.noteId === \"string\" && !references.noteIds.has(`${record.noteKind}:${record.noteId}`)) {\n issues.push({\n path: `${path}.noteId`,\n message: \"noteId must reference an existing footnote or endnote definition.\",\n });\n }\n }\n\n if (Array.isArray(record.children)) {\n record.children.forEach((child, index) =>\n validateDocumentNodeReferences(child, `${path}.children[${index}]`, issues, references),\n );\n }\n if (Array.isArray(record.rows)) {\n record.rows.forEach((row, index) =>\n validateDocumentNodeReferences(row, `${path}.rows[${index}]`, issues, references),\n );\n }\n if (Array.isArray(record.cells)) {\n record.cells.forEach((cell, index) =>\n validateDocumentNodeReferences(cell, `${path}.cells[${index}]`, issues, references),\n );\n }\n}\n\nfunction validateReviewReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n warningIds: ReadonlySet<string>,\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const comments = asPlainObject(record.comments, `${path}.comments`, []);\n if (comments) {\n for (const [commentId, thread] of Object.entries(comments)) {\n const threadRecord = asPlainObject(thread, `${path}.comments.${commentId}`, []);\n if (!threadRecord || !Array.isArray(threadRecord.warningIds)) {\n continue;\n }\n threadRecord.warningIds.forEach((warningId, index) => {\n if (typeof warningId === \"string\" && !warningIds.has(warningId)) {\n issues.push({\n path: `${path}.comments.${commentId}.warningIds[${index}]`,\n message: \"warningIds must reference existing diagnostic warnings.\",\n });\n }\n });\n }\n }\n\n const revisions = asPlainObject(record.revisions, `${path}.revisions`, []);\n if (revisions) {\n for (const [revisionId, revision] of Object.entries(revisions)) {\n const revisionRecord = asPlainObject(revision, `${path}.revisions.${revisionId}`, []);\n if (!revisionRecord || !Array.isArray(revisionRecord.warningIds)) {\n continue;\n }\n revisionRecord.warningIds.forEach((warningId, index) => {\n if (typeof warningId === \"string\" && !warningIds.has(warningId)) {\n issues.push({\n path: `${path}.revisions.${revisionId}.warningIds[${index}]`,\n message: \"warningIds must reference existing diagnostic warnings.\",\n });\n }\n });\n }\n }\n}\n\nfunction validateSubPartReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n references: {\n paragraphStyleIds: ReadonlySet<string>;\n numberingInstanceIds: ReadonlySet<string>;\n mediaIds: ReadonlySet<string>;\n warningIds: ReadonlySet<string>;\n fragmentIds: ReadonlySet<string>;\n noteIds: ReadonlySet<string>;\n },\n): void {\n if (value === undefined) {\n return;\n }\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const headers = Array.isArray(record.headers) ? record.headers : [];\n headers.forEach((header, index) => {\n const headerRecord = asPlainObject(header, `${path}.headers[${index}]`, []);\n if (!headerRecord || !Array.isArray(headerRecord.blocks)) {\n return;\n }\n headerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(block, `${path}.headers[${index}].blocks[${blockIndex}]`, issues, references),\n );\n });\n\n const footers = Array.isArray(record.footers) ? record.footers : [];\n footers.forEach((footer, index) => {\n const footerRecord = asPlainObject(footer, `${path}.footers[${index}]`, []);\n if (!footerRecord || !Array.isArray(footerRecord.blocks)) {\n return;\n }\n footerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(block, `${path}.footers[${index}].blocks[${blockIndex}]`, issues, references),\n );\n });\n\n if (record.footnoteCollection !== undefined) {\n const footnoteCollection = asPlainObject(record.footnoteCollection, `${path}.footnoteCollection`, []);\n const footnotes = asPlainObject(footnoteCollection?.footnotes, `${path}.footnoteCollection.footnotes`, []);\n if (footnotes) {\n for (const [noteId, note] of Object.entries(footnotes)) {\n const noteRecord = asPlainObject(note, `${path}.footnoteCollection.footnotes.${noteId}`, []);\n if (!noteRecord || !Array.isArray(noteRecord.blocks)) {\n continue;\n }\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(\n block,\n `${path}.footnoteCollection.footnotes.${noteId}.blocks[${blockIndex}]`,\n issues,\n references,\n ),\n );\n }\n }\n\n const endnotes = asPlainObject(footnoteCollection?.endnotes, `${path}.footnoteCollection.endnotes`, []);\n if (endnotes) {\n for (const [noteId, note] of Object.entries(endnotes)) {\n const noteRecord = asPlainObject(note, `${path}.footnoteCollection.endnotes.${noteId}`, []);\n if (!noteRecord || !Array.isArray(noteRecord.blocks)) {\n continue;\n }\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(\n block,\n `${path}.footnoteCollection.endnotes.${noteId}.blocks[${blockIndex}]`,\n issues,\n references,\n ),\n );\n }\n }\n }\n}\n\nfunction collectNoteIds(record: Record<string, unknown>): Set<string> {\n const noteIds = new Set<string>();\n const subParts = asPlainObject(record.subParts, \"$.subParts\", []);\n const footnoteCollection = asPlainObject(subParts?.footnoteCollection, \"$.subParts.footnoteCollection\", []);\n const footnotes = asPlainObject(footnoteCollection?.footnotes, \"$.subParts.footnoteCollection.footnotes\", []);\n if (footnotes) {\n Object.keys(footnotes).forEach((noteId) => noteIds.add(`footnote:${noteId}`));\n }\n const endnotes = asPlainObject(footnoteCollection?.endnotes, \"$.subParts.footnoteCollection.endnotes\", []);\n if (endnotes) {\n Object.keys(endnotes).forEach((noteId) => noteIds.add(`endnote:${noteId}`));\n }\n return noteIds;\n}\n\nfunction validateRange(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (typeof record.from !== \"number\" || typeof record.to !== \"number\") {\n issues.push({\n path,\n message: \"Range must contain numeric from and to values.\",\n });\n }\n}\n\nfunction validateExactObjectKeys(\n record: Record<string, unknown>,\n expectedKeys: readonly string[],\n path: string,\n issues: ModelValidationIssue[],\n allowedOptionalKeys?: readonly string[],\n): void {\n const actualKeys = new Set(Object.keys(record));\n const expected = new Set(expectedKeys);\n const optional = new Set(allowedOptionalKeys ?? []);\n\n for (const expectedKey of expectedKeys) {\n if (!actualKeys.has(expectedKey)) {\n issues.push({\n path,\n message: `Missing required key ${JSON.stringify(expectedKey)}.`,\n });\n }\n }\n\n for (const actualKey of actualKeys) {\n if (!expected.has(actualKey) && !optional.has(actualKey)) {\n issues.push({\n path: `${path}.${actualKey}`,\n message:\n \"Unexpected canonical document key. Render/UI state is not part of the canonical envelope.\",\n });\n }\n }\n}\n\nfunction validateSubPartsCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (value === undefined) {\n return;\n }\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.headers !== undefined) {\n if (!Array.isArray(record.headers)) {\n issues.push({ path: `${path}.headers`, message: \"headers must be an array.\" });\n } else {\n record.headers.forEach((header, index) => {\n const headerRecord = asPlainObject(header, `${path}.headers[${index}]`, issues);\n if (headerRecord) {\n expectString(headerRecord.variant, `${path}.headers[${index}].variant`, issues);\n expectString(headerRecord.partPath, `${path}.headers[${index}].partPath`, issues);\n expectString(headerRecord.relationshipId, `${path}.headers[${index}].relationshipId`, issues);\n if (!Array.isArray(headerRecord.blocks)) {\n issues.push({ path: `${path}.headers[${index}].blocks`, message: \"blocks must be an array.\" });\n } else {\n headerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.headers[${index}].blocks[${blockIndex}]`, issues),\n );\n }\n }\n });\n }\n }\n\n if (record.footers !== undefined) {\n if (!Array.isArray(record.footers)) {\n issues.push({ path: `${path}.footers`, message: \"footers must be an array.\" });\n } else {\n record.footers.forEach((footer, index) => {\n const footerRecord = asPlainObject(footer, `${path}.footers[${index}]`, issues);\n if (footerRecord) {\n expectString(footerRecord.variant, `${path}.footers[${index}].variant`, issues);\n expectString(footerRecord.partPath, `${path}.footers[${index}].partPath`, issues);\n expectString(footerRecord.relationshipId, `${path}.footers[${index}].relationshipId`, issues);\n if (!Array.isArray(footerRecord.blocks)) {\n issues.push({ path: `${path}.footers[${index}].blocks`, message: \"blocks must be an array.\" });\n } else {\n footerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.footers[${index}].blocks[${blockIndex}]`, issues),\n );\n }\n }\n });\n }\n }\n\n if (record.footnoteCollection !== undefined) {\n const footnoteCollection = asPlainObject(record.footnoteCollection, `${path}.footnoteCollection`, issues);\n if (footnoteCollection) {\n validateSubPartNoteMap(footnoteCollection.footnotes, \"footnote\", `${path}.footnoteCollection.footnotes`, issues);\n validateSubPartNoteMap(footnoteCollection.endnotes, \"endnote\", `${path}.footnoteCollection.endnotes`, issues);\n }\n }\n}\n\nfunction validateSubPartNoteMap(\n value: unknown,\n expectedKind: \"footnote\" | \"endnote\",\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [noteId, note] of Object.entries(record)) {\n const noteRecord = asPlainObject(note, `${path}.${noteId}`, issues);\n if (!noteRecord) {\n continue;\n }\n expectString(noteRecord.noteId, `${path}.${noteId}.noteId`, issues);\n if (noteRecord.noteId !== noteId) {\n issues.push({\n path: `${path}.${noteId}.noteId`,\n message: \"noteId must match the map key.\",\n });\n }\n if (noteRecord.kind !== expectedKind) {\n issues.push({\n path: `${path}.${noteId}.kind`,\n message: `kind must be ${expectedKind}.`,\n });\n }\n if (!Array.isArray(noteRecord.blocks)) {\n issues.push({ path: `${path}.${noteId}.blocks`, message: \"blocks must be an array.\" });\n } else {\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.${noteId}.blocks[${blockIndex}]`, issues),\n );\n }\n }\n}\n\nfunction expectDomainString(\n value: unknown,\n domain: StableIdDomain,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n const stableId = expectString(value, path, issues);\n if (!stableId) {\n return null;\n }\n\n if (!ID_PATTERNS[domain].test(stableId)) {\n issues.push({\n path,\n message: `Expected a valid ${domain}.`,\n });\n return null;\n }\n\n return stableId;\n}\n","import {\n CDS_SCHEMA_VERSION,\n COMPATIBILITY_REPORT_VERSION,\n LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION,\n PERSISTED_EDITOR_SNAPSHOT_VERSION,\n type CompatibilityReportVersion,\n type Base64,\n type ISO8601DateTime,\n type ModelValidationIssue,\n type PersistedEditorSnapshotVersion,\n asPlainObject,\n assertValid,\n expectExactString,\n expectIso8601UtcTimestamp,\n expectString,\n stableStringify,\n} from \"./cds-1.0.0.ts\";\nimport {\n type CanonicalDocument,\n assertCanonicalDocument,\n validateCanonicalDocument,\n} from \"./canonical-document.ts\";\n\nexport type EditorWarningCode =\n | \"unsupported_ooxml_preserved\"\n | \"unsupported_ooxml_locked\"\n | \"import_normalized\"\n | \"export_roundtrip_risk\"\n | \"comment_anchor_detached\"\n | \"revision_anchor_detached\"\n | \"large_document_degraded\"\n | \"font_substitution\"\n | \"image_missing\";\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n affectedAnchor?: Record<string, unknown>;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport type EditorErrorCode =\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n\nexport interface EditorError {\n errorId: string;\n code: EditorErrorCode;\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: Record<string, unknown>;\n}\n\nexport type CompatibilityFeatureClass =\n | \"supported-roundtrip\"\n | \"preserve-only\"\n | \"unsupported-fatal\";\n\nexport interface CompatibilityFeatureEntry {\n featureEntryId: string;\n featureKey: string;\n featureClass: CompatibilityFeatureClass;\n message: string;\n affectedAnchor?: Record<string, unknown>;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityReport {\n reportVersion: CompatibilityReportVersion;\n generatedAt: ISO8601DateTime;\n blockExport: boolean;\n featureEntries: CompatibilityFeatureEntry[];\n warnings: EditorWarning[];\n errors: EditorError[];\n}\n\nexport interface PersistedSourcePackage {\n format: \"docx\";\n storage: \"embedded-base64\";\n mimeType: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n sourceLabel?: string;\n sha256Hex: string;\n bytesBase64: Base64;\n}\n\nexport interface PersistedEditorSnapshot {\n snapshotVersion: PersistedEditorSnapshotVersion;\n schemaVersion: typeof CDS_SCHEMA_VERSION;\n documentId: string;\n docId: string;\n createdAt: ISO8601DateTime;\n updatedAt: ISO8601DateTime;\n savedAt: ISO8601DateTime;\n editorBuild: string;\n canonicalDocument: CanonicalDocument;\n compatibility: CompatibilityReport;\n warningLog: EditorWarning[];\n protectionSnapshot?: ProtectionSnapshotRecord;\n sourcePackage?: PersistedSourcePackage;\n}\n\nconst SNAPSHOT_REQUIRED_TOP_LEVEL_KEYS = [\n \"snapshotVersion\",\n \"schemaVersion\",\n \"documentId\",\n \"docId\",\n \"createdAt\",\n \"updatedAt\",\n \"savedAt\",\n \"editorBuild\",\n \"canonicalDocument\",\n \"compatibility\",\n \"warningLog\",\n] as const;\n\nconst SNAPSHOT_OPTIONAL_TOP_LEVEL_KEYS = [\"sourcePackage\", \"protectionSnapshot\"] as const;\n\nexport interface ProtectionRangeRecord {\n rangeId: string;\n start?: number;\n end?: number;\n editorGroup?: string;\n editor?: string;\n enforced: boolean;\n enforcementReason: string;\n}\n\nexport interface ProtectionSnapshotRecord {\n hasDocumentProtection: boolean;\n editType?: string;\n enforcementActive: boolean;\n ranges: ProtectionRangeRecord[];\n enforcedRangeCount: number;\n preservedRangeCount: number;\n}\n\nconst PERSISTED_EDITOR_SNAPSHOT_VERSIONS = new Set<PersistedEditorSnapshotVersion>([\n LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION,\n PERSISTED_EDITOR_SNAPSHOT_VERSION,\n]);\n\nconst DOCX_SOURCE_PACKAGE_MIME_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\nconst COMPATIBILITY_FEATURE_CLASSES = new Set<CompatibilityFeatureClass>([\n \"supported-roundtrip\",\n \"preserve-only\",\n \"unsupported-fatal\",\n]);\nconst EDITOR_WARNING_CODES = new Set<EditorWarningCode>([\n \"unsupported_ooxml_preserved\",\n \"unsupported_ooxml_locked\",\n \"import_normalized\",\n \"export_roundtrip_risk\",\n \"comment_anchor_detached\",\n \"revision_anchor_detached\",\n \"large_document_degraded\",\n \"font_substitution\",\n \"image_missing\",\n]);\nconst EDITOR_WARNING_SEVERITIES = new Set<EditorWarning[\"severity\"]>([\"info\", \"warning\"]);\nconst EDITOR_WARNING_SOURCES = new Set<EditorWarning[\"source\"]>([\n \"import\",\n \"runtime\",\n \"review\",\n \"preservation\",\n \"validation\",\n \"export\",\n]);\nconst EDITOR_ERROR_CODES = new Set<EditorErrorCode>([\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n \"datastore_failed\",\n \"internal_invariant\",\n]);\nconst EDITOR_ERROR_SOURCES = new Set<EditorError[\"source\"]>([\n \"import\",\n \"runtime\",\n \"validation\",\n \"datastore\",\n \"host\",\n \"export\",\n]);\n\nexport function serializePersistedEditorSnapshot(\n snapshot: PersistedEditorSnapshot,\n): string {\n assertPersistedEditorSnapshot(snapshot);\n return stableStringify(snapshot);\n}\n\nexport function parsePersistedEditorSnapshot(\n json: string,\n): PersistedEditorSnapshot {\n const parsed = JSON.parse(json) as unknown;\n assertPersistedEditorSnapshot(parsed);\n return parsed;\n}\n\nexport function assertPersistedEditorSnapshot(\n snapshot: unknown,\n): asserts snapshot is PersistedEditorSnapshot {\n const issues = validatePersistedEditorSnapshot(snapshot);\n assertValid(issues, \"Invalid persisted editor snapshot.\");\n}\n\nexport function validatePersistedEditorSnapshot(\n snapshot: unknown,\n): ModelValidationIssue[] {\n const issues: ModelValidationIssue[] = [];\n const record = asPlainObject(snapshot, \"$\", issues);\n if (!record) {\n return issues;\n }\n\n validateExactObjectKeys(\n record,\n SNAPSHOT_REQUIRED_TOP_LEVEL_KEYS,\n SNAPSHOT_OPTIONAL_TOP_LEVEL_KEYS,\n \"$\",\n issues,\n );\n\n validateSnapshotVersion(record.snapshotVersion, \"$.snapshotVersion\", issues);\n expectExactString(\n record.schemaVersion,\n CDS_SCHEMA_VERSION,\n \"$.schemaVersion\",\n issues,\n );\n expectString(record.documentId, \"$.documentId\", issues);\n expectString(record.docId, \"$.docId\", issues);\n expectIso8601UtcTimestamp(record.createdAt, \"$.createdAt\", issues);\n expectIso8601UtcTimestamp(record.updatedAt, \"$.updatedAt\", issues);\n expectIso8601UtcTimestamp(record.savedAt, \"$.savedAt\", issues);\n expectString(record.editorBuild, \"$.editorBuild\", issues);\n\n const canonicalDocumentIssues = validateCanonicalDocument(record.canonicalDocument);\n issues.push(...canonicalDocumentIssues.map(prefixIssue(\"$.canonicalDocument\")));\n\n if (\n asPlainObject(record.canonicalDocument, \"$.canonicalDocument\", [])?.docId !==\n record.docId\n ) {\n issues.push({\n path: \"$.docId\",\n message: \"Snapshot docId must match canonicalDocument.docId.\",\n });\n }\n\n validateCompatibilityReport(record.compatibility, \"$.compatibility\", issues);\n\n if (!Array.isArray(record.warningLog)) {\n issues.push({\n path: \"$.warningLog\",\n message: \"warningLog must be an array.\",\n });\n } else {\n record.warningLog.forEach((warning, index) => {\n validateEditorWarning(warning, `$.warningLog[${index}]`, issues);\n });\n }\n\n if (record.sourcePackage !== undefined) {\n validatePersistedSourcePackage(record.sourcePackage, \"$.sourcePackage\", issues);\n }\n if (record.protectionSnapshot !== undefined) {\n validateProtectionSnapshot(record.protectionSnapshot, \"$.protectionSnapshot\", issues);\n }\n\n return issues;\n}\n\nexport function assertCompatibilityReport(\n report: unknown,\n): asserts report is CompatibilityReport {\n const issues = validateCompatibilityReport(report);\n assertValid(issues, \"Invalid compatibility report.\");\n}\n\nexport function validateCompatibilityReport(\n report: unknown,\n path = \"$\",\n issues: ModelValidationIssue[] = [],\n): ModelValidationIssue[] {\n const record = asPlainObject(report, path, issues);\n if (!record) {\n return issues;\n }\n\n expectExactString(\n record.reportVersion,\n COMPATIBILITY_REPORT_VERSION,\n `${path}.reportVersion`,\n issues,\n );\n expectIso8601UtcTimestamp(record.generatedAt, `${path}.generatedAt`, issues);\n\n if (typeof record.blockExport !== \"boolean\") {\n issues.push({\n path: `${path}.blockExport`,\n message: \"blockExport must be a boolean.\",\n });\n }\n\n if (!Array.isArray(record.featureEntries)) {\n issues.push({\n path: `${path}.featureEntries`,\n message: \"featureEntries must be an array.\",\n });\n } else {\n record.featureEntries.forEach((featureEntry, index) => {\n validateCompatibilityFeatureEntry(\n featureEntry,\n `${path}.featureEntries[${index}]`,\n issues,\n );\n });\n }\n\n if (!Array.isArray(record.warnings)) {\n issues.push({\n path: `${path}.warnings`,\n message: \"warnings must be an array.\",\n });\n } else {\n record.warnings.forEach((warning, index) => {\n validateEditorWarning(warning, `${path}.warnings[${index}]`, issues);\n });\n }\n\n if (!Array.isArray(record.errors)) {\n issues.push({\n path: `${path}.errors`,\n message: \"errors must be an array.\",\n });\n } else {\n record.errors.forEach((error, index) => {\n validateEditorError(error, `${path}.errors[${index}]`, issues);\n });\n }\n\n return issues;\n}\n\nfunction validateCompatibilityFeatureEntry(\n featureEntry: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(featureEntry, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.featureEntryId, `${path}.featureEntryId`, issues);\n expectString(record.featureKey, `${path}.featureKey`, issues);\n if (\n typeof record.featureClass !== \"string\" ||\n !COMPATIBILITY_FEATURE_CLASSES.has(record.featureClass as CompatibilityFeatureClass)\n ) {\n issues.push({\n path: `${path}.featureClass`,\n message: \"featureClass must be supported-roundtrip, preserve-only, or unsupported-fatal.\",\n });\n }\n expectString(record.message, `${path}.message`, issues);\n}\n\nfunction validateEditorWarning(\n warning: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(warning, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.warningId, `${path}.warningId`, issues);\n if (typeof record.code !== \"string\" || !EDITOR_WARNING_CODES.has(record.code as EditorWarningCode)) {\n issues.push({\n path: `${path}.code`,\n message: `code must be one of ${JSON.stringify([...EDITOR_WARNING_CODES])}.`,\n });\n }\n if (\n typeof record.severity !== \"string\" ||\n !EDITOR_WARNING_SEVERITIES.has(record.severity as EditorWarning[\"severity\"])\n ) {\n issues.push({\n path: `${path}.severity`,\n message: \"severity must be info or warning.\",\n });\n }\n expectString(record.message, `${path}.message`, issues);\n if (\n typeof record.source !== \"string\" ||\n !EDITOR_WARNING_SOURCES.has(record.source as EditorWarning[\"source\"])\n ) {\n issues.push({\n path: `${path}.source`,\n message: `source must be one of ${JSON.stringify([...EDITOR_WARNING_SOURCES])}.`,\n });\n }\n}\n\nfunction validateEditorError(\n error: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(error, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.errorId, `${path}.errorId`, issues);\n if (typeof record.code !== \"string\" || !EDITOR_ERROR_CODES.has(record.code as EditorErrorCode)) {\n issues.push({\n path: `${path}.code`,\n message: `code must be one of ${JSON.stringify([...EDITOR_ERROR_CODES])}.`,\n });\n }\n expectString(record.message, `${path}.message`, issues);\n if (\n typeof record.source !== \"string\" ||\n !EDITOR_ERROR_SOURCES.has(record.source as EditorError[\"source\"])\n ) {\n issues.push({\n path: `${path}.source`,\n message: `source must be one of ${JSON.stringify([...EDITOR_ERROR_SOURCES])}.`,\n });\n }\n\n if (typeof record.isFatal !== \"boolean\") {\n issues.push({\n path: `${path}.isFatal`,\n message: \"isFatal must be a boolean.\",\n });\n }\n}\n\nfunction validateExactObjectKeys(\n record: Record<string, unknown>,\n requiredKeys: readonly string[],\n optionalKeys: readonly string[],\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const actualKeys = new Set(Object.keys(record));\n const allowedKeys = new Set([...requiredKeys, ...optionalKeys]);\n\n for (const requiredKey of requiredKeys) {\n if (!actualKeys.has(requiredKey)) {\n issues.push({\n path,\n message: `Missing required key ${JSON.stringify(requiredKey)}.`,\n });\n }\n }\n\n for (const actualKey of actualKeys) {\n if (!allowedKeys.has(actualKey)) {\n issues.push({\n path: `${path}.${actualKey}`,\n message:\n \"Unexpected persisted snapshot key. Render/UI state is not part of the persistence contract.\",\n });\n }\n }\n}\n\nfunction prefixIssue(basePath: string) {\n return (issue: ModelValidationIssue): ModelValidationIssue => ({\n path: `${basePath}${issue.path === \"$\" ? \"\" : issue.path.slice(1)}`,\n message: issue.message,\n });\n}\n\nfunction validateSnapshotVersion(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): PersistedEditorSnapshotVersion | null {\n if (typeof value !== \"string\" || !PERSISTED_EDITOR_SNAPSHOT_VERSIONS.has(value as never)) {\n issues.push({\n path,\n message: `Expected one of ${JSON.stringify([...PERSISTED_EDITOR_SNAPSHOT_VERSIONS])}.`,\n });\n return null;\n }\n\n return value as PersistedEditorSnapshotVersion;\n}\n\nfunction validatePersistedSourcePackage(\n sourcePackage: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(sourcePackage, path, issues);\n if (!record) {\n return;\n }\n\n validateExactObjectKeys(\n record,\n [\"format\", \"storage\", \"mimeType\", \"sha256Hex\", \"bytesBase64\"],\n [\"sourceLabel\"],\n path,\n issues,\n );\n expectExactString(record.format, \"docx\", `${path}.format`, issues);\n expectExactString(record.storage, \"embedded-base64\", `${path}.storage`, issues);\n expectExactString(\n record.mimeType,\n DOCX_SOURCE_PACKAGE_MIME_TYPE,\n `${path}.mimeType`,\n issues,\n );\n expectString(record.sha256Hex, `${path}.sha256Hex`, issues);\n expectString(record.bytesBase64, `${path}.bytesBase64`, issues);\n\n if (\n typeof record.sha256Hex === \"string\" &&\n !/^[0-9a-f]{64}$/u.test(record.sha256Hex)\n ) {\n issues.push({\n path: `${path}.sha256Hex`,\n message: \"Expected a lowercase SHA-256 hex digest.\",\n });\n }\n\n if (record.sourceLabel !== undefined) {\n expectString(record.sourceLabel, `${path}.sourceLabel`, issues);\n }\n}\n\nexport function createPersistedEditorSnapshot(params: {\n documentId: string;\n savedAt: ISO8601DateTime;\n editorBuild: string;\n canonicalDocument: CanonicalDocument;\n compatibility: CompatibilityReport;\n warningLog?: EditorWarning[];\n protectionSnapshot?: ProtectionSnapshotRecord;\n sourcePackage?: PersistedSourcePackage;\n}): PersistedEditorSnapshot {\n assertCanonicalDocument(params.canonicalDocument);\n assertCompatibilityReport(params.compatibility);\n\n return {\n snapshotVersion: PERSISTED_EDITOR_SNAPSHOT_VERSION,\n schemaVersion: CDS_SCHEMA_VERSION,\n documentId: params.documentId,\n docId: params.canonicalDocument.docId,\n createdAt: params.canonicalDocument.createdAt,\n updatedAt: params.canonicalDocument.updatedAt,\n savedAt: params.savedAt,\n editorBuild: params.editorBuild,\n canonicalDocument: params.canonicalDocument,\n compatibility: params.compatibility,\n warningLog: params.warningLog ?? params.compatibility.warnings,\n protectionSnapshot: params.protectionSnapshot,\n sourcePackage: params.sourcePackage,\n };\n}\n\nfunction validateProtectionSnapshot(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n if (typeof record.hasDocumentProtection !== \"boolean\") {\n issues.push({ path: `${path}.hasDocumentProtection`, message: \"hasDocumentProtection must be a boolean.\" });\n }\n if (record.editType !== undefined) {\n expectString(record.editType, `${path}.editType`, issues);\n }\n if (typeof record.enforcementActive !== \"boolean\") {\n issues.push({ path: `${path}.enforcementActive`, message: \"enforcementActive must be a boolean.\" });\n }\n if (!Array.isArray(record.ranges)) {\n issues.push({ path: `${path}.ranges`, message: \"ranges must be an array.\" });\n } else {\n record.ranges.forEach((range, index) => validateProtectionRange(range, `${path}.ranges[${index}]`, issues));\n }\n if (!Number.isInteger(record.enforcedRangeCount)) {\n issues.push({ path: `${path}.enforcedRangeCount`, message: \"enforcedRangeCount must be an integer.\" });\n }\n if (!Number.isInteger(record.preservedRangeCount)) {\n issues.push({ path: `${path}.preservedRangeCount`, message: \"preservedRangeCount must be an integer.\" });\n }\n}\n\nfunction validateProtectionRange(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n expectString(record.rangeId, `${path}.rangeId`, issues);\n if (record.start !== undefined && !Number.isInteger(record.start)) {\n issues.push({ path: `${path}.start`, message: \"start must be an integer.\" });\n }\n if (record.end !== undefined && !Number.isInteger(record.end)) {\n issues.push({ path: `${path}.end`, message: \"end must be an integer.\" });\n }\n if (record.editorGroup !== undefined) {\n expectString(record.editorGroup, `${path}.editorGroup`, issues);\n }\n if (record.editor !== undefined) {\n expectString(record.editor, `${path}.editor`, issues);\n }\n if (typeof record.enforced !== \"boolean\") {\n issues.push({ path: `${path}.enforced`, message: \"enforced must be a boolean.\" });\n }\n expectString(record.enforcementReason, `${path}.enforcementReason`, issues);\n}\n\nexport function projectAnchorToSnapshot(\n anchor: Record<string, unknown>,\n): Record<string, unknown> {\n return JSON.parse(JSON.stringify(anchor)) as Record<string, unknown>;\n}\n","import {\n DEFAULT_BOUNDARY_ASSOC,\n createDetachedAnchor,\n createNodeAnchor,\n createRangeAnchor,\n type EditorAnchorProjection,\n} from \"../selection/mapping.ts\";\nimport { isUuid } from \"../../model/cds-1.0.0.ts\";\nimport {\n assertPersistedEditorSnapshot as assertModelPersistedEditorSnapshot,\n createPersistedEditorSnapshot as createModelPersistedEditorSnapshot,\n validatePersistedEditorSnapshot as validateModelPersistedEditorSnapshot,\n type ProtectionSnapshotRecord as ModelProtectionSnapshotRecord,\n type PersistedEditorSnapshot as ModelPersistedEditorSnapshot,\n} from \"../../model/snapshot.ts\";\nimport {\n assertCanonicalDocument,\n type CanonicalDocument,\n type CommentEntry as ModelCommentEntry,\n type CommentResolution as ModelCommentResolution,\n type CommentThread as ModelCommentThread,\n type RevisionMetadataRecord as ModelRevisionMetadataRecord,\n type RevisionRecord as ModelRevisionRecord,\n} from \"../../model/canonical-document.ts\";\n\nexport type RuntimePhase = \"loading\" | \"ready\" | \"error\";\nexport type EditorWarningCode =\n | \"unsupported_ooxml_preserved\"\n | \"unsupported_ooxml_locked\"\n | \"import_normalized\"\n | \"export_roundtrip_risk\"\n | \"comment_anchor_detached\"\n | \"revision_anchor_detached\"\n | \"large_document_degraded\"\n | \"font_substitution\"\n | \"image_missing\";\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n affectedAnchor?: EditorAnchorProjection;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface EditorError {\n errorId: string;\n code:\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: Record<string, unknown>;\n}\n\nexport type CompatibilityFeatureClass =\n | \"supported-roundtrip\"\n | \"preserve-only\"\n | \"unsupported-fatal\";\n\nexport interface CompatibilityFeatureEntry {\n featureEntryId: string;\n featureKey: string;\n featureClass: CompatibilityFeatureClass;\n message: string;\n affectedAnchor?: EditorAnchorProjection;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityReport {\n reportVersion: \"compatibility-report/1\";\n generatedAt: string;\n blockExport: boolean;\n featureEntries: CompatibilityFeatureEntry[];\n warnings: EditorWarning[];\n errors: EditorError[];\n}\n\nexport type CommentEntryRecord = ModelCommentEntry;\nexport type CommentResolutionRecord = ModelCommentResolution;\nexport type CommentThreadRecord = ModelCommentThread;\nexport type RevisionMetadataRecord = ModelRevisionMetadataRecord;\nexport type RevisionRecord = ModelRevisionRecord;\nexport type ReviewStore = CanonicalDocument[\"review\"];\nexport type CanonicalDocumentEnvelope = CanonicalDocument;\n\nexport interface SelectionSnapshot {\n anchor: number;\n head: number;\n isCollapsed: boolean;\n activeRange: EditorAnchorProjection;\n}\n\nexport interface DocumentStats {\n paragraphCount: number;\n wordCount: number;\n characterCount: number;\n commentCount: number;\n revisionCount: number;\n}\n\nexport interface CommentSidebarSnapshot {\n activeCommentId?: string;\n openThreadCount: number;\n resolvedThreadCount: number;\n threads: CommentThreadRecord[];\n}\n\nexport interface TrackedChangesSnapshot {\n totalCount: number;\n pendingCount: number;\n acceptedCount: number;\n rejectedCount: number;\n}\n\nexport interface CompatibilityPanelSnapshot {\n report: CompatibilityReport;\n blockExport: boolean;\n totalEntries: number;\n}\n\nexport interface CommandStateSnapshot {\n canUndo: boolean;\n canRedo: boolean;\n canAddComment: boolean;\n canAcceptAllChanges: boolean;\n canRejectAllChanges: boolean;\n}\n\nexport interface RuntimeRenderSnapshot {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n revisionToken: string;\n isReady: boolean;\n isDirty: boolean;\n readOnly: boolean;\n selection: SelectionSnapshot;\n documentStats: DocumentStats;\n comments: CommentSidebarSnapshot;\n trackedChanges: TrackedChangesSnapshot;\n compatibility: CompatibilityPanelSnapshot;\n warnings: EditorWarning[];\n fatalError?: EditorError;\n commandState: CommandStateSnapshot;\n}\n\nexport interface PersistedEditorSnapshot\n extends Omit<\n ModelPersistedEditorSnapshot,\n \"canonicalDocument\" | \"compatibility\" | \"warningLog\"\n > {\n canonicalDocument: CanonicalDocumentEnvelope;\n compatibility: CompatibilityReport;\n warningLog: EditorWarning[];\n}\n\nexport interface EditorRuntimeState {\n hasFocus: boolean;\n activeCommentId?: string;\n}\n\nexport interface EditorState {\n phase: RuntimePhase;\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n sourcePackage?: ModelPersistedEditorSnapshot[\"sourcePackage\"];\n revision: number;\n revisionToken: string;\n isDirty: boolean;\n readOnly: boolean;\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n warnings: EditorWarning[];\n compatibility: CompatibilityReport;\n fatalError?: EditorError;\n runtime: EditorRuntimeState;\n}\n\nexport interface CreateEditorStateOptions {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n readOnly?: boolean;\n canonicalDocument?: CanonicalDocumentEnvelope;\n persistedSnapshot?: PersistedEditorSnapshot;\n compatibility?: CompatibilityReport;\n warnings?: EditorWarning[];\n fatalError?: EditorError;\n}\n\nexport function createEmptyReviewStore(): ReviewStore {\n return {\n comments: {},\n revisions: {},\n };\n}\n\nexport function createDefaultCanonicalDocument(\n documentId: string,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n return {\n schemaVersion: \"cds/1.0.0\",\n docId: createCanonicalDocumentId(documentId),\n createdAt: timestamp,\n updatedAt: timestamp,\n metadata: {\n customProperties: {},\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: {\n abstractDefinitions: {},\n instances: {},\n },\n media: {\n items: {},\n },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: createEmptyReviewStore(),\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [],\n },\n };\n}\n\nexport function createSelectionSnapshot(anchor = 0, head = anchor): SelectionSnapshot {\n return {\n anchor,\n head,\n isCollapsed: anchor === head,\n activeRange: createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC),\n };\n}\n\nexport function createEmptyCompatibilityReport(generatedAt: string): CompatibilityReport {\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt,\n blockExport: false,\n featureEntries: [],\n warnings: [],\n errors: [],\n };\n}\n\nexport function createEditorState(options: CreateEditorStateOptions): EditorState {\n const timestamp = new Date(0).toISOString();\n const normalizedSnapshot = options.persistedSnapshot\n ? normalizePersistedSnapshotForRuntime(options.persistedSnapshot, options.documentId, timestamp)\n : undefined;\n if (options.canonicalDocument) {\n assertCanonicalDocument(options.canonicalDocument as unknown);\n }\n\n const normalizedDocument = normalizedSnapshot\n ? structuredClone(normalizedSnapshot.canonicalDocument)\n : options.canonicalDocument\n ? structuredClone(options.canonicalDocument)\n : createDefaultCanonicalDocument(options.documentId, timestamp);\n const warnings = normalizedSnapshot\n ? normalizeWarningLog(normalizedSnapshot.warningLog)\n : options.warnings ?? [];\n const compatibility =\n normalizedSnapshot\n ? normalizeCompatibilityReport(normalizedSnapshot.compatibility)\n : options.compatibility ?? createEmptyCompatibilityReport(normalizedDocument.updatedAt);\n\n return {\n phase: options.fatalError ? \"error\" : \"ready\",\n documentId: options.documentId,\n sessionId: options.sessionId,\n sourceLabel: options.sourceLabel,\n sourcePackage: normalizedSnapshot?.sourcePackage,\n revision: 0,\n revisionToken: `${options.sessionId}:0`,\n isDirty: false,\n readOnly: options.readOnly ?? false,\n document: normalizedDocument,\n selection: createSelectionSnapshot(),\n warnings,\n compatibility,\n fatalError: options.fatalError,\n runtime: {\n hasFocus: false,\n },\n };\n}\n\nfunction normalizePersistedSnapshotForRuntime(\n snapshot: PersistedEditorSnapshot,\n documentId: string,\n timestamp: string,\n): PersistedEditorSnapshot {\n const issues = validateModelPersistedEditorSnapshot(snapshot as unknown);\n if (issues.length === 0) {\n return snapshot;\n }\n\n if (!isRecord(snapshot) || !isRecord(snapshot.canonicalDocument)) {\n assertModelPersistedEditorSnapshot(snapshot as unknown);\n }\n\n const normalizedDocument = normalizeCanonicalDocumentEnvelope(\n snapshot.canonicalDocument,\n documentId,\n timestamp,\n );\n try {\n assertCanonicalDocument(normalizedDocument as unknown);\n } catch {\n assertModelPersistedEditorSnapshot(snapshot as unknown);\n }\n const repairWarning = createSnapshotRepairWarning(issues.length);\n const compatibility = coerceCompatibilityReport(\n snapshot.compatibility,\n normalizedDocument.updatedAt,\n repairWarning,\n );\n\n return {\n snapshotVersion:\n snapshot.snapshotVersion === \"persisted-editor-snapshot/1\" ||\n snapshot.snapshotVersion === \"persisted-editor-snapshot/2\"\n ? snapshot.snapshotVersion\n : \"persisted-editor-snapshot/2\",\n schemaVersion: \"cds/1.0.0\",\n documentId:\n typeof snapshot.documentId === \"string\" && snapshot.documentId.length > 0\n ? snapshot.documentId\n : documentId,\n docId: normalizedDocument.docId,\n createdAt: normalizedDocument.createdAt,\n updatedAt: normalizedDocument.updatedAt,\n savedAt:\n typeof snapshot.savedAt === \"string\" && snapshot.savedAt.length > 0\n ? snapshot.savedAt\n : normalizedDocument.updatedAt,\n editorBuild:\n typeof snapshot.editorBuild === \"string\" && snapshot.editorBuild.length > 0\n ? snapshot.editorBuild\n : \"dev\",\n canonicalDocument: normalizedDocument,\n compatibility,\n warningLog: dedupeWarnings([\n ...coerceWarnings(snapshot.warningLog),\n repairWarning,\n ]),\n sourcePackage: snapshot.sourcePackage,\n };\n}\n\nfunction normalizeCanonicalDocumentEnvelope(\n value: unknown,\n documentId: string,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n const base = createDefaultCanonicalDocument(documentId, timestamp);\n const record = isRecord(value) ? value : {};\n const metadata = isRecord(record.metadata) ? record.metadata : {};\n\n return {\n ...base,\n ...record,\n schemaVersion: \"cds/1.0.0\",\n docId: isUuid(record.docId) ? record.docId : createCanonicalDocumentId(documentId),\n createdAt:\n typeof record.createdAt === \"string\" && record.createdAt.length > 0\n ? record.createdAt\n : base.createdAt,\n updatedAt:\n typeof record.updatedAt === \"string\" && record.updatedAt.length > 0\n ? record.updatedAt\n : base.updatedAt,\n metadata: {\n ...base.metadata,\n ...metadata,\n customProperties: isRecord(metadata.customProperties)\n ? (Object.fromEntries(\n Object.entries(metadata.customProperties).filter(([, entry]) => typeof entry === \"string\"),\n ) as Record<string, string>)\n : {},\n },\n styles:\n record.styles === undefined\n ? base.styles\n : (record.styles as CanonicalDocumentEnvelope[\"styles\"]),\n numbering:\n record.numbering === undefined\n ? base.numbering\n : (record.numbering as CanonicalDocumentEnvelope[\"numbering\"]),\n media:\n record.media === undefined\n ? base.media\n : (record.media as CanonicalDocumentEnvelope[\"media\"]),\n content: isRecord(record.content)\n ? (record.content as unknown as CanonicalDocumentEnvelope[\"content\"])\n : base.content,\n review:\n record.review === undefined\n ? base.review\n : (record.review as CanonicalDocumentEnvelope[\"review\"]),\n preservation:\n record.preservation === undefined\n ? base.preservation\n : (record.preservation as CanonicalDocumentEnvelope[\"preservation\"]),\n diagnostics:\n record.diagnostics === undefined\n ? base.diagnostics\n : (record.diagnostics as CanonicalDocumentEnvelope[\"diagnostics\"]),\n ...(isRecord(record.subParts)\n ? { subParts: record.subParts as unknown as CanonicalDocumentEnvelope[\"subParts\"] }\n : {}),\n };\n}\n\nfunction coerceCompatibilityReport(\n value: unknown,\n generatedAt: string,\n repairWarning: EditorWarning,\n): CompatibilityReport {\n const record = isRecord(value) ? value : {};\n const warnings = dedupeWarnings([\n ...coerceWarnings(record.warnings),\n repairWarning,\n ]);\n\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt:\n typeof record.generatedAt === \"string\" && record.generatedAt.length > 0\n ? record.generatedAt\n : generatedAt,\n blockExport: typeof record.blockExport === \"boolean\" ? record.blockExport : false,\n featureEntries: Array.isArray(record.featureEntries)\n ? record.featureEntries.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n if (\n typeof entry.featureEntryId !== \"string\" ||\n typeof entry.featureKey !== \"string\" ||\n typeof entry.featureClass !== \"string\" ||\n typeof entry.message !== \"string\"\n ) {\n return [];\n }\n return [{\n featureEntryId: entry.featureEntryId,\n featureKey: entry.featureKey,\n featureClass: entry.featureClass as CompatibilityFeatureEntry[\"featureClass\"],\n message: entry.message,\n ...(entry.affectedAnchor && isRecord(entry.affectedAnchor)\n ? { affectedAnchor: entry.affectedAnchor as unknown as EditorAnchorProjection }\n : {}),\n ...(isRecord(entry.details) ? { details: entry.details } : {}),\n }];\n })\n : [],\n warnings,\n errors: Array.isArray(record.errors)\n ? record.errors.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n if (\n typeof entry.errorId !== \"string\" ||\n typeof entry.code !== \"string\" ||\n typeof entry.message !== \"string\" ||\n typeof entry.source !== \"string\" ||\n typeof entry.isFatal !== \"boolean\"\n ) {\n return [];\n }\n return [{\n errorId: entry.errorId,\n code: entry.code as EditorError[\"code\"],\n message: entry.message,\n source: entry.source as EditorError[\"source\"],\n isFatal: entry.isFatal,\n ...(isRecord(entry.details) ? { details: entry.details } : {}),\n }];\n })\n : [],\n };\n}\n\nfunction coerceWarnings(value: unknown): EditorWarning[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.flatMap((warning) => {\n if (!isRecord(warning)) {\n return [];\n }\n if (\n typeof warning.warningId !== \"string\" ||\n typeof warning.code !== \"string\" ||\n typeof warning.severity !== \"string\" ||\n typeof warning.message !== \"string\" ||\n typeof warning.source !== \"string\"\n ) {\n return [];\n }\n\n return [{\n warningId: warning.warningId,\n code: warning.code as EditorWarning[\"code\"],\n severity: warning.severity as EditorWarning[\"severity\"],\n message: warning.message,\n source: warning.source as EditorWarning[\"source\"],\n ...(warning.affectedAnchor && isRecord(warning.affectedAnchor)\n ? { affectedAnchor: warning.affectedAnchor as unknown as EditorAnchorProjection }\n : {}),\n ...(typeof warning.featureEntryId === \"string\"\n ? { featureEntryId: warning.featureEntryId }\n : {}),\n ...(isRecord(warning.details) ? { details: warning.details } : {}),\n }];\n });\n}\n\nfunction createSnapshotRepairWarning(issueCount: number): EditorWarning {\n return {\n warningId: `warning:snapshot-repair:${issueCount}`,\n code: \"import_normalized\",\n severity: \"warning\",\n message: `Loaded a persisted snapshot after repairing ${issueCount} validation issue${issueCount === 1 ? \"\" : \"s\"}.`,\n source: \"validation\",\n };\n}\n\nfunction dedupeWarnings(warnings: EditorWarning[]): EditorWarning[] {\n const seen = new Set<string>();\n const result: EditorWarning[] = [];\n\n for (const warning of warnings) {\n if (!warning.warningId || seen.has(warning.warningId)) {\n continue;\n }\n seen.add(warning.warningId);\n result.push(warning);\n }\n\n return result;\n}\n\nexport function deriveDocumentStats(state: Pick<EditorState, \"document\">): DocumentStats {\n const serializedContent = extractText(state.document.content);\n\n return {\n paragraphCount: estimateParagraphCount(state.document.content),\n wordCount: serializedContent.trim().length === 0 ? 0 : serializedContent.trim().split(/\\s+/u).length,\n characterCount: Array.from(serializedContent).length,\n commentCount: Object.keys(state.document.review.comments).length,\n revisionCount: Object.keys(state.document.review.revisions).length,\n };\n}\n\nexport function deriveRenderSnapshot(\n state: EditorState,\n history: { canUndo: boolean; canRedo: boolean },\n): RuntimeRenderSnapshot {\n const comments = Object.values(state.document.review.comments).sort((left, right) =>\n left.createdAt.localeCompare(right.createdAt),\n );\n const revisions = Object.values(state.document.review.revisions);\n\n return {\n documentId: state.documentId,\n sessionId: state.sessionId,\n sourceLabel: state.sourceLabel,\n revisionToken: state.revisionToken,\n isReady: state.phase === \"ready\",\n isDirty: state.isDirty,\n readOnly: state.readOnly,\n selection: state.selection,\n documentStats: deriveDocumentStats(state),\n comments: {\n activeCommentId: state.runtime.activeCommentId,\n openThreadCount: comments.filter((comment) => comment.status === \"open\").length,\n resolvedThreadCount: comments.filter((comment) => comment.status === \"resolved\").length,\n threads: comments,\n },\n trackedChanges: {\n totalCount: revisions.length,\n pendingCount: revisions.filter((revision) => revision.status === \"open\").length,\n acceptedCount: revisions.filter((revision) => revision.status === \"accepted\").length,\n rejectedCount: revisions.filter((revision) => revision.status === \"rejected\").length,\n },\n compatibility: {\n report: state.compatibility,\n blockExport: state.compatibility.blockExport,\n totalEntries: state.compatibility.featureEntries.length,\n },\n warnings: state.warnings,\n fatalError: state.fatalError,\n commandState: {\n canUndo: history.canUndo,\n canRedo: history.canRedo,\n canAddComment: !state.readOnly,\n canAcceptAllChanges: revisions.some((revision) => revision.status === \"open\"),\n canRejectAllChanges: revisions.some((revision) => revision.status === \"open\"),\n },\n };\n}\n\nexport function createPersistedEditorSnapshot(\n state: EditorState,\n options: {\n editorBuild: string;\n savedAt: string;\n compatibility?: CompatibilityReport;\n protectionSnapshot?: ModelProtectionSnapshotRecord;\n },\n): PersistedEditorSnapshot {\n const snapshot = createModelPersistedEditorSnapshot({\n documentId: state.documentId,\n savedAt: options.savedAt,\n editorBuild: options.editorBuild,\n canonicalDocument: state.document,\n compatibility: (options.compatibility ?? state.compatibility) as never,\n warningLog: state.warnings as never,\n protectionSnapshot: options.protectionSnapshot,\n sourcePackage: state.sourcePackage,\n });\n return snapshot as PersistedEditorSnapshot;\n}\n\nfunction estimateParagraphCount(content: unknown): number {\n if (Array.isArray(content)) {\n return content.length;\n }\n\n if (content && typeof content === \"object\" && Array.isArray((content as { blocks?: unknown[] }).blocks)) {\n return ((content as { blocks: unknown[] }).blocks).length;\n }\n\n return extractText(content).length > 0 ? 1 : 0;\n}\n\nfunction normalizeWarningLog(warnings: EditorWarning[]): EditorWarning[] {\n return warnings.map((warning) => ({\n ...warning,\n affectedAnchor: warning.affectedAnchor\n ? normalizeAnchorProjection(warning.affectedAnchor)\n : undefined,\n }));\n}\n\nfunction normalizeCompatibilityReport(report: CompatibilityReport): CompatibilityReport {\n return {\n ...report,\n featureEntries: report.featureEntries.map((entry) => ({\n ...entry,\n affectedAnchor: entry.affectedAnchor\n ? normalizeAnchorProjection(entry.affectedAnchor)\n : undefined,\n })),\n warnings: normalizeWarningLog(report.warnings),\n };\n}\n\nfunction normalizeAnchorProjection(anchor: EditorAnchorProjection): EditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\": {\n const rangeAnchor = anchor as EditorAnchorProjection & {\n range?: { from: number; to: number };\n from?: number;\n to?: number;\n assoc: { start: -1 | 1; end: -1 | 1 };\n };\n return rangeAnchor.range\n ? createRangeAnchor(rangeAnchor.range.from, rangeAnchor.range.to, rangeAnchor.assoc)\n : createRangeAnchor(rangeAnchor.from ?? 0, rangeAnchor.to ?? 0, rangeAnchor.assoc);\n }\n case \"node\":\n return createNodeAnchor(anchor.at, anchor.assoc);\n case \"detached\":\n return createDetachedAnchor(anchor.lastKnownRange, anchor.reason);\n }\n}\n\nfunction extractText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => extractText(item)).join(\" \");\n }\n\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n\n return Object.values(value as Record<string, unknown>)\n .map((item) => extractText(item))\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function createCanonicalDocumentId(documentId: string): string {\n const hashWord = (seed: string): string => {\n let hash = 0x811c9dc5;\n for (const char of seed) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n };\n\n const raw =\n hashWord(`${documentId}:0`) +\n hashWord(`${documentId}:1`) +\n hashWord(`${documentId}:2`) +\n hashWord(`${documentId}:3`);\n\n return [\n raw.slice(0, 8),\n raw.slice(8, 12),\n `4${raw.slice(13, 16)}`,\n `8${raw.slice(17, 20)}`,\n raw.slice(20, 32),\n ].join(\"-\");\n}\n\nexport function normalizeCommentThreadRecord(value: unknown): CommentThreadRecord {\n const record = isRecord(value) ? value : {};\n const authorId =\n typeof record.createdBy === \"string\" && record.createdBy.length > 0\n ? record.createdBy\n : typeof record.authorId === \"string\" && record.authorId.length > 0\n ? record.authorId\n : \"unknown\";\n const createdAt =\n typeof record.createdAt === \"string\" && record.createdAt.length > 0\n ? record.createdAt\n : new Date(0).toISOString();\n const entries = Array.isArray(record.entries)\n ? record.entries\n .filter((entry): entry is Record<string, unknown> => isRecord(entry))\n .map((entry, index) => ({\n entryId:\n typeof entry.entryId === \"string\" && entry.entryId.length > 0\n ? entry.entryId\n : `${String(record.commentId ?? \"comment\")}-entry-${index + 1}`,\n authorId:\n typeof entry.authorId === \"string\" && entry.authorId.length > 0\n ? entry.authorId\n : authorId,\n body: typeof entry.body === \"string\" ? entry.body : \"\",\n createdAt:\n typeof entry.createdAt === \"string\" && entry.createdAt.length > 0\n ? entry.createdAt\n : createdAt,\n metadata: isRecord(entry.metadata)\n ? {\n ooxmlCommentId:\n typeof entry.metadata.ooxmlCommentId === \"string\"\n ? entry.metadata.ooxmlCommentId\n : undefined,\n paraId:\n typeof entry.metadata.paraId === \"string\"\n ? entry.metadata.paraId\n : undefined,\n parentParaId:\n typeof entry.metadata.parentParaId === \"string\"\n ? entry.metadata.parentParaId\n : undefined,\n durableId:\n typeof entry.metadata.durableId === \"string\"\n ? entry.metadata.durableId\n : undefined,\n initials:\n typeof entry.metadata.initials === \"string\"\n ? entry.metadata.initials\n : undefined,\n }\n : undefined,\n }))\n : [\n {\n entryId: `${String(record.commentId ?? \"comment\")}-entry-1`,\n authorId,\n body: typeof record.body === \"string\" ? record.body : \"\",\n createdAt,\n },\n ];\n const resolution = isRecord(record.resolution)\n ? {\n resolvedAt:\n typeof record.resolution.resolvedAt === \"string\"\n ? record.resolution.resolvedAt\n : typeof record.resolvedAt === \"string\"\n ? record.resolvedAt\n : createdAt,\n resolvedBy:\n typeof record.resolution.resolvedBy === \"string\" &&\n record.resolution.resolvedBy.length > 0\n ? record.resolution.resolvedBy\n : authorId,\n }\n : typeof record.resolvedAt === \"string\"\n ? {\n resolvedAt: record.resolvedAt,\n resolvedBy: authorId,\n }\n : undefined;\n const normalizedStatus =\n typeof record.status === \"string\"\n ? record.status\n : record.anchor && isRecord(record.anchor) && record.anchor.kind === \"detached\"\n ? \"detached\"\n : resolution || record.isResolved\n ? \"resolved\"\n : \"open\";\n\n return {\n commentId:\n typeof record.commentId === \"string\" && record.commentId.length > 0\n ? record.commentId\n : \"comment-generated\",\n anchor:\n isRecord(record.anchor) && typeof record.anchor.kind === \"string\"\n ? (record.anchor as unknown as EditorAnchorProjection)\n : createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n createdAt,\n createdBy: authorId,\n authorId,\n body: entries.map((entry) => entry.body).join(\"\\n\"),\n entries,\n status:\n normalizedStatus === \"resolved\" || normalizedStatus === \"detached\"\n ? normalizedStatus\n : \"open\",\n resolution,\n resolvedAt: resolution?.resolvedAt,\n warningIds: Array.isArray(record.warningIds)\n ? record.warningIds.filter((warningId): warningId is string => typeof warningId === \"string\")\n : [],\n isResolved: normalizedStatus === \"resolved\",\n metadata: isRecord(record.metadata)\n ? {\n source:\n record.metadata.source === \"import\" || record.metadata.source === \"runtime\"\n ? record.metadata.source\n : undefined,\n rootOoxmlCommentId:\n typeof record.metadata.rootOoxmlCommentId === \"string\"\n ? record.metadata.rootOoxmlCommentId\n : undefined,\n rootParaId:\n typeof record.metadata.rootParaId === \"string\"\n ? record.metadata.rootParaId\n : undefined,\n }\n : undefined,\n };\n}\n","import type {\n EditorSessionState,\n PersistedEditorSnapshot,\n} from \"./public-types.ts\";\n\nexport const EDITOR_SESSION_STATE_VERSION = \"editor-session-state/1\" as const;\n\nfunction cloneStructuredValue<T>(value: T): T {\n return structuredClone(value);\n}\n\nexport function createEditorSessionState(\n input: Omit<EditorSessionState, \"sessionVersion\">,\n): EditorSessionState {\n return cloneStructuredValue({\n sessionVersion: EDITOR_SESSION_STATE_VERSION,\n ...input,\n });\n}\n\nexport function editorSessionStateFromPersistedSnapshot(\n snapshot: PersistedEditorSnapshot,\n): EditorSessionState {\n return createEditorSessionState({\n schemaVersion: snapshot.schemaVersion,\n documentId: snapshot.documentId,\n docId: snapshot.docId,\n createdAt: snapshot.createdAt,\n updatedAt: snapshot.updatedAt,\n editorBuild: snapshot.editorBuild,\n canonicalDocument: snapshot.canonicalDocument,\n compatibility: snapshot.compatibility,\n warningLog: snapshot.warningLog,\n protectionSnapshot: snapshot.protectionSnapshot,\n sourcePackage: snapshot.sourcePackage,\n });\n}\n\nexport function persistedSnapshotFromEditorSessionState(\n sessionState: EditorSessionState,\n options: {\n savedAt: string;\n },\n): PersistedEditorSnapshot {\n return cloneStructuredValue({\n snapshotVersion: \"persisted-editor-snapshot/2\",\n schemaVersion: sessionState.schemaVersion,\n documentId: sessionState.documentId,\n docId: sessionState.docId,\n createdAt: sessionState.createdAt,\n updatedAt: sessionState.updatedAt,\n savedAt: options.savedAt,\n editorBuild: sessionState.editorBuild,\n canonicalDocument: sessionState.canonicalDocument,\n compatibility: sessionState.compatibility,\n warningLog: sessionState.warningLog,\n protectionSnapshot: sessionState.protectionSnapshot,\n sourcePackage: sessionState.sourcePackage,\n });\n}\n","export interface ReviewCommandOrigin {\n source:\n | \"keyboard\"\n | \"toolbar\"\n | \"context_menu\"\n | \"comment_panel\"\n | \"review_panel\"\n | \"api\"\n | \"runtime\";\n timestamp: string;\n}\n\nexport type ReviewCommand =\n | {\n type: \"review.accept-revision\";\n revisionId: string;\n origin?: ReviewCommandOrigin;\n }\n | {\n type: \"review.reject-revision\";\n revisionId: string;\n origin?: ReviewCommandOrigin;\n }\n | {\n type: \"review.accept-all-revisions\";\n origin?: ReviewCommandOrigin;\n }\n | {\n type: \"review.reject-all-revisions\";\n origin?: ReviewCommandOrigin;\n };\n\nexport type SingleRevisionReviewCommand = Extract<\n ReviewCommand,\n { revisionId: string }\n>;\n\nexport type BatchRevisionReviewCommand = Exclude<\n ReviewCommand,\n SingleRevisionReviewCommand\n>;\n\nexport type ReviewCommandIntent = \"accept\" | \"reject\";\n\nexport function isSingleRevisionReviewCommand(\n command: ReviewCommand,\n): command is SingleRevisionReviewCommand {\n return \"revisionId\" in command;\n}\n\nexport function isBatchRevisionReviewCommand(\n command: ReviewCommand,\n): command is BatchRevisionReviewCommand {\n return !isSingleRevisionReviewCommand(command);\n}\n\nexport function getReviewCommandIntent(\n command: ReviewCommand,\n): ReviewCommandIntent {\n switch (command.type) {\n case \"review.accept-revision\":\n case \"review.accept-all-revisions\":\n return \"accept\";\n case \"review.reject-revision\":\n case \"review.reject-all-revisions\":\n return \"reject\";\n }\n}\n\nexport function createAcceptRevisionCommand(\n revisionId: string,\n origin?: ReviewCommandOrigin,\n): SingleRevisionReviewCommand {\n return {\n type: \"review.accept-revision\",\n revisionId,\n ...(origin ? { origin } : {}),\n };\n}\n\nexport function createRejectRevisionCommand(\n revisionId: string,\n origin?: ReviewCommandOrigin,\n): SingleRevisionReviewCommand {\n return {\n type: \"review.reject-revision\",\n revisionId,\n ...(origin ? { origin } : {}),\n };\n}\n\nexport function createAcceptAllRevisionsCommand(\n origin?: ReviewCommandOrigin,\n): BatchRevisionReviewCommand {\n return {\n type: \"review.accept-all-revisions\",\n ...(origin ? { origin } : {}),\n };\n}\n\nexport function createRejectAllRevisionsCommand(\n origin?: ReviewCommandOrigin,\n): BatchRevisionReviewCommand {\n return {\n type: \"review.reject-all-revisions\",\n ...(origin ? { origin } : {}),\n };\n}\n","import type {\n DocumentRootNode,\n HyperlinkNode,\n InlineNode,\n OpaqueBlockNode,\n OpaqueInlineNode,\n ParagraphNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\nexport interface ParagraphProperties {\n styleId?: string;\n numbering?: ParagraphNode[\"numbering\"];\n}\n\nexport interface TextStory {\n firstParagraph: ParagraphProperties;\n units: StoryUnit[];\n size: number;\n}\n\nexport type StoryUnit =\n | TextCharacterUnit\n | TabUnit\n | HardBreakUnit\n | ImageUnit\n | OpaqueInlineUnit\n | OpaqueBlockUnit\n | ParagraphBreakUnit;\n\nexport interface TextCharacterUnit {\n kind: \"text\";\n value: string;\n marks?: TextMark[];\n hyperlinkHref?: string;\n}\n\nexport interface TabUnit {\n kind: \"tab\";\n hyperlinkHref?: string;\n}\n\nexport interface HardBreakUnit {\n kind: \"hard_break\";\n hyperlinkHref?: string;\n}\n\nexport interface ImageUnit {\n kind: \"image\";\n mediaId: string;\n altText?: string;\n}\n\nexport interface OpaqueInlineUnit {\n kind: \"opaque_inline\";\n fragmentId: string;\n warningId: string;\n}\n\nexport interface OpaqueBlockUnit {\n kind: \"opaque_block\";\n fragmentId: string;\n warningId: string;\n nextParagraph?: ParagraphProperties;\n}\n\nexport interface ParagraphBreakUnit {\n kind: \"paragraph_break\";\n nextParagraph: ParagraphProperties;\n}\n\nexport function parseTextStory(content: unknown): TextStory {\n const root = normalizeDocumentRoot(content);\n const firstParagraphNode = root.children.find(isParagraphNode);\n const firstParagraph = firstParagraphNode\n ? extractParagraphProperties(firstParagraphNode)\n : cloneParagraphProperties(EMPTY_PARAGRAPH_PROPERTIES);\n const units: StoryUnit[] = [];\n\n for (let index = 0; index < root.children.length; index += 1) {\n const block = root.children[index];\n const nextBlock = root.children[index + 1];\n\n if (isParagraphNode(block)) {\n units.push(...flattenInlineNodes(block.children));\n\n if (isParagraphNode(nextBlock)) {\n units.push({\n kind: \"paragraph_break\",\n nextParagraph: extractParagraphProperties(nextBlock),\n });\n }\n\n continue;\n }\n\n if (block.type !== \"opaque_block\") {\n continue;\n }\n\n units.push({\n kind: \"opaque_block\",\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n ...(isParagraphNode(nextBlock)\n ? { nextParagraph: extractParagraphProperties(nextBlock) }\n : {}),\n });\n }\n\n return {\n firstParagraph,\n units,\n size: units.length,\n };\n}\n\nexport function serializeTextStory(story: TextStory): DocumentRootNode {\n const blocks: Array<ParagraphNode | OpaqueBlockNode> = [];\n let currentParagraph: ParagraphNode | undefined = createParagraph(story.firstParagraph);\n let currentHyperlink: HyperlinkNode | undefined;\n let activeTextBuffer:\n | {\n text: string;\n marks?: TextMark[];\n hyperlinkHref?: string;\n }\n | undefined;\n\n const ensureCurrentParagraph = () => {\n if (!currentParagraph) {\n currentParagraph = createParagraph(EMPTY_PARAGRAPH_PROPERTIES);\n }\n };\n\n const flushTextBuffer = () => {\n if (!activeTextBuffer || activeTextBuffer.text.length === 0) {\n activeTextBuffer = undefined;\n return;\n }\n\n const textNode = {\n type: \"text\" as const,\n text: activeTextBuffer.text,\n ...(activeTextBuffer.marks ? { marks: cloneMarks(activeTextBuffer.marks) } : {}),\n };\n\n ensureCurrentParagraph();\n\n if (activeTextBuffer.hyperlinkHref) {\n if (!currentHyperlink || currentHyperlink.href !== activeTextBuffer.hyperlinkHref) {\n flushHyperlink();\n currentHyperlink = {\n type: \"hyperlink\",\n href: activeTextBuffer.hyperlinkHref,\n children: [],\n };\n }\n\n currentHyperlink.children.push(textNode);\n } else {\n flushHyperlink();\n currentParagraph!.children.push(textNode);\n }\n\n activeTextBuffer = undefined;\n };\n\n const flushHyperlink = () => {\n if (currentHyperlink) {\n ensureCurrentParagraph();\n currentParagraph!.children.push(currentHyperlink);\n currentHyperlink = undefined;\n }\n };\n\n const flushParagraph = () => {\n flushTextBuffer();\n flushHyperlink();\n\n if (!currentParagraph) {\n return;\n }\n\n blocks.push(currentParagraph);\n currentParagraph = undefined;\n };\n\n const pushInlineNode = (\n node: Exclude<InlineNode, { type: \"text\" }>,\n hyperlinkHref?: string,\n ) => {\n flushTextBuffer();\n ensureCurrentParagraph();\n\n if (hyperlinkHref) {\n if (!currentHyperlink || currentHyperlink.href !== hyperlinkHref) {\n flushHyperlink();\n currentHyperlink = {\n type: \"hyperlink\",\n href: hyperlinkHref,\n children: [],\n };\n }\n\n currentHyperlink.children.push(node as HyperlinkNode[\"children\"][number]);\n return;\n }\n\n flushHyperlink();\n currentParagraph!.children.push(node);\n };\n\n for (const unit of story.units) {\n if (unit.kind === \"paragraph_break\") {\n flushParagraph();\n currentParagraph = createParagraph(unit.nextParagraph);\n continue;\n }\n\n if (unit.kind === \"opaque_block\") {\n flushParagraph();\n blocks.push({\n type: \"opaque_block\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n });\n currentParagraph = unit.nextParagraph\n ? createParagraph(unit.nextParagraph)\n : undefined;\n continue;\n }\n\n if (unit.kind === \"text\") {\n const shouldExtendBuffer =\n activeTextBuffer &&\n activeTextBuffer.hyperlinkHref === unit.hyperlinkHref &&\n haveEqualMarks(activeTextBuffer.marks, unit.marks);\n\n if (shouldExtendBuffer && activeTextBuffer) {\n activeTextBuffer.text += unit.value;\n } else {\n flushTextBuffer();\n activeTextBuffer = {\n text: unit.value,\n ...(unit.marks ? { marks: cloneMarks(unit.marks) } : {}),\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n }\n\n continue;\n }\n\n switch (unit.kind) {\n case \"tab\":\n pushInlineNode({ type: \"tab\" }, unit.hyperlinkHref);\n break;\n case \"hard_break\":\n pushInlineNode({ type: \"hard_break\" }, unit.hyperlinkHref);\n break;\n case \"image\":\n pushInlineNode({\n type: \"image\",\n mediaId: unit.mediaId,\n ...(unit.altText ? { altText: unit.altText } : {}),\n });\n break;\n case \"opaque_inline\":\n pushInlineNode({\n type: \"opaque_inline\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n });\n break;\n }\n }\n\n flushParagraph();\n\n if (blocks.length === 0) {\n blocks.push(createParagraph(story.firstParagraph));\n }\n\n return {\n type: \"doc\",\n children: blocks,\n };\n}\n\nexport function createPlainText(story: TextStory): string {\n return story.units\n .map((unit) => {\n switch (unit.kind) {\n case \"text\":\n return unit.value;\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n return \"\\n\";\n case \"paragraph_break\":\n return \"\\n\";\n case \"image\":\n return \"\\uFFFC\";\n case \"opaque_inline\":\n return \"\\uFFF9\";\n case \"opaque_block\":\n return \"\\uFFFA\";\n }\n })\n .join(\"\");\n}\n\nexport function cloneStoryUnit(unit: StoryUnit): StoryUnit {\n switch (unit.kind) {\n case \"text\":\n return {\n kind: \"text\",\n value: unit.value,\n ...(unit.marks ? { marks: cloneMarks(unit.marks) } : {}),\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n case \"tab\":\n return {\n kind: \"tab\",\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n case \"hard_break\":\n return {\n kind: \"hard_break\",\n ...(unit.hyperlinkHref ? { hyperlinkHref: unit.hyperlinkHref } : {}),\n };\n case \"image\":\n return {\n kind: \"image\",\n mediaId: unit.mediaId,\n ...(unit.altText ? { altText: unit.altText } : {}),\n };\n case \"opaque_inline\":\n return {\n kind: \"opaque_inline\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n };\n case \"opaque_block\":\n return {\n kind: \"opaque_block\",\n fragmentId: unit.fragmentId,\n warningId: unit.warningId,\n ...(unit.nextParagraph\n ? { nextParagraph: cloneParagraphProperties(unit.nextParagraph) }\n : {}),\n };\n case \"paragraph_break\":\n return {\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(unit.nextParagraph),\n };\n }\n}\n\nexport function cloneParagraphProperties(\n properties: ParagraphProperties,\n): ParagraphProperties {\n return {\n ...(properties.styleId ? { styleId: properties.styleId } : {}),\n ...(properties.numbering\n ? {\n numbering: {\n numberingInstanceId: properties.numbering.numberingInstanceId,\n level: properties.numbering.level,\n },\n }\n : {}),\n };\n}\n\nfunction normalizeDocumentRoot(content: unknown): DocumentRootNode {\n if (isDocumentRootNode(content)) {\n return content;\n }\n\n if (Array.isArray(content)) {\n return {\n type: \"doc\",\n children: content.filter(\n (block): block is DocumentRootNode[\"children\"][number] =>\n isParagraphNode(block) || isOpaqueBlockNode(block),\n ),\n };\n }\n\n return {\n type: \"doc\",\n children: [createEmptyParagraph()],\n };\n}\n\nfunction flattenInlineNodes(\n nodes: ParagraphNode[\"children\"],\n hyperlinkHref?: string,\n): StoryUnit[] {\n const units: StoryUnit[] = [];\n\n for (const node of nodes) {\n switch (node.type) {\n case \"text\":\n for (const character of Array.from(node.text)) {\n units.push({\n kind: \"text\",\n value: character,\n ...(node.marks ? { marks: cloneMarks(node.marks) } : {}),\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n }\n break;\n case \"tab\":\n units.push({\n kind: \"tab\",\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n break;\n case \"hard_break\":\n units.push({\n kind: \"hard_break\",\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n break;\n case \"hyperlink\":\n units.push(...flattenInlineNodes(node.children, node.href));\n break;\n case \"image\":\n units.push({\n kind: \"image\",\n mediaId: node.mediaId,\n ...(node.altText ? { altText: node.altText } : {}),\n });\n break;\n case \"opaque_inline\":\n units.push({\n kind: \"opaque_inline\",\n fragmentId: node.fragmentId,\n warningId: node.warningId,\n });\n break;\n }\n }\n\n return units;\n}\n\nfunction extractParagraphProperties(paragraph: ParagraphNode): ParagraphProperties {\n return {\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(paragraph.numbering\n ? {\n numbering: {\n numberingInstanceId: paragraph.numbering.numberingInstanceId,\n level: paragraph.numbering.level,\n },\n }\n : {}),\n };\n}\n\nfunction createParagraph(properties: ParagraphProperties): ParagraphNode {\n return {\n type: \"paragraph\",\n ...(properties.styleId ? { styleId: properties.styleId } : {}),\n ...(properties.numbering\n ? {\n numbering: {\n numberingInstanceId: properties.numbering.numberingInstanceId,\n level: properties.numbering.level,\n },\n }\n : {}),\n children: [],\n };\n}\n\nfunction createEmptyParagraph(): ParagraphNode {\n return {\n type: \"paragraph\",\n children: [],\n };\n}\n\nconst EMPTY_PARAGRAPH_PROPERTIES: ParagraphProperties = {};\n\nfunction cloneMarks(marks: TextMark[]): TextMark[] {\n return marks.map((mark) => ({ ...mark }));\n}\n\nfunction haveEqualMarks(left?: TextMark[], right?: TextMark[]): boolean {\n if (!left && !right) {\n return true;\n }\n\n if (!left || !right || left.length !== right.length) {\n return false;\n }\n\n return left.every((mark, index) => mark.type === right[index]?.type);\n}\n\nfunction isDocumentRootNode(value: unknown): value is DocumentRootNode {\n return Boolean(value) && typeof value === \"object\" && (value as { type?: string }).type === \"doc\";\n}\n\nfunction isParagraphNode(value: unknown): value is ParagraphNode {\n return Boolean(value) && typeof value === \"object\" && (value as { type?: string }).type === \"paragraph\";\n}\n\nfunction isOpaqueBlockNode(value: unknown): value is OpaqueBlockNode {\n return Boolean(value) && typeof value === \"object\" && (value as { type?: string }).type === \"opaque_block\";\n}\n","import type {\n DocRange,\n OpaqueFragmentRecord,\n PreservationStore,\n PreservedPackagePart,\n} from \"../model/canonical-document.ts\";\n\nexport interface OpaqueFragmentDescriptor {\n featureKey:\n | \"sections\"\n | \"tables\"\n | \"headers-footers\"\n | \"fields\"\n | \"content-controls\"\n | \"custom-xml\"\n | \"alt-chunk\"\n | \"embedded-objects\"\n | \"alternate-content\"\n | \"unknown-ooxml\";\n label: string;\n detail: string;\n}\n\nexport function createPreservationStore(\n seed?: Partial<PreservationStore>,\n): PreservationStore {\n return {\n opaqueFragments: { ...(seed?.opaqueFragments ?? {}) },\n packageParts: { ...(seed?.packageParts ?? {}) },\n };\n}\n\nexport function getOpaqueFragment(\n store: PreservationStore,\n fragmentId: string,\n): OpaqueFragmentRecord | undefined {\n return normalizeOpaqueFragmentMap(store)[fragmentId];\n}\n\nexport function listOpaqueFragments(\n store: PreservationStore,\n): OpaqueFragmentRecord[] {\n return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {\n return (\n left.lastKnownRange.from - right.lastKnownRange.from ||\n left.fragmentId.localeCompare(right.fragmentId)\n );\n });\n}\n\nexport function listPreservedPackageParts(\n store: PreservationStore,\n): PreservedPackagePart[] {\n return Object.values(normalizePackagePartMap(store)).sort((left, right) =>\n left.packagePartName.localeCompare(right.packagePartName),\n );\n}\n\nexport function findOpaqueFragmentsIntersectingRange(\n store: PreservationStore,\n range: DocRange,\n): OpaqueFragmentRecord[] {\n return listOpaqueFragments(store).filter((fragment) =>\n rangesIntersect(fragment.lastKnownRange, range),\n );\n}\n\nexport function describeOpaqueFragment(\n fragment: OpaqueFragmentRecord,\n): OpaqueFragmentDescriptor {\n const xml = fragment.payloadReference;\n const detail = createDetail(fragment);\n\n if (/\\b(?:w:)?sectPr\\b/u.test(xml)) {\n return {\n featureKey: \"sections\",\n label: \"Section properties\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?tbl\\b/u.test(xml)) {\n return {\n featureKey: \"tables\",\n label: \"Preserved table structure\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?hdr\\b|\\b(?:w:)?ftr\\b/u.test(xml)) {\n return {\n featureKey: \"headers-footers\",\n label: \"Header or footer content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?fldSimple\\b|\\b(?:w:)?fldChar\\b|\\b(?:w:)?instrText\\b/u.test(xml)) {\n return {\n featureKey: \"fields\",\n label: \"Word field content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?sdt\\b/u.test(xml)) {\n return {\n featureKey: \"content-controls\",\n label: \"Content control\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?customXml\\b/u.test(xml)) {\n return {\n featureKey: \"custom-xml\",\n label: \"Custom XML wrapper\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?altChunk\\b/u.test(xml)) {\n return {\n featureKey: \"alt-chunk\",\n label: \"Alternate content import\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?object\\b|\\b(?:o:)?OLEObject\\b/u.test(xml)) {\n return {\n featureKey: \"embedded-objects\",\n label: \"Embedded object\",\n detail,\n };\n }\n\n if (/\\b(?:mc:)?AlternateContent\\b/u.test(xml)) {\n return {\n featureKey: \"alternate-content\",\n label: \"Markup compatibility block\",\n detail,\n };\n }\n\n return {\n featureKey: \"unknown-ooxml\",\n label: \"Unsupported OOXML fragment\",\n detail,\n };\n}\n\nfunction createDetail(fragment: OpaqueFragmentRecord): string {\n const detail = [\n `Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,\n fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,\n fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return detail.length > 0\n ? detail\n : \"Preserved whole-unit to keep unsupported OOXML intact.\";\n}\n\nfunction rangesIntersect(left: DocRange, right: DocRange): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction normalizeOpaqueFragmentMap(\n store: PreservationStore,\n): Record<string, OpaqueFragmentRecord> {\n return store && typeof store === \"object\" && store.opaqueFragments && typeof store.opaqueFragments === \"object\"\n ? (store.opaqueFragments as Record<string, OpaqueFragmentRecord>)\n : {};\n}\n\nfunction normalizePackagePartMap(\n store: PreservationStore,\n): Record<string, PreservedPackagePart> {\n return store && typeof store === \"object\" && store.packageParts && typeof store.packageParts === \"object\"\n ? (store.packageParts as Record<string, PreservedPackagePart>)\n : {};\n}\n","import type { EditorStoryTarget } from \"../api/public-types\";\nimport type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\nimport type {\n FooterDocument,\n HeaderDocument,\n SectionProperties,\n} from \"../model/canonical-document.ts\";\n\nexport interface DocumentSectionContext {\n index: number;\n properties?: SectionProperties;\n}\n\nexport type HeaderFooterStoryTarget =\n | Extract<EditorStoryTarget, { kind: \"header\" }>\n | Extract<EditorStoryTarget, { kind: \"footer\" }>;\n\nexport function collectSectionContexts(\n document: CanonicalDocumentEnvelope,\n): DocumentSectionContext[] {\n const sections: DocumentSectionContext[] = [];\n let sectionIndex = 0;\n\n for (const block of document.content.children) {\n if (block.type !== \"section_break\") {\n continue;\n }\n sections.push({\n index: sectionIndex,\n properties: block.sectionProperties,\n });\n sectionIndex += 1;\n }\n\n sections.push({\n index: sectionIndex,\n properties: document.subParts?.finalSectionProperties,\n });\n\n return sections;\n}\n\nexport function resolveSectionVariants(\n kind: \"header\" | \"footer\",\n sectionIndex: number,\n explicitReferences:\n | SectionProperties[\"headerReferences\"]\n | SectionProperties[\"footerReferences\"]\n | undefined,\n documents: HeaderDocument[] | FooterDocument[],\n): Array<{ variant: \"default\" | \"first\" | \"even\"; relationshipId: string }> {\n if (explicitReferences && explicitReferences.length > 0) {\n return explicitReferences.map((ref) => ({\n variant: ref.variant,\n relationshipId: ref.relationshipId,\n }));\n }\n\n return documents\n .filter(\n (entry) =>\n entry.sectionIndex === undefined || entry.sectionIndex === sectionIndex,\n )\n .map((entry) => ({\n variant: entry.variant,\n relationshipId: entry.relationshipId,\n }));\n}\n\nexport function findHeaderFooterDocumentEntry(\n document: CanonicalDocumentEnvelope,\n target: HeaderFooterStoryTarget,\n): HeaderDocument | FooterDocument | undefined {\n const documents =\n target.kind === \"header\"\n ? document.subParts?.headers ?? []\n : document.subParts?.footers ?? [];\n const matches = documents.filter(\n (entry) =>\n entry.relationshipId === target.relationshipId &&\n entry.variant === target.variant,\n );\n if (matches.length === 0) {\n return undefined;\n }\n if (target.sectionIndex !== undefined) {\n return (\n matches.find((entry) => entry.sectionIndex === target.sectionIndex) ??\n matches.find((entry) => entry.sectionIndex === undefined) ??\n matches[0]\n );\n }\n return matches[0];\n}\n\nexport function sectionSupportsStoryTarget(\n document: CanonicalDocumentEnvelope,\n sectionIndex: number,\n target: HeaderFooterStoryTarget,\n): boolean {\n if (!findHeaderFooterDocumentEntry(document, target)) {\n return false;\n }\n\n const section = collectSectionContexts(document).find(\n (candidate) => candidate.index === sectionIndex,\n );\n if (!section) {\n return false;\n }\n\n const variants = resolveSectionVariants(\n target.kind,\n sectionIndex,\n target.kind === \"header\"\n ? section.properties?.headerReferences\n : section.properties?.footerReferences,\n target.kind === \"header\"\n ? document.subParts?.headers ?? []\n : document.subParts?.footers ?? [],\n );\n\n return variants.some(\n (variant) =>\n variant.relationshipId === target.relationshipId &&\n variant.variant === target.variant,\n );\n}\n\nexport function normalizeHeaderFooterTarget(\n document: CanonicalDocumentEnvelope,\n target: HeaderFooterStoryTarget,\n preferredSectionIndex?: number,\n): HeaderFooterStoryTarget | undefined {\n if (!findHeaderFooterDocumentEntry(document, target)) {\n return undefined;\n }\n\n if (target.sectionIndex !== undefined) {\n return sectionSupportsStoryTarget(document, target.sectionIndex, target)\n ? target\n : undefined;\n }\n\n const candidateIndexes = collectSectionContexts(document)\n .map((section) => section.index)\n .filter((sectionIndex) =>\n sectionSupportsStoryTarget(document, sectionIndex, target),\n );\n if (candidateIndexes.length === 0) {\n return undefined;\n }\n\n const resolvedSectionIndex =\n preferredSectionIndex !== undefined &&\n candidateIndexes.includes(preferredSectionIndex)\n ? preferredSectionIndex\n : candidateIndexes[0];\n\n return {\n ...target,\n sectionIndex: resolvedSectionIndex,\n };\n}\n","import type { EditorStoryTarget } from \"../api/public-types\";\nimport type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\nimport type { BlockNode } from \"../model/canonical-document.ts\";\nimport {\n findHeaderFooterDocumentEntry,\n normalizeHeaderFooterTarget,\n} from \"./story-context.ts\";\n\nexport function storyTargetKey(target: EditorStoryTarget): string {\n switch (target.kind) {\n case \"main\":\n return \"main\";\n case \"header\":\n return `header:${target.relationshipId}:${target.variant}:${target.sectionIndex ?? \"*\"}`;\n case \"footer\":\n return `footer:${target.relationshipId}:${target.variant}:${target.sectionIndex ?? \"*\"}`;\n case \"footnote\":\n return `footnote:${target.noteId}`;\n case \"endnote\":\n return `endnote:${target.noteId}`;\n }\n}\n\nexport function getStoryBlocks(\n document: CanonicalDocumentEnvelope,\n target: EditorStoryTarget,\n): readonly BlockNode[] {\n if (target.kind === \"main\") {\n return document.content.children;\n }\n\n const subParts = document.subParts;\n if (!subParts) {\n return [];\n }\n\n switch (target.kind) {\n case \"header\": {\n const resolvedTarget = normalizeHeaderFooterTarget(document, target);\n return (\n resolvedTarget &&\n findHeaderFooterDocumentEntry(document, resolvedTarget)?.blocks\n ) ?? [];\n }\n case \"footer\": {\n const resolvedTarget = normalizeHeaderFooterTarget(document, target);\n return (\n resolvedTarget &&\n findHeaderFooterDocumentEntry(document, resolvedTarget)?.blocks\n ) ?? [];\n }\n case \"footnote\":\n return subParts.footnoteCollection?.footnotes[target.noteId]?.blocks ?? [];\n case \"endnote\":\n return subParts.footnoteCollection?.endnotes[target.noteId]?.blocks ?? [];\n }\n}\n\nexport function replaceStoryBlocks(\n document: CanonicalDocumentEnvelope,\n target: EditorStoryTarget,\n blocks: readonly BlockNode[],\n): CanonicalDocumentEnvelope {\n if (target.kind === \"main\") {\n return {\n ...document,\n content: {\n ...document.content,\n children: [...blocks],\n },\n };\n }\n\n if (!document.subParts) {\n return document;\n }\n\n switch (target.kind) {\n case \"header\": {\n const resolvedTarget = normalizeHeaderFooterTarget(document, target);\n const matchedEntry = resolvedTarget\n ? findHeaderFooterDocumentEntry(document, resolvedTarget)\n : undefined;\n if (!matchedEntry) {\n return document;\n }\n return {\n ...document,\n subParts: {\n ...document.subParts,\n headers: document.subParts.headers.map((header) =>\n header.relationshipId === matchedEntry.relationshipId &&\n header.variant === matchedEntry.variant &&\n header.partPath === matchedEntry.partPath\n ? { ...header, blocks: [...blocks] }\n : header,\n ),\n },\n };\n }\n case \"footer\": {\n const resolvedTarget = normalizeHeaderFooterTarget(document, target);\n const matchedEntry = resolvedTarget\n ? findHeaderFooterDocumentEntry(document, resolvedTarget)\n : undefined;\n if (!matchedEntry) {\n return document;\n }\n return {\n ...document,\n subParts: {\n ...document.subParts,\n footers: document.subParts.footers.map((footer) =>\n footer.relationshipId === matchedEntry.relationshipId &&\n footer.variant === matchedEntry.variant &&\n footer.partPath === matchedEntry.partPath\n ? { ...footer, blocks: [...blocks] }\n : footer,\n ),\n },\n };\n }\n case \"footnote\":\n return !document.subParts.footnoteCollection?.footnotes[target.noteId]\n ? document\n : {\n ...document,\n subParts: {\n ...document.subParts,\n footnoteCollection: {\n ...document.subParts.footnoteCollection,\n footnotes: {\n ...document.subParts.footnoteCollection.footnotes,\n [target.noteId]: {\n ...document.subParts.footnoteCollection.footnotes[target.noteId],\n blocks: [...blocks],\n },\n },\n },\n },\n };\n case \"endnote\":\n return !document.subParts.footnoteCollection?.endnotes[target.noteId]\n ? document\n : {\n ...document,\n subParts: {\n ...document.subParts,\n footnoteCollection: {\n ...document.subParts.footnoteCollection,\n endnotes: {\n ...document.subParts.footnoteCollection.endnotes,\n [target.noteId]: {\n ...document.subParts.footnoteCollection.endnotes[target.noteId],\n blocks: [...blocks],\n },\n },\n },\n },\n };\n }\n}\n","import type {\n NumberingCatalog,\n NumberingLevelDefinition,\n ParagraphNode,\n} from \"../model/canonical-document.ts\";\n\ninterface NumberingSequenceState {\n counters: Array<number | undefined>;\n lastLevel: number | null;\n}\n\nexport interface NumberingPrefixResult {\n text: string;\n suffix?: \"tab\" | \"space\" | \"nothing\";\n}\n\nexport interface NumberingPrefixResolver {\n resolve(numbering: ParagraphNode[\"numbering\"] | undefined): string | null;\n resolveDetailed(numbering: ParagraphNode[\"numbering\"] | undefined): NumberingPrefixResult | null;\n}\n\nconst DEFAULT_START_AT = 1;\n\nexport function createNumberingPrefixResolver(\n catalog: NumberingCatalog,\n): NumberingPrefixResolver {\n const sequenceStates = new Map<string, NumberingSequenceState>();\n\n function resolveInternal(numbering: ParagraphNode[\"numbering\"] | undefined): NumberingPrefixResult | null {\n if (!numbering) {\n return null;\n }\n\n const instance = catalog.instances[numbering.numberingInstanceId];\n if (!instance) {\n return null;\n }\n\n const definition = catalog.abstractDefinitions[instance.abstractNumberingId];\n if (!definition) {\n return null;\n }\n\n const levelDefinitions = new Map(\n definition.levels.map((level) => [level.level, level] as const),\n );\n const levelDefinition = levelDefinitions.get(numbering.level);\n if (!levelDefinition || levelDefinition.format === \"none\") {\n return null;\n }\n\n const sequenceState = getSequenceState(sequenceStates, numbering.numberingInstanceId);\n advanceSequence(sequenceState, numbering.level, levelDefinitions, instance.overrides);\n\n // When isLegalNumbering is true, use decimal format for all referenced levels\n const effectiveLevelDefs = levelDefinition.isLegalNumbering\n ? new Map(Array.from(levelDefinitions.entries()).map(([k, v]) => [k, { ...v, format: \"decimal\" }]))\n : levelDefinitions;\n\n const text = renderLevelText(levelDefinition.text, sequenceState.counters, effectiveLevelDefs);\n if (text === null) return null;\n return { text, suffix: levelDefinition.suffix };\n }\n\n return {\n resolve(numbering) {\n const result = resolveInternal(numbering);\n return result?.text ?? null;\n },\n resolveDetailed(numbering) {\n return resolveInternal(numbering);\n },\n };\n}\n\nfunction getSequenceState(\n states: Map<string, NumberingSequenceState>,\n numberingInstanceId: string,\n): NumberingSequenceState {\n const existing = states.get(numberingInstanceId);\n if (existing) {\n return existing;\n }\n\n const created: NumberingSequenceState = {\n counters: [],\n lastLevel: null,\n };\n states.set(numberingInstanceId, created);\n return created;\n}\n\nfunction advanceSequence(\n state: NumberingSequenceState,\n currentLevel: number,\n levelDefinitions: Map<number, NumberingLevelDefinition>,\n overrides: NumberingCatalog[\"instances\"][string][\"overrides\"],\n): void {\n if (state.lastLevel !== null && currentLevel <= state.lastLevel) {\n state.counters.length = currentLevel + 1;\n }\n\n const startAt = getLevelStartAt(currentLevel, levelDefinitions, overrides);\n const currentValue = state.counters[currentLevel];\n state.counters[currentLevel] =\n currentValue === undefined ? startAt : currentValue + 1;\n state.lastLevel = currentLevel;\n}\n\nfunction getLevelStartAt(\n level: number,\n levelDefinitions: Map<number, NumberingLevelDefinition>,\n overrides: NumberingCatalog[\"instances\"][string][\"overrides\"],\n): number {\n const override = overrides.find((entry) => entry.level === level);\n if (override?.startAt !== undefined) {\n return override.startAt;\n }\n\n return levelDefinitions.get(level)?.startAt ?? DEFAULT_START_AT;\n}\n\nfunction renderLevelText(\n text: string,\n counters: Array<number | undefined>,\n levelDefinitions: Map<number, NumberingLevelDefinition>,\n): string | null {\n if (!text) {\n return null;\n }\n\n if (!text.includes(\"%\")) {\n return text;\n }\n\n const rendered = text.replace(/%([1-9])/g, (_match, token) => {\n const level = Number.parseInt(token, 10) - 1;\n const counter = counters[level];\n if (counter === undefined) {\n return \"\";\n }\n\n const format = levelDefinitions.get(level)?.format ?? \"decimal\";\n return formatCounter(counter, format);\n });\n\n return rendered.trim().length > 0 ? rendered : null;\n}\n\nfunction formatCounter(value: number, format: string): string {\n switch (format) {\n case \"decimal\":\n return String(value);\n case \"decimalZero\":\n return String(value).padStart(2, \"0\");\n case \"upperLetter\":\n return toAlphabetic(value).toUpperCase();\n case \"lowerLetter\":\n return toAlphabetic(value).toLowerCase();\n case \"upperRoman\":\n return toRoman(value).toUpperCase();\n case \"lowerRoman\":\n return toRoman(value).toLowerCase();\n case \"none\":\n return \"\";\n default:\n return String(value);\n }\n}\n\nfunction toAlphabetic(value: number): string {\n if (value <= 0) {\n return String(value);\n }\n\n let remainder = value;\n let result = \"\";\n while (remainder > 0) {\n remainder -= 1;\n result = String.fromCharCode(65 + (remainder % 26)) + result;\n remainder = Math.floor(remainder / 26);\n }\n return result;\n}\n\nfunction toRoman(value: number): string {\n if (value <= 0 || value >= 4000) {\n return String(value);\n }\n\n const numerals: Array<[number, string]> = [\n [1000, \"M\"],\n [900, \"CM\"],\n [500, \"D\"],\n [400, \"CD\"],\n [100, \"C\"],\n [90, \"XC\"],\n [50, \"L\"],\n [40, \"XL\"],\n [10, \"X\"],\n [9, \"IX\"],\n [5, \"V\"],\n [4, \"IV\"],\n [1, \"I\"],\n ];\n\n let remaining = value;\n let result = \"\";\n for (const [amount, numeral] of numerals) {\n while (remaining >= amount) {\n remaining -= amount;\n result += numeral;\n }\n }\n return result;\n}\n","import type {\n EditorStoryTarget,\n EditorSurfaceSnapshot,\n SecondaryStorySurface,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n SurfaceTableCellSnapshot,\n SurfaceTableRowSnapshot,\n SurfaceTextMark,\n} from \"../api/public-types\";\nimport type {\n CanonicalDocumentEnvelope,\n SelectionSnapshot,\n} from \"../core/state/editor-state.ts\";\nimport type {\n BlockNode,\n ChartPreviewNode,\n DocumentRootNode,\n InlineNode,\n MediaCatalog,\n ParagraphNode,\n SdtNode,\n ShapeNode,\n SmartArtPreviewNode,\n TableCellBorders,\n TableNode,\n TextMark,\n VmlShapeNode,\n WordArtNode,\n} from \"../model/canonical-document.ts\";\nimport {\n describeOpaqueFragment,\n getOpaqueFragment,\n} from \"../preservation/store.ts\";\nimport { getStoryBlocks } from \"./story-targeting.ts\";\nimport {\n createNumberingPrefixResolver,\n type NumberingPrefixResolver,\n} from \"./numbering-prefix.ts\";\nimport {\n collectSectionContexts,\n findHeaderFooterDocumentEntry,\n resolveSectionVariants,\n} from \"./story-context.ts\";\n\ninterface ParagraphAccumulator {\n blockId: string;\n kind: \"paragraph\";\n from: number;\n to: number;\n styleId?: string;\n numbering?: ParagraphNode[\"numbering\"];\n numberingPrefix?: string;\n numberingSuffix?: \"tab\" | \"space\" | \"nothing\";\n contextualSpacing?: boolean;\n segments: SurfaceInlineSegment[];\n}\n\nexport function createEditorSurfaceSnapshot(\n document: CanonicalDocumentEnvelope,\n _selection: SelectionSnapshot,\n activeStory: EditorStoryTarget = { kind: \"main\" },\n): EditorSurfaceSnapshot {\n const root = normalizeDocumentRoot({\n type: \"doc\",\n children: [...getStoryBlocks(document, activeStory)],\n });\n const blocks: SurfaceBlockSnapshot[] = [];\n const lockedFragmentIds: string[] = [];\n const numberingPrefixResolver = createNumberingPrefixResolver(document.numbering);\n let cursor = 0;\n const counters = {\n paragraph: 0,\n table: 0,\n opaque: 0,\n sdt: 0,\n customXml: 0,\n altChunk: 0,\n };\n\n for (let index = 0; index < root.children.length; index += 1) {\n const surfaceBlock = createSurfaceBlock(\n root.children[index],\n document,\n cursor,\n counters,\n numberingPrefixResolver,\n );\n blocks.push(surfaceBlock.block);\n lockedFragmentIds.push(...surfaceBlock.lockedFragmentIds);\n cursor = surfaceBlock.nextCursor;\n if (index < root.children.length - 1 && root.children[index + 1]?.type === \"paragraph\") {\n cursor += 1;\n }\n }\n\n const secondaryStories = createSecondaryStorySurfaces(document);\n\n return {\n storySize: cursor,\n plainText: createPlainText(blocks),\n blocks,\n lockedFragmentIds,\n secondaryStories,\n };\n}\n\nfunction createSurfaceBlock(\n block: BlockNode,\n document: CanonicalDocumentEnvelope,\n cursor: number,\n counters: {\n paragraph: number;\n table: number;\n opaque: number;\n sdt: number;\n customXml: number;\n altChunk: number;\n },\n numberingPrefixResolver: NumberingPrefixResolver,\n): { block: SurfaceBlockSnapshot; lockedFragmentIds: string[]; nextCursor: number } {\n if (block.type === \"opaque_block\") {\n const fragment = getOpaqueFragment(document.preservation as never, block.fragmentId);\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n const blockId = `opaque-${counters.opaque}`;\n counters.opaque += 1;\n return {\n block: {\n blockId,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor + 1,\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n label: descriptor?.label ?? \"Unsupported OOXML fragment\",\n detail:\n descriptor?.detail ??\n \"Locked whole-unit to keep unsupported OOXML intact through export.\",\n state: \"locked-preserve-only\",\n },\n lockedFragmentIds: [block.fragmentId],\n nextCursor: cursor + 1,\n };\n }\n\n if (block.type === \"table\") {\n const tableIndex = counters.table;\n counters.table += 1;\n return createTableBlock(\n tableIndex,\n block,\n document,\n cursor,\n counters,\n numberingPrefixResolver,\n );\n }\n\n if (block.type === \"sdt\") {\n const sdtIndex = counters.sdt;\n counters.sdt += 1;\n return createSdtBlock(\n sdtIndex,\n block,\n document,\n cursor,\n counters,\n numberingPrefixResolver,\n );\n }\n\n if (block.type === \"custom_xml\") {\n const blockId = `custom-xml-${counters.customXml}`;\n counters.customXml += 1;\n return {\n block: {\n blockId,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor + 1,\n fragmentId: blockId,\n warningId: blockId,\n label: \"Custom XML block\",\n detail:\n block.uri || block.element\n ? `Custom XML wrapper ${[block.element, block.uri].filter(Boolean).join(\" \")} preserved as a read-only block.`\n : \"Custom XML wrapper preserved as a read-only block.\",\n state: \"locked-preserve-only\",\n },\n lockedFragmentIds: [],\n nextCursor: cursor + 1,\n };\n }\n\n if (block.type === \"alt_chunk\") {\n const blockId = `alt-chunk-${counters.altChunk}`;\n counters.altChunk += 1;\n return {\n block: {\n blockId,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor + 1,\n fragmentId: blockId,\n warningId: blockId,\n label: \"AltChunk import\",\n detail: `Alternate content import remains read-only through relationship ${block.relationshipId}.`,\n state: \"locked-preserve-only\",\n },\n lockedFragmentIds: [],\n nextCursor: cursor + 1,\n };\n }\n\n if (block.type === \"section_break\") {\n const blockId = `section-break-${counters.opaque}`;\n counters.opaque += 1;\n return {\n block: {\n blockId,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor + 1,\n fragmentId: blockId,\n warningId: blockId,\n label: \"Section break\",\n detail: \"Section properties preserved as a read-only boundary.\",\n state: \"locked-preserve-only\",\n },\n lockedFragmentIds: [],\n nextCursor: cursor + 1,\n };\n }\n\n const paragraphIndex = counters.paragraph;\n counters.paragraph += 1;\n return createParagraphBlock(\n paragraphIndex,\n block,\n document,\n cursor,\n numberingPrefixResolver,\n );\n}\n\nfunction createTableBlock(\n tableIndex: number,\n table: TableNode,\n document: CanonicalDocumentEnvelope,\n cursor: number,\n counters: {\n paragraph: number;\n table: number;\n opaque: number;\n sdt: number;\n customXml: number;\n altChunk: number;\n },\n numberingPrefixResolver: NumberingPrefixResolver,\n): { block: SurfaceBlockSnapshot; lockedFragmentIds: string[]; nextCursor: number } {\n const lockedFragmentIds: string[] = [];\n let innerCursor = cursor;\n const rows: SurfaceTableRowSnapshot[] = [];\n const rowSpans = computeTableRowSpans(table);\n\n for (const [rowIndex, row] of table.rows.entries()) {\n const cells: SurfaceTableCellSnapshot[] = [];\n for (const [cellIndex, cell] of row.cells.entries()) {\n const cellContent: SurfaceBlockSnapshot[] = [];\n for (const child of cell.children) {\n const result = createSurfaceBlock(\n child,\n document,\n innerCursor,\n counters,\n numberingPrefixResolver,\n );\n cellContent.push(result.block);\n lockedFragmentIds.push(...result.lockedFragmentIds);\n innerCursor = result.nextCursor;\n }\n const cellBorders = resolveCellBorderStyles(cell.borders);\n cells.push({\n gridSpan: cell.gridSpan ?? 1,\n verticalMerge: cell.verticalMerge ?? null,\n colspan: cell.gridSpan ?? 1,\n rowspan: rowSpans.get(`${rowIndex}:${cellIndex}`) ?? 1,\n ...(cell.shading?.fill ? { backgroundColor: `#${cell.shading.fill}` } : {}),\n ...(cell.verticalAlign ? { verticalAlign: cell.verticalAlign } : {}),\n ...(cellBorders.borderTop ? { borderTop: cellBorders.borderTop } : {}),\n ...(cellBorders.borderRight ? { borderRight: cellBorders.borderRight } : {}),\n ...(cellBorders.borderBottom ? { borderBottom: cellBorders.borderBottom } : {}),\n ...(cellBorders.borderLeft ? { borderLeft: cellBorders.borderLeft } : {}),\n content: cellContent,\n });\n }\n rows.push({\n cells,\n ...(row.gridBefore !== undefined ? { gridBefore: row.gridBefore } : {}),\n ...(row.gridAfter !== undefined ? { gridAfter: row.gridAfter } : {}),\n ...(row.height !== undefined ? { height: row.height } : {}),\n ...(row.heightRule ? { heightRule: row.heightRule } : {}),\n ...(row.isHeader ? { isHeader: row.isHeader } : {}),\n });\n }\n\n return {\n block: {\n blockId: `table-${tableIndex}`,\n kind: \"table\",\n from: cursor,\n to: innerCursor,\n styleId: table.styleId,\n gridColumns: table.gridColumns,\n ...(table.alignment ? { alignment: table.alignment } : {}),\n ...(table.tblLook ? { tblLook: table.tblLook } : {}),\n rows,\n },\n lockedFragmentIds,\n nextCursor: innerCursor,\n };\n}\n\nfunction computeTableRowSpans(table: TableNode): Map<string, number> {\n const positionedRows = table.rows.map((row) => {\n let startColumn = 0;\n\n return row.cells.map((cell, cellIndex) => {\n const width = cell.gridSpan ?? 1;\n const positionedCell = {\n cell,\n cellIndex,\n startColumn,\n endColumn: startColumn + width - 1,\n };\n startColumn += width;\n return positionedCell;\n });\n });\n\n const rowSpans = new Map<string, number>();\n\n for (const [rowIndex, row] of positionedRows.entries()) {\n for (const positionedCell of row) {\n if (positionedCell.cell.verticalMerge !== \"restart\") {\n rowSpans.set(`${rowIndex}:${positionedCell.cellIndex}`, 1);\n continue;\n }\n\n let rowspan = 1;\n for (let nextRowIndex = rowIndex + 1; nextRowIndex < positionedRows.length; nextRowIndex += 1) {\n const continuedCell = positionedRows[nextRowIndex]?.find(\n (candidate) =>\n candidate.cell.verticalMerge === \"continue\" &&\n candidate.startColumn === positionedCell.startColumn &&\n candidate.endColumn === positionedCell.endColumn,\n );\n\n if (!continuedCell) {\n break;\n }\n\n rowspan += 1;\n }\n\n rowSpans.set(`${rowIndex}:${positionedCell.cellIndex}`, rowspan);\n }\n }\n\n return rowSpans;\n}\n\nfunction resolveCellBorderStyles(\n borders: TableCellBorders | undefined,\n): { borderTop?: string; borderRight?: string; borderBottom?: string; borderLeft?: string } {\n if (!borders) return {};\n const result: { borderTop?: string; borderRight?: string; borderBottom?: string; borderLeft?: string } = {};\n const sides = [[\"top\", \"borderTop\"], [\"right\", \"borderRight\"], [\"bottom\", \"borderBottom\"], [\"left\", \"borderLeft\"]] as const;\n for (const [side, key] of sides) {\n const spec = borders[side];\n if (!spec || spec.value === \"none\" || spec.value === \"nil\") continue;\n const width = spec.size ? `${Math.max(1, Math.round(spec.size / 8))}px` : \"1px\";\n const style = spec.value === \"double\" ? \"double\" : spec.value === \"dashed\" || spec.value === \"dashSmallGap\" ? \"dashed\" : spec.value === \"dotted\" ? \"dotted\" : \"solid\";\n const color = spec.color && spec.color !== \"auto\" ? `#${spec.color}` : \"currentColor\";\n result[key] = `${width} ${style} ${color}`;\n }\n return result;\n}\n\nfunction createSdtBlock(\n sdtIndex: number,\n block: SdtNode,\n document: CanonicalDocumentEnvelope,\n cursor: number,\n counters: {\n paragraph: number;\n table: number;\n opaque: number;\n sdt: number;\n customXml: number;\n altChunk: number;\n },\n numberingPrefixResolver: NumberingPrefixResolver,\n): { block: SurfaceBlockSnapshot; lockedFragmentIds: string[]; nextCursor: number } {\n const children: SurfaceBlockSnapshot[] = [];\n const lockedFragmentIds: string[] = [];\n let innerCursor = cursor;\n\n for (const child of block.children) {\n const result = createSurfaceBlock(\n child,\n document,\n innerCursor,\n counters,\n numberingPrefixResolver,\n );\n children.push(result.block);\n lockedFragmentIds.push(...result.lockedFragmentIds);\n innerCursor = result.nextCursor;\n }\n\n return {\n block: {\n blockId: `sdt-${sdtIndex}`,\n kind: \"sdt_block\",\n from: cursor,\n to: innerCursor,\n ...(block.properties.sdtType ? { sdtType: block.properties.sdtType } : {}),\n ...(block.properties.alias ? { alias: block.properties.alias } : {}),\n ...(block.properties.tag ? { tag: block.properties.tag } : {}),\n ...(block.properties.lock ? { lock: block.properties.lock } : {}),\n ...(block.properties.checkbox ? { checkboxChecked: block.properties.checkbox.checked } : {}),\n ...(block.properties.datePicker?.fullDate ? { dateValue: block.properties.datePicker.fullDate } : {}),\n ...(block.properties.dropdownList ? { dropdownItems: block.properties.dropdownList } : {}),\n ...(block.properties.comboBox ? { comboBoxItems: block.properties.comboBox } : {}),\n ...(block.properties.showingPlcHdr ? { showingPlcHdr: true } : {}),\n children,\n },\n lockedFragmentIds,\n nextCursor: innerCursor,\n };\n}\n\nfunction createParagraphBlock(\n paragraphIndex: number,\n paragraph: ParagraphNode,\n document: CanonicalDocumentEnvelope,\n start: number,\n numberingPrefixResolver: NumberingPrefixResolver,\n): {\n block: SurfaceBlockSnapshot;\n nextCursor: number;\n lockedFragmentIds: string[];\n} {\n const accumulator: ParagraphAccumulator = {\n blockId: `paragraph-${paragraphIndex}`,\n kind: \"paragraph\",\n from: start,\n to: start,\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(paragraph.numbering ? { numbering: paragraph.numbering } : {}),\n ...(paragraph.numbering\n ? (() => {\n const detailed = numberingPrefixResolver.resolveDetailed(paragraph.numbering);\n return detailed\n ? {\n numberingPrefix: detailed.text,\n ...(detailed.suffix ? { numberingSuffix: detailed.suffix } : {}),\n }\n : {};\n })()\n : {}),\n ...(paragraph.alignment ? { alignment: paragraph.alignment } : {}),\n ...(paragraph.spacing ? { spacing: paragraph.spacing } : {}),\n ...(paragraph.contextualSpacing !== undefined\n ? { contextualSpacing: paragraph.contextualSpacing }\n : {}),\n ...(paragraph.indentation ? { indentation: paragraph.indentation } : {}),\n ...(paragraph.borders ? { borders: paragraph.borders } : {}),\n ...(paragraph.shading ? { shading: paragraph.shading } : {}),\n ...(paragraph.tabStops && paragraph.tabStops.length > 0\n ? { tabStops: paragraph.tabStops.map((tabStop) => toSurfaceTabStop(tabStop)) }\n : {}),\n ...(paragraph.keepNext ? { keepNext: true } : {}),\n ...(paragraph.keepLines ? { keepLines: true } : {}),\n ...(paragraph.pageBreakBefore ? { pageBreakBefore: true } : {}),\n ...(paragraph.outlineLevel !== undefined ? { outlineLevel: paragraph.outlineLevel } : {}),\n ...(paragraph.bidi ? { bidi: true } : {}),\n ...(paragraph.suppressLineNumbers ? { suppressLineNumbers: true } : {}),\n segments: [],\n };\n const lockedFragmentIds: string[] = [];\n let cursor = start;\n const children = Array.isArray(paragraph.children) ? paragraph.children : [];\n\n for (const child of children) {\n const result = appendInlineSegments(accumulator, child, document, cursor);\n cursor = result.nextCursor;\n lockedFragmentIds.push(...result.lockedFragmentIds);\n }\n\n accumulator.to = cursor;\n return {\n block: accumulator,\n nextCursor: cursor,\n lockedFragmentIds,\n };\n}\n\nfunction appendInlineSegments(\n paragraph: ParagraphAccumulator,\n node: InlineNode,\n document: CanonicalDocumentEnvelope,\n start: number,\n hyperlinkHref?: string,\n): { nextCursor: number; lockedFragmentIds: string[] } {\n switch (node.type) {\n case \"text\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"text\",\n from: start,\n to: start + Array.from(node.text).length,\n text: node.text,\n ...(node.marks ? (() => {\n const result = cloneMarks(node.marks);\n return {\n ...(result.marks.length > 0 ? { marks: result.marks } : {}),\n ...(result.markAttrs ? { markAttrs: result.markAttrs } : {}),\n };\n })() : {}),\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n return { nextCursor: start + Array.from(node.text).length, lockedFragmentIds: [] };\n case \"tab\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"tab\",\n from: start,\n to: start + 1,\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"hard_break\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"hard_break\",\n from: start,\n to: start + 1,\n ...(hyperlinkHref ? { hyperlinkHref } : {}),\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"hyperlink\": {\n let cursor = start;\n for (const child of node.children) {\n const result = appendInlineSegments(paragraph, child, document, cursor, node.href);\n cursor = result.nextCursor;\n }\n return { nextCursor: cursor, lockedFragmentIds: [] };\n }\n case \"image\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"image\",\n from: start,\n to: start + 1,\n mediaId: node.mediaId,\n altText: node.altText,\n state: hasMediaItem(document.media, node.mediaId) ? \"editable\" : \"missing\",\n ...(node.display ? { display: node.display } : {}),\n detail:\n node.display === \"floating\"\n ? createFloatingImageDetail(node.altText, node.floating)\n : node.altText\n ? `Alt text ${node.altText}.`\n : \"Inline image remains a whole-unit render surface.\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"opaque_inline\": {\n const fragment = getOpaqueFragment(document.preservation as never, node.fragmentId);\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n const preview = fragment ? describePreservedInlinePreview(fragment.payloadReference) : null;\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"opaque_inline\",\n from: start,\n to: start + 1,\n fragmentId: node.fragmentId,\n warningId: node.warningId,\n label: preview?.label ?? descriptor?.label ?? \"Unsupported inline OOXML\",\n detail:\n preview?.detail ??\n descriptor?.detail ??\n \"Locked whole-unit to keep unsupported inline OOXML intact through export.\",\n ...(preview?.presentation ? { presentation: preview.presentation } : {}),\n state: \"locked-preserve-only\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [node.fragmentId] };\n }\n case \"chart_preview\":\n return appendComplexPreviewSegment(paragraph, node, start, \"Embedded chart\", createChartDetail(node));\n case \"smartart_preview\":\n return appendComplexPreviewSegment(paragraph, node, start, \"SmartArt diagram\", createSmartArtDetail(node));\n case \"shape\":\n return appendComplexPreviewSegment(paragraph, node, start,\n node.isTextBox ? \"Text box\" : \"Drawing shape\", createShapeDetail(node));\n case \"wordart\":\n return appendComplexPreviewSegment(paragraph, node, start, \"WordArt\", createWordArtDetail(node));\n case \"vml_shape\":\n return appendComplexPreviewSegment(paragraph, node, start, \"Legacy VML drawing\", createVmlDetail(node));\n case \"symbol\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"text\",\n from: start,\n to: start + 1,\n text: node.char ? String.fromCodePoint(parseInt(node.char, 16)) : \"\\uFFFD\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"column_break\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"opaque_inline\",\n from: start,\n to: start + 1,\n fragmentId: \"\",\n warningId: \"\",\n label: \"Column break\",\n detail: \"Column break marker preserved for export.\",\n state: \"locked-preserve-only\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"footnote_ref\":\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"note_ref\",\n from: start,\n to: start + 1,\n noteKind: node.noteKind ?? \"footnote\",\n noteId: node.noteId ?? \"\",\n label: node.noteId ?? \"*\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n case \"field\": {\n const isSupportedField =\n node.fieldFamily === \"REF\" ||\n node.fieldFamily === \"PAGEREF\" ||\n node.fieldFamily === \"NOTEREF\" ||\n node.fieldFamily === \"TOC\";\n if (node.children && node.children.length > 0) {\n let cursor = start;\n const lockedIds: string[] = [];\n for (const child of node.children) {\n const result = appendInlineSegments(paragraph, child, document, cursor);\n cursor = result.nextCursor;\n lockedIds.push(...result.lockedFragmentIds);\n }\n return { nextCursor: cursor, lockedFragmentIds: lockedIds };\n }\n if (isSupportedField) {\n // Supported field with no resolved content — show as field chip\n const fieldLabel =\n node.fieldFamily === \"TOC\"\n ? \"Table of Contents\"\n : `${node.fieldFamily ?? \"Field\"}: ${node.fieldTarget ?? node.instruction.trim()}`;\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"field_ref\",\n from: start,\n to: start + 1,\n fieldFamily: node.fieldFamily!,\n fieldTarget: node.fieldTarget,\n instruction: node.instruction,\n refreshStatus: node.refreshStatus ?? \"stale\",\n label: fieldLabel,\n } as SurfaceInlineSegment);\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n }\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"opaque_inline\",\n from: start,\n to: start + 1,\n fragmentId: \"\",\n warningId: \"\",\n label: \"Field\",\n detail: `Preserve-only field: ${node.instruction.trim()}`,\n state: \"locked-preserve-only\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n }\n case \"bookmark_start\":\n case \"bookmark_end\":\n // Zero-width markers — no visual, no cursor advancement\n return { nextCursor: start, lockedFragmentIds: [] };\n default:\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n }\n}\n\nfunction appendComplexPreviewSegment(\n paragraph: ParagraphAccumulator,\n node: { rawXml: string },\n start: number,\n label: string,\n detail: string,\n): { nextCursor: number; lockedFragmentIds: string[] } {\n paragraph.segments.push({\n segmentId: `${paragraph.blockId}-segment-${paragraph.segments.length}`,\n kind: \"opaque_inline\",\n from: start,\n to: start + 1,\n fragmentId: `complex:${label.replace(/\\s/g, \"-\").toLowerCase()}:${start}`,\n warningId: `warning:complex-preview:${start}`,\n label,\n detail,\n state: \"locked-preserve-only\",\n });\n return { nextCursor: start + 1, lockedFragmentIds: [] };\n}\n\nfunction createChartDetail(node: ChartPreviewNode): string {\n const parts = [\"Embedded chart.\"];\n if (node.previewMediaId) {\n parts.push(`Preview available via fallback image (${node.previewMediaId}).`);\n } else {\n parts.push(\"No fallback preview image found; chart data preserved in package.\");\n }\n parts.push(\"Edit in Word to modify chart data. Original DrawingML preserved for lossless export.\");\n return parts.join(\" \");\n}\n\nfunction createSmartArtDetail(node: SmartArtPreviewNode): string {\n const parts = [\"SmartArt diagram.\"];\n if (node.previewMediaId) {\n parts.push(`Preview available via fallback image (${node.previewMediaId}).`);\n } else {\n parts.push(\"No fallback preview image found; diagram structure preserved in package.\");\n }\n parts.push(\"Edit in Word to modify diagram layout and content. Original DrawingML preserved for lossless export.\");\n return parts.join(\" \");\n}\n\nfunction createShapeDetail(node: ShapeNode): string {\n if (node.isTextBox) {\n const parts = [\"Text box.\"];\n if (node.text) parts.push(`Content: \"${node.text}\".`);\n parts.push(\"Text content is visible; formatting and geometry preserved for export.\");\n return parts.join(\" \");\n }\n const parts = [\"Drawing shape.\"];\n if (node.geometry) parts.push(`Geometry: ${node.geometry}.`);\n if (node.text) parts.push(`Text content: \"${node.text}\".`);\n parts.push(\"Visual geometry is preview-only. Original DrawingML preserved for export.\");\n return parts.join(\" \");\n}\n\nfunction createWordArtDetail(node: WordArtNode): string {\n const parts = [\"WordArt decorative text.\"];\n if (node.text) parts.push(`Text: \"${node.text}\".`);\n if (node.geometry) parts.push(`Effect: ${node.geometry}.`);\n parts.push(\"Text effect is preview-only. Edit in Word for full formatting. Original DrawingML preserved for export.\");\n return parts.join(\" \");\n}\n\nfunction createVmlDetail(node: VmlShapeNode): string {\n const parts = [\"Legacy VML drawing.\"];\n if (node.shapeType) parts.push(`Type: ${node.shapeType}.`);\n if (node.text) parts.push(`Text content: \"${node.text}\".`);\n parts.push(\"VML content is preview-only. Edit in Word for full control. Original VML XML preserved for export.\");\n return parts.join(\" \");\n}\n\nfunction createPlainText(\n blocks: SurfaceBlockSnapshot[],\n): string {\n const text: string[] = [];\n for (const block of blocks) {\n if (block.kind === \"opaque_block\") {\n if (block.fragmentId.startsWith(\"preview:\")) {\n continue;\n }\n text.push(\"\\uFFFA\");\n continue;\n }\n\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n text.push(createPlainText(cell.content));\n }\n }\n continue;\n }\n\n if (block.kind === \"sdt_block\") {\n text.push(createPlainText(block.children));\n continue;\n }\n\n for (const segment of block.segments) {\n switch (segment.kind) {\n case \"text\":\n text.push(segment.text);\n break;\n case \"tab\":\n text.push(\"\\t\");\n break;\n case \"hard_break\":\n text.push(\"\\n\");\n break;\n case \"image\":\n text.push(\"\\uFFFC\");\n break;\n case \"opaque_inline\":\n text.push(\"\\uFFF9\");\n break;\n }\n }\n }\n\n return text.join(\"\");\n}\n\nfunction createSecondaryStorySurfaces(\n document: CanonicalDocumentEnvelope,\n): SecondaryStorySurface[] {\n const surfaces: SecondaryStorySurface[] = [];\n const subParts = document.subParts;\n if (!subParts) {\n return surfaces;\n }\n\n const numberingPrefixResolver = createNumberingPrefixResolver(document.numbering);\n\n for (const section of collectSectionContexts(document)) {\n const headerVariants = resolveSectionVariants(\n \"header\",\n section.index,\n section.properties?.headerReferences,\n subParts.headers ?? [],\n );\n for (const headerVariant of headerVariants) {\n const target: EditorStoryTarget = {\n kind: \"header\",\n relationshipId: headerVariant.relationshipId,\n variant: headerVariant.variant,\n sectionIndex: section.index,\n };\n const header = findHeaderFooterDocumentEntry(document, target);\n if (!header) {\n continue;\n }\n surfaces.push(\n createStorySurface(\n target,\n `Header · ${headerVariant.variant}`,\n header.blocks,\n document,\n numberingPrefixResolver,\n ),\n );\n }\n\n const footerVariants = resolveSectionVariants(\n \"footer\",\n section.index,\n section.properties?.footerReferences,\n subParts.footers ?? [],\n );\n for (const footerVariant of footerVariants) {\n const target: EditorStoryTarget = {\n kind: \"footer\",\n relationshipId: footerVariant.relationshipId,\n variant: footerVariant.variant,\n sectionIndex: section.index,\n };\n const footer = findHeaderFooterDocumentEntry(document, target);\n if (!footer) {\n continue;\n }\n surfaces.push(\n createStorySurface(\n target,\n `Footer · ${footerVariant.variant}`,\n footer.blocks,\n document,\n numberingPrefixResolver,\n ),\n );\n }\n }\n\n const footnotes = Object.values(subParts.footnoteCollection?.footnotes ?? {}).sort(compareNoteIds);\n for (const note of footnotes) {\n const target: EditorStoryTarget = { kind: \"footnote\", noteId: note.noteId };\n surfaces.push(createStorySurface(target, `Footnote ${note.noteId}`, note.blocks, document, numberingPrefixResolver));\n }\n\n const endnotes = Object.values(subParts.footnoteCollection?.endnotes ?? {}).sort(compareNoteIds);\n for (const note of endnotes) {\n const target: EditorStoryTarget = { kind: \"endnote\", noteId: note.noteId };\n surfaces.push(createStorySurface(target, `Endnote ${note.noteId}`, note.blocks, document, numberingPrefixResolver));\n }\n\n return surfaces;\n}\n\nfunction createStorySurface(\n target: EditorStoryTarget,\n label: string,\n blocks: readonly BlockNode[],\n document: CanonicalDocumentEnvelope,\n numberingPrefixResolver: NumberingPrefixResolver,\n): SecondaryStorySurface {\n const surfaceBlocks: SurfaceBlockSnapshot[] = [];\n let cursor = 0;\n const counters = {\n paragraph: 0,\n table: 0,\n opaque: 0,\n sdt: 0,\n customXml: 0,\n altChunk: 0,\n };\n\n for (let index = 0; index < blocks.length; index += 1) {\n const surfaceBlock = createSurfaceBlock(\n blocks[index],\n document,\n cursor,\n counters,\n numberingPrefixResolver,\n );\n surfaceBlocks.push(surfaceBlock.block);\n cursor = surfaceBlock.nextCursor;\n if (index < blocks.length - 1 && blocks[index + 1]?.type === \"paragraph\") {\n cursor += 1;\n }\n }\n\n return {\n target,\n label,\n storySize: cursor,\n blocks: surfaceBlocks,\n };\n}\n\nfunction createSecondaryStoryPreviewBlocks(\n document: CanonicalDocumentEnvelope,\n cursor: number,\n): SurfaceBlockSnapshot[] {\n const previews: SurfaceBlockSnapshot[] = [];\n const subParts = document.subParts;\n if (!subParts) {\n return previews;\n }\n\n for (const header of subParts.headers ?? []) {\n previews.push(\n createSecondaryStoryPreviewBlock(\n `Header · ${header.variant}`,\n `header:${header.relationshipId}`,\n cursor,\n createSecondaryStoryPreviewDetail(header.partPath, header.blocks),\n ),\n );\n }\n\n for (const footer of subParts.footers ?? []) {\n previews.push(\n createSecondaryStoryPreviewBlock(\n `Footer · ${footer.variant}`,\n `footer:${footer.relationshipId}`,\n cursor,\n createSecondaryStoryPreviewDetail(footer.partPath, footer.blocks),\n ),\n );\n }\n\n const footnotes = Object.values(subParts.footnoteCollection?.footnotes ?? {}).sort(compareNoteIds);\n for (const note of footnotes) {\n previews.push(\n createSecondaryStoryPreviewBlock(\n `Footnote ${note.noteId}`,\n `footnote:${note.noteId}`,\n cursor,\n createSecondaryStoryPreviewDetail(`/word/footnotes.xml#${note.noteId}`, note.blocks),\n ),\n );\n }\n\n const endnotes = Object.values(subParts.footnoteCollection?.endnotes ?? {}).sort(compareNoteIds);\n for (const note of endnotes) {\n previews.push(\n createSecondaryStoryPreviewBlock(\n `Endnote ${note.noteId}`,\n `endnote:${note.noteId}`,\n cursor,\n createSecondaryStoryPreviewDetail(`/word/endnotes.xml#${note.noteId}`, note.blocks),\n ),\n );\n }\n\n return previews;\n}\n\nfunction createSecondaryStoryPreviewBlock(\n label: string,\n previewId: string,\n cursor: number,\n detail: string,\n): Extract<SurfaceBlockSnapshot, { kind: \"opaque_block\" }> {\n return {\n blockId: `secondary-story-${previewId.replace(/[^a-z0-9._:-]+/gi, \"-\")}`,\n kind: \"opaque_block\",\n from: cursor,\n to: cursor,\n fragmentId: `preview:${previewId}`,\n warningId: `preview:${previewId}`,\n label,\n detail,\n state: \"locked-preserve-only\",\n };\n}\n\nfunction createSecondaryStoryPreviewDetail(\n sourceLabel: string,\n blocks: readonly BlockNode[],\n): string {\n const previewLines = blocks\n .map((block) => summarizePreviewBlock(block))\n .filter((line) => line.trim().length > 0);\n const previewText = previewLines.length > 0 ? previewLines.join(\"\\n\\n\") : \"Empty story.\";\n return `Read-only preview from ${sourceLabel}.\\n${previewText}`;\n}\n\nfunction summarizePreviewBlock(block: BlockNode): string {\n switch (block.type) {\n case \"paragraph\": {\n const text = block.children.map((child) => summarizePreviewInline(child)).join(\"\");\n return text.trim().length > 0 ? text : \"¶\";\n }\n case \"table\":\n return \"[Table preserved in secondary story]\";\n case \"opaque_block\":\n return \"[Locked block preserved for export]\";\n case \"sdt\":\n return \"[Content control preview]\";\n case \"custom_xml\":\n return \"[Custom XML preview]\";\n case \"alt_chunk\":\n return \"[AltChunk preview]\";\n case \"section_break\":\n return \"[Section boundary]\";\n }\n}\n\nfunction summarizePreviewInline(node: InlineNode): string {\n switch (node.type) {\n case \"text\":\n return node.text;\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n return \"\\n\";\n case \"hyperlink\":\n return node.children.map((child) => summarizePreviewInline(child)).join(\"\");\n case \"footnote_ref\":\n return node.noteKind === \"footnote\" ? `[fn ${node.noteId}]` : `[en ${node.noteId}]`;\n case \"field\": {\n const instruction = node.instruction.trim();\n return instruction.length > 0 ? `[Field: ${instruction}]` : \"[Field]\";\n }\n case \"bookmark_start\":\n return node.name ? `[Bookmark: ${node.name}]` : \"[Bookmark]\";\n case \"bookmark_end\":\n return \"\";\n case \"image\":\n return node.altText ? `[Image: ${node.altText}]` : \"[Image]\";\n case \"opaque_inline\":\n return \"[Locked inline content]\";\n case \"symbol\":\n return node.char ? String.fromCodePoint(parseInt(node.char, 16)) : \"\\uFFFD\";\n case \"column_break\":\n return \"[Column break]\";\n case \"chart_preview\":\n return \"[Embedded chart]\";\n case \"smartart_preview\":\n return \"[SmartArt diagram]\";\n case \"shape\":\n if (node.isTextBox && node.text) return `[Text box: ${node.text}]`;\n return node.text ? `[Shape: ${node.text}]` : \"[Drawing shape]\";\n case \"wordart\":\n return node.text ? `[WordArt: ${node.text}]` : \"[WordArt]\";\n case \"vml_shape\":\n return node.text ? `[VML: ${node.text}]` : \"[Legacy VML drawing]\";\n }\n}\n\nfunction compareNoteIds(\n left: { noteId: string },\n right: { noteId: string },\n): number {\n return Number.parseInt(left.noteId, 10) - Number.parseInt(right.noteId, 10);\n}\n\nfunction toSurfaceTabStop(\n tabStop: NonNullable<ParagraphNode[\"tabStops\"]>[number],\n): { pos: number; val?: string; leader?: string } {\n return {\n pos: tabStop.position,\n ...(tabStop.align ? { val: tabStop.align } : {}),\n ...(tabStop.leader ? { leader: tabStop.leader } : {}),\n };\n}\n\nfunction describePreservedInlinePreview(\n payloadReference: string,\n): {\n label: string;\n detail: string;\n presentation?: \"inline-chip\" | \"quiet-marker\";\n} | null {\n if (/\\b(?:w:)?proofErr\\b/u.test(payloadReference)) {\n const proofType = /\\bw:type=\"([^\"]+)\"/u.exec(payloadReference)?.[1];\n return {\n label: \"Proofing marker\",\n detail:\n proofType && proofType.trim().length > 0\n ? `Word proofing marker (${proofType}) preserved for export safety.`\n : \"Word proofing marker preserved for export safety.\",\n presentation: \"quiet-marker\",\n };\n }\n\n if (/\\b(?:w:)?lastRenderedPageBreak\\b/u.test(payloadReference)) {\n return {\n label: \"Rendered page break\",\n detail: \"Word rendered page-break marker preserved for export safety.\",\n presentation: \"quiet-marker\",\n };\n }\n\n if (/\\b(?:w:)?permStart\\b/u.test(payloadReference)) {\n const editorGroup = /\\bw:edGrp=\"([^\"]+)\"/u.exec(payloadReference)?.[1];\n return {\n label: \"Protected range start\",\n detail:\n editorGroup && editorGroup.trim().length > 0\n ? `Protected range start for ${editorGroup} preserved for export safety.`\n : \"Protected range start preserved for export safety.\",\n presentation: \"quiet-marker\",\n };\n }\n\n if (/\\b(?:w:)?permEnd\\b/u.test(payloadReference)) {\n return {\n label: \"Protected range end\",\n detail: \"Protected range end preserved for export safety.\",\n presentation: \"quiet-marker\",\n };\n }\n\n if (/\\b(?:w:)?bookmarkStart\\b/u.test(payloadReference)) {\n const name = /\\bw:name=\"([^\"]+)\"/u.exec(payloadReference)?.[1];\n return {\n label: name ? `Bookmark · ${name}` : \"Bookmark\",\n detail: name\n ? `Bookmark anchor \\\"${name}\\\" is preserved as a read-only inline token for export safety.`\n : \"Bookmark anchor is preserved as a read-only inline token for export safety.\",\n };\n }\n\n if (/\\b(?:w:)?bookmarkEnd\\b/u.test(payloadReference)) {\n return {\n label: \"Bookmark end\",\n detail: \"Bookmark end marker is preserved as a read-only inline token for export safety.\",\n };\n }\n\n if (/\\b(?:w:)?fldSimple\\b|\\b(?:w:)?fldChar\\b|\\b(?:w:)?instrText\\b/u.test(payloadReference)) {\n const simpleInstruction = /\\bw:instr=\"([^\"]*)\"/u.exec(payloadReference)?.[1];\n const complexInstruction = [...payloadReference.matchAll(/<(?:\\w+:)?instrText\\b[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?instrText>/gu)]\n .map((match) => decodeXmlEntities(match[1] ?? \"\"))\n .join(\"\")\n .trim();\n const instruction = (simpleInstruction ?? complexInstruction ?? \"\").trim();\n const family = /^([A-Z]+)/i.exec(instruction)?.[1]?.toUpperCase();\n const label =\n family === \"TOC\"\n ? \"Table of Contents field\"\n : family\n ? `${family} field`\n : \"Field\";\n return {\n label,\n detail:\n instruction.length > 0\n ? `Read-only field preserved for export safety. Instruction: ${instruction}.`\n : \"Read-only field preserved for export safety.\",\n };\n }\n\n return null;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n\nfunction cloneMarks(marks: TextMark[]): {\n marks: SurfaceTextMark[];\n markAttrs?: {\n backgroundColor?: string;\n charSpacing?: number;\n kerning?: number;\n textFill?: string;\n fontFamily?: string;\n fontSize?: number;\n textColor?: string;\n };\n} {\n const supported: SurfaceTextMark[] = [];\n const attrs: {\n backgroundColor?: string;\n charSpacing?: number;\n kerning?: number;\n textFill?: string;\n fontFamily?: string;\n fontSize?: number;\n textColor?: string;\n } = {};\n let shadingColor: string | undefined;\n let highlightColor: string | undefined;\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n case \"italic\":\n case \"underline\":\n case \"strikethrough\":\n case \"doubleStrikethrough\":\n case \"vanish\":\n case \"emboss\":\n case \"imprint\":\n case \"shadow\":\n supported.push(mark.type);\n break;\n case \"position\":\n if (mark.val > 0) supported.push(\"superscript\");\n else if (mark.val < 0) supported.push(\"subscript\");\n break;\n case \"backgroundColor\":\n shadingColor = mark.color;\n break;\n case \"highlight\":\n highlightColor = mark.color;\n break;\n case \"charSpacing\":\n attrs.charSpacing = mark.val;\n break;\n case \"kerning\":\n attrs.kerning = mark.val;\n break;\n case \"textFill\":\n attrs.textFill = mark.xml;\n break;\n case \"fontFamily\":\n attrs.fontFamily = mark.val;\n break;\n case \"fontSize\":\n attrs.fontSize = mark.val;\n break;\n case \"textColor\":\n attrs.textColor = mark.color;\n break;\n case \"smallCaps\":\n supported.push(\"smallCaps\");\n break;\n case \"allCaps\":\n supported.push(\"allCaps\");\n break;\n case \"lang\":\n // no visual effect — skip\n break;\n }\n }\n if (highlightColor || shadingColor) {\n attrs.backgroundColor = highlightColor ?? shadingColor;\n }\n const hasAttrs = Object.keys(attrs).length > 0;\n return hasAttrs ? { marks: supported, markAttrs: attrs } : { marks: supported };\n}\n\nfunction normalizeDocumentRoot(content: unknown): DocumentRootNode {\n if (content && typeof content === \"object\" &&\n ((content as { type?: string }).type === \"doc\" || (content as { type?: string }).type === \"document_root\")) {\n return content as DocumentRootNode;\n }\n\n if (Array.isArray(content)) {\n return {\n type: \"doc\",\n children: content.filter(\n (value): value is DocumentRootNode[\"children\"][number] =>\n Boolean(value) &&\n typeof value === \"object\" &&\n ((value as { type?: string }).type === \"paragraph\" ||\n (value as { type?: string }).type === \"table\" ||\n (value as { type?: string }).type === \"sdt\" ||\n (value as { type?: string }).type === \"custom_xml\" ||\n (value as { type?: string }).type === \"alt_chunk\" ||\n (value as { type?: string }).type === \"opaque_block\"),\n ),\n };\n }\n\n return {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n };\n}\n\nfunction createFloatingImageDetail(\n altText: string | undefined,\n floating: {\n horizontalPosition?: { relativeFrom?: string; align?: string; offset?: number };\n verticalPosition?: { relativeFrom?: string; align?: string; offset?: number };\n wrap?: string;\n } | undefined,\n): string {\n const parts = [altText ? `Alt text ${altText}.` : \"Floating image rendered inline in the editor.\"];\n if (floating?.wrap) {\n parts.push(`Wrap ${floating.wrap}.`);\n }\n if (floating?.horizontalPosition?.align || floating?.horizontalPosition?.offset !== undefined) {\n parts.push(\n `Horizontal ${floating.horizontalPosition.align ?? floating.horizontalPosition.offset}.`,\n );\n }\n if (floating?.verticalPosition?.align || floating?.verticalPosition?.offset !== undefined) {\n parts.push(\n `Vertical ${floating.verticalPosition.align ?? floating.verticalPosition.offset}.`,\n );\n }\n return parts.join(\" \");\n}\n\nfunction hasMediaItem(media: MediaCatalog, mediaId: string): boolean {\n return mediaId in media.items;\n}\n","import { createSelectionSnapshot, type CanonicalDocumentEnvelope, type SelectionSnapshot } from \"./editor-state.ts\";\nimport type { TransactionMapping } from \"../selection/mapping.ts\";\nimport {\n cloneParagraphProperties,\n cloneStoryUnit,\n createPlainText,\n parseTextStory,\n serializeTextStory,\n type ParagraphProperties,\n type StoryUnit,\n type TextStory,\n} from \"../schema/text-schema.ts\";\nimport { createEditorSurfaceSnapshot } from \"../../runtime/surface-projection.ts\";\nimport type { DocumentRootNode, ParagraphNode, TableNode } from \"../../model/canonical-document.ts\";\n\nexport type TextInsertion =\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"tab\";\n }\n | {\n type: \"hard_break\";\n }\n | {\n type: \"paragraph_break\";\n };\n\nexport type TextTransactionIntent =\n | {\n type: \"replace\";\n range?: {\n from: number;\n to: number;\n };\n insertion: TextInsertion[];\n }\n | {\n type: \"delete_backward\";\n }\n | {\n type: \"delete_forward\";\n };\n\nexport interface TextTransactionResult {\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n mapping: TransactionMapping;\n storyText: string;\n}\n\nexport class TextTransactionError extends Error {\n readonly code: \"invalid_selection\" | \"unsupported_content\";\n\n constructor(\n code: TextTransactionError[\"code\"],\n message: string,\n ) {\n super(message);\n this.name = \"TextTransactionError\";\n this.code = code;\n }\n}\n\nexport function applyTextTransaction(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n intent: TextTransactionIntent,\n options: {\n timestamp: string;\n },\n): TextTransactionResult {\n const tableScopedResult = tryApplyTableParagraphTransaction(\n document,\n selection,\n intent,\n options,\n );\n if (tableScopedResult) {\n return tableScopedResult;\n }\n\n return applyLinearTextTransaction(document, selection, intent, options);\n}\n\nfunction applyLinearTextTransaction(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n intent: TextTransactionIntent,\n options: {\n timestamp: string;\n },\n): TextTransactionResult {\n const story = parseTextStory(document.content);\n const normalizedRange = resolveRange(selection, story.size, intent);\n const insertionUnits = createInsertionUnits(intent, story, normalizedRange.from);\n\n ensureEditableRange(story.units.slice(normalizedRange.from, normalizedRange.to));\n\n const nextUnits = [\n ...story.units.slice(0, normalizedRange.from).map(cloneStoryUnit),\n ...insertionUnits.map(cloneStoryUnit),\n ...story.units.slice(normalizedRange.to).map(cloneStoryUnit),\n ];\n\n const nextStory: TextStory = {\n firstParagraph: cloneParagraphProperties(story.firstParagraph),\n units: normalizeStoryUnits(nextUnits),\n size: 0,\n };\n nextStory.size = nextStory.units.length;\n\n const caret = normalizedRange.from + insertionUnits.length;\n\n return {\n document: {\n ...document,\n updatedAt: options.timestamp,\n content: serializeTextStory(nextStory),\n },\n selection: createSelectionSnapshot(caret, caret),\n mapping: {\n steps: [\n {\n from: normalizedRange.from,\n to: normalizedRange.to,\n insertSize: insertionUnits.length,\n },\n ],\n metadata: {\n affectsComments: true,\n affectsRevisions: true,\n ...(containsParagraphBoundaryChange(story, normalizedRange, insertionUnits)\n ? { invalidatesStructures: true }\n : {}),\n },\n },\n storyText: createPlainText(nextStory),\n };\n}\n\nfunction tryApplyTableParagraphTransaction(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n intent: TextTransactionIntent,\n options: {\n timestamp: string;\n },\n): TextTransactionResult | null {\n const scope = resolveTableParagraphScope(document, selection);\n if (!scope) {\n return null;\n }\n if (scope === \"unsupported\") {\n throw new TextTransactionError(\n \"unsupported_content\",\n \"Text transactions inside table structures are only supported when the selection stays within one paragraph-backed table cell.\",\n );\n }\n\n const localDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n type: \"doc\",\n children: [scope.paragraph],\n },\n };\n const localSelection = createSelectionSnapshot(\n selection.anchor - scope.paragraphStart,\n selection.head - scope.paragraphStart,\n );\n const localResult = applyLinearTextTransaction(localDocument, localSelection, intent, options);\n const nextParagraphBlocks = (localResult.document.content as DocumentRootNode).children;\n const nextRoot: DocumentRootNode = {\n ...scope.root,\n children: scope.root.children.map((child, blockIndex) => {\n if (blockIndex !== scope.tableBlockIndex) {\n return child;\n }\n\n const table = child as TableNode;\n return {\n ...table,\n rows: table.rows.map((row, rowIndex) => {\n if (rowIndex !== scope.rowIndex) {\n return row;\n }\n\n return {\n ...row,\n cells: row.cells.map((cell, cellIndex) => {\n if (cellIndex !== scope.cellIndex) {\n return cell;\n }\n\n return {\n ...cell,\n children: [\n ...cell.children.slice(0, scope.childIndex),\n ...nextParagraphBlocks,\n ...cell.children.slice(scope.childIndex + 1),\n ],\n };\n }),\n };\n }),\n };\n }),\n };\n\n return {\n document: {\n ...document,\n updatedAt: options.timestamp,\n content: nextRoot,\n },\n selection: createSelectionSnapshot(\n localResult.selection.anchor + scope.paragraphStart,\n localResult.selection.head + scope.paragraphStart,\n ),\n mapping: {\n ...localResult.mapping,\n steps: localResult.mapping.steps.map((step) => ({\n ...step,\n from: step.from + scope.paragraphStart,\n to: step.to + scope.paragraphStart,\n })),\n },\n storyText: localResult.storyText,\n };\n}\n\nfunction resolveTableParagraphScope(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n):\n | {\n root: DocumentRootNode;\n tableBlockIndex: number;\n rowIndex: number;\n cellIndex: number;\n childIndex: number;\n paragraph: ParagraphNode;\n paragraphStart: number;\n }\n | \"unsupported\"\n | null {\n const root = document.content as DocumentRootNode;\n if (!root || root.type !== \"doc\" || !Array.isArray(root.children)) {\n return null;\n }\n\n const surface = createEditorSurfaceSnapshot(document, selection);\n const selectionFrom = Math.min(selection.anchor, selection.head);\n const selectionTo = Math.max(selection.anchor, selection.head);\n\n for (let blockIndex = 0; blockIndex < root.children.length; blockIndex += 1) {\n const block = root.children[blockIndex];\n const surfaceBlock = surface.blocks[blockIndex];\n if (block?.type !== \"table\" || surfaceBlock?.kind !== \"table\") {\n continue;\n }\n\n const insideTable = selectionFallsWithinSurfaceRange(\n selectionFrom,\n selectionTo,\n surfaceBlock.from,\n surfaceBlock.to,\n );\n if (!insideTable) {\n continue;\n }\n\n for (let rowIndex = 0; rowIndex < block.rows.length; rowIndex += 1) {\n const row = block.rows[rowIndex];\n const surfaceRow = surfaceBlock.rows[rowIndex];\n if (!row || !surfaceRow) {\n continue;\n }\n\n for (let cellIndex = 0; cellIndex < row.cells.length; cellIndex += 1) {\n const cell = row.cells[cellIndex];\n const surfaceCell = surfaceRow.cells[cellIndex];\n if (!cell || !surfaceCell) {\n continue;\n }\n\n for (\n let childIndex = 0;\n childIndex < Math.min(cell.children.length, surfaceCell.content.length);\n childIndex += 1\n ) {\n const child = cell.children[childIndex];\n const surfaceChild = surfaceCell.content[childIndex];\n if (child?.type !== \"paragraph\" || surfaceChild?.kind !== \"paragraph\") {\n continue;\n }\n\n const insideParagraph = selectionFallsWithinSurfaceRange(\n selectionFrom,\n selectionTo,\n surfaceChild.from,\n surfaceChild.to,\n );\n if (!insideParagraph) {\n continue;\n }\n\n return {\n root,\n tableBlockIndex: blockIndex,\n rowIndex,\n cellIndex,\n childIndex,\n paragraph: child,\n paragraphStart: surfaceChild.from,\n };\n }\n }\n }\n\n return \"unsupported\";\n }\n\n return null;\n}\n\nfunction selectionFallsWithinSurfaceRange(\n selectionFrom: number,\n selectionTo: number,\n rangeFrom: number,\n rangeTo: number,\n): boolean {\n if (rangeFrom === rangeTo) {\n return selectionFrom === rangeFrom && selectionTo === rangeTo;\n }\n\n return (\n selectionFrom >= rangeFrom &&\n selectionTo <= rangeTo &&\n selectionFrom < rangeTo\n );\n}\n\nfunction resolveRange(\n selection: SelectionSnapshot,\n storySize: number,\n intent: TextTransactionIntent,\n): { from: number; to: number } {\n const from = Math.max(0, Math.min(selection.anchor, selection.head));\n const to = Math.max(0, Math.max(selection.anchor, selection.head));\n\n if (from > storySize || to > storySize) {\n throw new TextTransactionError(\n \"invalid_selection\",\n `Selection ${from}-${to} exceeds story size ${storySize}.`,\n );\n }\n\n if (intent.type === \"replace\") {\n if (intent.range) {\n const explicitFrom = Math.max(0, Math.min(intent.range.from, intent.range.to));\n const explicitTo = Math.max(0, Math.max(intent.range.from, intent.range.to));\n if (explicitFrom > storySize || explicitTo > storySize) {\n throw new TextTransactionError(\n \"invalid_selection\",\n `Explicit range ${explicitFrom}-${explicitTo} exceeds story size ${storySize}.`,\n );\n }\n\n return {\n from: explicitFrom,\n to: explicitTo,\n };\n }\n\n return { from, to };\n }\n\n if (from !== to) {\n return { from, to };\n }\n\n if (intent.type === \"delete_backward\") {\n return {\n from: Math.max(0, from - 1),\n to: from,\n };\n }\n\n return {\n from,\n to: Math.min(storySize, from + 1),\n };\n}\n\nfunction createInsertionUnits(\n intent: TextTransactionIntent,\n story: TextStory,\n position: number,\n): StoryUnit[] {\n if (intent.type !== \"replace\") {\n return [];\n }\n\n const inheritedProps = resolveParagraphPropertiesAtPosition(story, position);\n\n return intent.insertion.flatMap((entry) => {\n switch (entry.type) {\n case \"text\":\n return Array.from(entry.text).map<StoryUnit>((character) => ({\n kind: \"text\",\n value: character,\n }));\n case \"tab\":\n return [{ kind: \"tab\" }];\n case \"hard_break\":\n return [{ kind: \"hard_break\" }];\n case \"paragraph_break\":\n return [\n {\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(inheritedProps),\n },\n ];\n }\n });\n}\n\nfunction resolveParagraphPropertiesAtPosition(\n story: TextStory,\n position: number,\n): ParagraphProperties {\n let current = cloneParagraphProperties(story.firstParagraph);\n\n for (let index = 0; index < Math.min(position, story.units.length); index += 1) {\n const unit = story.units[index];\n if (unit.kind === \"paragraph_break\") {\n current = cloneParagraphProperties(unit.nextParagraph);\n } else if (unit.kind === \"opaque_block\" && unit.nextParagraph) {\n current = cloneParagraphProperties(unit.nextParagraph);\n }\n }\n\n return current;\n}\n\nfunction normalizeStoryUnits(units: StoryUnit[]): StoryUnit[] {\n if (units.length === 0) {\n return [];\n }\n\n const normalized: StoryUnit[] = [];\n\n for (const unit of units) {\n if (\n unit.kind === \"paragraph_break\" &&\n normalized[normalized.length - 1]?.kind === \"paragraph_break\"\n ) {\n normalized.push({\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(unit.nextParagraph),\n });\n continue;\n }\n\n normalized.push(cloneStoryUnit(unit));\n }\n\n return normalized;\n}\n\nfunction ensureEditableRange(units: StoryUnit[]): void {\n const protectedUnit = units.find(\n (unit) => unit.kind === \"opaque_inline\" || unit.kind === \"opaque_block\" || unit.kind === \"image\",\n );\n\n if (!protectedUnit) {\n return;\n }\n\n throw new TextTransactionError(\n \"unsupported_content\",\n `Text transaction crosses protected ${protectedUnit.kind} content.`,\n );\n}\n\nfunction containsParagraphBoundaryChange(\n story: TextStory,\n range: { from: number; to: number },\n insertionUnits: StoryUnit[],\n): boolean {\n if (insertionUnits.some((unit) => unit.kind === \"paragraph_break\")) {\n return true;\n }\n\n return story.units\n .slice(range.from, range.to)\n .some((unit) => unit.kind === \"paragraph_break\");\n}\n","import type { InsertTableOptions } from \"../../api/public-types\";\nimport type { ParagraphNode } from \"../../model/canonical-document.ts\";\nimport {\n createSelectionSnapshot,\n type CanonicalDocumentEnvelope,\n type SelectionSnapshot,\n} from \"../state/editor-state.ts\";\nimport {\n applyTextTransaction,\n type TextTransactionResult,\n} from \"../state/text-transaction.ts\";\nimport {\n createInsertedTableBlock,\n createNoopStructuralMutation,\n findTableCellParagraphSelection,\n replaceParagraphScope,\n resolveInsertedTableStyleId,\n resolveParagraphScope,\n type StructuralMutationResult,\n} from \"./structural-helpers.ts\";\n\nexport interface TextCommandContext {\n timestamp: string;\n}\n\nexport function insertText(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n text: string,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [\n {\n type: \"text\",\n text,\n },\n ],\n },\n context,\n );\n}\n\nexport function deleteSelectionOrBackward(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n selection.isCollapsed\n ? {\n type: \"delete_backward\",\n }\n : {\n type: \"replace\",\n insertion: [],\n },\n context,\n );\n}\n\nexport function deleteSelectionOrForward(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n selection.isCollapsed\n ? {\n type: \"delete_forward\",\n }\n : {\n type: \"replace\",\n insertion: [],\n },\n context,\n );\n}\n\nexport function insertTab(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [{ type: \"tab\" }],\n },\n context,\n );\n}\n\nexport function insertHardBreak(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [{ type: \"hard_break\" }],\n },\n context,\n );\n}\n\nexport function splitParagraph(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): TextTransactionResult {\n return applyTextTransaction(\n document,\n selection,\n {\n type: \"replace\",\n insertion: [{ type: \"paragraph_break\" }],\n },\n context,\n );\n}\n\nexport function insertPageBreak(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n context: TextCommandContext,\n): StructuralMutationResult {\n const scope = resolveParagraphScope(document, selection);\n if (!scope) {\n return createNoopStructuralMutation(document, selection);\n }\n\n const localDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n type: \"doc\",\n children: [scope.paragraph],\n },\n };\n const localSelection = createSelectionSnapshot(\n selection.anchor - scope.paragraphStart,\n selection.head - scope.paragraphStart,\n );\n const splitResult = splitParagraph(localDocument, localSelection, context);\n const splitRoot = splitResult.document.content;\n if (!splitRoot || splitRoot.type !== \"doc\") {\n return createNoopStructuralMutation(document, selection);\n }\n\n const replacementParagraphs = splitRoot.children\n .filter((block): block is ParagraphNode => block.type === \"paragraph\")\n .map((block, index) =>\n index === 1\n ? {\n ...block,\n pageBreakBefore: true,\n }\n : block,\n );\n if (replacementParagraphs.length < 2) {\n return createNoopStructuralMutation(document, selection);\n }\n\n const nextDocument = replaceParagraphScope(document, scope, replacementParagraphs);\n return {\n changed: true,\n document: {\n ...nextDocument,\n updatedAt: context.timestamp,\n },\n selection: createSelectionSnapshot(\n splitResult.selection.anchor + scope.paragraphStart,\n splitResult.selection.head + scope.paragraphStart,\n ),\n mapping: {\n ...splitResult.mapping,\n steps: splitResult.mapping.steps.map((step) => ({\n ...step,\n from: step.from + scope.paragraphStart,\n to: step.to + scope.paragraphStart,\n })),\n },\n };\n}\n\nexport function insertTable(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n options: InsertTableOptions,\n context: TextCommandContext,\n): StructuralMutationResult {\n const scope = resolveParagraphScope(document, selection);\n if (!scope || scope.kind !== \"top-level\") {\n return createNoopStructuralMutation(document, selection);\n }\n\n const safeRows = Math.max(1, Math.floor(options.rows));\n const safeColumns = Math.max(1, Math.floor(options.columns));\n if (!Number.isFinite(safeRows) || !Number.isFinite(safeColumns)) {\n return createNoopStructuralMutation(document, selection);\n }\n\n const localDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n type: \"doc\",\n children: [scope.paragraph],\n },\n };\n const localSelection = createSelectionSnapshot(\n selection.anchor - scope.paragraphStart,\n selection.head - scope.paragraphStart,\n );\n const splitResult = splitParagraph(localDocument, localSelection, context);\n const splitRoot = splitResult.document.content;\n if (!splitRoot || splitRoot.type !== \"doc\") {\n return createNoopStructuralMutation(document, selection);\n }\n\n const replacementParagraphs = splitRoot.children.filter(\n (block): block is ParagraphNode => block.type === \"paragraph\",\n );\n if (replacementParagraphs.length < 2) {\n return createNoopStructuralMutation(document, selection);\n }\n\n const nextRoot = document.content;\n if (!nextRoot || nextRoot.type !== \"doc\") {\n return createNoopStructuralMutation(document, selection);\n }\n\n const insertedTable = createInsertedTableBlock(\n safeRows,\n safeColumns,\n resolveInsertedTableStyleId(document),\n );\n const nextDocument: CanonicalDocumentEnvelope = {\n ...document,\n updatedAt: context.timestamp,\n content: {\n ...nextRoot,\n children: [\n ...nextRoot.children.slice(0, scope.blockIndex),\n replacementParagraphs[0],\n insertedTable,\n replacementParagraphs[1],\n ...nextRoot.children.slice(scope.blockIndex + 1),\n ],\n },\n };\n\n return {\n changed: true,\n document: nextDocument,\n selection:\n findTableCellParagraphSelection(\n nextDocument,\n scope.blockIndex + 1,\n 0,\n 0,\n ) ?? selection,\n mapping: {\n ...splitResult.mapping,\n steps: splitResult.mapping.steps.map((step) => ({\n ...step,\n from: step.from + scope.paragraphStart,\n to: step.to + scope.paragraphStart,\n })),\n },\n };\n}\n","import { parseTextStory } from \"../schema/text-schema.ts\";\nimport {\n DEFAULT_BOUNDARY_ASSOC,\n createDetachedAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type BoundaryAssoc,\n type DetachedAnchor,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"./mapping.ts\";\n\nexport type ReviewAnchor = EditorAnchorProjection;\n\nexport const COMMENT_RANGE_ASSOC: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC;\n\nexport function createCommentReviewAnchor(\n from: number,\n to = from,\n assoc: BoundaryAssoc = COMMENT_RANGE_ASSOC,\n): ReviewAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function detachReviewAnchor(\n lastKnownRange: DocRange,\n reason: DetachedAnchor[\"reason\"],\n): DetachedAnchor {\n return createDetachedAnchor(lastKnownRange, reason);\n}\n\nexport function mapReviewAnchor(\n anchor: ReviewAnchor,\n mapping: TransactionMapping,\n): ReviewAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function getAnchorRange(anchor: ReviewAnchor): DocRange {\n if (anchor.kind === \"range\") {\n return normalizeRange(anchor.range);\n }\n\n if (anchor.kind === \"node\") {\n return { from: anchor.at, to: anchor.at };\n }\n\n return normalizeRange(anchor.lastKnownRange);\n}\n\nexport function mappingTouchesAnchorContent(\n anchor: ReviewAnchor,\n mapping: TransactionMapping,\n): boolean {\n const range = getAnchorRange(anchor);\n\n if (range.from === range.to) {\n return mapping.steps.some(\n (step) => step.from <= range.from && step.to >= range.to,\n );\n }\n\n return mapping.steps.some(\n (step) => step.from < range.to && step.to > range.from,\n );\n}\n\nexport function rangeStaysWithinSingleParagraph(\n content: unknown,\n range: DocRange,\n): boolean {\n const normalized = normalizeRange(range);\n if (normalized.from === normalized.to) {\n return true;\n }\n\n const surfaceBlocks = readSurfaceBlocks(content);\n if (surfaceBlocks) {\n return surfaceBlocks.some(\n (block) =>\n block.kind === \"paragraph\" &&\n normalized.from >= block.from &&\n normalized.to <= block.to,\n );\n }\n\n const story = parseTextStory(content);\n const upperBound = Math.min(normalized.to, story.units.length);\n\n for (let index = Math.max(0, normalized.from); index < upperBound; index += 1) {\n const unit = story.units[index];\n if (!unit) {\n continue;\n }\n\n if (unit.kind === \"paragraph_break\" || unit.kind === \"opaque_block\") {\n return false;\n }\n }\n\n return true;\n}\n\nexport function canCreateDocxCommentAnchor(\n content: unknown,\n anchor: ReviewAnchor,\n): boolean {\n if (anchor.kind !== \"range\") {\n return false;\n }\n\n const normalized = normalizeRange(anchor.range);\n if (normalized.from === normalized.to) {\n return false;\n }\n\n return rangeStaysWithinSingleParagraph(content, normalized);\n}\n\nfunction readSurfaceBlocks(\n content: unknown,\n): Array<{ kind: string; from: number; to: number }> | undefined {\n if (!content || typeof content !== \"object\" || !(\"blocks\" in content)) {\n return undefined;\n }\n\n const blocks = (content as { blocks?: unknown }).blocks;\n if (!Array.isArray(blocks)) {\n return undefined;\n }\n\n const normalized = flattenSurfaceBlocks(blocks);\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction flattenSurfaceBlocks(\n blocks: unknown[],\n): Array<{ kind: string; from: number; to: number }> {\n const flattened: Array<{ kind: string; from: number; to: number }> = [];\n\n for (const block of blocks) {\n if (\n !block ||\n typeof block !== \"object\" ||\n typeof (block as { kind?: unknown }).kind !== \"string\" ||\n typeof (block as { from?: unknown }).from !== \"number\" ||\n typeof (block as { to?: unknown }).to !== \"number\"\n ) {\n continue;\n }\n\n flattened.push({\n kind: (block as { kind: string }).kind,\n from: (block as { from: number }).from,\n to: (block as { to: number }).to,\n });\n\n if (\n (block as { kind: string }).kind === \"table\" &&\n Array.isArray((block as { rows?: unknown }).rows)\n ) {\n for (const row of (block as { rows: Array<{ cells?: unknown[] }> }).rows) {\n for (const cell of row.cells ?? []) {\n if (cell && typeof cell === \"object\" && Array.isArray((cell as { content?: unknown[] }).content)) {\n flattened.push(...flattenSurfaceBlocks((cell as { content: unknown[] }).content));\n }\n }\n }\n }\n\n if (\n (block as { kind: string }).kind === \"sdt_block\" &&\n Array.isArray((block as { children?: unknown[] }).children)\n ) {\n flattened.push(...flattenSurfaceBlocks((block as { children: unknown[] }).children));\n }\n }\n\n return flattened;\n}\n","import type { CommentThreadRecord, EditorWarning } from \"../../core/state/editor-state.ts\";\nimport {\n detachReviewAnchor,\n getAnchorRange,\n mapReviewAnchor,\n mappingTouchesAnchorContent,\n rangeStaysWithinSingleParagraph,\n type ReviewAnchor,\n} from \"../../core/selection/review-anchors.ts\";\nimport type { TransactionMapping } from \"../../core/selection/mapping.ts\";\n\nexport interface RemapCommentThreadsOptions {\n comments: Record<string, CommentThreadRecord>;\n mapping: TransactionMapping;\n nextContent: unknown;\n existingWarnings?: EditorWarning[];\n}\n\nexport interface RemapCommentThreadsResult {\n comments: Record<string, CommentThreadRecord>;\n warnings: EditorWarning[];\n detachedCommentIds: string[];\n}\n\nexport function remapCommentThreads(\n options: RemapCommentThreadsOptions,\n): RemapCommentThreadsResult {\n const comments = Object.fromEntries(\n Object.entries(options.comments).map(([commentId, comment]) => [\n commentId,\n remapCommentThread(comment, options.mapping, options.nextContent),\n ]),\n );\n const detachedCommentIds = Object.values(comments)\n .filter((comment) => comment.anchor.kind === \"detached\")\n .map((comment) => comment.commentId);\n\n return {\n comments,\n warnings: mergeDetachedAnchorWarnings(comments, options.existingWarnings ?? []),\n detachedCommentIds,\n };\n}\n\nexport function remapCommentThread(\n comment: CommentThreadRecord,\n mapping: TransactionMapping,\n nextContent: unknown,\n): CommentThreadRecord {\n if (comment.anchor.kind === \"detached\") {\n return comment;\n }\n\n const mappedAnchor = mapReviewAnchor(comment.anchor, mapping);\n const anchor = normalizeCommentAnchor(comment.anchor, mappedAnchor, mapping, nextContent);\n\n return {\n ...comment,\n anchor,\n };\n}\n\nfunction normalizeCommentAnchor(\n previousAnchor: ReviewAnchor,\n mappedAnchor: ReviewAnchor,\n mapping: TransactionMapping,\n nextContent: unknown,\n): ReviewAnchor {\n if (mappedAnchor.kind === \"detached\") {\n return mappedAnchor;\n }\n\n const previousRange = getAnchorRange(previousAnchor);\n const mappedRange = getAnchorRange(mappedAnchor);\n\n if (\n previousAnchor.kind === \"range\" &&\n previousRange.from < previousRange.to &&\n mappedAnchor.kind === \"range\" &&\n mappedRange.from === mappedRange.to &&\n mappingTouchesAnchorContent(previousAnchor, mapping)\n ) {\n return detachReviewAnchor(previousRange, detachReason(mapping));\n }\n\n if (\n mappedAnchor.kind === \"range\" &&\n !rangeStaysWithinSingleParagraph(nextContent, mappedAnchor.range)\n ) {\n return detachReviewAnchor(previousRange, \"invalidatedByStructureChange\");\n }\n\n return mappedAnchor;\n}\n\nfunction detachReason(\n mapping: TransactionMapping,\n): \"deleted\" | \"invalidatedByStructureChange\" {\n return mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\";\n}\n\nfunction mergeDetachedAnchorWarnings(\n comments: Record<string, CommentThreadRecord>,\n existingWarnings: EditorWarning[],\n): EditorWarning[] {\n const retainedWarnings = existingWarnings.filter(\n (warning) =>\n warning.code !== \"comment_anchor_detached\" ||\n !warning.details ||\n typeof warning.details.commentId !== \"string\" ||\n comments[warning.details.commentId]?.anchor.kind === \"detached\",\n );\n\n const knownDetachedIds = new Set(\n retainedWarnings\n .filter((warning) => warning.code === \"comment_anchor_detached\")\n .map((warning) =>\n typeof warning.details?.commentId === \"string\"\n ? warning.details.commentId\n : undefined,\n )\n .filter((value): value is string => Boolean(value)),\n );\n\n const detachedWarnings = Object.values(comments)\n .filter(\n (comment) =>\n comment.anchor.kind === \"detached\" && !knownDetachedIds.has(comment.commentId),\n )\n .map((comment) => createDetachedCommentWarning(comment));\n\n return [...retainedWarnings, ...detachedWarnings];\n}\n\nfunction createDetachedCommentWarning(\n comment: CommentThreadRecord,\n): EditorWarning {\n const anchor = comment.anchor.kind === \"detached\" ? comment.anchor : undefined;\n\n return {\n warningId: `warning:comment-anchor-detached:${comment.commentId}`,\n code: \"comment_anchor_detached\",\n severity: \"warning\",\n message: `Comment ${comment.commentId} detached after edit remapping.`,\n source: \"review\",\n affectedAnchor: anchor,\n details: {\n commentId: comment.commentId,\n reason: anchor?.reason,\n },\n };\n}\n","import {\n createNodeAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type Assoc,\n type BoundaryAssoc,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"../../core/selection/mapping.ts\";\nimport type { RevisionStoryTargetRecord } from \"../../model/canonical-document.ts\";\n\nexport type RevisionAnchor = EditorAnchorProjection;\n\nexport type SupportedRevisionKind = \"insertion\" | \"deletion\" | \"property-change\";\nexport type PreserveOnlyRevisionKind = \"formatting\" | \"move\";\nexport type RevisionKind = SupportedRevisionKind | PreserveOnlyRevisionKind;\n\nexport type RevisionStatus = \"active\" | \"accepted\" | \"rejected\" | \"detached\";\nexport type RevisionActionability = \"actionable\" | \"preserve-only\";\nexport type RevisionAnchorState = \"active\" | \"detached\";\n\nexport interface PropertyChangeData {\n xmlTag: \"pPrChange\" | \"sectPrChange\" | \"tblPrChange\" | \"rPrChange\";\n beforeXml: string;\n}\n\nexport interface MoveData {\n moveId: string;\n direction: \"from\" | \"to\";\n linkedRevisionId?: string;\n}\n\nexport interface RevisionMetadataEnvelope {\n source: \"runtime\" | \"import\";\n storyTarget?: RevisionStoryTargetRecord;\n preserveOnlyReason?: string;\n importedRevisionForm?:\n | \"run-insertion\"\n | \"run-deletion\"\n | \"paragraph-insertion\"\n | \"paragraph-deletion\";\n originalRevisionType?: string;\n ooxmlRevisionId?: string;\n propertyChangeData?: PropertyChangeData;\n moveData?: MoveData;\n}\n\nexport type PropertyChangeRevision = RevisionRecord & {\n kind: \"property-change\";\n metadata: RevisionMetadataEnvelope & { propertyChangeData: PropertyChangeData };\n};\n\nexport type MoveRevision = RevisionRecord & {\n kind: \"move\";\n metadata: RevisionMetadataEnvelope & { moveData: MoveData };\n};\n\nexport interface RevisionRecord {\n revisionId: string;\n kind: RevisionKind;\n anchor: RevisionAnchor;\n authorId: string;\n createdAt: string;\n status: RevisionStatus;\n warningIds: string[];\n metadata: RevisionMetadataEnvelope;\n}\n\nexport interface RevisionAnchorSummary {\n anchor: RevisionAnchor;\n state: RevisionAnchorState;\n range: DocRange;\n}\n\nexport function createRevisionRangeAnchor(\n from: number,\n to = from,\n assoc?: BoundaryAssoc,\n): RevisionAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function createRevisionNodeAnchor(at: number, assoc?: Assoc): RevisionAnchor {\n return createNodeAnchor(at, assoc);\n}\n\nexport function remapRevisionAnchor(\n anchor: RevisionAnchor,\n mapping: TransactionMapping,\n): RevisionAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function isDetachedRevisionAnchor(anchor: RevisionAnchor): boolean {\n return anchor.kind === \"detached\";\n}\n\nexport function summarizeRevisionAnchor(anchor: RevisionAnchor): RevisionAnchorSummary {\n if (anchor.kind === \"range\") {\n return {\n anchor,\n state: \"active\",\n range: normalizeRange(anchor.range),\n };\n }\n\n if (anchor.kind === \"node\") {\n return {\n anchor,\n state: \"active\",\n range: {\n from: anchor.at,\n to: anchor.at,\n },\n };\n }\n\n return {\n anchor,\n state: \"detached\",\n range: normalizeRange(anchor.lastKnownRange),\n };\n}\n\nexport function getRevisionActionability(\n revision:\n | RevisionKind\n | Pick<RevisionRecord, \"kind\" | \"metadata\">,\n): RevisionActionability {\n if (\n typeof revision !== \"string\" &&\n typeof revision.metadata.preserveOnlyReason === \"string\" &&\n revision.metadata.preserveOnlyReason.length > 0\n ) {\n return \"preserve-only\";\n }\n\n const kind = typeof revision === \"string\" ? revision : revision.kind;\n switch (kind) {\n case \"insertion\":\n case \"deletion\":\n case \"property-change\":\n return \"actionable\";\n case \"formatting\":\n case \"move\":\n return \"preserve-only\";\n }\n}\n\nexport function isRevisionActionable(\n record: Pick<RevisionRecord, \"kind\" | \"metadata\" | \"status\">,\n): boolean {\n return getRevisionActionability(record) === \"actionable\" && record.status === \"active\";\n}\n\nexport function describeRevisionKind(kind: RevisionKind): string {\n switch (kind) {\n case \"insertion\":\n return \"Insertion\";\n case \"deletion\":\n return \"Deletion\";\n case \"formatting\":\n return \"Formatting change\";\n case \"move\":\n return \"Move\";\n case \"property-change\":\n return \"Property change\";\n }\n}\n","import type { TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport {\n describeRevisionKind,\n getRevisionActionability,\n isDetachedRevisionAnchor,\n isRevisionActionable,\n remapRevisionAnchor,\n summarizeRevisionAnchor,\n type RevisionActionability,\n type RevisionKind,\n type RevisionMetadataEnvelope,\n type RevisionRecord,\n type RevisionStatus,\n} from \"./revision-types.ts\";\n\nexport type { RevisionRecord, RevisionKind, RevisionStatus } from \"./revision-types.ts\";\n\nexport interface RevisionStore {\n version: \"revision-store/1\";\n revisions: Record<string, RevisionRecord>;\n}\n\nexport interface CreateRevisionRecordParams {\n revisionId: string;\n kind: RevisionKind;\n anchor: RevisionRecord[\"anchor\"];\n authorId: string;\n createdAt: string;\n status?: Exclude<RevisionStatus, \"detached\">;\n warningIds?: string[];\n metadata?: Partial<RevisionMetadataEnvelope>;\n}\n\nexport interface RevisionSidebarEntry {\n revisionId: string;\n kind: RevisionKind;\n label: string;\n status: RevisionStatus;\n actionability: RevisionActionability;\n anchorLabel: string;\n createdAt: string;\n authorId: string;\n warningCount: number;\n canAccept: boolean;\n canReject: boolean;\n preserveOnlyReason?: string;\n linkedMoveRevisionId?: string;\n moveDirection?: \"from\" | \"to\";\n}\n\nexport interface RevisionSidebarProjection {\n totalCount: number;\n activeRevisionIds: string[];\n acceptedRevisionIds: string[];\n rejectedRevisionIds: string[];\n detachedRevisionIds: string[];\n actionableRevisionIds: string[];\n preserveOnlyRevisionIds: string[];\n revisions: RevisionSidebarEntry[];\n}\n\nexport function createRevisionStore(\n revisions: Record<string, RevisionRecord> = {},\n): RevisionStore {\n return {\n version: \"revision-store/1\",\n revisions,\n };\n}\n\nexport function createRevisionRecord(\n params: CreateRevisionRecordParams,\n): RevisionRecord {\n return normalizeRevisionRecord({\n revisionId: params.revisionId,\n kind: params.kind,\n anchor: params.anchor,\n authorId: params.authorId,\n createdAt: params.createdAt,\n status: params.status ?? \"active\",\n warningIds: [...(params.warningIds ?? [])],\n metadata: {\n source: params.metadata?.source ?? \"runtime\",\n storyTarget: params.metadata?.storyTarget,\n preserveOnlyReason:\n params.metadata?.preserveOnlyReason ??\n (getRevisionActionability(params.kind) === \"preserve-only\"\n ? \"Imported preserve-only revision.\"\n : undefined),\n importedRevisionForm: params.metadata?.importedRevisionForm,\n originalRevisionType: params.metadata?.originalRevisionType,\n ooxmlRevisionId: params.metadata?.ooxmlRevisionId,\n propertyChangeData: params.metadata?.propertyChangeData,\n moveData: params.metadata?.moveData,\n },\n });\n}\n\nexport function upsertRevisionRecord(\n store: RevisionStore,\n revision: RevisionRecord,\n): RevisionStore {\n return {\n ...store,\n revisions: {\n ...store.revisions,\n [revision.revisionId]: normalizeRevisionRecord(revision),\n },\n };\n}\n\nexport function setRevisionStatus(\n store: RevisionStore,\n revisionId: string,\n status: Exclude<RevisionStatus, \"detached\">,\n): RevisionStore {\n const existing = store.revisions[revisionId];\n if (!existing) {\n return store;\n }\n\n if (existing.status === \"detached\") {\n return store;\n }\n\n if (\n (status === \"accepted\" || status === \"rejected\") &&\n getRevisionActionability(existing) !== \"actionable\"\n ) {\n return store;\n }\n\n return upsertRevisionRecord(store, {\n ...existing,\n status,\n });\n}\n\nexport function setRevisionWarnings(\n store: RevisionStore,\n revisionId: string,\n warningIds: string[],\n): RevisionStore {\n const existing = store.revisions[revisionId];\n if (!existing) {\n return store;\n }\n\n return upsertRevisionRecord(store, {\n ...existing,\n warningIds: [...warningIds],\n });\n}\n\nexport function remapRevisionStore(\n store: RevisionStore,\n mapping: TransactionMapping,\n): RevisionStore {\n return createRevisionStore(\n Object.fromEntries(\n Object.entries(store.revisions).map(([revisionId, revision]) => {\n const anchor = remapRevisionAnchor(revision.anchor, mapping);\n const status =\n anchor.kind === \"detached\"\n ? \"detached\"\n : revision.status === \"accepted\" || revision.status === \"rejected\"\n ? revision.status\n : \"active\";\n\n return [\n revisionId,\n normalizeRevisionRecord({\n ...revision,\n anchor,\n status,\n }),\n ];\n }),\n ),\n );\n}\n\nexport function createRevisionSidebarProjection(\n store: RevisionStore,\n): RevisionSidebarProjection {\n const revisions = Object.values(store.revisions)\n .map(toSidebarEntry)\n .sort(compareRevisionEntries);\n\n return {\n totalCount: revisions.length,\n activeRevisionIds: revisions\n .filter((revision) => revision.status === \"active\")\n .map((revision) => revision.revisionId),\n acceptedRevisionIds: revisions\n .filter((revision) => revision.status === \"accepted\")\n .map((revision) => revision.revisionId),\n rejectedRevisionIds: revisions\n .filter((revision) => revision.status === \"rejected\")\n .map((revision) => revision.revisionId),\n detachedRevisionIds: revisions\n .filter((revision) => revision.status === \"detached\")\n .map((revision) => revision.revisionId),\n actionableRevisionIds: revisions\n .filter((revision) => revision.actionability === \"actionable\")\n .map((revision) => revision.revisionId),\n preserveOnlyRevisionIds: revisions\n .filter((revision) => revision.actionability === \"preserve-only\")\n .map((revision) => revision.revisionId),\n revisions,\n };\n}\n\nfunction toSidebarEntry(revision: RevisionRecord): RevisionSidebarEntry {\n const anchorSummary = summarizeRevisionAnchor(revision.anchor);\n const actionability = getRevisionActionability(revision);\n\n const moveData = revision.metadata.moveData;\n\n return {\n revisionId: revision.revisionId,\n kind: revision.kind,\n label: describeRevisionKind(revision.kind),\n status: revision.status,\n actionability,\n anchorLabel:\n anchorSummary.state === \"detached\"\n ? `Detached ${anchorSummary.range.from}-${anchorSummary.range.to}`\n : `Range ${anchorSummary.range.from}-${anchorSummary.range.to}`,\n createdAt: revision.createdAt,\n authorId: revision.authorId,\n warningCount: revision.warningIds.length,\n canAccept: isRevisionActionable(revision),\n canReject: isRevisionActionable(revision),\n preserveOnlyReason: revision.metadata.preserveOnlyReason,\n linkedMoveRevisionId: moveData?.linkedRevisionId,\n moveDirection: moveData?.direction,\n };\n}\n\nfunction normalizeRevisionRecord(revision: RevisionRecord): RevisionRecord {\n const actionability = getRevisionActionability(revision);\n\n if (isDetachedRevisionAnchor(revision.anchor)) {\n return {\n ...revision,\n status: \"detached\",\n metadata: {\n ...revision.metadata,\n preserveOnlyReason:\n revision.metadata.preserveOnlyReason ??\n (actionability === \"preserve-only\"\n ? \"Imported preserve-only revision.\"\n : undefined),\n },\n };\n }\n\n if (actionability === \"preserve-only\" && revision.status !== \"detached\") {\n return {\n ...revision,\n status: revision.status === \"accepted\" || revision.status === \"rejected\" ? \"active\" : revision.status,\n metadata: {\n ...revision.metadata,\n preserveOnlyReason:\n revision.metadata.preserveOnlyReason ?? \"Imported preserve-only revision.\",\n },\n };\n }\n\n return revision;\n}\n\nfunction compareRevisionEntries(\n left: RevisionSidebarEntry,\n right: RevisionSidebarEntry,\n): number {\n const statusDelta = priorityForStatus(left.status) - priorityForStatus(right.status);\n if (statusDelta !== 0) {\n return statusDelta;\n }\n\n const actionabilityDelta =\n priorityForActionability(left.actionability) - priorityForActionability(right.actionability);\n if (actionabilityDelta !== 0) {\n return actionabilityDelta;\n }\n\n return left.createdAt.localeCompare(right.createdAt);\n}\n\nfunction priorityForStatus(status: RevisionStatus): number {\n switch (status) {\n case \"active\":\n return 0;\n case \"detached\":\n return 1;\n case \"accepted\":\n return 2;\n case \"rejected\":\n return 3;\n }\n}\n\nfunction priorityForActionability(actionability: RevisionActionability): number {\n switch (actionability) {\n case \"actionable\":\n return 0;\n case \"preserve-only\":\n return 1;\n }\n}\n","import { createEmptyMapping, type TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport { parseTextStory } from \"../../core/schema/text-schema.ts\";\nimport { createSelectionSnapshot, type CanonicalDocumentEnvelope } from \"../../core/state/editor-state.ts\";\nimport { applyTextTransaction } from \"../../core/state/text-transaction.ts\";\nimport {\n remapRevisionStore,\n setRevisionStatus,\n type RevisionStore,\n} from \"./revision-store.ts\";\nimport { getRevisionActionability, type RevisionRecord } from \"./revision-types.ts\";\n\nexport type RevisionActionIntent = \"accept\" | \"reject\";\n\nexport type RevisionActionSkipReason =\n | \"missing\"\n | \"already-resolved\"\n | \"detached-anchor\"\n | \"preserve-only\"\n | \"structural-range\"\n | \"protected-range\"\n | \"invalid-range\";\n\nexport interface ApplyRevisionActionOptions {\n document: CanonicalDocumentEnvelope;\n store: RevisionStore;\n revisionId: string;\n intent: RevisionActionIntent;\n timestamp: string;\n}\n\nexport interface AppliedRevisionAction {\n kind: \"applied\";\n revisionId: string;\n intent: RevisionActionIntent;\n resultingStatus: \"accepted\" | \"rejected\";\n contentChanged: boolean;\n}\n\nexport interface SkippedRevisionAction {\n kind: \"skipped\";\n revisionId: string;\n intent: RevisionActionIntent;\n reason: RevisionActionSkipReason;\n detail: string;\n}\n\nexport type RevisionActionOutcome =\n | AppliedRevisionAction\n | SkippedRevisionAction;\n\nexport interface ApplyRevisionActionResult {\n document: CanonicalDocumentEnvelope;\n store: RevisionStore;\n mapping: TransactionMapping;\n outcome: RevisionActionOutcome;\n detachedRevisionIds: string[];\n}\n\nexport function applyRevisionAction(\n options: ApplyRevisionActionOptions,\n): ApplyRevisionActionResult {\n const revision = options.store.revisions[options.revisionId];\n\n if (!revision) {\n return skippedResult(options, \"missing\", \"Revision record was not found.\");\n }\n\n if (revision.status !== \"active\") {\n return skippedResult(\n options,\n \"already-resolved\",\n `Revision is already ${revision.status}.`,\n );\n }\n\n if (revision.anchor.kind === \"detached\") {\n return skippedResult(\n options,\n \"detached-anchor\",\n \"Detached revisions remain visible but cannot be accepted or rejected.\",\n );\n }\n\n if (getRevisionActionability(revision) !== \"actionable\") {\n return skippedResult(\n options,\n \"preserve-only\",\n revision.metadata.preserveOnlyReason ??\n \"This revision kind remains preserve-only in the current runtime.\",\n );\n }\n\n if (revision.anchor.kind !== \"range\") {\n return skippedResult(\n options,\n \"structural-range\",\n \"Non-range revisions remain preserve-only in the current runtime.\",\n );\n }\n\n const story = parseTextStory(options.document.content);\n const range = normalizeRange(\n revision.anchor.range.from,\n revision.anchor.range.to,\n );\n\n if (range.to > story.size) {\n return skippedResult(\n options,\n \"invalid-range\",\n `Revision range ${range.from}-${range.to} exceeds story size ${story.size}.`,\n );\n }\n\n const paragraphMarkRange = resolveParagraphMarkDeletionRange(story, revision, options.intent);\n if (paragraphMarkRange) {\n const resultingStatus = toResultingStatus(options.intent);\n const textResult = applyTextTransaction(\n options.document,\n createSelectionSnapshot(paragraphMarkRange.from, paragraphMarkRange.to),\n {\n type: \"replace\",\n range: paragraphMarkRange,\n insertion: [],\n },\n {\n timestamp: options.timestamp,\n },\n );\n\n const nextStore = remapRevisionStore(\n setRevisionStatus(options.store, revision.revisionId, resultingStatus),\n textResult.mapping,\n );\n\n return {\n document: textResult.document,\n store: nextStore,\n mapping: textResult.mapping,\n outcome: {\n kind: \"applied\",\n revisionId: revision.revisionId,\n intent: options.intent,\n resultingStatus,\n contentChanged: true,\n },\n detachedRevisionIds: findNewDetachedRevisionIds(options.store, nextStore),\n };\n }\n if (requiresParagraphBoundaryDeletion(revision, options.intent)) {\n return skippedResult(\n options,\n \"structural-range\",\n \"Paragraph-boundary revisions need a stable paragraph break and remain blocked for this shape.\",\n );\n }\n\n const slice = story.units.slice(range.from, range.to);\n if (\n slice.some(\n (unit) =>\n unit.kind === \"paragraph_break\" || unit.kind === \"opaque_block\",\n )\n ) {\n return skippedResult(\n options,\n \"structural-range\",\n \"Paragraph-boundary and structural revisions remain preserve-only.\",\n );\n }\n\n if (\n slice.some(\n (unit) =>\n unit.kind === \"image\" || unit.kind === \"opaque_inline\",\n )\n ) {\n return skippedResult(\n options,\n \"protected-range\",\n \"Revisions touching protected inline content remain preserve-only.\",\n );\n }\n\n const resultingStatus = toResultingStatus(options.intent);\n const contentChanged = requiresContentDeletion(revision, options.intent);\n\n if (!contentChanged) {\n return {\n document: options.document,\n store: setRevisionStatus(options.store, revision.revisionId, resultingStatus),\n mapping: createEmptyMapping(),\n outcome: {\n kind: \"applied\",\n revisionId: revision.revisionId,\n intent: options.intent,\n resultingStatus,\n contentChanged: false,\n },\n detachedRevisionIds: [],\n };\n }\n\n const textResult = applyTextTransaction(\n options.document,\n createSelectionSnapshot(range.from, range.to),\n {\n type: \"replace\",\n range,\n insertion: [],\n },\n {\n timestamp: options.timestamp,\n },\n );\n\n const nextStore = remapRevisionStore(\n setRevisionStatus(options.store, revision.revisionId, resultingStatus),\n textResult.mapping,\n );\n\n return {\n document: textResult.document,\n store: nextStore,\n mapping: textResult.mapping,\n outcome: {\n kind: \"applied\",\n revisionId: revision.revisionId,\n intent: options.intent,\n resultingStatus,\n contentChanged: true,\n },\n detachedRevisionIds: findNewDetachedRevisionIds(options.store, nextStore),\n };\n}\n\nfunction skippedResult(\n options: ApplyRevisionActionOptions,\n reason: RevisionActionSkipReason,\n detail: string,\n): ApplyRevisionActionResult {\n return {\n document: options.document,\n store: options.store,\n mapping: createEmptyMapping(),\n outcome: {\n kind: \"skipped\",\n revisionId: options.revisionId,\n intent: options.intent,\n reason,\n detail,\n },\n detachedRevisionIds: [],\n };\n}\n\nfunction toResultingStatus(\n intent: RevisionActionIntent,\n): \"accepted\" | \"rejected\" {\n return intent === \"accept\" ? \"accepted\" : \"rejected\";\n}\n\nfunction requiresContentDeletion(\n revision: Pick<RevisionRecord, \"kind\">,\n intent: RevisionActionIntent,\n): boolean {\n return (\n (revision.kind === \"insertion\" && intent === \"reject\") ||\n (revision.kind === \"deletion\" && intent === \"accept\")\n );\n}\n\nfunction requiresParagraphBoundaryDeletion(\n revision: RevisionRecord,\n intent: RevisionActionIntent,\n): boolean {\n return (\n (revision.metadata.originalRevisionType === \"paragraph-del\" && intent === \"accept\") ||\n (revision.metadata.originalRevisionType === \"paragraph-ins\" && intent === \"reject\")\n );\n}\n\nfunction resolveParagraphMarkDeletionRange(\n story: ReturnType<typeof parseTextStory>,\n revision: RevisionRecord,\n intent: RevisionActionIntent,\n): { from: number; to: number } | undefined {\n const originalRevisionType = revision.metadata.originalRevisionType;\n if (\n revision.anchor.kind !== \"range\" ||\n (originalRevisionType !== \"paragraph-del\" && originalRevisionType !== \"paragraph-ins\")\n ) {\n return undefined;\n }\n\n const shouldDeleteBoundary =\n (originalRevisionType === \"paragraph-del\" && intent === \"accept\") ||\n (originalRevisionType === \"paragraph-ins\" && intent === \"reject\");\n if (!shouldDeleteBoundary) {\n return undefined;\n }\n\n const paragraphs = mapParagraphRanges(story);\n const anchorPosition = normalizeRange(\n revision.anchor.range.from,\n revision.anchor.range.to,\n ).from;\n const paragraph = paragraphs.find(\n (candidate) =>\n candidate.end === anchorPosition ||\n (anchorPosition >= candidate.start && anchorPosition <= candidate.end),\n );\n if (!paragraph) {\n return undefined;\n }\n\n if (originalRevisionType === \"paragraph-del\") {\n const boundaryIndex = paragraph.end;\n if (story.units[boundaryIndex]?.kind !== \"paragraph_break\") {\n return undefined;\n }\n\n return {\n from: boundaryIndex,\n to: boundaryIndex + 1,\n };\n }\n\n const boundaryIndex = paragraph.start - 1;\n if (boundaryIndex < 0 || story.units[boundaryIndex]?.kind !== \"paragraph_break\") {\n return undefined;\n }\n\n return {\n from: boundaryIndex,\n to: boundaryIndex + 1,\n };\n}\n\nfunction mapParagraphRanges(\n story: ReturnType<typeof parseTextStory>,\n): Array<{ start: number; end: number }> {\n const paragraphs: Array<{ start: number; end: number }> = [];\n let start = 0;\n let hasPendingParagraph = true;\n\n for (let index = 0; index < story.units.length; index += 1) {\n const unit = story.units[index];\n if (unit.kind === \"paragraph_break\") {\n paragraphs.push({ start, end: index });\n start = index + 1;\n hasPendingParagraph = true;\n continue;\n }\n\n if (unit.kind === \"opaque_block\") {\n if (hasPendingParagraph) {\n paragraphs.push({ start, end: index });\n }\n start = index + 1;\n hasPendingParagraph = Boolean(unit.nextParagraph);\n }\n }\n\n if (hasPendingParagraph) {\n paragraphs.push({ start, end: story.units.length });\n }\n return paragraphs;\n}\n\nfunction normalizeRange(from: number, to: number): { from: number; to: number } {\n return {\n from: Math.min(from, to),\n to: Math.max(from, to),\n };\n}\n\nfunction findNewDetachedRevisionIds(\n previousStore: RevisionStore,\n nextStore: RevisionStore,\n): string[] {\n const detachedRevisionIds: string[] = [];\n\n for (const [revisionId, revision] of Object.entries(nextStore.revisions)) {\n if (\n revision.status === \"detached\" &&\n previousStore.revisions[revisionId]?.status !== \"detached\"\n ) {\n detachedRevisionIds.push(revisionId);\n }\n }\n\n return detachedRevisionIds;\n}\n","import type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\nimport {\n getReviewCommandIntent,\n isSingleRevisionReviewCommand,\n type ReviewCommand,\n} from \"../core/commands/review-commands.ts\";\nimport type { TransactionMapping } from \"../core/selection/mapping.ts\";\nimport {\n applyRevisionAction,\n type RevisionActionOutcome,\n} from \"../review/store/revision-actions.ts\";\nimport { type RevisionStore } from \"../review/store/revision-store.ts\";\n\nexport interface RevisionRuntimeState {\n document: CanonicalDocumentEnvelope;\n store: RevisionStore;\n}\n\nexport interface ApplyRevisionRuntimeCommandOptions {\n state: RevisionRuntimeState;\n command: ReviewCommand;\n timestamp: string;\n}\n\nexport interface RevisionRuntimeCommandEffects {\n appliedRevisionIds: string[];\n skippedRevisions: RevisionActionOutcome[];\n detachedRevisionIds: string[];\n}\n\nexport interface RevisionRuntimeCommandResult extends RevisionRuntimeState {\n outcomes: RevisionActionOutcome[];\n mappings: Array<{ revisionId: string; mapping: TransactionMapping; steps: number }>;\n effects: RevisionRuntimeCommandEffects;\n}\n\nexport function applyRevisionRuntimeCommand(\n options: ApplyRevisionRuntimeCommandOptions,\n): RevisionRuntimeCommandResult {\n const revisionIds = isSingleRevisionReviewCommand(options.command)\n ? [options.command.revisionId]\n : listBatchRevisionIds(options.state.store);\n\n const outcomes: RevisionActionOutcome[] = [];\n const mappings: Array<{ revisionId: string; mapping: TransactionMapping; steps: number }> = [];\n const appliedRevisionIds: string[] = [];\n const detachedRevisionIds = new Set<string>();\n\n let state = options.state;\n\n for (const revisionId of revisionIds) {\n const result = applyRevisionAction({\n document: state.document,\n store: state.store,\n revisionId,\n intent: getReviewCommandIntent(options.command),\n timestamp: options.timestamp,\n });\n\n state = {\n document: result.document,\n store: result.store,\n };\n outcomes.push(result.outcome);\n mappings.push({\n revisionId,\n mapping: result.mapping,\n steps: result.mapping.steps.length,\n });\n\n if (result.outcome.kind === \"applied\") {\n appliedRevisionIds.push(revisionId);\n }\n\n for (const detachedRevisionId of result.detachedRevisionIds) {\n detachedRevisionIds.add(detachedRevisionId);\n }\n }\n\n return {\n ...state,\n outcomes,\n mappings,\n effects: {\n appliedRevisionIds,\n skippedRevisions: outcomes.filter(\n (outcome): outcome is Extract<RevisionActionOutcome, { kind: \"skipped\" }> =>\n outcome.kind === \"skipped\",\n ),\n detachedRevisionIds: [...detachedRevisionIds],\n },\n };\n}\n\nfunction listBatchRevisionIds(store: RevisionStore): string[] {\n return Object.values(store.revisions)\n .filter((revision) => revision.status === \"active\")\n .sort((left, right) => {\n const createdAtDelta = left.createdAt.localeCompare(right.createdAt);\n if (createdAtDelta !== 0) {\n return createdAtDelta;\n }\n\n return left.revisionId.localeCompare(right.revisionId);\n })\n .map((revision) => revision.revisionId);\n}\n","import {\n createSelectionSnapshot,\n type CanonicalDocumentEnvelope,\n type CommentThreadRecord,\n type EditorState,\n type EditorWarning,\n normalizeCommentThreadRecord,\n type SelectionSnapshot,\n} from \"../state/editor-state.ts\";\nimport {\n areAnchorsEqual,\n createDetachedAnchor,\n createEmptyMapping,\n createNodeAnchor,\n createRangeAnchor,\n DEFAULT_BOUNDARY_ASSOC,\n mapAnchor,\n type BoundaryAssoc,\n type EditorAnchorProjection,\n type MappingStep,\n type TransactionMapping,\n} from \"../selection/mapping.ts\";\nimport {\n createAcceptRevisionCommand,\n createRejectRevisionCommand,\n type ReviewCommand,\n} from \"./review-commands.ts\";\nimport {\n deleteSelectionOrBackward,\n deleteSelectionOrForward,\n insertHardBreak,\n insertTab,\n insertText,\n splitParagraph,\n} from \"./text-commands.ts\";\nimport type { RevisionRecord as CanonicalRevisionRecord } from \"../../model/canonical-document.ts\";\nimport { remapCommentThreads } from \"../../review/store/comment-remapping.ts\";\nimport { applyRevisionRuntimeCommand } from \"../../runtime/revision-runtime.ts\";\nimport type { RevisionStore } from \"../../review/store/revision-store.ts\";\n\nexport interface CommandOrigin {\n source:\n | \"keyboard\"\n | \"toolbar\"\n | \"context_menu\"\n | \"comment_panel\"\n | \"review_panel\"\n | \"api\"\n | \"runtime\";\n timestamp: string;\n}\n\nexport type EditorCommand =\n | {\n type: \"selection.set\";\n selection: SelectionSnapshot;\n origin?: CommandOrigin;\n }\n | {\n type: \"document.replace\";\n document: CanonicalDocumentEnvelope;\n mapping?: TransactionMapping;\n selection?: SelectionSnapshot;\n protectionSelection?: SelectionSnapshot;\n origin?: CommandOrigin;\n }\n | {\n type: \"text.insert\";\n text: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"text.delete-backward\";\n origin?: CommandOrigin;\n }\n | {\n type: \"text.delete-forward\";\n origin?: CommandOrigin;\n }\n | {\n type: \"text.insert-tab\";\n origin?: CommandOrigin;\n }\n | {\n type: \"text.insert-hard-break\";\n origin?: CommandOrigin;\n }\n | {\n type: \"paragraph.split\";\n origin?: CommandOrigin;\n }\n | {\n type: \"runtime.set-read-only\";\n readOnly: boolean;\n origin?: CommandOrigin;\n }\n | {\n type: \"runtime.focus\";\n focused: boolean;\n origin?: CommandOrigin;\n }\n | {\n type: \"warning.add\";\n warning: EditorWarning;\n origin?: CommandOrigin;\n }\n | {\n type: \"warning.clear\";\n warningId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.add\";\n comment: CommentThreadRecord;\n selection?: SelectionSnapshot;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.open\";\n commentId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.resolve\";\n commentId: string;\n resolvedBy?: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.reopen\";\n commentId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.add-reply\";\n commentId: string;\n body: string;\n authorId?: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"comment.edit-body\";\n commentId: string;\n body: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"change.accept\";\n changeId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"change.reject\";\n changeId: string;\n origin?: CommandOrigin;\n }\n | {\n type: \"change.accept-all\";\n origin?: CommandOrigin;\n }\n | {\n type: \"change.reject-all\";\n origin?: CommandOrigin;\n }\n | {\n type: \"history.undo\";\n origin?: CommandOrigin;\n }\n | {\n type: \"history.redo\";\n origin?: CommandOrigin;\n };\n\nexport interface TransactionEffects {\n warningsAdded: EditorWarning[];\n warningsCleared: Array<{ warningId: string; code: EditorWarning[\"code\"] }>;\n commentAdded?: { commentId: string; anchor: EditorAnchorProjection };\n commentResolved?: { commentId: string };\n commentReopened?: { commentId: string };\n commentReplyAdded?: { commentId: string };\n commentBodyEdited?: { commentId: string };\n changeAccepted?: { changeId: string };\n changeRejected?: { changeId: string };\n revisionAuthored?: { changeId: string; kind: \"insertion\" | \"deletion\" };\n commandBlocked?: { code: string; message: string };\n}\n\nexport interface EditorTransaction {\n nextState: EditorState;\n mapping: TransactionMapping;\n effects: TransactionEffects;\n historyBoundary: \"push\" | \"skip\";\n markDirty: boolean;\n}\n\nexport interface CommandExecutionContext {\n timestamp: string;\n documentMode?: \"editing\" | \"suggesting\" | \"viewing\";\n defaultAuthorId?: string;\n}\n\nexport function executeEditorCommand(\n state: EditorState,\n command: Exclude<EditorCommand, { type: \"history.undo\" } | { type: \"history.redo\" }>,\n context: CommandExecutionContext,\n): EditorTransaction {\n switch (command.type) {\n case \"selection.set\":\n return createTransaction(\n {\n ...state,\n selection: normalizeSelection(command.selection),\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"document.replace\": {\n const mapping = command.mapping ?? createEmptyMapping();\n const selection =\n command.selection ?? remapSelection(state.selection, mapping);\n const reviewState = remapReviewStateAfterContentChange(\n state,\n command.document,\n mapping,\n );\n\n return createTransaction(\n {\n ...state,\n document: reviewState.document,\n selection,\n warnings: reviewState.warnings,\n runtime: {\n ...state.runtime,\n activeCommentId: reviewState.activeCommentId,\n },\n compatibility: {\n ...state.compatibility,\n generatedAt: context.timestamp,\n warnings: reviewState.warnings,\n featureEntries: state.compatibility.featureEntries.map((entry) =>\n entry.affectedAnchor\n ? {\n ...entry,\n affectedAnchor: mapAnchor(entry.affectedAnchor, mapping),\n }\n : entry,\n ),\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping,\n effects: reviewState.effects,\n },\n );\n }\n case \"text.insert\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingInsert(state, command.text, context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertText(document, selection, command.text, context),\n );\n }\n case \"text.delete-backward\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingDelete(state, \"backward\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n deleteSelectionOrBackward(document, selection, context),\n );\n }\n case \"text.delete-forward\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingDelete(state, \"forward\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n deleteSelectionOrForward(document, selection, context),\n );\n }\n case \"text.insert-tab\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingInsertUnit(state, \"tab\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertTab(document, selection, context),\n );\n }\n case \"text.insert-hard-break\": {\n const suggestingResult = context.documentMode === \"suggesting\"\n ? applySuggestingInsertUnit(state, \"hard_break\", context)\n : undefined;\n if (suggestingResult) return suggestingResult;\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n insertHardBreak(document, selection, context),\n );\n }\n case \"paragraph.split\":\n if (context.documentMode === \"suggesting\") {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n commandBlocked: {\n code: \"suggesting_unsupported\",\n message: \"Paragraph splits are not supported in suggesting mode.\",\n },\n },\n });\n }\n return applyTextCommand(state, context.timestamp, (document, selection) =>\n splitParagraph(document, selection, context),\n );\n case \"runtime.set-read-only\":\n return createTransaction(\n {\n ...state,\n readOnly: command.readOnly,\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"runtime.focus\":\n return createTransaction(\n {\n ...state,\n runtime: {\n ...state.runtime,\n hasFocus: command.focused,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"warning.add\": {\n if (state.warnings.some((warning) => warning.warningId === command.warning.warningId)) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const warnings = [...state.warnings, command.warning];\n return createTransaction(\n {\n ...state,\n warnings,\n compatibility: {\n ...state.compatibility,\n generatedAt: context.timestamp,\n warnings,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n warningsAdded: [command.warning],\n },\n },\n );\n }\n case \"warning.clear\": {\n const existing = state.warnings.find((warning) => warning.warningId === command.warningId);\n\n if (!existing) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const warnings = state.warnings.filter((warning) => warning.warningId !== command.warningId);\n return createTransaction(\n {\n ...state,\n warnings,\n compatibility: {\n ...state.compatibility,\n generatedAt: context.timestamp,\n warnings,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n warningsCleared: [\n {\n warningId: existing.warningId,\n code: existing.code,\n },\n ],\n },\n },\n );\n }\n case \"comment.add\": {\n const comments = {\n ...state.document.review.comments,\n [command.comment.commentId]: normalizeCommentThreadRecord(command.comment),\n };\n\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n comments,\n },\n },\n runtime: {\n ...state.runtime,\n activeCommentId: command.comment.commentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n commentAdded: {\n commentId: command.comment.commentId,\n anchor: command.comment.anchor,\n },\n },\n },\n );\n }\n case \"comment.open\":\n return createTransaction(\n {\n ...state,\n runtime: {\n ...state.runtime,\n activeCommentId: command.commentId,\n },\n },\n {\n historyBoundary: \"skip\",\n markDirty: false,\n },\n );\n case \"comment.resolve\": {\n const existing = state.document.review.comments[command.commentId];\n if (!existing) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const comments = {\n ...state.document.review.comments,\n [command.commentId]: {\n ...existing,\n status: (existing.anchor.kind === \"detached\" ? \"detached\" : \"resolved\") as \"detached\" | \"resolved\",\n resolution: {\n resolvedAt: context.timestamp,\n resolvedBy:\n command.resolvedBy ??\n existing.createdBy ??\n existing.authorId ??\n existing.entries?.[0]?.authorId ??\n \"unknown\",\n },\n isResolved: true,\n resolvedAt: context.timestamp,\n },\n };\n\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n comments,\n },\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n commentResolved: {\n commentId: command.commentId,\n },\n },\n },\n );\n }\n case \"comment.reopen\": {\n const existingThread = state.document.review.comments[command.commentId];\n if (!existingThread || existingThread.status === \"detached\") {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n const reopenedComments = {\n ...state.document.review.comments,\n [command.commentId]: {\n ...existingThread,\n status: \"open\" as const,\n isResolved: false,\n resolvedAt: undefined,\n resolution: undefined,\n },\n };\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: { ...state.document.review, comments: reopenedComments },\n },\n runtime: { ...state.runtime, activeCommentId: command.commentId },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: { commentReopened: { commentId: command.commentId } },\n },\n );\n }\n case \"comment.add-reply\": {\n const threadForReply = state.document.review.comments[command.commentId];\n if (!threadForReply) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n // Block reply on resolved or detached threads (must reopen first)\n if (threadForReply.status === \"resolved\" || threadForReply.status === \"detached\") {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n const entryId = `${command.commentId}-entry-${(threadForReply.entries?.length ?? 0) + 1}`;\n const newEntry = {\n entryId,\n authorId: command.authorId ?? threadForReply.createdBy ?? \"unknown\",\n body: command.body,\n createdAt: context.timestamp,\n };\n const updatedThread = {\n ...threadForReply,\n entries: [...(threadForReply.entries ?? []), newEntry],\n };\n const replyComments = {\n ...state.document.review.comments,\n [command.commentId]: updatedThread,\n };\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: { ...state.document.review, comments: replyComments },\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: { commentReplyAdded: { commentId: command.commentId } },\n },\n );\n }\n case \"comment.edit-body\": {\n const threadToEdit = state.document.review.comments[command.commentId];\n if (!threadToEdit || !threadToEdit.entries?.length) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n const editedEntries = [...threadToEdit.entries];\n editedEntries[0] = { ...editedEntries[0], body: command.body };\n const editedThread = {\n ...threadToEdit,\n body: command.body,\n entries: editedEntries,\n };\n const editedComments = {\n ...state.document.review.comments,\n [command.commentId]: editedThread,\n };\n return createTransaction(\n {\n ...state,\n document: {\n ...state.document,\n updatedAt: context.timestamp,\n review: { ...state.document.review, comments: editedComments },\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: { commentBodyEdited: { commentId: command.commentId } },\n },\n );\n }\n case \"change.accept\":\n return applyReviewCommand(\n state,\n createAcceptRevisionCommand(command.changeId, command.origin),\n context.timestamp,\n );\n case \"change.reject\":\n return applyReviewCommand(\n state,\n createRejectRevisionCommand(command.changeId, command.origin),\n context.timestamp,\n );\n case \"change.accept-all\":\n return applyReviewCommand(\n state,\n {\n type: \"review.accept-all-revisions\",\n ...(command.origin ? { origin: command.origin } : {}),\n },\n context.timestamp,\n );\n case \"change.reject-all\":\n return applyReviewCommand(\n state,\n {\n type: \"review.reject-all-revisions\",\n ...(command.origin ? { origin: command.origin } : {}),\n },\n context.timestamp,\n );\n }\n}\n\nexport function remapSelection(\n selection: SelectionSnapshot,\n mapping: TransactionMapping,\n): SelectionSnapshot {\n const activeRange = mapAnchor(selection.activeRange, mapping);\n\n if (activeRange.kind === \"range\") {\n return {\n anchor: activeRange.range.from,\n head: activeRange.range.to,\n isCollapsed: activeRange.range.from === activeRange.range.to,\n activeRange,\n };\n }\n\n if (activeRange.kind === \"node\") {\n return {\n anchor: activeRange.at,\n head: activeRange.at,\n isCollapsed: true,\n activeRange,\n };\n }\n\n return {\n anchor: selection.anchor,\n head: selection.head,\n isCollapsed: selection.anchor === selection.head,\n activeRange,\n };\n}\n\nexport function selectionChanged(\n left: SelectionSnapshot,\n right: SelectionSnapshot,\n): boolean {\n return (\n left.anchor !== right.anchor ||\n left.head !== right.head ||\n left.isCollapsed !== right.isCollapsed ||\n !areAnchorsEqual(left.activeRange, right.activeRange)\n );\n}\n\nfunction createTransaction(\n nextState: EditorState,\n options: {\n mapping?: TransactionMapping;\n historyBoundary: \"push\" | \"skip\";\n markDirty: boolean;\n effects?: Partial<TransactionEffects>;\n },\n): EditorTransaction {\n return {\n nextState,\n mapping: options.mapping ?? createEmptyMapping(),\n historyBoundary: options.historyBoundary,\n markDirty: options.markDirty,\n effects: {\n warningsAdded: options.effects?.warningsAdded ?? [],\n warningsCleared: options.effects?.warningsCleared ?? [],\n commentAdded: options.effects?.commentAdded,\n commentResolved: options.effects?.commentResolved,\n changeAccepted: options.effects?.changeAccepted,\n changeRejected: options.effects?.changeRejected,\n revisionAuthored: options.effects?.revisionAuthored,\n commandBlocked: options.effects?.commandBlocked,\n },\n };\n}\n\nfunction normalizeSelection(selection: SelectionSnapshot): SelectionSnapshot {\n const activeRange = normalizeSelectionAnchor(\n selection.activeRange,\n selection.anchor,\n selection.head,\n );\n\n if (activeRange.kind === \"range\") {\n return {\n anchor: activeRange.range.from,\n head: activeRange.range.to,\n isCollapsed: activeRange.range.from === activeRange.range.to,\n activeRange,\n };\n }\n\n if (activeRange.kind === \"node\") {\n return {\n anchor: activeRange.at,\n head: activeRange.at,\n isCollapsed: true,\n activeRange,\n };\n }\n\n return {\n anchor: activeRange.lastKnownRange.from,\n head: activeRange.lastKnownRange.to,\n isCollapsed: activeRange.lastKnownRange.from === activeRange.lastKnownRange.to,\n activeRange,\n };\n}\n\nfunction normalizeSelectionAnchor(\n value: SelectionSnapshot[\"activeRange\"],\n anchor: number,\n head: number,\n): EditorAnchorProjection {\n if (!value || typeof value !== \"object\") {\n return createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC);\n }\n\n const record = value as unknown as Record<string, unknown>;\n switch (record.kind) {\n case \"range\": {\n const assoc = normalizeBoundaryAssoc(record.assoc);\n const internalRange = record.range;\n if (\n internalRange &&\n typeof internalRange === \"object\" &&\n typeof (internalRange as { from?: unknown }).from === \"number\" &&\n typeof (internalRange as { to?: unknown }).to === \"number\"\n ) {\n return createRangeAnchor(\n (internalRange as { from: number }).from,\n (internalRange as { to: number }).to,\n assoc,\n );\n }\n\n if (typeof record.from === \"number\" && typeof record.to === \"number\") {\n return createRangeAnchor(record.from, record.to, assoc);\n }\n\n return createRangeAnchor(anchor, head, assoc);\n }\n case \"node\":\n return createNodeAnchor(\n typeof record.at === \"number\" ? record.at : anchor,\n normalizeAssoc(record.assoc),\n );\n case \"detached\": {\n const lastKnownRange = record.lastKnownRange;\n if (\n lastKnownRange &&\n typeof lastKnownRange === \"object\" &&\n typeof (lastKnownRange as { from?: unknown }).from === \"number\" &&\n typeof (lastKnownRange as { to?: unknown }).to === \"number\"\n ) {\n return createDetachedAnchor(\n {\n from: (lastKnownRange as { from: number }).from,\n to: (lastKnownRange as { to: number }).to,\n },\n normalizeDetachedReason(record.reason),\n );\n }\n\n return createDetachedAnchor({ from: anchor, to: head }, normalizeDetachedReason(record.reason));\n }\n default:\n return createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC);\n }\n}\n\nfunction normalizeBoundaryAssoc(value: unknown): BoundaryAssoc {\n if (value && typeof value === \"object\") {\n const record = value as unknown as Record<string, unknown>;\n return {\n start: normalizeAssoc(record.start),\n end: normalizeAssoc(record.end),\n };\n }\n\n return DEFAULT_BOUNDARY_ASSOC;\n}\n\nfunction normalizeAssoc(value: unknown): -1 | 1 {\n return value === -1 ? -1 : 1;\n}\n\nfunction normalizeDetachedReason(\n value: unknown,\n): \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\" {\n if (\n value === \"deleted\" ||\n value === \"invalidatedByStructureChange\" ||\n value === \"importAmbiguity\"\n ) {\n return value;\n }\n\n return \"importAmbiguity\";\n}\n\nfunction applyTextCommand(\n state: EditorState,\n timestamp: string,\n apply: (\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n ) => {\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n mapping: TransactionMapping;\n },\n): EditorTransaction {\n if (state.readOnly) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const result = apply(state.document, state.selection);\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n return createTransaction(\n {\n ...state,\n document: reviewState.document,\n selection: result.selection,\n warnings: reviewState.warnings,\n runtime: {\n ...state.runtime,\n activeCommentId: reviewState.activeCommentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping: result.mapping,\n effects: reviewState.effects,\n },\n );\n}\n\nfunction applyReviewCommand(\n state: EditorState,\n command: ReviewCommand,\n timestamp: string,\n): EditorTransaction {\n if (state.readOnly) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n const result = applyRevisionRuntimeCommand({\n state: {\n document: state.document,\n store: createRevisionStoreFromState(state),\n },\n command,\n timestamp,\n });\n const hasAppliedOutcome = result.outcomes.some((outcome) => outcome.kind === \"applied\");\n\n if (!hasAppliedOutcome) {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n });\n }\n\n let selection = state.selection;\n let comments = result.document.review.comments;\n let warnings = state.warnings;\n let activeCommentId = state.runtime.activeCommentId;\n const mappingSteps: MappingStep[] = [];\n\n for (const entry of result.mappings) {\n if (entry.steps === 0) {\n continue;\n }\n\n selection = remapSelection(selection, entry.mapping);\n mappingSteps.push(...entry.mapping.steps);\n\n const remappedComments = remapCommentThreads({\n comments,\n mapping: entry.mapping,\n nextContent: result.document.content,\n existingWarnings: mapWarningsThroughMapping(warnings, entry.mapping),\n });\n comments = remappedComments.comments;\n warnings = remappedComments.warnings;\n activeCommentId =\n activeCommentId && comments[activeCommentId]\n ? activeCommentId\n : undefined;\n }\n\n warnings = mergeDetachedRevisionWarnings(result.store, warnings);\n\n const nextDocument = {\n ...result.document,\n review: {\n ...result.document.review,\n comments,\n revisions: toEditorRevisionRecords(result.store),\n },\n };\n const appliedRevisionIds = result.effects.appliedRevisionIds;\n\n return createTransaction(\n {\n ...state,\n document: nextDocument,\n selection,\n warnings,\n runtime: {\n ...state.runtime,\n activeCommentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping: combineMappingSteps(mappingSteps),\n effects: {\n ...buildWarningEffects(state.warnings, warnings),\n changeAccepted:\n command.type === \"review.accept-revision\" && appliedRevisionIds[0]\n ? {\n changeId: appliedRevisionIds[0],\n }\n : undefined,\n changeRejected:\n command.type === \"review.reject-revision\" && appliedRevisionIds[0]\n ? {\n changeId: appliedRevisionIds[0],\n }\n : undefined,\n },\n },\n );\n}\n\nfunction remapReviewStateAfterContentChange(\n state: EditorState,\n nextDocument: CanonicalDocumentEnvelope,\n mapping: TransactionMapping,\n): {\n document: CanonicalDocumentEnvelope;\n warnings: EditorWarning[];\n activeCommentId?: string;\n effects: Pick<TransactionEffects, \"warningsAdded\" | \"warningsCleared\">;\n} {\n const mappedWarnings = mapWarningsThroughMapping(state.warnings, mapping);\n const remappedComments = remapCommentThreads({\n comments: nextDocument.review.comments,\n mapping,\n nextContent: nextDocument.content,\n existingWarnings: mappedWarnings,\n });\n const revisions = Object.fromEntries(\n Object.entries(nextDocument.review.revisions).map(([changeId, revision]) => [\n changeId,\n {\n ...revision,\n anchor: mapAnchor(revision.anchor, mapping),\n },\n ]),\n );\n const activeCommentId =\n state.runtime.activeCommentId &&\n remappedComments.comments[state.runtime.activeCommentId]\n ? state.runtime.activeCommentId\n : undefined;\n const warnings = remappedComments.warnings;\n\n return {\n document: {\n ...nextDocument,\n review: {\n ...nextDocument.review,\n comments: remappedComments.comments,\n revisions,\n },\n },\n warnings,\n activeCommentId,\n effects: buildWarningEffects(state.warnings, warnings),\n };\n}\n\nfunction createRevisionStoreFromState(\n state: Pick<EditorState, \"document\">,\n): RevisionStore {\n return {\n version: \"revision-store/1\",\n revisions: Object.fromEntries(\n Object.values(state.document.review.revisions).map((revision) => [\n revision.changeId,\n {\n revisionId: revision.changeId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId ?? \"unknown\",\n createdAt: revision.createdAt,\n status: revision.status === \"open\" ? \"active\" : revision.status,\n warningIds: [...(revision.warningIds ?? [])],\n metadata: {\n source: revision.metadata?.source ?? \"runtime\",\n storyTarget: revision.metadata?.storyTarget,\n preserveOnlyReason: revision.metadata?.preserveOnlyReason,\n importedRevisionForm: revision.metadata?.importedRevisionForm,\n originalRevisionType: revision.metadata?.originalRevisionType,\n ooxmlRevisionId: revision.metadata?.ooxmlRevisionId,\n },\n },\n ]),\n ),\n };\n}\n\nfunction toEditorRevisionRecords(\n store: RevisionStore,\n): EditorState[\"document\"][\"review\"][\"revisions\"] {\n return Object.fromEntries(\n Object.values(store.revisions).map((revision) => [\n revision.revisionId,\n {\n changeId: revision.revisionId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId,\n createdAt: revision.createdAt,\n warningIds: [...revision.warningIds],\n metadata: {\n source: revision.metadata.source,\n storyTarget: revision.metadata.storyTarget,\n preserveOnlyReason: revision.metadata.preserveOnlyReason,\n importedRevisionForm: revision.metadata.importedRevisionForm,\n originalRevisionType: revision.metadata.originalRevisionType,\n ooxmlRevisionId: revision.metadata.ooxmlRevisionId,\n },\n status: revision.status === \"active\" ? \"open\" : revision.status,\n },\n ]),\n );\n}\n\nfunction mapWarningsThroughMapping(\n warnings: EditorWarning[],\n mapping: TransactionMapping,\n): EditorWarning[] {\n return warnings.map((warning) =>\n warning.affectedAnchor\n ? {\n ...warning,\n affectedAnchor: mapAnchor(warning.affectedAnchor, mapping),\n }\n : warning,\n );\n}\n\nfunction buildWarningEffects(\n previousWarnings: EditorWarning[],\n nextWarnings: EditorWarning[],\n): Pick<TransactionEffects, \"warningsAdded\" | \"warningsCleared\"> {\n const previousById = new Set(previousWarnings.map((warning) => warning.warningId));\n const nextById = new Set(nextWarnings.map((warning) => warning.warningId));\n\n return {\n warningsAdded: nextWarnings.filter((warning) => !previousById.has(warning.warningId)),\n warningsCleared: previousWarnings\n .filter((warning) => !nextById.has(warning.warningId))\n .map((warning) => ({\n warningId: warning.warningId,\n code: warning.code,\n })),\n };\n}\n\nfunction mergeDetachedRevisionWarnings(\n store: RevisionStore,\n existingWarnings: EditorWarning[],\n): EditorWarning[] {\n const retainedWarnings = existingWarnings.filter(\n (warning) =>\n warning.code !== \"revision_anchor_detached\" ||\n !warning.details ||\n typeof warning.details.changeId !== \"string\" ||\n store.revisions[warning.details.changeId]?.status === \"detached\",\n );\n\n const knownDetachedIds = new Set(\n retainedWarnings\n .filter((warning) => warning.code === \"revision_anchor_detached\")\n .map((warning) =>\n typeof warning.details?.changeId === \"string\"\n ? warning.details.changeId\n : undefined,\n )\n .filter((value): value is string => Boolean(value)),\n );\n\n const detachedWarnings = Object.values(store.revisions)\n .filter(\n (revision) =>\n revision.status === \"detached\" && !knownDetachedIds.has(revision.revisionId),\n )\n .map((revision) => ({\n warningId: `warning:revision-anchor-detached:${revision.revisionId}`,\n code: \"revision_anchor_detached\" as const,\n severity: \"warning\" as const,\n message: `Revision ${revision.revisionId} detached after review remapping.`,\n source: \"review\" as const,\n affectedAnchor: revision.anchor.kind === \"detached\" ? revision.anchor : undefined,\n details: {\n changeId: revision.revisionId,\n reason:\n revision.anchor.kind === \"detached\"\n ? revision.anchor.reason\n : undefined,\n },\n }));\n\n return [...retainedWarnings, ...detachedWarnings];\n}\n\nfunction combineMappingSteps(\n steps: MappingStep[],\n): TransactionMapping {\n return steps.length > 0\n ? {\n steps,\n }\n : createEmptyMapping();\n}\n\n// ---------------------------------------------------------------------------\n// Suggesting mode: creates revision records instead of (or alongside) text mutations\n// ---------------------------------------------------------------------------\n\nlet suggestingRevisionCounter = 0;\n\nfunction createSuggestingRevisionId(\n existing: Record<string, unknown>,\n timestamp: string,\n): string {\n suggestingRevisionCounter += 1;\n const ts = timestamp.replace(/[^0-9]/gu, \"\");\n let id = `change-${ts}-s${suggestingRevisionCounter}`;\n while (existing[id]) {\n suggestingRevisionCounter += 1;\n id = `change-${ts}-s${suggestingRevisionCounter}`;\n }\n return id;\n}\n\nfunction createAuthoredRevision(\n existing: Record<string, unknown>,\n kind: \"insertion\" | \"deletion\",\n from: number,\n to: number,\n authorId: string,\n timestamp: string,\n): CanonicalRevisionRecord {\n const changeId = createSuggestingRevisionId(existing, timestamp);\n return {\n changeId,\n kind,\n anchor: {\n kind: \"range\",\n range: { from, to },\n assoc: { start: 1, end: -1 },\n },\n authorId,\n createdAt: timestamp,\n warningIds: [],\n metadata: {\n source: \"runtime\",\n },\n status: \"open\",\n };\n}\n\nfunction createSuggestingUnsupportedTransaction(\n state: EditorState,\n message: string,\n): EditorTransaction {\n return createTransaction(state, {\n historyBoundary: \"skip\",\n markDirty: false,\n effects: {\n commandBlocked: {\n code: \"suggesting_unsupported\",\n message,\n },\n },\n });\n}\n\nfunction isSingleParagraphSuggestingRange(\n document: CanonicalDocumentEnvelope,\n from: number,\n to: number,\n): boolean {\n const ranges: Array<{ start: number; end: number }> = [];\n let cursor = 0;\n let previousWasParagraph = false;\n\n for (const block of document.content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n const start = cursor;\n cursor += block.children.reduce<number>((size, child) => {\n if (child.type === \"text\") {\n return size + child.text.length;\n }\n if (child.type === \"hyperlink\") {\n return size + child.children.reduce<number>((childSize, entry) => {\n if (entry.type === \"text\") {\n return childSize + entry.text.length;\n }\n return childSize + 1;\n }, 0);\n }\n return size + 1;\n }, 0);\n ranges.push({ start, end: cursor });\n previousWasParagraph = true;\n continue;\n }\n\n cursor += 1;\n previousWasParagraph = false;\n }\n\n return ranges.some((range) => from >= range.start && to <= range.end);\n}\n\nfunction applySuggestingInsert(\n state: EditorState,\n text: string,\n context: CommandExecutionContext,\n): EditorTransaction | undefined {\n if (state.readOnly) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n const authorId = context.defaultAuthorId ?? \"unknown\";\n const selection = state.selection;\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n const isCollapsed = from === to;\n\n if (!isCollapsed && !isSingleParagraphSuggestingRange(state.document, from, to)) {\n return createSuggestingUnsupportedTransaction(\n state,\n \"Suggesting mode does not yet support multi-paragraph replacement ranges.\",\n );\n }\n\n if (isCollapsed) {\n // Pure insertion at cursor: apply normally, then create or extend an insertion revision.\n const result = insertText(state.document, selection, text, { timestamp: context.timestamp });\n const insertedFrom = from;\n const insertedTo = from + Array.from(text).length;\n\n // Remap existing review state first (comments, pre-existing revisions)\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n // If there is an authored insertion revision that ends exactly where this\n // text was inserted (i.e. the cursor was at the end of a prior insertion),\n // extend that revision to cover the new text rather than creating a new one.\n // This groups consecutive keystrokes into a single tracked change.\n const adjacentInsertion = findAdjacentAuthoredInsertion(\n reviewState.document.review.revisions,\n insertedFrom,\n );\n\n let finalRevisionId: string;\n let finalRevisions: Record<string, CanonicalRevisionRecord>;\n\n if (adjacentInsertion && adjacentInsertion.anchor.kind === \"range\") {\n const extended: CanonicalRevisionRecord = {\n ...adjacentInsertion,\n anchor: {\n kind: \"range\",\n range: { from: adjacentInsertion.anchor.range.from, to: insertedTo },\n assoc: { start: 1, end: -1 },\n },\n };\n finalRevisionId = extended.changeId;\n finalRevisions = {\n ...reviewState.document.review.revisions,\n [extended.changeId]: extended,\n };\n } else {\n const revision = createAuthoredRevision(\n reviewState.document.review.revisions,\n \"insertion\",\n insertedFrom,\n insertedTo,\n authorId,\n context.timestamp,\n );\n finalRevisionId = revision.changeId;\n finalRevisions = {\n ...reviewState.document.review.revisions,\n [revision.changeId]: revision,\n };\n }\n\n const finalDocument: CanonicalDocumentEnvelope = {\n ...reviewState.document,\n review: {\n ...reviewState.document.review,\n revisions: finalRevisions,\n },\n };\n\n return createTransaction(\n {\n ...state,\n document: finalDocument,\n selection: result.selection,\n warnings: reviewState.warnings,\n runtime: {\n ...state.runtime,\n activeCommentId: reviewState.activeCommentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping: result.mapping,\n effects: {\n ...reviewState.effects,\n revisionAuthored: { changeId: finalRevisionId, kind: \"insertion\" },\n },\n },\n );\n }\n\n // Non-collapsed selection: mark selected text as deletion, insert new text after selection\n // Step 1: Insert new text at the end of the selection\n const insertSelection = createSelectionSnapshot(to, to);\n const result = insertText(state.document, insertSelection, text, { timestamp: context.timestamp });\n const insertedFrom = to;\n const insertedTo = to + Array.from(text).length;\n\n // Step 2: Remap existing review state through the mapping first\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n // Step 3: Create deletion revision for the selected range (text stays in place).\n // Deletion range uses pre-mapping positions since content was not removed.\n const deletionRevision = createAuthoredRevision(\n reviewState.document.review.revisions,\n \"deletion\",\n from,\n to,\n authorId,\n context.timestamp,\n );\n\n // Step 4: Create insertion revision for the new text (positions already correct)\n const insertionRevision = createAuthoredRevision(\n {\n ...reviewState.document.review.revisions,\n [deletionRevision.changeId]: deletionRevision,\n },\n \"insertion\",\n insertedFrom,\n insertedTo,\n authorId,\n context.timestamp,\n );\n\n const finalDocument: CanonicalDocumentEnvelope = {\n ...reviewState.document,\n review: {\n ...reviewState.document.review,\n revisions: {\n ...reviewState.document.review.revisions,\n [deletionRevision.changeId]: deletionRevision,\n [insertionRevision.changeId]: insertionRevision,\n },\n },\n };\n\n // Move cursor to after inserted text\n const caretPos = insertedTo;\n\n return createTransaction(\n {\n ...state,\n document: finalDocument,\n selection: createSelectionSnapshot(caretPos, caretPos),\n warnings: reviewState.warnings,\n runtime: {\n ...state.runtime,\n activeCommentId: reviewState.activeCommentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping: result.mapping,\n effects: {\n ...reviewState.effects,\n revisionAuthored: { changeId: insertionRevision.changeId, kind: \"insertion\" },\n },\n },\n );\n}\n\nfunction applySuggestingDelete(\n state: EditorState,\n direction: \"backward\" | \"forward\",\n context: CommandExecutionContext,\n): EditorTransaction | undefined {\n if (state.readOnly) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n const authorId = context.defaultAuthorId ?? \"unknown\";\n const selection = state.selection;\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n const isCollapsed = from === to;\n\n if (!isCollapsed && !isSingleParagraphSuggestingRange(state.document, from, to)) {\n return createSuggestingUnsupportedTransaction(\n state,\n \"Suggesting mode does not yet support multi-paragraph deletion ranges.\",\n );\n }\n\n let deleteFrom: number;\n let deleteTo: number;\n\n if (isCollapsed) {\n if (direction === \"backward\") {\n deleteFrom = Math.max(0, from - 1);\n deleteTo = from;\n } else {\n deleteFrom = from;\n deleteTo = from + 1;\n }\n } else {\n deleteFrom = from;\n deleteTo = to;\n }\n\n // Validate the deletion range doesn't cross protected content\n if (deleteFrom === deleteTo) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n // Check if the range overlaps an existing deletion revision from this suggesting session\n // If so, extend the existing revision rather than creating a new one\n const existingDeletion = findOverlappingAuthoredDeletion(\n state.document.review.revisions,\n deleteFrom,\n deleteTo,\n );\n\n if (existingDeletion) {\n // Extend the existing deletion revision to cover the new range\n const extendedFrom = Math.min(\n existingDeletion.anchor.kind === \"range\" ? existingDeletion.anchor.range.from : deleteFrom,\n deleteFrom,\n );\n const extendedTo = Math.max(\n existingDeletion.anchor.kind === \"range\" ? existingDeletion.anchor.range.to : deleteTo,\n deleteTo,\n );\n\n const updatedRevision: CanonicalRevisionRecord = {\n ...existingDeletion,\n anchor: {\n kind: \"range\",\n range: { from: extendedFrom, to: extendedTo },\n assoc: { start: 1, end: -1 },\n },\n };\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n revisions: {\n ...state.document.review.revisions,\n [updatedRevision.changeId]: updatedRevision,\n },\n },\n };\n\n const caretPos = direction === \"backward\" ? deleteFrom : deleteTo;\n\n return createTransaction(\n {\n ...state,\n document: nextDocument,\n selection: createSelectionSnapshot(caretPos, caretPos),\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n revisionAuthored: { changeId: updatedRevision.changeId, kind: \"deletion\" },\n },\n },\n );\n }\n\n // Create a new deletion revision — text stays in the document\n const revision = createAuthoredRevision(\n state.document.review.revisions,\n \"deletion\",\n deleteFrom,\n deleteTo,\n authorId,\n context.timestamp,\n );\n\n const nextDocument: CanonicalDocumentEnvelope = {\n ...state.document,\n updatedAt: context.timestamp,\n review: {\n ...state.document.review,\n revisions: {\n ...state.document.review.revisions,\n [revision.changeId]: revision,\n },\n },\n };\n\n const caretPos = direction === \"backward\" ? deleteFrom : deleteTo;\n\n return createTransaction(\n {\n ...state,\n document: nextDocument,\n selection: createSelectionSnapshot(caretPos, caretPos),\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n effects: {\n revisionAuthored: { changeId: revision.changeId, kind: \"deletion\" },\n },\n },\n );\n}\n\nfunction applySuggestingInsertUnit(\n state: EditorState,\n unitType: \"tab\" | \"hard_break\",\n context: CommandExecutionContext,\n): EditorTransaction | undefined {\n if (state.readOnly) {\n return createTransaction(state, { historyBoundary: \"skip\", markDirty: false });\n }\n\n const authorId = context.defaultAuthorId ?? \"unknown\";\n const selection = state.selection;\n const from = Math.min(selection.anchor, selection.head);\n const to = Math.max(selection.anchor, selection.head);\n\n if (from !== to && !isSingleParagraphSuggestingRange(state.document, from, to)) {\n return createSuggestingUnsupportedTransaction(\n state,\n \"Suggesting mode does not yet support multi-paragraph replacement ranges.\",\n );\n }\n\n // Insert the unit at the end of the selection (or at cursor if collapsed)\n const insertPos = to;\n const insertSelection = createSelectionSnapshot(insertPos, insertPos);\n const applyFn = unitType === \"tab\" ? insertTab : insertHardBreak;\n const result = applyFn(state.document, insertSelection, { timestamp: context.timestamp });\n\n // Remap existing review state first, before adding new revisions\n const reviewState = remapReviewStateAfterContentChange(\n state,\n result.document,\n result.mapping,\n );\n\n // If non-collapsed, mark selected range as deletion (positions are pre-mapping, content preserved)\n const deletionRevision = from !== to\n ? createAuthoredRevision(\n reviewState.document.review.revisions,\n \"deletion\",\n from,\n to,\n authorId,\n context.timestamp,\n )\n : undefined;\n\n // Create insertion revision for the single inserted unit (positions already correct)\n const insertionRevision = createAuthoredRevision(\n {\n ...reviewState.document.review.revisions,\n ...(deletionRevision ? { [deletionRevision.changeId]: deletionRevision } : {}),\n },\n \"insertion\",\n insertPos,\n insertPos + 1,\n authorId,\n context.timestamp,\n );\n\n const finalDocument: CanonicalDocumentEnvelope = {\n ...reviewState.document,\n review: {\n ...reviewState.document.review,\n revisions: {\n ...reviewState.document.review.revisions,\n ...(deletionRevision ? { [deletionRevision.changeId]: deletionRevision } : {}),\n [insertionRevision.changeId]: insertionRevision,\n },\n },\n };\n\n return createTransaction(\n {\n ...state,\n document: finalDocument,\n selection: result.selection,\n warnings: reviewState.warnings,\n runtime: {\n ...state.runtime,\n activeCommentId: reviewState.activeCommentId,\n },\n },\n {\n historyBoundary: \"push\",\n markDirty: true,\n mapping: result.mapping,\n effects: {\n ...reviewState.effects,\n revisionAuthored: { changeId: insertionRevision.changeId, kind: \"insertion\" },\n },\n },\n );\n}\n\nfunction findOverlappingAuthoredDeletion(\n revisions: Record<string, CanonicalRevisionRecord>,\n from: number,\n to: number,\n): CanonicalRevisionRecord | undefined {\n for (const revision of Object.values(revisions)) {\n if (\n revision.kind === \"deletion\" &&\n revision.status === \"open\" &&\n revision.metadata?.source === \"runtime\" &&\n revision.anchor.kind === \"range\"\n ) {\n const revFrom = revision.anchor.range.from;\n const revTo = revision.anchor.range.to;\n // Adjacent or overlapping: the deletion is directly next to or overlapping the range\n if (\n (from >= revFrom && from <= revTo) ||\n (to >= revFrom && to <= revTo) ||\n (from === revTo) ||\n (to === revFrom)\n ) {\n return revision;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Find an open authored insertion revision whose end position equals `cursorAt`.\n * Used to extend an existing insertion when the user keeps typing at the same\n * position rather than creating a new revision for every character.\n */\nfunction findAdjacentAuthoredInsertion(\n revisions: Record<string, CanonicalRevisionRecord>,\n cursorAt: number,\n): CanonicalRevisionRecord | undefined {\n for (const revision of Object.values(revisions)) {\n if (\n revision.kind === \"insertion\" &&\n revision.status === \"open\" &&\n revision.metadata?.source === \"runtime\" &&\n revision.anchor.kind === \"range\" &&\n revision.anchor.range.to === cursorAt\n ) {\n return revision;\n }\n }\n return undefined;\n}\n","/**\n * parse-fields.ts\n *\n * Standalone parsers for OOXML field codes (w:fldSimple, complex fldChar sequences)\n * and bookmarks (w:bookmarkStart / w:bookmarkEnd).\n *\n * These types mirror the canonical FieldNode / BookmarkStartNode / BookmarkEndNode\n * shapes from canonical-document.ts, but carry raw XML for preservation and are\n * pre-normalization (no fragmentId / warningId yet).\n *\n * Usage: call parseFieldsFromParagraphXml() or parseBookmarksFromXml() for\n * independent field/bookmark extraction. The functions are designed to be\n * imported by parse-main-document.ts when full pipeline integration is ready.\n */\n\n// ─── Parsed types ────────────────────────────────────────────────────────────\n\nexport interface ParsedSimpleFieldNode {\n type: \"field\";\n fieldType: \"simple\";\n instruction: string;\n /** Raw XML of the content runs inside <w:fldSimple>. */\n contentXml: string;\n rawXml: string;\n}\n\nexport interface ParsedComplexFieldNode {\n type: \"field\";\n fieldType: \"complex\";\n instruction: string;\n /** Raw XML of the content runs between the \"separate\" and \"end\" fldChar. */\n contentXml: string;\n /** Start index in the source document XML. */\n start: number;\n /** End index (exclusive) in the source document XML. */\n end: number;\n}\n\nexport type ParsedFieldNode = ParsedSimpleFieldNode | ParsedComplexFieldNode;\n\nexport interface ParsedBookmarkStartNode {\n type: \"bookmark_start\";\n bookmarkId: string;\n name: string;\n rawXml: string;\n}\n\nexport interface ParsedBookmarkEndNode {\n type: \"bookmark_end\";\n bookmarkId: string;\n rawXml: string;\n}\n\nexport type ParsedBookmarkNode = ParsedBookmarkStartNode | ParsedBookmarkEndNode;\n\n// ─── Internal XML types ───────────────────────────────────────────────────────\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Parse all simple fields and bookmarks from the XML of a single paragraph\n * element. Complex fields that span paragraphs are not fully resolved here;\n * use extractComplexFieldsFromBodyXml for body-level extraction.\n *\n * @param paragraphXml Raw XML string of a <w:p> element.\n */\nexport function parseFieldsFromParagraphXml(paragraphXml: string): {\n simpleFields: ParsedSimpleFieldNode[];\n bookmarks: ParsedBookmarkNode[];\n} {\n const root = parseXml(paragraphXml);\n const pEl = findFirstChild(root, \"p\");\n const target = pEl ?? root;\n\n const simpleFields: ParsedSimpleFieldNode[] = [];\n const bookmarks: ParsedBookmarkNode[] = [];\n\n for (const child of target.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"fldSimple\") {\n const field = parseFldSimple(child, paragraphXml);\n if (field) simpleFields.push(field);\n } else if (name === \"bookmarkStart\") {\n const bk = parseBookmarkStart(child, paragraphXml);\n if (bk) bookmarks.push(bk);\n } else if (name === \"bookmarkEnd\") {\n const bk = parseBookmarkEnd(child, paragraphXml);\n if (bk) bookmarks.push(bk);\n }\n }\n\n return { simpleFields, bookmarks };\n}\n\n/**\n * Extract complex field sequences from a body element XML string.\n * A complex field is a begin / instrText* / separate / content / end sequence\n * spread across multiple <w:r> siblings.\n *\n * @param bodyXml Raw XML string of a <w:body> element (or full document).\n */\nexport function extractComplexFieldsFromBodyXml(bodyXml: string): ParsedComplexFieldNode[] {\n const root = parseXml(bodyXml);\n const results: ParsedComplexFieldNode[] = [];\n\n // Walk all <w:p> children of the body\n const bodyEl = findFirstChild(root, \"body\") ?? findFirstChild(root, \"document\");\n const scanTarget = bodyEl ?? root;\n\n for (const block of scanTarget.children) {\n if (block.type !== \"element\") continue;\n if (localName(block.name) !== \"p\") continue;\n extractComplexFieldsFromParagraph(block, bodyXml, results);\n }\n\n return results;\n}\n\n/**\n * Parse all bookmark start/end nodes from a full document or body XML.\n */\nexport function extractBookmarksFromBodyXml(bodyXml: string): ParsedBookmarkNode[] {\n const root = parseXml(bodyXml);\n const results: ParsedBookmarkNode[] = [];\n collectBookmarks(root, bodyXml, results);\n return results;\n}\n\n// ─── Element-level parsers (exported for unit testing) ────────────────────────\n\nexport function parseFldSimple(\n element: { attributes: Record<string, string>; children: XmlNode[]; start: number; end: number },\n sourceXml: string,\n): ParsedSimpleFieldNode | undefined {\n const instruction = (element.attributes[\"w:instr\"] ?? element.attributes.instr ?? \"\").trim();\n const contentXml = element.children\n .filter((c): c is XmlElementNode => c.type === \"element\")\n .map((c) => sourceXml.slice(c.start, c.end))\n .join(\"\");\n return {\n type: \"field\",\n fieldType: \"simple\",\n instruction,\n contentXml,\n rawXml: sourceXml.slice(element.start, element.end),\n };\n}\n\nexport function parseBookmarkStart(\n element: { attributes: Record<string, string>; start: number; end: number },\n sourceXml: string,\n): ParsedBookmarkStartNode | undefined {\n const bookmarkId = element.attributes[\"w:id\"] ?? element.attributes.id ?? \"\";\n const name = element.attributes[\"w:name\"] ?? element.attributes.name ?? \"\";\n if (!bookmarkId) return undefined;\n return {\n type: \"bookmark_start\",\n bookmarkId,\n name,\n rawXml: sourceXml.slice(element.start, element.end),\n };\n}\n\nexport function parseBookmarkEnd(\n element: { attributes: Record<string, string>; start: number; end: number },\n sourceXml: string,\n): ParsedBookmarkEndNode | undefined {\n const bookmarkId = element.attributes[\"w:id\"] ?? element.attributes.id ?? \"\";\n if (!bookmarkId) return undefined;\n return {\n type: \"bookmark_end\",\n bookmarkId,\n rawXml: sourceXml.slice(element.start, element.end),\n };\n}\n\n// ─── Field family classification ─────────────────────────────────────────────\n\nimport type {\n CanonicalDocument,\n DocumentNode,\n FieldFamily,\n FieldNode,\n FieldRegistry,\n FieldRegistryEntry,\n FieldRefreshStatus,\n InlineNode,\n ParagraphNode,\n SubPartsCatalog,\n SupportedFieldFamily,\n TocEntry,\n TocStructure,\n} from \"../../model/canonical-document.ts\";\n\nconst FIELD_FAMILY_PATTERN =\n /^\\s*(REF|PAGEREF|NOTEREF|TOC|PAGE|NUMPAGES|DATE|TIME|AUTHOR|FILENAME|MERGEFIELD|IF|SEQ|INDEX|TC|STYLEREF)\\b/i;\n\nconst SUPPORTED_FAMILIES = new Set<string>([\"REF\", \"PAGEREF\", \"NOTEREF\", \"TOC\"]);\n\n/**\n * Classify a field instruction into its field family.\n * Returns the family enum value and whether it is in the supported slice.\n */\nexport function classifyFieldInstruction(instruction: string): {\n family: FieldFamily;\n supported: boolean;\n target?: string;\n} {\n const trimmed = instruction.trim();\n const match = FIELD_FAMILY_PATTERN.exec(trimmed);\n if (!match) {\n return { family: \"UNKNOWN\", supported: false };\n }\n\n const family = match[1].toUpperCase() as FieldFamily;\n const supported = SUPPORTED_FAMILIES.has(family);\n\n let target: string | undefined;\n if (family === \"REF\" || family === \"PAGEREF\" || family === \"NOTEREF\") {\n const targetMatch = /^\\s*(?:REF|PAGEREF|NOTEREF)\\s+(?:\"([^\"]+)\"|(\\S+))/i.exec(trimmed);\n target = (targetMatch?.[1] ?? targetMatch?.[2])?.trim();\n }\n\n return { family, supported, target };\n}\n\n/**\n * Returns true if the given field family is in the supported refresh slice.\n */\nexport function isSupportedFieldFamily(family: FieldFamily): family is SupportedFieldFamily {\n return SUPPORTED_FAMILIES.has(family);\n}\n\n// ─── Field registry builder ─────────────────────────────────────────────────\n\n/**\n * Build a field registry from a canonical document, cataloging every field\n * instance with its classification, dependency metadata, and refresh status.\n *\n * The registry partitions fields into `supported` (REF, PAGEREF, NOTEREF, TOC)\n * and `preserveOnly` (all others) slices.\n */\nexport function buildFieldRegistry(\n document: Pick<CanonicalDocument, \"content\" | \"styles\"> & {\n subParts?: SubPartsCatalog;\n },\n): FieldRegistry {\n const root = document.content;\n const supported: FieldRegistryEntry[] = [];\n const preserveOnly: FieldRegistryEntry[] = [];\n let fieldIndex = 0;\n let paragraphIndex = -1;\n let tocInstruction: string | undefined;\n\n walkFieldDocument(root, (node, pIdx) => {\n paragraphIndex = pIdx;\n if (node.type === \"field\") {\n const classification = node.fieldFamily\n ? { family: node.fieldFamily, supported: isSupportedFieldFamily(node.fieldFamily), target: node.fieldTarget }\n : classifyFieldInstruction(node.instruction);\n const displayText = flattenFieldText(node.children);\n const entry: FieldRegistryEntry = {\n fieldIndex,\n fieldFamily: classification.family,\n supported: classification.supported,\n instruction: node.instruction,\n ...(classification.target ? { fieldTarget: classification.target } : {}),\n displayText,\n paragraphIndex,\n refreshStatus: node.refreshStatus ?? (classification.supported ? \"stale\" : \"preserve-only\"),\n };\n if (classification.supported) {\n supported.push(entry);\n if (classification.family === \"TOC\" && !tocInstruction) {\n tocInstruction = node.instruction;\n }\n } else {\n preserveOnly.push(entry);\n }\n fieldIndex += 1;\n }\n });\n if (document.subParts) {\n walkSubPartFields(document.subParts, (node, pIdx) => {\n paragraphIndex = pIdx;\n if (node.type === \"field\") {\n const classification = node.fieldFamily\n ? { family: node.fieldFamily, supported: isSupportedFieldFamily(node.fieldFamily), target: node.fieldTarget }\n : classifyFieldInstruction(node.instruction);\n const displayText = flattenFieldText(node.children);\n const entry: FieldRegistryEntry = {\n fieldIndex,\n fieldFamily: classification.family,\n supported: classification.supported,\n instruction: node.instruction,\n ...(classification.target ? { fieldTarget: classification.target } : {}),\n displayText,\n paragraphIndex,\n refreshStatus: node.refreshStatus ?? (classification.supported ? \"stale\" : \"preserve-only\"),\n };\n if (classification.supported) {\n supported.push(entry);\n } else {\n preserveOnly.push(entry);\n }\n fieldIndex += 1;\n }\n });\n }\n\n const tocStructure = tocInstruction\n ? buildTocStructure(document, tocInstruction)\n : undefined;\n\n return {\n supported,\n preserveOnly,\n ...(tocStructure ? { tocStructure } : {}),\n };\n}\n\n/**\n * Parse the heading level range from a TOC field instruction.\n * The \\\\o switch specifies the outline level range (e.g. \\\\o \"1-3\").\n * Defaults to 1-9 if no \\\\o switch is present.\n */\nexport function parseTocLevelRange(instruction: string): { from: number; to: number } {\n const match = /\\\\o\\s+\"(\\d+)-(\\d+)\"/.exec(instruction);\n if (match) {\n return { from: Number.parseInt(match[1], 10), to: Number.parseInt(match[2], 10) };\n }\n return { from: 1, to: 9 };\n}\n\n/**\n * Build a TocStructure from the document's heading paragraphs and the\n * TOC field instruction. This produces a deterministic, package-backed\n * TOC model that the runtime can use for refresh without DOM recomputation.\n */\nexport function buildTocStructure(\n document: Pick<CanonicalDocument, \"content\" | \"styles\">,\n instruction: string,\n): TocStructure {\n const levelRange = parseTocLevelRange(instruction);\n const entries: TocEntry[] = [];\n let paragraphIndex = -1;\n\n walkFieldDocument(document.content, (node, pIdx) => {\n paragraphIndex = pIdx;\n if (node.type !== \"paragraph\") return;\n const paragraph = node as ParagraphNode;\n\n // Determine heading level from outlineLevel or style\n let level: number | undefined = paragraph.outlineLevel;\n if (level === undefined && paragraph.styleId) {\n const style = document.styles.paragraphs[paragraph.styleId];\n if (style?.outlineLevel !== undefined) {\n level = style.outlineLevel;\n }\n }\n\n if (level === undefined) return;\n // TOC outline levels are 0-based internally, 1-based in TOC notation\n const tocLevel = level + 1;\n if (tocLevel < levelRange.from || tocLevel > levelRange.to) return;\n\n const text = flattenParagraphInlineText(paragraph.children);\n if (text.trim().length === 0) return;\n\n // Find bookmark anchoring this heading\n let bookmarkName: string | undefined;\n for (const child of paragraph.children) {\n if (child.type === \"bookmark_start\" && child.name) {\n bookmarkName = child.name;\n break;\n }\n }\n\n entries.push({\n text: text.trim(),\n level: tocLevel,\n paragraphIndex,\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(bookmarkName ? { bookmarkName } : {}),\n });\n });\n\n return {\n instruction,\n levelRange,\n entries,\n status: \"stale\",\n };\n}\n\n/**\n * Deterministic refresh helper for REF fields.\n * Given a bookmark name map and the document content, resolves the display\n * text for a REF field by extracting text from the bookmarked paragraph.\n *\n * Returns the resolved text, or undefined if the bookmark is not found.\n */\nexport function resolveRefFieldText(\n document: Pick<CanonicalDocument, \"content\">,\n bookmarkNameMap: Map<string, { bookmarkId: string; paragraphIndex: number }>,\n fieldTarget: string,\n): { text: string; refreshStatus: \"current\" | \"unresolvable\" } | undefined {\n const bookmark = bookmarkNameMap.get(fieldTarget);\n if (!bookmark) {\n return { text: \"\", refreshStatus: \"unresolvable\" };\n }\n\n // Find the paragraph at bookmarkIndex and extract its text content\n let paragraphIndex = -1;\n let resolvedText: string | undefined;\n\n walkFieldDocument(document.content, (node, pIdx) => {\n if (node.type !== \"paragraph\") return;\n paragraphIndex = pIdx;\n if (paragraphIndex === bookmark.paragraphIndex) {\n resolvedText = flattenBookmarkContent(node as ParagraphNode, bookmark.bookmarkId);\n }\n });\n\n if (resolvedText !== undefined) {\n return { text: resolvedText, refreshStatus: \"current\" };\n }\n return { text: \"\", refreshStatus: \"unresolvable\" };\n}\n\n/**\n * Deterministic refresh helper that updates all supported field entries\n * in a registry with their current resolved status.\n *\n * This does NOT mutate the document nodes — it returns a new registry\n * with updated refresh statuses. A3 owns the runtime wiring that\n * applies these to the live document.\n */\nexport function refreshFieldRegistry(\n registry: FieldRegistry,\n bookmarkNameMap: Map<string, { bookmarkId: string; paragraphIndex: number }>,\n): FieldRegistry {\n const refreshed: FieldRegistryEntry[] = registry.supported.map((entry) => {\n if (entry.fieldFamily === \"TOC\") {\n // TOC refresh is handled through tocStructure, not individual entries\n return { ...entry, refreshStatus: registry.tocStructure ? \"current\" : \"stale\" as FieldRefreshStatus };\n }\n if (!entry.fieldTarget) {\n return { ...entry, refreshStatus: \"unresolvable\" as FieldRefreshStatus };\n }\n const bookmark = bookmarkNameMap.get(entry.fieldTarget);\n if (!bookmark) {\n return { ...entry, refreshStatus: \"unresolvable\" as FieldRefreshStatus };\n }\n return { ...entry, refreshStatus: \"current\" as FieldRefreshStatus };\n });\n\n return {\n supported: refreshed,\n preserveOnly: registry.preserveOnly,\n ...(registry.tocStructure ? { tocStructure: registry.tocStructure } : {}),\n };\n}\n\n// ─── Field registry internal helpers ────────────────────────────────────────\n\nfunction walkFieldDocument(\n node: DocumentNode,\n visit: (node: DocumentNode, paragraphIndex: number) => void,\n paragraphIndex = -1,\n): number {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n }\n visit(node, paragraphIndex);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n paragraphIndex = walkFieldDocument(child as DocumentNode, visit, paragraphIndex);\n }\n }\n if (node.type === \"table\") {\n for (const row of node.rows) {\n paragraphIndex = walkFieldDocument(row, visit, paragraphIndex);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n paragraphIndex = walkFieldDocument(cell, visit, paragraphIndex);\n }\n }\n return paragraphIndex;\n}\n\nfunction walkSubPartFields(\n subParts: SubPartsCatalog,\n visit: (node: DocumentNode, paragraphIndex: number) => void,\n): void {\n for (const header of subParts.headers) {\n for (const block of header.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n for (const footer of subParts.footers) {\n for (const block of footer.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n if (subParts.footnoteCollection) {\n for (const note of Object.values(subParts.footnoteCollection.footnotes)) {\n for (const block of note.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n for (const note of Object.values(subParts.footnoteCollection.endnotes)) {\n for (const block of note.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n }\n}\n\nfunction flattenFieldText(children: InlineNode[]): string {\n return children\n .map((child) => {\n if (child.type === \"text\") return child.text;\n if (child.type === \"tab\") return \"\\t\";\n if (child.type === \"hard_break\" || child.type === \"column_break\") return \"\\n\";\n return \"\";\n })\n .join(\"\");\n}\n\nfunction flattenParagraphInlineText(children: InlineNode[]): string {\n return children\n .map((child) => {\n if (child.type === \"text\") return child.text;\n if (child.type === \"tab\") return \"\\t\";\n if (child.type === \"hard_break\" || child.type === \"column_break\") return \"\\n\";\n if (child.type === \"hyperlink\") return flattenFieldText(child.children);\n if (child.type === \"field\") return flattenFieldText(child.children);\n return \"\";\n })\n .join(\"\");\n}\n\nfunction flattenBookmarkContent(\n paragraph: ParagraphNode,\n bookmarkId: string,\n): string {\n let inside = false;\n const parts: string[] = [];\n for (const child of paragraph.children) {\n if (child.type === \"bookmark_start\" && child.bookmarkId === bookmarkId) {\n inside = true;\n continue;\n }\n if (child.type === \"bookmark_end\" && child.bookmarkId === bookmarkId) {\n break;\n }\n if (inside) {\n if (child.type === \"text\") parts.push(child.text);\n else if (child.type === \"tab\") parts.push(\"\\t\");\n else if (child.type === \"hard_break\") parts.push(\"\\n\");\n }\n }\n // If no bookmark boundaries found in this paragraph, return full paragraph text\n if (!inside) {\n return flattenParagraphInlineText(paragraph.children);\n }\n return parts.join(\"\");\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction extractComplexFieldsFromParagraph(\n paragraph: XmlElementNode,\n sourceXml: string,\n results: ParsedComplexFieldNode[],\n): void {\n type FieldState = \"idle\" | \"in-instr\" | \"in-content\";\n let state: FieldState = \"idle\";\n let instrParts: string[] = [];\n let contentStart = -1;\n let contentEnd = -1;\n let fieldStart = -1;\n\n for (const child of paragraph.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"r\") continue;\n\n const fldChar = findFirstChildEl(child, \"fldChar\");\n const instrText = findFirstChildEl(child, \"instrText\");\n\n if (fldChar) {\n const charType = (\n fldChar.attributes[\"w:fldCharType\"] ??\n fldChar.attributes.fldCharType ??\n \"\"\n ).toLowerCase();\n\n if (charType === \"begin\") {\n state = \"in-instr\";\n instrParts = [];\n fieldStart = child.start;\n contentStart = -1;\n contentEnd = -1;\n } else if (charType === \"separate\" && state === \"in-instr\") {\n state = \"in-content\";\n contentStart = child.end;\n } else if (charType === \"end\") {\n if (state === \"in-content\" || state === \"in-instr\") {\n if (state === \"in-content\") {\n contentEnd = child.start;\n }\n const instruction = instrParts.join(\"\").trim();\n const contentXml =\n contentStart >= 0 && contentEnd >= contentStart\n ? sourceXml.slice(contentStart, contentEnd)\n : \"\";\n results.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction,\n contentXml,\n start: fieldStart,\n end: child.end,\n });\n }\n state = \"idle\";\n instrParts = [];\n }\n } else if (instrText && state === \"in-instr\") {\n const text = instrText.children\n .filter((c): c is XmlTextNode => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n instrParts.push(text);\n }\n }\n}\n\nfunction collectBookmarks(\n node: XmlElementNode,\n sourceXml: string,\n results: ParsedBookmarkNode[],\n): void {\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n if (name === \"bookmarkStart\") {\n const bk = parseBookmarkStart(child, sourceXml);\n if (bk) results.push(bk);\n } else if (name === \"bookmarkEnd\") {\n const bk = parseBookmarkEnd(child, sourceXml);\n if (bk) results.push(bk);\n } else {\n collectBookmarks(child, sourceXml, results);\n }\n }\n}\n\nfunction findFirstChild(node: XmlElementNode, childLocalName: string): XmlElementNode | undefined {\n return node.children.find(\n (c): c is XmlElementNode => c.type === \"element\" && localName(c.name) === childLocalName,\n );\n}\n\nfunction findFirstChildEl(node: XmlElementNode, childLocalName: string): XmlElementNode | undefined {\n return node.children.find(\n (c): c is XmlElementNode => c.type === \"element\" && localName(c.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const sep = name.indexOf(\":\");\n return sep >= 0 ? name.slice(sep + 1) : name;\n}\n\n// ─── Minimal XML parser (same pattern as parse-tables.ts) ────────────────────\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: end >= 0 ? end + 3 : xml.length,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text, start: cursor, end });\n }\n cursor = end;\n continue;\n }\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) throw new Error(\"Malformed XML: missing >.\");\n const name = xml.slice(cursor + 2, end).trim();\n const current = stack.pop();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n current.end = end + 1;\n cursor = end + 1;\n continue;\n }\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: tagEnd + 1,\n };\n stack[stack.length - 1]?.children.push(element);\n if (!selfClosing) stack.push(element);\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) throw new Error(\"Malformed XML: unclosed element.\");\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n if (cursor >= tagBody.length) break;\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const key = tagBody.slice(keyStart, cursor);\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n if (tagBody[cursor] !== \"=\") { attributes[key] = \"\"; continue; }\n cursor += 1;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) throw new Error(`Malformed XML attribute ${key}.`);\n cursor += 1;\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) cursor += 1;\n attributes[key] = decodeXmlEntities(tagBody.slice(valueStart, cursor));\n cursor += 1;\n }\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n while (cursor < xml.length) {\n const c = xml[cursor];\n if (quote) { if (c === quote) quote = null; cursor += 1; continue; }\n if (c === `\"` || c === `'`) { quote = c; cursor += 1; continue; }\n if (c === \">\") return cursor;\n cursor += 1;\n }\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\": return \"&\";\n case \"lt\": return \"<\";\n case \"gt\": return \">\";\n case \"quot\": return `\"`;\n case \"apos\": return `'`;\n default:\n if (entity.startsWith(\"#x\")) return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n if (entity.startsWith(\"#\")) return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n return match;\n }\n });\n}\n","import { extractBookmarksFromBodyXml } from \"../io/ooxml/parse-fields.ts\";\nimport type {\n BookmarkEndNode,\n BookmarkStartNode,\n CanonicalDocument,\n DocumentNode,\n FieldRegistry,\n FieldRegistryEntry,\n} from \"../model/canonical-document.ts\";\n\nexport interface LegalBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n source: \"ooxml\" | \"canonical\";\n status: \"paired\" | \"start-only\" | \"end-only\";\n startIndex?: number;\n endIndex?: number;\n}\n\ninterface OpenBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n startIndex: number;\n}\n\nexport function parseBookmarksFromDocumentXml(xml: string): LegalBookmark[] {\n const bookmarks = extractBookmarksFromBodyXml(xml);\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < bookmarks.length; index += 1) {\n const bookmark = bookmarks[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"ooxml\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function collectBookmarksFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): LegalBookmark[] {\n const root = \"content\" in document ? document.content : document;\n const sequence: Array<BookmarkStartNode | BookmarkEndNode> = [];\n\n walkDocument(root, (node) => {\n if (node.type === \"bookmark_start\" || node.type === \"bookmark_end\") {\n sequence.push(node);\n }\n });\n\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < sequence.length; index += 1) {\n const bookmark = sequence[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"canonical\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function isHiddenBookmarkName(name: string | undefined): boolean {\n return Boolean(name && name.startsWith(\"_\"));\n}\n\nexport interface BookmarkIntegrityResult {\n totalCount: number;\n pairedCount: number;\n startOnlyCount: number;\n endOnlyCount: number;\n hiddenCount: number;\n namedCount: number;\n integrityScore: \"complete\" | \"partial\" | \"degraded\";\n}\n\nexport function assessBookmarkIntegrity(bookmarks: LegalBookmark[]): BookmarkIntegrityResult {\n const pairedCount = bookmarks.filter((b) => b.status === \"paired\").length;\n const startOnlyCount = bookmarks.filter((b) => b.status === \"start-only\").length;\n const endOnlyCount = bookmarks.filter((b) => b.status === \"end-only\").length;\n const hiddenCount = bookmarks.filter((b) => b.hidden).length;\n const namedCount = bookmarks.filter((b) => b.name && !b.hidden).length;\n const totalCount = bookmarks.length;\n const unpairedCount = startOnlyCount + endOnlyCount;\n\n return {\n totalCount,\n pairedCount,\n startOnlyCount,\n endOnlyCount,\n hiddenCount,\n namedCount,\n integrityScore:\n unpairedCount === 0\n ? \"complete\"\n : unpairedCount <= pairedCount\n ? \"partial\"\n : \"degraded\",\n };\n}\n\nfunction compareBookmarks(left: LegalBookmark, right: LegalBookmark): number {\n return (\n (left.startIndex ?? left.endIndex ?? Number.MAX_SAFE_INTEGER) -\n (right.startIndex ?? right.endIndex ?? Number.MAX_SAFE_INTEGER) ||\n left.bookmarkId.localeCompare(right.bookmarkId)\n );\n}\n\n/**\n * Build a lookup map from bookmark name to bookmarkId for the document.\n * Used by the field refresh runtime to resolve REF/PAGEREF/NOTEREF targets.\n */\nexport function buildBookmarkNameMap(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): Map<string, { bookmarkId: string; paragraphIndex: number }> {\n const root = \"content\" in document ? document.content : document;\n const map = new Map<string, { bookmarkId: string; paragraphIndex: number }>();\n let paragraphIndex = -1;\n\n walkDocument(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n }\n if (node.type === \"bookmark_start\" && node.name) {\n map.set(node.name, { bookmarkId: node.bookmarkId, paragraphIndex });\n }\n });\n\n return map;\n}\n\n/**\n * Resolve field-to-bookmark dependencies from a field registry.\n * Returns a map of bookmark names to the field entries that reference them.\n * This enables the runtime to determine which fields need refresh when\n * a bookmark's content changes.\n */\nexport function resolveBookmarkFieldDependencies(\n registry: FieldRegistry,\n): Map<string, FieldRegistryEntry[]> {\n const deps = new Map<string, FieldRegistryEntry[]>();\n for (const entry of registry.supported) {\n if (!entry.fieldTarget) continue;\n const existing = deps.get(entry.fieldTarget) ?? [];\n existing.push(entry);\n deps.set(entry.fieldTarget, existing);\n }\n return deps;\n}\n\nfunction walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {\n visit(node);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n walkDocument(child, visit);\n }\n }\n\n if (node.type === \"table\") {\n for (const row of node.rows) {\n walkDocument(row, visit);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n walkDocument(cell, visit);\n }\n }\n}\n","import {\n createNodeAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type Assoc,\n type BoundaryAssoc,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"../../core/selection/mapping.ts\";\n\nexport type CommentAnchor = EditorAnchorProjection;\nexport type CommentAnchorState = \"active\" | \"detached\";\n\nexport interface CommentAnchorSummary {\n anchor: CommentAnchor;\n state: CommentAnchorState;\n range: DocRange;\n}\n\nexport function createCommentRangeAnchor(\n from: number,\n to = from,\n assoc?: BoundaryAssoc,\n): CommentAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function createCommentNodeAnchor(at: number, assoc?: Assoc): CommentAnchor {\n return createNodeAnchor(at, assoc);\n}\n\nexport function remapCommentAnchor(\n anchor: CommentAnchor,\n mapping: TransactionMapping,\n): CommentAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function isDetachedCommentAnchor(anchor: CommentAnchor): boolean {\n return anchor.kind === \"detached\";\n}\n\nexport function summarizeCommentAnchor(anchor: CommentAnchor): CommentAnchorSummary {\n if (anchor.kind === \"range\") {\n return {\n anchor,\n state: \"active\",\n range: normalizeRange(anchor.range),\n };\n }\n\n if (anchor.kind === \"node\") {\n return {\n anchor,\n state: \"active\",\n range: {\n from: anchor.at,\n to: anchor.at,\n },\n };\n }\n\n return {\n anchor,\n state: \"detached\",\n range: normalizeRange(anchor.lastKnownRange),\n };\n}\n","import type { TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport {\n isDetachedCommentAnchor,\n remapCommentAnchor,\n summarizeCommentAnchor,\n type CommentAnchor,\n} from \"./comment-anchors.ts\";\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n body: string;\n createdAt: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport type CommentThreadStatus = \"open\" | \"resolved\" | \"detached\";\n\nexport interface CommentThread {\n commentId: string;\n anchor: CommentAnchor;\n status: CommentThreadStatus;\n entries: CommentEntry[];\n createdBy: string;\n createdAt: string;\n resolution?: CommentResolution;\n warningIds: string[];\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface CommentStore {\n version: \"comment-store/1\";\n threads: Record<string, CommentThread>;\n}\n\nexport interface CreateCommentThreadParams {\n commentId: string;\n anchor: CommentAnchor;\n createdBy: string;\n createdAt: string;\n body: string;\n entryId?: string;\n warningIds?: string[];\n}\n\nexport interface AppendCommentEntryParams {\n commentId: string;\n entry: CommentEntry;\n}\n\nexport interface ResolveCommentThreadParams {\n commentId: string;\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport interface CommentSidebarThread {\n commentId: string;\n status: CommentThreadStatus;\n excerpt: string;\n entryCount: number;\n createdAt: string;\n createdBy: string;\n warningCount: number;\n anchorLabel: string;\n isActive: boolean;\n resolvedAt?: string;\n resolvedBy?: string;\n}\n\nexport interface CommentSidebarProjection {\n totalCount: number;\n openCommentIds: string[];\n resolvedCommentIds: string[];\n detachedCommentIds: string[];\n threads: CommentSidebarThread[];\n}\n\nexport function createCommentStore(\n threads: Record<string, CommentThread> = {},\n): CommentStore {\n return {\n version: \"comment-store/1\",\n threads,\n };\n}\n\nexport function createCommentThread(\n params: CreateCommentThreadParams,\n): CommentThread {\n return {\n commentId: params.commentId,\n anchor: params.anchor,\n status: isDetachedCommentAnchor(params.anchor) ? \"detached\" : \"open\",\n entries: [\n {\n entryId: params.entryId ?? `${params.commentId}-entry-1`,\n authorId: params.createdBy,\n body: params.body,\n createdAt: params.createdAt,\n },\n ],\n createdBy: params.createdBy,\n createdAt: params.createdAt,\n warningIds: [...(params.warningIds ?? [])],\n };\n}\n\nexport function upsertCommentThread(\n store: CommentStore,\n thread: CommentThread,\n): CommentStore {\n return {\n ...store,\n threads: {\n ...store.threads,\n [thread.commentId]: normalizeThread(thread),\n },\n };\n}\n\nexport function appendCommentEntry(\n store: CommentStore,\n params: AppendCommentEntryParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n entries: [...existing.entries, params.entry],\n });\n}\n\nexport function resolveCommentThread(\n store: CommentStore,\n params: ResolveCommentThreadParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: existing.status === \"detached\" ? \"detached\" : \"resolved\",\n resolution: {\n resolvedAt: params.resolvedAt,\n resolvedBy: params.resolvedBy,\n },\n });\n}\n\nexport function reopenCommentThread(\n store: CommentStore,\n commentId: string,\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: isDetachedCommentAnchor(existing.anchor) ? \"detached\" : \"open\",\n resolution: undefined,\n });\n}\n\nexport function setCommentThreadWarnings(\n store: CommentStore,\n commentId: string,\n warningIds: string[],\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n warningIds: [...warningIds],\n });\n}\n\nexport function remapCommentStore(\n store: CommentStore,\n mapping: TransactionMapping,\n): CommentStore {\n return createCommentStore(\n Object.fromEntries(\n Object.entries(store.threads).map(([commentId, thread]) => {\n const anchor = remapCommentAnchor(thread.anchor, mapping);\n const nextStatus =\n anchor.kind === \"detached\"\n ? \"detached\"\n : thread.status === \"resolved\"\n ? \"resolved\"\n : \"open\";\n\n return [\n commentId,\n normalizeThread({\n ...thread,\n anchor,\n status: nextStatus,\n }),\n ];\n }),\n ),\n );\n}\n\nexport function createCommentSidebarProjection(\n store: CommentStore,\n activeCommentId?: string,\n): CommentSidebarProjection {\n const threads = Object.values(store.threads)\n .map((thread) => toSidebarThread(thread, activeCommentId))\n .sort(compareSidebarThreads);\n\n return {\n totalCount: threads.length,\n openCommentIds: threads\n .filter((thread) => thread.status === \"open\")\n .map((thread) => thread.commentId),\n resolvedCommentIds: threads\n .filter((thread) => thread.status === \"resolved\")\n .map((thread) => thread.commentId),\n detachedCommentIds: threads\n .filter((thread) => thread.status === \"detached\")\n .map((thread) => thread.commentId),\n threads,\n };\n}\n\nfunction toSidebarThread(\n thread: CommentThread,\n activeCommentId?: string,\n): CommentSidebarThread {\n const firstEntry = thread.entries[0];\n const anchorSummary = summarizeCommentAnchor(thread.anchor);\n\n return {\n commentId: thread.commentId,\n status: thread.status,\n excerpt: firstEntry ? summarizeBody(firstEntry.body) : \"Empty thread\",\n entryCount: thread.entries.length,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n warningCount: thread.warningIds.length,\n anchorLabel:\n anchorSummary.state === \"detached\"\n ? `Detached ${anchorSummary.range.from}-${anchorSummary.range.to}`\n : `Range ${anchorSummary.range.from}-${anchorSummary.range.to}`,\n isActive: activeCommentId === thread.commentId,\n resolvedAt: thread.resolution?.resolvedAt,\n resolvedBy: thread.resolution?.resolvedBy,\n };\n}\n\nfunction normalizeThread(thread: CommentThread): CommentThread {\n if (isDetachedCommentAnchor(thread.anchor)) {\n return {\n ...thread,\n status: \"detached\",\n };\n }\n\n if (thread.status === \"detached\") {\n return {\n ...thread,\n status: thread.resolution ? \"resolved\" : \"open\",\n };\n }\n\n return thread;\n}\n\nfunction compareSidebarThreads(\n left: CommentSidebarThread,\n right: CommentSidebarThread,\n): number {\n const statusDelta = priorityForStatus(left.status) - priorityForStatus(right.status);\n if (statusDelta !== 0) {\n return statusDelta;\n }\n\n return left.createdAt.localeCompare(right.createdAt);\n}\n\nfunction priorityForStatus(status: CommentThreadStatus): number {\n switch (status) {\n case \"open\":\n return 0;\n case \"detached\":\n return 1;\n case \"resolved\":\n return 2;\n }\n}\n\nfunction summarizeBody(body: string): string {\n const collapsed = body.replace(/\\s+/g, \" \").trim();\n if (!collapsed) {\n return \"Empty thread\";\n }\n\n return collapsed.length > 80 ? `${collapsed.slice(0, 77)}...` : collapsed;\n}\n","import {\n normalizeCommentThreadRecord,\n type CommentThreadRecord,\n} from \"../../core/state/editor-state.ts\";\nimport {\n createCommentStore,\n type CommentStore,\n type CommentThread,\n} from \"./comment-store.ts\";\n\nexport function createCommentStoreFromRuntimeComments(\n comments: Record<string, CommentThreadRecord>,\n): CommentStore {\n const threads = Object.fromEntries(\n Object.values(comments).map((comment) => [\n comment.commentId,\n toCommentThread(comment),\n ]),\n );\n\n return createCommentStore(threads);\n}\n\nfunction toCommentThread(comment: CommentThreadRecord): CommentThread {\n const normalized = normalizeCommentThreadRecord(comment);\n\n return {\n commentId: normalized.commentId,\n anchor: normalized.anchor,\n status:\n normalized.anchor.kind === \"detached\"\n ? \"detached\"\n : normalized.status === \"resolved\"\n ? \"resolved\"\n : \"open\",\n entries: normalized.entries ?? [],\n createdBy: normalized.createdBy ?? normalized.authorId ?? \"unknown\",\n createdAt: normalized.createdAt,\n resolution: normalized.resolution,\n warningIds: [...(normalized.warningIds ?? [])],\n metadata: normalized.metadata,\n };\n}\n","import { createRangeAnchor } from \"../core/selection/mapping.ts\";\nimport type {\n CanonicalDocumentEnvelope,\n CompatibilityFeatureEntry,\n CompatibilityReport,\n EditorError,\n EditorWarning,\n} from \"../core/state/editor-state.ts\";\nimport type {\n BlockNode,\n DocumentRootNode,\n InlineNode,\n ParagraphNode,\n} from \"../model/canonical-document.ts\";\nimport {\n describeOpaqueFragment,\n listOpaqueFragments,\n listPreservedPackageParts,\n} from \"../preservation/store.ts\";\n\nexport interface BuildCompatibilityReportInput {\n document: CanonicalDocumentEnvelope;\n warnings?: readonly EditorWarning[];\n fatalError?: EditorError;\n generatedAt: string;\n}\n\nexport function buildCompatibilityReport(\n input: BuildCompatibilityReportInput,\n): CompatibilityReport {\n const content = normalizeDocumentRoot(input.document.content);\n const contentFeatures = collectContentFeatures(content);\n if (hasSupportedRuntimeComments(input.document.review.comments)) {\n contentFeatures.push(\n supportedEntry(\n \"comments-single-paragraph\",\n \"Single-paragraph review comments stay mappable through runtime selections.\",\n ),\n );\n }\n const featureEntries: CompatibilityFeatureEntry[] = [\n ...contentFeatures,\n ...collectPreservationFeatures(input.document),\n ];\n const warnings = dedupeWarnings([\n ...(input.warnings ?? []),\n ...collectDiagnosticWarnings(input.document),\n ]);\n const errors = dedupeErrors([\n ...collectDiagnosticErrors(input.document),\n ...(input.fatalError ? [input.fatalError] : []),\n ]);\n\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt: input.generatedAt,\n blockExport:\n featureEntries.some((entry) => entry.featureClass === \"unsupported-fatal\") ||\n errors.some((error) => error.isFatal),\n featureEntries,\n warnings,\n errors,\n };\n}\n\nfunction hasSupportedRuntimeComments(\n comments: CanonicalDocumentEnvelope[\"review\"][\"comments\"],\n): boolean {\n return Object.values(comments).some((comment) => comment.anchor.kind !== \"detached\");\n}\n\nfunction normalizeDocumentRoot(content: unknown): DocumentRootNode {\n if (content && typeof content === \"object\" && (content as { type?: string }).type === \"doc\") {\n return content as DocumentRootNode;\n }\n\n if (Array.isArray(content)) {\n return {\n type: \"doc\",\n children: content.filter(\n (value): value is DocumentRootNode[\"children\"][number] =>\n Boolean(value) &&\n typeof value === \"object\" &&\n ((value as { type?: string }).type === \"paragraph\" ||\n (value as { type?: string }).type === \"opaque_block\"),\n ),\n };\n }\n\n return {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n };\n}\n\nfunction collectContentFeatures(\n content: DocumentRootNode,\n): CompatibilityFeatureEntry[] {\n const flags = {\n paragraphs: false,\n runs: false,\n whitespace: false,\n headings: false,\n lists: false,\n hyperlinks: false,\n images: false,\n tables: false,\n sections: false,\n contentControls: false,\n };\n\n for (let index = 0; index < content.children.length; index += 1) {\n measureBlock(content.children[index], flags);\n }\n\n const entries: CompatibilityFeatureEntry[] = [];\n if (flags.paragraphs) {\n entries.push(supportedEntry(\"paragraphs\", \"Paragraph structure is editable and round-trippable.\"));\n }\n if (flags.runs) {\n entries.push(supportedEntry(\"runs\", \"Runs and inline text are editable through runtime commands.\"));\n }\n if (flags.whitespace) {\n entries.push(supportedEntry(\"whitespace\", \"Whitespace-sensitive text units stay explicit in the runtime model.\"));\n }\n if (flags.headings) {\n entries.push(supportedEntry(\"headings\", \"Heading styles remain attached to paragraph structure.\"));\n }\n if (flags.lists) {\n entries.push(supportedEntry(\"lists\", \"Numbering metadata stays attached to paragraph blocks.\"));\n }\n if (flags.hyperlinks) {\n entries.push(supportedEntry(\"hyperlinks\", \"Hyperlink relationships are preserved and re-serialized.\"));\n }\n if (flags.images) {\n entries.push(supportedEntry(\"inline-images\", \"Inline image placements stay attached to preserved media parts.\"));\n }\n if (flags.tables) {\n entries.push(\n supportedEntry(\n \"tables\",\n \"Structured tables keep cell topology and common visual properties through runtime editing and export.\",\n ),\n );\n }\n if (flags.sections) {\n entries.push(\n supportedEntry(\n \"sections\",\n \"Section boundaries and page-layout properties remain structured and export-safe.\",\n ),\n );\n }\n if (flags.contentControls) {\n entries.push(\n supportedEntry(\n \"content-controls\",\n \"Common content controls render through structured SDT state and round-trip without flattening to opaque placeholders.\",\n ),\n );\n }\n return entries;\n}\n\nfunction measureBlock(\n block: BlockNode,\n flags: {\n paragraphs: boolean;\n runs: boolean;\n whitespace: boolean;\n headings: boolean;\n lists: boolean;\n hyperlinks: boolean;\n images: boolean;\n tables: boolean;\n sections: boolean;\n contentControls: boolean;\n },\n): number {\n switch (block.type) {\n case \"paragraph\":\n flags.paragraphs = true;\n if (block.styleId?.toLowerCase().startsWith(\"heading\")) {\n flags.headings = true;\n }\n if (block.numbering) {\n flags.lists = true;\n }\n return measureParagraph(block, flags);\n case \"table\":\n flags.tables = true;\n return block.rows.reduce(\n (size, row) =>\n size +\n row.cells.reduce(\n (cellSize, cell) =>\n cellSize + cell.children.reduce((childSize, child) => childSize + measureBlock(child, flags), 0),\n 0,\n ),\n 0,\n );\n case \"sdt\":\n flags.contentControls = true;\n return block.children.reduce((size, child) => size + measureBlock(child, flags), 0);\n case \"custom_xml\":\n return block.children.reduce((size, child) => size + measureBlock(child, flags), 0);\n case \"section_break\":\n flags.sections = true;\n return 1;\n default:\n return 0;\n }\n}\n\nfunction measureParagraph(\n paragraph: ParagraphNode,\n flags: {\n paragraphs: boolean;\n runs: boolean;\n whitespace: boolean;\n hyperlinks: boolean;\n images: boolean;\n tables: boolean;\n sections: boolean;\n contentControls: boolean;\n },\n): number {\n let size = 0;\n const children = Array.isArray(paragraph.children) ? paragraph.children : [];\n\n for (const child of children) {\n size += measureInlineNode(child, flags);\n }\n\n return size;\n}\n\nfunction measureInlineNode(\n node: InlineNode,\n flags: {\n paragraphs: boolean;\n runs: boolean;\n whitespace: boolean;\n hyperlinks: boolean;\n images: boolean;\n tables: boolean;\n sections: boolean;\n contentControls: boolean;\n },\n): number {\n switch (node.type) {\n case \"text\":\n flags.runs = flags.runs || node.text.length > 0;\n flags.whitespace =\n flags.whitespace ||\n /^\\s/u.test(node.text) ||\n /\\s$/u.test(node.text) ||\n node.text.includes(\" \");\n return Array.from(node.text).length;\n case \"tab\":\n case \"hard_break\":\n flags.runs = true;\n flags.whitespace = true;\n return 1;\n case \"hyperlink\":\n flags.runs = true;\n flags.hyperlinks = true;\n return node.children.reduce((size, child) => size + measureInlineNode(child, flags), 0);\n case \"image\":\n flags.images = true;\n flags.runs = true;\n return 1;\n case \"opaque_inline\":\n flags.runs = true;\n return 1;\n case \"column_break\":\n case \"symbol\":\n case \"field\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n case \"footnote_ref\":\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n default:\n flags.runs = true;\n return 1;\n }\n}\n\nfunction collectPreservationFeatures(\n document: CanonicalDocumentEnvelope,\n): CompatibilityFeatureEntry[] {\n const entries: CompatibilityFeatureEntry[] = [];\n const structuredSubPartPaths = collectStructuredSubPartPaths(document);\n\n entries.push(...collectSubPartFeatures(document));\n\n for (const fragment of listOpaqueFragments(document.preservation as never)) {\n const descriptor = describeOpaqueFragment(fragment);\n entries.push({\n featureEntryId: `feature:${fragment.fragmentId}`,\n featureKey: descriptor.featureKey,\n featureClass: \"preserve-only\",\n message: descriptor.label,\n affectedAnchor: createRangeAnchor(\n fragment.lastKnownRange.from,\n fragment.lastKnownRange.to,\n ),\n details: {\n fragmentId: fragment.fragmentId,\n warningId: fragment.warningId,\n detail: descriptor.detail,\n },\n });\n }\n\n for (const packagePart of listPreservedPackageParts(document.preservation as never)) {\n if (structuredSubPartPaths.has(packagePart.packagePartName)) {\n continue;\n }\n\n entries.push({\n featureEntryId: `feature:package:${packagePart.packagePartName}`,\n featureKey: \"unknown-package-parts\",\n featureClass: \"preserve-only\",\n message: `Preserved package part ${packagePart.packagePartName}.`,\n details: {\n packagePartName: packagePart.packagePartName,\n contentType: packagePart.contentType,\n relationshipIds: packagePart.relationshipIds,\n },\n });\n }\n\n return entries;\n}\n\nfunction collectStructuredSubPartPaths(\n document: CanonicalDocumentEnvelope,\n): ReadonlySet<string> {\n const subParts = document.subParts;\n if (!subParts) {\n return new Set<string>();\n }\n\n const paths = new Set<string>();\n\n for (const header of subParts.headers ?? []) {\n paths.add(header.partPath);\n }\n\n for (const footer of subParts.footers ?? []) {\n paths.add(footer.partPath);\n }\n\n if (subParts.footnoteCollection) {\n paths.add(\"/word/footnotes.xml\");\n paths.add(\"/word/endnotes.xml\");\n }\n\n if (subParts.theme) {\n paths.add(\"/word/theme/theme1.xml\");\n }\n\n return paths;\n}\n\nfunction collectSubPartFeatures(\n document: CanonicalDocumentEnvelope,\n): CompatibilityFeatureEntry[] {\n const subParts = document.subParts;\n if (!subParts) {\n return [];\n }\n\n const entries: CompatibilityFeatureEntry[] = collectLossySubPartFeatures(subParts);\n const hasHeaderFooterContent = (subParts.headers?.length ?? 0) > 0 || (subParts.footers?.length ?? 0) > 0;\n const noteCount =\n Object.keys(subParts.footnoteCollection?.footnotes ?? {}).length +\n Object.keys(subParts.footnoteCollection?.endnotes ?? {}).length;\n\n if (hasHeaderFooterContent && !entries.some((entry) => entry.featureKey === \"headers-footers-lossy\")) {\n entries.push({\n featureEntryId: \"feature:subparts:headers-footers\",\n featureKey: \"headers-footers\",\n featureClass: \"supported-roundtrip\",\n message: \"Headers and footers resolve as structured secondary stories with export-safe ownership.\",\n details: {\n headerCount: subParts.headers?.length ?? 0,\n footerCount: subParts.footers?.length ?? 0,\n },\n });\n }\n\n if (noteCount > 0 && !entries.some((entry) => entry.featureKey === \"notes-lossy\")) {\n entries.push({\n featureEntryId: \"feature:subparts:notes\",\n featureKey: \"notes\",\n featureClass: \"supported-roundtrip\",\n message: \"Footnotes and endnotes resolve as structured secondary stories with export-safe ownership.\",\n details: {\n footnoteCount: Object.keys(subParts.footnoteCollection?.footnotes ?? {}).length,\n endnoteCount: Object.keys(subParts.footnoteCollection?.endnotes ?? {}).length,\n },\n });\n }\n\n if (subParts.theme) {\n entries.push({\n featureEntryId: \"feature:subparts:theme\",\n featureKey: \"unknown-package-parts\",\n featureClass: \"preserve-only\",\n message: \"Theme metadata is preserved through structured sub-part ownership.\",\n details: {\n surface: \"theme-subpart\",\n themeName: subParts.theme.name,\n },\n });\n }\n\n return entries;\n}\n\nfunction collectLossySubPartFeatures(\n subParts: NonNullable<CanonicalDocumentEnvelope[\"subParts\"]>,\n): CompatibilityFeatureEntry[] {\n const entries: CompatibilityFeatureEntry[] = [];\n\n const headerFooterLossy = [\n ...(subParts.headers ?? []).flatMap((header) =>\n collectLossyBlocks(header.blocks, `header:${header.partPath}`),\n ),\n ...(subParts.footers ?? []).flatMap((footer) =>\n collectLossyBlocks(footer.blocks, `footer:${footer.partPath}`),\n ),\n ];\n if (headerFooterLossy.length > 0) {\n entries.push({\n featureEntryId: \"feature:subparts:headers-footers-lossy\",\n featureKey: \"headers-footers-lossy\",\n featureClass: \"unsupported-fatal\",\n message: \"Headers or footers contain content the current sub-part serializer cannot re-emit safely.\",\n details: {\n issues: headerFooterLossy,\n },\n });\n }\n\n const noteLossy = [\n ...Object.values(subParts.footnoteCollection?.footnotes ?? {}).flatMap((note) =>\n collectLossyBlocks(note.blocks, `footnote:${note.noteId}`),\n ),\n ...Object.values(subParts.footnoteCollection?.endnotes ?? {}).flatMap((note) =>\n collectLossyBlocks(note.blocks, `endnote:${note.noteId}`),\n ),\n ];\n if (noteLossy.length > 0) {\n entries.push({\n featureEntryId: \"feature:subparts:notes-lossy\",\n featureKey: \"notes-lossy\",\n featureClass: \"unsupported-fatal\",\n message: \"Footnotes or endnotes contain content the current sub-part serializer cannot re-emit safely.\",\n details: {\n issues: noteLossy,\n },\n });\n }\n\n return entries;\n}\n\nfunction collectLossyBlocks(\n blocks: readonly BlockNode[],\n surface: string,\n): string[] {\n const issues: string[] = [];\n\n for (const block of blocks) {\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n issues.push(...collectLossyBlocks(cell.children, `${surface}:table-cell`));\n }\n }\n continue;\n }\n\n if (block.type !== \"paragraph\") {\n issues.push(`${surface}:${block.type}`);\n continue;\n }\n\n if (\n block.numbering !== undefined ||\n block.keepNext !== undefined ||\n block.keepLines !== undefined ||\n block.outlineLevel !== undefined ||\n block.pageBreakBefore !== undefined ||\n block.widowControl !== undefined ||\n block.borders !== undefined ||\n block.shading !== undefined ||\n block.bidi !== undefined ||\n block.suppressLineNumbers !== undefined ||\n block.cnfStyle !== undefined\n ) {\n issues.push(`${surface}:paragraph-properties`);\n }\n\n for (const child of block.children) {\n issues.push(...collectLossyInlineContent(child, surface));\n }\n }\n\n return [...new Set(issues)];\n}\n\nfunction collectLossyInlineContent(\n node: InlineNode,\n surface: string,\n): string[] {\n switch (node.type) {\n case \"text\": {\n const allowSecondaryStoryColorMarks =\n surface.startsWith(\"header:\") || surface.startsWith(\"footer:\");\n const unsupportedMarks = (node.marks ?? [])\n .filter(\n (mark) =>\n mark.type !== \"bold\" &&\n mark.type !== \"italic\" &&\n mark.type !== \"underline\" &&\n mark.type !== \"strikethrough\" &&\n mark.type !== \"doubleStrikethrough\" &&\n mark.type !== \"fontFamily\" &&\n mark.type !== \"fontSize\" &&\n mark.type !== \"textColor\" &&\n (!allowSecondaryStoryColorMarks || mark.type !== \"backgroundColor\") &&\n (!allowSecondaryStoryColorMarks || mark.type !== \"highlight\") &&\n mark.type !== \"smallCaps\" &&\n mark.type !== \"allCaps\",\n )\n .map((mark) => `${surface}:mark:${mark.type}`);\n return unsupportedMarks;\n }\n case \"tab\":\n case \"hard_break\":\n case \"footnote_ref\":\n case \"field\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n case \"chart_preview\":\n case \"smartart_preview\":\n return [];\n default:\n return [`${surface}:${node.type}`];\n }\n}\n\nfunction collectDiagnosticWarnings(\n document: CanonicalDocumentEnvelope,\n): EditorWarning[] {\n const diagnostics = Array.isArray(document.diagnostics?.warnings)\n ? document.diagnostics.warnings\n : [];\n\n return diagnostics.map((warning) => ({\n warningId: warning.warningId,\n code:\n warning.source === \"validation\" || warning.source === \"export\"\n ? \"export_roundtrip_risk\"\n : warning.source === \"preservation\"\n ? \"unsupported_ooxml_preserved\"\n : \"import_normalized\",\n severity: \"warning\",\n message: warning.message,\n source: warning.source,\n }));\n}\n\nfunction collectDiagnosticErrors(\n document: CanonicalDocumentEnvelope,\n): EditorError[] {\n const diagnostics = Array.isArray(document.diagnostics?.errors)\n ? document.diagnostics.errors\n : [];\n\n return diagnostics.map((error) => ({\n errorId: error.diagnosticId,\n code:\n error.code === \"load_failed\"\n ? \"import_failed\"\n : error.code,\n message: error.message,\n isFatal: error.isFatal,\n source: error.source,\n }));\n}\n\nfunction supportedEntry(\n featureKey: CompatibilityFeatureEntry[\"featureKey\"],\n message: string,\n): CompatibilityFeatureEntry {\n return {\n featureEntryId: `feature:${featureKey}`,\n featureKey,\n featureClass: \"supported-roundtrip\",\n message,\n };\n}\n\nfunction dedupeWarnings(warnings: EditorWarning[]): EditorWarning[] {\n const byId = new Map<string, EditorWarning>();\n\n for (const warning of warnings) {\n byId.set(warning.warningId, warning);\n }\n\n return [...byId.values()];\n}\n\nfunction dedupeErrors(errors: EditorError[]): EditorError[] {\n const byId = new Map<string, EditorError>();\n\n for (const error of errors) {\n byId.set(error.errorId, error);\n }\n\n return [...byId.values()];\n}\n","export const COMPATIBILITY_FEATURE_CLASSES = [\n \"supported-roundtrip\",\n \"preserve-only\",\n \"unsupported-fatal\",\n] as const;\n\nexport type CompatibilityFeatureClass =\n (typeof COMPATIBILITY_FEATURE_CLASSES)[number];\n\nexport const EDITOR_WARNING_CODES = [\n \"unsupported_ooxml_preserved\",\n \"unsupported_ooxml_locked\",\n \"import_normalized\",\n \"export_roundtrip_risk\",\n \"comment_anchor_detached\",\n \"revision_anchor_detached\",\n \"large_document_degraded\",\n \"font_substitution\",\n \"image_missing\",\n] as const;\n\nexport type EditorWarningCode = (typeof EDITOR_WARNING_CODES)[number];\n\nexport const EDITOR_WARNING_SOURCES = [\n \"import\",\n \"runtime\",\n \"review\",\n \"preservation\",\n \"validation\",\n \"export\",\n] as const;\n\nexport type EditorWarningSource = (typeof EDITOR_WARNING_SOURCES)[number];\n\nexport const EDITOR_ERROR_CODES = [\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n \"datastore_failed\",\n \"internal_invariant\",\n] as const;\n\nexport type EditorErrorCode = (typeof EDITOR_ERROR_CODES)[number];\n\nexport const EDITOR_ERROR_SOURCES = [\n \"import\",\n \"runtime\",\n \"validation\",\n \"datastore\",\n \"host\",\n \"export\",\n] as const;\n\nexport type EditorErrorSource = (typeof EDITOR_ERROR_SOURCES)[number];\n\nexport type EditorAnchorProjection =\n | {\n kind: \"range\";\n from: number;\n to: number;\n assoc: {\n start: -1 | 1;\n end: -1 | 1;\n };\n }\n | {\n kind: \"node\";\n at: number;\n assoc: -1 | 1;\n }\n | {\n kind: \"detached\";\n lastKnownRange: {\n from: number;\n to: number;\n };\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n };\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source: EditorWarningSource;\n affectedAnchor?: EditorAnchorProjection;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface EditorError {\n errorId: string;\n code: EditorErrorCode;\n message: string;\n isFatal: boolean;\n source: EditorErrorSource;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityFeatureEntry<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> {\n featureEntryId: string;\n featureKey: FeatureKey;\n featureClass: FeatureClass;\n message: string;\n affectedAnchor?: EditorAnchorProjection;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityDiagnostics<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> {\n featureEntries: readonly CompatibilityFeatureEntry<FeatureKey, FeatureClass>[];\n warnings: readonly EditorWarning[];\n errors: readonly EditorError[];\n}\n\nconst EXPORT_BLOCKING_ERROR_CODES = new Set<EditorErrorCode>([\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n]);\n\nexport function isCompatibilityFeatureClass(\n value: string,\n): value is CompatibilityFeatureClass {\n return COMPATIBILITY_FEATURE_CLASSES.includes(\n value as CompatibilityFeatureClass,\n );\n}\n\nexport function isEditorWarningCode(value: string): value is EditorWarningCode {\n return EDITOR_WARNING_CODES.includes(value as EditorWarningCode);\n}\n\nexport function isEditorErrorCode(value: string): value is EditorErrorCode {\n return EDITOR_ERROR_CODES.includes(value as EditorErrorCode);\n}\n\nexport function createDiagnostics<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n input: Partial<CompatibilityDiagnostics<FeatureKey, FeatureClass>> = {},\n): CompatibilityDiagnostics<FeatureKey, FeatureClass> {\n return {\n featureEntries: freezeArray(input.featureEntries ?? []),\n warnings: freezeArray(input.warnings ?? []),\n errors: freezeArray(input.errors ?? []),\n };\n}\n\nexport function collectWarningIds(warnings: readonly EditorWarning[]): string[] {\n return warnings.map((warning) => warning.warningId);\n}\n\nexport function summarizeFeatureClasses<\n FeatureKey extends string,\n FeatureClass extends CompatibilityFeatureClass,\n>(\n featureEntries: readonly CompatibilityFeatureEntry<FeatureKey, FeatureClass>[],\n): Record<CompatibilityFeatureClass, number> {\n return featureEntries.reduce<Record<CompatibilityFeatureClass, number>>(\n (counts, entry) => {\n counts[entry.featureClass] += 1;\n return counts;\n },\n {\n \"supported-roundtrip\": 0,\n \"preserve-only\": 0,\n \"unsupported-fatal\": 0,\n },\n );\n}\n\nexport function diagnosticsBlockExport<\n FeatureKey extends string,\n FeatureClass extends CompatibilityFeatureClass,\n>(\n diagnostics: CompatibilityDiagnostics<FeatureKey, FeatureClass>,\n explicitBlockExport = false,\n): boolean {\n if (explicitBlockExport) {\n return true;\n }\n\n return (\n diagnostics.featureEntries.some(\n (entry) => entry.featureClass === \"unsupported-fatal\",\n ) ||\n diagnostics.errors.some(\n (error) => error.isFatal || EXPORT_BLOCKING_ERROR_CODES.has(error.code),\n )\n );\n}\n\nfunction freezeArray<Value>(items: readonly Value[]): readonly Value[] {\n return Object.freeze([...items]);\n}\n","import {\n type CompatibilityDiagnostics,\n type CompatibilityFeatureClass,\n type CompatibilityFeatureEntry,\n type EditorError,\n type EditorWarning,\n createDiagnostics,\n diagnosticsBlockExport,\n summarizeFeatureClasses,\n} from \"./diagnostics.ts\";\n\nexport const COMPATIBILITY_REPORT_VERSION = \"compatibility-report/1\" as const;\n\nexport const COMPATIBILITY_FEATURE_KEYS = [\n \"paragraphs\",\n \"runs\",\n \"whitespace\",\n \"headings\",\n \"lists\",\n \"restart-numbering\",\n \"tables\",\n \"merged-cells\",\n \"inline-images\",\n \"hyperlinks\",\n \"comments-single-paragraph\",\n \"comment-threads\",\n \"tracked-insertions\",\n \"tracked-deletions\",\n \"comments-multi-paragraph-ranges\",\n \"tracked-moves\",\n \"formatting-revisions\",\n \"structural-revisions\",\n \"sections\",\n \"headers-footers\",\n \"notes\",\n \"fields\",\n \"content-controls\",\n \"custom-xml\",\n \"alt-chunk\",\n \"embedded-objects\",\n \"floating-drawings\",\n \"alternate-content\",\n \"unknown-ooxml\",\n \"unknown-package-parts\",\n \"package-integrity\",\n \"relationship-integrity\",\n \"workflow-scopes\",\n] as const;\n\nexport type CompatibilityFeatureKey =\n (typeof COMPATIBILITY_FEATURE_KEYS)[number];\n\nexport interface CompatibilityReport<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> extends CompatibilityDiagnostics<FeatureKey, FeatureClass> {\n reportVersion: typeof COMPATIBILITY_REPORT_VERSION;\n generatedAt: string;\n blockExport: boolean;\n}\n\nexport interface CreateCompatibilityReportInput<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> extends Partial<CompatibilityDiagnostics<FeatureKey, FeatureClass>> {\n generatedAt: string;\n blockExport?: boolean;\n}\n\nexport interface CompatibilityReportSummary {\n generatedAt: string;\n blockExport: boolean;\n featureClassCounts: Record<CompatibilityFeatureClass, number>;\n warningCount: number;\n errorCount: number;\n}\n\nexport function createCompatibilityReport<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n input: CreateCompatibilityReportInput<FeatureKey, FeatureClass>,\n): CompatibilityReport<FeatureKey, FeatureClass> {\n const diagnostics = createDiagnostics(input);\n\n return Object.freeze({\n reportVersion: COMPATIBILITY_REPORT_VERSION,\n generatedAt: input.generatedAt,\n blockExport: diagnosticsBlockExport(diagnostics, input.blockExport),\n featureEntries: diagnostics.featureEntries,\n warnings: diagnostics.warnings,\n errors: diagnostics.errors,\n });\n}\n\nexport function mergeCompatibilityReports<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n reports: readonly CompatibilityReport<FeatureKey, FeatureClass>[],\n options: {\n generatedAt: string;\n blockExport?: boolean;\n },\n): CompatibilityReport<FeatureKey, FeatureClass> {\n return createCompatibilityReport({\n generatedAt: options.generatedAt,\n blockExport:\n options.blockExport ?? reports.some((report) => report.blockExport),\n featureEntries: flattenUnique(reports.flatMap((report) => report.featureEntries)),\n warnings: flattenUnique(reports.flatMap((report) => report.warnings)),\n errors: flattenUnique(reports.flatMap((report) => report.errors)),\n });\n}\n\nexport function summarizeCompatibilityReport<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n report: CompatibilityReport<FeatureKey, FeatureClass>,\n): CompatibilityReportSummary {\n return {\n generatedAt: report.generatedAt,\n blockExport: report.blockExport,\n featureClassCounts: summarizeFeatureClasses(report.featureEntries),\n warningCount: report.warnings.length,\n errorCount: report.errors.length,\n };\n}\n\nexport function findFeatureEntry<\n FeatureKey extends string = CompatibilityFeatureKey,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n report: CompatibilityReport<FeatureKey, FeatureClass>,\n featureEntryId: string,\n): CompatibilityFeatureEntry<FeatureKey, FeatureClass> | undefined {\n return report.featureEntries.find(\n (featureEntry) => featureEntry.featureEntryId === featureEntryId,\n );\n}\n\nexport type {\n CompatibilityDiagnostics,\n CompatibilityFeatureClass,\n CompatibilityFeatureEntry,\n EditorError,\n EditorWarning,\n} from \"./diagnostics.ts\";\n\nfunction flattenUnique<Value extends object>(\n items: readonly Value[],\n): readonly Value[] {\n const deduped = new Map<string, Value>();\n\n for (const item of items) {\n deduped.set(JSON.stringify(item), item);\n }\n\n return Object.freeze([...deduped.values()]);\n}\n","import type {\n EditorStoryTarget,\n SearchOptions as PublicSearchOptions,\n SecondaryStorySurface,\n SurfaceBlockSnapshot,\n WorkflowCandidateRange,\n} from \"../../api/public-types\";\n\nexport interface SearchTextOptions extends PublicSearchOptions {\n caseSensitive?: boolean;\n regex?: boolean;\n}\n\nexport interface SearchResult {\n from: number;\n to: number;\n text: string;\n index: number;\n}\n\nexport interface SurfaceSearchResult extends SearchResult {\n excerpt: string;\n}\n\nexport interface SecondaryStorySearchResult extends SurfaceSearchResult {\n storyTarget: EditorStoryTarget;\n}\n\ninterface ProjectedSurfaceText {\n text: string;\n offsetMap: Array<number | null>;\n}\n\ninterface SurfaceProjectionBuilder {\n text: string[];\n offsetMap: Array<number | null>;\n nextRuntimeOffset: number;\n}\n\nexport function buildSearchPattern(\n query: string,\n options: SearchTextOptions = {},\n): RegExp | null {\n if (!query) {\n return null;\n }\n\n const caseSensitive = options.matchCase ?? options.caseSensitive ?? false;\n const regex = options.regex ?? false;\n const wholeWord = options.wholeWord ?? false;\n\n try {\n const source = regex\n ? query\n : query.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const wrapped = wholeWord ? `\\\\b${source}\\\\b` : source;\n return new RegExp(wrapped, caseSensitive ? \"g\" : \"gi\");\n } catch {\n return null;\n }\n}\n\nexport function findSearchMatches(\n text: string,\n query: string,\n options: SearchTextOptions = {},\n): SearchResult[] {\n const pattern = buildSearchPattern(query, options);\n if (!pattern) return [];\n\n const results: SearchResult[] = [];\n let match: RegExpExecArray | null;\n pattern.lastIndex = 0;\n while ((match = pattern.exec(text)) !== null) {\n results.push({\n from: match.index,\n to: match.index + match[0].length,\n text: match[0],\n index: results.length,\n });\n\n if (match[0].length === 0) {\n pattern.lastIndex += 1;\n }\n }\n\n return results;\n}\n\nexport function createSearchExcerpt(\n text: string,\n from: number,\n to: number,\n radius = 24,\n): string {\n const safeFrom = Math.max(0, Math.min(from, text.length));\n const safeTo = Math.max(safeFrom, Math.min(to, text.length));\n const start = Math.max(0, safeFrom - radius);\n const end = Math.min(text.length, safeTo + radius);\n const prefix = start > 0 ? \"…\" : \"\";\n const suffix = end < text.length ? \"…\" : \"\";\n const excerpt = text\n .slice(start, end)\n .replace(/[\\uFFF9\\uFFFA]/gu, \"\")\n .replace(/\\s{2,}/gu, \" \")\n .trim();\n return `${prefix}${excerpt}${suffix}`;\n}\n\nexport function searchSurfaceBlocks(\n blocks: readonly SurfaceBlockSnapshot[],\n query: string,\n options: SearchTextOptions = {},\n): SurfaceSearchResult[] {\n const projection = projectSurfaceText(blocks);\n return findSearchMatches(projection.text, query, options)\n .map((match) => {\n const range = resolveProjectedRuntimeRange(\n projection.offsetMap,\n match.from,\n match.to,\n );\n if (!range) {\n return null;\n }\n\n return {\n ...match,\n from: range.from,\n to: range.to,\n excerpt: createSearchExcerpt(projection.text, match.from, match.to),\n };\n })\n .filter((match): match is SurfaceSearchResult => Boolean(match));\n}\n\nexport function searchSecondaryStories(\n stories: readonly SecondaryStorySurface[],\n query: string,\n options: SearchTextOptions = {},\n): SecondaryStorySearchResult[] {\n const results: SecondaryStorySearchResult[] = [];\n\n for (const story of stories) {\n for (const match of searchSurfaceBlocks(story.blocks, query, options)) {\n results.push({\n storyTarget: story.target,\n from: match.from,\n to: match.to,\n text: match.text,\n index: results.length,\n excerpt: match.excerpt,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Derive workflow candidate ranges from search results.\n *\n * Maps search hits into `WorkflowCandidateRange` values suitable for\n * inclusion in a host-fed `WorkflowOverlay`. The runtime search results\n * supply runtime-mapped `from`/`to` positions that align with the\n * canonical document model.\n */\nexport function deriveCandidateRangesFromSearch(\n results: readonly SurfaceSearchResult[],\n storyTarget?: EditorStoryTarget,\n source: WorkflowCandidateRange[\"source\"] = \"search\",\n): WorkflowCandidateRange[] {\n return results.map((result, index) => ({\n candidateId: `search-candidate-${index}`,\n storyTarget,\n anchor: {\n kind: \"range\" as const,\n from: result.from,\n to: result.to,\n assoc: { start: 1 as const, end: -1 as const },\n },\n label: result.excerpt,\n source,\n }));\n}\n\nexport function projectSurfaceText(\n blocks: readonly SurfaceBlockSnapshot[],\n): ProjectedSurfaceText {\n const builder: SurfaceProjectionBuilder = {\n text: [],\n offsetMap: [],\n nextRuntimeOffset: 0,\n };\n\n appendSurfaceBlocks(builder, blocks);\n\n return {\n text: builder.text.join(\"\"),\n offsetMap: builder.offsetMap,\n };\n}\n\nfunction appendSurfaceBlocks(\n builder: SurfaceProjectionBuilder,\n blocks: readonly SurfaceBlockSnapshot[],\n): void {\n for (const block of blocks) {\n if (block.kind === \"opaque_block\") {\n if (block.fragmentId.startsWith(\"preview:\")) {\n continue;\n }\n appendAtomicSpan(builder, block.from, block.to, \"\\uFFFA\");\n continue;\n }\n\n if (block.kind === \"table\") {\n appendRuntimeGap(builder, block.from);\n for (const [rowIndex, row] of block.rows.entries()) {\n if (rowIndex > 0) {\n appendSyntheticSeparator(builder, \"\\n\");\n }\n for (const [cellIndex, cell] of row.cells.entries()) {\n if (cellIndex > 0) {\n appendSyntheticSeparator(builder, \"\\t\");\n }\n appendSurfaceBlocks(builder, cell.content);\n }\n }\n appendRuntimeGap(builder, block.to);\n continue;\n }\n\n if (block.kind === \"sdt_block\") {\n appendRuntimeGap(builder, block.from);\n appendSurfaceBlocks(builder, block.children);\n appendRuntimeGap(builder, block.to);\n continue;\n }\n\n for (const segment of block.segments) {\n switch (segment.kind) {\n case \"text\":\n appendTextSpan(builder, segment.text, segment.from);\n break;\n case \"tab\":\n appendAtomicSpan(builder, segment.from, segment.to, \"\\t\");\n break;\n case \"hard_break\":\n appendAtomicSpan(builder, segment.from, segment.to, \"\\n\");\n break;\n case \"image\":\n appendAtomicSpan(builder, segment.from, segment.to, \"\\uFFFC\");\n break;\n case \"opaque_inline\":\n appendAtomicSpan(builder, segment.from, segment.to, \"\\uFFF9\");\n break;\n case \"note_ref\":\n appendAtomicSpan(builder, segment.from, segment.to, \"\\uFFFA\");\n break;\n }\n }\n\n appendRuntimeGap(builder, block.to);\n }\n}\n\nfunction appendTextSpan(\n builder: SurfaceProjectionBuilder,\n text: string,\n startOffset: number,\n): void {\n appendRuntimeGap(builder, startOffset);\n\n for (let index = 0; index < text.length; index += 1) {\n builder.text.push(text[index]!);\n builder.offsetMap.push(startOffset + index);\n }\n\n builder.nextRuntimeOffset = Math.max(\n builder.nextRuntimeOffset,\n startOffset + text.length,\n );\n}\n\nfunction appendAtomicSpan(\n builder: SurfaceProjectionBuilder,\n from: number,\n to: number,\n char: string,\n): void {\n appendRuntimeGap(builder, from);\n const width = Math.max(1, to - from);\n\n for (let index = 0; index < width; index += 1) {\n builder.text.push(char);\n builder.offsetMap.push(from + index);\n }\n\n builder.nextRuntimeOffset = Math.max(builder.nextRuntimeOffset, to);\n}\n\nfunction appendRuntimeGap(\n builder: SurfaceProjectionBuilder,\n nextFrom: number,\n): void {\n for (\n let offset = builder.nextRuntimeOffset;\n offset < nextFrom;\n offset += 1\n ) {\n builder.text.push(\"\\n\");\n builder.offsetMap.push(offset);\n }\n\n builder.nextRuntimeOffset = Math.max(builder.nextRuntimeOffset, nextFrom);\n}\n\nfunction appendSyntheticSeparator(\n builder: SurfaceProjectionBuilder,\n value: string,\n): void {\n for (const char of value) {\n builder.text.push(char);\n builder.offsetMap.push(null);\n }\n}\n\nfunction resolveProjectedRuntimeRange(\n offsetMap: ReadonlyArray<number | null>,\n from: number,\n to: number,\n): { from: number; to: number } | null {\n let runtimeFrom: number | undefined;\n for (let index = from; index < to; index += 1) {\n const offset = offsetMap[index];\n if (offset !== null && offset !== undefined) {\n runtimeFrom = offset;\n break;\n }\n }\n\n let runtimeTo: number | undefined;\n for (let index = to - 1; index >= from; index -= 1) {\n const offset = offsetMap[index];\n if (offset !== null && offset !== undefined) {\n runtimeTo = offset + 1;\n break;\n }\n }\n\n if (runtimeFrom === undefined || runtimeTo === undefined) {\n return null;\n }\n\n return { from: runtimeFrom, to: runtimeTo };\n}\n","import type {\n CommentSidebarSnapshot,\n EditorAnchorProjection,\n EditorStoryTarget,\n FieldSnapshot,\n ProtectionSnapshot,\n RuntimeRenderSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n TrackedChangesSnapshot,\n WorkflowCandidateRange,\n WorkflowCandidateRangeOptions,\n WorkflowFieldMarkup,\n WorkflowHighlightMarkup,\n WorkflowMarkupItem,\n WorkflowMarkupSnapshot,\n WorkflowOpaqueFragmentMarkup,\n WorkflowProtectedRangeMarkup,\n WorkflowRevisionMarkup,\n WorkflowCommentMarkup,\n} from \"../api/public-types\";\nimport { MAIN_STORY_TARGET } from \"../core/selection/mapping.ts\";\nimport { searchSurfaceBlocks } from \"../core/search/search-text.ts\";\nimport { describeOpaqueFragment } from \"../preservation/store.ts\";\nimport type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\n\nconst BLOCKED_IMPORT_FEATURE_KEYS = new Set([\"alt-chunk\", \"alternate-content\", \"custom-xml\"]);\n\nexport function collectWorkflowMarkupSnapshot(input: {\n renderSnapshot: RuntimeRenderSnapshot;\n fieldSnapshot: FieldSnapshot;\n protectionSnapshot: ProtectionSnapshot;\n preservation: CanonicalDocumentEnvelope[\"preservation\"];\n}): WorkflowMarkupSnapshot {\n const highlights: WorkflowHighlightMarkup[] = [];\n const fields: WorkflowFieldMarkup[] = [];\n const opaqueFragments: WorkflowOpaqueFragmentMarkup[] = [];\n const surface = input.renderSnapshot.surface;\n\n if (surface) {\n collectSurfaceMarkup(\n surface.blocks,\n MAIN_STORY_TARGET,\n input.preservation,\n highlights,\n opaqueFragments,\n );\n for (const story of surface.secondaryStories) {\n collectSurfaceMarkup(\n story.blocks,\n story.target,\n input.preservation,\n highlights,\n opaqueFragments,\n );\n }\n\n fields.push(...collectFieldMarkup(surface, input.fieldSnapshot));\n }\n opaqueFragments.push(...collectOpaqueFragmentMarkup(input.preservation, opaqueFragments));\n\n const comments = input.renderSnapshot.comments.threads.map((thread): WorkflowCommentMarkup => ({\n markupId: `comment:${thread.commentId}`,\n kind: \"comment\",\n commentId: thread.commentId,\n anchor: thread.anchor,\n label: thread.anchorLabel,\n excerpt: thread.excerpt,\n status: thread.status,\n warningCount: thread.warningCount,\n entryCount: thread.entryCount,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n }));\n\n const revisions = input.renderSnapshot.trackedChanges.revisions.map(\n (revision): WorkflowRevisionMarkup => ({\n markupId: `revision:${revision.revisionId}`,\n kind: \"revision\",\n revisionId: revision.revisionId,\n revisionKind: revision.kind,\n anchor: revision.anchor,\n label: revision.label,\n excerpt: revision.excerpt,\n status: revision.status,\n actionability: revision.actionability,\n authorId: revision.authorId,\n createdAt: revision.createdAt,\n preserveOnlyReason: revision.preserveOnlyReason,\n }),\n );\n\n const protectedRanges = input.protectionSnapshot.ranges\n .filter(\n (range): range is typeof range & { start: number; end: number } =>\n typeof range.start === \"number\" && typeof range.end === \"number\",\n )\n .map(\n (range): WorkflowProtectedRangeMarkup => ({\n markupId: `protected-range:${range.rangeId}`,\n kind: \"protected_range\",\n rangeId: range.rangeId,\n anchor: createRangeAnchor(range.start, range.end),\n storyTarget: MAIN_STORY_TARGET,\n label: `Protected range ${range.rangeId}`,\n excerpt: range.enforcementReason,\n enforced: range.enforced,\n enforcementReason: range.enforcementReason,\n editorGroup: range.editorGroup,\n editor: range.editor,\n }),\n );\n\n const items: WorkflowMarkupItem[] = [\n ...highlights,\n ...comments,\n ...revisions,\n ...fields,\n ...protectedRanges,\n ...opaqueFragments,\n ];\n\n return {\n totalCount: items.length,\n items,\n highlights,\n comments,\n revisions,\n fields,\n protectedRanges,\n opaqueFragments,\n };\n}\n\nexport function deriveWorkflowCandidateRangesFromMarkup(\n snapshot: WorkflowMarkupSnapshot,\n options: WorkflowCandidateRangeOptions = {},\n): WorkflowCandidateRange[] {\n const allowedKinds = options.kinds ? new Set(options.kinds) : null;\n const includeDetached = options.includeDetached === true;\n\n return snapshot.items\n .filter((item) => (allowedKinds ? allowedKinds.has(item.kind) : true))\n .filter((item) => includeDetached || item.anchor.kind !== \"detached\")\n .map(\n (item): WorkflowCandidateRange => ({\n candidateId: item.markupId,\n storyTarget: item.storyTarget,\n anchor: item.anchor,\n label: item.label,\n source: options.source ?? \"host\",\n }),\n );\n}\n\nfunction collectSurfaceMarkup(\n blocks: readonly SurfaceBlockSnapshot[],\n storyTarget: EditorStoryTarget,\n preservation: CanonicalDocumentEnvelope[\"preservation\"],\n highlights: WorkflowHighlightMarkup[],\n opaqueFragments: WorkflowOpaqueFragmentMarkup[],\n): void {\n for (const block of blocks) {\n if (block.kind === \"paragraph\") {\n for (const segment of block.segments) {\n collectSegmentMarkup(segment, storyTarget, preservation, highlights, opaqueFragments);\n }\n continue;\n }\n\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n collectSurfaceMarkup(cell.content, storyTarget, preservation, highlights, opaqueFragments);\n }\n }\n continue;\n }\n\n if (block.kind === \"sdt_block\") {\n collectSurfaceMarkup(block.children, storyTarget, preservation, highlights, opaqueFragments);\n continue;\n }\n\n const fragment = preservation.opaqueFragments[block.fragmentId];\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n const blockedReasonCode =\n fragment && BLOCKED_IMPORT_FEATURE_KEYS.has(descriptor?.featureKey ?? \"\")\n ? \"workflow_blocked_import\"\n : \"workflow_preserve_only\";\n opaqueFragments.push({\n markupId: `opaque:${block.fragmentId}`,\n kind: \"opaque_fragment\",\n fragmentId: block.fragmentId,\n warningId: block.warningId,\n anchor: createRangeAnchor(block.from, block.to),\n storyTarget,\n label: block.label,\n excerpt: block.detail,\n detail: block.detail,\n blockedReasonCode,\n });\n }\n}\n\nfunction collectSegmentMarkup(\n segment: SurfaceInlineSegment,\n storyTarget: EditorStoryTarget,\n preservation: CanonicalDocumentEnvelope[\"preservation\"],\n highlights: WorkflowHighlightMarkup[],\n opaqueFragments: WorkflowOpaqueFragmentMarkup[],\n): void {\n if (segment.kind === \"text\" && segment.markAttrs?.backgroundColor) {\n highlights.push({\n markupId: `highlight:${storyTargetKey(storyTarget)}:${segment.from}:${segment.to}:${segment.markAttrs.backgroundColor}`,\n kind: \"highlight\",\n anchor: createRangeAnchor(segment.from, segment.to),\n storyTarget,\n label: `Highlight ${segment.markAttrs.backgroundColor}`,\n excerpt: segment.text,\n color: segment.markAttrs.backgroundColor,\n text: segment.text,\n });\n return;\n }\n\n if (segment.kind === \"opaque_inline\") {\n const fragment = preservation.opaqueFragments[segment.fragmentId];\n const descriptor = fragment ? describeOpaqueFragment(fragment) : null;\n const blockedReasonCode =\n fragment && BLOCKED_IMPORT_FEATURE_KEYS.has(descriptor?.featureKey ?? \"\")\n ? \"workflow_blocked_import\"\n : \"workflow_preserve_only\";\n opaqueFragments.push({\n markupId: `opaque:${segment.fragmentId}`,\n kind: \"opaque_fragment\",\n fragmentId: segment.fragmentId,\n warningId: segment.warningId,\n anchor: createRangeAnchor(segment.from, segment.to),\n storyTarget,\n label: segment.label,\n excerpt: segment.detail,\n detail: segment.detail,\n blockedReasonCode,\n });\n }\n}\n\nfunction collectFieldMarkup(\n surface: RuntimeRenderSnapshot[\"surface\"],\n fieldSnapshot: FieldSnapshot,\n): WorkflowFieldMarkup[] {\n if (!surface) {\n return [];\n }\n\n const stories = [\n { blocks: surface.blocks, storyTarget: MAIN_STORY_TARGET },\n ...surface.secondaryStories.map((story) => ({\n blocks: story.blocks,\n storyTarget: story.target,\n })),\n ];\n\n return fieldSnapshot.fields.flatMap((field) => {\n const displayText = field.displayText.trim();\n if (!displayText) {\n return [];\n }\n\n for (const story of stories) {\n const matches = searchSurfaceBlocks(story.blocks, displayText, { limit: 2 });\n if (matches.length === 1) {\n const match = matches[0]!;\n return [\n {\n markupId: `field:${field.index}`,\n kind: \"field\",\n anchor: createRangeAnchor(match.from, match.to),\n storyTarget: story.storyTarget,\n label: displayText,\n excerpt: field.instruction,\n fieldIndex: field.index,\n fieldFamily: field.fieldFamily,\n fieldTarget: field.fieldTarget,\n refreshStatus: field.refreshStatus,\n displayText: field.displayText,\n } satisfies WorkflowFieldMarkup,\n ];\n }\n }\n\n return [];\n });\n}\n\nfunction collectOpaqueFragmentMarkup(\n preservation: CanonicalDocumentEnvelope[\"preservation\"],\n existing: WorkflowOpaqueFragmentMarkup[],\n): WorkflowOpaqueFragmentMarkup[] {\n const seen = new Set(existing.map((item) => item.fragmentId));\n\n return Object.values(preservation.opaqueFragments)\n .filter(\n (fragment) =>\n !seen.has(fragment.fragmentId)\n && fragment.packagePartName === \"/word/document.xml\",\n )\n .map((fragment) => {\n const descriptor = describeOpaqueFragment(fragment);\n const blockedReasonCode = BLOCKED_IMPORT_FEATURE_KEYS.has(descriptor.featureKey)\n ? \"workflow_blocked_import\"\n : \"workflow_preserve_only\";\n\n return {\n markupId: `opaque:${fragment.fragmentId}`,\n kind: \"opaque_fragment\",\n fragmentId: fragment.fragmentId,\n warningId: fragment.warningId,\n anchor: createRangeAnchor(fragment.lastKnownRange.from, fragment.lastKnownRange.to),\n storyTarget: MAIN_STORY_TARGET,\n label: descriptor.label,\n excerpt: descriptor.detail,\n detail: descriptor.detail,\n blockedReasonCode,\n } satisfies WorkflowOpaqueFragmentMarkup;\n });\n}\n\nfunction createRangeAnchor(from: number, to: number): EditorAnchorProjection {\n return {\n kind: \"range\",\n from,\n to,\n assoc: {\n start: -1,\n end: 1,\n },\n };\n}\n\nfunction storyTargetKey(storyTarget: EditorStoryTarget): string {\n switch (storyTarget.kind) {\n case \"main\":\n return \"main\";\n case \"header\":\n case \"footer\":\n return `${storyTarget.kind}:${storyTarget.relationshipId}:${storyTarget.variant}:${storyTarget.sectionIndex ?? \"none\"}`;\n case \"footnote\":\n case \"endnote\":\n return `${storyTarget.kind}:${storyTarget.noteId}`;\n }\n}\n","import type {\n PageLayoutSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n} from \"../api/public-types\";\n\nconst DEFAULT_FONT_SIZE_POINTS = 12;\nconst DEFAULT_LINE_HEIGHT_TWIPS = 280;\nconst MIN_BLOCK_HEIGHT_TWIPS = 240;\nconst TABLE_ROW_PADDING_TWIPS = 120;\n\nexport const DEFAULT_PAGE_ESTIMATE_PX_PER_TWIP = 1 / 15;\n\nexport function estimateBlockHeight(\n block: SurfaceBlockSnapshot | undefined,\n columnWidth: number,\n): number {\n if (!block) {\n return 0;\n }\n\n switch (block.kind) {\n case \"paragraph\":\n return estimateParagraphHeight(block, columnWidth);\n case \"table\":\n return estimateTableHeight(block, columnWidth);\n case \"sdt_block\":\n return Math.max(\n MIN_BLOCK_HEIGHT_TWIPS,\n block.children.reduce((total, child) => total + estimateBlockHeight(child, columnWidth), 0),\n );\n case \"opaque_block\":\n return block.label === \"Section break\" ? 0 : MIN_BLOCK_HEIGHT_TWIPS;\n }\n}\n\nexport function estimateParagraphHeight(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n columnWidth: number,\n): number {\n const lineHeight = estimateParagraphLineHeight(block);\n const lineCount = estimateParagraphLineCount(block, columnWidth);\n const spacingBefore = block.spacing?.before ?? 0;\n const spacingAfter = block.spacing?.after ?? 0;\n return Math.max(\n MIN_BLOCK_HEIGHT_TWIPS,\n lineHeight * lineCount + spacingBefore + spacingAfter,\n );\n}\n\nexport function estimateParagraphLineHeight(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n): number {\n const explicitLine = block.spacing?.line;\n if (typeof explicitLine === \"number\" && explicitLine > 0) {\n return explicitLine;\n }\n\n const fontSizeHalfPoints = block.segments.find(\n (segment): segment is Extract<SurfaceInlineSegment, { kind: \"text\" }> =>\n segment.kind === \"text\" && typeof segment.markAttrs?.fontSize === \"number\",\n )?.markAttrs?.fontSize;\n const fontSizePoints =\n typeof fontSizeHalfPoints === \"number\"\n ? fontSizeHalfPoints / 2\n : DEFAULT_FONT_SIZE_POINTS;\n return Math.max(\n DEFAULT_LINE_HEIGHT_TWIPS,\n Math.round(fontSizePoints * 20 * 1.35),\n );\n}\n\nexport function estimateParagraphLineCount(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n columnWidth: number,\n): number {\n const averageCharWidth = estimateAverageCharWidth(block);\n const charsPerLine = Math.max(12, Math.floor(columnWidth / averageCharWidth));\n let lineCount = 1;\n let currentLineChars = estimatedPrefixLength(block);\n\n for (const segment of block.segments) {\n switch (segment.kind) {\n case \"text\":\n currentLineChars += Array.from(segment.text).length;\n while (currentLineChars > charsPerLine) {\n lineCount += 1;\n currentLineChars -= charsPerLine;\n }\n break;\n case \"tab\":\n currentLineChars += 4;\n break;\n case \"hard_break\":\n lineCount += 1;\n currentLineChars = 0;\n break;\n case \"image\":\n lineCount += Math.max(1, Math.round(segment.display === \"floating\" ? 2 : 1));\n currentLineChars = 0;\n break;\n case \"note_ref\":\n currentLineChars += 1;\n break;\n case \"opaque_inline\":\n if (segment.presentation !== \"quiet-marker\") {\n currentLineChars += segment.label.length > 0 ? 1 : 0;\n }\n break;\n }\n }\n\n return Math.max(1, lineCount);\n}\n\nexport function getUsablePageHeight(layout: PageLayoutSnapshot): number {\n return Math.max(\n 1440,\n layout.pageHeight - layout.marginTop - layout.marginBottom,\n );\n}\n\nexport interface PageColumnMetric {\n width: number;\n space: number;\n}\n\nexport function getUsableColumnMetrics(\n layout: PageLayoutSnapshot,\n): PageColumnMetric[] {\n const usableWidth = Math.max(\n 1440,\n layout.pageWidth - layout.marginLeft - layout.marginRight - layout.gutter,\n );\n const columnCount = Math.max(1, layout.columns);\n if (\n !layout.equalWidthColumns &&\n layout.columnDefinitions.length > 0\n ) {\n return layout.columnDefinitions.map((column, index) => ({\n width: Math.max(720, column.width),\n space:\n index < layout.columnDefinitions.length - 1\n ? Math.max(0, column.space ?? 0)\n : 0,\n }));\n }\n\n const width = columnCount <= 1\n ? usableWidth\n : Math.max(720, Math.floor(usableWidth / columnCount));\n return Array.from({ length: columnCount }, () => ({\n width,\n space: 0,\n }));\n}\n\nexport function getUsableColumnWidth(layout: PageLayoutSnapshot): number {\n return getUsableColumnMetrics(layout)[0]?.width ?? 1440;\n}\n\nfunction estimateTableHeight(\n block: Extract<SurfaceBlockSnapshot, { kind: \"table\" }>,\n columnWidth: number,\n): number {\n let totalHeight = 0;\n for (const row of block.rows) {\n const explicitHeight = row.height ?? 0;\n if (explicitHeight > 0) {\n totalHeight += explicitHeight;\n continue;\n }\n\n let rowHeight = MIN_BLOCK_HEIGHT_TWIPS;\n for (const cell of row.cells) {\n const cellHeight = cell.content.reduce(\n (total, child) => total + estimateBlockHeight(child, columnWidth),\n 0,\n );\n rowHeight = Math.max(rowHeight, cellHeight + TABLE_ROW_PADDING_TWIPS);\n }\n totalHeight += rowHeight;\n }\n return Math.max(MIN_BLOCK_HEIGHT_TWIPS, totalHeight);\n}\n\nfunction estimateAverageCharWidth(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n): number {\n const fontSizeHalfPoints = block.segments.find(\n (segment): segment is Extract<SurfaceInlineSegment, { kind: \"text\" }> =>\n segment.kind === \"text\" && typeof segment.markAttrs?.fontSize === \"number\",\n )?.markAttrs?.fontSize;\n const fontSizePoints =\n typeof fontSizeHalfPoints === \"number\"\n ? fontSizeHalfPoints / 2\n : DEFAULT_FONT_SIZE_POINTS;\n return Math.max(96, Math.round(fontSizePoints * 12));\n}\n\nfunction estimatedPrefixLength(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n): number {\n const prefix = block.numberingPrefix ?? \"\";\n const suffix =\n block.numberingSuffix === \"space\"\n ? 1\n : block.numberingSuffix === \"tab\"\n ? 4\n : 0;\n return prefix.length + suffix;\n}\n","import type {\n EditorStoryTarget,\n PageLayoutSnapshot,\n} from \"../api/public-types\";\nimport { MAIN_STORY_TARGET } from \"../core/selection/mapping.ts\";\nimport {\n createSelectionSnapshot,\n type CanonicalDocumentEnvelope,\n type EditorState,\n} from \"../core/state/editor-state.ts\";\nimport type {\n FooterDocument,\n HeaderDocument,\n SectionProperties,\n SubPartsCatalog,\n} from \"../model/canonical-document.ts\";\nimport { createEditorSurfaceSnapshot } from \"./surface-projection.ts\";\nimport {\n resolveSectionVariants,\n sectionSupportsStoryTarget,\n} from \"./story-context.ts\";\nimport { storyTargetKey } from \"./story-targeting.ts\";\n\nexport interface ResolvedDocumentSection {\n index: number;\n start: number;\n end: number;\n properties?: SectionProperties;\n}\n\nexport function buildResolvedSections(\n document: CanonicalDocumentEnvelope,\n): ResolvedDocumentSection[] {\n const mainSurface = createEditorSurfaceSnapshot(\n document,\n createSelectionSnapshot(0, 0),\n MAIN_STORY_TARGET,\n );\n const sections: ResolvedDocumentSection[] = [];\n let sectionStart = 0;\n let sectionIndex = 0;\n\n for (const [index, block] of document.content.children.entries()) {\n if (block.type !== \"section_break\") {\n continue;\n }\n\n const surfaceBlock = mainSurface.blocks[index];\n sections.push({\n index: sectionIndex,\n start: sectionStart,\n end: surfaceBlock?.from ?? sectionStart,\n properties: block.sectionProperties,\n });\n sectionStart = surfaceBlock?.to ?? sectionStart;\n sectionIndex += 1;\n }\n\n sections.push({\n index: sectionIndex,\n start: sectionStart,\n end: mainSurface.storySize,\n properties: document.subParts?.finalSectionProperties,\n });\n\n return sections;\n}\n\nexport function findSectionForPosition(\n sections: ReadonlyArray<ResolvedDocumentSection>,\n position: number,\n): ResolvedDocumentSection {\n for (const section of sections) {\n if (position < section.end) {\n return section;\n }\n }\n\n return sections[sections.length - 1] ?? {\n index: 0,\n start: 0,\n end: 0,\n };\n}\n\nexport function buildPageLayoutSnapshot(\n sectionIndex: number,\n properties: SectionProperties | undefined,\n subParts: SubPartsCatalog | undefined,\n): PageLayoutSnapshot {\n const pageSize = properties?.pageSize ?? {\n width: 12240,\n height: 15840,\n orientation: \"portrait\" as const,\n };\n const margins = properties?.pageMargins ?? {\n top: 1440,\n right: 1440,\n bottom: 1440,\n left: 1440,\n header: 720,\n footer: 720,\n gutter: 0,\n };\n const columns = properties?.columns;\n const explicitColumns = columns?.columns ?? [];\n const differentOddEvenPages = Boolean(subParts?.settings?.evenAndOddHeaders);\n\n return {\n sectionIndex,\n ...(properties?.sectionType ? { sectionType: properties.sectionType } : {}),\n pageWidth: pageSize.width,\n pageHeight: pageSize.height,\n marginTop: margins.top,\n marginBottom: margins.bottom,\n marginLeft: margins.left,\n marginRight: margins.right,\n headerMargin: margins.header ?? 720,\n footerMargin: margins.footer ?? 720,\n gutter: margins.gutter ?? 0,\n orientation: pageSize.orientation ?? \"portrait\",\n columns:\n explicitColumns.length > 0 ? explicitColumns.length : (columns?.count ?? 1),\n differentFirstPage: Boolean(properties?.titlePage),\n differentOddEvenPages,\n ...(properties?.pageNumbering\n ? {\n pageNumbering: {\n ...(properties.pageNumbering.format\n ? { format: properties.pageNumbering.format }\n : {}),\n ...(properties.pageNumbering.start !== undefined\n ? { start: properties.pageNumbering.start }\n : {}),\n ...(properties.pageNumbering.chapStyle\n ? { chapterStyle: properties.pageNumbering.chapStyle }\n : {}),\n ...(properties.pageNumbering.chapSep\n ? { chapterSeparator: properties.pageNumbering.chapSep }\n : {}),\n },\n }\n : {}),\n ...(properties?.lineNumbering\n ? {\n lineNumbering: {\n ...(properties.lineNumbering.countBy !== undefined\n ? { countBy: properties.lineNumbering.countBy }\n : {}),\n ...(properties.lineNumbering.start !== undefined\n ? { start: properties.lineNumbering.start }\n : {}),\n ...(properties.lineNumbering.distance !== undefined\n ? { distance: properties.lineNumbering.distance }\n : {}),\n ...(properties.lineNumbering.restart\n ? { restart: properties.lineNumbering.restart }\n : {}),\n },\n }\n : {}),\n ...(properties?.pageBorders\n ? {\n pageBorders: {\n ...(properties.pageBorders.top\n ? { top: { ...properties.pageBorders.top } }\n : {}),\n ...(properties.pageBorders.left\n ? { left: { ...properties.pageBorders.left } }\n : {}),\n ...(properties.pageBorders.bottom\n ? { bottom: { ...properties.pageBorders.bottom } }\n : {}),\n ...(properties.pageBorders.right\n ? { right: { ...properties.pageBorders.right } }\n : {}),\n ...(properties.pageBorders.offsetFrom\n ? { offsetFrom: properties.pageBorders.offsetFrom }\n : {}),\n ...(properties.pageBorders.display\n ? { display: properties.pageBorders.display }\n : {}),\n ...(properties.pageBorders.zOrder\n ? { zOrder: properties.pageBorders.zOrder }\n : {}),\n },\n }\n : {}),\n ...(properties?.documentGrid\n ? {\n documentGrid: {\n ...(properties.documentGrid.type\n ? { type: properties.documentGrid.type }\n : {}),\n ...(properties.documentGrid.linePitch !== undefined\n ? { linePitch: properties.documentGrid.linePitch }\n : {}),\n ...(properties.documentGrid.charSpace !== undefined\n ? { charSpace: properties.documentGrid.charSpace }\n : {}),\n },\n }\n : {}),\n columnDefinitions: explicitColumns,\n equalWidthColumns:\n columns?.equalWidth ??\n (explicitColumns.length === 0 || explicitColumns.length <= 1),\n columnSeparator: Boolean(columns?.separator),\n headerVariants: resolveSectionVariants(\n \"header\",\n sectionIndex,\n properties?.headerReferences,\n subParts?.headers ?? [],\n ),\n footerVariants: resolveSectionVariants(\n \"footer\",\n sectionIndex,\n properties?.footerReferences,\n subParts?.footers ?? [],\n ),\n };\n}\n\nexport function resolveSectionForStoryTarget(\n document: CanonicalDocumentEnvelope,\n sections: ReadonlyArray<ResolvedDocumentSection>,\n target: EditorStoryTarget,\n): ResolvedDocumentSection | undefined {\n if (target.kind === \"main\" || sections.length === 0) {\n return sections[0];\n }\n\n if (target.kind === \"header\") {\n if (target.sectionIndex !== undefined) {\n const section = sections.find((candidate) => candidate.index === target.sectionIndex);\n return section &&\n sectionSupportsStoryTarget(document, target.sectionIndex, target)\n ? section\n : undefined;\n }\n return (\n findSectionByStoryReference(\n document,\n sections,\n target,\n \"header\",\n ) ?? sections[0]\n );\n }\n\n if (target.kind === \"footer\") {\n if (target.sectionIndex !== undefined) {\n const section = sections.find((candidate) => candidate.index === target.sectionIndex);\n return section &&\n sectionSupportsStoryTarget(document, target.sectionIndex, target)\n ? section\n : undefined;\n }\n return (\n findSectionByStoryReference(\n document,\n sections,\n target,\n \"footer\",\n ) ?? sections[0]\n );\n }\n\n return undefined;\n}\n\nexport function resolveActiveSection(\n state: EditorState,\n activeStory: EditorStoryTarget,\n sections: ReadonlyArray<ResolvedDocumentSection>,\n storySelections?: ReadonlyMap<string, EditorState[\"selection\"]>,\n): ResolvedDocumentSection | undefined {\n if (sections.length === 0) {\n return undefined;\n }\n\n if (activeStory.kind === \"main\") {\n return findSectionForPosition(sections, state.selection.head);\n }\n\n const referencedSection = resolveSectionForStoryTarget(\n state.document,\n sections,\n activeStory,\n );\n if (referencedSection) {\n return referencedSection;\n }\n\n const mainSelection =\n storySelections?.get(storyTargetKey(MAIN_STORY_TARGET)) ?? state.selection;\n return findSectionForPosition(sections, mainSelection.head);\n}\n\nfunction findSectionByStoryReference(\n document: CanonicalDocumentEnvelope,\n sections: ReadonlyArray<ResolvedDocumentSection>,\n target:\n | Extract<EditorStoryTarget, { kind: \"header\" }>\n | Extract<EditorStoryTarget, { kind: \"footer\" }>,\n kind: \"header\" | \"footer\",\n): ResolvedDocumentSection | undefined {\n const propertyKey =\n kind === \"header\" ? \"headerReferences\" : \"footerReferences\";\n const documents =\n kind === \"header\"\n ? document.subParts?.headers ?? []\n : document.subParts?.footers ?? [];\n\n return (\n sections.find((section) =>\n section.properties?.[propertyKey]?.some(\n (ref) =>\n ref.relationshipId === target.relationshipId &&\n ref.variant === target.variant,\n ),\n ) ??\n sections.find((section) =>\n documents.some(\n (entry) =>\n entry.relationshipId === target.relationshipId &&\n entry.variant === target.variant &&\n entry.sectionIndex === section.index,\n ),\n )\n );\n}\n","/**\n * Runtime-owned view state — non-canonical interaction model.\n *\n * This module owns the editor's interaction and measurement state that is\n * separate from the canonical document model. View state is never serialized\n * into persisted snapshots or exported DOCX; it exists only while the editor\n * session is live.\n *\n * Design boundaries:\n * - Canonical document state lives in EditorState / CanonicalDocumentEnvelope.\n * - View state is runtime-owned, non-canonical, non-exported.\n * - Builds on Wave 35's activeStory and PageLayoutSnapshot model.\n * - Runtime viewMode models editor posture (\"editing\" | \"review\" | \"view\").\n * - Workspace mode and zoom are runtime-owned so hosts and the mounted shell\n * share one view-state contract.\n */\n\nimport type {\n ActiveListContext,\n ActiveNoteContext,\n CaretAffinity,\n DocumentMode,\n EditorStoryTarget,\n EditorSurfaceSnapshot,\n EditorViewStateSnapshot,\n LayoutMeasurement,\n PageLayoutSnapshot,\n PageRegionHitTest,\n SelectionSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n ViewMode,\n WorkspaceMode,\n ZoomLevel,\n} from \"../api/public-types\";\nimport type { NumberingCatalog } from \"../model/canonical-document.ts\";\n\nexport interface ViewState {\n viewMode: ViewMode;\n documentMode: DocumentMode;\n workspaceMode: WorkspaceMode;\n zoomLevel: ZoomLevel;\n isFocused: boolean;\n caretAffinity: CaretAffinity;\n activePageRegion: PageRegionHitTest | null;\n activeObjectFrame: LayoutMeasurement[\"objectFrame\"] | null;\n}\n\nconst MIN_ZOOM_PERCENT = 50;\nconst MAX_ZOOM_PERCENT = 200;\n\nconst DEFAULT_VIEW_STATE: ViewState = {\n viewMode: \"editing\",\n documentMode: \"editing\",\n workspaceMode: \"canvas\",\n zoomLevel: 100,\n isFocused: false,\n caretAffinity: \"none\",\n activePageRegion: null,\n activeObjectFrame: null,\n};\n\nexport function createViewState(initial?: Partial<ViewState>): ViewState {\n return { ...DEFAULT_VIEW_STATE, ...initial };\n}\n\nexport function setViewMode(state: ViewState, mode: ViewMode): ViewState {\n if (state.viewMode === mode) return state;\n return { ...state, viewMode: mode };\n}\n\nexport function setDocumentMode(state: ViewState, mode: DocumentMode): ViewState {\n if (state.documentMode === mode) return state;\n return { ...state, documentMode: mode };\n}\n\nexport function setWorkspaceMode(\n state: ViewState,\n workspaceMode: WorkspaceMode,\n): ViewState {\n if (state.workspaceMode === workspaceMode) {\n return state;\n }\n return { ...state, workspaceMode };\n}\n\nexport function setZoomLevel(state: ViewState, zoomLevel: ZoomLevel): ViewState {\n const normalizedZoom = normalizeZoomLevel(zoomLevel, state.zoomLevel);\n if (state.zoomLevel === normalizedZoom) {\n return state;\n }\n return { ...state, zoomLevel: normalizedZoom };\n}\n\nexport function setFocused(state: ViewState, focused: boolean): ViewState {\n if (state.isFocused === focused) return state;\n return { ...state, isFocused: focused };\n}\n\nexport function setCaretAffinity(state: ViewState, affinity: CaretAffinity): ViewState {\n if (state.caretAffinity === affinity) return state;\n return { ...state, caretAffinity: affinity };\n}\n\nexport function setActivePageRegion(state: ViewState, region: PageRegionHitTest | null): ViewState {\n return { ...state, activePageRegion: region };\n}\n\nexport function setActiveObjectFrame(\n state: ViewState,\n frame: LayoutMeasurement[\"objectFrame\"] | null,\n): ViewState {\n return { ...state, activeObjectFrame: frame };\n}\n\n/**\n * Derive list context from the surface block at the current selection head.\n */\nexport function deriveActiveListContext(\n surface: EditorSurfaceSnapshot | undefined,\n selectionHead: number,\n numberingCatalog?: NumberingCatalog,\n): ActiveListContext | null {\n if (!surface) return null;\n const block = findBlockAtPosition(surface.blocks, selectionHead);\n if (!block || block.kind !== \"paragraph\" || !block.numbering) return null;\n\n const isOrdered = resolveListOrdering(block.numbering, numberingCatalog);\n return {\n numberingInstanceId: block.numbering.numberingInstanceId,\n level: block.numbering.level,\n isOrdered,\n ...(block.numberingPrefix ? { markerText: block.numberingPrefix } : {}),\n };\n}\n\n/**\n * Derive note context when the active story targets a footnote or endnote.\n */\nexport function deriveActiveNoteContext(\n activeStory: EditorStoryTarget,\n mainSurface: EditorSurfaceSnapshot | undefined,\n): ActiveNoteContext | null {\n if (activeStory.kind !== \"footnote\" && activeStory.kind !== \"endnote\") {\n return null;\n }\n\n const referencePosition = findNoteReferencePosition(mainSurface, activeStory);\n return {\n noteKind: activeStory.kind,\n noteId: activeStory.noteId,\n referencePosition,\n };\n}\n\n/**\n * Derive layout measurement from the surface at the current selection.\n */\nexport function deriveLayoutMeasurement(\n surface: EditorSurfaceSnapshot | undefined,\n selectionOrPosition: SelectionSnapshot | number,\n viewState: ViewState,\n): LayoutMeasurement {\n const selectionHead =\n typeof selectionOrPosition === \"number\"\n ? selectionOrPosition\n : selectionOrPosition.activeRange.kind === \"node\"\n ? selectionOrPosition.activeRange.at\n : selectionOrPosition.head;\n const block = surface ? findBlockAtPosition(surface.blocks, selectionHead) : null;\n const tabStops = block?.kind === \"paragraph\" && block.tabStops ? block.tabStops : [];\n const listMarkerLane = deriveListMarkerLane(block);\n\n return {\n pageRegions: viewState.activePageRegion ? [viewState.activePageRegion] : [],\n caretAffinity: viewState.caretAffinity,\n tabStops,\n listMarkerLane: listMarkerLane ?? undefined,\n objectFrame: viewState.activeObjectFrame ?? undefined,\n };\n}\n\n/**\n * Build the full EditorViewStateSnapshot from runtime + surface state.\n */\nexport function createEditorViewStateSnapshot(\n viewState: ViewState,\n activeStory: EditorStoryTarget,\n selection: SelectionSnapshot,\n surface: EditorSurfaceSnapshot | undefined,\n mainSurface: EditorSurfaceSnapshot | undefined,\n pageLayout: PageLayoutSnapshot | null | undefined,\n numberingCatalog?: NumberingCatalog,\n): EditorViewStateSnapshot {\n const selectionPosition =\n selection.activeRange.kind === \"node\" ? selection.activeRange.at : selection.head;\n const derivedViewState = deriveInteractionViewState(\n viewState,\n activeStory,\n selection,\n surface,\n pageLayout,\n );\n const activeListContext = deriveActiveListContext(surface, selectionPosition, numberingCatalog);\n const activeNoteContext = deriveActiveNoteContext(activeStory, mainSurface);\n const measurement = deriveLayoutMeasurement(surface, selection, derivedViewState);\n\n return {\n viewMode: derivedViewState.viewMode,\n documentMode: derivedViewState.documentMode,\n workspaceMode: derivedViewState.workspaceMode,\n zoomLevel: derivedViewState.zoomLevel,\n activeStory,\n selection,\n caretAffinity: derivedViewState.caretAffinity,\n activeListContext,\n activeNoteContext,\n activePageRegion: derivedViewState.activePageRegion,\n activeObjectFrame: derivedViewState.activeObjectFrame,\n measurement,\n isFocused: derivedViewState.isFocused,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction findBlockAtPosition(\n blocks: readonly SurfaceBlockSnapshot[],\n position: number,\n): SurfaceBlockSnapshot | null {\n for (const block of blocks) {\n if (position >= block.from && position <= block.to) {\n if (block.kind === \"sdt_block\") {\n const inner = findBlockAtPosition(block.children, position);\n if (inner) return inner;\n }\n if (block.kind === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n const inner = findBlockAtPosition(cell.content, position);\n if (inner) return inner;\n }\n }\n }\n return block;\n }\n }\n return null;\n}\n\nfunction resolveListOrdering(\n numbering: NonNullable<Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>[\"numbering\"]>,\n numberingCatalog?: NumberingCatalog,\n): boolean {\n if (!numberingCatalog) {\n return true;\n }\n\n const instance = numberingCatalog.instances[numbering.numberingInstanceId];\n const definition = instance\n ? numberingCatalog.abstractDefinitions[instance.abstractNumberingId]\n : undefined;\n const levelDefinition = definition?.levels.find((level) => level.level === numbering.level);\n\n if (!levelDefinition) {\n return true;\n }\n\n return levelDefinition.format !== \"bullet\";\n}\n\nfunction deriveInteractionViewState(\n viewState: ViewState,\n activeStory: EditorStoryTarget,\n selection: SelectionSnapshot,\n surface: EditorSurfaceSnapshot | undefined,\n pageLayout: PageLayoutSnapshot | null | undefined,\n): ViewState {\n const activePageRegion = deriveActivePageRegion(activeStory, pageLayout) ?? viewState.activePageRegion;\n const activeObjectFrame = deriveActiveObjectFrame(surface, selection);\n const caretAffinity = deriveCaretAffinity(surface, selection);\n\n return {\n ...viewState,\n caretAffinity,\n activePageRegion,\n activeObjectFrame,\n };\n}\n\nfunction deriveActivePageRegion(\n activeStory: EditorStoryTarget,\n pageLayout: PageLayoutSnapshot | null | undefined,\n): PageRegionHitTest | null {\n if (!pageLayout) {\n return null;\n }\n const sectionIndex = pageLayout?.sectionIndex ?? 0;\n switch (activeStory.kind) {\n case \"header\":\n return { region: \"header\", sectionIndex, columnIndex: 0 };\n case \"footer\":\n return { region: \"footer\", sectionIndex, columnIndex: 0 };\n default:\n return { region: \"body\", sectionIndex, columnIndex: 0 };\n }\n}\n\nfunction deriveActiveObjectFrame(\n surface: EditorSurfaceSnapshot | undefined,\n selection: SelectionSnapshot,\n): LayoutMeasurement[\"objectFrame\"] | null {\n if (!surface) {\n return null;\n }\n\n const position =\n selection.activeRange.kind === \"node\" ? selection.activeRange.at : selection.head;\n const block = findBlockAtPosition(surface.blocks, position);\n if (!block || block.kind !== \"paragraph\") {\n return null;\n }\n\n const segment = findObjectSegmentAtPosition(block.segments, position);\n if (!segment) {\n return null;\n }\n\n if (segment.kind === \"image\") {\n return {\n kind: \"image\",\n anchorPos: segment.from,\n display: segment.display === \"floating\" ? \"floating\" : \"inline\",\n };\n }\n\n const objectKind = inferOpaqueObjectKind(segment);\n if (!objectKind) {\n return null;\n }\n\n return {\n kind: objectKind,\n anchorPos: segment.from,\n display: \"inline\",\n };\n}\n\nfunction deriveCaretAffinity(\n surface: EditorSurfaceSnapshot | undefined,\n selection: SelectionSnapshot,\n): CaretAffinity {\n if (selection.activeRange.kind === \"node\") {\n return selection.activeRange.assoc < 0 ? \"backward\" : \"forward\";\n }\n if (!selection.isCollapsed || !surface) {\n return \"none\";\n }\n const block = findBlockAtPosition(surface.blocks, selection.head);\n if (!block || block.kind !== \"paragraph\") {\n return \"none\";\n }\n for (const segment of block.segments) {\n if (!isObjectLikeSegment(segment)) {\n continue;\n }\n if (selection.head === segment.from) {\n return \"forward\";\n }\n if (selection.head === segment.to) {\n return \"backward\";\n }\n }\n return \"none\";\n}\n\nexport function findNoteReferencePosition(\n mainSurface: EditorSurfaceSnapshot | undefined,\n target: EditorStoryTarget & { kind: \"footnote\" | \"endnote\" },\n): number {\n if (!mainSurface) return 0;\n for (const block of mainSurface.blocks) {\n if (block.kind === \"paragraph\") {\n for (const segment of block.segments) {\n if (\n segment.kind === \"note_ref\" &&\n segment.noteKind === target.kind &&\n segment.noteId === target.noteId\n ) {\n return segment.from;\n }\n // Fallback: opaque_inline references from older surface projections\n if (\n segment.kind === \"opaque_inline\" &&\n segment.label.toLowerCase().includes(target.kind) &&\n segment.detail.includes(target.noteId)\n ) {\n return segment.from;\n }\n }\n }\n }\n return 0;\n}\n\nfunction normalizeZoomLevel(\n zoomLevel: ZoomLevel,\n currentZoom: ZoomLevel,\n): ZoomLevel {\n if (zoomLevel === \"pageWidth\" || zoomLevel === \"onePage\") {\n return zoomLevel;\n }\n if (!Number.isFinite(zoomLevel) || zoomLevel <= 0) {\n return currentZoom;\n }\n return Math.max(\n MIN_ZOOM_PERCENT,\n Math.min(MAX_ZOOM_PERCENT, Math.round(zoomLevel)),\n );\n}\n\nfunction findObjectSegmentAtPosition(\n segments: readonly SurfaceInlineSegment[],\n position: number,\n): Extract<SurfaceInlineSegment, { kind: \"image\" | \"opaque_inline\" }> | null {\n for (const segment of segments) {\n if (!isObjectLikeSegment(segment)) {\n continue;\n }\n if (position >= segment.from && position <= segment.to) {\n return segment;\n }\n }\n return null;\n}\n\nfunction isObjectLikeSegment(\n segment: SurfaceInlineSegment,\n): segment is Extract<SurfaceInlineSegment, { kind: \"image\" | \"opaque_inline\" }> {\n if (segment.kind === \"image\") {\n return true;\n }\n if (segment.kind !== \"opaque_inline\") {\n return false;\n }\n return inferOpaqueObjectKind(segment) !== null;\n}\n\nfunction inferOpaqueObjectKind(\n segment: Extract<SurfaceInlineSegment, { kind: \"opaque_inline\" }>,\n): \"textbox\" | \"shape\" | null {\n if (segment.label === \"Text box\") {\n return \"textbox\";\n }\n if (segment.label === \"Drawing shape\") {\n return \"shape\";\n }\n if (segment.label === \"Legacy VML drawing\") {\n return segment.detail.includes(\"#_x0000_t202\")\n ? \"textbox\"\n : \"shape\";\n }\n return null;\n}\n\nfunction deriveListMarkerLane(\n block: SurfaceBlockSnapshot | null,\n): { indent: number; markerWidth: number } | null {\n if (!block || block.kind !== \"paragraph\" || !block.numbering) return null;\n const indent = block.indentation?.hanging ?? block.indentation?.left ?? 360;\n return {\n indent,\n markerWidth: Math.min(indent, 360),\n };\n}\n","/**\n * Runtime-owned document navigation model.\n *\n * Derives the page stack, heading outline, and navigation context entirely\n * from canonical document state and section properties. DOM scroll position,\n * CSS layout, and shell-local state are never consulted — the runtime is the\n * source of pagination truth.\n *\n * This module owns read models only. Section authoring commands live in\n * `src/core/commands/section-layout-commands.ts` (owned by A3).\n */\n\nimport type {\n DocumentHeadingSnapshot,\n DocumentNavigationSnapshot,\n DocumentPageSnapshot,\n EditorStoryTarget,\n EditorSurfaceSnapshot,\n SurfaceBlockSnapshot,\n SurfaceInlineSegment,\n} from \"../api/public-types\";\nimport type {\n FootnoteCollection,\n} from \"../model/canonical-document.ts\";\nimport type { CanonicalDocumentEnvelope } from \"../core/state/editor-state.ts\";\nimport { createSelectionSnapshot } from \"../core/state/editor-state.ts\";\nimport { MAIN_STORY_TARGET } from \"../core/selection/mapping.ts\";\nimport { createEditorSurfaceSnapshot } from \"./surface-projection.ts\";\nimport {\n estimateBlockHeight,\n estimateParagraphHeight,\n getUsableColumnMetrics,\n getUsableColumnWidth,\n getUsablePageHeight,\n} from \"./page-layout-estimation.ts\";\nimport {\n buildPageLayoutSnapshot,\n buildResolvedSections,\n findSectionForPosition as resolveSectionForPosition,\n resolveSectionForStoryTarget,\n type ResolvedDocumentSection,\n} from \"./document-layout.ts\";\nimport { findNoteReferencePosition } from \"./view-state.ts\";\n\nconst MIN_BLOCK_HEIGHT_TWIPS = 240;\nconst FOOTNOTE_REFERENCE_RESERVATION_TWIPS = 180;\n\ninterface NavigationBaseSnapshot {\n mainSurface: EditorSurfaceSnapshot;\n sections: ResolvedDocumentSection[];\n pages: DocumentPageSnapshot[];\n headings: DocumentHeadingSnapshot[];\n}\n\nconst navigationBaseCache = new WeakMap<\n CanonicalDocumentEnvelope[\"content\"],\n NavigationBaseSnapshot & {\n styles: CanonicalDocumentEnvelope[\"styles\"];\n subParts: CanonicalDocumentEnvelope[\"subParts\"];\n }\n>();\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build the full document navigation snapshot from canonical state.\n *\n * The page stack is derived from structured block layout, section geometry,\n * and bounded pagination rules. DOM scroll position and CSS layout are never\n * consulted.\n */\nexport function createDocumentNavigationSnapshot(\n document: CanonicalDocumentEnvelope,\n selectionHead: number,\n activeStory: EditorStoryTarget,\n): DocumentNavigationSnapshot {\n const base = getNavigationBaseSnapshot(document);\n const navigationContext = resolveActiveNavigationContext(\n document,\n base.pages,\n base.sections,\n base.mainSurface,\n selectionHead,\n activeStory,\n );\n\n return {\n pageCount: base.pages.length,\n pages: base.pages,\n headings: base.headings,\n activePageIndex: navigationContext.activePageIndex,\n activeSectionIndex: navigationContext.activeSectionIndex,\n };\n}\n\nfunction getNavigationBaseSnapshot(\n document: CanonicalDocumentEnvelope,\n): NavigationBaseSnapshot {\n const cached = navigationBaseCache.get(document.content);\n if (\n cached &&\n cached.styles === document.styles &&\n cached.subParts === document.subParts\n ) {\n return cached;\n }\n\n const mainSurface = createEditorSurfaceSnapshot(\n document,\n createSelectionSnapshot(0, 0),\n MAIN_STORY_TARGET,\n );\n const sections = buildResolvedSections(document);\n const pages = buildPageStack(document, sections, mainSurface);\n const headings = buildHeadingOutline(document, mainSurface, sections, pages);\n const next = {\n mainSurface,\n sections,\n pages,\n headings,\n styles: document.styles,\n subParts: document.subParts,\n };\n navigationBaseCache.set(document.content, next);\n return next;\n}\n\n/**\n * Find the page index that contains a given main-story character offset.\n */\nexport function findPageForOffset(\n pages: readonly DocumentPageSnapshot[],\n offset: number,\n): number {\n for (let i = 0; i < pages.length; i++) {\n if (offset < pages[i]!.endOffset) {\n return i;\n }\n }\n return Math.max(0, pages.length - 1);\n}\n\n/**\n * Find the section index that contains a given main-story character offset.\n */\nexport function findSectionForOffset(\n sections: readonly ResolvedDocumentSection[],\n offset: number,\n): number {\n return sections.length > 0 ? resolveSectionForPosition(sections, offset).index : 0;\n}\n\nfunction buildPageStack(\n document: CanonicalDocumentEnvelope,\n sections: ResolvedDocumentSection[],\n mainSurface: EditorSurfaceSnapshot,\n): DocumentPageSnapshot[] {\n const pages: DocumentPageSnapshot[] = [];\n let globalPageIndex = 0;\n\n for (const section of sections) {\n const layout = buildPageLayoutSnapshot(\n section.index,\n section.properties ?? document.subParts?.finalSectionProperties,\n document.subParts,\n );\n const sectionBlocks = collectSectionBlocks(mainSurface.blocks, section.start, section.end);\n const paginated = paginateSectionBlocks(\n section,\n sectionBlocks,\n layout,\n document.subParts?.footnoteCollection,\n );\n\n for (const page of paginated) {\n pages.push({\n ...page,\n pageIndex: globalPageIndex,\n });\n globalPageIndex += 1;\n }\n }\n\n // Guarantee at least one page\n if (pages.length === 0) {\n pages.push({\n pageIndex: 0,\n sectionIndex: 0,\n pageInSection: 0,\n startOffset: 0,\n endOffset: mainSurface.storySize,\n layout: buildPageLayoutSnapshot(\n 0,\n document.subParts?.finalSectionProperties,\n document.subParts,\n ),\n });\n }\n\n return pages;\n}\n\nfunction collectSectionBlocks(\n blocks: readonly SurfaceBlockSnapshot[],\n start: number,\n end: number,\n): SurfaceBlockSnapshot[] {\n return blocks.filter((block) => block.to > start && block.from < end);\n}\n\nfunction paginateSectionBlocks(\n section: ResolvedDocumentSection,\n blocks: readonly SurfaceBlockSnapshot[],\n layout: DocumentPageSnapshot[\"layout\"],\n footnotes: FootnoteCollection | undefined,\n): Omit<DocumentPageSnapshot, \"pageIndex\">[] {\n if (blocks.length === 0) {\n return [\n {\n sectionIndex: section.index,\n pageInSection: 0,\n startOffset: section.start,\n endOffset: section.end,\n layout,\n },\n ];\n }\n\n const pages: Omit<DocumentPageSnapshot, \"pageIndex\">[] = [];\n const usableHeight = getUsablePageHeight(layout);\n const columnMetrics = getUsableColumnMetrics(layout);\n const maxColumns = Math.max(1, columnMetrics.length);\n let pageStart = section.start;\n let columnHeight = 0;\n let columnIndex = 0;\n let pageInSection = 0;\n let reservedNoteHeight = 0;\n const reservedNotes = new Set<string>();\n\n const pushPage = (endOffset: number): void => {\n const boundedEnd = Math.max(pageStart, Math.min(endOffset, section.end));\n if (boundedEnd === pageStart && pages.length > 0) {\n return;\n }\n pages.push({\n sectionIndex: section.index,\n pageInSection,\n startOffset: pageStart,\n endOffset: boundedEnd,\n layout,\n });\n pageInSection += 1;\n pageStart = boundedEnd;\n columnHeight = 0;\n columnIndex = 0;\n reservedNoteHeight = 0;\n reservedNotes.clear();\n };\n\n for (let index = 0; index < blocks.length; index += 1) {\n const block = blocks[index]!;\n const nextBoundary = blocks[index + 1]?.from ?? section.end;\n while (true) {\n const columnWidth =\n columnMetrics[Math.min(columnIndex, columnMetrics.length - 1)]?.width ??\n getUsableColumnWidth(layout);\n const baseHeight = estimateBlockHeight(block, columnWidth);\n const keepWithNextHeight =\n block.kind === \"paragraph\" && block.keepNext\n ? baseHeight + estimateBlockHeight(blocks[index + 1], columnWidth)\n : baseHeight;\n const noteHeight = estimateFootnoteReservation(block, footnotes, columnWidth, reservedNotes);\n const projectedHeight = columnHeight + keepWithNextHeight + reservedNoteHeight + noteHeight;\n\n if (block.kind === \"paragraph\" && block.pageBreakBefore && pageStart < block.from) {\n pushPage(block.from);\n continue;\n }\n if (projectedHeight > usableHeight && pageStart < block.from) {\n if (columnIndex < maxColumns - 1) {\n columnIndex += 1;\n columnHeight = 0;\n reservedNoteHeight = 0;\n reservedNotes.clear();\n continue;\n }\n pushPage(block.from);\n continue;\n }\n\n const effectiveNoteHeight = estimateFootnoteReservation(\n block,\n footnotes,\n columnWidth,\n reservedNotes,\n );\n columnHeight += baseHeight;\n reservedNoteHeight += effectiveNoteHeight;\n currentPageNoteIds(block).forEach((noteKey) => reservedNotes.add(noteKey));\n\n if (hasColumnBreak(block)) {\n if (columnIndex < maxColumns - 1) {\n columnIndex += 1;\n columnHeight = 0;\n reservedNoteHeight = 0;\n reservedNotes.clear();\n } else {\n pushPage(nextBoundary);\n }\n break;\n }\n\n if (index === blocks.length - 1) {\n pushPage(section.end);\n }\n break;\n }\n }\n\n return pages.length > 0\n ? pages\n : [\n {\n sectionIndex: section.index,\n pageInSection: 0,\n startOffset: section.start,\n endOffset: section.end,\n layout,\n },\n ];\n}\n\nfunction resolveActiveNavigationContext(\n document: CanonicalDocumentEnvelope,\n pages: readonly DocumentPageSnapshot[],\n sections: readonly ResolvedDocumentSection[],\n mainSurface: EditorSurfaceSnapshot,\n selectionHead: number,\n activeStory: EditorStoryTarget,\n): { activePageIndex: number; activeSectionIndex: number } {\n if (activeStory.kind === \"main\") {\n const activePageIndex = findPageForOffset(pages, selectionHead);\n return {\n activePageIndex,\n activeSectionIndex: pages[activePageIndex]?.sectionIndex ?? 0,\n };\n }\n\n if (activeStory.kind === \"header\" || activeStory.kind === \"footer\") {\n const section = resolveSectionForStoryTarget(document, sections, activeStory);\n if (section) {\n return {\n activePageIndex: findFirstPageIndexForSection(pages, section.index),\n activeSectionIndex: section.index,\n };\n }\n }\n\n if (activeStory.kind === \"footnote\" || activeStory.kind === \"endnote\") {\n const referencePosition = findNoteReferencePosition(mainSurface, activeStory);\n const activePageIndex = findPageForOffset(pages, referencePosition);\n return {\n activePageIndex,\n activeSectionIndex:\n pages[activePageIndex]?.sectionIndex ??\n findSectionForOffset(sections, referencePosition),\n };\n }\n\n return {\n activePageIndex: 0,\n activeSectionIndex: 0,\n };\n}\n\nfunction findFirstPageIndexForSection(\n pages: readonly DocumentPageSnapshot[],\n sectionIndex: number,\n): number {\n const match = pages.findIndex((page) => page.sectionIndex === sectionIndex);\n return match >= 0 ? match : 0;\n}\n\nfunction estimateFootnoteReservation(\n block: SurfaceBlockSnapshot,\n footnotes: FootnoteCollection | undefined,\n columnWidth: number,\n reservedNotes: ReadonlySet<string>,\n): number {\n if (!footnotes || block.kind !== \"paragraph\") {\n return 0;\n }\n\n let reservation = 0;\n for (const noteKey of currentPageNoteIds(block)) {\n if (reservedNotes.has(noteKey)) {\n continue;\n }\n\n const [noteKind, noteId] = noteKey.split(\":\");\n const noteCollection =\n noteKind === \"endnote\" ? footnotes.endnotes : footnotes.footnotes;\n const note = noteCollection[noteId];\n reservation += FOOTNOTE_REFERENCE_RESERVATION_TWIPS;\n if (note) {\n reservation += note.blocks.reduce(\n (total, child) => total + estimateCanonicalNoteBlockHeight(child, columnWidth),\n 0,\n );\n }\n }\n\n return reservation;\n}\n\nfunction estimateCanonicalNoteBlockHeight(\n block: FootnoteCollection[\"footnotes\"][string][\"blocks\"][number],\n columnWidth: number,\n): number {\n switch (block.type) {\n case \"paragraph\":\n return estimateParagraphHeight(\n {\n blockId: \"note\",\n kind: \"paragraph\",\n from: 0,\n to: 0,\n ...(block.styleId ? { styleId: block.styleId } : {}),\n segments: createEstimatedNoteSegments(block.children),\n },\n columnWidth,\n );\n case \"table\":\n return MIN_BLOCK_HEIGHT_TWIPS * Math.max(1, block.rows.length);\n default:\n return MIN_BLOCK_HEIGHT_TWIPS;\n }\n}\n\nfunction createEstimatedNoteSegments(\n children: Extract<FootnoteCollection[\"footnotes\"][string][\"blocks\"][number], { type: \"paragraph\" }>[\"children\"],\n): SurfaceInlineSegment[] {\n const segments: SurfaceInlineSegment[] = [];\n\n children.forEach((child, index) => {\n if (child.type === \"text\") {\n segments.push({\n segmentId: `note-${index}`,\n kind: \"text\",\n from: 0,\n to: Array.from(child.text).length,\n text: child.text,\n });\n return;\n }\n\n if (child.type === \"hard_break\" || child.type === \"tab\") {\n segments.push({\n segmentId: `note-${index}`,\n kind: child.type,\n from: 0,\n to: 1,\n });\n }\n });\n\n return segments;\n}\n\nfunction currentPageNoteIds(\n block: SurfaceBlockSnapshot,\n): Set<string> {\n const notes = new Set<string>();\n if (block.kind !== \"paragraph\") {\n return notes;\n }\n\n for (const segment of block.segments) {\n if (segment.kind === \"note_ref\" && segment.noteId) {\n notes.add(`${segment.noteKind}:${segment.noteId}`);\n }\n }\n return notes;\n}\n\nfunction hasColumnBreak(block: SurfaceBlockSnapshot): boolean {\n return block.kind === \"paragraph\" && block.segments.some(\n (segment) =>\n segment.kind === \"opaque_inline\" &&\n segment.label === \"Column break\",\n );\n}\n\n// ---------------------------------------------------------------------------\n// Heading outline\n// ---------------------------------------------------------------------------\n\n/** Style IDs that map to heading levels by convention. */\nconst HEADING_STYLE_PATTERN = /^heading\\s*(\\d+)$/i;\n\nfunction headingLevelFromStyleId(styleId?: string): number | null {\n if (!styleId) return null;\n const match = HEADING_STYLE_PATTERN.exec(styleId);\n if (match) {\n const level = parseInt(match[1]!, 10);\n return level >= 1 && level <= 9 ? level : null;\n }\n return null;\n}\n\nfunction buildHeadingOutline(\n document: CanonicalDocumentEnvelope,\n mainSurface: EditorSurfaceSnapshot,\n sections: ResolvedDocumentSection[],\n pages: DocumentPageSnapshot[],\n): DocumentHeadingSnapshot[] {\n const headings: DocumentHeadingSnapshot[] = [];\n\n for (const block of mainSurface.blocks) {\n if (block.kind !== \"paragraph\") continue;\n\n // Check explicit outlineLevel first, then style-based heading detection\n const outlineLevel = block.outlineLevel;\n const styleLevel = resolveHeadingLevelFromStyle(document, block.styleId);\n const level =\n outlineLevel !== undefined && outlineLevel >= 0\n ? outlineLevel + 1\n : styleLevel;\n\n if (level === null) continue;\n\n const text = extractParagraphText(block);\n if (!text.trim()) continue;\n\n const offset = block.from;\n const pageIndex = findPageForOffset(pages, offset);\n const sectionIndex = findSectionForOffset(sections, offset);\n\n headings.push({\n headingId: `heading-${block.blockId}-${offset}`,\n level,\n text: text.trim(),\n offset,\n pageIndex,\n sectionIndex,\n });\n }\n\n return headings;\n}\n\nfunction resolveHeadingLevelFromStyle(\n document: CanonicalDocumentEnvelope,\n styleId?: string,\n): number | null {\n if (!styleId) {\n return null;\n }\n\n const visited = new Set<string>();\n let currentStyleId: string | undefined = styleId;\n while (currentStyleId && !visited.has(currentStyleId)) {\n visited.add(currentStyleId);\n const style:\n | { outlineLevel?: number; basedOn?: string }\n | undefined = document.styles.paragraphs[currentStyleId];\n if (!style) {\n break;\n }\n if (\n typeof style.outlineLevel === \"number\" &&\n style.outlineLevel >= 0 &&\n style.outlineLevel <= 8\n ) {\n return style.outlineLevel + 1;\n }\n currentStyleId = style.basedOn;\n }\n\n return headingLevelFromStyleId(styleId);\n}\n\nfunction extractParagraphText(\n block: Extract<SurfaceBlockSnapshot, { kind: \"paragraph\" }>,\n): string {\n let text = \"\";\n for (const segment of block.segments) {\n switch (segment.kind) {\n case \"text\":\n text += segment.text;\n break;\n case \"tab\":\n text += \"\\t\";\n break;\n case \"hard_break\":\n text += \"\\n\";\n break;\n }\n }\n return text;\n}\n","export type PerfProbeKind =\n | \"typing\"\n | \"selection\"\n | \"runtime.create\"\n | \"snapshot.surface\"\n | \"snapshot.compatibility\"\n | \"snapshot.navigation\"\n | \"pm.rebuild\"\n | \"pm.decorations\"\n | \"pm.mount\"\n | \"shell.render\"\n | \"workspace.chrome\"\n | \"selection.sync\";\n\nexport interface PerfProbeSample {\n token: string;\n kind: PerfProbeKind;\n durationMs: number;\n recordedAt: number;\n}\n\ninterface PendingProbe {\n kind: PerfProbeKind;\n startedAt: number;\n}\n\ninterface PerfProbeState {\n enabled?: boolean;\n nextToken?: number;\n pending?: Record<string, PendingProbe>;\n samples?: PerfProbeSample[];\n maxSamples?: number;\n invalidationCounts?: Record<string, number>;\n}\n\nexport interface PerfProbeSummary {\n samples: PerfProbeSample[];\n latest: Partial<Record<PerfProbeKind, PerfProbeSample | null>>;\n invalidationCounts: Record<string, number>;\n}\n\ndeclare global {\n interface Window {\n __DOCX_REACT_PERF_PROBE__?: PerfProbeState;\n }\n}\n\nexport function startPerfProbe(kind: PerfProbeKind): string | null {\n const state = getEnabledState();\n if (!state) {\n return null;\n }\n\n const token = `${kind}-${state.nextToken ?? 0}`;\n state.nextToken = (state.nextToken ?? 0) + 1;\n state.pending ??= {};\n state.pending[token] = {\n kind,\n startedAt: performance.now(),\n };\n return token;\n}\n\nexport function finishPerfProbe(token: string | null | undefined): PerfProbeSample | null {\n if (!token) {\n return null;\n }\n const state = getEnabledState();\n if (!state?.pending?.[token]) {\n return null;\n }\n\n const pending = state.pending[token];\n delete state.pending[token];\n\n const sample: PerfProbeSample = {\n token,\n kind: pending.kind,\n durationMs: performance.now() - pending.startedAt,\n recordedAt: Date.now(),\n };\n\n pushSample(state, sample);\n\n return sample;\n}\n\nexport function recordPerfSample(\n kind: PerfProbeKind,\n durationMs = 0,\n): PerfProbeSample | null {\n const state = getEnabledState();\n if (!state) {\n return null;\n }\n\n const token = `${kind}-${state.nextToken ?? 0}`;\n state.nextToken = (state.nextToken ?? 0) + 1;\n const sample: PerfProbeSample = {\n token,\n kind,\n durationMs,\n recordedAt: Date.now(),\n };\n pushSample(state, sample);\n return sample;\n}\n\nexport function incrementInvalidationCounter(\n counter: string,\n amount = 1,\n): number {\n const state = getEnabledState();\n if (!state) {\n return 0;\n }\n\n state.invalidationCounts ??= {};\n state.invalidationCounts[counter] =\n (state.invalidationCounts[counter] ?? 0) + amount;\n return state.invalidationCounts[counter]!;\n}\n\nexport function getLatestPerfSummary(): PerfProbeSummary | null {\n const state = getEnabledState();\n const samples = state?.samples ?? [];\n if (!state || samples.length === 0) {\n return null;\n }\n\n return {\n samples: [...samples],\n latest: buildLatestSampleMap(samples),\n invalidationCounts: { ...(state.invalidationCounts ?? {}) },\n };\n}\n\nexport function resetPerfProbeState(): void {\n const state = getEnabledState();\n if (!state) {\n return;\n }\n state.nextToken = 0;\n state.pending = {};\n state.samples = [];\n state.invalidationCounts = {};\n}\n\nfunction getEnabledState(): PerfProbeState | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n const state = window.__DOCX_REACT_PERF_PROBE__;\n if (!state?.enabled) {\n return null;\n }\n return state;\n}\n\nfunction pushSample(state: PerfProbeState, sample: PerfProbeSample): void {\n state.samples ??= [];\n state.samples.push(sample);\n const maxSamples = state.maxSamples ?? 20;\n if (state.samples.length > maxSamples) {\n state.samples.splice(0, state.samples.length - maxSamples);\n }\n}\n\nfunction buildLatestSampleMap(\n samples: PerfProbeSample[],\n): Partial<Record<PerfProbeKind, PerfProbeSample | null>> {\n const latest: Partial<Record<PerfProbeKind, PerfProbeSample | null>> = {};\n for (const sample of [...samples].reverse()) {\n if (latest[sample.kind] === undefined) {\n latest[sample.kind] = sample;\n }\n }\n return latest;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACyDO,IAAM,yBAAwC;AAAA,EACnD,OAAO;AAAA,EACP,KAAK;AACP;AAEO,SAAS,kBACd,MACA,KAAK,MACL,QAAuB,wBACV;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,eAAe,EAAE,MAAM,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,IAAc,QAAe,GAAe;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,qBACd,gBACA,QACgB;AAChB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,eAAe,cAAc;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAAS,qBAAyC;AACvD,SAAO;AAAA,IACL,OAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,eAAe,OAA2B;AACxD,SAAO,MAAM,QAAQ,MAAM,KACvB,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,GAAG,IACjC,EAAE,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK;AACvC;AAYO,SAAS,YACd,UACA,OACA,SACe;AACf,MAAI,iBAAiB;AACrB,MAAI,UAAU;AAEd,aAAW,QAAQ,QAAQ,OAAO;AAChC,UAAM,OAAO,uBAAuB,gBAAgB,OAAO,IAAI;AAC/D,qBAAiB,KAAK;AACtB,cAAU,WAAW,KAAK;AAAA,EAC5B;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,UACd,QACA,SACwB;AACxB,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,QAAQ;AAC1B,UAAM,SAAS,YAAY,OAAO,IAAI,OAAO,OAAO,OAAO;AAE3D,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,QACL,EAAE,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,EAAE;AAAA,QACrC,QAAQ,UAAU,wBACd,iCACA;AAAA,MACN;AAAA,IACF;AAEA,WAAO,iBAAiB,OAAO,UAAU,OAAO,KAAK;AAAA,EACvD;AAEA,QAAM,OAAO,YAAY,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO;AACvE,QAAM,KAAK,YAAY,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,OAAO;AACjE,QAAM,cAAc,eAAe,EAAE,MAAM,KAAK,UAAU,IAAI,GAAG,SAAS,CAAC;AAE3E,MAAI,KAAK,WAAW,GAAG,WAAW,YAAY,SAAS,YAAY,IAAI;AACrE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,UAAU,wBACd,iCACA;AAAA,IACN;AAAA,EACF;AAEA,SAAO,kBAAkB,YAAY,MAAM,YAAY,IAAI,OAAO,KAAK;AACzE;AAEO,SAAS,SACd,OACA,OACA,SAC8B;AAC9B,QAAM,SAAS,UAAU,kBAAkB,MAAM,MAAM,MAAM,IAAI,KAAK,GAAG,OAAO;AAChF,SAAO,OAAO,SAAS,SAAS,kBAAkB,OAAO,IAAI,OAAO,IAAI,KAAK,IAAI;AACnF;AAEO,SAAS,gBACd,MACA,OACS;AACT,MAAI,KAAK,SAAS,MAAM,MAAM;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,cAAc,MAAM,SAAS,YAAY;AACzD,WACE,KAAK,WAAW,MAAM,UACtB,KAAK,eAAe,SAAS,MAAM,eAAe,QAClD,KAAK,eAAe,OAAO,MAAM,eAAe;AAAA,EAEpD;AAEA,MAAI,KAAK,SAAS,UAAU,MAAM,SAAS,QAAQ;AACjD,WAAO,KAAK,OAAO,MAAM,MAAM,KAAK,UAAU,MAAM;AAAA,EACtD;AAEA,MAAI,KAAK,SAAS,WAAW,MAAM,SAAS,SAAS;AACnD,WACE,KAAK,MAAM,SAAS,MAAM,MAAM,QAChC,KAAK,MAAM,OAAO,MAAM,MAAM,MAC9B,KAAK,MAAM,UAAU,MAAM,MAAM,SACjC,KAAK,MAAM,QAAQ,MAAM,MAAM;AAAA,EAEnC;AAEA,SAAO;AACT;AAEO,SAAS,kBACd,MACA,OACS;AACT,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,SAAS;AACrC,MAAI,KAAK,SAAS,MAAM,KAAM,QAAO;AACrC,MAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,MAAI,KAAK,SAAS,YAAY,MAAM,SAAS,UAAU;AACrD,WACE,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,YAAY,MAAM,YACtB,KAAK,iBAAiB,UACvB,MAAM,iBAAiB,SACnB,OACA,KAAK,iBAAiB,MAAM;AAAA,EAEpC;AACA,MAAI,KAAK,SAAS,YAAY,MAAM,SAAS,UAAU;AACrD,WACE,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,YAAY,MAAM,YACtB,KAAK,iBAAiB,UACvB,MAAM,iBAAiB,SACnB,OACA,KAAK,iBAAiB,MAAM;AAAA,EAEpC;AACA,MAAI,KAAK,SAAS,cAAc,MAAM,SAAS,YAAY;AACzD,WAAO,KAAK,WAAW,MAAM;AAAA,EAC/B;AACA,MAAI,KAAK,SAAS,aAAa,MAAM,SAAS,WAAW;AACvD,WAAO,KAAK,WAAW,MAAM;AAAA,EAC/B;AACA,SAAO;AACT;AAEO,IAAM,oBAAuC,EAAE,MAAM,OAAO;AAEnE,SAAS,uBACP,UACA,OACA,MACe;AACf,MAAI,WAAW,KAAK,MAAM;AACxB,WAAO,EAAE,UAAU,SAAS,MAAM;AAAA,EACpC;AAEA,MAAI,WAAW,KAAK,IAAI;AACtB,WAAO;AAAA,MACL,UAAU,WAAW,KAAK,cAAc,KAAK,KAAK,KAAK;AAAA,MACvD,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,MAAM;AAC1B,WAAO;AAAA,MACL,UAAU,QAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK;AAAA,MACnD,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,IAAI;AACxB,WAAO;AAAA,MACL,UAAU,QAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK;AAAA,MACnD,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,QAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK;AAAA,IACnD,SAAS;AAAA,EACX;AACF;;;AChSO,IAAM,qBAAqB;AAC3B,IAAM,2CACX;AACK,IAAM,oCACX;AACK,IAAM,+BAA+B;AA2BrC,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC;AAAA,EAET,YAAY,SAAiB,QAAyC;AACpE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEA,IAAM,eACJ;AACF,IAAM,uBACJ;AAEK,SAAS,cAAc,OAAkD;AAC9E,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEO,SAAS,iBAAiB,OAAiC;AAChE,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEO,SAAS,OAAO,OAA+B;AACpD,SAAO,OAAO,UAAU,YAAY,aAAa,KAAK,KAAK;AAC7D;AAEO,SAAS,sBACd,OAC0B;AAC1B,SACE,OAAO,UAAU,YACjB,qBAAqB,KAAK,KAAK,KAC/B,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC;AAEnC;AAEO,SAAS,cACd,OACA,MACA,QACgC;AAChC,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO,KAAK,EAAE,MAAM,SAAS,2BAA2B,CAAC;AACzD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,aACd,OACA,MACA,QACe;AACf,MAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,WAAO,KAAK,EAAE,MAAM,SAAS,+BAA+B,CAAC;AAC7D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,OACA,MACA,QACe;AACf,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,EAAE,MAAM,SAAS,qBAAqB,CAAC;AACnD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,kBACd,OACA,UACA,MACA,QACU;AACV,MAAI,UAAU,UAAU;AACtB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,YAAY,KAAK,UAAU,QAAQ,CAAC;AAAA,IAC/C,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,0BACd,OACA,MACA,QACwB;AACxB,MAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,WACd,OACA,MACA,QACa;AACb,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAUO,SAAS,YACd,QACA,SACM;AACN,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,qBAAqB,SAAS,MAAM;AAAA,EAChD;AACF;;;AClKA,IAAM,oCAAoC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mCAAmC,CAAC,YAAY,eAAe;AAErE,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,WACE;AAAA,EACF,YACE;AAAA,EACF,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;AA4gCO,SAAS,wBACd,OACoC;AACpC,QAAM,SAAS,0BAA0B,KAAK;AAC9C,cAAY,QAAQ,6BAA6B;AACnD;AAEO,SAAS,0BACd,OACwB;AACxB,QAAM,SAAiC,CAAC;AACxC,QAAM,SAAS,cAAc,OAAO,KAAK,MAAM;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,0BAAwB,QAAQ,mCAAmC,KAAK,QAAQ,gCAAgC;AAChH,oBAAkB,OAAO,eAAe,oBAAoB,mBAAmB,MAAM;AACrF,aAAW,OAAO,OAAO,WAAW,MAAM;AAC1C,4BAA0B,OAAO,WAAW,eAAe,MAAM;AACjE,4BAA0B,OAAO,WAAW,eAAe,MAAM;AAEjE,mBAAiB,OAAO,UAAU,cAAc,MAAM;AACtD,wBAAsB,OAAO,QAAQ,YAAY,MAAM;AACvD,2BAAyB,OAAO,WAAW,eAAe,MAAM;AAChE,uBAAqB,OAAO,OAAO,WAAW,MAAM;AACpD,uBAAqB,OAAO,SAAS,aAAa,MAAM;AACxD,sBAAoB,OAAO,QAAQ,YAAY,MAAM;AACrD,4BAA0B,OAAO,cAAc,kBAAkB,MAAM;AACvE,0BAAwB,OAAO,aAAa,iBAAiB,MAAM;AACnE,MAAI,OAAO,aAAa,QAAW;AACjC,4BAAwB,OAAO,UAAU,cAAc,MAAM;AAAA,EAC/D;AACA,6BAA2B,QAAQ,MAAM;AAEzC,SAAO;AACT;AAEA,SAAS,iBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,mBAAmB,cAAc,OAAO,kBAAkB,GAAG,IAAI,qBAAqB,MAAM;AAClG,MAAI,CAAC,kBAAkB;AACrB;AAAA,EACF;AAEA,aAAW,CAAC,aAAa,aAAa,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AAC3E,QAAI,OAAO,kBAAkB,UAAU;AACrC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,qBAAqB,WAAW;AAAA,QAC7C,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,mBAAiB,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAChE,mBAAiB,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAChE,mBAAiB,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AACxD,MAAI,OAAO,iBAAiB,QAAW;AACrC,2BAAuB,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AAAA,EAC5E;AACF;AAEA,SAAS,iBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC1D,uBAAmB,SAAS,WAAW,GAAG,IAAI,IAAI,OAAO,IAAI,MAAM;AACnE,UAAM,mBAAmB,cAAc,YAAY,GAAG,IAAI,IAAI,OAAO,IAAI,MAAM;AAC/E,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AACA,QAAI,iBAAiB,YAAY,SAAS;AACxC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC5D,UAAM,mBAAmB,cAAc,YAAY,GAAG,IAAI,IAAI,SAAS,IAAI,MAAM;AACjF,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AACA,QAAI,iBAAiB,SAAS,WAAW;AACvC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,QAC1B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,iBAAiB,eAAe,UAAa,OAAO,iBAAiB,eAAe,UAAU;AAChG,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,QAC1B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,yBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,sBAAsB;AAAA,IAC1B,OAAO;AAAA,IACP,GAAG,IAAI;AAAA,IACP;AAAA,EACF;AACA,MAAI,qBAAqB;AACvB,eAAW,CAAC,YAAY,UAAU,KAAK,OAAO,QAAQ,mBAAmB,GAAG;AAC1E;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,IAAI,wBAAwB,UAAU;AAAA,QACzC;AAAA,MACF;AACA,YAAM,mBAAmB;AAAA,QACvB;AAAA,QACA,GAAG,IAAI,wBAAwB,UAAU;AAAA,QACzC;AAAA,MACF;AACA,UAAI,oBAAoB,iBAAiB,wBAAwB,YAAY;AAC3E,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,wBAAwB,UAAU;AAAA,UAC/C,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC7E,MAAI,WAAW;AACb,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9D;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AACA,UAAI,eAAe,wBAAwB,YAAY;AACrD,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,cAAc,UAAU;AAAA,UACrC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,QACE,eAAe;AAAA,QACf;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AACjE,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,aAAW,CAAC,SAAS,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACnD,uBAAmB,SAAS,WAAW,GAAG,IAAI,UAAU,OAAO,IAAI,MAAM;AACzE,UAAM,aAAa,cAAc,MAAM,GAAG,IAAI,UAAU,OAAO,IAAI,MAAM;AACzE,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,QAAI,WAAW,YAAY,SAAS;AAClC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,UAAU,OAAO;AAAA,QAC9B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA;AAAA,MACE,WAAW;AAAA,MACX;AAAA,MACA,GAAG,IAAI,UAAU,OAAO;AAAA,MACxB;AAAA,IACF;AACA,QAAI,WAAW,mBAAmB,QAAW;AAC3C;AAAA,QACE,WAAW;AAAA,QACX;AAAA,QACA,GAAG,IAAI,UAAU,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAC7D,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,6BAA6B,CAAC;AAAA,MACjF,OAAO;AACL,eAAO,SAAS;AAAA,UAAQ,CAAC,OAAO,UAC9B,qBAAqB,OAAO,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AAAA,QAClE;AAAA,MACF;AACA,UAAI,SAAS,eAAe,OAAO,YAAY,QAAW;AACxD,2BAAmB,OAAO,SAAS,WAAW,GAAG,IAAI,YAAY,MAAM;AAAA,MACzE;AACA,UAAI,SAAS,eAAe,OAAO,cAAc,QAAW;AAC1D,cAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC7E,YAAI,WAAW;AACb;AAAA,YACE,UAAU;AAAA,YACV;AAAA,YACA,GAAG,IAAI;AAAA,YACP;AAAA,UACF;AACA,cAAI,OAAO,UAAU,UAAU,UAAU;AACvC,mBAAO,KAAK;AAAA,cACV,MAAM,GAAG,IAAI;AAAA,cACb,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,aAAa;AACxB,qBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAAA,MAClD;AACA;AAAA,IACF,KAAK;AACH,yBAAmB,OAAO,gBAAgB,kBAAkB,GAAG,IAAI,mBAAmB,MAAM;AAC5F;AAAA,IACF,KAAK;AACH,yBAAmB,OAAO,SAAS,WAAW,GAAG,IAAI,YAAY,MAAM;AACvE,UAAI,OAAO,iBAAiB,QAAW;AACrC,qBAAa,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AAAA,MAClE;AACA,UAAI,OAAO,YAAY,QAAW;AAChC,cAAM,UAAU,aAAa,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM;AACtE,YAAI,WAAW,YAAY,YAAY,YAAY,YAAY;AAC7D,iBAAO,KAAK;AAAA,YACV,MAAM,GAAG,IAAI;AAAA,YACb,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,OAAO,aAAa,QAAW;AACjC,wCAAgC,OAAO,UAAU,GAAG,IAAI,aAAa,MAAM;AAAA,MAC7E;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,yBAAmB,OAAO,YAAY,cAAc,GAAG,IAAI,eAAe,MAAM;AAChF,yBAAmB,OAAO,WAAW,aAAa,GAAG,IAAI,cAAc,MAAM;AAC7E,UAAI,OAAO,WAAW,QAAW;AAC/B,qBAAa,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AAAA,MACtD;AACA;AAAA,IACF,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,WAAW,GAAG;AACtC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,gBAAgB,SAAS,gCAAgC,CAAC;AAAA,MACvF;AACA,UAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/B,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,SAAS,SAAS,yBAAyB,CAAC;AAAA,MACzE,OAAO;AACL,eAAO,KAAK;AAAA,UAAQ,CAAC,KAAK,aACxB,qBAAqB,KAAK,GAAG,IAAI,SAAS,QAAQ,KAAK,MAAM;AAAA,QAC/D;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,GAAG;AAChC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,UAAU,SAAS,0BAA0B,CAAC;AAAA,MAC3E,OAAO;AACL,eAAO,MAAM;AAAA,UAAQ,CAAC,MAAM,cAC1B,qBAAqB,MAAM,GAAG,IAAI,UAAU,SAAS,KAAK,MAAM;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,6BAA6B,CAAC;AAAA,MACjF,OAAO;AACL,eAAO,SAAS;AAAA,UAAQ,CAAC,OAAO,eAC9B,qBAAqB,OAAO,GAAG,IAAI,aAAa,UAAU,KAAK,MAAM;AAAA,QACvE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC1D,mBAAa,OAAO,aAAa,GAAG,IAAI,gBAAgB,MAAM;AAC9D,UAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,6BAA6B,CAAC;AAAA,MACjF,OAAO;AACL,eAAO,SAAS;AAAA,UAAQ,CAAC,OAAO,UAC9B,qBAAqB,OAAO,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAC5D,mBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAChD;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAC5D;AAAA,IACF,KAAK;AACH;AAAA,IACF,KAAK;AACH,UAAI,OAAO,OAAO,SAAS,UAAU;AACnC,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAChD,UAAI,OAAO,SAAS,QAAW;AAC7B,qBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAAA,MAClD;AACA;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AACpD,UAAI,OAAO,aAAa,cAAc,OAAO,aAAa,WAAW;AACnE,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,mBAAa,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AACpD;AAAA,IACF;AACE,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS,yBAAyB,KAAK,UAAU,IAAI,CAAC;AAAA,MACxD,CAAC;AAAA,EACL;AACF;AAEA,SAAS,gCACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,iCAA6B,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AAAA,EAC9F;AACA,MAAI,OAAO,qBAAqB,QAAW;AACzC,iCAA6B,OAAO,kBAAkB,GAAG,IAAI,qBAAqB,MAAM;AAAA,EAC1F;AACA,MAAI,OAAO,SAAS,QAAW;AAC7B,UAAM,OAAO,aAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAC7D,QACE,QACA,SAAS,UACT,SAAS,YACT,SAAS,WACT,SAAS,aACT,SAAS,gBACT;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,6BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,iBAAiB,QAAW;AACrC,iBAAa,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AAAA,EAClE;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AAAA,EACpD;AACA,MAAI,OAAO,WAAW,UAAa,OAAO,OAAO,WAAW,UAAU;AACpE,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,OAAO,UAAU,GAAG,IAAI,aAAa,MAAM;AAC1E,MAAI,UAAU;AACZ,eAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,yBAAmB,WAAW,aAAa,GAAG,IAAI,aAAa,SAAS,IAAI,MAAM;AAClF,YAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,aAAa,SAAS,IAAI,MAAM;AAClF,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AACA,UAAI,aAAa,cAAc,WAAW;AACxC,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,aAAa,SAAS;AAAA,UACnC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,qBAAe,aAAa,QAAQ,GAAG,IAAI,aAAa,SAAS,WAAW,MAAM;AAClF;AAAA,QACE,aAAa;AAAA,QACb,GAAG,IAAI,aAAa,SAAS;AAAA,QAC7B;AAAA,MACF;AACA,4BAAsB,aAAa,QAAQ,GAAG,IAAI,aAAa,SAAS,WAAW,MAAM;AACzF,UAAI,aAAa,cAAc,QAAW;AACxC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,aAAa,QAAW;AACvC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,SAAS,QAAW;AACnC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,MAAM,QAAQ,aAAa,UAAU,GAAG;AAC3C,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,aAAa,SAAS;AAAA,UACnC,SAAS;AAAA,QACX,CAAC;AAAA,MACH,OAAO;AACL,qBAAa,WAAW;AAAA,UAAQ,CAAC,WAAW,UAC1C;AAAA,YACE;AAAA,YACA;AAAA,YACA,GAAG,IAAI,aAAa,SAAS,eAAe,KAAK;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,YAAY,QAAW;AACtC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,eAAe,QAAW;AACzC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,eAAe,QAAW;AACzC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UACE,aAAa,eAAe,UAC5B,OAAO,aAAa,eAAe,WACnC;AACA,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,aAAa,SAAS;AAAA,UACnC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,UAAI,aAAa,aAAa,QAAW;AACvC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC7E,MAAI,WAAW;AACb,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9D,yBAAmB,YAAY,cAAc,GAAG,IAAI,cAAc,UAAU,IAAI,MAAM;AACtF,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AACA,UAAI,eAAe,aAAa,YAAY;AAC1C,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,cAAc,UAAU;AAAA,UACrC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,qBAAe,eAAe,QAAQ,GAAG,IAAI,cAAc,UAAU,WAAW,MAAM;AACtF,2BAAqB,eAAe,MAAM,GAAG,IAAI,cAAc,UAAU,SAAS,MAAM;AACxF;AAAA,QACE,eAAe;AAAA,QACf,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA;AAAA,QACE,eAAe;AAAA,QACf,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,eAAe,aAAa,QAAW;AACzC;AAAA,UACE,eAAe;AAAA,UACf,GAAG,IAAI,cAAc,UAAU;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AACA,UAAI,eAAe,eAAe,QAAW;AAC3C;AAAA,UACE,eAAe;AAAA,UACf,GAAG,IAAI,cAAc,UAAU;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AACA,UAAI,eAAe,aAAa,QAAW;AACzC;AAAA,UACE,eAAe;AAAA,UACf,GAAG,IAAI,cAAc,UAAU;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OACA,MACA,QACM;AACN,MAAI,UAAU,UAAU,UAAU,cAAc,UAAU,YAAY;AACpE;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,uBACP,OACA,MACA,QACM;AACN,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,OAAO,UAAU;AAC9B,UAAM,SAAS,cAAc,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM;AAC/D,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,iBAAa,OAAO,SAAS,GAAG,IAAI,IAAI,KAAK,aAAa,MAAM;AAChE,iBAAa,OAAO,UAAU,GAAG,IAAI,IAAI,KAAK,cAAc,MAAM;AAClE,2BAAuB,OAAO,MAAM,GAAG,IAAI,IAAI,KAAK,UAAU,MAAM;AACpE,8BAA0B,OAAO,WAAW,GAAG,IAAI,IAAI,KAAK,eAAe,MAAM;AACjF,QAAI,OAAO,aAAa,QAAW;AACjC,mCAA6B,OAAO,UAAU,GAAG,IAAI,IAAI,KAAK,cAAc,MAAM;AAAA,IACpF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,6BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,QAAI,OAAO,KAAK,MAAM,QAAW;AAC/B,mBAAa,OAAO,KAAK,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM;AAAA,IACxD;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,4BAA0B,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AACzE,eAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAC9D;AAEA,SAAS,8BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MACE,OAAO,WAAW,UAClB,OAAO,WAAW,aAClB,OAAO,WAAW,UAClB;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,iBAAa,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AAAA,EAC9E;AACA,MAAI,OAAO,eAAe,QAAW;AACnC,iBAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAAA,EAC9D;AACF;AAEA,SAAS,qBACP,OACA,MACA,QACM;AACN,MACE,UAAU,eACV,UAAU,cACV,UAAU,gBACV,UAAU,UACV,UAAU,mBACV;AACA;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,uBACP,OACA,MACA,QACM;AACN,MACE,UAAU,UACV,UAAU,cACV,UAAU,cACV,UAAU,YACV;AACA;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,mBACP,OACA,MACA,QACM;AACN,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AAEA,QAAM;AAAA,IAAQ,CAAC,WAAW,UACxB,mBAAmB,WAAW,aAAa,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM;AAAA,EACxE;AACF;AAEA,SAAS,yBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MACE,OAAO,WAAW,UAClB,OAAO,WAAW,aAClB,OAAO,WAAW,UAClB;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,aAAW,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,QAAI,OAAO,KAAK,MAAM,QAAW;AAC/B,mBAAa,OAAO,KAAK,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM;AAAA,IACxD;AAAA,EACF;AAEA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,UAAM,MAAM,cAAc,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AACzF,QAAI,KAAK;AACP,mBAAa,IAAI,QAAQ,GAAG,IAAI,8BAA8B,MAAM;AACpE,mBAAa,IAAI,WAAW,GAAG,IAAI,iCAAiC,MAAM;AAAA,IAC5E;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,QAAW;AACjC,UAAM,KAAK,cAAc,OAAO,UAAU,GAAG,IAAI,aAAa,MAAM;AACpE,QAAI,IAAI;AACN,mBAAa,GAAG,QAAQ,GAAG,IAAI,oBAAoB,MAAM;AACzD,mBAAa,GAAG,WAAW,GAAG,IAAI,uBAAuB,MAAM;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB,OAAO;AAAA,IACP,GAAG,IAAI;AAAA,IACP;AAAA,EACF;AACA,MAAI,iBAAiB;AACnB,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,eAAe,GAAG;AACpE,yBAAmB,YAAY,cAAc,GAAG,IAAI,oBAAoB,UAAU,IAAI,MAAM;AAC5F,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,QACrC;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AACA,UAAI,eAAe,eAAe,YAAY;AAC5C,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,oBAAoB,UAAU;AAAA,UAC3C,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,QACE,eAAe;AAAA,QACf,GAAG,IAAI,oBAAoB,UAAU;AAAA,QACrC;AAAA,MACF;AACA;AAAA,QACE,eAAe;AAAA,QACf;AAAA,QACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,QACrC;AAAA,MACF;AACA,UAAI,eAAe,oBAAoB,QAAW;AAChD;AAAA,UACE,eAAe;AAAA,UACf;AAAA,UACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AACA,UAAI,eAAe,mBAAmB,QAAW;AAC/C;AAAA,UACE,eAAe;AAAA,UACf;AAAA,UACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,cAAc,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AACtF,MAAI,cAAc;AAChB,eAAW,CAAC,iBAAiB,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AACzE;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,IAAI,iBAAiB,eAAe;AAAA,QACvC;AAAA,MACF;AACA,YAAM,oBAAoB;AAAA,QACxB;AAAA,QACA,GAAG,IAAI,iBAAiB,eAAe;AAAA,QACvC;AAAA,MACF;AACA,UAAI,CAAC,mBAAmB;AACtB;AAAA,MACF;AACA,UAAI,kBAAkB,oBAAoB,iBAAiB;AACzD,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,iBAAiB,eAAe;AAAA,UAC7C,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,UAAI,MAAM,QAAQ,kBAAkB,eAAe,GAAG;AACpD,0BAAkB,gBAAgB;AAAA,UAAQ,CAAC,gBAAgB,UACzD;AAAA,YACE;AAAA,YACA;AAAA,YACA,GAAG,IAAI,iBAAiB,eAAe,oBAAoB,KAAK;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAClC,WAAO,SAAS,QAAQ,CAAC,SAAS,UAAU;AAC1C,YAAM,gBAAgB,cAAc,SAAS,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AACjF,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AACA;AAAA,QACE,cAAc;AAAA,QACd;AAAA,QACA,GAAG,IAAI,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AACA;AAAA,QACE,cAAc;AAAA,QACd;AAAA,QACA,GAAG,IAAI,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AAChC,WAAO,OAAO,QAAQ,CAAC,OAAO,UAAU;AACtC,YAAM,cAAc,cAAc,OAAO,GAAG,IAAI,WAAW,KAAK,KAAK,MAAM;AAC3E,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA;AAAA,QACE,YAAY;AAAA,QACZ;AAAA,QACA,GAAG,IAAI,WAAW,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAC7D,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,MAAI,SAAS,SAAS;AACpB,kBAAc,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AACnD,0BAAsB,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AAAA,EAC7D,WAAW,SAAS,QAAQ;AAC1B,QAAI,OAAO,OAAO,OAAO,UAAU;AACjC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,OAAO,UAAU,MAAM,OAAO,UAAU,GAAG;AAC7C,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,YAAY;AAC9B,kBAAc,OAAO,gBAAgB,GAAG,IAAI,mBAAmB,MAAM;AACrE,QACE,OAAO,WAAW,aAClB,OAAO,WAAW,kCAClB,OAAO,WAAW,mBAClB;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,MAAM,OAAO,UAAU,GAAG;AAC7C,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,OAAO,QAAQ,MAAM,OAAO,QAAQ,GAAG;AACzC,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BACP,QACA,QACM;AACN,QAAM,oBAAoB,IAAI;AAAA,IAC5B,OAAO,KAAK,cAAc,cAAc,OAAO,QAAQ,YAAY,CAAC,CAAC,GAAG,YAAY,uBAAuB,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EACtH;AACA,QAAM,uBAAuB,IAAI;AAAA,IAC/B,OAAO,KAAK,cAAc,cAAc,OAAO,WAAW,eAAe,CAAC,CAAC,GAAG,WAAW,yBAAyB,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EAC7H;AACA,QAAM,uBAAuB,IAAI;AAAA,IAC/B,OAAO,KAAK,cAAc,cAAc,OAAO,WAAW,eAAe,CAAC,CAAC,GAAG,qBAAqB,mCAAmC,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EACjJ;AACA,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,KAAK,cAAc,cAAc,OAAO,OAAO,WAAW,CAAC,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EACzG;AACA,QAAM,aAAa,IAAI;AAAA,KACpB,MAAM,QAAQ,cAAc,OAAO,aAAa,iBAAiB,CAAC,CAAC,GAAG,QAAQ,IAC1E,cAAc,OAAO,aAAa,iBAAiB,CAAC,CAAC,GAAG,WACzD,CAAC,GACH,QAAQ,CAAC,YAAY,OAAO,QAAQ,cAAc,WAAW,CAAC,QAAQ,SAAS,IAAI,CAAC,CAAC;AAAA,EACzF;AACA,QAAM,cAAc,IAAI;AAAA,IACtB,OAAO,KAAK,cAAc,cAAc,OAAO,cAAc,kBAAkB,CAAC,CAAC,GAAG,iBAAiB,kCAAkC,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EAClJ;AACA,QAAM,UAAU,eAAe,MAAM;AAErC,QAAM,qBAAqB;AAAA,IACzB,cAAc,OAAO,WAAW,eAAe,CAAC,CAAC,GAAG;AAAA,IACpD;AAAA,IACA,CAAC;AAAA,EACH;AACA,MAAI,oBAAoB;AACtB,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACvE,YAAM,iBAAiB,cAAc,UAAU,yBAAyB,UAAU,IAAI,CAAC,CAAC;AACxF,UACE,kBACA,OAAO,eAAe,wBAAwB,YAC9C,CAAC,qBAAqB,IAAI,eAAe,mBAAmB,GAC5D;AACA,eAAO,KAAK;AAAA,UACV,MAAM,yBAAyB,UAAU;AAAA,UACzC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,iCAA+B,OAAO,SAAS,aAAa,QAAQ;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,4BAA0B,OAAO,UAAU,cAAc,QAAQ;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,2BAAyB,OAAO,QAAQ,YAAY,QAAQ,UAAU;AACxE;AAEA,SAAS,+BACP,OACA,MACA,QACA,YAQM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,MAAI,SAAS,aAAa;AACxB,QACE,OAAO,OAAO,YAAY,YAC1B,CAAC,WAAW,kBAAkB,IAAI,OAAO,OAAO,GAChD;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,CAAC,CAAC;AACzE,QACE,aACA,OAAO,UAAU,wBAAwB,YACzC,CAAC,WAAW,qBAAqB,IAAI,UAAU,mBAAmB,GAClE;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,SAAS;AAC3B,QAAI,OAAO,OAAO,YAAY,YAAY,CAAC,WAAW,SAAS,IAAI,OAAO,OAAO,GAAG;AAClF,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,mBAAmB,SAAS,gBAAgB;AAC9D,QAAI,OAAO,OAAO,eAAe,YAAY,CAAC,WAAW,YAAY,IAAI,OAAO,UAAU,GAAG;AAC3F,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,OAAO,OAAO,cAAc,YAAY,CAAC,WAAW,WAAW,IAAI,OAAO,SAAS,GAAG;AACxF,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,gBAAgB;AAClC,QAAI,OAAO,OAAO,WAAW,YAAY,CAAC,WAAW,QAAQ,IAAI,GAAG,OAAO,QAAQ,IAAI,OAAO,MAAM,EAAE,GAAG;AACvG,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAClC,WAAO,SAAS;AAAA,MAAQ,CAAC,OAAO,UAC9B,+BAA+B,OAAO,GAAG,IAAI,aAAa,KAAK,KAAK,QAAQ,UAAU;AAAA,IACxF;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC9B,WAAO,KAAK;AAAA,MAAQ,CAAC,KAAK,UACxB,+BAA+B,KAAK,GAAG,IAAI,SAAS,KAAK,KAAK,QAAQ,UAAU;AAAA,IAClF;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/B,WAAO,MAAM;AAAA,MAAQ,CAAC,MAAM,UAC1B,+BAA+B,MAAM,GAAG,IAAI,UAAU,KAAK,KAAK,QAAQ,UAAU;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,yBACP,OACA,MACA,QACA,YACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,OAAO,UAAU,GAAG,IAAI,aAAa,CAAC,CAAC;AACtE,MAAI,UAAU;AACZ,eAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,YAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,aAAa,SAAS,IAAI,CAAC,CAAC;AAC9E,UAAI,CAAC,gBAAgB,CAAC,MAAM,QAAQ,aAAa,UAAU,GAAG;AAC5D;AAAA,MACF;AACA,mBAAa,WAAW,QAAQ,CAAC,WAAW,UAAU;AACpD,YAAI,OAAO,cAAc,YAAY,CAAC,WAAW,IAAI,SAAS,GAAG;AAC/D,iBAAO,KAAK;AAAA,YACV,MAAM,GAAG,IAAI,aAAa,SAAS,eAAe,KAAK;AAAA,YACvD,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,CAAC,CAAC;AACzE,MAAI,WAAW;AACb,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9D,YAAM,iBAAiB,cAAc,UAAU,GAAG,IAAI,cAAc,UAAU,IAAI,CAAC,CAAC;AACpF,UAAI,CAAC,kBAAkB,CAAC,MAAM,QAAQ,eAAe,UAAU,GAAG;AAChE;AAAA,MACF;AACA,qBAAe,WAAW,QAAQ,CAAC,WAAW,UAAU;AACtD,YAAI,OAAO,cAAc,YAAY,CAAC,WAAW,IAAI,SAAS,GAAG;AAC/D,iBAAO,KAAK;AAAA,YACV,MAAM,GAAG,IAAI,cAAc,UAAU,eAAe,KAAK;AAAA,YACzD,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,MACA,QACA,YAQM;AACN,MAAI,UAAU,QAAW;AACvB;AAAA,EACF;AACA,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAClE,UAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,CAAC,CAAC;AAC1E,QAAI,CAAC,gBAAgB,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACxD;AAAA,IACF;AACA,iBAAa,OAAO;AAAA,MAAQ,CAAC,OAAO,eAClC,+BAA+B,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,QAAQ,UAAU;AAAA,IAC7G;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAClE,UAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,CAAC,CAAC;AAC1E,QAAI,CAAC,gBAAgB,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACxD;AAAA,IACF;AACA,iBAAa,OAAO;AAAA,MAAQ,CAAC,OAAO,eAClC,+BAA+B,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,QAAQ,UAAU;AAAA,IAC7G;AAAA,EACF,CAAC;AAED,MAAI,OAAO,uBAAuB,QAAW;AAC3C,UAAM,qBAAqB,cAAc,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,CAAC,CAAC;AACpG,UAAM,YAAY,cAAc,oBAAoB,WAAW,GAAG,IAAI,iCAAiC,CAAC,CAAC;AACzG,QAAI,WAAW;AACb,iBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,SAAS,GAAG;AACtD,cAAM,aAAa,cAAc,MAAM,GAAG,IAAI,iCAAiC,MAAM,IAAI,CAAC,CAAC;AAC3F,YAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpD;AAAA,QACF;AACA,mBAAW,OAAO;AAAA,UAAQ,CAAC,OAAO,eAChC;AAAA,YACE;AAAA,YACA,GAAG,IAAI,iCAAiC,MAAM,WAAW,UAAU;AAAA,YACnE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,cAAc,oBAAoB,UAAU,GAAG,IAAI,gCAAgC,CAAC,CAAC;AACtG,QAAI,UAAU;AACZ,iBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,cAAM,aAAa,cAAc,MAAM,GAAG,IAAI,gCAAgC,MAAM,IAAI,CAAC,CAAC;AAC1F,YAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpD;AAAA,QACF;AACA,mBAAW,OAAO;AAAA,UAAQ,CAAC,OAAO,eAChC;AAAA,YACE;AAAA,YACA,GAAG,IAAI,gCAAgC,MAAM,WAAW,UAAU;AAAA,YAClE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAA8C;AACpE,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,cAAc,OAAO,UAAU,cAAc,CAAC,CAAC;AAChE,QAAM,qBAAqB,cAAc,UAAU,oBAAoB,iCAAiC,CAAC,CAAC;AAC1G,QAAM,YAAY,cAAc,oBAAoB,WAAW,2CAA2C,CAAC,CAAC;AAC5G,MAAI,WAAW;AACb,WAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,WAAW,QAAQ,IAAI,YAAY,MAAM,EAAE,CAAC;AAAA,EAC9E;AACA,QAAM,WAAW,cAAc,oBAAoB,UAAU,0CAA0C,CAAC,CAAC;AACzG,MAAI,UAAU;AACZ,WAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,WAAW,QAAQ,IAAI,WAAW,MAAM,EAAE,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,cACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,UAAU;AACpE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBACP,QACA,cACA,MACA,QACA,qBACM;AACN,QAAM,aAAa,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AAC9C,QAAM,WAAW,IAAI,IAAI,YAAY;AACrC,QAAM,WAAW,IAAI,IAAI,uBAAuB,CAAC,CAAC;AAElD,aAAW,eAAe,cAAc;AACtC,QAAI,CAAC,WAAW,IAAI,WAAW,GAAG;AAChC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS,wBAAwB,KAAK,UAAU,WAAW,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC,SAAS,IAAI,SAAS,GAAG;AACxD,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,QAC1B,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACA,MACA,QACM;AACN,MAAI,UAAU,QAAW;AACvB;AAAA,EACF;AACA,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,QAAW;AAChC,QAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAClC,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,SAAS,4BAA4B,CAAC;AAAA,IAC/E,OAAO;AACL,aAAO,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACxC,cAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,MAAM;AAC9E,YAAI,cAAc;AAChB,uBAAa,aAAa,SAAS,GAAG,IAAI,YAAY,KAAK,aAAa,MAAM;AAC9E,uBAAa,aAAa,UAAU,GAAG,IAAI,YAAY,KAAK,cAAc,MAAM;AAChF,uBAAa,aAAa,gBAAgB,GAAG,IAAI,YAAY,KAAK,oBAAoB,MAAM;AAC5F,cAAI,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACvC,mBAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,KAAK,YAAY,SAAS,2BAA2B,CAAC;AAAA,UAC/F,OAAO;AACL,yBAAa,OAAO;AAAA,cAAQ,CAAC,OAAO,eAClC,qBAAqB,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,MAAM;AAAA,YACvF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,QAAW;AAChC,QAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAClC,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,SAAS,4BAA4B,CAAC;AAAA,IAC/E,OAAO;AACL,aAAO,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACxC,cAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,MAAM;AAC9E,YAAI,cAAc;AAChB,uBAAa,aAAa,SAAS,GAAG,IAAI,YAAY,KAAK,aAAa,MAAM;AAC9E,uBAAa,aAAa,UAAU,GAAG,IAAI,YAAY,KAAK,cAAc,MAAM;AAChF,uBAAa,aAAa,gBAAgB,GAAG,IAAI,YAAY,KAAK,oBAAoB,MAAM;AAC5F,cAAI,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACvC,mBAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,KAAK,YAAY,SAAS,2BAA2B,CAAC;AAAA,UAC/F,OAAO;AACL,yBAAa,OAAO;AAAA,cAAQ,CAAC,OAAO,eAClC,qBAAqB,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,MAAM;AAAA,YACvF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,UAAM,qBAAqB,cAAc,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AACxG,QAAI,oBAAoB;AACtB,6BAAuB,mBAAmB,WAAW,YAAY,GAAG,IAAI,iCAAiC,MAAM;AAC/G,6BAAuB,mBAAmB,UAAU,WAAW,GAAG,IAAI,gCAAgC,MAAM;AAAA,IAC9G;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,cACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AACnD,UAAM,aAAa,cAAc,MAAM,GAAG,IAAI,IAAI,MAAM,IAAI,MAAM;AAClE,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,iBAAa,WAAW,QAAQ,GAAG,IAAI,IAAI,MAAM,WAAW,MAAM;AAClE,QAAI,WAAW,WAAW,QAAQ;AAChC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,MAAM;AAAA,QACvB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,WAAW,SAAS,cAAc;AACpC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,MAAM;AAAA,QACvB,SAAS,gBAAgB,YAAY;AAAA,MACvC,CAAC;AAAA,IACH;AACA,QAAI,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrC,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,MAAM,WAAW,SAAS,2BAA2B,CAAC;AAAA,IACvF,OAAO;AACL,iBAAW,OAAO;AAAA,QAAQ,CAAC,OAAO,eAChC,qBAAqB,OAAO,GAAG,IAAI,IAAI,MAAM,WAAW,UAAU,KAAK,MAAM;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBACP,OACA,QACA,MACA,QACe;AACf,QAAM,WAAW,aAAa,OAAO,MAAM,MAAM;AACjD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,MAAM,EAAE,KAAK,QAAQ,GAAG;AACvC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,oBAAoB,MAAM;AAAA,IACrC,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACn9EA,IAAM,mCAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mCAAmC,CAAC,iBAAiB,oBAAoB;AAqB/E,IAAM,qCAAqC,oBAAI,IAAoC;AAAA,EACjF;AAAA,EACA;AACF,CAAC;AAED,IAAM,gCACJ;AACF,IAAM,gCAAgC,oBAAI,IAA+B;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,uBAAuB,oBAAI,IAAuB;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,4BAA4B,oBAAI,IAA+B,CAAC,QAAQ,SAAS,CAAC;AACxF,IAAM,yBAAyB,oBAAI,IAA6B;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,qBAAqB,oBAAI,IAAqB;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,uBAAuB,oBAAI,IAA2B;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAiBM,SAAS,8BACd,UAC6C;AAC7C,QAAM,SAAS,gCAAgC,QAAQ;AACvD,cAAY,QAAQ,oCAAoC;AAC1D;AAEO,SAAS,gCACd,UACwB;AACxB,QAAM,SAAiC,CAAC;AACxC,QAAM,SAAS,cAAc,UAAU,KAAK,MAAM;AAClD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,EAAAA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,0BAAwB,OAAO,iBAAiB,qBAAqB,MAAM;AAC3E;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,eAAa,OAAO,YAAY,gBAAgB,MAAM;AACtD,eAAa,OAAO,OAAO,WAAW,MAAM;AAC5C,4BAA0B,OAAO,WAAW,eAAe,MAAM;AACjE,4BAA0B,OAAO,WAAW,eAAe,MAAM;AACjE,4BAA0B,OAAO,SAAS,aAAa,MAAM;AAC7D,eAAa,OAAO,aAAa,iBAAiB,MAAM;AAExD,QAAM,0BAA0B,0BAA0B,OAAO,iBAAiB;AAClF,SAAO,KAAK,GAAG,wBAAwB,IAAI,YAAY,qBAAqB,CAAC,CAAC;AAE9E,MACE,cAAc,OAAO,mBAAmB,uBAAuB,CAAC,CAAC,GAAG,UACpE,OAAO,OACP;AACA,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,8BAA4B,OAAO,eAAe,mBAAmB,MAAM;AAE3E,MAAI,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AACrC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,WAAO,WAAW,QAAQ,CAAC,SAAS,UAAU;AAC5C,4BAAsB,SAAS,gBAAgB,KAAK,KAAK,MAAM;AAAA,IACjE,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,kBAAkB,QAAW;AACtC,mCAA+B,OAAO,eAAe,mBAAmB,MAAM;AAAA,EAChF;AACA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,+BAA2B,OAAO,oBAAoB,wBAAwB,MAAM;AAAA,EACtF;AAEA,SAAO;AACT;AAEO,SAAS,0BACd,QACuC;AACvC,QAAM,SAAS,4BAA4B,MAAM;AACjD,cAAY,QAAQ,+BAA+B;AACrD;AAEO,SAAS,4BACd,QACA,OAAO,KACP,SAAiC,CAAC,GACV;AACxB,QAAM,SAAS,cAAc,QAAQ,MAAM,MAAM;AACjD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA,GAAG,IAAI;AAAA,IACP;AAAA,EACF;AACA,4BAA0B,OAAO,aAAa,GAAG,IAAI,gBAAgB,MAAM;AAE3E,MAAI,OAAO,OAAO,gBAAgB,WAAW;AAC3C,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,cAAc,GAAG;AACzC,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,WAAO,eAAe,QAAQ,CAAC,cAAc,UAAU;AACrD;AAAA,QACE;AAAA,QACA,GAAG,IAAI,mBAAmB,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,WAAO,SAAS,QAAQ,CAAC,SAAS,UAAU;AAC1C,4BAAsB,SAAS,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjC,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,WAAO,OAAO,QAAQ,CAAC,OAAO,UAAU;AACtC,0BAAoB,OAAO,GAAG,IAAI,WAAW,KAAK,KAAK,MAAM;AAAA,IAC/D,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,kCACP,cACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,cAAc,MAAM,MAAM;AACvD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,eAAa,OAAO,gBAAgB,GAAG,IAAI,mBAAmB,MAAM;AACpE,eAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAC5D,MACE,OAAO,OAAO,iBAAiB,YAC/B,CAAC,8BAA8B,IAAI,OAAO,YAAyC,GACnF;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,eAAa,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM;AACxD;AAEA,SAAS,sBACP,SACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,SAAS,MAAM,MAAM;AAClD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,eAAa,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC1D,MAAI,OAAO,OAAO,SAAS,YAAY,CAAC,qBAAqB,IAAI,OAAO,IAAyB,GAAG;AAClG,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS,uBAAuB,KAAK,UAAU,CAAC,GAAG,oBAAoB,CAAC,CAAC;AAAA,IAC3E,CAAC;AAAA,EACH;AACA,MACE,OAAO,OAAO,aAAa,YAC3B,CAAC,0BAA0B,IAAI,OAAO,QAAqC,GAC3E;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,eAAa,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM;AACtD,MACE,OAAO,OAAO,WAAW,YACzB,CAAC,uBAAuB,IAAI,OAAO,MAAiC,GACpE;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS,yBAAyB,KAAK,UAAU,CAAC,GAAG,sBAAsB,CAAC,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,eAAa,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM;AACtD,MAAI,OAAO,OAAO,SAAS,YAAY,CAAC,mBAAmB,IAAI,OAAO,IAAuB,GAAG;AAC9F,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS,uBAAuB,KAAK,UAAU,CAAC,GAAG,kBAAkB,CAAC,CAAC;AAAA,IACzE,CAAC;AAAA,EACH;AACA,eAAa,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM;AACtD,MACE,OAAO,OAAO,WAAW,YACzB,CAAC,qBAAqB,IAAI,OAAO,MAA+B,GAChE;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS,yBAAyB,KAAK,UAAU,CAAC,GAAG,oBAAoB,CAAC,CAAC;AAAA,IAC7E,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,OAAO,YAAY,WAAW;AACvC,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAASA,yBACP,QACA,cACA,cACA,MACA,QACM;AACN,QAAM,aAAa,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AAC9C,QAAM,cAAc,oBAAI,IAAI,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC;AAE9D,aAAW,eAAe,cAAc;AACtC,QAAI,CAAC,WAAW,IAAI,WAAW,GAAG;AAChC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS,wBAAwB,KAAK,UAAU,WAAW,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,CAAC,YAAY,IAAI,SAAS,GAAG;AAC/B,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,QAC1B,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,YAAY,UAAkB;AACrC,SAAO,CAAC,WAAuD;AAAA,IAC7D,MAAM,GAAG,QAAQ,GAAG,MAAM,SAAS,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,IACjE,SAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,wBACP,OACA,MACA,QACuC;AACvC,MAAI,OAAO,UAAU,YAAY,CAAC,mCAAmC,IAAI,KAAc,GAAG;AACxF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,mBAAmB,KAAK,UAAU,CAAC,GAAG,kCAAkC,CAAC,CAAC;AAAA,IACrF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,+BACP,eACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,eAAe,MAAM,MAAM;AACxD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,EAAAA;AAAA,IACE;AAAA,IACA,CAAC,UAAU,WAAW,YAAY,aAAa,aAAa;AAAA,IAC5D,CAAC,aAAa;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACA,oBAAkB,OAAO,QAAQ,QAAQ,GAAG,IAAI,WAAW,MAAM;AACjE,oBAAkB,OAAO,SAAS,mBAAmB,GAAG,IAAI,YAAY,MAAM;AAC9E;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA,GAAG,IAAI;AAAA,IACP;AAAA,EACF;AACA,eAAa,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC1D,eAAa,OAAO,aAAa,GAAG,IAAI,gBAAgB,MAAM;AAE9D,MACE,OAAO,OAAO,cAAc,YAC5B,CAAC,kBAAkB,KAAK,OAAO,SAAS,GACxC;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAa,OAAO,aAAa,GAAG,IAAI,gBAAgB,MAAM;AAAA,EAChE;AACF;AAEO,SAAS,8BAA8B,QASlB;AAC1B,0BAAwB,OAAO,iBAAiB;AAChD,4BAA0B,OAAO,aAAa;AAE9C,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO,kBAAkB;AAAA,IAChC,WAAW,OAAO,kBAAkB;AAAA,IACpC,WAAW,OAAO,kBAAkB;AAAA,IACpC,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,mBAAmB,OAAO;AAAA,IAC1B,eAAe,OAAO;AAAA,IACtB,YAAY,OAAO,cAAc,OAAO,cAAc;AAAA,IACtD,oBAAoB,OAAO;AAAA,IAC3B,eAAe,OAAO;AAAA,EACxB;AACF;AAEA,SAAS,2BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AACA,MAAI,OAAO,OAAO,0BAA0B,WAAW;AACrD,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,0BAA0B,SAAS,2CAA2C,CAAC;AAAA,EAC5G;AACA,MAAI,OAAO,aAAa,QAAW;AACjC,iBAAa,OAAO,UAAU,GAAG,IAAI,aAAa,MAAM;AAAA,EAC1D;AACA,MAAI,OAAO,OAAO,sBAAsB,WAAW;AACjD,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,sBAAsB,SAAS,uCAAuC,CAAC;AAAA,EACpG;AACA,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjC,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,WAAW,SAAS,2BAA2B,CAAC;AAAA,EAC7E,OAAO;AACL,WAAO,OAAO,QAAQ,CAAC,OAAO,UAAU,wBAAwB,OAAO,GAAG,IAAI,WAAW,KAAK,KAAK,MAAM,CAAC;AAAA,EAC5G;AACA,MAAI,CAAC,OAAO,UAAU,OAAO,kBAAkB,GAAG;AAChD,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,uBAAuB,SAAS,yCAAyC,CAAC;AAAA,EACvG;AACA,MAAI,CAAC,OAAO,UAAU,OAAO,mBAAmB,GAAG;AACjD,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,wBAAwB,SAAS,0CAA0C,CAAC;AAAA,EACzG;AACF;AAEA,SAAS,wBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AACA,eAAa,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM;AACtD,MAAI,OAAO,UAAU,UAAa,CAAC,OAAO,UAAU,OAAO,KAAK,GAAG;AACjE,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,UAAU,SAAS,4BAA4B,CAAC;AAAA,EAC7E;AACA,MAAI,OAAO,QAAQ,UAAa,CAAC,OAAO,UAAU,OAAO,GAAG,GAAG;AAC7D,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,QAAQ,SAAS,0BAA0B,CAAC;AAAA,EACzE;AACA,MAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAa,OAAO,aAAa,GAAG,IAAI,gBAAgB,MAAM;AAAA,EAChE;AACA,MAAI,OAAO,WAAW,QAAW;AAC/B,iBAAa,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AAAA,EACtD;AACA,MAAI,OAAO,OAAO,aAAa,WAAW;AACxC,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,8BAA8B,CAAC;AAAA,EAClF;AACA,eAAa,OAAO,mBAAmB,GAAG,IAAI,sBAAsB,MAAM;AAC5E;;;ACpbO,SAAS,yBAAsC;AACpD,SAAO;AAAA,IACL,UAAU,CAAC;AAAA,IACX,WAAW,CAAC;AAAA,EACd;AACF;AAEO,SAAS,+BACd,YACA,WAC2B;AAC3B,SAAO;AAAA,IACL,eAAe;AAAA,IACf,OAAO,0BAA0B,UAAU;AAAA,IAC3C,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,MACR,kBAAkB,CAAC;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,MACN,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,MACb,QAAQ,CAAC;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,WAAW,CAAC;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL,OAAO,CAAC;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU,CAAC,EAAE,MAAM,aAAa,UAAU,CAAC,EAAE,CAAC;AAAA,IAChD;AAAA,IACA,QAAQ,uBAAuB;AAAA,IAC/B,cAAc;AAAA,MACZ,iBAAiB,CAAC;AAAA,MAClB,cAAc,CAAC;AAAA,IACjB;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,MACX,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAAS,GAAG,OAAO,QAA2B;AACpF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,WAAW;AAAA,IACxB,aAAa,kBAAkB,QAAQ,MAAM,sBAAsB;AAAA,EACrE;AACF;AAEO,SAAS,+BAA+B,aAA0C;AACvF,SAAO;AAAA,IACL,eAAe;AAAA,IACf;AAAA,IACA,aAAa;AAAA,IACb,gBAAgB,CAAC;AAAA,IACjB,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,EACX;AACF;AAEO,SAAS,kBAAkB,SAAgD;AAChF,QAAM,aAAY,oBAAI,KAAK,CAAC,GAAE,YAAY;AAC1C,QAAM,qBAAqB,QAAQ,oBAC/B,qCAAqC,QAAQ,mBAAmB,QAAQ,YAAY,SAAS,IAC7F;AACJ,MAAI,QAAQ,mBAAmB;AAC7B,4BAAwB,QAAQ,iBAA4B;AAAA,EAC9D;AAEA,QAAM,qBAAqB,qBACvB,gBAAgB,mBAAmB,iBAAiB,IACpD,QAAQ,oBACN,gBAAgB,QAAQ,iBAAiB,IACzC,+BAA+B,QAAQ,YAAY,SAAS;AAClE,QAAM,WAAW,qBACb,oBAAoB,mBAAmB,UAAU,IACjD,QAAQ,YAAY,CAAC;AACzB,QAAM,gBACJ,qBACI,6BAA6B,mBAAmB,aAAa,IAC7D,QAAQ,iBAAiB,+BAA+B,mBAAmB,SAAS;AAE1F,SAAO;AAAA,IACL,OAAO,QAAQ,aAAa,UAAU;AAAA,IACtC,YAAY,QAAQ;AAAA,IACpB,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,IACrB,eAAe,oBAAoB;AAAA,IACnC,UAAU;AAAA,IACV,eAAe,GAAG,QAAQ,SAAS;AAAA,IACnC,SAAS;AAAA,IACT,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU;AAAA,IACV,WAAW,wBAAwB;AAAA,IACnC;AAAA,IACA;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,SAAS;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,qCACP,UACA,YACA,WACyB;AACzB,QAAM,SAAS,gCAAqC,QAAmB;AACvE,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS,SAAS,iBAAiB,GAAG;AAChE,kCAAmC,QAAmB;AAAA,EACxD;AAEA,QAAM,qBAAqB;AAAA,IACzB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,MAAI;AACF,4BAAwB,kBAA6B;AAAA,EACvD,QAAQ;AACN,kCAAmC,QAAmB;AAAA,EACxD;AACA,QAAM,gBAAgB,4BAA4B,OAAO,MAAM;AAC/D,QAAM,gBAAgB;AAAA,IACpB,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,iBACE,SAAS,oBAAoB,iCAC7B,SAAS,oBAAoB,gCACzB,SAAS,kBACT;AAAA,IACN,eAAe;AAAA,IACf,YACE,OAAO,SAAS,eAAe,YAAY,SAAS,WAAW,SAAS,IACpE,SAAS,aACT;AAAA,IACN,OAAO,mBAAmB;AAAA,IAC1B,WAAW,mBAAmB;AAAA,IAC9B,WAAW,mBAAmB;AAAA,IAC9B,SACE,OAAO,SAAS,YAAY,YAAY,SAAS,QAAQ,SAAS,IAC9D,SAAS,UACT,mBAAmB;AAAA,IACzB,aACE,OAAO,SAAS,gBAAgB,YAAY,SAAS,YAAY,SAAS,IACtE,SAAS,cACT;AAAA,IACN,mBAAmB;AAAA,IACnB;AAAA,IACA,YAAY,eAAe;AAAA,MACzB,GAAG,eAAe,SAAS,UAAU;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,IACD,eAAe,SAAS;AAAA,EAC1B;AACF;AAEA,SAAS,mCACP,OACA,YACA,WAC2B;AAC3B,QAAM,OAAO,+BAA+B,YAAY,SAAS;AACjE,QAAM,SAAS,SAAS,KAAK,IAAI,QAAQ,CAAC;AAC1C,QAAM,WAAW,SAAS,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AAEhE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,eAAe;AAAA,IACf,OAAO,OAAO,OAAO,KAAK,IAAI,OAAO,QAAQ,0BAA0B,UAAU;AAAA,IACjF,WACE,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,YACP,KAAK;AAAA,IACX,WACE,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,YACP,KAAK;AAAA,IACX,UAAU;AAAA,MACR,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,MACH,kBAAkB,SAAS,SAAS,gBAAgB,IAC/C,OAAO;AAAA,QACN,OAAO,QAAQ,SAAS,gBAAgB,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,OAAO,UAAU,QAAQ;AAAA,MAC3F,IACA,CAAC;AAAA,IACP;AAAA,IACA,QACE,OAAO,WAAW,SACd,KAAK,SACJ,OAAO;AAAA,IACd,WACE,OAAO,cAAc,SACjB,KAAK,YACJ,OAAO;AAAA,IACd,OACE,OAAO,UAAU,SACb,KAAK,QACJ,OAAO;AAAA,IACd,SAAS,SAAS,OAAO,OAAO,IAC3B,OAAO,UACR,KAAK;AAAA,IACT,QACE,OAAO,WAAW,SACd,KAAK,SACJ,OAAO;AAAA,IACd,cACE,OAAO,iBAAiB,SACpB,KAAK,eACJ,OAAO;AAAA,IACd,aACE,OAAO,gBAAgB,SACnB,KAAK,cACJ,OAAO;AAAA,IACd,GAAI,SAAS,OAAO,QAAQ,IACxB,EAAE,UAAU,OAAO,SAA6D,IAChF,CAAC;AAAA,EACP;AACF;AAEA,SAAS,0BACP,OACA,aACA,eACqB;AACrB,QAAM,SAAS,SAAS,KAAK,IAAI,QAAQ,CAAC;AAC1C,QAAM,WAAW,eAAe;AAAA,IAC9B,GAAG,eAAe,OAAO,QAAQ;AAAA,IACjC;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aACE,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,SAAS,IAClE,OAAO,cACP;AAAA,IACN,aAAa,OAAO,OAAO,gBAAgB,YAAY,OAAO,cAAc;AAAA,IAC5E,gBAAgB,MAAM,QAAQ,OAAO,cAAc,IAC/C,OAAO,eAAe,QAAQ,CAAC,UAAU;AACvC,UAAI,CAAC,SAAS,KAAK,GAAG;AACpB,eAAO,CAAC;AAAA,MACV;AACA,UACE,OAAO,MAAM,mBAAmB,YAChC,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,iBAAiB,YAC9B,OAAO,MAAM,YAAY,UACzB;AACA,eAAO,CAAC;AAAA,MACV;AACA,aAAO,CAAC;AAAA,QACN,gBAAgB,MAAM;AAAA,QACtB,YAAY,MAAM;AAAA,QAClB,cAAc,MAAM;AAAA,QACpB,SAAS,MAAM;AAAA,QACf,GAAI,MAAM,kBAAkB,SAAS,MAAM,cAAc,IACrD,EAAE,gBAAgB,MAAM,eAAoD,IAC5E,CAAC;AAAA,QACL,GAAI,SAAS,MAAM,OAAO,IAAI,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH,CAAC,IACD,CAAC;AAAA,IACL;AAAA,IACA,QAAQ,MAAM,QAAQ,OAAO,MAAM,IAC/B,OAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,UAAI,CAAC,SAAS,KAAK,GAAG;AACpB,eAAO,CAAC;AAAA,MACV;AACA,UACE,OAAO,MAAM,YAAY,YACzB,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,YAAY,YACzB,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,YAAY,WACzB;AACA,eAAO,CAAC;AAAA,MACV;AACA,aAAO,CAAC;AAAA,QACN,SAAS,MAAM;AAAA,QACf,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,GAAI,SAAS,MAAM,OAAO,IAAI,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH,CAAC,IACD,CAAC;AAAA,EACP;AACF;AAEA,SAAS,eAAe,OAAiC;AACvD,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM,QAAQ,CAAC,YAAY;AAChC,QAAI,CAAC,SAAS,OAAO,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AACA,QACE,OAAO,QAAQ,cAAc,YAC7B,OAAO,QAAQ,SAAS,YACxB,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,YAAY,YAC3B,OAAO,QAAQ,WAAW,UAC1B;AACA,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,CAAC;AAAA,MACN,WAAW,QAAQ;AAAA,MACnB,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,GAAI,QAAQ,kBAAkB,SAAS,QAAQ,cAAc,IACzD,EAAE,gBAAgB,QAAQ,eAAoD,IAC9E,CAAC;AAAA,MACL,GAAI,OAAO,QAAQ,mBAAmB,WAClC,EAAE,gBAAgB,QAAQ,eAAe,IACzC,CAAC;AAAA,MACL,GAAI,SAAS,QAAQ,OAAO,IAAI,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,4BAA4B,YAAmC;AACtE,SAAO;AAAA,IACL,WAAW,2BAA2B,UAAU;AAAA,IAChD,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,+CAA+C,UAAU,oBAAoB,eAAe,IAAI,KAAK,GAAG;AAAA,IACjH,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,eAAe,UAA4C;AAClE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAA0B,CAAC;AAEjC,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,QAAQ,aAAa,KAAK,IAAI,QAAQ,SAAS,GAAG;AACrD;AAAA,IACF;AACA,SAAK,IAAI,QAAQ,SAAS;AAC1B,WAAO,KAAK,OAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,OAAqD;AACvF,QAAM,oBAAoB,YAAY,MAAM,SAAS,OAAO;AAE5D,SAAO;AAAA,IACL,gBAAgB,uBAAuB,MAAM,SAAS,OAAO;AAAA,IAC7D,WAAW,kBAAkB,KAAK,EAAE,WAAW,IAAI,IAAI,kBAAkB,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,IAC9F,gBAAgB,MAAM,KAAK,iBAAiB,EAAE;AAAA,IAC9C,cAAc,OAAO,KAAK,MAAM,SAAS,OAAO,QAAQ,EAAE;AAAA,IAC1D,eAAe,OAAO,KAAK,MAAM,SAAS,OAAO,SAAS,EAAE;AAAA,EAC9D;AACF;AAkDO,SAASC,+BACd,OACA,SAMyB;AACzB,QAAM,WAAW,8BAAmC;AAAA,IAClD,YAAY,MAAM;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,eAAgB,QAAQ,iBAAiB,MAAM;AAAA,IAC/C,YAAY,MAAM;AAAA,IAClB,oBAAoB,QAAQ;AAAA,IAC5B,eAAe,MAAM;AAAA,EACvB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,uBAAuB,SAA0B;AACxD,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,WAAW,OAAO,YAAY,YAAY,MAAM,QAAS,QAAmC,MAAM,GAAG;AACvG,WAAS,QAAkC,OAAQ;AAAA,EACrD;AAEA,SAAO,YAAY,OAAO,EAAE,SAAS,IAAI,IAAI;AAC/C;AAEA,SAAS,oBAAoB,UAA4C;AACvE,SAAO,SAAS,IAAI,CAAC,aAAa;AAAA,IAChC,GAAG;AAAA,IACH,gBAAgB,QAAQ,iBACpB,0BAA0B,QAAQ,cAAc,IAChD;AAAA,EACN,EAAE;AACJ;AAEA,SAAS,6BAA6B,QAAkD;AACtF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,OAAO,eAAe,IAAI,CAAC,WAAW;AAAA,MACpD,GAAG;AAAA,MACH,gBAAgB,MAAM,iBAClB,0BAA0B,MAAM,cAAc,IAC9C;AAAA,IACN,EAAE;AAAA,IACF,UAAU,oBAAoB,OAAO,QAAQ;AAAA,EAC/C;AACF;AAEA,SAAS,0BAA0B,QAAwD;AACzF,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,SAAS;AACZ,YAAM,cAAc;AAMpB,aAAO,YAAY,QACf,kBAAkB,YAAY,MAAM,MAAM,YAAY,MAAM,IAAI,YAAY,KAAK,IACjF,kBAAkB,YAAY,QAAQ,GAAG,YAAY,MAAM,GAAG,YAAY,KAAK;AAAA,IACrF;AAAA,IACA,KAAK;AACH,aAAO,iBAAiB,OAAO,IAAI,OAAO,KAAK;AAAA,IACjD,KAAK;AACH,aAAO,qBAAqB,OAAO,gBAAgB,OAAO,MAAM;AAAA,EACpE;AACF;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,EAAE,KAAK,GAAG;AAAA,EACxD;AAEA,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,OAAO,KAAgC,EAClD,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,EAC/B,OAAO,OAAO,EACd,KAAK,GAAG;AACb;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,0BAA0B,YAA4B;AACpE,QAAM,WAAW,CAAC,SAAyB;AACzC,QAAI,OAAO;AACX,eAAW,QAAQ,MAAM;AACvB,cAAQ,KAAK,WAAW,CAAC;AACzB,aAAO,KAAK,KAAK,MAAM,QAAU;AAAA,IACnC;AACA,YAAQ,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAClD;AAEA,QAAM,MACJ,SAAS,GAAG,UAAU,IAAI,IAC1B,SAAS,GAAG,UAAU,IAAI,IAC1B,SAAS,GAAG,UAAU,IAAI,IAC1B,SAAS,GAAG,UAAU,IAAI;AAE5B,SAAO;AAAA,IACL,IAAI,MAAM,GAAG,CAAC;AAAA,IACd,IAAI,MAAM,GAAG,EAAE;AAAA,IACf,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,IACrB,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,IACrB,IAAI,MAAM,IAAI,EAAE;AAAA,EAClB,EAAE,KAAK,GAAG;AACZ;AAEO,SAAS,6BAA6B,OAAqC;AAChF,QAAM,SAAS,SAAS,KAAK,IAAI,QAAQ,CAAC;AAC1C,QAAM,WACJ,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,YACP,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,SAAS,IAC9D,OAAO,WACP;AACR,QAAM,YACJ,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,aACP,oBAAI,KAAK,CAAC,GAAE,YAAY;AAC9B,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IACxC,OAAO,QACJ,OAAO,CAAC,UAA4C,SAAS,KAAK,CAAC,EACnE,IAAI,CAAC,OAAO,WAAW;AAAA,IACtB,SACE,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,IACxD,MAAM,UACN,GAAG,OAAO,OAAO,aAAa,SAAS,CAAC,UAAU,QAAQ,CAAC;AAAA,IACjE,UACE,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,SAAS,IAC1D,MAAM,WACN;AAAA,IACN,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,IACpD,WACE,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,IAC5D,MAAM,YACN;AAAA,IACN,UAAU,SAAS,MAAM,QAAQ,IAC7B;AAAA,MACE,gBACE,OAAO,MAAM,SAAS,mBAAmB,WACrC,MAAM,SAAS,iBACf;AAAA,MACN,QACE,OAAO,MAAM,SAAS,WAAW,WAC7B,MAAM,SAAS,SACf;AAAA,MACN,cACE,OAAO,MAAM,SAAS,iBAAiB,WACnC,MAAM,SAAS,eACf;AAAA,MACN,WACE,OAAO,MAAM,SAAS,cAAc,WAChC,MAAM,SAAS,YACf;AAAA,MACN,UACE,OAAO,MAAM,SAAS,aAAa,WAC/B,MAAM,SAAS,WACf;AAAA,IACR,IACA;AAAA,EACN,EAAE,IACJ;AAAA,IACE;AAAA,MACE,SAAS,GAAG,OAAO,OAAO,aAAa,SAAS,CAAC;AAAA,MACjD;AAAA,MACA,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACJ,QAAM,aAAa,SAAS,OAAO,UAAU,IACzC;AAAA,IACE,YACE,OAAO,OAAO,WAAW,eAAe,WACpC,OAAO,WAAW,aAClB,OAAO,OAAO,eAAe,WAC3B,OAAO,aACP;AAAA,IACR,YACE,OAAO,OAAO,WAAW,eAAe,YACxC,OAAO,WAAW,WAAW,SAAS,IAClC,OAAO,WAAW,aAClB;AAAA,EACR,IACA,OAAO,OAAO,eAAe,WAC3B;AAAA,IACE,YAAY,OAAO;AAAA,IACnB,YAAY;AAAA,EACd,IACA;AACN,QAAM,mBACJ,OAAO,OAAO,WAAW,WACrB,OAAO,SACP,OAAO,UAAU,SAAS,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,aACjE,aACA,cAAc,OAAO,aACnB,aACA;AAEV,SAAO;AAAA,IACL,WACE,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,YACP;AAAA,IACN,QACE,SAAS,OAAO,MAAM,KAAK,OAAO,OAAO,OAAO,SAAS,WACpD,OAAO,SACR,qBAAqB,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,iBAAiB;AAAA,IAChE;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,MAAM,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,KAAK,IAAI;AAAA,IAClD;AAAA,IACA,QACE,qBAAqB,cAAc,qBAAqB,aACpD,mBACA;AAAA,IACN;AAAA,IACA,YAAY,YAAY;AAAA,IACxB,YAAY,MAAM,QAAQ,OAAO,UAAU,IACvC,OAAO,WAAW,OAAO,CAAC,cAAmC,OAAO,cAAc,QAAQ,IAC1F,CAAC;AAAA,IACL,YAAY,qBAAqB;AAAA,IACjC,UAAU,SAAS,OAAO,QAAQ,IAC9B;AAAA,MACE,QACE,OAAO,SAAS,WAAW,YAAY,OAAO,SAAS,WAAW,YAC9D,OAAO,SAAS,SAChB;AAAA,MACN,oBACE,OAAO,OAAO,SAAS,uBAAuB,WAC1C,OAAO,SAAS,qBAChB;AAAA,MACN,YACE,OAAO,OAAO,SAAS,eAAe,WAClC,OAAO,SAAS,aAChB;AAAA,IACR,IACA;AAAA,EACN;AACF;;;ACt3BO,IAAM,+BAA+B;AAE5C,SAAS,qBAAwB,OAAa;AAC5C,SAAO,gBAAgB,KAAK;AAC9B;AAEO,SAAS,yBACd,OACoB;AACpB,SAAO,qBAAqB;AAAA,IAC1B,gBAAgB;AAAA,IAChB,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,wCACd,UACoB;AACpB,SAAO,yBAAyB;AAAA,IAC9B,eAAe,SAAS;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,OAAO,SAAS;AAAA,IAChB,WAAW,SAAS;AAAA,IACpB,WAAW,SAAS;AAAA,IACpB,aAAa,SAAS;AAAA,IACtB,mBAAmB,SAAS;AAAA,IAC5B,eAAe,SAAS;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,oBAAoB,SAAS;AAAA,IAC7B,eAAe,SAAS;AAAA,EAC1B,CAAC;AACH;AAEO,SAAS,wCACd,cACA,SAGyB;AACzB,SAAO,qBAAqB;AAAA,IAC1B,iBAAiB;AAAA,IACjB,eAAe,aAAa;AAAA,IAC5B,YAAY,aAAa;AAAA,IACzB,OAAO,aAAa;AAAA,IACpB,WAAW,aAAa;AAAA,IACxB,WAAW,aAAa;AAAA,IACxB,SAAS,QAAQ;AAAA,IACjB,aAAa,aAAa;AAAA,IAC1B,mBAAmB,aAAa;AAAA,IAChC,eAAe,aAAa;AAAA,IAC5B,YAAY,aAAa;AAAA,IACzB,oBAAoB,aAAa;AAAA,IACjC,eAAe,aAAa;AAAA,EAC9B,CAAC;AACH;;;ACfO,SAAS,8BACd,SACwC;AACxC,SAAO,gBAAgB;AACzB;AAQO,SAAS,uBACd,SACqB;AACrB,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEO,SAAS,4BACd,YACA,QAC6B;AAC7B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AACF;AAEO,SAAS,4BACd,YACA,QAC6B;AAC7B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AACF;;;AClBO,SAAS,eAAe,SAA6B;AAC1D,QAAM,OAAO,sBAAsB,OAAO;AAC1C,QAAM,qBAAqB,KAAK,SAAS,KAAK,eAAe;AAC7D,QAAM,iBAAiB,qBACnB,2BAA2B,kBAAkB,IAC7C,yBAAyB,0BAA0B;AACvD,QAAM,QAAqB,CAAC;AAE5B,WAAS,QAAQ,GAAG,QAAQ,KAAK,SAAS,QAAQ,SAAS,GAAG;AAC5D,UAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,UAAM,YAAY,KAAK,SAAS,QAAQ,CAAC;AAEzC,QAAI,gBAAgB,KAAK,GAAG;AAC1B,YAAM,KAAK,GAAG,mBAAmB,MAAM,QAAQ,CAAC;AAEhD,UAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,eAAe,2BAA2B,SAAS;AAAA,QACrD,CAAC;AAAA,MACH;AAEA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,gBAAgB;AACjC;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,YAAY,MAAM;AAAA,MAClB,WAAW,MAAM;AAAA,MACjB,GAAI,gBAAgB,SAAS,IACzB,EAAE,eAAe,2BAA2B,SAAS,EAAE,IACvD,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,MAAM;AAAA,EACd;AACF;AAEO,SAAS,mBAAmB,OAAoC;AACrE,QAAM,SAAiD,CAAC;AACxD,MAAI,mBAA8C,gBAAgB,MAAM,cAAc;AACtF,MAAI;AACJ,MAAI;AAQJ,QAAM,yBAAyB,MAAM;AACnC,QAAI,CAAC,kBAAkB;AACrB,yBAAmB,gBAAgB,0BAA0B;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,oBAAoB,iBAAiB,KAAK,WAAW,GAAG;AAC3D,yBAAmB;AACnB;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf,MAAM;AAAA,MACN,MAAM,iBAAiB;AAAA,MACvB,GAAI,iBAAiB,QAAQ,EAAE,OAAO,WAAW,iBAAiB,KAAK,EAAE,IAAI,CAAC;AAAA,IAChF;AAEA,2BAAuB;AAEvB,QAAI,iBAAiB,eAAe;AAClC,UAAI,CAAC,oBAAoB,iBAAiB,SAAS,iBAAiB,eAAe;AACjF,uBAAe;AACf,2BAAmB;AAAA,UACjB,MAAM;AAAA,UACN,MAAM,iBAAiB;AAAA,UACvB,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAEA,uBAAiB,SAAS,KAAK,QAAQ;AAAA,IACzC,OAAO;AACL,qBAAe;AACf,uBAAkB,SAAS,KAAK,QAAQ;AAAA,IAC1C;AAEA,uBAAmB;AAAA,EACrB;AAEA,QAAM,iBAAiB,MAAM;AAC3B,QAAI,kBAAkB;AACpB,6BAAuB;AACvB,uBAAkB,SAAS,KAAK,gBAAgB;AAChD,yBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,oBAAgB;AAChB,mBAAe;AAEf,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AAEA,WAAO,KAAK,gBAAgB;AAC5B,uBAAmB;AAAA,EACrB;AAEA,QAAM,iBAAiB,CACrB,MACA,kBACG;AACH,oBAAgB;AAChB,2BAAuB;AAEvB,QAAI,eAAe;AACjB,UAAI,CAAC,oBAAoB,iBAAiB,SAAS,eAAe;AAChE,uBAAe;AACf,2BAAmB;AAAA,UACjB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAEA,uBAAiB,SAAS,KAAK,IAAyC;AACxE;AAAA,IACF;AAEA,mBAAe;AACf,qBAAkB,SAAS,KAAK,IAAI;AAAA,EACtC;AAEA,aAAW,QAAQ,MAAM,OAAO;AAC9B,QAAI,KAAK,SAAS,mBAAmB;AACnC,qBAAe;AACf,yBAAmB,gBAAgB,KAAK,aAAa;AACrD;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,gBAAgB;AAChC,qBAAe;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,yBAAmB,KAAK,gBACpB,gBAAgB,KAAK,aAAa,IAClC;AACJ;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,qBACJ,oBACA,iBAAiB,kBAAkB,KAAK,iBACxC,eAAe,iBAAiB,OAAO,KAAK,KAAK;AAEnD,UAAI,sBAAsB,kBAAkB;AAC1C,yBAAiB,QAAQ,KAAK;AAAA,MAChC,OAAO;AACL,wBAAgB;AAChB,2BAAmB;AAAA,UACjB,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,QAAQ,EAAE,OAAO,WAAW,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,UACtD,GAAI,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,QACpE;AAAA,MACF;AAEA;AAAA,IACF;AAEA,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,uBAAe,EAAE,MAAM,MAAM,GAAG,KAAK,aAAa;AAClD;AAAA,MACF,KAAK;AACH,uBAAe,EAAE,MAAM,aAAa,GAAG,KAAK,aAAa;AACzD;AAAA,MACF,KAAK;AACH,uBAAe;AAAA,UACb,MAAM;AAAA,UACN,SAAS,KAAK;AAAA,UACd,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAClD,CAAC;AACD;AAAA,MACF,KAAK;AACH,uBAAe;AAAA,UACb,MAAM;AAAA,UACN,YAAY,KAAK;AAAA,UACjB,WAAW,KAAK;AAAA,QAClB,CAAC;AACD;AAAA,IACJ;AAAA,EACF;AAEA,iBAAe;AAEf,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,KAAK,gBAAgB,MAAM,cAAc,CAAC;AAAA,EACnD;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,gBAAgB,OAA0B;AACxD,SAAO,MAAM,MACV,IAAI,CAAC,SAAS;AACb,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,KAAK;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF,CAAC,EACA,KAAK,EAAE;AACZ;AAEO,SAAS,eAAe,MAA4B;AACzD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,KAAK;AAAA,QACZ,GAAI,KAAK,QAAQ,EAAE,OAAO,WAAW,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,QACtD,GAAI,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,MACpE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,GAAI,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,MACpE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,GAAI,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,MACpE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,QACd,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,MAClD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK;AAAA,MAClB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK;AAAA,QAChB,GAAI,KAAK,gBACL,EAAE,eAAe,yBAAyB,KAAK,aAAa,EAAE,IAC9D,CAAC;AAAA,MACP;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,eAAe,yBAAyB,KAAK,aAAa;AAAA,MAC5D;AAAA,EACJ;AACF;AAEO,SAAS,yBACd,YACqB;AACrB,SAAO;AAAA,IACL,GAAI,WAAW,UAAU,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,IAC5D,GAAI,WAAW,YACX;AAAA,MACE,WAAW;AAAA,QACT,qBAAqB,WAAW,UAAU;AAAA,QAC1C,OAAO,WAAW,UAAU;AAAA,MAC9B;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;AAEA,SAAS,sBAAsB,SAAoC;AACjE,MAAI,mBAAmB,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,QAChB,CAAC,UACC,gBAAgB,KAAK,KAAK,kBAAkB,KAAK;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC,qBAAqB,CAAC;AAAA,EACnC;AACF;AAEA,SAAS,mBACP,OACA,eACa;AACb,QAAM,QAAqB,CAAC;AAE5B,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,mBAAW,aAAa,MAAM,KAAK,KAAK,IAAI,GAAG;AAC7C,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,OAAO;AAAA,YACP,GAAI,KAAK,QAAQ,EAAE,OAAO,WAAW,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,YACtD,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,UAC3C,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,QAC3C,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,QAC3C,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,KAAK,GAAG,mBAAmB,KAAK,UAAU,KAAK,IAAI,CAAC;AAC1D;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,SAAS,KAAK;AAAA,UACd,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAClD,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,YAAY,KAAK;AAAA,UACjB,WAAW,KAAK;AAAA,QAClB,CAAC;AACD;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B,WAA+C;AACjF,SAAO;AAAA,IACL,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC1D,GAAI,UAAU,YACV;AAAA,MACE,WAAW;AAAA,QACT,qBAAqB,UAAU,UAAU;AAAA,QACzC,OAAO,UAAU,UAAU;AAAA,MAC7B;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;AAEA,SAAS,gBAAgB,YAAgD;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,WAAW,UAAU,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,IAC5D,GAAI,WAAW,YACX;AAAA,MACE,WAAW;AAAA,QACT,qBAAqB,WAAW,UAAU;AAAA,QAC1C,OAAO,WAAW,UAAU;AAAA,MAC9B;AAAA,IACF,IACA,CAAC;AAAA,IACL,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,uBAAsC;AAC7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC;AAAA,EACb;AACF;AAEA,IAAM,6BAAkD,CAAC;AAEzD,SAAS,WAAW,OAA+B;AACjD,SAAO,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE;AAC1C;AAEA,SAAS,eAAe,MAAmB,OAA6B;AACtE,MAAI,CAAC,QAAQ,CAAC,OAAO;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,WAAW,MAAM,QAAQ;AACnD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,CAAC,MAAM,UAAU,KAAK,SAAS,MAAM,KAAK,GAAG,IAAI;AACrE;AAEA,SAAS,mBAAmB,OAA2C;AACrE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAa,MAA4B,SAAS;AAC9F;AAEA,SAAS,gBAAgB,OAAwC;AAC/D,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAa,MAA4B,SAAS;AAC9F;AAEA,SAAS,kBAAkB,OAA0C;AACnE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAa,MAA4B,SAAS;AAC9F;;;ACneO,SAAS,kBACd,OACA,YACkC;AAClC,SAAO,2BAA2B,KAAK,EAAE,UAAU;AACrD;AAEO,SAAS,oBACd,OACwB;AACxB,SAAO,OAAO,OAAO,2BAA2B,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU;AAC5E,WACE,KAAK,eAAe,OAAO,MAAM,eAAe,QAChD,KAAK,WAAW,cAAc,MAAM,UAAU;AAAA,EAElD,CAAC;AACH;AAEO,SAAS,0BACd,OACwB;AACxB,SAAO,OAAO,OAAO,wBAAwB,KAAK,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UAC/D,KAAK,gBAAgB,cAAc,MAAM,eAAe;AAAA,EAC1D;AACF;AAEO,SAAS,qCACd,OACA,OACwB;AACxB,SAAO,oBAAoB,KAAK,EAAE;AAAA,IAAO,CAAC,aACxC,gBAAgB,SAAS,gBAAgB,KAAK;AAAA,EAChD;AACF;AAEO,SAAS,uBACd,UAC0B;AAC1B,QAAM,MAAM,SAAS;AACrB,QAAM,SAAS,aAAa,QAAQ;AAEpC,MAAI,qBAAqB,KAAK,GAAG,GAAG;AAClC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,KAAK,GAAG,GAAG;AAC/B,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iCAAiC,KAAK,GAAG,GAAG;AAC9C,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gEAAgE,KAAK,GAAG,GAAG;AAC7E,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,KAAK,GAAG,GAAG;AAC/B,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,wBAAwB,KAAK,GAAG,GAAG;AACrC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,uBAAuB,KAAK,GAAG,GAAG;AACpC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,0CAA0C,KAAK,GAAG,GAAG;AACvD,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gCAAgC,KAAK,GAAG,GAAG;AAC7C,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAEA,SAAS,aAAa,UAAwC;AAC5D,QAAM,SAAS;AAAA,IACb,6BAA6B,SAAS,eAAe,IAAI,IAAI,SAAS,eAAe,EAAE;AAAA,IACvF,SAAS,kBAAkB,QAAQ,SAAS,eAAe,MAAM;AAAA,IACjE,SAAS,iBAAiB,gBAAgB,SAAS,cAAc,MAAM;AAAA,EACzE,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SAAO,OAAO,SAAS,IACnB,SACA;AACN;AAEA,SAAS,gBAAgB,MAAgB,OAA0B;AACjE,SAAO,KAAK,OAAO,MAAM,MAAM,MAAM,OAAO,KAAK;AACnD;AAEA,SAAS,2BACP,OACsC;AACtC,SAAO,SAAS,OAAO,UAAU,YAAY,MAAM,mBAAmB,OAAO,MAAM,oBAAoB,WAClG,MAAM,kBACP,CAAC;AACP;AAEA,SAAS,wBACP,OACsC;AACtC,SAAO,SAAS,OAAO,UAAU,YAAY,MAAM,gBAAgB,OAAO,MAAM,iBAAiB,WAC5F,MAAM,eACP,CAAC;AACP;;;ACvKO,SAAS,uBACd,UAC0B;AAC1B,QAAM,WAAqC,CAAC;AAC5C,MAAI,eAAe;AAEnB,aAAW,SAAS,SAAS,QAAQ,UAAU;AAC7C,QAAI,MAAM,SAAS,iBAAiB;AAClC;AAAA,IACF;AACA,aAAS,KAAK;AAAA,MACZ,OAAO;AAAA,MACP,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,oBAAgB;AAAA,EAClB;AAEA,WAAS,KAAK;AAAA,IACZ,OAAO;AAAA,IACP,YAAY,SAAS,UAAU;AAAA,EACjC,CAAC;AAED,SAAO;AACT;AAEO,SAAS,uBACd,MACA,cACA,oBAIA,WAC0E;AAC1E,MAAI,sBAAsB,mBAAmB,SAAS,GAAG;AACvD,WAAO,mBAAmB,IAAI,CAAC,SAAS;AAAA,MACtC,SAAS,IAAI;AAAA,MACb,gBAAgB,IAAI;AAAA,IACtB,EAAE;AAAA,EACJ;AAEA,SAAO,UACJ;AAAA,IACC,CAAC,UACC,MAAM,iBAAiB,UAAa,MAAM,iBAAiB;AAAA,EAC/D,EACC,IAAI,CAAC,WAAW;AAAA,IACf,SAAS,MAAM;AAAA,IACf,gBAAgB,MAAM;AAAA,EACxB,EAAE;AACN;AAEO,SAAS,8BACd,UACA,QAC6C;AAC7C,QAAM,YACJ,OAAO,SAAS,WACZ,SAAS,UAAU,WAAW,CAAC,IAC/B,SAAS,UAAU,WAAW,CAAC;AACrC,QAAM,UAAU,UAAU;AAAA,IACxB,CAAC,UACC,MAAM,mBAAmB,OAAO,kBAChC,MAAM,YAAY,OAAO;AAAA,EAC7B;AACA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,iBAAiB,QAAW;AACrC,WACE,QAAQ,KAAK,CAAC,UAAU,MAAM,iBAAiB,OAAO,YAAY,KAClE,QAAQ,KAAK,CAAC,UAAU,MAAM,iBAAiB,MAAS,KACxD,QAAQ,CAAC;AAAA,EAEb;AACA,SAAO,QAAQ,CAAC;AAClB;AAEO,SAAS,2BACd,UACA,cACA,QACS;AACT,MAAI,CAAC,8BAA8B,UAAU,MAAM,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,uBAAuB,QAAQ,EAAE;AAAA,IAC/C,CAAC,cAAc,UAAU,UAAU;AAAA,EACrC;AACA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,IACP;AAAA,IACA,OAAO,SAAS,WACZ,QAAQ,YAAY,mBACpB,QAAQ,YAAY;AAAA,IACxB,OAAO,SAAS,WACZ,SAAS,UAAU,WAAW,CAAC,IAC/B,SAAS,UAAU,WAAW,CAAC;AAAA,EACrC;AAEA,SAAO,SAAS;AAAA,IACd,CAAC,YACC,QAAQ,mBAAmB,OAAO,kBAClC,QAAQ,YAAY,OAAO;AAAA,EAC/B;AACF;AAEO,SAAS,4BACd,UACA,QACA,uBACqC;AACrC,MAAI,CAAC,8BAA8B,UAAU,MAAM,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,iBAAiB,QAAW;AACrC,WAAO,2BAA2B,UAAU,OAAO,cAAc,MAAM,IACnE,SACA;AAAA,EACN;AAEA,QAAM,mBAAmB,uBAAuB,QAAQ,EACrD,IAAI,CAAC,YAAY,QAAQ,KAAK,EAC9B;AAAA,IAAO,CAAC,iBACP,2BAA2B,UAAU,cAAc,MAAM;AAAA,EAC3D;AACF,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,uBACJ,0BAA0B,UAC1B,iBAAiB,SAAS,qBAAqB,IAC3C,wBACA,iBAAiB,CAAC;AAExB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,EAChB;AACF;;;AC3JO,SAAS,eAAe,QAAmC;AAChE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,UAAU,OAAO,cAAc,IAAI,OAAO,OAAO,IAAI,OAAO,gBAAgB,GAAG;AAAA,IACxF,KAAK;AACH,aAAO,UAAU,OAAO,cAAc,IAAI,OAAO,OAAO,IAAI,OAAO,gBAAgB,GAAG;AAAA,IACxF,KAAK;AACH,aAAO,YAAY,OAAO,MAAM;AAAA,IAClC,KAAK;AACH,aAAO,WAAW,OAAO,MAAM;AAAA,EACnC;AACF;AAEO,SAAS,eACd,UACA,QACsB;AACtB,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAEA,QAAM,WAAW,SAAS;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,UAAU;AACb,YAAM,iBAAiB,4BAA4B,UAAU,MAAM;AACnE,cACE,kBACA,8BAA8B,UAAU,cAAc,GAAG,WACtD,CAAC;AAAA,IACR;AAAA,IACA,KAAK,UAAU;AACb,YAAM,iBAAiB,4BAA4B,UAAU,MAAM;AACnE,cACE,kBACA,8BAA8B,UAAU,cAAc,GAAG,WACtD,CAAC;AAAA,IACR;AAAA,IACA,KAAK;AACH,aAAO,SAAS,oBAAoB,UAAU,OAAO,MAAM,GAAG,UAAU,CAAC;AAAA,IAC3E,KAAK;AACH,aAAO,SAAS,oBAAoB,SAAS,OAAO,MAAM,GAAG,UAAU,CAAC;AAAA,EAC5E;AACF;AAEO,SAAS,mBACd,UACA,QACA,QAC2B;AAC3B,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,SAAS;AAAA,QACZ,UAAU,CAAC,GAAG,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,UAAU;AACtB,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,UAAU;AACb,YAAM,iBAAiB,4BAA4B,UAAU,MAAM;AACnE,YAAM,eAAe,iBACjB,8BAA8B,UAAU,cAAc,IACtD;AACJ,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,SAAS,SAAS,SAAS,QAAQ;AAAA,YAAI,CAAC,WACtC,OAAO,mBAAmB,aAAa,kBACrC,OAAO,YAAY,aAAa,WAChC,OAAO,aAAa,aAAa,WAC/B,EAAE,GAAG,QAAQ,QAAQ,CAAC,GAAG,MAAM,EAAE,IACjC;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,iBAAiB,4BAA4B,UAAU,MAAM;AACnE,YAAM,eAAe,iBACjB,8BAA8B,UAAU,cAAc,IACtD;AACJ,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,SAAS,SAAS,SAAS,QAAQ;AAAA,YAAI,CAAC,WACtC,OAAO,mBAAmB,aAAa,kBACrC,OAAO,YAAY,aAAa,WAChC,OAAO,aAAa,aAAa,WAC/B,EAAE,GAAG,QAAQ,QAAQ,CAAC,GAAG,MAAM,EAAE,IACjC;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,CAAC,SAAS,SAAS,oBAAoB,UAAU,OAAO,MAAM,IACjE,WACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,oBAAoB;AAAA,YAClB,GAAG,SAAS,SAAS;AAAA,YACrB,WAAW;AAAA,cACT,GAAG,SAAS,SAAS,mBAAmB;AAAA,cACxC,CAAC,OAAO,MAAM,GAAG;AAAA,gBACf,GAAG,SAAS,SAAS,mBAAmB,UAAU,OAAO,MAAM;AAAA,gBAC/D,QAAQ,CAAC,GAAG,MAAM;AAAA,cACpB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACN,KAAK;AACH,aAAO,CAAC,SAAS,SAAS,oBAAoB,SAAS,OAAO,MAAM,IAChE,WACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,oBAAoB;AAAA,YAClB,GAAG,SAAS,SAAS;AAAA,YACrB,UAAU;AAAA,cACR,GAAG,SAAS,SAAS,mBAAmB;AAAA,cACxC,CAAC,OAAO,MAAM,GAAG;AAAA,gBACf,GAAG,SAAS,SAAS,mBAAmB,SAAS,OAAO,MAAM;AAAA,gBAC9D,QAAQ,CAAC,GAAG,MAAM;AAAA,cACpB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,EACR;AACF;;;AC5IA,IAAM,mBAAmB;AAElB,SAAS,8BACd,SACyB;AACzB,QAAM,iBAAiB,oBAAI,IAAoC;AAE/D,WAAS,gBAAgB,WAAiF;AACxG,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,QAAQ,UAAU,UAAU,mBAAmB;AAChE,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,QAAQ,oBAAoB,SAAS,mBAAmB;AAC3E,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,IAAI;AAAA,MAC3B,WAAW,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,OAAO,KAAK,CAAU;AAAA,IAChE;AACA,UAAM,kBAAkB,iBAAiB,IAAI,UAAU,KAAK;AAC5D,QAAI,CAAC,mBAAmB,gBAAgB,WAAW,QAAQ;AACzD,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,iBAAiB,gBAAgB,UAAU,mBAAmB;AACpF,oBAAgB,eAAe,UAAU,OAAO,kBAAkB,SAAS,SAAS;AAGpF,UAAM,qBAAqB,gBAAgB,mBACvC,IAAI,IAAI,MAAM,KAAK,iBAAiB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,UAAU,CAAC,CAAC,CAAC,IAChG;AAEJ,UAAM,OAAO,gBAAgB,gBAAgB,MAAM,cAAc,UAAU,kBAAkB;AAC7F,QAAI,SAAS,KAAM,QAAO;AAC1B,WAAO,EAAE,MAAM,QAAQ,gBAAgB,OAAO;AAAA,EAChD;AAEA,SAAO;AAAA,IACL,QAAQ,WAAW;AACjB,YAAM,SAAS,gBAAgB,SAAS;AACxC,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,IACA,gBAAgB,WAAW;AACzB,aAAO,gBAAgB,SAAS;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,iBACP,QACA,qBACwB;AACxB,QAAM,WAAW,OAAO,IAAI,mBAAmB;AAC/C,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,UAAkC;AAAA,IACtC,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,EACb;AACA,SAAO,IAAI,qBAAqB,OAAO;AACvC,SAAO;AACT;AAEA,SAAS,gBACP,OACA,cACA,kBACA,WACM;AACN,MAAI,MAAM,cAAc,QAAQ,gBAAgB,MAAM,WAAW;AAC/D,UAAM,SAAS,SAAS,eAAe;AAAA,EACzC;AAEA,QAAM,UAAU,gBAAgB,cAAc,kBAAkB,SAAS;AACzE,QAAM,eAAe,MAAM,SAAS,YAAY;AAChD,QAAM,SAAS,YAAY,IACzB,iBAAiB,SAAY,UAAU,eAAe;AACxD,QAAM,YAAY;AACpB;AAEA,SAAS,gBACP,OACA,kBACA,WACQ;AACR,QAAM,WAAW,UAAU,KAAK,CAAC,UAAU,MAAM,UAAU,KAAK;AAChE,MAAI,UAAU,YAAY,QAAW;AACnC,WAAO,SAAS;AAAA,EAClB;AAEA,SAAO,iBAAiB,IAAI,KAAK,GAAG,WAAW;AACjD;AAEA,SAAS,gBACP,MACA,UACA,kBACe;AACf,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,QAAQ,aAAa,CAAC,QAAQ,UAAU;AAC5D,UAAM,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI;AAC3C,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,iBAAiB,IAAI,KAAK,GAAG,UAAU;AACtD,WAAO,cAAc,SAAS,MAAM;AAAA,EACtC,CAAC;AAED,SAAO,SAAS,KAAK,EAAE,SAAS,IAAI,WAAW;AACjD;AAEA,SAAS,cAAc,OAAe,QAAwB;AAC5D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAAA,IACtC,KAAK;AACH,aAAO,aAAa,KAAK,EAAE,YAAY;AAAA,IACzC,KAAK;AACH,aAAO,aAAa,KAAK,EAAE,YAAY;AAAA,IACzC,KAAK;AACH,aAAO,QAAQ,KAAK,EAAE,YAAY;AAAA,IACpC,KAAK;AACH,aAAO,QAAQ,KAAK,EAAE,YAAY;AAAA,IACpC,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,OAAO,KAAK;AAAA,EACvB;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,MAAI,SAAS,GAAG;AACd,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,YAAY;AAChB,MAAI,SAAS;AACb,SAAO,YAAY,GAAG;AACpB,iBAAa;AACb,aAAS,OAAO,aAAa,KAAM,YAAY,EAAG,IAAI;AACtD,gBAAY,KAAK,MAAM,YAAY,EAAE;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,OAAuB;AACtC,MAAI,SAAS,KAAK,SAAS,KAAM;AAC/B,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,QAAM,WAAoC;AAAA,IACxC,CAAC,KAAM,GAAG;AAAA,IACV,CAAC,KAAK,IAAI;AAAA,IACV,CAAC,KAAK,GAAG;AAAA,IACT,CAAC,KAAK,IAAI;AAAA,IACV,CAAC,KAAK,GAAG;AAAA,IACT,CAAC,IAAI,IAAI;AAAA,IACT,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,IAAI,IAAI;AAAA,IACT,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,GAAG,IAAI;AAAA,IACR,CAAC,GAAG,GAAG;AAAA,IACP,CAAC,GAAG,IAAI;AAAA,IACR,CAAC,GAAG,GAAG;AAAA,EACT;AAEA,MAAI,YAAY;AAChB,MAAI,SAAS;AACb,aAAW,CAAC,QAAQ,OAAO,KAAK,UAAU;AACxC,WAAO,aAAa,QAAQ;AAC1B,mBAAa;AACb,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;;;AC7JO,SAAS,4BACd,UACA,YACA,cAAiC,EAAE,MAAM,OAAO,GACzB;AACvB,QAAM,OAAOC,uBAAsB;AAAA,IACjC,MAAM;AAAA,IACN,UAAU,CAAC,GAAG,eAAe,UAAU,WAAW,CAAC;AAAA,EACrD,CAAC;AACD,QAAM,SAAiC,CAAC;AACxC,QAAM,oBAA8B,CAAC;AACrC,QAAM,0BAA0B,8BAA8B,SAAS,SAAS;AAChF,MAAI,SAAS;AACb,QAAM,WAAW;AAAA,IACf,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,WAAS,QAAQ,GAAG,QAAQ,KAAK,SAAS,QAAQ,SAAS,GAAG;AAC5D,UAAM,eAAe;AAAA,MACnB,KAAK,SAAS,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,KAAK,aAAa,KAAK;AAC9B,sBAAkB,KAAK,GAAG,aAAa,iBAAiB;AACxD,aAAS,aAAa;AACtB,QAAI,QAAQ,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,QAAQ,CAAC,GAAG,SAAS,aAAa;AACtF,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,mBAAmB,6BAA6B,QAAQ;AAE9D,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAWC,iBAAgB,MAAM;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBACP,OACA,UACA,QACA,UAQA,yBACkF;AAClF,MAAI,MAAM,SAAS,gBAAgB;AACjC,UAAM,WAAW,kBAAkB,SAAS,cAAuB,MAAM,UAAU;AACnF,UAAM,aAAa,WAAW,uBAAuB,QAAQ,IAAI;AACjE,UAAM,UAAU,UAAU,SAAS,MAAM;AACzC,aAAS,UAAU;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,SAAS;AAAA,QACb,YAAY,MAAM;AAAA,QAClB,WAAW,MAAM;AAAA,QACjB,OAAO,YAAY,SAAS;AAAA,QAC5B,QACE,YAAY,UACZ;AAAA,QACF,OAAO;AAAA,MACT;AAAA,MACA,mBAAmB,CAAC,MAAM,UAAU;AAAA,MACpC,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAM,aAAa,SAAS;AAC5B,aAAS,SAAS;AAClB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,OAAO;AACxB,UAAM,WAAW,SAAS;AAC1B,aAAS,OAAO;AAChB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,cAAc;AAC/B,UAAM,UAAU,cAAc,SAAS,SAAS;AAChD,aAAS,aAAa;AACtB,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,SAAS;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QACE,MAAM,OAAO,MAAM,UACf,sBAAsB,CAAC,MAAM,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,qCAC1E;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,mBAAmB,CAAC;AAAA,MACpB,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,aAAa;AAC9B,UAAM,UAAU,aAAa,SAAS,QAAQ;AAC9C,aAAS,YAAY;AACrB,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,SAAS;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ,mEAAmE,MAAM,cAAc;AAAA,QAC/F,OAAO;AAAA,MACT;AAAA,MACA,mBAAmB,CAAC;AAAA,MACpB,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,iBAAiB;AAClC,UAAM,UAAU,iBAAiB,SAAS,MAAM;AAChD,aAAS,UAAU;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,SAAS;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,mBAAmB,CAAC;AAAA,MACpB,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS;AAChC,WAAS,aAAa;AACtB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBACP,YACA,OACA,UACA,QACA,UAQA,yBACkF;AAClF,QAAM,oBAA8B,CAAC;AACrC,MAAI,cAAc;AAClB,QAAM,OAAkC,CAAC;AACzC,QAAM,WAAW,qBAAqB,KAAK;AAE3C,aAAW,CAAC,UAAU,GAAG,KAAK,MAAM,KAAK,QAAQ,GAAG;AAClD,UAAM,QAAoC,CAAC;AAC3C,eAAW,CAAC,WAAW,IAAI,KAAK,IAAI,MAAM,QAAQ,GAAG;AACnD,YAAM,cAAsC,CAAC;AAC7C,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,SAAS;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,oBAAY,KAAK,OAAO,KAAK;AAC7B,0BAAkB,KAAK,GAAG,OAAO,iBAAiB;AAClD,sBAAc,OAAO;AAAA,MACvB;AACA,YAAM,cAAc,wBAAwB,KAAK,OAAO;AACxD,YAAM,KAAK;AAAA,QACT,UAAU,KAAK,YAAY;AAAA,QAC3B,eAAe,KAAK,iBAAiB;AAAA,QACrC,SAAS,KAAK,YAAY;AAAA,QAC1B,SAAS,SAAS,IAAI,GAAG,QAAQ,IAAI,SAAS,EAAE,KAAK;AAAA,QACrD,GAAI,KAAK,SAAS,OAAO,EAAE,iBAAiB,IAAI,KAAK,QAAQ,IAAI,GAAG,IAAI,CAAC;AAAA,QACzE,GAAI,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,QAClE,GAAI,YAAY,YAAY,EAAE,WAAW,YAAY,UAAU,IAAI,CAAC;AAAA,QACpE,GAAI,YAAY,cAAc,EAAE,aAAa,YAAY,YAAY,IAAI,CAAC;AAAA,QAC1E,GAAI,YAAY,eAAe,EAAE,cAAc,YAAY,aAAa,IAAI,CAAC;AAAA,QAC7E,GAAI,YAAY,aAAa,EAAE,YAAY,YAAY,WAAW,IAAI,CAAC;AAAA,QACvE,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,SAAK,KAAK;AAAA,MACR;AAAA,MACA,GAAI,IAAI,eAAe,SAAY,EAAE,YAAY,IAAI,WAAW,IAAI,CAAC;AAAA,MACrE,GAAI,IAAI,cAAc,SAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;AAAA,MAClE,GAAI,IAAI,WAAW,SAAY,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,MACzD,GAAI,IAAI,aAAa,EAAE,YAAY,IAAI,WAAW,IAAI,CAAC;AAAA,MACvD,GAAI,IAAI,WAAW,EAAE,UAAU,IAAI,SAAS,IAAI,CAAC;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,SAAS,UAAU;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,MAAM;AAAA,MACf,aAAa,MAAM;AAAA,MACnB,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACxD,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEA,SAAS,qBAAqB,OAAuC;AACnE,QAAM,iBAAiB,MAAM,KAAK,IAAI,CAAC,QAAQ;AAC7C,QAAI,cAAc;AAElB,WAAO,IAAI,MAAM,IAAI,CAAC,MAAM,cAAc;AACxC,YAAM,QAAQ,KAAK,YAAY;AAC/B,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,cAAc,QAAQ;AAAA,MACnC;AACA,qBAAe;AACf,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AAED,QAAM,WAAW,oBAAI,IAAoB;AAEzC,aAAW,CAAC,UAAU,GAAG,KAAK,eAAe,QAAQ,GAAG;AACtD,eAAW,kBAAkB,KAAK;AAChC,UAAI,eAAe,KAAK,kBAAkB,WAAW;AACnD,iBAAS,IAAI,GAAG,QAAQ,IAAI,eAAe,SAAS,IAAI,CAAC;AACzD;AAAA,MACF;AAEA,UAAI,UAAU;AACd,eAAS,eAAe,WAAW,GAAG,eAAe,eAAe,QAAQ,gBAAgB,GAAG;AAC7F,cAAM,gBAAgB,eAAe,YAAY,GAAG;AAAA,UAClD,CAAC,cACC,UAAU,KAAK,kBAAkB,cACjC,UAAU,gBAAgB,eAAe,eACzC,UAAU,cAAc,eAAe;AAAA,QAC3C;AAEA,YAAI,CAAC,eAAe;AAClB;AAAA,QACF;AAEA,mBAAW;AAAA,MACb;AAEA,eAAS,IAAI,GAAG,QAAQ,IAAI,eAAe,SAAS,IAAI,OAAO;AAAA,IACjE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,SAC0F;AAC1F,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAM,SAAmG,CAAC;AAC1G,QAAM,QAAQ,CAAC,CAAC,OAAO,WAAW,GAAG,CAAC,SAAS,aAAa,GAAG,CAAC,UAAU,cAAc,GAAG,CAAC,QAAQ,YAAY,CAAC;AACjH,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO;AAC/B,UAAM,OAAO,QAAQ,IAAI;AACzB,QAAI,CAAC,QAAQ,KAAK,UAAU,UAAU,KAAK,UAAU,MAAO;AAC5D,UAAM,QAAQ,KAAK,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO;AAC1E,UAAM,QAAQ,KAAK,UAAU,WAAW,WAAW,KAAK,UAAU,YAAY,KAAK,UAAU,iBAAiB,WAAW,KAAK,UAAU,WAAW,WAAW;AAC9J,UAAM,QAAQ,KAAK,SAAS,KAAK,UAAU,SAAS,IAAI,KAAK,KAAK,KAAK;AACvE,WAAO,GAAG,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,eACP,UACA,OACA,UACA,QACA,UAQA,yBACkF;AAClF,QAAM,WAAmC,CAAC;AAC1C,QAAM,oBAA8B,CAAC;AACrC,MAAI,cAAc;AAElB,aAAW,SAAS,MAAM,UAAU;AAClC,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,aAAS,KAAK,OAAO,KAAK;AAC1B,sBAAkB,KAAK,GAAG,OAAO,iBAAiB;AAClD,kBAAc,OAAO;AAAA,EACvB;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,OAAO,QAAQ;AAAA,MACxB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,GAAI,MAAM,WAAW,UAAU,EAAE,SAAS,MAAM,WAAW,QAAQ,IAAI,CAAC;AAAA,MACxE,GAAI,MAAM,WAAW,QAAQ,EAAE,OAAO,MAAM,WAAW,MAAM,IAAI,CAAC;AAAA,MAClE,GAAI,MAAM,WAAW,MAAM,EAAE,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC;AAAA,MAC5D,GAAI,MAAM,WAAW,OAAO,EAAE,MAAM,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,MAC/D,GAAI,MAAM,WAAW,WAAW,EAAE,iBAAiB,MAAM,WAAW,SAAS,QAAQ,IAAI,CAAC;AAAA,MAC1F,GAAI,MAAM,WAAW,YAAY,WAAW,EAAE,WAAW,MAAM,WAAW,WAAW,SAAS,IAAI,CAAC;AAAA,MACnG,GAAI,MAAM,WAAW,eAAe,EAAE,eAAe,MAAM,WAAW,aAAa,IAAI,CAAC;AAAA,MACxF,GAAI,MAAM,WAAW,WAAW,EAAE,eAAe,MAAM,WAAW,SAAS,IAAI,CAAC;AAAA,MAChF,GAAI,MAAM,WAAW,gBAAgB,EAAE,eAAe,KAAK,IAAI,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEA,SAAS,qBACP,gBACA,WACA,UACA,OACA,yBAKA;AACA,QAAM,cAAoC;AAAA,IACxC,SAAS,aAAa,cAAc;AAAA,IACpC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC1D,GAAI,UAAU,YAAY,EAAE,WAAW,UAAU,UAAU,IAAI,CAAC;AAAA,IAChE,GAAI,UAAU,aACT,MAAM;AACL,YAAM,WAAW,wBAAwB,gBAAgB,UAAU,SAAS;AAC5E,aAAO,WACH;AAAA,QACE,iBAAiB,SAAS;AAAA,QAC1B,GAAI,SAAS,SAAS,EAAE,iBAAiB,SAAS,OAAO,IAAI,CAAC;AAAA,MAChE,IACA,CAAC;AAAA,IACP,GAAG,IACH,CAAC;AAAA,IACL,GAAI,UAAU,YAAY,EAAE,WAAW,UAAU,UAAU,IAAI,CAAC;AAAA,IAChE,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC1D,GAAI,UAAU,sBAAsB,SAChC,EAAE,mBAAmB,UAAU,kBAAkB,IACjD,CAAC;AAAA,IACL,GAAI,UAAU,cAAc,EAAE,aAAa,UAAU,YAAY,IAAI,CAAC;AAAA,IACtE,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC1D,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC1D,GAAI,UAAU,YAAY,UAAU,SAAS,SAAS,IAClD,EAAE,UAAU,UAAU,SAAS,IAAI,CAAC,YAAY,iBAAiB,OAAO,CAAC,EAAE,IAC3E,CAAC;AAAA,IACL,GAAI,UAAU,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,IAC/C,GAAI,UAAU,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IACjD,GAAI,UAAU,kBAAkB,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAAA,IAC7D,GAAI,UAAU,iBAAiB,SAAY,EAAE,cAAc,UAAU,aAAa,IAAI,CAAC;AAAA,IACvF,GAAI,UAAU,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,IACvC,GAAI,UAAU,sBAAsB,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACrE,UAAU,CAAC;AAAA,EACb;AACA,QAAM,oBAA8B,CAAC;AACrC,MAAI,SAAS;AACb,QAAM,WAAW,MAAM,QAAQ,UAAU,QAAQ,IAAI,UAAU,WAAW,CAAC;AAE3E,aAAW,SAAS,UAAU;AAC5B,UAAM,SAAS,qBAAqB,aAAa,OAAO,UAAU,MAAM;AACxE,aAAS,OAAO;AAChB,sBAAkB,KAAK,GAAG,OAAO,iBAAiB;AAAA,EACpD;AAEA,cAAY,KAAK;AACjB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,qBACP,WACA,MACA,UACA,OACA,eACqD;AACrD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ,MAAM,KAAK,KAAK,IAAI,EAAE;AAAA,QAClC,MAAM,KAAK;AAAA,QACX,GAAI,KAAK,SAAS,MAAM;AACtB,gBAAM,SAASC,YAAW,KAAK,KAAK;AACpC,iBAAO;AAAA,YACL,GAAI,OAAO,MAAM,SAAS,IAAI,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,YACzD,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,UAC5D;AAAA,QACF,GAAG,IAAI,CAAC;AAAA,QACR,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,MAAM,KAAK,KAAK,IAAI,EAAE,QAAQ,mBAAmB,CAAC,EAAE;AAAA,IACnF,KAAK;AACH,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,IACxD,KAAK;AACH,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,IACxD,KAAK,aAAa;AAChB,UAAI,SAAS;AACb,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,SAAS,qBAAqB,WAAW,OAAO,UAAU,QAAQ,KAAK,IAAI;AACjF,iBAAS,OAAO;AAAA,MAClB;AACA,aAAO,EAAE,YAAY,QAAQ,mBAAmB,CAAC,EAAE;AAAA,IACrD;AAAA,IACA,KAAK;AACH,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,OAAO,aAAa,SAAS,OAAO,KAAK,OAAO,IAAI,aAAa;AAAA,QACjE,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAChD,QACE,KAAK,YAAY,aACb,0BAA0B,KAAK,SAAS,KAAK,QAAQ,IACrD,KAAK,UACH,YAAY,KAAK,OAAO,MACxB;AAAA,MACV,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,IACxD,KAAK,iBAAiB;AACpB,YAAM,WAAW,kBAAkB,SAAS,cAAuB,KAAK,UAAU;AAClF,YAAM,aAAa,WAAW,uBAAuB,QAAQ,IAAI;AACjE,YAAM,UAAU,WAAW,+BAA+B,SAAS,gBAAgB,IAAI;AACvF,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK;AAAA,QAChB,OAAO,SAAS,SAAS,YAAY,SAAS;AAAA,QAC9C,QACE,SAAS,UACT,YAAY,UACZ;AAAA,QACF,GAAI,SAAS,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,QACtE,OAAO;AAAA,MACT,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,KAAK,UAAU,EAAE;AAAA,IACvE;AAAA,IACA,KAAK;AACH,aAAO,4BAA4B,WAAW,MAAM,OAAO,kBAAkB,kBAAkB,IAAI,CAAC;AAAA,IACtG,KAAK;AACH,aAAO,4BAA4B,WAAW,MAAM,OAAO,oBAAoB,qBAAqB,IAAI,CAAC;AAAA,IAC3G,KAAK;AACH,aAAO;AAAA,QAA4B;AAAA,QAAW;AAAA,QAAM;AAAA,QAClD,KAAK,YAAY,aAAa;AAAA,QAAiB,kBAAkB,IAAI;AAAA,MAAC;AAAA,IAC1E,KAAK;AACH,aAAO,4BAA4B,WAAW,MAAM,OAAO,WAAW,oBAAoB,IAAI,CAAC;AAAA,IACjG,KAAK;AACH,aAAO,4BAA4B,WAAW,MAAM,OAAO,sBAAsB,gBAAgB,IAAI,CAAC;AAAA,IACxG,KAAK;AACH,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,MAAM,KAAK,OAAO,OAAO,cAAc,SAAS,KAAK,MAAM,EAAE,CAAC,IAAI;AAAA,MACpE,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,IACxD,KAAK;AACH,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,IACxD,KAAK;AACH,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,UAAU,KAAK,YAAY;AAAA,QAC3B,QAAQ,KAAK,UAAU;AAAA,QACvB,OAAO,KAAK,UAAU;AAAA,MACxB,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,IACxD,KAAK,SAAS;AACZ,YAAM,mBACJ,KAAK,gBAAgB,SACrB,KAAK,gBAAgB,aACrB,KAAK,gBAAgB,aACrB,KAAK,gBAAgB;AACvB,UAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,YAAI,SAAS;AACb,cAAM,YAAsB,CAAC;AAC7B,mBAAW,SAAS,KAAK,UAAU;AACjC,gBAAM,SAAS,qBAAqB,WAAW,OAAO,UAAU,MAAM;AACtE,mBAAS,OAAO;AAChB,oBAAU,KAAK,GAAG,OAAO,iBAAiB;AAAA,QAC5C;AACA,eAAO,EAAE,YAAY,QAAQ,mBAAmB,UAAU;AAAA,MAC5D;AACA,UAAI,kBAAkB;AAEpB,cAAM,aACJ,KAAK,gBAAgB,QACjB,sBACA,GAAG,KAAK,eAAe,OAAO,KAAK,KAAK,eAAe,KAAK,YAAY,KAAK,CAAC;AACpF,kBAAU,SAAS,KAAK;AAAA,UACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,UACpE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,IAAI,QAAQ;AAAA,UACZ,aAAa,KAAK;AAAA,UAClB,aAAa,KAAK;AAAA,UAClB,aAAa,KAAK;AAAA,UAClB,eAAe,KAAK,iBAAiB;AAAA,UACrC,OAAO;AAAA,QACT,CAAyB;AACzB,eAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,MACxD;AACA,gBAAU,SAAS,KAAK;AAAA,QACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,QACpE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ,wBAAwB,KAAK,YAAY,KAAK,CAAC;AAAA,QACvD,OAAO;AAAA,MACT,CAAC;AACD,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,IACxD;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAEH,aAAO,EAAE,YAAY,OAAO,mBAAmB,CAAC,EAAE;AAAA,IACpD;AACE,aAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AAAA,EAC1D;AACF;AAEA,SAAS,4BACP,WACA,MACA,OACA,OACA,QACqD;AACrD,YAAU,SAAS,KAAK;AAAA,IACtB,WAAW,GAAG,UAAU,OAAO,YAAY,UAAU,SAAS,MAAM;AAAA,IACpE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAI,QAAQ;AAAA,IACZ,YAAY,WAAW,MAAM,QAAQ,OAAO,GAAG,EAAE,YAAY,CAAC,IAAI,KAAK;AAAA,IACvE,WAAW,2BAA2B,KAAK;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,YAAY,QAAQ,GAAG,mBAAmB,CAAC,EAAE;AACxD;AAEA,SAAS,kBAAkB,MAAgC;AACzD,QAAM,QAAQ,CAAC,iBAAiB;AAChC,MAAI,KAAK,gBAAgB;AACvB,UAAM,KAAK,yCAAyC,KAAK,cAAc,IAAI;AAAA,EAC7E,OAAO;AACL,UAAM,KAAK,mEAAmE;AAAA,EAChF;AACA,QAAM,KAAK,sFAAsF;AACjG,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,qBAAqB,MAAmC;AAC/D,QAAM,QAAQ,CAAC,mBAAmB;AAClC,MAAI,KAAK,gBAAgB;AACvB,UAAM,KAAK,yCAAyC,KAAK,cAAc,IAAI;AAAA,EAC7E,OAAO;AACL,UAAM,KAAK,0EAA0E;AAAA,EACvF;AACA,QAAM,KAAK,sGAAsG;AACjH,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,kBAAkB,MAAyB;AAClD,MAAI,KAAK,WAAW;AAClB,UAAMC,SAAQ,CAAC,WAAW;AAC1B,QAAI,KAAK,KAAM,CAAAA,OAAM,KAAK,aAAa,KAAK,IAAI,IAAI;AACpD,IAAAA,OAAM,KAAK,wEAAwE;AACnF,WAAOA,OAAM,KAAK,GAAG;AAAA,EACvB;AACA,QAAM,QAAQ,CAAC,gBAAgB;AAC/B,MAAI,KAAK,SAAU,OAAM,KAAK,aAAa,KAAK,QAAQ,GAAG;AAC3D,MAAI,KAAK,KAAM,OAAM,KAAK,kBAAkB,KAAK,IAAI,IAAI;AACzD,QAAM,KAAK,2EAA2E;AACtF,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,oBAAoB,MAA2B;AACtD,QAAM,QAAQ,CAAC,0BAA0B;AACzC,MAAI,KAAK,KAAM,OAAM,KAAK,UAAU,KAAK,IAAI,IAAI;AACjD,MAAI,KAAK,SAAU,OAAM,KAAK,WAAW,KAAK,QAAQ,GAAG;AACzD,QAAM,KAAK,yGAAyG;AACpH,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,gBAAgB,MAA4B;AACnD,QAAM,QAAQ,CAAC,qBAAqB;AACpC,MAAI,KAAK,UAAW,OAAM,KAAK,SAAS,KAAK,SAAS,GAAG;AACzD,MAAI,KAAK,KAAM,OAAM,KAAK,kBAAkB,KAAK,IAAI,IAAI;AACzD,QAAM,KAAK,oGAAoG;AAC/G,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAASF,iBACP,QACQ;AACR,QAAM,OAAiB,CAAC;AACxB,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,gBAAgB;AACjC,UAAI,MAAM,WAAW,WAAW,UAAU,GAAG;AAC3C;AAAA,MACF;AACA,WAAK,KAAK,QAAQ;AAClB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,iBAAW,OAAO,MAAM,MAAM;AAC5B,mBAAW,QAAQ,IAAI,OAAO;AAC5B,eAAK,KAAKA,iBAAgB,KAAK,OAAO,CAAC;AAAA,QACzC;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,aAAa;AAC9B,WAAK,KAAKA,iBAAgB,MAAM,QAAQ,CAAC;AACzC;AAAA,IACF;AAEA,eAAW,WAAW,MAAM,UAAU;AACpC,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,eAAK,KAAK,QAAQ,IAAI;AACtB;AAAA,QACF,KAAK;AACH,eAAK,KAAK,GAAI;AACd;AAAA,QACF,KAAK;AACH,eAAK,KAAK,IAAI;AACd;AAAA,QACF,KAAK;AACH,eAAK,KAAK,QAAQ;AAClB;AAAA,QACF,KAAK;AACH,eAAK,KAAK,QAAQ;AAClB;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,KAAK,EAAE;AACrB;AAEA,SAAS,6BACP,UACyB;AACzB,QAAM,WAAoC,CAAC;AAC3C,QAAM,WAAW,SAAS;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,0BAA0B,8BAA8B,SAAS,SAAS;AAEhF,aAAW,WAAW,uBAAuB,QAAQ,GAAG;AACtD,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,YAAY;AAAA,MACpB,SAAS,WAAW,CAAC;AAAA,IACvB;AACA,eAAW,iBAAiB,gBAAgB;AAC1C,YAAM,SAA4B;AAAA,QAChC,MAAM;AAAA,QACN,gBAAgB,cAAc;AAAA,QAC9B,SAAS,cAAc;AAAA,QACvB,cAAc,QAAQ;AAAA,MACxB;AACA,YAAM,SAAS,8BAA8B,UAAU,MAAM;AAC7D,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA,eAAY,cAAc,OAAO;AAAA,UACjC,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,YAAY;AAAA,MACpB,SAAS,WAAW,CAAC;AAAA,IACvB;AACA,eAAW,iBAAiB,gBAAgB;AAC1C,YAAM,SAA4B;AAAA,QAChC,MAAM;AAAA,QACN,gBAAgB,cAAc;AAAA,QAC9B,SAAS,cAAc;AAAA,QACvB,cAAc,QAAQ;AAAA,MACxB;AACA,YAAM,SAAS,8BAA8B,UAAU,MAAM;AAC7D,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA,eAAY,cAAc,OAAO;AAAA,UACjC,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,OAAO,SAAS,oBAAoB,aAAa,CAAC,CAAC,EAAE,KAAK,cAAc;AACjG,aAAW,QAAQ,WAAW;AAC5B,UAAM,SAA4B,EAAE,MAAM,YAAY,QAAQ,KAAK,OAAO;AAC1E,aAAS,KAAK,mBAAmB,QAAQ,YAAY,KAAK,MAAM,IAAI,KAAK,QAAQ,UAAU,uBAAuB,CAAC;AAAA,EACrH;AAEA,QAAM,WAAW,OAAO,OAAO,SAAS,oBAAoB,YAAY,CAAC,CAAC,EAAE,KAAK,cAAc;AAC/F,aAAW,QAAQ,UAAU;AAC3B,UAAM,SAA4B,EAAE,MAAM,WAAW,QAAQ,KAAK,OAAO;AACzE,aAAS,KAAK,mBAAmB,QAAQ,WAAW,KAAK,MAAM,IAAI,KAAK,QAAQ,UAAU,uBAAuB,CAAC;AAAA,EACpH;AAEA,SAAO;AACT;AAEA,SAAS,mBACP,QACA,OACA,QACA,UACA,yBACuB;AACvB,QAAM,gBAAwC,CAAC;AAC/C,MAAI,SAAS;AACb,QAAM,WAAW;AAAA,IACf,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,eAAe;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,kBAAc,KAAK,aAAa,KAAK;AACrC,aAAS,aAAa;AACtB,QAAI,QAAQ,OAAO,SAAS,KAAK,OAAO,QAAQ,CAAC,GAAG,SAAS,aAAa;AACxE,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AA0JA,SAAS,eACP,MACA,OACQ;AACR,SAAO,OAAO,SAAS,KAAK,QAAQ,EAAE,IAAI,OAAO,SAAS,MAAM,QAAQ,EAAE;AAC5E;AAEA,SAAS,iBACP,SACgD;AAChD,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,GAAI,QAAQ,QAAQ,EAAE,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC9C,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,+BACP,kBAKO;AACP,MAAI,uBAAuB,KAAK,gBAAgB,GAAG;AACjD,UAAM,YAAY,sBAAsB,KAAK,gBAAgB,IAAI,CAAC;AAClE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QACE,aAAa,UAAU,KAAK,EAAE,SAAS,IACnC,yBAAyB,SAAS,mCAClC;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,oCAAoC,KAAK,gBAAgB,GAAG;AAC9D,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,wBAAwB,KAAK,gBAAgB,GAAG;AAClD,UAAM,cAAc,uBAAuB,KAAK,gBAAgB,IAAI,CAAC;AACrE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QACE,eAAe,YAAY,KAAK,EAAE,SAAS,IACvC,6BAA6B,WAAW,kCACxC;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,sBAAsB,KAAK,gBAAgB,GAAG;AAChD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,4BAA4B,KAAK,gBAAgB,GAAG;AACtD,UAAM,OAAO,sBAAsB,KAAK,gBAAgB,IAAI,CAAC;AAC7D,WAAO;AAAA,MACL,OAAO,OAAO,iBAAc,IAAI,KAAK;AAAA,MACrC,QAAQ,OACJ,oBAAqB,IAAI,kEACzB;AAAA,IACN;AAAA,EACF;AAEA,MAAI,0BAA0B,KAAK,gBAAgB,GAAG;AACpD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,gEAAgE,KAAK,gBAAgB,GAAG;AAC1F,UAAM,oBAAoB,uBAAuB,KAAK,gBAAgB,IAAI,CAAC;AAC3E,UAAM,qBAAqB,CAAC,GAAG,iBAAiB,SAAS,+DAA+D,CAAC,EACtH,IAAI,CAAC,UAAU,kBAAkB,MAAM,CAAC,KAAK,EAAE,CAAC,EAChD,KAAK,EAAE,EACP,KAAK;AACR,UAAM,eAAe,qBAAqB,sBAAsB,IAAI,KAAK;AACzE,UAAM,SAAS,aAAa,KAAK,WAAW,IAAI,CAAC,GAAG,YAAY;AAChE,UAAM,QACJ,WAAW,QACP,4BACA,SACE,GAAG,MAAM,WACT;AACR,WAAO;AAAA,MACL;AAAA,MACA,QACE,YAAY,SAAS,IACjB,6DAA6D,WAAW,MACxE;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,SAAO,KACJ,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAI,EACvB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAASG,YAAW,OAWlB;AACA,QAAM,YAA+B,CAAC;AACtC,QAAM,QAQF,CAAC;AACL,MAAI;AACJ,MAAI;AACJ,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,kBAAU,KAAK,KAAK,IAAI;AACxB;AAAA,MACF,KAAK;AACH,YAAI,KAAK,MAAM,EAAG,WAAU,KAAK,aAAa;AAAA,iBACrC,KAAK,MAAM,EAAG,WAAU,KAAK,WAAW;AACjD;AAAA,MACF,KAAK;AACH,uBAAe,KAAK;AACpB;AAAA,MACF,KAAK;AACH,yBAAiB,KAAK;AACtB;AAAA,MACF,KAAK;AACH,cAAM,cAAc,KAAK;AACzB;AAAA,MACF,KAAK;AACH,cAAM,UAAU,KAAK;AACrB;AAAA,MACF,KAAK;AACH,cAAM,WAAW,KAAK;AACtB;AAAA,MACF,KAAK;AACH,cAAM,aAAa,KAAK;AACxB;AAAA,MACF,KAAK;AACH,cAAM,WAAW,KAAK;AACtB;AAAA,MACF,KAAK;AACH,cAAM,YAAY,KAAK;AACvB;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,WAAW;AAC1B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,SAAS;AACxB;AAAA,MACF,KAAK;AAEH;AAAA,IACJ;AAAA,EACF;AACA,MAAI,kBAAkB,cAAc;AAClC,UAAM,kBAAkB,kBAAkB;AAAA,EAC5C;AACA,QAAM,WAAW,OAAO,KAAK,KAAK,EAAE,SAAS;AAC7C,SAAO,WAAW,EAAE,OAAO,WAAW,WAAW,MAAM,IAAI,EAAE,OAAO,UAAU;AAChF;AAEA,SAASC,uBAAsB,SAAoC;AACjE,MAAI,WAAW,OAAO,YAAY,aAC9B,QAA8B,SAAS,SAAU,QAA8B,SAAS,kBAAkB;AAC5G,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,QAChB,CAAC,UACC,QAAQ,KAAK,KACb,OAAO,UAAU,aACf,MAA4B,SAAS,eACpC,MAA4B,SAAS,WACrC,MAA4B,SAAS,SACrC,MAA4B,SAAS,gBACrC,MAA4B,SAAS,eACrC,MAA4B,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC,EAAE,MAAM,aAAa,UAAU,CAAC,EAAE,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,0BACP,SACA,UAKQ;AACR,QAAM,QAAQ,CAAC,UAAU,YAAY,OAAO,MAAM,+CAA+C;AACjG,MAAI,UAAU,MAAM;AAClB,UAAM,KAAK,QAAQ,SAAS,IAAI,GAAG;AAAA,EACrC;AACA,MAAI,UAAU,oBAAoB,SAAS,UAAU,oBAAoB,WAAW,QAAW;AAC7F,UAAM;AAAA,MACJ,cAAc,SAAS,mBAAmB,SAAS,SAAS,mBAAmB,MAAM;AAAA,IACvF;AAAA,EACF;AACA,MAAI,UAAU,kBAAkB,SAAS,UAAU,kBAAkB,WAAW,QAAW;AACzF,UAAM;AAAA,MACJ,YAAY,SAAS,iBAAiB,SAAS,SAAS,iBAAiB,MAAM;AAAA,IACjF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,aAAa,OAAqB,SAA0B;AACnE,SAAO,WAAW,MAAM;AAC1B;;;ACvxCO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC;AAAA,EAET,YACE,MACA,SACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,qBACd,UACA,WACA,QACA,SAGuB;AACvB,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,mBAAmB;AACrB,WAAO;AAAA,EACT;AAEA,SAAO,2BAA2B,UAAU,WAAW,QAAQ,OAAO;AACxE;AAEA,SAAS,2BACP,UACA,WACA,QACA,SAGuB;AACvB,QAAM,QAAQ,eAAe,SAAS,OAAO;AAC7C,QAAM,kBAAkB,aAAa,WAAW,MAAM,MAAM,MAAM;AAClE,QAAM,iBAAiB,qBAAqB,QAAQ,OAAO,gBAAgB,IAAI;AAE/E,sBAAoB,MAAM,MAAM,MAAM,gBAAgB,MAAM,gBAAgB,EAAE,CAAC;AAE/E,QAAM,YAAY;AAAA,IAChB,GAAG,MAAM,MAAM,MAAM,GAAG,gBAAgB,IAAI,EAAE,IAAI,cAAc;AAAA,IAChE,GAAG,eAAe,IAAI,cAAc;AAAA,IACpC,GAAG,MAAM,MAAM,MAAM,gBAAgB,EAAE,EAAE,IAAI,cAAc;AAAA,EAC7D;AAEA,QAAM,YAAuB;AAAA,IAC3B,gBAAgB,yBAAyB,MAAM,cAAc;AAAA,IAC7D,OAAO,oBAAoB,SAAS;AAAA,IACpC,MAAM;AAAA,EACR;AACA,YAAU,OAAO,UAAU,MAAM;AAEjC,QAAM,QAAQ,gBAAgB,OAAO,eAAe;AAEpD,SAAO;AAAA,IACL,UAAU;AAAA,MACR,GAAG;AAAA,MACH,WAAW,QAAQ;AAAA,MACnB,SAAS,mBAAmB,SAAS;AAAA,IACvC;AAAA,IACA,WAAW,wBAAwB,OAAO,KAAK;AAAA,IAC/C,SAAS;AAAA,MACP,OAAO;AAAA,QACL;AAAA,UACE,MAAM,gBAAgB;AAAA,UACtB,IAAI,gBAAgB;AAAA,UACpB,YAAY,eAAe;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,iBAAiB;AAAA,QACjB,kBAAkB;AAAA,QAClB,GAAI,gCAAgC,OAAO,iBAAiB,cAAc,IACtE,EAAE,uBAAuB,KAAK,IAC9B,CAAC;AAAA,MACP;AAAA,IACF;AAAA,IACA,WAAW,gBAAgB,SAAS;AAAA,EACtC;AACF;AAEA,SAAS,kCACP,UACA,WACA,QACA,SAG8B;AAC9B,QAAM,QAAQ,2BAA2B,UAAU,SAAS;AAC5D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,UAAU,eAAe;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAA2C;AAAA,IAC/C,GAAG;AAAA,IACH,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU,CAAC,MAAM,SAAS;AAAA,IAC5B;AAAA,EACF;AACA,QAAM,iBAAiB;AAAA,IACrB,UAAU,SAAS,MAAM;AAAA,IACzB,UAAU,OAAO,MAAM;AAAA,EACzB;AACA,QAAM,cAAc,2BAA2B,eAAe,gBAAgB,QAAQ,OAAO;AAC7F,QAAM,sBAAuB,YAAY,SAAS,QAA6B;AAC/E,QAAM,WAA6B;AAAA,IACjC,GAAG,MAAM;AAAA,IACT,UAAU,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,eAAe;AACvD,UAAI,eAAe,MAAM,iBAAiB;AACxC,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ;AACd,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,MAAM,KAAK,IAAI,CAAC,KAAK,aAAa;AACtC,cAAI,aAAa,MAAM,UAAU;AAC/B,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,cAAc;AACxC,kBAAI,cAAc,MAAM,WAAW;AACjC,uBAAO;AAAA,cACT;AAEA,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,UAAU;AAAA,kBACR,GAAG,KAAK,SAAS,MAAM,GAAG,MAAM,UAAU;AAAA,kBAC1C,GAAG;AAAA,kBACH,GAAG,KAAK,SAAS,MAAM,MAAM,aAAa,CAAC;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,GAAG;AAAA,MACH,WAAW,QAAQ;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,YAAY,UAAU,SAAS,MAAM;AAAA,MACrC,YAAY,UAAU,OAAO,MAAM;AAAA,IACrC;AAAA,IACA,SAAS;AAAA,MACP,GAAG,YAAY;AAAA,MACf,OAAO,YAAY,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,QAC9C,GAAG;AAAA,QACH,MAAM,KAAK,OAAO,MAAM;AAAA,QACxB,IAAI,KAAK,KAAK,MAAM;AAAA,MACtB,EAAE;AAAA,IACJ;AAAA,IACA,WAAW,YAAY;AAAA,EACzB;AACF;AAEA,SAAS,2BACP,UACA,WAYO;AACP,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,QAAQ,KAAK,SAAS,SAAS,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,4BAA4B,UAAU,SAAS;AAC/D,QAAM,gBAAgB,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AAC/D,QAAM,cAAc,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AAE7D,WAAS,aAAa,GAAG,aAAa,KAAK,SAAS,QAAQ,cAAc,GAAG;AAC3E,UAAM,QAAQ,KAAK,SAAS,UAAU;AACtC,UAAM,eAAe,QAAQ,OAAO,UAAU;AAC9C,QAAI,OAAO,SAAS,WAAW,cAAc,SAAS,SAAS;AAC7D;AAAA,IACF;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AACA,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,aAAS,WAAW,GAAG,WAAW,MAAM,KAAK,QAAQ,YAAY,GAAG;AAClE,YAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,YAAM,aAAa,aAAa,KAAK,QAAQ;AAC7C,UAAI,CAAC,OAAO,CAAC,YAAY;AACvB;AAAA,MACF;AAEA,eAAS,YAAY,GAAG,YAAY,IAAI,MAAM,QAAQ,aAAa,GAAG;AACpE,cAAM,OAAO,IAAI,MAAM,SAAS;AAChC,cAAM,cAAc,WAAW,MAAM,SAAS;AAC9C,YAAI,CAAC,QAAQ,CAAC,aAAa;AACzB;AAAA,QACF;AAEA,iBACM,aAAa,GACjB,aAAa,KAAK,IAAI,KAAK,SAAS,QAAQ,YAAY,QAAQ,MAAM,GACtE,cAAc,GACd;AACA,gBAAM,QAAQ,KAAK,SAAS,UAAU;AACtC,gBAAM,eAAe,YAAY,QAAQ,UAAU;AACnD,cAAI,OAAO,SAAS,eAAe,cAAc,SAAS,aAAa;AACrE;AAAA,UACF;AAEA,gBAAM,kBAAkB;AAAA,YACtB;AAAA,YACA;AAAA,YACA,aAAa;AAAA,YACb,aAAa;AAAA,UACf;AACA,cAAI,CAAC,iBAAiB;AACpB;AAAA,UACF;AAEA,iBAAO;AAAA,YACL;AAAA,YACA,iBAAiB;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW;AAAA,YACX,gBAAgB,aAAa;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iCACP,eACA,aACA,WACA,SACS;AACT,MAAI,cAAc,SAAS;AACzB,WAAO,kBAAkB,aAAa,gBAAgB;AAAA,EACxD;AAEA,SACE,iBAAiB,aACjB,eAAe,WACf,gBAAgB;AAEpB;AAEA,SAAS,aACP,WACA,WACA,QAC8B;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI,CAAC;AACnE,QAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI,CAAC;AAEjE,MAAI,OAAO,aAAa,KAAK,WAAW;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,aAAa,IAAI,IAAI,EAAE,uBAAuB,SAAS;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,WAAW;AAC7B,QAAI,OAAO,OAAO;AAChB,YAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE,CAAC;AAC7E,YAAM,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE,CAAC;AAC3E,UAAI,eAAe,aAAa,aAAa,WAAW;AACtD,cAAM,IAAI;AAAA,UACR;AAAA,UACA,kBAAkB,YAAY,IAAI,UAAU,uBAAuB,SAAS;AAAA,QAC9E;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,GAAG;AAAA,EACpB;AAEA,MAAI,SAAS,IAAI;AACf,WAAO,EAAE,MAAM,GAAG;AAAA,EACpB;AAEA,MAAI,OAAO,SAAS,mBAAmB;AACrC,WAAO;AAAA,MACL,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;AAAA,MAC1B,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,IAAI,KAAK,IAAI,WAAW,OAAO,CAAC;AAAA,EAClC;AACF;AAEA,SAAS,qBACP,QACA,OACA,UACa;AACb,MAAI,OAAO,SAAS,WAAW;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,iBAAiB,qCAAqC,OAAO,QAAQ;AAE3E,SAAO,OAAO,UAAU,QAAQ,CAAC,UAAU;AACzC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,MAAM,KAAK,MAAM,IAAI,EAAE,IAAe,CAAC,eAAe;AAAA,UAC3D,MAAM;AAAA,UACN,OAAO;AAAA,QACT,EAAE;AAAA,MACJ,KAAK;AACH,eAAO,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,MACzB,KAAK;AACH,eAAO,CAAC,EAAE,MAAM,aAAa,CAAC;AAAA,MAChC,KAAK;AACH,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,eAAe,yBAAyB,cAAc;AAAA,UACxD;AAAA,QACF;AAAA,IACJ;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qCACP,OACA,UACqB;AACrB,MAAI,UAAU,yBAAyB,MAAM,cAAc;AAE3D,WAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,UAAU,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG;AAC9E,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAI,KAAK,SAAS,mBAAmB;AACnC,gBAAU,yBAAyB,KAAK,aAAa;AAAA,IACvD,WAAW,KAAK,SAAS,kBAAkB,KAAK,eAAe;AAC7D,gBAAU,yBAAyB,KAAK,aAAa;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAiC;AAC5D,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAA0B,CAAC;AAEjC,aAAW,QAAQ,OAAO;AACxB,QACE,KAAK,SAAS,qBACd,WAAW,WAAW,SAAS,CAAC,GAAG,SAAS,mBAC5C;AACA,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,eAAe,yBAAyB,KAAK,aAAa;AAAA,MAC5D,CAAC;AACD;AAAA,IACF;AAEA,eAAW,KAAK,eAAe,IAAI,CAAC;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAA0B;AACrD,QAAM,gBAAgB,MAAM;AAAA,IAC1B,CAAC,SAAS,KAAK,SAAS,mBAAmB,KAAK,SAAS,kBAAkB,KAAK,SAAS;AAAA,EAC3F;AAEA,MAAI,CAAC,eAAe;AAClB;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,sCAAsC,cAAc,IAAI;AAAA,EAC1D;AACF;AAEA,SAAS,gCACP,OACA,OACA,gBACS;AACT,MAAI,eAAe,KAAK,CAAC,SAAS,KAAK,SAAS,iBAAiB,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,MACV,MAAM,MAAM,MAAM,MAAM,EAAE,EAC1B,KAAK,CAAC,SAAS,KAAK,SAAS,iBAAiB;AACnD;;;AC5dO,SAAS,WACd,UACA,WACA,MACA,SACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW;AAAA,QACT;AAAA,UACE,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,0BACd,UACA,WACA,SACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,cACN;AAAA,MACE,MAAM;AAAA,IACR,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC;AAAA,IACd;AAAA,IACJ;AAAA,EACF;AACF;AAEO,SAAS,yBACd,UACA,WACA,SACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,cACN;AAAA,MACE,MAAM;AAAA,IACR,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC;AAAA,IACd;AAAA,IACJ;AAAA,EACF;AACF;AAEO,SAAS,UACd,UACA,WACA,SACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBACd,UACA,WACA,SACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,EAAE,MAAM,aAAa,CAAC;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,eACd,UACA,WACA,SACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAAA,IACzC;AAAA,IACA;AAAA,EACF;AACF;;;AC3GO,SAAS,mBACd,gBACA,QACgB;AAChB,SAAO,qBAAqB,gBAAgB,MAAM;AACpD;AAEO,SAAS,gBACd,QACA,SACc;AACd,SAAO,UAAU,QAAQ,OAAO;AAClC;AAEO,SAAS,eAAe,QAAgC;AAC7D,MAAI,OAAO,SAAS,SAAS;AAC3B,WAAO,eAAe,OAAO,KAAK;AAAA,EACpC;AAEA,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO,EAAE,MAAM,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,EAC1C;AAEA,SAAO,eAAe,OAAO,cAAc;AAC7C;AAEO,SAAS,4BACd,QACA,SACS;AACT,QAAM,QAAQ,eAAe,MAAM;AAEnC,MAAI,MAAM,SAAS,MAAM,IAAI;AAC3B,WAAO,QAAQ,MAAM;AAAA,MACnB,CAAC,SAAS,KAAK,QAAQ,MAAM,QAAQ,KAAK,MAAM,MAAM;AAAA,IACxD;AAAA,EACF;AAEA,SAAO,QAAQ,MAAM;AAAA,IACnB,CAAC,SAAS,KAAK,OAAO,MAAM,MAAM,KAAK,KAAK,MAAM;AAAA,EACpD;AACF;AAEO,SAAS,gCACd,SACA,OACS;AACT,QAAM,aAAa,eAAe,KAAK;AACvC,MAAI,WAAW,SAAS,WAAW,IAAI;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,kBAAkB,OAAO;AAC/C,MAAI,eAAe;AACjB,WAAO,cAAc;AAAA,MACnB,CAAC,UACC,MAAM,SAAS,eACf,WAAW,QAAQ,MAAM,QACzB,WAAW,MAAM,MAAM;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe,OAAO;AACpC,QAAM,aAAa,KAAK,IAAI,WAAW,IAAI,MAAM,MAAM,MAAM;AAE7D,WAAS,QAAQ,KAAK,IAAI,GAAG,WAAW,IAAI,GAAG,QAAQ,YAAY,SAAS,GAAG;AAC7E,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,qBAAqB,KAAK,SAAS,gBAAgB;AACnE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,2BACd,SACA,QACS;AACT,MAAI,OAAO,SAAS,SAAS;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,eAAe,OAAO,KAAK;AAC9C,MAAI,WAAW,SAAS,WAAW,IAAI;AACrC,WAAO;AAAA,EACT;AAEA,SAAO,gCAAgC,SAAS,UAAU;AAC5D;AAEA,SAAS,kBACP,SAC+D;AAC/D,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,YAAY,UAAU;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,SAAU,QAAiC;AACjD,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,qBAAqB,MAAM;AAE9C,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAAS,qBACP,QACmD;AACnD,QAAM,YAA+D,CAAC;AAEtE,aAAW,SAAS,QAAQ;AAC1B,QACE,CAAC,SACD,OAAO,UAAU,YACjB,OAAQ,MAA6B,SAAS,YAC9C,OAAQ,MAA6B,SAAS,YAC9C,OAAQ,MAA2B,OAAO,UAC1C;AACA;AAAA,IACF;AAEA,cAAU,KAAK;AAAA,MACb,MAAO,MAA2B;AAAA,MAClC,MAAO,MAA2B;AAAA,MAClC,IAAK,MAAyB;AAAA,IAChC,CAAC;AAED,QACG,MAA2B,SAAS,WACrC,MAAM,QAAS,MAA6B,IAAI,GAChD;AACA,iBAAW,OAAQ,MAAiD,MAAM;AACxE,mBAAW,QAAQ,IAAI,SAAS,CAAC,GAAG;AAClC,cAAI,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAS,KAAiC,OAAO,GAAG;AAChG,sBAAU,KAAK,GAAG,qBAAsB,KAAgC,OAAO,CAAC;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QACG,MAA2B,SAAS,eACrC,MAAM,QAAS,MAAmC,QAAQ,GAC1D;AACA,gBAAU,KAAK,GAAG,qBAAsB,MAAkC,QAAQ,CAAC;AAAA,IACrF;AAAA,EACF;AAEA,SAAO;AACT;;;AC9JO,SAAS,oBACd,SAC2B;AAC3B,QAAM,WAAW,OAAO;AAAA,IACtB,OAAO,QAAQ,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,WAAW,OAAO,MAAM;AAAA,MAC7D;AAAA,MACA,mBAAmB,SAAS,QAAQ,SAAS,QAAQ,WAAW;AAAA,IAClE,CAAC;AAAA,EACH;AACA,QAAM,qBAAqB,OAAO,OAAO,QAAQ,EAC9C,OAAO,CAAC,YAAY,QAAQ,OAAO,SAAS,UAAU,EACtD,IAAI,CAAC,YAAY,QAAQ,SAAS;AAErC,SAAO;AAAA,IACL;AAAA,IACA,UAAU,4BAA4B,UAAU,QAAQ,oBAAoB,CAAC,CAAC;AAAA,IAC9E;AAAA,EACF;AACF;AAEO,SAAS,mBACd,SACA,SACA,aACqB;AACrB,MAAI,QAAQ,OAAO,SAAS,YAAY;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,gBAAgB,QAAQ,QAAQ,OAAO;AAC5D,QAAM,SAAS,uBAAuB,QAAQ,QAAQ,cAAc,SAAS,WAAW;AAExF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,uBACP,gBACA,cACA,SACA,aACc;AACd,MAAI,aAAa,SAAS,YAAY;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,eAAe,cAAc;AACnD,QAAM,cAAc,eAAe,YAAY;AAE/C,MACE,eAAe,SAAS,WACxB,cAAc,OAAO,cAAc,MACnC,aAAa,SAAS,WACtB,YAAY,SAAS,YAAY,MACjC,4BAA4B,gBAAgB,OAAO,GACnD;AACA,WAAO,mBAAmB,eAAe,aAAa,OAAO,CAAC;AAAA,EAChE;AAEA,MACE,aAAa,SAAS,WACtB,CAAC,gCAAgC,aAAa,aAAa,KAAK,GAChE;AACA,WAAO,mBAAmB,eAAe,8BAA8B;AAAA,EACzE;AAEA,SAAO;AACT;AAEA,SAAS,aACP,SAC4C;AAC5C,SAAO,QAAQ,UAAU,wBACrB,iCACA;AACN;AAEA,SAAS,4BACP,UACA,kBACiB;AACjB,QAAM,mBAAmB,iBAAiB;AAAA,IACxC,CAAC,YACC,QAAQ,SAAS,6BACjB,CAAC,QAAQ,WACT,OAAO,QAAQ,QAAQ,cAAc,YACrC,SAAS,QAAQ,QAAQ,SAAS,GAAG,OAAO,SAAS;AAAA,EACzD;AAEA,QAAM,mBAAmB,IAAI;AAAA,IAC3B,iBACG,OAAO,CAAC,YAAY,QAAQ,SAAS,yBAAyB,EAC9D;AAAA,MAAI,CAAC,YACJ,OAAO,QAAQ,SAAS,cAAc,WAClC,QAAQ,QAAQ,YAChB;AAAA,IACN,EACC,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC;AAAA,EACtD;AAEA,QAAM,mBAAmB,OAAO,OAAO,QAAQ,EAC5C;AAAA,IACC,CAAC,YACC,QAAQ,OAAO,SAAS,cAAc,CAAC,iBAAiB,IAAI,QAAQ,SAAS;AAAA,EACjF,EACC,IAAI,CAAC,YAAY,6BAA6B,OAAO,CAAC;AAEzD,SAAO,CAAC,GAAG,kBAAkB,GAAG,gBAAgB;AAClD;AAEA,SAAS,6BACP,SACe;AACf,QAAM,SAAS,QAAQ,OAAO,SAAS,aAAa,QAAQ,SAAS;AAErE,SAAO;AAAA,IACL,WAAW,mCAAmC,QAAQ,SAAS;AAAA,IAC/D,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,WAAW,QAAQ,SAAS;AAAA,IACrC,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,SAAS;AAAA,MACP,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AACF;;;ACjEO,SAAS,oBACd,QACA,SACgB;AAChB,SAAO,UAAU,QAAQ,OAAO;AAClC;AAEO,SAAS,yBAAyB,QAAiC;AACxE,SAAO,OAAO,SAAS;AACzB;AAEO,SAAS,wBAAwB,QAA+C;AACrF,MAAI,OAAO,SAAS,SAAS;AAC3B,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,OAAO,eAAe,OAAO,KAAK;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,IAAI,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C;AACF;AAEO,SAAS,yBACd,UAGuB;AACvB,MACE,OAAO,aAAa,YACpB,OAAO,SAAS,SAAS,uBAAuB,YAChD,SAAS,SAAS,mBAAmB,SAAS,GAC9C;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO,aAAa,WAAW,WAAW,SAAS;AAChE,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEO,SAAS,qBACd,QACS;AACT,SAAO,yBAAyB,MAAM,MAAM,gBAAgB,OAAO,WAAW;AAChF;AAEO,SAAS,qBAAqB,MAA4B;AAC/D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AC7GO,SAAS,oBACd,YAA4C,CAAC,GAC9B;AACf,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AA8BO,SAAS,qBACd,OACA,UACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT,CAAC,SAAS,UAAU,GAAG,wBAAwB,QAAQ;AAAA,IACzD;AAAA,EACF;AACF;AAEO,SAAS,kBACd,OACA,YACA,QACe;AACf,QAAM,WAAW,MAAM,UAAU,UAAU;AAC3C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,YAAY;AAClC,WAAO;AAAA,EACT;AAEA,OACG,WAAW,cAAc,WAAW,eACrC,yBAAyB,QAAQ,MAAM,cACvC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,qBAAqB,OAAO;AAAA,IACjC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAkBO,SAAS,mBACd,OACA,SACe;AACf,SAAO;AAAA,IACL,OAAO;AAAA,MACL,OAAO,QAAQ,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,YAAY,QAAQ,MAAM;AAC9D,cAAM,SAAS,oBAAoB,SAAS,QAAQ,OAAO;AAC3D,cAAM,SACJ,OAAO,SAAS,aACZ,aACA,SAAS,WAAW,cAAc,SAAS,WAAW,aACpD,SAAS,SACT;AAER,eAAO;AAAA,UACL;AAAA,UACA,wBAAwB;AAAA,YACtB,GAAG;AAAA,YACH;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,gCACd,OAC2B;AAC3B,QAAM,YAAY,OAAO,OAAO,MAAM,SAAS,EAC5C,IAAI,cAAc,EAClB,KAAK,sBAAsB;AAE9B,SAAO;AAAA,IACL,YAAY,UAAU;AAAA,IACtB,mBAAmB,UAChB,OAAO,CAAC,aAAa,SAAS,WAAW,QAAQ,EACjD,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IACxC,qBAAqB,UAClB,OAAO,CAAC,aAAa,SAAS,WAAW,UAAU,EACnD,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IACxC,qBAAqB,UAClB,OAAO,CAAC,aAAa,SAAS,WAAW,UAAU,EACnD,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IACxC,qBAAqB,UAClB,OAAO,CAAC,aAAa,SAAS,WAAW,UAAU,EACnD,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IACxC,uBAAuB,UACpB,OAAO,CAAC,aAAa,SAAS,kBAAkB,YAAY,EAC5D,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IACxC,yBAAyB,UACtB,OAAO,CAAC,aAAa,SAAS,kBAAkB,eAAe,EAC/D,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IACxC;AAAA,EACF;AACF;AAEA,SAAS,eAAe,UAAgD;AACtE,QAAM,gBAAgB,wBAAwB,SAAS,MAAM;AAC7D,QAAM,gBAAgB,yBAAyB,QAAQ;AAEvD,QAAM,WAAW,SAAS,SAAS;AAEnC,SAAO;AAAA,IACL,YAAY,SAAS;AAAA,IACrB,MAAM,SAAS;AAAA,IACf,OAAO,qBAAqB,SAAS,IAAI;AAAA,IACzC,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA,aACE,cAAc,UAAU,aACpB,YAAY,cAAc,MAAM,IAAI,IAAI,cAAc,MAAM,EAAE,KAC9D,SAAS,cAAc,MAAM,IAAI,IAAI,cAAc,MAAM,EAAE;AAAA,IACjE,WAAW,SAAS;AAAA,IACpB,UAAU,SAAS;AAAA,IACnB,cAAc,SAAS,WAAW;AAAA,IAClC,WAAW,qBAAqB,QAAQ;AAAA,IACxC,WAAW,qBAAqB,QAAQ;AAAA,IACxC,oBAAoB,SAAS,SAAS;AAAA,IACtC,sBAAsB,UAAU;AAAA,IAChC,eAAe,UAAU;AAAA,EAC3B;AACF;AAEA,SAAS,wBAAwB,UAA0C;AACzE,QAAM,gBAAgB,yBAAyB,QAAQ;AAEvD,MAAI,yBAAyB,SAAS,MAAM,GAAG;AAC7C,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,UAAU;AAAA,QACR,GAAG,SAAS;AAAA,QACZ,oBACE,SAAS,SAAS,uBACjB,kBAAkB,kBACf,qCACA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,mBAAmB,SAAS,WAAW,YAAY;AACvE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,SAAS,WAAW,cAAc,SAAS,WAAW,aAAa,WAAW,SAAS;AAAA,MAC/F,UAAU;AAAA,QACR,GAAG,SAAS;AAAA,QACZ,oBACE,SAAS,SAAS,sBAAsB;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,MACA,OACQ;AACR,QAAM,cAAc,kBAAkB,KAAK,MAAM,IAAI,kBAAkB,MAAM,MAAM;AACnF,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,qBACJ,yBAAyB,KAAK,aAAa,IAAI,yBAAyB,MAAM,aAAa;AAC7F,MAAI,uBAAuB,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,UAAU,cAAc,MAAM,SAAS;AACrD;AAEA,SAAS,kBAAkB,QAAgC;AACzD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,yBAAyB,eAA8C;AAC9E,UAAQ,eAAe;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AC7PO,SAAS,oBACd,SAC2B;AAC3B,QAAM,WAAW,QAAQ,MAAM,UAAU,QAAQ,UAAU;AAE3D,MAAI,CAAC,UAAU;AACb,WAAO,cAAc,SAAS,WAAW,gCAAgC;AAAA,EAC3E;AAEA,MAAI,SAAS,WAAW,UAAU;AAChC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,uBAAuB,SAAS,MAAM;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,SAAS,OAAO,SAAS,YAAY;AACvC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,yBAAyB,QAAQ,MAAM,cAAc;AACvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,SAAS,sBAChB;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,SAAS,OAAO,SAAS,SAAS;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe,QAAQ,SAAS,OAAO;AACrD,QAAM,QAAQC;AAAA,IACZ,SAAS,OAAO,MAAM;AAAA,IACtB,SAAS,OAAO,MAAM;AAAA,EACxB;AAEA,MAAI,MAAM,KAAK,MAAM,MAAM;AACzB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,kBAAkB,MAAM,IAAI,IAAI,MAAM,EAAE,uBAAuB,MAAM,IAAI;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,qBAAqB,kCAAkC,OAAO,UAAU,QAAQ,MAAM;AAC5F,MAAI,oBAAoB;AACtB,UAAMC,mBAAkB,kBAAkB,QAAQ,MAAM;AACxD,UAAMC,cAAa;AAAA,MACjB,QAAQ;AAAA,MACR,wBAAwB,mBAAmB,MAAM,mBAAmB,EAAE;AAAA,MACtE;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,WAAW,CAAC;AAAA,MACd;AAAA,MACA;AAAA,QACE,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAEA,UAAMC,aAAY;AAAA,MAChB,kBAAkB,QAAQ,OAAO,SAAS,YAAYF,gBAAe;AAAA,MACrEC,YAAW;AAAA,IACb;AAEA,WAAO;AAAA,MACL,UAAUA,YAAW;AAAA,MACrB,OAAOC;AAAA,MACP,SAASD,YAAW;AAAA,MACpB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,YAAY,SAAS;AAAA,QACrB,QAAQ,QAAQ;AAAA,QAChB,iBAAAD;AAAA,QACA,gBAAgB;AAAA,MAClB;AAAA,MACA,qBAAqB,2BAA2B,QAAQ,OAAOE,UAAS;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,kCAAkC,UAAU,QAAQ,MAAM,GAAG;AAC/D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,EAAE;AACpD,MACE,MAAM;AAAA,IACJ,CAAC,SACC,KAAK,SAAS,qBAAqB,KAAK,SAAS;AAAA,EACrD,GACA;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MACE,MAAM;AAAA,IACJ,CAAC,SACC,KAAK,SAAS,WAAW,KAAK,SAAS;AAAA,EAC3C,GACA;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,kBAAkB,QAAQ,MAAM;AACxD,QAAM,iBAAiB,wBAAwB,UAAU,QAAQ,MAAM;AAEvE,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,MACL,UAAU,QAAQ;AAAA,MAClB,OAAO,kBAAkB,QAAQ,OAAO,SAAS,YAAY,eAAe;AAAA,MAC5E,SAAS,mBAAmB;AAAA,MAC5B,SAAS;AAAA,QACP,MAAM;AAAA,QACN,YAAY,SAAS;AAAA,QACrB,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,gBAAgB;AAAA,MAClB;AAAA,MACA,qBAAqB,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,QAAQ;AAAA,IACR,wBAAwB,MAAM,MAAM,MAAM,EAAE;AAAA,IAC5C;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,WAAW,CAAC;AAAA,IACd;AAAA,IACA;AAAA,MACE,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,kBAAkB,QAAQ,OAAO,SAAS,YAAY,eAAe;AAAA,IACrE,WAAW;AAAA,EACb;AAEA,SAAO;AAAA,IACL,UAAU,WAAW;AAAA,IACrB,OAAO;AAAA,IACP,SAAS,WAAW;AAAA,IACpB,SAAS;AAAA,MACP,MAAM;AAAA,MACN,YAAY,SAAS;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,IACA,qBAAqB,2BAA2B,QAAQ,OAAO,SAAS;AAAA,EAC1E;AACF;AAEA,SAAS,cACP,SACA,QACA,QAC2B;AAC3B,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,SAAS,mBAAmB;AAAA,IAC5B,SAAS;AAAA,MACP,MAAM;AAAA,MACN,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,IACA,qBAAqB,CAAC;AAAA,EACxB;AACF;AAEA,SAAS,kBACP,QACyB;AACzB,SAAO,WAAW,WAAW,aAAa;AAC5C;AAEA,SAAS,wBACP,UACA,QACS;AACT,SACG,SAAS,SAAS,eAAe,WAAW,YAC5C,SAAS,SAAS,cAAc,WAAW;AAEhD;AAEA,SAAS,kCACP,UACA,QACS;AACT,SACG,SAAS,SAAS,yBAAyB,mBAAmB,WAAW,YACzE,SAAS,SAAS,yBAAyB,mBAAmB,WAAW;AAE9E;AAEA,SAAS,kCACP,OACA,UACA,QAC0C;AAC1C,QAAM,uBAAuB,SAAS,SAAS;AAC/C,MACE,SAAS,OAAO,SAAS,WACxB,yBAAyB,mBAAmB,yBAAyB,iBACtE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,uBACH,yBAAyB,mBAAmB,WAAW,YACvD,yBAAyB,mBAAmB,WAAW;AAC1D,MAAI,CAAC,sBAAsB;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,mBAAmB,KAAK;AAC3C,QAAM,iBAAiBH;AAAA,IACrB,SAAS,OAAO,MAAM;AAAA,IACtB,SAAS,OAAO,MAAM;AAAA,EACxB,EAAE;AACF,QAAM,YAAY,WAAW;AAAA,IAC3B,CAAC,cACC,UAAU,QAAQ,kBACjB,kBAAkB,UAAU,SAAS,kBAAkB,UAAU;AAAA,EACtE;AACA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI,yBAAyB,iBAAiB;AAC5C,UAAMI,iBAAgB,UAAU;AAChC,QAAI,MAAM,MAAMA,cAAa,GAAG,SAAS,mBAAmB;AAC1D,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,MAAMA;AAAA,MACN,IAAIA,iBAAgB;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU,QAAQ;AACxC,MAAI,gBAAgB,KAAK,MAAM,MAAM,aAAa,GAAG,SAAS,mBAAmB;AAC/E,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,gBAAgB;AAAA,EACtB;AACF;AAEA,SAAS,mBACP,OACuC;AACvC,QAAM,aAAoD,CAAC;AAC3D,MAAI,QAAQ;AACZ,MAAI,sBAAsB;AAE1B,WAAS,QAAQ,GAAG,QAAQ,MAAM,MAAM,QAAQ,SAAS,GAAG;AAC1D,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAI,KAAK,SAAS,mBAAmB;AACnC,iBAAW,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;AACrC,cAAQ,QAAQ;AAChB,4BAAsB;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,gBAAgB;AAChC,UAAI,qBAAqB;AACvB,mBAAW,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;AAAA,MACvC;AACA,cAAQ,QAAQ;AAChB,4BAAsB,QAAQ,KAAK,aAAa;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,qBAAqB;AACvB,eAAW,KAAK,EAAE,OAAO,KAAK,MAAM,MAAM,OAAO,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAASJ,gBAAe,MAAc,IAA0C;AAC9E,SAAO;AAAA,IACL,MAAM,KAAK,IAAI,MAAM,EAAE;AAAA,IACvB,IAAI,KAAK,IAAI,MAAM,EAAE;AAAA,EACvB;AACF;AAEA,SAAS,2BACP,eACA,WACU;AACV,QAAM,sBAAgC,CAAC;AAEvC,aAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,UAAU,SAAS,GAAG;AACxE,QACE,SAAS,WAAW,cACpB,cAAc,UAAU,UAAU,GAAG,WAAW,YAChD;AACA,0BAAoB,KAAK,UAAU;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;;;ACrWO,SAAS,4BACd,SAC8B;AAC9B,QAAM,cAAc,8BAA8B,QAAQ,OAAO,IAC7D,CAAC,QAAQ,QAAQ,UAAU,IAC3B,qBAAqB,QAAQ,MAAM,KAAK;AAE5C,QAAM,WAAoC,CAAC;AAC3C,QAAM,WAAsF,CAAC;AAC7F,QAAM,qBAA+B,CAAC;AACtC,QAAM,sBAAsB,oBAAI,IAAY;AAE5C,MAAI,QAAQ,QAAQ;AAEpB,aAAW,cAAc,aAAa;AACpC,UAAM,SAAS,oBAAoB;AAAA,MACjC,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,MACb;AAAA,MACA,QAAQ,uBAAuB,QAAQ,OAAO;AAAA,MAC9C,WAAW,QAAQ;AAAA,IACrB,CAAC;AAED,YAAQ;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,IAChB;AACA,aAAS,KAAK,OAAO,OAAO;AAC5B,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO,QAAQ,MAAM;AAAA,IAC9B,CAAC;AAED,QAAI,OAAO,QAAQ,SAAS,WAAW;AACrC,yBAAmB,KAAK,UAAU;AAAA,IACpC;AAEA,eAAW,sBAAsB,OAAO,qBAAqB;AAC3D,0BAAoB,IAAI,kBAAkB;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA,kBAAkB,SAAS;AAAA,QACzB,CAAC,YACC,QAAQ,SAAS;AAAA,MACrB;AAAA,MACA,qBAAqB,CAAC,GAAG,mBAAmB;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,OAAgC;AAC5D,SAAO,OAAO,OAAO,MAAM,SAAS,EACjC,OAAO,CAAC,aAAa,SAAS,WAAW,QAAQ,EACjD,KAAK,CAAC,MAAM,UAAU;AACrB,UAAM,iBAAiB,KAAK,UAAU,cAAc,MAAM,SAAS;AACnE,QAAI,mBAAmB,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,WAAW,cAAc,MAAM,UAAU;AAAA,EACvD,CAAC,EACA,IAAI,CAAC,aAAa,SAAS,UAAU;AAC1C;;;AC+FO,SAAS,qBACd,OACA,SACA,SACmB;AACnB,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,WAAW,mBAAmB,QAAQ,SAAS;AAAA,QACjD;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,KAAK,oBAAoB;AACvB,YAAM,UAAU,QAAQ,WAAW,mBAAmB;AACtD,YAAM,YACJ,QAAQ,aAAa,eAAe,MAAM,WAAW,OAAO;AAC9D,YAAM,cAAc;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,UAAU,YAAY;AAAA,UACtB;AAAA,UACA,UAAU,YAAY;AAAA,UACtB,SAAS;AAAA,YACP,GAAG,MAAM;AAAA,YACT,iBAAiB,YAAY;AAAA,UAC/B;AAAA,UACA,eAAe;AAAA,YACb,GAAG,MAAM;AAAA,YACT,aAAa,QAAQ;AAAA,YACrB,UAAU,YAAY;AAAA,YACtB,gBAAgB,MAAM,cAAc,eAAe;AAAA,cAAI,CAAC,UACtD,MAAM,iBACF;AAAA,gBACE,GAAG;AAAA,gBACH,gBAAgB,UAAU,MAAM,gBAAgB,OAAO;AAAA,cACzD,IACA;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX;AAAA,UACA,SAAS,YAAY;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,mBAAmB,QAAQ,iBAAiB,eAC9C,sBAAsB,OAAO,QAAQ,MAAM,OAAO,IAClD;AACJ,UAAI,iBAAkB,QAAO;AAC7B,aAAO;AAAA,QAAiB;AAAA,QAAO,QAAQ;AAAA,QAAW,CAAC,UAAU,cAC3D,WAAW,UAAU,WAAW,QAAQ,MAAM,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,IACA,KAAK,wBAAwB;AAC3B,YAAM,mBAAmB,QAAQ,iBAAiB,eAC9C,sBAAsB,OAAO,YAAY,OAAO,IAChD;AACJ,UAAI,iBAAkB,QAAO;AAC7B,aAAO;AAAA,QAAiB;AAAA,QAAO,QAAQ;AAAA,QAAW,CAAC,UAAU,cAC3D,0BAA0B,UAAU,WAAW,OAAO;AAAA,MACxD;AAAA,IACF;AAAA,IACA,KAAK,uBAAuB;AAC1B,YAAM,mBAAmB,QAAQ,iBAAiB,eAC9C,sBAAsB,OAAO,WAAW,OAAO,IAC/C;AACJ,UAAI,iBAAkB,QAAO;AAC7B,aAAO;AAAA,QAAiB;AAAA,QAAO,QAAQ;AAAA,QAAW,CAAC,UAAU,cAC3D,yBAAyB,UAAU,WAAW,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,mBAAmB,QAAQ,iBAAiB,eAC9C,0BAA0B,OAAO,OAAO,OAAO,IAC/C;AACJ,UAAI,iBAAkB,QAAO;AAC7B,aAAO;AAAA,QAAiB;AAAA,QAAO,QAAQ;AAAA,QAAW,CAAC,UAAU,cAC3D,UAAU,UAAU,WAAW,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,IACA,KAAK,0BAA0B;AAC7B,YAAM,mBAAmB,QAAQ,iBAAiB,eAC9C,0BAA0B,OAAO,cAAc,OAAO,IACtD;AACJ,UAAI,iBAAkB,QAAO;AAC7B,aAAO;AAAA,QAAiB;AAAA,QAAO,QAAQ;AAAA,QAAW,CAAC,UAAU,cAC3D,gBAAgB,UAAU,WAAW,OAAO;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,KAAK;AACH,UAAI,QAAQ,iBAAiB,cAAc;AACzC,eAAO,kBAAkB,OAAO;AAAA,UAC9B,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS;AAAA,YACP,gBAAgB;AAAA,cACd,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,QAAiB;AAAA,QAAO,QAAQ;AAAA,QAAW,CAAC,UAAU,cAC3D,eAAe,UAAU,WAAW,OAAO;AAAA,MAC7C;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,UAAU,QAAQ;AAAA,QACpB;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,SAAS;AAAA,YACP,GAAG,MAAM;AAAA,YACT,UAAU,QAAQ;AAAA,UACpB;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,KAAK,eAAe;AAClB,UAAI,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,cAAc,QAAQ,QAAQ,SAAS,GAAG;AACrF,eAAO,kBAAkB,OAAO;AAAA,UAC9B,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAEA,YAAM,WAAW,CAAC,GAAG,MAAM,UAAU,QAAQ,OAAO;AACpD,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH;AAAA,UACA,eAAe;AAAA,YACb,GAAG,MAAM;AAAA,YACT,aAAa,QAAQ;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS;AAAA,YACP,eAAe,CAAC,QAAQ,OAAO;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAM,WAAW,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,cAAc,QAAQ,SAAS;AAEzF,UAAI,CAAC,UAAU;AACb,eAAO,kBAAkB,OAAO;AAAA,UAC9B,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAEA,YAAM,WAAW,MAAM,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,QAAQ,SAAS;AAC3F,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH;AAAA,UACA,eAAe;AAAA,YACb,GAAG,MAAM;AAAA,YACT,aAAa,QAAQ;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS;AAAA,YACP,iBAAiB;AAAA,cACf;AAAA,gBACE,WAAW,SAAS;AAAA,gBACpB,MAAM,SAAS;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,WAAW;AAAA,QACf,GAAG,MAAM,SAAS,OAAO;AAAA,QACzB,CAAC,QAAQ,QAAQ,SAAS,GAAG,6BAA6B,QAAQ,OAAO;AAAA,MAC3E;AAEA,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,MAAM;AAAA,YACT,WAAW,QAAQ;AAAA,YACnB,QAAQ;AAAA,cACN,GAAG,MAAM,SAAS;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,YACP,GAAG,MAAM;AAAA,YACT,iBAAiB,QAAQ,QAAQ;AAAA,UACnC;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS;AAAA,YACP,cAAc;AAAA,cACZ,WAAW,QAAQ,QAAQ;AAAA,cAC3B,QAAQ,QAAQ,QAAQ;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,SAAS;AAAA,YACP,GAAG,MAAM;AAAA,YACT,iBAAiB,QAAQ;AAAA,UAC3B;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,KAAK,mBAAmB;AACtB,YAAM,WAAW,MAAM,SAAS,OAAO,SAAS,QAAQ,SAAS;AACjE,UAAI,CAAC,UAAU;AACb,eAAO,kBAAkB,OAAO;AAAA,UAC9B,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAEA,YAAM,WAAW;AAAA,QACf,GAAG,MAAM,SAAS,OAAO;AAAA,QACzB,CAAC,QAAQ,SAAS,GAAG;AAAA,UACnB,GAAG;AAAA,UACH,QAAS,SAAS,OAAO,SAAS,aAAa,aAAa;AAAA,UAC5D,YAAY;AAAA,YACV,YAAY,QAAQ;AAAA,YACpB,YACE,QAAQ,cACR,SAAS,aACT,SAAS,YACT,SAAS,UAAU,CAAC,GAAG,YACvB;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,MAAM;AAAA,YACT,WAAW,QAAQ;AAAA,YACnB,QAAQ;AAAA,cACN,GAAG,MAAM,SAAS;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS;AAAA,YACP,iBAAiB;AAAA,cACf,WAAW,QAAQ;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,iBAAiB,MAAM,SAAS,OAAO,SAAS,QAAQ,SAAS;AACvE,UAAI,CAAC,kBAAkB,eAAe,WAAW,YAAY;AAC3D,eAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,MAC/E;AACA,YAAM,mBAAmB;AAAA,QACvB,GAAG,MAAM,SAAS,OAAO;AAAA,QACzB,CAAC,QAAQ,SAAS,GAAG;AAAA,UACnB,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY;AAAA,QACd;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,MAAM;AAAA,YACT,WAAW,QAAQ;AAAA,YACnB,QAAQ,EAAE,GAAG,MAAM,SAAS,QAAQ,UAAU,iBAAiB;AAAA,UACjE;AAAA,UACA,SAAS,EAAE,GAAG,MAAM,SAAS,iBAAiB,QAAQ,UAAU;AAAA,QAClE;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS,EAAE,iBAAiB,EAAE,WAAW,QAAQ,UAAU,EAAE;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,qBAAqB;AACxB,YAAM,iBAAiB,MAAM,SAAS,OAAO,SAAS,QAAQ,SAAS;AACvE,UAAI,CAAC,gBAAgB;AACnB,eAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,MAC/E;AAEA,UAAI,eAAe,WAAW,cAAc,eAAe,WAAW,YAAY;AAChF,eAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,MAC/E;AACA,YAAM,UAAU,GAAG,QAAQ,SAAS,WAAW,eAAe,SAAS,UAAU,KAAK,CAAC;AACvF,YAAM,WAAW;AAAA,QACf;AAAA,QACA,UAAU,QAAQ,YAAY,eAAe,aAAa;AAAA,QAC1D,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,MACrB;AACA,YAAM,gBAAgB;AAAA,QACpB,GAAG;AAAA,QACH,SAAS,CAAC,GAAI,eAAe,WAAW,CAAC,GAAI,QAAQ;AAAA,MACvD;AACA,YAAM,gBAAgB;AAAA,QACpB,GAAG,MAAM,SAAS,OAAO;AAAA,QACzB,CAAC,QAAQ,SAAS,GAAG;AAAA,MACvB;AACA,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,MAAM;AAAA,YACT,WAAW,QAAQ;AAAA,YACnB,QAAQ,EAAE,GAAG,MAAM,SAAS,QAAQ,UAAU,cAAc;AAAA,UAC9D;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS,EAAE,mBAAmB,EAAE,WAAW,QAAQ,UAAU,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,qBAAqB;AACxB,YAAM,eAAe,MAAM,SAAS,OAAO,SAAS,QAAQ,SAAS;AACrE,UAAI,CAAC,gBAAgB,CAAC,aAAa,SAAS,QAAQ;AAClD,eAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,MAC/E;AACA,YAAM,gBAAgB,CAAC,GAAG,aAAa,OAAO;AAC9C,oBAAc,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,GAAG,MAAM,QAAQ,KAAK;AAC7D,YAAM,eAAe;AAAA,QACnB,GAAG;AAAA,QACH,MAAM,QAAQ;AAAA,QACd,SAAS;AAAA,MACX;AACA,YAAM,iBAAiB;AAAA,QACrB,GAAG,MAAM,SAAS,OAAO;AAAA,QACzB,CAAC,QAAQ,SAAS,GAAG;AAAA,MACvB;AACA,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,MAAM;AAAA,YACT,WAAW,QAAQ;AAAA,YACnB,QAAQ,EAAE,GAAG,MAAM,SAAS,QAAQ,UAAU,eAAe;AAAA,UAC/D;AAAA,QACF;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS,EAAE,mBAAmB,EAAE,WAAW,QAAQ,UAAU,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,4BAA4B,QAAQ,UAAU,QAAQ,MAAM;AAAA,QAC5D,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,4BAA4B,QAAQ,UAAU,QAAQ,MAAM;AAAA,QAC5D,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,QACrD;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,QACrD;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,EACJ;AACF;AAEO,SAAS,eACd,WACA,SACmB;AACnB,QAAM,cAAc,UAAU,UAAU,aAAa,OAAO;AAE5D,MAAI,YAAY,SAAS,SAAS;AAChC,WAAO;AAAA,MACL,QAAQ,YAAY,MAAM;AAAA,MAC1B,MAAM,YAAY,MAAM;AAAA,MACxB,aAAa,YAAY,MAAM,SAAS,YAAY,MAAM;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,QAAQ;AAC/B,WAAO;AAAA,MACL,QAAQ,YAAY;AAAA,MACpB,MAAM,YAAY;AAAA,MAClB,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,UAAU;AAAA,IAClB,MAAM,UAAU;AAAA,IAChB,aAAa,UAAU,WAAW,UAAU;AAAA,IAC5C;AAAA,EACF;AACF;AAEO,SAAS,iBACd,MACA,OACS;AACT,SACE,KAAK,WAAW,MAAM,UACtB,KAAK,SAAS,MAAM,QACpB,KAAK,gBAAgB,MAAM,eAC3B,CAAC,gBAAgB,KAAK,aAAa,MAAM,WAAW;AAExD;AAEA,SAAS,kBACP,WACA,SAMmB;AACnB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ,WAAW,mBAAmB;AAAA,IAC/C,iBAAiB,QAAQ;AAAA,IACzB,WAAW,QAAQ;AAAA,IACnB,SAAS;AAAA,MACP,eAAe,QAAQ,SAAS,iBAAiB,CAAC;AAAA,MAClD,iBAAiB,QAAQ,SAAS,mBAAmB,CAAC;AAAA,MACtD,cAAc,QAAQ,SAAS;AAAA,MAC/B,iBAAiB,QAAQ,SAAS;AAAA,MAClC,gBAAgB,QAAQ,SAAS;AAAA,MACjC,gBAAgB,QAAQ,SAAS;AAAA,MACjC,kBAAkB,QAAQ,SAAS;AAAA,MACnC,gBAAgB,QAAQ,SAAS;AAAA,IACnC;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,WAAiD;AAC3E,QAAM,cAAc;AAAA,IAClB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAEA,MAAI,YAAY,SAAS,SAAS;AAChC,WAAO;AAAA,MACL,QAAQ,YAAY,MAAM;AAAA,MAC1B,MAAM,YAAY,MAAM;AAAA,MACxB,aAAa,YAAY,MAAM,SAAS,YAAY,MAAM;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,QAAQ;AAC/B,WAAO;AAAA,MACL,QAAQ,YAAY;AAAA,MACpB,MAAM,YAAY;AAAA,MAClB,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,YAAY,eAAe;AAAA,IACnC,MAAM,YAAY,eAAe;AAAA,IACjC,aAAa,YAAY,eAAe,SAAS,YAAY,eAAe;AAAA,IAC5E;AAAA,EACF;AACF;AAEA,SAAS,yBACP,OACA,QACA,MACwB;AACxB,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO,kBAAkB,QAAQ,MAAM,sBAAsB;AAAA,EAC/D;AAEA,QAAM,SAAS;AACf,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,SAAS;AACZ,YAAM,QAAQ,uBAAuB,OAAO,KAAK;AACjD,YAAM,gBAAgB,OAAO;AAC7B,UACE,iBACA,OAAO,kBAAkB,YACzB,OAAQ,cAAqC,SAAS,YACtD,OAAQ,cAAmC,OAAO,UAClD;AACA,eAAO;AAAA,UACJ,cAAmC;AAAA,UACnC,cAAiC;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,UAAU;AACpE,eAAO,kBAAkB,OAAO,MAAM,OAAO,IAAI,KAAK;AAAA,MACxD;AAEA,aAAO,kBAAkB,QAAQ,MAAM,KAAK;AAAA,IAC9C;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK;AAAA,QAC5C,eAAe,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF,KAAK,YAAY;AACf,YAAM,iBAAiB,OAAO;AAC9B,UACE,kBACA,OAAO,mBAAmB,YAC1B,OAAQ,eAAsC,SAAS,YACvD,OAAQ,eAAoC,OAAO,UACnD;AACA,eAAO;AAAA,UACL;AAAA,YACE,MAAO,eAAoC;AAAA,YAC3C,IAAK,eAAkC;AAAA,UACzC;AAAA,UACA,wBAAwB,OAAO,MAAM;AAAA,QACvC;AAAA,MACF;AAEA,aAAO,qBAAqB,EAAE,MAAM,QAAQ,IAAI,KAAK,GAAG,wBAAwB,OAAO,MAAM,CAAC;AAAA,IAChG;AAAA,IACA;AACE,aAAO,kBAAkB,QAAQ,MAAM,sBAAsB;AAAA,EACjE;AACF;AAEA,SAAS,uBAAuB,OAA+B;AAC7D,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,SAAS;AACf,WAAO;AAAA,MACL,OAAO,eAAe,OAAO,KAAK;AAAA,MAClC,KAAK,eAAe,OAAO,GAAG;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAwB;AAC9C,SAAO,UAAU,KAAK,KAAK;AAC7B;AAEA,SAAS,wBACP,OACgE;AAChE,MACE,UAAU,aACV,UAAU,kCACV,UAAU,mBACV;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBACP,OACA,WACA,OAQmB;AACnB,MAAI,MAAM,UAAU;AAClB,WAAO,kBAAkB,OAAO;AAAA,MAC9B,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM,MAAM,UAAU,MAAM,SAAS;AACpD,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,UAAU,YAAY;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,UAAU,YAAY;AAAA,MACtB,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,iBAAiB,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AAAA,MACE,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,SAAS,YAAY;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,mBACP,OACA,SACA,WACmB;AACnB,MAAI,MAAM,UAAU;AAClB,WAAO,kBAAkB,OAAO;AAAA,MAC9B,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,4BAA4B;AAAA,IACzC,OAAO;AAAA,MACL,UAAU,MAAM;AAAA,MAChB,OAAO,6BAA6B,KAAK;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,oBAAoB,OAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,SAAS;AAEtF,MAAI,CAAC,mBAAmB;AACtB,WAAO,kBAAkB,OAAO;AAAA,MAC9B,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,MAAI,YAAY,MAAM;AACtB,MAAI,WAAW,OAAO,SAAS,OAAO;AACtC,MAAI,WAAW,MAAM;AACrB,MAAI,kBAAkB,MAAM,QAAQ;AACpC,QAAM,eAA8B,CAAC;AAErC,aAAW,SAAS,OAAO,UAAU;AACnC,QAAI,MAAM,UAAU,GAAG;AACrB;AAAA,IACF;AAEA,gBAAY,eAAe,WAAW,MAAM,OAAO;AACnD,iBAAa,KAAK,GAAG,MAAM,QAAQ,KAAK;AAExC,UAAM,mBAAmB,oBAAoB;AAAA,MAC3C;AAAA,MACA,SAAS,MAAM;AAAA,MACf,aAAa,OAAO,SAAS;AAAA,MAC7B,kBAAkB,0BAA0B,UAAU,MAAM,OAAO;AAAA,IACrE,CAAC;AACD,eAAW,iBAAiB;AAC5B,eAAW,iBAAiB;AAC5B,sBACE,mBAAmB,SAAS,eAAe,IACvC,kBACA;AAAA,EACR;AAEA,aAAW,8BAA8B,OAAO,OAAO,QAAQ;AAE/D,QAAM,eAAe;AAAA,IACnB,GAAG,OAAO;AAAA,IACV,QAAQ;AAAA,MACN,GAAG,OAAO,SAAS;AAAA,MACnB;AAAA,MACA,WAAW,wBAAwB,OAAO,KAAK;AAAA,IACjD;AAAA,EACF;AACA,QAAM,qBAAqB,OAAO,QAAQ;AAE1C,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,SAAS,oBAAoB,YAAY;AAAA,MACzC,SAAS;AAAA,QACP,GAAG,oBAAoB,MAAM,UAAU,QAAQ;AAAA,QAC/C,gBACE,QAAQ,SAAS,4BAA4B,mBAAmB,CAAC,IAC7D;AAAA,UACE,UAAU,mBAAmB,CAAC;AAAA,QAChC,IACA;AAAA,QACN,gBACE,QAAQ,SAAS,4BAA4B,mBAAmB,CAAC,IAC7D;AAAA,UACE,UAAU,mBAAmB,CAAC;AAAA,QAChC,IACA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mCACP,OACA,cACA,SAMA;AACA,QAAM,iBAAiB,0BAA0B,MAAM,UAAU,OAAO;AACxE,QAAM,mBAAmB,oBAAoB;AAAA,IAC3C,UAAU,aAAa,OAAO;AAAA,IAC9B;AAAA,IACA,aAAa,aAAa;AAAA,IAC1B,kBAAkB;AAAA,EACpB,CAAC;AACD,QAAM,YAAY,OAAO;AAAA,IACvB,OAAO,QAAQ,aAAa,OAAO,SAAS,EAAE,IAAI,CAAC,CAAC,UAAU,QAAQ,MAAM;AAAA,MAC1E;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,QAAQ,UAAU,SAAS,QAAQ,OAAO;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,kBACJ,MAAM,QAAQ,mBACd,iBAAiB,SAAS,MAAM,QAAQ,eAAe,IACnD,MAAM,QAAQ,kBACd;AACN,QAAM,WAAW,iBAAiB;AAElC,SAAO;AAAA,IACL,UAAU;AAAA,MACR,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,GAAG,aAAa;AAAA,QAChB,UAAU,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,oBAAoB,MAAM,UAAU,QAAQ;AAAA,EACvD;AACF;AAEA,SAAS,6BACP,OACe;AACf,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW,OAAO;AAAA,MAChB,OAAO,OAAO,MAAM,SAAS,OAAO,SAAS,EAAE,IAAI,CAAC,aAAa;AAAA,QAC/D,SAAS;AAAA,QACT;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,MAAM,SAAS;AAAA,UACf,QAAQ,SAAS;AAAA,UACjB,UAAU,SAAS,YAAY;AAAA,UAC/B,WAAW,SAAS;AAAA,UACpB,QAAQ,SAAS,WAAW,SAAS,WAAW,SAAS;AAAA,UACzD,YAAY,CAAC,GAAI,SAAS,cAAc,CAAC,CAAE;AAAA,UAC3C,UAAU;AAAA,YACR,QAAQ,SAAS,UAAU,UAAU;AAAA,YACrC,aAAa,SAAS,UAAU;AAAA,YAChC,oBAAoB,SAAS,UAAU;AAAA,YACvC,sBAAsB,SAAS,UAAU;AAAA,YACzC,sBAAsB,SAAS,UAAU;AAAA,YACzC,iBAAiB,SAAS,UAAU;AAAA,UACtC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACgD;AAChD,SAAO,OAAO;AAAA,IACZ,OAAO,OAAO,MAAM,SAAS,EAAE,IAAI,CAAC,aAAa;AAAA,MAC/C,SAAS;AAAA,MACT;AAAA,QACE,UAAU,SAAS;AAAA,QACnB,MAAM,SAAS;AAAA,QACf,QAAQ,SAAS;AAAA,QACjB,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,QACpB,YAAY,CAAC,GAAG,SAAS,UAAU;AAAA,QACnC,UAAU;AAAA,UACR,QAAQ,SAAS,SAAS;AAAA,UAC1B,aAAa,SAAS,SAAS;AAAA,UAC/B,oBAAoB,SAAS,SAAS;AAAA,UACtC,sBAAsB,SAAS,SAAS;AAAA,UACxC,sBAAsB,SAAS,SAAS;AAAA,UACxC,iBAAiB,SAAS,SAAS;AAAA,QACrC;AAAA,QACA,QAAQ,SAAS,WAAW,WAAW,SAAS,SAAS;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,0BACP,UACA,SACiB;AACjB,SAAO,SAAS;AAAA,IAAI,CAAC,YACnB,QAAQ,iBACJ;AAAA,MACE,GAAG;AAAA,MACH,gBAAgB,UAAU,QAAQ,gBAAgB,OAAO;AAAA,IAC3D,IACA;AAAA,EACN;AACF;AAEA,SAAS,oBACP,kBACA,cAC+D;AAC/D,QAAM,eAAe,IAAI,IAAI,iBAAiB,IAAI,CAAC,YAAY,QAAQ,SAAS,CAAC;AACjF,QAAM,WAAW,IAAI,IAAI,aAAa,IAAI,CAAC,YAAY,QAAQ,SAAS,CAAC;AAEzE,SAAO;AAAA,IACL,eAAe,aAAa,OAAO,CAAC,YAAY,CAAC,aAAa,IAAI,QAAQ,SAAS,CAAC;AAAA,IACpF,iBAAiB,iBACd,OAAO,CAAC,YAAY,CAAC,SAAS,IAAI,QAAQ,SAAS,CAAC,EACpD,IAAI,CAAC,aAAa;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,MAAM,QAAQ;AAAA,IAChB,EAAE;AAAA,EACN;AACF;AAEA,SAAS,8BACP,OACA,kBACiB;AACjB,QAAM,mBAAmB,iBAAiB;AAAA,IACxC,CAAC,YACC,QAAQ,SAAS,8BACjB,CAAC,QAAQ,WACT,OAAO,QAAQ,QAAQ,aAAa,YACpC,MAAM,UAAU,QAAQ,QAAQ,QAAQ,GAAG,WAAW;AAAA,EAC1D;AAEA,QAAM,mBAAmB,IAAI;AAAA,IAC3B,iBACG,OAAO,CAAC,YAAY,QAAQ,SAAS,0BAA0B,EAC/D;AAAA,MAAI,CAAC,YACJ,OAAO,QAAQ,SAAS,aAAa,WACjC,QAAQ,QAAQ,WAChB;AAAA,IACN,EACC,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC;AAAA,EACtD;AAEA,QAAM,mBAAmB,OAAO,OAAO,MAAM,SAAS,EACnD;AAAA,IACC,CAAC,aACC,SAAS,WAAW,cAAc,CAAC,iBAAiB,IAAI,SAAS,UAAU;AAAA,EAC/E,EACC,IAAI,CAAC,cAAc;AAAA,IAClB,WAAW,oCAAoC,SAAS,UAAU;AAAA,IAClE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,YAAY,SAAS,UAAU;AAAA,IACxC,QAAQ;AAAA,IACR,gBAAgB,SAAS,OAAO,SAAS,aAAa,SAAS,SAAS;AAAA,IACxE,SAAS;AAAA,MACP,UAAU,SAAS;AAAA,MACnB,QACE,SAAS,OAAO,SAAS,aACrB,SAAS,OAAO,SAChB;AAAA,IACR;AAAA,EACF,EAAE;AAEJ,SAAO,CAAC,GAAG,kBAAkB,GAAG,gBAAgB;AAClD;AAEA,SAAS,oBACP,OACoB;AACpB,SAAO,MAAM,SAAS,IAClB;AAAA,IACE;AAAA,EACF,IACA,mBAAmB;AACzB;AAMA,IAAI,4BAA4B;AAEhC,SAAS,2BACP,UACA,WACQ;AACR,+BAA6B;AAC7B,QAAM,KAAK,UAAU,QAAQ,YAAY,EAAE;AAC3C,MAAI,KAAK,UAAU,EAAE,KAAK,yBAAyB;AACnD,SAAO,SAAS,EAAE,GAAG;AACnB,iCAA6B;AAC7B,SAAK,UAAU,EAAE,KAAK,yBAAyB;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,uBACP,UACA,MACA,MACA,IACA,UACA,WACyB;AACzB,QAAM,WAAW,2BAA2B,UAAU,SAAS;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,GAAG;AAAA,MAClB,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY,CAAC;AAAA,IACb,UAAU;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,uCACP,OACA,SACmB;AACnB,SAAO,kBAAkB,OAAO;AAAA,IAC9B,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,SAAS;AAAA,MACP,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iCACP,UACA,MACA,IACS;AACT,QAAM,SAAgD,CAAC;AACvD,MAAI,SAAS;AACb,MAAI,uBAAuB;AAE3B,aAAW,SAAS,SAAS,QAAQ,UAAU;AAC7C,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,sBAAsB;AACxB,kBAAU;AAAA,MACZ;AACA,YAAM,QAAQ;AACd,gBAAU,MAAM,SAAS,OAAe,CAAC,MAAM,UAAU;AACvD,YAAI,MAAM,SAAS,QAAQ;AACzB,iBAAO,OAAO,MAAM,KAAK;AAAA,QAC3B;AACA,YAAI,MAAM,SAAS,aAAa;AAC9B,iBAAO,OAAO,MAAM,SAAS,OAAe,CAAC,WAAW,UAAU;AAChE,gBAAI,MAAM,SAAS,QAAQ;AACzB,qBAAO,YAAY,MAAM,KAAK;AAAA,YAChC;AACA,mBAAO,YAAY;AAAA,UACrB,GAAG,CAAC;AAAA,QACN;AACA,eAAO,OAAO;AAAA,MAChB,GAAG,CAAC;AACJ,aAAO,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;AAClC,6BAAuB;AACvB;AAAA,IACF;AAEA,cAAU;AACV,2BAAuB;AAAA,EACzB;AAEA,SAAO,OAAO,KAAK,CAAC,UAAU,QAAQ,MAAM,SAAS,MAAM,MAAM,GAAG;AACtE;AAEA,SAAS,sBACP,OACA,MACA,SAC+B;AAC/B,MAAI,MAAM,UAAU;AAClB,WAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,EAC/E;AAEA,QAAM,WAAW,QAAQ,mBAAmB;AAC5C,QAAM,YAAY,MAAM;AACxB,QAAM,OAAO,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AACtD,QAAM,KAAK,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AACpD,QAAM,cAAc,SAAS;AAE7B,MAAI,CAAC,eAAe,CAAC,iCAAiC,MAAM,UAAU,MAAM,EAAE,GAAG;AAC/E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa;AAEf,UAAMK,UAAS,WAAW,MAAM,UAAU,WAAW,MAAM,EAAE,WAAW,QAAQ,UAAU,CAAC;AAC3F,UAAMC,gBAAe;AACrB,UAAMC,cAAa,OAAO,MAAM,KAAK,IAAI,EAAE;AAG3C,UAAMC,eAAc;AAAA,MAClB;AAAA,MACAH,QAAO;AAAA,MACPA,QAAO;AAAA,IACT;AAMA,UAAM,oBAAoB;AAAA,MACxBG,aAAY,SAAS,OAAO;AAAA,MAC5BF;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,kBAAkB,OAAO,SAAS,SAAS;AAClE,YAAM,WAAoC;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,kBAAkB,OAAO,MAAM,MAAM,IAAIC,YAAW;AAAA,UACnE,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG;AAAA,QAC7B;AAAA,MACF;AACA,wBAAkB,SAAS;AAC3B,uBAAiB;AAAA,QACf,GAAGC,aAAY,SAAS,OAAO;AAAA,QAC/B,CAAC,SAAS,QAAQ,GAAG;AAAA,MACvB;AAAA,IACF,OAAO;AACL,YAAM,WAAW;AAAA,QACfA,aAAY,SAAS,OAAO;AAAA,QAC5B;AAAA,QACAF;AAAA,QACAC;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AACA,wBAAkB,SAAS;AAC3B,uBAAiB;AAAA,QACf,GAAGC,aAAY,SAAS,OAAO;AAAA,QAC/B,CAAC,SAAS,QAAQ,GAAG;AAAA,MACvB;AAAA,IACF;AAEA,UAAMC,iBAA2C;AAAA,MAC/C,GAAGD,aAAY;AAAA,MACf,QAAQ;AAAA,QACN,GAAGA,aAAY,SAAS;AAAA,QACxB,WAAW;AAAA,MACb;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,UAAUC;AAAA,QACV,WAAWJ,QAAO;AAAA,QAClB,UAAUG,aAAY;AAAA,QACtB,SAAS;AAAA,UACP,GAAG,MAAM;AAAA,UACT,iBAAiBA,aAAY;AAAA,QAC/B;AAAA,MACF;AAAA,MACA;AAAA,QACE,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,SAASH,QAAO;AAAA,QAChB,SAAS;AAAA,UACP,GAAGG,aAAY;AAAA,UACf,kBAAkB,EAAE,UAAU,iBAAiB,MAAM,YAAY;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,QAAM,kBAAkB,wBAAwB,IAAI,EAAE;AACtD,QAAM,SAAS,WAAW,MAAM,UAAU,iBAAiB,MAAM,EAAE,WAAW,QAAQ,UAAU,CAAC;AACjG,QAAM,eAAe;AACrB,QAAM,aAAa,KAAK,MAAM,KAAK,IAAI,EAAE;AAGzC,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAIA,QAAM,mBAAmB;AAAA,IACvB,YAAY,SAAS,OAAO;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAGA,QAAM,oBAAoB;AAAA,IACxB;AAAA,MACE,GAAG,YAAY,SAAS,OAAO;AAAA,MAC/B,CAAC,iBAAiB,QAAQ,GAAG;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,QAAM,gBAA2C;AAAA,IAC/C,GAAG,YAAY;AAAA,IACf,QAAQ;AAAA,MACN,GAAG,YAAY,SAAS;AAAA,MACxB,WAAW;AAAA,QACT,GAAG,YAAY,SAAS,OAAO;AAAA,QAC/B,CAAC,iBAAiB,QAAQ,GAAG;AAAA,QAC7B,CAAC,kBAAkB,QAAQ,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW;AAEjB,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW,wBAAwB,UAAU,QAAQ;AAAA,MACrD,UAAU,YAAY;AAAA,MACtB,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,iBAAiB,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AAAA,MACE,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,SAAS;AAAA,QACP,GAAG,YAAY;AAAA,QACf,kBAAkB,EAAE,UAAU,kBAAkB,UAAU,MAAM,YAAY;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OACA,WACA,SAC+B;AAC/B,MAAI,MAAM,UAAU;AAClB,WAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,EAC/E;AAEA,QAAM,WAAW,QAAQ,mBAAmB;AAC5C,QAAM,YAAY,MAAM;AACxB,QAAM,OAAO,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AACtD,QAAM,KAAK,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AACpD,QAAM,cAAc,SAAS;AAE7B,MAAI,CAAC,eAAe,CAAC,iCAAiC,MAAM,UAAU,MAAM,EAAE,GAAG;AAC/E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,aAAa;AACf,QAAI,cAAc,YAAY;AAC5B,mBAAa,KAAK,IAAI,GAAG,OAAO,CAAC;AACjC,iBAAW;AAAA,IACb,OAAO;AACL,mBAAa;AACb,iBAAW,OAAO;AAAA,IACpB;AAAA,EACF,OAAO;AACL,iBAAa;AACb,eAAW;AAAA,EACb;AAGA,MAAI,eAAe,UAAU;AAC3B,WAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,EAC/E;AAIA,QAAM,mBAAmB;AAAA,IACvB,MAAM,SAAS,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,kBAAkB;AAEpB,UAAM,eAAe,KAAK;AAAA,MACxB,iBAAiB,OAAO,SAAS,UAAU,iBAAiB,OAAO,MAAM,OAAO;AAAA,MAChF;AAAA,IACF;AACA,UAAM,aAAa,KAAK;AAAA,MACtB,iBAAiB,OAAO,SAAS,UAAU,iBAAiB,OAAO,MAAM,KAAK;AAAA,MAC9E;AAAA,IACF;AAEA,UAAM,kBAA2C;AAAA,MAC/C,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,cAAc,IAAI,WAAW;AAAA,QAC5C,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG;AAAA,MAC7B;AAAA,IACF;AAEA,UAAME,gBAA0C;AAAA,MAC9C,GAAG,MAAM;AAAA,MACT,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,QACN,GAAG,MAAM,SAAS;AAAA,QAClB,WAAW;AAAA,UACT,GAAG,MAAM,SAAS,OAAO;AAAA,UACzB,CAAC,gBAAgB,QAAQ,GAAG;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,UAAMC,YAAW,cAAc,aAAa,aAAa;AAEzD,WAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,UAAUD;AAAA,QACV,WAAW,wBAAwBC,WAAUA,SAAQ;AAAA,MACvD;AAAA,MACA;AAAA,QACE,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,SAAS;AAAA,UACP,kBAAkB,EAAE,UAAU,gBAAgB,UAAU,MAAM,WAAW;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW;AAAA,IACf,MAAM,SAAS,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,QAAM,eAA0C;AAAA,IAC9C,GAAG,MAAM;AAAA,IACT,WAAW,QAAQ;AAAA,IACnB,QAAQ;AAAA,MACN,GAAG,MAAM,SAAS;AAAA,MAClB,WAAW;AAAA,QACT,GAAG,MAAM,SAAS,OAAO;AAAA,QACzB,CAAC,SAAS,QAAQ,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,aAAa,aAAa;AAEzD,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW,wBAAwB,UAAU,QAAQ;AAAA,IACvD;AAAA,IACA;AAAA,MACE,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,SAAS;AAAA,QACP,kBAAkB,EAAE,UAAU,SAAS,UAAU,MAAM,WAAW;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,UACA,SAC+B;AAC/B,MAAI,MAAM,UAAU;AAClB,WAAO,kBAAkB,OAAO,EAAE,iBAAiB,QAAQ,WAAW,MAAM,CAAC;AAAA,EAC/E;AAEA,QAAM,WAAW,QAAQ,mBAAmB;AAC5C,QAAM,YAAY,MAAM;AACxB,QAAM,OAAO,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AACtD,QAAM,KAAK,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AAEpD,MAAI,SAAS,MAAM,CAAC,iCAAiC,MAAM,UAAU,MAAM,EAAE,GAAG;AAC9E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY;AAClB,QAAM,kBAAkB,wBAAwB,WAAW,SAAS;AACpE,QAAM,UAAU,aAAa,QAAQ,YAAY;AACjD,QAAM,SAAS,QAAQ,MAAM,UAAU,iBAAiB,EAAE,WAAW,QAAQ,UAAU,CAAC;AAGxF,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAGA,QAAM,mBAAmB,SAAS,KAC9B;AAAA,IACE,YAAY,SAAS,OAAO;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IACA;AAGJ,QAAM,oBAAoB;AAAA,IACxB;AAAA,MACE,GAAG,YAAY,SAAS,OAAO;AAAA,MAC/B,GAAI,mBAAmB,EAAE,CAAC,iBAAiB,QAAQ,GAAG,iBAAiB,IAAI,CAAC;AAAA,IAC9E;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,QAAM,gBAA2C;AAAA,IAC/C,GAAG,YAAY;AAAA,IACf,QAAQ;AAAA,MACN,GAAG,YAAY,SAAS;AAAA,MACxB,WAAW;AAAA,QACT,GAAG,YAAY,SAAS,OAAO;AAAA,QAC/B,GAAI,mBAAmB,EAAE,CAAC,iBAAiB,QAAQ,GAAG,iBAAiB,IAAI,CAAC;AAAA,QAC5E,CAAC,kBAAkB,QAAQ,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW,OAAO;AAAA,MAClB,UAAU,YAAY;AAAA,MACtB,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,iBAAiB,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AAAA,MACE,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,SAAS;AAAA,QACP,GAAG,YAAY;AAAA,QACf,kBAAkB,EAAE,UAAU,kBAAkB,UAAU,MAAM,YAAY;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gCACP,WACA,MACA,IACqC;AACrC,aAAW,YAAY,OAAO,OAAO,SAAS,GAAG;AAC/C,QACE,SAAS,SAAS,cAClB,SAAS,WAAW,UACpB,SAAS,UAAU,WAAW,aAC9B,SAAS,OAAO,SAAS,SACzB;AACA,YAAM,UAAU,SAAS,OAAO,MAAM;AACtC,YAAM,QAAQ,SAAS,OAAO,MAAM;AAEpC,UACG,QAAQ,WAAW,QAAQ,SAC3B,MAAM,WAAW,MAAM,SACvB,SAAS,SACT,OAAO,SACR;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,8BACP,WACA,UACqC;AACrC,aAAW,YAAY,OAAO,OAAO,SAAS,GAAG;AAC/C,QACE,SAAS,SAAS,eAClB,SAAS,WAAW,UACpB,SAAS,UAAU,WAAW,aAC9B,SAAS,OAAO,SAAS,WACzB,SAAS,OAAO,MAAM,OAAO,UAC7B;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;ACtgDA,IAAM,uBACJ;AAEF,IAAM,qBAAqB,oBAAI,IAAY,CAAC,OAAO,WAAW,WAAW,KAAK,CAAC;AAMxE,SAAS,yBAAyB,aAIvC;AACA,QAAM,UAAU,YAAY,KAAK;AACjC,QAAM,QAAQ,qBAAqB,KAAK,OAAO;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,QAAQ,WAAW,WAAW,MAAM;AAAA,EAC/C;AAEA,QAAM,SAAS,MAAM,CAAC,EAAE,YAAY;AACpC,QAAM,YAAY,mBAAmB,IAAI,MAAM;AAE/C,MAAI;AACJ,MAAI,WAAW,SAAS,WAAW,aAAa,WAAW,WAAW;AACpE,UAAM,cAAc,qDAAqD,KAAK,OAAO;AACrF,cAAU,cAAc,CAAC,KAAK,cAAc,CAAC,IAAI,KAAK;AAAA,EACxD;AAEA,SAAO,EAAE,QAAQ,WAAW,OAAO;AACrC;AAKO,SAAS,uBAAuB,QAAqD;AAC1F,SAAO,mBAAmB,IAAI,MAAM;AACtC;AAWO,SAAS,mBACd,UAGe;AACf,QAAM,OAAO,SAAS;AACtB,QAAM,YAAkC,CAAC;AACzC,QAAM,eAAqC,CAAC;AAC5C,MAAI,aAAa;AACjB,MAAI,iBAAiB;AACrB,MAAI;AAEJ,oBAAkB,MAAM,CAAC,MAAM,SAAS;AACtC,qBAAiB;AACjB,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,iBAAiB,KAAK,cACxB,EAAE,QAAQ,KAAK,aAAa,WAAW,uBAAuB,KAAK,WAAW,GAAG,QAAQ,KAAK,YAAY,IAC1G,yBAAyB,KAAK,WAAW;AAC7C,YAAM,cAAc,iBAAiB,KAAK,QAAQ;AAClD,YAAM,QAA4B;AAAA,QAChC;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B,WAAW,eAAe;AAAA,QAC1B,aAAa,KAAK;AAAA,QAClB,GAAI,eAAe,SAAS,EAAE,aAAa,eAAe,OAAO,IAAI,CAAC;AAAA,QACtE;AAAA,QACA;AAAA,QACA,eAAe,KAAK,kBAAkB,eAAe,YAAY,UAAU;AAAA,MAC7E;AACA,UAAI,eAAe,WAAW;AAC5B,kBAAU,KAAK,KAAK;AACpB,YAAI,eAAe,WAAW,SAAS,CAAC,gBAAgB;AACtD,2BAAiB,KAAK;AAAA,QACxB;AAAA,MACF,OAAO;AACL,qBAAa,KAAK,KAAK;AAAA,MACzB;AACA,oBAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,SAAS,UAAU;AACrB,sBAAkB,SAAS,UAAU,CAAC,MAAM,SAAS;AACnD,uBAAiB;AACjB,UAAI,KAAK,SAAS,SAAS;AACzB,cAAM,iBAAiB,KAAK,cACxB,EAAE,QAAQ,KAAK,aAAa,WAAW,uBAAuB,KAAK,WAAW,GAAG,QAAQ,KAAK,YAAY,IAC1G,yBAAyB,KAAK,WAAW;AAC7C,cAAM,cAAc,iBAAiB,KAAK,QAAQ;AAClD,cAAM,QAA4B;AAAA,UAChC;AAAA,UACA,aAAa,eAAe;AAAA,UAC5B,WAAW,eAAe;AAAA,UAC1B,aAAa,KAAK;AAAA,UAClB,GAAI,eAAe,SAAS,EAAE,aAAa,eAAe,OAAO,IAAI,CAAC;AAAA,UACtE;AAAA,UACA;AAAA,UACA,eAAe,KAAK,kBAAkB,eAAe,YAAY,UAAU;AAAA,QAC7E;AACA,YAAI,eAAe,WAAW;AAC5B,oBAAU,KAAK,KAAK;AAAA,QACtB,OAAO;AACL,uBAAa,KAAK,KAAK;AAAA,QACzB;AACA,sBAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,iBACjB,kBAAkB,UAAU,cAAc,IAC1C;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,EACzC;AACF;AAOO,SAAS,mBAAmB,aAAmD;AACpF,QAAM,QAAQ,sBAAsB,KAAK,WAAW;AACpD,MAAI,OAAO;AACT,WAAO,EAAE,MAAM,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,EAAE;AAAA,EAClF;AACA,SAAO,EAAE,MAAM,GAAG,IAAI,EAAE;AAC1B;AAOO,SAAS,kBACd,UACA,aACc;AACd,QAAM,aAAa,mBAAmB,WAAW;AACjD,QAAM,UAAsB,CAAC;AAC7B,MAAI,iBAAiB;AAErB,oBAAkB,SAAS,SAAS,CAAC,MAAM,SAAS;AAClD,qBAAiB;AACjB,QAAI,KAAK,SAAS,YAAa;AAC/B,UAAM,YAAY;AAGlB,QAAI,QAA4B,UAAU;AAC1C,QAAI,UAAU,UAAa,UAAU,SAAS;AAC5C,YAAM,QAAQ,SAAS,OAAO,WAAW,UAAU,OAAO;AAC1D,UAAI,OAAO,iBAAiB,QAAW;AACrC,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,UAAU,OAAW;AAEzB,UAAM,WAAW,QAAQ;AACzB,QAAI,WAAW,WAAW,QAAQ,WAAW,WAAW,GAAI;AAE5D,UAAM,OAAO,2BAA2B,UAAU,QAAQ;AAC1D,QAAI,KAAK,KAAK,EAAE,WAAW,EAAG;AAG9B,QAAI;AACJ,eAAW,SAAS,UAAU,UAAU;AACtC,UAAI,MAAM,SAAS,oBAAoB,MAAM,MAAM;AACjD,uBAAe,MAAM;AACrB;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,MAAM,KAAK,KAAK;AAAA,MAChB,OAAO;AAAA,MACP;AAAA,MACA,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC1D,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACzC,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AASO,SAAS,oBACd,UACA,iBACA,aACyE;AACzE,QAAM,WAAW,gBAAgB,IAAI,WAAW;AAChD,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,MAAM,IAAI,eAAe,eAAe;AAAA,EACnD;AAGA,MAAI,iBAAiB;AACrB,MAAI;AAEJ,oBAAkB,SAAS,SAAS,CAAC,MAAM,SAAS;AAClD,QAAI,KAAK,SAAS,YAAa;AAC/B,qBAAiB;AACjB,QAAI,mBAAmB,SAAS,gBAAgB;AAC9C,qBAAe,uBAAuB,MAAuB,SAAS,UAAU;AAAA,IAClF;AAAA,EACF,CAAC;AAED,MAAI,iBAAiB,QAAW;AAC9B,WAAO,EAAE,MAAM,cAAc,eAAe,UAAU;AAAA,EACxD;AACA,SAAO,EAAE,MAAM,IAAI,eAAe,eAAe;AACnD;AAsCA,SAAS,kBACP,MACA,OACA,iBAAiB,IACT;AACR,MAAI,KAAK,SAAS,aAAa;AAC7B,sBAAkB;AAAA,EACpB;AACA,QAAM,MAAM,cAAc;AAE1B,MAAI,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD,eAAW,SAAS,KAAK,UAAU;AACjC,uBAAiB,kBAAkB,OAAuB,OAAO,cAAc;AAAA,IACjF;AAAA,EACF;AACA,MAAI,KAAK,SAAS,SAAS;AACzB,eAAW,OAAO,KAAK,MAAM;AAC3B,uBAAiB,kBAAkB,KAAK,OAAO,cAAc;AAAA,IAC/D;AAAA,EACF,WAAW,KAAK,SAAS,aAAa;AACpC,eAAW,QAAQ,KAAK,OAAO;AAC7B,uBAAiB,kBAAkB,MAAM,OAAO,cAAc;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,UACA,OACM;AACN,aAAW,UAAU,SAAS,SAAS;AACrC,eAAW,SAAS,OAAO,QAAQ;AACjC,wBAAkB,OAAO,KAAK;AAAA,IAChC;AAAA,EACF;AACA,aAAW,UAAU,SAAS,SAAS;AACrC,eAAW,SAAS,OAAO,QAAQ;AACjC,wBAAkB,OAAO,KAAK;AAAA,IAChC;AAAA,EACF;AACA,MAAI,SAAS,oBAAoB;AAC/B,eAAW,QAAQ,OAAO,OAAO,SAAS,mBAAmB,SAAS,GAAG;AACvE,iBAAW,SAAS,KAAK,QAAQ;AAC/B,0BAAkB,OAAO,KAAK;AAAA,MAChC;AAAA,IACF;AACA,eAAW,QAAQ,OAAO,OAAO,SAAS,mBAAmB,QAAQ,GAAG;AACtE,iBAAW,SAAS,KAAK,QAAQ;AAC/B,0BAAkB,OAAO,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,UAAgC;AACxD,SAAO,SACJ,IAAI,CAAC,UAAU;AACd,QAAI,MAAM,SAAS,OAAQ,QAAO,MAAM;AACxC,QAAI,MAAM,SAAS,MAAO,QAAO;AACjC,QAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,eAAgB,QAAO;AACzE,WAAO;AAAA,EACT,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,2BAA2B,UAAgC;AAClE,SAAO,SACJ,IAAI,CAAC,UAAU;AACd,QAAI,MAAM,SAAS,OAAQ,QAAO,MAAM;AACxC,QAAI,MAAM,SAAS,MAAO,QAAO;AACjC,QAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,eAAgB,QAAO;AACzE,QAAI,MAAM,SAAS,YAAa,QAAO,iBAAiB,MAAM,QAAQ;AACtE,QAAI,MAAM,SAAS,QAAS,QAAO,iBAAiB,MAAM,QAAQ;AAClE,WAAO;AAAA,EACT,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,uBACP,WACA,YACQ;AACR,MAAI,SAAS;AACb,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,UAAU,UAAU;AACtC,QAAI,MAAM,SAAS,oBAAoB,MAAM,eAAe,YAAY;AACtE,eAAS;AACT;AAAA,IACF;AACA,QAAI,MAAM,SAAS,kBAAkB,MAAM,eAAe,YAAY;AACpE;AAAA,IACF;AACA,QAAI,QAAQ;AACV,UAAI,MAAM,SAAS,OAAQ,OAAM,KAAK,MAAM,IAAI;AAAA,eACvC,MAAM,SAAS,MAAO,OAAM,KAAK,GAAI;AAAA,eACrC,MAAM,SAAS,aAAc,OAAM,KAAK,IAAI;AAAA,IACvD;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO,2BAA2B,UAAU,QAAQ;AAAA,EACtD;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;;;ACpXO,SAAS,qBACd,UAC6D;AAC7D,QAAM,OAAO,aAAa,WAAW,SAAS,UAAU;AACxD,QAAM,MAAM,oBAAI,IAA4D;AAC5E,MAAI,iBAAiB;AAErB,eAAa,MAAM,CAAC,SAAS;AAC3B,QAAI,KAAK,SAAS,aAAa;AAC7B,wBAAkB;AAAA,IACpB;AACA,QAAI,KAAK,SAAS,oBAAoB,KAAK,MAAM;AAC/C,UAAI,IAAI,KAAK,MAAM,EAAE,YAAY,KAAK,YAAY,eAAe,CAAC;AAAA,IACpE;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAqBA,SAAS,aAAa,MAAoB,OAA2C;AACnF,QAAM,IAAI;AAEV,MAAI,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD,eAAW,SAAS,KAAK,UAAU;AACjC,mBAAa,OAAO,KAAK;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,SAAS;AACzB,eAAW,OAAO,KAAK,MAAM;AAC3B,mBAAa,KAAK,KAAK;AAAA,IACzB;AAAA,EACF,WAAW,KAAK,SAAS,aAAa;AACpC,eAAW,QAAQ,KAAK,OAAO;AAC7B,mBAAa,MAAM,KAAK;AAAA,IAC1B;AAAA,EACF;AACF;;;ACtOO,SAAS,uBAAuB,QAA6C;AAClF,MAAI,OAAO,SAAS,SAAS;AAC3B,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,OAAO,eAAe,OAAO,KAAK;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,IAAI,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C;AACF;;;AC4BO,SAAS,mBACd,UAAyC,CAAC,GAC5B;AACd,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAkIO,SAAS,+BACd,OACA,iBAC0B;AAC1B,QAAM,UAAU,OAAO,OAAO,MAAM,OAAO,EACxC,IAAI,CAAC,WAAW,gBAAgB,QAAQ,eAAe,CAAC,EACxD,KAAK,qBAAqB;AAE7B,SAAO;AAAA,IACL,YAAY,QAAQ;AAAA,IACpB,gBAAgB,QACb,OAAO,CAAC,WAAW,OAAO,WAAW,MAAM,EAC3C,IAAI,CAAC,WAAW,OAAO,SAAS;AAAA,IACnC,oBAAoB,QACjB,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU,EAC/C,IAAI,CAAC,WAAW,OAAO,SAAS;AAAA,IACnC,oBAAoB,QACjB,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU,EAC/C,IAAI,CAAC,WAAW,OAAO,SAAS;AAAA,IACnC;AAAA,EACF;AACF;AAEA,SAAS,gBACP,QACA,iBACsB;AACtB,QAAM,aAAa,OAAO,QAAQ,CAAC;AACnC,QAAM,gBAAgB,uBAAuB,OAAO,MAAM;AAE1D,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,SAAS,aAAa,cAAc,WAAW,IAAI,IAAI;AAAA,IACvD,YAAY,OAAO,QAAQ;AAAA,IAC3B,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,cAAc,OAAO,WAAW;AAAA,IAChC,aACE,cAAc,UAAU,aACpB,YAAY,cAAc,MAAM,IAAI,IAAI,cAAc,MAAM,EAAE,KAC9D,SAAS,cAAc,MAAM,IAAI,IAAI,cAAc,MAAM,EAAE;AAAA,IACjE,UAAU,oBAAoB,OAAO;AAAA,IACrC,YAAY,OAAO,YAAY;AAAA,IAC/B,YAAY,OAAO,YAAY;AAAA,EACjC;AACF;AAoBA,SAAS,sBACP,MACA,OACQ;AACR,QAAM,cAAcC,mBAAkB,KAAK,MAAM,IAAIA,mBAAkB,MAAM,MAAM;AACnF,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,UAAU,cAAc,MAAM,SAAS;AACrD;AAEA,SAASA,mBAAkB,QAAqC;AAC9D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,YAAY,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACjD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,SAAS,KAAK,GAAG,UAAU,MAAM,GAAG,EAAE,CAAC,QAAQ;AAClE;;;AChUO,SAAS,sCACd,UACc;AACd,QAAM,UAAU,OAAO;AAAA,IACrB,OAAO,OAAO,QAAQ,EAAE,IAAI,CAAC,YAAY;AAAA,MACvC,QAAQ;AAAA,MACR,gBAAgB,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO,mBAAmB,OAAO;AACnC;AAEA,SAAS,gBAAgB,SAA6C;AACpE,QAAM,aAAa,6BAA6B,OAAO;AAEvD,SAAO;AAAA,IACL,WAAW,WAAW;AAAA,IACtB,QAAQ,WAAW;AAAA,IACnB,QACE,WAAW,OAAO,SAAS,aACvB,aACA,WAAW,WAAW,aACpB,aACA;AAAA,IACR,SAAS,WAAW,WAAW,CAAC;AAAA,IAChC,WAAW,WAAW,aAAa,WAAW,YAAY;AAAA,IAC1D,WAAW,WAAW;AAAA,IACtB,YAAY,WAAW;AAAA,IACvB,YAAY,CAAC,GAAI,WAAW,cAAc,CAAC,CAAE;AAAA,IAC7C,UAAU,WAAW;AAAA,EACvB;AACF;;;ACfO,SAAS,yBACd,OACqB;AACrB,QAAM,UAAUC,uBAAsB,MAAM,SAAS,OAAO;AAC5D,QAAM,kBAAkB,uBAAuB,OAAO;AACtD,MAAI,4BAA4B,MAAM,SAAS,OAAO,QAAQ,GAAG;AAC/D,oBAAgB;AAAA,MACd;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,iBAA8C;AAAA,IAClD,GAAG;AAAA,IACH,GAAG,4BAA4B,MAAM,QAAQ;AAAA,EAC/C;AACA,QAAM,WAAWC,gBAAe;AAAA,IAC9B,GAAI,MAAM,YAAY,CAAC;AAAA,IACvB,GAAG,0BAA0B,MAAM,QAAQ;AAAA,EAC7C,CAAC;AACD,QAAM,SAAS,aAAa;AAAA,IAC1B,GAAG,wBAAwB,MAAM,QAAQ;AAAA,IACzC,GAAI,MAAM,aAAa,CAAC,MAAM,UAAU,IAAI,CAAC;AAAA,EAC/C,CAAC;AAED,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,aACE,eAAe,KAAK,CAAC,UAAU,MAAM,iBAAiB,mBAAmB,KACzE,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,4BACP,UACS;AACT,SAAO,OAAO,OAAO,QAAQ,EAAE,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAS,UAAU;AACrF;AAEA,SAASD,uBAAsB,SAAoC;AACjE,MAAI,WAAW,OAAO,YAAY,YAAa,QAA8B,SAAS,OAAO;AAC3F,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,QAChB,CAAC,UACC,QAAQ,KAAK,KACb,OAAO,UAAU,aACf,MAA4B,SAAS,eACpC,MAA4B,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC,EAAE,MAAM,aAAa,UAAU,CAAC,EAAE,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,uBACP,SAC6B;AAC7B,QAAM,QAAQ;AAAA,IACZ,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAEA,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS,QAAQ,SAAS,GAAG;AAC/D,iBAAa,QAAQ,SAAS,KAAK,GAAG,KAAK;AAAA,EAC7C;AAEA,QAAM,UAAuC,CAAC;AAC9C,MAAI,MAAM,YAAY;AACpB,YAAQ,KAAK,eAAe,cAAc,sDAAsD,CAAC;AAAA,EACnG;AACA,MAAI,MAAM,MAAM;AACd,YAAQ,KAAK,eAAe,QAAQ,6DAA6D,CAAC;AAAA,EACpG;AACA,MAAI,MAAM,YAAY;AACpB,YAAQ,KAAK,eAAe,cAAc,qEAAqE,CAAC;AAAA,EAClH;AACA,MAAI,MAAM,UAAU;AAClB,YAAQ,KAAK,eAAe,YAAY,wDAAwD,CAAC;AAAA,EACnG;AACA,MAAI,MAAM,OAAO;AACf,YAAQ,KAAK,eAAe,SAAS,wDAAwD,CAAC;AAAA,EAChG;AACA,MAAI,MAAM,YAAY;AACpB,YAAQ,KAAK,eAAe,cAAc,0DAA0D,CAAC;AAAA,EACvG;AACA,MAAI,MAAM,QAAQ;AAChB,YAAQ,KAAK,eAAe,iBAAiB,iEAAiE,CAAC;AAAA,EACjH;AACA,MAAI,MAAM,QAAQ;AAChB,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,UAAU;AAClB,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,iBAAiB;AACzB,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,OACA,OAYQ;AACR,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,YAAM,aAAa;AACnB,UAAI,MAAM,SAAS,YAAY,EAAE,WAAW,SAAS,GAAG;AACtD,cAAM,WAAW;AAAA,MACnB;AACA,UAAI,MAAM,WAAW;AACnB,cAAM,QAAQ;AAAA,MAChB;AACA,aAAO,iBAAiB,OAAO,KAAK;AAAA,IACtC,KAAK;AACH,YAAM,SAAS;AACf,aAAO,MAAM,KAAK;AAAA,QAChB,CAAC,MAAM,QACL,OACA,IAAI,MAAM;AAAA,UACR,CAAC,UAAU,SACT,WAAW,KAAK,SAAS,OAAO,CAAC,WAAW,UAAU,YAAY,aAAa,OAAO,KAAK,GAAG,CAAC;AAAA,UACjG;AAAA,QACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,KAAK;AACH,YAAM,kBAAkB;AACxB,aAAO,MAAM,SAAS,OAAO,CAAC,MAAM,UAAU,OAAO,aAAa,OAAO,KAAK,GAAG,CAAC;AAAA,IACpF,KAAK;AACH,aAAO,MAAM,SAAS,OAAO,CAAC,MAAM,UAAU,OAAO,aAAa,OAAO,KAAK,GAAG,CAAC;AAAA,IACpF,KAAK;AACH,YAAM,WAAW;AACjB,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,iBACP,WACA,OAUQ;AACR,MAAI,OAAO;AACX,QAAM,WAAW,MAAM,QAAQ,UAAU,QAAQ,IAAI,UAAU,WAAW,CAAC;AAE3E,aAAW,SAAS,UAAU;AAC5B,YAAQ,kBAAkB,OAAO,KAAK;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,MACA,OAUQ;AACR,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,YAAM,OAAO,MAAM,QAAQ,KAAK,KAAK,SAAS;AAC9C,YAAM,aACJ,MAAM,cACN,OAAO,KAAK,KAAK,IAAI,KACrB,OAAO,KAAK,KAAK,IAAI,KACrB,KAAK,KAAK,SAAS,IAAI;AACzB,aAAO,MAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK;AACH,YAAM,OAAO;AACb,YAAM,aAAa;AACnB,aAAO;AAAA,IACT,KAAK;AACH,YAAM,OAAO;AACb,YAAM,aAAa;AACnB,aAAO,KAAK,SAAS,OAAO,CAAC,MAAM,UAAU,OAAO,kBAAkB,OAAO,KAAK,GAAG,CAAC;AAAA,IACxF,KAAK;AACH,YAAM,SAAS;AACf,YAAM,OAAO;AACb,aAAO;AAAA,IACT,KAAK;AACH,YAAM,OAAO;AACb,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,YAAM,OAAO;AACb,aAAO;AAAA,EACX;AACF;AAEA,SAAS,4BACP,UAC6B;AAC7B,QAAM,UAAuC,CAAC;AAC9C,QAAM,yBAAyB,8BAA8B,QAAQ;AAErE,UAAQ,KAAK,GAAG,uBAAuB,QAAQ,CAAC;AAEhD,aAAW,YAAY,oBAAoB,SAAS,YAAqB,GAAG;AAC1E,UAAM,aAAa,uBAAuB,QAAQ;AAClD,YAAQ,KAAK;AAAA,MACX,gBAAgB,WAAW,SAAS,UAAU;AAAA,MAC9C,YAAY,WAAW;AAAA,MACvB,cAAc;AAAA,MACd,SAAS,WAAW;AAAA,MACpB,gBAAgB;AAAA,QACd,SAAS,eAAe;AAAA,QACxB,SAAS,eAAe;AAAA,MAC1B;AAAA,MACA,SAAS;AAAA,QACP,YAAY,SAAS;AAAA,QACrB,WAAW,SAAS;AAAA,QACpB,QAAQ,WAAW;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,eAAe,0BAA0B,SAAS,YAAqB,GAAG;AACnF,QAAI,uBAAuB,IAAI,YAAY,eAAe,GAAG;AAC3D;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,gBAAgB,mBAAmB,YAAY,eAAe;AAAA,MAC9D,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS,0BAA0B,YAAY,eAAe;AAAA,MAC9D,SAAS;AAAA,QACP,iBAAiB,YAAY;AAAA,QAC7B,aAAa,YAAY;AAAA,QACzB,iBAAiB,YAAY;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,UACqB;AACrB,QAAM,WAAW,SAAS;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO,oBAAI,IAAY;AAAA,EACzB;AAEA,QAAM,QAAQ,oBAAI,IAAY;AAE9B,aAAW,UAAU,SAAS,WAAW,CAAC,GAAG;AAC3C,UAAM,IAAI,OAAO,QAAQ;AAAA,EAC3B;AAEA,aAAW,UAAU,SAAS,WAAW,CAAC,GAAG;AAC3C,UAAM,IAAI,OAAO,QAAQ;AAAA,EAC3B;AAEA,MAAI,SAAS,oBAAoB;AAC/B,UAAM,IAAI,qBAAqB;AAC/B,UAAM,IAAI,oBAAoB;AAAA,EAChC;AAEA,MAAI,SAAS,OAAO;AAClB,UAAM,IAAI,wBAAwB;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,UAC6B;AAC7B,QAAM,WAAW,SAAS;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAuC,4BAA4B,QAAQ;AACjF,QAAM,0BAA0B,SAAS,SAAS,UAAU,KAAK,MAAM,SAAS,SAAS,UAAU,KAAK;AACxG,QAAM,YACJ,OAAO,KAAK,SAAS,oBAAoB,aAAa,CAAC,CAAC,EAAE,SAC1D,OAAO,KAAK,SAAS,oBAAoB,YAAY,CAAC,CAAC,EAAE;AAE3D,MAAI,0BAA0B,CAAC,QAAQ,KAAK,CAAC,UAAU,MAAM,eAAe,uBAAuB,GAAG;AACpG,YAAQ,KAAK;AAAA,MACX,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,QACP,aAAa,SAAS,SAAS,UAAU;AAAA,QACzC,aAAa,SAAS,SAAS,UAAU;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,YAAY,KAAK,CAAC,QAAQ,KAAK,CAAC,UAAU,MAAM,eAAe,aAAa,GAAG;AACjF,YAAQ,KAAK;AAAA,MACX,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,QACP,eAAe,OAAO,KAAK,SAAS,oBAAoB,aAAa,CAAC,CAAC,EAAE;AAAA,QACzE,cAAc,OAAO,KAAK,SAAS,oBAAoB,YAAY,CAAC,CAAC,EAAE;AAAA,MACzE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,OAAO;AAClB,YAAQ,KAAK;AAAA,MACX,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW,SAAS,MAAM;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,UAC6B;AAC7B,QAAM,UAAuC,CAAC;AAE9C,QAAM,oBAAoB;AAAA,IACxB,IAAI,SAAS,WAAW,CAAC,GAAG;AAAA,MAAQ,CAAC,WACnC,mBAAmB,OAAO,QAAQ,UAAU,OAAO,QAAQ,EAAE;AAAA,IAC/D;AAAA,IACA,IAAI,SAAS,WAAW,CAAC,GAAG;AAAA,MAAQ,CAAC,WACnC,mBAAmB,OAAO,QAAQ,UAAU,OAAO,QAAQ,EAAE;AAAA,IAC/D;AAAA,EACF;AACA,MAAI,kBAAkB,SAAS,GAAG;AAChC,YAAQ,KAAK;AAAA,MACX,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,YAAY;AAAA,IAChB,GAAG,OAAO,OAAO,SAAS,oBAAoB,aAAa,CAAC,CAAC,EAAE;AAAA,MAAQ,CAAC,SACtE,mBAAmB,KAAK,QAAQ,YAAY,KAAK,MAAM,EAAE;AAAA,IAC3D;AAAA,IACA,GAAG,OAAO,OAAO,SAAS,oBAAoB,YAAY,CAAC,CAAC,EAAE;AAAA,MAAQ,CAAC,SACrE,mBAAmB,KAAK,QAAQ,WAAW,KAAK,MAAM,EAAE;AAAA,IAC1D;AAAA,EACF;AACA,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,KAAK;AAAA,MACX,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,mBACP,QACA,SACU;AACV,QAAM,SAAmB,CAAC;AAE1B,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,SAAS;AAC1B,iBAAW,OAAO,MAAM,MAAM;AAC5B,mBAAW,QAAQ,IAAI,OAAO;AAC5B,iBAAO,KAAK,GAAG,mBAAmB,KAAK,UAAU,GAAG,OAAO,aAAa,CAAC;AAAA,QAC3E;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,aAAa;AAC9B,aAAO,KAAK,GAAG,OAAO,IAAI,MAAM,IAAI,EAAE;AACtC;AAAA,IACF;AAEA,QACE,MAAM,cAAc,UACpB,MAAM,aAAa,UACnB,MAAM,cAAc,UACpB,MAAM,iBAAiB,UACvB,MAAM,oBAAoB,UAC1B,MAAM,iBAAiB,UACvB,MAAM,YAAY,UAClB,MAAM,YAAY,UAClB,MAAM,SAAS,UACf,MAAM,wBAAwB,UAC9B,MAAM,aAAa,QACnB;AACA,aAAO,KAAK,GAAG,OAAO,uBAAuB;AAAA,IAC/C;AAEA,eAAW,SAAS,MAAM,UAAU;AAClC,aAAO,KAAK,GAAG,0BAA0B,OAAO,OAAO,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAC5B;AAEA,SAAS,0BACP,MACA,SACU;AACV,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,QAAQ;AACX,YAAM,gCACJ,QAAQ,WAAW,SAAS,KAAK,QAAQ,WAAW,SAAS;AAC/D,YAAM,oBAAoB,KAAK,SAAS,CAAC,GACtC;AAAA,QACC,CAAC,SACC,KAAK,SAAS,UACd,KAAK,SAAS,YACd,KAAK,SAAS,eACd,KAAK,SAAS,mBACd,KAAK,SAAS,yBACd,KAAK,SAAS,gBACd,KAAK,SAAS,cACd,KAAK,SAAS,gBACb,CAAC,iCAAiC,KAAK,SAAS,uBAChD,CAAC,iCAAiC,KAAK,SAAS,gBACjD,KAAK,SAAS,eACd,KAAK,SAAS;AAAA,MAClB,EACC,IAAI,CAAC,SAAS,GAAG,OAAO,SAAS,KAAK,IAAI,EAAE;AAC/C,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC;AAAA,IACV;AACE,aAAO,CAAC,GAAG,OAAO,IAAI,KAAK,IAAI,EAAE;AAAA,EACrC;AACF;AAEA,SAAS,0BACP,UACiB;AACjB,QAAM,cAAc,MAAM,QAAQ,SAAS,aAAa,QAAQ,IAC5D,SAAS,YAAY,WACrB,CAAC;AAEL,SAAO,YAAY,IAAI,CAAC,aAAa;AAAA,IACnC,WAAW,QAAQ;AAAA,IACnB,MACE,QAAQ,WAAW,gBAAgB,QAAQ,WAAW,WAClD,0BACA,QAAQ,WAAW,iBACjB,gCACA;AAAA,IACR,UAAU;AAAA,IACV,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,EAClB,EAAE;AACJ;AAEA,SAAS,wBACP,UACe;AACf,QAAM,cAAc,MAAM,QAAQ,SAAS,aAAa,MAAM,IAC1D,SAAS,YAAY,SACrB,CAAC;AAEL,SAAO,YAAY,IAAI,CAAC,WAAW;AAAA,IACjC,SAAS,MAAM;AAAA,IACf,MACE,MAAM,SAAS,gBACX,kBACA,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,EAChB,EAAE;AACJ;AAEA,SAAS,eACP,YACA,SAC2B;AAC3B,SAAO;AAAA,IACL,gBAAgB,WAAW,UAAU;AAAA,IACrC;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAASC,gBAAe,UAA4C;AAClE,QAAM,OAAO,oBAAI,IAA2B;AAE5C,aAAW,WAAW,UAAU;AAC9B,SAAK,IAAI,QAAQ,WAAW,OAAO;AAAA,EACrC;AAEA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAC1B;AAEA,SAAS,aAAa,QAAsC;AAC1D,QAAM,OAAO,oBAAI,IAAyB;AAE1C,aAAW,SAAS,QAAQ;AAC1B,SAAK,IAAI,MAAM,SAAS,KAAK;AAAA,EAC/B;AAEA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAC1B;;;AChgBA,IAAM,8BAA8B,oBAAI,IAAqB;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAkBM,SAAS,kBAId,QAAqE,CAAC,GAClB;AACpD,SAAO;AAAA,IACL,gBAAgB,YAAY,MAAM,kBAAkB,CAAC,CAAC;AAAA,IACtD,UAAU,YAAY,MAAM,YAAY,CAAC,CAAC;AAAA,IAC1C,QAAQ,YAAY,MAAM,UAAU,CAAC,CAAC;AAAA,EACxC;AACF;AAyBO,SAAS,uBAId,aACA,sBAAsB,OACb;AACT,MAAI,qBAAqB;AACvB,WAAO;AAAA,EACT;AAEA,SACE,YAAY,eAAe;AAAA,IACzB,CAAC,UAAU,MAAM,iBAAiB;AAAA,EACpC,KACA,YAAY,OAAO;AAAA,IACjB,CAAC,UAAU,MAAM,WAAW,4BAA4B,IAAI,MAAM,IAAI;AAAA,EACxE;AAEJ;AAEA,SAAS,YAAmB,OAA2C;AACrE,SAAO,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC;AACjC;;;AChMO,IAAMC,gCAA+B;AAkErC,SAAS,0BAId,OAC+C;AAC/C,QAAM,cAAc,kBAAkB,KAAK;AAE3C,SAAO,OAAO,OAAO;AAAA,IACnB,eAAeC;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,aAAa,uBAAuB,aAAa,MAAM,WAAW;AAAA,IAClE,gBAAgB,YAAY;AAAA,IAC5B,UAAU,YAAY;AAAA,IACtB,QAAQ,YAAY;AAAA,EACtB,CAAC;AACH;AAEO,SAAS,0BAId,SACA,SAI+C;AAC/C,SAAO,0BAA0B;AAAA,IAC/B,aAAa,QAAQ;AAAA,IACrB,aACE,QAAQ,eAAe,QAAQ,KAAK,CAAC,WAAW,OAAO,WAAW;AAAA,IACpE,gBAAgB,cAAc,QAAQ,QAAQ,CAAC,WAAW,OAAO,cAAc,CAAC;AAAA,IAChF,UAAU,cAAc,QAAQ,QAAQ,CAAC,WAAW,OAAO,QAAQ,CAAC;AAAA,IACpE,QAAQ,cAAc,QAAQ,QAAQ,CAAC,WAAW,OAAO,MAAM,CAAC;AAAA,EAClE,CAAC;AACH;AAqCA,SAAS,cACP,OACkB;AAClB,QAAM,UAAU,oBAAI,IAAmB;AAEvC,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,KAAK,UAAU,IAAI,GAAG,IAAI;AAAA,EACxC;AAEA,SAAO,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC;AAC5C;;;ACzHO,SAAS,mBACd,OACA,UAA6B,CAAC,GACf;AACf,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,QAAQ,aAAa,QAAQ,iBAAiB;AACpE,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,YAAY,QAAQ,aAAa;AAEvC,MAAI;AACF,UAAM,SAAS,QACX,QACA,MAAM,QAAQ,uBAAuB,MAAM;AAC/C,UAAM,UAAU,YAAY,MAAM,MAAM,QAAQ;AAChD,WAAO,IAAI,OAAO,SAAS,gBAAgB,MAAM,IAAI;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBACd,MACA,OACA,UAA6B,CAAC,GACd;AAChB,QAAM,UAAU,mBAAmB,OAAO,OAAO;AACjD,MAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,QAAM,UAA0B,CAAC;AACjC,MAAI;AACJ,UAAQ,YAAY;AACpB,UAAQ,QAAQ,QAAQ,KAAK,IAAI,OAAO,MAAM;AAC5C,YAAQ,KAAK;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,IAAI,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,MAC3B,MAAM,MAAM,CAAC;AAAA,MACb,OAAO,QAAQ;AAAA,IACjB,CAAC;AAED,QAAI,MAAM,CAAC,EAAE,WAAW,GAAG;AACzB,cAAQ,aAAa;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,MACA,MACA,IACA,SAAS,IACD;AACR,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;AACxD,QAAM,SAAS,KAAK,IAAI,UAAU,KAAK,IAAI,IAAI,KAAK,MAAM,CAAC;AAC3D,QAAM,QAAQ,KAAK,IAAI,GAAG,WAAW,MAAM;AAC3C,QAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,SAAS,MAAM;AACjD,QAAM,SAAS,QAAQ,IAAI,WAAM;AACjC,QAAM,SAAS,MAAM,KAAK,SAAS,WAAM;AACzC,QAAM,UAAU,KACb,MAAM,OAAO,GAAG,EAChB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,YAAY,GAAG,EACvB,KAAK;AACR,SAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM;AACrC;AAEO,SAAS,oBACd,QACA,OACA,UAA6B,CAAC,GACP;AACvB,QAAM,aAAa,mBAAmB,MAAM;AAC5C,SAAO,kBAAkB,WAAW,MAAM,OAAO,OAAO,EACrD,IAAI,CAAC,UAAU;AACd,UAAM,QAAQ;AAAA,MACZ,WAAW;AAAA,MACX,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,MAAM;AAAA,MACZ,IAAI,MAAM;AAAA,MACV,SAAS,oBAAoB,WAAW,MAAM,MAAM,MAAM,MAAM,EAAE;AAAA,IACpE;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAAwC,QAAQ,KAAK,CAAC;AACnE;AAoDO,SAAS,mBACd,QACsB;AACtB,QAAM,UAAoC;AAAA,IACxC,MAAM,CAAC;AAAA,IACP,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAEA,sBAAoB,SAAS,MAAM;AAEnC,SAAO;AAAA,IACL,MAAM,QAAQ,KAAK,KAAK,EAAE;AAAA,IAC1B,WAAW,QAAQ;AAAA,EACrB;AACF;AAEA,SAAS,oBACP,SACA,QACM;AACN,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,gBAAgB;AACjC,UAAI,MAAM,WAAW,WAAW,UAAU,GAAG;AAC3C;AAAA,MACF;AACA,uBAAiB,SAAS,MAAM,MAAM,MAAM,IAAI,QAAQ;AACxD;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,uBAAiB,SAAS,MAAM,IAAI;AACpC,iBAAW,CAAC,UAAU,GAAG,KAAK,MAAM,KAAK,QAAQ,GAAG;AAClD,YAAI,WAAW,GAAG;AAChB,mCAAyB,SAAS,IAAI;AAAA,QACxC;AACA,mBAAW,CAAC,WAAW,IAAI,KAAK,IAAI,MAAM,QAAQ,GAAG;AACnD,cAAI,YAAY,GAAG;AACjB,qCAAyB,SAAS,GAAI;AAAA,UACxC;AACA,8BAAoB,SAAS,KAAK,OAAO;AAAA,QAC3C;AAAA,MACF;AACA,uBAAiB,SAAS,MAAM,EAAE;AAClC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,aAAa;AAC9B,uBAAiB,SAAS,MAAM,IAAI;AACpC,0BAAoB,SAAS,MAAM,QAAQ;AAC3C,uBAAiB,SAAS,MAAM,EAAE;AAClC;AAAA,IACF;AAEA,eAAW,WAAW,MAAM,UAAU;AACpC,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,yBAAe,SAAS,QAAQ,MAAM,QAAQ,IAAI;AAClD;AAAA,QACF,KAAK;AACH,2BAAiB,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAI;AACxD;AAAA,QACF,KAAK;AACH,2BAAiB,SAAS,QAAQ,MAAM,QAAQ,IAAI,IAAI;AACxD;AAAA,QACF,KAAK;AACH,2BAAiB,SAAS,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AAC5D;AAAA,QACF,KAAK;AACH,2BAAiB,SAAS,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AAC5D;AAAA,QACF,KAAK;AACH,2BAAiB,SAAS,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AAC5D;AAAA,MACJ;AAAA,IACF;AAEA,qBAAiB,SAAS,MAAM,EAAE;AAAA,EACpC;AACF;AAEA,SAAS,eACP,SACA,MACA,aACM;AACN,mBAAiB,SAAS,WAAW;AAErC,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,YAAQ,KAAK,KAAK,KAAK,KAAK,CAAE;AAC9B,YAAQ,UAAU,KAAK,cAAc,KAAK;AAAA,EAC5C;AAEA,UAAQ,oBAAoB,KAAK;AAAA,IAC/B,QAAQ;AAAA,IACR,cAAc,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,iBACP,SACA,MACA,IACA,MACM;AACN,mBAAiB,SAAS,IAAI;AAC9B,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI;AAEnC,WAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AAC7C,YAAQ,KAAK,KAAK,IAAI;AACtB,YAAQ,UAAU,KAAK,OAAO,KAAK;AAAA,EACrC;AAEA,UAAQ,oBAAoB,KAAK,IAAI,QAAQ,mBAAmB,EAAE;AACpE;AAEA,SAAS,iBACP,SACA,UACM;AACN,WACM,SAAS,QAAQ,mBACrB,SAAS,UACT,UAAU,GACV;AACA,YAAQ,KAAK,KAAK,IAAI;AACtB,YAAQ,UAAU,KAAK,MAAM;AAAA,EAC/B;AAEA,UAAQ,oBAAoB,KAAK,IAAI,QAAQ,mBAAmB,QAAQ;AAC1E;AAEA,SAAS,yBACP,SACA,OACM;AACN,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,KAAK,IAAI;AACtB,YAAQ,UAAU,KAAK,IAAI;AAAA,EAC7B;AACF;AAEA,SAAS,6BACP,WACA,MACA,IACqC;AACrC,MAAI;AACJ,WAAS,QAAQ,MAAM,QAAQ,IAAI,SAAS,GAAG;AAC7C,UAAM,SAAS,UAAU,KAAK;AAC9B,QAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,oBAAc;AACd;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,WAAS,QAAQ,KAAK,GAAG,SAAS,MAAM,SAAS,GAAG;AAClD,UAAM,SAAS,UAAU,KAAK;AAC9B,QAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,kBAAY,SAAS;AACrB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,UAAa,cAAc,QAAW;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,MAAM,aAAa,IAAI,UAAU;AAC5C;;;AC1UA,IAAM,8BAA8B,oBAAI,IAAI,CAAC,aAAa,qBAAqB,YAAY,CAAC;AAErF,SAAS,8BAA8B,OAKnB;AACzB,QAAM,aAAwC,CAAC;AAC/C,QAAM,SAAgC,CAAC;AACvC,QAAM,kBAAkD,CAAC;AACzD,QAAM,UAAU,MAAM,eAAe;AAErC,MAAI,SAAS;AACX;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,eAAW,SAAS,QAAQ,kBAAkB;AAC5C;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,GAAG,mBAAmB,SAAS,MAAM,aAAa,CAAC;AAAA,EACjE;AACA,kBAAgB,KAAK,GAAG,4BAA4B,MAAM,cAAc,eAAe,CAAC;AAExF,QAAM,WAAW,MAAM,eAAe,SAAS,QAAQ,IAAI,CAAC,YAAmC;AAAA,IAC7F,UAAU,WAAW,OAAO,SAAS;AAAA,IACrC,MAAM;AAAA,IACN,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,cAAc,OAAO;AAAA,IACrB,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,EACpB,EAAE;AAEF,QAAM,YAAY,MAAM,eAAe,eAAe,UAAU;AAAA,IAC9D,CAAC,cAAsC;AAAA,MACrC,UAAU,YAAY,SAAS,UAAU;AAAA,MACzC,MAAM;AAAA,MACN,YAAY,SAAS;AAAA,MACrB,cAAc,SAAS;AAAA,MACvB,QAAQ,SAAS;AAAA,MACjB,OAAO,SAAS;AAAA,MAChB,SAAS,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,eAAe,SAAS;AAAA,MACxB,UAAU,SAAS;AAAA,MACnB,WAAW,SAAS;AAAA,MACpB,oBAAoB,SAAS;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,mBAAmB,OAC9C;AAAA,IACC,CAAC,UACC,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,QAAQ;AAAA,EAC5D,EACC;AAAA,IACC,CAAC,WAAyC;AAAA,MACxC,UAAU,mBAAmB,MAAM,OAAO;AAAA,MAC1C,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,QAAQC,mBAAkB,MAAM,OAAO,MAAM,GAAG;AAAA,MAChD,aAAa;AAAA,MACb,OAAO,mBAAmB,MAAM,OAAO;AAAA,MACvC,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,mBAAmB,MAAM;AAAA,MACzB,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAEF,QAAM,QAA8B;AAAA,IAClC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,wCACd,UACA,UAAyC,CAAC,GAChB;AAC1B,QAAM,eAAe,QAAQ,QAAQ,IAAI,IAAI,QAAQ,KAAK,IAAI;AAC9D,QAAM,kBAAkB,QAAQ,oBAAoB;AAEpD,SAAO,SAAS,MACb,OAAO,CAAC,SAAU,eAAe,aAAa,IAAI,KAAK,IAAI,IAAI,IAAK,EACpE,OAAO,CAAC,SAAS,mBAAmB,KAAK,OAAO,SAAS,UAAU,EACnE;AAAA,IACC,CAAC,UAAkC;AAAA,MACjC,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,QAAQ,QAAQ,UAAU;AAAA,IAC5B;AAAA,EACF;AACJ;AAEA,SAAS,qBACP,QACA,aACA,cACA,YACA,iBACM;AACN,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,aAAa;AAC9B,iBAAW,WAAW,MAAM,UAAU;AACpC,6BAAqB,SAAS,aAAa,cAAc,YAAY,eAAe;AAAA,MACtF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,iBAAW,OAAO,MAAM,MAAM;AAC5B,mBAAW,QAAQ,IAAI,OAAO;AAC5B,+BAAqB,KAAK,SAAS,aAAa,cAAc,YAAY,eAAe;AAAA,QAC3F;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,aAAa;AAC9B,2BAAqB,MAAM,UAAU,aAAa,cAAc,YAAY,eAAe;AAC3F;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,gBAAgB,MAAM,UAAU;AAC9D,UAAM,aAAa,WAAW,uBAAuB,QAAQ,IAAI;AACjE,UAAM,oBACJ,YAAY,4BAA4B,IAAI,YAAY,cAAc,EAAE,IACpE,4BACA;AACN,oBAAgB,KAAK;AAAA,MACnB,UAAU,UAAU,MAAM,UAAU;AAAA,MACpC,MAAM;AAAA,MACN,YAAY,MAAM;AAAA,MAClB,WAAW,MAAM;AAAA,MACjB,QAAQA,mBAAkB,MAAM,MAAM,MAAM,EAAE;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBACP,SACA,aACA,cACA,YACA,iBACM;AACN,MAAI,QAAQ,SAAS,UAAU,QAAQ,WAAW,iBAAiB;AACjE,eAAW,KAAK;AAAA,MACd,UAAU,aAAaC,gBAAe,WAAW,CAAC,IAAI,QAAQ,IAAI,IAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU,eAAe;AAAA,MACrH,MAAM;AAAA,MACN,QAAQD,mBAAkB,QAAQ,MAAM,QAAQ,EAAE;AAAA,MAClD;AAAA,MACA,OAAO,aAAa,QAAQ,UAAU,eAAe;AAAA,MACrD,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ,UAAU;AAAA,MACzB,MAAM,QAAQ;AAAA,IAChB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,iBAAiB;AACpC,UAAM,WAAW,aAAa,gBAAgB,QAAQ,UAAU;AAChE,UAAM,aAAa,WAAW,uBAAuB,QAAQ,IAAI;AACjE,UAAM,oBACJ,YAAY,4BAA4B,IAAI,YAAY,cAAc,EAAE,IACpE,4BACA;AACN,oBAAgB,KAAK;AAAA,MACnB,UAAU,UAAU,QAAQ,UAAU;AAAA,MACtC,MAAM;AAAA,MACN,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,MACnB,QAAQA,mBAAkB,QAAQ,MAAM,QAAQ,EAAE;AAAA,MAClD;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,mBACP,SACA,eACuB;AACvB,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU;AAAA,IACd,EAAE,QAAQ,QAAQ,QAAQ,aAAa,kBAAkB;AAAA,IACzD,GAAG,QAAQ,iBAAiB,IAAI,CAAC,WAAW;AAAA,MAC1C,QAAQ,MAAM;AAAA,MACd,aAAa,MAAM;AAAA,IACrB,EAAE;AAAA,EACJ;AAEA,SAAO,cAAc,OAAO,QAAQ,CAAC,UAAU;AAC7C,UAAM,cAAc,MAAM,YAAY,KAAK;AAC3C,QAAI,CAAC,aAAa;AAChB,aAAO,CAAC;AAAA,IACV;AAEA,eAAW,SAAS,SAAS;AAC3B,YAAM,UAAU,oBAAoB,MAAM,QAAQ,aAAa,EAAE,OAAO,EAAE,CAAC;AAC3E,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,QAAQ,QAAQ,CAAC;AACvB,eAAO;AAAA,UACL;AAAA,YACE,UAAU,SAAS,MAAM,KAAK;AAAA,YAC9B,MAAM;AAAA,YACN,QAAQA,mBAAkB,MAAM,MAAM,MAAM,EAAE;AAAA,YAC9C,aAAa,MAAM;AAAA,YACnB,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,YACf,YAAY,MAAM;AAAA,YAClB,aAAa,MAAM;AAAA,YACnB,aAAa,MAAM;AAAA,YACnB,eAAe,MAAM;AAAA,YACrB,aAAa,MAAM;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,CAAC;AAAA,EACV,CAAC;AACH;AAEA,SAAS,4BACP,cACA,UACgC;AAChC,QAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC;AAE5D,SAAO,OAAO,OAAO,aAAa,eAAe,EAC9C;AAAA,IACC,CAAC,aACC,CAAC,KAAK,IAAI,SAAS,UAAU,KAC1B,SAAS,oBAAoB;AAAA,EACpC,EACC,IAAI,CAAC,aAAa;AACjB,UAAM,aAAa,uBAAuB,QAAQ;AAClD,UAAM,oBAAoB,4BAA4B,IAAI,WAAW,UAAU,IAC3E,4BACA;AAEJ,WAAO;AAAA,MACL,UAAU,UAAU,SAAS,UAAU;AAAA,MACvC,MAAM;AAAA,MACN,YAAY,SAAS;AAAA,MACrB,WAAW,SAAS;AAAA,MACpB,QAAQA,mBAAkB,SAAS,eAAe,MAAM,SAAS,eAAe,EAAE;AAAA,MAClF,aAAa;AAAA,MACb,OAAO,WAAW;AAAA,MAClB,SAAS,WAAW;AAAA,MACpB,QAAQ,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACL;AAEA,SAASA,mBAAkB,MAAc,IAAoC;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAEA,SAASC,gBAAe,aAAwC;AAC9D,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,YAAY,IAAI,IAAI,YAAY,cAAc,IAAI,YAAY,OAAO,IAAI,YAAY,gBAAgB,MAAM;AAAA,IACvH,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,YAAY,IAAI,IAAI,YAAY,MAAM;AAAA,EACpD;AACF;;;AC1VA,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAClC,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAEzB,IAAM,oCAAoC,IAAI;AAE9C,SAAS,oBACd,OACA,aACQ;AACR,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,wBAAwB,OAAO,WAAW;AAAA,IACnD,KAAK;AACH,aAAO,oBAAoB,OAAO,WAAW;AAAA,IAC/C,KAAK;AACH,aAAO,KAAK;AAAA,QACV;AAAA,QACA,MAAM,SAAS,OAAO,CAAC,OAAO,UAAU,QAAQ,oBAAoB,OAAO,WAAW,GAAG,CAAC;AAAA,MAC5F;AAAA,IACF,KAAK;AACH,aAAO,MAAM,UAAU,kBAAkB,IAAI;AAAA,EACjD;AACF;AAEO,SAAS,wBACd,OACA,aACQ;AACR,QAAM,aAAa,4BAA4B,KAAK;AACpD,QAAM,YAAY,2BAA2B,OAAO,WAAW;AAC/D,QAAM,gBAAgB,MAAM,SAAS,UAAU;AAC/C,QAAM,eAAe,MAAM,SAAS,SAAS;AAC7C,SAAO,KAAK;AAAA,IACV;AAAA,IACA,aAAa,YAAY,gBAAgB;AAAA,EAC3C;AACF;AAEO,SAAS,4BACd,OACQ;AACR,QAAM,eAAe,MAAM,SAAS;AACpC,MAAI,OAAO,iBAAiB,YAAY,eAAe,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,MAAM,SAAS;AAAA,IACxC,CAAC,YACC,QAAQ,SAAS,UAAU,OAAO,QAAQ,WAAW,aAAa;AAAA,EACtE,GAAG,WAAW;AACd,QAAM,iBACJ,OAAO,uBAAuB,WAC1B,qBAAqB,IACrB;AACN,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,MAAM,iBAAiB,KAAK,IAAI;AAAA,EACvC;AACF;AAEO,SAAS,2BACd,OACA,aACQ;AACR,QAAM,mBAAmB,yBAAyB,KAAK;AACvD,QAAM,eAAe,KAAK,IAAI,IAAI,KAAK,MAAM,cAAc,gBAAgB,CAAC;AAC5E,MAAI,YAAY;AAChB,MAAI,mBAAmB,sBAAsB,KAAK;AAElD,aAAW,WAAW,MAAM,UAAU;AACpC,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,4BAAoB,MAAM,KAAK,QAAQ,IAAI,EAAE;AAC7C,eAAO,mBAAmB,cAAc;AACtC,uBAAa;AACb,8BAAoB;AAAA,QACtB;AACA;AAAA,MACF,KAAK;AACH,4BAAoB;AACpB;AAAA,MACF,KAAK;AACH,qBAAa;AACb,2BAAmB;AACnB;AAAA,MACF,KAAK;AACH,qBAAa,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,YAAY,aAAa,IAAI,CAAC,CAAC;AAC3E,2BAAmB;AACnB;AAAA,MACF,KAAK;AACH,4BAAoB;AACpB;AAAA,MACF,KAAK;AACH,YAAI,QAAQ,iBAAiB,gBAAgB;AAC3C,8BAAoB,QAAQ,MAAM,SAAS,IAAI,IAAI;AAAA,QACrD;AACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,KAAK,IAAI,GAAG,SAAS;AAC9B;AAEO,SAAS,oBAAoB,QAAoC;AACtE,SAAO,KAAK;AAAA,IACV;AAAA,IACA,OAAO,aAAa,OAAO,YAAY,OAAO;AAAA,EAChD;AACF;AAOO,SAAS,uBACd,QACoB;AACpB,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,IACA,OAAO,YAAY,OAAO,aAAa,OAAO,cAAc,OAAO;AAAA,EACrE;AACA,QAAM,cAAc,KAAK,IAAI,GAAG,OAAO,OAAO;AAC9C,MACE,CAAC,OAAO,qBACR,OAAO,kBAAkB,SAAS,GAClC;AACA,WAAO,OAAO,kBAAkB,IAAI,CAAC,QAAQ,WAAW;AAAA,MACtD,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK;AAAA,MACjC,OACE,QAAQ,OAAO,kBAAkB,SAAS,IACtC,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,IAC7B;AAAA,IACR,EAAE;AAAA,EACJ;AAEA,QAAM,QAAQ,eAAe,IACzB,cACA,KAAK,IAAI,KAAK,KAAK,MAAM,cAAc,WAAW,CAAC;AACvD,SAAO,MAAM,KAAK,EAAE,QAAQ,YAAY,GAAG,OAAO;AAAA,IAChD;AAAA,IACA,OAAO;AAAA,EACT,EAAE;AACJ;AAEO,SAAS,qBAAqB,QAAoC;AACvE,SAAO,uBAAuB,MAAM,EAAE,CAAC,GAAG,SAAS;AACrD;AAEA,SAAS,oBACP,OACA,aACQ;AACR,MAAI,cAAc;AAClB,aAAW,OAAO,MAAM,MAAM;AAC5B,UAAM,iBAAiB,IAAI,UAAU;AACrC,QAAI,iBAAiB,GAAG;AACtB,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,eAAW,QAAQ,IAAI,OAAO;AAC5B,YAAM,aAAa,KAAK,QAAQ;AAAA,QAC9B,CAAC,OAAO,UAAU,QAAQ,oBAAoB,OAAO,WAAW;AAAA,QAChE;AAAA,MACF;AACA,kBAAY,KAAK,IAAI,WAAW,aAAa,uBAAuB;AAAA,IACtE;AACA,mBAAe;AAAA,EACjB;AACA,SAAO,KAAK,IAAI,wBAAwB,WAAW;AACrD;AAEA,SAAS,yBACP,OACQ;AACR,QAAM,qBAAqB,MAAM,SAAS;AAAA,IACxC,CAAC,YACC,QAAQ,SAAS,UAAU,OAAO,QAAQ,WAAW,aAAa;AAAA,EACtE,GAAG,WAAW;AACd,QAAM,iBACJ,OAAO,uBAAuB,WAC1B,qBAAqB,IACrB;AACN,SAAO,KAAK,IAAI,IAAI,KAAK,MAAM,iBAAiB,EAAE,CAAC;AACrD;AAEA,SAAS,sBACP,OACQ;AACR,QAAM,SAAS,MAAM,mBAAmB;AACxC,QAAM,SACJ,MAAM,oBAAoB,UACtB,IACA,MAAM,oBAAoB,QACxB,IACA;AACR,SAAO,OAAO,SAAS;AACzB;;;ACrLO,SAAS,sBACd,UAC2B;AAC3B,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,wBAAwB,GAAG,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,QAAM,WAAsC,CAAC;AAC7C,MAAI,eAAe;AACnB,MAAI,eAAe;AAEnB,aAAW,CAAC,OAAO,KAAK,KAAK,SAAS,QAAQ,SAAS,QAAQ,GAAG;AAChE,QAAI,MAAM,SAAS,iBAAiB;AAClC;AAAA,IACF;AAEA,UAAM,eAAe,YAAY,OAAO,KAAK;AAC7C,aAAS,KAAK;AAAA,MACZ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,KAAK,cAAc,QAAQ;AAAA,MAC3B,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,mBAAe,cAAc,MAAM;AACnC,oBAAgB;AAAA,EAClB;AAEA,WAAS,KAAK;AAAA,IACZ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK,YAAY;AAAA,IACjB,YAAY,SAAS,UAAU;AAAA,EACjC,CAAC;AAED,SAAO;AACT;AAEO,SAAS,uBACd,UACA,UACyB;AACzB,aAAW,WAAW,UAAU;AAC9B,QAAI,WAAW,QAAQ,KAAK;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,SAAS,SAAS,SAAS,CAAC,KAAK;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AACF;AAEO,SAAS,wBACd,cACA,YACA,UACoB;AACpB,QAAM,WAAW,YAAY,YAAY;AAAA,IACvC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACA,QAAM,UAAU,YAAY,eAAe;AAAA,IACzC,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,UAAU,YAAY;AAC5B,QAAM,kBAAkB,SAAS,WAAW,CAAC;AAC7C,QAAM,wBAAwB,QAAQ,UAAU,UAAU,iBAAiB;AAE3E,SAAO;AAAA,IACL;AAAA,IACA,GAAI,YAAY,cAAc,EAAE,aAAa,WAAW,YAAY,IAAI,CAAC;AAAA,IACzE,WAAW,SAAS;AAAA,IACpB,YAAY,SAAS;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,cAAc,QAAQ;AAAA,IACtB,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,cAAc,QAAQ,UAAU;AAAA,IAChC,cAAc,QAAQ,UAAU;AAAA,IAChC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,aAAa,SAAS,eAAe;AAAA,IACrC,SACE,gBAAgB,SAAS,IAAI,gBAAgB,SAAU,SAAS,SAAS;AAAA,IAC3E,oBAAoB,QAAQ,YAAY,SAAS;AAAA,IACjD;AAAA,IACA,GAAI,YAAY,gBACZ;AAAA,MACE,eAAe;AAAA,QACb,GAAI,WAAW,cAAc,SACzB,EAAE,QAAQ,WAAW,cAAc,OAAO,IAC1C,CAAC;AAAA,QACL,GAAI,WAAW,cAAc,UAAU,SACnC,EAAE,OAAO,WAAW,cAAc,MAAM,IACxC,CAAC;AAAA,QACL,GAAI,WAAW,cAAc,YACzB,EAAE,cAAc,WAAW,cAAc,UAAU,IACnD,CAAC;AAAA,QACL,GAAI,WAAW,cAAc,UACzB,EAAE,kBAAkB,WAAW,cAAc,QAAQ,IACrD,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,YAAY,gBACZ;AAAA,MACE,eAAe;AAAA,QACb,GAAI,WAAW,cAAc,YAAY,SACrC,EAAE,SAAS,WAAW,cAAc,QAAQ,IAC5C,CAAC;AAAA,QACL,GAAI,WAAW,cAAc,UAAU,SACnC,EAAE,OAAO,WAAW,cAAc,MAAM,IACxC,CAAC;AAAA,QACL,GAAI,WAAW,cAAc,aAAa,SACtC,EAAE,UAAU,WAAW,cAAc,SAAS,IAC9C,CAAC;AAAA,QACL,GAAI,WAAW,cAAc,UACzB,EAAE,SAAS,WAAW,cAAc,QAAQ,IAC5C,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,YAAY,cACZ;AAAA,MACE,aAAa;AAAA,QACX,GAAI,WAAW,YAAY,MACvB,EAAE,KAAK,EAAE,GAAG,WAAW,YAAY,IAAI,EAAE,IACzC,CAAC;AAAA,QACL,GAAI,WAAW,YAAY,OACvB,EAAE,MAAM,EAAE,GAAG,WAAW,YAAY,KAAK,EAAE,IAC3C,CAAC;AAAA,QACL,GAAI,WAAW,YAAY,SACvB,EAAE,QAAQ,EAAE,GAAG,WAAW,YAAY,OAAO,EAAE,IAC/C,CAAC;AAAA,QACL,GAAI,WAAW,YAAY,QACvB,EAAE,OAAO,EAAE,GAAG,WAAW,YAAY,MAAM,EAAE,IAC7C,CAAC;AAAA,QACL,GAAI,WAAW,YAAY,aACvB,EAAE,YAAY,WAAW,YAAY,WAAW,IAChD,CAAC;AAAA,QACL,GAAI,WAAW,YAAY,UACvB,EAAE,SAAS,WAAW,YAAY,QAAQ,IAC1C,CAAC;AAAA,QACL,GAAI,WAAW,YAAY,SACvB,EAAE,QAAQ,WAAW,YAAY,OAAO,IACxC,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,YAAY,eACZ;AAAA,MACE,cAAc;AAAA,QACZ,GAAI,WAAW,aAAa,OACxB,EAAE,MAAM,WAAW,aAAa,KAAK,IACrC,CAAC;AAAA,QACL,GAAI,WAAW,aAAa,cAAc,SACtC,EAAE,WAAW,WAAW,aAAa,UAAU,IAC/C,CAAC;AAAA,QACL,GAAI,WAAW,aAAa,cAAc,SACtC,EAAE,WAAW,WAAW,aAAa,UAAU,IAC/C,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,IACL,mBAAmB;AAAA,IACnB,mBACE,SAAS,eACR,gBAAgB,WAAW,KAAK,gBAAgB,UAAU;AAAA,IAC7D,iBAAiB,QAAQ,SAAS,SAAS;AAAA,IAC3C,gBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,UAAU,WAAW,CAAC;AAAA,IACxB;AAAA,IACA,gBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,UAAU,WAAW,CAAC;AAAA,IACxB;AAAA,EACF;AACF;AAEO,SAAS,6BACd,UACA,UACA,QACqC;AACrC,MAAI,OAAO,SAAS,UAAU,SAAS,WAAW,GAAG;AACnD,WAAO,SAAS,CAAC;AAAA,EACnB;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,OAAO,iBAAiB,QAAW;AACrC,YAAM,UAAU,SAAS,KAAK,CAAC,cAAc,UAAU,UAAU,OAAO,YAAY;AACpF,aAAO,WACL,2BAA2B,UAAU,OAAO,cAAc,MAAM,IAC9D,UACA;AAAA,IACN;AACA,WACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,KAAK,SAAS,CAAC;AAAA,EAEnB;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,OAAO,iBAAiB,QAAW;AACrC,YAAM,UAAU,SAAS,KAAK,CAAC,cAAc,UAAU,UAAU,OAAO,YAAY;AACpF,aAAO,WACL,2BAA2B,UAAU,OAAO,cAAc,MAAM,IAC9D,UACA;AAAA,IACN;AACA,WACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,KAAK,SAAS,CAAC;AAAA,EAEnB;AAEA,SAAO;AACT;AAEO,SAAS,qBACd,OACA,aACA,UACA,iBACqC;AACrC,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS,QAAQ;AAC/B,WAAO,uBAAuB,UAAU,MAAM,UAAU,IAAI;AAAA,EAC9D;AAEA,QAAM,oBAAoB;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACA,MAAI,mBAAmB;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,gBACJ,iBAAiB,IAAI,eAAe,iBAAiB,CAAC,KAAK,MAAM;AACnE,SAAO,uBAAuB,UAAU,cAAc,IAAI;AAC5D;AAEA,SAAS,4BACP,UACA,UACA,QAGA,MACqC;AACrC,QAAM,cACJ,SAAS,WAAW,qBAAqB;AAC3C,QAAM,YACJ,SAAS,WACL,SAAS,UAAU,WAAW,CAAC,IAC/B,SAAS,UAAU,WAAW,CAAC;AAErC,SACE,SAAS;AAAA,IAAK,CAAC,YACb,QAAQ,aAAa,WAAW,GAAG;AAAA,MACjC,CAAC,QACC,IAAI,mBAAmB,OAAO,kBAC9B,IAAI,YAAY,OAAO;AAAA,IAC3B;AAAA,EACF,KACA,SAAS;AAAA,IAAK,CAAC,YACb,UAAU;AAAA,MACR,CAAC,UACC,MAAM,mBAAmB,OAAO,kBAChC,MAAM,YAAY,OAAO,WACzB,MAAM,iBAAiB,QAAQ;AAAA,IACnC;AAAA,EACF;AAEJ;;;AC3RA,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,IAAM,qBAAgC;AAAA,EACpC,UAAU;AAAA,EACV,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AACrB;AAEO,SAAS,gBAAgB,SAAyC;AACvE,SAAO,EAAE,GAAG,oBAAoB,GAAG,QAAQ;AAC7C;AAEO,SAAS,YAAY,OAAkB,MAA2B;AACvE,MAAI,MAAM,aAAa,KAAM,QAAO;AACpC,SAAO,EAAE,GAAG,OAAO,UAAU,KAAK;AACpC;AAEO,SAAS,gBAAgB,OAAkB,MAA+B;AAC/E,MAAI,MAAM,iBAAiB,KAAM,QAAO;AACxC,SAAO,EAAE,GAAG,OAAO,cAAc,KAAK;AACxC;AAEO,SAAS,iBACd,OACA,eACW;AACX,MAAI,MAAM,kBAAkB,eAAe;AACzC,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,OAAO,cAAc;AACnC;AAEO,SAAS,aAAa,OAAkB,WAAiC;AAC9E,QAAM,iBAAiB,mBAAmB,WAAW,MAAM,SAAS;AACpE,MAAI,MAAM,cAAc,gBAAgB;AACtC,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,OAAO,WAAW,eAAe;AAC/C;AAEO,SAAS,WAAW,OAAkB,SAA6B;AACxE,MAAI,MAAM,cAAc,QAAS,QAAO;AACxC,SAAO,EAAE,GAAG,OAAO,WAAW,QAAQ;AACxC;AAqBO,SAAS,wBACd,SACA,eACA,kBAC0B;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,oBAAoB,QAAQ,QAAQ,aAAa;AAC/D,MAAI,CAAC,SAAS,MAAM,SAAS,eAAe,CAAC,MAAM,UAAW,QAAO;AAErE,QAAM,YAAY,oBAAoB,MAAM,WAAW,gBAAgB;AACvE,SAAO;AAAA,IACL,qBAAqB,MAAM,UAAU;AAAA,IACrC,OAAO,MAAM,UAAU;AAAA,IACvB;AAAA,IACA,GAAI,MAAM,kBAAkB,EAAE,YAAY,MAAM,gBAAgB,IAAI,CAAC;AAAA,EACvE;AACF;AAKO,SAAS,wBACd,aACA,aAC0B;AAC1B,MAAI,YAAY,SAAS,cAAc,YAAY,SAAS,WAAW;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,0BAA0B,aAAa,WAAW;AAC5E,SAAO;AAAA,IACL,UAAU,YAAY;AAAA,IACtB,QAAQ,YAAY;AAAA,IACpB;AAAA,EACF;AACF;AAKO,SAAS,wBACd,SACA,qBACA,WACmB;AACnB,QAAM,gBACJ,OAAO,wBAAwB,WAC3B,sBACA,oBAAoB,YAAY,SAAS,SACvC,oBAAoB,YAAY,KAChC,oBAAoB;AAC5B,QAAM,QAAQ,UAAU,oBAAoB,QAAQ,QAAQ,aAAa,IAAI;AAC7E,QAAM,WAAW,OAAO,SAAS,eAAe,MAAM,WAAW,MAAM,WAAW,CAAC;AACnF,QAAM,iBAAiB,qBAAqB,KAAK;AAEjD,SAAO;AAAA,IACL,aAAa,UAAU,mBAAmB,CAAC,UAAU,gBAAgB,IAAI,CAAC;AAAA,IAC1E,eAAe,UAAU;AAAA,IACzB;AAAA,IACA,gBAAgB,kBAAkB;AAAA,IAClC,aAAa,UAAU,qBAAqB;AAAA,EAC9C;AACF;AAKO,SAAS,8BACd,WACA,aACA,WACA,SACA,aACA,YACA,kBACyB;AACzB,QAAM,oBACJ,UAAU,YAAY,SAAS,SAAS,UAAU,YAAY,KAAK,UAAU;AAC/E,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,oBAAoB,wBAAwB,SAAS,mBAAmB,gBAAgB;AAC9F,QAAM,oBAAoB,wBAAwB,aAAa,WAAW;AAC1E,QAAM,cAAc,wBAAwB,SAAS,WAAW,gBAAgB;AAEhF,SAAO;AAAA,IACL,UAAU,iBAAiB;AAAA,IAC3B,cAAc,iBAAiB;AAAA,IAC/B,eAAe,iBAAiB;AAAA,IAChC,WAAW,iBAAiB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,eAAe,iBAAiB;AAAA,IAChC;AAAA,IACA;AAAA,IACA,kBAAkB,iBAAiB;AAAA,IACnC,mBAAmB,iBAAiB;AAAA,IACpC;AAAA,IACA,WAAW,iBAAiB;AAAA,EAC9B;AACF;AAMA,SAAS,oBACP,QACA,UAC6B;AAC7B,aAAW,SAAS,QAAQ;AAC1B,QAAI,YAAY,MAAM,QAAQ,YAAY,MAAM,IAAI;AAClD,UAAI,MAAM,SAAS,aAAa;AAC9B,cAAM,QAAQ,oBAAoB,MAAM,UAAU,QAAQ;AAC1D,YAAI,MAAO,QAAO;AAAA,MACpB;AACA,UAAI,MAAM,SAAS,SAAS;AAC1B,mBAAW,OAAO,MAAM,MAAM;AAC5B,qBAAW,QAAQ,IAAI,OAAO;AAC5B,kBAAM,QAAQ,oBAAoB,KAAK,SAAS,QAAQ;AACxD,gBAAI,MAAO,QAAO;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBACP,WACA,kBACS;AACT,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,iBAAiB,UAAU,UAAU,mBAAmB;AACzE,QAAM,aAAa,WACf,iBAAiB,oBAAoB,SAAS,mBAAmB,IACjE;AACJ,QAAM,kBAAkB,YAAY,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,UAAU,KAAK;AAE1F,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,gBAAgB,WAAW;AACpC;AAEA,SAAS,2BACP,WACA,aACA,WACA,SACA,YACW;AACX,QAAM,mBAAmB,uBAAuB,aAAa,UAAU,KAAK,UAAU;AACtF,QAAM,oBAAoB,wBAAwB,SAAS,SAAS;AACpE,QAAM,gBAAgB,oBAAoB,SAAS,SAAS;AAE5D,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBACP,aACA,YAC0B;AAC1B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,eAAe,YAAY,gBAAgB;AACjD,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK;AACH,aAAO,EAAE,QAAQ,UAAU,cAAc,aAAa,EAAE;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,QAAQ,UAAU,cAAc,aAAa,EAAE;AAAA,IAC1D;AACE,aAAO,EAAE,QAAQ,QAAQ,cAAc,aAAa,EAAE;AAAA,EAC1D;AACF;AAEA,SAAS,wBACP,SACA,WACyC;AACzC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,WACJ,UAAU,YAAY,SAAS,SAAS,UAAU,YAAY,KAAK,UAAU;AAC/E,QAAM,QAAQ,oBAAoB,QAAQ,QAAQ,QAAQ;AAC1D,MAAI,CAAC,SAAS,MAAM,SAAS,aAAa;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,4BAA4B,MAAM,UAAU,QAAQ;AACpE,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ,YAAY,aAAa,aAAa;AAAA,IACzD;AAAA,EACF;AAEA,QAAM,aAAa,sBAAsB,OAAO;AAChD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,QAAQ;AAAA,IACnB,SAAS;AAAA,EACX;AACF;AAEA,SAAS,oBACP,SACA,WACe;AACf,MAAI,UAAU,YAAY,SAAS,QAAQ;AACzC,WAAO,UAAU,YAAY,QAAQ,IAAI,aAAa;AAAA,EACxD;AACA,MAAI,CAAC,UAAU,eAAe,CAAC,SAAS;AACtC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,oBAAoB,QAAQ,QAAQ,UAAU,IAAI;AAChE,MAAI,CAAC,SAAS,MAAM,SAAS,aAAa;AACxC,WAAO;AAAA,EACT;AACA,aAAW,WAAW,MAAM,UAAU;AACpC,QAAI,CAAC,oBAAoB,OAAO,GAAG;AACjC;AAAA,IACF;AACA,QAAI,UAAU,SAAS,QAAQ,MAAM;AACnC,aAAO;AAAA,IACT;AACA,QAAI,UAAU,SAAS,QAAQ,IAAI;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,0BACd,aACA,QACQ;AACR,MAAI,CAAC,YAAa,QAAO;AACzB,aAAW,SAAS,YAAY,QAAQ;AACtC,QAAI,MAAM,SAAS,aAAa;AAC9B,iBAAW,WAAW,MAAM,UAAU;AACpC,YACE,QAAQ,SAAS,cACjB,QAAQ,aAAa,OAAO,QAC5B,QAAQ,WAAW,OAAO,QAC1B;AACA,iBAAO,QAAQ;AAAA,QACjB;AAEA,YACE,QAAQ,SAAS,mBACjB,QAAQ,MAAM,YAAY,EAAE,SAAS,OAAO,IAAI,KAChD,QAAQ,OAAO,SAAS,OAAO,MAAM,GACrC;AACA,iBAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBACP,WACA,aACW;AACX,MAAI,cAAc,eAAe,cAAc,WAAW;AACxD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,WAAO;AAAA,EACT;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,kBAAkB,KAAK,MAAM,SAAS,CAAC;AAAA,EAClD;AACF;AAEA,SAAS,4BACP,UACA,UAC2E;AAC3E,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,oBAAoB,OAAO,GAAG;AACjC;AAAA,IACF;AACA,QAAI,YAAY,QAAQ,QAAQ,YAAY,QAAQ,IAAI;AACtD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBACP,SAC+E;AAC/E,MAAI,QAAQ,SAAS,SAAS;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,SAAS,iBAAiB;AACpC,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,OAAO,MAAM;AAC5C;AAEA,SAAS,sBACP,SAC4B;AAC5B,MAAI,QAAQ,UAAU,YAAY;AAChC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,UAAU,iBAAiB;AACrC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,UAAU,sBAAsB;AAC1C,WAAO,QAAQ,OAAO,SAAS,cAAc,IACzC,YACA;AAAA,EACN;AACA,SAAO;AACT;AAEA,SAAS,qBACP,OACgD;AAChD,MAAI,CAAC,SAAS,MAAM,SAAS,eAAe,CAAC,MAAM,UAAW,QAAO;AACrE,QAAM,SAAS,MAAM,aAAa,WAAW,MAAM,aAAa,QAAQ;AACxE,SAAO;AAAA,IACL;AAAA,IACA,aAAa,KAAK,IAAI,QAAQ,GAAG;AAAA,EACnC;AACF;;;AChbA,IAAMC,0BAAyB;AAC/B,IAAM,uCAAuC;AAS7C,IAAM,sBAAsB,oBAAI,QAM9B;AAaK,SAAS,iCACd,UACA,eACA,aAC4B;AAC5B,QAAM,OAAO,0BAA0B,QAAQ;AAC/C,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,KAAK,MAAM;AAAA,IACtB,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,iBAAiB,kBAAkB;AAAA,IACnC,oBAAoB,kBAAkB;AAAA,EACxC;AACF;AAEA,SAAS,0BACP,UACwB;AACxB,QAAM,SAAS,oBAAoB,IAAI,SAAS,OAAO;AACvD,MACE,UACA,OAAO,WAAW,SAAS,UAC3B,OAAO,aAAa,SAAS,UAC7B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,wBAAwB,GAAG,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,QAAM,WAAW,sBAAsB,QAAQ;AAC/C,QAAM,QAAQ,eAAe,UAAU,UAAU,WAAW;AAC5D,QAAM,WAAW,oBAAoB,UAAU,aAAa,UAAU,KAAK;AAC3E,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,UAAU,SAAS;AAAA,EACrB;AACA,sBAAoB,IAAI,SAAS,SAAS,IAAI;AAC9C,SAAO;AACT;AAKO,SAAS,kBACd,OACA,QACQ;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,SAAS,MAAM,CAAC,EAAG,WAAW;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC;AACrC;AAKO,SAAS,qBACd,UACA,QACQ;AACR,SAAO,SAAS,SAAS,IAAI,uBAA0B,UAAU,MAAM,EAAE,QAAQ;AACnF;AAEA,SAAS,eACP,UACA,UACA,aACwB;AACxB,QAAM,QAAgC,CAAC;AACvC,MAAI,kBAAkB;AAEtB,aAAW,WAAW,UAAU;AAC9B,UAAM,SAAS;AAAA,MACb,QAAQ;AAAA,MACR,QAAQ,cAAc,SAAS,UAAU;AAAA,MACzC,SAAS;AAAA,IACX;AACA,UAAM,gBAAgB,qBAAqB,YAAY,QAAQ,QAAQ,OAAO,QAAQ,GAAG;AACzF,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,UAAU;AAAA,IACrB;AAEA,eAAW,QAAQ,WAAW;AAC5B,YAAM,KAAK;AAAA,QACT,GAAG;AAAA,QACH,WAAW;AAAA,MACb,CAAC;AACD,yBAAmB;AAAA,IACrB;AAAA,EACF;AAGA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,KAAK;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,eAAe;AAAA,MACf,aAAa;AAAA,MACb,WAAW,YAAY;AAAA,MACvB,QAAQ;AAAA,QACN;AAAA,QACA,SAAS,UAAU;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,qBACP,QACA,OACA,KACwB;AACxB,SAAO,OAAO,OAAO,CAAC,UAAU,MAAM,KAAK,SAAS,MAAM,OAAO,GAAG;AACtE;AAEA,SAAS,sBACP,SACA,QACA,QACA,WAC2C;AAC3C,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,MACL;AAAA,QACE,cAAc,QAAQ;AAAA,QACtB,eAAe;AAAA,QACf,aAAa,QAAQ;AAAA,QACrB,WAAW,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAmD,CAAC;AAC1D,QAAM,eAAe,oBAAoB,MAAM;AAC/C,QAAM,gBAAgB,uBAAuB,MAAM;AACnD,QAAM,aAAa,KAAK,IAAI,GAAG,cAAc,MAAM;AACnD,MAAI,YAAY,QAAQ;AACxB,MAAI,eAAe;AACnB,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,MAAI,qBAAqB;AACzB,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,QAAM,WAAW,CAAC,cAA4B;AAC5C,UAAM,aAAa,KAAK,IAAI,WAAW,KAAK,IAAI,WAAW,QAAQ,GAAG,CAAC;AACvE,QAAI,eAAe,aAAa,MAAM,SAAS,GAAG;AAChD;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT,cAAc,QAAQ;AAAA,MACtB;AAAA,MACA,aAAa;AAAA,MACb,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AACD,qBAAiB;AACjB,gBAAY;AACZ,mBAAe;AACf,kBAAc;AACd,yBAAqB;AACrB,kBAAc,MAAM;AAAA,EACtB;AAEA,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,QAAQ,OAAO,KAAK;AAC1B,UAAM,eAAe,OAAO,QAAQ,CAAC,GAAG,QAAQ,QAAQ;AACxD,WAAO,MAAM;AACX,YAAM,cACJ,cAAc,KAAK,IAAI,aAAa,cAAc,SAAS,CAAC,CAAC,GAAG,SAChE,qBAAqB,MAAM;AAC7B,YAAM,aAAa,oBAAoB,OAAO,WAAW;AACzD,YAAM,qBACJ,MAAM,SAAS,eAAe,MAAM,WAChC,aAAa,oBAAoB,OAAO,QAAQ,CAAC,GAAG,WAAW,IAC/D;AACN,YAAM,aAAa,4BAA4B,OAAO,WAAW,aAAa,aAAa;AAC3F,YAAM,kBAAkB,eAAe,qBAAqB,qBAAqB;AAEjF,UAAI,MAAM,SAAS,eAAe,MAAM,mBAAmB,YAAY,MAAM,MAAM;AACjF,iBAAS,MAAM,IAAI;AACnB;AAAA,MACF;AACA,UAAI,kBAAkB,gBAAgB,YAAY,MAAM,MAAM;AAC5D,YAAI,cAAc,aAAa,GAAG;AAChC,yBAAe;AACf,yBAAe;AACf,+BAAqB;AACrB,wBAAc,MAAM;AACpB;AAAA,QACF;AACA,iBAAS,MAAM,IAAI;AACnB;AAAA,MACF;AAEA,YAAM,sBAAsB;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,sBAAgB;AAChB,4BAAsB;AACtB,yBAAmB,KAAK,EAAE,QAAQ,CAAC,YAAY,cAAc,IAAI,OAAO,CAAC;AAEzE,UAAI,eAAe,KAAK,GAAG;AACzB,YAAI,cAAc,aAAa,GAAG;AAChC,yBAAe;AACf,yBAAe;AACf,+BAAqB;AACrB,wBAAc,MAAM;AAAA,QACtB,OAAO;AACL,mBAAS,YAAY;AAAA,QACvB;AACA;AAAA,MACF;AAEA,UAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,iBAAS,QAAQ,GAAG;AAAA,MACtB;AACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAClB,QACA;AAAA,IACE;AAAA,MACE,cAAc,QAAQ;AAAA,MACtB,eAAe;AAAA,MACf,aAAa,QAAQ;AAAA,MACrB,WAAW,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACN;AAEA,SAAS,+BACP,UACA,OACA,UACA,aACA,eACA,aACyD;AACzD,MAAI,YAAY,SAAS,QAAQ;AAC/B,UAAM,kBAAkB,kBAAkB,OAAO,aAAa;AAC9D,WAAO;AAAA,MACL;AAAA,MACA,oBAAoB,MAAM,eAAe,GAAG,gBAAgB;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,YAAY,YAAY,SAAS,UAAU;AAClE,UAAM,UAAU,6BAA6B,UAAU,UAAU,WAAW;AAC5E,QAAI,SAAS;AACX,aAAO;AAAA,QACL,iBAAiB,6BAA6B,OAAO,QAAQ,KAAK;AAAA,QAClE,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,cAAc,YAAY,SAAS,WAAW;AACrE,UAAM,oBAAoB,0BAA0B,aAAa,WAAW;AAC5E,UAAM,kBAAkB,kBAAkB,OAAO,iBAAiB;AAClE,WAAO;AAAA,MACL;AAAA,MACA,oBACE,MAAM,eAAe,GAAG,gBACxB,qBAAqB,UAAU,iBAAiB;AAAA,IACpD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,EACtB;AACF;AAEA,SAAS,6BACP,OACA,cACQ;AACR,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,iBAAiB,YAAY;AAC1E,SAAO,SAAS,IAAI,QAAQ;AAC9B;AAEA,SAAS,4BACP,OACA,WACA,aACA,eACQ;AACR,MAAI,CAAC,aAAa,MAAM,SAAS,aAAa;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,cAAc;AAClB,aAAW,WAAW,mBAAmB,KAAK,GAAG;AAC/C,QAAI,cAAc,IAAI,OAAO,GAAG;AAC9B;AAAA,IACF;AAEA,UAAM,CAAC,UAAU,MAAM,IAAI,QAAQ,MAAM,GAAG;AAC5C,UAAM,iBACJ,aAAa,YAAY,UAAU,WAAW,UAAU;AAC1D,UAAM,OAAO,eAAe,MAAM;AAClC,mBAAe;AACf,QAAI,MAAM;AACR,qBAAe,KAAK,OAAO;AAAA,QACzB,CAAC,OAAO,UAAU,QAAQ,iCAAiC,OAAO,WAAW;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iCACP,OACA,aACQ;AACR,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,UACE,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,UAClD,UAAU,4BAA4B,MAAM,QAAQ;AAAA,QACtD;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAOA,0BAAyB,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM;AAAA,IAC/D;AACE,aAAOA;AAAA,EACX;AACF;AAEA,SAAS,4BACP,UACwB;AACxB,QAAM,WAAmC,CAAC;AAE1C,WAAS,QAAQ,CAAC,OAAO,UAAU;AACjC,QAAI,MAAM,SAAS,QAAQ;AACzB,eAAS,KAAK;AAAA,QACZ,WAAW,QAAQ,KAAK;AAAA,QACxB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,MAAM,KAAK,MAAM,IAAI,EAAE;AAAA,QAC3B,MAAM,MAAM;AAAA,MACd,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,OAAO;AACvD,eAAS,KAAK;AAAA,QACZ,WAAW,QAAQ,KAAK;AAAA,QACxB,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,mBACP,OACa;AACb,QAAM,QAAQ,oBAAI,IAAY;AAC9B,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO;AAAA,EACT;AAEA,aAAW,WAAW,MAAM,UAAU;AACpC,QAAI,QAAQ,SAAS,cAAc,QAAQ,QAAQ;AACjD,YAAM,IAAI,GAAG,QAAQ,QAAQ,IAAI,QAAQ,MAAM,EAAE;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAsC;AAC5D,SAAO,MAAM,SAAS,eAAe,MAAM,SAAS;AAAA,IAClD,CAAC,YACC,QAAQ,SAAS,mBACjB,QAAQ,UAAU;AAAA,EACtB;AACF;AAOA,IAAM,wBAAwB;AAE9B,SAAS,wBAAwB,SAAiC;AAChE,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,sBAAsB,KAAK,OAAO;AAChD,MAAI,OAAO;AACT,UAAM,QAAQ,SAAS,MAAM,CAAC,GAAI,EAAE;AACpC,WAAO,SAAS,KAAK,SAAS,IAAI,QAAQ;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,oBACP,UACA,aACA,UACA,OAC2B;AAC3B,QAAM,WAAsC,CAAC;AAE7C,aAAW,SAAS,YAAY,QAAQ;AACtC,QAAI,MAAM,SAAS,YAAa;AAGhC,UAAM,eAAe,MAAM;AAC3B,UAAM,aAAa,6BAA6B,UAAU,MAAM,OAAO;AACvE,UAAM,QACJ,iBAAiB,UAAa,gBAAgB,IAC1C,eAAe,IACf;AAEN,QAAI,UAAU,KAAM;AAEpB,UAAM,OAAO,qBAAqB,KAAK;AACvC,QAAI,CAAC,KAAK,KAAK,EAAG;AAElB,UAAM,SAAS,MAAM;AACrB,UAAM,YAAY,kBAAkB,OAAO,MAAM;AACjD,UAAM,eAAe,qBAAqB,UAAU,MAAM;AAE1D,aAAS,KAAK;AAAA,MACZ,WAAW,WAAW,MAAM,OAAO,IAAI,MAAM;AAAA,MAC7C;AAAA,MACA,MAAM,KAAK,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,6BACP,UACA,SACe;AACf,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI,iBAAqC;AACzC,SAAO,kBAAkB,CAAC,QAAQ,IAAI,cAAc,GAAG;AACrD,YAAQ,IAAI,cAAc;AAC1B,UAAM,QAEU,SAAS,OAAO,WAAW,cAAc;AACzD,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QACE,OAAO,MAAM,iBAAiB,YAC9B,MAAM,gBAAgB,KACtB,MAAM,gBAAgB,GACtB;AACA,aAAO,MAAM,eAAe;AAAA,IAC9B;AACA,qBAAiB,MAAM;AAAA,EACzB;AAEA,SAAO,wBAAwB,OAAO;AACxC;AAEA,SAAS,qBACP,OACQ;AACR,MAAI,OAAO;AACX,aAAW,WAAW,MAAM,UAAU;AACpC,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,gBAAQ,QAAQ;AAChB;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;;;ACngBO,SAAS,iBACd,MACA,aAAa,GACW;AACxB,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,aAAa,CAAC;AAC7C,QAAM,aAAa,MAAM,aAAa,KAAK;AAC3C,QAAM,SAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI;AAAA,EACvB;AACA,aAAW,OAAO,MAAM;AACxB,SAAO;AACT;AAEO,SAAS,6BACd,SACA,SAAS,GACD;AACR,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC;AAC9B,QAAM,mBAAmB,OAAO,KAC7B,MAAM,mBAAmB,OAAO,KAAK,KAAK;AAC7C,SAAO,MAAM,mBAAmB,OAAO;AACzC;AA2BA,SAAS,kBAAyC;AAChD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAuB,QAA+B;AACxE,QAAM,YAAY,CAAC;AACnB,QAAM,QAAQ,KAAK,MAAM;AACzB,QAAM,aAAa,MAAM,cAAc;AACvC,MAAI,MAAM,QAAQ,SAAS,YAAY;AACrC,UAAM,QAAQ,OAAO,GAAG,MAAM,QAAQ,SAAS,UAAU;AAAA,EAC3D;AACF;;;ArCkFO,SAAS,sBACd,SACiB;AACjB,QAAM,QAAQ,QAAQ,UAAU,OAAM,oBAAI,KAAK,GAAE,YAAY;AAC7D,QAAM,cAAc,QAAQ,eAAe;AAC3C,MAAI,kBAAkB,QAAQ;AAC9B,QAAM,YAAY,gBAAgB,QAAQ,YAAY,MAAM,CAAC;AAC7D,QAAM,YAAY,oBAAI,IAAgB;AACtC,QAAM,iBAAiB,oBAAI,IAA2C;AACtE,QAAM,UAAwB;AAAA,IAC5B,MAAM,CAAC;AAAA,IACP,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI,cAAiC;AACrC,QAAM,kBAAkB,oBAAI,IAAsC;AAClE,MAAI,YAAuB,gBAAgB,QAAQ,gBAAgB;AACnE,MAAI,qBACF,QAAQ,sBACR,QAAQ,qBAAqB,sBAC7B,QAAQ,iBAAiB,sBAAsB;AAAA,IAC/C,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,QAAQ,CAAC;AAAA,IACT,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,EACvB;AACA,MAAI,kBAA0C;AAC9C,MAAI,wBAAsD;AAC1D,QAAM,2BAA2B,QAAQ,sBACrC,wCAAwC,QAAQ,qBAAqB;AAAA,IACnE,SAAS,QAAQ,oBAAoB;AAAA,EACvC,CAAC,IACD,QAAQ;AAEZ,MAAI,QAAQ,kBAAkB;AAAA,IAC5B,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,IAClB,mBAAmB;AAAA,IACnB,mBAAmB,QAAQ;AAAA,IAC3B,YAAY,QAAQ;AAAA,EACtB,CAAC;AACD,kBAAgB,IAAI,eAAe,iBAAiB,GAAG,MAAM,SAAS;AACtE,MAAI;AAOJ,MAAI;AAQJ,MAAI;AAOJ,MAAI;AAOJ,MAAI;AAQJ,MAAI;AAQJ,MAAI;AAUJ,MAAI;AAYJ,MAAI;AAOJ,MAAI;AAUJ,WAAS,iBACP,UACA,iBACkC;AAClC,UAAM,iBAAiB,eAAe,eAAe;AACrD,QACE,iBACA,cAAc,kBAAkB,MAAM,iBACtC,cAAc,mBAAmB,gBACjC;AACA,aAAO,cAAc;AAAA,IACvB;AAEA,UAAM,WAAW,4BAA4B,UAAU,MAAM,WAAW,eAAe;AACvF,qBAAiB,kBAAkB;AACnC,iCAA6B,gCAAgC;AAC7D,oBAAgB;AAAA,MACd,eAAe,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,6BACP,WACwC;AACxC,QACE,uBACA,oBAAoB,kBAAkB,UAAU,iBAChD,oBAAoB,aAAa,UAAU,YAC3C,oBAAoB,eAAe,UAAU,YAC7C;AACA,aAAO,oBAAoB;AAAA,IAC7B;AAEA,UAAM,UAAU,2BAA2B,SAAS;AACpD,qBAAiB,wBAAwB;AACzC,iCAA6B,sCAAsC;AACnE,UAAM,SAAS;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB,oBAAoB,uBAAuB,OAAO;AAAA,MAClD,cAAc,QAAQ,SAAS;AAAA,MAC/B,YAAY,QAAQ,OAAO;AAAA,MAC3B,gBAAgB,QAAQ,eAAe;AAAA,QAAI,CAAC,UAC1C,kCAAkC,KAAK;AAAA,MACzC;AAAA,IACF;AACA,0BAAsB;AAAA,MACpB,eAAe,UAAU;AAAA,MACzB,UAAU,UAAU;AAAA,MACpB,YAAY,UAAU;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gCAAgC,WAAgD;AACvF,QACE,kBACA,eAAe,aAAa,UAAU,SAAS,OAAO,YACtD,eAAe,oBAAoB,UAAU,QAAQ,iBACrD;AACA,aAAO,eAAe;AAAA,IACxB;AAEA,UAAM,WAAW,+BAA+B,SAAS;AACzD,qBAAiB;AAAA,MACf,UAAU,UAAU,SAAS,OAAO;AAAA,MACpC,iBAAiB,UAAU,QAAQ;AAAA,MACnC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gCACP,WACA,UACwB;AACxB,QACE,wBACA,qBAAqB,cAAc,UAAU,SAAS,OAAO,aAC7D,qBAAqB,kBAAkB,UAAU,eACjD;AACA,aAAO,qBAAqB;AAAA,IAC9B;AAEA,UAAM,WAAW,+BAA+B,SAAS;AACzD,2BAAuB;AAAA,MACrB,WAAW,UAAU,SAAS,OAAO;AAAA,MACrC,eAAe,UAAU;AAAA,MACzB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,oCACP,WACA,iBAC4B;AAC5B,UAAM,iBAAiB,eAAe,eAAe;AACrD,QACE,oBACA,iBAAiB,kBAAkB,UAAU,iBAC7C,iBAAiB,mBAAmB,gBACpC;AACA,UAAI,iBAAiB,kBAAkB,UAAU,UAAU,MAAM;AAC/D,eAAO,iBAAiB;AAAA,MAC1B;AAEA,YAAMC,YAAW;AAAA,QACf,UAAU;AAAA,QACV,UAAU,UAAU;AAAA,QACpB;AAAA,MACF;AACA,UACEA,UAAS,oBAAoB,iBAAiB,SAAS,mBACvDA,UAAS,uBAAuB,iBAAiB,SAAS,oBAC1D;AACA,2BAAmB;AAAA,UACjB,eAAe,UAAU;AAAA,UACzB;AAAA,UACA,eAAe,UAAU,UAAU;AAAA,UACnC,UAAU,iBAAiB;AAAA,QAC7B;AACA,eAAO,iBAAiB;AAAA,MAC1B;AACA,yBAAmB;AAAA,QACjB,eAAe,UAAU;AAAA,QACzB;AAAA,QACA,eAAe,UAAU,UAAU;AAAA,QACnC,UAAAA;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAEA,UAAM,WAAW;AAAA,MACf,UAAU;AAAA,MACV,UAAU,UAAU;AAAA,MACpB;AAAA,IACF;AACA,qBAAiB,qBAAqB;AACtC,iCAA6B,mCAAmC;AAChE,uBAAmB;AAAA,MACjB,eAAe,UAAU;AAAA,MACzB;AAAA,MACA,eAAe,UAAU,UAAU;AAAA,MACnC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,oCACP,WACA,iBACiB;AACjB,QAAI,gBAAgB,SAAS,QAAQ;AACnC,aAAO,oCAAoC,WAAW,eAAe,EAAE;AAAA,IACzE;AAEA,QAAI,kBAAkB,mBAAmB,OAAO,gBAAgB,iBAAiB,UAAU;AACzF,aAAO,gBAAgB;AAAA,IACzB;AAEA,WAAO,eAAe,eAAe;AAAA,EACvC;AAEA,WAAS,4BACP,WACA,iBAC2B;AAC3B,UAAM,iBAAiB,eAAe,eAAe;AACrD,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AACA,QACE,oBACA,iBAAiB,kBAAkB,UAAU,iBAC7C,iBAAiB,mBAAmB,kBACpC,iBAAiB,uBAAuB,oBACxC;AACA,aAAO,iBAAiB;AAAA,IAC1B;AAEA,UAAM,WAAW,yBAAyB,WAAW,iBAAiB,eAAe;AACrF,uBAAmB;AAAA,MACjB,eAAe,UAAU;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,+BACP,WACA,aACgC;AAChC,UAAM,UAA0C,CAAC;AACjD,UAAM,kBAAkB;AAAA,MACtB,MAAM,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AAAA,MAC/C,IAAI,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AAAA,IAC/C;AACA,UAAM,iBAAiB,qBAAqB,eAAe;AAC3D,UAAM,eAAe,kCAAkC,cAAc;AAErE,QAAI,cAAc;AAChB,cAAQ,KAAK,YAAY;AAAA,IAC3B;AAEA,QAAI,MAAM,UAAU;AAClB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,UAAU,iBAAiB,WAAW;AACxC,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QACE,sBAAsB,oBAAoB,SAAS,GACnD;AACA,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,wBAAwB,yBAAyB,SAAS;AAEhE,QAAI,0BAA0B,gBAAgB,aAAa;AACzD,UACE,YAAY,SAAS,UACrB,gDAAgD,IAAI,WAAW,GAC/D;AACA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,UAAI,gCAAgC,IAAI,WAAW,GAAG;AACpD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,IAAI,WAAW;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,iBAAiB;AACnB,YAAM,gBAAgB,yBAAyB,SAAS;AAExD,UAAI,CAAC,iBAAiB,gBAAgB,OAAO,SAAS,GAAG;AACvD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH,WAAW,eAAe;AACxB,YAAI,cAAc,SAAS,WAAW;AACpC,gBAAM,mBACJ,aAAa,WAAW,UAAU,KAAK;AACzC,cAAI,CAAC,kBAAkB;AACrB,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,SAAS,UAAU,cAAc,SAAS,cAAc,OAAO;AAAA,cAC/D,SAAS,cAAc;AAAA,cACvB,YAAY,cAAc;AAAA,YAC5B,CAAC;AAAA,UACH;AAAA,QACF,WAAW,cAAc,SAAS,QAAQ;AACxC,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,SAAS,UAAU,cAAc,SAAS,cAAc,OAAO;AAAA,YAC/D,SAAS,cAAc;AAAA,YACvB,YAAY,cAAc;AAAA,UAC5B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBACP,WAC0C;AAC1C,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB;AAAA,MACtB,MAAM,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AAAA,MAC/C,IAAI,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AAAA,IAC/C;AACA,UAAM,eAAe,2BAA2B,eAAe;AAC/D,WAAO,aAAa,KAAK,CAAC,UAAU;AAClC,UAAI,MAAM,OAAO,SAAS,WAAY,QAAO;AAC7C,YAAM,YAAY,MAAM,OAAO,SAAS,UAAU,MAAM,OAAO,OAAO,MAAM,OAAO;AACnF,YAAM,UAAU,MAAM,OAAO,SAAS,UAAU,MAAM,OAAO,KAAK,MAAM,OAAO;AAC/E,aAAO,gBAAgB,QAAQ,aAAa,gBAAgB,MAAM;AAAA,IACpE,CAAC,KAAK;AAAA,EACR;AAEA,WAAS,yBACP,WACc;AACd,QAAI,UAAU,iBAAiB,WAAW;AACxC,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,yBAAyB,SAAS;AACxD,QAAI,eAAe,SAAS,WAAW;AACrC,aAAO;AAAA,IACT;AACA,WAAO,UAAU;AAAA,EACnB;AAEA,WAAS,qBACP,OAC8B;AAC9B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,IAAI,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,MAAM,OAAO;AAAA,IACtD;AAAA,EACF;AAEA,WAAS,kCACP,OACqC;AACrC,UAAM,iBAAiB,6BAA6B,WAAW;AAC/D,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,IACT;AACA,UAAM,YAAY;AAAA,MAChB,MAAM,SAAS;AAAA,MACf;AAAA,IACF,EAAE,OAAO,CAACC,cAAaA,UAAS,oBAAoB,cAAc;AAElE,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,2BAA2B,oBAAI,IAAI;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,wBACJ,UAAU;AAAA,MAAK,CAACA,cACd,yBAAyB,IAAI,uBAAuBA,SAAQ,EAAE,UAAU;AAAA,IAC1E,KAAK;AACP,UAAM,WAAW,yBAAyB,UAAU,CAAC;AACrD,UAAM,aAAa,uBAAuB,QAAQ;AAClD,UAAM,kBAAkB,0BAA0B;AAElD,WAAO;AAAA,MACL,MAAM,kBAAkB,4BAA4B;AAAA,MACpD,SAAS,kBACL,GAAG,WAAW,KAAK,oDACnB,GAAG,WAAW,KAAK;AAAA,MACvB,QAAQ;AAAA,QACN,kBAAkB,SAAS,eAAe,MAAM,SAAS,eAAe,IAAI;AAAA,UAC1E,OAAO;AAAA,UACP,KAAK;AAAA,QACP,CAAC;AAAA,MACH;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,WAAS,6BAA6B,aAA+C;AACnF,QAAI,YAAY,SAAS,QAAQ;AAC/B,aAAO;AAAA,IACT;AACA,QAAI,YAAY,SAAS,UAAU;AACjC,aAAO,MAAM,SAAS,UAAU,QAAQ;AAAA,QACtC,CAAC,WACC,OAAO,mBAAmB,YAAY,kBACnC,OAAO,YAAY,YAAY,WAC/B,OAAO,iBAAiB,YAAY;AAAA,MAC3C,GAAG,YAAY;AAAA,IACjB;AACA,QAAI,YAAY,SAAS,UAAU;AACjC,aAAO,MAAM,SAAS,UAAU,QAAQ;AAAA,QACtC,CAAC,WACC,OAAO,mBAAmB,YAAY,kBACnC,OAAO,YAAY,YAAY,WAC/B,OAAO,iBAAiB,YAAY;AAAA,MAC3C,GAAG,YAAY;AAAA,IACjB;AACA,QAAI,YAAY,SAAS,YAAY;AACnC,aAAO;AAAA,IACT;AACA,QAAI,YAAY,SAAS,WAAW;AAClC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAS,8BAA4D;AACnE,QAAI,CAAC,gBAAiB,QAAO;AAC7B,UAAM,iBAAiB,kCAAkC,EAAE;AAC3D,UAAM,aAAa,gBAAgB,mBAC/B,gBAAgB,WAAW;AAAA,MACzB,CAAC,SAAS,KAAK,eAAe,gBAAiB;AAAA,IACjD,IACA;AACJ,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,kBAAkB,gBAAgB,oBAAoB;AAAA,MACtD,gBAAgB;AAAA,MAChB,QAAQ,gBAAgB;AAAA,MACxB,YAAY,gBAAgB,cAAc,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,WAAS,+BAAuD;AAC9D,WAAO;AAAA,MACL,YAAY,uBAAuB,YAAY,UAAU;AAAA,MACzD,aAAa,gBAAgB,uBAAuB,eAAe,CAAC,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,WAAS,2BAA2B,SAAqD;AACvF,UAAM,mBAAmB,QAAQ,oBAAoB;AACrD,UAAM,yBACJ,qBAAqB,OACjB,OACA,IAAI;AAAA,MACF,QAAQ,WAAW,KAAK,CAAC,SAAS,KAAK,eAAe,gBAAgB,GAAG,YAAY,CAAC;AAAA,IACxF;AAEN,WAAO,QAAQ,OAAO,OAAO,CAAC,UAAU;AACtC,YAAM,mBAAmB,MAAM,eAAe;AAC9C,UAAI,CAAC,kBAAkB,kBAAkB,WAAW,GAAG;AACrD,eAAO;AAAA,MACT;AAEA,UAAI,qBAAqB,MAAM;AAC7B,eAAO;AAAA,MACT;AAEA,aACE,MAAM,eAAe,oBACrB,wBAAwB,IAAI,MAAM,OAAO,MAAM;AAAA,IAEnD,CAAC;AAAA,EACH;AAEA,WAAS,oCAA8D;AACrE,UAAM,iBAAiB,eAAe,WAAW;AACjD,QACE,kCACA,+BAA+B,kBAAkB,MAAM,iBACvD,+BAA+B,mBAAmB,kBAClD,+BAA+B,cAAc,MAAM,aACnD,+BAA+B,aAAa,MAAM,YAClD,+BAA+B,iBAAiB,UAAU,gBAC1D,+BAA+B,uBAAuB,sBACtD,+BAA+B,oBAAoB,iBACnD;AACA,aAAO,+BAA+B;AAAA,IACxC;AAEA,UAAM,iBAAiB,+BAA+B,MAAM,SAAS;AACrE,UAAM,gBAAgB,yBAAyB,MAAM,SAAS;AAC9D,UAAM,uBAAuB,eAAe,CAAC;AAC7C,UAAM,WAAqC;AAAA,MACzC,eAAe,uBAEX,qBAAqB,SAAS,0BAC1B,YACA,qBAAqB,SAAS,uBAC5B,SACA,YAEN,yBAAyB,MAAM,SAAS,MAAM,eAC5C,YACA,eAAe,QAAQ;AAAA,MAC7B,GAAI,eAAe,UAAU,EAAE,gBAAgB,cAAc,QAAQ,IAAI,CAAC;AAAA,MAC1E,GAAI,eAAe,OAAO,EAAE,kBAAkB,cAAc,KAAK,IAAI,CAAC;AAAA,MACtE,GAAI,uBAAuB,EAAE,gBAAgB,qBAAqB,QAAQ,IAAI,CAAC;AAAA,MAC/E;AAAA,IACF;AACA,qCAAiC;AAAA,MAC/B,eAAe,MAAM;AAAA,MACrB;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,cAAc,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,iCAA+D;AACtE,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,2BAA2B,kCAAkC;AACnE,QACE,+BACA,4BAA4B,oBAAoB,mBAChD,4BAA4B,6BAA6B,0BACzD;AACA,aAAO,4BAA4B;AAAA,IACrC;AAEA,UAAM,WAAW,4BAA4B;AAC7C,kCAA8B;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,kCAA0D;AACjE,UAAM,iBAAiB,eAAe,WAAW;AACjD,QACE,gCACA,6BAA6B,kBAAkB,MAAM,iBACrD,6BAA6B,mBAAmB,kBAChD,6BAA6B,uBAAuB,sBACpD,6BAA6B,iBAAiB,MAAM,SAAS,cAC7D;AACA,aAAO,6BAA6B;AAAA,IACtC;AAEA,UAAM,WAAW,8BAA8B;AAAA,MAC7C,gBAAgB;AAAA,MAChB,eAAe,mBAAmB,MAAM,QAAQ;AAAA,MAChD;AAAA,MACA,cAAc,MAAM,SAAS;AAAA,IAC/B,CAAC;AACD,mCAA+B;AAAA,MAC7B,eAAe,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA,cAAc,MAAM,SAAS;AAAA,MAC7B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,wBAA+C;AACtD,UAAM,UAAU,iBAAiB,MAAM,UAAU,WAAW;AAC5D,WAAO;AAAA,MACL,YAAY,MAAM;AAAA,MAClB,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,MACrB,SAAS,MAAM,UAAU;AAAA,MACzB,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,cAAc,UAAU;AAAA,MACxB,WAAW,0BAA0B,MAAM,WAAW,WAAW;AAAA,MACjE;AAAA,MACA,YAAY,4BAA4B,OAAO,WAAW,KAAK;AAAA,MAC/D,eAAe,sBAAsB,KAAK;AAAA,MAC1C,UAAU,gCAAgC,KAAK;AAAA,MAC/C,gBAAgB,gCAAgC,OAAO,OAAO;AAAA,MAC9D,eAAe,6BAA6B,KAAK;AAAA,MACjD,UAAU,MAAM,SAAS,IAAI,CAAC,YAAY,gBAAgB,OAAO,CAAC;AAAA,MAClE,YAAY,MAAM,aAAa,cAAc,MAAM,UAAU,IAAI;AAAA,MACjE,cAAc;AAAA,QACZ,SAAS,QAAQ,KAAK,SAAS;AAAA,QAC/B,SAAS,QAAQ,OAAO,SAAS;AAAA,QACjC,UAAU,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,6BAAsD;AAC7D,UAAM,iBAAiB,eAAe,WAAW;AACjD,UAAM,aAAa,qBAAqB;AACxC,QACE,2BACA,wBAAwB,kBAAkB,MAAM,iBAChD,wBAAwB,mBAAmB,kBAC3C,wBAAwB,cAAc,MAAM,aAC5C,wBAAwB,iBAAiB,aACzC,wBAAwB,eAAe,YACvC;AACA,aAAO,wBAAwB;AAAA,IACjC;AAEA,UAAM,UAAU,qBAAqB;AACrC,UAAM,cACJ,YAAY,SAAS,SACjB,UACA,iBAAiB,MAAM,UAAU,iBAAiB;AACxD,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,0BAA0B,MAAM,WAAW,WAAW;AAAA,MACtD;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,SAAS;AAAA,IACjB;AACA,8BAA0B;AAAA,MACxB,eAAe,MAAM;AAAA,MACrB;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,cAAc;AAAA,MACd;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,uBAAuB,sBAAsB;AAEjD,OAAK;AAAA,IACH,MAAM;AAAA,IACN,YAAY,MAAM;AAAA,IAClB,WAAW,MAAM;AAAA,IACjB,QACE,QAAQ,eACP,QAAQ,sBACL,YACA,QAAQ,kBACN,aACA;AAAA,IACR,OAAO,sBAAsB,KAAK;AAAA,IAClC,eAAe,4BAA4B,2BAA2B,KAAK,CAAC;AAAA,IAC5E,UAAU,qBAAqB;AAAA,IAC/B,gBAAgB,qBAAqB;AAAA,EACvC,CAAC;AACD,MAAI,QAAQ,YAAY;AACtB,SAAK;AAAA,MACH,MAAM;AAAA,MACN,YAAY,MAAM;AAAA,MAClB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,UAAU,UAAU;AAClB,gBAAU,IAAI,QAAQ;AACtB,aAAO,MAAM;AACX,kBAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,kBAAkB,UAAU;AAC1B,qBAAe,IAAI,QAAQ;AAC3B,aAAO,MAAM;AACX,uBAAe,OAAO,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,IACA,oBAAoB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,uBAAuB;AACrB,aAAO,MAAM;AAAA,IACf;AAAA,IACA,mBAAmB;AACjB,aAAO,MAAM;AAAA,IACf;AAAA,IACA,mBAAmB,SAAS,SAAS;AACnC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,SAAS,SAAS;AAChB,YAAM,mBAAmB,oBAAoB,SAAS,MAAM,SAAS;AACrE,UAAI,kBAAkB,OAAO,GAAG;AAC9B,cAAM,iBAAiB;AAAA,UACrB;AAAA,UACA,QAAQ;AAAA,QACV;AACA,YAAI,eAAe,SAAS,GAAG;AAC7B,eAAK;AAAA,YACH,MAAM;AAAA,YACN,YAAY,MAAM;AAAA,YAClB,SAAS,QAAQ;AAAA,YACjB,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,gBAAgB;AACnC,YAAI,UAAU,iBAAiB,UAAW;AAC1C,qBAAa,MAAM;AACnB;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,gBAAgB;AACnC,YAAI,UAAU,iBAAiB,UAAW;AAC1C,qBAAa,MAAM;AACnB;AAAA,MACF;AACA,UAAI;AACF,cAAM,cAAc,qBAAqB,OAAO,SAAS;AAAA,UACvD,WAAW,QAAQ,QAAQ,aAAa,MAAM;AAAA,UAC9C,cAAc,yBAAyB,gBAAgB;AAAA,UACvD,iBAAiB,mBAAmB;AAAA,QACtC,CAAC;AACD,eAAO,WAAW;AAAA,MACpB,SAAS,OAAO;AACd,kBAAU,eAAe,KAAK,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,IACA,OAAO;AACL,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,QAAQ,aAAa,WAAW,MAAM,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AACL,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,QAAQ,aAAa,WAAW,MAAM,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACA,QAAQ;AACN,kBAAY,WAAa,WAAW,IAAI;AACxC,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AACL,kBAAY,WAAa,WAAW,KAAK;AACzC,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB,UAAU;AAC3B,wBAAkB;AAAA,IACpB;AAAA,IACA,YAAY,MAAM,QAAQ;AACxB,UAAI;AACF,cAAM,YAAY,MAAM;AACxB;AAAA,UACE;AAAA,YACE,MAAM;AAAA,YACN;AAAA,YACA,QAAQ,aAAa,OAAO,SAAS;AAAA,UACvC;AAAA,UACA;AAAA,YACE,WAAW,SAAS,gCAAgC,MAAM,IAAI,MAAM;AAAA,YACpE,oBAAoB;AAAA,UACtB;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,kBAAU,eAAe,KAAK,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,IACA,4BAA4B,SAAS;AACnC,UAAI;AACF,sCAA8B,OAAO;AAAA,MACvC,SAAS,OAAO;AACd,kBAAU,eAAe,KAAK,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,IACA,WAAW,QAAQ;AACjB,UAAI,UAAU,iBAAiB,WAAW;AACxC,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,YAAM,YAAY,eAAe,WAAW,MAAM,SAAS,OAAO,UAAU,MAAM,CAAC;AACnF,YAAM,SAAS,OAAO,SAClB,2BAA2B,OAAO,MAAM,IACxC,MAAM,UAAU;AACpB,YAAM,YAAY,OAAO,SACrB,gCAAgC,OAAO,MAAM,IAC7C,MAAM;AACV,UAAI,CAAC,2BAA2B,MAAM,SAAS,SAAS,MAAM,GAAG;AAC/D,cAAM,UACJ;AACF,kBAAU;AAAA,UACR,SAAS,gBAAgB,kBAAkB,MAAM,CAAC;AAAA,UAClD,MAAM;AAAA,UACN,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AACD,cAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AACA,YAAM,WAAW,OAAO,YAAY,mBAAmB;AACvD,YAAM,YAAY,MAAM;AACxB,YAAM,UAAgC;AAAA,QACpC;AAAA,UACE,SAAS,GAAG,SAAS;AAAA,UACrB;AAAA,UACA,MAAM,OAAO,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AACA,YAAM,UAA+B;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,MAAM,OAAO,QAAQ;AAAA,QACrB;AAAA,QACA,QAAQ,OAAO,SAAS,aAAa,aAAa;AAAA,QAClD,YAAY,CAAC;AAAA,QACb,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,YAAY,WAAW;AACrB,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,eAAe,WAAW;AACxB,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,YAAY,mBAAmB;AAAA,QAC/B,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,cAAc,WAAW;AACvB,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,WAAW,MAAM,UAAU;AACzC,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,YAAY;AAAA,QACtB,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,WAAW,MAAM;AAC/B,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,aAAa,UAAU;AACrB,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,aAAa,UAAU;AACrB,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB;AACjB,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB;AACjB,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,UAAU,QAAQ;AAChB,YAAM,mBACJ,OAAO,SAAS,YAAY,OAAO,SAAS,WACxC;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA,qBAAqB,YAAY;AAAA,MACnC,KAAK,SACL;AACN,UAAI,kBAAkB,aAAa,gBAAgB,GAAG;AACpD,eAAO;AAAA,MACT;AACA,UAAI,CAAC,mBAAmB,OAAO,gBAAgB,GAAG;AAChD,eAAO;AAAA,MACT;AACA,wBAAkB,gBAAgB;AAClC,aAAO;AAAA,IACT;AAAA,IACA,aAAa;AACX,UAAI,YAAY,SAAS,QAAQ;AAC/B;AAAA,MACF;AACA,wBAAkB,iBAAiB;AAAA,IACrC;AAAA,IACA,iBAAiB;AACf,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AACb,aAAO,2BAA2B;AAAA,IACpC;AAAA,IACA,YAAY,MAAM;AAChB,kBAAY,YAAc,WAAW,IAAI;AACzC,6BAAuB,sBAAsB;AAC7C,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,gBAAgB,MAAM;AACpB,kBAAY,gBAAkB,WAAW,IAAI;AAC7C,6BAAuB,sBAAsB;AAC7C,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,wBAAwB;AACtB,aAAO,qBAAqB;AAAA,IAC9B;AAAA,IACA,iBAAiB,MAAM;AACrB,kBAAY,iBAAmB,WAAW,IAAI;AAC9C,6BAAuB,sBAAsB;AAC7C,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,OAAO;AACb,kBAAY,aAAe,WAAW,KAAK;AAC3C,6BAAuB,sBAAsB;AAC7C,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,wBAAwB;AACtB,aAAO,4BAA4B,OAAO,WAAW;AAAA,IACvD;AAAA,IACA,gCAAgC;AAC9B,aAAO,oCAAoC,OAAO,WAAW;AAAA,IAC/D;AAAA,IACA,mBAAmB;AACjB,aAAO,mBAAmB,MAAM,QAAQ;AAAA,IAC1C;AAAA,IACA,aAAaC,UAAmD;AAC9D,YAAM,YAAY;AAAA,QAChB,MAAM;AAAA,QACN,MAAM,UAAU;AAAA,QAChB;AAAA,QACAA;AAAA,MACF;AACA,UAAI,UAAU,SAAS;AACrB,aAAK,SAAS;AAAA,UACZ,MAAM;AAAA,UACN,UAAU,UAAU;AAAA,UACpB,SAAS,mBAAmB;AAAA,UAC5B,qBAAqB,UAAU;AAAA,UAC/B,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,QACrC,CAAC;AAAA,MACH;AACA,YAAM,WAAW,mBAAmB,UAAU,QAAQ;AACtD,aAAO;AAAA,QACL,YAAY,SAAS;AAAA,QACrB,cAAc,UAAU;AAAA,QACxB,mBAAmB,SAAS;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,sBAAsBA,UAA+C;AACnE,YAAM,YAAY;AAAA,QAChB,MAAM;AAAA,QACN,MAAM,UAAU;AAAA,QAChB;AAAA,QACAA;AAAA,MACF;AACA,UAAI,UAAU,SAAS;AACrB,aAAK,SAAS;AAAA,UACZ,MAAM;AAAA,UACN,UAAU,UAAU;AAAA,UACpB,SAAS,mBAAmB;AAAA,UAC5B,qBAAqB,UAAU;AAAA,UAC/B,QAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,QACrC,CAAC;AAAA,MACH;AACA,aAAO,UAAU;AAAA,IACnB;AAAA,IACA,kBAAkB;AAChB,YAAM,gBAAgB,2BAA2B,KAAK;AACtD,aAAO;AAAA,QACLC,+BAA8B,OAAO;AAAA,UACnC;AAAA,UACA,SAAS,MAAM;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,uBAAuB;AACrB,aAAO,wCAAwC,KAAK,gBAAgB,GAAG;AAAA,QACrE,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,IACA,yBAAyB;AACvB,aAAO,4BAA4B,2BAA2B,KAAK,CAAC;AAAA,IACtE;AAAA,IACA,cAAc;AACZ,aAAO,MAAM,SAAS,IAAI,CAAC,YAAY,gBAAgB,OAAO,CAAC;AAAA,IACjE;AAAA,IACA,MAAM,WAAW,eAAe;AAC9B,UAAI,CAAC,QAAQ,YAAY;AACvB,cAAM,QAA6B;AAAA,UACjC,SAAS,eAAe,SAAS,CAAC,GAAG,MAAM,CAAC;AAAA,UAC5C,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,kBAAkB,iBAAiB,CAAC;AAAA,UACtC;AAAA,QACF;AACA,kBAAU,KAAK;AACf,cAAM,IAAI,MAAM,MAAM,OAAO;AAAA,MAC/B;AAEA,YAAM,SAAS,MAAM,QAAQ,WAAW,KAAK,gBAAgB,GAAG,aAAa;AAE7E,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,mBAAmB,SAAS;AAC1B,wBAAkB,gBAAgB,OAAO;AACzC,6BAAuB,sBAAsB;AAC7C,YAAM,WAAW,4BAA4B;AAC7C,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB;AAAA,MACF,CAAC;AACD,UAAI,gBAAgB,qBAAqB,QAAW;AAClD,aAAK;AAAA,UACH,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,kBAAkB,gBAAgB,oBAAoB;AAAA,QACxD,CAAC;AAAA,MACH;AACA,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,uBAAuB;AACrB,wBAAkB;AAClB,6BAAuB,sBAAsB;AAC7C,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,kBAAkB;AAAA,MACpB,CAAC;AACD,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,UAAU;AAAA,UACR,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,QAAQ,CAAC;AAAA,UACT,YAAY,CAAC;AAAA,UACb,gBAAgB,CAAC;AAAA,QACnB;AAAA,MACF,CAAC;AACD,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,2BAA2B;AACzB,aAAO,+BAA+B;AAAA,IACxC;AAAA,IACA,8BAA8B;AAC5B,aAAO,kCAAkC;AAAA,IAC3C;AAAA,IACA,4BAA4B;AAC1B,aAAO,gCAAgC;AAAA,IACzC;AAAA,IACA,yBAAyB,SAAS;AAChC,8BAAwB,gBAAgB,OAAO;AAC/C,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,UAAU,6BAA6B;AAAA,MACzC,CAAC;AACD,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,6BAA6B;AAC3B,8BAAwB;AACxB,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,UAAU,6BAA6B;AAAA,MACzC,CAAC;AACD,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,4BAA4B;AAC1B,aAAO,6BAA6B;AAAA,IACtC;AAAA,IACA,2BAA2BD,UAAS;AAClC,aAAO,wCAAwC,KAAK,0BAA0B,GAAGA,QAAO;AAAA,IAC1F;AAAA,IACA,0BAA0B,UAAU,MAAM;AACxC,YAAM,SAAS,KACZ,0BAA0B,EAC1B,MAAM,KAAK,CAAC,SAAS,KAAK,aAAa,QAAQ;AAClD,UAAI,CAAC,UAAU,OAAO,OAAO,SAAS,YAAY;AAChD;AAAA,MACF;AACA,YAAM,cAAc,OAAO,eAAe;AAC1C,UAAI,CAAC,kBAAkB,aAAa,WAAW,GAAG;AAChD,YAAI,YAAY,SAAS,QAAQ;AAC/B,eAAK,WAAW;AAAA,QAClB,WAAW,CAAC,KAAK,UAAU,WAAW,GAAG;AACvC;AAAA,QACF;AAAA,MACF;AACA,WAAK,YAAY,MAAM,OAAO,MAAM;AAAA,IACtC;AAAA,EACF;AAEA,WAAS,aAAa,WAAkC;AACtD,UAAM,SAAS,cAAc,SAAS,QAAQ,OAAO,QAAQ;AAC7D,UAAM,SAAS,OAAO,IAAI;AAE1B,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,cAAc,cAAc,SAAS,QAAQ,SAAS,QAAQ;AACpE,gBAAY,KAAK,KAAK;AAEtB,UAAM,WAAW;AAGjB,YAAQ,cAAc,QAAQ,MAAM,MAAM,GAAG,SAAS,QAAQ;AAC9D,oBAAgB,IAAI,eAAe,WAAW,GAAG,MAAM,SAAS;AAChE,2BAAuB,sBAAsB;AAC7C,WAAO,UAAU,OAAO;AAAA,MACtB,WAAW;AAAA,MACX,SAAS,EAAE,OAAO,CAAC,EAAE;AAAA,MACrB,SAAS;AAAA,QACP,eAAe,CAAC;AAAA,QAChB,iBAAiB,CAAC;AAAA,MACpB;AAAA,MACA,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,WAAS,OAAO,aAAsC;AACpD,UAAM,WAAW;AAEjB,QAAI,YAAY,oBAAoB,QAAQ;AAC1C,cAAQ,KAAK,KAAK,KAAK;AACvB,cAAQ,SAAS,CAAC;AAAA,IACpB;AAEA,yBAAqB,wBAAwB,oBAAoB,YAAY,OAAO;AACpF,YAAQ,cAAc,YAAY,WAAW,YAAY,WAAW,MAAM,CAAC;AAC3E,oBAAgB,IAAI,eAAe,WAAW,GAAG,MAAM,SAAS;AAChE,2BAAuB,sBAAsB;AAC7C,WAAO,UAAU,OAAO,WAAW;AAAA,EACrC;AAEA,WAAS,OACP,UACA,MACA,aACM;AACN,QAAI,SAAS,YAAY,KAAK,SAAS;AACrC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,QAAI,iBAAiB,SAAS,WAAW,KAAK,SAAS,GAAG;AACxD,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,WAAW,0BAA0B,KAAK,WAAW,WAAW;AAAA,MAClE,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,QAAQ,cAAc;AACpC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,WAAW,YAAY,QAAQ,aAAa;AAAA,QAC5C,QAAQ,yBAAyB,YAAY,QAAQ,aAAa,MAAM;AAAA,MAC1E,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,QAAQ,iBAAiB;AACvC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,WAAW,YAAY,QAAQ,gBAAgB;AAAA,MACjD,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,QAAQ,gBAAgB;AACtC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,UAAU,YAAY,QAAQ,eAAe;AAAA,MAC/C,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,QAAQ,gBAAgB;AACtC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,UAAU,YAAY,QAAQ,eAAe;AAAA,MAC/C,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,QAAQ,kBAAkB;AACxC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,UAAU,YAAY,QAAQ,iBAAiB;AAAA,QAC/C,MAAM,YAAY,QAAQ,iBAAiB;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,QAAQ,gBAAgB;AACtC,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,SAAS,YAAY,QAAQ,eAAe;AAAA,QAC5C,SAAS,CAAC;AAAA,UACR,MAAM,YAAY,QAAQ,eAAe;AAAA,UACzC,SAAS,YAAY,QAAQ,eAAe;AAAA,QAC9C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,eAAW,WAAW,YAAY,QAAQ,eAAe;AACvD,YAAM,gBAAgB,gBAAgB,OAAO;AAC7C,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,SAAS;AAAA,MACX,CAAC;AACD,cAAQ,YAAY,aAAa;AAAA,IACnC;AAEA,eAAW,WAAW,YAAY,QAAQ,iBAAiB;AACzD,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,eAAW,YAAY,WAAW;AAChC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,WAAS,8BACP,SACAA,WAGI,CAAC,GACC;AACN,UAAM,YAAYA,SAAQ,aAAa,MAAM;AAC7C,UAAM,iBAAiB,+BAA+B,WAAW,QAAQ,IAAI;AAC7E,QAAI,eAAe,SAAS,GAAG;AAC7B,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,SAASA,SAAQ,sBAAsB,QAAQ;AAAA,QAC/C,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,QAAQ,aAAa,MAAM;AACrD,UAAM,UAAU;AAAA,MACd;AAAA,MACA,cAAc,yBAAyB,SAAS;AAAA,MAChD,iBAAiB,mBAAmB;AAAA,IACtC;AACA,UAAM,YAAY,cAAc,MAAM,YAClC,QACA;AAAA,MACE,GAAG;AAAA,MACH;AAAA,IACF;AAEJ,QAAI,YAAY,SAAS,QAAQ;AAC/B,aAAO,qBAAqB,WAAW,SAAS,OAAO,CAAC;AACxD;AAAA,IACF;AAEA,UAAM,aAAa,kBAAkB;AAAA,MACnC,YAAY,MAAM;AAAA,MAClB;AAAA,MACA,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,mBAAmB;AAAA,QACjB,GAAG,MAAM;AAAA,QACT,SAAS;AAAA,UACP,MAAM;AAAA,UACN,UAAU,CAAC,GAAG,eAAe,MAAM,UAAU,WAAW,CAAC;AAAA,QAC3D;AAAA,QACA,QAAQ,qCAAqC,MAAM,SAAS,QAAQ,WAAW;AAAA,MACjF;AAAA,MACA,eAAe,MAAM;AAAA,MACrB,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,eAAW,YAAY;AACvB,UAAM,mBAAmB,qBAAqB,YAAY,SAAS,OAAO;AAE1E,QAAI,CAAC,iBAAiB,WAAW;AAC/B,aAAO,OAAO,OAAO;AAAA,QACnB,WAAW;AAAA,QACX,SAAS,mBAAmB;AAAA,QAC5B,SAAS,iBAAiB;AAAA,QAC1B,iBAAiB;AAAA,QACjB,WAAW;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN;AAAA,MACA,iBAAiB,UAAU,SAAS,QAAQ;AAAA,IAC9C;AACA,UAAM,yBAAyB;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,MAAM,SAAS;AAAA,QACf,iBAAiB,UAAU,SAAS;AAAA,QACpC,iBAAiB;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AACA,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW,iBAAiB,UAAU;AAAA,QACtC,SAAS,mBAAmB;AAAA,QAC5B,qBAAqB;AAAA,QACrB,QAAQ,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,wBAAwB,gBAAgB,SAAS,iBAAiB,OAAO;AAAA,IACpF,CAAC;AAAA,EACH;AAEA,WAAS,wBACP,MACA,OAC8B;AAC9B,WAAO;AAAA,MACL,eAAe,CAAC,GAAG,KAAK,eAAe,GAAG,MAAM,aAAa;AAAA,MAC7D,iBAAiB,CAAC,GAAG,KAAK,iBAAiB,GAAG,MAAM,eAAe;AAAA,MACnE,cAAc,KAAK,gBAAgB,MAAM;AAAA,MACzC,iBAAiB,KAAK,mBAAmB,MAAM;AAAA,MAC/C,iBAAiB,KAAK,mBAAmB,MAAM;AAAA,MAC/C,mBAAmB,KAAK,qBAAqB,MAAM;AAAA,MACnD,mBAAmB,KAAK,qBAAqB,MAAM;AAAA,MACnD,gBAAgB,KAAK,kBAAkB,MAAM;AAAA,MAC7C,gBAAgB,KAAK,kBAAkB,MAAM;AAAA,MAC7C,kBAAkB,KAAK,oBAAoB,MAAM;AAAA,MACjD,gBAAgB,KAAK,kBAAkB,MAAM;AAAA,IAC/C;AAAA,EACF;AAEA,WAAS,+BACP,eACA,aACA,SACA,aACmC;AACnC,UAAM,aAAgD;AAAA,MACpD,UAAU,EAAE,GAAG,cAAc,SAAS;AAAA,MACtC,WAAW,EAAE,GAAG,cAAc,UAAU;AAAA,IAC1C;AAEA,UAAM,0BAA0B,OAAO,OAAO,cAAc,SAAS,EAClE,OAAO,CAAC,aAAa,kBAAkB,uBAAuB,QAAQ,GAAG,WAAW,CAAC,EACrF,IAAI,CAAC,aAAa,SAAS,QAAQ;AACtC,eAAW,cAAc,yBAAyB;AAChD,aAAO,WAAW,UAAU,UAAU;AAAA,IACxC;AACA,eAAW,YAAY,OAAO,OAAO,YAAY,SAAS,GAAG;AAC3D,iBAAW,UAAU,SAAS,QAAQ,IAAI;AAAA,QACxC,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,aAAa,gCAAgC,WAAW;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,cAAc;AACxB,YAAM,YAAY,QAAQ,aAAa;AACvC,YAAM,UAAU,YAAY,SAAS,SAAS;AAC9C,UAAI,SAAS;AACX,mBAAW,SAAS,SAAS,IAAI;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,KAAK,OAAmC;AAC/C,YAAQ,UAAU,KAAK;AACvB,eAAW,YAAY,gBAAgB;AACrC,eAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,WAAS,UAAU,OAAkC;AACnD,UAAM,YAAyB;AAAA,MAC7B,GAAG;AAAA,MACH,OAAO,MAAM,UAAU,UAAU,MAAM;AAAA,MACvC,YAAY,MAAM,UAAU,QAAQ,MAAM;AAAA,IAC5C;AACA,YAAQ;AACR,oBAAgB,IAAI,eAAe,WAAW,GAAG,MAAM,SAAS;AAChE,2BAAuB,sBAAsB;AAC7C,UAAM,cAAc,cAAc,KAAK;AACvC,YAAQ,UAAU,WAAW;AAC7B,SAAK;AAAA,MACH,MAAM;AAAA,MACN,YAAY,MAAM;AAAA,MAClB,OAAO;AAAA,IACT,CAAC;AACD,eAAW,YAAY,WAAW;AAChC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,WAAS,kBAAkB,QAAiC;AAC1D,UAAM,gBAAgB;AACtB,UAAM,oBAAoB,MAAM;AAChC,oBAAgB,IAAI,eAAe,aAAa,GAAG,iBAAiB;AAEpE,UAAM,oBACJ,gBAAgB,IAAI,eAAe,MAAM,CAAC,KAAK,wBAAwB,GAAG,CAAC;AAC7E,kBAAc;AACd,YAAQ;AAAA,MACN,GAAG;AAAA,MACH,WAAW;AAAA,IACb;AACA,oBAAgB,IAAI,eAAe,MAAM,GAAG,iBAAiB;AAC7D,2BAAuB,sBAAsB;AAE7C,QAAI,iBAAiB,mBAAmB,iBAAiB,GAAG;AAC1D,WAAK;AAAA,QACH,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,WAAW,0BAA0B,mBAAmB,WAAW;AAAA,MACrE,CAAC;AAAA,IACH;AAEA,SAAK;AAAA,MACH,MAAM;AAAA,MACN,YAAY,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AACD,eAAW,YAAY,WAAW;AAChC,eAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,YAAoB,WAA2B;AACtE,SAAO,WAAW,UAAU,IAAI,UAAU,QAAQ,YAAY,EAAE,CAAC;AACnE;AAEA,SAAS,aACP,QACA,WACe;AACf,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eACP,QACA,UACA,WACQ;AACR,MAAI,UAAU,OAAO,KAAK,QAAQ,EAAE;AACpC,MAAI,SAAS,GAAG,MAAM,IAAI,UAAU,QAAQ,YAAY,EAAE,CAAC,IAAI,OAAO;AAEtE,SAAO,SAAS,MAAM,GAAG;AACvB,eAAW;AACX,aAAS,GAAG,MAAM,IAAI,UAAU,QAAQ,YAAY,EAAE,CAAC,IAAI,OAAO;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,cACP,OACA,WACA,WACA,cACa;AAIb,QAAM,WAAW,aAAa,gBAAgB,MAAM,YAAY,IAAI,MAAM;AAE1E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,MACR,GAAG,MAAM;AAAA,MACT,WAAW,YAAY,YAAY,MAAM,SAAS;AAAA,IACpD;AAAA,IACA,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,eAAe,GAAG,MAAM,SAAS,IAAI,QAAQ;AAAA,IAC7C,SAAS,MAAM,WAAW;AAAA,EAC5B;AACF;AAEA,SAAS,eAAe,OAAqC;AAC3D,MAAI,OAAO,UAAU,YAAY,SAAS,aAAa,OAAO;AAC5D,WAAO;AAAA,MACL,SAAS,gBAAgB,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,MAClE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,OAAQ,MAAgC,WAAW,eAAe;AAAA,MAC3E,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,gBAAgB,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,IAClE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,sBAAsB,OAAsC;AACnE,QAAM,QAAQ,oBAAoB,KAAK;AACvC,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,eAAe,MAAM;AAAA,IACrB,qBAAqB,qBAAqB,MAAM,SAAS,aAAa,eAAe;AAAA,EACvF;AACF;AAEA,SAAS,0BACP,WACA,aACmB;AACnB,SAAO;AAAA,IACL,QAAQ,UAAU;AAAA,IAClB,MAAM,UAAU;AAAA,IAChB,aAAa,UAAU;AAAA,IACvB,aAAa,yBAAyB,UAAU,WAAW;AAAA,IAC3D,GAAI,eAAe,YAAY,SAAS,SAAS,EAAE,YAAY,IAAI,CAAC;AAAA,EACtE;AACF;AAEA,SAAS,yBACP,QACwB;AACxB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO,MAAM;AAAA,QACnB,IAAI,OAAO,MAAM;AAAA,QACjB,OAAO,OAAO;AAAA,MAChB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,OAAO;AAAA,QACX,OAAO,OAAO;AAAA,MAChB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB,OAAO;AAAA,QACvB,QAAQ,OAAO;AAAA,MACjB;AAAA,EACJ;AACF;AAEA,SAAS,2BACP,QACgC;AAChC,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,kBAAkB,OAAO,MAAM,OAAO,IAAI,OAAO,KAAK;AAAA,IAC/D,KAAK;AACH,aAAO,iBAAiB,OAAO,IAAI,OAAO,KAAK;AAAA,IACjD,KAAK;AACH,aAAO,qBAAqB,OAAO,gBAAgB,OAAO,MAAM;AAAA,EACpE;AACF;AAEA,SAAS,gCACP,QAC2D;AAC3D,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,wBAAwB,OAAO,MAAM,OAAO,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,wBAAwB,OAAO,IAAI,OAAO,EAAE;AAAA,IACrD,KAAK;AACH,aAAO;AAAA,QACL,OAAO,eAAe;AAAA,QACtB,OAAO,eAAe;AAAA,MACxB;AAAA,EACJ;AACF;AAEA,SAAS,4BACP,QACqB;AACrB,SAAO;AAAA,IACL,eAAe,OAAO;AAAA,IACtB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,gBAAgB,OAAO,eAAe;AAAA,MAAI,CAAC,UACzC,kCAAkC,KAAK;AAAA,IACzC;AAAA,IACA,UAAU,OAAO,SAAS,IAAI,CAAC,YAAY,gBAAgB,OAAO,CAAC;AAAA,IACnE,QAAQ,OAAO,OAAO,IAAI,CAAC,UAAU,cAAc,KAAK,CAAC;AAAA,EAC3D;AACF;AAEA,SAAS,kCACP,OACA;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,MAAM,iBAClB,yBAAyB,MAAM,cAAc,IAC7C;AAAA,EACN;AACF;AAEA,SAAS,gBAAgB,SAA+C;AACtE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,QAAQ,iBACpB,yBAAyB,QAAQ,cAAc,IAC/C;AAAA,EACN;AACF;AAEA,SAAS,cAAc,OAAyC;AAC9D,SAAO,EAAE,GAAG,MAAM;AACpB;AAEA,SAAS,qBAAqB,iBAAkD;AAC9E,SAAO,OAAO,KAAK,eAAe,EAAE;AACtC;AAEA,SAAS,2BAA2B,OAAiD;AACnF,QAAM,UAAU,yBAAyB;AAAA,IACvC,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,YAAY,MAAM;AAAA,IAClB,aAAa,MAAM,SAAS;AAAA,EAC9B,CAAC;AAED,SAAO,0BAA0B,CAAC,MAAM,eAAwB,OAAgB,GAAG;AAAA,IACjF,aAAa,MAAM,SAAS;AAAA,IAC5B,aAAa,MAAM,cAAc,eAAe,QAAQ;AAAA,EAC1D,CAAC;AACH;AAEA,SAAS,+BACP,OACwB;AACxB,QAAM,aAAa;AAAA,IACjB,sCAAsC,MAAM,SAAS,OAAO,QAAQ;AAAA,IACpE,MAAM,QAAQ;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,iBAAiB,MAAM,QAAQ;AAAA,IAC/B,gBAAgB,WAAW;AAAA,IAC3B,oBAAoB,WAAW;AAAA,IAC/B,oBAAoB,WAAW;AAAA,IAC/B,YAAY,WAAW;AAAA,IACvB,SAAS,WAAW,QAAQ,IAAI,CAAC,WAAyC;AACxE,YAAM,eAAe,MAAM,SAAS,OAAO,SAAS,OAAO,SAAS;AACpE,YAAM,mBACJ,cAAc,SAAS,IAAI,CAAC,WAAW;AAAA,QACrC,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM;AAAA,MACnB,EAAE,MACD,cAAc,OACX;AAAA,QACE;AAAA,UACE,SAAS,GAAG,OAAO,SAAS;AAAA,UAC5B,UACE,aAAa,YAAY,aAAa,aAAa;AAAA,UACrD,MAAM,aAAa;AAAA,UACnB,WAAW,aAAa;AAAA,QAC1B;AAAA,MACF,IACA,CAAC;AAEP,aAAO;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,QACf,QAAQ;AAAA,UACN,cAAc,UACZ,qBAAqB,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,iBAAiB;AAAA,QAC9D;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,YAAY,OAAO;AAAA,QACnB,WAAW,OAAO;AAAA,QAClB,WAAW,OAAO;AAAA,QAClB,cAAc,OAAO;AAAA,QACrB,aAAa,OAAO;AAAA,QACpB,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,YAAY,OAAO;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,+BACP,OACwB;AACxB,QAAM,aAAa;AAAA,IACjB,gCAAgC,KAAK;AAAA,EACvC;AACA,QAAM,sBAAsB,oBAAI,IAAoB;AAEpD,SAAO;AAAA,IACL,kBAAkB,WAAW;AAAA,IAC7B,mBAAmB,WAAW;AAAA,IAC9B,mBAAmB,WAAW;AAAA,IAC9B,mBAAmB,WAAW;AAAA,IAC9B,qBAAqB,WAAW;AAAA,IAChC,uBAAuB,WAAW;AAAA,IAClC,YAAY,WAAW;AAAA,IACvB,WAAW,WAAW,UAAU,IAAI,CAAC,aAAyC;AAC5E,YAAM,iBAAiB,MAAM,SAAS,OAAO,UAAU,SAAS,UAAU;AAC1E,YAAM,cAAc,uBAAuB,cAAc;AACzD,YAAM,UAAU;AAAA,QACd;AAAA,QACA,gBAAgB,UACd,qBAAqB,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,iBAAiB;AAAA,QAC5D,kBAAkB,MAAM,UAAU,aAAa,mBAAmB;AAAA,MACpE;AAEA,aAAO;AAAA,QACL,YAAY,SAAS;AAAA,QACrB,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,QAAQ,SAAS;AAAA,QACjB,eAAe,SAAS;AAAA,QACxB;AAAA,QACA,QAAQ;AAAA,UACN,gBAAgB,UACd,qBAAqB,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,iBAAiB;AAAA,QAC9D;AAAA,QACA,aAAa,SAAS;AAAA,QACtB,WAAW,SAAS;AAAA,QACpB,UAAU,SAAS;AAAA,QACnB,cAAc,SAAS;AAAA,QACvB,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB,sBAAsB,gBAAgB,UAAU;AAAA,QAChD,oBAAoB,SAAS;AAAA,QAC7B,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gCACP,OACe;AACf,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW,OAAO;AAAA,MAChB,OAAO,OAAO,MAAM,SAAS,OAAO,SAAS,EAAE,IAAI,CAAC,aAAa;AAAA,QAC/D,SAAS;AAAA,QACT;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,MAAM,SAAS;AAAA,UACf,QAAQ,SAAS;AAAA,UACjB,UAAU,SAAS,YAAY;AAAA,UAC/B,WAAW,SAAS;AAAA,UACpB,QACE,SAAS,WAAW,SAChB,WACA,SAAS;AAAA,UACf,YAAY,CAAC,GAAI,SAAS,cAAc,CAAC,CAAE;AAAA,UAC3C,UAAU;AAAA,YACR,QAAQ,SAAS,UAAU,UAAU;AAAA,YACrC,aAAa,SAAS,UAAU;AAAA,YAChC,oBAAoB,SAAS,UAAU;AAAA,YACvC,sBAAsB,SAAS,UAAU;AAAA,YACzC,sBAAsB,SAAS,UAAU;AAAA,YACzC,iBAAiB,SAAS,UAAU;AAAA,UACtC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,uBACP,UACmB;AACnB,QAAM,cAAc,UAAU,UAAU;AACxC,SAAO,cAAc,EAAE,GAAG,YAAY,IAAI;AAC5C;AAEA,SAAS,qCACP,QACA,aACmC;AACnC,SAAO;AAAA,IACL,UAAU,CAAC;AAAA,IACX,WAAW,OAAO;AAAA,MAChB,OAAO,OAAO,OAAO,SAAS,EAC3B,OAAO,CAAC,aAAa,kBAAkB,uBAAuB,QAAQ,GAAG,WAAW,CAAC,EACrF,IAAI,CAAC,aAAa;AAAA,QACjB,SAAS;AAAA,QACT;AAAA,UACE,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,SAAS;AAAA,YACZ,aAAa,gCAAgC,WAAW;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF;AACF;AAEA,SAAS,kBACP,UACA,aACA,OACQ;AACR,QAAM,MAAM,eAAe,WAAW;AACtC,QAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,wBAAwB,GAAG,CAAC;AAAA,IAC5B;AAAA,EACF,EAAE;AACF,QAAM,IAAI,KAAK,SAAS;AACxB,SAAO;AACT;AAEA,SAAS,gCACP,aAC6G;AAC7G,SAAO,EAAE,GAAG,YAAY;AAC1B;AAEA,SAAS,uBACP,QACU;AACV,SAAO;AAAA,IACL,GAAG,OAAO,eACP,OAAO,CAAC,UAAU,MAAM,iBAAiB,mBAAmB,EAC5D,IAAI,CAAC,UAAU,MAAM,OAAO;AAAA,IAC/B,GAAG,OAAO,OACP,OAAO,CAAC,UAAU,MAAM,OAAO,EAC/B,IAAI,CAAC,UAAU,MAAM,OAAO;AAAA,EACjC;AACF;AAEA,SAAS,wBACP,UACA,QACA,WACqC;AACrC,QAAM,EAAE,MAAM,GAAG,IAAI,eAAe,MAAM;AAC1C,QAAM,UAAU,yBAAyB,WAAW,MAAM,IAAI,SAAS,KAAK;AAE5E,MAAI,SAAS,kBAAkB,iBAAiB;AAC9C,WAAO;AAAA,MACL;AAAA,MACA,QACE,SAAS,sBACT;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,YAAY;AAClC,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,YAAY;AAClC,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QACE,SAAS,SAAS,aACd,4EACA;AAAA,EACR;AACF;AAEA,SAAS,eAAe,QAAsE;AAC5F,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,QACL,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE;AAAA,QACjD,IAAI,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE;AAAA,MACjD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,IAAI,OAAO,KAAK;AAAA,MAClB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,KAAK,IAAI,OAAO,eAAe,MAAM,OAAO,eAAe,EAAE;AAAA,QACnE,IAAI,KAAK,IAAI,OAAO,eAAe,MAAM,OAAO,eAAe,EAAE;AAAA,MACnE;AAAA,EACJ;AACF;AAEA,SAAS,yBACP,WACA,MACA,IACA,UACQ;AACR,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,UAAU,MAAM,CAAC;AACnE,QAAM,eAAe,KAAK,IAAI,gBAAgB,KAAK,IAAI,IAAI,UAAU,MAAM,CAAC;AAC5E,QAAM,YAAY,UACf,MAAM,gBAAgB,YAAY,EAClC,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAER,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,SAAS,KAAK,GAAG,UAAU,MAAM,GAAG,EAAE,CAAC,QAAQ;AAClE;AAEA,SAAS,mBACP,OACA,QACS;AACT,MAAI,OAAO,SAAS,OAAQ,QAAO;AACnC,QAAM,WAAW,MAAM,SAAS;AAChC,MAAI,CAAC,SAAU,QAAO;AAEtB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,QAAQ,4BAA4B,MAAM,UAAU,MAAM,CAAC;AAAA,IACpE,KAAK;AACH,aAAO,QAAQ,4BAA4B,MAAM,UAAU,MAAM,CAAC;AAAA,IACpE,KAAK;AACH,aAAO,QAAQ,SAAS,oBAAoB,YAAY,OAAO,MAAM,CAAC;AAAA,IACxE,KAAK;AACH,aAAO,QAAQ,SAAS,oBAAoB,WAAW,OAAO,MAAM,CAAC;AAAA,EACzE;AACF;AAEA,SAAS,yBACP,OACA,aACA,iBAC2B;AAC3B,QAAM,WAAW,MAAM,SAAS;AAChC,QAAM,WAAW,sBAAsB,MAAM,QAAQ;AACrD,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,IACxB,eAAe,cAAc,UAAU;AAAA,IACvC;AAAA,EACF;AACF;AAOA,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,kCAAkC,oBAAI,IAAI;AAAA,EAC9C;AACF,CAAC;AAED,IAAM,kDAAkD,oBAAI,IAAI;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,kBAAkB,SAAiC;AAC1D,SAAO,CAAC,sBAAsB,IAAI,QAAQ,IAAI;AAChD;AAIA,SAAS,mBAAmB,UAAoD;AAC9E,QAAM,UAAgC,CAAC;AACvC,MAAI,QAAQ;AACZ,aAAW,SAAS,SAAS,QAAQ,UAAU;AAC7C,YAAQ,uBAAuB,OAAO,SAAS,KAAK;AAAA,EACtD;AACA,UAAQ,0BAA0B,SAAS,UAAU,SAAS,KAAK;AACnE,QAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;AAC1D,SAAO;AAAA,IACL,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,mBAAmB,QAAQ,SAAS;AAAA,IACpC,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,uBACP,OACA,SACA,OACQ;AACR,MAAI,MAAM,SAAS,aAAa;AAC9B,eAAW,SAAS,MAAM,UAAU;AAClC,cAAQ,wBAAwB,OAAO,SAAS,KAAK;AAAA,IACvD;AAAA,EACF,WAAW,MAAM,SAAS,SAAS;AACjC,eAAW,OAAO,MAAM,MAAM;AAC5B,iBAAW,QAAQ,IAAI,OAAO;AAC5B,mBAAW,SAAS,KAAK,UAAU;AACjC,kBAAQ,uBAAuB,OAAO,SAAS,KAAK;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,MAAM,SAAS,SAAS,MAAM,SAAS,cAAc;AAC9D,eAAW,SAAS,MAAM,UAAU;AAClC,cAAQ,uBAAuB,OAAO,SAAS,KAAK;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBACP,MACA,SACA,OACQ;AACR,MAAI,KAAK,SAAS,SAAS;AACzB,UAAM,cAAc,KAAK,eAAe;AACxC,UAAM,YAAY,uBAAuB,WAAW;AACpD,UAAM,cAAc,wBAAwB,IAAI;AAChD,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,MAClB,eAAe,KAAK,kBAAkB,YAAY,UAAU;AAAA,MAC5D;AAAA,IACF,CAAC;AACD;AAEA,eAAW,SAAS,KAAK,UAAU;AACjC,cAAQ,wBAAwB,OAAO,SAAS,KAAK;AAAA,IACvD;AAAA,EACF,WAAW,KAAK,SAAS,aAAa;AACpC,eAAW,SAAS,KAAK,UAAU;AACjC,cAAQ,wBAAwB,OAAO,SAAS,KAAK;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA0B;AACzD,SAAO,yBAAyB,MAAM,QAAQ;AAChD;AAEA,SAAS,yBAAyB,UAAyC;AACzE,SAAO,SACJ,IAAI,CAAC,UAAU;AACd,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO,yBAAyB,MAAM,QAAQ;AAAA,MAChD,KAAK;AACH,eAAO,MAAM;AAAA,MACf;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,sBACP,UACA,eACA,aACA,SAMA;AACA,QAAM,gBAAgB,SAAS,iBAAiB;AAChD,QAAM,cAAc,qBAAqB,QAAQ;AACjD,QAAM,aAAa,yBAAyB,SAAS,QAAQ,QAAQ;AACrE,QAAM,aAAa,iCAAiC,UAAU,eAAe,WAAW;AACxF,MAAI,eAAe;AACnB,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AAEJ,QAAM,eAAe,wBAAwB,SAAS,QAAQ,UAAU,CAAC,OAAO,UAAU;AACxF,QAAI,CAAC,MAAM,eAAe,CAAC,uBAAuB,MAAM,WAAW,GAAG;AACpE,aAAO;AAAA,IACT;AACA,QAAI,iBAAiB,MAAM,gBAAgB,OAAO;AAChD,aAAO;AAAA,IACT;AACA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,oBAAgB;AAChB,UAAM,YAAuB;AAAA,MAC3B,GAAG;AAAA,MACH,UAAU,gCAAgC,QAAQ,WAAW;AAAA,MAC7D,eAAe,QAAQ;AAAA,IACzB;AACA,QACE,UAAU,kBAAkB,MAAM,iBAClC,yBAAyB,UAAU,QAAQ,MAAM,yBAAyB,MAAM,QAAQ,GACxF;AACA,gBAAU;AACV,oBAAc,gBAAgB,SAAY,MAAM,OAAO,KAAK,IAAI,aAAa,MAAM,IAAI;AACvF,kBAAY,cAAc,SAAY,MAAM,KAAK,KAAK,IAAI,WAAW,MAAM,EAAE;AAAA,IAC/E;AACA,WAAO;AAAA,EACT,CAAC,EAAE;AACH,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,UAAU,cAAc,SAAS,MAAM;AAAA,EAClD;AAEA,QAAM,eAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,SAAS;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,eAAe,mBAAmB;AAAA,IACtC,SAAS,aAAa;AAAA,IACtB,QAAQ,aAAa;AAAA,IACrB,UAAU,aAAa;AAAA,EACzB,CAAC;AACD,eAAa,gBAAgB;AAC7B,MAAI;AAGJ,MAAI,gBAAgB,UAAa,cAAc,QAAW;AACxD,0BAAsB,wBAAwB,aAAa,SAAS;AAAA,EACtE;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,GAAI,sBAAsB,EAAE,oBAAoB,IAAI,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,+BACP,UACA,eACA,aACA,SAMA;AACA,QAAM,aAAa,iCAAiC,UAAU,eAAe,WAAW;AACxF,MAAI,UAAU;AACd,MAAI,gBAA2E,CAAC;AAChF,MAAI;AACJ,MAAI;AACJ,QAAM,eAAe,wBAAwB,SAAS,QAAQ,UAAU,CAAC,OAAO,UAAU;AACxF,QAAI,MAAM,gBAAgB,OAAO;AAC/B,aAAO;AAAA,IACT;AACA,UAAM,aAAa,SAAS,WACxB,EAAE,MAAM,GAAG,IAAI,QAAQ,SAAS,IAChC,mBAAmB,MAAM,WAAW;AACxC,UAAM,UAAU,WAAW,SACxB,OAAO,CAAC,YAAY,QAAQ,SAAS,WAAW,QAAQ,QAAQ,SAAS,WAAW,EAAE,EACtF,IAAI,CAAC,aAAa;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,WAAW,QAAQ;AAAA,IACrB,EAAE;AACJ,QAAI,cAAc,WAAW,GAAG;AAC9B,sBAAgB;AAAA,IAClB;AACA,UAAM,YAAuB;AAAA,MAC3B,GAAG;AAAA,MACH,UAAU,oBAAoB,OAAO;AAAA,MACrC,eAAe;AAAA,IACjB;AACA,QAAI,yBAAyB,UAAU,QAAQ,MAAM,yBAAyB,MAAM,QAAQ,GAAG;AAC7F,gBAAU;AACV,oBAAc,gBAAgB,SAAY,MAAM,OAAO,KAAK,IAAI,aAAa,MAAM,IAAI;AACvF,kBAAY,cAAc,SAAY,MAAM,KAAK,KAAK,IAAI,WAAW,MAAM,EAAE;AAAA,IAC/E;AACA,WAAO;AAAA,EACT,CAAC,EAAE;AACH,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,EAAE,YAAY,cAAc,QAAQ,SAAS,cAAc;AAAA,MACnE,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,SAAS;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,eAAe,mBAAmB;AAAA,IACtC,SAAS,aAAa;AAAA,IACtB,QAAQ,aAAa;AAAA,IACrB,UAAU,aAAa;AAAA,EACzB,CAAC;AACD,eAAa,gBAAgB,aAAa,eACtC;AAAA,IACE,GAAG;AAAA,IACH,cAAc;AAAA,MACZ,GAAG,aAAa;AAAA,MAChB,QAAQ;AAAA,IACV;AAAA,EACF,IACA;AACJ,MAAI;AAGJ,MAAI,gBAAgB,UAAa,cAAc,QAAW;AACxD,0BAAsB,wBAAwB,aAAa,SAAS;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,EAAE,YAAY,cAAc,QAAQ,SAAS,cAAc;AAAA,IACnE,SAAS;AAAA,IACT,GAAI,sBAAsB,EAAE,oBAAoB,IAAI,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,wBACP,QACA,YACA,SAAS,GACT,oBAAoB,OAKpB;AACA,QAAM,aAAa,OAAO,IAAI,CAAC,UAAU;AACvC,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,iBAAiB,oBAAoB,SAAS,IAAI;AACxD,YAAM,oBAAoB;AAAA,QACxB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AACA,eAAS,iBAAiB,kBAAkB;AAC5C,0BAAoB;AACpB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,kBAAkB;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,gBAAU;AACV,0BAAoB;AACpB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,MAAM,KAAK,IAAI,CAAC,SAAS;AAAA,UAC7B,GAAG;AAAA,UACH,OAAO,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,YAC9B,GAAG;AAAA,YACH,WAAW,MAAM;AACf,oBAAM,YAAY,wBAAwB,KAAK,UAAU,YAAY,QAAQ,KAAK;AAClF,uBAAS,UAAU;AACnB,qBAAO,UAAU;AAAA,YACnB,GAAG;AAAA,UACL,EAAE;AAAA,QACJ,EAAE;AAAA,MACJ;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAS,MAAM,SAAS,cAAc;AACvD,YAAM,YAAY;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,eAAS,UAAU;AACnB,0BAAoB,UAAU;AAC9B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,UAAU;AAAA,MACtB;AAAA,IACF;AACA,cAAU;AACV,wBAAoB;AACpB,WAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,QAAQ,YAAY,QAAQ,kBAAkB;AACzD;AAEA,SAAS,6BACP,OACA,YACA,SAAS,GAIT;AACA,QAAM,YAAY,MAAM,IAAI,CAAC,SAAS;AACpC,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,aAAa;AACnB,YAAM,oBAAoB,6BAA6B,KAAK,UAAU,YAAY,MAAM;AACxF,YAAM,cAAc,mBAAmB,KAAK,QAAQ;AACpD,eAAS,aAAa;AACtB,aAAO,WAAW;AAAA,QAChB,GAAG;AAAA,QACH,UAAU,kBAAkB;AAAA,MAC9B,GAAG;AAAA,QACD,MAAM;AAAA,QACN,IAAI,aAAa;AAAA,MACnB,CAAC;AAAA,IACH;AACA,QAAI,KAAK,SAAS,aAAa;AAC7B,gBAAU,mBAAmB,KAAK,QAAQ;AAC1C,aAAO;AAAA,QACL,GAAG;AAAA;AAAA,QAEH,UAAU,CAAC,GAAG,KAAK,QAAQ;AAAA,MAC7B;AAAA,IACF;AACA,cAAUE,mBAAkB,IAAI;AAChC,WAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,OAAO,WAAW,OAAO;AACpC;AAEA,SAAS,gCAAgC,MAA4B;AACnE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAyB,CAAC;AAChC,MAAI,SAAS;AACb,QAAM,cAAc,MAAM;AACxB,QAAI,OAAO,SAAS,GAAG;AACrB,eAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAC5C,eAAS;AAAA,IACX;AAAA,EACF;AACA,aAAW,aAAa,MAAM;AAC5B,QAAI,cAAc,KAAM;AACtB,kBAAY;AACZ,eAAS,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B;AAAA,IACF;AACA,QAAI,cAAc,MAAM;AACtB,kBAAY;AACZ,eAAS,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AACA,cAAY;AACZ,SAAO;AACT;AAEA,SAAS,oBACP,SACc;AACd,QAAM,WAAyB,CAAC;AAChC,UAAQ,QAAQ,CAAC,OAAO,UAAU;AAChC,aAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAChD,aAAS,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,aAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,YAAY,CAAC,EAAE,CAAC;AACjE,QAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,eAAS,KAAK,EAAE,MAAM,aAAa,CAAC;AAAA,IACtC;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,SAAS,0BACP,UACA,SACA,OACQ;AACR,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,YAAY;AAChB,aAAW,UAAU,SAAS,WAAW,CAAC,GAAG;AAC3C,eAAW,SAAS,OAAO,QAAQ;AACjC,kBAAY,uBAAuB,OAAO,SAAS,SAAS;AAAA,IAC9D;AAAA,EACF;AACA,aAAW,UAAU,SAAS,WAAW,CAAC,GAAG;AAC3C,eAAW,SAAS,OAAO,QAAQ;AACjC,kBAAY,uBAAuB,OAAO,SAAS,SAAS;AAAA,IAC9D;AAAA,EACF;AACA,MAAI,SAAS,oBAAoB;AAC/B,eAAW,QAAQ,OAAO,OAAO,SAAS,mBAAmB,SAAS,GAAG;AACvE,iBAAW,SAAS,KAAK,QAAQ;AAC/B,oBAAY,uBAAuB,OAAO,SAAS,SAAS;AAAA,MAC9D;AAAA,IACF;AACA,eAAW,QAAQ,OAAO,OAAO,SAAS,mBAAmB,QAAQ,GAAG;AACtE,iBAAW,SAAS,KAAK,QAAQ;AAC/B,oBAAY,uBAAuB,OAAO,SAAS,SAAS;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,6BACP,OACA,UACA,aACA,YACA,YACwE;AACxE,MAAI,CAAC,MAAM,eAAe,CAAC,uBAAuB,MAAM,WAAW,GAAG;AACpE,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,aAAa;AACtB,WAAO,MAAM,gBAAgB,QACzB,SACA,EAAE,aAAa,IAAI,eAAe,eAAe;AAAA,EACvD;AACA,MAAI,MAAM,gBAAgB,OAAO;AAC/B,UAAM,SAAS,oBAAoB,UAAU,aAAa,MAAM,WAAW;AAC3E,WAAO,SACH,EAAE,aAAa,OAAO,MAAM,eAAe,OAAO,cAAc,IAChE,EAAE,aAAa,IAAI,eAAe,eAAe;AAAA,EACvD;AACA,QAAM,WAAW,YAAY,IAAI,MAAM,WAAW;AAClD,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,aAAa,IAAI,eAAe,eAAe;AAAA,EAC1D;AACA,MAAI,MAAM,gBAAgB,WAAW;AACnC,UAAM,YAAY,WAAW,SAAS,cAAc;AACpD,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,aAAa,IAAI,eAAe,eAAe;AAAA,IAC1D;AACA,UAAM,YAAY,kBAAkB,WAAW,OAAO,UAAU,WAAW;AAC3E,WAAO,EAAE,aAAa,OAAO,YAAY,CAAC,GAAG,eAAe,UAAU;AAAA,EACxE;AACA,MAAI,MAAM,gBAAgB,WAAW;AACnC,UAAM,YAAY,WAAW,SAAS,cAAc,GAAG;AACvD,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,aAAa,IAAI,eAAe,eAAe;AAAA,IAC1D;AACA,UAAM,WAAW,yBAAyB,WAAW,SAAS,UAAU;AACxE,WAAO,WACH,EAAE,aAAa,UAAU,eAAe,UAAU,IAClD,EAAE,aAAa,IAAI,eAAe,eAAe;AAAA,EACvD;AACA,SAAO;AACT;AAOA,SAAS,yBAAyB,QAAkD;AAClF,QAAM,aAAiC,CAAC;AACxC,qCAAmC,QAAQ,YAAY,GAAG,KAAK;AAC/D,SAAO;AACT;AAEA,SAAS,mCACP,QACA,YACA,QACA,mBACgD;AAChD,MAAI,aAAa;AACjB,MAAI,wBAAwB;AAC5B,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,uBAAuB;AACzB,sBAAc;AAAA,MAChB;AACA,iBAAW,KAAK,EAAE,WAAW,OAAO,aAAa,WAAW,CAAC;AAC7D,oBAAc,mBAAmB,MAAM,QAAQ;AAC/C,8BAAwB;AACxB;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,oBAAc;AACd,8BAAwB;AACxB,iBAAW,OAAO,MAAM,MAAM;AAC5B,mBAAW,QAAQ,IAAI,OAAO;AAC5B,gBAAM,SAAS;AAAA,YACb,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,uBAAa,OAAO;AAAA,QACtB;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAS,MAAM,SAAS,cAAc;AACvD,YAAM,SAAS;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,mBAAa,OAAO;AACpB,8BAAwB,OAAO;AAC/B;AAAA,IACF;AACA,kBAAc;AACd,4BAAwB;AAAA,EAC1B;AACA,SAAO,EAAE,QAAQ,YAAY,mBAAmB,sBAAsB;AACxE;AAEA,SAAS,mBAAmB,OAAsC;AAChE,SAAO,MAAM,OAAO,CAAC,MAAM,SAAS,OAAOA,mBAAkB,IAAI,GAAG,CAAC;AACvE;AAEA,SAASA,mBAAkB,MAA0B;AACnD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK,KAAK;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,mBAAmB,KAAK,QAAQ;AAAA,IACzC;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,yBAAyB,WAA0B,YAAwC;AAClG,MAAI,SAAS;AACb,MAAI,cAAc;AAClB,aAAW,SAAS,UAAU,UAAU;AACtC,QAAI,MAAM,SAAS,oBAAoB,MAAM,eAAe,YAAY;AACtE,eAAS;AACT,oBAAc;AACd;AAAA,IACF;AACA,QAAI,MAAM,SAAS,kBAAkB,MAAM,eAAe,YAAY;AACpE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,QAAI,MAAM,SAAS,gBAAgB;AACjC,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACA,SAAO,cAAc,SAAY;AACnC;AAEA,SAAS,oBACP,SACA,mBAC2D;AAC3D,MAAI,yBAAyB,WAAW,QAAQ,qBAAqB;AACnE,WAAO,QAAQ;AAAA,EACjB;AACA,MAAI,eAAe,WAAW,QAAQ,WAAW;AAC/C,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,sBACP,YACA,WACS;AACT,QAAM,iBAAiB,WAAW,OAAO;AAAA,IACvC,CAAC,UACC,MAAM,YAAY,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,QAAQ;AAAA,EAC9E;AACA,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AACtD,QAAM,KAAK,KAAK,IAAI,UAAU,QAAQ,UAAU,IAAI;AACpD,SAAO,CAAC,eAAe;AAAA,IAAK,CAAC,UAC3B,QAAQ,MAAM,SAAS,MAAM,MAAM;AAAA,EACrC;AACF;AAEA,SAAS,wBACP,YACA,SACoB;AACpB,MAAI,QAAQ,MAAM,WAAW,KAAK,WAAW,OAAO,WAAW,GAAG;AAChE,WAAO;AAAA,EACT;AACA,MAAI,UAAU;AACd,QAAM,aAAa,WAAW,OAAO,IAAI,CAAC,UAAU;AAClD,QACE,CAAC,MAAM,YACP,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,QAAQ,UACrB;AACA,aAAO;AAAA,IACT;AACA,UAAM,SAAS;AAAA,MACb,EAAE,MAAM,MAAM,OAAO,IAAI,MAAM,IAAI;AAAA,MACnC,EAAE,OAAO,IAAI,KAAK,EAAE;AAAA,MACpB;AAAA,IACF;AACA,QAAI,OAAO,SAAS,YAAY;AAC9B,gBAAU;AACV,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO;AAAA,QACP,KAAK;AAAA,QACL,UAAU;AAAA,QACV,mBACE;AAAA,MACJ;AAAA,IACF;AACA,QAAI,OAAO,MAAM,SAAS,MAAM,SAAS,OAAO,MAAM,OAAO,MAAM,KAAK;AACtE,gBAAU;AACV,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,OAAO,MAAM;AAAA,QACpB,KAAK,OAAO,MAAM;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,oBAAoB,WAAW,OAAO,CAAC,UAAU,MAAM,QAAQ,EAAE;AAAA,IACjE,qBAAqB,WAAW,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,EAAE;AAAA,EACrE;AACF;","names":["validateExactObjectKeys","createPersistedEditorSnapshot","normalizeDocumentRoot","createPlainText","cloneMarks","parts","cloneMarks","normalizeDocumentRoot","normalizeRange","resultingStatus","textResult","nextStore","boundaryIndex","result","insertedFrom","insertedTo","reviewState","finalDocument","nextDocument","caretPos","priorityForStatus","normalizeDocumentRoot","dedupeWarnings","COMPATIBILITY_REPORT_VERSION","COMPATIBILITY_REPORT_VERSION","createRangeAnchor","storyTargetKey","MIN_BLOCK_HEIGHT_TWIPS","snapshot","fragment","options","createPersistedEditorSnapshot","measureInlineNode"]}
|