@yumiai/chat-widget 0.1.2 → 0.2.1
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/CHANGELOG.md +100 -0
- package/README.md +119 -22
- package/dist/ExcelCore-DJOIVQMI.js +11 -0
- package/dist/ExcelCore-DJOIVQMI.js.map +1 -0
- package/dist/ExcelViewer-3YLLYYIQ.js +65 -0
- package/dist/ExcelViewer-3YLLYYIQ.js.map +1 -0
- package/dist/GerberViewerA2UI-7CNT7HX4.css +693 -0
- package/dist/GerberViewerA2UI-7CNT7HX4.css.map +1 -0
- package/dist/GerberViewerA2UI-X5FWAD5M.js +57 -0
- package/dist/GerberViewerA2UI-X5FWAD5M.js.map +1 -0
- package/dist/GraphStatsLegend-D5bPeXB_.d.cts +607 -0
- package/dist/GraphStatsLegend-D5bPeXB_.d.ts +607 -0
- package/dist/JsonRenderStandalone-EIZM62JU.js +18 -0
- package/dist/JsonRenderStandalone-EIZM62JU.js.map +1 -0
- package/dist/JsonRenderStandalone-POB4Q3N3.css +2384 -0
- package/dist/JsonRenderStandalone-POB4Q3N3.css.map +1 -0
- package/dist/JsonRenderStandalone-UsTcST4G.d.cts +23 -0
- package/dist/JsonRenderStandalone-UsTcST4G.d.ts +23 -0
- package/dist/KicadViewer-GV6ZC4AQ.js +124 -0
- package/dist/KicadViewer-GV6ZC4AQ.js.map +1 -0
- package/dist/KicadViewerCore-U7BWZHKJ.js +11 -0
- package/dist/KicadViewerCore-U7BWZHKJ.js.map +1 -0
- package/dist/PdfViewer-CHPDRK46.js +51 -0
- package/dist/PdfViewer-CHPDRK46.js.map +1 -0
- package/dist/PdfViewer-LPYGQETK.css +1899 -0
- package/dist/PdfViewer-LPYGQETK.css.map +1 -0
- package/dist/PdfViewerCore-HJPEHSRA.js +364 -0
- package/dist/PdfViewerCore-HJPEHSRA.js.map +1 -0
- package/dist/PowerPointCore-FPDR2BL4.js +11 -0
- package/dist/PowerPointCore-FPDR2BL4.js.map +1 -0
- package/dist/PowerPointViewer-LQTO6UCU.js +61 -0
- package/dist/PowerPointViewer-LQTO6UCU.js.map +1 -0
- package/dist/StepViewerCore-7W3L3R4E.js +285 -0
- package/dist/StepViewerCore-7W3L3R4E.js.map +1 -0
- package/dist/ThreeViewerCore-N3QJD5QI.js +161 -0
- package/dist/ThreeViewerCore-N3QJD5QI.js.map +1 -0
- package/dist/WordCore-JKSXK2XD.js +11 -0
- package/dist/WordCore-JKSXK2XD.js.map +1 -0
- package/dist/WordViewer-ZHCQMHOH.js +61 -0
- package/dist/WordViewer-ZHCQMHOH.js.map +1 -0
- package/dist/chunk-2SKA3F5U.js +88 -0
- package/dist/chunk-2SKA3F5U.js.map +1 -0
- package/dist/chunk-2UC7YLVX.js +318 -0
- package/dist/chunk-2UC7YLVX.js.map +1 -0
- package/dist/chunk-3R6T3LBR.js +24 -0
- package/dist/chunk-3R6T3LBR.js.map +1 -0
- package/dist/chunk-56WRZM3R.js +398 -0
- package/dist/chunk-56WRZM3R.js.map +1 -0
- package/dist/chunk-7A4FY6FK.js +10226 -0
- package/dist/chunk-7A4FY6FK.js.map +1 -0
- package/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/chunk-7D4SUZUM.js.map +1 -0
- package/dist/chunk-7S67DOHQ.js +436 -0
- package/dist/chunk-7S67DOHQ.js.map +1 -0
- package/dist/chunk-CFKGNAJM.js +14013 -0
- package/dist/chunk-CFKGNAJM.js.map +1 -0
- package/dist/chunk-GAMA3VA7.js +99 -0
- package/dist/chunk-GAMA3VA7.js.map +1 -0
- package/dist/chunk-GYXTSY22.js +639 -0
- package/dist/chunk-GYXTSY22.js.map +1 -0
- package/dist/chunk-K4KGNVL5.js +77 -0
- package/dist/chunk-K4KGNVL5.js.map +1 -0
- package/dist/chunk-KQV7IKET.js +1621 -0
- package/dist/chunk-KQV7IKET.js.map +1 -0
- package/dist/chunk-O3NXUM6C.js +1871 -0
- package/dist/chunk-O3NXUM6C.js.map +1 -0
- package/dist/chunk-PZXSASDY.js +83 -0
- package/dist/chunk-PZXSASDY.js.map +1 -0
- package/dist/chunk-QLVPIM6R.js +595 -0
- package/dist/chunk-QLVPIM6R.js.map +1 -0
- package/dist/chunk-VXJWGLZ7.js +21 -0
- package/dist/chunk-VXJWGLZ7.js.map +1 -0
- package/dist/chunk-XQ562W7I.js +116 -0
- package/dist/chunk-XQ562W7I.js.map +1 -0
- package/dist/components/JsonRender/standalone.cjs +39368 -0
- package/dist/components/JsonRender/standalone.cjs.map +1 -0
- package/dist/components/JsonRender/standalone.css +2384 -0
- package/dist/components/JsonRender/standalone.css.map +1 -0
- package/dist/components/JsonRender/standalone.d.cts +16 -0
- package/dist/components/JsonRender/standalone.d.ts +16 -0
- package/dist/components/JsonRender/standalone.js +38 -0
- package/dist/components/JsonRender/standalone.js.map +1 -0
- package/dist/gerber-2d-entry-OQ4SQRBY.js +3950 -0
- package/dist/gerber-2d-entry-OQ4SQRBY.js.map +1 -0
- package/dist/gerber-3d-entry-DEHDBOO2.js +3679 -0
- package/dist/gerber-3d-entry-DEHDBOO2.js.map +1 -0
- package/dist/gerber-simulation-entry-EBDX72XE.js +1801 -0
- package/dist/gerber-simulation-entry-EBDX72XE.js.map +1 -0
- package/dist/index.cjs +60113 -2970
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +11342 -1708
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +3275 -77
- package/dist/index.d.ts +3275 -77
- package/dist/index.js +18078 -2540
- package/dist/index.js.map +1 -1
- package/dist/provenance/index.cjs +2248 -0
- package/dist/provenance/index.cjs.map +1 -0
- package/dist/provenance/index.css +52 -0
- package/dist/provenance/index.css.map +1 -0
- package/dist/provenance/index.d.cts +12 -0
- package/dist/provenance/index.d.ts +12 -0
- package/dist/provenance/index.js +27 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/resolveToArrayBuffer-AQIDZHSQ.js +23 -0
- package/dist/resolveToArrayBuffer-AQIDZHSQ.js.map +1 -0
- package/package.json +98 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/JsonRender/JsonRenderStandalone.tsx","../src/components/JsonRender/useGenUISpec.ts","../src/components/JsonRender/SpecStreamCompiler.ts","../src/components/JsonRender/StateStoreManager.ts","../src/components/JsonRender/migrator/cache.ts","../src/components/JsonRender/migrator/dry-run.ts","../src/components/JsonRender/migrator/transforms/legacy-props.ts","../src/components/JsonRender/migrator/transforms/legacy-datatable-split.ts","../src/components/JsonRender/migrator/transforms/legacy-riskregister-split.ts","../src/components/JsonRender/migrator/transforms/legacy-dashboardlayout-normalize.ts","../src/components/JsonRender/migrator/transforms/legacy-dashboardlayout-split.ts","../src/components/JsonRender/migrator/transforms/legacy-statusboard-props.ts","../src/components/JsonRender/migrator/transforms/legacy-annotationlayer-mode.ts","../src/components/JsonRender/domain/catalog.ts","../src/components/JsonRender/migrator/transforms/legacy-slots-normalize.ts","../src/components/JsonRender/migrator/transforms/legacy-slots-named-children.ts","../src/components/JsonRender/migrator/transforms/index.ts","../src/components/JsonRender/migrator/index.ts","../src/components/JsonRender/prepareSpec.ts","../src/components/JsonRender/domain/registry.ts","../src/components/JsonRender/domain/motionFocusTokens.ts","../src/components/JsonRender/domain/ThemeProvider.tsx","../src/components/JsonRender/domain/AppChrome.tsx","../src/components/JsonRender/domain/primitives/Button.tsx","../src/components/JsonRender/domain/primitives/Icon.tsx","../src/components/JsonRender/domain/primitives/ConfirmDialog.tsx","../src/components/JsonRender/domain/primitives/StateView.tsx","../src/components/JsonRender/domain/primitives/useComponentState.ts","../src/components/JsonRender/domain/SideNav.tsx","../src/components/JsonRender/domain/_filterPath.ts","../src/components/JsonRender/domain/SectionRouter.tsx","../src/components/JsonRender/domain/KPICard.tsx","../src/components/JsonRender/domain/KPICluster.tsx","../src/components/JsonRender/domain/DataTable.tsx","../src/components/JsonRender/domain/TableToolbar.tsx","../src/components/JsonRender/domain/ColumnFilter.tsx","../src/components/JsonRender/domain/RowGroup.tsx","../src/components/JsonRender/domain/BudgetBar.tsx","../src/components/JsonRender/domain/ChecklistCard.tsx","../src/components/JsonRender/domain/Chart.tsx","../src/components/JsonRender/domain/ChartTooltip.tsx","../src/components/JsonRender/domain/TraceMatrix.tsx","../src/components/JsonRender/domain/RiskList.tsx","../src/components/JsonRender/domain/RiskHeatMatrix.tsx","../src/components/JsonRender/domain/EvidenceChain.tsx","../src/components/JsonRender/domain/AssumptionRegister.tsx","../src/components/JsonRender/domain/GanttChart.tsx","../src/components/JsonRender/domain/SandboxPlayer.tsx","../src/components/JsonRender/domain/ComparisonMatrix.tsx","../src/components/JsonRender/domain/Timeline.tsx","../src/components/JsonRender/domain/HierarchyTree.tsx","../src/components/JsonRender/domain/WaterfallChart.tsx","../src/components/JsonRender/domain/StatusBoard.tsx","../src/components/JsonRender/domain/DecisionPanel.tsx","../src/components/JsonRender/domain/Heatmap.tsx","../src/components/JsonRender/domain/FormSection.tsx","../src/components/JsonRender/domain/Timer.tsx","../src/components/JsonRender/domain/CodeViewer.tsx","../src/components/JsonRender/domain/AnnotationLayer.tsx","../src/components/JsonRender/domain/TextViewer.tsx","../src/components/JsonRender/domain/CodeFileViewer.tsx","../src/components/JsonRender/domain/MarkdownViewer.tsx","../src/components/JsonRender/domain/JsonViewer.tsx","../src/components/JsonRender/domain/ImageViewer.tsx","../src/components/JsonRender/domain/VideoPlayer.tsx","../src/components/JsonRender/domain/AudioPlayer.tsx","../src/components/JsonRender/domain/HtmlViewer.tsx","../src/hooks/useHtmlProject.ts","../src/components/FileViewer/viewers/HtmlViewer/index.tsx","../src/components/FileViewer/viewers/HtmlViewer/util/pathUtils.ts","../src/components/FileViewer/viewers/HtmlViewer/rewrite/rewriteEsm.ts","../src/components/FileViewer/viewers/HtmlViewer/rewrite/rewriteHtml.ts","../src/components/FileViewer/viewers/HtmlViewer/rewrite/rewriteCss.ts","../src/components/FileViewer/viewers/HtmlViewer/strategies/inlineStrategy.ts","../src/components/FileViewer/viewers/HtmlViewer/util/blobPool.ts","../src/components/FileViewer/viewers/HtmlViewer/bridge/scripts.ts","../src/components/FileViewer/viewers/HtmlViewer/runtime/shim.ts","../src/components/FileViewer/viewers/HtmlViewer/strategies/blobStrategy.ts","../src/components/FileViewer/viewers/HtmlViewer/strategies/detect.ts","../src/components/FileViewer/viewers/HtmlViewer/util/sandboxBase.ts","../src/components/JsonRender/domain/JrSlot.tsx","../src/components/JsonRender/domain/layout/Box.tsx","../src/components/JsonRender/domain/layout/_tokens.ts","../src/components/JsonRender/domain/layout/Row.tsx","../src/components/JsonRender/domain/layout/Spacer.tsx","../src/components/JsonRender/domain/layout/Section.tsx","../src/components/JsonRender/domain/layout/Stepper.tsx","../src/components/JsonRender/domain/layout/FormField.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { Renderer, StateProvider, VisibilityProvider, ActionProvider } from '@json-render/react'\nimport { useGenUISpec } from './useGenUISpec'\nimport { registry } from './domain/registry'\nimport './JsonRenderViewer.css'\n// CWRF-013 Phase 1 PR-P1-#3 — Tailwind v4 + scoped-preflight source CSS.\n// Share viewer / standalone instances also need the `.ycw-shadcn` scope\n// to render shadcn 36 components consistently with the in-app card/viewer.\nimport '../../styles/shadcn.css'\n\nexport type JsonRenderActionHandler = (params: Record<string, unknown>) => Promise<void> | void\n\nexport interface JsonRenderStandaloneProps {\n spec: Record<string, unknown>\n theme?: 'light' | 'dark' | 'auto'\n className?: string\n /**\n * 可选 action handlers。给 share viewer / 离线渲染场景用:\n * 即便宿主\"什么都不做\",也最好显式传入一组 noop(覆盖 spec 里 declare 的 handler 名字),\n * 否则 ActionProvider 在用户点按钮时会抛 unknown handler。缺省 ``{}``。\n */\n actionHandlers?: Record<string, JsonRenderActionHandler>\n /**\n * Standalone instance ID。多个 standalone 实例并存时(同页面挂多个 viewer)必须不同,\n * 否则会复用 SpecStreamCompiler / StateStore 的 specId 缓存,导致 spec 串帧。\n * 缺省 ``'standalone'``。\n */\n specId?: string\n}\n\nconst EMPTY_HANDLERS: Record<string, JsonRenderActionHandler> = {}\n\nexport const JsonRenderStandalone: React.FC<JsonRenderStandaloneProps> = ({\n spec,\n theme = 'auto',\n className,\n actionHandlers = EMPTY_HANDLERS,\n specId = 'standalone',\n}) => {\n const specJson = useMemo(() => JSON.stringify(spec), [spec])\n const patches = useMemo(() => [specJson], [specJson])\n const { spec: compiled, store } = useGenUISpec(specId, patches, false)\n\n if (!compiled?.root || !compiled?.elements) {\n return (\n <div className={`jr-standalone ${className ?? ''}`} data-theme={theme}>\n <div className=\"jr-viewer-loading\">\n <div className=\"jr-viewer-spinner\" />\n <span>Loading...</span>\n </div>\n </div>\n )\n }\n\n const stateProviderProps = store\n ? { store }\n : { initialState: compiled.state ?? {} }\n\n return (\n <div className={`jr-standalone ${className ?? ''}`} data-theme={theme}>\n <StateProvider {...stateProviderProps}>\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers as Record<string, (params: Record<string, unknown>) => Promise<void>>}>\n {/* CWRF-013 Phase 1 PR-P1-#3 — `.ycw-shadcn` scope wrapper. */}\n <div className=\"ycw-shadcn\">\n <Renderer\n spec={compiled}\n registry={registry as never}\n loading={false}\n />\n </div>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n </div>\n )\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport type { Spec, StateStore } from '@json-render/core'\nimport {\n getOrCreateCompiler,\n pushPatch,\n markComplete,\n getSpec,\n} from './SpecStreamCompiler'\nimport {\n getOrCreateStore,\n applyStatePatch,\n getStore,\n} from './StateStoreManager'\n// 单一来源:``$cond`` / ``op+value`` / ``{{...}} → ${/...}`` 等老格式归一化全部走 SDK 公开工具,\n// 不在这里再维护一份副本。详见 ``./prepareSpec.ts`` 头部注释。\nimport { prepareJsonRenderSpec } from './prepareSpec'\n\ninterface GenUISpecResult {\n spec: Spec | null\n store: StateStore | null\n}\n\n/**\n * Derive root from elements when the /root patch is missing.\n * Finds the element ID that is NOT referenced as a child of any other element.\n */\nfunction deriveRoot(elements: Record<string, unknown>): string | undefined {\n const allIds = new Set(Object.keys(elements))\n const childIds = new Set<string>()\n\n for (const el of Object.values(elements)) {\n if (el && typeof el === 'object' && 'children' in el) {\n const children = (el as { children?: unknown }).children\n if (Array.isArray(children)) {\n for (const c of children) {\n if (typeof c === 'string') childIds.add(c)\n }\n }\n }\n }\n\n for (const id of allIds) {\n if (!childIds.has(id)) return id\n }\n return allIds.values().next().value as string | undefined\n}\n\n/**\n * Compiles JSONL patches into a spec via direct patch application and manages\n * per-spec_id state via StateStoreManager. Incremental: only new patches\n * since the last render are pushed into the compiler.\n */\nexport function useGenUISpec(\n specId: string,\n patches: string[] | undefined,\n loading: boolean,\n): GenUISpecResult {\n const lastPatchCountRef = useRef(0)\n\n const spec = useMemo((): Spec | null => {\n if (!patches || patches.length === 0) return null\n\n const entry = getOrCreateCompiler(specId)\n\n const newPatches = patches.slice(entry.patchCount)\n for (let i = 0; i < newPatches.length; i++) {\n pushPatch(specId, newPatches[i])\n }\n\n if (!loading) {\n markComplete(specId)\n }\n\n const raw = getSpec(specId)\n if (!raw?.elements) return null\n\n if (!raw.root) {\n const derived = deriveRoot(raw.elements as Record<string, unknown>)\n if (derived) {\n ;(raw as unknown as Record<string, unknown>).root = derived\n console.warn('[JETP-033] /root patch missing, derived root:', derived)\n } else {\n return null\n }\n }\n\n const normalized = prepareJsonRenderSpec(raw)\n return { ...(normalized as unknown as Record<string, unknown>) } as unknown as Spec\n }, [specId, patches, loading])\n\n // CWRF-013 Phase 2 PR-P2-#3 — store hydration must be one-shot, not\n // every-render. Originally this effect re-applied ``store.update(spec.state)``\n // on every spec change, which clobbered ANY user-typed value the moment a\n // subsequent patch arrived. Concrete failure mode reproduced via session\n // 806781156265670: user filled `state.form.name = \"张三\"`, hit submit,\n // stream_processor pushed `/state/_hil/status` (HIL fast-flip patch) →\n // spec object reference rotated → this effect ran → ``update({ form: {...empty} })``\n // replaced the whole `form` object → name went back to \"\". The locked\n // fieldset rendered empty even though the submission succeeded.\n //\n // ``getOrCreateStore`` already seeds the store from spec.state on first\n // creation, and the dedicated patch-applier effect below (line ~99) is\n // the SINGLE write path for server-pushed deltas. Keeping a no-op\n // hydration here would be redundant; doing a full ``update`` is harmful.\n // Therefore: only ``getOrCreateStore`` (idempotent, write-on-first-call),\n // never ``store.update(spec.state)``.\n useEffect(() => {\n if (!spec?.state) return\n getOrCreateStore(specId, spec.state)\n }, [specId, spec])\n\n useEffect(() => {\n if (!patches) return\n const patchCount = patches.length\n if (patchCount <= lastPatchCountRef.current) {\n lastPatchCountRef.current = patchCount\n return\n }\n\n const newPatches = patches.slice(lastPatchCountRef.current)\n lastPatchCountRef.current = patchCount\n\n const store = getStore(specId)\n if (!store) return\n\n for (const raw of newPatches) {\n try {\n const parsed = JSON.parse(raw)\n if (parsed?.path?.startsWith('/state/')) {\n const statePath = parsed.path.slice('/state'.length)\n if (parsed.op === 'add' || parsed.op === 'replace') {\n applyStatePatch(specId, statePath, parsed.value)\n }\n }\n } catch {\n // not a JSON state patch, skip\n }\n }\n }, [specId, patches])\n\n return { spec, store: getStore(specId) ?? null }\n}\n","/**\n * JETP-033: Per-spec_id SpecStream compiler manager.\n *\n * Applies JSONL patches directly via applySpecPatch instead of the library's\n * character-level streaming compiler. Each patch string arrives pre-parsed\n * from the SSE layer, so the stream compiler's internal line buffering and\n * dedup logic is unnecessary and can actually drop patches.\n */\n\nimport { applySpecPatch, type Spec } from '@json-render/core'\n\ninterface CompilerEntry {\n spec: Record<string, unknown>\n loading: boolean\n patchCount: number\n}\n\nconst compilers = new Map<string, CompilerEntry>()\n\nconst MAX_ENTRIES = 64\n\nfunction evictOldest(): void {\n if (compilers.size < MAX_ENTRIES) return\n const first = compilers.keys().next().value\n if (first) compilers.delete(first)\n}\n\nexport function getOrCreateCompiler(specId: string): CompilerEntry {\n let entry = compilers.get(specId)\n if (!entry) {\n evictOldest()\n entry = {\n spec: {},\n loading: true,\n patchCount: 0,\n }\n compilers.set(specId, entry)\n }\n return entry\n}\n\nfunction tryRepairJson(text: string): Record<string, unknown> | null {\n for (const suffix of ['}', '}}', '}}}']) {\n try {\n const parsed = JSON.parse(text + suffix)\n if (parsed && typeof parsed === 'object' && parsed.op && parsed.path !== undefined) {\n console.info('[JETP-033] Auto-repaired JSON by appending', suffix)\n return parsed\n }\n } catch { /* continue */ }\n }\n let trimmed = text\n while (trimmed.endsWith('}')) {\n trimmed = trimmed.slice(0, -1)\n try {\n const parsed = JSON.parse(trimmed)\n if (parsed && typeof parsed === 'object' && parsed.op && parsed.path !== undefined) {\n console.info('[JETP-033] Auto-repaired JSON by trimming excess }')\n return parsed\n }\n } catch { /* continue */ }\n }\n return null\n}\n\nexport function pushPatch(specId: string, patchLine: string): Spec | null {\n const entry = getOrCreateCompiler(specId)\n entry.patchCount++\n try {\n const trimmed = patchLine.trim()\n if (!trimmed) return entry.spec as unknown as Spec\n let patch: Record<string, unknown>\n try {\n patch = JSON.parse(trimmed)\n } catch {\n const repaired = tryRepairJson(trimmed)\n if (!repaired) {\n console.warn('[JETP-033] pushPatch failed (unrepairable):', specId, trimmed.substring(0, 100))\n return entry.spec as unknown as Spec\n }\n patch = repaired\n }\n if (patch && typeof patch === 'object' && patch.op && patch.path !== undefined) {\n try {\n applySpecPatch(entry.spec as unknown as Spec, patch as unknown as Parameters<typeof applySpecPatch>[1])\n } catch (applyErr) {\n console.error('[JETP-033] applySpecPatch threw:', specId, patch.path, applyErr)\n }\n }\n } catch (e) {\n console.warn('[JETP-033] pushPatch failed:', specId, patchLine.substring(0, 100), e)\n }\n return entry.spec as unknown as Spec\n}\n\nexport function markComplete(specId: string): void {\n const entry = compilers.get(specId)\n if (entry) entry.loading = false\n}\n\nexport function getSpec(specId: string): Spec | null {\n const entry = compilers.get(specId)\n return entry ? (entry.spec as unknown as Spec) : null\n}\n\nexport function isLoading(specId: string): boolean {\n return compilers.get(specId)?.loading ?? true\n}\n\nexport function disposeCompiler(specId: string): void {\n compilers.delete(specId)\n}\n\nexport function clearAll(): void {\n compilers.clear()\n}\n","/**\n * JETP-033: Per-spec_id state store manager.\n *\n * Creates and retrieves json-render StateStore instances keyed by spec_id,\n * providing the single write path for both LLM-generated initial state and\n * server-pushed state patches (AC-CW-006).\n */\n\nimport { createStateStore, type StateStore } from '@json-render/core'\n\nconst stores = new Map<string, StateStore>()\n\nexport function getOrCreateStore(\n specId: string,\n initialState?: Record<string, unknown>,\n): StateStore {\n let store = stores.get(specId)\n if (!store) {\n store = createStateStore(initialState ?? {})\n stores.set(specId, store)\n }\n return store\n}\n\nexport function applyStatePatch(\n specId: string,\n path: string,\n value: unknown,\n): void {\n const store = stores.get(specId)\n if (store) store.set(path, value)\n}\n\nexport function getStore(specId: string): StateStore | undefined {\n return stores.get(specId)\n}\n\nexport function disposeStore(specId: string): void {\n stores.delete(specId)\n}\n\nexport function clearAllStores(): void {\n stores.clear()\n}\n","/**\n * CWRF-013 Phase 0 PR #1 — LRU cache for spec migrator.\n *\n * Hand-rolled (no `lru-cache` dep added in Phase 0) to keep this PR's\n * dependency surface zero. Backed by `Map`, which preserves insertion\n * order in modern engines, so we can implement classic LRU eviction by\n * delete-then-set on access.\n *\n * Capacity: defaults to 100, override via `YCW_MIGRATOR_CACHE_SIZE` env\n * (decision point #4 in Phase 0 plan v1.1 §11.1). Negative or non-numeric\n * values fall back to default; a value of 0 disables caching entirely.\n *\n * AC coverage: AC-PROTOCOL-019 (LRU cache hit).\n *\n * NOTE: We hash by stringifying the spec. JSON.stringify is the canonical\n * shape comparator here — same JSON ⇒ same migrator output. Object key\n * order in the wire protocol is stable (it's a JSON stream from the\n * agent), so the hash is deterministic in practice. If callers ever rotate\n * keys the cache would simply miss; correctness is unaffected.\n */\n\nimport type { MigrateOptions, MigrateResult, SpecLike } from './types'\n\nconst DEFAULT_CAPACITY = 100\n\n/**\n * Resolve cache capacity from env each time (so tests can override\n * `process.env.YCW_MIGRATOR_CACHE_SIZE` between runs without re-importing).\n * Exported for unit testing only.\n */\nexport function resolveCacheCapacity(): number {\n const raw =\n typeof process !== 'undefined' && process.env\n ? process.env.YCW_MIGRATOR_CACHE_SIZE\n : undefined\n if (raw == null || raw === '') return DEFAULT_CAPACITY\n const n = Number(raw)\n if (!Number.isFinite(n) || n < 0) return DEFAULT_CAPACITY\n return Math.floor(n)\n}\n\n/**\n * Minimal LRU using `Map` insertion-order. O(1) get/set; eviction picks\n * the oldest entry (first key) when over capacity.\n */\nexport class MigratorLRU<K, V> {\n private readonly store = new Map<K, V>()\n\n constructor(private readonly capacity: number) {}\n\n get size(): number {\n return this.store.size\n }\n\n get(key: K): V | undefined {\n if (this.capacity === 0) return undefined\n const value = this.store.get(key)\n if (value === undefined) return undefined\n this.store.delete(key)\n this.store.set(key, value)\n return value\n }\n\n set(key: K, value: V): void {\n if (this.capacity === 0) return\n if (this.store.has(key)) this.store.delete(key)\n this.store.set(key, value)\n while (this.store.size > this.capacity) {\n const first = this.store.keys().next().value\n if (first === undefined) break\n this.store.delete(first)\n }\n }\n\n has(key: K): boolean {\n return this.store.has(key)\n }\n\n clear(): void {\n this.store.clear()\n }\n}\n\nlet cacheInstance: MigratorLRU<string, MigrateResult> | null = null\n\nfunction getCache(): MigratorLRU<string, MigrateResult> {\n if (cacheInstance == null) {\n cacheInstance = new MigratorLRU<string, MigrateResult>(resolveCacheCapacity())\n }\n return cacheInstance\n}\n\n/**\n * Reset the cache. Used by tests + dev-only `clearMigratorCache()` export.\n * Also re-reads env capacity, so test setup can twiddle\n * `YCW_MIGRATOR_CACHE_SIZE` and call this to apply.\n */\nexport function clearMigratorCache(): void {\n cacheInstance = null\n}\n\n/**\n * Stable hash of a spec. Returns a string short enough for cache keys but\n * long enough that collisions are vanishingly rare for the kinds of specs\n * the renderer sees (~KB to ~10s of KB JSON). We use the raw stringified\n * payload itself as the key (no hashing) — V8's internal string hashing\n * is already O(1) and the strings are bounded by spec size which is\n * effectively bounded by network limits.\n *\n * If a spec cannot be stringified (e.g. cyclic), returns `null` and the\n * caller MUST bypass the cache.\n *\n * Exported for tests.\n */\nexport function hashSpec(spec: SpecLike): string | null {\n try {\n return JSON.stringify(spec)\n } catch {\n return null\n }\n}\n\n/**\n * Wrap a migrator function with LRU caching. The cache key is derived from\n * the spec contents and the options (dry-run flag + disabled list +\n * transformer registry identity), since the same spec under different\n * options produces a different result.\n *\n * Keep this thin: the actual migration logic lives in `migrator/index.ts`'s\n * pure `migrateSpec`. This helper is the \"second floor\" exposed to entry\n * points (prepareSpec) and is not used by transformer unit tests.\n */\nexport function withCache(\n migrate: (spec: SpecLike, options?: MigrateOptions) => MigrateResult,\n): (spec: SpecLike, options?: MigrateOptions) => MigrateResult {\n return (spec, options) => {\n const specHash = hashSpec(spec)\n if (specHash == null) {\n // Unhashable input (cyclic) — skip cache, just run.\n return migrate(spec, options)\n }\n const optionsKey = stringifyOptionsKey(options)\n const key = `${optionsKey}::${specHash}`\n const cache = getCache()\n const cached = cache.get(key)\n if (cached !== undefined) {\n return { ...cached, fromCache: true }\n }\n const fresh = migrate(spec, options)\n cache.set(key, fresh)\n return { ...fresh, fromCache: false }\n }\n}\n\nfunction stringifyOptionsKey(options?: MigrateOptions): string {\n if (!options) return 'd0|x'\n const dry = options.dryRun ? 'd1' : 'd0'\n const disabled = options.disabled?.length\n ? `[${[...options.disabled].sort().join(',')}]`\n : 'x'\n // Custom transformer registries bypass the cache: their identity isn't\n // serializable, and tests pass narrow registries that should always run.\n if (options.transformers) return `${dry}|${disabled}|nocache:${Math.random()}`\n return `${dry}|${disabled}`\n}\n\n/**\n * Test-only: peek at the active cache. Not exported from the public\n * `index.ts`; only the `__tests__/` files import it directly.\n */\nexport function _internalGetCache(): MigratorLRU<string, MigrateResult> {\n return getCache()\n}\n","/**\n * CWRF-013 Phase 0 PR #1 — dry-run helpers.\n *\n * Centralises the logic that:\n * 1. Decides whether the migrator should run in dry-run mode for a given\n * environment (default rule: `NODE_ENV === 'development'` OR explicit\n * env override `YCW_MIGRATOR_DRY_RUN=true`).\n * 2. Aggregates {@link MigrateWarning}s into a single `console.warn` block\n * (one per render, one line per warning) so dev consoles do not get\n * flooded by N independent warnings on every re-render.\n * 3. Tracks already-flushed signatures so the same spec re-rendered does\n * not re-warn (idempotency requirement from §1.4 of the implementation\n * plan: \"接入必须幂等(同 spec 二次渲染不重复 warn)\").\n *\n * AC coverage: AC-PROTOCOL-018 (dry-run does not mutate spec),\n * AC-PROTOCOL-021 (dry-run report complete).\n */\n\nimport type { MigrateWarning } from './types'\n\n/**\n * Resolve dry-run default from the runtime env. Always overridable via the\n * caller-supplied `MigrateOptions.dryRun` (which takes precedence).\n *\n * Rules:\n * - `YCW_MIGRATOR_DRY_RUN=true` → true (explicit opt-in, e.g. CI audits)\n * - `YCW_MIGRATOR_DRY_RUN=false` → false (explicit opt-out)\n * - otherwise: false in production builds, false in tests, false in dev too.\n *\n * NOTE: Per Phase 0 plan §1 step 4, the JsonRender entry uses\n * `process.env.NODE_ENV === 'development'` as the *default* dry-run\n * trigger, but only after the spec has been migrated *for-real* (so we\n * still get the deprecated-fields stripped before render). The env override\n * here is for advanced usage (e.g. running a CI grep for legacy specs).\n */\nexport function resolveDefaultDryRun(): boolean {\n if (typeof process === 'undefined' || !process.env) return false\n const flag = process.env.YCW_MIGRATOR_DRY_RUN\n if (flag === 'true' || flag === '1') return true\n if (flag === 'false' || flag === '0') return false\n return false\n}\n\n/**\n * In-memory dedupe set, keyed by a flush-signature. Lives for the lifetime\n * of the JS realm; intentionally process-wide so multiple JsonRender mounts\n * sharing the same spec don't double-warn.\n *\n * Exposed via {@link clearWarningHistory} for tests.\n */\nconst flushed = new Set<string>()\n\n/**\n * Compute a stable signature for a batch of warnings. We hash by\n * (transformerId + message) tuples, sorted, so identical content under\n * different ordering also dedupes correctly.\n */\nfunction signatureOf(warnings: readonly MigrateWarning[]): string {\n if (warnings.length === 0) return '<empty>'\n return warnings\n .map((w) => `${w.transformerId}::${w.message}`)\n .sort()\n .join('|')\n}\n\n/**\n * Flush a batch of warnings to `console.warn`. Returns true if the batch\n * was actually flushed (i.e. not a dedupe-skip).\n *\n * Exported for the entry-point integration. Transformer authors do NOT\n * call this directly — they push via the `TransformContext.warn(...)` seam.\n */\nexport function flushWarnings(\n warnings: readonly MigrateWarning[],\n options?: { force?: boolean },\n): boolean {\n if (warnings.length === 0) return false\n const sig = signatureOf(warnings)\n if (!options?.force && flushed.has(sig)) return false\n flushed.add(sig)\n\n if (typeof console === 'undefined' || typeof console.warn !== 'function') {\n return true\n }\n\n // Single grouped warn: keeps dev consoles tidy. Each warning gets its own\n // line so the user can read it without expanding a group manually.\n const lines = warnings.map((w) => ` - [${w.transformerId}] ${w.message}`)\n console.warn(\n `[A2UI Migrator] ${warnings.length} legacy field${\n warnings.length === 1 ? '' : 's'\n } encountered; consider regenerating spec:\\n${lines.join('\\n')}`,\n )\n return true\n}\n\n/**\n * Flush a dry-run report to `console.warn`. Distinct from\n * {@link flushWarnings} so consumers can visually tell apart \"I migrated\n * silently\" from \"I would have migrated but didn't\".\n *\n * The report is always emitted (no dedupe) because dry-run runs are\n * inherently rare (CI / explicit env flag) and operators want to see the\n * whole picture each time.\n */\nexport function flushDryRunReport(warnings: readonly MigrateWarning[]): void {\n if (typeof console === 'undefined' || typeof console.warn !== 'function') return\n if (warnings.length === 0) {\n console.warn('[A2UI Migrator dry-run] no transformers would apply.')\n return\n }\n const lines = warnings.map((w) => ` - [${w.transformerId}] ${w.message}`)\n console.warn(\n `[A2UI Migrator dry-run] would apply ${warnings.length} change${\n warnings.length === 1 ? '' : 's'\n }:\\n${lines.join('\\n')}`,\n )\n}\n\n/**\n * Clear the dedupe history. Tests call this between cases; the JsonRender\n * entry never calls it (the dedupe is intentional across renders).\n */\nexport function clearWarningHistory(): void {\n flushed.clear()\n}\n","/**\n * CWRF-013 Phase 0 PR #1 — DataTable phantom-props transformer.\n *\n * Item 01 (P0, HIGH): the catalog historically declared four DataTable\n * fields that the renderer never read:\n *\n * - top-level `filterable` — no filter UI\n * - top-level `groupBy` — no row grouping\n * - top-level `expandable` — no expand/collapse rows\n * - column-level `column.filterable` — no per-column filter dropdown\n *\n * The first three are *guaranteed* protocol lies: removing them changes\n * nothing visually. The column-level `filterable` is also a lie today, but\n * design 01 §2.1 / Phase 0 plan §11.1 chose to RETAIN it in the catalog\n * (with an updated `.describe(...)` marker) so Agents can express intent\n * that a future Phase 3 `ColumnFilter` will honour. Since Phase 3 splits\n * DataTable into modular siblings (TableToolbar + ColumnFilter + RowGroup),\n * column-level `filterable` is preserved in the spec stream and only\n * surfaced as a dry-run warning.\n *\n * Behaviour summary:\n * - top-level filterable / groupBy / expandable: REMOVED unconditionally,\n * warning emitted via TransformContext.warn (collected into MigrateResult).\n * - column.filterable: PRESERVED in the spec; warning emitted ONLY in\n * dry-run mode (so prod renders are silent).\n * - non-DataTable elements: untouched.\n * - missing / non-object props: skipped (defensive).\n *\n * AC coverage:\n * - AC-HONESTY-002 (旧 spec 含 filterable 迁移成功)\n * - AC-PROTOCOL-017 (旧 spec 自动迁移成功) — partial; full coverage in #2-#8\n * - AC-PROTOCOL-018 (dry-run 不修改 spec)\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/01_data_table_filterable.md\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/00_phase0_implementation_plan.md §1 Item 01\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\n\n/** Top-level DataTable phantom fields (Phase 0 deletes; Phase 3 won't reintroduce). */\nconst PHANTOM_TOP_LEVEL_FIELDS = ['filterable', 'groupBy', 'expandable'] as const\n\n/** Predicate: does this element look like a DataTable that owns phantom fields? */\nfunction hasPhantomTopLevel(el: SpecElementLike | undefined): boolean {\n if (!el || el.type !== 'DataTable') return false\n const props = el.props\n if (props == null || typeof props !== 'object') return false\n return PHANTOM_TOP_LEVEL_FIELDS.some((f) => f in props)\n}\n\n/** Predicate: any column declares the deferred `filterable` flag? */\nfunction hasColumnLevelFilterable(el: SpecElementLike | undefined): boolean {\n if (!el || el.type !== 'DataTable') return false\n const props = el.props\n if (props == null || typeof props !== 'object') return false\n const columns = (props as { columns?: unknown }).columns\n if (!Array.isArray(columns)) return false\n return columns.some(\n (c) => c != null && typeof c === 'object' && 'filterable' in (c as Record<string, unknown>),\n )\n}\n\n/** True if the spec contains at least one DataTable touched by this transformer. */\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return false\n for (const el of Object.values(elements)) {\n if (hasPhantomTopLevel(el) || hasColumnLevelFilterable(el)) return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n let removedCount = 0\n let preservedColumnCount = 0\n for (const [key, el] of Object.entries(elements)) {\n if (hasPhantomTopLevel(el)) {\n affected.push(key)\n const props = el.props as Record<string, unknown>\n for (const f of PHANTOM_TOP_LEVEL_FIELDS) {\n if (f in props) removedCount += 1\n }\n }\n if (hasColumnLevelFilterable(el)) {\n if (!affected.includes(key)) affected.push(key)\n const columns = (el.props as { columns?: unknown[] }).columns ?? []\n preservedColumnCount += columns.filter(\n (c) => c != null && typeof c === 'object' && 'filterable' in (c as Record<string, unknown>),\n ).length\n }\n }\n const parts: string[] = []\n if (removedCount > 0) {\n parts.push(`would remove ${removedCount} top-level phantom field(s)`)\n }\n if (preservedColumnCount > 0) {\n parts.push(\n `${preservedColumnCount} column.filterable declaration(s) preserved (Phase 3 will implement UI)`,\n )\n }\n return {\n affectedElements: affected,\n description:\n parts.length > 0\n ? `DataTable: ${parts.join('; ')}`\n : 'DataTable: no changes',\n }\n}\n\n/**\n * Strip phantom fields from a single DataTable element, returning a fresh\n * element. Pure: caller is responsible for substituting the new element\n * into a fresh `elements` map.\n */\nfunction stripPhantomTopLevel(\n key: string,\n el: SpecElementLike,\n ctx: TransformContext,\n): SpecElementLike {\n const props = (el.props ?? {}) as Record<string, unknown>\n const nextProps: Record<string, unknown> = {}\n const removed: string[] = []\n for (const [k, v] of Object.entries(props)) {\n if (PHANTOM_TOP_LEVEL_FIELDS.includes(k as (typeof PHANTOM_TOP_LEVEL_FIELDS)[number])) {\n removed.push(k)\n continue\n }\n nextProps[k] = v\n }\n if (removed.length > 0) {\n ctx.warn(\n `DataTable \"${key}\" had ${removed\n .map((f) => `\\`${f}\\``)\n .join(', ')} (declared in catalog but never rendered). Stripped. To restore filtering / grouping / expansion, switch to TableToolbar + ColumnFilter + RowGroup once Phase 3 lands (see docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/01_data_table_filterable.md).`,\n { elementKey: key, removed },\n )\n }\n return { ...el, props: nextProps }\n}\n\n/**\n * Emit a dry-run-only deprecation note for column-level `filterable`.\n * Does NOT mutate the element — returns the input unchanged. Phase 3 will\n * grow real handling; for now we only flag intent.\n */\nfunction noteColumnLevelFilterable(\n key: string,\n el: SpecElementLike,\n ctx: TransformContext,\n): SpecElementLike {\n if (!ctx.dryRun) return el\n const columns = (el.props as { columns?: unknown[] } | undefined)?.columns ?? []\n const columnsWithFlag = columns\n .map((c, idx) => {\n if (c != null && typeof c === 'object' && 'filterable' in (c as Record<string, unknown>)) {\n const colKey = (c as { key?: unknown }).key\n return typeof colKey === 'string' ? colKey : `#${idx}`\n }\n return null\n })\n .filter((v): v is string => v != null)\n if (columnsWithFlag.length === 0) return el\n ctx.warn(\n `DataTable \"${key}\" declares \\`column.filterable\\` on [${columnsWithFlag.join(\n ', ',\n )}]; Phase 0 keeps the field but the UI is not rendered yet (Phase 3 DataTable split will implement).`,\n { elementKey: key, columns: columnsWithFlag },\n )\n return el\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n\n // Detect untouched first so we can preserve referential identity (helps\n // the LRU cache + downstream React equality checks).\n if (!appliesPredicate(spec)) return spec\n\n const nextElements: Record<string, SpecElementLike> = {}\n let mutated = false\n for (const [key, el] of Object.entries(elements)) {\n let nextEl: SpecElementLike = el\n if (hasPhantomTopLevel(el)) {\n const stripped = ctx.dryRun ? el : stripPhantomTopLevel(key, el, ctx)\n if (ctx.dryRun) {\n // In dry-run, still emit warnings (use a no-op strip pass to collect them).\n stripPhantomTopLevel(key, el, ctx)\n }\n nextEl = stripped\n if (!ctx.dryRun) mutated = true\n }\n if (hasColumnLevelFilterable(nextEl)) {\n nextEl = noteColumnLevelFilterable(key, nextEl, ctx)\n }\n nextElements[key] = nextEl\n }\n if (!mutated) return spec\n return { ...spec, elements: nextElements }\n}\n\nexport const legacyDataTablePropsTransformer: SpecTransformer = {\n id: 'legacy.datatable.phantom-props',\n title: 'DataTable phantom props (filterable / groupBy / expandable)',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * CWRF-013 Phase 3 PR-P3-#1 — DataTable split-toolbar transformer.\n *\n * Phase 3 §2.4 decision #4 (delete-old + transformer-only) requires that\n * legacy DataTable specs migrate **automatically** (≥ 95% rate) to the new\n * split-component composition introduced by Split C:\n *\n * legacy: migrated:\n *\n * DataTable { Stack { gap: 'sm', children: [\n * columns: [ ColumnFilterRow { children: [\n * { key: 'status', ColumnFilter {\n * filterable: true, ... }, column: 'status',\n * { key: 'region', filterPath:\n * filterable: true, ... }], '_legacyFilter_<dt>.status',\n * data: [...], options: distinct(data.status)\n * ... },\n * } ColumnFilter { column: 'region',\n * filterPath:\n * '_legacyFilter_<dt>.region',\n * options: distinct(data.region)\n * }\n * ]},\n * DataTable {\n * columns: [...stripped...],\n * data: [...],\n * filterPath:\n * '_legacyFilter_<dt>',\n * ...\n * }\n * ]}\n *\n * Phase 0 (legacy.datatable.phantom-props) already removed top-level\n * `filterable / groupBy / expandable` and only PRESERVED `column.filterable`\n * (with a dry-run note that \"Phase 3 will implement UI\"). This transformer\n * is the Phase 3 follow-through that actually consumes the preserved\n * column-level flag and emits the matching sibling components.\n *\n * Order: this transformer runs AFTER `legacy.datatable.phantom-props`. The\n * Phase-0 transformer leaves `column.filterable` intact; this transformer\n * removes it after generating the sibling, so the final spec is clean.\n *\n * Idempotency: rerunning on an already-migrated spec is a no-op because the\n * `applies()` predicate checks for `column.filterable === true` (the exact\n * legacy hint), which we strip on first pass.\n *\n * Behavioural guarantees\n * ----------------------\n * 1. DataTable as `root` element: wrap in a generated Stack. The previous\n * root key is preserved on the Stack so any external (e.g. demo / state)\n * reference to the DataTable element key continues to point at the same\n * DataTable element.\n * 2. DataTable inside `parent.children`: insert the generated `__filters`\n * Row before the DataTable key in that parent's children array.\n * 3. Multiple DataTables in one spec: each migrated independently.\n * 4. Non-string / non-number / non-boolean cell values: skipped when\n * deriving distinct options (no JSON.stringify exposure).\n * 5. Generated keys collide with existing keys: numeric suffix appended\n * (defensive; should never trigger in practice given prefix scheme).\n *\n * AC coverage\n * -----------\n * - AC-REFACTOR-009 / -010 / -011 (Phase 3 Split C acceptance criteria).\n * - AC-PROTOCOL-017 (legacy spec auto-migrates to new structure).\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/03_data_table_modular.md\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md §2.4\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/01_data_table_filterable.md\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\n\n/** Stable prefix for the shared filter root path written to ctx.warn metadata. */\nconst FILTER_PATH_PREFIX = '_legacyFilter_'\n\n/** Identify a DataTable that owns at least one column with `filterable === true`. */\nfunction getFilterableColumns(el: SpecElementLike | undefined): { key: string; index: number }[] {\n if (!el || el.type !== 'DataTable') return []\n const props = el.props\n if (props == null || typeof props !== 'object') return []\n const columns = (props as { columns?: unknown }).columns\n if (!Array.isArray(columns)) return []\n const out: { key: string; index: number }[] = []\n columns.forEach((c, idx) => {\n if (\n c != null &&\n typeof c === 'object' &&\n (c as Record<string, unknown>).filterable === true &&\n typeof (c as { key?: unknown }).key === 'string'\n ) {\n out.push({ key: (c as { key: string }).key, index: idx })\n }\n })\n return out\n}\n\n/** Strip `filterable` flag from any column so the Zod schema stays clean. */\nfunction stripFilterableFromColumns(columns: unknown[]): unknown[] {\n return columns.map((c) => {\n if (c == null || typeof c !== 'object') return c\n const { filterable: _filterable, ...rest } = c as Record<string, unknown>\n return rest\n })\n}\n\n/** Distinct values of `col` across `data`, normalised to string options. */\nfunction distinctOptions(\n data: unknown,\n col: string,\n): { value: string; label: string }[] {\n if (!Array.isArray(data)) return []\n const seen = new Set<string>()\n for (const row of data) {\n if (row == null || typeof row !== 'object') continue\n if (!(col in (row as Record<string, unknown>))) continue\n const v = (row as Record<string, unknown>)[col]\n if (typeof v === 'string' && v.length > 0) seen.add(v)\n else if (typeof v === 'number') seen.add(String(v))\n else if (typeof v === 'boolean') seen.add(String(v))\n }\n return [...seen]\n .sort((a, b) => a.localeCompare(b))\n .map((v) => ({ value: v, label: v }))\n}\n\n/** Find the parent key of `childKey` (first match wins). Returns null when child is root. */\nfunction findParentKey(spec: SpecLike, childKey: string): string | null {\n const elements = spec.elements\n if (!elements) return null\n for (const [key, el] of Object.entries(elements)) {\n if (Array.isArray(el.children) && el.children.includes(childKey)) return key\n }\n return null\n}\n\n/** Allocate a fresh element key, suffixing on collision. */\nfunction allocateKey(taken: Set<string>, base: string): string {\n if (!taken.has(base)) {\n taken.add(base)\n return base\n }\n let i = 2\n while (taken.has(`${base}_${i}`)) i += 1\n const k = `${base}_${i}`\n taken.add(k)\n return k\n}\n\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements) return false\n for (const el of Object.values(elements)) {\n if (getFilterableColumns(el).length > 0) return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n let totalNewElements = 0\n for (const [key, el] of Object.entries(elements)) {\n const cols = getFilterableColumns(el)\n if (cols.length === 0) continue\n affected.push(key)\n // 1 row + N filters; +1 wrapper Stack iff DataTable is root.\n let n = 1 + cols.length\n if (spec.root === key) n += 1\n totalNewElements += n\n }\n return {\n affectedElements: affected,\n description:\n affected.length === 0\n ? 'DataTable split-toolbar: no changes'\n : `DataTable split-toolbar: would migrate ${affected.length} DataTable(s) → +${totalNewElements} sibling(s)`,\n }\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n if (!appliesPredicate(spec)) return spec\n\n if (ctx.dryRun) {\n // Emit a heads-up warning per affected DataTable but do not mutate.\n for (const [key, el] of Object.entries(elements)) {\n const cols = getFilterableColumns(el)\n if (cols.length === 0) continue\n ctx.warn(\n `DataTable \"${key}\" has ${cols.length} column(s) with \\`filterable: true\\`; would inflate matching sibling ColumnFilter elements (Phase 3 split-toolbar).`,\n { elementKey: key, columns: cols.map((c) => c.key) },\n )\n }\n return spec\n }\n\n const taken = new Set(Object.keys(elements))\n let nextElements: Record<string, SpecElementLike> = { ...elements }\n let nextRoot = spec.root\n let mutated = false\n\n for (const [dtKey, originalDt] of Object.entries(elements)) {\n const filterableCols = getFilterableColumns(originalDt)\n if (filterableCols.length === 0) continue\n\n const dtProps = (originalDt.props ?? {}) as Record<string, unknown>\n const filterRoot = `${FILTER_PATH_PREFIX}${dtKey}`\n\n const cleanColumns = stripFilterableFromColumns(\n Array.isArray(dtProps.columns) ? dtProps.columns : [],\n )\n\n const migratedDt: SpecElementLike = {\n ...originalDt,\n props: {\n ...dtProps,\n columns: cleanColumns,\n // Preserve any user-set filterPath; only assign when missing.\n filterPath:\n typeof dtProps.filterPath === 'string' && dtProps.filterPath.length > 0\n ? dtProps.filterPath\n : filterRoot,\n },\n }\n\n const filterRowKey = allocateKey(taken, `${dtKey}__filters`)\n const filterChildKeys: string[] = []\n for (const col of filterableCols) {\n const cfKey = allocateKey(taken, `${dtKey}__filter_${col.key}`)\n filterChildKeys.push(cfKey)\n nextElements[cfKey] = {\n type: 'ColumnFilter',\n props: {\n column: col.key,\n filterPath: `${\n typeof dtProps.filterPath === 'string' && dtProps.filterPath.length > 0\n ? dtProps.filterPath\n : filterRoot\n }.${col.key}`,\n options: distinctOptions(dtProps.data, col.key),\n },\n }\n }\n nextElements[filterRowKey] = {\n type: 'Row',\n props: { gap: 'sm' },\n children: filterChildKeys,\n }\n\n if (spec.root === dtKey) {\n // Wrap with Stack; preserve dtKey (external state references stay valid).\n const stackKey = allocateKey(taken, `${dtKey}__container`)\n nextElements[stackKey] = {\n type: 'Stack',\n props: { gap: 'sm' },\n children: [filterRowKey, dtKey],\n }\n nextElements[dtKey] = migratedDt\n nextRoot = stackKey\n } else {\n const parentKey = findParentKey(spec, dtKey)\n if (parentKey == null) {\n // Orphan element with no parent and not root — skip the wrapper but\n // still strip column.filterable on the migrated DataTable.\n nextElements[dtKey] = migratedDt\n ctx.warn(\n `DataTable \"${dtKey}\" has filterable columns but no parent and is not root; ColumnFilter sibling created but unreachable.`,\n { elementKey: dtKey },\n )\n } else {\n const parent = nextElements[parentKey] ?? elements[parentKey]\n const parentChildren = Array.isArray(parent.children) ? [...parent.children] : []\n const idx = parentChildren.indexOf(dtKey)\n if (idx >= 0) parentChildren.splice(idx, 0, filterRowKey)\n else parentChildren.push(filterRowKey)\n nextElements[parentKey] = { ...parent, children: parentChildren }\n nextElements[dtKey] = migratedDt\n }\n }\n\n ctx.warn(\n `DataTable \"${dtKey}\": migrated ${filterableCols.length} column(s) with \\`filterable: true\\` → ColumnFilter sibling(s) under \\`${filterRowKey}\\`. filterPath=\"${\n (migratedDt.props as { filterPath?: string }).filterPath\n }\".`,\n {\n elementKey: dtKey,\n filterRowKey,\n columns: filterableCols.map((c) => c.key),\n },\n )\n mutated = true\n }\n\n if (!mutated) return spec\n return { ...spec, root: nextRoot, elements: nextElements }\n}\n\nexport const legacyDataTableSplitToolbarTransformer: SpecTransformer = {\n id: 'legacy.datatable.split-toolbar',\n title: 'DataTable split-toolbar (column.filterable → sibling ColumnFilter)',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * CWRF-013 Phase 3 PR-P3-#2 — RiskRegister split transformer.\n *\n * Phase 3 §2.4 decision #4 (delete-old + transformer-only) requires that\n * legacy RiskRegister specs migrate **automatically** (≥ 95% rate) to the\n * new split-component composition introduced by Split D:\n *\n * legacy: migrated (mode='list' | undefined):\n *\n * RiskRegister { RiskList {\n * mode: 'list', risks: [...]\n * risks: [...], }\n * variant: 'compact'?,\n * } migrated (mode='matrix'):\n * RiskHeatMatrix {\n * risks: [...]\n * }\n *\n * migrated (mode='both'):\n * Stack { gap: 'lg', children: [\n * RiskHeatMatrix { risks: [...] },\n * RiskList { risks: [...] }\n * ]}\n *\n * The legacy source declared `mode: 'list' | 'matrix'` only — `'both'` is\n * a v1.0 design-draft hypothesis the migrator gracefully promotes to a\n * Stack composition. Likewise the v1.0 draft used a `view` field name\n * before v1.1 校准 (D-6) reconciled the design with the real source\n * `mode` field; the transformer reads `props.mode ?? props.view ??\n * 'list'` so specs authored against either naming migrate cleanly.\n *\n * Data contract guarantees\n * ------------------------\n * - Categorical severity × likelihood model preserved (v1.1 校准 — see\n * 04_risk_register_split.md §5 revision note D-6). NO numeric\n * probability × impact mapping is attempted; if a caller passes\n * numeric fields they fail Zod validation downstream rather than be\n * silently coerced.\n * - The legacy `variant` cosmetic prop is dropped silently — neither\n * RiskList nor RiskHeatMatrix accept it (the old source only honoured\n * `--compact` in CSS, which the new components inherit through the\n * shared `.jr-risk-register` class). `ctx.warn` records the drop for\n * observability.\n * - Phase 1 named-slot inflation (`legacy.slots.named-children`) only\n * touches elements whose catalog entry declares slots; neither\n * RiskRegister nor its replacements declare slots, so transformer\n * order vs that step is order-independent.\n *\n * Behavioural guarantees\n * ----------------------\n * 1. RiskRegister as `root` element: the migrated element (RiskList or\n * RiskHeatMatrix or wrapping Stack) keeps the original key, so any\n * external state / demo reference to the element id continues to\n * point at the same node.\n * 2. RiskRegister inside `parent.children`: in-place substitution; the\n * parent's children array is untouched (the key is still there, the\n * element behind it is rewritten).\n * 3. mode='both': the original key becomes the Stack; two child\n * elements get fresh keys (`<key>__matrix`, `<key>__list`),\n * suffixed numerically only on collision.\n * 4. Multiple RiskRegisters in one spec: each migrated independently;\n * `ctx.warn` is called once per migrated element with the\n * bucket counts so downstream observability remains 1:1 with input.\n * 5. Empty / non-array `risks`: passthrough — the replacement component\n * has the same defensive empty-state contract as the legacy view.\n *\n * Idempotency\n * -----------\n * Rerunning on an already-migrated spec is a no-op because the\n * `applies()` predicate checks specifically for `type === 'RiskRegister'`.\n * Once migrated the type is RiskList / RiskHeatMatrix / Stack and the\n * predicate returns false.\n *\n * AC coverage\n * -----------\n * - AC-REFACTOR-013 (RiskRegister source file deleted)\n * - AC-REFACTOR-014 (RiskList / RiskHeatMatrix independently usable)\n * - AC-REFACTOR-015 (legacy mode='both' migrates to Stack[matrix, list])\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/04_risk_register_split.md §2.2 + §2.5 + §5\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #4\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\n\ntype LegacyMode = 'list' | 'matrix' | 'both'\n\nconst KNOWN_MODES: ReadonlySet<LegacyMode> = new Set<LegacyMode>(['list', 'matrix', 'both'])\n\n/** Read `mode` from the legacy element, gracefully accepting `view` as an alias. */\nfunction readMode(el: SpecElementLike): LegacyMode {\n const p = (el.props ?? {}) as { mode?: unknown; view?: unknown }\n const raw = typeof p.mode === 'string' && p.mode.length > 0\n ? p.mode\n : typeof p.view === 'string' && p.view.length > 0\n ? p.view\n : 'list'\n return (KNOWN_MODES.has(raw as LegacyMode) ? raw : 'list') as LegacyMode\n}\n\n/** Allocate a fresh key, suffixing on collision so multi-RiskRegister specs stay deterministic. */\nfunction allocateKey(taken: Set<string>, base: string): string {\n if (!taken.has(base)) {\n taken.add(base)\n return base\n }\n let i = 2\n while (taken.has(`${base}_${i}`)) i += 1\n const k = `${base}_${i}`\n taken.add(k)\n return k\n}\n\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements) return false\n for (const el of Object.values(elements)) {\n if (el.type === 'RiskRegister') return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n let totalNew = 0\n for (const [key, el] of Object.entries(elements)) {\n if (el.type !== 'RiskRegister') continue\n affected.push(key)\n // mode='both' inflates +2 children (Stack reuses the original key).\n if (readMode(el) === 'both') totalNew += 2\n }\n return {\n affectedElements: affected,\n description:\n affected.length === 0\n ? 'RiskRegister split: no changes'\n : `RiskRegister split: would migrate ${affected.length} element(s) → +${totalNew} sibling(s)`,\n }\n}\n\nfunction migrateOne(\n origKey: string,\n origEl: SpecElementLike,\n taken: Set<string>,\n ctx: TransformContext,\n): { entries: Record<string, SpecElementLike>; warnedMode: LegacyMode } {\n const mode = readMode(origEl)\n const props = (origEl.props ?? {}) as { risks?: unknown; variant?: unknown; mode?: unknown; view?: unknown }\n const risks = props.risks\n const hasVariant = typeof props.variant === 'string' && props.variant.length > 0\n\n if (hasVariant) {\n ctx.warn(\n `RiskRegister \"${origKey}\": dropping legacy \\`variant\\` prop \"${String(props.variant)}\" — RiskList/RiskHeatMatrix don't accept it (theme overrides should target .jr-risk-register CSS).`,\n { elementKey: origKey, prop: 'variant', value: props.variant },\n )\n }\n\n if (mode === 'list') {\n return {\n entries: { [origKey]: { type: 'RiskList', props: { risks } } },\n warnedMode: 'list',\n }\n }\n\n if (mode === 'matrix') {\n return {\n entries: { [origKey]: { type: 'RiskHeatMatrix', props: { risks } } },\n warnedMode: 'matrix',\n }\n }\n\n // mode === 'both' — original key becomes the wrapping Stack.\n const matrixKey = allocateKey(taken, `${origKey}__matrix`)\n const listKey = allocateKey(taken, `${origKey}__list`)\n return {\n entries: {\n [origKey]: {\n type: 'Stack',\n props: { gap: 'lg' },\n children: [matrixKey, listKey],\n },\n [matrixKey]: { type: 'RiskHeatMatrix', props: { risks } },\n [listKey]: { type: 'RiskList', props: { risks } },\n },\n warnedMode: 'both',\n }\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n if (!appliesPredicate(spec)) return spec\n\n if (ctx.dryRun) {\n for (const [key, el] of Object.entries(elements)) {\n if (el.type !== 'RiskRegister') continue\n const m = readMode(el)\n ctx.warn(\n `RiskRegister \"${key}\" mode=\"${m}\": would replace with ${\n m === 'list'\n ? 'RiskList'\n : m === 'matrix'\n ? 'RiskHeatMatrix'\n : 'Stack[RiskHeatMatrix, RiskList]'\n } (Phase 3 split).`,\n { elementKey: key, mode: m },\n )\n }\n return spec\n }\n\n const taken = new Set(Object.keys(elements))\n const nextElements: Record<string, SpecElementLike> = { ...elements }\n let mutated = false\n\n for (const [origKey, origEl] of Object.entries(elements)) {\n if (origEl.type !== 'RiskRegister') continue\n const { entries, warnedMode } = migrateOne(origKey, origEl, taken, ctx)\n for (const [k, v] of Object.entries(entries)) nextElements[k] = v\n ctx.warn(\n `RiskRegister \"${origKey}\": migrated mode=\"${warnedMode}\" → ${\n warnedMode === 'both'\n ? 'Stack[RiskHeatMatrix, RiskList]'\n : warnedMode === 'matrix'\n ? 'RiskHeatMatrix'\n : 'RiskList'\n }.`,\n { elementKey: origKey, mode: warnedMode },\n )\n mutated = true\n }\n\n if (!mutated) return spec\n return { ...spec, elements: nextElements }\n}\n\nexport const legacyRiskRegisterSplitTransformer: SpecTransformer = {\n id: 'legacy.riskregister.split',\n title: 'RiskRegister split (mode → RiskList / RiskHeatMatrix / Stack)',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) — pure\n * normalization helpers for the upcoming `legacy.dashboardlayout.split`\n * transformer (commit 5/N — A-05).\n *\n * Why this module exists\n * ---------------------\n * The legacy 520-LOC `DashboardLayout` accepts FIVE different sidebar\n * shapes (string[] / { sections } / { items } / { navigation } / { menu })\n * and THREE different section-mapping fallback strategies (explicit\n * `sectionMap` / name-match on `sectionId` / sequential by sidebar\n * order). v1.1 of the design doc (see §2.8.1 + §2.8.2) hoists these\n * into pure functions so the new `SideNav` + `SectionRouter`\n * components can stay under 100 LOC each (AC-REFACTOR-002).\n *\n * Both helpers are deterministic, side-effect-free, and produce JSON-\n * serialisable output. They are exported as pure functions (NOT a\n * SpecTransformer); the transformer wraps them in A-05. Decoupling\n * the algorithms from the SpecTransformer wiring makes them:\n *\n * - Trivially testable (15 fixtures: 5 sidebar shapes × 3 mapping\n * strategies — see `__tests__/legacy-dashboardlayout-normalize`).\n * - Reusable from other migrators or runtime code (e.g. a future\n * `appShellBuilder` helper for Agent-emitted specs).\n * - Easy to audit independently — the parsing rules live in one\n * focused module instead of being spread across the 520-LOC\n * legacy component.\n *\n * Design refs:\n * - 04_overdesign_refactor/01_dashboard_layout_split.md §2.8.1 + §2.8.2 + §2.8.3\n * - Legacy source: src/components/JsonRender/domain/DashboardLayout.tsx\n * lines 235-363 (`normalizeSidebar` + `buildSectionMapping`)\n */\n\n// ─────────────────────────────────────────────────────────────────────\n// 5-shape sidebar normalisation (§2.8.1)\n// ─────────────────────────────────────────────────────────────────────\n\nexport interface NormalizedSidebarItem {\n id: string\n label: string\n icon?: string\n /** Preserved from object-shape inputs; null when not provided. */\n sectionId?: string\n}\n\n/**\n * Same emoji regex shape as the legacy `DashboardLayout.tsx` L247 so\n * the migrator preserves the \"id 🏠 Label\" string convention LLM\n * specs frequently emit (e.g. `\"home 🏠 Overview\"` → id `home`, icon\n * `🏠`, label `Overview`).\n */\nconst EMOJI_RE = /^(\\w[\\w-]*)\\s+([\\p{Emoji_Presentation}\\p{Extended_Pictographic}]+)\\s*(.+)$/u\n\nfunction kebabCase(s: string): string {\n return s.trim().toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '')\n}\n\nfunction normalizeOneItem(raw: unknown, idx: number): NormalizedSidebarItem | null {\n if (typeof raw === 'string') {\n const trimmed = raw.trim()\n if (trimmed.length === 0) return null\n const m = EMOJI_RE.exec(trimmed)\n if (m) return { id: m[1], icon: m[2], label: m[3].trim() }\n // Plain string fallback — id derived from kebab-cased label;\n // if kebab-cased is empty, fall back to a stable index id so\n // ordering survives.\n const id = kebabCase(trimmed) || `item-${idx}`\n return { id, label: trimmed }\n }\n if (!raw || typeof raw !== 'object') return null\n const obj = raw as Record<string, unknown>\n const labelRaw = obj.label ?? obj.name ?? obj.title\n const label = typeof labelRaw === 'string' && labelRaw.length > 0 ? labelRaw : `Item ${idx + 1}`\n const idRaw = obj.id ?? obj.key\n const id = typeof idRaw === 'string' && idRaw.length > 0 ? idRaw : kebabCase(label) || `item-${idx}`\n const icon = typeof obj.icon === 'string' ? obj.icon : undefined\n const sectionIdRaw = obj.sectionId ?? obj.section_id ?? obj.href\n const sectionId = typeof sectionIdRaw === 'string' ? sectionIdRaw : undefined\n return { id, label, icon, sectionId }\n}\n\n/**\n * Normalize the 5 sidebar input shapes into a flat\n * `NormalizedSidebarItem[]` list.\n *\n * (a) `string[]` — each item kebab-cased into { id, label }; emoji prefix preserved.\n * (b) `{ sections: [...] }` — flattens `sections[i].items` into one list per design doc §2.8.1.\n * (c) `{ items: [...] }` — direct passthrough.\n * (d) `{ navigation: [...] }` — direct passthrough.\n * (e) `{ menu: [...] }` — direct passthrough.\n *\n * Anything else (null, primitives, arrays of mixed primitives) → `[]`.\n *\n * The function is pure and deterministic — same input always returns\n * the same output, in the same order, with the same id derivation.\n */\nexport function normalizeSidebarToItems(raw: unknown): NormalizedSidebarItem[] {\n if (raw === null || raw === undefined) return []\n // (a) — string array\n if (Array.isArray(raw)) {\n return raw\n .map((it, i) => normalizeOneItem(it, i))\n .filter((it): it is NormalizedSidebarItem => it !== null)\n }\n if (typeof raw !== 'object') return []\n const obj = raw as Record<string, unknown>\n // (b) — { sections: [...] }\n if (Array.isArray(obj.sections)) {\n const items: NormalizedSidebarItem[] = []\n let counter = 0\n for (const sec of obj.sections as unknown[]) {\n if (sec && typeof sec === 'object' && Array.isArray((sec as { items?: unknown[] }).items)) {\n for (const it of (sec as { items: unknown[] }).items) {\n const n = normalizeOneItem(it, counter++)\n if (n) items.push(n)\n }\n }\n }\n return items\n }\n // (c)-(e) — { items | navigation | menu : [...] }\n for (const key of ['items', 'navigation', 'menu'] as const) {\n const arr = obj[key]\n if (Array.isArray(arr)) {\n return arr\n .map((it, i) => normalizeOneItem(it, i))\n .filter((it): it is NormalizedSidebarItem => it !== null)\n }\n }\n return []\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// 3-strategy section mapping (§2.8.2)\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Result of `buildSectionMappingEntries`: ordered list of\n * `[sectionId, contentElementKey]` tuples. Order matches the input\n * navItems order so SectionRouter children can be re-emitted in the\n * same sequence.\n */\nexport type SectionMappingEntry = [sectionId: string, contentKey: string]\n\n/**\n * Derive a `[sectionId, contentElementKey][]` mapping from the legacy\n * DashboardLayout inputs, using 3 fallback strategies in order:\n *\n * (1) **Explicit** — `sectionMap[navItem.id]` (or `sectionMap[strippedSectionId]`)\n * provides the content key directly. The legacy source uses\n * `Record<string, string[]>` (multi-content per section); the\n * new SectionRouter consumes a single content key per section,\n * so we collapse to the FIRST content key per section. Sections\n * whose mapping resolves to a non-empty content key are kept.\n *\n * (2) **Name match** — `navItem.sectionId` (with optional leading\n * '#') OR `navItem.id` matches an element key in `childKeys`\n * case-insensitively. If the case-sensitive match fails, fall\n * back to a case-insensitive match (legacy parity).\n *\n * (3) **Sequential** — `navItems[i].id → childKeys[i]`. When\n * `childKeys` is shorter than `navItems`, missing slots become\n * `${navItems[i].id}_placeholder` so SectionRouter still has a\n * deterministic key reference (the migrator will emit a\n * placeholder element for it in A-05).\n *\n * Pure function — no side effects, deterministic order. When no nav\n * items are provided, returns `[]` regardless of strategy.\n */\nexport function buildSectionMappingEntries(\n sectionMap: Record<string, string[] | string> | undefined,\n navItems: ReadonlyArray<{ id: string; sectionId?: string }>,\n childKeys: ReadonlyArray<string> = [],\n): SectionMappingEntry[] {\n if (navItems.length === 0) return []\n\n // ── strategy (1): explicit sectionMap\n if (sectionMap && Object.keys(sectionMap).length > 0) {\n const explicit: SectionMappingEntry[] = []\n for (const item of navItems) {\n const stripped = item.sectionId?.replace(/^#/, '') ?? ''\n const raw =\n sectionMap[item.id]\n ?? (stripped.length > 0 ? sectionMap[stripped] : undefined)\n if (raw === undefined) continue\n // Collapse `string[]` to first key (legacy used multi-content\n // visibility; SectionRouter consumes 1 content key per section).\n const contentKey = Array.isArray(raw) ? raw.find((k) => typeof k === 'string' && k.length > 0) : raw\n if (typeof contentKey === 'string' && contentKey.length > 0) {\n explicit.push([item.id, contentKey])\n }\n }\n if (explicit.length > 0) return explicit\n }\n\n // ── strategy (2): name match\n if (childKeys.length > 0) {\n const lowerKeys = childKeys.map((k) => k.toLowerCase())\n const matched: SectionMappingEntry[] = []\n for (const item of navItems) {\n const candidates = [item.id, item.sectionId?.replace(/^#/, '')]\n .filter((s): s is string => typeof s === 'string' && s.length > 0)\n let hit: string | undefined\n for (const cand of candidates) {\n const exact = childKeys.find((k) => k === cand || k.endsWith(`_${cand}`))\n if (exact) { hit = exact; break }\n const lower = cand.toLowerCase()\n const idx = lowerKeys.indexOf(lower)\n if (idx >= 0) { hit = childKeys[idx]; break }\n }\n if (hit) matched.push([item.id, hit])\n }\n if (matched.length === navItems.length) return matched\n }\n\n // ── strategy (3): sequential fallback\n return navItems.map((item, i): SectionMappingEntry => [\n item.id,\n childKeys[i] ?? `${item.id}_placeholder`,\n ])\n}\n","/**\n * CWRF-013 Phase 3 PR-P3-#3 — DashboardLayout split transformer.\n *\n * Phase 3 §2.4 decision #4 (delete-old + transformer-only with ≥95%\n * automation rate) requires that legacy DashboardLayout specs\n * migrate **automatically** to the new sibling composition\n * introduced by Split A:\n *\n * legacy: migrated (no sidebar):\n * DashboardLayout { AppChrome {\n * title, subtitle, title, subtitle,\n * sidebar?: 5 shapes, actions: topBar.actions\n * sectionMap?: ..., } children: [original children…]\n * topBar?: { actions: [...] },\n * } migrated (with sidebar):\n * AppChrome > Row > [\n * SideNav { items, selectedPath },\n * SectionRouter { sections, activeIdPath } > [content keys…]\n * ]\n *\n * Algorithm — outline\n * -------------------\n * 1. Read the 5 real props (title / subtitle / sidebar / sectionMap /\n * topBar.actions) via narrow type-guards. Anything else is ignored\n * (the legacy 520-LOC source never exposed `headerActions /\n * navigation / defaultSection / sections / layout / gridColumns /\n * responsive` — see v1.1 校准 D-1 in the design doc).\n * 2. Normalize `sidebar` to a flat `NormalizedSidebarItem[]` via the\n * pure helper from commit 4/N (A-04). The 5 input shapes\n * (string[] / sections / items / navigation / menu) collapse to one\n * representation here.\n * 3. Derive a positional `[sectionId, contentKey][]` mapping via the\n * pure helper from commit 4/N. Three fallback strategies cascade\n * (explicit sectionMap → name-match → sequential). When the\n * fallback emits `${id}_placeholder` content keys, the migrator\n * inflates a placeholder `Box` element so the spec graph stays\n * closed.\n * 4. Emit the new element graph:\n * - `${origKey}` → AppChrome (keeps the original key so\n * external state / demo refs survive)\n * - `${origKey}__body` → Row (when sidebar non-empty)\n * - `${origKey}__nav` → SideNav (when sidebar non-empty)\n * - `${origKey}__main` → SectionRouter (when sidebar non-empty)\n * - `${origKey}__placeholder__<id>` → Box (when sectionEntries\n * produced a `*_placeholder` key not present in the spec)\n * Keys are suffixed numerically on collision via `allocateKey`.\n *\n * Behavioural guarantees\n * ----------------------\n * 1. DashboardLayout as `root` element: AppChrome keeps the original\n * key, so `spec.root` keeps pointing at the right element.\n * 2. DashboardLayout inside `parent.children`: in-place substitution\n * — the parent's children array is untouched (the key is still\n * there, the element behind it is rewritten).\n * 3. No sidebar (5 shapes all yield 0 items): SideNav + SectionRouter\n * are skipped entirely; AppChrome wraps the original children\n * directly per design doc §3 row 1.\n * 4. State path: `${origKey}.currentSection` (dotted) bound to\n * SideNav.selectedPath AND SectionRouter.activeIdPath. The dotted\n * notation is RFC-6901-translated by SideNav / SectionRouter\n * themselves via `_filterPath.dotPathToPointer`; the migrator\n * emits the friendly dotted form to keep the spec readable.\n * 5. `topBar.actions[i]` shape passes through unchanged into\n * `AppChrome.props.actions` — same schema, same field names.\n * 6. Multiple DashboardLayouts in one spec: each migrated\n * independently with a shared `taken` set so suffixed keys never\n * collide. One `ctx.warn` per migrated element with summary\n * counts; one separate warn per inflated placeholder.\n * 7. Placeholder content keys: when buildSectionMappingEntries\n * returns a key ending in `_placeholder` AND that key is not\n * already a real element, the migrator inflates an inert\n * `Box {}` element under that key and emits a warning so the\n * spec author can flesh it out later.\n *\n * Idempotency\n * -----------\n * `applies()` only matches `type === 'DashboardLayout'`. Once the\n * transformer has run, the root element has type AppChrome and\n * applies() returns false on the next pass. Safe to rerun on cached\n * specs without producing duplicate `__body / __nav / __main`\n * subtrees.\n *\n * AC coverage\n * -----------\n * - AC-REFACTOR-001 (DashboardLayout source deletion gate ships in\n * A-06; this transformer satisfies the prerequisite that no live\n * spec references the legacy type after migration)\n * - AC-REFACTOR-003 (5 layout variants migrate automatically — the\n * 28 helper tests + 7 fixtures here exceed the ≥95% in-PR target)\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/01_dashboard_layout_split.md §2.6 + §2.8 + §3\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #4\n * - sibling transformer: src/components/JsonRender/migrator/transforms/legacy-riskregister-split.ts (Phase 3 PR-P3-#2 template)\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\nimport {\n buildSectionMappingEntries,\n normalizeSidebarToItems,\n} from './legacy-dashboardlayout-normalize'\n\ninterface LegacyDashboardLayoutProps {\n title?: unknown\n subtitle?: unknown\n sidebar?: unknown\n sectionMap?: unknown\n topBar?: unknown\n}\n\ninterface TopBarAction {\n label: string\n action: string\n variant?: 'primary' | 'secondary' | 'ghost'\n icon?: string\n}\n\nfunction readActions(topBar: unknown): TopBarAction[] {\n if (!topBar || typeof topBar !== 'object') return []\n const actions = (topBar as { actions?: unknown }).actions\n if (!Array.isArray(actions)) return []\n return actions\n .filter(\n (a): a is TopBarAction =>\n a !== null\n && typeof a === 'object'\n && typeof (a as { label?: unknown }).label === 'string'\n && typeof (a as { action?: unknown }).action === 'string',\n )\n .map((a) => {\n const out: TopBarAction = { label: a.label, action: a.action }\n const variant = (a as { variant?: unknown }).variant\n if (variant === 'primary' || variant === 'secondary' || variant === 'ghost') {\n out.variant = variant\n }\n const icon = (a as { icon?: unknown }).icon\n if (typeof icon === 'string') out.icon = icon\n return out\n })\n}\n\nfunction readSectionMap(raw: unknown): Record<string, string[]> | undefined {\n if (!raw || typeof raw !== 'object') return undefined\n const obj = raw as Record<string, unknown>\n const out: Record<string, string[]> = {}\n let any = false\n for (const [k, v] of Object.entries(obj)) {\n if (Array.isArray(v)) {\n const items = v.filter((x): x is string => typeof x === 'string')\n if (items.length > 0) {\n out[k] = items\n any = true\n }\n } else if (typeof v === 'string' && v.length > 0) {\n out[k] = [v]\n any = true\n }\n }\n return any ? out : undefined\n}\n\nfunction allocateKey(taken: Set<string>, base: string): string {\n if (!taken.has(base)) {\n taken.add(base)\n return base\n }\n let i = 2\n while (taken.has(`${base}_${i}`)) i += 1\n const k = `${base}_${i}`\n taken.add(k)\n return k\n}\n\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements) return false\n for (const el of Object.values(elements)) {\n if (el.type === 'DashboardLayout') return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n let totalNew = 0\n for (const [key, el] of Object.entries(elements)) {\n if (el.type !== 'DashboardLayout') continue\n affected.push(key)\n const p = (el.props ?? {}) as LegacyDashboardLayoutProps\n const navItems = normalizeSidebarToItems(p.sidebar)\n if (navItems.length > 0) {\n // SideNav + Row + SectionRouter inflate +3 siblings (AppChrome\n // takes over the original key). Placeholder inflation is\n // additive on top; counted at transform time so estimate stays\n // cheap and predictable.\n totalNew += 3\n }\n }\n return {\n affectedElements: affected,\n description:\n affected.length === 0\n ? 'DashboardLayout split: no changes'\n : `DashboardLayout split: would migrate ${affected.length} element(s) → +${totalNew} sibling(s) (Phase 3 PR-P3-#3)`,\n }\n}\n\ninterface MigrationOutput {\n entries: Record<string, SpecElementLike>\n inflatedPlaceholders: string[]\n navItemCount: number\n sectionCount: number\n variant: 'no-sidebar' | 'with-sidebar'\n}\n\nfunction migrateOne(\n origKey: string,\n origEl: SpecElementLike,\n existingKeys: ReadonlySet<string>,\n taken: Set<string>,\n): MigrationOutput {\n const p = (origEl.props ?? {}) as LegacyDashboardLayoutProps\n const title = typeof p.title === 'string' ? p.title : ''\n const subtitle = typeof p.subtitle === 'string' ? p.subtitle : undefined\n const actions = readActions(p.topBar)\n const navItems = normalizeSidebarToItems(p.sidebar)\n const childKeys = Array.isArray(origEl.children) ? origEl.children.filter((k): k is string => typeof k === 'string') : []\n const sectionMap = readSectionMap(p.sectionMap)\n\n // ── single-page variant — skip SideNav + SectionRouter entirely.\n if (navItems.length === 0) {\n const appChrome: SpecElementLike = {\n type: 'AppChrome',\n props: {\n title,\n ...(subtitle !== undefined ? { subtitle } : {}),\n ...(actions.length > 0 ? { actions } : {}),\n },\n // Keep original children flowing through AppChrome's default\n // slot so single-page DashboardLayouts (no sidebar) render\n // their content directly under the header.\n ...(childKeys.length > 0 ? { children: childKeys } : {}),\n }\n return {\n entries: { [origKey]: appChrome },\n inflatedPlaceholders: [],\n navItemCount: 0,\n sectionCount: 0,\n variant: 'no-sidebar',\n }\n }\n\n // ── master-detail variant — emit AppChrome > Row > [SideNav, SectionRouter].\n const bodyKey = allocateKey(taken, `${origKey}__body`)\n const navKey = allocateKey(taken, `${origKey}__nav`)\n const mainKey = allocateKey(taken, `${origKey}__main`)\n\n const sectionEntries = buildSectionMappingEntries(sectionMap, navItems, childKeys)\n\n const placeholderEntries: Record<string, SpecElementLike> = {}\n const inflatedPlaceholders: string[] = []\n const resolvedContentKeys: string[] = []\n\n for (const [sectionId, contentKey] of sectionEntries) {\n if (contentKey.endsWith('_placeholder') && !existingKeys.has(contentKey)) {\n // Inflate an inert placeholder element so SectionRouter has a\n // valid child reference. Use a unique key (with origKey prefix)\n // to avoid collisions across multiple DashboardLayouts.\n const placeholderKey = allocateKey(taken, `${origKey}__placeholder__${sectionId}`)\n placeholderEntries[placeholderKey] = {\n type: 'Box',\n props: {},\n }\n inflatedPlaceholders.push(placeholderKey)\n resolvedContentKeys.push(placeholderKey)\n } else {\n resolvedContentKeys.push(contentKey)\n }\n }\n\n // Dotted state path — SideNav writes here, SectionRouter reads from\n // the same path. The dotted form survives because both consumers\n // run it through `_filterPath.dotPathToPointer`.\n const statePath = `${origKey}.currentSection`\n\n const entries: Record<string, SpecElementLike> = {\n [origKey]: {\n type: 'AppChrome',\n props: {\n title,\n ...(subtitle !== undefined ? { subtitle } : {}),\n ...(actions.length > 0 ? { actions } : {}),\n },\n children: [bodyKey],\n },\n [bodyKey]: {\n type: 'Row',\n props: { gap: 'none' },\n children: [navKey, mainKey],\n },\n [navKey]: {\n type: 'SideNav',\n props: {\n items: navItems.map((it) => ({\n id: it.id,\n label: it.label,\n ...(it.icon !== undefined ? { icon: it.icon } : {}),\n })),\n defaultSelectedId: navItems[0]?.id,\n selectedPath: statePath,\n },\n },\n [mainKey]: {\n type: 'SectionRouter',\n props: {\n sections: sectionEntries.map(([id]) => ({ id })),\n activeIdPath: statePath,\n },\n children: resolvedContentKeys,\n },\n ...placeholderEntries,\n }\n\n return {\n entries,\n inflatedPlaceholders,\n navItemCount: navItems.length,\n sectionCount: sectionEntries.length,\n variant: 'with-sidebar',\n }\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n if (!appliesPredicate(spec)) return spec\n\n // Dry-run path: walk + warn without mutating.\n if (ctx.dryRun) {\n for (const [key, el] of Object.entries(elements)) {\n if (el.type !== 'DashboardLayout') continue\n const p = (el.props ?? {}) as LegacyDashboardLayoutProps\n const navCount = normalizeSidebarToItems(p.sidebar).length\n ctx.warn(\n navCount === 0\n ? `DashboardLayout \"${key}\": no sidebar — would replace with AppChrome wrapping children directly.`\n : `DashboardLayout \"${key}\": would replace with AppChrome > Row > [SideNav(${navCount}), SectionRouter].`,\n { elementKey: key, navCount },\n )\n }\n return spec\n }\n\n const existingKeys: ReadonlySet<string> = new Set(Object.keys(elements))\n const taken = new Set(Object.keys(elements))\n const nextElements: Record<string, SpecElementLike> = { ...elements }\n let mutated = false\n\n for (const [origKey, origEl] of Object.entries(elements)) {\n if (origEl.type !== 'DashboardLayout') continue\n const out = migrateOne(origKey, origEl, existingKeys, taken)\n for (const [k, v] of Object.entries(out.entries)) nextElements[k] = v\n ctx.warn(\n `DashboardLayout \"${origKey}\": migrated variant=\"${out.variant}\" → ${\n out.variant === 'no-sidebar'\n ? 'AppChrome (children passthrough)'\n : `AppChrome > Row > [SideNav(${out.navItemCount}), SectionRouter(${out.sectionCount})]`\n }.`,\n {\n elementKey: origKey,\n variant: out.variant,\n navItemCount: out.navItemCount,\n sectionCount: out.sectionCount,\n },\n )\n for (const placeholderKey of out.inflatedPlaceholders) {\n ctx.warn(\n `DashboardLayout \"${origKey}\": inflated placeholder element \"${placeholderKey}\" for a section with no matching child key — replace with real content.`,\n { elementKey: origKey, placeholderKey },\n )\n }\n mutated = true\n }\n\n if (!mutated) return spec\n return { ...spec, elements: nextElements }\n}\n\nexport const legacyDashboardLayoutSplitTransformer: SpecTransformer = {\n id: 'legacy.dashboardlayout.split',\n title: 'DashboardLayout split (→ AppChrome + SideNav + SectionRouter)',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * CWRF-013 Phase 0 PR #2 — StatusBoard `draggable` phantom-prop transformer.\n *\n * Item 02 (P0, HIGH): the catalog historically declared a top-level\n * `draggable` boolean on StatusBoard that controlled two DOM data\n * attributes (`data-draggable` on the root, `data-draggable-card` on each\n * card) but no drag/drop logic was ever attached. The attributes were also\n * never consumed by external CSS / scripts. The Agent prompt advertised a\n * capability the renderer never delivered.\n *\n * Phase 0 decision (plan v1.1 §11.1 / design 02 §2.1): strip the field at\n * runtime, keep the catalog slot with a `.describe('DEPRECATED ...')`\n * marker so old prompts/specs continue to validate while the migrator\n * surfaces a deprecation warning.\n *\n * Behaviour:\n * - For every StatusBoard element whose props contain `draggable`:\n * * remove the field (real run)\n * * emit a TransformContext.warn pointing at the design doc\n * - Non-StatusBoard elements untouched.\n * - Missing / non-object props skipped (defensive).\n * - Dry-run: estimate description + skips mutation but still aggregates\n * warnings (mirrors `legacy-props.ts` Item 01 conventions).\n *\n * AC coverage:\n * - AC-HONESTY-003 (catalog draggable carries DEPRECATED note — sister\n * test in `domain/__tests__/StatusBoard.catalog-honesty.test.ts`)\n * - AC-HONESTY-004 (rendered DOM no longer carries data-draggable*)\n * - AC-HONESTY-005 (legacy spec auto-stripped + warning)\n * - AC-PROTOCOL-017 (legacy spec migration coverage extends)\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/02_status_board_draggable.md\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/00_phase0_implementation_plan.md §1 Item 02\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\n\nconst PHANTOM_FIELD = 'draggable'\nconst COMPONENT_TYPE = 'StatusBoard'\n\nfunction hasPhantomField(el: SpecElementLike | undefined): boolean {\n if (!el || el.type !== COMPONENT_TYPE) return false\n const props = el.props\n if (props == null || typeof props !== 'object') return false\n return PHANTOM_FIELD in props\n}\n\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return false\n for (const el of Object.values(elements)) {\n if (hasPhantomField(el)) return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n for (const [key, el] of Object.entries(elements)) {\n if (hasPhantomField(el)) affected.push(key)\n }\n return {\n affectedElements: affected,\n description:\n affected.length > 0\n ? `StatusBoard: would remove top-level \\`draggable\\` from ${affected.length} element(s)`\n : 'StatusBoard: no changes',\n }\n}\n\nfunction stripField(\n key: string,\n el: SpecElementLike,\n ctx: TransformContext,\n): SpecElementLike {\n const props = (el.props ?? {}) as Record<string, unknown>\n const nextProps: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(props)) {\n if (k === PHANTOM_FIELD) continue\n nextProps[k] = v\n }\n ctx.warn(\n `StatusBoard \"${key}\" declared \\`draggable\\` (catalog Phase 0 phantom field — the renderer never attached drag handlers; the field only toggled two DOM data attributes that nothing consumed). Stripped. Drag-and-drop editing will return as a dedicated EditableStatusBoard component in Phase 3 (see docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/02_status_board_draggable.md).`,\n { elementKey: key, removed: [PHANTOM_FIELD] },\n )\n return { ...el, props: nextProps }\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n if (!appliesPredicate(spec)) return spec\n\n const nextElements: Record<string, SpecElementLike> = {}\n let mutated = false\n for (const [key, el] of Object.entries(elements)) {\n if (!hasPhantomField(el)) {\n nextElements[key] = el\n continue\n }\n if (ctx.dryRun) {\n // Collect warning but do not mutate (AC-PROTOCOL-018).\n stripField(key, el, ctx)\n nextElements[key] = el\n continue\n }\n nextElements[key] = stripField(key, el, ctx)\n mutated = true\n }\n if (!mutated) return spec\n return { ...spec, elements: nextElements }\n}\n\nexport const legacyStatusBoardPropsTransformer: SpecTransformer = {\n id: 'legacy.statusboard.draggable',\n title: 'StatusBoard `draggable` (phantom DOM-attr toggle)',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * CWRF-013 Phase 0 PR #7 — AnnotationLayer `mode: \"edit\"` transformer.\n *\n * Item 07 (P0, MEDIUM): catalog historically allowed `mode: 'view' | 'edit'`\n * on AnnotationLayer; the 'edit' value rendered a single inert\n * \"Edit mode — composer stub\" line under each annotation card with no\n * composer wired. Phase 0 strips the inert UI + narrows the enum to\n * `'view'` only; the migrator rewrites any 'edit' value to 'view' and\n * emits a deprecation warning so older specs keep working without\n * crashing the renderer.\n *\n * Behaviour:\n * - For every AnnotationLayer element whose props.mode === 'edit':\n * * rewrite to props.mode = 'view' (real run)\n * * emit a TransformContext.warn pointing at the design doc\n * - 'view' (or absent) untouched.\n * - Non-AnnotationLayer elements untouched.\n * - Missing / non-object props skipped (defensive).\n *\n * AC coverage:\n * - AC-HONESTY-015 (catalog enum no longer includes 'edit')\n * - AC-HONESTY-016 (rendered DOM no longer carries `__edit-stub`)\n * - AC-HONESTY-020 (legacy spec mode:edit auto-rewritten + warning)\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/07_annotation_layer_edit_mode.md\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\n\nconst COMPONENT_TYPE = 'AnnotationLayer'\n\nfunction hasEditMode(el: SpecElementLike | undefined): boolean {\n if (!el || el.type !== COMPONENT_TYPE) return false\n const props = el.props\n if (props == null || typeof props !== 'object') return false\n return (props as { mode?: unknown }).mode === 'edit'\n}\n\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return false\n for (const el of Object.values(elements)) {\n if (hasEditMode(el)) return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n for (const [key, el] of Object.entries(elements)) {\n if (hasEditMode(el)) affected.push(key)\n }\n return {\n affectedElements: affected,\n description:\n affected.length > 0\n ? `AnnotationLayer: would rewrite \\`mode: \"edit\"\\` → \\`mode: \"view\"\\` on ${affected.length} element(s)`\n : 'AnnotationLayer: no changes',\n }\n}\n\nfunction rewriteMode(\n key: string,\n el: SpecElementLike,\n ctx: TransformContext,\n): SpecElementLike {\n const props = (el.props ?? {}) as Record<string, unknown>\n const nextProps: Record<string, unknown> = { ...props, mode: 'view' }\n ctx.warn(\n `AnnotationLayer \"${key}\" declared \\`mode: \"edit\"\\` (catalog Phase 0 phantom value — the renderer only painted an inert \"Edit mode — composer stub\" placeholder; no composer was ever wired). Rewritten to \\`mode: \"view\"\\`. A real editable annotation flow will return as a separate component in a future phase (see docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/07_annotation_layer_edit_mode.md).`,\n { elementKey: key, from: 'edit', to: 'view' },\n )\n return { ...el, props: nextProps }\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n if (!appliesPredicate(spec)) return spec\n\n const nextElements: Record<string, SpecElementLike> = {}\n let mutated = false\n for (const [key, el] of Object.entries(elements)) {\n if (!hasEditMode(el)) {\n nextElements[key] = el\n continue\n }\n if (ctx.dryRun) {\n // Collect warning but do not mutate (AC-PROTOCOL-018).\n rewriteMode(key, el, ctx)\n nextElements[key] = el\n continue\n }\n nextElements[key] = rewriteMode(key, el, ctx)\n mutated = true\n }\n if (!mutated) return spec\n return { ...spec, elements: nextElements }\n}\n\nexport const legacyAnnotationLayerEditModeTransformer: SpecTransformer = {\n id: 'legacy.annotationlayer.edit-mode',\n title: 'AnnotationLayer `mode: \"edit\"` (inert composer stub)',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * JETP-033: Domain component catalog — Zod prop schemas for prompt generation.\n *\n * Strict alignment with 10_component_catalog.md §4 (specs) and §6 (Zod schemas).\n */\n\nimport { z } from 'zod'\nimport { defineCatalog } from '@json-render/core'\nimport { schema } from '@json-render/react/schema'\nimport { shadcnComponentDefinitions } from '@json-render/shadcn/catalog'\nimport { computedStyleFunctions } from './styleFunctions.js'\n\nconst SHADCN_DESCRIBE_PREFIX = ''\nconst SHADCN_DESCRIBE_SUFFIX = ''\n\nexport const catalogDef = {\n components: {\n ThemeProvider: {\n props: z.object({\n theme: z.object({\n primary: z.string().optional(),\n bg: z.string().optional(),\n surface: z.string().optional(),\n text: z.string().optional(),\n textMuted: z.string().optional(),\n success: z.string().optional(),\n warning: z.string().optional(),\n danger: z.string().optional(),\n font: z.string().optional(),\n fontMono: z.string().optional(),\n radius: z.string().optional(),\n spacing: z.string().optional(),\n }),\n }),\n slots: ['default'],\n description:\n 'Invisible CSS-custom-property injector for descendant theming (light / dark / brand colour overrides).'\n + ' Use to wrap a region (or the entire page) when the theme should differ from chat-widget\\'s default.'\n + ' Don\\'t use ThemeProvider for cosmetic one-off tweaks on a single element (apply inline tokens via the'\n + ' target component\\'s `style` / `className` prop instead), and don\\'t emit ThemeProvider unless the user'\n + ' actually requested a theme change — it adds depth to the tree for no visual benefit when default'\n + ' tokens are fine. slot name'\n + ' normalised from `children` to `default` so the catalog matches the renderer\\'s positional dispatch'\n + ' contract; legacy specs with `props.children` are rewritten to `props.default` by the spec migrator'\n + '. Distinct from ad-hoc inline `style.color` overrides on'\n + ' children — ThemeProvider routes through CSS custom properties so descendants inherit consistently'\n + ' (and a re-render of the wrapper does not invalidate every child\\'s style cache).'\n + ' Cross-ref: page-level shell with header → AppChrome, named slot wrapper (auto-emitted) →'\n + ' JrSlot, theme token reference → '\n + '/'\n + ' ',\n },\n KPICard: {\n props: z.object({\n value: z.union([z.number(), z.string()]),\n label: z.string(),\n unit: z.string().optional(),\n trend: z.enum(['up', 'down', 'flat']).optional(),\n delta: z.number().optional(),\n thresholds: z.object({\n warning: z.number(),\n critical: z.number(),\n }).optional(),\n sparkData: z.array(z.number()).optional(),\n variant: z.enum(['default', 'success', 'warning', 'critical', 'info']).optional(),\n // colorScheme retained for backward compatibility with existing\n // LLM-generated specs (D-KPI-01 spec drift: spec §1.2 incorrectly\n // claimed colorScheme was dead code, but KPICard.tsx still renders\n // .jr-kpi-card--scheme-* border-left). New specs SHOULD prefer\n // `variant` (which is described below) — colorScheme is intentionally\n // omitted from the description so the LLM steers away from it.\n colorScheme: z.enum(['blue', 'green', 'red', 'amber', 'gray', 'purple']).optional(),\n size: z.enum(['sm', 'md', 'lg']).optional(),\n className: z.string().nullable().optional(),\n }),\n description:\n 'A single KPI metric tile — value + label + optional unit + trend arrow + sparkline + threshold variant.'\n + ' Use for ONE primary number (revenue, conversion, user count) at the top of a dashboard or panel.'\n + ' value is required; label SHOULD include the unit (\"Revenue (USD)\") so the figure reads in isolation.'\n + ' Use the `variant` prop (default / success / warning / critical / info) to color-encode threshold state;'\n + ' threshold severity wins when both `variant` and `thresholds` are present.'\n + ' For 2+ horizontally-arranged KPIs ALWAYS wrap them in KPICluster — NEVER use Row + KPICards directly'\n + ' (Row has no built-in gap and no responsive collapse). Don\\'t spawn multiple KPICards to express a'\n + ' time series (use one KPICard with sparkData); don\\'t use KPICard for comparisons / distributions'\n + ' (use Chart) or rankings (use DataTable). Cross-ref: 2-4 KPI strip → KPICluster, multi-metric →'\n + ' ComparisonMatrix, trend lines → Chart, leaderboard → DataTable.',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 4 P3-T05 (Tier 3-2) — KPICluster container.\n // Direct fix for the user-screenshot regression where the LLM generated\n // `Row + 3 × KPICard` for the \"方案审核\" top strip (no gap, no responsive\n // collapse, jittery on hover). KPICluster is the canonical container:\n // grid layout, gap baked in, @container collapse to 2 → 1 columns, and\n // `variant='strip'` flattens hover lift so a 3-tile row does not jitter.\n // Design: 05_ui_polish/04_compact_patterns/02_kpi_cluster.md §2.1-§2.3.\n // -------------------------------------------------------------------------\n KPICluster: {\n props: z.object({\n columns: z.union([z.literal(2), z.literal(3), z.literal(4), z.literal('auto')]).optional()\n .describe('Grid column count. \"auto\" (default) uses CSS auto-fit minmax(8rem, 1fr). 2/3/4 forces fixed columns and collapses to 2 under 480px container width, then 1 under 320px.'),\n variant: z.enum(['default', 'strip']).optional()\n .describe('\"default\": pass-through KPICard styling (hover lift kept). \"strip\": flatten child padding + remove hover lift / softened shadow — ideal for review-summary strips at the top of approval / 审核摘要 cards.'),\n }),\n slots: ['default'],\n description:\n 'Container for 2-4 KPI tiles arranged in a responsive grid. ALWAYS use KPICluster when displaying'\n + ' 2+ KPIs horizontally — NEVER use Row + multiple KPICard directly (Row has no built-in gap and'\n + ' no responsive collapse). Don\\'t use KPICluster for a single KPI (use KPICard alone — wrapping a'\n + ' lone tile adds a redundant grid frame), and don\\'t use it for non-metric content (text panels →'\n + ' Stack; mixed dashboards → Section + Stack). columns=\"auto\" (default): responsive auto-fit minmax(8rem, 1fr) grid;'\n + ' columns=2/3/4: fixed columns that auto-collapse to 2 below 480px container width, then 1 below'\n + ' 320px (via @container jr-card). variant=\"strip\" (recommended for review / approval summary'\n + ' strips, 审批面板 / 审核摘要): flat layout, no hover lift, smaller value font so the 3-tile row'\n + ' does not jitter when one tile is hovered. variant=\"default\" (recommended for dashboards with'\n + ' detail panes below): normal KPICard with hover lift. RESPONSIVE ():'\n + ' the grid is wired through @container jr-card — fixed columns auto-collapse to 2 below 480px'\n + ' and to a single column below 320px, so the cluster never overflows narrow chat-bubble hosts.'\n + ' Cross-ref: single KPI → KPICard, multi-metric matrix → ComparisonMatrix.',\n },\n DataTable: {\n props: z.object({\n columns: z.array(z.object({\n key: z.string(),\n label: z.string(),\n sortable: z.boolean().optional(),\n type: z.enum(['text', 'number', 'badge', 'progress', 'actions']).optional(),\n width: z.string().optional(),\n })),\n data: z.array(z.record(z.string(), z.unknown())),\n sortable: z.boolean().optional(),\n pageSize: z.number().optional(),\n emptyMessage: z.string().optional(),\n filterPath: z.string().optional()\n .describe('. Shared state path for sibling-driven filtering — sibling TableToolbar.filterPath / ColumnFilter.filterPath write here, DataTable reads via useStateValue. String value → fuzzy contains across columns; object value → per-column exact match (string) / any-of match (string[]); null/undefined/empty → no filter.'),\n loading: z.boolean().optional()\n .describe('when true, the table body is replaced by a centered spinner + \"加载中\" placeholder (StateView kind=\"loading\"). Use during async data fetches so the user sees activity instead of a stale empty <td>. Takes precedence over `data` / `emptyMessage`. Pair with `error` for fetch-failure recovery.'),\n error: z.string().optional()\n .describe('human-readable error message. When non-empty, the table body is replaced by an error-tinted alert-circle + \"加载失败\" + the message as description (StateView kind=\"error\"). Wins over `loading`. Empty string / undefined = no error.'),\n }),\n description:\n 'Read-only sortable tabular data — typed columns (text / number / badge / progress / actions) +'\n + ' pagination + empty state. Use for any structured listing with > ~5 rows where the user benefits'\n + ' from sort + paginate: BOM listings, search results, audit logs, ranked KPI tables. FIVE-STATE'\n + ' SLOTS (): `loading: true` → centered spinner + 加载中; `error: string` → red'\n + ' alert + 加载失败 + your message; otherwise the existing `emptyMessage` <td> fires when'\n + ' data is empty; otherwise the rows render. Don\\'t use'\n + ' DataTable for hierarchical data (use HierarchyTree), single records (use FormSection or Card),'\n + ' or compact strings-only summaries (use shadcn Table). DataTable'\n + ' into composable siblings — top-level `filterable` / `groupBy` / `expandable` and column-level'\n + ' `filterable` were Phase-0 protocol lies the renderer never honoured; legacy specs are auto-'\n + ' migrated by the `legacy.datatable.split-toolbar` transformer into TableToolbar + ColumnFilter'\n + ' + RowGroup siblings + DataTable.filterPath. Cross-ref: search box / actions header → TableToolbar;'\n + ' single-column dropdown filter → ColumnFilter; group banner + collapsible body → RowGroup; full'\n + ' design see '\n + 'and ',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#1 (Split C · DataTable modular) — TableToolbar.\n // Sibling-of-DataTable cluster: title + searchable input + action buttons.\n // Search writes to shared filterPath via useStateStore; actions self-\n // dispatch via useActions().execute (parity with FormSection submitAction\n // and DashboardLayout topBar.actions). Decoupled from DataTable so a\n // toolbar can sit above any tabular surface (DataTable, RowGroup-wrapped,\n // or future MultiTable).\n // Design: 04_overdesign_refactor/03_data_table_modular.md §2.2.\n // -------------------------------------------------------------------------\n TableToolbar: {\n props: z.object({\n title: z.string().optional(),\n searchable: z.boolean().optional()\n .describe('Show a search input that writes its value to filterPath. Sibling DataTable / ColumnFilter components read the same path.'),\n filterPath: z.string().optional()\n .describe('Shared state path consumed by sibling DataTable.filterPath / ColumnFilter.filterPath. Required when searchable is true; otherwise the search field is render-only.'),\n actions: z.array(z.object({\n label: z.string(),\n action: z.string(),\n icon: z.string().optional(),\n })).optional()\n .describe('Right-aligned action buttons. Each click invokes useActions().execute({action, params:{label, action}}) AND emits an action event.'),\n placeholder: z.string().optional()\n .describe('Search input placeholder text. Defaults to \"Search…\".'),\n }),\n slots: [],\n events: ['search:change', 'action'],\n example: {\n type: 'TableToolbar',\n props: {\n title: 'Suppliers',\n searchable: true,\n filterPath: 'supplierFilter',\n actions: [\n { label: 'Export CSV', action: 'table/export', icon: '↓' },\n { label: 'Refresh', action: 'table/refresh' },\n ],\n },\n },\n description:\n 'Top-of-table toolbar — title + optional search input + right-aligned action buttons (export / refresh / add). '\n + 'Use to give a DataTable or RowGroup-wrapped DataTable a clear header row + search-driven filter trigger + bulk '\n + 'action surface, instead of bloating DataTable itself. searchable writes user input into filterPath via '\n + 'stateWrite so the sibling DataTable.filterPath sees the same value; actions self-dispatch via useActions(). '\n + 'Don\\'t render multiple TableToolbar above one DataTable, don\\'t use TableToolbar for per-column dropdown filters '\n + '(use ColumnFilter), and don\\'t put TableToolbar inside a Card header slot — Card already provides a title row. '\n + 'Cross-ref: dropdown filter on a single column → ColumnFilter; group banner + aggregations under DataTable → '\n + 'RowGroup; tabular display itself → DataTable; full-page application chrome (title bar + sidebar) → AppChrome. '\n + 'RESPONSIVE (L3): the toolbar collapses into a vertical column when the rendered container '\n + 'is narrower than 480px — title, search, and action buttons each take a full row + actions stretch full-width. '\n + 'Avoid more than 4 actions; even with auto-stack, more than 4 stacked buttons over-dominate a narrow card.',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#1 (Split C · DataTable modular) — ColumnFilter.\n // Single-column dropdown filter that writes into a shared filterPath.\n // Sibling-of-DataTable (NOT wrapping it) so a Row of multiple\n // ColumnFilters can compose naturally (filters_row example in design\n // §2.5). multiple=true uses native <select multiple>; otherwise a single\n // <select> with an empty \"All values\" option for clearing the filter.\n // Design: 04_overdesign_refactor/03_data_table_modular.md §2.3.\n // -------------------------------------------------------------------------\n ColumnFilter: {\n props: z.object({\n column: z.string()\n .describe('Column key being filtered. Used as visual label fallback and reported in filter:change events.'),\n filterPath: z.string()\n .describe('Shared state path the filter writes into. Sibling DataTable.filterPath / TableToolbar.filterPath read the same path; a sub-path like \"tableFilter.status\" is the canonical pattern when multiple ColumnFilters compose.'),\n options: z.array(z.object({\n value: z.string(),\n label: z.string(),\n })).optional()\n .describe('Explicit option list. MVP requires this prop — auto-distinct from table data is deferred to a follow-up PR. Empty array renders a disabled select with the column label still visible.'),\n multiple: z.boolean().optional()\n .describe('When true, render a native <select multiple>; selected value becomes a string[] (empty array = no filter). Default false.'),\n placeholder: z.string().optional()\n .describe('Empty-option label for single-select mode. Defaults to \"All values\".'),\n label: z.string().optional()\n .describe('Visual label override; defaults to the column name.'),\n }),\n slots: [],\n events: ['filter:change'],\n example: {\n type: 'ColumnFilter',\n props: {\n column: 'status',\n filterPath: 'tableFilter.status',\n options: [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n ],\n },\n },\n description:\n 'Single-column dropdown filter — writes the selected value (string in single-select mode, string[] in multiple) '\n + 'to a shared filterPath that sibling DataTable / TableToolbar consume. Use to expose a small enumerated dimension '\n + '(status, region, owner) above or beside a DataTable without inflating DataTable itself; compose multiple '\n + 'ColumnFilters in a Row to build a filter ribbon. options must be passed explicitly in this MVP — agents that '\n + 'need auto-distinct should compute the option set in their planner step. Don\\'t use ColumnFilter for full-text '\n + 'search (use TableToolbar.searchable), don\\'t use it for ranged numeric filtering (no min/max yet — falls back '\n + 'to DataTable.sortable for now), and don\\'t put it inside a DataTable cell. '\n + 'Cross-ref: text search trigger → TableToolbar; tabular display + sortable rows → DataTable; group banner + '\n + 'aggregations → RowGroup; dropdown menu of actions (not filters) → DropdownMenu (shadcn).',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#1 (Split C · DataTable modular) — RowGroup.\n // Wraps a single DataTable child with a group banner (title + caret +\n // aggregation labels). MVP renders banner + children only — row-level\n // grouping (splitting data array per group) is a Phase 4 follow-up\n // because DataTable's `data` is not reachable from a parent React\n // component without a Renderer-side hook. The banner / expand-collapse\n // surface keeps the prompt path observable so agents can emit the\n // design-doc shape today and the runtime grows under the same prop\n // contract.\n // Design: 04_overdesign_refactor/03_data_table_modular.md §2.4.\n // -------------------------------------------------------------------------\n RowGroup: {\n props: z.object({\n groupBy: z.string()\n .describe('Column key used for grouping. Surfaced verbatim in data-jr-group-by + banner title; row-level partitioning lands in.'),\n expanded: z.array(z.string()).optional()\n .describe('Initial expanded group keys (unbound mode). Empty array = all open by default; presence of groupBy in the array means open.'),\n expandedPath: z.string().optional()\n .describe('State path for two-way binding of the expanded set. RowGroup writes string[] (current expanded keys); host can read or seed.'),\n aggregations: z.array(z.object({\n column: z.string(),\n agg: z.enum(['sum', 'avg', 'count', 'min', 'max']),\n label: z.string().optional(),\n })).optional()\n .describe('Aggregation specs rendered inline with the group banner. displays labels + pending dash; computes values from DataTable data.'),\n title: z.string().optional()\n .describe('Banner title override. Defaults to \"Grouped by <groupBy>\".'),\n }),\n slots: ['default'],\n events: ['group:toggle'],\n example: {\n type: 'RowGroup',\n props: {\n groupBy: 'category',\n aggregations: [{ column: 'price', agg: 'sum', label: 'Subtotal' }],\n },\n children: ['inner_data_table'],\n },\n description:\n 'Group-banner wrapper around a single DataTable — renders a header row (group title + aggregation chips + '\n + 'expand/collapse caret) ABOVE the wrapped DataTable. Use to put a \"Grouped by category / region / owner\" '\n + 'banner over a tabular section so the user sees the chosen pivot dimension at a glance. MVP renders '\n + 'banner + children only; row-level partitioning per group key lands in (when RowGroup gains a '\n + 'data-read bridge into the inner DataTable). expandedPath two-way binds the open-group set so other parts '\n + 'of the spec can react to which groups are visible. Don\\'t use RowGroup as a generic accordion (use shadcn '\n + 'Accordion / Collapsible for non-tabular content), don\\'t nest RowGroup inside RowGroup (one-level groupBy '\n + 'only — multi-level pivot is backlog), and don\\'t put non-DataTable children inside it. '\n + 'RESPONSIVE (): the banner header is a flex row of (title · agg chips · caret); the '\n + 'header collapses to multi-line wrap (aggregation chips flow to their own row) below 480px container width '\n + 'so chips never push the caret out of the visible area. The wrapped DataTable handles its own horizontal '\n + 'overflow via.jr-card-container scroll. '\n + 'Cross-ref: filter ribbon above the table → ColumnFilter × N + Row; toolbar with title / search / actions → '\n + 'TableToolbar; tabular display itself → DataTable; collapsible non-table content → Accordion / Collapsible.',\n },\n BudgetBar: {\n props: z.object({\n data: z.array(z.object({\n name: z.string(),\n budget: z.number(),\n actual: z.number(),\n color: z.string().optional(),\n })),\n unit: z.string(),\n showMargin: z.boolean().optional(),\n zones: z.object({\n safe: z.number(),\n warning: z.number(),\n }).optional(),\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n }),\n description:\n 'Budget vs actual stacked bar — multiple line items rendered as nested bars with zone coloring (safe / warning).'\n + ' Use for plan-vs-execution snapshots, cost variance, capacity utilisation, anywhere the contrast between'\n + ' allocated and consumed is the message. unit is required so axis labels read consistently. Don\\'t use BudgetBar'\n + ' for generic 0→max progress (use shadcn Progress) or for time-series spend (use Chart bar/area).'\n + ' ACCESSIBILITY: the \"over-budget\" fill uses dual encoding'\n + ' the danger colour is augmented by a 135° diagonal hatch pattern (repeating-linear-gradient) and the meta'\n + ' line includes literal \"Over\" text, so monochrome / color-blind / Windows High Contrast users can still'\n + ' distinguish over-budget from safe / warning fills. forced-colors:active swaps fills + patterns to system'\n + ' Mark / MarkText so the encoding survives high-contrast mode. Cross-ref: single-axis progress → Progress,'\n + ' time-series → Chart, line-by-line breakdown → DataTable.',\n },\n TraceMatrix: {\n props: z.object({\n rows: z.array(z.object({\n id: z.string(),\n label: z.string(),\n category: z.string().optional(),\n })),\n columns: z.array(z.string()),\n cells: z.record(z.string(), z.record(z.string(), z.enum(['covered', 'partial', 'missing', 'na']))),\n linkable: z.boolean().optional(),\n showCoverage: z.boolean().optional(),\n }),\n description:\n 'Requirement-to-evidence traceability matrix — rows × columns grid where each cell has coverage status'\n + ' (covered / partial / missing / na). Use to answer \"are all requirements verified?\" — engineering specs,'\n + ' compliance audits, regulatory filings. Optional showCoverage surfaces the percentage; linkable enables'\n + ' deep-link emit on cell click. Don\\'t use TraceMatrix for arbitrary 2D data (use Heatmap) or for ranked'\n + ' lists (use DataTable). Cross-ref: 2D intensity → Heatmap, 1-D verification list → ChecklistCard.',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#2 (Split D · RiskRegister 拆解) — RiskList.\n // The \"list half\" of the legacy 333-LOC RiskRegister, modular and usable\n // on its own. Categorical severity × likelihood model (v1.1 校准):\n // matches the real source-of-truth status enum ('open' | 'mitigating' |\n // 'accepted' | 'closed') — see 04_risk_register_split.md §5 revision\n // note on the design-doc → source mismatch.\n // -------------------------------------------------------------------------\n RiskList: {\n props: z.object({\n risks: z.array(z.object({\n id: z.string(),\n title: z.string(),\n description: z.string().optional(),\n severity: z.enum(['low', 'medium', 'high', 'critical']),\n likelihood: z.enum(['unlikely', 'possible', 'likely', 'certain']),\n mitigation: z.string().optional(),\n status: z.enum(['open', 'mitigating', 'accepted', 'closed']),\n owner: z.string().optional(),\n })),\n loading: z.boolean().optional()\n .describe('replace risk list with centered spinner during async load.'),\n error: z.string().optional()\n .describe('replace risk list with error placeholder (uses message as description). Wins over loading.'),\n }),\n description:\n '. Use for risk-register list views: linear list'\n + ' of risks where each row shows title + severity / likelihood / status badges plus optional description'\n + ' / owner / mitigation. Use alone for project gating dashboards where users skim individual mitigation'\n + ' paths; pair with RiskHeatMatrix (under a Stack) when both list + matrix views are needed — that'\n + ' combination is what the migrator emits for legacy RiskRegister(mode=\\'both\\') specs. Categorical'\n + ' severity × likelihood model (no numeric score is surfaced — internal sort order only). Emits'\n + ' `risk:select` with `{ id }` on row click. Don\\'t use RiskList for arbitrary tabular data (use'\n + ' DataTable), trade-off comparisons (use ComparisonMatrix), or to visualise risk distribution (use'\n + ' RiskHeatMatrix). Cross-ref: distribution view → RiskHeatMatrix, assumptions feeding the risks →'\n + ' AssumptionRegister, requirement / risk coverage → TraceMatrix, generic tabular data → DataTable.'\n + ' ',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#2 (Split D · RiskRegister 拆解) — RiskHeatMatrix.\n // 4×4 severity × likelihood grid (v1.1 校准: NOT 5×5 numeric probability ×\n // impact — see §2.3 design decision + §5 revision note D-6 in\n // 04_risk_register_split.md). Pairs with RiskList under a Stack when\n // both views are needed; that combination is what `legacy.riskregister.split`\n // emits for legacy RiskRegister(mode='both') specs.\n // -------------------------------------------------------------------------\n RiskHeatMatrix: {\n props: z.object({\n risks: z.array(z.object({\n id: z.string(),\n title: z.string(),\n severity: z.enum(['low', 'medium', 'high', 'critical']),\n likelihood: z.enum(['unlikely', 'possible', 'likely', 'certain']),\n status: z.enum(['open', 'mitigating', 'accepted', 'closed']),\n })),\n }),\n description:\n '. Use for risk distribution dashboards: 4×4'\n + ' severity × likelihood heat grid where each cell lists the risks falling into the (severity,'\n + ' likelihood) quadrant with a status badge — users visually scan the upper rows to prioritise'\n + ' critical / high-severity risks. Categorical model (NOT numeric 5×5 probability × impact);'\n + ' severity rows are ordered critical → low top-to-bottom and likelihood columns unlikely → certain'\n + ' left-to-right so themes match the pre-split RiskRegister(mode=\\'matrix\\') visuals exactly. Emits'\n + ' `risk:select` with `{ id }` when a risk inside a cell is clicked. Pair with RiskList under a'\n + ' Stack for combined list + matrix dashboards — that combination is what the migrator emits for'\n + ' legacy RiskRegister(mode=\\'both\\') specs. Don\\'t use RiskHeatMatrix for arbitrary 2D intensity'\n + ' data (use Heatmap) or for owner / mitigation drill-down (use RiskList). Cross-ref: drill-down list →'\n + ' RiskList, raw numeric heat → Heatmap, decision based on risks → DecisionPanel. See'\n + ' ',\n },\n EvidenceChain: {\n props: z.object({\n claims: z.array(z.object({\n claim: z.string(),\n source: z.string(),\n sourceType: z.enum(['calculation', 'datasheet', 'simulation', 'measurement', 'assumption', 'reference']),\n verified: z.boolean(),\n details: z.string().optional(),\n link: z.string().optional(),\n })),\n orientation: z.enum(['vertical', 'horizontal']).optional(),\n loading: z.boolean().optional()\n .describe('replace chain with centered spinner during async load.'),\n error: z.string().optional()\n .describe('replace chain with error placeholder; wins over loading.'),\n }),\n description:\n 'Claim ↔ evidence verification chain — each claim links to one or more pieces of evidence with provenance'\n + ' (source / link / verified-by / date). Use when a conclusion needs auditable backing: scientific reports,'\n + ' compliance filings, technical due-diligence. Don\\'t use EvidenceChain for free-form lists (use ChecklistCard)'\n + ' or for cross-referenced 2D matrices (use TraceMatrix). Cross-ref: requirement coverage → TraceMatrix,'\n + ' yes/no verification → ChecklistCard, decision-with-rationale → DecisionPanel.',\n },\n AssumptionRegister: {\n props: z.object({\n assumptions: z.array(z.object({\n id: z.string(),\n text: z.string(),\n basis: z.string(),\n owner: z.string().optional(),\n status: z.enum(['verified', 'pending', 'unverified', 'invalid']),\n validationMethod: z.string().optional(),\n impact: z.enum(['low', 'medium', 'high']).optional(),\n })),\n showImpact: z.boolean().optional(),\n loading: z.boolean().optional()\n .describe('replace register with centered spinner during async load.'),\n error: z.string().optional()\n .describe('replace register with error placeholder; wins over loading.'),\n }),\n description:\n 'Assumption register — list of working assumptions with validation status (validated / pending / refuted)'\n + ' and impact rating. Use during early product / engineering planning when explicit assumption surfacing'\n + ' is the goal — pairs with RiskRegister downstream. Don\\'t use AssumptionRegister for threats with owned'\n + ' mitigation (that\\'s RiskRegister) or for general FAQ-style notes (use Text + bullet list);'\n + ' don\\'t conflate AssumptionRegister with RiskRegister (assumptions are *unknowns* the team chose to act'\n + ' on; risks are *threats* with mitigation owners).'\n + ' Cross-ref: risks → RiskRegister, evidence backing an assumption → EvidenceChain, decisions → DecisionPanel.',\n },\n ComparisonMatrix: {\n props: z.object({\n options: z.array(z.string()),\n criteria: z.array(z.object({\n name: z.string(),\n weight: z.number().optional(),\n unit: z.string().optional(),\n })),\n scores: z.array(z.array(z.number())),\n showWeighted: z.boolean().optional(),\n highlightBest: z.boolean().optional(),\n scoreScale: z.object({\n min: z.number(),\n max: z.number(),\n }).optional(),\n loading: z.boolean().optional()\n .describe('replace matrix with centered spinner during async score load.'),\n error: z.string().optional()\n .describe('replace matrix with error placeholder; wins over loading.'),\n }),\n description:\n 'Weighted scoring matrix — options × criteria grid where each cell is a numeric score; criteria carry'\n + ' weights and the component computes a weighted total per option. Use for vendor / supplier selection,'\n + ' tech-stack trade-off analyses, product-feature prioritisation. Don\\'t use ComparisonMatrix for'\n + ' qualitative pros/cons (use DecisionPanel) or for binary coverage matrices (use TraceMatrix).'\n + ' Cross-ref: pros/cons + recommendation → DecisionPanel, requirement coverage → TraceMatrix.',\n },\n Timeline: {\n props: z.object({\n events: z.array(z.object({\n id: z.string(),\n date: z.string(),\n label: z.string(),\n status: z.enum(['completed', 'in-progress', 'upcoming', 'delayed']).optional(),\n group: z.string().optional(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional()\n .describe('IDs of earlier events this event depends on. When the Timeline is rendered with `showDependencies: true`, an SVG arrow is drawn from each declared dependency`s dot to this event`s dot. Self-references and unknown IDs are silently dropped.'),\n })),\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n showDependencies: z.boolean().optional()\n .describe('render dependency arrows between milestones. Each event must declare its `dependencies` array (milestone IDs). Arrows use the `--ycw-timeline-dep-color` CSS custom property (default `currentColor` at 40% opacity). Without `dependencies` data the layer renders nothing.'),\n loading: z.boolean().optional()\n .describe('replace timeline with centered spinner during async load.'),\n error: z.string().optional()\n .describe('replace timeline with error placeholder; wins over loading.'),\n }),\n description:\n 'Events / milestones timeline — chronological strip of events with status, grouping, and an optional'\n + ' dependency-arrow overlay (Item 10; non-interactive SVG layer over the rail). Use for product'\n + ' release histories, incident timelines, project milestone sequences. Don\\'t use Timeline for tasks-with-'\n + 'duration or critical-path schedules (use GanttChart) or for sequential progress-with-status (use Stepper).'\n + ' Arrow rendering is read-only; see '\n + 'Cross-ref: Gantt → GanttChart, progress steps → Stepper, log feed → DataTable.',\n },\n HierarchyTree: {\n props: z.object({\n rootId: z.string(),\n nodes: z.record(z.string(), z.object({\n label: z.string(),\n children: z.array(z.string()).optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n icon: z.string().optional(),\n badge: z.string().optional(),\n })),\n expandable: z.boolean().optional(),\n defaultExpanded: z.array(z.string()).optional(),\n showRollup: z.object({\n field: z.string(),\n aggregation: z.enum(['sum', 'count', 'max']),\n }).optional(),\n loading: z.boolean().optional()\n .describe('replace tree with centered spinner during async fetch.'),\n error: z.string().optional()\n .describe('replace tree with error placeholder; wins over loading.'),\n }),\n description:\n 'Expandable tree — hierarchical data with optional roll-up metric per node + status badges. Use for'\n + ' BOM / parts hierarchies, organisation charts, file/folder structures, requirement decomposition.'\n + ' Don\\'t use HierarchyTree for flat lists (use DataTable) or for circular / many-to-many relationships'\n + ' (no first-class node-graph component yet — backlog). Cross-ref: linear list → DataTable,'\n + ' folded sections → Section + collapsible, status board → StatusBoard, journey/process → Stepper.',\n },\n WaterfallChart: {\n props: z.object({\n segments: z.array(z.object({\n label: z.string(),\n value: z.number(),\n type: z.enum(['increase', 'decrease', 'total']),\n color: z.string().optional(),\n })),\n unit: z.string().optional(),\n showConnectors: z.boolean().optional(),\n loading: z.boolean().optional()\n .describe('replace chart with centered spinner during async load.'),\n error: z.string().optional()\n .describe('replace chart with error placeholder; wins over loading.'),\n }),\n description:\n 'Waterfall chart — sequential additive / subtractive breakdown showing how a starting value reaches'\n + ' a final value through positive and negative contributions. Use for revenue bridges, P&L variance,'\n + ' inventory reconciliation, anywhere step-by-step contribution is the message. Don\\'t use WaterfallChart'\n + ' for time-series trends (use Chart line) or for stacked totals at a single point in time'\n + ' (use Chart bar with stack). Cross-ref: time-series → Chart, parts-of-a-whole → Chart pie/donut.',\n },\n ChecklistCard: {\n props: z.object({\n items: z.array(z.object({\n label: z.string(),\n status: z.enum(['pass', 'fail', 'warning', 'pending', 'na']),\n notes: z.string().optional(),\n timestamp: z.string().optional(),\n })),\n title: z.string().optional(),\n showProgress: z.boolean().optional(),\n density: z.enum(['comfortable', 'compact']).optional(),\n loading: z.boolean().optional()\n .describe('replace items with centered spinner during async checklist fetch.'),\n error: z.string().optional()\n .describe('replace items with error placeholder; wins over loading.'),\n }),\n description:\n 'Status checklist with 5-state icons (pass / fail / warning / pending / na). Use for ANY vertical list'\n + ' of stateful items: QA verification, gate criteria, audit findings, workflow step status,'\n + ' approval points (审批要点 / 详细要点), validation summary, compliance checks, deployment runbooks.'\n + ' density=\"comfortable\" (default) for full QA panels with optional progress bar;'\n + ' density=\"compact\" for tight 3-8 row status lists embedded inside a review card or panel.'\n + ' RESPONSIVE (): items wrap and stay readable in narrow chat-widget containers;'\n + ' below 480px container width each row\\'s label / notes / timestamp stack vertically and the icon stays'\n + ' anchored to the left so the status remains scannable.'\n + ' Don\\'t hand-craft a Stack + Text + emoji ticks (✓ / ✗ / ○ / △) to mimic this — always use ChecklistCard.'\n + ' Don\\'t use ChecklistCard for editable user-input lists (use FormSection + Checkbox stacked);'\n + ' don\\'t use it for hierarchical decomposition (use HierarchyTree); don\\'t use it for risk registers'\n + ' (use RiskList) or decision options (use DecisionPanel). Cross-ref: hierarchical → HierarchyTree,'\n + ' kanban-style → StatusBoard, requirement coverage → TraceMatrix.',\n },\n StatusBoard: {\n props: z.object({\n columns: z.array(z.object({\n title: z.string(),\n status: z.string().optional(),\n color: z.string().optional(),\n cards: z.array(z.object({\n id: z.string(),\n title: z.string(),\n subtitle: z.string().optional(),\n description: z.string().optional(),\n badges: z.array(z.union([\n z.string(),\n z.object({ label: z.string(), color: z.string().optional() }),\n ])).optional(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n })),\n })),\n draggable: z.boolean().optional()\n .describe('DEPRECATED in catalog declared the flag but StatusBoard only toggled inert `data-draggable` / `data-draggable-card` DOM attributes — no drag handlers were ever wired. Stripped automatically by the spec migrator. Drag-and-drop editing will return as a dedicated EditableStatusBoard component in.'),\n loading: z.boolean().optional()\n .describe('replace board with centered spinner during async board boot.'),\n error: z.string().optional()\n .describe('replace board with error placeholder; wins over loading.'),\n }),\n description:\n 'Read-only Kanban-style status board — columns × cards layout where each card has status / owner / tags.'\n + ' Use for sprint snapshots, incident triage, BOM-stage overview, anywhere \"what is in which bucket\" is'\n + ' the message. Don\\'t use StatusBoard as an editable agent-facing kanban (the read-only contract is'\n + ' deliberate; an EditableStatusBoard ships in ); don\\'t use it for ranked lists (use DataTable).'\n + ' RESPONSIVE (): columns are a horizontal flex row of fixed-width tracks; below'\n + ' 480px container width the columns collapse to a single full-width column (cards stack vertically per'\n + ' column, columns stack vertically beneath each other) so the board never forces horizontal scroll on a'\n + ' narrow chat-bubble host. Above 480px the row scrolls horizontally as before.'\n + ' top-level `draggable` is a protocol lie (no drag handlers attached); the spec'\n + ' migrator strips it and emits a deprecation warning. See '\n + ''\n + ' Cross-ref: ranked list → DataTable, status checklist → ChecklistCard, owner / mitigation drill-down → RiskList.',\n },\n DecisionPanel: {\n props: z.object({\n title: z.string(),\n options: z.array(z.object({\n name: z.string(),\n description: z.string().optional(),\n pros: z.array(z.string()),\n cons: z.array(z.string()),\n score: z.number().optional(),\n recommended: z.boolean().optional(),\n })),\n selectedOption: z.string().optional(),\n loading: z.boolean().optional()\n .describe('replace options with centered spinner during async fetch.'),\n error: z.string().optional()\n .describe('replace options with error placeholder; wins over loading.'),\n }),\n description:\n 'Decision panel — N options each with pros / cons / score / notes, plus an explicit recommendation.'\n + ' Use for architectural choices, vendor down-selects, \"go / no-go\" gates where qualitative reasoning'\n + ' matters more than numeric scoring. Don\\'t use DecisionPanel for purely numeric trade-offs'\n + ' (use ComparisonMatrix for weighted scoring) or for risk-with-mitigation tracking (use RiskRegister).'\n + ' RESPONSIVE (): each option card is a flex column already; the option list itself is'\n + ' a CSS grid that collapses from multi-column to single-column below 480px container width so the'\n + ' pros / cons / score block stays readable inside a narrow chat-bubble host. Action buttons (Select /'\n + ' Recommend / Reject) stretch to 100% width once stacked so they remain easy to tap.'\n + ' Cross-ref: weighted score → ComparisonMatrix, evidence chain → EvidenceChain, risks → RiskRegister.',\n },\n Heatmap: {\n props: z.object({\n data: z.array(z.array(z.number())),\n xLabels: z.array(z.string()),\n yLabels: z.array(z.string()),\n colorScale: z.enum(['green-red', 'blue-red', 'grayscale', 'custom']).optional(),\n customColors: z.array(z.string()).optional(),\n cellLabel: z.boolean().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n }),\n description:\n '2D intensity grid (heatmap) — rows × columns of numeric values rendered with a configurable colour scale.'\n + ' Use for correlation matrices, hour-of-day usage heatmaps, geographic intensity, anywhere two categorical'\n + ' axes intersect with one numeric metric. Don\\'t use Heatmap for status grids (use TraceMatrix where the'\n + ' axes are requirements vs evidence) or for ranked lists (use DataTable). '\n + ' cells are interactive only when an emit callback is wired — interactive cells are focusable (tabIndex=0),'\n + ' accept click + keyboard Enter/Space, and emit \"cellClick\" with { row, col, value, xLabel, yLabel };'\n + ' otherwise read-only with no pointer cursor. See '\n + 'ACCESSIBILITY:'\n + ' dual encoding — each cell carries (1) a continuous background colour, (2) a tier modifier class'\n + ' (--low/--mid/--high) wired to a `data-tier` attribute, and (3) the numeric value: visible when'\n + ' cellLabel=true, screen-reader-only otherwise, and ALWAYS announced via per-cell aria-label'\n + ' \"{rowLabel}, {colLabel}: {value}\". Under @media (forced-colors: active) the colour gradient collapses'\n + ' to system colours and mid/high cells gain a diagonal repeating-linear-gradient stripe pattern so'\n + ' Windows High Contrast / monochrome / color-blind users still perceive the intensity gradient.'\n + ' Cross-ref: requirements grid → TraceMatrix, table → DataTable.',\n },\n FormSection: {\n props: z.object({\n title: z.string(),\n fields: z.array(z.object({\n type: z.enum(['text', 'number', 'select', 'checkbox', 'radio', 'textarea', 'date', 'file']),\n name: z.string(),\n label: z.string(),\n placeholder: z.string().optional(),\n required: z.boolean().optional(),\n validation: z.object({\n min: z.number().optional(),\n max: z.number().optional(),\n pattern: z.string().optional(),\n message: z.string().optional(),\n }).optional(),\n options: z.array(z.object({\n label: z.string(),\n value: z.string(),\n })).optional(),\n accept: z.string().optional(),\n multiple: z.boolean().optional(),\n })),\n computedFields: z.array(z.object({\n name: z.string(),\n label: z.string(),\n formula: z.string(),\n })).optional(),\n submitAction: z.string().optional(),\n }),\n description:\n 'Multi-field form section — typed fields (text / number / select / checkbox / date), validation'\n + ' chain, computed fields, and a submitAction binding. Use for parametric input panels: BOM editing,'\n + ' KiCad part substitution, simulation parameters. Don\\'t use FormSection for a single field (use'\n + ' FormField + a shadcn control) or for free-form rich text (use shadcn Textarea + custom layout).'\n + ' RFC F splits FormSection into orchestrator + per-field FormField; new specs'\n + ' SHOULD prefer composing FormField + Input/Select/. and reach for FormSection only for legacy.'\n + ' RESPONSIVE (L3): the submit button auto-stretches full-width when the rendered'\n + ' container is narrower than 480px (typical mobile chat bubble). Field grid also auto-collapses'\n + ' from multi-column to single-column for inline form variants.'\n + ' Cross-ref: single field → FormField + Input/Select; long-form text → Textarea; multi-section'\n + ' wizard → Stepper; submit confirmation → ConfirmDialog.',\n },\n // CWRF-013 Phase 3 PR-P3-#3 commit 6/N (A-06): the legacy 520-LOC\n // DashboardLayout catalog entry was removed here. Its responsibilities\n // are now covered by three single-purpose siblings registered just\n // below (AppChrome + SideNav + SectionRouter, A-01/02/03). Legacy\n // specs continue to migrate cleanly via `legacy.dashboardlayout.split`\n // (transformer registered in A-05 commit fff832f). The migrator\n // rewrites legacy DashboardLayout elements BEFORE the catalog is\n // consulted for prop validation, so no downstream spec author sees a\n // missing-catalog-entry error.\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) — AppChrome.\n // The \"top bar half\" of the legacy 520-LOC DashboardLayout. Sticky\n // application header with title + subtitle + right-aligned action\n // buttons. Body content (typically SideNav + SectionRouter) flows\n // through `children` (slot 'default').\n // -------------------------------------------------------------------------\n AppChrome: {\n props: z.object({\n title: z.string(),\n subtitle: z.string().optional(),\n actions: z.array(z.object({\n label: z.string(),\n action: z.string(),\n variant: z.enum(['primary', 'secondary', 'ghost', 'destructive']).optional(),\n icon: z.string().optional(),\n confirmTitle: z.string().optional(),\n confirmDescription: z.string().optional(),\n confirm: z.boolean().optional(),\n })).optional(),\n sticky: z.boolean().optional()\n .describe('Pin the header to the top of the viewport. Defaults to true.'),\n // CWRF-013 Phase 4 P2-T15 (Tier 2-4) — footer action strip.\n // Destructive variants in `footer.actions` are auto-wrapped in a\n // ConfirmDialog (decision-friction guard) unless `confirm: false`.\n footer: z.object({\n actions: z.array(z.object({\n label: z.string(),\n action: z.string(),\n variant: z.enum(['primary', 'secondary', 'ghost', 'destructive']).optional(),\n icon: z.string().optional(),\n confirmTitle: z.string().optional()\n .describe('Override the ConfirmDialog title for destructive auto-wrap. Defaults to \"确认{label}?\".'),\n confirmDescription: z.string().optional()\n .describe('Override the ConfirmDialog description (body copy).'),\n confirm: z.boolean().optional()\n .describe('Set to false to render a destructive action without a ConfirmDialog gate (rarely needed).'),\n })),\n }).optional(),\n loading: z.boolean().optional()\n .describe('when true, the chrome body region renders a centered spinner instead of children — header + footer stay rendered so the user keeps navigation context during async dashboard boot.'),\n error: z.string().optional()\n .describe('when non-empty, the chrome body renders an error placeholder (uses message as description); wins over loading.'),\n // P2-T15.2 — HIL approval lifecycle. Drives footer.actions vs.\n // status-banner mutex render. Supports `{$bindState}` resolution\n // so the backend can flip the card from action-pending to\n // terminal-state with a single /state/<path> patch, without\n // depending on the LLM's next round to re-emit the spec.\n status: z.string().optional()\n .describe('Approval lifecycle. Allowed: \"pending\" (default) | \"approved\" | \"rejected\" | \"cancelled\". Terminal values UNMOUNT footer.actions and replace them with a status banner in the same footer slot (success/danger/muted token + dual-encoded with a lucide glyph for color-blind/forced-colors users). Unknown / non-string values fall back to \"pending\" so the user can still act. Supports `{$bindState: \"/_hil/status\"}` (JSON-Pointer slash path) so jetagents can push a single /state/_hil/status replace patch after _handle_hil_release succeeds — the card flips deterministically without waiting for the LLM to re-emit the spec.'),\n statusLabel: z.string().optional()\n .describe('Override the default status banner copy when status is terminal. Defaults: approved→\"已批准\", rejected→\"已驳回\", cancelled→\"已取消\". Use for non-zh locales or to add custom verbs (\"已签收\" / \"已撤销\").'),\n statusBy: z.string().optional()\n .describe('Resolver display name appended in parentheses after statusLabel, e.g. statusBy=\"alice\" → \"已批准(alice)\". Mirrors HilEntity.winner_response().resolver — the backend can forward it verbatim from the JETP-083 HIL entity.'),\n }),\n slots: ['default'],\n description:\n 'Application top-bar shell — title + optional subtitle (left), optional `actions` cluster (right), body'\n + ' via `children`, optional `footer.actions` row (review / approval surfaces: 方案审核 / 审批 / 整改回执).'\n + ' Use for the top-bar half of any app shell. Action buttons self-dispatch through the ActionProvider'\n + ' AND emit `action` with `{ action, label }` (WS3.7.7 parity). Pair with SideNav + SectionRouter'\n + ' under a Row for the legacy DashboardLayout shape.'\n + ' DESTRUCTIVE WORKFLOW (P2-T15): when a footer.actions entry has variant=\"destructive\" (驳回 / 删除 /'\n + ' 终止 / reject / discard / terminate) the renderer AUTOMATICALLY wraps it in a ConfirmDialog (two-step decision'\n + ' friction; initial focus on Cancel; Enter cancels). Override copy via confirmTitle /'\n + ' confirmDescription; default title = \"确认{label}?\". confirm:false opts out (rare).'\n + ' HIL APPROVAL LIFECYCLE (P2-T15.2): use `status` ∈ pending | approved | rejected | cancelled for any'\n + ' review card whose buttons must disappear once the user acts. Two patterns: (a) static — emit'\n + ' status=\"pending\" then re-emit terminal value; (b) bound (preferred) —'\n + ' status={\"$bindState\":\"/_hil/status\"} (slash JSON-Pointer, NOT dot) + jetagents pushes one'\n + ' /state/_hil/status patch in _handle_hil_release for deterministic flip without a second LLM round.'\n + ' Terminal status UNMOUNTS footer.actions (no second-hil-release race) and renders a token-coloured'\n + ' status banner (success/danger/muted + lucide glyph for color-blind / forced-colors users).'\n + ' Don\\'t nest AppChrome; don\\'t use for inline section headers (use Heading + Text);'\n + ' don\\'t put arbitrary content in footer; don\\'t stack a manual banner inside `children`'\n + ' (it would appear BELOW the still-rendered buttons — use `status` instead).'\n + ' RESPONSIVE: header + footer buttons auto-stack full-width below 480px (cap ~4 actions).'\n + ' Cross-ref: left-rail → SideNav, body switcher → SectionRouter, destructive gate → ConfirmDialog,'\n + ' HIL binding source → jetagents _handle_hil_release, inline header → Heading + Text.',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) — SideNav.\n // The \"left rail half\" of the legacy DashboardLayout. Vertical list\n // of navigable items with optional icon + badge. Supports bound\n // mode (selectedPath ↔ store) and uncontrolled mode\n // (defaultSelectedId). Click dispatch parity with AppChrome.\n // -------------------------------------------------------------------------\n SideNav: {\n props: z.object({\n items: z.array(z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string().optional()\n .describe('Lucide icon name (kebab-case, e.g. \"alert-triangle\", \"circle-check\", \"settings\"). Single emoji passthrough also accepted (\"🏠\"). Unknown names render a fallback initial. ALWAYS prefer a real lucide name over an emoji when the meaning maps to one — the visual weight and stroke match the rest of the UI.'),\n badge: z.union([z.string(), z.number()]).optional()\n .describe('Status chip rendered to the right of the label. Use for short counts/labels (1-3 chars typical): \"3\", 12, \"new\", \"P0\". Empty string (\"\") suppresses the chip explicitly; numeric 0 stays visible (zero is a meaningful count for things like \"open issues\").'),\n disabled: z.boolean().optional()\n .describe('Render the item dimmed + cursor:not-allowed; clicks are short-circuited at the handler so neither onSelect nor stateSet fires. Use for permission gating or \"coming soon\" placeholders — NOT for routing-disabled tabs (use a tooltip + omit the item instead).'),\n })),\n selectedPath: z.string().optional()\n .describe('Dotted state path bound to the active item id. When set, click writes back via useStateStore; selected state reads via useStateValue.'),\n defaultSelectedId: z.string().optional()\n .describe('Initial active item id when selectedPath is omitted (uncontrolled mode).'),\n collapsible: z.boolean().optional()\n .describe('Show a toggle button at the bottom to collapse the rail down to icons only.'),\n onSelect: z.string().optional()\n .describe('ActionProvider handler name fired when an item is clicked. Payload = { id, label }.'),\n }),\n description:\n '. Use for the left-rail navigation half of an'\n + ' application shell: vertical list of `{ id, label, icon?, badge?, disabled? }` items the user clicks'\n + ' to switch active section. ICON + BADGE SLOTS (): `icon` accepts a lucide kebab-case'\n + ' name (e.g. `alert-triangle`, `circle-check`, `settings`) or a single emoji; renders to the LEFT of'\n + ' the label with the same color weight as the row. `badge` accepts string OR number (1-3 chars'\n + ' typical), renders as a primary-colored chip to the RIGHT of the label — use for unread counts,'\n + ' status flags, or short tags. `disabled: true` dims the row and short-circuits clicks. Bound mode'\n + ' (recommended): wire `selectedPath` to a dotted state path (e.g. \"currentSection\") and pair with a'\n + ' SectionRouter at the same path — the two stay in sync without a parent coordinator. Uncontrolled'\n + ' mode: omit `selectedPath` and use `defaultSelectedId` for inline specs that don\\'t need'\n + ' cross-component coordination. Click dispatches the `onSelect` handler via the ActionProvider AND'\n + ' emits a `nav:select` event for spec-level listeners — same WS3.7.7 pattern AppChrome'\n + ' carries. Don\\'t use SideNav for top-tab navigation (use Tabs); don\\'t put more than one SideNav'\n + ' inside the same shell. Cross-ref: app shell wrapper → AppChrome, body section switcher (pairs with'\n + ' this via shared statePath) → SectionRouter, top-tab navigation → Tabs, stepwise workflow → Stepper.'\n + ' and'\n + ' ',\n },\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) —\n // SectionRouter. The \"section switch half\" of the legacy\n // DashboardLayout. Renders ONE child at a time from a positional\n // sections[] declaration, switching based on a state-bound\n // activeIdPath. Pair with SideNav at the same state path for\n // master-detail navigation.\n // -------------------------------------------------------------------------\n SectionRouter: {\n props: z.object({\n sections: z.array(z.object({\n id: z.string(),\n })),\n activeIdPath: z.string()\n .describe('Dotted state path bound to the active section id. SideNav writes here when used together.'),\n }),\n slots: ['default'],\n description:\n '. Use for state-driven section switching inside'\n + ' an application shell: declare `sections[i].id` positionally aligned with `children[i]`, then bind'\n + ' `activeIdPath` to the same dotted state path SideNav writes to so the two stay in sync without a'\n + ' parent coordinator. Only ONE child renders at a time — the one matching the resolved active id.'\n + ' Falls back to `sections[0]` (first section) when state is unset / non-string / unknown so users'\n + ' always see something instead of a blank panel. Don\\'t use SectionRouter for tabs (use Tabs which'\n + ' renders the tab bar itself); don\\'t use it without a sibling SideNav (or some other state writer'\n + ' pointing at the same path) — the panel will never change. Cross-ref: tab-based switching → Tabs,'\n + ' left-rail driver → SideNav, app shell wrapper → AppChrome. See'\n + ' ',\n },\n CodeViewer: {\n props: z.object({\n code: z.string(),\n language: z.string().optional(),\n lineNumbers: z.boolean().optional(),\n highlights: z.array(z.object({\n start: z.number(),\n end: z.number(),\n color: z.string().optional(),\n })).optional(),\n maxHeight: z.string().optional(),\n copyable: z.boolean().optional(),\n }),\n description:\n 'Inline read-only code block — syntax-highlighted with optional line-level highlight + caption.'\n + ' Use for short code excerpts embedded in narrative content (proposals, runbooks, root-cause writeups).'\n + ' Don\\'t use CodeViewer for full file rendering (use CodeFileViewer which supports resource_id / url'\n + ' + scroll virtualisation); don\\'t use CodeViewer for editable inputs (use shadcn Textarea + lang prop'\n + ' is not editor-grade). Cross-ref: full-file viewer → CodeFileViewer, plain text → TextViewer,'\n + ' rich text / markdown → MarkdownViewer.',\n },\n Timer: {\n props: z.object({\n interval: z.number(),\n statePath: z.string(),\n autoStart: z.boolean().optional(),\n maxTicks: z.number().optional(),\n }),\n description:\n 'Invisible interval timer — writes monotonically-increasing tick count to a state path every N seconds.'\n + ' Use to drive auto-refresh of dashboards, polling-style live KPIs, animation cursors. Don\\'t emit'\n + ' Timer when no consumer reads the state path (it just adds tree depth + emit overhead) and don\\'t use'\n + ' Timer for absolute clocks (host UI should display its own clock; Timer is a *tick* not a *clock*).'\n + ' the dead `.jr-timer*` CSS sheet + `injectStyles` call have been removed'\n + ' Timer never renders a host element with those classes, so the sheet was unreferenced dead code.'\n + ' Behaviour (interval tick → emit \"stateWrite\") is unchanged.'\n + ' Cross-ref: live data refresh consumer → DataTable / Chart bound to the same statePath; user-visible'\n + ' countdown → Progress with hand-rolled state update; long-running async progress → Progress + state'\n + ' bound to the same path.',\n },\n AnnotationLayer: {\n props: z.object({\n annotations: z.array(z.object({\n id: z.string(),\n targetId: z.string(),\n text: z.string(),\n author: z.string().optional(),\n timestamp: z.string().optional(),\n type: z.enum(['comment', 'question', 'approval', 'rejection']).optional(),\n })),\n mode: z.enum(['view']).optional()\n .describe('Only `view` is supported. The legacy `edit` enum value rendered an inert \"Edit mode — composer stub\" placeholder under each card with no composer wired ( 07 protocol lie). The spec migrator rewrites any `edit` value to `view` and emits a deprecation warning. A real editable annotation flow will return as a separate component in a future phase.'),\n }),\n slots: ['default'],\n description:\n 'Read-only comment / review annotation overlay — attaches structured remarks (author / timestamp / target)'\n + ' to child elements. Use for PR-style review walkthroughs, post-mortem callouts, instruction overlays on'\n + ' static artefacts. Don\\'t use AnnotationLayer for editable comment threads (the read-only contract is'\n + ' intentional; an EditableAnnotationLayer is + scope) and don\\'t nest AnnotationLayer recursively.'\n + ' the legacy `mode: \"edit\"` stub UI has been removed; see '\n + ''\n + ' Cross-ref: chat-style threads → DataTable + custom column, free-form comments → MarkdownViewer.',\n },\n GanttChart: {\n props: z.object({\n tasks: z.array(z.object({\n id: z.string(),\n name: z.string(),\n start: z.string(),\n end: z.string(),\n progress: z.number().optional(),\n group: z.string().optional(),\n color: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n })),\n milestones: z.array(z.object({\n id: z.string(),\n name: z.string(),\n date: z.string(),\n color: z.string().optional(),\n })).optional(),\n showCriticalPath: z.boolean().optional(),\n timeUnit: z.enum(['day', 'week', 'month']).optional(),\n todayLine: z.boolean().optional(),\n loading: z.boolean().optional()\n .describe('replace gantt with centered spinner during async load.'),\n error: z.string().optional()\n .describe('replace gantt with error placeholder; wins over loading.'),\n }),\n description:\n 'Gantt chart — tasks as horizontal bars across a timeline + optional dependencies (FS / SS / FF / SF),'\n + ' milestones, and a critical-path overlay. Use for project schedules, NPI plans, multi-step engineering'\n + ' workflows where start / duration / dependency are the primary message. Don\\'t use GanttChart for'\n + ' single-event timelines (use Timeline) or for status-per-step process flows (use Stepper).'\n + ' ACCESSIBILITY: critical-path bars carry dual encoding'\n + ' a left-edge danger accent AND a diagonal hatch overlay (SVG <pattern>) clipped to the bar shape so'\n + ' color-blind / monochrome / Windows High Contrast users can still spot the critical path. The pattern'\n + ' lines inherit --jr-danger (Mark under forced-colors), keeping the encoding intact across themes.'\n + ' Cross-ref: events / milestones only → Timeline, sequential progress steps → Stepper.',\n },\n Chart: {\n props: z.object({\n type: z.enum(['line', 'bar', 'area', 'pie', 'donut', 'scatter', 'radar', 'candlestick']),\n series: z.array(z.object({\n name: z.string(),\n data: z.array(z.union([\n z.number(),\n z.object({ x: z.union([z.number(), z.string()]), y: z.number() }),\n z.object({\n x: z.union([z.number(), z.string()]),\n open: z.number(),\n high: z.number(),\n low: z.number(),\n close: z.number(),\n volume: z.number().optional(),\n }),\n ])),\n color: z.string().optional(),\n type: z.string().optional(),\n })),\n xAxis: z.object({\n label: z.string().optional(),\n categories: z.array(z.string()).optional(),\n type: z.enum(['category', 'linear', 'time']).optional(),\n }).optional(),\n yAxis: z.object({\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n }).optional(),\n annotations: z.array(z.object({\n type: z.enum(['line', 'band']),\n value: z.number().optional(),\n from: z.number().optional(),\n to: z.number().optional(),\n label: z.string().optional(),\n color: z.string().optional(),\n style: z.enum(['solid', 'dashed']).optional(),\n })).optional(),\n legend: z.boolean().optional(),\n stacked: z.boolean().optional(),\n title: z.string().optional(),\n loading: z.boolean().optional()\n .describe('replace chart canvas with centered spinner during async load.'),\n error: z.string().optional()\n .describe('replace chart canvas with error placeholder; wins over loading.'),\n }),\n description:\n 'Unified chart — type ∈ {line, bar, area, pie, donut, scatter, radar, candlestick} + optional annotations'\n + ' (target lines, threshold zones, callout markers). Use for any quantitative visualisation that is'\n + ' fundamentally about *trend / distribution / comparison*. Don\\'t use Chart for time-with-dependency'\n + ' (use GanttChart), single-event timelines (use Timeline), or budget-vs-actual (use BudgetBar — its'\n + ' two-stack pattern is hard to replicate cleanly with Chart bar). Cross-ref: heatmap intensity →'\n + ' Heatmap, additive breakdown → WaterfallChart, single KPI → KPICard.',\n },\n SandboxPlayer: {\n props: z.object({\n src: z.string(),\n mode: z.enum(['live', 'replay']),\n type: z.enum(['vnc', 'video', 'screenshots']).optional(),\n actions: z.array(z.object({\n timestamp: z.number(),\n description: z.string(),\n actionType: z.enum(['click', 'type', 'scroll', 'navigate', 'execute', 'wait', 'other']).optional(),\n coordinates: z.object({ x: z.number(), y: z.number() }).optional(),\n outcome: z.string().optional(),\n })).optional(),\n autoPlay: z.boolean().optional(),\n showControls: z.boolean().optional(),\n showTimeline: z.boolean().optional(),\n maxHeight: z.string().optional(),\n title: z.string().optional(),\n poster: z.string().optional(),\n }),\n description:\n 'Sandbox execution viewer — replay or live-stream an agent\\'s tool-call session with a per-action timeline'\n + ' overlay (tool name + args + duration + result). Use to visualise how an agent solved a task: post-mortem'\n + ' debugging, demo recordings, comparison of two runs. Don\\'t use SandboxPlayer as a generic video player'\n + ' (use VideoPlayer); don\\'t use it for static action lists with no temporal dimension (use DataTable).'\n + ' Cross-ref: code playback → CodeViewer with line highlight, video → VideoPlayer, text log → TextViewer.',\n },\n /* ── CWRF-008: Viewer components ── */\n TextViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n content: z.string().optional(),\n title: z.string().optional(),\n lineNumbers: z.boolean().optional()\n .describe('when explicitly false, the left-column line numbers are hidden. Default true preserves the original two-column TextCore layout. CSV-detected content always renders through ExcelCore and is not affected by this flag.'),\n wordWrap: z.boolean().optional()\n .describe('when true, long lines wrap at the container edge (`white-space: pre-wrap`) instead of overflowing horizontally. Default false preserves the original `<pre>` no-wrap behaviour. Does not apply to CSV-detected content.'),\n }),\n description:\n 'Plain-text file viewer — fastest read-only renderer for log files,.txt artefacts, raw command output;'\n + ' optional line numbers + word-wrap. Accepts resource_id / url / content. Use when no syntax highlighting'\n + ' or markdown rendering is desired (it would only slow large logs). Don\\'t use TextViewer for source code'\n + ' (use CodeFileViewer with `lang`) or markdown narrative (use MarkdownViewer); don\\'t use it for JSON'\n + ' inspection (use JsonViewer for collapsible tree). `lineNumbers` and'\n + ' `wordWrap` are wired through to TextCore — see '\n + 'CSV-detected content auto-routes through ExcelCore.'\n + ' Cross-ref: code → CodeFileViewer, markdown → MarkdownViewer, JSON tree → JsonViewer.',\n },\n CodeFileViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n content: z.string().optional(),\n language: z.string().optional(),\n title: z.string().optional(),\n }),\n description:\n 'Full code-file viewer — language-aware syntax highlighting + line numbers + scroll for full files.'\n + ' Use to display a complete source file inline in a workspace context (PR review snapshot, datapack'\n + ' artefact, error context). Accepts resource_id (workspace-resolved) / url / inline content.'\n + ' Don\\'t use CodeFileViewer for short snippets in narrative (use CodeViewer); don\\'t use it for editable'\n + ' inputs (it is read-only by design). Cross-ref: inline excerpt → CodeViewer, plain text → TextViewer,'\n + ' markdown → MarkdownViewer.',\n },\n MarkdownViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n content: z.string().optional(),\n title: z.string().optional(),\n }),\n description:\n 'Markdown document renderer — full CommonMark + mermaid diagrams + KaTeX math + GFM tables / task lists.'\n + ' Use for design docs, runbooks, generated reports where rich formatting matters and the source is'\n + ' already markdown. Accepts resource_id / url / inline content. Don\\'t use MarkdownViewer for plain'\n + ' text logs (use TextViewer for the simpler / faster path) or for HTML-only content (use HtmlViewer).'\n + ' Cross-ref: plain text → TextViewer, full HTML → HtmlViewer, code-only → CodeFileViewer.',\n },\n JsonViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n content: z.string().optional(),\n defaultExpanded: z.number().optional(),\n title: z.string().optional(),\n }),\n description:\n 'Collapsible JSON tree viewer — interactive expand / collapse per node + type colouring + path-on-hover.'\n + ' Use for inspecting structured data: API responses, config dumps, telemetry traces. Accepts resource_id'\n + ' / url / inline content. Don\\'t use JsonViewer for editable JSON (read-only); don\\'t use it for tabular'\n + ' data that happens to be in JSON (use DataTable). Cross-ref: text-form pretty JSON → CodeViewer with'\n + ' lang=json, tabular data → DataTable.',\n },\n ImageViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n alt: z.string().optional(),\n title: z.string().optional(),\n zoom: z.boolean().optional()\n .describe('when explicitly false, the interactive pan/zoom toolbar + wheel handler + drag-pan affordances are all disabled and the image renders at natural scale with cursor=default. Default true preserves the original pan-zoom UX.'),\n maxScale: z.number().optional()\n .describe('cap on the maximum zoom factor for both wheel zoom-in and the toolbar zoom-in button. Default 10 matches the pre-hardcoded limit. Values below 1 are clamped to 1. Ignored when `zoom` is false.'),\n }),\n description:\n 'Image viewer — pan / zoom toolbar with configurable max scale; supports resource_id / url. Use for'\n + ' photographs, schematics PNGs, screenshots, mock-ups where the user benefits from inspecting detail.'\n + ' Don\\'t use ImageViewer for KiCad / Gerber files (use KicadViewer / GerberViewer for native rendering)'\n + ' or for galleries of multiple images (use shadcn Carousel + Image instead). '\n + ' `zoom` and `maxScale` are wired through to ImageCore — see '\n + 'Cross-ref: schematic → KicadViewer,'\n + ' fabrication → GerberViewer, multi-image gallery → Carousel.',\n },\n VideoPlayer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n mimeType: z.string().optional(),\n title: z.string().optional(),\n poster: z.string().optional(),\n autoplay: z.boolean().optional(),\n }),\n description:\n 'Video player — HTML5 video element with controls + optional poster + autoplay / loop / muted hints.'\n + ' Use for demo recordings, training clips, evidence snippets. Accepts resource_id / url. Don\\'t use'\n + ' VideoPlayer for sandbox session replay (use SandboxPlayer which adds an action-timeline overlay);'\n + ' don\\'t use it for image carousels (use shadcn Carousel + Image). Cross-ref: agent session replay →'\n + ' SandboxPlayer, audio-only → AudioPlayer, image carousel → Carousel.',\n },\n AudioPlayer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n mimeType: z.string().optional(),\n title: z.string().optional(),\n }),\n description:\n 'Audio player — HTML5 audio element with controls + optional waveform / time display. Use for voice notes,'\n + ' interview clips, sound test artefacts. Accepts resource_id / url. Don\\'t use AudioPlayer for video'\n + ' content (use VideoPlayer); don\\'t use it as a presentation timer (use Timer for tick-based state).'\n + ' Cross-ref: video → VideoPlayer, sandbox replay → SandboxPlayer, transcript text → MarkdownViewer.',\n },\n HtmlViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n content: z.string().optional(),\n sandbox: z.string().optional(),\n title: z.string().optional(),\n // CWRF-011: optional override; defaults to 'auto'.\n strategy: z.enum(['auto', 'inline', 'blob']).optional(),\n }),\n description:\n 'Sandboxed HTML viewer (iframe) — auto-detects multi-file projects via gitPath and switches between'\n + ' inline (CSP-friendly) and blob (ESM/fetch-friendly) strategies. Use for rendering generated reports,'\n + ' demos, or HTML artefacts where the host page must NOT inherit the document\\'s scripts / styles.'\n + ' Accepts resource_id / url / inline content; strategy override = auto|inline|blob (default auto).'\n + ' Don\\'t use HtmlViewer for trusted markdown content (use MarkdownViewer); don\\'t use it for code listing'\n + ' (use CodeFileViewer). Cross-ref: markdown → MarkdownViewer, file source → CodeFileViewer.',\n },\n PdfViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n title: z.string().optional(),\n }),\n description:\n 'PDF document viewer (iframe) — renders a PDF via the browser\\'s native viewer with optional initial'\n + ' page / zoom. Use for compliance reports, datasheets, contracts, anywhere a faithful page-layout copy'\n + ' is the deliverable. Accepts resource_id / url. Don\\'t use PdfViewer for source documents (Word/Excel)'\n + ' you can render natively (use WordViewer / ExcelViewer); don\\'t use it for code (use CodeFileViewer).'\n + ' Cross-ref: docx → WordViewer, xlsx → ExcelViewer, pptx → PowerPointViewer, html → HtmlViewer.',\n },\n KicadViewer: {\n props: z.object({\n resource_id: z.string().optional()\n .describe('KiCad resource id (single file or `.kicad_pro` project entry). When the resolved file name ends in `.kicad_pro` and `gitPath` is available, the viewer auto-discovers sibling design files (sch / pcb / fp-libs) and renders the full project via KiCanvas.'),\n url: z.string().optional(),\n content: z.string().optional(),\n title: z.string().optional(),\n project_resource_id: z.string().optional()\n .describe('Alias of `resource_id`, retained for backward compatibility ( at runtime in KicadViewer.tsx; will deprecate via spec migrator). When both fields are provided, `resource_id` wins and a console.warn is emitted. '),\n }),\n description:\n 'KiCad schematic / PCB / project interactive viewer (KiCanvas) — native render of.kicad_sch /.kicad_pcb /'\n + '.kicad_pro with pan / zoom / layer toggle. Use for hardware design reviews, BOM cross-reference, PCB'\n + ' layout walkthroughs. Accepts resource_id / url / content; `project_resource_id` is a backward-compat'\n + ' alias of `resource_id`. Project mode auto-activates when the resolved file ends with `.kicad_pro`'\n + ' and `gitPath` is available. Don\\'t use KicadViewer for fabrication artefacts (use GerberViewer for'\n + ' Gerber / drill / paste output) or for PNG schematics (use ImageViewer). the'\n + ' `project_resource_id` field is honest again — see '\n + 'Cross-ref: Gerber → GerberViewer, raster → ImageViewer.',\n },\n GerberViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n mode: z.enum(['2d', '3d', 'simulation']).optional()\n .describe('Display mode: 2d=layer outlines (default) / 3d=stacked board view / simulation=signal sim view. actually controls the underlying viewer — when this field is provided, the GerberViewerCore enters controlled mode and the internal toggle bar becomes read-only (Agent owns the truth); when omitted, the Core falls back to uncontrolled with initial 2d and the user may toggle freely (mode changes echo via emit \"viewer:mode-change\"). Full 3D / simulation rendering still requires a complete Gerber bundle (drill + outline files).'),\n title: z.string().optional(),\n }),\n description:\n 'Gerber PCB fabrication file viewer — 2D layer stack / 3D board / signal-simulation modes. Use for'\n + ' PCB-fab-output review, manufacturing audit, signal-integrity walkthroughs. Don\\'t use GerberViewer'\n + ' for design-time schematic review (use KicadViewer); don\\'t use it for raster / PNG fabrication'\n + ' previews (use ImageViewer). the catalog `mode` field through'\n + ' GerberViewerA2UI to GerberViewerCore: providing `mode` enters controlled mode (toggle bar read-only),'\n + ' omitting it runs uncontrolled with default `2d`. Mode changes are echoed via emit \"viewer:mode-change\"'\n + ' so ActionBinding can close the loop. See '\n + 'Cross-ref: schematic → KicadViewer, raster → ImageViewer.',\n },\n WordViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n title: z.string().optional(),\n }),\n description:\n 'Word document viewer (.docx /.doc) — native render of a Word file with structure preservation'\n + ' (headings / lists / tables). Use for proposals, MoMs, internal RFCs distributed as Word files.'\n + ' Accepts resource_id / url. Don\\'t use WordViewer for plain text (use TextViewer for the lighter'\n + ' path) or for already-converted markdown (use MarkdownViewer). Cross-ref: pdf → PdfViewer,'\n + ' xlsx → ExcelViewer, pptx → PowerPointViewer, plain text → TextViewer.',\n },\n ExcelViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n content: z.string().optional(),\n title: z.string().optional(),\n sheet: z.string().optional(),\n }),\n description:\n 'Spreadsheet viewer (.xlsx /.xls /.csv /.tsv) — read-only grid render with sheet tabs + freeze panes.'\n + ' Use for inspecting Excel artefacts in their original layout. Accepts resource_id, url, or raw text'\n + ' content for CSV/TSV. Don\\'t use ExcelViewer for editable / agent-driven tabular data (use DataTable);'\n + ' don\\'t use it for charts inside the spreadsheet (use Chart with the underlying data). Cross-ref:'\n + ' agent-driven table → DataTable, single chart → Chart, full file → CodeFileViewer.',\n },\n PowerPointViewer: {\n props: z.object({\n resource_id: z.string().optional(),\n url: z.string().optional(),\n title: z.string().optional(),\n }),\n description:\n 'PowerPoint presentation viewer (.pptx /.ppt) — slide-by-slide render with speaker-notes optional.'\n + ' Use for inspecting decks distributed as Office files in workspace flows. Accepts resource_id / url.'\n + ' Don\\'t use PowerPointViewer for static images (use ImageViewer + Carousel); don\\'t use it for'\n + ' agent-generated talking points (use MarkdownViewer for editable narrative). Cross-ref: image deck →'\n + ' Carousel + Image, narrative → MarkdownViewer, recording of a presentation → VideoPlayer.',\n },\n\n // =========================================================================\n // CWRF-013 Phase 1 (Tier 1.3.b) — shadcn 第 1 批:12 layout / structure primitives.\n // Batch 1 of 3 — props schemas re-exported verbatim from `@json-render/shadcn@0.19.0`\n // via `shadcnComponentDefinitions.<Name>`; this catalog only overrides the\n // human-readable `description` (and keeps `slots` / `events` / `example`\n // exactly as shadcn ships them) to thread Phase 1 provenance + design-doc\n // links through prompt-generation output.\n //\n // Runtime impls live in `node_modules/@json-render/shadcn` (no .tsx file\n // under `src/components/JsonRender/domain/`); `scripts/check-catalog-alignment.mjs`\n // will list them under \"missing impl skipped\" — that is the expected NOTE,\n // not a failure. See PR-P1-#4a commit body for the alignment-script trade-off\n // we accept by re-using upstream impls.\n // =========================================================================\n\n Card: {\n ...shadcnComponentDefinitions.Card,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Container card with optional title/description header + body slot — generic surface'\n + ' for grouping related content. Use for tile-style summary cards, side-panel callouts,'\n + ' empty-state illustrations. Don\\'t use Card for chapter-level page sections (use Section'\n + ' which adds collapsible) or for KPI tiles (use the KPICard domain idiom).'\n + ' Distinct from `KPICard` (domain-specific metric tile) and design-doc'\n + ' Cross-ref: KPI tile → KPICard, titled chapter → Section, raw flex grouping → Box / Stack,'\n + ' transient floating panel → Popover / Dialog.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Stack: {\n ...shadcnComponentDefinitions.Stack,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Flex container with `direction` / `gap` / `align` / `justify` knobs.'\n + ' Use for vertical stacking of mixed content (form sections, body paragraphs, KPI columns).'\n + ' Don\\'t use Stack for a single child (no benefit), for horizontal-only layouts (use Row),'\n + ' or for responsive multi-column grids (use Grid). Replaces hand-rolled div + inline style.'\n + ' RESPONSIVE: Stack inherits flex-wrap from the global mixin, so a'\n + ' horizontal Stack auto-wraps to the next row when its children would overflow the parent'\n + ' container — instead of forcing horizontal scroll. For explicit single-column collapse below'\n + ' 480px container width, prefer a domain wrapper (FormSection / RowGroup / DecisionPanel) that'\n + ' wires its own @container jr-card breakpoint.'\n + ' Cross-ref: horizontal-only → Row, multi-column responsive → Grid, titled chapter → Section,'\n + ' KPI matrix → KPICluster, surface w/ elevation → Card.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Grid: {\n ...shadcnComponentDefinitions.Grid,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Grid layout (1-6 columns) — 通用 grid primitive. Use for KPI-card matrices,'\n + ' product galleries, multi-column dashboards. Don\\'t use Grid for single-row layouts'\n + ' (use Row + gap). Pairs cleanly with AppChrome / SectionRouter — Grid is purely'\n + ' geometric inside a section, while AppChrome handles the page chrome (top bar +'\n + ' SideNav).'\n + ' Cross-ref: KPI matrix (responsive auto-fit) → KPICluster, single row → Row, vertical stack'\n + ' → Stack, horizontally-swept tile gallery → Carousel.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Separator: {\n ...shadcnComponentDefinitions.Separator,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Visual separator line — horizontal / vertical orientation. Use to break a long Stack /'\n + ' Row into sub-groups, or as a label-pair divider in toolbars. Don\\'t use Separator for'\n + ' chapter-level page divisions (use Section); don\\'t use it where the spacing alone'\n + ' (gap on Stack) already conveys grouping.'\n + ' Cross-ref: titled chapter boundary → Section, intrinsic spacing → Stack/Row with gap,'\n + ' vertical column rail → Stack direction=\"row\" + Separator orientation=\"vertical\".'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Tabs: {\n ...shadcnComponentDefinitions.Tabs,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Tab navigation; `value` 支持 `{ $bindState }` 双向绑定,`change` 事件走 emit;`tabs[]` 为'\n + ' { label, value } 数组. Use for sectioning a single page into N independent views (Overview /'\n + ' Details / Logs). Don\\'t use Tabs for sequential steps (use Stepper); don\\'t use Tabs when'\n + ' only one option exists; don\\'t mix Tabs and Accordion in the same panel (cognitive overload).'\n + ' Cross-ref: sequential workflow → Stepper, left-rail nav for app shells → SideNav +'\n + ' SectionRouter, collapsible alternative views → Accordion, single fold-able pane → Collapsible.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Accordion: {\n ...shadcnComponentDefinitions.Accordion,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Collapsible sections; `items[]` 为 { title, content } 数组;`type` 选 single(默认)'\n + ' 或 multiple. Use for FAQs, dense reference lists where most content is hidden by default.'\n + ' `content` 是 string;如需复杂 children(嵌入图表 / 表格 / 卡片)请使用 Collapsible(下条).'\n + ' Don\\'t use Accordion when most users open every panel anyway (just use Section + Stack);'\n + ' don\\'t nest Accordion inside Accordion. Distinct from Collapsible (single rich-children section)'\n + ' and Tabs (peer alternative views, all visible at once via switching).'\n + ' Cross-ref: rich-content single fold → Collapsible, mutually-exclusive peer views → Tabs,'\n + ' always-visible chapter → Section, hierarchical drill-down → HierarchyTree.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Collapsible: {\n ...shadcnComponentDefinitions.Collapsible,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Single collapsible section with custom children via the default slot. Use when you need ONE'\n + ' fold-able region with rich content (Chart / DataTable / nested layout). Don\\'t use Collapsible'\n + ' for multi-section foldables (use Accordion items[]); don\\'t use it for chapter headings'\n + ' (Section already has collapsible).'\n + ' Cross-ref: multi-section fold → Accordion, titled chapter with built-in collapse → Section,'\n + ' peer alternative views → Tabs.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Carousel: {\n ...shadcnComponentDefinitions.Carousel,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Horizontally scrollable carousel of cards (embla-carousel-react under the hood); `items[]`'\n + ' 为 { title?, description? } 数组. Use for image galleries, related-product slides, onboarding'\n + ' walkthroughs where horizontal sweep matters. Don\\'t use Carousel for tabular data (use DataTable),'\n + ' for important data the user MUST scan (carousels hide all but one card by default), or for'\n + ' navigation between page sections (use Tabs).'\n + ' Cross-ref: tabular data → DataTable, section navigation → Tabs / SideNav + SectionRouter,'\n + ' single image with pan/zoom → ImageViewer, grid of always-visible tiles → Grid.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Table: {\n ...shadcnComponentDefinitions.Table,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Simple read-only table (string cells only). Use for ≤ ~5-10 rows of static reference info'\n + ' (config keys, glossary, lookup tables) where DataTable\\'s sort + pagination would be overkill.'\n + ' Don\\'t use Table for agent-driven data with mixed types or actions (use DataTable which handles'\n + ' column.type / sortable / pagination / badge / progress / actions); don\\'t use Table for'\n + ' editable inputs (it is stateless string-grid).'\n + ' Cross-ref: typed / sortable / paginated rows → DataTable, requirement coverage grid →'\n + ' TraceMatrix, 2D numeric intensity → Heatmap, comparison scoring → ComparisonMatrix.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Image: {\n ...shadcnComponentDefinitions.Image,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Image primitive — renders <img> when src present, placeholder otherwise. Use for inline'\n + ' avatars (hint: Avatar primitive is more semantic), logo / icon-style assets, decorative tiles'\n + ' inside Card / Carousel. Don\\'t use shadcn Image for files that need pan / zoom / annotation'\n + ' (use ImageViewer); don\\'t use it for KiCad / Gerber rendering (use those domain viewers).'\n + ' 本 shadcn Image 是基础展示 primitive,与 ImageViewer 不冲突。'\n + ' Cross-ref: pan/zoom viewer → ImageViewer, user avatar → Avatar, KiCad schematic → KicadViewer,'\n + ' Gerber render → GerberViewer, image gallery → Carousel + Image.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Skeleton: {\n ...shadcnComponentDefinitions.Skeleton,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Skeleton loader — width / height / rounded 控制占位形状. Use for the loading state of any'\n + ' viewport-occupying component (KPICard / Chart / DataTable rows) so the layout does not jump'\n + ' on data arrival. Don\\'t use Skeleton for sub-second loads (use Spinner instead) or for the'\n + ' empty / error states (Skeleton implies \"data is coming\"). 5-state UI loading 态首选,'\n + ''\n + ' Cross-ref: short / indeterminate spin → Spinner, determinate progress → Progress, \"no data\"'\n + ' empty state → Alert (info) + body copy, error state → Alert (destructive).'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Avatar: {\n ...shadcnComponentDefinitions.Avatar,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'User avatar with fallback initials — `name` 必填(用作 alt + initials), `src` / `size` 可选.'\n + ' Use for user identity in comment threads, owner column in tables, mention chips in narrative.'\n + ' Don\\'t use Avatar for non-person entities (use Image + circle radius); don\\'t use it as the'\n + ' primary identity surface where the full name + role need to be visible (use a Card with'\n + ' Avatar + Heading + Text inside).'\n + ' Cross-ref: non-person image → Image with circular radius, full identity surface → Card +'\n + ' Avatar + Heading + Text, attribution chip → Badge.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n\n // =========================================================================\n // CWRF-013 Phase 1 (Tier 1.3.b) — shadcn 第 2 批:12 form / interaction\n // primitives. Batch 2 of 3 — props schemas re-exported verbatim from\n // `@json-render/shadcn@0.19.0` via `shadcnComponentDefinitions.<Name>`;\n // this catalog only overrides the human-readable `description`.\n //\n // Roster — 7 form fields(Input / Textarea / Select / Checkbox / Radio /\n // Switch / Slider)+ 2 navigation(Button / Link)+ 3 menu/toggle controls\n // (DropdownMenu / Toggle / ToggleGroup)= 12.\n //\n // The Form layer maps directly to 03_shadcn_integration.md §2.5 \"表单(8)\"\n // 之外 + §2.2 \"反馈与导航\" 中的 Button / Link / DropdownMenu / Toggle /\n // ToggleGroup;feedback/overlay/display 剩余 12 留 PR-P1-#4c。\n //\n // 注意:本批次组件多带 `validateOn` / `checks` / `events: [\"change\"]` 等\n // form-state 字段 — 全部由上游 schema 透传,本地不重写;`Button` 的 `variant`\n // 与 `Toggle` 的 `variant` 都在上游 enum 中(primary/secondary/danger 与\n // default/outline 等),无需进 catalog-alignment-allowlist。\n // =========================================================================\n\n Input: {\n ...shadcnComponentDefinitions.Input,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Single-line text input — `name` / `label` 必填,`type` 可选 text(默认)/ number / email /'\n + ' password; `validateOn` 支持 change / blur / submit; `checks[]` 支持上游 form-state 校验链;'\n + ' `change` 事件经 emit 上传. Use as the default text field inside FormField. Don\\'t use raw'\n + ' Input outside a FormField wrapper (loses label↔input association); don\\'t use Input for'\n + ' multi-line text (use Textarea) or for selecting from a fixed list (use Select / Radio).'\n + ''\n + ' Cross-ref: multi-line → Textarea, fixed-set choice (≤5) → Radio, fixed-set choice (>5) →'\n + ' Select, on/off setting → Switch, multi-field form scaffolding → FormField (in FormSection).'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Textarea: {\n ...shadcnComponentDefinitions.Textarea,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Multi-line text input — `rows` 可选,与 Input 共享 `checks` / `validateOn` / `value` 双向'\n + ' 绑定语义. Use for free-form descriptions, comments, multi-line config snippets where Input would'\n + ' truncate. Don\\'t use Textarea for short single-line entry (use Input) or for code editing'\n + ' (no syntax highlighting; use a future code-editor primitive). FormSection 内部当前自带 textarea'\n + ' 字段。'\n + ' Cross-ref: single line → Input, read-only code excerpt → CodeViewer, markdown render →'\n + ' MarkdownViewer, multi-field form → FormField + Textarea (within FormSection).'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Select: {\n ...shadcnComponentDefinitions.Select,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Single-select dropdown — `options[]` 为 string 数组(简单语义). Use for picking ONE value'\n + ' from a fixed-and-known set with > ~5 options where Radio would be too tall. `value` 支持'\n + ' `{ $bindState }` 双向绑定,`change` 事件经 emit 上传. Don\\'t use Select for ≤ 5 options'\n + ' (Radio is more scannable); don\\'t use Select for action verbs (use DropdownMenu — it\\'s a'\n + ' \"menu\", not a form field). 如需 { label, value } 列表请使用 DropdownMenu。'\n + ' Cross-ref: ≤5 mutually-exclusive choices → Radio, action menu with { label, value } →'\n + ' DropdownMenu, period chooser w/ action emit → ButtonGroup, multi-select → list of Checkbox.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Checkbox: {\n ...shadcnComponentDefinitions.Checkbox,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Boolean checkbox — `checked` 支持 `{ $bindState }`, `change` 事件经 emit 上传'\n + ' (payload `{ checked }`). Use for independent yes/no choices, opt-in toggles in compact lists,'\n + ' multi-select where each option toggles independently. Don\\'t use Checkbox for mutually-exclusive'\n + ' choices (use Radio); don\\'t use Checkbox where the on/off semantics is more like a setting (use'\n + ' Switch — it visually emphasises \"now on / now off\"). 可独立使用或挂在 FormSection 内。'\n + ' Cross-ref: mutually-exclusive choice → Radio, immediate-effect on/off → Switch, multi-select'\n + ' driving a sticky chip → ToggleGroup, stateful checklist with status icons → ChecklistCard.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Radio: {\n ...shadcnComponentDefinitions.Radio,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Radio group — `options[]` 为 string 数组; `value` 双向绑定. Use for ONE-of-N choice with'\n + ' ≤ 5 options where seeing all alternatives at once helps the user decide. Don\\'t use Radio'\n + ' for > 5 options (use Select to save vertical space); don\\'t use Radio for independent toggles'\n + ' (use Checkbox — Radio enforces exclusivity within `name`); don\\'t use Radio for binary'\n + ' on/off (use Switch).'\n + ' Cross-ref: > 5 options → Select, multi-select → Checkbox, immediate-effect on/off → Switch,'\n + ' weighted scoring across choices → ComparisonMatrix, full decision rationale → DecisionPanel.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Switch: {\n ...shadcnComponentDefinitions.Switch,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Toggle switch (boolean) — `checked` / `change` 与 Checkbox 同形; `label` 必填'\n + '(无 sr-only fallback). Use for settings panels where the on/off has immediate effect (dark mode,'\n + ' notifications enabled). Don\\'t use Switch inside a multi-select list (use Checkbox); don\\'t use'\n + ' Switch for \"submit-then-apply\" forms (use Checkbox so the user knows the change isn\\'t live yet).'\n + ' 视觉上比 Checkbox 更强调\"开/关\"语义。'\n + ' Cross-ref: deferred-apply yes/no → Checkbox, one-press toggle inside a group → Toggle, multi-'\n + 'select with sticky highlight → ToggleGroup.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Slider: {\n ...shadcnComponentDefinitions.Slider,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Single-handle numeric slider — `min` / `max` / `step` / `value` 全部 nullable; `label` 可选;'\n + ' `change` 事件 payload `{ value: number }`. Use for continuous numeric input where exact value is'\n + ' less important than approximate position (volume, brightness, threshold tuning). Don\\'t use Slider'\n + ' for precise numeric entry (use Input type=number); don\\'t use Slider for ≤ 5 discrete values'\n + ' (use Radio or Select); 仅单值, range 滑块未提供,'\n + ' Cross-ref: precise numeric → Input type=\"number\", determinate read-only progress → Progress,'\n + ' discrete bucketed range → Radio / Select.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Button: {\n ...shadcnComponentDefinitions.Button,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Action button — `variant` 可选 primary(默认)/ secondary / danger; `click` 事件经 emit 上传'\n + '(payload 为空). Use for primary CTAs (\"Save\" / \"Submit\" / \"Cancel\"), inline row actions, modal'\n + ' confirmations. Don\\'t use Button for navigation-only links (use Link); don\\'t use Button when'\n + ' the action is a hyperlink to another page (use Link with explicit href).'\n + ' 本组件首次提供独立按钮 primitive。'\n + ' Cross-ref: destructive action (driven by `variant: \"destructive\"`) → ConfirmDialog (auto-wraps'\n + ' inside AppChrome.footer.actions), navigation → Link, sticky state → Toggle, period chooser'\n + ' (each click selects + emits) → ButtonGroup.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n // CWRF-013 Phase 4 P2-T14 (slice F): ConfirmDialog primitive entry.\n // Acts as the decision-friction layer for destructive / irreversible\n // actions (driven by the Button primitive's `destructive` variant).\n ConfirmDialog: {\n props: z.object({\n trigger: z.object({\n label: z.string(),\n variant: z.enum(['primary', 'secondary', 'ghost', 'destructive']).optional(),\n size: z.enum(['sm', 'md', 'lg']).optional(),\n icon: z.string().optional(),\n disabled: z.boolean().optional(),\n }),\n title: z.string(),\n description: z.string().optional(),\n severity: z.enum(['destructive', 'warning', 'info']).optional(),\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n onConfirm: z.string(),\n onCancel: z.string().optional(),\n }),\n description:\n 'Two-step confirmation dialog — MUST wrap any destructive or irreversible action'\n + ' (driven by Button primitive). Use for: 驳回审批 / 删除 / 终止流程 / 撤销提交 /'\n + ' 永久删除 / 解除绑定 / reject / delete / terminate / unbind / revoke. severity=\"destructive\"'\n + ' (default): red icon + red Confirm button + initial focus on Cancel;'\n + ' severity=\"warning\": amber icon + primary Confirm + initial focus on Confirm;'\n + ' severity=\"info\": blue icon + primary Confirm + initial focus on Confirm.'\n + \" Don't use ConfirmDialog for reversible actions (just Button.loading is enough for\"\n + \" double-click protection). Don't use ConfirmDialog as a generic Modal — use the\"\n + ' shadcn Dialog primitive for non-decision modals. Backed by'\n + ' @radix-ui/react-alert-dialog (role=\"alertdialog\", focus-trap, Esc/overlay close).'\n + ' RESPONSIVE: the Cancel/Confirm footer auto-stacks vertically and both'\n + ' buttons stretch full-width when the rendered container is narrower than 480px. Cancel stays on'\n + ' top of Confirm to preserve the destructive decision-friction policy.'\n + ' Cross-ref: non-decision modal → Dialog, slide-in panel → Drawer, inline non-blocking notice →'\n + ' Alert (destructive variant), auto-wired destructive footer → AppChrome.footer.actions with'\n + ' `variant: \"destructive\"`.',\n },\n Link: {\n ...shadcnComponentDefinitions.Link,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Inline anchor — `href` + `label` 必填; `click` 事件经 emit 上传(允许 Agent 拦截导航).'\n + ' Use for navigation references inside narrative text (markdown-style \"see X\"), in-page deep links,'\n + ' external resource pointers. Don\\'t use Link for actions that don\\'t navigate (use Button); don\\'t'\n + ' use Link styled as a button (visual ambiguity confuses keyboard users). 语义化文字链接,非按钮 —'\n + ' 视觉用主题 link color。'\n + ' Cross-ref: action (no navigation) → Button, in-app section switcher → SideNav + SectionRouter'\n + ' (or Tabs), tooltip-style \"more info\" → Tooltip / Popover.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n DropdownMenu: {\n ...shadcnComponentDefinitions.DropdownMenu,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Dropdown action menu — `items[]` 为 { label, value } 数组; 选中 emit \"select\"'\n + ' (payload `{ value }`). Use for row-level actions (\"Edit / Delete / Duplicate\"), settings menus,'\n + ' more-actions overflow buttons. Don\\'t use DropdownMenu for form field selection (use Select —'\n + ' DropdownMenu is \"menu\", Select is \"field\"); don\\'t use it where ButtonGroup\\'s side-by-side'\n + ' visibility serves the user better. 语义上\"按钮 + 弹出菜单\",区别于 Select(后者是表单字段语义)。'\n + ' Cross-ref: form field selection → Select, side-by-side buttons → ButtonGroup, rich-content'\n + ' popover → Popover, hover-only hint → Tooltip.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Toggle: {\n ...shadcnComponentDefinitions.Toggle,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Single toggle button (press / unpress) — `variant` 可选 default / outline; `pressed` 双向'\n + ' 绑定;`change` 事件 payload `{ pressed }`. Use for sticky-state toolbar buttons (bold / italic'\n + ' style toggles, layer-visibility toggles, filter-on / filter-off). Don\\'t use Toggle for form'\n + ' fields (use Switch which has label); don\\'t use Toggle for one-shot actions (use Button).'\n + ' 区别于 Switch(后者是表单字段,带 label)。'\n + ' Cross-ref: form-field on/off → Switch, one-shot action → Button, ≥2 sticky-state buttons →'\n + ' ToggleGroup, period chooser w/ click-action coupling → ButtonGroup.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n ToggleGroup: {\n ...shadcnComponentDefinitions.ToggleGroup,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Group of toggle buttons — `type` 选 single(默认)/ multiple; `items[]` 为 { label, value };'\n + ' `change` 事件 payload `{ value | values[] }`. Use for view-mode pickers (List / Grid / Card),'\n + ' style multi-toggles (bold + italic + underline). Don\\'t use ToggleGroup for navigation between'\n + ' tabs (use Tabs); don\\'t use ToggleGroup when only one option exists (use Toggle directly).'\n + ' 视觉上类似 ButtonGroup,但 ToggleGroup 强调\"持续选中\"而 ButtonGroup 强调\"瞬时触发\"。'\n + ' Cross-ref: tab navigation → Tabs, single toggle → Toggle, click-action emit per press →'\n + ' ButtonGroup, mutually-exclusive form field → Radio.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n\n // =========================================================================\n // CWRF-013 Phase 1 (Tier 1.3.b) — shadcn 第 3 批 12 feedback / overlay /\n // display primitives. Batch 3 of 3 — props schemas re-exported verbatim\n // from `@json-render/shadcn@0.19.0` via the spread + description override\n // pattern. After this batch the catalog covers all 36 shadcn primitives\n // (38 Phase 0 domain + 36 shadcn = 74 entries).\n //\n // Roster — 12 entries split across 6 sub-buckets, 2 each:\n // overlay -> dialog / drawer\n // typography -> heading / text\n // inline fb -> badge / alert\n // status -> progress / spinner\n // popover -> tooltip / popover\n // nav control -> button-group / pagination\n //\n // Naming collision audit (03_shadcn_integration.md §4) — none of the 12\n // names collide with Phase 0 domain components; Phase 0 has no typography\n // / overlay / inline-feedback primitive of its own. shadcn Spinner will\n // replace per-viewer loading divs once Phase 4 ships the 5-state design.\n //\n // NOTE — block comment intentionally avoids the pattern `<Capitalized>:`\n // so that scripts/check-catalog-alignment.mjs::listCatalogComponents\n // (which reads catalogSrc literally without stripping comments) does not\n // double-count names. See PR-P1-#4b commit body for the same trade-off.\n // =========================================================================\n\n Dialog: {\n ...shadcnComponentDefinitions.Dialog,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Modal dialog with title + optional description + body slot — `openPath` 必填,绑定到 state'\n + '(Agent 通过 stateWrite 控制开/关). Use for confirmation prompts, focused single-step interventions'\n + ' (rename / delete confirm), critical decisions that demand attention. Don\\'t use Dialog for'\n + ' non-critical info (use Tooltip or Alert); don\\'t use Dialog for long forms (use Drawer for'\n + ' side-panel real estate).'\n + ' Cross-ref: destructive confirmation → ConfirmDialog (role=alertdialog, focus on Cancel),'\n + ' long-form side panel → Drawer, inline non-modal notice → Alert, hover hint → Tooltip,'\n + ' click popover → Popover.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Drawer: {\n ...shadcnComponentDefinitions.Drawer,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Slide-in side drawer (底层用 vaul, 移动端友好) — `title` 必填, `openPath` 绑定 state 控制开/关.'\n + ' Use for long-form panels that should not steal full focus (filters, settings, side details, in-line'\n + ' editing of selected row). Don\\'t use Drawer for short confirmations (use Dialog); don\\'t use Drawer'\n + ' on tiny mobile viewports where Dialog is more thumb-friendly. 语义上与 Dialog 同形,差别仅在视觉'\n + '(底部抽屉 vs 中心模态)。'\n + ' Cross-ref: short confirmation → Dialog, destructive confirmation → ConfirmDialog, sticky'\n + ' left-rail (always visible) → SideNav, rich-content popover anchored to a trigger → Popover.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Heading: {\n ...shadcnComponentDefinitions.Heading,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Semantic heading (h1-h4) — `text` 必填,`level` 可选; `h1` 默认.'\n + ' Use for page / section titles where the level encodes outline hierarchy. Don\\'t use Heading for'\n + ' emphasised body text (use Text variant=lead or strong markdown); don\\'t pick a level for visual'\n + ' size — pick it for outline correctness (the h1 → h4 sequence MUST be monotone for accessibility).'\n + ' 直接渲染对应 HTML tag,带 shadcn typography 默认样式。'\n + ' Cross-ref: emphasized paragraph text → Text (variant=\"lead\"), titled chapter with optional fold'\n + ' → Section, page-level app header → AppChrome (auto-renders the page title).'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Text: {\n ...shadcnComponentDefinitions.Text,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Body text with `variant` enum: body(默认)/ caption / muted / lead / code.'\n + ' Use for paragraph copy, secondary annotations, captions, inline code references where the host'\n + ' typography should drive sizing. Don\\'t use Text for headings (use Heading with explicit level);'\n + ' don\\'t use Text for full markdown content (use MarkdownViewer); don\\'t use Text variant=code for'\n + ' multi-line code (use CodeViewer).'\n + ' Cross-ref: titled chapter → Heading + Section, multi-line code → CodeViewer / CodeFileViewer,'\n + ' rich markdown narrative → MarkdownViewer, inline status chip → Badge, callout notice → Alert.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Badge: {\n ...shadcnComponentDefinitions.Badge,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Inline badge / chip — `text` 必填; `variant` 选 default / secondary / destructive / outline.'\n + ' Use for short status labels next to titles, tag chips, count indicators, version markers.'\n + ' Don\\'t use Badge for full sentences (use Alert if it\\'s a callout); don\\'t use Badge as a button'\n + '(it has no click handler — use Button styled \"ghost\" instead). The StatusBoard / DecisionPanel'\n + ' badge fields inline-render their own chips; this primitive is the standalone reusable variant.'\n + ' Cross-ref: full sentence callout → Alert, side-nav counter chip → SideNav `badge` field,'\n + ' user identity chip → Avatar, status row with rich data → DataTable badge column.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Alert: {\n ...shadcnComponentDefinitions.Alert,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Inline alert box with `title` + optional `message` + `type` (success / info / warning / error).'\n + ' Use for non-modal user notifications: \"saved successfully\", \"preview is stale\", \"API quota at 80%\".'\n + ' Don\\'t use Alert for blocking errors (use Dialog if user MUST acknowledge); don\\'t use Alert for'\n + ' transient toasts (Toast is a separate future primitive); don\\'t fire Alert for purely informational'\n + ' content (use Text muted). 语义上为\"内联提示框\",区别于 Dialog(模态)。'\n + ' Cross-ref: blocking confirmation → Dialog / ConfirmDialog, short inline chip → Badge, muted'\n + ' secondary copy → Text variant=\"muted\", error state on a data component → that component\\'s'\n + ' `error` prop.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Progress: {\n ...shadcnComponentDefinitions.Progress,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Linear progress bar — `value` 必填,`max` 可选(默认 100), `label` 可选(显示在条上方).'\n + ' Use for any 0→max completion: file upload, batch job, multi-step wizard progress, install'\n + ' progress. Don\\'t use Progress for indeterminate loading (use Spinner / Skeleton); don\\'t use'\n + ' Progress for budget-vs-actual breakdown (use BudgetBar — it conveys two stacked values).'\n + ' Progress 是通用\"0 → max\"完成度,区别于 BudgetBar 的堆叠语义。'\n + ' Cross-ref: indeterminate spin → Spinner, layout-preserving load → Skeleton, two-stack budget'\n + ' breakdown → BudgetBar, multi-step wizard with named steps → Stepper.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Spinner: {\n ...shadcnComponentDefinitions.Spinner,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Indeterminate loading spinner — `size` 可选 sm / md / lg, `label` 可选(sr-only 友好).'\n + ' Use for short waits where the duration is unknown (network round-trip ≤ 2s, async tool call).'\n + ' Don\\'t use Spinner for layout-disrupting loads (use Skeleton — it preserves the eventual shape);'\n + ' don\\'t use Spinner for known progress (use Progress with value). Existing viewers historically shipped their own'\n + ' loading div; the unified five-state design replaces them on contact.'\n + ' Cross-ref: layout-preserving load placeholder → Skeleton, determinate progress → Progress,'\n + ' empty state notice → Alert, per-component loading prop → that component\\'s'\n + ' `loading` prop (DataTable / Chart / Heatmap / ...).'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Tooltip: {\n ...shadcnComponentDefinitions.Tooltip,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Hover / focus tooltip — `text` 是触发元素文字, `content` 是悬浮文字.'\n + ' Use for short clarifications next to truncated labels, icon-only buttons, abbreviated metrics.'\n + ' Don\\'t use Tooltip for content the user MUST see (Tooltip auto-hides — use Alert / Text muted);'\n + ' don\\'t use Tooltip on touch-only devices as the sole information channel; don\\'t put rich content'\n + ' in Tooltip (use Popover for multi-element content). 与 ChartTooltip(图表内置 hover)不同,'\n + ' 本 Tooltip 是通用 inline primitive。'\n + ' Cross-ref: rich-content popover → Popover, must-see callout → Alert, action menu → DropdownMenu,'\n + ' inline annotation in narrative → AnnotationLayer.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Popover: {\n ...shadcnComponentDefinitions.Popover,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Click-to-open popover — `trigger` 是触发文字, `content` 是浮层文字.'\n + ' Use for \"more info\" panels with rich content (multi-paragraph + image + Link), inline filter'\n + ' configurators, color pickers. Don\\'t use Popover for short hints (use Tooltip — hover-friendly);'\n + ' don\\'t use Popover for action menus (use DropdownMenu — items list); don\\'t nest Popover inside'\n + ' Popover. 区别于 Tooltip(hover/focus 触发)与 DropdownMenu(items 列表),Popover 是任意富文本浮层。'\n + ' Cross-ref: hover hint → Tooltip, action menu → DropdownMenu, focused modal → Dialog, side panel'\n + ' → Drawer, inline notice → Alert.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n ButtonGroup: {\n ...shadcnComponentDefinitions.ButtonGroup,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Group of buttons with `selected` 单值高亮 — `buttons[]` 为 { label, value };`click` 事件'\n + ' payload `{ value }`. Use for sticky-state choosers that ALSO trigger an action on each press'\n + ' (period filters: 1D / 7D / 30D — each click both selects AND fetches new data). Don\\'t use'\n + ' ButtonGroup for purely state-only multi-select (use ToggleGroup — toggle pressed without action);'\n + ' don\\'t use ButtonGroup for navigation between page sections (use Tabs — preserves URL semantics).'\n + ' 区别于 ToggleGroup(#4b),ButtonGroup 强调\"瞬时触发\"(每次 click 都 emit),即使 `selected`'\n + ' 不变也会触发。'\n + ' RESPONSIVE: the button row inherits the global flex-wrap mixin so a long'\n + ' chooser (e.g. 1D / 7D / 30D / 90D / 1Y / All) wraps to a second line in narrow chat-bubble hosts'\n + ' instead of clipping. If you need EXPLICIT single-column collapse below 480px, wrap the ButtonGroup'\n + ' in AppChrome.footer.actions or DecisionPanel — both wire their own @container jr-card breakpoint.'\n + ' Cross-ref: state-only multi-select → ToggleGroup, page tabs → Tabs, dropdown action list →'\n + ' DropdownMenu, single sticky toggle → Toggle.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n Pagination: {\n ...shadcnComponentDefinitions.Pagination,\n description:\n SHADCN_DESCRIBE_PREFIX\n + 'Pagination control — `totalPages` 必填, `page` 当前页(nullable, 默认 1); `change` 事件'\n + ' payload `{ page }`. Use to drive client-controlled pagination on custom lists (Card grids,'\n + ' Carousel collections, agent-rendered tables not using DataTable). Don\\'t add Pagination to a'\n + ' DataTable that already has internal `pageSize` (you\\'ll get two pagination UIs); don\\'t use'\n + ' Pagination for infinite-scroll lists (different UX). DataTable.pageSize drives that table\\'s internal pagination,'\n + ' 本 Pagination 是独立 primitive,允许 Agent 在自定义列表上挂分页 UI。Distinct from'\n + ' DataTable.pageSize (internal, schema-controlled) — Pagination is the LLM-emittable variant'\n + ' for non-tabular collections.'\n + ' Cross-ref: built-in pagination → DataTable.pageSize, swipe-based card walk → Carousel,'\n + ' multi-step wizard → Stepper.'\n + SHADCN_DESCRIBE_SUFFIX,\n },\n\n // =========================================================================\n // CWRF-013 Phase 2 PR-P2-#1 — 6 layout primitives (Tier 2-1).\n // chat-widget-domain layout atoms (NOT shadcn upstream — shadcn does not\n // ship Box / Row / Spacer / Section / Stepper / FormField). All sizing\n // values come from the YCW token enums (none/xs/sm/md/lg/xl etc.) — raw\n // pixel values are intentionally rejected by the Zod schemas.\n // Implementations live in `src/components/JsonRender/domain/layout/*.tsx`,\n // shared CSS variables in `domain/layout/layout-tokens.css`.\n // 75 → 81 entries (38 Phase 0 domain + 36 shadcn + 1 JrSlot + 6 layout).\n // Design ref: 03_layout_primitives/02_layout_primitive_design.md §2.1-2.7,\n // §2.11-2.12; 00_phase2_kickoff_checklist.md §2.1.\n // =========================================================================\n Box: {\n props: z.object({\n padding: z.enum(['none', 'xs', 'sm', 'md', 'lg', 'xl']).optional(),\n gap: z.enum(['none', 'xs', 'sm', 'md', 'lg', 'xl']).optional(),\n bg: z.enum(['default', 'subtle', 'elevated', 'accent']).optional(),\n radius: z.enum(['none', 'sm', 'md', 'lg', 'full']).optional(),\n bordered: z.boolean().optional(),\n direction: z.enum(['row', 'column']).optional(),\n align: z.enum(['start', 'center', 'end', 'stretch']).optional(),\n justify: z.enum(['start', 'center', 'end', 'between', 'around']).optional(),\n className: z.string().nullable().optional(),\n }),\n slots: ['default'],\n description:\n 'Universal flex container — fallback layout primitive when no semantic'\n + ' domain component (KPICard / DataTable / Chart) fits. Use for ad-hoc'\n + ' grouping, padded surfaces, or vertical stacks where no domain idiom'\n + ' applies. All spacing / radius / bg props are token enums'\n + ' (none/xs/sm/md/lg/xl); raw pixels are rejected. Default'\n + ' direction=column. Don\\'t use Box when a semantic component exists'\n + ' (Box.direction=\"row\" reads better as Row, labelled chapters belong'\n + ' in Section, and bordered surfaces belong in Card); don\\'t reach for'\n + ' Box just to add padding around one child — apply token padding on'\n + ' the child or wrap in Card.'\n + ' Cross-ref: horizontal row → Row, titled chapter → Section, surface'\n + ' with elevation → Card. Distinct from Card (which adds a visual'\n + ' surface and elevation by default) and Section (which adds a title'\n + ' + optional collapse). See'\n + ' ',\n },\n Row: {\n props: z.object({\n gap: z.enum(['none', 'xs', 'sm', 'md', 'lg', 'xl']).optional(),\n align: z.enum(['start', 'center', 'end', 'stretch', 'baseline']).optional(),\n justify: z.enum(['start', 'center', 'end', 'between', 'around']).optional(),\n wrap: z.boolean().optional(),\n className: z.string().nullable().optional(),\n }),\n slots: ['default'],\n description:\n 'Horizontal layout primitive (syntactic sugar for Box.direction=\"row\").'\n + ' wrap=true enables responsive line-break on narrow viewports. Use for'\n + ' card grids, button groups, toolbars. Don\\'t use Row to lay out form'\n + ' fields (use Stack); don\\'t use Row to wrap a single child (no benefit'\n + ' over the child rendered alone).'\n + ' Cross-ref: vertical stack → Stack, responsive multi-column grid → Grid,'\n + ' inline-gap utility (justify-between trick) → Spacer, KPI tile row →'\n + ' KPICluster, action button row → ButtonGroup. ',\n },\n Spacer: {\n props: z.object({\n size: z.enum(['none', 'xs', 'sm', 'md', 'lg', 'xl']).optional(),\n flex: z.boolean().optional(),\n className: z.string().nullable().optional(),\n }),\n slots: [],\n description:\n 'Inline gap utility — `flex: true` pushes neighbours apart (use inside'\n + ' Row to separate content from actions); `size: <token>` produces a'\n + ' fixed gap on the parent flex axis. Use for asymmetric Row layouts'\n + ' where part of the children should hug the start and the rest hug'\n + ' the end. Mutually exclusive: pick one. Don\\'t use Spacer when the'\n + ' parent has `gap` set — that already spaces children uniformly.'\n + ' Cross-ref: uniform spacing → Stack/Row `gap` token, chapter divider'\n + ' line → Separator, full chapter container with title → Section.'\n + ' ',\n },\n Section: {\n props: z.object({\n title: z.string(),\n description: z.string().optional(),\n bordered: z.boolean().optional(),\n collapsible: z.boolean().optional(),\n defaultCollapsed: z.boolean().optional(),\n className: z.string().nullable().optional(),\n }),\n slots: ['default'],\n description:\n 'Semantic chapter container — title + optional description + content.'\n + ' Use to break a long-form page into named regions (e.g. \"Engineering\"'\n + ' / \"Risks\" / \"Schedule\"). When `collapsible` is true the component'\n + ' renders a native `<details>` element so keyboard / screen-reader'\n + ' expand-collapse work without custom JS. Don\\'t use Section for a'\n + ' single discrete tile (use Card); don\\'t use Section as a styling'\n + ' wrapper around an existing semantic component (use that component\\'s'\n + ' own props).'\n + ' Cross-ref: single tile → Card, multi-section foldables → Accordion,'\n + ' single rich-content fold → Collapsible, page header → AppChrome.'\n + ' ',\n },\n Stepper: {\n props: z.object({\n steps: z.array(z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n status: z.enum(['pending', 'active', 'completed', 'error']).optional(),\n })),\n activePath: z.string().optional()\n .describe('state path bound to the active step id (wiring; is render-only).'),\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n className: z.string().nullable().optional(),\n }),\n slots: [],\n description:\n 'Multi-step progress indicator — pure render-time visualisation of'\n + ' `steps[].status` (pending / active / completed / error). Use for'\n + ' onboarding flows, multi-page wizard summaries, and fabrication /'\n + ' workflow timelines where the user benefits from seeing the whole'\n + ' arc at once. Pair with Tabs or sections to switch the displayed'\n + ' body content. Don\\'t use Stepper as a state machine — it does not'\n + ' own progress; the spec author / agent decides each step status.'\n + ' activePath is reserved for wiring and currently no-op.'\n + ' Distinct from Progress (single bounded numeric value) and Tabs'\n + ' (peer alternatives, no implied ordering).'\n + ' Cross-ref: single bounded numeric → Progress, peer alternative'\n + ' views (no ordering) → Tabs, status checklist → ChecklistCard,'\n + ' time-ordered events on a strip → Timeline. See'\n + ' ',\n },\n FormField: {\n props: z.object({\n label: z.string(),\n name: z.string()\n .describe('field name; matches the inner control\\'s `name` prop and the form-state key.'),\n required: z.boolean().optional(),\n description: z.string().optional(),\n error: z.string().optional()\n .describe('error message; surfaces aria-invalid + aria-describedby on the wrapped control region.'),\n className: z.string().nullable().optional(),\n }),\n slots: ['default'],\n description:\n 'Form-field wrapper — label + required marker + description + control'\n + ' slot + error message. Use for any single-field form input where'\n + ' the user benefits from a label + helper-text + inline error'\n + ' presentation, regardless of whether the surrounding form uses'\n + ' FormSection () or stand-alone primitives. children MUST be'\n + ' exactly one shadcn form primitive (Input / Textarea / Select /'\n + ' Checkbox / Switch / Radio / Slider). Don\\'t nest FormField inside'\n + ' FormField; don\\'t put display components (KPICard / Chart) inside'\n + ' FormField. Distinct from FormSection (F multi-'\n + 'field schema-driven group) — FormField is the lower-level wrapper'\n + ' that FormSection composes per-field.'\n + ' Cross-ref: multi-field schema-driven form → FormSection, the inner'\n + ' control primitives (one per field) → Input / Textarea / Select /'\n + ' Checkbox / Radio / Switch / Slider, submit confirmation → ConfirmDialog.'\n + ' ',\n },\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 1 PR-P1-#5 — synthetic JrSlot wrapper.\n // Authors do NOT emit JrSlot directly. The migrator transformer\n // `legacy.slots.named-children` inflates `element.namedChildren` into\n // synthetic JrSlot elements with keys `<parent>__slot__<slotName>`.\n // Declared in the catalog so registry parity invariant holds and\n // `catalog:check-alignment` passes (74 + 1 + 6 = 81 entries after Phase 2).\n // -------------------------------------------------------------------------\n JrSlot: {\n props: z.object({\n name: z.string(),\n }),\n slots: ['default'],\n description:\n 'synthetic named-slot wrapper. NOT meant to be'\n + ' authored directly by Agents; the spec migrator transformer'\n + ' (`legacy.slots.named-children`) inflates `element.namedChildren`'\n + ' into one JrSlot per declared slot. Renders as a transparent `<div>`'\n + ' with `data-jr-slot=\"<name>\"` and `.jr-slot--<name>`, so parent'\n + ' components (AppChrome / Card slot composition) can pick'\n + ' out a particular region via DOM query, and the default stylesheet'\n + ' orders header above default above footer. Don\\'t use JrSlot directly'\n + ' in an agent-authored spec (the migrator emits it from `namedChildren`'\n + 'hand-rolling it bypasses validation), and don\\'t use JrSlot for'\n + ' visible boundaries (use Box / Card / Section for surfaces; JrSlot'\n + ' is intentionally transparent).'\n + ' Cross-ref: named-child contract → AppChrome / Card; named-slot doc →'\n + ' ',\n },\n },\n actions: {\n fetchWorkspaceData: {\n params: z.object({\n resourceId: z.string(),\n targetStatePath: z.string(),\n }),\n description: 'Fetch data from workspace and write to state path',\n },\n submitFormData: {\n params: z.object({ data: z.record(z.string(), z.unknown()) }),\n description: 'Submit form data to agent via HIL',\n },\n exportReport: {\n params: z.object({ format: z.enum(['pdf', 'html']) }),\n description: 'Export rendered view as HTML or PDF',\n },\n },\n}\n\nexport const catalog = defineCatalog(schema, catalogDef)\n\nexport { computedStyleFunctions }\n\nexport default catalog\n","/**\n * CWRF-013 Phase 0 PR #8 — slot-name normalisation transformer.\n *\n * Item 08 (P0, MEDIUM): the renderer dispatches children positionally;\n * the catalog `slots` declaration is therefore mostly cosmetic in Phase 0\n * (Phase 2 will add real named-slot dispatch via NamedSlotsRenderer).\n * The single concrete divergence pre-PR was `ThemeProvider.slots:\n * ['children']` — a non-standard slot name. Phase 0 narrows the catalog\n * to `['default']` and this transformer normalises legacy specs that\n * placed their slot payload under the wire-shape `props.children` so they\n * roundtrip cleanly to `props.default` (matching every other component\n * that already declared `slots: ['default']`).\n *\n * Rule (general, not ThemeProvider-specific):\n * For every element whose `type` is declared in the catalog with a\n * single-slot declaration containing only `'default'`:\n * if `element.props.children` exists AND `element.props.default`\n * does not exist\n * → rename `props.children` → `props.default` + warn\n *\n * Skips:\n * - Elements whose component type isn't in the catalog (preserves\n * forward-compat with user-injected extensions).\n * - The structural top-level `element.children: string[]` field\n * (that's the cross-element reference list — unrelated to slots).\n * - Components without a declared `slots: ['default']` shape (the\n * transformer is conservative; future renamings live in future PRs).\n *\n * AC coverage:\n * - AC-HONESTY-017 (catalog slots fields name only 'default' or omitted)\n * - AC-HONESTY-018 (legacy `props.children` → `props.default` auto-migrate)\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/08_named_slots_implementation.md\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/00_phase0_implementation_plan.md §1 Item 08\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\nimport { catalogDef } from '../../domain/catalog'\n\nconst TARGET_PROP = 'children'\nconst RENAMED_PROP = 'default'\n\n/** Set of component types whose catalog `slots` is exactly ['default']. */\nconst ELIGIBLE_TYPES: ReadonlySet<string> = (() => {\n const set = new Set<string>()\n const components = catalogDef.components as Record<string, { slots?: readonly string[] }>\n for (const [name, def] of Object.entries(components)) {\n const slots = def.slots\n if (Array.isArray(slots) && slots.length === 1 && slots[0] === RENAMED_PROP) {\n set.add(name)\n }\n }\n return set\n})()\n\nfunction needsRename(el: SpecElementLike | undefined): boolean {\n if (!el || typeof el.type !== 'string') return false\n if (!ELIGIBLE_TYPES.has(el.type)) return false\n const props = el.props\n if (props == null || typeof props !== 'object') return false\n return TARGET_PROP in props && !(RENAMED_PROP in (props as Record<string, unknown>))\n}\n\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return false\n for (const el of Object.values(elements)) {\n if (needsRename(el)) return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n for (const [key, el] of Object.entries(elements)) {\n if (needsRename(el)) affected.push(key)\n }\n return {\n affectedElements: affected,\n description:\n affected.length > 0\n ? `slots: would rename \\`props.children\\` → \\`props.default\\` on ${affected.length} element(s) whose catalog slot is ['default']`\n : 'slots: no changes',\n }\n}\n\nfunction rename(\n key: string,\n el: SpecElementLike,\n ctx: TransformContext,\n): SpecElementLike {\n const props = (el.props ?? {}) as Record<string, unknown>\n const { [TARGET_PROP]: legacy, ...rest } = props\n const nextProps = { ...rest, [RENAMED_PROP]: legacy }\n ctx.warn(\n `Element \"${key}\" (type \"${el.type}\") put its slot payload under \\`props.children\\`. The catalog's slot declaration is ['default'] (CWRF-013 Phase 0 Item 08 normalisation), so the migrator renamed \\`props.children\\` → \\`props.default\\`. See docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/08_named_slots_implementation.md.`,\n { elementKey: key, type: el.type, from: TARGET_PROP, to: RENAMED_PROP },\n )\n return { ...el, props: nextProps }\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n if (!appliesPredicate(spec)) return spec\n\n const nextElements: Record<string, SpecElementLike> = {}\n let mutated = false\n for (const [key, el] of Object.entries(elements)) {\n if (!needsRename(el)) {\n nextElements[key] = el\n continue\n }\n if (ctx.dryRun) {\n // Collect the warning but do not mutate (AC-PROTOCOL-018).\n rename(key, el, ctx)\n nextElements[key] = el\n continue\n }\n nextElements[key] = rename(key, el, ctx)\n mutated = true\n }\n if (!mutated) return spec\n return { ...spec, elements: nextElements }\n}\n\nexport const legacySlotsNormalizeTransformer: SpecTransformer = {\n id: 'legacy.slots.normalize',\n title: 'Slot name normalisation (`props.children` → `props.default`)',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * CWRF-013 Phase 1 PR-P1-#5 — namedChildren → JrSlot synthetic dispatch.\n *\n * Phase 0 PR #8 narrowed the catalog so every slot declaration is `['default']`\n * and the migrator (`legacy.slots.normalize`) renames legacy `props.children`\n * to `props.default`. That covered single-slot containers but did NOT support\n * multi-slot dispatch (header / default / footer) — the upstream renderer\n * still flattens children positionally.\n *\n * Phase 1 PR-P1-#5 introduces named-slot support WITHOUT modifying\n * `@json-render/react` (which we do not own). The trick:\n *\n * 1. Author specs declare slot payloads under a structural top-level\n * `element.namedChildren: { header: [...], default: [...], footer: [...] }`\n * (sibling to `element.children`).\n * 2. This transformer walks the spec, and for every element that has a\n * non-empty `namedChildren` map:\n * a. Synthesises one `JrSlot` element per declared slot, with key\n * `<parentKey>__slot__<slotName>` and `props.name = <slotName>`.\n * Its `children` field is the original slot's child key list.\n * b. Replaces `element.children` with the synthetic slot keys\n * (in canonical order: header → default → footer → others).\n * c. Deletes `element.namedChildren` so the spec roundtrips into\n * the renderer's existing positional contract.\n * 3. `JrSlot` is a transparent wrapper that emits `data-jr-slot=<name>` +\n * `.jr-slot--<name>`. Parent components can pick out a particular slot\n * via DOM query (Phase 3 AppChrome will use this) or rely on the\n * default CSS that orders header above default above footer.\n *\n * Idempotency:\n * Once a spec has been transformed (i.e. `namedChildren` is gone and\n * synthetic JrSlot elements exist), running the transformer again is a\n * no-op — `applies()` returns false, and the LRU cache stays correct.\n *\n * Out-of-scope (Phase 2+):\n * - Truly modifying `@json-render/react` to dispatch named slots natively\n * (long-term plan in 00_protocol/04_spec_migrator.md §4 \"renderer wrap\").\n * - Slot-level state binding (`namedChildren.header.bindings.theme = ...`).\n *\n * AC coverage:\n * - AC-LAYOUT-04 (named-slot rendering)\n * - AC-LAYOUT-05 (slot order — header → default → footer)\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/08_named_slots_implementation.md §2.2\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/01_dependency_upgrade/00_phase1_kickoff_checklist.md §4 PR-P1-#5\n */\n\nimport type {\n SpecElementLike,\n SpecLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from '../types'\n\n/** Canonical slot order. Slots not in this list keep their declaration order. */\nconst PRIMARY_SLOT_ORDER: readonly string[] = ['header', 'default', 'footer']\n\n/** Synthetic key separator. `<parentKey>__slot__<slotName>`. */\nconst SLOT_KEY_SEP = '__slot__'\n\n/** Source field on the parent element. */\nconst NAMED_CHILDREN_FIELD = 'namedChildren'\n\n/** Synthetic component type. Must be registered in catalog + registry. */\nconst SYNTHETIC_TYPE = 'JrSlot'\n\ninterface NamedChildrenMap {\n [slotName: string]: string[]\n}\n\n/**\n * Returns the namedChildren map iff the element has a non-empty one,\n * else undefined.\n */\nfunction readNamedChildren(el: SpecElementLike | undefined): NamedChildrenMap | undefined {\n if (!el) return undefined\n const raw = (el as Record<string, unknown>)[NAMED_CHILDREN_FIELD]\n if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) return undefined\n const map = raw as Record<string, unknown>\n const out: NamedChildrenMap = {}\n let hasAny = false\n for (const [slot, value] of Object.entries(map)) {\n if (!Array.isArray(value)) continue\n const keys = value.filter((k): k is string => typeof k === 'string')\n if (keys.length === 0) continue\n out[slot] = keys\n hasAny = true\n }\n return hasAny ? out : undefined\n}\n\n/** Sort slot names: primary order first, then declaration order for the rest. */\nfunction orderedSlotNames(map: NamedChildrenMap): string[] {\n const declared = Object.keys(map)\n const primary = PRIMARY_SLOT_ORDER.filter((s) => declared.includes(s))\n const rest = declared.filter((s) => !PRIMARY_SLOT_ORDER.includes(s))\n return [...primary, ...rest]\n}\n\nfunction appliesPredicate(spec: SpecLike): boolean {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return false\n for (const el of Object.values(elements)) {\n if (readNamedChildren(el)) return true\n }\n return false\n}\n\nfunction estimate(spec: SpecLike): TransformEstimate {\n const elements = spec.elements ?? {}\n const affected: string[] = []\n let totalSyntheticChildren = 0\n for (const [key, el] of Object.entries(elements)) {\n const named = readNamedChildren(el)\n if (!named) continue\n affected.push(key)\n totalSyntheticChildren += orderedSlotNames(named).length\n }\n return {\n affectedElements: affected,\n description:\n affected.length > 0\n ? `slots: would inflate \\`namedChildren\\` into ${totalSyntheticChildren} synthetic JrSlot element(s) on ${affected.length} parent(s)`\n : 'slots: no named-children dispatch needed',\n }\n}\n\nfunction transform(spec: SpecLike, ctx: TransformContext): SpecLike {\n const elements = spec.elements\n if (!elements || typeof elements !== 'object') return spec\n if (!appliesPredicate(spec)) return spec\n\n const nextElements: Record<string, SpecElementLike> = { ...elements }\n let mutated = false\n\n for (const [parentKey, parentEl] of Object.entries(elements)) {\n const named = readNamedChildren(parentEl)\n if (!named) continue\n\n const slotOrder = orderedSlotNames(named)\n const syntheticKeys: string[] = []\n\n for (const slotName of slotOrder) {\n const slotKey = `${parentKey}${SLOT_KEY_SEP}${slotName}`\n syntheticKeys.push(slotKey)\n\n if (!ctx.dryRun) {\n nextElements[slotKey] = {\n type: SYNTHETIC_TYPE,\n props: { name: slotName },\n children: named[slotName],\n }\n }\n }\n\n ctx.warn(\n `Element \"${parentKey}\" (type \"${parentEl.type ?? '<unknown>'}\") used \\`namedChildren\\` to declare ${slotOrder.length} slot(s) [${slotOrder.join(', ')}]. ` +\n `CWRF-013 Phase 1 PR-P1-#5 inflated them into synthetic JrSlot wrapper elements (keys: ${syntheticKeys.join(', ')}). ` +\n `See docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/08_named_slots_implementation.md §2.2 and ` +\n `docs/proposals/CWRF-013-a2ui-systematic-upgrade/01_dependency_upgrade/00_phase1_kickoff_checklist.md §4 PR-P1-#5.`,\n {\n elementKey: parentKey,\n type: parentEl.type,\n slots: slotOrder,\n synthetic: syntheticKeys,\n },\n )\n\n if (ctx.dryRun) continue\n\n const { [NAMED_CHILDREN_FIELD]: _drop, children: _existingChildren, ...rest } = parentEl as Record<string, unknown>\n void _drop\n void _existingChildren\n nextElements[parentKey] = {\n ...(rest as Record<string, unknown>),\n children: syntheticKeys,\n } as SpecElementLike\n mutated = true\n }\n\n if (!mutated) return spec\n return { ...spec, elements: nextElements }\n}\n\nexport const legacySlotsNamedChildrenTransformer: SpecTransformer = {\n id: 'legacy.slots.named-children',\n title: 'Named-slot dispatch via synthetic JrSlot wrappers',\n applies: appliesPredicate,\n estimate,\n transform,\n}\n","/**\n * CWRF-013 Phase 0 PR #1 — built-in transformer registry.\n *\n * The order of {@link TRANSFORMERS} matters: it defines the order in which\n * transformers run during a single `migrateSpec()` call. Each transformer\n * sees the output of all previous ones.\n *\n * Future PRs (#2-#8) push new transformers to this array WITHOUT rewriting\n * existing entries. Specifically:\n * - PR #2 (StatusBoard) extends `legacy-props` OR adds a sibling\n * `legacyStatusBoardPropsTransformer`.\n * - PR #5 (Viewer alignment) adds variant-narrowing transformers.\n * - PR #7 (AnnotationLayer) extends legacy-props handling.\n *\n * The convention is: \"legacy.<component>.<concern>\" for transformer ids.\n */\n\nimport type { SpecTransformer } from '../types'\nimport { legacyDataTablePropsTransformer } from './legacy-props'\nimport { legacyDataTableSplitToolbarTransformer } from './legacy-datatable-split'\nimport { legacyRiskRegisterSplitTransformer } from './legacy-riskregister-split'\nimport { legacyDashboardLayoutSplitTransformer } from './legacy-dashboardlayout-split'\nimport { legacyStatusBoardPropsTransformer } from './legacy-statusboard-props'\nimport { legacyAnnotationLayerEditModeTransformer } from './legacy-annotationlayer-mode'\nimport { legacySlotsNormalizeTransformer } from './legacy-slots-normalize'\nimport { legacySlotsNamedChildrenTransformer } from './legacy-slots-named-children'\n\n/**\n * Default registry. Mutable by design — future PRs append new transformers.\n * Tests can pass `MigrateOptions.transformers` to override per-call.\n *\n * Order rationale:\n * - `legacy.datatable.phantom-props` (Phase 0) runs FIRST so the spec is\n * normalised against top-level phantom fields before any later phase\n * reads DataTable props.\n * - `legacy.datatable.split-toolbar` (Phase 3 PR-P3-#1) runs RIGHT AFTER\n * phantom-props because Phase 0 explicitly preserved `column.filterable`\n * for Phase 3 to consume; this transformer reads + strips it and\n * inflates ColumnFilter siblings.\n * - `legacy.riskregister.split` (Phase 3 PR-P3-#2) runs after the\n * DataTable transformers and before `legacy.slots.*` — RiskRegister\n * doesn't declare slots, so its position in the pipeline is\n * semantically order-independent, but keeping it before the slot\n * transformers means dry-run output groups Phase 3 splits together.\n * - `legacy.dashboardlayout.split` (Phase 3 PR-P3-#3) runs right after\n * `legacy.riskregister.split` for the same reason — DashboardLayout\n * doesn't declare slots, so its pipeline position is semantically\n * order-independent; grouping all Phase 3 split transformers\n * together keeps dry-run reports coherent. It does, however, MUST\n * run BEFORE `legacy.slots.named-children` so the inflated\n * AppChrome (which declares slots ['default']) gets the named-slot\n * pass against its NEW children layout, not the legacy children\n * that no longer exist after migration.\n * - `legacy.slots.normalize` runs BEFORE `legacy.slots.named-children` so\n * legacy `props.children` is renamed to `props.default` before any\n * named-slot inflation walks the element map.\n */\nexport const TRANSFORMERS: SpecTransformer[] = [\n legacyDataTablePropsTransformer,\n legacyDataTableSplitToolbarTransformer,\n legacyRiskRegisterSplitTransformer,\n legacyDashboardLayoutSplitTransformer,\n legacyStatusBoardPropsTransformer,\n legacyAnnotationLayerEditModeTransformer,\n legacySlotsNormalizeTransformer,\n legacySlotsNamedChildrenTransformer,\n]\n\nexport { legacyDataTablePropsTransformer }\nexport { legacyDataTableSplitToolbarTransformer }\nexport { legacyRiskRegisterSplitTransformer }\nexport { legacyDashboardLayoutSplitTransformer }\nexport { legacyStatusBoardPropsTransformer }\nexport { legacyAnnotationLayerEditModeTransformer }\nexport { legacySlotsNormalizeTransformer }\nexport { legacySlotsNamedChildrenTransformer }\n","/**\n * CWRF-013 Phase 0 PR #1 — spec migrator main entrypoint.\n *\n * Public API:\n * - {@link migrateSpec} — pure, sync, no caching. Use in tests + callers\n * who already cache themselves.\n * - {@link migrateSpecCached} — same surface, plus LRU cache + dedupe of\n * console.warn output. Call this from the\n * JsonRender entry (`prepareSpec.ts`).\n * - {@link clearMigratorCache} — re-export from `./cache`. Test/debug only.\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/00_protocol/04_spec_migrator.md\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/00_phase0_implementation_plan.md §1.4\n *\n * AC coverage: AC-PROTOCOL-017/018/019/020/021.\n */\n\nimport { withCache } from './cache'\nimport {\n flushDryRunReport,\n flushWarnings,\n resolveDefaultDryRun,\n} from './dry-run'\nimport type {\n MigrateOptions,\n MigrateResult,\n MigrateWarning,\n SpecLike,\n SpecTransformer,\n TransformContext,\n} from './types'\nimport { TRANSFORMERS } from './transforms'\n\nexport type {\n MigrateOptions,\n MigrateResult,\n MigrateWarning,\n SpecLike,\n SpecElementLike,\n SpecTransformer,\n TransformContext,\n TransformEstimate,\n} from './types'\nexport {\n TRANSFORMERS,\n legacyDataTablePropsTransformer,\n legacyDataTableSplitToolbarTransformer,\n legacyRiskRegisterSplitTransformer,\n legacyDashboardLayoutSplitTransformer,\n legacyStatusBoardPropsTransformer,\n legacyAnnotationLayerEditModeTransformer,\n legacySlotsNormalizeTransformer,\n} from './transforms'\nexport { clearMigratorCache, hashSpec } from './cache'\nexport { clearWarningHistory, resolveDefaultDryRun } from './dry-run'\n\n/**\n * Type guard: a value is \"spec-like\" if it's a non-null object with at\n * least one of the known top-level fields. Anything else is returned as-is\n * to callers, mirroring `prepareJsonRenderSpec`'s tolerant contract\n * (scalars / null pass through untouched).\n */\nfunction isSpecLike(value: unknown): value is SpecLike {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) return false\n return true\n}\n\n/**\n * Pure migration. Runs each transformer in registry order, isolating any\n * thrown errors so a misbehaving transformer cannot break the whole render\n * (AC-PROTOCOL-020).\n *\n * The input `spec` is never mutated. If no transformer applies, the same\n * reference is returned (helps React equality checks).\n */\nexport function migrateSpec(\n spec: SpecLike,\n options?: MigrateOptions,\n): MigrateResult {\n const dryRun = options?.dryRun ?? resolveDefaultDryRun()\n const disabled = new Set(options?.disabled ?? [])\n const registry: readonly SpecTransformer[] =\n options?.transformers ?? TRANSFORMERS\n const warnings: MigrateWarning[] = []\n const applied: string[] = []\n\n let current: SpecLike = spec\n\n for (const t of registry) {\n if (disabled.has(t.id)) continue\n\n let shouldRun: boolean\n try {\n shouldRun = t.applies(current)\n } catch (err) {\n warnings.push({\n transformerId: t.id,\n message: `applies() threw; transformer skipped. ${stringifyError(err)}`,\n })\n continue\n }\n if (!shouldRun) continue\n\n if (dryRun) {\n // Run estimate (cheap, must not mutate) and synthesize a dry-run note.\n try {\n const est = t.estimate?.(current)\n if (est) {\n warnings.push({\n transformerId: t.id,\n message: `${est.description} (would touch ${est.affectedElements.length} element(s): [${est.affectedElements.join(', ')}])`,\n })\n } else {\n warnings.push({\n transformerId: t.id,\n message: `would apply (no estimate provided)`,\n })\n }\n } catch (err) {\n warnings.push({\n transformerId: t.id,\n message: `estimate() threw. ${stringifyError(err)}`,\n })\n }\n\n // Also run transform() in dry-run to collect *real* warnings (not just\n // estimates), but discard the returned spec to honour AC-PROTOCOL-018.\n const ctx: TransformContext = {\n dryRun: true,\n warn: (message, meta) =>\n warnings.push({ transformerId: t.id, message, meta }),\n }\n try {\n t.transform(current, ctx)\n } catch (err) {\n warnings.push({\n transformerId: t.id,\n message: `transform() threw in dry-run. ${stringifyError(err)}`,\n })\n }\n continue\n }\n\n // Real run.\n const ctx: TransformContext = {\n dryRun: false,\n warn: (message, meta) =>\n warnings.push({ transformerId: t.id, message, meta }),\n }\n try {\n const next = t.transform(current, ctx)\n if (next !== current) {\n current = next\n applied.push(t.id)\n }\n } catch (err) {\n warnings.push({\n transformerId: t.id,\n message: `transform() threw; transformer skipped. ${stringifyError(err)}`,\n })\n // continue to next transformer — error isolation requirement.\n }\n }\n\n return {\n spec: dryRun ? spec : current,\n applied,\n warnings,\n }\n}\n\nconst cachedMigrate = withCache((spec, options) => migrateSpec(spec, options))\n\n/**\n * Cached + dedupe-warned migrator. This is the function the JsonRender\n * entry calls.\n *\n * Behaviours layered on top of {@link migrateSpec}:\n * 1. LRU caches the {@link MigrateResult} keyed by spec content + options.\n * 2. Aggregated `console.warn` flushed once per unique (transformerId, msg)\n * tuple — preventing flood across re-renders of the same spec.\n * 3. In dry-run mode, the dry-run report is always emitted (no dedupe).\n *\n * Returns the migrated spec ref so callers can chain it into `prepareJsonRenderSpec`.\n */\nexport function migrateSpecCached(\n spec: unknown,\n options?: MigrateOptions,\n): SpecLike {\n if (!isSpecLike(spec)) {\n return spec as SpecLike\n }\n const result = cachedMigrate(spec, options)\n // Only flush warnings on a cache MISS: if `fromCache === true`, an earlier\n // run already flushed (or chose to dedupe via flushed-set), so we stay quiet.\n if (!result.fromCache) {\n if (options?.dryRun ?? resolveDefaultDryRun()) {\n flushDryRunReport(result.warnings)\n } else {\n flushWarnings(result.warnings)\n }\n }\n return result.spec\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof Error) return err.message\n try {\n return String(err)\n } catch {\n return '<unstringifiable error>'\n }\n}\n","/**\n * prepareJsonRenderSpec — 把\"老格式\"的 GenUI spec 标准化到 @json-render 当前\n * 预期的形态。\n *\n * 历史背景:\n * 后端较早期吐出的 spec 用了两种与 @json-render 当前规范不一致的写法,\n * share viewer / 任何离线消费方都需要在喂给 Renderer 之前做一次翻译,\n * 否则要么报 schema 错,要么模板插值不生效。之前这套翻译只散落在 demo\n * 的 ``share-app.tsx`` 里,每个嵌入方都要复制一份;现在收回 SDK 作为\n * 公共工具。\n *\n * 处理项:\n * 1. ``{$cond: [c, t, e]}`` →\n * ``{$cond: c, $then: t, $else: e?}``\n * 2. ``{$state|$item|$index, op, value}`` (op ∈ eq/neq/gt/gte/lt/lte)→\n * ``{$state|$item|$index, [op]: value}``\n * 3. ``$template`` 字符串里的占位翻译(沿用早期 share viewer 的行为):\n * - ``{{/state/x}}`` → ``${/x}`` (剥掉 ``/state/`` 前缀,因为新版\n * ``$template`` 解析器自身的 root 就是 state,再带 ``/state/`` 会\n * 双层路径)\n * - ``{{x}}`` 或 ``{{user/age}}`` → ``${/x}`` / ``${/user/age}``\n * (相对路径自动补 ``/`` 前缀变绝对路径)\n * - ``{{/x}}`` → ``${/x}`` (已是绝对路径,原样保留)\n * 4. CWRF-013 Phase 0 spec migrator (``./migrator``) — strip protocol-lie\n * fields (Item 01 DataTable filterable/groupBy/expandable) before the\n * renderer sees them, with LRU caching + warning de-dup so repeat\n * renders of the same spec are silent. See\n * ``docs/proposals/CWRF-013-a2ui-systematic-upgrade/00_protocol/04_spec_migrator.md``.\n *\n * 输入会原样深拷贝,不修改入参。无法识别的结构原样保留。\n */\n\nimport { migrateSpecCached } from './migrator'\n\nconst VALID_OPS = new Set(['eq', 'neq', 'gt', 'gte', 'lt', 'lte'])\n\nfunction normalizeExpressions(obj: unknown): unknown {\n if (obj == null || typeof obj !== 'object') return obj\n if (Array.isArray(obj)) return obj.map(normalizeExpressions)\n\n const rec = obj as Record<string, unknown>\n\n // 1. 数组形式的 $cond → 三段式\n if ('$cond' in rec) {\n const cond = rec.$cond\n if (Array.isArray(cond) && cond.length >= 2) {\n return {\n $cond: normalizeExpressions(cond[0]),\n $then: normalizeExpressions(cond[1]),\n ...(cond.length > 2 ? { $else: normalizeExpressions(cond[2]) } : {}),\n }\n }\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(rec)) out[k] = normalizeExpressions(v)\n return out\n }\n\n // 2. {$state|$item|$index, op:'eq'|..., value:X} → {$state|..., [op]: X}\n if (\n ('$state' in rec || '$item' in rec || '$index' in rec) &&\n 'op' in rec && typeof rec.op === 'string' && VALID_OPS.has(rec.op) && 'value' in rec\n ) {\n const { op, value, ...rest } = rec\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(rest)) out[k] = normalizeExpressions(v)\n out[op as string] = normalizeExpressions(value)\n return out\n }\n\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(rec)) out[k] = normalizeExpressions(v)\n return out\n}\n\nfunction normalizeTemplates(obj: unknown): unknown {\n if (obj == null || typeof obj !== 'object') return obj\n if (Array.isArray(obj)) return obj.map(normalizeTemplates)\n\n const record = obj as Record<string, unknown>\n if ('$template' in record && typeof record.$template === 'string') {\n const fixed = record.$template\n .replace(/\\{\\{\\/state\\/(.*?)\\}\\}/g, (_: string, p: string) => `\\${/${p}}`)\n .replace(/\\{\\{(.*?)\\}\\}/g, (_: string, p: string) => `\\${${p.startsWith('/') ? p : '/' + p}}`)\n return { ...record, $template: fixed }\n }\n\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(record)) out[k] = normalizeTemplates(v)\n return out\n}\n\n/**\n * 接受任意 spec 形态(含老格式),返回标准化后的可直接喂给 ``@json-render``\n * Renderer / SDK ``<JsonRenderStandalone>`` 的对象。\n *\n * 不处理 ``null`` / 非对象 —— 原样返回,方便链式调用。\n *\n * Pipeline order:\n * 1. CWRF-013 spec migrator (Phase 0) — strip protocol-lie fields with\n * cached + dedupe-warned ``migrateSpecCached``. Runs FIRST so later\n * template / expression normalisation only sees honest specs.\n * Idempotent: same spec on second render hits the LRU cache and\n * emits no extra console.warn (see ``./migrator/dry-run.ts``).\n * 2. Expression normalisation (``$cond`` array → triplet, ``op``/``value``\n * → key-shorthand).\n * 3. Template rewriting (``{{...}}`` → ``${/...}``).\n */\nexport function prepareJsonRenderSpec<T = Record<string, unknown>>(raw: unknown): T {\n const migrated = migrateSpecCached(raw)\n return normalizeTemplates(normalizeExpressions(migrated)) as T\n}\n","/**\n * JETP-033: Domain component registry — maps catalog names to React implementations.\n */\n\nimport React, { Suspense, lazy } from 'react'\nimport { defineRegistry } from '@json-render/react'\nimport { shadcnComponents } from '@json-render/shadcn'\nimport { catalog } from './catalog.js'\nimport { injectMotionFocusTokens } from './motionFocusTokens.js'\n\n// CWRF-013 Phase 4 (UI Polish) · P1-T02 — boot-time design token injection.\n// Single source of truth for motion / focus / press / status CSS variables\n// consumed by all 41 domain SHEETs. injectMotionFocusTokens() is idempotent\n// (style id `jr-design-tokens-motion-focus`) and SSR-safe (no-op when\n// `document` is undefined). See 05_ui_polish/01_design_tokens/01_motion_focus_tokens.md §2.3.\ninjectMotionFocusTokens()\nimport { ThemeProvider } from './ThemeProvider.js'\nimport { AppChrome } from './AppChrome.js'\nimport { SideNav } from './SideNav.js'\nimport { SectionRouter } from './SectionRouter.js'\nimport { KPICard } from './KPICard.js'\nimport { KPICluster } from './KPICluster.js'\nimport { DataTable } from './DataTable.js'\nimport { TableToolbar } from './TableToolbar.js'\nimport { ColumnFilter } from './ColumnFilter.js'\nimport { RowGroup } from './RowGroup.js'\nimport { BudgetBar } from './BudgetBar.js'\nimport { ChecklistCard } from './ChecklistCard.js'\nimport { Chart } from './Chart.js'\nimport { TraceMatrix } from './TraceMatrix.js'\nimport { RiskList } from './RiskList.js'\nimport { RiskHeatMatrix } from './RiskHeatMatrix.js'\nimport { EvidenceChain } from './EvidenceChain.js'\nimport { AssumptionRegister } from './AssumptionRegister.js'\nimport { GanttChart } from './GanttChart.js'\nimport { SandboxPlayer } from './SandboxPlayer.js'\nimport { ComparisonMatrix } from './ComparisonMatrix.js'\nimport { Timeline } from './Timeline.js'\nimport { HierarchyTree } from './HierarchyTree.js'\nimport { WaterfallChart } from './WaterfallChart.js'\nimport { StatusBoard } from './StatusBoard.js'\nimport { DecisionPanel } from './DecisionPanel.js'\nimport { Heatmap } from './Heatmap.js'\nimport { FormSection } from './FormSection.js'\nimport { Timer } from './Timer.js'\nimport { CodeViewer } from './CodeViewer.js'\nimport { ConfirmDialogJSON } from './primitives/ConfirmDialog.js'\nimport { AnnotationLayer } from './AnnotationLayer.js'\nimport { TextViewer } from './TextViewer.js'\nimport { CodeFileViewer } from './CodeFileViewer.js'\nimport { MarkdownViewer } from './MarkdownViewer.js'\nimport { JsonViewer } from './JsonViewer.js'\nimport { ImageViewer } from './ImageViewer.js'\nimport { VideoPlayer } from './VideoPlayer.js'\nimport { AudioPlayer } from './AudioPlayer.js'\nimport { HtmlViewer } from './HtmlViewer.js'\nimport { JrSlot } from './JrSlot.js'\nimport {\n Box,\n Row,\n Spacer,\n Section,\n Stepper,\n FormField,\n} from './layout/index.js'\n\nfunction lazyWrap(factory: () => Promise<{ default: React.ComponentType<any> }>) {\n const LazyComp = lazy(factory)\n return (props: any) =>\n React.createElement(Suspense, { fallback: React.createElement('div', { style: { padding: '1rem', color: '#64748b' } }, 'Loading viewer…') },\n React.createElement(LazyComp, props)\n )\n}\n\nconst PdfViewer = lazyWrap(() => import('./PdfViewer.js'))\nconst KicadViewer = lazyWrap(() => import('./KicadViewer.js'))\nconst GerberViewer = lazyWrap(() => import('./GerberViewerA2UI.js'))\nconst WordViewer = lazyWrap(() => import('./WordViewer.js'))\nconst ExcelViewer = lazyWrap(() => import('./ExcelViewer.js'))\nconst PowerPointViewer = lazyWrap(() => import('./PowerPointViewer.js'))\n\nexport const { registry } = defineRegistry(catalog, {\n components: {\n ThemeProvider: ThemeProvider as never,\n KPICard: KPICard as never,\n // CWRF-013 Phase 4 P3-T07 (Tier 3-2) — KPICluster container.\n // Canonical home for 2-4 horizontally-arranged KPIs. See catalog entry\n // RESPONSIVE / variant='strip' contract for review-card scenarios.\n KPICluster: KPICluster as never,\n DataTable: DataTable as never,\n BudgetBar: BudgetBar as never,\n ChecklistCard: ChecklistCard as never,\n Chart: Chart as never,\n TraceMatrix: TraceMatrix as never,\n EvidenceChain: EvidenceChain as never,\n AssumptionRegister: AssumptionRegister as never,\n GanttChart: GanttChart as never,\n SandboxPlayer: SandboxPlayer as never,\n ComparisonMatrix: ComparisonMatrix as never,\n Timeline: Timeline as never,\n HierarchyTree: HierarchyTree as never,\n WaterfallChart: WaterfallChart as never,\n StatusBoard: StatusBoard as never,\n DecisionPanel: DecisionPanel as never,\n Heatmap: Heatmap as never,\n FormSection: FormSection as never,\n Timer: Timer as never,\n // CWRF-013 Phase 4 P2-T14d (slice F) — ConfirmDialog primitive\n // registry binding. The JSON-spec adapter (ConfirmDialogJSON)\n // unwraps `props.{trigger,title,...}` and resolves `onConfirm`\n // string action names through `useActions()` so LLM-generated\n // specs can wire decision-friction dialogs without host glue.\n ConfirmDialog: ConfirmDialogJSON as never,\n CodeViewer: CodeViewer as never,\n AnnotationLayer: AnnotationLayer as never,\n TextViewer: TextViewer as never,\n CodeFileViewer: CodeFileViewer as never,\n MarkdownViewer: MarkdownViewer as never,\n JsonViewer: JsonViewer as never,\n ImageViewer: ImageViewer as never,\n VideoPlayer: VideoPlayer as never,\n AudioPlayer: AudioPlayer as never,\n HtmlViewer: HtmlViewer as never,\n PdfViewer: PdfViewer as never,\n KicadViewer: KicadViewer as never,\n GerberViewer: GerberViewer as never,\n WordViewer: WordViewer as never,\n ExcelViewer: ExcelViewer as never,\n PowerPointViewer: PowerPointViewer as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 1 (Tier 1.3.b) — shadcn 第 1 批 layout / structure 接线 (12)\n // Runtime impls live in `@json-render/shadcn`; per\n // `00_protocol/02_component_registration_pattern.md` v1.1 §2.7 they MUST go\n // through `defineRegistry()` so the adapter unwraps `element.props` →\n // `BaseComponentProps<...>`. Direct `Record<string, ComponentFn>` would\n // silent-fail with misleading errors (see Phase 0 retrospective §6.7).\n // -------------------------------------------------------------------------\n Card: shadcnComponents.Card as never,\n Stack: shadcnComponents.Stack as never,\n Grid: shadcnComponents.Grid as never,\n Separator: shadcnComponents.Separator as never,\n Tabs: shadcnComponents.Tabs as never,\n Accordion: shadcnComponents.Accordion as never,\n Collapsible: shadcnComponents.Collapsible as never,\n Carousel: shadcnComponents.Carousel as never,\n Table: shadcnComponents.Table as never,\n Image: shadcnComponents.Image as never,\n Skeleton: shadcnComponents.Skeleton as never,\n Avatar: shadcnComponents.Avatar as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 1 (Tier 1.3.b) — shadcn 第 2 批 form/interaction 接线 (12)\n // Same defineRegistry adapter pattern as batch 1 (see 00_protocol/02 §2.7).\n // 7 form fields + 2 navigation + 3 menu/toggle controls = 12.\n // -------------------------------------------------------------------------\n Input: shadcnComponents.Input as never,\n Textarea: shadcnComponents.Textarea as never,\n Select: shadcnComponents.Select as never,\n Checkbox: shadcnComponents.Checkbox as never,\n Radio: shadcnComponents.Radio as never,\n Switch: shadcnComponents.Switch as never,\n Slider: shadcnComponents.Slider as never,\n Button: shadcnComponents.Button as never,\n Link: shadcnComponents.Link as never,\n DropdownMenu: shadcnComponents.DropdownMenu as never,\n Toggle: shadcnComponents.Toggle as never,\n ToggleGroup: shadcnComponents.ToggleGroup as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 1 (Tier 1.3.b) — shadcn 第 3 批 feedback / overlay / display\n // 接线 (12). Same defineRegistry adapter pattern as batches 1 & 2.\n // 2 overlays + 2 typography + 2 inline feedback + 2 status + 2 popovers\n // + 2 navigation controls = 12. After this batch the catalog covers\n // all 36 shadcn primitives (38 Phase 0 domain + 36 shadcn = 74 entries).\n // -------------------------------------------------------------------------\n Dialog: shadcnComponents.Dialog as never,\n Drawer: shadcnComponents.Drawer as never,\n Heading: shadcnComponents.Heading as never,\n Text: shadcnComponents.Text as never,\n Badge: shadcnComponents.Badge as never,\n Alert: shadcnComponents.Alert as never,\n Progress: shadcnComponents.Progress as never,\n Spinner: shadcnComponents.Spinner as never,\n Tooltip: shadcnComponents.Tooltip as never,\n Popover: shadcnComponents.Popover as never,\n ButtonGroup: shadcnComponents.ButtonGroup as never,\n Pagination: shadcnComponents.Pagination as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 2 PR-P2-#1 (Tier 2-1) — 6 layout primitives.\n // chat-widget-domain layout atoms (NOT shadcn). Implementations live in\n // `domain/layout/*.tsx`; CSS variables in `domain/layout/layout-tokens.css`.\n // All sizing values come from YCW token enums — Zod schemas in catalog.ts\n // reject raw pixel values. Per `00_protocol/02_component_registration_pattern.md`\n // §2.7 they go through `defineRegistry()` so the adapter unwraps\n // `element.props` → `BaseComponentProps<...>` (same pattern as 36 shadcn\n // entries above). See 03_layout_primitives/02_layout_primitive_design.md.\n // -------------------------------------------------------------------------\n Box: Box as never,\n Row: Row as never,\n Spacer: Spacer as never,\n Section: Section as never,\n Stepper: Stepper as never,\n FormField: FormField as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#1 (Split C · DataTable modular) — sibling\n // components that compose with DataTable. Same defineRegistry adapter\n // pattern as 36 shadcn + 6 layout primitives.\n // - TableToolbar: title + search + action buttons (writes filterPath)\n // - ColumnFilter: dropdown filter for a single column (writes filterPath)\n // - RowGroup: groupBy + aggregations wrapper around DataTable\n // See 04_overdesign_refactor/03_data_table_modular.md §2.2-2.4 +\n // 04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #1/#3.\n // -------------------------------------------------------------------------\n TableToolbar: TableToolbar as never,\n ColumnFilter: ColumnFilter as never,\n RowGroup: RowGroup as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#2 (Split D · RiskRegister 拆解) — siblings that\n // together replace the legacy RiskRegister(mode=…) component.\n // `legacy.riskregister.split` transformer ships in D-03; RiskRegister\n // source + catalog entry + registry binding are deleted in D-04.\n // - RiskList: linear list view, severity / likelihood / status badges.\n // - RiskHeatMatrix: 4×4 severity × likelihood heat grid.\n // See 04_overdesign_refactor/04_risk_register_split.md §2.1 + §2.2 +\n // decision #4 (delete-old + transformer-only) in 06_phase3_kickoff_checklist.md.\n // -------------------------------------------------------------------------\n RiskList: RiskList as never,\n RiskHeatMatrix: RiskHeatMatrix as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) — siblings\n // that together REPLACED the legacy 520-LOC DashboardLayout shell.\n // History inside this PR-P3-#3 (now COMPLETE):\n // - A-01 (a864cfb): AppChrome (top bar)\n // - A-02 (df72baf): SideNav (left rail)\n // - A-03 (c2e883f): SectionRouter (state-driven section switch)\n // - A-04 (8a84406): normalize helpers (pure)\n // - A-05 (fff832f): legacy.dashboardlayout.split transformer\n // - A-06 (this commit): DashboardLayout source + catalog entry +\n // registry override DELETED; only the trio\n // above remains. Legacy specs go through the\n // migrator (`legacy.dashboardlayout.split`).\n // - A-07: end-to-end integration + visual baseline.\n // -------------------------------------------------------------------------\n AppChrome: AppChrome as never,\n SideNav: SideNav as never,\n SectionRouter: SectionRouter as never,\n\n // -------------------------------------------------------------------------\n // CWRF-013 Phase 1 PR-P1-#5 — synthetic named-slot wrapper.\n // Authored by the migrator (`legacy.slots.named-children`), not by Agents.\n // Catalog registers it so the 74 → 75 → 81 parity invariant holds\n // (Phase 1 added JrSlot; Phase 2 added 6 layout primitives).\n // -------------------------------------------------------------------------\n JrSlot: JrSlot as never,\n },\n actions: {\n fetchWorkspaceData: async (_params: Record<string, unknown>) => {},\n submitFormData: async (_params: Record<string, unknown>) => {},\n exportReport: async (_params: Record<string, unknown>) => {},\n },\n} as never)\n\n// CWRF-013 Phase 3 PR-P3-#3 commit 6/N (A-06): the manual element-aware\n// override for legacy DashboardLayout has been removed alongside the\n// source file. AppChrome / SideNav / SectionRouter use the standard\n// defineRegistry adapter — they don't need `element.children` plumbing\n// because section mapping is state-driven via SectionRouter.activeIdPath\n// rather than positional via element.children. Legacy specs are\n// auto-migrated by `legacy.dashboardlayout.split` (commit fff832f).\n\nexport default registry\n","/**\n * CWRF-013 Phase 4 (UI Polish) — Motion / Focus / Press / Reduced-motion / Status design tokens.\n *\n * Single source of truth for every `*.jr-*` SHEET inside `src/components/JsonRender/domain/`.\n * Injected page-level into <head> via {@link injectStyles} at registry boot.\n *\n * Token families (in order, mirroring the SHEET below):\n * - Motion duration: --jr-transition-{fast,base,slow}\n * - Easing curves: --jr-easing-{standard,emphasize,decel}\n * - Focus ring: --jr-focus-ring-{width,offset,color,style}\n * - Press feedback: --jr-press-{translate,scale,opacity}\n * - Status semantic: --jr-{success,warning,danger,info}{,-on,-surface,-border}\n * + --jr-on-{success,warning}-dark (WCAG small-text variants)\n * + --jr-destructive / --jr-on-destructive (aliases of --jr-danger)\n * - prefers-reduced-motion guard → durations → 0.01ms\n * - forced-colors:active → status base colors map to CanvasText / Mark / LinkText\n *\n * Public mixins (apply via className):\n * .jr-pressable — universal :active feedback (translate + brightness)\n * .jr-focusable — universal :focus-visible ring (outline-based, WCAG AA)\n * .jr-focusable-input — ring-pattern :focus-visible for form fields\n * (border-color shift + box-shadow halo) — chosen\n * because rounded inputs/selects/textarea look detached\n * when wrapped in an outset outline.\n * .jr-focusable--inset — inset variant of .jr-focusable for tight grids\n * (Heatmap cells, TraceMatrix cells) where an outset\n * ring would be clipped by the next cell.\n *\n * Spec:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/01_design_tokens/01_motion_focus_tokens.md\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/01_design_tokens/02_status_tokens.md\n *\n * AC coverage:\n * AC-TOK-001 / 002 / 003 / 004 ; AC-STK-001 / 003 / 004 / 005.\n *\n * SDK Architecture compliance:\n * F3 (style scoping): emitted at :root + .jr-* selectors. Page-level token injection is\n * deliberate per spec — domain components are NOT inside the `.ycw-shadcn` Shadow scope.\n * ThemeProvider may override any `--jr-*` via cascade without touching this module.\n *\n * @module motionFocusTokens\n */\n\nimport { injectStyles } from './injectStyles'\n\n/**\n * Stable DOM id for the injected <style> element. Kept in sync with spec L68.\n * Exposed so that registry boot wiring, tests, and visual regressions can probe it.\n */\nexport const MOTION_FOCUS_STYLE_ID = 'jr-design-tokens-motion-focus'\n\n/**\n * The full CSS payload. Exported as a const string so unit tests can assert on its\n * contract WITHOUT needing JSDOM to resolve color-mix() / @media (forced-colors).\n *\n * Source-text contract assertions:\n * - All 8 motion/focus base tokens declared in :root\n * - All 16 status tokens (4 layers × 4 statuses) declared in :root\n * - 2 universal mixins (.jr-pressable / .jr-focusable)\n * - 2 @media guards (prefers-reduced-motion / forced-colors)\n */\nexport const MOTION_FOCUS_SHEET = `\n:root {\n /* === Motion duration === */\n --jr-transition-fast: 0.15s;\n --jr-transition-base: 0.2s;\n --jr-transition-slow: 0.3s;\n\n /* === Easing === */\n --jr-easing-standard: cubic-bezier(0.4, 0, 0.2, 1);\n --jr-easing-emphasize: cubic-bezier(0.2, 0, 0, 1);\n --jr-easing-decel: cubic-bezier(0, 0, 0.2, 1);\n\n /* === Focus ring === */\n --jr-focus-ring-width: 2px;\n --jr-focus-ring-offset: 2px;\n --jr-focus-ring-color: var(--jr-primary, #3b82f6);\n --jr-focus-ring-style: solid;\n\n /* === Press feedback === */\n --jr-press-translate: 0px 1px;\n --jr-press-scale: 0.98;\n --jr-press-opacity: 0.92;\n\n /* === CWRF-013 Phase 4 切片 G L1 — Adaptive container breakpoints ===\n Container-query-based breakpoints (NOT viewport-based at-media).\n chat-widget is an embedded SDK; the message bubble may be 280-720px\n even when the host viewport is 1920px wide. Domain component SHEETs\n use at-container jr-card with these breakpoints to respond to the\n actual rendered container width. The host theme may override these\n values to tune density (e.g. brand wants md = 520px). */\n --jr-bp-sm: 320px;\n --jr-bp-md: 480px;\n --jr-bp-lg: 768px;\n\n /* === Status: success (positive, confirmed, healthy) === */\n --jr-success: #16a34a;\n --jr-on-success: #ffffff;\n --jr-on-success-dark: #052e16;\n --jr-success-surface: color-mix(in srgb, #16a34a 12%, var(--jr-surface, #ffffff));\n --jr-success-border: color-mix(in srgb, #16a34a 60%, transparent);\n\n /* === Status: warning (caution, attention, needs review) === */\n --jr-warning: #d97706;\n --jr-on-warning: #ffffff;\n --jr-on-warning-dark: #78350f;\n --jr-warning-surface: color-mix(in srgb, #d97706 12%, var(--jr-surface, #ffffff));\n --jr-warning-border: color-mix(in srgb, #d97706 60%, transparent);\n\n /* === Status: danger (destructive, blocked, error) === */\n --jr-danger: #dc2626;\n --jr-on-danger: #ffffff;\n --jr-danger-surface: color-mix(in srgb, #dc2626 10%, var(--jr-surface, #ffffff));\n --jr-danger-border: color-mix(in srgb, #dc2626 60%, transparent);\n --jr-destructive: var(--jr-danger);\n --jr-on-destructive: var(--jr-on-danger);\n\n /* === Status: info (neutral notification, hint) === */\n --jr-info: #0284c7;\n --jr-on-info: #ffffff;\n --jr-info-surface: color-mix(in srgb, #0284c7 10%, var(--jr-surface, #ffffff));\n --jr-info-border: color-mix(in srgb, #0284c7 60%, transparent);\n}\n\n/* === Universal :active mixin === */\n.jr-pressable:active:not(:disabled):not([aria-disabled=\"true\"]) {\n transform: translate(var(--jr-press-translate));\n filter: brightness(0.96);\n}\n\n/* === Universal :focus-visible mixin === */\n.jr-focusable:focus-visible {\n outline: var(--jr-focus-ring-width) var(--jr-focus-ring-style) var(--jr-focus-ring-color);\n outline-offset: var(--jr-focus-ring-offset);\n}\n\n/* === CWRF-013 Phase 5 Tier 5-2 — Form-field :focus-visible mixin ===\n * Ring pattern (border-color + box-shadow halo) instead of an outset outline,\n * because rounded inputs/selects/textarea otherwise look visually detached\n * from the form field. Wired entirely through --jr-focus-ring-* tokens so\n * the host theme can recolor + retune width without touching CSS strings. */\n.jr-focusable-input:focus-visible {\n outline: none;\n border-color: var(--jr-focus-ring-color);\n box-shadow: 0 0 0 var(--jr-focus-ring-width)\n color-mix(in srgb, var(--jr-focus-ring-color) 22%, transparent);\n}\n\n/* === CWRF-013 Phase 5 Tier 5-2 — Inset :focus-visible mixin ===\n * For tight grids (Heatmap cells, TraceMatrix cells) where an outset ring\n * would be clipped by neighboring cells. Uses negative outline-offset so\n * the ring is drawn inside the cell, and lifts via z-index so the ring\n * is not painted under adjacent cells. */\n.jr-focusable--inset:focus-visible {\n outline: var(--jr-focus-ring-width) var(--jr-focus-ring-style) var(--jr-focus-ring-color);\n outline-offset: calc(-1 * var(--jr-focus-ring-width));\n /* z-index lifts the focused cell above its neighbors so the inset ring\n * paints in full; z-index requires a positioning context, hence position: relative. */\n position: relative;\n z-index: 4;\n}\n\n/* === Reduced-motion guard — wraps every animation/transition globally === */\n@media (prefers-reduced-motion: reduce) {\n :root {\n --jr-transition-fast: 0.01ms;\n --jr-transition-base: 0.01ms;\n --jr-transition-slow: 0.01ms;\n }\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n}\n\n/* === High contrast / forced-colors fallback (Windows High Contrast mode) === */\n@media (forced-colors: active) {\n :root {\n --jr-success: CanvasText;\n --jr-warning: CanvasText;\n --jr-danger: Mark;\n --jr-info: LinkText;\n --jr-on-success: Canvas;\n --jr-on-warning: Canvas;\n --jr-on-danger: Canvas;\n --jr-on-info: Canvas;\n }\n /* CWRF-013 Phase 5 Tier 5-2: box-shadow does not paint in forced-colors\n * mode (per spec), so .jr-focusable-input would lose its visible focus\n * indicator. Restore a system-color outline so the ring stays WCAG-compliant. */\n .jr-focusable-input:focus-visible {\n outline: var(--jr-focus-ring-width) var(--jr-focus-ring-style) Highlight;\n outline-offset: var(--jr-focus-ring-offset);\n }\n .jr-focusable:focus-visible,\n .jr-focusable--inset:focus-visible {\n outline-color: Highlight;\n }\n}\n`\n\n/**\n * Inject the motion / focus / press / status token sheet into <head>.\n *\n * Idempotent: re-calling updates textContent but keeps a single <style> node.\n * Safe in SSR (no-ops when `document` is undefined).\n *\n * @see MOTION_FOCUS_STYLE_ID\n * @see MOTION_FOCUS_SHEET\n */\nexport function injectMotionFocusTokens(): void {\n injectStyles(MOTION_FOCUS_STYLE_ID, MOTION_FOCUS_SHEET)\n}\n","/**\n * JETP-033: ThemeProvider — CSS variable injection for 4-layer dynamic styling.\n *\n * Layer 1: Chat-widget host theme (inherited CSS vars from parent)\n * Layer 2: ThemeProvider injects --jr-* CSS custom properties from spec state\n * Layer 3: $computed style functions resolve data-driven classes\n * Layer 4: Raw className passthrough (Tailwind JIT)\n */\n\nimport React from 'react'\n\ninterface ThemeProps {\n primary?: string\n bg?: string\n surface?: string\n text?: string\n textMuted?: string\n success?: string\n warning?: string\n danger?: string\n // CWRF-013 Phase 4 (UI Polish) · P1-T10 — added so all 4 status semantic\n // tokens emitted by motionFocusTokens.ts (success/warning/danger/info) can\n // be host-overridden symmetrically. See spec\n // 05_ui_polish/01_design_tokens/02_status_tokens.md §2.3.\n info?: string\n font?: string\n fontMono?: string\n fontSize?: string\n radius?: string\n spacing?: string\n}\n\ninterface ThemeProviderComponentProps {\n props: { theme: ThemeProps }\n children?: React.ReactNode\n}\n\nconst TOKEN_MAP: Record<keyof ThemeProps, string> = {\n primary: '--jr-primary',\n bg: '--jr-bg',\n surface: '--jr-surface',\n text: '--jr-text',\n textMuted: '--jr-text-muted',\n success: '--jr-success',\n warning: '--jr-warning',\n danger: '--jr-danger',\n info: '--jr-info',\n font: '--jr-font',\n fontMono: '--jr-font-mono',\n fontSize: '--jr-font-size',\n radius: '--jr-radius',\n spacing: '--jr-spacing',\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderComponentProps> = ({\n props,\n children,\n}) => {\n const style: React.CSSProperties = {}\n const theme = props.theme\n if (theme) {\n for (const [key, cssVar] of Object.entries(TOKEN_MAP)) {\n const value = theme[key as keyof ThemeProps]\n if (value) {\n ;(style as Record<string, string>)[cssVar] = value\n }\n }\n }\n\n return (\n <div className=\"jr-theme-scope\" style={style}>\n {children}\n </div>\n )\n}\n\nexport default ThemeProvider\n","/**\n * CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) — AppChrome.\n *\n * What this component is\n * ----------------------\n * The \"top-bar half\" of the legacy 520-LOC `DashboardLayout`. A sticky\n * application header that renders a title + optional subtitle on the\n * left and an optional cluster of action buttons on the right. Body\n * content (typically a SideNav + SectionRouter combination) flows\n * underneath through `children`.\n *\n * Why it's split\n * --------------\n * `DashboardLayout` baked 7 unrelated sub-responsibilities (header /\n * sidebar / section routing / grid / responsive / theming / actions)\n * into one 520-LOC file. Phase 3 decision #4 (delete-old +\n * transformer-only with ≥95% automation) requires modular siblings.\n * The transformer `legacy.dashboardlayout.split` (PR-P3-#3 commit 5/N)\n * auto-migrates legacy specs into the new composition:\n *\n * AppChrome { title, subtitle, actions } > [\n * Row { gap: 'none' } > [\n * SideNav { items, defaultSelectedId, selectedPath },\n * SectionRouter { sections, activeIdPath } > [...content keys]\n * ]\n * ]\n *\n * Action contract — JETP-083 WS3.7.7 parity\n * -----------------------------------------\n * The legacy DashboardLayout had a dead-action bug: it only emitted a\n * generic `'action'` event that `@json-render/react.emit()` dropped\n * unless callers also wired `element.on`. AppChrome carries that fix\n * verbatim — clicking an action button:\n * 1. invokes the ActionProvider handler directly via\n * `useActions().execute({ action, params: { label, action } })`\n * so the prop alone is sufficient (no `on:` wiring needed); and\n * 2. ALSO emits `'action'` with `{ action, label }` so hosts that\n * explicitly bound spec-level listeners keep working.\n *\n * Slots\n * -----\n * `children` (slot 'default') renders inside the `.jr-app-chrome__body`\n * region beneath the header. Use any layout composition; the chrome\n * itself is layout-agnostic.\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/01_dashboard_layout_split.md §2.1 + §2.6\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #4\n */\n\nimport React, { useCallback } from 'react'\nimport { useActions } from '@json-render/react'\nimport { injectStyles } from './injectStyles'\nimport { Button } from './primitives/Button'\nimport { ConfirmDialog } from './primitives/ConfirmDialog'\nimport { Icon } from './primitives/Icon'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-app-chrome'\n\n// IMPORTANT: scoped class names mirror `.jr-dashboard-layout__header*`\n// from the legacy source so existing themes targeting `.jr-app-chrome*`\n// (Phase 3 forward) AND the legacy class names (Phase 0/1/2 specs) can\n// co-exist during migration. The migrator rewrites specs to the new\n// structure but does NOT touch user stylesheets.\nconst SHEET = `\n@keyframes jr-app-chrome-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-app-chrome {\n display: flex;\n flex-direction: column;\n min-width: 0;\n width: 100%;\n box-sizing: border-box;\n background: var(--jr-bg, #f8fafc);\n color: var(--jr-text, #0f172a);\n font-family: var(--jr-font, system-ui, sans-serif);\n border-radius: var(--jr-radius, 8px);\n overflow: hidden;\n animation: jr-app-chrome-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-app-chrome__header {\n flex-shrink: 0;\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: calc(var(--jr-spacing, 12px) * 1);\n padding: calc(var(--jr-spacing, 12px) * 1.25) calc(var(--jr-spacing, 12px) * 1.5);\n background: var(--jr-surface, #ffffff);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n}\n.jr-app-chrome--sticky .jr-app-chrome__header {\n position: sticky;\n top: 0;\n z-index: 2;\n}\n.jr-app-chrome__titles {\n min-width: 0;\n flex: 1;\n}\n.jr-app-chrome__title {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n line-height: 1.3;\n color: var(--jr-text, #0f172a);\n}\n.jr-app-chrome__subtitle {\n margin: 0.35rem 0 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 1.4;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-app-chrome__actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n\n/* CWRF-013 Phase 4 切片 G L1 — actions adapt to container width.\n When .jr-card-container shrinks below --jr-bp-md (480px) the action\n buttons stack vertically and stretch full-width for better hit area\n on narrow chat bubbles. */\n@container jr-card (max-width: 480px) {\n .jr-app-chrome__actions {\n flex-direction: column;\n align-items: stretch;\n justify-content: stretch;\n }\n .jr-app-chrome__actions > .jr-button,\n .jr-app-chrome__actions > button {\n width: 100%;\n }\n}\n/* .jr-app-chrome__action-btn* — migrated to Button primitive in\n CWRF-013 Phase 4 P2-T08 (W2.1). Visual + a11y now delegated to\n primitives/Button.tsx. */\n.jr-app-chrome__body {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* CWRF-013 Phase 4 P2-T15 (Tier 2-4) — footer action strip for review /\n * approval cards (\"方案审核\" smoke). Mirrors header layout but anchors at\n * the bottom; destructive actions are auto-wrapped by ConfirmDialog in\n * the render path so the LLM-authored spec stays declarative. */\n.jr-app-chrome__footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.65rem calc(var(--jr-spacing, 12px) * 1.25);\n border-top: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 70%, var(--jr-surface, #fff));\n}\n.jr-app-chrome__footer-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n justify-content: flex-end;\n min-width: 0;\n}\n@container jr-card (max-width: 480px) {\n .jr-app-chrome__footer,\n .jr-app-chrome__footer-actions {\n flex-direction: column;\n align-items: stretch;\n }\n .jr-app-chrome__footer-actions > .jr-button,\n .jr-app-chrome__footer-actions > button {\n width: 100%;\n }\n}\n\n/* CWRF-013 Phase 4 P2-T15.2 — terminal-state status banner.\n *\n * When props.status flips from \"pending\" (default) to a terminal value\n * (approved | rejected | cancelled), the footer action strip is\n * replaced by a single status row anchored at the same chrome footer\n * slot. Visual encoding is dual: colour token (success / danger /\n * muted) AND a lucide glyph so colour-blind / monochrome / forced-\n * colors users still distinguish outcome. The banner takes the\n * full footer width — never partial — to prevent the \"approved appears\n * BELOW the buttons\" stacking artefact users reported. The action\n * buttons are unmounted (not just disabled) so no race-window can\n * fire a second hil-release after the first wins.\n */\n.jr-app-chrome__footer--status {\n justify-content: flex-start;\n font-weight: 500;\n font-size: 0.9rem;\n}\n.jr-app-chrome__status-banner {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n min-width: 0;\n}\n.jr-app-chrome__status-icon {\n width: 1.1em;\n height: 1.1em;\n flex-shrink: 0;\n}\n.jr-app-chrome__status-by {\n color: var(--jr-text-muted, #64748b);\n font-weight: 400;\n}\n.jr-app-chrome__footer--status-approved {\n color: var(--jr-success, #16a34a);\n border-top-color: color-mix(in srgb, var(--jr-success, #16a34a) 30%, transparent);\n background: color-mix(in srgb, var(--jr-success, #16a34a) 8%, var(--jr-surface, #fff));\n}\n.jr-app-chrome__footer--status-rejected {\n color: var(--jr-danger, #dc2626);\n border-top-color: color-mix(in srgb, var(--jr-danger, #dc2626) 30%, transparent);\n background: color-mix(in srgb, var(--jr-danger, #dc2626) 8%, var(--jr-surface, #fff));\n}\n.jr-app-chrome__footer--status-cancelled {\n color: var(--jr-text-muted, #64748b);\n border-top-color: color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 70%, var(--jr-surface, #fff));\n}\n@media (forced-colors: active) {\n .jr-app-chrome__footer--status-approved,\n .jr-app-chrome__footer--status-rejected,\n .jr-app-chrome__footer--status-cancelled {\n color: CanvasText;\n background: Canvas;\n border-top-color: CanvasText;\n }\n .jr-app-chrome__status-icon {\n color: CanvasText;\n }\n}\n`\n\nexport interface AppChromeAction {\n label: string\n action: string\n variant?: 'primary' | 'secondary' | 'ghost' | 'destructive'\n icon?: string\n /** Override the ConfirmDialog title for destructive auto-wrap (P2-T15).\n * Defaults to `确认${label}?`. Only consulted when variant === 'destructive'\n * AND confirm !== false. */\n confirmTitle?: string\n /** Override the ConfirmDialog description (body copy). Defaults to undefined. */\n confirmDescription?: string\n /** Explicit opt-out from destructive auto-wrap. Set to `false` to render\n * the destructive Button without a ConfirmDialog gate (rarely needed). */\n confirm?: boolean\n}\n\n/**\n * CWRF-013 Phase 4 P2-T15.2 — HIL approval lifecycle for footer.actions.\n *\n * Why the field exists\n * --------------------\n * Pre-P2-T15.2 contract: `footer.actions` always rendered, and the\n * backend was expected to push a brand-new `/elements/...` patch to\n * rewrite the card after a hil-release. In practice jetagents'\n * `_handle_hil_release` only notifies ResponseWaiter (waking the\n * agent) and does NOT push a follow-up spec patch — relying on the\n * agent's next LLM round to authoritatively redraw the card. That\n * round is non-deterministic and frequently never lands (timeout /\n * model didn't choose to re-draw / different spec_id), leaving the\n * \"approve\" + \"reject\" buttons visibly stuck on a card the user has\n * already resolved (cf. screenshot 2 in the bug report).\n *\n * New contract: the backend (or the spec author) sets `status` to\n * a terminal value AND/OR binds it via `{$bindState: \"/_hil/status\"}`\n * (JSON-Pointer slash path; @json-render parseJsonPointer does NOT\n * accept dot-separated paths). When status is non-pending the footer\n * action strip is unmounted\n * (not just disabled — so no second hil-release race) and replaced\n * by a single status banner that occupies the same footer slot.\n *\n * `pending` is the implicit default — omitting `status` keeps the\n * legacy footer-actions behaviour for all existing approval specs.\n */\nexport type AppChromeStatus = 'pending' | 'approved' | 'rejected' | 'cancelled'\n\nexport interface AppChromeProps {\n props: {\n title: string\n subtitle?: string\n actions?: AppChromeAction[]\n sticky?: boolean\n /** CWRF-013 Phase 4 P2-T15 (Tier 2-4) — footer action strip.\n * Renders after `children` (default slot). destructive variants are\n * auto-wrapped in ConfirmDialog unless `confirm: false` is explicit.\n * This is the canonical \"approve / reject / request-changes\" slot for\n * review / approval cards (the \"方案审核\" smoke screenshot scenario). */\n footer?: {\n actions: AppChromeAction[]\n }\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): when true, the body area\n * is replaced by a centered loading spinner. Header + footer stay\n * rendered so chrome navigation context is preserved. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): when non-empty, the body\n * area is replaced by an error placeholder + this message as\n * description. Wins over `loading`. */\n error?: string\n /** P2-T15.2 — approval lifecycle (see AppChromeStatus). Unknown\n * values fall back to `pending` (safe — keeps buttons visible\n * so the user can still act). Supports `{$bindState}` resolution\n * via @json-render — the resolved string is what this component\n * receives. */\n status?: AppChromeStatus | string\n /** P2-T15.2 — override the default banner copy when status is\n * terminal. Defaults to 已批准 / 已驳回 / 已取消 by status. */\n statusLabel?: string\n /** P2-T15.2 — resolver display name, rendered in parentheses\n * after statusLabel. Mirrors HilEntity.winner_response().resolver\n * so the LLM can pass it through unchanged. */\n statusBy?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\n/** Map the (English) terminal-state enum to the lucide icon name +\n * surface modifier class. Kept as a pure lookup so future i18n /\n * theming overrides flow through one place. */\nconst STATUS_ICON: Record<AppChromeStatus, string> = {\n pending: 'circle-dashed',\n approved: 'circle-check',\n rejected: 'circle-x',\n cancelled: 'ban',\n}\n\n/** Default zh-CN copy. Spec author / backend overrides via\n * `statusLabel`. We do NOT route through useChatWidgetI18n here —\n * AppChrome is meant to render outside the chat-widget host\n * (standalone preview) and adding the hook would require a\n * ChatWidgetI18nProvider that downstream consumers don't have. */\nconst STATUS_DEFAULT_LABEL: Record<AppChromeStatus, string> = {\n pending: '',\n approved: '已批准',\n rejected: '已驳回',\n cancelled: '已取消',\n}\n\nconst TERMINAL_STATUSES = new Set<AppChromeStatus>(['approved', 'rejected', 'cancelled'])\n\nfunction resolveStatus(raw: unknown): AppChromeStatus {\n if (typeof raw !== 'string') return 'pending'\n if (raw === 'approved' || raw === 'rejected' || raw === 'cancelled' || raw === 'pending') {\n return raw\n }\n return 'pending'\n}\n\nexport const AppChrome: React.FC<AppChromeProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const title = typeof props.title === 'string' ? props.title : ''\n const subtitle = typeof props.subtitle === 'string' ? props.subtitle : ''\n const sticky = props.sticky !== false // default true per §2.1\n const actions = Array.isArray(props.actions) ? props.actions : []\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): chrome-level loading + error.\n // When the entire dashboard is awaiting boot data, render only the\n // header + a centered StateView (no body content). Error wins over\n // loading. We keep the header rendered (title + chrome surface) so\n // the user still has navigation context during the transition.\n const loadingProp = props.loading === true\n const errorProp =\n typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined\n const chromeState = useComponentState({ loading: loadingProp, error: errorProp })\n\n // JETP-083 WS3.7.7 parity — self-dispatch action so the prop alone is\n // sufficient, no `on:` wiring required. Identical pattern to the\n // legacy DashboardLayout fix this component replaces.\n const actionExec = useActions()\n const handleAction = useCallback(\n (binding: AppChromeAction) => {\n void actionExec\n .execute({ action: binding.action, params: { label: binding.label, action: binding.action } })\n .catch((err) => {\n console.error('[AppChrome] action failed:', err)\n })\n emit?.('action', { action: binding.action, label: binding.label })\n },\n [actionExec, emit],\n )\n\n const rootCls = sticky ? 'jr-app-chrome jr-app-chrome--sticky' : 'jr-app-chrome'\n\n const footerActions = Array.isArray(props.footer?.actions) ? props.footer!.actions : []\n\n // P2-T15.2 — resolve approval lifecycle. `status` may arrive as a literal\n // string (\"approved\") OR as the resolved value of a `{$bindState}`\n // reference — both flow through @json-render as plain strings by the\n // time this component renders. Unknown / missing values fall back to\n // `pending` so legacy specs (no status field at all) keep showing the\n // action strip exactly as before.\n const status = resolveStatus(props.status)\n const isTerminal = TERMINAL_STATUSES.has(status)\n const statusLabel =\n typeof props.statusLabel === 'string' && props.statusLabel.length > 0\n ? props.statusLabel\n : STATUS_DEFAULT_LABEL[status]\n const statusBy = typeof props.statusBy === 'string' ? props.statusBy : ''\n const showFooter = (isTerminal && statusLabel.length > 0) || (!isTerminal && footerActions.length > 0)\n\n /**\n * Render a single footer action. Destructive variants are auto-wrapped in\n * a ConfirmDialog (decision-friction guard) unless the caller explicitly\n * sets `confirm: false`. The ConfirmDialog title falls back to\n * `确认${label}?` per spec §2.5.\n *\n * Non-destructive actions render a plain Button — identical to the\n * header actions path so visual/a11y behaviour is consistent.\n */\n const renderFooterAction = (a: AppChromeAction, idx: number) => {\n const isDestructive = a.variant === 'destructive' && a.confirm !== false\n if (isDestructive) {\n return (\n <ConfirmDialog\n key={`footer-${a.action}-${idx}`}\n trigger={{ label: a.label, variant: 'destructive', icon: a.icon }}\n title={a.confirmTitle ?? `确认${a.label}?`}\n description={a.confirmDescription}\n severity=\"destructive\"\n onConfirm={() => handleAction(a)}\n />\n )\n }\n return (\n <Button\n key={`footer-${a.action}-${idx}`}\n label={a.label}\n variant={a.variant ?? 'secondary'}\n icon={a.icon}\n onClick={() => handleAction(a)}\n />\n )\n }\n\n return (\n <div className={rootCls}>\n <header className=\"jr-app-chrome__header\">\n <div className=\"jr-app-chrome__titles\">\n <h1 className=\"jr-app-chrome__title\">{title || 'Dashboard'}</h1>\n {subtitle ? <p className=\"jr-app-chrome__subtitle\">{subtitle}</p> : null}\n </div>\n {actions.length > 0 ? (\n <div className=\"jr-app-chrome__actions\">\n {actions.map((a, i) => (\n <Button\n key={`${a.action}-${i}`}\n label={a.label}\n variant={a.variant ?? 'secondary'}\n icon={a.icon}\n onClick={() => handleAction(a)}\n />\n ))}\n </div>\n ) : null}\n </header>\n <div className=\"jr-app-chrome__body\" data-state={chromeState.state}>\n {chromeState.isError ? (\n <StateView kind=\"error\" description={chromeState.errorMessage} />\n ) : chromeState.isLoading ? (\n <StateView kind=\"loading\" />\n ) : (\n children\n )}\n </div>\n {showFooter ? (\n isTerminal ? (\n <footer\n className={`jr-app-chrome__footer jr-app-chrome__footer--status jr-app-chrome__footer--status-${status}`}\n role=\"status\"\n aria-live=\"polite\"\n data-status={status}\n >\n <span className=\"jr-app-chrome__status-banner\">\n <Icon name={STATUS_ICON[status]} className=\"jr-app-chrome__status-icon\" />\n <span className=\"jr-app-chrome__status-label\">{statusLabel}</span>\n {statusBy ? (\n <span className=\"jr-app-chrome__status-by\">({statusBy})</span>\n ) : null}\n </span>\n </footer>\n ) : (\n <footer className=\"jr-app-chrome__footer\">\n <div className=\"jr-app-chrome__footer-actions\">\n {footerActions.map(renderFooterAction)}\n </div>\n </footer>\n )\n ) : null}\n </div>\n )\n}\n\nexport default AppChrome\n","/**\n * CWRF-013 Phase 4 Tier 2-2 P2-T04 — Button primitive.\n *\n * Traces:\n * - spec: docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/\n * 02_button_primitive/01_button_primitive_design.md §2.1\n * - AC: AC-BTN-001 (variant + size + tokens + a11y mixin)\n * AC-BTN-002 (loading shields click + aria-disabled + spinner)\n * AC-BTN-003 (icon + iconPosition)\n *\n * Architecture role (chat-widget-sdk-architecture):\n * - Pure UI primitive (no business state, no SDK coupling)\n * - Composes the `Icon` primitive for icon + spinner slot\n * - SHEET injection via `injectStyles` (idempotent)\n * - a11y: HTML `disabled` + `aria-disabled` dual-encoded, mixin opt-in\n * for `.jr-pressable` and `.jr-focusable`\n *\n * Spec drift (documented in slice E):\n * - D-BTN-01: catalog Button entry rewrite + registry binding swap\n * (spec P2-T05 / P2-T06) is deferred — `{type:'Button'}` JSON specs\n * continue to render via shadcn Button until LLM corpus + catalog\n * snapshot migration is scoped. The 4 internal callsites (AppChrome /\n * TableToolbar / FormSection submit / FormSection file-zone-btn)\n * import this primitive directly for now.\n * - D-BTN-02: spec L92 imports `{ Spinner } from './Spinner'`, which\n * does not exist. Use lucide `loader-2` via the Icon primitive plus\n * a local CSS spin keyframe — zero new dependency, consistent visual\n * language with the rest of the icon system.\n */\nimport React from 'react';\n\nimport { injectStyles } from '../injectStyles';\nimport { Icon } from './Icon';\n\nconst STYLE_ID = 'jr-styles-button-primitive';\n\nconst SHEET = `\n@keyframes jr-button-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.jr-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n font: inherit;\n font-weight: 500;\n border-radius: calc(var(--jr-radius, 8px) * 0.75);\n cursor: pointer;\n border: 1px solid transparent;\n white-space: nowrap;\n user-select: none;\n transition:\n background-color var(--jr-transition-fast) var(--jr-easing-standard),\n border-color var(--jr-transition-fast) var(--jr-easing-standard),\n filter var(--jr-transition-fast) var(--jr-easing-standard),\n transform var(--jr-transition-fast) var(--jr-easing-standard);\n}\n\n.jr-button--sm { font-size: 0.75rem; padding: 0.3rem 0.6rem; min-height: 1.625rem; }\n.jr-button--md { font-size: 0.8125rem; padding: 0.4rem 0.85rem; min-height: 2rem; }\n.jr-button--lg { font-size: 0.9375rem; padding: 0.55rem 1.1rem; min-height: 2.5rem; }\n\n.jr-button--primary {\n background: var(--jr-primary, #3b82f6);\n border-color: var(--jr-primary, #3b82f6);\n color: var(--jr-on-primary, #ffffff);\n}\n.jr-button--primary:hover:not(:disabled):not([data-loading=\"true\"]) {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 88%, #000);\n}\n\n.jr-button--secondary {\n background: var(--jr-surface, #ffffff);\n border-color: color-mix(in srgb, var(--jr-text, #0f172a) 14%, transparent);\n color: var(--jr-text, #0f172a);\n}\n.jr-button--secondary:hover:not(:disabled):not([data-loading=\"true\"]) {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, var(--jr-surface, #fff));\n}\n\n.jr-button--ghost {\n background: transparent;\n border-color: transparent;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-button--ghost:hover:not(:disabled):not([data-loading=\"true\"]) {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n}\n\n/* CWRF-013 Phase 4 P2-T13 (slice F): destructive variant for\n irreversible / decision-friction actions (driven by ConfirmDialog\n primitive). Driven by --jr-danger / --jr-on-danger status tokens\n (see motionFocusTokens.ts P1-T01). */\n.jr-button--destructive {\n background: var(--jr-danger, #dc2626);\n border-color: var(--jr-danger, #dc2626);\n color: var(--jr-on-danger, #ffffff);\n}\n.jr-button--destructive:hover:not(:disabled):not([data-loading=\"true\"]) {\n background: color-mix(in srgb, var(--jr-danger, #dc2626) 88%, #000);\n}\n\n.jr-button:disabled,\n.jr-button[aria-disabled=\"true\"] {\n opacity: 0.55;\n cursor: not-allowed;\n filter: grayscale(0.3);\n}\n\n.jr-button[data-loading=\"true\"] {\n cursor: progress;\n position: relative;\n}\n.jr-button[data-loading=\"true\"] .jr-button__label,\n.jr-button[data-loading=\"true\"] .jr-button__icon {\n visibility: hidden;\n}\n.jr-button[data-loading=\"true\"] .jr-button__spinner {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n display: inline-flex;\n animation: jr-button-spin 0.75s linear infinite;\n}\n\n.jr-button__icon {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n}\n`;\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\nexport type ButtonIconPosition = 'leading' | 'trailing';\n\nexport interface ButtonProps {\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n icon?: string;\n iconPosition?: ButtonIconPosition;\n disabled?: boolean;\n loading?: boolean;\n onClick?: () => void;\n type?: 'button' | 'submit' | 'reset';\n ariaLabel?: string;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n label,\n variant = 'secondary',\n size = 'md',\n icon,\n iconPosition = 'leading',\n disabled = false,\n loading = false,\n onClick,\n type = 'button',\n ariaLabel,\n}) => {\n injectStyles(STYLE_ID, SHEET);\n\n const className = [\n 'jr-button',\n `jr-button--${variant}`,\n `jr-button--${size}`,\n 'jr-pressable',\n 'jr-focusable',\n ].join(' ');\n\n const isInteractive = !(disabled || loading);\n\n return (\n <button\n type={type}\n className={className}\n disabled={disabled || loading}\n aria-disabled={disabled || loading || undefined}\n aria-label={ariaLabel}\n data-loading={loading || undefined}\n onClick={isInteractive ? onClick : undefined}\n >\n {icon && iconPosition === 'leading' ? (\n <Icon name={icon} className=\"jr-button__icon\" />\n ) : null}\n <span className=\"jr-button__label\">{label}</span>\n {icon && iconPosition === 'trailing' ? (\n <Icon name={icon} className=\"jr-button__icon\" />\n ) : null}\n {loading ? (\n <Icon name=\"loader-2\" className=\"jr-button__spinner\" />\n ) : null}\n </button>\n );\n};\n","/**\n * CWRF-013 Phase 4 Tier 2-1 P2-T01 — Icon primitive.\n *\n * Traces:\n * - spec: docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/\n * 03_icon_system/01_icon_primitive_design.md §2.1\n * - AC: AC-ICN-001 (lucide name resolution)\n * AC-ICN-002 (emoji passthrough)\n * AC-ICN-003 (fallback + dev warn)\n * AC-ICN-007 (bundle size — covered by `pnpm size` gate, not by code)\n *\n * Architecture role (chat-widget-sdk-architecture):\n * - Pure UI primitive (no business state, no MCP, no SDK coupling)\n * - SHEET injection via `injectStyles` so consumers do not need to import CSS\n * - 3-tier name resolution: lucide → emoji → fallback letter\n * - SSR-safe (no window/document access during render; SHEET injection\n * guarded by `typeof document` inside `injectStyles`)\n *\n * Tree-shaking note (spec §3 leak analysis):\n * `import * as lucide from 'lucide-react'` defeats tree-shaking and pulls\n * the full ~5700-icon barrel. AC-ICN-007 bundle gate (`pnpm size`) is the\n * single guardrail; if the gate fails in Phase 2, fall back to a curated\n * icon map (see `02_button_primitive/01 §2.1` discussion).\n */\nimport * as lucide from 'lucide-react';\nimport React from 'react';\n\nimport { injectStyles } from '../injectStyles';\n\nconst STYLE_ID = 'jr-styles-icon-primitive';\n\nconst SHEET = `\n.jr-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n color: currentColor;\n line-height: 1;\n}\n.jr-icon svg {\n width: 100%;\n height: 100%;\n}\n.jr-icon--fallback {\n font-weight: 700;\n}\n`;\n\nexport interface IconProps {\n /**\n * Icon name. Resolution order:\n * 1. lucide-react export key (kebab-case → PascalCase, e.g.\n * `alert-triangle` → `AlertTriangle`)\n * 2. Emoji unicode literal passthrough (e.g. '✓', '⚠', '○')\n * 3. Fallback: first letter (uppercased) inside an `.jr-icon--fallback`\n * span — visual hint that the icon name is unknown.\n */\n name: string;\n className?: string;\n ariaLabel?: string;\n /**\n * `true` (default) → decorative; rendered with `aria-hidden=\"true\"`.\n * `false` → exposes `role=\"img\"` + `aria-label` (falls back to `name`\n * when `ariaLabel` is not provided).\n */\n decorative?: boolean;\n}\n\nfunction kebabToPascal(s: string): string {\n return s\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n\n// Crude heuristic — single-char (or ZWJ-pair) + Extended_Pictographic /\n// dingbats / misc-symbols range.\nconst EMOJI_RE = /\\p{Extended_Pictographic}|[\\u2600-\\u27BF]/u;\nfunction isEmoji(s: string): boolean {\n return s.length <= 2 && EMOJI_RE.test(s);\n}\n\nconst LUCIDE_MAP = lucide as unknown as Record<\n string,\n React.ComponentType<{ className?: string }>\n>;\n\nexport const Icon: React.FC<IconProps> = ({\n name,\n className,\n ariaLabel,\n decorative = true,\n}) => {\n injectStyles(STYLE_ID, SHEET);\n\n const a11y = decorative\n ? { 'aria-hidden': true as const }\n : { 'aria-label': ariaLabel ?? name, role: 'img' as const };\n\n const PascalName = kebabToPascal(name);\n const LucideIcon = LUCIDE_MAP[PascalName];\n\n if (LucideIcon) {\n return (\n <span\n className={['jr-icon', className].filter(Boolean).join(' ')}\n {...a11y}\n >\n <LucideIcon />\n </span>\n );\n }\n\n if (isEmoji(name)) {\n return (\n <span\n className={['jr-icon', className].filter(Boolean).join(' ')}\n {...a11y}\n >\n {name}\n </span>\n );\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[jr Icon] unknown icon: ${name}; falling back to text glyph`);\n }\n return (\n <span\n className={['jr-icon', 'jr-icon--fallback', className]\n .filter(Boolean)\n .join(' ')}\n {...a11y}\n >\n {name.charAt(0).toUpperCase()}\n </span>\n );\n};\n","/**\n * CWRF-013 Phase 4 Tier 2-4 P2-T14 — ConfirmDialog primitive.\n *\n * Traces:\n * - spec: docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/\n * 02_button_primitive/02_confirm_dialog.md v1.2\n * - AC: AC-CFD-001 (basic trigger + render)\n * AC-CFD-002 (destructive severity → default focus on Cancel)\n * AC-CFD-003 (loading lockdown — Esc / overlay blocked)\n * AC-CFD-004 (async onConfirm auto-loading)\n * AC-CFD-005 (catalog description — covered in catalog.ts)\n * AC-CFD-007 (i18n: en-US Cancel/Confirm; zh-CN 取消/确认)\n *\n * Architecture role (chat-widget-sdk-architecture):\n * - Composable primitive — controlled `open` state lives inside the\n * component; caller passes a `Button`-shaped `trigger` and an\n * `onConfirm` handler.\n * - Strict separation: visual surface (radix primitives + a2ui CSS\n * tokens) vs. behaviour (loading guards, focus policy, error\n * reporting).\n * - i18n: leverages the existing chat-widget `useChatWidgetI18n`\n * dictionary (`jr.confirmDialog.cancel` / `confirm` / `loading`)\n * instead of adding `react-i18next`. Falls back to the locale\n * resolved by the `I18nContext` default (zh-CN) when no provider\n * is present.\n *\n * Spec drift (documented in slice F):\n * - D-CFD-D1 (= D9 v1.2 in spec): use `useChatWidgetI18n` from the\n * existing chat-widget i18n module instead of pulling in\n * `react-i18next` + `i18next`. Same key semantics, zero new\n * runtime dependency.\n * - D-CFD-D2 (= D2 v1.2 in spec): import `@radix-ui/react-alert-dialog`\n * directly (promoted from a pnpm sub-dependency to a top-level\n * dependency in slice F). The shadcn package does NOT export\n * `AlertDialog`.\n * - D-CFD-D3: render the controlled radix `AlertDialog.Root` *without*\n * `AlertDialogTrigger asChild`, because (a) our Button primitive\n * doesn't `forwardRef` and (b) `<button><button>` nesting would be\n * invalid HTML. The trigger Button lives next to the Root and\n * simply flips `open=true`. Same UX, cleaner DOM.\n * - D-CFD-D4: render the Cancel control as a styled `<button>`\n * wearing the Button primitive classes (`jr-button\n * jr-button--secondary jr-button--md jr-pressable jr-focusable`)\n * so radix can forward the ref needed for default-focus policy.\n * The trigger Button (always rendered) injects the shared Button\n * SHEET — Cancel inherits its visual contract for free.\n *\n * Out-of-scope (cancelled in slice F):\n * - P2-T15 AppChrome.footer destructive auto-wrap — AppChrome currently\n * has only `topBar.actions`, no `footer.actions`. Adding a footer\n * surface is a separate phase. LLM-generated specs can use\n * ConfirmDialog explicitly via the registry binding from this slice.\n */\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';\nimport { useActions } from '@json-render/react';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useChatWidgetI18n } from '../../../../i18n/context';\nimport { injectStyles } from '../injectStyles';\nimport { Button, type ButtonProps, type ButtonVariant, type ButtonSize } from './Button';\nimport { Icon } from './Icon';\n\nconst STYLE_ID = 'jr-styles-confirm-dialog';\n\nconst SHEET = `\n@keyframes jr-confirm-dialog-overlay-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes jr-confirm-dialog-content-in {\n from { opacity: 0; transform: translate(-50%, -48%) scale(0.97); }\n to { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n}\n\n.jr-confirm-dialog__overlay {\n position: fixed;\n inset: 0;\n background: rgba(15, 23, 42, 0.48);\n z-index: 1000;\n animation: jr-confirm-dialog-overlay-in var(--jr-transition-base) var(--jr-easing-standard);\n}\n\n.jr-confirm-dialog__content {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1001;\n width: min(92vw, 28rem);\n max-height: 88vh;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n padding: 1.25rem 1.5rem;\n background: var(--jr-surface, #ffffff);\n color: var(--jr-text, #0f172a);\n border-radius: calc(var(--jr-radius, 8px) * 1.25);\n box-shadow:\n 0 18px 48px color-mix(in srgb, var(--jr-text, #0f172a) 22%, transparent),\n 0 1px 0 color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n animation: jr-confirm-dialog-content-in var(--jr-transition-slow) var(--jr-easing-decel);\n}\n\n.jr-confirm-dialog__header {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n}\n\n.jr-confirm-dialog__title {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n}\n\n.jr-confirm-dialog__title-icon--destructive {\n color: var(--jr-danger, #dc2626);\n width: 1.25rem;\n height: 1.25rem;\n}\n.jr-confirm-dialog__title-icon--warning {\n color: var(--jr-warning, #d97706);\n width: 1.25rem;\n height: 1.25rem;\n}\n.jr-confirm-dialog__title-icon--info {\n color: var(--jr-info, #2563eb);\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.jr-confirm-dialog__description {\n margin: 0;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n line-height: 1.55;\n}\n\n/* CWRF-013 Phase 5 a11y — visually-hidden description fallback.\n Standard sr-only pattern (clip-path + 1×1 size) so screen readers\n still announce the description while sighted users see nothing.\n Used when the spec author omits a visible description but Radix's\n AlertDialog still requires one for a11y compliance. */\n.jr-confirm-dialog__description--sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.jr-confirm-dialog__footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n\n/* CWRF-013 Phase 4 切片 G L1 — confirm footer adapts to container width.\n When .jr-card-container shrinks below --jr-bp-md (480px) the\n Cancel/Confirm pair stacks vertically with destructive Confirm on the\n bottom (preserving decision-friction policy AC-CFD-002 — Cancel still\n appears first/on top to be more easily reachable). */\n@container jr-card (max-width: 480px) {\n .jr-confirm-dialog__footer {\n flex-direction: column;\n align-items: stretch;\n justify-content: stretch;\n }\n .jr-confirm-dialog__footer > .jr-button,\n .jr-confirm-dialog__footer > button {\n width: 100%;\n }\n}\n`;\n\nexport type ConfirmDialogSeverity = 'destructive' | 'warning' | 'info';\n\nexport interface ConfirmDialogProps {\n /** Trigger button props (forwarded to the `Button` primitive). */\n trigger: ButtonProps;\n /** Dialog title, e.g. \"确认驳回此方案?\". */\n title: string;\n /** Optional supporting body text. */\n description?: string;\n /**\n * Severity drives the title icon, the Confirm button variant, and\n * the default-focus policy.\n *\n * - `destructive` → red icon, `Button.destructive`, initial focus\n * lands on the Cancel button (decision-friction guard).\n * - `warning` → amber icon, `Button.primary`, initial focus\n * on Confirm.\n * - `info` → blue icon, `Button.primary`, initial focus\n * on Confirm.\n *\n * Default = `destructive`.\n */\n severity?: ConfirmDialogSeverity;\n /** Override the Confirm button label. Defaults to `trigger.label`. */\n confirmLabel?: string;\n /** Override the Cancel button label. Defaults to i18n `jr.confirmDialog.cancel`. */\n cancelLabel?: string;\n /** Confirm handler. May return a Promise — auto-loading kicks in. */\n onConfirm: () => void | Promise<void>;\n /**\n * External loading override. When provided, takes precedence over the\n * internally-managed loading state (use for caller-coordinated state).\n */\n loading?: boolean;\n /** Optional callback when dialog dismissed without confirming. */\n onCancel?: () => void;\n}\n\nconst SEVERITY_ICON: Record<ConfirmDialogSeverity, string> = {\n destructive: 'alert-triangle',\n warning: 'alert-circle',\n info: 'info',\n};\n\nconst SEVERITY_TO_BUTTON_VARIANT: Record<\n ConfirmDialogSeverity,\n 'destructive' | 'primary'\n> = {\n destructive: 'destructive',\n warning: 'primary',\n info: 'primary',\n};\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n trigger,\n title,\n description,\n severity = 'destructive',\n confirmLabel,\n cancelLabel,\n onConfirm,\n loading: externalLoading,\n onCancel,\n}) => {\n injectStyles(STYLE_ID, SHEET);\n\n const { t } = useChatWidgetI18n();\n\n const [open, setOpen] = useState(false);\n const [internalLoading, setInternalLoading] = useState(false);\n const cancelButtonRef = useRef<HTMLButtonElement | null>(null);\n\n const loading = externalLoading ?? internalLoading;\n\n // Decision-friction H5 §7: destructive severity → initial focus on\n // Cancel so pressing Enter immediately after open cancels the action.\n useEffect(() => {\n if (!open || severity !== 'destructive') return;\n // Defer one tick so radix completes portal mount + its own\n // autofocus, then move focus to Cancel.\n const handle = window.setTimeout(() => {\n cancelButtonRef.current?.focus();\n }, 0);\n return () => window.clearTimeout(handle);\n }, [open, severity]);\n\n const handleConfirm = useCallback(async () => {\n if (loading) return;\n try {\n const result = onConfirm();\n if (result instanceof Promise) {\n setInternalLoading(true);\n await result;\n }\n setOpen(false);\n } catch (err) {\n console.error('[jr ConfirmDialog] onConfirm rejected', err);\n } finally {\n setInternalLoading(false);\n }\n }, [loading, onConfirm]);\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!next && loading) return;\n setOpen(next);\n if (!next) onCancel?.();\n },\n [loading, onCancel]\n );\n\n const resolvedCancelLabel = cancelLabel ?? t('jr.confirmDialog.cancel');\n const resolvedConfirmLabel = confirmLabel ?? trigger.label;\n const confirmVariant = SEVERITY_TO_BUTTON_VARIANT[severity];\n\n return (\n <>\n <Button {...trigger} onClick={() => setOpen(true)} />\n <AlertDialogPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <AlertDialogPrimitive.Portal>\n <AlertDialogPrimitive.Overlay className=\"jr-confirm-dialog__overlay\" />\n <AlertDialogPrimitive.Content className=\"jr-confirm-dialog__content\">\n <div className=\"jr-confirm-dialog__header\">\n <AlertDialogPrimitive.Title className=\"jr-confirm-dialog__title\">\n <Icon\n name={SEVERITY_ICON[severity]}\n className={`jr-confirm-dialog__title-icon--${severity}`}\n />\n <span>{title}</span>\n </AlertDialogPrimitive.Title>\n {/* Radix AlertDialog accessibility contract (CWRF-013\n Phase 5 a11y): the Description child is REQUIRED for\n screen-reader compliance — when the spec author\n doesn't supply visible body copy, we render a\n visually-hidden Description that mirrors the title\n so the dialog still announces context. The hidden\n branch uses `.jr-confirm-dialog__description--sr-only`\n (clip-path zero-size sr-only pattern). Trace: AC-\n A11Y-CFD-1/2/3 + Radix docs (silences the canonical\n \"AlertDialogContent requires a description\" warning\n without forcing every spec author to write copy). */}\n {description ? (\n <AlertDialogPrimitive.Description className=\"jr-confirm-dialog__description\">\n {description}\n </AlertDialogPrimitive.Description>\n ) : (\n <AlertDialogPrimitive.Description className=\"jr-confirm-dialog__description--sr-only\">\n {title}\n </AlertDialogPrimitive.Description>\n )}\n </div>\n <div className=\"jr-confirm-dialog__footer\">\n <AlertDialogPrimitive.Cancel asChild>\n <button\n ref={cancelButtonRef}\n type=\"button\"\n className=\"jr-button jr-button--secondary jr-button--md jr-pressable jr-focusable jr-confirm-dialog__cancel\"\n disabled={loading}\n aria-disabled={loading || undefined}\n >\n <span className=\"jr-button__label\">{resolvedCancelLabel}</span>\n </button>\n </AlertDialogPrimitive.Cancel>\n <Button\n label={resolvedConfirmLabel}\n variant={confirmVariant}\n size=\"md\"\n loading={loading}\n onClick={handleConfirm}\n />\n </div>\n </AlertDialogPrimitive.Content>\n </AlertDialogPrimitive.Portal>\n </AlertDialogPrimitive.Root>\n </>\n );\n};\n\n// ---------------------------------------------------------------------------\n// JSON-spec adapter — invoked via the domain registry binding (P2-T14d).\n// Spec-authored JSON nodes carry action names (strings) for `onConfirm` /\n// `onCancel`. The adapter resolves those names through `useActions()` so\n// LLM-generated specs can wire ConfirmDialog without any host-side glue.\n// ---------------------------------------------------------------------------\n\nexport interface ConfirmDialogTriggerSpec {\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n icon?: string;\n disabled?: boolean;\n}\n\nexport interface ConfirmDialogJSONSpecProps {\n trigger: ConfirmDialogTriggerSpec;\n title: string;\n description?: string;\n severity?: ConfirmDialogSeverity;\n confirmLabel?: string;\n cancelLabel?: string;\n /** Action name dispatched on confirm. */\n onConfirm: string;\n /** Optional action name dispatched on cancel. */\n onCancel?: string;\n}\n\nexport interface ConfirmDialogJSONComponentProps {\n props: ConfirmDialogJSONSpecProps;\n emit?: (event: string, data?: unknown) => void;\n}\n\nexport const ConfirmDialogJSON: React.FC<ConfirmDialogJSONComponentProps> = ({\n props,\n emit,\n}) => {\n const actionExec = useActions();\n\n const handleConfirm = useCallback(async () => {\n await actionExec\n .execute({\n action: props.onConfirm,\n params: { action: props.onConfirm },\n })\n .catch((err) => {\n console.error('[ConfirmDialog] onConfirm action failed:', err);\n throw err;\n });\n emit?.('action', { action: props.onConfirm });\n }, [actionExec, emit, props.onConfirm]);\n\n const handleCancel = useCallback(() => {\n if (!props.onCancel) return;\n void actionExec\n .execute({\n action: props.onCancel,\n params: { action: props.onCancel },\n })\n .catch((err) => {\n console.error('[ConfirmDialog] onCancel action failed:', err);\n });\n emit?.('action', { action: props.onCancel });\n }, [actionExec, emit, props.onCancel]);\n\n const trigger = useMemo<ButtonProps>(\n () => ({\n label: props.trigger.label,\n variant: props.trigger.variant,\n size: props.trigger.size,\n icon: props.trigger.icon,\n disabled: props.trigger.disabled,\n }),\n [props.trigger]\n );\n\n return (\n <ConfirmDialog\n trigger={trigger}\n title={props.title}\n description={props.description}\n severity={props.severity}\n confirmLabel={props.confirmLabel}\n cancelLabel={props.cancelLabel}\n onConfirm={handleConfirm}\n onCancel={props.onCancel ? handleCancel : undefined}\n />\n );\n};\n","/**\n * CWRF-013 Phase 4 Tier 4-4 (P4-T09) — StateView shared visual shell.\n *\n * Renders one of three \"non-default\" placeholder states:\n * - loading: spinning lucide loader-2 icon + \"加载中\"\n * - empty: inbox icon + \"暂无数据\" (overridable via props)\n * - error: alert-circle icon (jr-danger color) + \"加载失败\"\n *\n * Spec drift D-STATE-01: the design doc (§2.2) imported a `Spinner`\n * named export from `@json-render/shadcn`. shadcn@0.19.0 does NOT\n * export Spinner — only Dialog / Button / ButtonGroup. We use the\n * lucide `loader-2` icon with a CSS keyframe rotation instead, which\n * (a) avoids a new dependency, (b) participates in the\n * `prefers-reduced-motion` global override automatically (animation-\n * duration var collapses to ~0), and (c) keeps the icon style\n * consistent with the rest of the icon system.\n *\n * i18n note (Tier 4-4 v1.0 scope): the default copy ('加载中', '暂无\n * 数据', '加载失败') is hardcoded Chinese. The Phase 7 follow-up will\n * route this through the existing chat-widget i18n provider; for now\n * callers can override via the `title` / `description` props.\n *\n * Traces:\n * - spec: docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/\n * 05_micro_interactions/04_three_states.md §2.2\n * - AC: AC-MIC-011 (3-kind render)\n */\n\nimport React from 'react'\n\nimport { injectStyles } from '../injectStyles'\nimport { Icon } from './Icon'\n\nconst STYLE_ID = 'jr-styles-state-view'\n\nconst SHEET = `\n@keyframes jr-state-view-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n.jr-state-view {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 1.5rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n gap: 0.5rem;\n min-height: 6rem;\n box-sizing: border-box;\n}\n.jr-state-view__icon {\n width: 2rem;\n height: 2rem;\n font-size: 1.5rem;\n color: var(--jr-text-muted, #94a3b8);\n flex-shrink: 0;\n}\n.jr-state-view__title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--jr-text, #0f172a);\n margin: 0;\n}\n.jr-state-view__desc {\n margin: 0;\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-state-view--error .jr-state-view__icon {\n color: var(--jr-danger, #ef4444);\n}\n.jr-state-view--loading .jr-state-view__icon {\n animation: jr-state-view-spin var(--jr-transition-slow) linear infinite;\n color: var(--jr-primary, #3b82f6);\n}\n`\n\nexport type StateViewKind = 'loading' | 'empty' | 'error'\n\nexport interface StateViewProps {\n kind: StateViewKind\n /** Override title — falls back to localized default per `kind`. */\n title?: string\n /** Optional secondary line under the title. */\n description?: string\n /**\n * Optional lucide icon name override. Ignored for `kind='loading'`\n * (which always shows the spinning loader-2). Defaults:\n * - empty: inbox\n * - error: alert-circle\n */\n icon?: string\n}\n\nconst STATE_DEFAULTS: Record<StateViewKind, { icon: string; title: string }> = {\n loading: { icon: 'loader-2', title: '加载中' },\n empty: { icon: 'inbox', title: '暂无数据' },\n error: { icon: 'alert-circle', title: '加载失败' },\n}\n\nexport const StateView: React.FC<StateViewProps> = ({ kind, title, description, icon }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const defaults = STATE_DEFAULTS[kind]\n const resolvedIcon = icon ?? defaults.icon\n const resolvedTitle = title ?? defaults.title\n\n return (\n <div className={`jr-state-view jr-state-view--${kind}`} role=\"status\" data-state={kind}>\n <Icon name={resolvedIcon} className=\"jr-state-view__icon\" decorative />\n <p className=\"jr-state-view__title\">{resolvedTitle}</p>\n {description ? <p className=\"jr-state-view__desc\">{description}</p> : null}\n </div>\n )\n}\n\nexport default StateView\n","/**\n * CWRF-013 Phase 4 Tier 4-4 (P4-T08) — useComponentState hook.\n *\n * Single source of truth for 5-state resolution across all a2ui domain\n * components. Resolution priority (high → low):\n *\n * forcedState > error > loading > disabled > empty > default\n *\n * The priority reflects user urgency: an error must always be surfaced\n * before a stale empty state; a loading indicator must always be\n * surfaced before a stale empty/default branch; a disabled visual must\n * always win over an empty fallback so users don't try to \"fix\" the\n * empty state by clicking. `forcedState` is the spec-author override —\n * useful for snapshot tests + intentional skeleton scenes.\n *\n * Why a hook (not a pure function): the `useMemo` keeps the resolved\n * record referentially stable across renders so downstream components\n * can use it as a dependency without retriggering effects every render.\n *\n * Traces:\n * - spec: docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/\n * 05_micro_interactions/04_three_states.md §2.1\n * - AC: AC-MIC-010 (priority order)\n */\n\nimport { useMemo } from 'react'\n\nexport type ComponentState = 'loading' | 'empty' | 'disabled' | 'error' | 'default'\n\nexport interface UseComponentStateInput {\n /** Spec-author override — forces the resolved state regardless of data shape. */\n forcedState?: ComponentState\n /** True if the underlying data fetch is in flight. */\n loading?: boolean\n /** Error string/Error if the load failed (null/undefined = no error). */\n error?: string | Error | null\n /** True if the component is interactionally disabled. */\n disabled?: boolean\n /**\n * Whether data should be considered empty. Accepts a boolean or a\n * lazy function — the lazy form lets callers avoid computing\n * emptiness when a higher-priority state already wins.\n */\n isEmpty?: boolean | (() => boolean)\n}\n\nexport interface UseComponentStateResult {\n state: ComponentState\n isLoading: boolean\n isEmpty: boolean\n isDisabled: boolean\n isError: boolean\n /** When state==='error', the user-facing message extracted from `error`. */\n errorMessage: string | undefined\n}\n\n/**\n * Resolve a 5-state component state from the inputs above.\n *\n * The lazy `isEmpty` callback is invoked only when no higher-priority\n * state matches; this avoids running expensive emptiness checks (e.g.\n * scanning a 10k-row dataset) when the component is in loading/error.\n */\nexport function useComponentState(input: UseComponentStateInput): UseComponentStateResult {\n const { forcedState, loading, error, disabled, isEmpty } = input\n return useMemo(() => {\n if (forcedState) {\n return resolved(forcedState, error)\n }\n if (error) {\n return resolved('error', error)\n }\n if (loading) {\n return resolved('loading')\n }\n if (disabled) {\n return resolved('disabled')\n }\n const empty = typeof isEmpty === 'function' ? isEmpty() : !!isEmpty\n if (empty) {\n return resolved('empty')\n }\n return resolved('default')\n // We intentionally treat `isEmpty` (potentially a fresh function on\n // every render) as a stable dep — the resolution still re-runs\n // every render which is fine for an O(1) lookup. Callers who need\n // strict referential stability can pass a memoized callback.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [forcedState, loading, error, disabled, isEmpty])\n}\n\nfunction resolved(\n state: ComponentState,\n error?: string | Error | null,\n): UseComponentStateResult {\n return {\n state,\n isLoading: state === 'loading',\n isEmpty: state === 'empty',\n isDisabled: state === 'disabled',\n isError: state === 'error',\n errorMessage: error\n ? error instanceof Error\n ? error.message\n : String(error)\n : undefined,\n }\n}\n","/**\n * CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) — SideNav.\n *\n * What this component is\n * ----------------------\n * The \"left rail\" half of the legacy 520-LOC `DashboardLayout` — a list\n * of navigable items rendered vertically along the side of an\n * application shell. Designed to pair with `AppChrome` (top bar) and\n * `SectionRouter` (state-driven section switch); usable standalone\n * for any spec that needs a simple left-rail navigation.\n *\n * Why it's split\n * --------------\n * Phase 3 decision #4 (delete-old + transformer-only with ≥95%\n * automation) requires SideNav as a standalone sibling so the legacy\n * `DashboardLayout` shell can be deleted in commit 6/N (A-06) of this\n * PR. The migrator `legacy.dashboardlayout.split` lands in A-05.\n *\n * State contract\n * --------------\n * Two control modes per design doc §2.2:\n *\n * - **Bound (recommended)**: `selectedPath` is a dotted state path\n * (e.g. `\"currentSection\"` or `\"workspace.activeNav\"`). The active\n * item is `state[selectedPath]` (read via `useStateValue`); clicks\n * write the new id back via `useStateStore().set(...)`. This is\n * how the migrator wires SideNav to SectionRouter so the two stay\n * in sync without a parent coordinator.\n *\n * - **Uncontrolled fallback**: when `selectedPath` is omitted,\n * `defaultSelectedId` seeds local React state. Useful for inline\n * specs that don't need cross-component coordination.\n *\n * Hook safety\n * -----------\n * `useStateValue` / `useStateStore` throw if invoked outside a\n * `StateProvider`. In practice SideNav is always rendered inside the\n * Renderer (which wraps both StateProvider AND ActionProvider — and\n * ActionProvider itself requires StateProvider), so a truly bare\n * SideNav render is unreachable. The try/catch wrappers below still\n * defend against the narrower edge case where the provider tree is\n * present but the state context returns an unexpected runtime shape\n * (DataTable carries the same `useOptionalFilterValue` pattern).\n * They convert any throw into a safe `undefined` / no-op so the\n * component preserves stable hook order across renders.\n *\n * Action contract\n * ---------------\n * Same JETP-083 WS3.7.7 fix as AppChrome: when `onSelect` is provided,\n * clicking an item invokes the ActionProvider handler by name AND\n * emits a generic `'nav:select'` event with the selected payload.\n *\n * Refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/01_dashboard_layout_split.md §2.2 + §2.8.1 + §2.8.3\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #4\n * - sibling pattern: src/components/JsonRender/domain/DataTable.tsx (useOptionalFilterValue)\n */\n\nimport React, { useCallback, useState } from 'react'\nimport { useActions, useStateStore, useStateValue } from '@json-render/react'\nimport { injectStyles } from './injectStyles'\nimport { dotPathToPointer } from './_filterPath'\nimport { Icon } from './primitives/Icon'\n\nconst STYLE_ID = 'jr-styles-side-nav'\n\n// Class names mirror `.jr-dashboard-layout__sidebar*` and\n// `.jr-dashboard-layout__nav-btn*` from the legacy source so themes\n// authored for the old shell can co-exist with the new components\n// during the Phase 3 migration window.\nconst SHEET = `\n.jr-side-nav {\n flex-shrink: 0;\n width: min(220px, 30%);\n padding: var(--jr-spacing, 12px);\n background: var(--jr-surface, #ffffff);\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n overflow-y: auto;\n box-sizing: border-box;\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n}\n.jr-side-nav--collapsed {\n width: min(56px, 18%);\n}\n.jr-side-nav--collapsed .jr-side-nav__label {\n display: none;\n}\n.jr-side-nav__btn {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n text-align: left;\n font: inherit;\n font-size: 0.875rem;\n padding: 0.5rem 0.65rem;\n border: none;\n border-radius: calc(var(--jr-radius, 8px) * 0.75);\n background: transparent;\n color: var(--jr-text, #0f172a);\n cursor: pointer;\n transition: background var(--jr-transition-fast) var(--jr-easing-standard), color var(--jr-transition-fast) var(--jr-easing-standard);\n}\n.jr-side-nav__btn:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n}\n.jr-side-nav__btn--active {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 12%, transparent);\n color: var(--jr-primary, #3b82f6);\n font-weight: 600;\n}\n.jr-side-nav__btn--active:hover {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 18%, transparent);\n}\n/* CWRF-013 Phase 4 Tier 4-3 — Icon primitive + badge slot (see 05_micro_interactions/03). */\n.jr-side-nav__item-icon {\n flex-shrink: 0;\n color: currentColor;\n opacity: 0.75;\n font-size: 1rem;\n width: 1rem;\n height: 1rem;\n}\n.jr-side-nav__btn--active .jr-side-nav__item-icon {\n opacity: 1;\n}\n.jr-side-nav__label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.jr-side-nav__badge {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.5rem;\n height: 1.25rem;\n padding: 0 0.4rem;\n font-size: 0.6875rem;\n font-weight: 600;\n border-radius: 0.625rem;\n background: var(--jr-primary, #3b82f6);\n color: var(--jr-on-primary, #ffffff);\n font-variant-numeric: tabular-nums;\n}\n/* Disabled — visual + cursor + click short-circuit (see render). */\n.jr-side-nav__btn--disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n.jr-side-nav__btn--disabled:hover {\n background: transparent;\n}\n.jr-side-nav__btn--disabled .jr-side-nav__item-icon {\n opacity: 0.55;\n}\n.jr-side-nav__toggle {\n margin-top: auto;\n font: inherit;\n font-size: 0.75rem;\n padding: 0.35rem 0.5rem;\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n border-radius: calc(var(--jr-radius, 8px) * 0.5);\n background: transparent;\n color: var(--jr-text-muted, #64748b);\n cursor: pointer;\n}\n`\n\nexport interface SideNavItem {\n id: string\n label: string\n icon?: string\n // CWRF-013 Phase 4 Tier 4-3: badge supports number too (catalog\n // schema already accepts `union(string, number)`); previously the\n // TypeScript surface narrowed to string only.\n badge?: string | number\n disabled?: boolean\n}\n\nexport interface SideNavProps {\n props: {\n items: SideNavItem[]\n selectedPath?: string\n defaultSelectedId?: string\n collapsible?: boolean\n onSelect?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\n// Hook safety wrappers — same idiom as DataTable's useOptionalFilterValue.\n// `useStateValue` / `useStateStore` hard-throw outside a StateProvider;\n// the try/catch lets SideNav render standalone (e.g. inside unit tests\n// or simple inline demos) without crashing. The only hook each helper\n// internally calls is `useContext` which runs BEFORE the throw, so hook\n// order remains stable across renders regardless of provider presence.\nfunction useOptionalSelectedValue(pointer: string): unknown {\n try {\n return useStateValue<unknown>(pointer)\n } catch {\n return undefined\n }\n}\n\ninterface OptionalStateSet {\n set: (pointer: string, value: unknown) => void\n}\nfunction useOptionalStateSet(): OptionalStateSet {\n try {\n const store = useStateStore()\n return { set: store.set }\n } catch {\n return { set: () => undefined }\n }\n}\n\nexport const SideNav: React.FC<SideNavProps> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const items: SideNavItem[] = Array.isArray(props.items)\n ? props.items.filter((it) => it && typeof it.id === 'string' && typeof it.label === 'string')\n : []\n const selectedPath = typeof props.selectedPath === 'string' ? props.selectedPath : ''\n const defaultSelectedId = typeof props.defaultSelectedId === 'string'\n ? props.defaultSelectedId\n : items[0]?.id ?? ''\n const collapsible = props.collapsible === true\n const onSelect = typeof props.onSelect === 'string' ? props.onSelect : ''\n\n const pointer = dotPathToPointer(selectedPath)\n const boundValue = useOptionalSelectedValue(pointer)\n const { set: stateSet } = useOptionalStateSet()\n const actionExec = useActions()\n\n // Local fallback only used when selectedPath is empty OR no\n // StateProvider is present (boundValue stays undefined forever).\n const [localSelectedId, setLocalSelectedId] = useState<string>(defaultSelectedId)\n\n // Resolve the active id with explicit precedence:\n // 1. bound state value (when selectedPath is wired AND the store\n // currently holds a value for it)\n // 2. local React state (uncontrolled fallback)\n // The string-only narrow guards against arbitrary upstream state\n // shapes — a non-string under the bound path defers to the local\n // fallback rather than crashing the render.\n const activeId: string =\n selectedPath.length > 0 && typeof boundValue === 'string'\n ? boundValue\n : localSelectedId\n\n // Collapse toggle — local-only state, intentionally not bound to the\n // store. The design doc §2.2 marks `collapsible` as a presentational\n // flag, not a coordinated app-wide signal.\n const [collapsed, setCollapsed] = useState<boolean>(false)\n\n const handleSelect = useCallback(\n (item: SideNavItem) => {\n if (selectedPath.length > 0) {\n try {\n stateSet(pointer, item.id)\n } catch (err) {\n console.error('[SideNav] stateSet failed:', err)\n }\n } else {\n setLocalSelectedId(item.id)\n }\n if (onSelect.length > 0) {\n void actionExec\n .execute({ action: onSelect, params: { id: item.id, label: item.label } })\n .catch((err) => console.error('[SideNav] onSelect handler failed:', err))\n }\n emit?.('nav:select', { id: item.id, label: item.label })\n },\n [actionExec, emit, onSelect, pointer, selectedPath, stateSet],\n )\n\n if (items.length === 0) return null\n\n const rootCls = collapsible && collapsed ? 'jr-side-nav jr-side-nav--collapsed' : 'jr-side-nav'\n\n return (\n <aside className={rootCls} aria-label=\"Sidebar navigation\">\n {items.map((item) => {\n const isActive = item.id === activeId\n const isDisabled = item.disabled === true\n // CWRF-013 Phase 4 Tier 4-3 (P4-T05): badge !== '' guard\n // mirrors the design doc — empty string explicitly hides\n // the chip; numeric zero stays visible (semantic counter\n // shouldn't disappear at 0 unless the spec says so).\n const showBadge =\n item.badge !== undefined && item.badge !== null && item.badge !== ''\n // Order preserved across the Phase 4 refactor so existing\n // visual-baseline snapshots (p3-split-a-integration,\n // p3-tier35-cross-visual-baseline) keep matching: base →\n // BEM-modifier(active|disabled) → mixin tokens.\n const cls = [\n 'jr-side-nav__btn',\n isActive ? 'jr-side-nav__btn--active' : '',\n isDisabled ? 'jr-side-nav__btn--disabled' : '',\n 'jr-pressable',\n 'jr-focusable',\n ]\n .filter(Boolean)\n .join(' ')\n return (\n <button\n key={item.id}\n type=\"button\"\n className={cls}\n aria-current={isActive ? 'page' : undefined}\n aria-disabled={isDisabled || undefined}\n disabled={isDisabled}\n onClick={() => {\n if (isDisabled) return\n handleSelect(item)\n }}\n >\n {item.icon ? (\n <Icon name={item.icon} className=\"jr-side-nav__item-icon\" decorative />\n ) : null}\n <span className=\"jr-side-nav__label\">{item.label}</span>\n {showBadge ? <span className=\"jr-side-nav__badge\">{item.badge}</span> : null}\n </button>\n )\n })}\n {collapsible ? (\n <button\n type=\"button\"\n className=\"jr-side-nav__toggle jr-pressable jr-focusable\"\n onClick={() => setCollapsed((c) => !c)}\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n >\n {collapsed ? '▶' : '◀'}\n </button>\n ) : null}\n </aside>\n )\n}\n\nexport default SideNav\n","/**\n * CWRF-013 Phase 3 PR-P3-#1 — shared filterPath path helper.\n *\n * Why this exists\n * ---------------\n * The Phase 3 split components (TableToolbar, ColumnFilter, RowGroup,\n * DataTable) describe their `filterPath` prop in dotted notation:\n *\n * \"tableFilter.status\" \"tf.search\" \"supplierFilter.region\"\n *\n * That mirrors the design doc (`04_overdesign_refactor/03_data_table_modular.md`\n * §2.2 / §2.3 / §2.5) and is the syntax LLM agents naturally produce.\n *\n * The underlying state store from `@json-render/react` (and the underlying\n * `getByPath` / `immutableSetByPath` from `@json-render/core`) however uses\n * RFC-6901 JSON Pointer syntax — `/tableFilter/status` — and treats `.` as a\n * literal character in the segment. Without a translator, calling\n * `set(\"tableFilter.status\", v)` would create a TOP-LEVEL key literally\n * named `\"tableFilter.status\"` rather than nesting under `tableFilter`, and\n * the sibling DataTable that reads `useStateValue(\"tableFilter\")` would\n * never see it.\n *\n * This module provides one tiny pure helper that translates the friendly\n * dotted form into JSON Pointer form before handing the path to the store.\n * Both Phase 3 split-toolbar siblings AND the DataTable consumer must\n * route through this helper for round-trip consistency.\n *\n * Behaviour\n * ---------\n * - empty / non-string input → returns \"\" (matches the \"no path\" idiom).\n * - already-pointer input (\"/tf/search\") → returned unchanged.\n * - dotted input (\"tf.search\") → \"/tf/search\".\n * - single segment (\"tf\") → \"/tf\".\n * - escapes RFC 6901 reserved chars: `~` → `~0`, `/` (in a segment) →\n * `~1`. Practically rare in our specs but covered for safety.\n */\n\nexport function dotPathToPointer(path: unknown): string {\n if (typeof path !== 'string' || path.length === 0) return ''\n if (path.startsWith('/')) return path\n const segments = path.split('.')\n if (segments.length === 0) return ''\n return '/' + segments.map(escapeJsonPointerSegment).join('/')\n}\n\nfunction escapeJsonPointerSegment(seg: string): string {\n return seg.replace(/~/g, '~0').replace(/\\//g, '~1')\n}\n","/**\n * CWRF-013 Phase 3 PR-P3-#3 (Split A · DashboardLayout 拆解) —\n * SectionRouter.\n *\n * What this component is\n * ----------------------\n * The \"section switch half\" of the legacy 520-LOC `DashboardLayout`.\n * Takes a positional `sections[]` declaration and a state-bound\n * `activeIdPath`; renders the SINGLE child whose index corresponds to\n * the section matching the current active id. Pair with `SideNav`\n * pointing at the SAME state path for master-detail navigation.\n *\n * Why it's split\n * --------------\n * Phase 3 decision #4 (delete-old + transformer-only with ≥95%\n * automation) requires SectionRouter as a standalone sibling so the\n * legacy `DashboardLayout` shell can be deleted in commit 6/N (A-06)\n * of this PR. The migrator `legacy.dashboardlayout.split` (A-05)\n * routes the 3 fallback strategies of `buildSectionMapping` (explicit\n * sectionMap / name match / sequential) into the SectionRouter\n * declaration so the new components are drop-in replacements for the\n * legacy shell.\n *\n * Children contract\n * -----------------\n * `slots: ['default']` consumes the element's children in declaration\n * order. The contract is positional:\n *\n * sections[0] ↔ children[0]\n * sections[1] ↔ children[1]\n * ...\n *\n * Only ONE child renders at a time — the one whose `sections[i].id`\n * matches the resolved active id. This matches the design doc §2.3\n * example (`overview_panel` / `details_panel`) and the migrator\n * output (§2.5).\n *\n * Active id resolution (precedence)\n * ---------------------------------\n * 1. `state[activeIdPath]` when it's a string AND matches a\n * section id in `sections[]`.\n * 2. `sections[0].id` (first section) when (1) doesn't resolve.\n *\n * The fallback is intentional — if the state is empty / unset / set\n * to an unknown id, the user sees SOMETHING instead of a blank panel.\n * Mirrors the legacy DashboardLayout behaviour where the first\n * sidebar item was always the default.\n *\n * Hook safety\n * -----------\n * Identical defensive pattern to SideNav (A-02) and DataTable's\n * `useOptionalFilterValue`: `useStateValue` is wrapped in a try/catch\n * so unexpected runtime shapes don't crash the render. In practice\n * SectionRouter always runs inside the Renderer which guarantees a\n * StateProvider, so the wrapper protects edge cases only.\n *\n * Refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/01_dashboard_layout_split.md §2.3 + §2.5\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #4\n * - sibling pattern: src/components/JsonRender/domain/SideNav.tsx (selectedPath ↔ activeIdPath share the same state slot)\n */\n\nimport React, { useMemo } from 'react'\nimport { useStateValue } from '@json-render/react'\nimport { dotPathToPointer } from './_filterPath'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-section-router'\n\n// fade-in + 8px X-slide gives a subtle directional cue without\n// implying a real semantic direction (forward/back). reduced-motion\n// is handled centrally by motionFocusTokens.ts (--jr-transition-base\n// → 0.01ms when prefers-reduced-motion: reduce), so the keyframe\n// duration var collapses automatically — no per-component guard needed.\nconst SHEET = `\n@keyframes jr-section-router-fade-in {\n from { opacity: 0; transform: translateX(8px); }\n to { opacity: 1; transform: translateX(0); }\n}\n.jr-section-router {\n position: relative;\n width: 100%;\n min-width: 0;\n}\n.jr-section-router__panel {\n animation: jr-section-router-fade-in var(--jr-transition-base) var(--jr-easing-emphasize) both;\n}\n`\n\nexport interface SectionRouterSection {\n id: string\n}\n\nexport interface SectionRouterProps {\n props: {\n sections: SectionRouterSection[]\n activeIdPath: string\n }\n children?: React.ReactNode\n}\n\nfunction useOptionalActiveValue(pointer: string): unknown {\n try {\n return useStateValue<unknown>(pointer)\n } catch {\n return undefined\n }\n}\n\nexport const SectionRouter: React.FC<SectionRouterProps> = ({ props, children }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const sections: SectionRouterSection[] = useMemo(\n () =>\n Array.isArray(props.sections)\n ? props.sections.filter(\n (s): s is SectionRouterSection =>\n s !== null && typeof s === 'object' && typeof (s as { id?: unknown }).id === 'string',\n )\n : [],\n [props.sections],\n )\n\n const activeIdPath = typeof props.activeIdPath === 'string' ? props.activeIdPath : ''\n const rawActive = useOptionalActiveValue(dotPathToPointer(activeIdPath))\n\n const activeIdx = useMemo(() => {\n if (sections.length === 0) return -1\n if (typeof rawActive === 'string') {\n const hit = sections.findIndex((s) => s.id === rawActive)\n if (hit >= 0) return hit\n }\n return 0\n }, [rawActive, sections])\n\n if (sections.length === 0) return null\n\n // Positional children — sections[i] ↔ children[i]. Wrapping in\n // `Children.toArray` normalises Fragment / null entries so the\n // index alignment stays sane even if a parent inlined a fragment.\n const arr = React.Children.toArray(children)\n const target = arr[activeIdx]\n\n // `data-jr-section` mirrors the legacy DashboardLayout markup so\n // dev-tools / userland selectors (e.g. for smooth-scroll) keep\n // working after migration. The container is intentionally semantic-\n // neutral; downstream sections own their own headings.\n //\n // Phase 4 Tier 4-1 (CWRF-013): the inner `__panel` wrapper carries\n // `key={activeId}` so React unmount/remount re-triggers the fade-\n // slide animation on every section switch. `role=\"region\"` +\n // `aria-live=\"polite\"` announces the change to screen readers\n // (matches AC-MIC-002). The outer container stays unstyled-flow so\n // surrounding chrome (KPICluster strips, AppChrome footer) keep\n // their normal layout.\n const activeId = sections[activeIdx]?.id ?? ''\n return (\n <div\n className=\"jr-section-router\"\n data-jr-section={activeId}\n role=\"region\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n >\n <div\n key={activeId}\n className=\"jr-section-router__panel\"\n data-section-id={activeId}\n >\n {target ?? null}\n </div>\n </div>\n )\n}\n\nexport default SectionRouter\n","import React, { useCallback } from 'react'\n\nconst STYLE_ID = 'jr-styles-kpi-card'\n\nconst SHEET = `\n@keyframes jr-kpi-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-kpi-card {\n box-sizing: border-box;\n padding: calc(var(--jr-spacing, 12px) * 1.25);\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n min-width: 0;\n max-width: 100%;\n animation: jr-kpi-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n transition: transform var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n cursor: pointer;\n}\n.jr-kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--jr-text, #000) 10%, transparent);\n}\n.jr-kpi-card--sm {\n padding: var(--jr-spacing, 12px);\n}\n.jr-kpi-card--sm .jr-kpi-card__value {\n font-size: 1.125rem;\n}\n.jr-kpi-card--lg .jr-kpi-card__value {\n font-size: 1.75rem;\n}\n.jr-kpi-card--lg {\n padding: calc(var(--jr-spacing, 10px) * 1.25);\n}\n.jr-kpi-card--compact {\n padding: var(--jr-spacing, 12px);\n}\n.jr-kpi-card--emphasis {\n border-color: color-mix(in srgb, var(--jr-primary, #3b82f6) 35%, transparent);\n box-shadow: 0 1px 2px color-mix(in srgb, var(--jr-primary, #3b82f6) 12%, transparent);\n}\n.jr-kpi-card__label {\n margin: 0 0 0.35rem;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-kpi-card__row {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: 0.35rem 0.5rem;\n}\n.jr-kpi-card__value {\n margin: 0;\n font-size: 1.375rem;\n font-weight: 700;\n line-height: 1.1;\n font-variant-numeric: tabular-nums;\n}\n.jr-kpi-card__unit {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-kpi-card__trend {\n display: inline-flex;\n align-items: center;\n gap: 0.2rem;\n font-size: 0.8125rem;\n font-weight: 600;\n margin-left: auto;\n}\n.jr-kpi-card__trend--up { color: var(--jr-success, #22c55e); }\n.jr-kpi-card__trend--down { color: var(--jr-danger, #ef4444); }\n.jr-kpi-card__trend--flat { color: var(--jr-text-muted, #94a3b8); }\n.jr-kpi-card__delta {\n font-variant-numeric: tabular-nums;\n margin-left: 0.15rem;\n}\n.jr-kpi-card__spark {\n display: block;\n width: 100%;\n height: 28px;\n margin-top: 0.5rem;\n}\n.jr-kpi-card__spark polyline {\n fill: none;\n stroke: var(--jr-primary, #3b82f6);\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n.jr-kpi-card--scheme-success { border-left: 3px solid var(--jr-success, #22c55e); }\n.jr-kpi-card--scheme-warning { border-left: 3px solid var(--jr-warning, #eab308); }\n.jr-kpi-card--scheme-danger { border-left: 3px solid var(--jr-danger, #ef4444); }\n.jr-kpi-card--scheme-primary { border-left: 3px solid var(--jr-primary, #3b82f6); }\n.jr-kpi-card--scheme-blue { border-left: 3px solid var(--jr-primary, #3b82f6); }\n.jr-kpi-card--scheme-green { border-left: 3px solid var(--jr-success, #22c55e); }\n.jr-kpi-card--scheme-red { border-left: 3px solid var(--jr-danger, #ef4444); }\n.jr-kpi-card--scheme-amber { border-left: 3px solid var(--jr-warning, #eab308); }\n.jr-kpi-card--scheme-gray { border-left: 3px solid var(--jr-text-muted, #94a3b8); }\n.jr-kpi-card--scheme-purple { border-left: 3px solid #a855f7; }\n.jr-kpi-card--success {\n border-left: 3px solid var(--jr-success, #22c55e);\n}\n.jr-kpi-card--warning {\n border-left: 3px solid var(--jr-warning, #eab308);\n}\n.jr-kpi-card--critical {\n border-color: color-mix(in srgb, var(--jr-danger, #ef4444) 35%, transparent);\n border-left: 3px solid var(--jr-danger, #ef4444);\n}\n.jr-kpi-card--info {\n border-color: color-mix(in srgb, var(--jr-primary, #3b82f6) 28%, transparent);\n border-left: 3px solid var(--jr-primary, #3b82f6);\n}\n.jr-kpi-card__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n/* CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-008) — variant icon for color\n * dual-encoding. Each variant pairs the existing border-color with a\n * lucide icon so users in color-blind / forced-colors mode can still\n * distinguish success / warning / critical / info.\n */\n.jr-kpi-card__variant-icon {\n display: inline-flex;\n align-items: center;\n width: 1rem;\n height: 1rem;\n margin-right: 0.35rem;\n vertical-align: -2px;\n flex-shrink: 0;\n}\n.jr-kpi-card--success .jr-kpi-card__variant-icon { color: var(--jr-success, #22c55e); }\n.jr-kpi-card--warning .jr-kpi-card__variant-icon { color: var(--jr-warning, #eab308); }\n.jr-kpi-card--critical .jr-kpi-card__variant-icon { color: var(--jr-danger, #ef4444); }\n.jr-kpi-card--info .jr-kpi-card__variant-icon { color: var(--jr-primary, #3b82f6); }\n.jr-kpi-card__label-with-icon {\n display: inline-flex;\n align-items: center;\n}\n`\n\nimport { injectStyles } from './injectStyles'\nimport { Icon } from './primitives/Icon'\n\n/**\n * CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-008): map KPICard variant →\n * lucide icon name. Provides the SECOND visual channel (shape) on top\n * of the EXISTING color channel (border-left) so color-blind users\n * and forced-colors mode still distinguish status. `default` variant\n * has no status meaning and therefore no icon.\n */\nconst VARIANT_ICON: Record<string, string | undefined> = {\n default: undefined,\n success: 'check-circle',\n warning: 'alert-triangle',\n critical: 'alert-octagon',\n info: 'info',\n}\n\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number' && !Number.isNaN(value)) return value\n if (typeof value === 'string') {\n const n = parseFloat(value.replace(/[^0-9.-]/g, ''))\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\nfunction sparklinePoints(values: number[]): string {\n if (values.length === 0) return ''\n const min = Math.min(...values)\n const max = Math.max(...values)\n const span = max - min || 1\n const w = 100\n const h = 24\n const pad = 2\n return values\n .map((v, i) => {\n const x = pad + (i / Math.max(1, values.length - 1)) * (w - pad * 2)\n const y = h - pad - ((v - min) / span) * (h - pad * 2)\n return `${x.toFixed(2)},${y.toFixed(2)}`\n })\n .join(' ')\n}\n\nexport interface KPICardProps {\n props: {\n value: number | string\n label: string\n unit?: string\n trend?: 'up' | 'down' | 'flat'\n delta?: number\n thresholds?: { warning: number; critical: number }\n sparkData?: number[]\n variant?: 'default' | 'success' | 'warning' | 'critical' | 'info'\n colorScheme?: 'blue' | 'green' | 'red' | 'amber' | 'gray' | 'purple'\n size?: 'sm' | 'md' | 'lg'\n className?: string | null\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const KPICard: React.FC<KPICardProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const variant = props.variant ?? 'default'\n const scheme = props.colorScheme ?? ''\n const numeric = parseNumeric(props.value)\n\n let valueColor: string | undefined\n if (numeric != null && props.thresholds?.critical != null && numeric >= props.thresholds.critical) {\n valueColor = 'var(--jr-danger, #ef4444)'\n } else if (numeric != null && props.thresholds?.warning != null && numeric >= props.thresholds.warning) {\n valueColor = 'var(--jr-warning, #ca8a04)'\n }\n\n const size = props.size\n const sizeClass = size && size !== 'md' ? `jr-kpi-card--${size}` : ''\n\n const rootClass = [\n 'jr-kpi-card',\n 'jr-pressable',\n 'jr-focusable',\n sizeClass,\n variant && variant !== 'default' ? `jr-kpi-card--${variant}` : '',\n scheme ? `jr-kpi-card--scheme-${scheme}` : '',\n props.className?.trim() ? props.className.trim() : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n const trend = props.trend\n const trendIcon =\n trend === 'up' ? '▲' : trend === 'down' ? '▼' : trend === 'flat' ? '■' : null\n\n const displayValue =\n props.value === '' || props.value == null\n ? '—'\n : String(props.value)\n\n const spark = props.sparkData\n const sparkPoly = spark && spark.length > 0 ? sparklinePoints(spark) : ''\n\n const handleClick = useCallback(() => {\n emit?.('kpi:click', { label: props.label, value: props.value, unit: props.unit, trend: props.trend })\n }, [emit, props.label, props.value, props.unit, props.trend])\n\n // CWRF-013 Phase 5 Tier 5-3 (AC-A11Y-003): KPICard root is\n // cursor:pointer + click-dispatching; therefore it MUST expose\n // role=\"button\" + tabIndex=0 + Enter/Space → click parity, so\n // keyboard users can fire the same kpi:click event as mouse users.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n },\n [handleClick],\n )\n\n const variantIconName = VARIANT_ICON[variant]\n\n return (\n <div\n className={rootClass}\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-label={`${props.label || 'Metric'}: ${props.value ?? '—'}${props.unit ? ' ' + props.unit : ''}`}\n >\n <p className=\"jr-kpi-card__label\">\n {variantIconName ? (\n <Icon\n name={variantIconName}\n className=\"jr-kpi-card__variant-icon\"\n decorative\n />\n ) : null}\n {props.label || 'Metric'}\n </p>\n <div className=\"jr-kpi-card__row\">\n <p className=\"jr-kpi-card__value\" style={valueColor ? { color: valueColor } : undefined}>\n {displayValue}\n </p>\n {props.unit ? <span className=\"jr-kpi-card__unit\">{props.unit}</span> : null}\n {trend && trendIcon ? (\n <span className={`jr-kpi-card__trend jr-kpi-card__trend--${trend}`}>\n <span aria-hidden>{trendIcon}</span>\n {props.delta != null ? (\n <span className=\"jr-kpi-card__delta\">{props.delta > 0 ? '+' : ''}{props.delta}</span>\n ) : null}\n <span className=\"jr-kpi-card__sr-only\">{trend}</span>\n </span>\n ) : props.delta != null ? (\n <span className=\"jr-kpi-card__trend jr-kpi-card__trend--flat\">\n <span className=\"jr-kpi-card__delta\">{props.delta > 0 ? '+' : ''}{props.delta}</span>\n </span>\n ) : null}\n </div>\n {sparkPoly ? (\n <svg className=\"jr-kpi-card__spark\" viewBox=\"0 0 100 24\" preserveAspectRatio=\"none\" aria-hidden>\n <polyline points={sparkPoly} />\n </svg>\n ) : null}\n {children}\n </div>\n )\n}\n\nexport default KPICard\n","/**\n * CWRF-013 Phase 4 P3-T05 (Tier 3-2) — KPICluster container component.\n *\n * Spec: docs/proposals/CWRF-013-a2ui-systematic-upgrade/05_ui_polish/\n * 04_compact_patterns/02_kpi_cluster.md §2.1\n * ACs : AC-CMP-005 (container basics + strip child override)\n * AC-CMP-006 (columns='auto' responsive auto-fit grid)\n *\n * Purpose:\n * Composes 2-4 KPICard tiles into a horizontal grid strip. This is the\n * single canonical container — LLM specs MUST NOT use `Row + N × KPICard`\n * directly because Row has no built-in gap and no responsive collapse.\n *\n * Variants:\n * - default — normal KPICard styling pass-through (hover lift kept)\n * - strip — flat horizontal layout for review-summary surfaces (used by\n * approval / 审核摘要 cards); child KPICard padding is\n * reduced and hover lift / shadow are flattened so the row\n * does not vertically jitter when one tile is hovered.\n *\n * Adaptive contract (CWRF-013 Slice G alignment):\n * - columns='auto' uses auto-fit minmax(8rem, 1fr) so the grid collapses\n * gracefully on narrow chat-widget containers.\n * - Fixed columns 3/4 collapse to 2 columns under 480px via the global\n * @container jr-card breakpoint (declared in the SHEET below).\n */\nimport React from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-kpi-cluster'\n\nconst SHEET = `\n.jr-kpi-cluster {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));\n gap: calc(var(--jr-spacing, 12px) * 1.0);\n width: 100%;\n min-width: 0;\n}\n.jr-kpi-cluster--columns-2 { grid-template-columns: repeat(2, 1fr); }\n.jr-kpi-cluster--columns-3 { grid-template-columns: repeat(3, 1fr); }\n.jr-kpi-cluster--columns-4 { grid-template-columns: repeat(4, 1fr); }\n\n/* CWRF-013 切片 G L1 — adaptive collapse under narrow containers\n * (jr-card container query is declared at the JsonRenderCard root). */\n@container jr-card (max-width: 480px) {\n .jr-kpi-cluster--columns-3,\n .jr-kpi-cluster--columns-4 {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n/* Forced 1-column collapse on the smallest containers so KPI labels never\n * truncate next to the value. */\n@container jr-card (max-width: 320px) {\n .jr-kpi-cluster--columns-2,\n .jr-kpi-cluster--columns-3,\n .jr-kpi-cluster--columns-4 {\n grid-template-columns: 1fr;\n }\n}\n\n/* === Strip variant: flatten child KPICard so a 3-tile row does not jitter\n * when one tile is hovered (no lift, soft shadow). === */\n.jr-kpi-cluster--strip .jr-kpi-card {\n padding: calc(var(--jr-spacing, 12px) * 0.85) calc(var(--jr-spacing, 12px) * 1.0);\n}\n.jr-kpi-cluster--strip .jr-kpi-card:hover {\n transform: none;\n box-shadow: 0 1px 3px color-mix(in srgb, var(--jr-text, #000) 6%, transparent);\n}\n.jr-kpi-cluster--strip .jr-kpi-card__label {\n font-size: 0.6875rem;\n margin-bottom: 0.2rem;\n}\n.jr-kpi-cluster--strip .jr-kpi-card__value {\n font-size: 1.125rem;\n}\n`\n\nexport type KPIClusterColumns = 2 | 3 | 4 | 'auto'\nexport type KPIClusterVariant = 'default' | 'strip'\n\nexport interface KPIClusterProps {\n props: {\n columns?: KPIClusterColumns\n variant?: KPIClusterVariant\n }\n children?: React.ReactNode\n}\n\nexport const KPICluster: React.FC<KPIClusterProps> = ({ props, children }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const rawProps = props ?? ({} as KPIClusterProps['props'])\n const columns: KPIClusterColumns = rawProps.columns ?? 'auto'\n const variant: KPIClusterVariant = rawProps.variant === 'strip' ? 'strip' : 'default'\n\n const className = [\n 'jr-kpi-cluster',\n `jr-kpi-cluster--${variant}`,\n columns !== 'auto' ? `jr-kpi-cluster--columns-${columns}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return <div className={className}>{children}</div>\n}\n\nexport default KPICluster\n","import React, { useMemo, useState } from 'react'\nimport { useStateValue } from '@json-render/react'\nimport { injectStyles } from './injectStyles'\nimport { dotPathToPointer } from './_filterPath'\nimport { useComponentState } from './primitives/useComponentState'\nimport { StateView } from './primitives/StateView'\n\n// CWRF-013 Phase 3 PR-P3-#1 — DataTable is normally rendered inside\n// JsonRender (which always wraps a StateProvider), but P0 smoke tests and a\n// few unit tests render DataTable in isolation without any provider. The\n// upstream `useStateValue` hard-throws outside a StateProvider; this wrapper\n// converts that into a safe `undefined` so the component preserves its\n// pre-CWRF-013 standalone-render contract.\n//\n// Hook safety: the only hook inside `useStateValue` is `useContext`, which\n// runs *before* the throw. Hook order therefore stays stable across renders\n// regardless of which branch the try/catch takes.\nfunction useOptionalFilterValue(path: string): unknown {\n try {\n return useStateValue<unknown>(path)\n } catch {\n return undefined\n }\n}\n\nconst STYLE_ID = 'jr-styles-data-table'\n\nconst SHEET = `\n@keyframes jr-data-table-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-data-table-wrap {\n width: 100%;\n overflow-x: auto;\n border-radius: var(--jr-radius, 8px);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n background: var(--jr-surface, #ffffff);\n font-family: var(--jr-font, system-ui, sans-serif);\n}\n.jr-data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n color: var(--jr-text, #0f172a);\n animation: jr-data-table-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-data-table tbody tr {\n transition: background-color var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-data-table tbody tr:hover td {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 7%, var(--jr-surface, #ffffff));\n}\n.jr-data-table th,\n.jr-data-table td {\n padding: 0.65rem 0.85rem;\n text-align: left;\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n vertical-align: middle;\n}\n.jr-data-table tr:last-child td {\n border-bottom: none;\n}\n.jr-data-table th {\n font-weight: 600;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--jr-text-muted, #64748b);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 85%, var(--jr-surface, #fff));\n}\n.jr-data-table__th--sortable {\n cursor: pointer;\n user-select: none;\n}\n.jr-data-table__th--sortable:hover {\n color: var(--jr-primary, #3b82f6);\n}\n.jr-data-table__sort-hint {\n margin-left: 0.25rem;\n opacity: 0.5;\n font-weight: 400;\n}\n.jr-data-table--striped tbody tr:nth-child(even) {\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 55%, transparent);\n}\n.jr-data-table--compact th,\n.jr-data-table--compact td {\n padding: 0.4rem 0.55rem;\n font-size: 0.8125rem;\n}\n.jr-data-table__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #94a3b8);\n font-size: 0.875rem;\n}\n.jr-data-table__badge {\n display: inline-block;\n padding: 0.15rem 0.45rem;\n border-radius: 999px;\n font-size: 0.75rem;\n font-weight: 600;\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 14%, transparent);\n color: var(--jr-primary, #2563eb);\n}\n.jr-data-table__progress {\n position: relative;\n height: 6px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 18%, transparent);\n max-width: 120px;\n}\n.jr-data-table__progress-fill {\n height: 100%;\n border-radius: 999px;\n background: var(--jr-primary, #3b82f6);\n}\n`\n\nfunction cellString(value: unknown): string {\n if (value == null) return ''\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n }\n return String(value)\n}\n\nexport type DataTableColumnType = 'text' | 'number' | 'badge' | 'progress' | 'actions'\n\nexport interface DataTableProps {\n props: {\n columns: {\n key: string\n label: string\n sortable?: boolean\n /**\n * CWRF-013 Phase 0 (Item 01): catalog still declares `column.filterable`\n * so Agents can express intent, but the UI is not rendered yet. Phase 3\n * `ColumnFilter` will honour the flag. The spec migrator currently\n * preserves the field and only flags it under dry-run. See\n * `docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/01_data_table_filterable.md`.\n */\n filterable?: boolean\n type?: DataTableColumnType\n width?: string | number\n prefix?: string\n suffix?: string\n }[]\n data: Record<string, unknown>[]\n sortable?: boolean\n pageSize?: number\n emptyMessage?: string\n variant?: string\n /**\n * CWRF-013 Phase 3 PR-P3-#1 (Split C · DataTable modular).\n *\n * Shared state path consumed for sibling-of-DataTable filtering.\n * Sibling TableToolbar.filterPath / ColumnFilter.filterPath write to\n * the same root (or sub-paths under it). DataTable reads via\n * useStateValue and filters data accordingly:\n *\n * - string value → fuzzy case-insensitive `includes` across every\n * column's stringified value (TableToolbar searchable case).\n * - object value → per-column exact match where each key matches a\n * column key. Value can be string (exact) or string[] (any-of).\n * Empty / undefined values are skipped (no filter for that key).\n * - null / undefined / empty string → no filter applied.\n *\n * Combined with Phase 0 transformer (`legacy.datatable.phantom-props`)\n * that strips deprecated top-level `filterable / groupBy / expandable`\n * props, this is the single canonical filter pathway. Decision #4 in\n * kickoff §2.4 (delete-old + transformer-only) lands fully in commit\n * 5/6 of this PR; this commit (#4) provides the read-side runtime.\n */\n filterPath?: string\n // CWRF-013 Phase 4 Tier 4-4 Batch A — five-state slots (loading / error).\n // Catalog declared these (zod schema in catalog.ts), but the TS Props\n // interface lagged behind. Synced in Tier 4-4 Batch C closeout so the\n // useComponentState({ loading, error }) usage below typechecks.\n loading?: boolean\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\n/**\n * Apply a filter value to a row set. Pure helper — exposed via the data-\n * filter test path; the React component closes over the same routine.\n */\nexport function applyDataTableFilter(\n data: Record<string, unknown>[],\n filter: unknown,\n): Record<string, unknown>[] {\n if (filter == null) return data\n if (typeof filter === 'string') {\n const q = filter.trim().toLowerCase()\n if (q.length === 0) return data\n return data.filter((row) =>\n Object.values(row).some((v) => cellString(v).toLowerCase().includes(q)),\n )\n }\n if (typeof filter === 'object') {\n const entries = Object.entries(filter as Record<string, unknown>)\n if (entries.length === 0) return data\n return data.filter((row) =>\n entries.every(([key, want]) => {\n if (want == null) return true\n if (typeof want === 'string') {\n if (want.length === 0) return true\n // If the key matches a column on this row → exact (case-insensitive)\n // match. If the key is *not* a row column (typically 'search', 'q',\n // 'query' written by TableToolbar.searchable into a sub-path) →\n // fuzzy contains across every cell on the row.\n if (key in row) {\n return cellString(row[key]).toLowerCase() === want.toLowerCase()\n }\n const q = want.toLowerCase()\n return Object.values(row).some((v) => cellString(v).toLowerCase().includes(q))\n }\n if (Array.isArray(want)) {\n if (want.length === 0) return true\n const cell = cellString(row[key])\n return want.some((opt) => cellString(opt).toLowerCase() === cell.toLowerCase())\n }\n return true\n }),\n )\n }\n return data\n}\n\nfunction columnSortEnabled(\n col: { sortable?: boolean },\n tableSortable: boolean\n): boolean {\n if (col.sortable === true) return true\n if (col.sortable === false) return false\n return tableSortable\n}\n\nfunction renderCell(\n row: Record<string, unknown>,\n col: DataTableProps['props']['columns'][number]\n): React.ReactNode {\n const raw = row[col.key]\n const t = col.type ?? 'text'\n\n if (t === 'badge') {\n return <span className=\"jr-data-table__badge\">{cellString(raw)}</span>\n }\n\n if (t === 'progress') {\n const n = typeof raw === 'number' ? raw : parseFloat(String(raw))\n const pct = Number.isFinite(n) ? Math.max(0, Math.min(100, n)) : 0\n return (\n <div className=\"jr-data-table__progress\" title={`${pct}%`}>\n <div className=\"jr-data-table__progress-fill\" style={{ width: `${pct}%` }} />\n </div>\n )\n }\n\n if (t === 'actions') {\n return cellString(raw)\n }\n\n const text = cellString(raw)\n if (col.prefix || col.suffix) {\n return `${col.prefix ?? ''}${text}${col.suffix ?? ''}`\n }\n return text\n}\n\nexport const DataTable: React.FC<DataTableProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const rawColumns = props.columns\n const rawData = props.data\n const columns = Array.isArray(rawColumns) ? rawColumns : []\n const data = Array.isArray(rawData) ? rawData : []\n\n // CWRF-013 Phase 4 Tier 4-4 (P4-T10): loading + error state opt-in.\n // We treat empty as \"inline\" (the existing emptyMessage <td> already\n // owns that affordance — replacing it with StateView would break\n // visual baselines + remove the column-aware colSpan), so only\n // loading/error short-circuit to a StateView wrapper. Default state\n // falls through to the existing table render below.\n const loadingProp = props.loading === true\n const errorProp =\n typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined\n const cstate = useComponentState({\n loading: loadingProp,\n error: errorProp,\n // isEmpty stays inline (see comment above) — we never resolve to\n // 'empty' from the hook, the in-table <td> handles it.\n })\n\n // CWRF-013 Phase 3 PR-P3-#1 — read shared filter via filterPath. Hook\n // call must be unconditional; passing an empty string makes\n // useStateValue return undefined which evaluates to \"no filter\".\n const filterPath = typeof props.filterPath === 'string' ? props.filterPath : ''\n const rawFilter = useOptionalFilterValue(dotPathToPointer(filterPath))\n const filterValue = filterPath.length > 0 ? rawFilter : undefined\n\n if (columns.length === 0 && !Array.isArray(rawColumns)) return null\n const sortable = Boolean(props.sortable)\n const variant = props.variant ?? 'default'\n const emptyMsg = props.emptyMessage ?? 'No data'\n const pageSize =\n typeof props.pageSize === 'number' && props.pageSize > 0 ? props.pageSize : undefined\n\n const [sortKey, setSortKey] = useState<string | null>(null)\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc')\n\n const filteredData = useMemo(\n () => applyDataTableFilter(data, filterValue),\n [data, filterValue],\n )\n\n const sortedData = useMemo(() => {\n if (!sortKey) return filteredData\n const col = columns.find((c) => c.key === sortKey)\n if (!col || !columnSortEnabled(col, sortable)) return filteredData\n const next = [...filteredData]\n next.sort((a, b) => {\n const av = a[sortKey]\n const bv = b[sortKey]\n if (av === bv) return 0\n if (av == null) return 1\n if (bv == null) return -1\n if (typeof av === 'number' && typeof bv === 'number') {\n return sortDir === 'asc' ? av - bv : bv - av\n }\n const as = cellString(av)\n const bs = cellString(bv)\n return sortDir === 'asc' ? as.localeCompare(bs) : bs.localeCompare(as)\n })\n return next\n }, [filteredData, sortKey, sortDir, sortable, columns])\n\n const visibleRows = useMemo(() => {\n if (pageSize == null) return sortedData\n return sortedData.slice(0, pageSize)\n }, [sortedData, pageSize])\n\n const tableClass = [\n 'jr-data-table',\n variant && variant !== 'default' ? `jr-data-table--${variant}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n const onHeaderClick = (key: string) => {\n const col = columns.find((c) => c.key === key)\n if (!col || !columnSortEnabled(col, sortable)) return\n const same = sortKey === key\n const nextDir: 'asc' | 'desc' = same ? (sortDir === 'asc' ? 'desc' : 'asc') : 'asc'\n setSortKey(key)\n setSortDir(nextDir)\n emit?.('table:sort', { key, direction: nextDir })\n }\n\n // Phase 4 Tier 4-4: short-circuit branches for loading / error.\n // Wrap StateView in `.jr-data-table-wrap` so themed surrounding\n // chrome (border / background / radius) stays consistent with the\n // default table render.\n if (cstate.isLoading) {\n return (\n <div className=\"jr-data-table-wrap\" data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n if (cstate.isError) {\n return (\n <div className=\"jr-data-table-wrap\" data-state=\"error\">\n <StateView kind=\"error\" description={cstate.errorMessage} />\n {children}\n </div>\n )\n }\n\n return (\n <div className=\"jr-data-table-wrap\">\n <table className={tableClass}>\n <thead>\n <tr>\n {columns.map((col) => {\n const w = col.width != null\n ? (typeof col.width === 'number' ? `${col.width}px` : col.width)\n : undefined\n const thStyle: React.CSSProperties | undefined = w\n ? { width: w, maxWidth: w }\n : undefined\n const isActive = sortKey === col.key\n const headerSortable = columnSortEnabled(col, sortable)\n return (\n <th\n key={col.key}\n className={headerSortable ? 'jr-data-table__th--sortable jr-pressable jr-focusable' : undefined}\n style={thStyle}\n scope=\"col\"\n onClick={() => onHeaderClick(col.key)}\n onKeyDown={(e) => {\n if (headerSortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n onHeaderClick(col.key)\n }\n }}\n tabIndex={headerSortable ? 0 : undefined}\n role={headerSortable ? 'button' : undefined}\n >\n {col.label || col.key}\n {headerSortable ? (\n <span className=\"jr-data-table__sort-hint\" aria-hidden>\n {isActive ? (sortDir === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n ) : null}\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {visibleRows.length === 0 ? (\n <tr>\n <td colSpan={Math.max(1, columns.length)} className=\"jr-data-table__empty\">\n {emptyMsg}\n </td>\n </tr>\n ) : (\n visibleRows.map((row, ri) => {\n const rk =\n typeof row.id === 'string' || typeof row.id === 'number'\n ? String(row.id)\n : `row-${ri}`\n return (\n <tr key={rk}>\n {columns.map((col) => (\n <td key={col.key}>{renderCell(row, col)}</td>\n ))}\n </tr>\n )\n })\n )}\n </tbody>\n </table>\n {children}\n </div>\n )\n}\n\nexport default DataTable\n","import React, { useCallback } from 'react'\nimport { useActions, useStateStore } from '@json-render/react'\nimport { injectStyles } from './injectStyles'\nimport { Button } from './primitives/Button'\nimport { dotPathToPointer } from './_filterPath'\n\nconst STYLE_ID = 'jr-styles-table-toolbar'\n\nconst SHEET = `\n.jr-table-toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.5rem 0.85rem;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n font-size: 0.875rem;\n}\n.jr-table-toolbar__left {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.75rem;\n flex: 1 1 auto;\n min-width: 0;\n}\n.jr-table-toolbar__title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--jr-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n}\n.jr-table-toolbar__search {\n flex: 0 1 280px;\n min-width: 120px;\n padding: 0.4rem 0.65rem;\n border-radius: var(--jr-radius, 6px);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n background: var(--jr-bg, #f8fafc);\n color: var(--jr-text, #0f172a);\n font: inherit;\n outline: none;\n transition: border-color var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n}\n/* CWRF-013 Phase 5 Tier 5-2: :focus-visible handled by .jr-focusable-input\n * mixin in motionFocusTokens.ts (ring pattern wired to --jr-focus-ring-* tokens). */\n.jr-table-toolbar__actions {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n flex-shrink: 0;\n}\n\n/* CWRF-013 Phase 4 切片 G L1 — toolbar actions adapt to container width.\n Narrow containers stack toolbar buttons vertically + stretch. */\n@container jr-card (max-width: 480px) {\n .jr-table-toolbar__actions {\n flex-direction: column;\n align-items: stretch;\n width: 100%;\n }\n .jr-table-toolbar__actions > .jr-button,\n .jr-table-toolbar__actions > button {\n width: 100%;\n }\n /* Allow the title+search row to also break to a new line cleanly */\n .jr-table-toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n}\n/* .jr-table-toolbar__btn* — migrated to Button primitive in CWRF-013\n Phase 4 P2-T09 (W2.2). Visual + a11y now delegated to\n primitives/Button.tsx. */\n`\n\nexport interface TableToolbarProps {\n props: {\n title?: string\n searchable?: boolean\n filterPath?: string\n actions?: Array<{\n label: string\n action: string\n icon?: string\n }>\n placeholder?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\n/**\n * CWRF-013 Phase 3 PR-P3-#1 — TableToolbar (sibling of DataTable).\n *\n * Top-of-table cluster: title + optional search input + right-aligned action\n * buttons. The search input writes its value to the shared `filterPath` so\n * sibling DataTable / ColumnFilter components can read the filter state.\n *\n * Action buttons self-dispatch via `useActions().execute({action, params})`\n * (same pattern as FormSection submitAction + DashboardLayout topBar.actions);\n * a parallel `emit('action', {...})` keeps spec-level `on:` listeners working.\n *\n * Search field self-dispatches via `useStateStore().set(filterPath, query)`;\n * a parallel `emit('search:change', { query })` keeps spec-level listeners\n * working. Input is uncontrolled (defaultValue empty) — sibling DataTable\n * reads via filterPath, the toolbar does not need to mirror it locally.\n *\n * Renderer contract: must be mounted under JSONUIProvider → StateProvider\n * + ActionProvider (matches established chat-widget chain in standalone.tsx).\n *\n * Design refs:\n * - 04_overdesign_refactor/03_data_table_modular.md §2.2\n * - 04_overdesign_refactor/06_phase3_kickoff_checklist.md §2.1 (decision #1)\n */\nexport const TableToolbar: React.FC<TableToolbarProps> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const title = typeof props.title === 'string' ? props.title : undefined\n const searchable = props.searchable === true\n const filterPath = typeof props.filterPath === 'string' && props.filterPath.length > 0\n ? props.filterPath\n : undefined\n const placeholder = typeof props.placeholder === 'string' ? props.placeholder : 'Search…'\n const actions = Array.isArray(props.actions) ? props.actions : []\n\n const { set: stateSet } = useStateStore()\n const actionExec = useActions()\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value\n if (filterPath) {\n try {\n stateSet(dotPathToPointer(filterPath), query)\n } catch (err) {\n console.error('[TableToolbar] stateSet failed:', err)\n }\n }\n emit?.('search:change', { query, filterPath })\n },\n [filterPath, stateSet, emit],\n )\n\n const handleActionClick = useCallback(\n (action: { label: string; action: string }) => {\n void actionExec\n .execute({ action: action.action, params: { label: action.label, action: action.action } })\n .catch((err) => {\n console.error('[TableToolbar] action failed:', err)\n })\n emit?.('action', { action: action.action, label: action.label })\n },\n [actionExec, emit],\n )\n\n if (title == null && !searchable && actions.length === 0) {\n return null\n }\n\n return (\n <div className=\"jr-table-toolbar\" role=\"toolbar\" aria-label={title ?? 'Table toolbar'}>\n <div className=\"jr-table-toolbar__left\">\n {title != null ? <h2 className=\"jr-table-toolbar__title\">{title}</h2> : null}\n {searchable ? (\n <input\n type=\"search\"\n className=\"jr-table-toolbar__search jr-focusable-input\"\n placeholder={placeholder}\n aria-label={`Search ${title ?? 'table'}`}\n onChange={handleSearchChange}\n />\n ) : null}\n </div>\n {actions.length > 0 ? (\n <div className=\"jr-table-toolbar__actions\">\n {actions.map((a, i) => (\n <Button\n key={`${a.action}-${i}`}\n label={a.label}\n variant=\"secondary\"\n size=\"sm\"\n icon={a.icon}\n onClick={() => handleActionClick(a)}\n />\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default TableToolbar\n","import React, { useCallback, useMemo, useState } from 'react'\nimport { useStateStore } from '@json-render/react'\nimport { injectStyles } from './injectStyles'\nimport { dotPathToPointer } from './_filterPath'\n\nconst STYLE_ID = 'jr-styles-column-filter'\n\nconst SHEET = `\n.jr-column-filter {\n display: inline-flex;\n flex-direction: column;\n gap: 0.25rem;\n font-family: var(--jr-font, system-ui, sans-serif);\n font-size: 0.875rem;\n color: var(--jr-text, #0f172a);\n min-width: 140px;\n}\n.jr-column-filter__label {\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-column-filter__select {\n padding: 0.4rem 0.55rem;\n border-radius: var(--jr-radius, 6px);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n background: var(--jr-surface, #ffffff);\n color: var(--jr-text, #0f172a);\n font: inherit;\n outline: none;\n transition: border-color var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n cursor: pointer;\n}\n/* CWRF-013 Phase 5 Tier 5-2: :focus-visible handled by .jr-focusable-input\n * mixin in motionFocusTokens.ts (ring pattern wired to --jr-focus-ring-* tokens). */\n.jr-column-filter__select[disabled] {\n cursor: not-allowed;\n opacity: 0.55;\n}\n.jr-column-filter__select--multi {\n min-height: 5rem;\n}\n`\n\nexport interface ColumnFilterOption {\n value: string\n label: string\n}\n\nexport interface ColumnFilterProps {\n props: {\n column: string\n filterPath: string\n options?: ColumnFilterOption[]\n multiple?: boolean\n placeholder?: string\n label?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\n/**\n * CWRF-013 Phase 3 PR-P3-#1 — ColumnFilter (sibling of DataTable).\n *\n * Single-column dropdown filter writing into a shared filterPath. The sibling\n * DataTable / TableToolbar read the same path so cluster-wide filter state\n * stays in one place (Renderer state store).\n *\n * Modes:\n * - multiple=false (default): native <select>; first <option> is empty\n * placeholder for \"All values\" (clearing the filter).\n * - multiple=true: native <select multiple>; selection is the array of\n * chosen `value`s. Empty array means \"no filter\".\n *\n * Decisions:\n * - MVP requires `options` to be passed explicitly. The \"auto-distinct from\n * data\" pathway in 03_data_table_modular.md §2.3 is deferred until\n * ColumnFilter has a stable read-path into the table data; for now an\n * empty options array renders a disabled select with a \"(no options)\"\n * hint so the prompt-side path is observable.\n * - State writes use stateSet(filterPath, value); the parallel\n * emit('filter:change', {column, filterPath, value}) keeps spec-level\n * `on:` listeners working (parity with TableToolbar searchchange).\n *\n * Renderer contract: must be mounted under StateProvider (via JSONUIProvider\n * or directly). ActionProvider is optional — ColumnFilter never invokes\n * actions, only stateSet + emit.\n *\n * Design refs:\n * - 04_overdesign_refactor/03_data_table_modular.md §2.3\n * - 04_overdesign_refactor/06_phase3_kickoff_checklist.md §2.1 (decision #1)\n */\nexport const ColumnFilter: React.FC<ColumnFilterProps> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const column = typeof props.column === 'string' ? props.column : ''\n const filterPath = typeof props.filterPath === 'string' ? props.filterPath : ''\n const multiple = props.multiple === true\n const options = useMemo<ColumnFilterOption[]>(\n () => (Array.isArray(props.options) ? props.options.filter((o) => o && typeof o.value === 'string' && typeof o.label === 'string') : []),\n [props.options],\n )\n const placeholder = typeof props.placeholder === 'string' ? props.placeholder : 'All values'\n const visualLabel = typeof props.label === 'string' && props.label.length > 0 ? props.label : column\n\n const { set: stateSet } = useStateStore()\n\n const [single, setSingle] = useState<string>('')\n const [multi, setMulti] = useState<string[]>([])\n\n const writeState = useCallback(\n (next: string | string[]) => {\n if (filterPath.length > 0) {\n try {\n stateSet(dotPathToPointer(filterPath), next)\n } catch (err) {\n console.error('[ColumnFilter] stateSet failed:', err)\n }\n }\n emit?.('filter:change', { column, filterPath, value: next })\n },\n [filterPath, column, stateSet, emit],\n )\n\n const handleSingleChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const v = e.target.value\n setSingle(v)\n writeState(v)\n },\n [writeState],\n )\n\n const handleMultiChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const v = Array.from(e.target.selectedOptions).map((o) => o.value)\n setMulti(v)\n writeState(v)\n },\n [writeState],\n )\n\n if (column.length === 0 || filterPath.length === 0) {\n return null\n }\n\n const disabled = options.length === 0\n const selectClass = multiple\n ? 'jr-column-filter__select jr-column-filter__select--multi jr-focusable-input'\n : 'jr-column-filter__select jr-focusable-input'\n\n return (\n <label className=\"jr-column-filter\">\n <span className=\"jr-column-filter__label\">{visualLabel}</span>\n {multiple ? (\n <select\n className={selectClass}\n multiple\n value={multi}\n disabled={disabled}\n onChange={handleMultiChange}\n aria-label={`Filter by ${visualLabel}`}\n >\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : (\n <select\n className={selectClass}\n value={single}\n disabled={disabled}\n onChange={handleSingleChange}\n aria-label={`Filter by ${visualLabel}`}\n >\n <option value=\"\">{placeholder}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n )}\n </label>\n )\n}\n\nexport default ColumnFilter\n","import React, { useCallback, useMemo, useState } from 'react'\nimport { useStateStore } from '@json-render/react'\nimport { injectStyles } from './injectStyles'\nimport { dotPathToPointer } from './_filterPath'\nimport { Icon } from './primitives/Icon'\n\nconst STYLE_ID = 'jr-styles-row-group'\n\nconst SHEET = `\n.jr-row-group {\n display: flex;\n flex-direction: column;\n gap: 0.45rem;\n font-family: var(--jr-font, system-ui, sans-serif);\n font-size: 0.875rem;\n color: var(--jr-text, #0f172a);\n}\n.jr-row-group__banner {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.55rem 0.85rem;\n border-radius: var(--jr-radius, 8px);\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 8%, var(--jr-surface, #ffffff));\n border: 1px solid color-mix(in srgb, var(--jr-primary, #3b82f6) 18%, transparent);\n}\n.jr-row-group__title {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n color: var(--jr-text, #0f172a);\n margin: 0;\n font-size: 0.95rem;\n}\n.jr-row-group__caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n cursor: pointer;\n border: none;\n background: transparent;\n color: var(--jr-text-muted, #64748b);\n font: inherit;\n font-size: 0.85rem;\n border-radius: 4px;\n transition: background-color var(--jr-transition-base) var(--jr-easing-standard), color var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-row-group__caret:hover {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 14%, transparent);\n color: var(--jr-primary, #3b82f6);\n}\n/*\n * CWRF-013 Phase 4 Tier 4-2 (P4-T03) — caret rotate animation.\n *\n * Two design notes:\n * 1. We render a single ChevronRight Icon (NOT a pair of\n * unicode triangles) and rely on CSS rotate(90deg) when the\n * button reports aria-expanded=\"true\". This way the\n * production accessibility tree (aria-expanded) is the\n * single source of truth for both visual + a11y states.\n * 2. Transition uses --jr-transition-fast — reduced-motion\n * users get the global override (→ near-zero duration), so\n * the icon still rotates but near-instantly. No per-\n * component prefers-reduced-motion guard needed.\n */\n.jr-row-group__caret .jr-icon {\n transition: transform var(--jr-transition-fast) var(--jr-easing-standard);\n transform-origin: center;\n}\n.jr-row-group__caret[aria-expanded=\"true\"] .jr-icon {\n transform: rotate(90deg);\n}\n/* :focus-visible handled by .jr-focusable mixin in motionFocusTokens.ts (CWRF-013 Phase 4 P1-T04). */\n.jr-row-group__aggs {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem 1rem;\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #475569);\n}\n.jr-row-group__agg {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n}\n.jr-row-group__agg-label {\n font-weight: 500;\n}\n.jr-row-group__agg-value {\n font-variant-numeric: tabular-nums;\n color: var(--jr-text, #0f172a);\n font-weight: 600;\n}\n.jr-row-group__body {\n overflow: hidden;\n transition: max-height var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-row-group__body[hidden] {\n display: none;\n}\n`\n\nexport type RowGroupAggKind = 'sum' | 'avg' | 'count' | 'min' | 'max'\n\nexport interface RowGroupAggregation {\n column: string\n agg: RowGroupAggKind\n label?: string\n}\n\nexport interface RowGroupProps {\n props: {\n groupBy: string\n expanded?: string[]\n expandedPath?: string\n aggregations?: RowGroupAggregation[]\n title?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\n/**\n * CWRF-013 Phase 3 PR-P3-#1 — RowGroup (wraps one DataTable child).\n *\n * Renders a group banner (groupBy label + aggregation placeholders + expand\n * caret) ABOVE its single DataTable child. The banner is the durable\n * surface; row-level grouping (splitting rows into separate sub-tables per\n * group key) is deferred to Phase 4 once RowGroup can read the inner\n * DataTable's `data` directly. This MVP keeps the prompt path observable —\n * agents still emit RowGroup with the design-doc shape — without locking\n * us into a half-baked grouping engine.\n *\n * Why banner-only is the right MVP:\n * - The wrapping pattern (RowGroup → children: ['data_table']) renders a\n * single React node tree. The grouping requires re-shaping the data\n * array, which lives inside the inner DataTable element's props (not\n * reachable from a parent React component without a Renderer-side\n * hook). A Phase 4 RFC will add either a `dataPath` prop or a context\n * bridge so RowGroup can pivot the data array itself.\n * - aggregations are rendered as labels with placeholder values (zero or\n * pending icon) so the LLM's prompt path still exercises the field.\n *\n * Expand / collapse:\n * - When `expandedPath` is set, RowGroup writes the next expanded array\n * to that state path AND emits 'group:toggle'. Reads of the stored\n * state happen at the Renderer level (via DataTable filterPath /\n * other consumers); RowGroup keeps an internal copy seeded by\n * `expanded` for the no-bind case.\n * - The collapse banner mirrors a single group keyed off `groupBy`; the\n * visual contract for many-groups is left for Phase 4.\n *\n * Design refs:\n * - 04_overdesign_refactor/03_data_table_modular.md §2.4\n * - 04_overdesign_refactor/06_phase3_kickoff_checklist.md §4.2 (sub-task C-06)\n */\nexport const RowGroup: React.FC<RowGroupProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const groupBy = typeof props.groupBy === 'string' ? props.groupBy : ''\n const titleOverride = typeof props.title === 'string' ? props.title : undefined\n const expandedPath = typeof props.expandedPath === 'string' && props.expandedPath.length > 0\n ? props.expandedPath\n : undefined\n const initialExpanded = useMemo(\n () => (Array.isArray(props.expanded) ? props.expanded.filter((v): v is string => typeof v === 'string') : []),\n [props.expanded],\n )\n const aggregations = useMemo<RowGroupAggregation[]>(\n () =>\n Array.isArray(props.aggregations)\n ? props.aggregations.filter(\n (a): a is RowGroupAggregation =>\n !!a && typeof a.column === 'string' && ['sum', 'avg', 'count', 'min', 'max'].includes(a.agg),\n )\n : [],\n [props.aggregations],\n )\n\n const { set: stateSet } = useStateStore()\n const [isOpen, setIsOpen] = useState<boolean>(\n () => initialExpanded.length === 0 || initialExpanded.includes(groupBy),\n )\n\n const toggle = useCallback(() => {\n const nextOpen = !isOpen\n setIsOpen(nextOpen)\n const nextExpanded = nextOpen ? [groupBy] : []\n if (expandedPath) {\n try {\n stateSet(dotPathToPointer(expandedPath), nextExpanded)\n } catch (err) {\n console.error('[RowGroup] stateSet failed:', err)\n }\n }\n emit?.('group:toggle', { groupBy, expanded: nextExpanded, isOpen: nextOpen })\n }, [isOpen, groupBy, expandedPath, stateSet, emit])\n\n if (groupBy.length === 0) {\n return <>{children}</>\n }\n\n const headerTitle = titleOverride ?? `Grouped by ${groupBy}`\n\n return (\n <div className=\"jr-row-group\" data-jr-group-by={groupBy}>\n <div className=\"jr-row-group__banner\">\n <h3 className=\"jr-row-group__title\">\n <button\n type=\"button\"\n className=\"jr-row-group__caret jr-pressable jr-focusable\"\n aria-label={isOpen ? `Collapse ${headerTitle}` : `Expand ${headerTitle}`}\n aria-expanded={isOpen}\n onClick={toggle}\n >\n <Icon name=\"chevron-right\" decorative />\n </button>\n <span>{headerTitle}</span>\n </h3>\n {aggregations.length > 0 ? (\n <div className=\"jr-row-group__aggs\" role=\"status\">\n {aggregations.map((a, i) => (\n <span key={`${a.column}-${a.agg}-${i}`} className=\"jr-row-group__agg\">\n <span className=\"jr-row-group__agg-label\">{a.label ?? `${a.agg}(${a.column})`}</span>\n <span className=\"jr-row-group__agg-value\" aria-label=\"pending\">—</span>\n </span>\n ))}\n </div>\n ) : null}\n </div>\n <div className=\"jr-row-group__body\" hidden={!isOpen}>\n {children}\n </div>\n </div>\n )\n}\n\nexport default RowGroup\n","import React from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-budget-bar'\n\nconst SHEET = `\n@keyframes jr-budget-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-budget-bar {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n padding: calc(var(--jr-spacing, 12px) * 1.1);\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n animation: jr-budget-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-budget-bar__list {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.jr-budget-bar--vertical .jr-budget-bar__list {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-end;\n gap: 1.25rem;\n}\n.jr-budget-bar__item {\n min-width: 0;\n cursor: pointer;\n transition: background var(--jr-transition-base) var(--jr-easing-standard);\n border-radius: 6px;\n}\n.jr-budget-bar__item:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, transparent);\n}\n.jr-budget-bar--vertical .jr-budget-bar__item {\n flex: 1 1 120px;\n max-width: 180px;\n}\n.jr-budget-bar__label-row {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.jr-budget-bar__label {\n margin: 0;\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-budget-bar__meta {\n margin: 0;\n font-size: 0.8125rem;\n font-variant-numeric: tabular-nums;\n color: var(--jr-text, #0f172a);\n}\n.jr-budget-bar__track {\n position: relative;\n height: 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 18%, transparent);\n overflow: hidden;\n cursor: pointer;\n transition: box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-budget-bar__track:hover {\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--jr-primary, #3b82f6) 28%, transparent);\n}\n.jr-budget-bar__track:hover .jr-budget-bar__fill {\n filter: brightness(1.07);\n}\n.jr-budget-bar--vertical .jr-budget-bar__track {\n height: 120px;\n width: 100%;\n display: flex;\n flex-direction: column-reverse;\n justify-content: flex-start;\n}\n.jr-budget-bar__fill {\n height: 100%;\n border-radius: 999px;\n background: var(--jr-primary, #3b82f6);\n transition: width var(--jr-transition-base) var(--jr-easing-standard), height var(--jr-transition-base) var(--jr-easing-standard), background var(--jr-transition-base) var(--jr-easing-standard), filter var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-budget-bar--vertical .jr-budget-bar__fill {\n width: 100% !important;\n min-height: 2px;\n border-radius: 999px;\n}\n.jr-budget-bar__fill--over {\n background-color: var(--jr-danger, #ef4444);\n /* CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-007): dual encoding — color + pattern.\n * The 135° hatch makes \"over budget\" perceivable in monochrome / color-blind\n * / Windows High Contrast modes where the danger red collapses. The stripe\n * color is rgba(255,255,255,0.35) so the pattern is subtle in normal mode\n * but the forced-colors block below replaces the whole fill with system colors. */\n background-image: repeating-linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.35) 0 2px,\n transparent 2px 6px\n );\n}\n.jr-budget-bar__fill--zone-warn {\n background: var(--jr-warning, #ca8a04);\n}\n.jr-budget-bar__fill--zone-safe {\n background: var(--jr-success, #22c55e);\n}\n/* Forced-colors fallback: gradient + brand colors collapse to system colors;\n * we keep the stripe pattern so OVER stays distinguishable from SAFE/WARN. */\n@media (forced-colors: active) {\n .jr-budget-bar__fill--zone-safe,\n .jr-budget-bar__fill--zone-warn {\n background-color: Canvas;\n border: 1px solid CanvasText;\n forced-color-adjust: none;\n }\n .jr-budget-bar__fill--zone-warn {\n background-image: repeating-linear-gradient(45deg, CanvasText 0 1px, transparent 1px 5px);\n }\n .jr-budget-bar__fill--over {\n background-color: Mark !important;\n color: MarkText !important;\n background-image: repeating-linear-gradient(\n 135deg,\n MarkText 0 2px,\n transparent 2px 6px\n ) !important;\n forced-color-adjust: none;\n }\n}\n.jr-budget-bar__margin {\n margin-top: 0.35rem;\n font-size: 0.75rem;\n color: var(--jr-text-muted, #64748b);\n font-variant-numeric: tabular-nums;\n}\n.jr-budget-bar--compact {\n padding: var(--jr-spacing, 12px);\n}\n.jr-budget-bar--compact .jr-budget-bar__track {\n height: 8px;\n}\n.jr-budget-bar--compact.jr-budget-bar--vertical .jr-budget-bar__track {\n height: 96px;\n}\n`\n\nfunction safeNum(n: unknown, fallback: number): number {\n const x = typeof n === 'number' ? n : parseFloat(String(n))\n return Number.isFinite(x) ? x : fallback\n}\n\nexport interface BudgetBarItem {\n name: string\n budget: number\n actual: number\n color?: string\n}\n\nexport interface BudgetBarProps {\n props: {\n data: BudgetBarItem[]\n unit: string\n showMargin?: boolean\n zones?: { safe: number; warning: number }\n orientation?: 'horizontal' | 'vertical'\n variant?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nfunction usagePct(budget: number, actual: number): number {\n if (budget > 0) return (actual / budget) * 100\n return actual > 0 ? 100 : 0\n}\n\nfunction fillClassAndStyle(\n budget: number,\n actual: number,\n zones: BudgetBarProps['props']['zones'],\n itemColor: string | undefined,\n overBudget: boolean\n): { className: string; style: React.CSSProperties } {\n const pct = usagePct(budget, actual)\n const widthPct = Math.max(0, Math.min(100, pct))\n\n if (itemColor) {\n return {\n className: overBudget ? 'jr-budget-bar__fill jr-budget-bar__fill--over' : 'jr-budget-bar__fill',\n style: overBudget\n ? {}\n : { width: `${widthPct}%`, background: itemColor },\n }\n }\n\n if (overBudget) {\n return { className: 'jr-budget-bar__fill jr-budget-bar__fill--over', style: { width: `${widthPct}%` } }\n }\n\n if (zones) {\n const u = pct\n if (u <= zones.safe) {\n return {\n className: 'jr-budget-bar__fill jr-budget-bar__fill--zone-safe',\n style: { width: `${widthPct}%` },\n }\n }\n if (u <= zones.warning) {\n return {\n className: 'jr-budget-bar__fill jr-budget-bar__fill--zone-warn',\n style: { width: `${widthPct}%` },\n }\n }\n return { className: 'jr-budget-bar__fill jr-budget-bar__fill--over', style: { width: `${widthPct}%` } }\n }\n\n return { className: 'jr-budget-bar__fill', style: { width: `${widthPct}%` } }\n}\n\nexport const BudgetBar: React.FC<BudgetBarProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const items = Array.isArray(props.data) ? props.data : []\n const variant = props.variant ?? 'default'\n const unit = props.unit ?? ''\n const zones = props.zones\n const vertical = props.orientation === 'vertical'\n\n const rootClass = [\n 'jr-budget-bar',\n variant && variant !== 'default' ? `jr-budget-bar--${variant}` : '',\n vertical ? 'jr-budget-bar--vertical' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={rootClass}>\n <div className=\"jr-budget-bar__list\">\n {items.map((item, idx) => {\n const budget = Math.max(0, safeNum(item.budget, 0))\n const actual = safeNum(item.actual, 0)\n let overBudget = false\n let pct = 0\n if (budget > 0) {\n pct = (actual / budget) * 100\n overBudget = pct > 100\n } else {\n pct = actual > 0 ? 100 : 0\n overBudget = actual > 0\n }\n\n const widthPct = Math.max(0, Math.min(100, pct))\n const { className: fillClass, style: fillStyle } = fillClassAndStyle(\n budget,\n actual,\n zones,\n item.color,\n overBudget\n )\n\n const displayBudget = budget\n const displayActual = actual\n const meta = [displayActual, unit, '/', displayBudget, unit].filter((s) => s !== '').join(' ')\n const margin = budget - actual\n\n const verticalFillStyle: React.CSSProperties = vertical\n ? {\n ...fillStyle,\n width: '100%',\n height: `${widthPct}%`,\n minHeight: widthPct > 0 ? 2 : 0,\n }\n : fillStyle\n\n return (\n <div\n className=\"jr-budget-bar__item jr-pressable jr-focusable\"\n key={`${item.name}-${idx}`}\n role=\"button\"\n tabIndex={0}\n onClick={() => emit?.('budget:item', { name: item.name, index: idx, budget, actual })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emit?.('budget:item', { name: item.name, index: idx, budget, actual })\n }\n }}\n >\n <div className=\"jr-budget-bar__label-row\">\n <p className=\"jr-budget-bar__label\">{item.name || 'Budget'}</p>\n <p className=\"jr-budget-bar__meta\" title={overBudget ? 'Over budget' : undefined}>\n {meta}\n {overBudget ? (\n <span style={{ color: 'var(--jr-danger, #ef4444)', marginLeft: '0.35rem' }}>Over</span>\n ) : null}\n </p>\n </div>\n <div className=\"jr-budget-bar__track\">\n <div className={fillClass} style={vertical ? verticalFillStyle : fillStyle} />\n </div>\n {props.showMargin ? (\n <p className=\"jr-budget-bar__margin\">\n Margin: {margin}\n {unit ? ` ${unit}` : ''}\n </p>\n ) : null}\n </div>\n )\n })}\n </div>\n {children}\n </div>\n )\n}\n\nexport default BudgetBar\n","import React from 'react'\nimport { injectStyles } from './injectStyles'\nimport { Icon } from './primitives/Icon'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-checklist-card'\n\nconst SHEET = `\n@keyframes jr-checklist-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-checklist-card {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n animation: jr-checklist-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-checklist-card__progress {\n padding: 0.65rem calc(var(--jr-spacing, 12px) * 1.25);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 70%, var(--jr-surface, #fff));\n}\n.jr-checklist-card__progress-label {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.4rem;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-checklist-card__progress-bar {\n height: 6px;\n border-radius: 3px;\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 18%, transparent);\n overflow: hidden;\n}\n.jr-checklist-card__progress-fill {\n height: 100%;\n border-radius: 3px;\n background: var(--jr-success, #22c55e);\n transition: width var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-checklist-card__title {\n margin: 0;\n padding: calc(var(--jr-spacing, 12px) * 1.1) calc(var(--jr-spacing, 12px) * 1.25);\n font-size: 0.9375rem;\n font-weight: 600;\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 70%, var(--jr-surface, #fff));\n}\n.jr-checklist-card__list {\n list-style: none;\n margin: 0;\n padding: 0.35rem 0;\n}\n.jr-checklist-card__item {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.65rem;\n padding: 0.55rem calc(var(--jr-spacing, 12px) * 1.25);\n width: 100%;\n text-align: left;\n background: transparent;\n font: inherit;\n color: inherit;\n cursor: pointer;\n border-radius: 6px;\n transition: background var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-checklist-card__item:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 5%, transparent);\n transform: translateX(2px);\n}\n.jr-checklist-card__icon {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-top: 0.05rem;\n display: grid;\n place-items: center;\n font-size: 0.95rem;\n line-height: 1;\n font-weight: 700;\n}\n.jr-checklist-card__icon--pass { color: var(--jr-success, #22c55e); }\n.jr-checklist-card__icon--fail { color: var(--jr-danger, #ef4444); }\n.jr-checklist-card__icon--warning { color: var(--jr-warning, #d97706); }\n.jr-checklist-card__icon--pending { color: var(--jr-text-muted, #94a3b8); }\n.jr-checklist-card__icon--na { color: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 65%, var(--jr-surface, #fff)); font-weight: 500; }\n.jr-checklist-card__body {\n flex: 1;\n min-width: 0;\n}\n.jr-checklist-card__label {\n font-size: 0.875rem;\n line-height: 1.45;\n}\n.jr-checklist-card__meta {\n font-size: 0.75rem;\n color: var(--jr-text-muted, #64748b);\n margin-top: 0.2rem;\n}\n.jr-checklist-card__notes {\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #64748b);\n margin-top: 0.25rem;\n line-height: 1.4;\n}\n\n/* CWRF-013 Phase 4 P3-T02 (Tier 3-1) — density=\"compact\" modifier.\n * Tight 3-8 row status lists (e.g. \"详细要点 / 完成情况\" inside a review card).\n * Default density=\"comfortable\" preserves the original QA-panel paddings/sizes,\n * so callsites not opting into density get a 0-diff visual snapshot. */\n.jr-checklist-card--compact .jr-checklist-card__item {\n padding: 0.35rem calc(var(--jr-spacing, 12px) * 1.0);\n gap: 0.5rem;\n}\n.jr-checklist-card--compact .jr-checklist-card__icon {\n width: 1rem;\n height: 1rem;\n font-size: 0.825rem;\n}\n.jr-checklist-card--compact .jr-checklist-card__label {\n font-size: 0.8125rem;\n}\n.jr-checklist-card--compact .jr-checklist-card__meta {\n font-size: 0.6875rem;\n margin-top: 0.15rem;\n}\n.jr-checklist-card--compact .jr-checklist-card__title {\n padding: 0.5rem calc(var(--jr-spacing, 12px) * 1.0);\n font-size: 0.8125rem;\n}\n.jr-checklist-card--compact .jr-checklist-card__progress {\n padding: 0.45rem calc(var(--jr-spacing, 12px) * 1.0);\n}\n.jr-checklist-card--compact[data-no-progress=\"true\"] .jr-checklist-card__progress {\n display: none;\n}\n`\n\nexport type ChecklistItemStatus = 'pass' | 'fail' | 'warning' | 'pending' | 'na'\n\nexport type ChecklistCardDensity = 'comfortable' | 'compact'\n\nexport interface ChecklistCardProps {\n props: {\n items: {\n label: string\n status: ChecklistItemStatus\n notes?: string\n timestamp?: string\n }[]\n title?: string\n showProgress?: boolean\n density?: ChecklistCardDensity\n /** Phase 4 Tier 4-4 Batch C: render centred spinner during async checklist fetch. */\n loading?: boolean\n /** Phase 4 Tier 4-4 Batch C: render error placeholder; wins over loading. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nconst STATUS_ORDER: ChecklistItemStatus[] = ['pass', 'fail', 'warning', 'pending', 'na']\n\nfunction normalizeStatus(raw: unknown): ChecklistItemStatus {\n const s = String(raw ?? '').toLowerCase()\n if (STATUS_ORDER.includes(s as ChecklistItemStatus)) return s as ChecklistItemStatus\n return 'pending'\n}\n\n// CWRF-013 Phase 4 P2-T03 — status glyph map migrated to lucide via Icon\n// primitive. Maps each ChecklistItemStatus to a kebab-case lucide name;\n// resolution + a11y handled by `Icon` (see `primitives/Icon.tsx`).\nconst STATUS_ICON: Record<ChecklistItemStatus, string> = {\n pass: 'check',\n fail: 'x',\n warning: 'alert-triangle',\n pending: 'circle',\n na: 'minus',\n}\n\nexport const ChecklistCard: React.FC<ChecklistCardProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const listState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n if (listState.isError) {\n return (\n <article className=\"jr-checklist-card\" data-state=\"error\">\n {props.title ? <h2 className=\"jr-checklist-card__title\">{props.title}</h2> : null}\n <StateView kind=\"error\" description={listState.errorMessage} />\n {children}\n </article>\n )\n }\n if (listState.isLoading) {\n return (\n <article className=\"jr-checklist-card\" data-state=\"loading\">\n {props.title ? <h2 className=\"jr-checklist-card__title\">{props.title}</h2> : null}\n <StateView kind=\"loading\" />\n {children}\n </article>\n )\n }\n\n const rawItems = props.items\n const sourceItems = Array.isArray(rawItems) ? rawItems : []\n const items = sourceItems.map((it) => ({\n label: String(it.label ?? ''),\n status: normalizeStatus(it.status),\n notes: it.notes != null ? String(it.notes) : undefined,\n timestamp: it.timestamp != null ? String(it.timestamp) : undefined,\n }))\n\n const passed = items.filter((it) => it.status === 'pass').length\n const total = items.length\n const progressPct = total > 0 ? Math.round((passed / total) * 100) : 0\n\n const density: ChecklistCardDensity = props.density === 'compact' ? 'compact' : 'comfortable'\n // AC-CMP-001: when density is omitted / 'comfortable', the rootClass MUST\n // be exactly 'jr-checklist-card' so the visual snapshot is byte-identical\n // to the pre-Tier-3-1 baseline (no '--comfortable' modifier class).\n // Only the explicit 'compact' opt-in attaches the modifier.\n const rootClass = density === 'compact' ? 'jr-checklist-card jr-checklist-card--compact' : 'jr-checklist-card'\n const showProgress = Boolean(props.showProgress)\n const noProgressAttr = density === 'compact' && !showProgress ? 'true' : undefined\n\n return (\n <div className={rootClass} data-no-progress={noProgressAttr}>\n {showProgress && total > 0 ? (\n <div className=\"jr-checklist-card__progress\">\n <div className=\"jr-checklist-card__progress-label\">\n <span>Progress</span>\n <span>\n {passed}/{total} passed\n </span>\n </div>\n <div\n className=\"jr-checklist-card__progress-bar\"\n role=\"progressbar\"\n aria-label={props.title ? `${props.title} — checklist progress` : 'Checklist progress'}\n aria-valuenow={passed}\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuetext={`${passed} of ${total} items passed`}\n >\n <div className=\"jr-checklist-card__progress-fill\" style={{ width: `${progressPct}%` }} />\n </div>\n </div>\n ) : null}\n {props.title ? <h2 className=\"jr-checklist-card__title\">{props.title}</h2> : null}\n <ul className=\"jr-checklist-card__list\" role=\"list\">\n {items.length === 0 ? (\n !Array.isArray(rawItems) ? null : (\n <li className=\"jr-checklist-card__label\" style={{ padding: '0.75rem 1rem', color: 'var(--jr-text-muted, #94a3b8)' }}>\n No items\n </li>)\n ) : (\n items.map((it, idx) => (\n <li key={`${idx}-${it.label}`}>\n <div\n className=\"jr-checklist-card__item jr-pressable jr-focusable\"\n role=\"button\"\n tabIndex={0}\n onClick={() => emit?.('checklist:item', { index: idx, label: it.label, status: it.status })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emit?.('checklist:item', { index: idx, label: it.label, status: it.status })\n }\n }}\n >\n <span className={`jr-checklist-card__icon jr-checklist-card__icon--${it.status}`} aria-hidden>\n <Icon name={STATUS_ICON[it.status]} />\n </span>\n <div className=\"jr-checklist-card__body\">\n <div className=\"jr-checklist-card__label\">{it.label || '—'}</div>\n {it.timestamp ? <div className=\"jr-checklist-card__meta\">{it.timestamp}</div> : null}\n {it.notes ? <div className=\"jr-checklist-card__notes\">{it.notes}</div> : null}\n </div>\n </div>\n </li>\n ))\n )}\n </ul>\n {children}\n </div>\n )\n}\n\nexport default ChecklistCard\n","import React, { useId, useMemo, useRef, useState, useEffect, useCallback } from 'react'\n\nconst STYLE_ID = 'jr-styles-chart'\n\nconst SHEET = `\n@keyframes jr-chart-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-chart {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n border-radius: var(--jr-radius, 8px);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: var(--jr-surface, #ffffff);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n padding: calc(var(--jr-spacing, 12px) * 0.85);\n animation: jr-chart-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-chart__title {\n margin: 0 0 0.5rem;\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--jr-text, #0f172a);\n}\n.jr-chart__svg-wrap {\n position: relative;\n width: 100%;\n max-width: 100%;\n display: block;\n}\n.jr-chart__svg {\n display: block;\n width: 100%;\n overflow: hidden;\n}\n.jr-chart__axis {\n stroke: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 45%, transparent);\n stroke-width: 1;\n}\n.jr-chart__grid-line {\n stroke: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 18%, transparent);\n stroke-width: 0.5;\n stroke-dasharray: 3 3;\n}\n.jr-chart__tick {\n fill: var(--jr-text-muted, #94a3b8);\n font-size: 9px;\n}\n.jr-chart__legend {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem 0.6rem;\n margin-top: 0.4rem;\n padding: 0 0.25rem;\n font-size: 0.625rem;\n line-height: 1.3;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-chart__legend-item {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n max-width: 140px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.jr-chart__legend-swatch {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 2px;\n flex-shrink: 0;\n}\n.jr-chart__empty {\n padding: 1.5rem;\n text-align: center;\n font-size: 0.875rem;\n color: var(--jr-text-muted, #94a3b8);\n}\n.jr-chart__crosshair {\n stroke: color-mix(in srgb, var(--jr-text, #0f172a) 35%, transparent);\n stroke-width: 1;\n stroke-dasharray: 3 2;\n pointer-events: none;\n}\n.jr-chart__hover-dot {\n pointer-events: none;\n}\n.jr-chart path[data-slice] {\n transition: filter var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard), stroke-width var(--jr-transition-base) var(--jr-easing-standard);\n cursor: pointer;\n}\n.jr-chart rect[data-bar] {\n transition: filter var(--jr-transition-fast) var(--jr-easing-standard);\n cursor: pointer;\n}\n.jr-chart rect[data-bar]:hover {\n filter: brightness(1.15);\n}\n.jr-chart circle[data-scatter] {\n transition: r var(--jr-transition-fast) var(--jr-easing-standard);\n cursor: pointer;\n}\n`\n\nimport { injectStyles } from './injectStyles'\nimport { ChartTooltip, type TooltipRow } from './ChartTooltip'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst FALLBACK_COLORS = [\n 'var(--jr-primary, #3b82f6)',\n 'var(--jr-success, #22c55e)',\n 'var(--jr-warning, #ca8a04)',\n 'var(--jr-danger, #ef4444)',\n '#8b5cf6',\n '#06b6d4',\n]\n\nfunction niceRange(min: number, max: number, targetTicks = 5): number[] {\n const span = max - min\n if (span === 0) return [min]\n const rawStep = span / targetTicks\n const mag = Math.pow(10, Math.floor(Math.log10(rawStep)))\n const res = rawStep / mag\n const step = res <= 1.5 ? mag : res <= 3 ? 2 * mag : res <= 7 ? 5 * mag : 10 * mag\n const start = Math.ceil(min / step) * step\n const ticks: number[] = []\n for (let v = start; v <= max + step * 0.001; v += step) {\n ticks.push(Math.round(v * 1e10) / 1e10)\n }\n return ticks\n}\n\nfunction formatTickValue(v: number): string {\n const abs = Math.abs(v)\n if (abs >= 1_000_000) return `${(v / 1_000_000).toFixed(1)}M`\n if (abs >= 10_000) return `${(v / 1_000).toFixed(0)}K`\n if (abs >= 1_000) return `${(v / 1_000).toFixed(1)}K`\n if (Number.isInteger(v)) return String(v)\n return v.toFixed(1)\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? `${s.slice(0, max - 1)}…` : s\n}\n\nexport type ChartType = 'line' | 'bar' | 'area' | 'pie' | 'donut' | 'scatter' | 'radar' | 'candlestick'\n\nexport type ChartDataPoint =\n | number\n | { x: number | string; y: number }\n | { x: number | string; open: number; high: number; low: number; close: number; volume?: number }\n\nfunction isOhlc(p: ChartDataPoint): p is Extract<ChartDataPoint, { open: number }> {\n return typeof p === 'object' && p !== null && 'open' in p && 'high' in p\n}\n\nfunction isXY(p: ChartDataPoint): p is Extract<ChartDataPoint, { x: number | string; y: number }> {\n return typeof p === 'object' && p !== null && 'y' in p && !('open' in p)\n}\n\nfunction seriesColor(s: { color?: string }, i: number): string {\n return s.color && String(s.color).trim() ? String(s.color) : FALLBACK_COLORS[i % FALLBACK_COLORS.length]\n}\n\nfunction yFromPoint(p: ChartDataPoint | undefined, fallback = 0): number {\n if (p === undefined) return fallback\n if (typeof p === 'number') return Number.isFinite(p) ? p : fallback\n if (isOhlc(p)) return Number.isFinite(p.close) ? p.close : fallback\n if (isXY(p)) return Number.isFinite(p.y) ? p.y : fallback\n return fallback\n}\n\nfunction ohlcFromPoint(p: ChartDataPoint | undefined): { open: number; high: number; low: number; close: number } | null {\n if (!p || !isOhlc(p)) return null\n return { open: p.open, high: p.high, low: p.low, close: p.close }\n}\n\nfunction xScatterNumeric(p: ChartDataPoint, index: number): number {\n if (typeof p === 'number') return index\n if (isXY(p) || isOhlc(p)) {\n const xv = p.x\n if (typeof xv === 'number' && Number.isFinite(xv)) return xv\n if (typeof xv === 'string') {\n const n = parseFloat(xv)\n return Number.isFinite(n) ? n : index\n }\n }\n return index\n}\n\nexport interface ChartProps {\n props: {\n type: ChartType\n series: {\n name: string\n data: ChartDataPoint[]\n color?: string\n type?: string\n }[]\n xAxis?: {\n label?: string\n categories?: string[]\n type?: 'category' | 'linear' | 'time'\n }\n yAxis?: {\n label?: string\n min?: number\n max?: number\n }\n annotations?: {\n type: 'line' | 'band'\n value?: number\n from?: number\n to?: number\n label?: string\n color?: string\n style?: 'solid' | 'dashed'\n }[]\n legend?: boolean\n stacked?: boolean\n title?: string\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): when true, the chart canvas\n * is replaced by a centered spinner — use during async data fetches. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): when non-empty, the chart\n * canvas is replaced by an error placeholder; wins over loading. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nconst DEFAULT_PX_HEIGHT = 200\n\nexport const Chart: React.FC<ChartProps> = ({ props, children }) => {\n injectStyles(STYLE_ID, SHEET)\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state hook. MUST be\n // called unconditionally above all other hooks so hook order stays\n // stable; the result is consumed at the bottom (just before the\n // primary return) via early-return branches.\n const chartState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const uid = useId().replace(/:/g, '')\n const wrapRef = useRef<HTMLDivElement>(null)\n const [cw, setCw] = useState(0)\n useEffect(() => {\n const el = wrapRef.current\n if (!el) return\n const sync = () => {\n const w = Math.round(el.clientWidth)\n if (w > 0) setCw(prev => (prev === w ? prev : w))\n }\n sync()\n const ro = new ResizeObserver(sync)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const [hoverPos, setHoverPos] = useState<{ x: number; y: number } | null>(null)\n const onSvgMove = useCallback((e: React.MouseEvent<SVGSVGElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n setHoverPos({ x: e.clientX - rect.left, y: e.clientY - rect.top })\n }, [])\n const [hoveredSlice, setHoveredSlice] = useState<number | null>(null)\n const onSvgLeave = useCallback(() => { setHoverPos(null); setHoveredSlice(null) }, [])\n\n const height = DEFAULT_PX_HEIGHT\n const vbW = cw || 400\n const vbH = height\n const pad = { t: 16, r: 12, b: 28, l: 40 }\n const innerW = vbW - pad.l - pad.r\n const innerH = vbH - pad.t - pad.b\n\n const seriesList = Array.isArray(props.series) ? props.series : []\n const showLegend = props.legend !== false\n\n const labels = useMemo(() => {\n const cats = props.xAxis?.categories\n if (Array.isArray(cats) && cats.length > 0) {\n return cats.map((c) => String(c))\n }\n let n = 0\n for (const s of seriesList) {\n const len = s.data?.length ?? 0\n if (len > n) n = len\n }\n return Array.from({ length: n }, (_, i) => String(i + 1))\n }, [props.xAxis?.categories, seriesList])\n\n const chartBody = useMemo(() => {\n if (!seriesList.length) return null\n\n const p = { t: pad.t, r: pad.r, b: pad.b, l: pad.l }\n const n = labels.length\n\n if (props.type === 'pie' || props.type === 'donut') {\n const series = seriesList[0]?.data ?? []\n if (!series.length) return null\n const values = series.map((pt) => {\n if (typeof pt === 'number') return Math.abs(Number.isFinite(pt) ? pt : 0)\n if (isOhlc(pt)) return Math.abs(pt.close)\n if (isXY(pt)) return Math.abs(pt.y)\n return 0\n })\n const total = values.reduce((a, b) => a + b, 0) || 1\n const cx = p.l + innerW / 2\n const cy = p.t + innerH / 2\n const r = Math.min(innerW, innerH) / 2 - 4\n const innerR = props.type === 'donut' ? r * 0.52 : 0\n let angle = -Math.PI / 2\n const slices: React.ReactNode[] = []\n values.forEach((v, i) => {\n const sliceAngle = (v / total) * Math.PI * 2\n const a0 = angle\n const a1 = angle + sliceAngle\n const midAngle = (a0 + a1) / 2\n const x1 = cx + r * Math.cos(a0)\n const y1 = cy + r * Math.sin(a0)\n const x2 = cx + r * Math.cos(a1)\n const y2 = cy + r * Math.sin(a1)\n const large = sliceAngle > Math.PI ? 1 : 0\n let d: string\n if (innerR > 0) {\n const x3 = cx + innerR * Math.cos(a1)\n const y3 = cy + innerR * Math.sin(a1)\n const x4 = cx + innerR * Math.cos(a0)\n const y4 = cy + innerR * Math.sin(a0)\n d = `M ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} L ${x3} ${y3} A ${innerR} ${innerR} 0 ${large} 0 ${x4} ${y4} Z`\n } else {\n d = `M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} Z`\n }\n angle = a1\n const isActive = hoveredSlice === i\n const extrudeD = isActive ? 10 : 0\n slices.push(\n <path\n key={`pie-${i}`}\n className=\"jr-pressable jr-focusable\"\n d={d}\n fill={seriesColor(seriesList[0], i)}\n stroke=\"var(--jr-surface, #ffffff)\"\n strokeWidth={isActive ? 2.5 : 1}\n data-slice=\"\"\n transform={`translate(${Math.cos(midAngle) * extrudeD},${Math.sin(midAngle) * extrudeD})`}\n style={isActive ? { filter: 'brightness(1.12) drop-shadow(0 2px 6px rgba(0,0,0,0.25))' } : undefined}\n onMouseEnter={() => setHoveredSlice(i)}\n onMouseLeave={() => setHoveredSlice(null)}\n />,\n )\n })\n return <g>{slices}</g>\n }\n\n if (props.type === 'scatter') {\n const ptsFlat: { x: number; y: number; si: number; pi: number }[] = []\n seriesList.forEach((ds, si) => {\n ;(ds.data ?? []).forEach((pt, pi) => {\n const x = xScatterNumeric(pt, pi)\n const y = yFromPoint(pt, 0)\n if (Number.isFinite(x) && Number.isFinite(y)) ptsFlat.push({ x, y, si, pi })\n })\n })\n if (!ptsFlat.length) return null\n const xs = ptsFlat.map((q) => q.x)\n const ys = ptsFlat.map((q) => q.y)\n let minX = Math.min(...xs)\n let maxX = Math.max(...xs)\n let minY = Math.min(...ys)\n let maxY = Math.max(...ys)\n if (minX === maxX) {\n minX -= 1\n maxX += 1\n }\n if (minY === maxY) {\n minY -= 1\n maxY += 1\n }\n let adjMinY = minY\n let adjMaxY = maxY\n props.annotations?.forEach((an) => {\n if (an.type === 'line' && an.value !== undefined && Number.isFinite(an.value)) {\n adjMinY = Math.min(adjMinY, an.value)\n adjMaxY = Math.max(adjMaxY, an.value)\n }\n if (an.type === 'band') {\n if (an.from !== undefined && Number.isFinite(an.from)) {\n adjMinY = Math.min(adjMinY, an.from)\n adjMaxY = Math.max(adjMaxY, an.from)\n }\n if (an.to !== undefined && Number.isFinite(an.to)) {\n adjMinY = Math.min(adjMinY, an.to)\n adjMaxY = Math.max(adjMaxY, an.to)\n }\n }\n })\n if (props.yAxis?.min !== undefined && Number.isFinite(props.yAxis.min)) adjMinY = props.yAxis.min\n if (props.yAxis?.max !== undefined && Number.isFinite(props.yAxis.max)) adjMaxY = props.yAxis.max\n if (adjMinY === adjMaxY) {\n adjMinY -= 1\n adjMaxY += 1\n }\n const xScaleS = (xv: number) => p.l + ((xv - minX) / (maxX - minX || 1)) * innerW\n const spanY = adjMaxY - adjMinY || 1\n const yScaleS = (yv: number) => p.t + innerH - ((yv - adjMinY) / spanY) * innerH\n const annScatter: React.ReactNode[] = []\n props.annotations?.forEach((an, ai) => {\n const stroke = an.color && String(an.color).trim() ? String(an.color) : 'color-mix(in srgb, var(--jr-text-muted, #94a3b8) 55%, transparent)'\n const dash = an.style === 'dashed' ? '4 3' : undefined\n if (an.type === 'band' && an.from !== undefined && an.to !== undefined) {\n const y1 = yScaleS(an.from)\n const y2 = yScaleS(an.to)\n const top = Math.min(y1, y2)\n const h = Math.max(Math.abs(y2 - y1), 1)\n annScatter.push(\n <rect key={`sc-anb-${ai}`} x={p.l} y={top} width={innerW} height={h} fill={stroke} fillOpacity={0.12} stroke=\"none\" />,\n )\n }\n if (an.type === 'line' && an.value !== undefined && Number.isFinite(an.value)) {\n const y = yScaleS(an.value)\n annScatter.push(\n <line key={`sc-anl-${ai}`} x1={p.l} y1={y} x2={p.l + innerW} y2={y} stroke={stroke} strokeWidth={1} strokeDasharray={dash} />,\n )\n }\n })\n const dots = ptsFlat.map((q, i) => (\n <circle key={`sc-${i}`} className=\"jr-pressable jr-focusable\" cx={xScaleS(q.x)} cy={yScaleS(q.y)} r={4} fill={seriesColor(seriesList[q.si], q.si)} data-scatter=\"\">\n <title>{`${seriesList[q.si].name || `Series ${q.si + 1}`}: (${formatTickValue(q.x)}, ${formatTickValue(q.y)})`}</title>\n </circle>\n ))\n return (\n <g>\n {annScatter}\n {dots}\n </g>\n )\n }\n\n if (props.type === 'radar') {\n const axes = Math.max(3, n || labels.length)\n const cx = p.l + innerW / 2\n const cy = p.t + innerH / 2\n const maxR = Math.min(innerW, innerH) / 2 - 18\n let maxVal = 1\n seriesList.forEach((ds) => {\n ;(ds.data ?? []).forEach((pt) => {\n const v = yFromPoint(pt, 0)\n if (Number.isFinite(v)) maxVal = Math.max(maxVal, Math.abs(v))\n })\n })\n const angleAt = (i: number) => -Math.PI / 2 + (i / axes) * Math.PI * 2\n const grid: React.ReactNode[] = []\n for (let ring = 1; ring <= 4; ring++) {\n const rr = (maxR * ring) / 4\n const pts = Array.from({ length: axes }, (_, i) => {\n const a = angleAt(i)\n return `${cx + rr * Math.cos(a)},${cy + rr * Math.sin(a)}`\n }).join(' ')\n grid.push(\n <polygon key={`rg-${ring}`} fill=\"none\" stroke=\"color-mix(in srgb, var(--jr-text-muted, #94a3b8) 35%, transparent)\" strokeWidth={1} points={pts} />,\n )\n }\n for (let i = 0; i < axes; i++) {\n const a = angleAt(i)\n grid.push(\n <line\n key={`ax-${i}`}\n x1={cx}\n y1={cy}\n x2={cx + maxR * Math.cos(a)}\n y2={cy + maxR * Math.sin(a)}\n stroke=\"color-mix(in srgb, var(--jr-text-muted, #94a3b8) 35%, transparent)\"\n strokeWidth={1}\n />,\n )\n const lx = cx + (maxR + 12) * Math.cos(a)\n const ly = cy + (maxR + 12) * Math.sin(a)\n const lab = labels[i] ?? String(i + 1)\n grid.push(\n <text key={`lbl-${i}`} className=\"jr-chart__tick\" x={lx} y={ly} textAnchor=\"middle\" dominantBaseline=\"middle\">\n {lab.length > 8 ? `${lab.slice(0, 7)}…` : lab}\n </text>,\n )\n }\n const polys: React.ReactNode[] = []\n seriesList.forEach((ds, di) => {\n const ptsStr = Array.from({ length: axes }, (_, i) => {\n const v = yFromPoint(ds.data?.[i], 0)\n const t = Math.min(1, Math.max(0, Math.abs(v) / maxVal))\n const a = angleAt(i)\n const rr = maxR * t\n return `${cx + rr * Math.cos(a)},${cy + rr * Math.sin(a)}`\n }).join(' ')\n const col = seriesColor(ds, di)\n polys.push(<polygon key={`rd-${di}`} fill={col} fillOpacity={0.25} stroke={col} strokeWidth={2} points={ptsStr} />)\n })\n return (\n <g>\n {grid}\n {polys}\n </g>\n )\n }\n\n if (props.type === 'candlestick') {\n if (!n) return null\n const xBand = innerW / Math.max(1, n)\n const wickW = Math.max(1, xBand * 0.08)\n const bodyW = Math.max(2, xBand * 0.35)\n const els: React.ReactNode[] = []\n const ys: number[] = []\n labels.forEach((_, xi) => {\n seriesList.forEach((ds) => {\n const o = ohlcFromPoint(ds.data?.[xi])\n if (o) {\n ys.push(o.low, o.high, o.open, o.close)\n }\n })\n })\n let minV = ys.length ? Math.min(...ys) : 0\n let maxV = ys.length ? Math.max(...ys) : 1\n if (!Number.isFinite(minV)) minV = 0\n if (!Number.isFinite(maxV)) maxV = 1\n if (props.yAxis?.min !== undefined && Number.isFinite(props.yAxis.min)) minV = props.yAxis.min\n if (props.yAxis?.max !== undefined && Number.isFinite(props.yAxis.max)) maxV = props.yAxis.max\n const span = maxV - minV || 1\n const yScaleC = (v: number) => p.t + innerH - ((v - minV) / span) * innerH\n labels.forEach((_, xi) => {\n const cx = p.l + xi * xBand + xBand / 2\n seriesList.forEach((ds, di) => {\n const o = ohlcFromPoint(ds.data?.[xi])\n if (!o) return\n const yHi = yScaleC(o.high)\n const yLo = yScaleC(o.low)\n const yO = yScaleC(o.open)\n const yC = yScaleC(o.close)\n const top = Math.min(yO, yC)\n const bot = Math.max(yO, yC)\n const col = seriesColor(ds, di)\n const offset = (di - (seriesList.length - 1) / 2) * (bodyW * 0.9)\n const bx = cx - bodyW / 2 + offset\n els.push(\n <line key={`w-${xi}-${di}`} x1={cx + offset} y1={yHi} x2={cx + offset} y2={yLo} stroke={col} strokeWidth={wickW} strokeLinecap=\"round\" />,\n )\n els.push(\n <rect\n key={`b-${xi}-${di}`}\n x={bx}\n y={top}\n width={bodyW * 0.85}\n height={Math.max(1, bot - top)}\n fill={col}\n fillOpacity={o.close >= o.open ? 0.35 : 0.95}\n stroke={col}\n strokeWidth={1}\n />,\n )\n })\n })\n return <g>{els}</g>\n }\n\n if (!n) return null\n\n const allVals: number[] = []\n seriesList.forEach((ds) => {\n labels.forEach((_, xi) => {\n const v = yFromPoint(ds.data?.[xi], NaN)\n if (Number.isFinite(v)) allVals.push(v)\n })\n })\n props.annotations?.forEach((an) => {\n if (an.type === 'line' && an.value !== undefined && Number.isFinite(an.value)) allVals.push(an.value)\n if (an.type === 'band') {\n if (an.from !== undefined && Number.isFinite(an.from)) allVals.push(an.from)\n if (an.to !== undefined && Number.isFinite(an.to)) allVals.push(an.to)\n }\n })\n let minV = allVals.length ? Math.min(0, ...allVals) : 0\n let maxV = allVals.length ? Math.max(0, ...allVals, 1) : 1\n if (props.yAxis?.min !== undefined && Number.isFinite(props.yAxis.min)) minV = props.yAxis.min\n if (props.yAxis?.max !== undefined && Number.isFinite(props.yAxis.max)) maxV = props.yAxis.max\n const span = maxV - minV || 1\n\n const yScale = (v: number) => p.t + innerH - ((v - minV) / span) * innerH\n const xBand = innerW / Math.max(1, n)\n const zeroY = yScale(0)\n\n const annotationEls: React.ReactNode[] = []\n props.annotations?.forEach((an, ai) => {\n const stroke = an.color && String(an.color).trim() ? String(an.color) : 'color-mix(in srgb, var(--jr-text-muted, #94a3b8) 55%, transparent)'\n const dash = an.style === 'dashed' ? '4 3' : undefined\n if (an.type === 'band' && an.from !== undefined && an.to !== undefined) {\n const y1 = yScale(an.from)\n const y2 = yScale(an.to)\n const top = Math.min(y1, y2)\n const h = Math.max(Math.abs(y2 - y1), 1)\n annotationEls.push(\n <rect\n key={`anb-${ai}`}\n x={p.l}\n y={top}\n width={innerW}\n height={h}\n fill={stroke}\n fillOpacity={0.12}\n stroke=\"none\"\n />,\n )\n }\n if (an.type === 'line' && an.value !== undefined && Number.isFinite(an.value)) {\n const y = yScale(an.value)\n annotationEls.push(\n <line\n key={`anl-${ai}`}\n x1={p.l}\n y1={y}\n x2={p.l + innerW}\n y2={y}\n stroke={stroke}\n strokeWidth={1}\n strokeDasharray={dash}\n />,\n )\n if (an.label) {\n annotationEls.push(\n <text key={`anlt-${ai}`} className=\"jr-chart__tick\" x={p.l + innerW - 2} y={y - 4} textAnchor=\"end\" fill={stroke}>\n {an.label.length > 20 ? `${an.label.slice(0, 19)}…` : an.label}\n </text>,\n )\n }\n }\n })\n\n if (props.type === 'bar') {\n const stacked = Boolean(props.stacked)\n const groupGap = 0.15\n const m = Math.max(1, seriesList.length)\n const barW = stacked ? xBand * (1 - groupGap) : (xBand * (1 - groupGap)) / m\n const bars: React.ReactNode[] = []\n labels.forEach((_, xi) => {\n const gx = p.l + xi * xBand + (xBand * groupGap) / 2\n if (stacked) {\n let acc = 0\n seriesList.forEach((ds, di) => {\n const v = yFromPoint(ds.data?.[xi], 0)\n const num = Number.isFinite(v) ? v : 0\n const yBase = yScale(acc)\n const yTop = yScale(acc + num)\n const top = Math.min(yBase, yTop)\n const h = Math.max(Math.abs(yTop - yBase), num !== 0 ? 1 : 0)\n bars.push(\n <rect key={`bar-${xi}-${di}`} className=\"jr-pressable jr-focusable\" x={gx} y={top} width={barW * 0.92} height={h} fill={seriesColor(ds, di)} rx={2} data-bar=\"\">\n <title>{`${ds.name || `Series ${di + 1}`}: ${formatTickValue(num)}`}</title>\n </rect>,\n )\n acc += num\n })\n } else {\n seriesList.forEach((ds, di) => {\n const v = yFromPoint(ds.data?.[xi], 0)\n const num = Number.isFinite(v) ? v : 0\n const y1 = yScale(num)\n const top = Math.min(zeroY, y1)\n const h = Math.max(Math.abs(y1 - zeroY), num !== 0 ? 1 : 0)\n const x = gx + di * barW\n bars.push(\n <rect key={`bar-${xi}-${di}`} className=\"jr-pressable jr-focusable\" x={x} y={top} width={barW * 0.92} height={h} fill={seriesColor(ds, di)} rx={2} data-bar=\"\">\n <title>{`${labels[xi]} – ${ds.name || `Series ${di + 1}`}: ${formatTickValue(num)}`}</title>\n </rect>,\n )\n })\n }\n })\n return (\n <g>\n {annotationEls}\n {bars}\n </g>\n )\n }\n\n if (props.type === 'line' || props.type === 'area') {\n const areas: React.ReactNode[] = []\n const lines: React.ReactNode[] = []\n const dots: React.ReactNode[] = []\n const areaBaseY = Math.max(p.t, Math.min(zeroY, p.t + innerH))\n seriesList.forEach((ds, di) => {\n const ptsStr = labels\n .map((_, xi) => {\n const v = yFromPoint(ds.data?.[xi], 0)\n const num = Number.isFinite(v) ? v : 0\n const x = p.l + xi * xBand + xBand / 2\n const y = yScale(num)\n return `${x},${y}`\n })\n .join(' ')\n const color = seriesColor(ds, di)\n if (props.type === 'area') {\n const firstX = p.l + xBand / 2\n const lastX = p.l + (n - 1) * xBand + xBand / 2\n const polyPoints = `${firstX},${areaBaseY} ${ptsStr} ${lastX},${areaBaseY}`\n areas.push(<polygon key={`area-${di}`} fill={color} fillOpacity={0.2} stroke=\"none\" points={polyPoints} />)\n }\n lines.push(\n <polyline\n key={`line-${di}`}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n points={ptsStr}\n />,\n )\n labels.forEach((_, xi) => {\n const v = yFromPoint(ds.data?.[xi], 0)\n const num = Number.isFinite(v) ? v : 0\n const x = p.l + xi * xBand + xBand / 2\n const y = yScale(num)\n dots.push(<circle key={`dot-${di}-${xi}`} cx={x} cy={y} r={3} fill={color} />)\n })\n })\n return (\n <g>\n {areas}\n {annotationEls}\n {lines}\n {dots}\n </g>\n )\n }\n\n return null\n }, [innerH, innerW, labels, props.annotations, props.stacked, props.type, props.yAxis?.max, props.yAxis?.min, seriesList, pad.t, pad.l, hoveredSlice])\n\n const xTicks = useMemo(() => {\n const n = labels.length\n const xBand = innerW / Math.max(1, n)\n const maxChars = Math.max(3, Math.min(10, Math.floor(xBand / 7)))\n const step = n > 12 ? Math.ceil(n / 10) : 1\n return labels.map((lab, xi) => {\n if (xi % step !== 0 && xi !== n - 1) return null\n const x = pad.l + xi * xBand + xBand / 2\n const text = lab.length > maxChars ? `${lab.slice(0, maxChars - 1)}…` : lab\n return (\n <text key={`xt-${xi}`} className=\"jr-chart__tick\" x={x} y={vbH - 6} textAnchor=\"middle\">\n {text}\n </text>\n )\n })\n }, [labels, innerW, pad.l, vbH])\n\n const legend = seriesList.map((ds, i) => (\n <span key={`lg-${i}`} className=\"jr-chart__legend-item\" title={ds.name || `Series ${i + 1}`}>\n <span className=\"jr-chart__legend-swatch\" style={{ background: seriesColor(ds, i) }} />\n {truncate(ds.name || `Series ${i + 1}`, 14)}\n </span>\n ))\n\n const isPolar = props.type === 'pie' || props.type === 'donut' || props.type === 'radar'\n const isScatter = props.type === 'scatter'\n const showCartesianAxes = !isPolar && !isScatter && labels.length > 0 && seriesList.length > 0\n\n const hasData =\n seriesList.length > 0 &&\n (props.type === 'scatter'\n ? seriesList.some((s) => (s.data?.length ?? 0) > 0)\n : props.type === 'pie' || props.type === 'donut'\n ? (seriesList[0]?.data?.length ?? 0) > 0\n : labels.length > 0)\n\n const yTickEls = useMemo(() => {\n if (isPolar || !seriesList.length) return null\n const allVals: number[] = []\n seriesList.forEach((ds) => {\n labels.forEach((_, xi) => {\n const v = yFromPoint(ds.data?.[xi], NaN)\n if (Number.isFinite(v)) allVals.push(v)\n })\n })\n if (!allVals.length) return null\n let minV = Math.min(0, ...allVals)\n let maxV = Math.max(0, ...allVals, 1)\n if (props.yAxis?.min !== undefined && Number.isFinite(props.yAxis.min)) minV = props.yAxis.min\n if (props.yAxis?.max !== undefined && Number.isFinite(props.yAxis.max)) maxV = props.yAxis.max\n const span = maxV - minV || 1\n const ticks = niceRange(minV, maxV, 5)\n const yScale = (v: number) => pad.t + innerH - ((v - minV) / span) * innerH\n return (\n <g>\n {ticks.map((v, i) => {\n const y = yScale(v)\n if (y < pad.t - 2 || y > pad.t + innerH + 2) return null\n return (\n <React.Fragment key={`yt-${i}`}>\n <line className=\"jr-chart__grid-line\" x1={pad.l} y1={y} x2={pad.l + innerW} y2={y} />\n <text className=\"jr-chart__tick\" x={pad.l - 4} y={y + 3} textAnchor=\"end\">\n {formatTickValue(v)}\n </text>\n </React.Fragment>\n )\n })}\n </g>\n )\n }, [isPolar, seriesList, labels, props.yAxis?.min, props.yAxis?.max, pad.t, pad.l, innerH, innerW])\n\n const hoverInfo = useMemo(() => {\n if (!hoverPos || isPolar || isScatter) return null\n const n = labels.length\n if (!n || !seriesList.length) return null\n const xBand = innerW / Math.max(1, n)\n const rawIdx = Math.round((hoverPos.x - pad.l - xBand / 2) / xBand)\n const idx = Math.max(0, Math.min(rawIdx, n - 1))\n const crossX = pad.l + idx * xBand + xBand / 2\n if (hoverPos.x < pad.l - 8 || hoverPos.x > pad.l + innerW + 8 ||\n hoverPos.y < pad.t - 8 || hoverPos.y > pad.t + innerH + 20) return null\n const allV: number[] = []\n seriesList.forEach(ds => labels.forEach((_, xi) => {\n const v = yFromPoint(ds.data?.[xi], NaN)\n if (Number.isFinite(v)) allV.push(v)\n }))\n let lo = allV.length ? Math.min(0, ...allV) : 0\n let hi = allV.length ? Math.max(0, ...allV, 1) : 1\n if (props.yAxis?.min !== undefined && Number.isFinite(props.yAxis.min)) lo = props.yAxis.min\n if (props.yAxis?.max !== undefined && Number.isFinite(props.yAxis.max)) hi = props.yAxis.max\n const sp = hi - lo || 1\n const yS = (v: number) => pad.t + innerH - ((v - lo) / sp) * innerH\n\n if (props.type === 'candlestick') {\n const rows: TooltipRow[] = []\n seriesList.forEach((ds, di) => {\n const o = ohlcFromPoint(ds.data?.[idx])\n if (o) {\n const c = seriesColor(ds, di)\n rows.push({ color: c, label: 'Open', value: formatTickValue(o.open) })\n rows.push({ color: c, label: 'High', value: formatTickValue(o.high) })\n rows.push({ color: c, label: 'Low', value: formatTickValue(o.low) })\n rows.push({ color: c, label: 'Close', value: formatTickValue(o.close) })\n }\n })\n return { idx, crossX, rows, points: [] as { x: number; y: number; color: string }[], label: labels[idx] }\n }\n\n const rows: TooltipRow[] = seriesList.map((ds, di) => {\n const v = yFromPoint(ds.data?.[idx], 0)\n return { color: seriesColor(ds, di), label: ds.name || `Series ${di + 1}`, value: formatTickValue(Number.isFinite(v) ? v : 0) }\n })\n const points = (props.type === 'line' || props.type === 'area')\n ? seriesList.map((ds, di) => {\n const v = yFromPoint(ds.data?.[idx], 0)\n return { x: crossX, y: yS(Number.isFinite(v) ? v : 0), color: seriesColor(ds, di) }\n })\n : []\n return { idx, crossX, rows, points, label: labels[idx] }\n }, [hoverPos, isPolar, isScatter, labels, innerW, innerH, pad.l, pad.t, seriesList, props.type, props.yAxis?.min, props.yAxis?.max])\n\n const pieHoverInfo = useMemo(() => {\n if (hoveredSlice === null || (props.type !== 'pie' && props.type !== 'donut')) return null\n const series = seriesList[0]?.data ?? []\n const values = series.map(pt => {\n if (typeof pt === 'number') return Math.abs(Number.isFinite(pt) ? pt : 0)\n if (isOhlc(pt)) return Math.abs(pt.close)\n if (isXY(pt)) return Math.abs(pt.y)\n return 0\n })\n const total = values.reduce((a, b) => a + b, 0) || 1\n const idx = hoveredSlice\n if (idx < 0 || idx >= values.length) return null\n const label = labels[idx] || `#${idx + 1}`\n return {\n label,\n rows: [{\n color: seriesColor(seriesList[0] ?? {}, idx),\n label,\n value: `${values[idx].toLocaleString()} (${((values[idx] / total) * 100).toFixed(1)}%)`,\n }] as TooltipRow[],\n }\n }, [hoveredSlice, props.type, seriesList, labels])\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state short-circuits.\n // All hooks above this block have already run; safe to early-return.\n if (chartState.isError) {\n return (\n <div className=\"jr-chart\" data-state=\"error\">\n {props.title ? <p className=\"jr-chart__title\">{props.title}</p> : null}\n <StateView kind=\"error\" description={chartState.errorMessage} />\n {children}\n </div>\n )\n }\n if (chartState.isLoading) {\n return (\n <div className=\"jr-chart\" data-state=\"loading\">\n {props.title ? <p className=\"jr-chart__title\">{props.title}</p> : null}\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n return (\n <div className=\"jr-chart\">\n {props.title ? <p className=\"jr-chart__title\">{props.title}</p> : null}\n {!hasData ? (\n <div className=\"jr-chart__empty\">No chart data</div>\n ) : (\n <>\n <div ref={wrapRef} className=\"jr-chart__svg-wrap\">\n <svg\n className=\"jr-chart__svg\"\n viewBox={`0 0 ${vbW} ${vbH}`}\n role=\"img\"\n aria-labelledby={`jr-chart-title-${uid}`}\n style={{ height: vbH, cursor: isPolar || isScatter ? 'default' : 'crosshair' }}\n onMouseMove={onSvgMove}\n onMouseLeave={onSvgLeave}\n >\n <title id={`jr-chart-title-${uid}`}>{props.title || 'Chart'}</title>\n {yTickEls}\n {showCartesianAxes ? (\n <>\n <line\n className=\"jr-chart__axis\"\n x1={pad.l}\n y1={pad.t + innerH}\n x2={pad.l + innerW}\n y2={pad.t + innerH}\n />\n <line className=\"jr-chart__axis\" x1={pad.l} y1={pad.t} x2={pad.l} y2={pad.t + innerH} />\n </>\n ) : isScatter ? (\n <>\n <line\n className=\"jr-chart__axis\"\n x1={pad.l}\n y1={pad.t + innerH}\n x2={pad.l + innerW}\n y2={pad.t + innerH}\n />\n <line className=\"jr-chart__axis\" x1={pad.l} y1={pad.t} x2={pad.l} y2={pad.t + innerH} />\n </>\n ) : null}\n {chartBody}\n {hoverInfo && (\n <g>\n <line className=\"jr-chart__crosshair\" x1={hoverInfo.crossX} y1={pad.t} x2={hoverInfo.crossX} y2={pad.t + innerH} />\n {hoverInfo.points.map((pt, i) => (\n <circle key={`hd-${i}`} className=\"jr-chart__hover-dot\" cx={pt.x} cy={pt.y} r={5} fill={pt.color} stroke=\"var(--jr-surface, #fff)\" strokeWidth={2} />\n ))}\n </g>\n )}\n {showCartesianAxes ? <g>{xTicks}</g> : null}\n </svg>\n {hoverInfo && hoverPos && (\n <ChartTooltip\n visible\n x={hoverPos.x}\n y={hoverPos.y}\n title={hoverInfo.label}\n rows={hoverInfo.rows}\n boundW={cw || vbW}\n boundH={vbH}\n />\n )}\n {pieHoverInfo && hoverPos && (\n <ChartTooltip\n visible\n x={hoverPos.x}\n y={hoverPos.y}\n title={pieHoverInfo.label}\n rows={pieHoverInfo.rows}\n boundW={cw || vbW}\n boundH={vbH}\n />\n )}\n </div>\n {showLegend && legend.length ? <div className=\"jr-chart__legend\">{legend}</div> : null}\n </>\n )}\n {children}\n </div>\n )\n}\n\nexport default Chart\n","import React from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-chart-tooltip'\n\nconst SHEET = `\n.jr-tooltip-anchor {\n position: relative;\n}\n.jr-tooltip {\n position: absolute;\n pointer-events: none;\n z-index: 20;\n padding: 6px 10px;\n border-radius: var(--jr-radius, 6px);\n background: color-mix(in srgb, var(--jr-surface, #fff) 95%, var(--jr-text, #000));\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n box-shadow: 0 4px 14px color-mix(in srgb, var(--jr-text, #000) 14%, transparent);\n font-size: 11px;\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n white-space: nowrap;\n line-height: 1.6;\n opacity: 1;\n transition: opacity var(--jr-transition-fast) var(--jr-easing-standard), transform var(--jr-transition-fast) var(--jr-easing-standard);\n}\n.jr-tooltip--hidden {\n opacity: 0;\n transform: translateY(4px);\n pointer-events: none;\n}\n.jr-tooltip__title {\n font-size: 10px;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n margin-bottom: 2px;\n letter-spacing: 0.02em;\n}\n.jr-tooltip__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n}\n.jr-tooltip__swatch {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n flex-shrink: 0;\n}\n.jr-tooltip__label {\n color: var(--jr-text-muted, #64748b);\n font-size: 10px;\n flex: 1;\n}\n.jr-tooltip__val {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n font-size: 11px;\n}\n`\n\nexport interface TooltipRow {\n color?: string\n label: string\n value: string | number\n}\n\nexport interface ChartTooltipProps {\n visible: boolean\n x: number\n y: number\n title?: string\n rows?: TooltipRow[]\n children?: React.ReactNode\n boundW?: number\n boundH?: number\n}\n\nexport const ChartTooltip: React.FC<ChartTooltipProps> = ({\n visible, x, y, title, rows, children, boundW, boundH,\n}) => {\n injectStyles(STYLE_ID, SHEET)\n\n const flipX = boundW ? x > boundW * 0.65 : false\n const flipY = boundH ? y < boundH * 0.3 : false\n\n const style: React.CSSProperties = {\n left: flipX ? x - 14 : x + 14,\n top: flipY ? y + 18 : y - 8,\n transform: flipX ? 'translateX(-100%)' : undefined,\n }\n\n return (\n <div className={`jr-tooltip${visible ? '' : ' jr-tooltip--hidden'}`} style={style}>\n {title && <div className=\"jr-tooltip__title\">{title}</div>}\n {rows?.map((r, i) => (\n <div key={i} className=\"jr-tooltip__row\">\n {r.color && <span className=\"jr-tooltip__swatch\" style={{ background: r.color }} />}\n <span className=\"jr-tooltip__label\">{r.label}</span>\n <span className=\"jr-tooltip__val\">{r.value}</span>\n </div>\n ))}\n {children}\n </div>\n )\n}\n\nexport default ChartTooltip\n","import React, { useMemo } from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-trace-matrix'\n\nconst SHEET = `\n@keyframes jr-trace-matrix-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-trace-matrix {\n box-sizing: border-box;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: auto;\n max-width: 100%;\n animation: jr-trace-matrix-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-trace-matrix__coverage {\n padding: 0.5rem 0.75rem;\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 75%, var(--jr-surface, #fff));\n}\n.jr-trace-matrix__table {\n width: max-content;\n min-width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n font-size: 0.8125rem;\n}\n.jr-trace-matrix__th {\n position: sticky;\n top: 0;\n z-index: 2;\n padding: 0.5rem 0.45rem;\n text-align: center;\n font-weight: 600;\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 85%, var(--jr-surface, #fff));\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n max-width: 7rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.jr-trace-matrix__th--corner {\n left: 0;\n z-index: 3;\n text-align: left;\n min-width: 10rem;\n max-width: 14rem;\n}\n.jr-trace-matrix__td {\n padding: 0;\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n vertical-align: middle;\n transition: box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-trace-matrix__table tbody tr:hover .jr-trace-matrix__td {\n box-shadow: inset 0 0 0 9999px color-mix(in srgb, var(--jr-primary, #3b82f6) 6%, transparent);\n}\n.jr-trace-matrix__row-label {\n position: sticky;\n left: 0;\n z-index: 1;\n padding: 0.45rem 0.6rem;\n font-weight: 500;\n background: var(--jr-surface, #fff);\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n max-width: 14rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n transition: box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-trace-matrix__table tbody tr:hover .jr-trace-matrix__row-label {\n box-shadow: inset 0 0 0 9999px color-mix(in srgb, var(--jr-primary, #3b82f6) 6%, transparent);\n}\n.jr-trace-matrix__row-label__cat {\n display: block;\n font-size: 0.7rem;\n font-weight: 400;\n color: var(--jr-text-muted, #94a3b8);\n margin-top: 0.15rem;\n}\n.jr-trace-matrix__cell-btn {\n display: block;\n width: 100%;\n min-width: 2.25rem;\n min-height: 2rem;\n padding: 0;\n border: none;\n cursor: pointer;\n font: inherit;\n transition: filter var(--jr-transition-fast) var(--jr-easing-standard), transform var(--jr-transition-fast) var(--jr-easing-standard);\n}\n.jr-trace-matrix__cell-btn:hover {\n filter: brightness(0.97);\n}\n/* CWRF-013 Phase 5 Tier 5-2: :focus-visible handled by .jr-focusable--inset\n * mixin in motionFocusTokens.ts (tight-grid inset variant — outline drawn\n * inside the cell so neighbor cells do NOT clip the ring). */\n.jr-trace-matrix__cell-static {\n display: block;\n width: 100%;\n min-width: 2.25rem;\n min-height: 2rem;\n padding: 0;\n border: none;\n font: inherit;\n}\n.jr-trace-matrix__cell--covered { background: color-mix(in srgb, var(--jr-success, #22c55e) 28%, var(--jr-surface, #fff)); }\n.jr-trace-matrix__cell--partial { background: color-mix(in srgb, var(--jr-warning, #eab308) 32%, var(--jr-surface, #fff)); }\n.jr-trace-matrix__cell--missing { background: color-mix(in srgb, var(--jr-danger, #ef4444) 28%, var(--jr-surface, #fff)); }\n.jr-trace-matrix__cell--na { background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 14%, var(--jr-surface, #fff)); }\n.jr-trace-matrix__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n.jr-trace-matrix__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n.jr-trace-matrix__footer {\n padding: 0.45rem 0.75rem;\n font-size: 0.75rem;\n color: var(--jr-text-muted, #64748b);\n border-top: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n}\n`\n\ntype CellStatus = 'covered' | 'partial' | 'missing' | 'na'\n\nfunction normalizeCellStatus(raw: unknown): CellStatus {\n const s = String(raw ?? '').toLowerCase()\n if (s === 'covered' || s === 'partial' || s === 'missing' || s === 'na') return s\n return 'missing'\n}\n\nfunction cellLabel(status: CellStatus): string {\n switch (status) {\n case 'covered':\n return 'Covered'\n case 'partial':\n return 'Partial'\n case 'missing':\n return 'Missing'\n case 'na':\n default:\n return 'N/A'\n }\n}\n\ninterface TraceMatrixProps {\n props: {\n rows: { id: string; label: string; category?: string }[]\n columns: string[]\n cells: Record<string, Record<string, CellStatus>>\n linkable?: boolean\n showCoverage?: boolean\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const TraceMatrix: React.FC<TraceMatrixProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const rawRows = props.rows\n const rawCols = props.columns\n const rows = Array.isArray(rawRows) ? rawRows : []\n const columns = Array.isArray(rawCols) ? rawCols : []\n const cells = props.cells && typeof props.cells === 'object' ? props.cells : {}\n const linkable = Boolean(props.linkable)\n\n const coveragePct = useMemo(() => {\n if (rows.length === 0 || columns.length === 0) return 0\n let covered = 0\n const total = rows.length * columns.length\n for (const row of rows) {\n const rowMap = cells[row.id] ?? {}\n for (const col of columns) {\n const st = normalizeCellStatus(rowMap[col])\n if (st === 'covered') covered += 1\n }\n }\n return total > 0 ? Math.round((covered / total) * 100) : 0\n }, [rows, columns, cells])\n\n if (rows.length === 0 || columns.length === 0) {\n if (!Array.isArray(rawRows) || !Array.isArray(rawCols)) return null\n return (\n <div className=\"jr-trace-matrix\">\n <div className=\"jr-trace-matrix__empty\">\n {rows.length === 0 && columns.length === 0\n ? 'Add rows and columns to build the trace matrix.'\n : rows.length === 0\n ? 'No rows to trace.'\n : 'No columns to map coverage.'}\n </div>\n {children}\n </div>\n )\n }\n\n return (\n <div className=\"jr-trace-matrix\">\n {props.showCoverage ? (\n <div className=\"jr-trace-matrix__coverage\" aria-live=\"polite\">\n Coverage: {coveragePct}%\n </div>\n ) : null}\n <table className=\"jr-trace-matrix__table\">\n <thead>\n <tr>\n <th scope=\"col\" className=\"jr-trace-matrix__th jr-trace-matrix__th--corner\">\n Row / column\n </th>\n {columns.map((col) => (\n <th key={col} scope=\"col\" className=\"jr-trace-matrix__th\" title={col}>\n {col.length > 24 ? `${col.slice(0, 23)}…` : col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.id}>\n <th scope=\"row\" className=\"jr-trace-matrix__row-label\" title={row.label}>\n {row.label || row.id}\n {row.category ? <span className=\"jr-trace-matrix__row-label__cat\">{row.category}</span> : null}\n </th>\n {columns.map((col) => {\n const status = normalizeCellStatus(cells[row.id]?.[col])\n const cellClass = `jr-trace-matrix__td jr-trace-matrix__cell--${status}`\n const label = `${row.label || row.id}, ${col}: ${cellLabel(status)}`\n return (\n <td key={col} className={cellClass}>\n {linkable ? (\n <button\n type=\"button\"\n className=\"jr-trace-matrix__cell-btn jr-pressable jr-focusable--inset\"\n aria-label={label}\n onClick={() =>\n emit?.('trace-matrix:cell', {\n rowId: row.id,\n columnId: col,\n status,\n })\n }\n >\n <span className=\"jr-trace-matrix__sr-only\">{cellLabel(status)}</span>\n </button>\n ) : (\n <span className=\"jr-trace-matrix__cell-static\" role=\"img\" aria-label={label}>\n <span className=\"jr-trace-matrix__sr-only\">{cellLabel(status)}</span>\n </span>\n )}\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n {props.showCoverage ? (\n <div className=\"jr-trace-matrix__footer\">\n {rows.length} rows × {columns.length} columns — {coveragePct}% cells marked covered\n </div>\n ) : null}\n {children}\n </div>\n )\n}\n\nexport default TraceMatrix\n","/**\n * CWRF-013 Phase 3 PR-P3-#2 (Split D · RiskRegister 拆解) — RiskList.\n *\n * What this component is\n * ----------------------\n * The \"list view half\" of the legacy 333-LOC `RiskRegister`. Lays each risk\n * out as a card row with title + severity / likelihood / status badges +\n * optional description / owner / mitigation. Identical visual contract to\n * `RiskRegister(mode='list')` from the pre-split codebase, including the\n * exact same CSS class names (`.jr-risk-register__*`) so existing themes\n * keep working pixel-for-pixel after the migrator rewrites the spec.\n *\n * Why it's split\n * --------------\n * `RiskRegister(mode='list' | 'matrix')` baked two unrelated views into\n * one 333-LOC file. Phase 3 §2.4 decision #4 (delete-old +\n * transformer-only) requires modular siblings. The transformer\n * `legacy.riskregister.split` (PR-P3-#2 commit 3/N) auto-migrates the\n * legacy shape into either RiskList, RiskHeatMatrix, or a Stack of both.\n *\n * Data model (v1.1 校准, real-source-of-truth)\n * --------------------------------------------\n * Categorical severity × likelihood — same enums the legacy source code\n * already shipped (`'low' | 'medium' | 'high' | 'critical'` ×\n * `'unlikely' | 'possible' | 'likely' | 'certain'`). Status is the\n * 4-value enum that the legacy source actually rendered badges for:\n * `'open' | 'mitigating' | 'accepted' | 'closed'` (NOT the 3-value\n * `'open' | 'monitoring' | 'resolved'` the design doc §2.1 v1.0 draft\n * hypothesised — see §5 revision note in\n * `04_risk_register_split.md`).\n *\n * Events\n * ------\n * - `risk:select` with `{ id }` payload — fires on row click / Enter / Space.\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/04_risk_register_split.md §2.1\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #4\n */\n\nimport React from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-risk-register'\n\n// IMPORTANT: identical sheet to RiskRegister so legacy themes keep working\n// after the migrator rewrites specs. RiskHeatMatrix also injects this same\n// stylesheet (idempotent via injectStyles + STYLE_ID).\nconst SHEET = `\n@keyframes jr-risk-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-risk-register {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n animation: jr-risk-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-risk-register__list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.jr-risk-register__item {\n padding: calc(var(--jr-spacing, 12px) * 1.05) calc(var(--jr-spacing, 12px) * 1.25);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 7%, transparent);\n cursor: pointer;\n transition: background var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-risk-register__item:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, transparent);\n}\n.jr-risk-register__item:last-child {\n border-bottom: none;\n}\n.jr-risk-register__head {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.5rem 0.65rem;\n margin-bottom: 0.35rem;\n}\n.jr-risk-register__title {\n margin: 0;\n flex: 1 1 12rem;\n font-size: 0.9375rem;\n font-weight: 600;\n line-height: 1.35;\n}\n.jr-risk-register__badges {\n display: flex;\n flex-wrap: wrap;\n gap: 0.35rem;\n}\n.jr-risk-register__badge {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 0.2rem 0.45rem;\n border-radius: 4px;\n line-height: 1.2;\n}\n.jr-risk-register__badge--sev-low { background: color-mix(in srgb, var(--jr-success, #22c55e) 18%, var(--jr-surface, #fff)); color: var(--jr-text, #0f172a); }\n.jr-risk-register__badge--sev-medium { background: color-mix(in srgb, var(--jr-warning, #eab308) 22%, var(--jr-surface, #fff)); color: var(--jr-text, #0f172a); }\n.jr-risk-register__badge--sev-high { background: color-mix(in srgb, var(--jr-danger, #ef4444) 22%, var(--jr-surface, #fff)); color: var(--jr-text, #0f172a); }\n.jr-risk-register__badge--sev-critical { background: color-mix(in srgb, var(--jr-danger, #dc2626) 45%, var(--jr-surface, #fff)); color: var(--jr-surface, #fff); }\n.jr-risk-register__badge--like-unlikely { border: 1px solid color-mix(in srgb, var(--jr-text-muted, #94a3b8) 40%, transparent); color: var(--jr-text-muted, #64748b); }\n.jr-risk-register__badge--like-possible { border: 1px solid color-mix(in srgb, var(--jr-primary, #3b82f6) 40%, transparent); color: var(--jr-primary, #1d4ed8); }\n.jr-risk-register__badge--like-likely { border: 1px solid color-mix(in srgb, var(--jr-warning, #ca8a04) 45%, transparent); color: var(--jr-warning, #a16207); }\n.jr-risk-register__badge--like-certain { border: 1px solid color-mix(in srgb, var(--jr-danger, #ef4444) 45%, transparent); color: var(--jr-danger, #b91c1c); }\n.jr-risk-register__badge--st-open { background: color-mix(in srgb, var(--jr-primary, #3b82f6) 16%, var(--jr-surface, #fff)); color: color-mix(in srgb, var(--jr-primary, #1d4ed8) 85%, var(--jr-text, #0f172a)); }\n.jr-risk-register__badge--st-mitigating { background: color-mix(in srgb, var(--jr-warning, #eab308) 22%, var(--jr-surface, #fff)); color: var(--jr-text, #0f172a); }\n.jr-risk-register__badge--st-accepted { background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 16%, var(--jr-surface, #fff)); color: var(--jr-text-muted, #475569); }\n.jr-risk-register__badge--st-closed { background: color-mix(in srgb, var(--jr-success, #22c55e) 20%, var(--jr-surface, #fff)); color: color-mix(in srgb, var(--jr-success, #15803d) 90%, var(--jr-text, #0f172a)); }\n.jr-risk-register__desc {\n margin: 0 0 0.35rem;\n font-size: 0.8125rem;\n line-height: 1.45;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-risk-register__meta {\n margin: 0;\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #64748b);\n line-height: 1.45;\n}\n.jr-risk-register__meta strong {\n color: var(--jr-text, #0f172a);\n font-weight: 600;\n}\n.jr-risk-register__mitigation {\n margin: 0.45rem 0 0;\n font-size: 0.8125rem;\n line-height: 1.5;\n padding-left: 0.65rem;\n border-left: 3px solid color-mix(in srgb, var(--jr-primary, #3b82f6) 35%, transparent);\n}\n.jr-risk-register__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n`\n\nexport type RiskSeverity = 'low' | 'medium' | 'high' | 'critical'\nexport type RiskLikelihood = 'unlikely' | 'possible' | 'likely' | 'certain'\nexport type RiskStatus = 'open' | 'mitigating' | 'accepted' | 'closed'\n\nexport interface RiskItem {\n id: string\n title: string\n description?: string\n severity: RiskSeverity\n likelihood: RiskLikelihood\n mitigation?: string\n status: RiskStatus\n owner?: string\n}\n\nexport interface RiskListProps {\n props: {\n risks: RiskItem[]\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace list with spinner. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace list with error placeholder. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const RiskList: React.FC<RiskListProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state hook (unconditional).\n const listState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const rawRisks = props.risks\n const risks = Array.isArray(rawRisks) ? rawRisks : []\n\n if (listState.isError) {\n return (\n <div className=\"jr-risk-register\" data-state=\"error\">\n <StateView kind=\"error\" description={listState.errorMessage} />\n {children}\n </div>\n )\n }\n if (listState.isLoading) {\n return (\n <div className=\"jr-risk-register\" data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (risks.length === 0) {\n // Mirror legacy RiskRegister: when caller intends an empty list (`risks: []`)\n // we render an empty-state card; when caller passes a non-array we render\n // nothing at all (defensive, matches the old contract).\n if (!Array.isArray(rawRisks)) return null\n return (\n <div className=\"jr-risk-register\">\n <div className=\"jr-risk-register__empty\">No risks registered.</div>\n {children}\n </div>\n )\n }\n\n return (\n <div className=\"jr-risk-register\">\n <ul className=\"jr-risk-register__list\" role=\"list\">\n {risks.map((r) => (\n <li key={r.id}>\n <article\n className=\"jr-risk-register__item jr-pressable jr-focusable\"\n role=\"button\"\n tabIndex={0}\n onClick={() => emit?.('risk:select', { id: r.id })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emit?.('risk:select', { id: r.id })\n }\n }}\n >\n <div className=\"jr-risk-register__head\">\n <h3 className=\"jr-risk-register__title\">{r.title || r.id}</h3>\n <div className=\"jr-risk-register__badges\">\n <span\n className={`jr-risk-register__badge jr-risk-register__badge--sev-${r.severity}`}\n >\n {r.severity}\n </span>\n <span\n className={`jr-risk-register__badge jr-risk-register__badge--like-${r.likelihood}`}\n >\n L: {r.likelihood}\n </span>\n <span\n className={`jr-risk-register__badge jr-risk-register__badge--st-${r.status}`}\n >\n {r.status}\n </span>\n </div>\n </div>\n {r.description ? <p className=\"jr-risk-register__desc\">{r.description}</p> : null}\n {r.owner ? (\n <p className=\"jr-risk-register__meta\">\n <strong>Owner:</strong> {r.owner}\n </p>\n ) : null}\n {r.mitigation ? (\n <p className=\"jr-risk-register__mitigation\">{r.mitigation}</p>\n ) : null}\n </article>\n </li>\n ))}\n </ul>\n {children}\n </div>\n )\n}\n\nexport default RiskList\n","/**\n * CWRF-013 Phase 3 PR-P3-#2 (Split D · RiskRegister 拆解) — RiskHeatMatrix.\n *\n * What this component is\n * ----------------------\n * The \"matrix view half\" of the legacy 333-LOC `RiskRegister`. A 4×4\n * severity × likelihood grid where every cell lists the risks that fall\n * into its (severity, likelihood) quadrant with a status badge. Mirrors\n * the legacy `mode='matrix'` render path 1:1 — same CSS class names\n * (`.jr-risk-register__matrix*`), same emit contract (`risk:select` with\n * `{ id }` on cell-item click / Enter / Space), same axis ordering\n * (severity rows critical → low top-to-bottom; likelihood columns\n * unlikely → certain left-to-right) so existing themes keep working\n * pixel-for-pixel after the migrator rewrites the spec.\n *\n * Why it's split\n * --------------\n * `RiskRegister(mode='list' | 'matrix')` baked two unrelated views into\n * one 333-LOC file. Phase 3 §2.4 decision #4 (delete-old +\n * transformer-only) requires modular siblings. The transformer\n * `legacy.riskregister.split` (PR-P3-#2 commit 3/N) auto-migrates the\n * legacy shape into either RiskList, RiskHeatMatrix, or a Stack of both.\n *\n * Data model (v1.1 校准, real-source-of-truth)\n * --------------------------------------------\n * Categorical severity × likelihood — 4×4 grid (NOT 5×5 probability ×\n * impact). The legacy source code already shipped this model; v1.0\n * design draft hypothesised a 5×5 numeric model that mismatched\n * reality. See 04_risk_register_split.md §2.3 (decision) + §5 (revision\n * note D-6).\n *\n * Events\n * ------\n * - `risk:select` with `{ id }` payload — fires on cell-item click /\n * Enter / Space.\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/04_risk_register_split.md §2.2 + §2.3\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/04_overdesign_refactor/06_phase3_kickoff_checklist.md decision #4\n */\n\nimport React from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-risk-register'\n\n// IMPORTANT: identical sheet to RiskList + legacy RiskRegister — sharing\n// `STYLE_ID` makes injectStyles idempotent across the trio so themes and\n// CSS overrides apply uniformly.\nconst SHEET = `\n@keyframes jr-risk-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-risk-register {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n animation: jr-risk-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-risk-register__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n.jr-risk-register__meta {\n margin: 0;\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #64748b);\n line-height: 1.45;\n}\n.jr-risk-register__badge {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 0.2rem 0.45rem;\n border-radius: 4px;\n line-height: 1.2;\n}\n.jr-risk-register__badge--st-open { background: color-mix(in srgb, var(--jr-primary, #3b82f6) 16%, var(--jr-surface, #fff)); color: color-mix(in srgb, var(--jr-primary, #1d4ed8) 85%, var(--jr-text, #0f172a)); }\n.jr-risk-register__badge--st-mitigating { background: color-mix(in srgb, var(--jr-warning, #eab308) 22%, var(--jr-surface, #fff)); color: var(--jr-text, #0f172a); }\n.jr-risk-register__badge--st-accepted { background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 16%, var(--jr-surface, #fff)); color: var(--jr-text-muted, #475569); }\n.jr-risk-register__badge--st-closed { background: color-mix(in srgb, var(--jr-success, #22c55e) 20%, var(--jr-surface, #fff)); color: color-mix(in srgb, var(--jr-success, #15803d) 90%, var(--jr-text, #0f172a)); }\n.jr-risk-register__matrix {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.75rem;\n}\n.jr-risk-register__matrix th,\n.jr-risk-register__matrix td {\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n padding: 0.35rem 0.45rem;\n vertical-align: top;\n text-align: left;\n}\n.jr-risk-register__matrix th {\n font-weight: 600;\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 8%, var(--jr-surface, #fff));\n}\n.jr-risk-register__matrix tbody tr {\n transition: background var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-risk-register__matrix tbody tr:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, transparent);\n}\n.jr-risk-register__matrix-cell {\n transition: background var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-risk-register__matrix-cell:hover {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 8%, transparent);\n}\n.jr-risk-register__matrix-corner {\n width: 4.5rem;\n}\n.jr-risk-register__matrix-cell ul {\n margin: 0;\n padding-left: 1rem;\n}\n.jr-risk-register__matrix-cell li {\n margin: 0.15rem 0;\n cursor: pointer;\n transition: opacity var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-risk-register__matrix-cell li:hover {\n opacity: 0.88;\n}\n.jr-risk-register__matrix-status {\n margin-left: 0.35rem;\n display: inline-block;\n vertical-align: middle;\n}\n`\n\ntype Severity = 'low' | 'medium' | 'high' | 'critical'\ntype Likelihood = 'unlikely' | 'possible' | 'likely' | 'certain'\ntype RiskStatus = 'open' | 'mitigating' | 'accepted' | 'closed'\n\n// Axis ordering — preserves legacy RiskRegister(mode='matrix') visual\n// contract. Severity rows go critical → low (highest risk on top, scans\n// from top-left to bottom-right). Likelihood columns go unlikely →\n// certain (least likely on left).\nconst LIKELIHOOD_ORDER: Likelihood[] = ['unlikely', 'possible', 'likely', 'certain']\nconst SEVERITY_ORDER: Severity[] = ['critical', 'high', 'medium', 'low']\n\nexport interface RiskHeatMatrixRisk {\n id: string\n title: string\n severity: Severity\n likelihood: Likelihood\n status: RiskStatus\n}\n\nexport interface RiskHeatMatrixProps {\n props: {\n risks: RiskHeatMatrixRisk[]\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const RiskHeatMatrix: React.FC<RiskHeatMatrixProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const rawRisks = props.risks\n const risks = Array.isArray(rawRisks) ? rawRisks : []\n\n if (risks.length === 0) {\n if (!Array.isArray(rawRisks)) return null\n return (\n <div className=\"jr-risk-register\">\n <div className=\"jr-risk-register__empty\">No risks registered.</div>\n {children}\n </div>\n )\n }\n\n // Bucket risks by `${severity}::${likelihood}`. Same map structure as the\n // legacy RiskRegister so themes that count items per cell keep working.\n const cellMap = new Map<string, RiskHeatMatrixRisk[]>()\n for (const r of risks) {\n const key = `${r.severity}::${r.likelihood}`\n const list = cellMap.get(key) ?? []\n list.push(r)\n cellMap.set(key, list)\n }\n\n return (\n <div className=\"jr-risk-register\">\n <table className=\"jr-risk-register__matrix\" role=\"grid\" aria-label=\"Risk matrix\">\n <thead>\n <tr>\n <th className=\"jr-risk-register__matrix-corner\" scope=\"col\">\n Severity / Likelihood\n </th>\n {LIKELIHOOD_ORDER.map((lh) => (\n <th key={lh} scope=\"col\">\n {lh}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {SEVERITY_ORDER.map((sev) => (\n <tr key={sev}>\n <th scope=\"row\">{sev}</th>\n {LIKELIHOOD_ORDER.map((lh) => {\n const cellRisks = cellMap.get(`${sev}::${lh}`) ?? []\n return (\n <td key={lh} className=\"jr-risk-register__matrix-cell jr-pressable jr-focusable\">\n {cellRisks.length === 0 ? (\n <span className=\"jr-risk-register__meta\">—</span>\n ) : (\n <ul>\n {cellRisks.map((r) => (\n <li\n key={r.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => emit?.('risk:select', { id: r.id })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emit?.('risk:select', { id: r.id })\n }\n }}\n >\n <span>{r.title || r.id}</span>\n <span\n className={`jr-risk-register__badge jr-risk-register__badge--st-${r.status} jr-risk-register__matrix-status`}\n >\n {r.status}\n </span>\n </li>\n ))}\n </ul>\n )}\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n {children}\n </div>\n )\n}\n\nexport default RiskHeatMatrix\n","import React from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-evidence-chain'\n\nconst SHEET = `\n@keyframes jr-evidence-chain-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-evidence-chain {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n padding: calc(var(--jr-spacing, 12px) * 1.1) calc(var(--jr-spacing, 12px) * 1.25);\n animation: jr-evidence-chain-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-evidence-chain__list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.jr-evidence-chain__item {\n position: relative;\n padding-left: 1.35rem;\n padding-bottom: 1rem;\n cursor: pointer;\n border-radius: 6px;\n margin-left: -0.25rem;\n padding-left: calc(1.35rem + 0.25rem);\n transition: background-color var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-evidence-chain__item:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, transparent);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n}\n.jr-evidence-chain__item:last-child {\n padding-bottom: 0;\n}\n.jr-evidence-chain__item::before {\n content: '';\n position: absolute;\n left: 0.35rem;\n top: 0.5rem;\n bottom: -0.25rem;\n width: 2px;\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 35%, transparent);\n}\n.jr-evidence-chain__item:last-child::before {\n bottom: auto;\n height: 0.65rem;\n}\n.jr-evidence-chain__dot {\n position: absolute;\n left: 0.2rem;\n top: 0.35rem;\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 50%;\n background: var(--jr-primary, #3b82f6);\n border: 2px solid var(--jr-surface, #fff);\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n}\n.jr-evidence-chain__claim {\n margin: 0 0 0.35rem;\n font-size: 0.9375rem;\n font-weight: 600;\n line-height: 1.4;\n}\n.jr-evidence-chain__source-text {\n margin: 0 0 0.4rem;\n font-size: 0.8125rem;\n line-height: 1.5;\n color: var(--jr-text-muted, #475569);\n}\n.jr-evidence-chain__details {\n margin: 0 0 0.4rem;\n font-size: 0.8125rem;\n line-height: 1.45;\n color: var(--jr-text-muted, #64748b);\n padding-left: 0.5rem;\n border-left: 2px solid color-mix(in srgb, var(--jr-text-muted, #94a3b8) 35%, transparent);\n}\n.jr-evidence-chain__footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.4rem 0.65rem;\n}\n.jr-evidence-chain__verify {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.125rem;\n height: 1.125rem;\n font-size: 0.75rem;\n line-height: 1;\n border-radius: 50%;\n flex-shrink: 0;\n}\n.jr-evidence-chain__verify--yes {\n background: color-mix(in srgb, var(--jr-success, #22c55e) 28%, var(--jr-surface, #fff));\n color: var(--jr-success, #15803d);\n border: 1px solid color-mix(in srgb, var(--jr-success, #22c55e) 50%, transparent);\n}\n.jr-evidence-chain__verify--no {\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 14%, var(--jr-surface, #fff));\n color: var(--jr-text-muted, #94a3b8);\n border: 1px solid color-mix(in srgb, var(--jr-text-muted, #94a3b8) 35%, transparent);\n}\n.jr-evidence-chain__type {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n padding: 0.15rem 0.4rem;\n border-radius: 4px;\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 12%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-primary, #1d4ed8) 80%, var(--jr-text, #0f172a));\n}\n.jr-evidence-chain__link {\n font-size: 0.75rem;\n color: var(--jr-primary, #2563eb);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n.jr-evidence-chain__link:hover {\n color: color-mix(in srgb, var(--jr-primary, #1d4ed8) 90%, var(--jr-text, #0f172a));\n}\n.jr-evidence-chain--compact {\n padding: var(--jr-spacing, 12px);\n}\n.jr-evidence-chain--compact .jr-evidence-chain__claim {\n font-size: 0.875rem;\n}\n.jr-evidence-chain--compact .jr-evidence-chain__item {\n padding-bottom: 0.75rem;\n}\n.jr-evidence-chain__empty {\n margin: 0;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n padding: 0.5rem 0;\n}\n.jr-evidence-chain--horizontal .jr-evidence-chain__list {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 0.75rem;\n align-items: stretch;\n}\n.jr-evidence-chain--horizontal .jr-evidence-chain__item {\n flex: 1 1 11rem;\n min-width: 9rem;\n padding-left: 0;\n padding-bottom: 0;\n padding: 0.65rem 0.75rem;\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n border-radius: var(--jr-radius, 8px);\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 4%, var(--jr-surface, #fff));\n margin-left: 0;\n}\n.jr-evidence-chain--horizontal .jr-evidence-chain__item:hover {\n transform: translateY(-2px);\n border-color: color-mix(in srgb, var(--jr-primary, #3b82f6) 30%, transparent);\n}\n.jr-evidence-chain--horizontal .jr-evidence-chain__item::before {\n display: none;\n}\n.jr-evidence-chain--horizontal .jr-evidence-chain__dot {\n display: none;\n}\n`\n\ntype SourceType =\n | 'calculation'\n | 'datasheet'\n | 'simulation'\n | 'measurement'\n | 'assumption'\n | 'reference'\n\nconst SOURCE_TYPE_ICON: Record<SourceType, string> = {\n calculation: '∑',\n datasheet: '◫',\n simulation: '◎',\n measurement: '⌖',\n assumption: '?',\n reference: '↗',\n}\n\ninterface EvidenceChainProps {\n props: {\n claims: {\n claim: string\n source: string\n sourceType: SourceType\n verified: boolean\n details?: string\n link?: string\n }[]\n orientation?: 'vertical' | 'horizontal'\n variant?: string\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace chain with spinner. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace chain with error placeholder. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const EvidenceChain: React.FC<EvidenceChainProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state hook (unconditional).\n const chainState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const variant = props.variant ?? 'default'\n const orientation = props.orientation ?? 'vertical'\n const rawClaims = props.claims\n const claims = Array.isArray(rawClaims) ? rawClaims : []\n\n const rootClass = [\n 'jr-evidence-chain',\n variant && variant !== 'default' ? `jr-evidence-chain--${variant}` : '',\n orientation === 'horizontal' ? 'jr-evidence-chain--horizontal' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n if (chainState.isError) {\n return (\n <div className={rootClass} data-state=\"error\">\n <StateView kind=\"error\" description={chainState.errorMessage} />\n {children}\n </div>\n )\n }\n if (chainState.isLoading) {\n return (\n <div className={rootClass} data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (claims.length === 0) {\n if (!Array.isArray(rawClaims)) return null\n return (\n <div className={rootClass}>\n <p className=\"jr-evidence-chain__empty\">No evidence chain entries.</p>\n {children}\n </div>\n )\n }\n\n return (\n <div className={rootClass}>\n <ol className=\"jr-evidence-chain__list\" role=\"list\">\n {claims.map((entry, i) => {\n const dispatch = () => emit?.('evidence:select', { index: i, entry })\n return (\n <li key={i}>\n <div\n className=\"jr-evidence-chain__item jr-pressable jr-focusable\"\n role=\"button\"\n tabIndex={0}\n aria-label={`Evidence ${i + 1}: ${entry.claim || ''}`}\n onClick={dispatch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n dispatch()\n }\n }}\n >\n {orientation === 'vertical' ? <span className=\"jr-evidence-chain__dot\" aria-hidden /> : null}\n <p className=\"jr-evidence-chain__claim\">{entry.claim || '—'}</p>\n <p className=\"jr-evidence-chain__source-text\">{entry.source || '—'}</p>\n {entry.details ? <p className=\"jr-evidence-chain__details\">{entry.details}</p> : null}\n <div className=\"jr-evidence-chain__footer\">\n <span\n className={`jr-evidence-chain__verify jr-evidence-chain__verify--${entry.verified ? 'yes' : 'no'}`}\n title={entry.verified ? 'Verified' : 'Not verified'}\n aria-label={entry.verified ? 'Verified' : 'Not verified'}\n role=\"img\"\n >\n {entry.verified ? '✓' : '○'}\n </span>\n <span className=\"jr-evidence-chain__type\" title={entry.sourceType}>\n <span aria-hidden>{SOURCE_TYPE_ICON[entry.sourceType] ?? '•'} </span>\n {entry.sourceType}\n </span>\n {entry.link ? (\n <a className=\"jr-evidence-chain__link\" href={entry.link} target=\"_blank\" rel=\"noopener noreferrer\">\n Link\n </a>\n ) : null}\n </div>\n </div>\n </li>\n )\n })}\n </ol>\n {children}\n </div>\n )\n}\n\nexport default EvidenceChain\n","import React from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-assumption-register'\n\nconst SHEET = `\n@keyframes jr-assumption-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-assumption-register {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n animation: jr-assumption-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-assumption-register__list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.jr-assumption-register__item {\n padding: calc(var(--jr-spacing, 12px) * 1.05) calc(var(--jr-spacing, 12px) * 1.25);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 7%, transparent);\n cursor: pointer;\n transition: background var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-assumption-register__item:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, transparent);\n}\n.jr-assumption-register__item:last-child {\n border-bottom: none;\n}\n.jr-assumption-register__row {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.5rem 0.65rem;\n margin-bottom: 0.4rem;\n}\n.jr-assumption-register__id {\n font-size: 0.6875rem;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n color: var(--jr-text-muted, #94a3b8);\n letter-spacing: 0.02em;\n}\n.jr-assumption-register__status {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 0.2rem 0.45rem;\n border-radius: 4px;\n}\n.jr-assumption-register__status--verified {\n background: color-mix(in srgb, var(--jr-success, #22c55e) 20%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-success, #15803d) 90%, var(--jr-text, #0f172a));\n}\n.jr-assumption-register__status--pending {\n background: color-mix(in srgb, var(--jr-warning, #eab308) 22%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-warning, #a16207) 90%, var(--jr-text, #0f172a));\n}\n.jr-assumption-register__status--unverified {\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 16%, var(--jr-surface, #fff));\n color: var(--jr-text-muted, #64748b);\n}\n.jr-assumption-register__status--invalid {\n background: color-mix(in srgb, var(--jr-danger, #ef4444) 20%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-danger, #b91c1c) 90%, var(--jr-text, #0f172a));\n}\n.jr-assumption-register__text {\n margin: 0;\n font-size: 0.875rem;\n line-height: 1.5;\n flex: 1 1 100%;\n}\n.jr-assumption-register__detail {\n margin: 0.35rem 0 0;\n font-size: 0.8125rem;\n line-height: 1.45;\n color: var(--jr-text-muted, #64748b);\n padding-left: 0.55rem;\n border-left: 2px solid color-mix(in srgb, var(--jr-text-muted, #94a3b8) 40%, transparent);\n}\n.jr-assumption-register__detail strong {\n color: var(--jr-text, #334155);\n font-weight: 600;\n}\n.jr-assumption-register__impact {\n display: inline-block;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n padding: 0.15rem 0.4rem;\n border-radius: 4px;\n margin-top: 0.35rem;\n}\n.jr-assumption-register__impact--low {\n background: color-mix(in srgb, var(--jr-success, #22c55e) 14%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-success, #15803d) 85%, var(--jr-text, #0f172a));\n}\n.jr-assumption-register__impact--medium {\n background: color-mix(in srgb, var(--jr-warning, #eab308) 20%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-warning, #a16207) 90%, var(--jr-text, #0f172a));\n}\n.jr-assumption-register__impact--high {\n background: color-mix(in srgb, var(--jr-danger, #ef4444) 18%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-danger, #b91c1c) 90%, var(--jr-text, #0f172a));\n}\n.jr-assumption-register--compact .jr-assumption-register__item {\n padding: var(--jr-spacing, 12px) calc(var(--jr-spacing, 12px) * 1.05);\n}\n.jr-assumption-register__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n`\n\ntype AssumptionStatus = 'verified' | 'pending' | 'unverified' | 'invalid'\ntype ImpactLevel = 'low' | 'medium' | 'high'\n\ninterface AssumptionRegisterProps {\n props: {\n assumptions: {\n id: string\n text: string\n basis: string\n owner?: string\n status: AssumptionStatus\n validationMethod?: string\n impact?: ImpactLevel\n }[]\n showImpact?: boolean\n variant?: string\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace register with spinner. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace register with error placeholder. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const AssumptionRegister: React.FC<AssumptionRegisterProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state hook (unconditional).\n const regState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const variant = props.variant ?? 'default'\n const showImpact = props.showImpact ?? true\n const rawAssumptions = props.assumptions\n const assumptions = Array.isArray(rawAssumptions) ? rawAssumptions : []\n\n const rootClass = [\n 'jr-assumption-register',\n variant && variant !== 'default' ? `jr-assumption-register--${variant}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n if (regState.isError) {\n return (\n <div className={rootClass} data-state=\"error\">\n <StateView kind=\"error\" description={regState.errorMessage} />\n {children}\n </div>\n )\n }\n if (regState.isLoading) {\n return (\n <div className={rootClass} data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (assumptions.length === 0) {\n if (!Array.isArray(rawAssumptions)) return null\n return (\n <div className={rootClass}>\n <div className=\"jr-assumption-register__empty\">No assumptions recorded.</div>\n {children}\n </div>\n )\n }\n\n return (\n <div className={rootClass}>\n <ul className=\"jr-assumption-register__list\" role=\"list\">\n {assumptions.map((a) => (\n <li key={a.id}>\n <article\n className=\"jr-assumption-register__item jr-pressable jr-focusable\"\n onClick={() => emit?.('assumption:select', { id: a.id })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emit?.('assumption:select', { id: a.id })\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n <div className=\"jr-assumption-register__row\">\n <span className=\"jr-assumption-register__id\">{a.id}</span>\n <span className={`jr-assumption-register__status jr-assumption-register__status--${a.status}`}>\n {a.status}\n </span>\n </div>\n <p className=\"jr-assumption-register__text\">{a.text || '—'}</p>\n {a.owner ? (\n <p className=\"jr-assumption-register__detail\">\n <strong>Owner:</strong> {a.owner}\n </p>\n ) : null}\n <p className=\"jr-assumption-register__detail\">\n <strong>Basis:</strong> {a.basis || '—'}\n </p>\n {a.validationMethod ? (\n <p className=\"jr-assumption-register__detail\">\n <strong>Validation:</strong> {a.validationMethod}\n </p>\n ) : null}\n {showImpact && a.impact ? (\n <span className={`jr-assumption-register__impact jr-assumption-register__impact--${a.impact}`}>\n Impact: {a.impact}\n </span>\n ) : null}\n </article>\n </li>\n ))}\n </ul>\n {children}\n </div>\n )\n}\n\nexport default AssumptionRegister\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\n/* ─── Layout constants (CSS pixels, 1 : 1 via ResizeObserver) ─── */\n\nconst LABEL_W = 140\nconst ROW_H = 52\nconst AXIS_H = 24\nconst PAD_L = 16\nconst PAD_R = 36\nconst BAR_H = 20\nconst BAR_RADIUS = 4\nconst MS_BAND = 30\nconst CONN_GAP = 16\nconst ARROW_SZ = 4\nconst LANE_W = 5\nconst DAY_MS = 86400000\nconst FALLBACK_W = 460\n\n/* ─── Injected stylesheet ─── */\n\nconst STYLE_ID = 'jr-styles-gantt-chart'\nconst SHEET = `\n@keyframes jr-gantt-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-gantt {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n animation: jr-gantt-in .3s ease-out both;\n}\n.jr-gantt__title {\n margin: 0;\n padding: 10px 14px;\n font-size: .875rem;\n font-weight: 600;\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 70%, var(--jr-surface, #fff));\n}\n\n/* ── Split layout ── */\n.jr-gantt__body {\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n}\n\n/* ── Fixed label column ── */\n.jr-gantt__labels {\n flex: 0 0 ${LABEL_W}px;\n background: var(--jr-surface, #ffffff);\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n overflow: hidden;\n z-index: 2;\n}\n.jr-gantt__label-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n padding: 0 10px;\n box-sizing: border-box;\n}\n.jr-gantt__label-row--alt {\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 40%, transparent);\n}\n.jr-gantt__label-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n.jr-gantt__task-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--jr-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.25;\n}\n.jr-gantt__task-group-text {\n font-size: 11px;\n color: var(--jr-text-muted, #94a3b8);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.25;\n}\n\n/* ── Scrollable timeline ── */\n.jr-gantt__timeline {\n flex: 1 1 0;\n min-width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n.jr-gantt .jr-gantt__svg {\n display: block;\n shape-rendering: geometricPrecision;\n max-width: none;\n}\n\n/* ── SVG elements ── */\n.jr-gantt__bar {\n transition: filter var(--jr-transition-fast) var(--jr-easing-standard);\n cursor: pointer;\n}\n.jr-gantt__bar:hover {\n filter: brightness(1.12);\n}\n.jr-gantt__connector {\n fill: none;\n stroke: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 40%, transparent);\n stroke-width: 1;\n stroke-linejoin: round;\n}\n.jr-gantt__arrow {\n fill: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 45%, transparent);\n}\n.jr-gantt__tick-label {\n font-size: 11px;\n fill: var(--jr-text-muted, #64748b);\n font-weight: 500;\n letter-spacing: .04em;\n}\n.jr-gantt__grid-line {\n stroke: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 12%, transparent);\n stroke-width: .5;\n}\n.jr-gantt__today {\n stroke: color-mix(in srgb, var(--jr-accent, #f59e0b) 70%, var(--jr-text, #0f172a));\n stroke-width: 1.5;\n stroke-dasharray: 4 3;\n}\n.jr-gantt__milestone {\n transition: filter var(--jr-transition-fast) var(--jr-easing-standard);\n cursor: pointer;\n}\n.jr-gantt__milestone:hover {\n filter: brightness(1.15) drop-shadow(0 1px 3px rgba(0,0,0,.15));\n}\n.jr-gantt__ms-label {\n font-size: 10px;\n fill: var(--jr-text-muted, #64748b);\n font-weight: 500;\n}\n.jr-gantt__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: .875rem;\n}\n/* CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-007): SVG critical-path dual encoding.\n * The pattern lines use --jr-danger so the hatch tracks the brand danger\n * color under normal rendering; the @media (forced-colors: active) block in\n * motionFocusTokens.ts already remaps --jr-danger to system 'Mark', so the\n * hatch remains visible (and clearly different from the safe-bar pattern)\n * in Windows High Contrast mode too. */\n.jr-gantt__critical-pattern-line {\n stroke: var(--jr-danger, #ef4444);\n stroke-width: 1.25;\n shape-rendering: crispEdges;\n}\n@media (forced-colors: active) {\n .jr-gantt__critical-pattern-line {\n stroke: Mark;\n }\n}\n`\n\n/* ─── Interfaces ─── */\n\ninterface GanttTask {\n id: string\n name: string\n start: string\n end: string\n progress?: number\n group?: string\n color?: string\n dependencies?: string[]\n}\n\ninterface GanttMilestone {\n id: string\n name: string\n date: string\n color?: string\n}\n\ninterface GanttChartProps {\n props: {\n tasks: GanttTask[]\n title?: string\n milestones?: GanttMilestone[]\n showCriticalPath?: boolean\n timeUnit?: 'day' | 'week' | 'month'\n todayLine?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace gantt with spinner. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace gantt with error placeholder. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\ninterface Edge {\n x1: number; y1: number\n x2: number; y2: number\n srcSlot: number; srcTotal: number\n}\n\n/* ─── Helpers ─── */\n\nfunction clamp(n: number, lo: number, hi: number) {\n return Math.min(hi, Math.max(lo, n))\n}\n\nfunction parseISO(s: string): number | null {\n const t = Date.parse(s)\n return Number.isFinite(t) ? t : null\n}\n\nfunction computeCriticalTaskIds(\n items: { id: string; dur: number; preds: string[] }[],\n): Set<string> {\n const idToIdx = new Map(items.map((t, i) => [t.id, i]))\n const n = items.length\n if (n === 0) return new Set()\n const indeg = new Array(n).fill(0)\n const succs: number[][] = Array.from({ length: n }, () => [])\n for (let i = 0; i < n; i++) {\n for (const p of items[i].preds) {\n const j = idToIdx.get(p)\n if (j === undefined) continue\n succs[j].push(i)\n indeg[i]++\n }\n }\n const q: number[] = []\n for (let i = 0; i < n; i++) if (indeg[i] === 0) q.push(i)\n const order: number[] = []\n while (q.length) {\n const u = q.shift()!\n order.push(u)\n for (const v of succs[u]) { indeg[v]--; if (indeg[v] === 0) q.push(v) }\n }\n if (order.length !== n) return new Set()\n const lfs = new Array(n).fill(0)\n for (const u of order) {\n let best = 0\n for (const p of items[u].preds) { const j = idToIdx.get(p); if (j !== undefined) best = Math.max(best, lfs[j]) }\n lfs[u] = best + items[u].dur\n }\n const L = Math.max(...lfs, 0)\n const lsb = new Array(n).fill(0)\n for (let k = n - 1; k >= 0; k--) {\n const u = order[k]; let best = 0\n for (const v of succs[u]) best = Math.max(best, lsb[v])\n lsb[u] = items[u].dur + best\n }\n const critical = new Set<string>()\n const eps = Math.max(1, L * 1e-9)\n for (let i = 0; i < n; i++) {\n if (Math.abs(lfs[i] + lsb[i] - items[i].dur - L) < eps) critical.add(items[i].id)\n }\n return critical\n}\n\nfunction generateTimeTicks(minMs: number, maxMs: number): { frac: number; label: string }[] {\n const span = maxMs - minMs\n if (span <= 0) return []\n const daySpan = span / DAY_MS\n let stepMs: number\n let fmt: (d: Date) => string\n if (daySpan <= 14) {\n stepMs = DAY_MS\n fmt = d => `${d.getUTCMonth() + 1}/${d.getUTCDate()}`\n } else if (daySpan <= 60) {\n stepMs = 7 * DAY_MS\n fmt = d => `${d.getUTCMonth() + 1}/${d.getUTCDate()}`\n } else if (daySpan <= 365) {\n stepMs = 30 * DAY_MS\n const M = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n fmt = d => M[d.getUTCMonth()]\n } else {\n stepMs = 91 * DAY_MS\n const M = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n fmt = d => `${M[d.getUTCMonth()]} '${String(d.getUTCFullYear()).slice(2)}`\n }\n const first = Math.ceil(minMs / stepMs) * stepMs\n const ticks: { frac: number; label: string }[] = []\n for (let t = first; t <= maxMs; t += stepMs) ticks.push({ frac: (t - minMs) / span, label: fmt(new Date(t)) })\n if (ticks.length > 14) { const s = Math.ceil(ticks.length / 14); return ticks.filter((_, i) => i % s === 0) }\n return ticks\n}\n\n/**\n * PCB-style orthogonal connector with per-lane offset.\n * Each edge leaving the same source bar gets a unique vertical \"lane\"\n * so parallel lines never overlap.\n */\nfunction orthoPath(e: Edge): string {\n const { x1, y1, x2, y2, srcSlot, srcTotal } = e\n const off = srcTotal > 1 ? (srcSlot - (srcTotal - 1) / 2) * LANE_W : 0\n\n if (x2 > x1 + CONN_GAP * 2) {\n const turnX = x1 + Math.max(CONN_GAP, (x2 - x1) * 0.3) + off\n return `M${x1},${y1} H${turnX} V${y2} H${x2}`\n }\n\n const turnX = x1 + CONN_GAP + Math.max(0, off)\n const gapY = y2 > y1\n ? y1 + BAR_H / 2 + (ROW_H - BAR_H) / 2\n : y1 - BAR_H / 2 - (ROW_H - BAR_H) / 2\n return `M${x1},${y1} H${turnX} V${gapY} H${x2 - CONN_GAP} V${y2} H${x2}`\n}\n\n/* ─── Component ─── */\n\nexport const GanttChart: React.FC<GanttChartProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state hook (unconditional).\n const gtState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const uid = useId().replace(/:/g, '')\n const tlRef = useRef<HTMLDivElement>(null)\n const [availW, setAvailW] = useState(FALLBACK_W)\n\n useEffect(() => {\n const el = tlRef.current\n if (!el) return\n const w = el.clientWidth\n if (w > 0) setAvailW(w)\n const ro = new ResizeObserver(entries => {\n const rect = entries[0]?.contentRect\n if (rect && rect.width > 0) setAvailW(Math.round(rect.width))\n })\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const rawTasks = Array.isArray(props.tasks) ? props.tasks : []\n const title = props.title ?? 'Schedule'\n const milestones = Array.isArray(props.milestones) ? props.milestones : []\n const showCriticalPath = props.showCriticalPath === true\n const showToday = props.todayLine === true\n\n const data = useMemo(() => {\n const parsed = rawTasks\n .map(t => {\n const s = parseISO(t.start)\n const e = parseISO(t.end)\n return { t, s: s ?? 0, e: e ?? 0, ok: s != null && e != null && e >= s }\n })\n .filter(x => x.ok)\n\n let minT = Infinity, maxT = -Infinity\n for (const p of parsed) { minT = Math.min(minT, p.s, p.e); maxT = Math.max(maxT, p.s, p.e) }\n for (const m of milestones) { const d = parseISO(m.date); if (d != null) { minT = Math.min(minT, d); maxT = Math.max(maxT, d) } }\n if (!Number.isFinite(minT) || !Number.isFinite(maxT)) { minT = Date.now(); maxT = minT + DAY_MS }\n if (maxT <= minT) maxT = minT + DAY_MS\n const rawSpan = maxT - minT\n minT -= rawSpan * 0.03\n maxT += rawSpan * 0.06\n const span = maxT - minT\n\n const daySpan = span / DAY_MS\n const pxPerDay = clamp(800 / Math.max(1, daySpan), 14, 50)\n const minTlW = Math.ceil(daySpan * pxPerDay) + PAD_L + PAD_R\n const timelineW = Math.max(availW, minTlW)\n\n const chartL = PAD_L\n const chartW = timelineW - PAD_L - PAD_R\n const n = parsed.length\n const bodyTop = AXIS_H + MS_BAND\n const totalH = bodyTop + n * ROW_H\n\n const xAt = (ms: number) => chartL + ((ms - minT) / span) * chartW\n\n const idToIdx = new Map<string, number>()\n parsed.forEach((p, i) => idToIdx.set(p.t.id, i))\n\n const cpItems = parsed.map(p => ({\n id: p.t.id,\n dur: Math.max(1, p.e - p.s),\n preds: (p.t.dependencies ?? []).filter(d => idToIdx.has(d)),\n }))\n const critIds = showCriticalPath ? computeCriticalTaskIds(cpItems) : new Set<string>()\n\n const bars = parsed.map((p, i) => {\n const x0 = xAt(p.s)\n const x1 = xAt(p.e)\n const w = Math.max(4, x1 - x0)\n const y = bodyTop + i * ROW_H + (ROW_H - BAR_H) / 2\n const cy = y + BAR_H / 2\n const prog = p.t.progress != null && Number.isFinite(p.t.progress) ? clamp(p.t.progress, 0, 100) : null\n return { t: p.t, i, x0, w, y, cy, prog, isCritical: showCriticalPath && critIds.has(p.t.id) }\n })\n\n /* Lane-offset edge computation */\n const srcCounts = new Map<string, number>()\n for (const b of bars) for (const d of b.t.dependencies ?? []) if (idToIdx.has(d)) srcCounts.set(d, (srcCounts.get(d) ?? 0) + 1)\n\n const srcIdx = new Map<string, number>()\n const edges: Edge[] = []\n for (const b of bars) {\n for (const depId of b.t.dependencies ?? []) {\n const j = idToIdx.get(depId)\n if (j == null) continue\n const pred = bars[j]\n const slot = srcIdx.get(depId) ?? 0\n srcIdx.set(depId, slot + 1)\n edges.push({\n x1: pred.x0 + pred.w, y1: pred.cy,\n x2: b.x0, y2: b.cy,\n srcSlot: slot, srcTotal: srcCounts.get(depId) ?? 1,\n })\n }\n }\n\n /* Milestones with collision-aware label placement */\n const rawMs: { id: string; x: number; name: string; color?: string }[] = []\n for (const m of milestones) {\n const d = parseISO(m.date)\n if (d == null || d < minT || d > maxT) continue\n rawMs.push({ id: m.id, x: xAt(d), name: m.name, color: m.color })\n }\n rawMs.sort((a, b) => a.x - b.x)\n let prevMsX = -Infinity, prevBelow = true\n const msPts = rawMs.map(m => {\n let below = true\n if (m.x - prevMsX < 65) below = !prevBelow\n prevMsX = m.x; prevBelow = below\n return { ...m, below }\n })\n\n const now = Date.now()\n const todayX = showToday && now >= minT && now <= maxT ? xAt(now) : null\n const ticks = generateTimeTicks(minT, maxT).map(tk => ({ x: chartL + tk.frac * chartW, label: tk.label }))\n\n return { timelineW, totalH, chartL, chartW, bodyTop, bars, edges, msPts, todayX, ticks }\n }, [rawTasks, milestones, showCriticalPath, showToday, availW])\n\n /* ── Five-state short-circuits (Phase 4 Tier 4-4) ── */\n\n if (gtState.isError) {\n return (\n <div className=\"jr-gantt\" data-state=\"error\">\n <h2 className=\"jr-gantt__title\">{title}</h2>\n <StateView kind=\"error\" description={gtState.errorMessage} />\n {children}\n </div>\n )\n }\n if (gtState.isLoading) {\n return (\n <div className=\"jr-gantt\" data-state=\"loading\">\n <h2 className=\"jr-gantt__title\">{title}</h2>\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n /* ── Empty states ── */\n\n if (rawTasks.length === 0) {\n if (!Array.isArray(props.tasks)) return null\n return (\n <div className=\"jr-gantt\">\n <h2 className=\"jr-gantt__title\">{title}</h2>\n <div className=\"jr-gantt__empty\">No tasks to display.</div>\n {children}\n </div>\n )\n }\n if (data.bars.length === 0) {\n return (\n <div className=\"jr-gantt\">\n <h2 className=\"jr-gantt__title\">{title}</h2>\n <div className=\"jr-gantt__empty\">Invalid or missing task date range (need ISO start/end).</div>\n {children}\n </div>\n )\n }\n\n /* ── Render ── */\n\n const { timelineW, totalH, chartW, bodyTop, bars, edges, msPts, todayX, ticks } = data\n const defaultFill = 'var(--jr-primary, #3b82f6)'\n const headerH = AXIS_H + MS_BAND\n\n return (\n <div className=\"jr-gantt\">\n <h2 className=\"jr-gantt__title\">{title}</h2>\n\n <div className=\"jr-gantt__body\">\n {/* ── Fixed label column ── */}\n <div className=\"jr-gantt__labels\">\n <div style={{ height: headerH }} />\n {bars.map((b, i) => (\n <div\n key={b.t.id}\n className={`jr-gantt__label-row${i % 2 === 0 ? ' jr-gantt__label-row--alt' : ''}`}\n style={{ height: ROW_H }}\n >\n <div className=\"jr-gantt__label-content\">\n <span className=\"jr-gantt__task-name\" title={b.t.name}>{b.t.name}</span>\n {b.t.group && <span className=\"jr-gantt__task-group-text\">{b.t.group}</span>}\n </div>\n </div>\n ))}\n </div>\n\n {/* ── Scrollable timeline ── */}\n <div className=\"jr-gantt__timeline\" ref={tlRef}>\n <svg\n className=\"jr-gantt__svg\"\n viewBox={`0 0 ${timelineW} ${totalH}`}\n width={timelineW}\n height={totalH}\n style={{ maxWidth: 'none' }}\n role=\"img\"\n aria-label={`Gantt chart: ${bars.length} tasks`}\n >\n <defs>\n {bars.map(b => (\n <clipPath key={`c-${b.i}`} id={`jr-gc-${uid}-${b.i}`}>\n <rect x={b.x0} y={b.y} width={b.w} height={BAR_H} rx={BAR_RADIUS} ry={BAR_RADIUS} />\n </clipPath>\n ))}\n {/* CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-007): hatched pattern for\n critical-path bars. The diagonal stripes add a second visual\n channel beyond the danger color so monochrome / color-blind\n / forced-colors users can still spot the critical path. */}\n <pattern\n id={`jr-gc-${uid}-critical-hatch`}\n patternUnits=\"userSpaceOnUse\"\n width={6}\n height={6}\n patternTransform=\"rotate(45)\"\n >\n <line\n className=\"jr-gantt__critical-pattern-line\"\n x1={0}\n y1={0}\n x2={0}\n y2={6}\n />\n </pattern>\n </defs>\n\n {/* Grid lines */}\n {ticks.map((tk, i) => (\n <line key={`g-${i}`} className=\"jr-gantt__grid-line\" x1={tk.x} y1={AXIS_H} x2={tk.x} y2={totalH} />\n ))}\n\n {/* Alternating row bands (synced with label column) */}\n {bars.map((_, i) => i % 2 === 0 ? (\n <rect key={`rb-${i}`} x={0} y={bodyTop + i * ROW_H} width={timelineW} height={ROW_H}\n fill=\"color-mix(in srgb, var(--jr-bg, #f8fafc) 40%, transparent)\" />\n ) : null)}\n\n {/* Time axis labels */}\n {ticks.map((tk, i) => (\n <text key={`tl-${i}`} className=\"jr-gantt__tick-label\" x={tk.x} y={AXIS_H - 6} textAnchor=\"middle\">\n {tk.label}\n </text>\n ))}\n\n {/* Axis baseline */}\n <line\n x1={PAD_L} y1={AXIS_H} x2={PAD_L + chartW} y2={AXIS_H}\n stroke=\"color-mix(in srgb, var(--jr-text-muted, #94a3b8) 22%, transparent)\" strokeWidth=\".75\"\n />\n\n {/* Today line */}\n {todayX != null && (\n <line className=\"jr-gantt__today\" x1={todayX} y1={AXIS_H} x2={todayX} y2={totalH} />\n )}\n\n {/* Milestones */}\n {msPts.map(m => {\n const s = 6\n const cy = AXIS_H + MS_BAND / 2\n const fill = m.color?.trim() || defaultFill\n const textY = m.below ? cy + s + 10 : cy - s - 4\n return (\n <g key={m.id} className=\"jr-gantt__milestone jr-pressable jr-focusable\" onClick={() => emit?.('gantt:milestone', { id: m.id })}>\n <polygon\n points={`${m.x},${cy - s} ${m.x + s},${cy} ${m.x},${cy + s} ${m.x - s},${cy}`}\n fill={fill}\n stroke=\"color-mix(in srgb, var(--jr-text, #0f172a) 18%, transparent)\"\n strokeWidth={.6}\n />\n <text className=\"jr-gantt__ms-label\" x={m.x} y={textY} textAnchor=\"middle\">\n {m.name.length > 6 ? `${m.name.slice(0, 5)}…` : m.name}\n </text>\n </g>\n )\n })}\n\n {/* Dependency connectors */}\n {edges.map((e, i) => (\n <g key={`dep-${i}`}>\n <path className=\"jr-gantt__connector\" d={orthoPath(e)} />\n <polygon\n className=\"jr-gantt__arrow\"\n points={`${e.x2},${e.y2} ${e.x2 - ARROW_SZ * 1.6},${e.y2 - ARROW_SZ} ${e.x2 - ARROW_SZ * 1.6},${e.y2 + ARROW_SZ}`}\n />\n </g>\n ))}\n\n {/* Task bars */}\n {bars.map(b => {\n const fill = b.t.color?.trim() || defaultFill\n const onClick = () => emit?.('gantt:task', { id: b.t.id })\n return (\n <g key={b.t.id}>\n {/* Plan bar (translucent) */}\n <rect\n className=\"jr-gantt__bar jr-pressable jr-focusable\"\n x={b.x0} y={b.y} width={b.w} height={BAR_H}\n rx={BAR_RADIUS} ry={BAR_RADIUS}\n fill={fill} fillOpacity={b.isCritical ? 0.22 : 0.15}\n onClick={onClick}\n />\n {/* Progress fill, clipped to bar shape */}\n {b.prog != null && b.prog > 0 && (\n <rect\n className=\"jr-gantt__bar jr-pressable jr-focusable\"\n x={b.x0} y={b.y}\n width={b.w * b.prog / 100} height={BAR_H}\n fill={fill}\n clipPath={`url(#jr-gc-${uid}-${b.i})`}\n onClick={onClick}\n >\n <title>{`${b.t.name}: ${b.prog}%`}</title>\n </rect>\n )}\n {/* Critical path: subtle left-edge accent */}\n {b.isCritical && (\n <rect\n x={b.x0} y={b.y + 3} width={2.5} height={BAR_H - 6}\n rx={1} ry={1}\n fill=\"var(--jr-danger, #ef4444)\" fillOpacity={.7}\n style={{ pointerEvents: 'none' }}\n />\n )}\n {/* CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-007): hatched overlay\n atop critical bars. The pattern is clipped to the bar shape\n so the rounded corners stay clean. */}\n {b.isCritical && (\n <rect\n x={b.x0} y={b.y} width={b.w} height={BAR_H}\n rx={BAR_RADIUS} ry={BAR_RADIUS}\n fill={`url(#jr-gc-${uid}-critical-hatch)`}\n clipPath={`url(#jr-gc-${uid}-${b.i})`}\n style={{ pointerEvents: 'none' }}\n data-critical-hatch=\"true\"\n aria-hidden=\"true\"\n />\n )}\n </g>\n )\n })}\n </svg>\n </div>\n </div>\n\n {children}\n </div>\n )\n}\n\nexport default GanttChart\n","import React, { useMemo } from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-sandbox-player'\n\nconst SHEET = `\n@keyframes jr-sandbox-player-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-sandbox-player {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-height: 0;\n animation: jr-sandbox-player-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-sandbox-player__body {\n display: flex;\n flex-wrap: wrap;\n flex: 1 1 auto;\n min-height: 0;\n align-items: stretch;\n}\n.jr-sandbox-player__toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem 1rem;\n padding: 0.55rem calc(var(--jr-spacing, 12px) * 1.15);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 72%, var(--jr-surface, #fff));\n}\n.jr-sandbox-player__mode {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n padding: 0.2rem 0.5rem;\n border-radius: 4px;\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 14%, var(--jr-surface, #fff));\n color: color-mix(in srgb, var(--jr-primary, #1d4ed8) 88%, var(--jr-text, #0f172a));\n transition: background var(--jr-transition-base) var(--jr-easing-standard), color var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-sandbox-player__mode:hover {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 22%, var(--jr-surface, #fff));\n transform: translateY(-1px);\n}\n.jr-sandbox-player__type {\n font-size: 0.6875rem;\n font-weight: 600;\n padding: 0.2rem 0.45rem;\n border-radius: 4px;\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 14%, var(--jr-surface, #fff));\n color: var(--jr-text-muted, #64748b);\n transition: background var(--jr-transition-base) var(--jr-easing-standard), color var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-sandbox-player__type:hover {\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 24%, var(--jr-surface, #fff));\n transform: translateY(-1px);\n}\n.jr-sandbox-player__title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.jr-sandbox-player__stage-wrap {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n.jr-sandbox-player__stage {\n flex: 1 1 auto;\n min-height: 200px;\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, var(--jr-surface, #fff));\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n justify-content: center;\n}\n.jr-sandbox-player__iframe,\n.jr-sandbox-player__video,\n.jr-sandbox-player__img {\n width: 100%;\n height: 100%;\n min-height: inherit;\n border: 0;\n display: block;\n object-fit: contain;\n background: var(--jr-surface, #0f172a);\n}\n.jr-sandbox-player__timeline {\n width: 14rem;\n flex: 0 0 14rem;\n border-left: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 55%, var(--jr-surface, #fff));\n overflow: auto;\n max-height: 100%;\n}\n.jr-sandbox-player__timeline-title {\n margin: 0;\n padding: 0.5rem 0.65rem;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--jr-text-muted, #64748b);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n}\n.jr-sandbox-player__timeline-list {\n list-style: none;\n margin: 0;\n padding: 0.35rem 0;\n}\n.jr-sandbox-player__timeline-item {\n padding: 0.45rem 0.65rem;\n font-size: 0.8125rem;\n line-height: 1.4;\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 5%, transparent);\n cursor: default;\n transition: background var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-sandbox-player__timeline-item:hover {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 6%, transparent);\n transform: translateX(2px);\n}\n.jr-sandbox-player__timeline-ts {\n font-size: 0.6875rem;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n margin-bottom: 0.15rem;\n}\n.jr-sandbox-player__timeline-meta {\n font-size: 0.6875rem;\n color: var(--jr-text-muted, #94a3b8);\n margin-top: 0.2rem;\n}\n.jr-sandbox-player__placeholder {\n margin: auto;\n padding: 1.5rem;\n text-align: center;\n font-size: 0.875rem;\n color: var(--jr-text-muted, #64748b);\n max-width: 20rem;\n line-height: 1.5;\n}\n.jr-sandbox-player__placeholder code {\n font-size: 0.8125rem;\n background: color-mix(in srgb, var(--jr-text-muted, #94a3b8) 12%, transparent);\n padding: 0.1rem 0.35rem;\n border-radius: 4px;\n}\n`\n\ntype SandboxMode = 'live' | 'replay'\ntype SandboxMediaType = 'vnc' | 'video' | 'screenshots'\n\ninterface SandboxAction {\n timestamp: string\n description: string\n actionType?: string\n coordinates?: { x?: number; y?: number }\n outcome?: string\n}\n\ninterface SandboxPlayerProps {\n props: {\n src: string\n mode: SandboxMode\n type?: SandboxMediaType\n actions?: SandboxAction[]\n autoPlay?: boolean\n showControls?: boolean\n showTimeline?: boolean\n maxHeight?: string\n title?: string\n poster?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const SandboxPlayer: React.FC<SandboxPlayerProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const mode: SandboxMode = props.mode === 'replay' ? 'replay' : 'live'\n const src = typeof props.src === 'string' ? props.src.trim() : ''\n const title = props.title ?? 'Sandbox'\n const mediaType = props.type\n const showControls = props.showControls !== false\n const showTimeline = props.showTimeline === true\n const autoPlay = props.autoPlay === true\n const poster = props.poster?.trim() || undefined\n\n const stageStyle: React.CSSProperties = {\n minHeight: 200,\n ...(props.maxHeight ? { maxHeight: props.maxHeight } : {}),\n }\n\n const sortedActions = useMemo(() => {\n const list = Array.isArray(props.actions) ? [...props.actions] : []\n return list.sort((a, b) => String(a.timestamp).localeCompare(String(b.timestamp)))\n }, [props.actions])\n\n const renderStage = () => {\n if (!src) {\n return (\n <div className=\"jr-sandbox-player__placeholder\">\n No <code>src</code> provided. Pass a URL for {mode} content.\n </div>\n )\n }\n\n if (mode === 'live') {\n return (\n <iframe\n className=\"jr-sandbox-player__iframe\"\n src={src}\n title={title}\n sandbox=\"allow-same-origin allow-scripts allow-forms allow-popups\"\n allow=\"fullscreen\"\n loading=\"lazy\"\n onLoad={() => emit?.('sandbox:load', { mode, type: mediaType, src })}\n />\n )\n }\n\n if (mediaType === 'screenshots') {\n return (\n <img\n className=\"jr-sandbox-player__img\"\n src={src}\n alt={title}\n loading=\"lazy\"\n onLoad={() => emit?.('sandbox:load', { mode, type: mediaType, src })}\n />\n )\n }\n\n if (mediaType === 'vnc') {\n return (\n <iframe\n className=\"jr-sandbox-player__iframe\"\n src={src}\n title={title}\n sandbox=\"allow-same-origin allow-scripts allow-forms allow-popups\"\n allow=\"fullscreen\"\n loading=\"lazy\"\n onLoad={() => emit?.('sandbox:load', { mode, type: mediaType, src })}\n />\n )\n }\n\n return (\n <video\n className=\"jr-sandbox-player__video\"\n src={src}\n controls={showControls}\n playsInline\n preload=\"metadata\"\n poster={poster}\n autoPlay={autoPlay}\n aria-label={title}\n onLoadedData={() => emit?.('sandbox:load', { mode, type: mediaType ?? 'video', src })}\n />\n )\n }\n\n return (\n <div className=\"jr-sandbox-player\">\n <div className=\"jr-sandbox-player__toolbar\">\n <span className=\"jr-sandbox-player__mode\">{mode}</span>\n {mediaType ? <span className=\"jr-sandbox-player__type\">{mediaType}</span> : null}\n <h2 className=\"jr-sandbox-player__title\">{title}</h2>\n </div>\n <div className=\"jr-sandbox-player__body\">\n <div className=\"jr-sandbox-player__stage-wrap\">\n <div className=\"jr-sandbox-player__stage\" style={stageStyle}>\n {renderStage()}\n </div>\n </div>\n {showTimeline ? (\n <aside className=\"jr-sandbox-player__timeline\" aria-label=\"Action timeline\">\n <h3 className=\"jr-sandbox-player__timeline-title\">Actions</h3>\n {sortedActions.length === 0 ? (\n <div\n className=\"jr-sandbox-player__placeholder\"\n style={{ padding: '1rem', fontSize: '0.8125rem' }}\n >\n No actions.\n </div>\n ) : (\n <ul className=\"jr-sandbox-player__timeline-list\">\n {sortedActions.map((a, i) => (\n <li\n key={`${a.timestamp}-${i}`}\n className=\"jr-sandbox-player__timeline-item\"\n onClick={() => emit?.('sandbox:action', { index: i, ...a })}\n >\n <div className=\"jr-sandbox-player__timeline-ts\">{a.timestamp}</div>\n <div>{a.description}</div>\n {a.actionType || a.outcome ? (\n <div className=\"jr-sandbox-player__timeline-meta\">\n {[a.actionType, a.outcome].filter(Boolean).join(' · ')}\n {a.coordinates != null &&\n (a.coordinates.x != null || a.coordinates.y != null)\n ? ` @ (${a.coordinates.x ?? '—'}, ${a.coordinates.y ?? '—'})`\n : ''}\n </div>\n ) : a.coordinates != null &&\n (a.coordinates.x != null || a.coordinates.y != null) ? (\n <div className=\"jr-sandbox-player__timeline-meta\">\n @ ({a.coordinates.x ?? '—'}, {a.coordinates.y ?? '—'})\n </div>\n ) : null}\n </li>\n ))}\n </ul>\n )}\n </aside>\n ) : null}\n </div>\n {children}\n </div>\n )\n}\n\nexport default SandboxPlayer\n","import React, { useMemo } from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-comparison-matrix'\n\nconst SHEET = `\n@keyframes jr-comparison-matrix-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-comparison-matrix {\n box-sizing: border-box;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: auto;\n max-width: 100%;\n animation: jr-comparison-matrix-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-comparison-matrix--compact { font-size: 0.8125rem; }\n.jr-comparison-matrix__table {\n width: max-content;\n min-width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n font-size: inherit;\n}\n.jr-comparison-matrix__th {\n padding: 0.55rem 0.65rem;\n text-align: left;\n font-weight: 600;\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 80%, var(--jr-surface, #fff));\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n white-space: nowrap;\n}\n.jr-comparison-matrix__th--corner {\n min-width: 8rem;\n position: sticky;\n left: 0;\n z-index: 2;\n}\n.jr-comparison-matrix__td {\n padding: 0.5rem 0.65rem;\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n vertical-align: middle;\n text-align: center;\n transition: box-shadow var(--jr-transition-base) var(--jr-easing-standard), background-color var(--jr-transition-base) var(--jr-easing-standard);\n cursor: pointer;\n}\n.jr-comparison-matrix__table tbody tr:hover .jr-comparison-matrix__td,\n.jr-comparison-matrix__table tbody tr:hover .jr-comparison-matrix__criterion {\n box-shadow: inset 0 0 0 9999px color-mix(in srgb, var(--jr-primary, #3b82f6) 7%, transparent);\n}\n.jr-comparison-matrix__td--best {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 12%, var(--jr-surface, #fff));\n font-weight: 600;\n}\n.jr-comparison-matrix__criterion {\n position: sticky;\n left: 0;\n z-index: 1;\n font-weight: 500;\n text-align: left;\n background: var(--jr-surface, #fff);\n border-right: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n max-width: 14rem;\n}\n.jr-comparison-matrix__criterion-meta {\n display: block;\n font-size: 0.6875rem;\n font-weight: 400;\n color: var(--jr-text-muted, #64748b);\n margin-top: 0.15rem;\n}\n.jr-comparison-matrix__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n.jr-comparison-matrix__tfoot .jr-comparison-matrix__td,\n.jr-comparison-matrix__tfoot .jr-comparison-matrix__th {\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 90%, var(--jr-surface, #fff));\n font-weight: 600;\n}\n`\n\ninterface ComparisonCriterion {\n name: string\n weight?: number\n unit?: string\n}\n\ninterface ComparisonMatrixProps {\n props: {\n options: string[]\n criteria: ComparisonCriterion[]\n scores: number[][]\n showWeighted?: boolean\n highlightBest?: boolean\n scoreScale?: { min: number; max: number }\n variant?: string\n /** Phase 4 Tier 4-4 Batch C: render centred spinner during async score fetch. */\n loading?: boolean\n /** Phase 4 Tier 4-4 Batch C: render error placeholder; wins over loading. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.min(hi, Math.max(lo, n))\n}\n\nfunction scoreCellStyle(\n v: number | null,\n scale: { min: number; max: number } | undefined,\n isBest: boolean,\n): React.CSSProperties | undefined {\n if (v == null || !Number.isFinite(v) || !scale || isBest) return undefined\n const span = scale.max - scale.min\n if (!(span > 0)) return undefined\n const t = clamp((v - scale.min) / span, 0, 1)\n const mixPct = Math.round(6 + t * 22)\n return {\n background: `color-mix(in srgb, var(--jr-primary, #3b82f6) ${mixPct}%, var(--jr-surface, #fff))`,\n }\n}\n\nexport const ComparisonMatrix: React.FC<ComparisonMatrixProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const matrixState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const options = Array.isArray(props.options) ? props.options : []\n const criteria = Array.isArray(props.criteria) ? props.criteria : []\n const rawScores = Array.isArray(props.scores) ? props.scores : []\n const highlightBest = props.highlightBest === true\n const showWeighted = props.showWeighted === true\n const scoreScale = props.scoreScale\n const variant = props.variant ?? 'default'\n const rootClass =\n variant === 'compact' ? 'jr-comparison-matrix jr-comparison-matrix--compact' : 'jr-comparison-matrix'\n\n const nOpt = options.length\n const nCrit = criteria.length\n\n const scores = useMemo(() => {\n const rows: (number | null)[][] = []\n for (let i = 0; i < nCrit; i++) {\n const row = rawScores[i]\n const out: (number | null)[] = []\n for (let j = 0; j < nOpt; j++) {\n const x = row?.[j]\n out.push(typeof x === 'number' && Number.isFinite(x) ? x : null)\n }\n rows.push(out)\n }\n return rows\n }, [rawScores, nCrit, nOpt])\n\n const bestByRow = useMemo(() => {\n const set = new Set<number>()\n if (!highlightBest || nCrit === 0 || nOpt === 0) return set\n for (let i = 0; i < nCrit; i++) {\n const row = scores[i]\n const nums = row.map((v, j) => (v != null ? { j, v } : null)).filter(Boolean) as { j: number; v: number }[]\n if (nums.length === 0) continue\n const best = Math.max(...nums.map((x) => x.v))\n for (const { j, v } of nums) {\n if (v === best) set.add(i * nOpt + j)\n }\n }\n return set\n }, [highlightBest, nCrit, nOpt, scores])\n\n const weightedRow = useMemo(() => {\n if (!showWeighted || nOpt === 0 || nCrit === 0) return null\n const weights = criteria.map((c) =>\n typeof c.weight === 'number' && Number.isFinite(c.weight) && c.weight >= 0 ? c.weight : 1,\n )\n const wSum = weights.reduce((a, b) => a + b, 0)\n if (!(wSum > 0)) return null\n const out: (number | null)[] = []\n for (let j = 0; j < nOpt; j++) {\n let acc = 0\n let used = 0\n for (let i = 0; i < nCrit; i++) {\n const v = scores[i][j]\n if (v == null) continue\n acc += v * weights[i]\n used += weights[i]\n }\n out.push(used > 0 ? acc / wSum : null)\n }\n return out\n }, [showWeighted, nOpt, nCrit, criteria, scores])\n\n const effectiveScale = useMemo(() => {\n if (scoreScale && Number.isFinite(scoreScale.min) && Number.isFinite(scoreScale.max)) {\n return { min: scoreScale.min, max: scoreScale.max }\n }\n let lo = Infinity\n let hi = -Infinity\n for (const row of scores) {\n for (const v of row) {\n if (v == null) continue\n lo = Math.min(lo, v)\n hi = Math.max(hi, v)\n }\n }\n if (weightedRow) {\n for (const v of weightedRow) {\n if (v == null) continue\n lo = Math.min(lo, v)\n hi = Math.max(hi, v)\n }\n }\n if (!Number.isFinite(lo) || !Number.isFinite(hi)) return undefined\n if (hi <= lo) return { min: lo - 1, max: hi + 1 }\n return { min: lo, max: hi }\n }, [scoreScale, scores, weightedRow])\n\n if (matrixState.isError) {\n return (\n <div className={rootClass} data-state=\"error\">\n <StateView kind=\"error\" description={matrixState.errorMessage} />\n {children}\n </div>\n )\n }\n if (matrixState.isLoading) {\n return (\n <div className={rootClass} data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (options.length === 0 || criteria.length === 0) {\n return (\n <div className={rootClass}>\n <div className=\"jr-comparison-matrix__empty\">\n {options.length === 0 && criteria.length === 0\n ? 'Add options and criteria for a comparison matrix.'\n : options.length === 0\n ? 'No options to compare.'\n : 'No criteria defined.'}\n </div>\n {children}\n </div>\n )\n }\n\n return (\n <div className={rootClass} role=\"region\" aria-label=\"Comparison matrix\">\n <table className=\"jr-comparison-matrix__table\">\n <thead>\n <tr>\n <th scope=\"col\" className=\"jr-comparison-matrix__th jr-comparison-matrix__th--corner\">\n Criterion\n </th>\n {options.map((label, j) => (\n <th key={j} scope=\"col\" className=\"jr-comparison-matrix__th\">\n {label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {criteria.map((c, i) => (\n <tr key={c.name || String(i)}>\n <th scope=\"row\" className=\"jr-comparison-matrix__td jr-comparison-matrix__criterion\">\n {c.name}\n {c.unit || c.weight != null ? (\n <span className=\"jr-comparison-matrix__criterion-meta\">\n {[c.weight != null ? `w=${c.weight}` : null, c.unit ?? null]\n .filter(Boolean)\n .join(' · ')}\n </span>\n ) : null}\n </th>\n {options.map((_, j) => {\n const v = scores[i]?.[j] ?? null\n const display = v == null ? '—' : String(v)\n const isBest = bestByRow.has(i * nOpt + j)\n const cellStyle = scoreCellStyle(v, effectiveScale, isBest)\n const dispatch = () =>\n emit?.('matrix:cell', { criterion: c.name, optionIndex: j, value: v })\n return (\n <td\n key={j}\n className={\n isBest\n ? 'jr-comparison-matrix__td jr-comparison-matrix__td--best jr-pressable jr-focusable'\n : 'jr-comparison-matrix__td jr-pressable jr-focusable'\n }\n style={cellStyle}\n role=\"button\"\n tabIndex={0}\n aria-label={`${c.name}, option ${j + 1}: ${display}`}\n onClick={dispatch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n dispatch()\n }\n }}\n >\n {display}\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n {weightedRow ? (\n <tfoot className=\"jr-comparison-matrix__tfoot\">\n <tr>\n <th scope=\"row\" className=\"jr-comparison-matrix__th jr-comparison-matrix__criterion\">\n Weighted\n </th>\n {weightedRow.map((v, j) => {\n const display = v == null ? '—' : String(v)\n const cellStyle = scoreCellStyle(v, effectiveScale, false)\n return (\n <td key={j} className=\"jr-comparison-matrix__td jr-pressable jr-focusable\" style={cellStyle}>\n {display}\n </td>\n )\n })}\n </tr>\n </tfoot>\n ) : null}\n </table>\n {children}\n </div>\n )\n}\n\nexport default ComparisonMatrix\n","import React, { useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-timeline'\n\nconst SHEET = `\n@keyframes jr-timeline-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-timeline {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n padding: var(--jr-spacing, 12px);\n animation: jr-timeline-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n position: relative;\n}\n.jr-timeline--horizontal {\n overflow-x: auto;\n padding-bottom: calc(var(--jr-spacing, 12px) * 1.25);\n}\n.jr-timeline__list {\n list-style: none;\n margin: 0;\n padding: 0;\n position: relative;\n}\n.jr-timeline__list--vertical {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.jr-timeline__list--horizontal {\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n gap: 0;\n min-width: min-content;\n align-items: flex-start;\n}\n.jr-timeline__item {\n position: relative;\n padding-left: 1.75rem;\n padding-bottom: 1.1rem;\n cursor: pointer;\n border-radius: 6px;\n margin-left: -0.35rem;\n padding-left: calc(1.75rem + 0.35rem);\n transition: background-color var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-timeline__item:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, transparent);\n box-shadow: 0 1px 0 color-mix(in srgb, var(--jr-primary, #3b82f6) 20%, transparent);\n}\n.jr-timeline__list--horizontal .jr-timeline__item {\n padding-left: 0;\n padding-bottom: 0;\n padding-top: 0.5rem;\n min-width: 9rem;\n flex: 0 0 auto;\n border-top: 3px solid color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n margin-left: 0;\n border-radius: 6px;\n padding: 0.5rem 0.4rem 0.4rem;\n}\n.jr-timeline__list--horizontal .jr-timeline__item:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 5%, transparent);\n}\n.jr-timeline__item:last-child {\n padding-bottom: 0;\n}\n.jr-timeline__list--horizontal .jr-timeline__item:last-child {\n padding-bottom: 0;\n}\n.jr-timeline__rail {\n position: absolute;\n left: 0.4rem;\n top: 0.35rem;\n bottom: 0;\n width: 2px;\n background: color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n}\n.jr-timeline__item:last-child .jr-timeline__rail {\n display: none;\n}\n.jr-timeline__list--horizontal .jr-timeline__rail {\n display: none;\n}\n.jr-timeline__dot {\n position: absolute;\n left: 0.125rem;\n top: 0.35rem;\n width: 0.65rem;\n height: 0.65rem;\n border-radius: 50%;\n background: var(--jr-text-muted, #94a3b8);\n border: 2px solid var(--jr-surface, #fff);\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--jr-text, #0f172a) 15%, transparent);\n z-index: 1;\n}\n.jr-timeline__list--horizontal .jr-timeline__dot {\n left: 0;\n top: -0.55rem;\n}\n.jr-timeline__item--completed .jr-timeline__dot {\n background: var(--jr-success, #22c55e);\n}\n.jr-timeline__item--in-progress .jr-timeline__dot {\n background: var(--jr-primary, #3b82f6);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--jr-primary, #3b82f6) 35%, transparent);\n}\n.jr-timeline__item--upcoming .jr-timeline__dot {\n background: var(--jr-text-muted, #cbd5e1);\n}\n.jr-timeline__item--delayed .jr-timeline__dot {\n background: var(--jr-warning, #f59e0b);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--jr-warning, #f59e0b) 40%, transparent);\n}\n.jr-timeline__date {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n margin-bottom: 0.2rem;\n}\n.jr-timeline__title {\n font-size: 0.875rem;\n font-weight: 600;\n margin: 0 0 0.25rem;\n}\n.jr-timeline__group {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--jr-text-muted, #64748b);\n margin-bottom: 0.15rem;\n}\n.jr-timeline__desc {\n margin: 0;\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #64748b);\n line-height: 1.45;\n}\n.jr-timeline__empty {\n padding: 0.75rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n.jr-timeline--minimal {\n border: none;\n background: transparent;\n padding: 0;\n}\n/* CWRF-013 Phase 0 (Item 10) — dependency edge SVG overlay. */\n.jr-timeline__dep-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n overflow: visible;\n z-index: 2;\n}\n.jr-timeline__dep-path {\n fill: none;\n stroke: var(--ycw-timeline-dep-color, currentColor);\n stroke-opacity: var(--ycw-timeline-dep-opacity, 0.4);\n stroke-width: 1.25;\n}\n.jr-timeline__dep-arrowhead {\n fill: var(--ycw-timeline-dep-color, currentColor);\n fill-opacity: var(--ycw-timeline-dep-opacity, 0.4);\n}\n`\n\ntype TimelineStatus = 'completed' | 'in-progress' | 'upcoming' | 'delayed'\n\ninterface TimelineEvent {\n id: string\n date: string\n label: string\n status?: TimelineStatus\n group?: string\n description?: string\n /**\n * CWRF-013 Phase 0 (Item 10) — IDs of earlier events that this event\n * depends on. When the Timeline is rendered with `showDependencies={true}`,\n * an SVG arrow is drawn from each declared dependency's dot to this\n * event's dot.\n */\n dependencies?: string[]\n}\n\ninterface TimelineProps {\n props: {\n events: TimelineEvent[]\n orientation?: 'vertical' | 'horizontal'\n variant?: string\n showDependencies?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace timeline with spinner. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace timeline with error placeholder. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\ninterface DepEdge {\n key: string\n fromId: string\n toId: string\n d: string\n arrow: string\n}\n\n/**\n * Compute a cubic Bezier SVG path from source point to target point.\n * Control points lean horizontally for horizontal layouts and vertically\n * for vertical layouts, producing visually balanced curves.\n */\nfunction buildEdgePath(\n from: { x: number; y: number },\n to: { x: number; y: number },\n orientation: 'vertical' | 'horizontal',\n): string {\n if (orientation === 'horizontal') {\n const dx = Math.max(20, Math.abs(to.x - from.x) * 0.4)\n return `M ${from.x} ${from.y} C ${from.x + dx} ${from.y}, ${to.x - dx} ${to.y}, ${to.x} ${to.y}`\n }\n const dy = Math.max(20, Math.abs(to.y - from.y) * 0.4)\n return `M ${from.x} ${from.y} C ${from.x} ${from.y + dy}, ${to.x} ${to.y - dy}, ${to.x} ${to.y}`\n}\n\n/**\n * Tiny triangular arrowhead pointing FROM the curve tangent TO the target\n * point. We render it as a polygon so it inherits the path's stroke colour\n * via CSS custom properties (no requestAnimationFrame / GPU dance).\n */\nfunction buildArrow(\n from: { x: number; y: number },\n to: { x: number; y: number },\n): string {\n const dx = to.x - from.x\n const dy = to.y - from.y\n const len = Math.hypot(dx, dy) || 1\n const ux = dx / len\n const uy = dy / len\n const size = 6\n const baseX = to.x - ux * size\n const baseY = to.y - uy * size\n const px = -uy\n const py = ux\n const p1 = `${baseX + px * size * 0.5},${baseY + py * size * 0.5}`\n const p2 = `${baseX - px * size * 0.5},${baseY - py * size * 0.5}`\n const p3 = `${to.x},${to.y}`\n return `${p1} ${p2} ${p3}`\n}\n\nexport const Timeline: React.FC<TimelineProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state hook (unconditional).\n const tlState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const rawEvents = props.events\n const events = Array.isArray(rawEvents) ? rawEvents : []\n const orientation = props.orientation === 'horizontal' ? 'horizontal' : 'vertical'\n const variant = props.variant ?? 'default'\n const showDependencies = props.showDependencies === true\n\n const rootClass = [\n 'jr-timeline',\n orientation === 'horizontal' ? 'jr-timeline--horizontal' : '',\n variant === 'minimal' ? 'jr-timeline--minimal' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n const listClass =\n orientation === 'horizontal'\n ? 'jr-timeline__list jr-timeline__list--horizontal'\n : 'jr-timeline__list jr-timeline__list--vertical'\n\n const listRef = useRef<HTMLUListElement | null>(null)\n const dotRefs = useRef(new Map<string, HTMLSpanElement>())\n const setDotRef = (id: string) => (node: HTMLSpanElement | null) => {\n if (node) dotRefs.current.set(id, node)\n else dotRefs.current.delete(id)\n }\n\n const dependencyPairs = useMemo<{ from: string; to: string }[]>(() => {\n if (!showDependencies) return []\n const knownIds = new Set(events.map((e) => e.id))\n const pairs: { from: string; to: string }[] = []\n for (const ev of events) {\n if (!Array.isArray(ev.dependencies)) continue\n for (const depId of ev.dependencies) {\n if (typeof depId !== 'string') continue\n if (!knownIds.has(depId) || depId === ev.id) continue\n pairs.push({ from: depId, to: ev.id })\n }\n }\n return pairs\n }, [events, showDependencies])\n\n const [edges, setEdges] = useState<DepEdge[]>([])\n\n useLayoutEffect(() => {\n if (!showDependencies) {\n if (edges.length !== 0) setEdges([])\n return\n }\n const list = listRef.current\n if (!list) return\n const listRect = list.getBoundingClientRect()\n const next: DepEdge[] = []\n for (const { from: fromId, to: toId } of dependencyPairs) {\n const fromEl = dotRefs.current.get(fromId)\n const toEl = dotRefs.current.get(toId)\n if (!fromEl || !toEl) continue\n const a = fromEl.getBoundingClientRect()\n const b = toEl.getBoundingClientRect()\n const from = {\n x: a.left - listRect.left + a.width / 2,\n y: a.top - listRect.top + a.height / 2,\n }\n const to = {\n x: b.left - listRect.left + b.width / 2,\n y: b.top - listRect.top + b.height / 2,\n }\n next.push({\n key: `${fromId}->${toId}`,\n fromId,\n toId,\n d: buildEdgePath(from, to, orientation),\n arrow: buildArrow(from, to),\n })\n }\n // Avoid setState loop: only update when the path strings actually differ.\n const same =\n next.length === edges.length &&\n next.every((e, i) => e.key === edges[i]?.key && e.d === edges[i]?.d)\n if (!same) setEdges(next)\n }, [dependencyPairs, orientation, showDependencies, events])\n\n if (tlState.isError) {\n return (\n <div className={rootClass} data-state=\"error\">\n <StateView kind=\"error\" description={tlState.errorMessage} />\n {children}\n </div>\n )\n }\n if (tlState.isLoading) {\n return (\n <div className={rootClass} data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (events.length === 0) {\n if (!Array.isArray(rawEvents)) return null\n return (\n <div className={rootClass}>\n <div className=\"jr-timeline__empty\">No timeline events.</div>\n {children}\n </div>\n )\n }\n\n return (\n <div className={rootClass} role=\"list\" aria-label=\"Timeline\">\n <ul className={listClass} ref={listRef} data-show-dependencies={showDependencies ? 'true' : undefined}>\n {events.map((ev) => {\n const status: TimelineStatus = ev.status ?? 'upcoming'\n return (\n <li\n key={ev.id}\n className={`jr-timeline__item jr-timeline__item--${status} jr-pressable jr-focusable`}\n role=\"listitem\"\n tabIndex={0}\n onClick={() => emit?.('timeline:select', { event: ev })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emit?.('timeline:select', { event: ev })\n }\n }}\n >\n {orientation === 'vertical' && <span className=\"jr-timeline__rail\" aria-hidden />}\n <span className=\"jr-timeline__dot\" aria-hidden ref={setDotRef(ev.id)} />\n <div className=\"jr-timeline__date\">{ev.date}</div>\n {ev.group ? <div className=\"jr-timeline__group\">{ev.group}</div> : null}\n <h4 className=\"jr-timeline__title\">{ev.label}</h4>\n {ev.description ? <p className=\"jr-timeline__desc\">{ev.description}</p> : null}\n </li>\n )\n })}\n {showDependencies && edges.length > 0 ? (\n <svg className=\"jr-timeline__dep-layer\" aria-hidden=\"true\">\n {edges.map((edge) => (\n <g\n key={edge.key}\n data-dep-from={edge.fromId}\n data-dep-to={edge.toId}\n >\n <path className=\"jr-timeline__dep-path\" d={edge.d} />\n <polygon className=\"jr-timeline__dep-arrowhead\" points={edge.arrow} />\n </g>\n ))}\n </svg>\n ) : null}\n </ul>\n {children}\n </div>\n )\n}\n\nexport default Timeline\n","import React, { useCallback, useMemo, useState } from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-hierarchy-tree'\n\nconst SHEET = `\n@keyframes jr-hierarchy-tree-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-hierarchy-tree {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n padding: var(--jr-spacing, 12px);\n font-size: 0.875rem;\n animation: jr-hierarchy-tree-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-hierarchy-tree--dense { font-size: 0.8125rem; padding: calc(var(--jr-spacing, 12px) * 0.85); }\n.jr-hierarchy-tree__list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.jr-hierarchy-tree__sub {\n list-style: none;\n margin: 0;\n padding: 0 0 0 1.15rem;\n border-left: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n margin-left: 0.45rem;\n}\n.jr-hierarchy-tree__row {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.35rem;\n margin: 0.2rem 0;\n border-radius: 6px;\n transition: background-color var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-hierarchy-tree__row:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 4%, transparent);\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--jr-primary, #3b82f6) 18%, transparent);\n}\n.jr-hierarchy-tree__toggle {\n flex: 0 0 1.25rem;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: none;\n border-radius: 4px;\n background: color-mix(in srgb, var(--jr-bg, #f1f5f9) 90%, transparent);\n color: var(--jr-text, #0f172a);\n cursor: pointer;\n font-size: 0.7rem;\n line-height: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n.jr-hierarchy-tree__toggle:hover {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 15%, var(--jr-surface, #fff));\n}\n/* :focus-visible handled by .jr-focusable mixin in motionFocusTokens.ts (CWRF-013 Phase 4 P1-T04). */\n.jr-hierarchy-tree__toggle--spacer {\n visibility: hidden;\n pointer-events: none;\n}\n.jr-hierarchy-tree__label-btn {\n flex: 1;\n text-align: left;\n padding: 0.25rem 0.4rem;\n margin: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n font: inherit;\n color: inherit;\n cursor: pointer;\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 0.35rem 0.5rem;\n}\n.jr-hierarchy-tree__label-btn:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 5%, transparent);\n}\n/* :focus-visible handled by .jr-focusable mixin in motionFocusTokens.ts (CWRF-013 Phase 4 P1-T04). */\n.jr-hierarchy-tree__icon {\n opacity: 0.85;\n font-size: 1em;\n}\n.jr-hierarchy-tree__badge {\n font-size: 0.6875rem;\n font-weight: 600;\n padding: 0.1rem 0.35rem;\n border-radius: 4px;\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 12%, transparent);\n color: var(--jr-text, #0f172a);\n}\n.jr-hierarchy-tree__rollup {\n font-size: 0.75rem;\n color: var(--jr-text-muted, #64748b);\n font-weight: 500;\n}\n.jr-hierarchy-tree__empty {\n padding: 0.75rem;\n color: var(--jr-text-muted, #64748b);\n text-align: center;\n}\n`\n\ninterface TreeNodeDef {\n label: string\n children?: string[]\n data?: Record<string, unknown>\n icon?: string\n badge?: string\n}\n\ntype RollupConfig = { field: string; aggregation: 'sum' | 'count' | 'max' }\n\ninterface HierarchyTreeProps {\n props: {\n nodes: Record<string, TreeNodeDef>\n rootId: string\n expandable?: boolean\n defaultExpanded?: string[]\n showRollup?: RollupConfig\n variant?: string\n /** Phase 4 Tier 4-4 Batch C: render centred spinner during async tree fetch. */\n loading?: boolean\n /** Phase 4 Tier 4-4 Batch C: render error placeholder; wins over loading. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nfunction buildNodeMap(nodes: Record<string, TreeNodeDef>): Map<string, TreeNodeDef> {\n const m = new Map<string, TreeNodeDef>()\n for (const id of Object.keys(nodes ?? {})) {\n const n = nodes[id]\n if (n && id) m.set(id, n)\n }\n return m\n}\n\nfunction rollupForSubtree(\n id: string,\n nodeMap: Map<string, TreeNodeDef>,\n cfg: RollupConfig,\n memo: Map<string, number>,\n): number {\n if (memo.has(id)) return memo.get(id)!\n\n const node = nodeMap.get(id)\n if (!node) {\n memo.set(id, cfg.aggregation === 'count' ? 0 : cfg.aggregation === 'max' ? Number.NEGATIVE_INFINITY : 0)\n return memo.get(id)!\n }\n\n const childIds = Array.isArray(node.children) ? node.children : []\n\n if (cfg.aggregation === 'count') {\n let c = 1\n for (const cid of childIds) c += rollupForSubtree(cid, nodeMap, cfg, memo)\n memo.set(id, c)\n return c\n }\n\n const raw = node.data?.[cfg.field]\n const selfNum = typeof raw === 'number' && Number.isFinite(raw) ? raw : Number(raw)\n\n if (cfg.aggregation === 'sum') {\n let s = Number.isFinite(selfNum) ? selfNum : 0\n for (const cid of childIds) s += rollupForSubtree(cid, nodeMap, cfg, memo)\n memo.set(id, s)\n return s\n }\n\n // max\n let mx = Number.isFinite(selfNum) ? selfNum : Number.NEGATIVE_INFINITY\n for (const cid of childIds) {\n const v = rollupForSubtree(cid, nodeMap, cfg, memo)\n if (Number.isFinite(v)) mx = Math.max(mx, v)\n }\n memo.set(id, mx)\n return mx\n}\n\nfunction formatRollup(v: number, aggregation: RollupConfig['aggregation']): string {\n if (aggregation === 'max' && !Number.isFinite(v)) return '—'\n if (Number.isInteger(v)) return String(v)\n return v.toFixed(2)\n}\n\nexport const HierarchyTree: React.FC<HierarchyTreeProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const treeState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const nodesRaw = props.nodes && typeof props.nodes === 'object' && !Array.isArray(props.nodes) ? props.nodes : {}\n const rootId = props.rootId\n const expandable = props.expandable !== false\n const defaultExpandedIds = Array.isArray(props.defaultExpanded) ? props.defaultExpanded : []\n const showRollup = props.showRollup\n const variant = props.variant ?? 'default'\n\n const nodeMap = useMemo(() => buildNodeMap(nodesRaw), [nodesRaw])\n\n const rollupMemo = useMemo(() => {\n if (!showRollup || !rootId || !nodeMap.has(rootId)) return new Map<string, number>()\n const memo = new Map<string, number>()\n rollupForSubtree(rootId, nodeMap, showRollup, memo)\n return memo\n }, [nodeMap, showRollup, rootId])\n\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set(defaultExpandedIds))\n\n const toggle = useCallback((id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }, [])\n\n const renderNode = (id: string, depth: number): React.ReactNode => {\n const node = nodeMap.get(id)\n if (!node) return null\n const childIds = Array.isArray(node.children) ? node.children : []\n const hasChildren = childIds.length > 0\n const isOpen = !expandable || expanded.has(id)\n\n const rollupText =\n showRollup && rollupMemo.size\n ? formatRollup(rollupMemo.get(id) ?? 0, showRollup.aggregation)\n : null\n\n return (\n <li key={id}>\n <div className=\"jr-hierarchy-tree__row\">\n {expandable && hasChildren ? (\n <button\n type=\"button\"\n className=\"jr-hierarchy-tree__toggle jr-pressable jr-focusable\"\n aria-expanded={isOpen}\n aria-label={isOpen ? 'Collapse' : 'Expand'}\n onClick={(e) => {\n e.stopPropagation()\n toggle(id)\n }}\n >\n {isOpen ? '▾' : '▸'}\n </button>\n ) : (\n <span className=\"jr-hierarchy-tree__toggle jr-hierarchy-tree__toggle--spacer\" aria-hidden>\n ·\n </span>\n )}\n <button\n type=\"button\"\n className=\"jr-hierarchy-tree__label-btn jr-pressable jr-focusable\"\n onClick={() => emit?.('tree:select', { id, depth, label: node.label })}\n >\n {node.icon ? (\n <span className=\"jr-hierarchy-tree__icon\" aria-hidden>\n {node.icon}\n </span>\n ) : null}\n <span>{node.label}</span>\n {node.badge ? <span className=\"jr-hierarchy-tree__badge\">{node.badge}</span> : null}\n {rollupText !== null ? (\n <span className=\"jr-hierarchy-tree__rollup\" title=\"Rollup\">\n {rollupText}\n </span>\n ) : null}\n </button>\n </div>\n {hasChildren && isOpen ? (\n <ul className=\"jr-hierarchy-tree__sub\">{childIds.map((cid) => renderNode(cid, depth + 1))}</ul>\n ) : null}\n </li>\n )\n }\n\n const rootClass =\n variant === 'dense' ? 'jr-hierarchy-tree jr-hierarchy-tree--dense' : 'jr-hierarchy-tree'\n\n if (treeState.isError) {\n return (\n <div className={rootClass} data-state=\"error\">\n <StateView kind=\"error\" description={treeState.errorMessage} />\n {children}\n </div>\n )\n }\n if (treeState.isLoading) {\n return (\n <div className={rootClass} data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (!rootId || !nodeMap.has(rootId)) {\n return (\n <div className={rootClass}>\n <div className=\"jr-hierarchy-tree__empty\">\n {!rootId ? 'Missing rootId.' : `Root node \"${rootId}\" not found.`}\n </div>\n {children}\n </div>\n )\n }\n\n return (\n <nav className={rootClass} aria-label=\"Hierarchy tree\">\n <ul className=\"jr-hierarchy-tree__list\">{renderNode(rootId, 0)}</ul>\n {children}\n </nav>\n )\n}\n\nexport default HierarchyTree\n","import React, { useId, useMemo, useRef, useState, useEffect } from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-waterfall-chart'\n\nconst SHEET = `\n@keyframes jr-waterfall-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-waterfall {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n animation: jr-waterfall-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-waterfall__svg-wrap {\n display: block;\n width: 100%;\n padding: var(--jr-spacing, 12px);\n}\n.jr-waterfall__svg {\n display: block;\n width: 100%;\n overflow: hidden;\n}\n.jr-waterfall__label {\n font-size: 10px;\n fill: var(--jr-text, #0f172a);\n}\n.jr-waterfall__value {\n font-size: 9px;\n font-weight: 600;\n fill: var(--jr-text, #0f172a);\n}\n.jr-waterfall__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n.jr-waterfall__baseline {\n stroke: color-mix(in srgb, var(--jr-text, #0f172a) 28%, transparent);\n stroke-width: 1;\n}\n.jr-waterfall__bar-outline {\n stroke: color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n stroke-width: 1;\n transition: filter var(--jr-transition-fast) var(--jr-easing-standard);\n cursor: pointer;\n}\n.jr-waterfall__bar-outline:hover {\n filter: brightness(1.15);\n}\n.jr-waterfall__connector {\n stroke: color-mix(in srgb, var(--jr-text, #0f172a) 35%, transparent);\n stroke-width: 1.25;\n stroke-dasharray: 4 3;\n fill: none;\n}\n.jr-waterfall__break {\n stroke: var(--jr-surface, #ffffff);\n stroke-width: 2;\n fill: none;\n}\n`\n\ntype WaterfallSegmentType = 'increase' | 'decrease' | 'total'\n\ninterface WaterfallSegment {\n label: string\n value: number\n type?: WaterfallSegmentType\n isTotal?: boolean\n color?: string\n}\n\ninterface WaterfallChartProps {\n props: {\n segments: WaterfallSegment[]\n unit?: string\n showConnectors?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace chart with spinner. */\n loading?: boolean\n /** CWRF-013 Phase 4 Tier 4-4 (Batch B): replace chart with error placeholder. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nfunction formatCompact(v: number, unit?: string): string {\n const abs = Math.abs(v)\n let s: string\n if (abs >= 1e8) s = `${(v / 1e8).toFixed(1)}亿`\n else if (abs >= 1e6) s = `${(v / 1e6).toFixed(1)}M`\n else if (abs >= 1e4) s = `${(v / 1e3).toFixed(0)}K`\n else if (abs >= 1e3) s = `${(v / 1e3).toFixed(1)}K`\n else s = Number.isInteger(v) ? String(v) : v.toFixed(1)\n return unit ? `${s} ${unit}` : s\n}\n\nconst CHART_H = 200\n\nexport const WaterfallChart: React.FC<WaterfallChartProps> = ({ props, children }) => {\n injectStyles(STYLE_ID, SHEET)\n\n // CWRF-013 Phase 4 Tier 4-4 (Batch B): five-state hook (unconditional).\n const wfState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n const segments = Array.isArray(props.segments) ? props.segments : []\n const unit = props.unit\n const showConnectors = props.showConnectors === true\n const uid = useId().replace(/:/g, '')\n const gradIncId = `jr-wf-inc-${uid}`\n const gradDecId = `jr-wf-dec-${uid}`\n const gradTotId = `jr-wf-tot-${uid}`\n\n const wrapRef = useRef<HTMLDivElement>(null)\n const [cw, setCw] = useState(0)\n useEffect(() => {\n const el = wrapRef.current\n if (!el) return\n const sync = () => {\n const w = Math.round(el.clientWidth)\n if (w > 0) setCw(prev => (prev === w ? prev : w))\n }\n sync()\n const ro = new ResizeObserver(sync)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const layout = useMemo(() => {\n if (segments.length === 0) return null\n\n type BarRow = {\n idx: number\n label: string\n val: number\n kind: WaterfallSegmentType\n yLow: number\n yHigh: number\n isClamped: boolean\n }\n\n const accPositions: number[] = []\n let acc = 0\n const bars: BarRow[] = []\n\n for (let idx = 0; idx < segments.length; idx++) {\n const it = segments[idx]\n const v = Number.isFinite(it.value) ? it.value : 0\n const t: WaterfallSegmentType = it.type\n ?? (it.isTotal ? 'total' : v < 0 ? 'decrease' : 'increase')\n\n if (t === 'total') {\n accPositions.push(v)\n bars.push({ idx, label: it.label, val: v, kind: 'total', yLow: 0, yHigh: v, isClamped: false })\n acc = v\n } else if (t === 'decrease') {\n const delta = -Math.abs(v)\n const yHigh = acc\n acc += delta\n const yLow = acc\n accPositions.push(yHigh, yLow)\n bars.push({ idx, label: it.label, val: v, kind: 'decrease', yLow, yHigh, isClamped: false })\n } else {\n const yLow = acc\n acc += v\n const yHigh = acc\n accPositions.push(yLow, yHigh)\n bars.push({ idx, label: it.label, val: v, kind: 'increase', yLow, yHigh, isClamped: false })\n }\n }\n\n let minY = Math.min(...accPositions)\n let maxY = Math.max(...accPositions)\n const margin = (maxY - minY) * 0.08 || 1\n minY -= margin\n maxY += margin\n const span = Math.max(1e-9, maxY - minY)\n\n const n = segments.length\n const padL = 44\n const padR = 12\n const padT = 24\n const labelAreaH = n > 6 ? 72 : 36\n const padB = labelAreaH + 8\n const vbW = cw || 456\n const innerW = vbW - padL - padR\n const H = padT + CHART_H + padB\n const barGap = Math.max(2, Math.min(6, innerW / n * 0.15))\n const slotW = (innerW - barGap * Math.max(0, n - 1)) / Math.max(1, n)\n const barW = Math.max(6, slotW)\n\n const yToSvg = (y: number) => padT + (1 - (y - minY) / span) * CHART_H\n const chartBottom = padT + CHART_H\n\n const placed = bars.map((b) => {\n const x = padL + b.idx * (barW + barGap) + (slotW - barW) / 2\n let top = yToSvg(Math.max(b.yLow, b.yHigh))\n let bottom = yToSvg(Math.min(b.yLow, b.yHigh))\n let isClamped = false\n if (bottom > chartBottom) { bottom = chartBottom; isClamped = true }\n if (top < padT) { top = padT; isClamped = true }\n const endVal = b.kind === 'decrease' ? Math.min(b.yLow, b.yHigh) : Math.max(b.yLow, b.yHigh)\n const bridgeY = Math.max(padT, Math.min(yToSvg(endVal), chartBottom))\n return { ...b, x, top, h: Math.max(2, bottom - top), bridgeY, isClamped }\n })\n\n const baselineY = yToSvg(0)\n const showBaseline = baselineY >= padT && baselineY <= chartBottom\n\n return { vbW, H, padL, padT, innerW, placed, baselineY, showBaseline, barW, barGap, slotW, chartBottom, labelAreaH }\n }, [segments, cw])\n\n if (wfState.isError) {\n return (\n <div className=\"jr-waterfall\" data-state=\"error\" role=\"img\" aria-label={unit ? `Waterfall chart (${unit})` : 'Waterfall chart'}>\n <StateView kind=\"error\" description={wfState.errorMessage} />\n {children}\n </div>\n )\n }\n if (wfState.isLoading) {\n return (\n <div className=\"jr-waterfall\" data-state=\"loading\" role=\"img\" aria-label={unit ? `Waterfall chart (${unit})` : 'Waterfall chart'}>\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (!layout || segments.length === 0) {\n return (\n <div className=\"jr-waterfall\" role=\"img\" aria-label={unit ? `Waterfall chart (${unit})` : 'Waterfall chart'}>\n <div className=\"jr-waterfall__empty\">No waterfall data.</div>\n {children}\n </div>\n )\n }\n\n const { vbW, H, placed, baselineY, showBaseline, barW, slotW, chartBottom, labelAreaH } = layout\n const rotateLabels = slotW < 48\n\n const valueLabelEls: React.ReactNode[] = []\n let prevValX = -Infinity\n const valMinGap = 50\n for (const b of placed) {\n const cx = b.x + barW / 2\n if (cx - prevValX < valMinGap) continue\n prevValX = cx\n valueLabelEls.push(\n <text key={`val-${b.idx}`} className=\"jr-waterfall__value\" x={cx} y={b.top - 5} textAnchor=\"middle\">\n {formatCompact(b.val, unit)}\n </text>,\n )\n }\n\n const xLabelEls: React.ReactNode[] = []\n const labelStep = rotateLabels ? 1 : 1\n const maxLabelChars = rotateLabels ? 8 : Math.max(3, Math.floor(slotW / 6))\n for (let i = 0; i < placed.length; i += labelStep) {\n const b = placed[i]\n const cx = b.x + barW / 2\n const ly = chartBottom + 10\n const raw = b.label\n const truncated = raw.length > maxLabelChars ? `${raw.slice(0, maxLabelChars - 1)}…` : raw\n if (rotateLabels) {\n xLabelEls.push(\n <text\n key={`lbl-${b.idx}`}\n className=\"jr-waterfall__label\"\n x={cx}\n y={ly}\n textAnchor=\"end\"\n transform={`rotate(-40 ${cx} ${ly})`}\n >\n {truncated}\n </text>,\n )\n } else {\n xLabelEls.push(\n <text key={`lbl-${b.idx}`} className=\"jr-waterfall__label\" x={cx} y={ly} textAnchor=\"middle\">\n {truncated}\n </text>,\n )\n }\n }\n\n return (\n <div className=\"jr-waterfall\" role=\"img\" aria-label={unit ? `Waterfall chart (${unit})` : 'Waterfall chart'}>\n <div ref={wrapRef} className=\"jr-waterfall__svg-wrap\">\n <svg className=\"jr-waterfall__svg\" viewBox={`0 0 ${vbW} ${H}`} style={{ height: H }}>\n <defs>\n <clipPath id={`jr-wf-clip-${uid}`}>\n <rect x={layout.padL} y={layout.padT} width={layout.innerW} height={CHART_H} />\n </clipPath>\n <linearGradient id={gradIncId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"var(--jr-success, #22c55e)\" stopOpacity=\"0.95\" />\n <stop offset=\"100%\" stopColor=\"var(--jr-success, #16a34a)\" stopOpacity=\"0.75\" />\n </linearGradient>\n <linearGradient id={gradDecId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"var(--jr-danger, #f87171)\" stopOpacity=\"0.9\" />\n <stop offset=\"100%\" stopColor=\"var(--jr-danger, #ef4444)\" stopOpacity=\"0.75\" />\n </linearGradient>\n <linearGradient id={gradTotId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"var(--jr-primary, #60a5fa)\" stopOpacity=\"0.95\" />\n <stop offset=\"100%\" stopColor=\"var(--jr-primary, #3b82f6)\" stopOpacity=\"0.8\" />\n </linearGradient>\n </defs>\n {showBaseline && (\n <line\n className=\"jr-waterfall__baseline\"\n x1={layout.padL - 8}\n y1={baselineY}\n x2={layout.padL + layout.innerW + 8}\n y2={baselineY}\n />\n )}\n <g clipPath={`url(#jr-wf-clip-${uid})`}>\n {showConnectors &&\n placed.slice(0, -1).map((b, i) => {\n const next = placed[i + 1]\n return (\n <line\n key={`wf-conn-${b.idx}`}\n className=\"jr-waterfall__connector\"\n x1={b.x + barW}\n y1={b.bridgeY}\n x2={next.x}\n y2={b.bridgeY}\n />\n )\n })}\n {placed.map((b) => {\n const seg = segments[b.idx]\n const fillDefault =\n b.kind === 'decrease' ? `url(#${gradDecId})` : b.kind === 'total' ? `url(#${gradTotId})` : `url(#${gradIncId})`\n const fill = seg?.color?.trim() ? seg.color : fillDefault\n return (\n <g key={`bar-${b.idx}`}>\n <rect\n className=\"jr-waterfall__bar-outline jr-pressable jr-focusable\"\n x={b.x}\n y={b.top}\n width={barW}\n height={b.h}\n rx={3}\n ry={3}\n fill={fill}\n >\n <title>{`${b.label}: ${formatCompact(b.val, unit)}`}</title>\n </rect>\n {b.isClamped && (\n <path\n className=\"jr-waterfall__break\"\n d={`M ${b.x + 1} ${chartBottom - 5} q ${barW / 4} 3 ${barW / 2} 0 q ${barW / 4} -3 ${barW / 2 - 1} 0`}\n />\n )}\n </g>\n )\n })}\n </g>\n {valueLabelEls}\n {xLabelEls}\n </svg>\n </div>\n {children}\n </div>\n )\n}\n\nexport default WaterfallChart\n","import React from 'react'\n\nconst STYLE_ID = 'jr-styles-status-board'\n\nconst SHEET = `\n@keyframes jr-status-board-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-status-board {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: hidden;\n animation: jr-status-board-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-status-board__track {\n display: flex;\n flex-wrap: wrap;\n gap: var(--jr-spacing, 12px);\n padding: var(--jr-spacing, 12px);\n overflow-x: auto;\n align-items: flex-start;\n}\n.jr-status-board__col {\n flex: 1 1 12rem;\n min-width: 11rem;\n max-width: 20rem;\n border-radius: calc(var(--jr-radius, 8px) * 0.85);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 88%, var(--jr-surface, #fff));\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n display: flex;\n flex-direction: column;\n max-height: 28rem;\n}\n.jr-status-board__col-head {\n padding: 0.55rem 0.65rem;\n font-size: 0.8125rem;\n font-weight: 600;\n border-bottom: 2px solid var(--jr-column-accent, color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent));\n flex-shrink: 0;\n}\n.jr-status-board__col-status {\n display: block;\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--jr-text-muted, #64748b);\n margin-top: 0.2rem;\n}\n.jr-status-board__col-body {\n padding: 0.45rem;\n display: flex;\n flex-direction: column;\n gap: 0.45rem;\n overflow-y: auto;\n flex: 1;\n}\n.jr-status-board__card {\n border-radius: 6px;\n background: var(--jr-surface, #fff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n padding: 0.55rem 0.6rem;\n box-shadow: 0 1px 2px color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n cursor: pointer;\n transition: transform var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard), border-color var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-status-board__card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 10px color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n border-color: color-mix(in srgb, var(--jr-primary, #3b82f6) 28%, transparent);\n}\n.jr-status-board__card-title {\n font-size: 0.8125rem;\n font-weight: 600;\n margin: 0 0 0.25rem;\n}\n.jr-status-board__card-subtitle {\n margin: 0;\n font-size: 0.75rem;\n color: var(--jr-text-muted, #64748b);\n line-height: 1.4;\n}\n.jr-status-board__badges {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n margin-top: 0.35rem;\n}\n.jr-status-board__badge {\n font-size: 0.65rem;\n font-weight: 600;\n padding: 0.12rem 0.35rem;\n border-radius: 4px;\n background: color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n color: var(--jr-text, #0f172a);\n}\n.jr-status-board__priority {\n margin-top: 0.35rem;\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n.jr-status-board__priority--low { color: var(--jr-text-muted, #64748b); }\n.jr-status-board__priority--medium { color: var(--jr-primary, #3b82f6); }\n.jr-status-board__priority--high { color: var(--jr-warning, #d97706); }\n.jr-status-board__priority--urgent { color: var(--jr-danger, #dc2626); }\n.jr-status-board__empty {\n padding: 1rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n.jr-status-board--compact .jr-status-board__col { min-width: 9rem; }\n.jr-status-board--compact .jr-status-board__card { padding: 0.4rem 0.45rem; }\n`\n\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\ntype CardPriority = 'low' | 'medium' | 'high' | 'urgent'\n\ntype BadgeItem = string | { label: string; color?: string }\n\ninterface StatusBoardCard {\n id: string\n title: string\n subtitle?: string\n description?: string\n badges?: BadgeItem[]\n priority?: CardPriority\n}\n\ninterface StatusBoardColumn {\n title: string\n status?: string\n color?: string\n cards: StatusBoardCard[]\n}\n\ninterface StatusBoardProps {\n props: {\n columns: StatusBoardColumn[]\n variant?: string\n /** Phase 4 Tier 4-4 Batch C: render centred spinner during async board boot. */\n loading?: boolean\n /** Phase 4 Tier 4-4 Batch C: render error placeholder; wins over loading. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nconst BADGE_PALETTE: Record<string, { bg: string; fg: string }> = {\n red: { bg: '#fef2f2', fg: '#dc2626' },\n blue: { bg: '#eff6ff', fg: '#2563eb' },\n green: { bg: '#f0fdf4', fg: '#16a34a' },\n amber: { bg: '#fffbeb', fg: '#d97706' },\n purple: { bg: '#faf5ff', fg: '#9333ea' },\n gray: { bg: '#f8fafc', fg: '#64748b' },\n}\n\nfunction renderBadge(b: BadgeItem): string {\n if (typeof b === 'string') return b\n if (b && typeof b === 'object' && 'label' in b) return b.label\n return String(b)\n}\n\nfunction badgeStyle(b: BadgeItem): React.CSSProperties | undefined {\n if (typeof b !== 'object' || !b || !('color' in b) || !b.color) return undefined\n const palette = BADGE_PALETTE[b.color]\n if (palette) return { background: palette.bg, color: palette.fg }\n return { background: `color-mix(in srgb, ${b.color} 15%, transparent)`, color: b.color }\n}\n\nfunction cardSubtitle(card: StatusBoardCard): string | undefined {\n return card.subtitle ?? card.description\n}\n\nexport const StatusBoard: React.FC<StatusBoardProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const rawColumns = props.columns\n const columns = Array.isArray(rawColumns) ? rawColumns : []\n const variant = props.variant ?? 'default'\n\n const rootClass =\n variant === 'compact'\n ? 'jr-status-board jr-status-board--compact'\n : 'jr-status-board'\n\n const boardState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n if (boardState.isError) {\n return (\n <div className={rootClass} data-state=\"error\">\n <StateView kind=\"error\" description={boardState.errorMessage} />\n {children}\n </div>\n )\n }\n if (boardState.isLoading) {\n return (\n <div className={rootClass} data-state=\"loading\">\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n if (columns.length === 0) {\n if (!Array.isArray(rawColumns)) return null\n return (\n <div className={rootClass}>\n <div className=\"jr-status-board__empty\">No columns defined.</div>\n {children}\n </div>\n )\n }\n\n return (\n <div\n className={rootClass}\n role=\"region\"\n aria-label=\"Status board\"\n >\n <div className=\"jr-status-board__track\">\n {columns.map((col, colIndex) => {\n const list = Array.isArray(col.cards) ? col.cards : []\n const accent = col.color ?? undefined\n const colKey = `${col.status ?? col.title}-${colIndex}`\n return (\n <section\n key={colKey}\n className=\"jr-status-board__col\"\n style={\n accent\n ? ({\n ['--jr-column-accent' as string]: accent,\n } as React.CSSProperties)\n : undefined\n }\n >\n <header className=\"jr-status-board__col-head\">\n {col.title}\n {col.status ? (\n <span className=\"jr-status-board__col-status\">{col.status}</span>\n ) : null}\n <span style={{ fontWeight: 400, opacity: 0.75 }}> ({list.length})</span>\n </header>\n <div className=\"jr-status-board__col-body\">\n {list.map((card) => (\n <article\n key={card.id}\n className=\"jr-status-board__card jr-pressable jr-focusable\"\n role=\"button\"\n tabIndex={0}\n onClick={() => emit?.('status-board:card-click', { card, columnIndex: colIndex, column: col })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emit?.('status-board:card-click', { card, columnIndex: colIndex, column: col })\n }\n }}\n >\n <h4 className=\"jr-status-board__card-title\">{card.title}</h4>\n {cardSubtitle(card) ? (\n <p className=\"jr-status-board__card-subtitle\">{cardSubtitle(card)}</p>\n ) : null}\n {card.badges && card.badges.length > 0 ? (\n <div className=\"jr-status-board__badges\" aria-label=\"Tags\">\n {card.badges.map((b, i) => (\n <span\n key={`${card.id}-badge-${i}`}\n className=\"jr-status-board__badge\"\n style={badgeStyle(b)}\n >\n {renderBadge(b)}\n </span>\n ))}\n </div>\n ) : null}\n {card.priority ? (\n <div\n className={`jr-status-board__priority jr-status-board__priority--${card.priority}`}\n >\n {card.priority}\n </div>\n ) : null}\n </article>\n ))}\n </div>\n </section>\n )\n })}\n </div>\n {children}\n </div>\n )\n}\n\nexport default StatusBoard\n","import React from 'react'\nimport { injectStyles } from './injectStyles'\nimport { StateView } from './primitives/StateView'\nimport { useComponentState } from './primitives/useComponentState'\n\nconst STYLE_ID = 'jr-styles-decision-panel'\n\nconst SHEET = `\n@keyframes jr-decision-panel-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-decision-panel {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n padding: var(--jr-spacing, 12px);\n animation: jr-decision-panel-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-decision-panel__title {\n margin: 0 0 0.75rem;\n font-size: 1rem;\n font-weight: 600;\n}\n.jr-decision-panel__list {\n display: flex;\n flex-direction: column;\n gap: 0.55rem;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.jr-decision-panel__option {\n margin: 0;\n}\n.jr-decision-panel__btn {\n width: 100%;\n text-align: left;\n padding: 0.65rem 0.75rem;\n border-radius: calc(var(--jr-radius, 8px) * 0.85);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 55%, var(--jr-surface, #fff));\n font: inherit;\n color: inherit;\n cursor: pointer;\n transition: border-color var(--jr-transition-fast) var(--jr-easing-standard), background var(--jr-transition-fast) var(--jr-easing-standard), transform var(--jr-transition-fast) var(--jr-easing-standard), box-shadow var(--jr-transition-fast) var(--jr-easing-standard);\n}\n.jr-decision-panel__btn:hover {\n border-color: color-mix(in srgb, var(--jr-primary, #3b82f6) 45%, transparent);\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 6%, var(--jr-surface, #fff));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n transform: translateY(-1px);\n}\n/* :focus-visible handled by .jr-focusable mixin in motionFocusTokens.ts (CWRF-013 Phase 4 P1-T04). */\n.jr-decision-panel__btn--recommended {\n border-color: color-mix(in srgb, var(--jr-success, #22c55e) 55%, transparent);\n background: color-mix(in srgb, var(--jr-success, #22c55e) 10%, var(--jr-surface, #fff));\n}\n.jr-decision-panel__btn--selected {\n outline: 2px solid color-mix(in srgb, var(--jr-primary, #3b82f6) 55%, transparent);\n outline-offset: 1px;\n}\n.jr-decision-panel__row {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: 0.5rem;\n margin-bottom: 0.35rem;\n}\n.jr-decision-panel__name {\n font-weight: 600;\n font-size: 0.875rem;\n}\n.jr-decision-panel__badge {\n font-size: 0.65rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--jr-success, #16a34a);\n flex-shrink: 0;\n}\n.jr-decision-panel__score {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-decision-panel__description {\n margin: 0 0 0.35rem;\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #64748b);\n line-height: 1.45;\n}\n.jr-decision-panel__pros,\n.jr-decision-panel__cons {\n margin: 0.25rem 0 0;\n padding-left: 1.1rem;\n font-size: 0.8125rem;\n line-height: 1.4;\n}\n.jr-decision-panel__pros {\n color: var(--jr-success, #16a34a);\n}\n.jr-decision-panel__cons {\n color: var(--jr-danger, #dc2626);\n}\n.jr-decision-panel__empty {\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n text-align: center;\n padding: 0.5rem;\n}\n.jr-decision-panel--cards .jr-decision-panel__btn {\n box-shadow: 0 1px 2px color-mix(in srgb, var(--jr-text, #0f172a) 5%, transparent);\n}\n`\n\ninterface DecisionPanelProps {\n props: {\n title: string\n options: {\n name: string\n description?: string\n pros: string[]\n cons: string[]\n score?: number\n recommended?: boolean\n }[]\n variant?: string\n selectedOption?: string\n /** Phase 4 Tier 4-4 Batch C: render centred spinner during async option fetch. */\n loading?: boolean\n /** Phase 4 Tier 4-4 Batch C: render error placeholder; wins over loading. */\n error?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const DecisionPanel: React.FC<DecisionPanelProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const title = props.title ?? 'Decision'\n const options = Array.isArray(props.options) ? props.options : []\n const variant = props.variant ?? 'default'\n const selectedOption = props.selectedOption\n const rootClass =\n variant === 'cards' ? 'jr-decision-panel jr-decision-panel--cards' : 'jr-decision-panel'\n\n const listState = useComponentState({\n loading: props.loading === true,\n error: typeof props.error === 'string' && props.error.length > 0 ? props.error : undefined,\n })\n\n if (listState.isError) {\n return (\n <div className={rootClass} role=\"region\" aria-label={title} data-state=\"error\">\n <h3 className=\"jr-decision-panel__title\">{title}</h3>\n <StateView kind=\"error\" description={listState.errorMessage} />\n {children}\n </div>\n )\n }\n if (listState.isLoading) {\n return (\n <div className={rootClass} role=\"region\" aria-label={title} data-state=\"loading\">\n <h3 className=\"jr-decision-panel__title\">{title}</h3>\n <StateView kind=\"loading\" />\n {children}\n </div>\n )\n }\n\n return (\n <div className={rootClass} role=\"region\" aria-label={title}>\n <h3 className=\"jr-decision-panel__title\">{title}</h3>\n {options.length === 0 ? (\n <div className=\"jr-decision-panel__empty\">No options.</div>\n ) : (\n <ul className=\"jr-decision-panel__list\">\n {options.map((opt, idx) => {\n const isSelected = selectedOption != null && opt.name === selectedOption\n const btnClass = [\n 'jr-decision-panel__btn',\n 'jr-pressable',\n 'jr-focusable',\n opt.recommended ? 'jr-decision-panel__btn--recommended' : '',\n isSelected ? 'jr-decision-panel__btn--selected' : '',\n ]\n .filter(Boolean)\n .join(' ')\n return (\n <li key={`${opt.name}-${idx}`} className=\"jr-decision-panel__option\">\n <button\n type=\"button\"\n className={btnClass}\n aria-pressed={isSelected}\n onClick={() =>\n emit?.('decision:select', {\n name: opt.name,\n score: opt.score,\n recommended: opt.recommended,\n })\n }\n >\n <div className=\"jr-decision-panel__row\">\n <span className=\"jr-decision-panel__name\">{opt.name}</span>\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.35rem' }}>\n {opt.recommended ? <span className=\"jr-decision-panel__badge\">Recommended</span> : null}\n {opt.score != null && Number.isFinite(opt.score) ? (\n <span className=\"jr-decision-panel__score\">{opt.score.toFixed(1)}</span>\n ) : null}\n </span>\n </div>\n {opt.description ? <p className=\"jr-decision-panel__description\">{opt.description}</p> : null}\n {Array.isArray(opt.pros) && opt.pros.length > 0 ? (\n <ul className=\"jr-decision-panel__pros\">\n {opt.pros.map((p, i) => (\n <li key={i}>{p}</li>\n ))}\n </ul>\n ) : null}\n {Array.isArray(opt.cons) && opt.cons.length > 0 ? (\n <ul className=\"jr-decision-panel__cons\">\n {opt.cons.map((c, i) => (\n <li key={i}>{c}</li>\n ))}\n </ul>\n ) : null}\n </button>\n </li>\n )\n })}\n </ul>\n )}\n {children}\n </div>\n )\n}\n\nexport default DecisionPanel\n","import React, { useMemo } from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-heatmap'\n\nconst SHEET = `\n@keyframes jr-heatmap-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-heatmap {\n box-sizing: border-box;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n overflow: auto;\n max-width: 100%;\n animation: jr-heatmap-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-heatmap__table {\n border-collapse: separate;\n border-spacing: 2px;\n font-size: 0.75rem;\n min-width: 100%;\n}\n.jr-heatmap__corner {\n position: sticky;\n left: 0;\n z-index: 2;\n background: var(--jr-surface, #fff);\n min-width: 5rem;\n}\n.jr-heatmap__th {\n padding: 0.35rem 0.4rem;\n text-align: center;\n font-weight: 600;\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 85%, var(--jr-surface, #fff));\n border-radius: 4px;\n max-width: 6rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.jr-heatmap__row-label {\n position: sticky;\n left: 0;\n z-index: 1;\n padding: 0.35rem 0.5rem;\n font-weight: 500;\n text-align: left;\n background: var(--jr-surface, #fff);\n border-radius: 4px;\n max-width: 10rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.jr-heatmap__cell {\n width: 2.25rem;\n height: 2.25rem;\n min-width: 2rem;\n min-height: 2rem;\n border-radius: 4px;\n text-align: center;\n vertical-align: middle;\n font-variant-numeric: tabular-nums;\n font-weight: 500;\n color: var(--jr-heatmap-fg, #0f172a);\n transition: transform var(--jr-transition-fast) var(--jr-easing-standard), box-shadow var(--jr-transition-fast) var(--jr-easing-standard);\n position: relative;\n}\n/* CWRF-013 Phase 0 (Item 09): cells only LOOK clickable when an emit\n * callback is attached. Without an emit handler the heatmap is purely a\n * read-only visualization. */\n.jr-heatmap--interactive .jr-heatmap__cell {\n cursor: pointer;\n}\n/* CWRF-013 Phase 5 Tier 5-2: :focus-visible handled by .jr-focusable--inset\n * mixin in motionFocusTokens.ts (cell receives the mixin className only when\n * interactive, so non-interactive heatmaps stay focusless). */\n.jr-heatmap__cell:hover {\n transform: scale(1.15);\n box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n z-index: 3;\n}\n/* CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-007): dual encoding tier classes.\n * The gradient color is still the primary visual signal; under forced-colors\n * (Windows High Contrast / monochrome) the color tier flattens to system\n * colors and we layer a diagonal stripe pattern on mid/high cells so users\n * who cannot perceive the gradient still get a saturation signal. The\n * always-on numeric value label inside the cell adds a third channel. */\n.jr-heatmap__cell--low,\n.jr-heatmap__cell--mid,\n.jr-heatmap__cell--high {\n /* No-op selectors under default rendering — the inline background-color\n * style applied per cell wins. Forced-colors block below activates patterns. */\n}\n@media (forced-colors: active) {\n .jr-heatmap__cell--low {\n background-color: Canvas !important;\n color: CanvasText !important;\n forced-color-adjust: none;\n }\n .jr-heatmap__cell--mid {\n background-color: Canvas !important;\n color: CanvasText !important;\n background-image: repeating-linear-gradient(45deg, CanvasText 0 1px, transparent 1px 5px);\n forced-color-adjust: none;\n }\n .jr-heatmap__cell--high {\n background-color: Highlight !important;\n color: HighlightText !important;\n background-image: repeating-linear-gradient(45deg, HighlightText 0 1px, transparent 1px 3px);\n forced-color-adjust: none;\n }\n}\n.jr-heatmap__cell-value {\n display: inline-block;\n font-size: 0.6875rem;\n line-height: 1;\n}\n.jr-heatmap__empty {\n padding: 1.25rem;\n text-align: center;\n color: var(--jr-text-muted, #64748b);\n font-size: 0.875rem;\n}\n/* Screen-reader-only value: when cellLabel is false the numeric value is\n * not painted, but assistive tech still needs to announce it. */\n.jr-heatmap__sr {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n`\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const m = hex.trim().match(/^#?([0-9a-f]{6})$/i)\n if (!m) return null\n const n = parseInt(m[1], 16)\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 }\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t\n}\n\nfunction mixColors(low: string, high: string, t: number): string {\n const A = hexToRgb(low) ?? { r: 224, g: 231, b: 255 }\n const B = hexToRgb(high) ?? { r: 37, g: 99, b: 235 }\n const r = Math.round(lerp(A.r, B.r, t))\n const g = Math.round(lerp(A.g, B.g, t))\n const b = Math.round(lerp(A.b, B.b, t))\n return `rgb(${r} ${g} ${b})`\n}\n\ntype HeatmapColorScale = 'green-red' | 'blue-red' | 'grayscale' | 'custom'\n\nfunction scaleEndpoints(\n colorScale: HeatmapColorScale | undefined,\n customColors: string[] | undefined,\n): { low: string; high: string } {\n switch (colorScale) {\n case 'green-red':\n return { low: '#bbf7d0', high: '#dc2626' }\n case 'blue-red':\n return { low: '#93c5fd', high: '#dc2626' }\n case 'grayscale':\n return { low: '#f1f5f9', high: '#1e293b' }\n case 'custom': {\n const c = Array.isArray(customColors) ? customColors : []\n if (c.length >= 2) return { low: c[0], high: c[c.length - 1] }\n return { low: '#e0e7ff', high: '#2563eb' }\n }\n default:\n return { low: '#bbf7d0', high: '#dc2626' }\n }\n}\n\ninterface HeatmapProps {\n props: {\n data: number[][]\n xLabels: string[]\n yLabels: string[]\n min?: number\n max?: number\n colorScale?: HeatmapColorScale\n customColors?: string[]\n cellLabel?: boolean\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const Heatmap: React.FC<HeatmapProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const rawYLabels = props.yLabels\n const rawXLabels = props.xLabels\n const yLabels = Array.isArray(rawYLabels) ? rawYLabels : []\n const xLabels = Array.isArray(rawXLabels) ? rawXLabels : []\n const matrix = Array.isArray(props.data) ? props.data : []\n const cellLabel = props.cellLabel === true\n // CWRF-013 Phase 0 (Item 09): cells become clickable (pointer cursor,\n // tabIndex, keyboard a11y, emit('cellClick', ...)) only when an emit\n // callback is wired. Without emit the heatmap is read-only visualization\n // and cursor is the document default (AC-HONESTY-024).\n const interactive = typeof emit === 'function'\n const { low: colorLow, high: colorHigh } = scaleEndpoints(props.colorScale, props.customColors)\n\n const { minV, maxV } = useMemo(() => {\n let lo = props.min\n let hi = props.max\n if (lo != null && hi != null && Number.isFinite(lo) && Number.isFinite(hi) && hi > lo) {\n return { minV: lo, maxV: hi }\n }\n let minAcc = Infinity\n let maxAcc = -Infinity\n for (const row of matrix) {\n if (!Array.isArray(row)) continue\n for (const v of row) {\n if (typeof v === 'number' && Number.isFinite(v)) {\n minAcc = Math.min(minAcc, v)\n maxAcc = Math.max(maxAcc, v)\n }\n }\n }\n if (!Number.isFinite(minAcc)) minAcc = 0\n if (!Number.isFinite(maxAcc)) maxAcc = 1\n if (maxAcc === minAcc) maxAcc = minAcc + 1\n return { minV: lo ?? minAcc, maxV: hi ?? maxAcc }\n }, [matrix, props.min, props.max])\n\n const span = Math.max(1e-9, maxV - minV)\n\n if (yLabels.length === 0 || xLabels.length === 0) {\n if (!Array.isArray(rawYLabels) || !Array.isArray(rawXLabels)) return null\n return (\n <div className={interactive ? 'jr-heatmap jr-heatmap--interactive' : 'jr-heatmap'}>\n <div className=\"jr-heatmap__empty\">xLabels and yLabels are required.</div>\n {children}\n </div>\n )\n }\n\n const emitCellClick = (row: number, col: number, value: number) => {\n if (!emit) return\n emit('cellClick', {\n row,\n col,\n value,\n xLabel: xLabels[col],\n yLabel: yLabels[row],\n })\n }\n\n return (\n <div\n className={interactive ? 'jr-heatmap jr-heatmap--interactive' : 'jr-heatmap'}\n role=\"region\"\n aria-label=\"Heatmap\"\n >\n {/* The inner <table> carries the semantic grid structure; the outer\n wrapper exists for scroll + overflow only. Using role=\"grid\" on\n the wrapper conflicts with the table child (axe-core\n aria-required-children rule, AC-A11Y-005). */}\n <table className=\"jr-heatmap__table\">\n <thead>\n <tr>\n <th scope=\"col\" className=\"jr-heatmap__th jr-heatmap__corner\" />\n {xLabels.map((c) => (\n <th key={c} scope=\"col\" className=\"jr-heatmap__th\" title={c}>\n {c}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {yLabels.map((rowLabel, ri) => {\n const rowVals = Array.isArray(matrix[ri]) ? matrix[ri] : []\n return (\n <tr key={rowLabel || String(ri)}>\n <th scope=\"row\" className=\"jr-heatmap__row-label\" title={rowLabel}>\n {rowLabel}\n </th>\n {xLabels.map((_, ci) => {\n const raw = rowVals[ci]\n const v = typeof raw === 'number' && Number.isFinite(raw) ? raw : 0\n const t = Math.min(1, Math.max(0, (v - minV) / span))\n const bg = mixColors(colorLow, colorHigh, t)\n const fg = t > 0.55 ? '#f8fafc' : 'var(--jr-text, #0f172a)'\n const label = Number.isInteger(v) ? String(v) : v.toFixed(1)\n // CWRF-013 Phase 5 Tier 5-4 (AC-A11Y-007): tier bucket drives\n // dual-encoding pattern (CSS class) and forced-colors fallback.\n // Three buckets keep the test contract small while still\n // capturing the WCAG 1.4.1 \"color + something else\" requirement.\n const tier: 'low' | 'mid' | 'high' =\n t < 0.34 ? 'low' : t < 0.67 ? 'mid' : 'high'\n const xLabel = xLabels[ci] ?? String(ci)\n const ariaLabel = `${rowLabel}, ${xLabel}: ${label}`\n const baseClass = `jr-heatmap__cell jr-heatmap__cell--${tier}`\n return (\n <td\n key={ci}\n className={interactive ? `${baseClass} jr-pressable jr-focusable--inset` : baseClass}\n role=\"gridcell\"\n data-tier={tier}\n style={{\n background: bg,\n color: fg,\n ['--jr-heatmap-fg' as string]: fg,\n }}\n title={`${rowLabel} / ${xLabel}: ${v}`}\n aria-label={ariaLabel}\n tabIndex={interactive ? 0 : undefined}\n onClick={interactive ? () => emitCellClick(ri, ci, v) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n emitCellClick(ri, ci, v)\n }\n }\n : undefined\n }\n >\n {cellLabel ? (\n <span className=\"jr-heatmap__cell-value\">{label}</span>\n ) : (\n <span className=\"jr-heatmap__sr\">{label}</span>\n )}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n {children}\n </div>\n )\n}\n\nexport default Heatmap\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useActions, useStateStore } from '@json-render/react'\nimport { injectStyles } from './injectStyles'\nimport { Button } from './primitives/Button'\n\nconst STYLE_ID = 'jr-styles-form-section'\n\nconst SHEET = `\n@keyframes jr-form-section-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-form-section {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n padding: var(--jr-spacing, 12px);\n animation: jr-form-section-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-form-section__title {\n margin: 0 0 0.75rem;\n font-size: 0.9375rem;\n font-weight: 600;\n}\n.jr-form-section__fields {\n display: flex;\n flex-direction: column;\n gap: 0.65rem;\n}\n.jr-form-section__field {\n display: flex;\n flex-direction: column;\n gap: 0.3rem;\n border-radius: 6px;\n transition: background-color var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-form-section__field:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 3%, transparent);\n}\n.jr-form-section__label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-form-section__input,\n.jr-form-section__select,\n.jr-form-section__textarea {\n box-sizing: border-box;\n width: 100%;\n padding: 0.45rem 0.55rem;\n border-radius: 6px;\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 14%, transparent);\n font: inherit;\n font-size: 0.875rem;\n background: var(--jr-surface, #fff);\n color: inherit;\n transition: border-color var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-form-section__input:hover,\n.jr-form-section__select:hover,\n.jr-form-section__textarea:hover {\n border-color: color-mix(in srgb, var(--jr-primary, #3b82f6) 45%, var(--jr-text, #0f172a));\n}\n.jr-form-section__textarea {\n min-height: 4.5rem;\n resize: vertical;\n}\n/* CWRF-013 Phase 5 Tier 5-2: :focus-visible handled by .jr-focusable-input\n * mixin in motionFocusTokens.ts (ring pattern — border-color + box-shadow halo —\n * chosen because rounded form fields look detached under an outset outline). */\n.jr-form-section__inline-check {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.35rem 0;\n}\n.jr-form-section__inline-check input {\n margin-top: 0.2rem;\n}\n.jr-form-section__radio-group {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n}\n.jr-form-section__radio-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.45rem;\n font-size: 0.875rem;\n border-radius: 4px;\n padding: 0.15rem 0.2rem;\n margin: -0.15rem -0.2rem;\n transition: background-color var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-form-section__radio-row:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 5%, transparent);\n}\n.jr-form-section__hint {\n font-size: 0.7rem;\n color: var(--jr-text-muted, #64748b);\n margin: 0;\n}\n.jr-form-section__computed {\n padding: 0.4rem 0.55rem;\n border-radius: 6px;\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 90%, var(--jr-surface, #fff));\n font-size: 0.8125rem;\n}\n.jr-form-section__computed-formula {\n display: block;\n margin-top: 0.25rem;\n font-size: 0.7rem;\n color: var(--jr-text-muted, #64748b);\n font-style: italic;\n}\n/* .jr-form-section__submit* — migrated to Button primitive in CWRF-013\n Phase 4 P2-T10 (W2.3). Visual + a11y now delegated to\n primitives/Button.tsx (variant=primary). The submit container retains\n a small top margin via the wrapper class .jr-form-section__submit-wrap. */\n.jr-form-section__submit-wrap {\n margin-top: 0.35rem;\n align-self: flex-start;\n}\n\n/* CWRF-013 Phase 4 切片 G L1 — submit adapts to container width.\n In narrow chat bubbles the submit button stretches full-width for\n easier tap targets. Forms in wide containers keep the natural\n intrinsic-width submit button. */\n@container jr-card (max-width: 480px) {\n .jr-form-section__submit-wrap {\n align-self: stretch;\n }\n .jr-form-section__submit-wrap > .jr-button,\n .jr-form-section__submit-wrap > button {\n width: 100%;\n }\n}\n.jr-form-section--inline .jr-form-section__fields {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));\n gap: 0.65rem 1rem;\n}\n.jr-form-section__file-zone {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n border: 2px dashed color-mix(in srgb, var(--jr-text, #0f172a) 18%, transparent);\n border-radius: 6px;\n text-align: center;\n cursor: pointer;\n transition: border-color var(--jr-transition-base) var(--jr-easing-standard), background var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-form-section__file-zone:hover {\n border-color: var(--jr-primary, #3b82f6);\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 4%, transparent);\n}\n.jr-form-section__file-zone-text {\n font-size: 0.8125rem;\n color: var(--jr-text-muted, #64748b);\n}\n.jr-form-section__file-zone-btn {\n padding: 0.3rem 0.65rem;\n border-radius: 5px;\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 14%, transparent);\n background: var(--jr-surface, #fff);\n font: inherit;\n font-size: 0.8125rem;\n cursor: pointer;\n color: var(--jr-primary, #3b82f6);\n transition: background var(--jr-transition-fast) var(--jr-easing-standard);\n}\n.jr-form-section__file-zone-btn:hover {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 6%, transparent);\n}\n.jr-form-section__file-list {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n margin-top: 0.3rem;\n}\n.jr-form-section__file-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.3rem;\n padding: 0.2rem 0.5rem;\n border-radius: 5px;\n background: color-mix(in srgb, var(--jr-bg, #f8fafc) 90%, var(--jr-surface, #fff));\n font-size: 0.75rem;\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n}\n.jr-form-section__file-chip-remove {\n border: none;\n background: none;\n cursor: pointer;\n font-size: 0.65rem;\n color: var(--jr-text-muted, #64748b);\n padding: 0;\n line-height: 1;\n}\n.jr-form-section__file-chip-remove:hover {\n color: #ef4444;\n}\n`\n\ntype FieldType = 'text' | 'number' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date' | 'file'\n\ntype FieldOption = { label: string; value: string }\n\ntype FieldValidation = {\n min?: number\n max?: number\n pattern?: string\n message?: string\n}\n\ninterface RawField {\n name?: string\n key?: string\n label: string\n type: FieldType\n placeholder?: string\n required?: boolean\n validation?: FieldValidation\n options?: FieldOption[]\n defaultValue?: unknown\n accept?: string\n multiple?: boolean\n}\n\ninterface NormalizedField extends Omit<RawField, 'name'> {\n name: string\n}\n\ninterface FormSectionProps {\n props: {\n title: string\n fields: RawField[]\n computedFields?: { name: string; label: string; formula: string }[]\n submitAction?: string\n variant?: string\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nfunction normalizeFields(raw: RawField[]): NormalizedField[] {\n return raw.map((f) => ({ ...f, name: f.name || f.key || f.label }))\n}\n\nfunction optionList(f: NormalizedField): FieldOption[] {\n const raw = f.options\n if (!Array.isArray(raw)) return []\n return raw.filter((o): o is FieldOption => o && typeof o.label === 'string' && typeof o.value === 'string')\n}\n\nfunction coerceInitial(fields: NormalizedField[]): Record<string, string | number | boolean> {\n const o: Record<string, string | number | boolean> = {}\n for (const f of fields) {\n const d = f.defaultValue\n const opts = optionList(f)\n if (f.type === 'checkbox') {\n o[f.name] = Boolean(d)\n } else if (f.type === 'number') {\n const n = typeof d === 'number' ? d : Number(d)\n o[f.name] = Number.isFinite(n) ? n : 0\n } else if (f.type === 'select' || f.type === 'radio') {\n const fromDef = typeof d === 'string' ? d : ''\n const pick = fromDef && opts.some((x) => x.value === fromDef) ? fromDef : opts[0]?.value ?? ''\n o[f.name] = pick\n } else {\n o[f.name] = d != null ? String(d) : ''\n }\n }\n return o\n}\n\nfunction interpolateFormula(formula: string, values: Record<string, string | number | boolean>): string {\n return formula.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const v = values[key]\n return v === undefined || v === null ? '' : String(v)\n })\n}\n\nexport const FormSection: React.FC<FormSectionProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const { set: stateSet } = useStateStore()\n // JETP-083 WS3.7.7 follow-up — self-dispatch the declared `submitAction`.\n //\n // Why: the catalog (`10_component_catalog.md`) advertises `submitAction?: string`\n // as the single contract for triggering an action on submit. Previously the\n // implementation only emitted `'form:submit'`, which `@json-render/react`'s\n // emit() drops on the floor unless the spec also carries an\n // `on: { 'form:submit': { action: ... } }` mapping. Real LLM-emitted specs\n // routinely omit `on:`, leaving the submit button dead and stalling HIL\n // release until the backend 5-minute timeout fires.\n //\n // Fix: when `submitAction` is set, also call `actions.execute({ action,\n // params })` directly via the ActionProvider context — independent of any\n // spec-level `on:` wiring. The emit('form:submit', ...) call is kept so\n // hosts that explicitly listen via `on:` aren't broken.\n //\n // Contract: `useActions()` throws if no ActionProvider is mounted. This\n // matches the established Renderer contract (FormSection always renders\n // inside JSONUIProvider → ActionProvider; see `standalone.tsx`,\n // ChatWidget). Standalone testing must wrap with `JSONUIProvider`.\n const actions = useActions()\n\n const title = props.title ?? 'Form'\n const fields = Array.isArray(props.fields) ? normalizeFields(props.fields) : []\n const computedFields = Array.isArray(props.computedFields) ? props.computedFields : []\n const submitAction = props.submitAction\n const variant = props.variant ?? 'default'\n\n const initial = useMemo(() => coerceInitial(fields), [fields])\n const [values, setValues] = useState<Record<string, string | number | boolean>>(initial)\n const [fileState, setFileState] = useState<Record<string, File[]>>({})\n const fileInputRefs = useRef<Record<string, HTMLInputElement | null>>({})\n\n // Sync initial form values to state store on mount\n useEffect(() => {\n for (const [name, value] of Object.entries(initial)) {\n stateSet(`/form/${name}`, value)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n const patch = useCallback(\n (name: string, value: string | number | boolean) => {\n setValues((prev) => ({ ...prev, [name]: value }))\n stateSet(`/form/${name}`, value)\n emit?.('form:change', { name, value })\n },\n [emit, stateSet],\n )\n\n const rootClass =\n variant === 'inline' ? 'jr-form-section jr-form-section--inline' : 'jr-form-section'\n\n const submit = useCallback(() => {\n // JETP-083 WS3.7.7 follow-up — [HIL-DEBUG] tagged traces. Filter the\n // DevTools console by \"[HIL-DEBUG]\" to follow the submit chain end-to-end.\n // Intentionally a hot log: this only fires on user-initiated submit clicks\n // (a few times per session) so the noise cost is negligible vs. the\n // diagnostic value when HIL gets stuck.\n console.log('[HIL-DEBUG] FormSection.submit() click', {\n submitAction,\n hasActionsExec: typeof actions?.execute === 'function',\n valuesKeys: Object.keys(values),\n values,\n fileStateKeys: Object.keys(fileState),\n fileCount: Object.values(fileState).flat().length,\n })\n if (!submitAction) {\n console.warn('[HIL-DEBUG] FormSection.submit() — no submitAction prop, aborting (button should have been hidden)')\n return\n }\n const allFiles = Object.values(fileState).flat()\n const data: Record<string, unknown> = { action: submitAction, values }\n if (allFiles.length > 0) data.__files = allFiles\n // Primary path: dispatch directly to ActionProvider. The handler shape\n // expected by ActionBridge is `{ values, __files, action }`; we also\n // pass `values` flat so `inferCategory` (which looks at the action\n // name like 'submitFormData' / 'approve') can reach ActionBridge's\n // hil-release branch with `params.data` defaulting to `params`.\n const params: Record<string, unknown> = { ...values, action: submitAction }\n if (allFiles.length > 0) params.__files = allFiles\n console.log('[HIL-DEBUG] FormSection → actions.execute()', {\n action: submitAction,\n paramsKeys: Object.keys(params),\n })\n void actions\n .execute({ action: submitAction, params })\n .then(() => {\n console.log('[HIL-DEBUG] FormSection ← actions.execute() resolved', { action: submitAction })\n })\n .catch((err) => {\n console.error('[HIL-DEBUG] FormSection ← actions.execute() rejected', { action: submitAction, err })\n })\n // Secondary path: keep the existing event emission so any host that\n // intentionally bound a spec-level `on: { 'form:submit': ... }` mapping\n // still receives the notification (no regression for that pattern).\n emit?.('form:submit', data)\n }, [actions, emit, submitAction, values, fileState])\n\n return (\n <fieldset className={rootClass} style={{ border: 'none', margin: 0, padding: 0 }}>\n <legend className=\"jr-form-section__title\">{title}</legend>\n <div className=\"jr-form-section__fields\">\n {fields.map((f) => {\n const opts = optionList(f)\n const valMsg = f.validation?.message\n const labelSuffix = f.required ? <span aria-hidden> *</span> : null\n return (\n <div key={f.name} className=\"jr-form-section__field\">\n {f.type === 'checkbox' ? (\n <div className=\"jr-form-section__inline-check\">\n <input\n id={`jr-fs-${f.name}`}\n type=\"checkbox\"\n checked={Boolean(values[f.name])}\n required={f.required}\n onChange={(e) => patch(f.name, e.target.checked)}\n />\n <label className=\"jr-form-section__label\" htmlFor={`jr-fs-${f.name}`} style={{ fontWeight: 600 }}>\n {f.label}\n {labelSuffix}\n </label>\n </div>\n ) : null}\n {f.type === 'radio' ? (\n <span className=\"jr-form-section__label\">\n {f.label}\n {labelSuffix}\n </span>\n ) : null}\n {f.type !== 'checkbox' && f.type !== 'radio' ? (\n <label className=\"jr-form-section__label\" htmlFor={`jr-fs-${f.name}`}>\n {f.label}\n {labelSuffix}\n </label>\n ) : null}\n {f.type === 'text' ? (\n <>\n <input\n id={`jr-fs-${f.name}`}\n className=\"jr-form-section__input jr-focusable-input\"\n type=\"text\"\n placeholder={f.placeholder}\n required={f.required}\n pattern={f.validation?.pattern}\n value={String(values[f.name] ?? '')}\n onChange={(e) => patch(f.name, e.target.value)}\n />\n {valMsg ? <p className=\"jr-form-section__hint\">{valMsg}</p> : null}\n </>\n ) : null}\n {f.type === 'number' ? (\n <>\n <input\n id={`jr-fs-${f.name}`}\n className=\"jr-form-section__input jr-focusable-input\"\n type=\"number\"\n placeholder={f.placeholder}\n required={f.required}\n min={f.validation?.min}\n max={f.validation?.max}\n value={Number(values[f.name] ?? 0)}\n onChange={(e) => patch(f.name, e.target.valueAsNumber || 0)}\n />\n {valMsg ? <p className=\"jr-form-section__hint\">{valMsg}</p> : null}\n </>\n ) : null}\n {f.type === 'select' ? (\n <select\n id={`jr-fs-${f.name}`}\n className=\"jr-form-section__select jr-focusable-input\"\n required={f.required}\n value={String(values[f.name] ?? '')}\n onChange={(e) => patch(f.name, e.target.value)}\n >\n {(opts.length > 0 ? opts : [{ label: '—', value: '' }]).map((opt) => (\n <option key={opt.value || '__empty'} value={opt.value}>\n {opt.label || '—'}\n </option>\n ))}\n </select>\n ) : null}\n {f.type === 'radio' ? (\n <div className=\"jr-form-section__radio-group\" role=\"radiogroup\" aria-label={f.label}>\n {opts.map((opt, oi) => (\n <label key={opt.value} className=\"jr-form-section__radio-row\">\n <input\n type=\"radio\"\n name={`jr-fs-radio-${f.name}`}\n value={opt.value}\n required={f.required && oi === 0}\n checked={String(values[f.name] ?? '') === opt.value}\n onChange={() => patch(f.name, opt.value)}\n />\n {opt.label}\n </label>\n ))}\n </div>\n ) : null}\n {f.type === 'textarea' ? (\n <>\n <textarea\n id={`jr-fs-${f.name}`}\n className=\"jr-form-section__textarea jr-focusable-input\"\n placeholder={f.placeholder}\n required={f.required}\n value={String(values[f.name] ?? '')}\n onChange={(e) => patch(f.name, e.target.value)}\n />\n {valMsg ? <p className=\"jr-form-section__hint\">{valMsg}</p> : null}\n </>\n ) : null}\n {f.type === 'date' ? (\n <>\n <input\n id={`jr-fs-${f.name}`}\n className=\"jr-form-section__input jr-focusable-input\"\n type=\"date\"\n required={f.required}\n value={String(values[f.name] ?? '')}\n onChange={(e) => patch(f.name, e.target.value)}\n />\n {valMsg ? <p className=\"jr-form-section__hint\">{valMsg}</p> : null}\n </>\n ) : null}\n {f.type === 'file' ? (\n <>\n <div\n className=\"jr-form-section__file-zone jr-pressable jr-focusable\"\n onClick={() => fileInputRefs.current[f.name]?.click()}\n onDragOver={(e) => { e.preventDefault(); e.stopPropagation() }}\n onDrop={(e) => {\n e.preventDefault()\n e.stopPropagation()\n const dropped = Array.from(e.dataTransfer.files)\n if (dropped.length > 0) {\n setFileState(prev => ({\n ...prev,\n [f.name]: f.multiple ? [...(prev[f.name] ?? []), ...dropped] : dropped.slice(0, 1),\n }))\n }\n }}\n >\n <span className=\"jr-form-section__file-zone-text\">\n {f.placeholder ?? 'Drop files here or click to browse'}\n </span>\n <span className=\"jr-form-section__file-zone-btn jr-pressable jr-focusable\">Choose file{f.multiple ? 's' : ''}</span>\n <input\n ref={(el) => { fileInputRefs.current[f.name] = el }}\n type=\"file\"\n accept={f.accept}\n multiple={f.multiple}\n style={{ display: 'none' }}\n onChange={(e) => {\n const selected = Array.from(e.target.files ?? [])\n if (selected.length > 0) {\n setFileState(prev => ({\n ...prev,\n [f.name]: f.multiple ? [...(prev[f.name] ?? []), ...selected] : selected.slice(0, 1),\n }))\n }\n if (e.target) e.target.value = ''\n }}\n />\n </div>\n {(fileState[f.name]?.length ?? 0) > 0 && (\n <div className=\"jr-form-section__file-list\">\n {fileState[f.name]!.map((file, idx) => (\n <span key={`${file.name}-${idx}`} className=\"jr-form-section__file-chip\">\n 📎 {file.name}\n <button\n type=\"button\"\n className=\"jr-form-section__file-chip-remove jr-pressable jr-focusable\"\n onClick={() => {\n setFileState(prev => ({\n ...prev,\n [f.name]: (prev[f.name] ?? []).filter((_, i) => i !== idx),\n }))\n }}\n >✕</button>\n </span>\n ))}\n </div>\n )}\n {valMsg ? <p className=\"jr-form-section__hint\">{valMsg}</p> : null}\n </>\n ) : null}\n </div>\n )\n })}\n {computedFields.map((cf) => (\n <div key={cf.name} className=\"jr-form-section__field\">\n <span className=\"jr-form-section__label\">{cf.label}</span>\n <div className=\"jr-form-section__computed\" title={cf.formula}>\n {interpolateFormula(cf.formula, values)}\n <span className=\"jr-form-section__computed-formula\">{cf.formula}</span>\n </div>\n </div>\n ))}\n {submitAction ? (\n <div className=\"jr-form-section__submit-wrap\">\n <Button label=\"Submit\" variant=\"primary\" size=\"md\" onClick={submit} />\n </div>\n ) : null}\n </div>\n {children}\n </fieldset>\n )\n}\n\nexport default FormSection\n","import React, { useEffect } from 'react'\n\ninterface TimerProps {\n props: {\n interval: number\n statePath: string\n autoStart?: boolean\n maxTicks?: number\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\n/**\n * CWRF-013 Phase 0 (Item 06) — Timer is an invisible component: it never\n * renders a host element (returns `{children}` only). The previous\n * implementation shipped a 40-line `.jr-timer*` CSS sheet + an\n * `injectStyles` call on every mount, but no element ever wore those\n * classes. The sheet was pure dead code (no consumers in chat-widget,\n * demo, or external repos). This commit deletes the SHEET literal, the\n * `STYLE_ID` constant, the `injectStyles` import, and the run-time\n * `injectStyles(...)` call — Timer behaviour (interval tick → emit\n * 'stateWrite') is unchanged.\n */\nexport const Timer: React.FC<TimerProps> = ({ props, children, emit }) => {\n const interval = typeof props.interval === 'number' && props.interval > 0 ? props.interval : 1000\n const statePath = props.statePath\n const autoStart = props.autoStart !== false\n const maxTicks = props.maxTicks\n\n useEffect(() => {\n if (!autoStart) return undefined\n if (typeof statePath !== 'string' || statePath.length === 0) return undefined\n\n let tick = 0\n const finiteMax =\n typeof maxTicks === 'number' && Number.isFinite(maxTicks) && maxTicks > 0 ? maxTicks : null\n\n const id = window.setInterval(() => {\n tick += 1\n emit?.('stateWrite', { path: statePath, value: { tick, timestamp: Date.now() } })\n if (finiteMax != null && tick >= finiteMax) {\n window.clearInterval(id)\n }\n }, interval)\n\n return () => window.clearInterval(id)\n }, [autoStart, interval, statePath, maxTicks, emit])\n\n return <>{children}</>\n}\n\nexport default Timer\n","import React, { useCallback, useMemo, useState } from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-code-viewer'\n\nconst SHEET = `\n@keyframes jr-code-viewer-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-code-viewer {\n box-sizing: border-box;\n border-radius: var(--jr-radius, 8px);\n background: color-mix(in srgb, var(--jr-text, #0f172a) 6%, var(--jr-surface, #0f172a));\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n font-family: var(--jr-font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);\n color: var(--jr-code-fg, #e2e8f0);\n overflow: hidden;\n max-width: 100%;\n animation: jr-code-viewer-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-code-viewer__head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n padding: 0.45rem 0.65rem;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--jr-text-muted, #94a3b8);\n border-bottom: 1px solid color-mix(in srgb, var(--jr-text-muted, #64748b) 25%, transparent);\n background: color-mix(in srgb, var(--jr-text, #0f172a) 18%, transparent);\n}\n.jr-code-viewer__head-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.35rem;\n}\n.jr-code-viewer__copy {\n font: inherit;\n font-size: 0.65rem;\n text-transform: none;\n letter-spacing: normal;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n border: 1px solid color-mix(in srgb, var(--jr-text-muted, #64748b) 35%, transparent);\n background: color-mix(in srgb, var(--jr-text, #0f172a) 12%, transparent);\n color: var(--jr-text-muted, #cbd5e1);\n cursor: pointer;\n transition: background var(--jr-transition-base) var(--jr-easing-standard), border-color var(--jr-transition-base) var(--jr-easing-standard), color var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-code-viewer__copy:hover {\n background: color-mix(in srgb, var(--jr-text, #0f172a) 22%, transparent);\n transform: translateY(-1px);\n}\n.jr-code-viewer__copy:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.jr-code-viewer__body {\n margin: 0;\n padding: 0.65rem 0;\n overflow: auto;\n max-height: min(70vh, 24rem);\n font-size: 0.8125rem;\n line-height: 1.5;\n}\n.jr-code-viewer__line {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 0;\n min-height: 1.5em;\n}\n.jr-code-viewer__line--highlight {\n background: color-mix(in srgb, var(--jr-primary, #3b82f6) 22%, transparent);\n}\n.jr-code-viewer__gutter {\n user-select: none;\n text-align: right;\n padding: 0 0.65rem 0 0.75rem;\n color: var(--jr-text-muted, #64748b);\n font-variant-numeric: tabular-nums;\n border-right: 1px solid color-mix(in srgb, var(--jr-text-muted, #64748b) 22%, transparent);\n}\n.jr-code-viewer__code {\n padding: 0 0.75rem;\n white-space: pre;\n overflow-x: auto;\n word-break: normal;\n}\n`\n\nexport interface CodeHighlightRange {\n start: number\n end: number\n color?: string\n}\n\ninterface CodeViewerProps {\n props: {\n code: string\n language?: string\n lineNumbers?: boolean\n highlights?: CodeHighlightRange[]\n maxHeight?: string\n copyable?: boolean\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nfunction lineHighlightStyle(\n lineNo: number,\n ranges: CodeHighlightRange[],\n): React.CSSProperties | undefined {\n for (let i = ranges.length - 1; i >= 0; i--) {\n const r = ranges[i]\n if (lineNo >= r.start && lineNo <= r.end) {\n if (r.color) {\n return { background: r.color }\n }\n return undefined\n }\n }\n return undefined\n}\n\nfunction isHighlightedLine(lineNo: number, ranges: CodeHighlightRange[]): boolean {\n return ranges.some((r) => lineNo >= r.start && lineNo <= r.end)\n}\n\nexport const CodeViewer: React.FC<CodeViewerProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const code = typeof props.code === 'string' ? props.code : ''\n const language = props.language ?? 'text'\n const lineNumbers = props.lineNumbers === true\n const copyable = props.copyable === true\n\n const highlightRanges = useMemo(() => {\n const arr = Array.isArray(props.highlights) ? props.highlights : []\n return arr.filter(\n (r) =>\n r &&\n Number.isInteger(r.start) &&\n Number.isInteger(r.end) &&\n r.start > 0 &&\n r.end >= r.start,\n )\n }, [props.highlights])\n\n const [copying, setCopying] = useState(false)\n\n const handleCopy = useCallback(async () => {\n if (!copyable || typeof navigator === 'undefined' || !navigator.clipboard?.writeText) {\n emit?.('copy', { ok: false, reason: 'unavailable' })\n return\n }\n setCopying(true)\n try {\n await navigator.clipboard.writeText(code)\n emit?.('copy', { ok: true })\n } catch {\n emit?.('copy', { ok: false, reason: 'error' })\n } finally {\n setCopying(false)\n }\n }, [code, copyable, emit])\n\n const lines = code.length === 0 ? [''] : code.split(/\\n/)\n\n const bodyStyle: React.CSSProperties = {}\n if (props.maxHeight) {\n bodyStyle.maxHeight = props.maxHeight\n }\n\n const renderLine = (line: string, i: number) => {\n const lineNo = i + 1\n const hi = isHighlightedLine(lineNo, highlightRanges)\n const customBg = lineHighlightStyle(lineNo, highlightRanges)\n const lineClass =\n hi && !customBg?.background\n ? 'jr-code-viewer__line jr-code-viewer__line--highlight'\n : 'jr-code-viewer__line'\n const lineStyle: React.CSSProperties | undefined = customBg?.background ? { background: customBg.background } : undefined\n\n if (lineNumbers) {\n return (\n <div key={i} className={lineClass} style={lineStyle}>\n <span className=\"jr-code-viewer__gutter\">{lineNo}</span>\n <code className=\"jr-code-viewer__code\">{line || ' '}</code>\n </div>\n )\n }\n return (\n <div key={i} className={lineClass} style={{ ...lineStyle, gridTemplateColumns: '1fr' }}>\n <code className=\"jr-code-viewer__code\" style={{ paddingLeft: '0.75rem' }}>\n {line || ' '}\n </code>\n </div>\n )\n }\n\n return (\n <div className=\"jr-code-viewer\" role=\"region\" aria-label=\"Code\">\n <header className=\"jr-code-viewer__head\">\n <span>{language}</span>\n <div className=\"jr-code-viewer__head-actions\">\n {copyable ? (\n <button\n type=\"button\"\n className=\"jr-code-viewer__copy jr-pressable jr-focusable\"\n onClick={() => void handleCopy()}\n disabled={copying}\n >\n {copying ? '…' : 'Copy'}\n </button>\n ) : null}\n </div>\n </header>\n <pre className=\"jr-code-viewer__body\" style={Object.keys(bodyStyle).length ? bodyStyle : undefined}>\n {lines.map((line, i) => renderLine(line, i))}\n </pre>\n {children}\n </div>\n )\n}\n\nexport default CodeViewer\n","import React from 'react'\nimport { injectStyles } from './injectStyles'\n\nconst STYLE_ID = 'jr-styles-annotation-layer'\n\nconst SHEET = `\n@keyframes jr-annotation-layer-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.jr-annotation-layer {\n box-sizing: border-box;\n position: relative;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n border-radius: var(--jr-radius, 8px);\n overflow: hidden;\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: var(--jr-surface, #f8fafc);\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text, #0f172a);\n animation: jr-annotation-layer-in var(--jr-transition-slow) var(--jr-easing-decel) both;\n}\n.jr-annotation-layer__slot {\n display: block;\n position: relative;\n z-index: 0;\n min-height: 2rem;\n}\n.jr-annotation-layer__annotations {\n display: flex;\n flex-direction: column;\n gap: 0.65rem;\n padding: var(--jr-spacing, 12px);\n border-top: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 8%, transparent);\n background: color-mix(in srgb, var(--jr-text, #0f172a) 3%, var(--jr-surface, #f8fafc));\n}\n.jr-annotation-layer__card {\n display: flex;\n flex-wrap: wrap;\n gap: 0.65rem;\n align-items: flex-start;\n padding: 0.65rem 0.75rem;\n border-radius: calc(var(--jr-radius, 8px) * 0.85);\n background: var(--jr-surface, #ffffff);\n border: 1px solid color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n box-shadow: 0 1px 2px color-mix(in srgb, var(--jr-text, #0f172a) 6%, transparent);\n transition: transform var(--jr-transition-base) var(--jr-easing-standard), box-shadow var(--jr-transition-base) var(--jr-easing-standard), border-color var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-annotation-layer__card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--jr-text, #0f172a) 10%, transparent);\n border-color: color-mix(in srgb, var(--jr-primary, #3b82f6) 22%, transparent);\n}\n.jr-annotation-layer__icon {\n flex-shrink: 0;\n font-size: 1.125rem;\n line-height: 1.2;\n}\n.jr-annotation-layer__body {\n min-width: 0;\n flex: 1;\n}\n.jr-annotation-layer__meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.35rem 0.75rem;\n font-size: 0.7rem;\n color: var(--jr-text-muted, #64748b);\n margin-bottom: 0.35rem;\n}\n.jr-annotation-layer__target {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--jr-primary, #3b82f6);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 2px;\n transition: color var(--jr-transition-base) var(--jr-easing-standard), transform var(--jr-transition-base) var(--jr-easing-standard);\n}\n.jr-annotation-layer__target:hover {\n color: color-mix(in srgb, var(--jr-primary, #3b82f6) 85%, var(--jr-text, #000));\n transform: translateX(1px);\n}\n.jr-annotation-layer__text {\n margin: 0;\n font-size: 0.8125rem;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n}\n`\n\ntype AnnotationType = 'comment' | 'question' | 'approval' | 'rejection'\n\nconst TYPE_ICON: Record<AnnotationType, string> = {\n comment: '💬',\n question: '❓',\n approval: '✅',\n rejection: '❌',\n}\n\nfunction iconForType(t: AnnotationType | undefined): string {\n return TYPE_ICON[t ?? 'comment']\n}\n\nexport interface AnnotationItem {\n id: string\n targetId: string\n text: string\n author?: string\n timestamp?: string\n type?: AnnotationType\n}\n\ninterface AnnotationLayerProps {\n props: {\n annotations: AnnotationItem[]\n /**\n * CWRF-013 Phase 0 (Item 07) — only 'view' is supported. The\n * legacy 'edit' enum value used to render an inert\n * \"Edit mode — composer stub\" placeholder under each card; the\n * composer was never wired. The spec migrator (transformer\n * `legacy.annotationlayer.edit-mode`) rewrites any 'edit' value to\n * 'view' and emits a deprecation warning.\n */\n mode?: 'view'\n }\n children?: React.ReactNode\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const AnnotationLayer: React.FC<AnnotationLayerProps> = ({ props, children, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n\n const annotations = Array.isArray(props.annotations) ? props.annotations : []\n\n const focusTarget = (targetId: string) => {\n if (typeof document === 'undefined') return\n document.getElementById(targetId)?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n emit?.('focusTarget', { targetId })\n }\n\n return (\n <div className=\"jr-annotation-layer\" role=\"region\" aria-label=\"Annotated content\">\n <div className=\"jr-annotation-layer__slot\">{children}</div>\n {annotations.length > 0 ? (\n <div className=\"jr-annotation-layer__annotations\" role=\"list\">\n {annotations.map((a) => {\n const t = a.type\n return (\n <article key={a.id} className=\"jr-annotation-layer__card\" role=\"listitem\" data-annotation-id={a.id}>\n <span className=\"jr-annotation-layer__icon\" aria-hidden>\n {iconForType(t)}\n </span>\n <div className=\"jr-annotation-layer__body\">\n <div className=\"jr-annotation-layer__meta\">\n <button\n type=\"button\"\n className=\"jr-annotation-layer__target jr-pressable jr-focusable\"\n onClick={() => focusTarget(a.targetId)}\n >\n → {a.targetId}\n </button>\n {a.author ? <span>{a.author}</span> : null}\n {a.timestamp ? <span>{a.timestamp}</span> : null}\n </div>\n <p className=\"jr-annotation-layer__text\">{a.text}</p>\n </div>\n </article>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default AnnotationLayer\n","import React, { useEffect, useMemo } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { TextCore } from '../../ViewerCore/index.js'\nimport { injectStyles } from './injectStyles.js'\n\nconst STYLE_ID = 'jr-styles-text-viewer'\nconst SHEET = `\n.jr-text-viewer { width: 100%; min-width: 0; max-width: 100%; }\n.jr-text-viewer--loading, .jr-text-viewer--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-text-viewer--error { color: var(--jr-danger, #ef4444); }\n`\n\nconst LazyExcelCore = React.lazy(() => import('../../ViewerCore/ExcelCore.js'))\n\nfunction looksLikeCsv(text: string, fileName?: string): boolean {\n if (fileName) {\n const ext = fileName.split('.').pop()?.toLowerCase()\n if (ext === 'csv' || ext === 'tsv') return true\n }\n const lines = text.split('\\n').filter(l => l.trim())\n if (lines.length < 2) return false\n const sep = lines[0].includes('\\t') ? '\\t' : ','\n const firstCols = lines[0].split(sep).length\n if (firstCols < 2) return false\n const sample = lines.slice(0, Math.min(5, lines.length))\n return sample.every(l => {\n const cols = l.split(sep).length\n return Math.abs(cols - firstCols) <= 1\n })\n}\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n content?: string\n title?: string\n /**\n * CWRF-013 Phase 0 PR #5 — when explicitly false, hide the left-column\n * line numbers. Default true (preserves legacy behaviour).\n */\n lineNumbers?: boolean\n /**\n * CWRF-013 Phase 0 PR #5 — when true, wrap long lines instead of\n * overflowing horizontally. Default false (preserves legacy behaviour).\n */\n wordWrap?: boolean\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const TextViewer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({ resource_id: props.resource_id, url: props.url, content: props.content })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', { resource_id: props.resource_id, mimeType: res.mimeType, fileName: res.fileName })\n }\n }, [res.loading, res.error])\n\n const text = res.content ?? ''\n\n const isCsv = useMemo(\n () => !res.loading && !res.error && looksLikeCsv(text, res.fileName),\n [text, res.fileName, res.loading, res.error],\n )\n\n if (res.loading) return <div className=\"jr-text-viewer jr-text-viewer--loading\">Loading…</div>\n if (res.error) return <div className=\"jr-text-viewer jr-text-viewer--error\">{res.error}</div>\n\n if (isCsv) {\n return (\n <div className=\"jr-text-viewer ycw-excel-viewer\">\n <React.Suspense fallback={<div className=\"jr-text-viewer--loading\">Loading…</div>}>\n <LazyExcelCore content={text} />\n </React.Suspense>\n </div>\n )\n }\n\n return (\n <div className=\"jr-text-viewer ycw-file-viewer-text\">\n <TextCore\n content={text}\n lineNumbers={props.lineNumbers}\n wordWrap={props.wordWrap}\n />\n </div>\n )\n}\n\nexport default TextViewer\n","import React, { useEffect } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { CodeCore } from '../../ViewerCore/index.js'\nimport { injectStyles } from './injectStyles.js'\n\nconst STYLE_ID = 'jr-styles-code-file-viewer'\nconst SHEET = `\n.jr-code-file-viewer { width: 100%; min-width: 0; max-width: 100%; }\n.jr-code-file-viewer--loading, .jr-code-file-viewer--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-code-file-viewer--error { color: var(--jr-danger, #ef4444); }\n`\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n content?: string\n language?: string\n title?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const CodeFileViewer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({ resource_id: props.resource_id, url: props.url, content: props.content })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', { resource_id: props.resource_id, mimeType: res.mimeType, fileName: res.fileName })\n }\n }, [res.loading, res.error])\n\n if (res.loading) return <div className=\"jr-code-file-viewer jr-code-file-viewer--loading\">Loading…</div>\n if (res.error) return <div className=\"jr-code-file-viewer jr-code-file-viewer--error\">{res.error}</div>\n\n const code = res.content ?? ''\n return (\n <div className=\"jr-code-file-viewer ycw-file-viewer-code\">\n <CodeCore content={code} language={props.language} />\n </div>\n )\n}\n\nexport default CodeFileViewer\n","import React, { useEffect } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { MarkdownCore } from '../../ViewerCore/index.js'\nimport { injectStyles } from './injectStyles.js'\n\nconst STYLE_ID = 'jr-styles-markdown-viewer'\nconst SHEET = `\n.jr-markdown-viewer { width: 100%; min-width: 0; max-width: 100%; }\n.jr-markdown-viewer--loading, .jr-markdown-viewer--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-markdown-viewer--error { color: var(--jr-danger, #ef4444); }\n`\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n content?: string\n title?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const MarkdownViewer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({ resource_id: props.resource_id, url: props.url, content: props.content })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', { resource_id: props.resource_id, mimeType: res.mimeType, fileName: res.fileName })\n }\n }, [res.loading, res.error])\n\n if (res.loading) return <div className=\"jr-markdown-viewer jr-markdown-viewer--loading\">Loading…</div>\n if (res.error) return <div className=\"jr-markdown-viewer jr-markdown-viewer--error\">{res.error}</div>\n\n return (\n <div className=\"jr-markdown-viewer ycw-file-viewer-markdown\">\n <MarkdownCore content={res.content ?? ''} />\n </div>\n )\n}\n\nexport default MarkdownViewer\n","import React, { useEffect } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { JsonCore } from '../../ViewerCore/index.js'\nimport { injectStyles } from './injectStyles.js'\n\nconst STYLE_ID = 'jr-styles-json-viewer'\nconst SHEET = `\n.jr-json-viewer { width: 100%; min-width: 0; max-width: 100%; }\n.jr-json-viewer--loading, .jr-json-viewer--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-json-viewer--error { color: var(--jr-danger, #ef4444); }\n`\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n content?: string\n defaultExpanded?: number\n title?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const JsonViewer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({ resource_id: props.resource_id, url: props.url, content: props.content })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', { resource_id: props.resource_id, mimeType: res.mimeType, fileName: res.fileName })\n }\n }, [res.loading, res.error])\n\n if (res.loading) return <div className=\"jr-json-viewer jr-json-viewer--loading\">Loading…</div>\n if (res.error) return <div className=\"jr-json-viewer jr-json-viewer--error\">{res.error}</div>\n\n return (\n <div className=\"jr-json-viewer ycw-file-viewer-json\">\n <JsonCore data={res.content ?? '{}'} defaultExpanded={props.defaultExpanded} />\n </div>\n )\n}\n\nexport default JsonViewer\n","import React, { useEffect } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { ImageCore } from '../../ViewerCore/index.js'\nimport { injectStyles } from './injectStyles.js'\n\nconst STYLE_ID = 'jr-styles-image-viewer'\nconst SHEET = `\n.jr-image-viewer { width: 100%; min-width: 0; max-width: 100%; }\n.jr-image-viewer--loading, .jr-image-viewer--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-image-viewer--error { color: var(--jr-danger, #ef4444); }\n`\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n alt?: string\n title?: string\n /**\n * CWRF-013 Phase 0 PR #5 — when false, disable the interactive\n * pan/zoom UI and render the image at natural scale. Default true.\n */\n zoom?: boolean\n /**\n * CWRF-013 Phase 0 PR #5 — cap the maximum zoom factor (default 10).\n * Ignored when `zoom` is false.\n */\n maxScale?: number\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const ImageViewer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({ resource_id: props.resource_id, url: props.url })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', { resource_id: props.resource_id, mimeType: res.mimeType, fileName: res.fileName })\n }\n }, [res.loading, res.error])\n\n if (res.loading) return <div className=\"jr-image-viewer jr-image-viewer--loading\">Loading…</div>\n if (res.error) return <div className=\"jr-image-viewer jr-image-viewer--error\">{res.error}</div>\n\n const src = res.url ?? ''\n if (!src) return <div className=\"jr-image-viewer jr-image-viewer--error\">No image source</div>\n\n return (\n <div className=\"jr-image-viewer ycw-file-viewer-image\">\n <ImageCore\n src={src}\n alt={props.alt ?? props.title}\n zoom={props.zoom}\n maxScale={props.maxScale}\n />\n </div>\n )\n}\n\nexport default ImageViewer\n","import React, { useEffect } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { VideoCore } from '../../ViewerCore/index.js'\nimport { injectStyles } from './injectStyles.js'\n\nconst STYLE_ID = 'jr-styles-video-player'\nconst SHEET = `\n.jr-video-player { width: 100%; min-width: 0; max-width: 100%; }\n.jr-video-player--loading, .jr-video-player--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-video-player--error { color: var(--jr-danger, #ef4444); }\n`\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n mimeType?: string\n title?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const VideoPlayer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({ resource_id: props.resource_id, url: props.url })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', { resource_id: props.resource_id, mimeType: res.mimeType, fileName: res.fileName })\n }\n }, [res.loading, res.error])\n\n if (res.loading) return <div className=\"jr-video-player jr-video-player--loading\">Loading…</div>\n if (res.error) return <div className=\"jr-video-player jr-video-player--error\">{res.error}</div>\n\n const src = res.url ?? ''\n if (!src) return <div className=\"jr-video-player jr-video-player--error\">No video source</div>\n\n return (\n <div className=\"jr-video-player ycw-file-viewer-video\">\n <VideoCore src={src} mimeType={props.mimeType ?? res.mimeType} />\n </div>\n )\n}\n\nexport default VideoPlayer\n","import React, { useEffect } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { AudioCore } from '../../ViewerCore/index.js'\nimport { injectStyles } from './injectStyles.js'\n\nconst STYLE_ID = 'jr-styles-audio-player'\nconst SHEET = `\n.jr-audio-player { width: 100%; min-width: 0; max-width: 100%; }\n.jr-audio-player--loading, .jr-audio-player--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-audio-player--error { color: var(--jr-danger, #ef4444); }\n`\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n mimeType?: string\n title?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const AudioPlayer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({ resource_id: props.resource_id, url: props.url })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', { resource_id: props.resource_id, mimeType: res.mimeType, fileName: res.fileName })\n }\n }, [res.loading, res.error])\n\n if (res.loading) return <div className=\"jr-audio-player jr-audio-player--loading\">Loading…</div>\n if (res.error) return <div className=\"jr-audio-player jr-audio-player--error\">{res.error}</div>\n\n const src = res.url ?? ''\n if (!src) return <div className=\"jr-audio-player jr-audio-player--error\">No audio source</div>\n\n return (\n <div className=\"jr-audio-player ycw-file-viewer-audio\">\n <AudioCore src={src} mimeType={props.mimeType ?? res.mimeType} />\n </div>\n )\n}\n\nexport default AudioPlayer\n","import React, { useEffect, useMemo } from 'react'\nimport { useResource } from '../../../hooks/useResource.js'\nimport { useHtmlProject } from '../../../hooks/useHtmlProject.js'\nimport HtmlViewerCore from '../../FileViewer/viewers/HtmlViewer/index.js'\nimport { injectStyles } from './injectStyles.js'\n\n/**\n * JsonRender bridge for the multi-file HTML project viewer (CWRF-011).\n *\n * Mirrors `KicadViewer.tsx`:\n * 1. Resolve the entry resource via `useResource`.\n * 2. When the file is an HTML entry with a known `gitPath`, discover\n * sibling project files via `useHtmlProject`.\n * 3. Hand both `content` and the discovered file tree to the underlying\n * project-aware `HtmlViewer` (default export of\n * `FileViewer/viewers/HtmlViewer/index.tsx`).\n * 4. Fall back to single-file mode automatically when no project files\n * are found — the dispatcher handles this without extra code here.\n */\nconst STYLE_ID = 'jr-styles-html-viewer'\nconst SHEET = `\n.jr-html-viewer { width: 100%; min-width: 0; max-width: 100%; min-height: 400px; }\n.jr-html-viewer--loading, .jr-html-viewer--error {\n padding: 1rem; font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-text-muted, #64748b);\n}\n.jr-html-viewer--error { color: var(--jr-danger, #ef4444); }\n.jr-html-viewer--warning {\n padding: 0.5rem 1rem; font-size: 0.85rem;\n font-family: var(--jr-font, system-ui, sans-serif);\n color: var(--jr-warning, #f59e0b);\n border-top: 1px solid var(--jr-border, #e2e8f0);\n}\n.jr-html-viewer .ycw-html-iframe {\n width: 100%; height: 100%; min-height: 400px; border: 0;\n}\n`\n\nconst isHtmlEntry = (fn: string): boolean => {\n const lower = fn.toLowerCase()\n return lower.endsWith('.html') || lower.endsWith('.htm')\n}\n\ninterface Props {\n props: {\n resource_id?: string\n url?: string\n content?: string\n /** Optional override of strategy when caller knows the project shape. */\n strategy?: 'auto' | 'inline' | 'blob'\n title?: string\n }\n emit?: (event: string, data?: unknown) => void\n}\n\nexport const HtmlViewer: React.FC<Props> = ({ props, emit }) => {\n injectStyles(STYLE_ID, SHEET)\n const res = useResource({\n resource_id: props.resource_id,\n url: props.url,\n content: props.content,\n })\n\n const text = res.content ?? ''\n const fileName = res.fileName ?? props.title ?? 'index.html'\n const gitPath = res.gitPath ?? ''\n\n const isProject = useMemo(\n () => isHtmlEntry(fileName) && !!gitPath,\n [fileName, gitPath],\n )\n\n const projectResult = useHtmlProject({\n rootHtml: text,\n gitPath,\n enabled: isProject && !res.loading && !res.error,\n })\n\n useEffect(() => {\n if (res.loading) return\n if (res.error) {\n emit?.('viewer:error', { resource_id: props.resource_id, error: res.error })\n } else {\n emit?.('viewer:loaded', {\n resource_id: props.resource_id,\n mimeType: res.mimeType,\n fileName: res.fileName,\n isProject,\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [res.loading, res.error, isProject])\n\n if (res.loading || (isProject && projectResult.loading)) {\n return <div className=\"jr-html-viewer jr-html-viewer--loading\">Loading…</div>\n }\n if (res.error) {\n return <div className=\"jr-html-viewer jr-html-viewer--error\">{res.error}</div>\n }\n\n return (\n <div className=\"jr-html-viewer ycw-file-viewer-html\">\n <HtmlViewerCore\n content={text}\n fileName={fileName}\n htmlOptions={\n isProject && projectResult.files.length > 0\n ? {\n files: projectResult.files,\n projectLoading: false,\n strategy: props.strategy ?? 'auto',\n }\n : undefined\n }\n />\n {isProject && projectResult.error && projectResult.files.length === 0 && (\n <div className=\"jr-html-viewer--warning\">{projectResult.error}</div>\n )}\n </div>\n )\n}\n\nexport default HtmlViewer\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport type { HtmlFile } from '../components/FileViewer/viewers/HtmlViewer/types.js'\nimport { useProjectFiles, type UseProjectFilesResult } from './useProjectFiles.js'\n\n/**\n * Sibling-file discovery for a multi-file HTML project, mirroring\n * `useKicadProject`. Wraps `useProjectFiles` and:\n *\n * 1. Filters by the HTML/CSS/JS/asset extensions we know how to render.\n * 2. Routes binary files to `{ url }` (via `generateUrls: true`) and\n * text files to `{ content }` so the strategy layer can pick the\n * right inlining path without re-classifying.\n * 3. Drops files whose names violate the path invariants documented in\n * `HtmlFile` (no `..`, no leading `/`, no backslashes) so a single\n * malformed entry can't poison strategy execution.\n * 4. Hydrates text content for files that came back as URL-only — the\n * inline strategy must inline `<style>` / `<script>` text bodies, and\n * the blob CSS pre-rewrite needs the source to walk `@import` /\n * `url()`. Without this hydration the iframe's sandbox=allow-scripts\n * origin-null context tries to `GET /css/foo.css` against the parent\n * origin and surfaces 404 + CORS errors.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/01_project_discovery/01_useHtmlProject.md\n */\nconst HTML_PROJECT_EXTS = [\n '.html', '.htm',\n '.css',\n '.js', '.mjs', '.cjs',\n '.json', '.json5',\n '.svg',\n '.png', '.jpg', '.jpeg', '.gif', '.webp', '.avif', '.ico', '.bmp',\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n '.mp3', '.wav', '.ogg', '.m4a',\n '.mp4', '.webm', '.mov',\n '.txt', '.md',\n] as const\n\nconst TEXT_EXTS = new Set<string>([\n '.html', '.htm', '.css', '.js', '.mjs', '.cjs',\n '.json', '.json5', '.svg', '.txt', '.md',\n])\n\nconst MIME_BY_EXT: Record<string, string> = {\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.cjs': 'text/javascript',\n '.json': 'application/json',\n '.json5': 'application/json',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.ico': 'image/x-icon',\n '.bmp': 'image/bmp',\n '.woff': 'font/woff', '.woff2': 'font/woff2',\n '.ttf': 'font/ttf', '.otf': 'font/otf',\n '.eot': 'application/vnd.ms-fontobject',\n '.mp3': 'audio/mpeg', '.wav': 'audio/wav', '.ogg': 'audio/ogg', '.m4a': 'audio/mp4',\n '.mp4': 'video/mp4', '.webm': 'video/webm', '.mov': 'video/quicktime',\n '.txt': 'text/plain', '.md': 'text/markdown',\n}\n\nfunction getExt(name: string): string {\n const i = name.lastIndexOf('.')\n return i >= 0 ? name.slice(i).toLowerCase() : ''\n}\n\nfunction inferMime(name: string): string {\n return MIME_BY_EXT[getExt(name)] ?? 'application/octet-stream'\n}\n\nfunction isTextFile(name: string): boolean {\n return TEXT_EXTS.has(getExt(name))\n}\n\nexport interface UseHtmlProjectOptions {\n /** Entry HTML body. Used as a re-discovery dependency only — never parsed inside the hook. */\n rootHtml: string\n /** `git_path` of the entry HTML (e.g. `\"workspace/proj-1/site/index.html\"`). */\n gitPath: string\n /** Skip discovery (for non-HTML files or when the host has no resource adapter). */\n enabled: boolean\n}\n\nexport interface UseHtmlProjectResult {\n files: HtmlFile[]\n loading: boolean\n error: string | null\n}\n\ninterface IntermediateFile {\n name: string\n mime: string\n url?: string\n content?: string\n /** True iff the file is a text type and we still need to hydrate `content`. */\n needsHydration: boolean\n}\n\nexport function useHtmlProject(opts: UseHtmlProjectOptions): UseHtmlProjectResult {\n const result: UseProjectFilesResult = useProjectFiles({\n gitPath: opts.gitPath,\n extensions: [...HTML_PROJECT_EXTS],\n enabled: opts.enabled,\n recursive: true,\n generateUrls: true,\n deps: [opts.rootHtml],\n })\n\n // ── 1. Coarse mapping (synchronous; no fetch yet). ──────────────────────\n const intermediate = useMemo<IntermediateFile[]>(() => {\n return result.files\n .filter((f) => {\n if (!f.name || f.name.startsWith('/') || f.name.includes('..') || f.name.includes('\\\\')) {\n if (typeof console !== 'undefined') {\n console.warn(`[useHtmlProject] skip invalid file name: ${f.name}`)\n }\n return false\n }\n if (f.content == null && !f.url) {\n if (typeof console !== 'undefined') {\n console.warn(`[useHtmlProject] skip file with no content/url: ${f.name}`)\n }\n return false\n }\n return true\n })\n .map<IntermediateFile>((f) => {\n const mime = inferMime(f.name)\n const text = isTextFile(f.name)\n if (text && f.content != null) {\n return { name: f.name, mime, content: f.content, needsHydration: false }\n }\n if (text && f.url) {\n // Text file backed only by a presigned URL — must hydrate to inline.\n return { name: f.name, mime, url: f.url, needsHydration: true }\n }\n if (f.url) {\n return { name: f.name, mime, url: f.url, needsHydration: false }\n }\n return { name: f.name, mime, content: f.content ?? '', needsHydration: false }\n })\n }, [result.files])\n\n // ── 2. Hydrate URL-only text files with a single batched fetch pass. ────\n const [hydrated, setHydrated] = useState<Map<string, string>>(new Map())\n const [hydrating, setHydrating] = useState(false)\n const [hydrateError, setHydrateError] = useState<string | null>(null)\n const runRef = useRef(0)\n\n useEffect(() => {\n const targets = intermediate.filter((f) => f.needsHydration && f.url)\n if (targets.length === 0) {\n setHydrated(new Map())\n setHydrating(false)\n setHydrateError(null)\n return\n }\n const run = ++runRef.current\n const cancelled = () => run !== runRef.current\n\n setHydrating(true)\n setHydrateError(null)\n const next = new Map<string, string>()\n\n Promise.allSettled(\n targets.map((t) =>\n fetch(t.url!, { credentials: 'include' as RequestCredentials }).then((r) => {\n if (!r.ok) throw new Error(`HTTP ${r.status} for ${t.name}`)\n return r.text().then((body) => ({ name: t.name, body }))\n }),\n ),\n ).then((results) => {\n if (cancelled()) return\n const failures: string[] = []\n for (const r of results) {\n if (r.status === 'fulfilled') {\n next.set(r.value.name, r.value.body)\n } else {\n const reason = r.reason instanceof Error ? r.reason.message : String(r.reason)\n failures.push(reason)\n if (typeof console !== 'undefined') {\n console.warn(`[useHtmlProject] hydration failed: ${reason}`)\n }\n }\n }\n setHydrated(next)\n setHydrating(false)\n setHydrateError(\n failures.length > 0 && next.size === 0\n ? `Failed to load ${failures.length} text file(s)`\n : null,\n )\n })\n\n return () => { runRef.current++ }\n }, [intermediate])\n\n // ── 3. Final mapping (uses hydrated content where available). ───────────\n const files = useMemo<HtmlFile[]>(() => {\n return intermediate.map<HtmlFile>((f) => {\n if (f.needsHydration) {\n const content = hydrated.get(f.name)\n if (content != null) return { name: f.name, mime: f.mime, content }\n // Hydration in flight or failed — keep URL so blob strategy can still try.\n return { name: f.name, mime: f.mime, url: f.url! }\n }\n if (f.content != null) return { name: f.name, mime: f.mime, content: f.content }\n return { name: f.name, mime: f.mime, url: f.url! }\n })\n }, [intermediate, hydrated])\n\n return {\n files,\n loading: result.loading || hydrating,\n error: result.error ?? hydrateError,\n }\n}\n","import React, { useEffect, useMemo, useRef, useState, useCallback } from 'react'\nimport { useChatWidgetI18n } from '../../../../i18n'\nimport {\n replaceXrefsWithMarkers,\n XREF_MARKER_PREFIX,\n XREF_MARKER_SUFFIX,\n} from '../../xref/xrefParser'\nimport type {\n HtmlFile,\n HtmlProjectOptions,\n HtmlViewerState,\n} from './types.js'\nimport { applyInlineStrategy, type InlineStrategyOutput } from './strategies/inlineStrategy.js'\nimport { applyBlobStrategy, type BlobStrategyOutput } from './strategies/blobStrategy.js'\nimport { chooseStrategy } from './strategies/detect.js'\nimport { SELECTION_BRIDGE_SCRIPT, LINK_BRIDGE_SCRIPT } from './bridge/scripts.js'\nimport { basename } from './util/pathUtils.js'\nimport { ensureSandboxBase } from './util/sandboxBase.js'\n\n/**\n * `HtmlViewer` is the entry dispatcher for the multi-file HTML project viewer.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/05_integration/01_html_viewer_dispatch.md\n *\n * Responsibilities:\n * - Decide between three rendering paths based on `htmlOptions`:\n * 1. Single-file fallback (`htmlOptions` absent / `files` empty)\n * → behaviour identical to the legacy `HtmlViewer.tsx`.\n * 2. Loading placeholder (`htmlOptions.projectLoading === true`)\n * → display loading text, no iframe yet.\n * 3. Project mode (`files` present) → run `chooseStrategy` and\n * render `<InlineRenderer>` or `<BlobRenderer>` accordingly.\n * - Wire selection / link / xref postMessage bridge for *all* paths so\n * consumer callbacks behave identically regardless of strategy.\n * - Emit `htmlOptions.onStateChange` transitions so the host UI can\n * surface a strategy badge / fallback warning.\n * - Hard-cap project size via `htmlOptions.maxBytes` (default 16 MiB).\n *\n * Re-export shim: `viewers/HtmlViewer.tsx` exposes this default to keep\n * external `import HtmlViewer from '@yumiai/chat-widget/.../HtmlViewer'`\n * paths intact (AC-HTMLP-096).\n */\nexport interface HtmlViewerSelectionState {\n text: string\n rect: DOMRect\n}\n\nexport interface HtmlViewerProps {\n content: string\n fileName?: string\n htmlOptions?: HtmlProjectOptions\n onSelectionChange?: (selection: HtmlViewerSelectionState | null) => void\n onXrefClick?: (xref: unknown) => void\n onLinkClick?: (url: string) => void\n}\n\nconst DEFAULT_MAX_BYTES = 16 * 1024 * 1024\nconst DEFAULT_INLINE_FILE_MAX_BYTES = 256 * 1024\n\ninterface SharedIframeProps {\n iframeRef: React.RefObject<HTMLIFrameElement | null>\n title: string\n}\n\nconst HtmlViewer: React.FC<HtmlViewerProps> = ({\n content,\n fileName,\n htmlOptions,\n onSelectionChange,\n onXrefClick,\n onLinkClick,\n}) => {\n const { t } = useChatWidgetI18n()\n const iframeRef = useRef<HTMLIFrameElement>(null)\n const onXrefClickRef = useRef(onXrefClick)\n onXrefClickRef.current = onXrefClick\n const onLinkClickRef = useRef(onLinkClick)\n onLinkClickRef.current = onLinkClick\n\n // ── 1. xref pre-processing (entry HTML only, both single-file & project) ───\n const { processedHtml, markers } = useMemo(() => {\n const { content: processed, markers: m } = replaceXrefsWithMarkers(content)\n let html = processed\n m.forEach((data, idx) => {\n const marker = `${XREF_MARKER_PREFIX}${idx}${XREF_MARKER_SUFFIX}`\n const chipHtml = `<span data-xref-idx=\"${idx}\" style=\"display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:12px;background:#e0f2fe;color:#0369a1;cursor:pointer;font-size:13px;border:1px solid #bae6fd\" role=\"button\" tabindex=\"0\">📎 ${data.description.replace(/</g, '<').replace(/>/g, '>')}</span>`\n html = html.split(marker).join(chipHtml)\n })\n return { processedHtml: html, markers: m }\n }, [content])\n const markersRef = useRef(markers)\n markersRef.current = markers\n\n // ── 2. Shared postMessage handler (works for inline / blob / single) ───────\n const handleMessage = useCallback((e: MessageEvent) => {\n if (!iframeRef.current) return\n const iframeWin = iframeRef.current.contentWindow\n if (e.source !== iframeWin) return\n\n if (e.data?.type === 'ycw-iframe-selection') {\n if (!e.data.text) {\n onSelectionChange?.(null)\n return\n }\n const iframeRect = iframeRef.current.getBoundingClientRect()\n const r = e.data.rect\n const mappedRect = new DOMRect(\n r.left + iframeRect.left,\n r.top + iframeRect.top,\n r.width,\n r.height,\n )\n onSelectionChange?.({ text: e.data.text, rect: mappedRect })\n }\n\n if (e.data?.type === 'ycw-iframe-link') {\n const href = e.data.href as string\n if (href.startsWith('xref:') && onXrefClickRef.current) {\n onXrefClickRef.current({ ref: href.slice(5) })\n } else if (onLinkClickRef.current) {\n onLinkClickRef.current(href)\n } else {\n window.open(href, '_blank', 'noopener,noreferrer')\n }\n }\n\n if (e.data?.type === 'ycw-iframe-xref') {\n const idx = e.data.idx as number\n const data = markersRef.current.get(idx)\n if (data) {\n if (data.record.target_resource.startsWith('url://')) {\n const url = data.record.target_resource.replace(/^url:\\/\\//, 'https://')\n onLinkClickRef.current?.(url)\n window.open(url, '_blank', 'noopener,noreferrer')\n } else {\n onXrefClickRef.current?.(data.record)\n }\n }\n }\n }, [onSelectionChange])\n\n useEffect(() => {\n window.addEventListener('message', handleMessage)\n return () => window.removeEventListener('message', handleMessage)\n }, [handleMessage])\n\n // ── 3. Decide rendering path ───────────────────────────────────────────────\n const isProjectMode =\n !!htmlOptions?.files &&\n htmlOptions.files.length > 0 &&\n !htmlOptions.projectLoading\n\n const projectArtifact = useMemo(() => {\n if (!isProjectMode) return null\n const opts = htmlOptions!\n const entryName = opts.entryName ?? basename(fileName ?? 'index.html')\n const files = opts.files!\n\n const totalBytes =\n (processedHtml.length ?? 0) + files.reduce((s, f) => s + (f.content?.length ?? 0), 0)\n const maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES\n if (totalBytes > maxBytes) {\n return { kind: 'error' as const, message: t('viewer.htmlProjectSizeLimit') }\n }\n // Entry HTML may live either inside `files` (typical when discovered\n // via `useHtmlProject`) or be provided exclusively through the\n // `content` prop. Only complain when *neither* source has an entry.\n if (!files.some((f) => f.name === entryName) && !processedHtml) {\n return { kind: 'error' as const, message: t('viewer.htmlProjectNoEntry') }\n }\n const { strategy, detection } = chooseStrategy(opts.strategy ?? 'auto', processedHtml, files)\n return { kind: 'ok' as const, strategy, detection, entryName, files }\n }, [isProjectMode, htmlOptions, fileName, processedHtml, t])\n\n // ── 4. State machine emission ──────────────────────────────────────────────\n const onStateChange = htmlOptions?.onStateChange\n const lastStateRef = useRef<HtmlViewerState>({ kind: 'idle' })\n useEffect(() => {\n if (!onStateChange) return\n let next: HtmlViewerState\n if (htmlOptions?.projectLoading) {\n next = { kind: 'loading' }\n } else if (isProjectMode && projectArtifact?.kind === 'error') {\n next = { kind: 'fallback-single', reason: projectArtifact.message }\n } else if (isProjectMode && projectArtifact?.kind === 'ok') {\n next = { kind: 'rendering', strategy: projectArtifact.strategy, entryName: projectArtifact.entryName }\n } else {\n next = { kind: 'idle' }\n }\n if (!sameState(lastStateRef.current, next)) {\n lastStateRef.current = next\n onStateChange(next)\n }\n }, [onStateChange, htmlOptions?.projectLoading, isProjectMode, projectArtifact])\n\n const sharedIframeProps: SharedIframeProps = {\n iframeRef,\n title: t('viewer.htmlPreview'),\n }\n\n // ── 5. Render ──────────────────────────────────────────────────────────────\n if (htmlOptions?.projectLoading) {\n return (\n <div className=\"ycw-file-viewer-html ycw-html-loading\" data-html-mode=\"loading\">\n {t('viewer.htmlProjectLoading')}\n </div>\n )\n }\n\n if (isProjectMode && projectArtifact?.kind === 'error') {\n if (typeof console !== 'undefined') {\n console.warn('[HtmlViewer] project mode fallback:', projectArtifact.message)\n }\n return <SingleFileFallback content={processedHtml} sharedIframeProps={sharedIframeProps} />\n }\n\n if (isProjectMode && projectArtifact?.kind === 'ok' && projectArtifact.strategy === 'inline') {\n return (\n <InlineRenderer\n rootHtml={processedHtml}\n entryName={projectArtifact.entryName}\n files={projectArtifact.files}\n inlineFileMaxBytes={htmlOptions?.inlineFileMaxBytes ?? DEFAULT_INLINE_FILE_MAX_BYTES}\n sharedIframeProps={sharedIframeProps}\n />\n )\n }\n\n if (isProjectMode && projectArtifact?.kind === 'ok' && projectArtifact.strategy === 'blob') {\n return (\n <BlobRenderer\n rootHtml={processedHtml}\n entryName={projectArtifact.entryName}\n files={projectArtifact.files}\n runtimeShim={htmlOptions?.runtimeShim !== false}\n sharedIframeProps={sharedIframeProps}\n />\n )\n }\n\n return <SingleFileFallback content={processedHtml} sharedIframeProps={sharedIframeProps} />\n}\n\nfunction sameState(a: HtmlViewerState, b: HtmlViewerState): boolean {\n if (a.kind !== b.kind) return false\n if (a.kind === 'rendering' && b.kind === 'rendering') {\n return a.strategy === b.strategy && a.entryName === b.entryName\n }\n if (a.kind === 'fallback-single' && b.kind === 'fallback-single') {\n return a.reason === b.reason\n }\n if (a.kind === 'error' && b.kind === 'error') {\n return a.message === b.message\n }\n return true\n}\n\ninterface SingleFileFallbackProps {\n content: string\n sharedIframeProps: SharedIframeProps\n}\n\nconst SingleFileFallback: React.FC<SingleFileFallbackProps> = ({ content, sharedIframeProps }) => {\n const enriched = ensureSandboxBase(content) + SELECTION_BRIDGE_SCRIPT + LINK_BRIDGE_SCRIPT\n return (\n <div className=\"ycw-file-viewer-html\" data-html-mode=\"single\">\n <iframe\n ref={sharedIframeProps.iframeRef}\n srcDoc={enriched}\n sandbox=\"allow-scripts\"\n className=\"ycw-html-iframe\"\n title={sharedIframeProps.title}\n />\n </div>\n )\n}\n\ninterface InlineRendererProps {\n rootHtml: string\n entryName: string\n files: HtmlFile[]\n inlineFileMaxBytes: number\n sharedIframeProps: SharedIframeProps\n}\n\nconst InlineRenderer: React.FC<InlineRendererProps> = ({\n rootHtml,\n entryName,\n files,\n inlineFileMaxBytes,\n sharedIframeProps,\n}) => {\n const filesKey = useMemo(() => fileTreeKey(files), [files])\n const output = useMemo<InlineStrategyOutput>(\n () =>\n applyInlineStrategy({\n rootHtml,\n entryName,\n files,\n inlineFileMaxBytes,\n }),\n // filesKey captures all relevant file changes; rootHtml/entry covered separately.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [rootHtml, entryName, filesKey, inlineFileMaxBytes],\n )\n\n // Revoke the few asset-only blob: URLs minted during inline rewriting on cleanup.\n useEffect(() => {\n return () => {\n for (const url of output.blobUrls) {\n try {\n URL.revokeObjectURL(url)\n } catch {\n /* ignore */\n }\n }\n }\n }, [output])\n\n const enriched = ensureSandboxBase(output.html) + SELECTION_BRIDGE_SCRIPT + LINK_BRIDGE_SCRIPT\n\n return (\n <div className=\"ycw-file-viewer-html\" data-html-mode=\"project-inline\" data-strategy=\"inline\">\n <iframe\n ref={sharedIframeProps.iframeRef}\n srcDoc={enriched}\n sandbox=\"allow-scripts\"\n className=\"ycw-html-iframe\"\n title={sharedIframeProps.title}\n />\n </div>\n )\n}\n\ninterface BlobRendererProps {\n rootHtml: string\n entryName: string\n files: HtmlFile[]\n runtimeShim: boolean\n sharedIframeProps: SharedIframeProps\n}\n\nconst BlobRenderer: React.FC<BlobRendererProps> = ({\n rootHtml,\n entryName,\n files,\n runtimeShim,\n sharedIframeProps,\n}) => {\n const filesKey = useMemo(() => fileTreeKey(files), [files])\n const [output, setOutput] = useState<BlobStrategyOutput | null>(null)\n\n useEffect(() => {\n let current: BlobStrategyOutput | null = null\n try {\n current = applyBlobStrategy({ rootHtml, entryName, files, runtimeShim })\n setOutput(current)\n } catch (e) {\n if (typeof console !== 'undefined') {\n console.error('[HtmlViewer] blob strategy failed:', e)\n }\n setOutput(null)\n }\n return () => {\n try {\n current?.pool.dispose()\n } catch {\n /* ignore */\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rootHtml, entryName, filesKey, runtimeShim])\n\n if (!output) {\n return (\n <div className=\"ycw-file-viewer-html ycw-html-loading\" data-html-mode=\"project-blob-pending\">\n {/* Intentionally minimal: parent already gates with projectLoading state. */}\n </div>\n )\n }\n\n return (\n <div className=\"ycw-file-viewer-html\" data-html-mode=\"project-blob\" data-strategy=\"blob\">\n <iframe\n ref={sharedIframeProps.iframeRef}\n src={output.rootUrl}\n sandbox={output.sandbox}\n className=\"ycw-html-iframe\"\n title={sharedIframeProps.title}\n />\n </div>\n )\n}\n\nfunction fileTreeKey(files: HtmlFile[]): string {\n return files\n .map((f) => `${f.name}|${f.content?.length ?? 0}|${f.url ?? ''}`)\n .join('\\n')\n}\n\nexport default HtmlViewer\n","/**\n * POSIX path utilities used by HTML/CSS rewrite layers.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/02_inline_strategy/03_path_resolution.md\n *\n * Design choices (deliberately simple — see spec §3 for rationale):\n * - No `URL` constructor (avoids fake-origin trickery in srcDoc context).\n * - Windows backslashes are NOT normalized; project files come from a\n * POSIX `git_path` so backslashes are treated as ordinary characters.\n * - `..` segments that would escape the project root are silently\n * clamped to root (rendering tolerance over throw).\n */\n\n/**\n * Return the parent directory of a POSIX-style relative path.\n * Mirrors `path.posix.dirname` for one-segment-or-more inputs but returns\n * an empty string when the input has no `/` (so callers can use it as a\n * `baseDir` for `resolveRelative`).\n */\nexport function dirname(path: string): string {\n const i = path.lastIndexOf('/')\n return i < 0 ? '' : path.slice(0, i)\n}\n\n/** Return the basename (final segment) of a POSIX-style path. */\nexport function basename(path: string): string {\n const i = path.lastIndexOf('/')\n return i < 0 ? path : path.slice(i + 1)\n}\n\n/**\n * Resolve `ref` against `baseDir` to produce a normalized\n * project-root-relative POSIX path.\n *\n * Rules:\n * - Query string and hash are stripped from `ref` first.\n * - A leading `/` makes `ref` project-root-relative (the slash is\n * dropped and `baseDir` is ignored).\n * - Otherwise the result is `normalize(baseDir + '/' + ref)`.\n * - `..` segments that would escape the root are silently clamped.\n */\nexport function resolveRelative(baseDir: string, ref: string): string {\n const queryIdx = ref.search(/[?#]/)\n const cleanRef = queryIdx >= 0 ? ref.slice(0, queryIdx) : ref\n\n if (cleanRef.startsWith('/')) {\n return normalizePath(cleanRef.slice(1))\n }\n\n const joined = baseDir ? `${baseDir}/${cleanRef}` : cleanRef\n return normalizePath(joined)\n}\n\n/**\n * Normalize a POSIX-style path: collapse `.` and `..` segments, fold\n * redundant slashes; never escape the root.\n */\nexport function normalizePath(path: string): string {\n const parts = path.split('/').filter((p) => p !== '' && p !== '.')\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n if (stack.length > 0) stack.pop()\n } else {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\n/**\n * Return `true` for protocol-qualified or protocol-relative URLs that\n * the rewrite layer must NOT touch (CDN, mailto:, data:, blob:).\n *\n * A leading `/` (project-root-relative path) is intentionally NOT\n * treated as absolute — see spec §1.1.\n */\nexport function isAbsoluteUrl(url: string): boolean {\n if (url.startsWith('//')) return true\n return /^[a-z][a-z0-9+\\-.]*:/i.test(url)\n}\n","import type { HtmlFile } from '../types.js'\nimport { dirname, resolveRelative, isAbsoluteUrl } from '../util/pathUtils.js'\nimport type { BlobUrlPool } from '../util/blobPool.js'\n\n/**\n * Pre-rewrite a JS module body so its `import` / `export-from` / dynamic\n * `import()` specifiers point at the matching Blob URLs in `pool`, and\n * runtime-evaluated forms route through the runtime resolver shim\n * (`window.__YCW_RESOLVE__`) installed by `runtime/shim.ts`.\n *\n * Spec:\n * - docs/proposals/CWRF-011-html-project-viewer/03_blob_strategy/03_esm_handling.md\n * - docs/proposals/CWRF-012-runtime-esm-shim/02_rewrite_layer.md\n *\n * Why this exists:\n * - In Blob-strategy mode each module file becomes a `blob:` URL.\n * - Browsers resolve relative `import './x.js'` against the importing\n * module's URL, but Blob URLs have no directory hierarchy, so the\n * specifier would fail with `404`/`net::ERR_FAILED`.\n * - We therefore rewrite specifiers to absolute Blob URLs at build time\n * and feed the resulting source back into the pool via `pool.replace`.\n * - For dynamic forms whose specifier is only known at runtime\n * (template literals, variables, function calls), we wrap the whole\n * argument with `window.__YCW_RESOLVE__(spec, importerPath)` so the\n * shim can look up the matching blob URL on the fly.\n *\n * Resilience:\n * - Bare specifiers (`'lodash'`) are left untouched + warning emitted.\n * - Cycles are short-circuited via the shared `visited` set; the second\n * visit returns the source as-is so the module-cache in the browser\n * can still resolve the loop.\n * - Unknown / missing files keep the original specifier; the browser\n * surfaces a real 404 in DevTools and we record a warning.\n */\nexport interface RewriteEsmInput {\n jsContent: string\n jsFilePath: string\n fileMap: Map<string, HtmlFile>\n pool: BlobUrlPool\n warnings: string[]\n visited: Set<string>\n /**\n * When true (default), rewrite runtime-evaluated forms — dynamic\n * `import()` with non-literal args, `fetch('./...')`, `new Worker('./...')`,\n * and `new URL(spec, import.meta.url)` — to route through the runtime\n * shim. Spec: CWRF-012.\n *\n * Callers that intentionally suppress the shim (e.g. inline strategy\n * regression tests) can pass `false` to keep behaviour byte-identical\n * to the legacy CWRF-011 rewriter.\n */\n enableRuntimeShim?: boolean\n}\n\nexport function rewriteEsm(input: RewriteEsmInput): string {\n const { jsContent, jsFilePath, fileMap, pool, warnings, visited } = input\n const enableShim = input.enableRuntimeShim !== false\n if (visited.has(jsFilePath)) {\n return jsContent\n }\n visited.add(jsFilePath)\n\n const baseDir = dirname(jsFilePath)\n let out = jsContent\n\n // ── 1. Static literal specifiers (build-time → blob URL) ──────────────────\n // import x from 'y' / import { y } from 'y' / import * as ns from 'y' / import 'y'\n out = out.replace(\n /(import\\s+(?:[\\w*\\s{},]+\\s+from\\s+)?)(['\"])([^'\"]+)\\2/g,\n (match, prefix: string, quote: string, specifier: string) => {\n const replacement = resolveSpecifier(specifier, baseDir, jsFilePath, fileMap, pool, warnings, visited, enableShim)\n if (replacement == null) return match\n return `${prefix}\"${replacement}\"`\n void quote\n },\n )\n\n // export { x } from 'y' / export * from 'y'\n out = out.replace(\n /(export\\s+(?:\\*|\\{[^}]+\\})\\s+from\\s+)(['\"])([^'\"]+)\\2/g,\n (match, prefix: string, quote: string, specifier: string) => {\n const replacement = resolveSpecifier(specifier, baseDir, jsFilePath, fileMap, pool, warnings, visited, enableShim)\n if (replacement == null) return match\n return `${prefix}\"${replacement}\"`\n void quote\n },\n )\n\n // import('y') with literal — preserve trailing whitespace + closing paren\n out = out.replace(\n /(import\\s*\\(\\s*)(['\"])([^'\"]+)\\2(\\s*\\))/g,\n (match, prefix: string, quote: string, specifier: string, suffix: string) => {\n const replacement = resolveSpecifier(specifier, baseDir, jsFilePath, fileMap, pool, warnings, visited, enableShim)\n if (replacement == null) return match\n return `${prefix}\"${replacement}\"${suffix}`\n void quote\n },\n )\n\n // ── 2. Runtime-evaluated forms (CWRF-012, opt-out via enableRuntimeShim=false) ──\n if (enableShim) {\n out = wrapDynamicImports(out, jsFilePath)\n out = wrapRelativeFetch(out, jsFilePath)\n out = wrapRelativeWorker(out, jsFilePath)\n out = rewriteImportMetaUrl(out, jsFilePath)\n }\n\n return out\n}\n\n/**\n * Wrap any `import(...)` whose argument is NOT a single string literal\n * with `__YCW_RESOLVE__(args, importerPath)`.\n *\n * Uses a manual paren-matching scanner (not regex) so nested parens,\n * template literals, and string contents are tolerated:\n *\n * import(`./x/${y}.js`) → import(__YCW_RESOLVE__(`./x/${y}.js`,\"a.js\"))\n * import('./x/' + name) → import(__YCW_RESOLVE__('./x/' + name,\"a.js\"))\n * import(MODULES[name]) → import(__YCW_RESOLVE__(MODULES[name],\"a.js\"))\n * import(getName('snake')) → import(__YCW_RESOLVE__(getName('snake'),\"a.js\"))\n * import(\"blob:foo\") → unchanged (already a literal blob URL)\n *\n * `xml.import('y')` is preserved — we only act when the `import` token is\n * not preceded by a `.` or word character.\n */\nfunction wrapDynamicImports(src: string, importerPath: string): string {\n return scanAndWrap(src, 'import', (args) => {\n const trimmed = args.trim()\n if (isLiteralStringExpr(trimmed)) return null\n return `__YCW_RESOLVE__(${args}, ${JSON.stringify(importerPath)})`\n })\n}\n\n/**\n * Wrap `fetch(arg, ...)` with the runtime resolver when `arg` is a\n * relative-looking literal (template literal, string concat, variable).\n *\n * Plain absolute literals (`fetch('https://...')`) are left untouched\n * to avoid bloating bundle size and to preserve intent.\n */\nfunction wrapRelativeFetch(src: string, importerPath: string): string {\n return wrapCallSiteFirstArg(src, /\\bfetch\\b/g, importerPath, /^[\\w$]/)\n}\n\n/**\n * Wrap `new Worker(url, opts?)` with the runtime resolver when `url`\n * is relative. Mirrors the fetch behaviour.\n */\nfunction wrapRelativeWorker(src: string, importerPath: string): string {\n return wrapCallSiteFirstArg(src, /\\bnew\\s+Worker\\b/g, importerPath, /^[\\w$]/)\n}\n\n/**\n * Find every `<headerRe>(<args>)` call site in `src` and, when the first\n * argument is not an absolute literal URL, rewrite it to\n * `<headerMatch>(__YCW_RESOLVE__(<firstArg>, importerPath)<restRaw>)`.\n *\n * `nextCharBlocker` is a regex tested against the character that\n * immediately follows the keyword match. When it matches, the call site\n * is skipped — guards against false positives like `myfetch(` or\n * `Workers(` (when matching `Worker`).\n */\nfunction wrapCallSiteFirstArg(\n src: string,\n headerRe: RegExp,\n importerPath: string,\n nextCharBlocker: RegExp,\n): string {\n let out = ''\n let i = 0\n const re = new RegExp(headerRe.source, headerRe.flags.includes('g') ? headerRe.flags : headerRe.flags + 'g')\n re.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = re.exec(src)) !== null) {\n const idx = m.index\n if (idx < i) {\n // Already consumed; advance past current match to avoid infinite loop.\n re.lastIndex = idx + m[0].length\n continue\n }\n // Block method-call sites (`obj.fetch(...)`, `inst.Worker(...)`).\n const prev = idx > 0 ? src.charAt(idx - 1) : ''\n if (prev === '.' || prev === '?' /* optional chain prefix */) continue\n const after = src.charAt(idx + m[0].length)\n if (after && nextCharBlocker.test(after)) continue\n const argStart = skipWhitespace(src, idx + m[0].length)\n if (src.charAt(argStart) !== '(') continue\n const result = scanCallArgs(src, argStart)\n if (!result) continue\n const args = result.args\n const split = splitTopLevelComma(args, 1)\n const headRaw = split[0]!\n const head = headRaw.trim()\n if (isAbsoluteLiteralStringExpr(head)) continue\n // Restore everything after the first arg (including the leading comma)\n // verbatim so any whitespace / comments / formatting is preserved.\n const restRaw = split.length > 1 ? args.slice(headRaw.length) : ''\n out += src.slice(i, idx)\n out += m[0]\n out += '(__YCW_RESOLVE__('\n out += head\n out += ', '\n out += JSON.stringify(importerPath)\n out += ')'\n out += restRaw\n out += ')'\n i = result.endExclusive\n re.lastIndex = result.endExclusive\n }\n out += src.slice(i)\n return out\n}\n\n/**\n * Rewrite `new URL(spec, import.meta.url)` → `new URL(__YCW_RESOLVE__(spec, importerPath))`.\n *\n * `import.meta.url` inside a blob module is the entry blob URL, which\n * has no directory hierarchy — so the standard `new URL(rel, base)`\n * idiom for asset paths would fail. The rewriter replaces the two-arg\n * form with a single resolved blob URL.\n *\n * Bare `import.meta.url` outside this idiom is left untouched.\n */\nfunction rewriteImportMetaUrl(src: string, importerPath: string): string {\n return src.replace(\n /\\bnew\\s+URL\\s*\\(\\s*([\\s\\S]*?)\\s*,\\s*import\\.meta\\.url\\s*\\)/g,\n (full, spec: string) => {\n const trimmed = spec.trim()\n // Bail when the captured spec spans nested parens (regex got greedy).\n if (countUnbalanced(trimmed) !== 0) return full\n return `new URL(__YCW_RESOLVE__(${trimmed}, ${JSON.stringify(importerPath)}))`\n },\n )\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction isLiteralStringExpr(s: string): boolean {\n if (s.length < 2) return false\n const q = s.charAt(0)\n if (q !== '\"' && q !== \"'\") return false\n if (s.charAt(s.length - 1) !== q) return false\n // Reject embedded unescaped quote (would mean it's a more complex expr).\n for (let i = 1; i < s.length - 1; i++) {\n const c = s.charAt(i)\n if (c === '\\\\') { i++; continue }\n if (c === q) return false\n }\n return true\n}\n\nfunction isAbsoluteLiteralStringExpr(s: string): boolean {\n if (!isLiteralStringExpr(s)) return false\n const inner = s.slice(1, -1)\n return /^(?:[a-z][a-z0-9+\\-.]*:|\\/\\/|data:|blob:)/i.test(inner)\n}\n\n/**\n * Scan `src` for `<keyword>(<args>)` calls (nested-paren / template /\n * string aware). For each match, invoke `transform(args)`; when it\n * returns non-null, splice the result back in place of `args`.\n *\n * Skips matches where the keyword is preceded by `.` or another word\n * character (so `.import(`, `myFetch(` are ignored).\n */\nfunction scanAndWrap(\n src: string,\n keyword: string,\n transform: (args: string) => string | null,\n): string {\n const klen = keyword.length\n let out = ''\n let i = 0\n while (i < src.length) {\n const idx = indexOfKeyword(src, keyword, i)\n if (idx < 0) {\n out += src.slice(i)\n break\n }\n const argStart = skipWhitespace(src, idx + klen)\n if (src.charAt(argStart) !== '(') {\n out += src.slice(i, idx + klen)\n i = idx + klen\n continue\n }\n const result = scanCallArgs(src, argStart)\n if (!result) {\n out += src.slice(i)\n break\n }\n const transformed = transform(result.args)\n if (transformed == null) {\n out += src.slice(i, result.endExclusive)\n i = result.endExclusive\n continue\n }\n out += src.slice(i, idx + klen)\n out += '('\n out += transformed\n out += ')'\n i = result.endExclusive\n }\n return out\n}\n\nfunction indexOfKeyword(src: string, keyword: string, from: number): number {\n let pos = from\n while (true) {\n const at = src.indexOf(keyword, pos)\n if (at < 0) return -1\n const prev = at === 0 ? '' : src.charAt(at - 1)\n const next = src.charAt(at + keyword.length)\n const prevOk = !prev || !/[\\w.$]/.test(prev)\n const nextOk = !next || !/[\\w$]/.test(next)\n if (prevOk && nextOk) return at\n pos = at + keyword.length\n }\n}\n\nfunction skipWhitespace(src: string, from: number): number {\n let j = from\n while (j < src.length && /\\s/.test(src.charAt(j))) j++\n return j\n}\n\ninterface CallArgs {\n args: string\n endExclusive: number\n}\n\n/**\n * Given `src` with `src[parenStart] === '('`, return the substring\n * between `(` and its matching `)` plus the index of the char *after*\n * the closing paren. Tolerates nested parens, single/double-quoted\n * strings, template literals (including `${...}` interpolations), and\n * line/block comments.\n */\nexport function scanCallArgs(src: string, parenStart: number): CallArgs | null {\n if (src.charAt(parenStart) !== '(') return null\n let depth = 1\n let i = parenStart + 1\n // 0=normal, 1=single str, 2=double str, 3=template str\n let mode = 0\n // Stack of template depths for ${...}\n let templateExprDepth = 0\n while (i < src.length) {\n const c = src.charAt(i)\n if (mode === 0) {\n if (c === '/' && src.charAt(i + 1) === '/') {\n const nl = src.indexOf('\\n', i)\n if (nl < 0) return null\n i = nl + 1\n continue\n }\n if (c === '/' && src.charAt(i + 1) === '*') {\n const close = src.indexOf('*/', i + 2)\n if (close < 0) return null\n i = close + 2\n continue\n }\n if (c === \"'\") { mode = 1; i++; continue }\n if (c === '\"') { mode = 2; i++; continue }\n if (c === '`') { mode = 3; i++; continue }\n if (c === '(') { depth++; i++; continue }\n if (c === ')') {\n depth--\n if (depth === 0) {\n return { args: src.slice(parenStart + 1, i), endExclusive: i + 1 }\n }\n i++\n continue\n }\n i++\n continue\n }\n if (mode === 1) {\n if (c === '\\\\') { i += 2; continue }\n if (c === \"'\") { mode = 0; i++; continue }\n i++\n continue\n }\n if (mode === 2) {\n if (c === '\\\\') { i += 2; continue }\n if (c === '\"') { mode = 0; i++; continue }\n i++\n continue\n }\n // mode === 3 → template literal\n if (c === '\\\\') { i += 2; continue }\n if (c === '`') { mode = 0; i++; continue }\n if (c === '$' && src.charAt(i + 1) === '{') {\n templateExprDepth++\n mode = 0\n i += 2\n // Re-enter \"normal\" mode but track curly-brace depth via nested scan.\n const sub = scanCurlyExpr(src, i)\n if (!sub) return null\n i = sub\n mode = 3\n templateExprDepth--\n continue\n }\n i++\n }\n void templateExprDepth\n return null\n}\n\n/**\n * Given `src` at the position right after `${`, scan forward until the\n * matching `}` (curly-balanced, string/template aware) and return the\n * index *after* the closing `}`.\n */\nfunction scanCurlyExpr(src: string, from: number): number | null {\n let depth = 1\n let i = from\n let mode = 0\n while (i < src.length) {\n const c = src.charAt(i)\n if (mode === 0) {\n if (c === '/' && src.charAt(i + 1) === '/') {\n const nl = src.indexOf('\\n', i)\n if (nl < 0) return null\n i = nl + 1\n continue\n }\n if (c === '/' && src.charAt(i + 1) === '*') {\n const close = src.indexOf('*/', i + 2)\n if (close < 0) return null\n i = close + 2\n continue\n }\n if (c === \"'\") { mode = 1; i++; continue }\n if (c === '\"') { mode = 2; i++; continue }\n if (c === '`') { mode = 3; i++; continue }\n if (c === '{') { depth++; i++; continue }\n if (c === '}') { depth--; if (depth === 0) return i + 1; i++; continue }\n i++; continue\n }\n if (mode === 1) {\n if (c === '\\\\') { i += 2; continue }\n if (c === \"'\") { mode = 0; i++; continue }\n i++; continue\n }\n if (mode === 2) {\n if (c === '\\\\') { i += 2; continue }\n if (c === '\"') { mode = 0; i++; continue }\n i++; continue\n }\n if (c === '\\\\') { i += 2; continue }\n if (c === '`') { mode = 0; i++; continue }\n if (c === '$' && src.charAt(i + 1) === '{') {\n const sub = scanCurlyExpr(src, i + 2)\n if (sub == null) return null\n i = sub; continue\n }\n i++\n }\n return null\n}\n\n/**\n * Split `src` on top-level commas (not inside parens, brackets, braces,\n * strings, or templates). Returns at least one element.\n *\n * The optional `limit` caps the number of splits; remaining commas are\n * kept inside the final element. Useful when only the first argument\n * of a call needs to be inspected.\n */\nfunction splitTopLevelComma(src: string, limit: number = Number.MAX_SAFE_INTEGER): string[] {\n const out: string[] = []\n let depth = 0\n let mode = 0\n let start = 0\n for (let i = 0; i < src.length; i++) {\n const c = src.charAt(i)\n if (mode === 0) {\n if (c === \"'\") { mode = 1; continue }\n if (c === '\"') { mode = 2; continue }\n if (c === '`') { mode = 3; continue }\n if (c === '(' || c === '[' || c === '{') { depth++; continue }\n if (c === ')' || c === ']' || c === '}') { depth--; continue }\n if (c === ',' && depth === 0 && out.length < limit) {\n out.push(src.slice(start, i))\n start = i + 1\n }\n continue\n }\n if (mode === 1) {\n if (c === '\\\\') { i++; continue }\n if (c === \"'\") mode = 0\n continue\n }\n if (mode === 2) {\n if (c === '\\\\') { i++; continue }\n if (c === '\"') mode = 0\n continue\n }\n if (c === '\\\\') { i++; continue }\n if (c === '`') { mode = 0; continue }\n }\n out.push(src.slice(start))\n return out\n}\n\nfunction countUnbalanced(s: string): number {\n let depth = 0\n let mode = 0\n for (let i = 0; i < s.length; i++) {\n const c = s.charAt(i)\n if (mode === 0) {\n if (c === \"'\") { mode = 1; continue }\n if (c === '\"') { mode = 2; continue }\n if (c === '`') { mode = 3; continue }\n if (c === '(' || c === '[' || c === '{') depth++\n else if (c === ')' || c === ']' || c === '}') depth--\n continue\n }\n if (mode === 1) {\n if (c === '\\\\') { i++; continue }\n if (c === \"'\") mode = 0\n continue\n }\n if (mode === 2) {\n if (c === '\\\\') { i++; continue }\n if (c === '\"') mode = 0\n continue\n }\n if (c === '\\\\') { i++; continue }\n if (c === '`') { mode = 0; continue }\n }\n return depth\n}\n\nfunction resolveSpecifier(\n specifier: string,\n baseDir: string,\n importingFile: string,\n fileMap: Map<string, HtmlFile>,\n pool: BlobUrlPool,\n warnings: string[],\n visited: Set<string>,\n enableShim: boolean,\n): string | null {\n if (isAbsoluteUrl(specifier) || specifier.startsWith('data:') || specifier.startsWith('blob:')) {\n return null\n }\n if (!specifier.startsWith('.') && !specifier.startsWith('/')) {\n warnings.push(\n `ESM bare specifier '${specifier}' in ${importingFile} is not supported; consider bundling`,\n )\n return null\n }\n const resolved = resolveRelative(baseDir, specifier)\n const file = fileMap.get(resolved)\n if (!file) {\n warnings.push(`ESM import '${specifier}' in ${importingFile} not found (resolved: ${resolved})`)\n return null\n }\n\n // Recursively rewrite dependency JS modules so its own imports point at\n // pool URLs before we mint this file's URL.\n if (\n file.content != null &&\n (resolved.endsWith('.js') || resolved.endsWith('.mjs') || resolved.endsWith('.cjs'))\n ) {\n if (!visited.has(resolved)) {\n const rewritten = rewriteEsm({\n jsContent: file.content,\n jsFilePath: resolved,\n fileMap,\n pool,\n warnings,\n visited,\n enableRuntimeShim: enableShim,\n })\n if (rewritten !== file.content) {\n return pool.replace(file, rewritten)\n }\n }\n }\n return pool.get(file)\n}\n","import type { HtmlFile } from '../types.js'\nimport { dirname, resolveRelative, isAbsoluteUrl } from '../util/pathUtils.js'\nimport type { BlobUrlPool } from '../util/blobPool.js'\nimport { rewriteEsm } from './rewriteEsm.js'\n\n/**\n * Inline-mode HTML rewriter.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/02_inline_strategy/01_html_rewrite.md\n *\n * Walks the parsed DOM and rewrites all references that would otherwise hit\n * the network (and fail inside `srcDoc + sandbox=\"allow-scripts\"`):\n * - `<link rel=stylesheet>` → inline `<style>` (CSS is delegated to\n * `onCssContent` so callers can wire `rewriteCss`).\n * - `<script src>` → inline `<script>` (preserving `type=\"module\"`).\n * - `<img|source|video|audio src>` and `srcset` → `blob:` / presigned URL.\n * - `<link rel=\"icon|shortcut icon|manifest\">` → `blob:` / presigned URL.\n * - `<iframe src>` → recursive rewrite into `srcdoc`.\n * - Absolute / `data:` / `blob:` URLs are left untouched.\n * - Missing files yield a `warnings[]` entry; the original DOM node is\n * preserved so the browser surfaces a real 404 in DevTools.\n */\nexport interface RewriteHtmlInput {\n rootHtml: string\n entryName: string\n fileMap: Map<string, HtmlFile>\n onCssContent: (css: string, cssFilePath: string) => string\n inlineFileMaxBytes: number\n blobUrls: string[]\n warnings: string[]\n}\n\nexport function rewriteHtml(input: RewriteHtmlInput): string {\n const { rootHtml, entryName, fileMap, onCssContent, inlineFileMaxBytes, blobUrls, warnings } = input\n const entryDir = dirname(entryName)\n\n let parser: DOMParser\n try {\n parser = new DOMParser()\n } catch {\n warnings.push('DOMParser unavailable; rendering raw HTML')\n return rootHtml\n }\n\n let doc: Document\n try {\n doc = parser.parseFromString(rootHtml, 'text/html')\n } catch (e) {\n warnings.push(`HTML parse failed: ${(e as Error).message}; rendering raw`)\n return rootHtml\n }\n\n // ── 1. <link rel=stylesheet> → <style> ────────────────────────────────\n for (const link of Array.from(doc.querySelectorAll('link[rel~=\"stylesheet\"][href]'))) {\n const href = link.getAttribute('href')!\n if (isAbsoluteUrl(href) || href.startsWith('data:')) continue\n const resolved = resolveRelative(entryDir, href)\n const file = fileMap.get(resolved)\n if (!file) {\n warnings.push(`<link href=\"${href}\"> not found (resolved: ${resolved})`)\n continue\n }\n if (file.content == null) {\n // Text content unavailable (e.g. presigned URL hydration in flight or\n // failed). Best-effort: rewrite the href to the presigned URL so the\n // browser at least attempts a same-origin-policy-compliant load instead\n // of falling through to the parent origin's `/css/...` path.\n if (file.url) {\n link.setAttribute('href', file.url)\n warnings.push(`<link href=\"${href}\"> served from URL (no content): ${resolved}`)\n } else {\n warnings.push(`<link href=\"${href}\"> has no content or URL (resolved: ${resolved})`)\n }\n continue\n }\n const rewrittenCss = onCssContent(file.content, resolved)\n const style = doc.createElement('style')\n const media = link.getAttribute('media')\n if (media) style.setAttribute('media', media)\n style.setAttribute('data-from', resolved)\n style.textContent = rewrittenCss\n link.replaceWith(style)\n }\n\n // ── 2. <script src> → inline <script> ─────────────────────────────────\n for (const script of Array.from(doc.querySelectorAll('script[src]'))) {\n const src = script.getAttribute('src')!\n if (isAbsoluteUrl(src) || src.startsWith('data:')) continue\n const resolved = resolveRelative(entryDir, src)\n const file = fileMap.get(resolved)\n if (!file) {\n warnings.push(`<script src=\"${src}\"> not found (resolved: ${resolved})`)\n continue\n }\n if (file.content == null) {\n if (file.url) {\n script.setAttribute('src', file.url)\n warnings.push(`<script src=\"${src}\"> served from URL (no content): ${resolved}`)\n } else {\n warnings.push(`<script src=\"${src}\"> has no content or URL (resolved: ${resolved})`)\n }\n continue\n }\n const inline = doc.createElement('script')\n const type = script.getAttribute('type')\n if (type) inline.setAttribute('type', type)\n inline.setAttribute('data-from', resolved)\n inline.textContent = file.content ?? ''\n // Note: we ignore the `inlineFileMaxBytes` budget for <script> here. The\n // sandbox=allow-scripts iframe cannot fetch blob: URLs, so falling back to\n // a Blob URL would silently break execution. Mixed-mode escalation happens\n // upstream (auto-detect → blob strategy).\n void inlineFileMaxBytes\n script.replaceWith(inline)\n }\n\n // ── 3. <img|source|video|audio src> ───────────────────────────────────\n for (const el of Array.from(doc.querySelectorAll('img[src],source[src],video[src],audio[src]'))) {\n rewriteAssetUrl(el, 'src', { entryDir, fileMap, blobUrls, warnings })\n }\n\n // ── 4. srcset (img, source) ───────────────────────────────────────────\n for (const el of Array.from(doc.querySelectorAll('img[srcset],source[srcset]'))) {\n const srcset = el.getAttribute('srcset')!\n const newSrcset = srcset\n .split(',')\n .map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return ''\n const idx = trimmed.search(/\\s/)\n const url = idx === -1 ? trimmed : trimmed.slice(0, idx)\n const descriptor = idx === -1 ? '' : trimmed.slice(idx + 1).trim()\n if (!url || isAbsoluteUrl(url) || url.startsWith('data:') || url.startsWith('blob:')) {\n return trimmed\n }\n const resolved = resolveRelative(entryDir, url)\n const file = fileMap.get(resolved)\n if (!file) {\n warnings.push(`srcset entry \"${url}\" not found (resolved: ${resolved})`)\n return trimmed\n }\n const u = file.url ?? createBlobUrl(file, blobUrls)\n return descriptor ? `${u} ${descriptor}` : u\n })\n .filter((p) => p.length > 0)\n .join(', ')\n el.setAttribute('srcset', newSrcset)\n }\n\n // ── 5. <iframe src> → recursive srcdoc ─────────────────────────────────\n for (const iframe of Array.from(doc.querySelectorAll('iframe[src]'))) {\n const src = iframe.getAttribute('src')!\n if (isAbsoluteUrl(src) || src.startsWith('data:')) continue\n const resolved = resolveRelative(entryDir, src)\n const file = fileMap.get(resolved)\n if (!file?.content) {\n warnings.push(`<iframe src=\"${src}\"> not found (resolved: ${resolved})`)\n continue\n }\n const nested = rewriteHtml({\n ...input,\n rootHtml: file.content,\n entryName: resolved,\n })\n iframe.removeAttribute('src')\n iframe.setAttribute('srcdoc', nested)\n }\n\n // ── 6. <link rel=\"icon|shortcut icon|manifest\"> ───────────────────────\n for (const link of Array.from(\n doc.querySelectorAll(\n 'link[rel=\"icon\"][href],link[rel=\"shortcut icon\"][href],link[rel=\"manifest\"][href],link[rel=\"apple-touch-icon\"][href]',\n ),\n )) {\n rewriteAssetUrl(link, 'href', { entryDir, fileMap, blobUrls, warnings })\n }\n\n return '<!doctype html>\\n' + doc.documentElement.outerHTML\n}\n\ninterface AssetCtx {\n entryDir: string\n fileMap: Map<string, HtmlFile>\n blobUrls: string[]\n warnings: string[]\n}\n\nfunction rewriteAssetUrl(el: Element, attr: string, ctx: AssetCtx): void {\n const value = el.getAttribute(attr)\n if (!value) return\n if (isAbsoluteUrl(value) || value.startsWith('data:') || value.startsWith('blob:')) return\n const resolved = resolveRelative(ctx.entryDir, value)\n const file = ctx.fileMap.get(resolved)\n if (!file) {\n ctx.warnings.push(`<${el.tagName.toLowerCase()} ${attr}=\"${value}\"> not found (resolved: ${resolved})`)\n return\n }\n const url = file.url ?? createBlobUrl(file, ctx.blobUrls)\n el.setAttribute(attr, url)\n}\n\nfunction createBlobUrl(file: HtmlFile, sink: string[]): string {\n if (file.url) return file.url\n const type = file.mime ?? 'application/octet-stream'\n const data = file.content ?? ''\n const blob = new Blob([data], { type })\n const url = URL.createObjectURL(blob)\n sink.push(url)\n return url\n}\n\n/**\n * Blob-mode entry HTML rewriter.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/03_blob_strategy/02_iframe_loading.md\n *\n * Differs from the inline-mode `rewriteHtml`:\n * - `<link rel=stylesheet>` keeps the `<link>` element, only `href` is\n * rewritten to a `blob:` URL drawn from the pool.\n * - `<script src>` keeps the `<script>` element; same swap.\n * - `<script type=\"module\">` (no src) bodies are passed through\n * `rewriteEsm` so their relative imports resolve against pool URLs.\n * - Asset rewriting (img/source/video/audio/icon/manifest/iframe) all\n * route through `pool.get` to keep URL ownership in one place.\n */\nexport interface RewriteHtmlToBlobInput {\n rootHtml: string\n entryName: string\n fileMap: Map<string, HtmlFile>\n pool: BlobUrlPool\n warnings: string[]\n /**\n * Forwarded to `rewriteEsm` for inline `<script type=\"module\">` bodies.\n * Defaults to `true`. See CWRF-012.\n */\n enableRuntimeShim?: boolean\n}\n\nexport function rewriteHtmlToBlob(input: RewriteHtmlToBlobInput): string {\n const { rootHtml, entryName, fileMap, pool, warnings } = input\n const enableRuntimeShim = input.enableRuntimeShim !== false\n const entryDir = dirname(entryName)\n\n let parser: DOMParser\n try {\n parser = new DOMParser()\n } catch {\n warnings.push('DOMParser unavailable; rendering raw HTML')\n return rootHtml\n }\n\n let doc: Document\n try {\n doc = parser.parseFromString(rootHtml, 'text/html')\n } catch (e) {\n warnings.push(`HTML parse failed: ${(e as Error).message}; rendering raw`)\n return rootHtml\n }\n\n const swapAttr = (el: Element, attr: string): void => {\n const value = el.getAttribute(attr)\n if (!value) return\n if (isAbsoluteUrl(value) || value.startsWith('data:') || value.startsWith('blob:')) return\n const resolved = resolveRelative(entryDir, value)\n const file = fileMap.get(resolved)\n if (!file) {\n warnings.push(`<${el.tagName.toLowerCase()} ${attr}=\"${value}\"> not found (resolved: ${resolved})`)\n return\n }\n el.setAttribute(attr, pool.get(file))\n }\n\n for (const link of Array.from(doc.querySelectorAll('link[rel~=\"stylesheet\"][href]'))) {\n swapAttr(link, 'href')\n }\n for (const script of Array.from(doc.querySelectorAll('script[src]'))) {\n swapAttr(script, 'src')\n }\n for (const el of Array.from(doc.querySelectorAll('img[src],source[src],video[src],audio[src],iframe[src]'))) {\n swapAttr(el, 'src')\n }\n for (const link of Array.from(\n doc.querySelectorAll(\n 'link[rel=\"icon\"][href],link[rel=\"shortcut icon\"][href],link[rel=\"manifest\"][href],link[rel=\"apple-touch-icon\"][href]',\n ),\n )) {\n swapAttr(link, 'href')\n }\n\n // <img|source srcset>\n for (const el of Array.from(doc.querySelectorAll('img[srcset],source[srcset]'))) {\n const srcset = el.getAttribute('srcset')!\n const newSrcset = srcset\n .split(',')\n .map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return ''\n const idx = trimmed.search(/\\s/)\n const url = idx === -1 ? trimmed : trimmed.slice(0, idx)\n const descriptor = idx === -1 ? '' : trimmed.slice(idx + 1).trim()\n if (!url || isAbsoluteUrl(url) || url.startsWith('data:') || url.startsWith('blob:')) {\n return trimmed\n }\n const resolved = resolveRelative(entryDir, url)\n const file = fileMap.get(resolved)\n if (!file) {\n warnings.push(`srcset entry \"${url}\" not found (resolved: ${resolved})`)\n return trimmed\n }\n const u = pool.get(file)\n return descriptor ? `${u} ${descriptor}` : u\n })\n .filter((p) => p.length > 0)\n .join(', ')\n el.setAttribute('srcset', newSrcset)\n }\n\n // <script type=\"module\"> ... </script> (inline body — rewrite ESM)\n for (const script of Array.from(doc.querySelectorAll('script[type=\"module\"]:not([src])'))) {\n const body = script.textContent\n if (!body) continue\n script.textContent = rewriteEsm({\n jsContent: body,\n jsFilePath: entryName,\n fileMap,\n pool,\n warnings,\n visited: new Set(),\n enableRuntimeShim,\n })\n }\n\n return '<!doctype html>\\n' + doc.documentElement.outerHTML\n}\n","import type { HtmlFile } from '../types.js'\nimport { dirname, resolveRelative, isAbsoluteUrl } from '../util/pathUtils.js'\n\n/**\n * Rewrite all `@import` and `url(...)` references inside one CSS text so it\n * loads correctly inside a sandboxed iframe.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/02_inline_strategy/02_css_rewrite.md\n *\n * Modes:\n * - `'inline'`: recursively inline `@import` targets; rewrite `url(...)`\n * binary references to Blob URLs / presigned URLs.\n * - `'blob'`: keep `@import` directives but rewrite their targets to\n * Blob URLs; same `url(...)` rewriting.\n *\n * Resilience:\n * - Missing files are recorded in `warnings`; the original directive is\n * preserved so the browser surfaces a real 404 in DevTools.\n * - `@import` cycles are detected via the `visited` set (per-call\n * scope); a warning is emitted and the cyclic body is replaced by ''.\n */\nexport interface RewriteCssInput {\n css: string\n cssFilePath: string\n fileMap: Map<string, HtmlFile>\n mode: 'inline' | 'blob'\n inlineFileMaxBytes: number\n blobUrls: string[]\n warnings: string[]\n}\n\nexport function rewriteCss(input: RewriteCssInput): string {\n return rewriteOnce(input, new Set([input.cssFilePath]))\n}\n\nfunction rewriteOnce(input: RewriteCssInput, visited: Set<string>): string {\n const cssDir = dirname(input.cssFilePath)\n let out = input.css\n\n // ── 1. @import directives ────────────────────────────────────────────────\n // Matches:\n // @import \"x.css\";\n // @import 'x.css';\n // @import url(\"x.css\");\n // @import url(x.css);\n // @import \"x.css\" screen and (min-width: 600px);\n out = out.replace(\n /@import\\s+(?:url\\(\\s*)?(['\"]?)([^'\")]+)\\1\\s*\\)?\\s*([^;]*);?/gi,\n (match, _quote, urlRaw, mediaQuery) => {\n const url = (urlRaw as string).trim()\n if (isAbsoluteUrl(url) || url.startsWith('data:')) return match\n const resolved = resolveRelative(cssDir, url)\n const file = input.fileMap.get(resolved)\n if (!file?.content && !file?.url) {\n input.warnings.push(`CSS @import \"${url}\" not found in ${input.cssFilePath} (resolved: ${resolved})`)\n return match\n }\n if (visited.has(resolved)) {\n input.warnings.push(`CSS @import cycle detected at ${resolved}`)\n return ''\n }\n\n const tooLarge = (file.content?.length ?? 0) > input.inlineFileMaxBytes\n if (input.mode === 'blob' || tooLarge || !file.content) {\n const u2 = file.url ?? createBlobUrl(file, input.blobUrls)\n const mq = (mediaQuery as string).trim()\n return mq ? `@import url(\"${u2}\") ${mq};` : `@import url(\"${u2}\");`\n }\n\n // inline mode + within budget → recurse\n const childVisited = new Set(visited)\n childVisited.add(resolved)\n const recursive = rewriteOnce(\n { ...input, css: file.content, cssFilePath: resolved },\n childVisited,\n )\n const mq = (mediaQuery as string).trim()\n return mq ? `@media ${mq} { ${recursive} }` : recursive\n },\n )\n\n // ── 2. url(...) asset references ─────────────────────────────────────────\n out = out.replace(\n /url\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/gi,\n (match, _quote, urlRaw) => {\n const url = (urlRaw as string).trim()\n if (isAbsoluteUrl(url) || url.startsWith('data:') || url.startsWith('blob:')) return match\n if (url.startsWith('#')) return match\n const resolved = resolveRelative(cssDir, url)\n const file = input.fileMap.get(resolved)\n if (!file) {\n input.warnings.push(`CSS url(\"${url}\") not found in ${input.cssFilePath} (resolved: ${resolved})`)\n return match\n }\n const u = file.url ?? createBlobUrl(file, input.blobUrls)\n return `url(\"${u}\")`\n },\n )\n\n return out\n}\n\nfunction createBlobUrl(file: HtmlFile, sink: string[]): string {\n if (file.url) return file.url\n const blob = new Blob([file.content ?? ''], { type: file.mime ?? 'application/octet-stream' })\n const url = URL.createObjectURL(blob)\n sink.push(url)\n return url\n}\n","import type { HtmlFile } from '../types.js'\nimport { rewriteHtml } from '../rewrite/rewriteHtml.js'\nimport { rewriteCss } from '../rewrite/rewriteCss.js'\n\n/**\n * Inline rendering strategy.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/02_inline_strategy/01_html_rewrite.md\n *\n * Composes `rewriteHtml` (entry HTML walker) and `rewriteCss` (per-stylesheet\n * walker) so the resulting HTML is fully self-contained and can be rendered\n * with `iframe srcDoc` + `sandbox=\"allow-scripts\"`.\n *\n * Caller is responsible for revoking every URL listed in `output.blobUrls`\n * once the iframe is unmounted (see `BlobUrlPool`).\n */\nexport interface InlineStrategyInput {\n rootHtml: string\n entryName: string\n files: HtmlFile[]\n inlineFileMaxBytes: number\n}\n\nexport interface InlineStrategyOutput {\n html: string\n blobUrls: string[]\n warnings: string[]\n}\n\nexport function applyInlineStrategy(input: InlineStrategyInput): InlineStrategyOutput {\n const blobUrls: string[] = []\n const warnings: string[] = []\n\n const fileMap = new Map<string, HtmlFile>(input.files.map((f) => [f.name, f]))\n\n const html = rewriteHtml({\n rootHtml: input.rootHtml,\n entryName: input.entryName,\n fileMap,\n onCssContent: (cssText, cssFilePath) =>\n rewriteCss({\n css: cssText,\n cssFilePath,\n fileMap,\n mode: 'inline',\n inlineFileMaxBytes: input.inlineFileMaxBytes,\n blobUrls,\n warnings,\n }),\n inlineFileMaxBytes: input.inlineFileMaxBytes,\n blobUrls,\n warnings,\n })\n\n return { html, blobUrls, warnings }\n}\n","import type { HtmlFile } from '../types.js'\n\n/**\n * Centralized owner of every Blob URL created for a single HTML project\n * preview. Guarantees:\n * 1. Idempotent `get(file)` — same `file.name` always returns the\n * same URL within the pool's lifetime.\n * 2. `dispose()` revokes every URL exactly once and renders the pool\n * unusable (subsequent `get` / `replace` throw).\n * 3. Files with a presigned `url` are returned verbatim and NEVER\n * enter the pool (saves memory; lets the browser fetch from CDN).\n *\n * Lifecycle pattern (see CWRF-011 §03_blob_strategy/01_blob_pool §1.2):\n * useEffect(() => {\n * const pool = new BlobUrlPool()\n * return () => pool.dispose()\n * }, [files, strategy])\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/03_blob_strategy/01_blob_pool.md\n */\nexport class BlobUrlPool {\n private urls = new Map<string, string>()\n private byteCount = 0\n private disposed = false\n\n /**\n * Retrieve or lazily create a URL for the given file.\n * @throws Error if the pool has already been disposed.\n */\n get(file: HtmlFile): string {\n if (this.disposed) {\n throw new Error('[BlobUrlPool] cannot get from disposed pool')\n }\n if (file.url) return file.url\n const cached = this.urls.get(file.name)\n if (cached) return cached\n const content = file.content ?? ''\n const type = file.mime ?? 'application/octet-stream'\n const blob = new Blob([content], { type })\n const url = URL.createObjectURL(blob)\n this.urls.set(file.name, url)\n this.byteCount += content.length\n return url\n }\n\n /**\n * Replace the contents of an already-pooled file: the prior URL is\n * revoked synchronously and a new one is minted.\n *\n * Used by ESM rewriting which needs to swap module bodies after they\n * have been seen by the rewriter.\n */\n replace(file: HtmlFile, newContent: string): string {\n if (this.disposed) {\n throw new Error('[BlobUrlPool] cannot replace on disposed pool')\n }\n const old = this.urls.get(file.name)\n if (old) {\n URL.revokeObjectURL(old)\n this.urls.delete(file.name)\n this.byteCount -= file.content?.length ?? 0\n }\n return this.get({ ...file, content: newContent, url: undefined })\n }\n\n /** Sum of bytes for blobs created by this pool (excludes presigned passthrough). */\n size(): number {\n return this.byteCount\n }\n\n /** Number of pooled blob URLs (excludes presigned passthrough). */\n count(): number {\n return this.urls.size\n }\n\n /** Idempotent revoke-all + clear. Subsequent `get`/`replace` throw. */\n dispose(): void {\n if (this.disposed) return\n for (const url of this.urls.values()) {\n URL.revokeObjectURL(url)\n }\n this.urls.clear()\n this.byteCount = 0\n this.disposed = true\n }\n}\n","/**\n * Bridge scripts injected into the rendered HTML so the iframe can communicate\n * selection / link / xref events back to the parent window via `postMessage`.\n *\n * These scripts are byte-identical to the inline strings used by the legacy\n * `HtmlViewer.tsx` prior to CWRF-011 — extracted so they can be reused by\n * single-file, inline-strategy, and blob-strategy renderers without drift.\n *\n * Invariants (do not break without updating message handler in\n * `HtmlViewer/index.tsx`):\n * - `ycw-iframe-selection` payload: `{ type, text: string|null, rect? }`\n * - `ycw-iframe-link` payload: `{ type, href: string }`\n * - `ycw-iframe-xref` payload: `{ type, idx: number }`\n * - All messages are sent to `window.parent` with `'*'` target origin\n * (the parent verifies `event.source === iframe.contentWindow`).\n */\n\nexport const SELECTION_BRIDGE_SCRIPT = `<script>\n(function(){\n var _t;\n document.addEventListener('selectionchange',function(){\n clearTimeout(_t);\n _t=setTimeout(function(){\n var s=window.getSelection();\n if(!s||s.isCollapsed||!s.toString().trim()){\n window.parent.postMessage({type:'ycw-iframe-selection',text:null},'*');\n return;\n }\n var r=s.getRangeAt(0).getBoundingClientRect();\n window.parent.postMessage({type:'ycw-iframe-selection',text:s.toString().trim(),\n rect:{top:r.top,left:r.left,width:r.width,height:r.height,bottom:r.bottom,right:r.right}},'*');\n },100);\n });\n})();\n</script>`\n\nexport const LINK_BRIDGE_SCRIPT = `<script>\n(function(){\n document.addEventListener('click',function(e){\n var a=e.target.closest('a');\n if(!a||!a.href)return;\n e.preventDefault();\n window.parent.postMessage({type:'ycw-iframe-link',href:a.getAttribute('href')||a.href},'*');\n });\n document.addEventListener('click',function(e){\n var chip=e.target.closest('[data-xref-idx]');\n if(!chip)return;\n e.preventDefault();\n window.parent.postMessage({type:'ycw-iframe-xref',idx:parseInt(chip.dataset.xrefIdx,10)},'*');\n });\n})();\n</script>`\n\n/**\n * Concatenated bridge string used by inline / single-file paths that append\n * the scripts to the end of the `srcDoc` HTML.\n */\nexport const BRIDGE_SCRIPTS = SELECTION_BRIDGE_SCRIPT + LINK_BRIDGE_SCRIPT\n\n/**\n * Plain `<script>` body (no `<script>` tag) used by blob-strategy DOM injection\n * — built from the bridge IIFEs above so we can `appendChild` a fresh script\n * element after parsing the entry HTML.\n */\nexport const BRIDGE_SCRIPT_BODY = BRIDGE_SCRIPTS\n .replace(/^<script>/g, '')\n .replace(/<\\/script>$/g, '')\n .replace(/<\\/script><script>/g, '\\n')\n","import type { HtmlFile } from '../types.js'\n\n/**\n * Runtime ESM/asset resolution shim injected into the blob-strategy iframe.\n *\n * Spec: docs/proposals/CWRF-012-runtime-esm-shim/01_shim_contract.md\n *\n * Why this exists:\n * - `applyBlobStrategy` rewrites *literal* `import './x.js'` specifiers to\n * blob URLs at build time, but cannot resolve runtime-evaluated forms\n * such as ``import(`../games/${name}`)`` or `fetch('./data.json')` —\n * blob URLs have no directory hierarchy.\n * - This shim closes the gap by exposing a synchronous resolver that\n * looks up *logical project paths* in a registry minted alongside the\n * blob pool, returning the matching blob URL at call time.\n *\n * Contract:\n * - The shim is a *classic* (non-module) `<script>`. It must execute\n * before any user `<script type=\"module\">` runs. Because module\n * scripts are deferred until parsing completes, even appending the\n * shim near the end of `<body>` is sufficient — but the convention\n * is to inject at the very top of `<head>` (right after `<base>`).\n * - Globals defined on `window`:\n * __YCW_FS__ : Record<projectPath, blobUrl>\n * __YCW_RESOLVE__ : (spec, importerPath?) => string\n * __YCW_PATCHED__ : true once monkey-patches are installed\n * (PR-2) Original `fetch` and `Worker` are wrapped so relative\n * URLs resolve against the entry directory.\n * - The resolver MUST be idempotent for already-resolved URLs (blob:,\n * data:, http:, https:, protocol-relative). Bare specifiers emit a\n * console warning and pass through unchanged.\n *\n * Security:\n * - Runs inside `sandbox=\"allow-scripts allow-same-origin\"` already\n * widened by blob strategy. No additional capability granted.\n * - The script body is built with controlled JSON serialisation only;\n * no untrusted concatenation into JS source.\n */\nexport interface BuildShimInput {\n /** Map of every project file's logical path → its blob URL (or presigned URL). */\n registry: Record<string, string>\n /** Directory of the entry HTML, used as default base for fetch/Worker calls without an importer context. */\n entryDir: string\n /**\n * When `false`, only emit `__YCW_FS__` + `__YCW_RESOLVE__` and skip\n * `fetch` / `Worker` monkey-patches (PR-2). Defaults to `true`.\n */\n patchGlobals?: boolean\n}\n\nexport function buildRuntimeShimScript(input: BuildShimInput): string {\n const fsJson = JSON.stringify(input.registry)\n const entryDirJson = JSON.stringify(input.entryDir ?? '')\n const patchGlobals = input.patchGlobals !== false\n const body = `\n;(function(){\n if (typeof window === 'undefined') return;\n if (window.__YCW_PATCHED__) return;\n var FS = window.__YCW_FS__ = ${fsJson};\n var ENTRY_DIR = ${entryDirJson};\n\n function dirname(p){ var i=p.lastIndexOf('/'); return i<0 ? '' : p.slice(0,i); }\n function normalize(p){\n var parts = String(p).split('/');\n var stack = [];\n for (var i=0;i<parts.length;i++){\n var s = parts[i];\n if (s === '' || s === '.') continue;\n if (s === '..') { if (stack.length) stack.pop(); }\n else stack.push(s);\n }\n return stack.join('/');\n }\n function resolveRelative(baseDir, ref){\n var qIdx = ref.search(/[?#]/);\n var clean = qIdx >= 0 ? ref.slice(0, qIdx) : ref;\n if (clean.charAt(0) === '/') return normalize(clean.slice(1));\n return normalize((baseDir ? baseDir + '/' : '') + clean);\n }\n function tryLookup(p){\n if (FS[p]) return FS[p];\n var exts = ['.js','.mjs','.cjs','.json'];\n for (var i=0;i<exts.length;i++){ if (FS[p + exts[i]]) return FS[p + exts[i]]; }\n var idx = ['/index.js','/index.mjs','/index.cjs'];\n for (var j=0;j<idx.length;j++){ if (FS[p + idx[j]]) return FS[p + idx[j]]; }\n return null;\n }\n function resolveAgainst(spec, baseDir){\n if (spec == null) return spec;\n var s = String(spec);\n if (/^(?:[a-z][a-z0-9+\\\\-.]*:|\\\\/\\\\/)/i.test(s)) return s;\n if (s.charAt(0) !== '.' && s.charAt(0) !== '/') {\n try { console.warn('[ycw-shim] bare specifier not supported:', s); } catch (e) {}\n return s;\n }\n var resolved = resolveRelative(baseDir == null ? ENTRY_DIR : baseDir, s);\n var url = tryLookup(resolved);\n if (url) return url;\n try { console.warn('[ycw-shim] cannot resolve', s, 'against', baseDir, '→', resolved); } catch (e) {}\n return s;\n }\n window.__YCW_RESOLVE__ = function(spec, importerPath){\n var base = importerPath != null ? dirname(String(importerPath)) : ENTRY_DIR;\n return resolveAgainst(spec, base);\n };\n\n${\n patchGlobals\n ? ` // PR-2: monkey-patch fetch — only when arg is a plain relative URL.\n try {\n var _fetch = window.fetch;\n if (typeof _fetch === 'function') {\n window.fetch = function(input, init){\n try {\n if (typeof input === 'string' && (input.charAt(0) === '.' || (input.charAt(0) === '/' && input.charAt(1) !== '/'))) {\n input = resolveAgainst(input, ENTRY_DIR);\n }\n } catch (e) {}\n return _fetch.call(this, input, init);\n };\n }\n } catch (e) {}\n\n // PR-2: monkey-patch Worker — wrap relative URL strings only.\n try {\n var _Worker = window.Worker;\n if (typeof _Worker === 'function') {\n var Wrapped = function(url, opts){\n try {\n if (typeof url === 'string' && (url.charAt(0) === '.' || (url.charAt(0) === '/' && url.charAt(1) !== '/'))) {\n url = resolveAgainst(url, ENTRY_DIR);\n }\n } catch (e) {}\n return new _Worker(url, opts);\n };\n Wrapped.prototype = _Worker.prototype;\n window.Worker = Wrapped;\n }\n } catch (e) {}\n`\n : ''\n}\n window.__YCW_PATCHED__ = true;\n})();\n`\n return `<script data-ycw-shim=\"1\">${body}</script>`\n}\n\n/**\n * Build the `__YCW_FS__` registry from the resolved file map, mapping\n * every text/asset file's logical path to its blob URL (or passthrough\n * URL when present). The entry HTML is intentionally omitted: the\n * iframe's own `src` already points at the entry blob, and including\n * it would let user code accidentally re-import the entry document.\n */\nexport function buildShimRegistry(\n files: HtmlFile[],\n fileMap: Map<string, HtmlFile>,\n resolveUrl: (file: HtmlFile) => string | null,\n entryName: string,\n): Record<string, string> {\n const registry: Record<string, string> = {}\n for (const f of files) {\n if (f.name === entryName) continue\n const cur = fileMap.get(f.name) ?? f\n if (cur.url) {\n registry[f.name] = cur.url\n continue\n }\n if (cur.content == null) continue\n const url = resolveUrl(cur)\n if (url) registry[f.name] = url\n }\n return registry\n}\n","import type { HtmlFile } from '../types.js'\nimport { BlobUrlPool } from '../util/blobPool.js'\nimport { rewriteCss } from '../rewrite/rewriteCss.js'\nimport { rewriteEsm } from '../rewrite/rewriteEsm.js'\nimport { rewriteHtmlToBlob } from '../rewrite/rewriteHtml.js'\nimport { BRIDGE_SCRIPTS } from '../bridge/scripts.js'\nimport { buildRuntimeShimScript, buildShimRegistry } from '../runtime/shim.js'\nimport { dirname } from '../util/pathUtils.js'\n\n/**\n * Blob rendering strategy.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/03_blob_strategy/02_iframe_loading.md\n * docs/proposals/CWRF-012-runtime-esm-shim/03_blob_integration.md\n *\n * Pipeline:\n * 1. Pre-rewrite every CSS body so `@import` / `url()` references point\n * at pool URLs (deps must be in the pool *before* dependents are\n * themselves added).\n * 2. Pre-rewrite every JS module body via `rewriteEsm` so relative\n * specifiers resolve once each module URL is minted, and runtime\n * forms are wrapped with the `__YCW_RESOLVE__` shim (CWRF-012).\n * 3. Mint pool URLs for any non-import-graph asset that still has\n * content but no presigned URL.\n * 4. Rewrite the entry HTML — keep `<link>`, `<script>`, `<img>` etc.\n * elements but swap their `href` / `src` to pool URLs.\n * 5. Build the runtime shim registry and prepend a classic `<script>`\n * tag at the top of the entry document so the resolver is live\n * before any deferred `<script type=\"module\">` runs.\n * 6. Append the bridge scripts that postMessage selection / link / xref\n * events back to the parent window.\n * 7. Mint the entry HTML's own Blob URL — that's what `iframe.src` uses.\n *\n * Sandbox is widened to `allow-scripts allow-same-origin` so that:\n * - ESM imports can fetch sibling Blob URLs (same-origin requirement).\n * - `fetch('./data.json')` succeeds.\n * - `new Worker(...)` can load module bodies.\n *\n * Caller MUST call `output.pool.dispose()` on unmount; the pool owns every\n * `URL.createObjectURL` allocation and `dispose()` is the only path that\n * revokes them.\n */\nexport interface BlobStrategyInput {\n rootHtml: string\n entryName: string\n files: HtmlFile[]\n /**\n * When `false`, skip the runtime shim injection (CWRF-012). Defaults\n * to `true`. The corresponding `enableRuntimeShim` flag is also\n * propagated into `rewriteEsm` so dynamic-form rewrites are likewise\n * disabled, restoring the strict CWRF-011 behaviour.\n */\n runtimeShim?: boolean\n}\n\nexport interface BlobStrategyOutput {\n rootUrl: string\n pool: BlobUrlPool\n sandbox: string\n warnings: string[]\n}\n\nexport function applyBlobStrategy(input: BlobStrategyInput): BlobStrategyOutput {\n const pool = new BlobUrlPool()\n const warnings: string[] = []\n const enableShim = input.runtimeShim !== false\n\n // Initial mutable map — we replace entries as we pre-rewrite.\n const fileMap = new Map<string, HtmlFile>(input.files.map((f) => [f.name, f]))\n\n // 1) CSS pre-rewrite.\n for (const file of input.files) {\n if (file.name === input.entryName) continue\n if (!file.content) continue\n if (!file.name.toLowerCase().endsWith('.css')) continue\n const newCss = rewriteCss({\n css: file.content,\n cssFilePath: file.name,\n fileMap,\n mode: 'blob',\n inlineFileMaxBytes: Number.MAX_SAFE_INTEGER,\n blobUrls: [],\n warnings,\n })\n fileMap.set(file.name, { ...file, content: newCss })\n }\n\n // 2) ESM pre-rewrite (module JS files only). `rewriteEsm` uses pool.replace\n // when it touches a dep's body, but we still walk top-level here so files\n // that nobody imports also reach the pool.\n const visited = new Set<string>()\n for (const file of input.files) {\n if (file.name === input.entryName) continue\n if (!file.content) continue\n const lower = file.name.toLowerCase()\n if (!lower.endsWith('.js') && !lower.endsWith('.mjs') && !lower.endsWith('.cjs')) continue\n if (visited.has(file.name)) continue\n const current = fileMap.get(file.name) ?? file\n const rewritten = rewriteEsm({\n jsContent: current.content ?? '',\n jsFilePath: file.name,\n fileMap,\n pool,\n warnings,\n visited,\n enableRuntimeShim: enableShim,\n })\n if (rewritten !== current.content) {\n fileMap.set(file.name, { ...current, content: rewritten })\n }\n }\n\n // 3) Mint pool URLs for every CSS file that didn't enter the pool via\n // import chains, plus every other non-entry asset that has content but\n // no presigned URL. This ensures stylesheets referenced only from the\n // entry HTML still get a Blob URL.\n for (const file of input.files) {\n if (file.name === input.entryName) continue\n const cur = fileMap.get(file.name) ?? file\n if (cur.url) continue\n if (cur.content == null) continue\n pool.get(cur)\n }\n\n // 4) Rewrite the entry HTML.\n const rewrittenRoot = rewriteHtmlToBlob({\n rootHtml: input.rootHtml,\n entryName: input.entryName,\n fileMap,\n pool,\n warnings,\n enableRuntimeShim: enableShim,\n })\n\n // 5) Build runtime shim and prepend it at the top of the entry doc.\n let withShim = rewrittenRoot\n if (enableShim) {\n const registry = buildShimRegistry(input.files, fileMap, (f) => pool.get(f), input.entryName)\n const shim = buildRuntimeShimScript({\n registry,\n entryDir: dirname(input.entryName),\n patchGlobals: true,\n })\n withShim = injectShimAtTop(rewrittenRoot, shim)\n }\n\n // 6) Append bridge scripts.\n const final = withShim + BRIDGE_SCRIPTS\n\n // 7) Pool the entry itself last so `rootUrl` exists.\n const entryFile: HtmlFile = {\n name: input.entryName,\n content: final,\n mime: 'text/html',\n }\n const rootUrl = pool.get(entryFile)\n\n return {\n rootUrl,\n pool,\n sandbox: 'allow-scripts allow-same-origin',\n warnings,\n }\n}\n\n/**\n * Insert the shim `<script>` at the earliest possible spot so it runs\n * before any user `<script type=\"module\">` is queued. Insertion priority:\n * 1. Right after `<head>` opening tag.\n * 2. Right after `<base>` (so `<base>` still wins on resolution).\n * 3. Right after `<html>` opening tag (synthesises a `<head>`).\n * 4. Prepend to the document.\n *\n * Note: even module scripts are deferred until parsing completes, so the\n * shim only needs to appear *somewhere* before `</html>`. Top-of-head is\n * picked for clarity and to make it easy to grep in DevTools.\n */\nfunction injectShimAtTop(html: string, shim: string): string {\n // After <base> if present.\n const base = html.match(/<base\\b[^>]*>/i)\n if (base) {\n const idx = base.index! + base[0].length\n return html.slice(0, idx) + shim + html.slice(idx)\n }\n const headOpen = html.match(/<head\\b[^>]*>/i)\n if (headOpen) {\n const idx = headOpen.index! + headOpen[0].length\n return html.slice(0, idx) + shim + html.slice(idx)\n }\n const htmlOpen = html.match(/<html\\b[^>]*>/i)\n if (htmlOpen) {\n const idx = htmlOpen.index! + htmlOpen[0].length\n return html.slice(0, idx) + '<head>' + shim + '</head>' + html.slice(idx)\n }\n return shim + html\n}\n","import type { HtmlFile, HtmlProjectStrategy } from '../types.js'\n\n/**\n * Heuristic strategy detection.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/04_strategy_detection/01_auto_detect.md\n *\n * The function scans the entry HTML and every HTML/JS file in the project\n * for cheap-to-detect features (regex only — no AST). It returns the\n * recommended strategy plus a list of *hard reasons* for upgrading to\n * `'blob'`. `chooseStrategy` is the policy layer that turns the detection\n * result into a final decision, taking the caller-supplied override into\n * account.\n *\n * Default bias is towards `'inline'` because that strategy uses the more\n * restrictive sandbox (`allow-scripts` only — no `allow-same-origin`).\n */\nexport type DetectedFeature =\n | 'esm-script-module'\n | 'esm-import-static'\n | 'esm-import-dynamic'\n | 'esm-import-template'\n | 'esm-bare-specifier'\n | 'fetch-relative'\n | 'xmlhttprequest'\n | 'worker'\n | 'service-worker'\n | 'web-component'\n | 'dynamic-script-injection'\n | 'import-meta-url'\n\nexport interface DetectionResult {\n strategy: 'inline' | 'blob'\n features: DetectedFeature[]\n hardReasons: string[]\n}\n\nconst SCANNABLE_EXT = /\\.(?:m?js|cjs|html?|)$/i\nfunction isScannable(name: string): boolean {\n const lower = name.toLowerCase()\n return (\n lower.endsWith('.js') ||\n lower.endsWith('.mjs') ||\n lower.endsWith('.cjs') ||\n lower.endsWith('.html') ||\n lower.endsWith('.htm')\n )\n}\nvoid SCANNABLE_EXT\n\nexport function detectHtmlProjectFeatures(\n rootHtml: string,\n files: HtmlFile[],\n): DetectionResult {\n const features = new Set<DetectedFeature>()\n\n if (/<script\\b[^>]*\\btype\\s*=\\s*[\"']module[\"']/i.test(rootHtml)) {\n features.add('esm-script-module')\n }\n scanJsLike(rootHtml, features)\n\n for (const f of files) {\n if (!f.content) continue\n if (!isScannable(f.name)) continue\n scanJsLike(f.content, features)\n }\n\n const hardReasons: string[] = []\n let strategy: 'inline' | 'blob' = 'inline'\n\n if (\n features.has('esm-script-module') ||\n features.has('esm-import-static') ||\n features.has('esm-import-dynamic') ||\n features.has('esm-import-template')\n ) {\n strategy = 'blob'\n hardReasons.push('ES Modules detected; inline mode cannot resolve relative imports')\n }\n if (features.has('import-meta-url')) {\n strategy = 'blob'\n hardReasons.push('import.meta.url detected; only blob strategy can rewrite for runtime resolution')\n }\n if (features.has('fetch-relative')) {\n strategy = 'blob'\n hardReasons.push('fetch() with relative URL detected; inline mode iframe is opaque-origin')\n }\n if (features.has('xmlhttprequest')) {\n strategy = 'blob'\n hardReasons.push('XMLHttpRequest detected; same-origin required')\n }\n if (features.has('worker')) {\n strategy = 'blob'\n hardReasons.push('Web Worker detected; needs same-origin URL')\n }\n if (features.has('dynamic-script-injection')) {\n strategy = 'blob'\n hardReasons.push('dynamic script injection detected; relative paths require same-origin')\n }\n\n return {\n strategy,\n features: Array.from(features),\n hardReasons,\n }\n}\n\nfunction scanJsLike(text: string, features: Set<DetectedFeature>): void {\n // import 'x' / import x from 'x' / import { y } from 'x' / import * as ns from 'x'\n const importRe = /(?:^|[\\s;{(])import\\s+(?:[\\w*\\s{},]+\\s+from\\s+)?['\"]([^'\"]+)['\"]/g\n for (const m of text.matchAll(importRe)) {\n const spec = m[1]!\n classifySpecifier(spec, features)\n }\n\n // export ... from 'x'\n const exportRe = /(?:^|[\\s;{(])export\\s+(?:\\*|\\{[^}]+\\})\\s+from\\s+['\"]([^'\"]+)['\"]/g\n for (const m of text.matchAll(exportRe)) {\n classifySpecifier(m[1]!, features)\n }\n\n // import('x') (avoid `.import(` chaining like xml.import('y'))\n if (/(?:^|[^.\\w])import\\s*\\(/.test(text)) features.add('esm-import-dynamic')\n\n // Template-literal / variable dynamic import: `import(\\`...${x}...\\`)` or `import(name)`\n // Heuristic: `import(` followed by a non-quote, non-whitespace character.\n if (/(?:^|[^.\\w])import\\s*\\(\\s*(?!['\"])/.test(text)) {\n features.add('esm-import-template')\n }\n\n // new URL(spec, import.meta.url) — common asset-path idiom that needs the shim.\n if (/\\bimport\\s*\\.\\s*meta\\s*\\.\\s*url\\b/.test(text)) {\n features.add('import-meta-url')\n }\n\n // fetch('./...')\n for (const m of text.matchAll(/\\bfetch\\s*\\(\\s*['\"]([^'\"]+)['\"]/g)) {\n const url = m[1]!\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//') || url.startsWith('data:')) {\n continue\n }\n features.add('fetch-relative')\n }\n\n if (/\\bnew\\s+XMLHttpRequest\\b/.test(text)) features.add('xmlhttprequest')\n if (/\\bnew\\s+Worker\\s*\\(/.test(text)) features.add('worker')\n if (/\\bnavigator\\s*\\.\\s*serviceWorker\\b/.test(text)) features.add('service-worker')\n if (/\\bcustomElements\\s*\\.\\s*define\\b/.test(text)) features.add('web-component')\n if (/document\\s*\\.\\s*createElement\\s*\\(\\s*['\"]script['\"]/.test(text)) {\n features.add('dynamic-script-injection')\n }\n}\n\nfunction classifySpecifier(spec: string, features: Set<DetectedFeature>): void {\n if (spec.startsWith('.') || spec.startsWith('/')) {\n features.add('esm-import-static')\n } else if (/^https?:|^\\/\\//.test(spec)) {\n // Absolute remote import — neither static nor bare; allowed in any strategy.\n } else {\n features.add('esm-bare-specifier')\n }\n}\n\n/**\n * Apply the caller's strategy override on top of detection.\n *\n * - `'auto'` → use detection.strategy verbatim.\n * - `'blob'` → force blob, never warn (caller knows what they want).\n * - `'inline'`→ force inline, but warn when detection lists hard reasons\n * (ESM/fetch/etc.) so dev tools surface the likely breakage.\n */\nexport function chooseStrategy(\n forced: HtmlProjectStrategy,\n rootHtml: string,\n files: HtmlFile[],\n): { strategy: 'inline' | 'blob'; detection: DetectionResult } {\n const detection = detectHtmlProjectFeatures(rootHtml, files)\n if (forced === 'inline') {\n if (detection.hardReasons.length > 0) {\n console.warn(\n '[HtmlViewer] forced strategy=inline but hardReasons exist:',\n detection.hardReasons,\n )\n }\n return { strategy: 'inline', detection }\n }\n if (forced === 'blob') return { strategy: 'blob', detection }\n return { strategy: detection.strategy, detection }\n}\n","/**\n * `srcDoc`-iframe base-URL safety net.\n *\n * Default behaviour of `<iframe srcdoc>` resolves *every* relative URL —\n * including author-broken paths like `/css/reset.css` — against the parent\n * page's origin. With our chat-widget hosted on `http://localhost:5180`\n * this leaks 404 / CORS noise into the parent console and surfaces failed\n * requests in the parent network tab.\n *\n * To neutralise that leakage we inject `<base href=\"about:srcdoc\">` at the\n * very top of `<head>` whenever the author HTML does not already declare a\n * `<base>`. The chosen base is intentionally non-fetchable; absolute URLs\n * (`https://…`, `data:`, `blob:`) keep working unchanged because they are\n * URLs in their own right and ignore the document base.\n *\n * Spec: docs/proposals/CWRF-011-html-project-viewer/02_inline_strategy/01_html_rewrite.md#base-injection\n */\n\nconst BASE_TAG = '<base href=\"about:srcdoc\">'\n\n/**\n * Insert `<base href=\"about:srcdoc\">` if and only if the HTML does not\n * already define a `<base>` element. Operates purely on the source text\n * (no DOMParser) to avoid double-parsing the entry HTML on every render.\n *\n * Insertion priority:\n * 1. Right after `<head>` opening tag.\n * 2. Right after `<html>` opening tag (synthesises a `<head>`).\n * 3. Prepend to the document.\n */\nexport function ensureSandboxBase(html: string): string {\n if (/<base\\b[^>]*>/i.test(html)) return html\n\n const headOpen = html.match(/<head\\b[^>]*>/i)\n if (headOpen) {\n const idx = headOpen.index! + headOpen[0].length\n return html.slice(0, idx) + BASE_TAG + html.slice(idx)\n }\n\n const htmlOpen = html.match(/<html\\b[^>]*>/i)\n if (htmlOpen) {\n const idx = htmlOpen.index! + htmlOpen[0].length\n return html.slice(0, idx) + '<head>' + BASE_TAG + '</head>' + html.slice(idx)\n }\n\n return BASE_TAG + html\n}\n","/**\n * CWRF-013 Phase 1 PR-P1-#5 — JrSlot synthetic slot wrapper component.\n *\n * Renderer-side named-slot dispatch in chat-widget is implemented as a\n * spec-level transform (see `migrator/transforms/legacy-slots-named-children.ts`).\n * The transform turns:\n *\n * { type: 'AppChrome', namedChildren: { header: [a], default: [b], footer: [c] } }\n *\n * into a positional spec the upstream Renderer already understands:\n *\n * { type: 'AppChrome', children: ['root__slot__header', 'root__slot__default', 'root__slot__footer'] }\n *\n * …plus three synthetic `JrSlot` elements, one per declared slot, whose\n * `children` are the original slot payload keys.\n *\n * Visually `JrSlot` is a transparent wrapper — it renders a `<div>` with\n * `data-jr-slot` + `.jr-slot--{name}` so:\n * - parent components can pick out a particular slot via a DOM query\n * (e.g. Phase 3 AppChrome will query `[data-jr-slot=\"header\"]`),\n * - CSS can position the three primary slots (header / default / footer)\n * via the supplied default stylesheet (see `JrSlot.css`),\n * - existing 38 + 36 = 74 catalog components that do NOT use\n * `namedChildren` are completely unaffected (transformer no-op).\n *\n * The component is intentionally rendered as a regular catalog entry\n * (declared in `catalog.ts` + wired in `registry.ts`) so the catalog ↔\n * registry parity invariant (`p1-019-upgrade-smoke.test.ts`) continues to\n * hold without special-casing.\n *\n * Design refs:\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/02_protocol_honesty/08_named_slots_implementation.md §2.2\n * - docs/proposals/CWRF-013-a2ui-systematic-upgrade/01_dependency_upgrade/00_phase1_kickoff_checklist.md §4 PR-P1-#5\n */\n\nimport React from 'react'\nimport './JrSlot.css'\n\nexport interface JrSlotProps {\n props: {\n name: string\n }\n children?: React.ReactNode\n}\n\nexport function JrSlot({ props, children }: JrSlotProps) {\n const name = props?.name ?? 'default'\n return (\n <div\n className={`jr-slot jr-slot--${name}`}\n data-jr-slot={name}\n >\n {children}\n </div>\n )\n}\n\nexport default JrSlot\n","/*\n * CWRF-013 Phase 2 PR-P2-#1 — Box layout primitive.\n *\n * Universal flex container. Box is the lowest-level layout atom — Stack and\n * Row are syntactic sugar for `<Box direction=\"column\">` and `<Box direction=\"row\">`.\n *\n * Authoring guidance (also lives in catalog.description, kept in sync):\n * - PREFER semantic domain components (KPICard, DataTable, Chart, ...)\n * before reaching for Box. Box is the fallback when no semantic fit.\n * - All sizing comes from token enums (padding / gap / radius / bg). Raw\n * pixel values are NOT accepted by the Zod schema and would be rejected\n * before ever reaching this component.\n *\n * Design ref: 03_layout_primitives/02_layout_primitive_design.md §2.1\n */\n\nimport React, { type CSSProperties, type ReactNode } from 'react'\nimport {\n type SpacingToken,\n type RadiusToken,\n type BgToken,\n type AlignToken,\n type JustifyToken,\n spacingVar,\n radiusVar,\n bgVar,\n alignValue,\n justifyValue,\n} from './_tokens.js'\n\nexport interface BoxProps {\n props: {\n padding?: SpacingToken\n gap?: SpacingToken\n bg?: BgToken\n radius?: RadiusToken\n bordered?: boolean\n direction?: 'row' | 'column'\n align?: Exclude<AlignToken, 'baseline'>\n justify?: JustifyToken\n className?: string\n }\n children?: ReactNode\n}\n\nexport function Box({ props, children }: BoxProps) {\n const {\n padding,\n gap,\n bg,\n radius,\n bordered,\n direction = 'column',\n align,\n justify,\n className,\n } = props ?? ({} as BoxProps['props'])\n\n const style: CSSProperties = {\n display: 'flex',\n flexDirection: direction,\n padding: spacingVar(padding),\n gap: spacingVar(gap),\n background: bgVar(bg),\n borderRadius: radiusVar(radius),\n border: bordered ? '1px solid var(--ycw-color-border-default)' : undefined,\n alignItems: alignValue(align),\n justifyContent: justifyValue(justify),\n }\n\n return (\n <div className={['jr-box', className].filter(Boolean).join(' ')} style={style}>\n {children}\n </div>\n )\n}\n\nexport default Box\n","/*\n * CWRF-013 Phase 2 PR-P2-#1 — token → CSS variable helpers shared across\n * the 6 layout primitives.\n *\n * Why a tiny private module (and not inline switch in every primitive)\n * --------------------------------------------------------------------\n * - Six primitives consume the same spacing/radius/bg enum scales. Inlining\n * `padding === 'md' ? 'var(--ycw-spacing-md)' : ...` six times invites\n * drift: today the scale is none/xs/sm/md/lg/xl, tomorrow somebody adds\n * `2xl` only in Box because it was the file they happened to be editing.\n * - The lookup is the **only** place the enum-string ↔ CSS-variable mapping\n * is encoded. The Zod enum in `catalog.ts` is the *runtime* gate; this\n * module is the *render-time* gate. Together they are tamper-proof: a\n * spec with `padding: 'invalid'` is rejected by Zod long before reaching\n * the helper.\n * - Pure functions, no React; trivially unit-testable.\n *\n * Cross-refs\n * ----------\n * - layout-tokens.css the actual CSS variable definitions\n * - 02_layout_primitive_design.md §1 token-first principle\n */\n\nexport type SpacingToken = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type RadiusToken = 'none' | 'sm' | 'md' | 'lg' | 'full'\nexport type BgToken = 'default' | 'subtle' | 'elevated' | 'accent'\nexport type FontSizeToken = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\n/** Map a spacing token to its CSS variable reference, e.g. `'md' → 'var(--ycw-spacing-md)'`. */\nexport function spacingVar(token: SpacingToken | undefined): string | undefined {\n return token ? `var(--ycw-spacing-${token})` : undefined\n}\n\n/** Map a radius token to its CSS variable reference. */\nexport function radiusVar(token: RadiusToken | undefined): string | undefined {\n return token ? `var(--ycw-radius-${token})` : undefined\n}\n\n/** Map a bg token to its CSS variable reference. */\nexport function bgVar(token: BgToken | undefined): string | undefined {\n return token ? `var(--ycw-color-bg-${token})` : undefined\n}\n\n/** Map a font-size token to its CSS variable reference. */\nexport function fontSizeVar(token: FontSizeToken | undefined): string | undefined {\n return token ? `var(--ycw-font-size-${token})` : undefined\n}\n\n/**\n * Map flexbox `align-items` enum to the literal CSS keyword. We expose only\n * the semantic subset used by the layout primitives (no `baseline` for Box —\n * Row exposes it because text-baseline alignment is mostly a Row use-case).\n */\nexport type AlignToken = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport function alignValue(token: AlignToken | undefined): string | undefined {\n if (!token) return undefined\n return token === 'start' ? 'flex-start' : token === 'end' ? 'flex-end' : token\n}\n\n/** Map flexbox `justify-content` enum to the literal CSS keyword. */\nexport type JustifyToken = 'start' | 'center' | 'end' | 'between' | 'around'\nexport function justifyValue(token: JustifyToken | undefined): string | undefined {\n if (!token) return undefined\n if (token === 'start') return 'flex-start'\n if (token === 'end') return 'flex-end'\n if (token === 'between') return 'space-between'\n if (token === 'around') return 'space-around'\n return token // 'center'\n}\n","/*\n * CWRF-013 Phase 2 PR-P2-#1 — Row horizontal-stack syntactic sugar.\n *\n * Equivalent to `<Box direction=\"row\">` plus a `wrap` knob that few people\n * remember exists on Box. We treat Row and Stack as first-class names in\n * the catalog because they read better in spec JSON (\"type\":\"Row\") than\n * \"type\":\"Box\" with an opaque `direction` field. Catalog description steers\n * Agents away from `Box.direction='row'` toward Row.\n *\n * Design ref: 03_layout_primitives/02_layout_primitive_design.md §2.3\n */\n\nimport React, { type CSSProperties, type ReactNode } from 'react'\nimport {\n type SpacingToken,\n type AlignToken,\n type JustifyToken,\n spacingVar,\n alignValue,\n justifyValue,\n} from './_tokens.js'\n\nexport interface RowProps {\n props: {\n gap?: SpacingToken\n align?: AlignToken\n justify?: JustifyToken\n wrap?: boolean\n className?: string\n }\n children?: ReactNode\n}\n\nexport function Row({ props, children }: RowProps) {\n const { gap, align, justify, wrap, className } = props ?? ({} as RowProps['props'])\n\n const style: CSSProperties = {\n display: 'flex',\n flexDirection: 'row',\n gap: spacingVar(gap),\n alignItems: alignValue(align),\n justifyContent: justifyValue(justify),\n flexWrap: wrap ? 'wrap' : undefined,\n }\n\n return (\n <div className={['jr-row', className].filter(Boolean).join(' ')} style={style}>\n {children}\n </div>\n )\n}\n\nexport default Row\n","/*\n * CWRF-013 Phase 2 PR-P2-#1 — Spacer fixed/flexible gap utility.\n *\n * Two modes (mutually exclusive — Zod schema uses `.refine` to enforce):\n * - `flex: true` — `flex: 1`, pushes neighbours to the edges.\n * Use inside Row to push content + actions apart.\n * - `size: 'sm' | ...` — fixed-axis dimension. Inherits axis from parent\n * (Row → width, Stack/Box(column) → height) via\n * `align-self: stretch` so the same Spacer works\n * in both directions.\n *\n * Design ref: 03_layout_primitives/02_layout_primitive_design.md §2.5\n */\n\nimport React, { type CSSProperties } from 'react'\nimport { type SpacingToken, spacingVar } from './_tokens.js'\n\nexport interface SpacerProps {\n props: {\n size?: SpacingToken\n flex?: boolean\n className?: string\n }\n}\n\nexport function Spacer({ props }: SpacerProps) {\n const { size, flex, className } = props ?? ({} as SpacerProps['props'])\n\n const style: CSSProperties = flex\n ? { flex: 1 }\n : {\n // For fixed-size spacers, the same element should produce visible gap\n // on whichever axis the parent flex direction runs. Use min-* so the\n // browser fills the gap on the cross-axis automatically.\n minWidth: spacingVar(size),\n minHeight: spacingVar(size),\n flexShrink: 0,\n }\n\n return (\n <span\n className={['jr-spacer', className].filter(Boolean).join(' ')}\n style={style}\n aria-hidden=\"true\"\n />\n )\n}\n\nexport default Spacer\n","/*\n * CWRF-013 Phase 2 PR-P2-#1 — Section semantic chapter container.\n *\n * Section = title + optional description + content area. Adds optional\n * collapsible behaviour for long-form spec authoring (e.g. spec docs that\n * embed a 12-step risk register where each step is a Section). When\n * `collapsible: true`, renders a `<details>` element so keyboard / screen\n * reader semantics come for free; we deliberately do NOT roll our own\n * useState toggle because that loses the native expand/collapse a11y.\n *\n * Distinct from `Card` (shadcn primitive, generic surface). Section\n * communicates document hierarchy; Card communicates a discrete UI tile.\n *\n * Design ref: 03_layout_primitives/02_layout_primitive_design.md §2.7\n */\n\nimport React, { type ReactNode } from 'react'\n\nexport interface SectionProps {\n props: {\n title: string\n description?: string\n bordered?: boolean\n collapsible?: boolean\n defaultCollapsed?: boolean\n className?: string\n }\n children?: ReactNode\n}\n\nexport function Section({ props, children }: SectionProps) {\n const {\n title,\n description,\n bordered,\n collapsible,\n defaultCollapsed,\n className,\n } = props ?? ({} as SectionProps['props'])\n\n const containerStyle: React.CSSProperties = {\n padding: 'var(--ycw-spacing-lg)',\n borderRadius: 'var(--ycw-radius-md)',\n border: bordered ? '1px solid var(--ycw-color-border-default)' : undefined,\n background: 'var(--ycw-color-bg-default)',\n }\n\n const titleStyle: React.CSSProperties = {\n margin: 0,\n fontSize: 'var(--ycw-font-size-lg)',\n fontWeight: 600,\n color: 'var(--ycw-color-text-default)',\n }\n\n const descStyle: React.CSSProperties = {\n margin: '4px 0 var(--ycw-spacing-md)',\n fontSize: 'var(--ycw-font-size-sm)',\n color: 'var(--ycw-color-text-muted)',\n }\n\n const contentStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--ycw-spacing-md)',\n }\n\n const cls = ['jr-section', className].filter(Boolean).join(' ')\n\n if (collapsible) {\n return (\n <details className={cls} style={containerStyle} open={!defaultCollapsed}>\n <summary style={{ cursor: 'pointer', listStyle: 'revert' }}>\n <span style={titleStyle}>{title}</span>\n </summary>\n {description && <p style={descStyle}>{description}</p>}\n <div style={contentStyle}>{children}</div>\n </details>\n )\n }\n\n return (\n <section className={cls} style={containerStyle}>\n <h3 style={titleStyle}>{title}</h3>\n {description && <p style={descStyle}>{description}</p>}\n <div style={contentStyle}>{children}</div>\n </section>\n )\n}\n\nexport default Section\n","/*\n * CWRF-013 Phase 2 PR-P2-#1 — Stepper progress indicator.\n *\n * Multi-step progress visualisation. NOT a state machine — only a *display*\n * of progress; the active step is derived from `props.steps[].status` (not\n * runtime state). A future Phase 3 enhancement could wire `activePath` to\n * read `{$state}` and switch a step into 'active' automatically; for now\n * spec authors set `status` per step explicitly so the component stays a\n * pure render-time reflection of intent.\n *\n * Design ref: 03_layout_primitives/02_layout_primitive_design.md §2.11\n */\n\nimport React, { type CSSProperties } from 'react'\n\nexport type StepStatus = 'pending' | 'active' | 'completed' | 'error'\n\nexport interface StepperStep {\n id: string\n label: string\n description?: string\n status?: StepStatus\n}\n\nexport interface StepperProps {\n props: {\n steps: StepperStep[]\n activePath?: string\n orientation?: 'horizontal' | 'vertical'\n className?: string\n }\n}\n\nconst STATUS_COLORS: Record<StepStatus, string> = {\n pending: 'var(--ycw-color-status-pending)',\n active: 'var(--ycw-color-status-active)',\n completed: 'var(--ycw-color-status-completed)',\n error: 'var(--ycw-color-status-error)',\n}\n\nconst STATUS_GLYPH: Record<StepStatus, string> = {\n pending: '○',\n active: '●',\n completed: '✓',\n error: '✕',\n}\n\nexport function Stepper({ props }: StepperProps) {\n const { steps, orientation = 'horizontal', className } = props ?? ({} as StepperProps['props'])\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: orientation === 'horizontal' ? 'row' : 'column',\n gap: 'var(--ycw-spacing-md)',\n alignItems: orientation === 'horizontal' ? 'center' : 'flex-start',\n }\n\n const stepCellStyle = (status: StepStatus): CSSProperties => ({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n alignItems: orientation === 'horizontal' ? 'center' : 'flex-start',\n color: status === 'active' || status === 'error' ? STATUS_COLORS[status] : 'var(--ycw-color-text-default)',\n minWidth: 0,\n })\n\n const glyphStyle = (status: StepStatus): CSSProperties => ({\n display: 'inline-flex',\n width: 28,\n height: 28,\n borderRadius: 'var(--ycw-radius-full)',\n alignItems: 'center',\n justifyContent: 'center',\n background: status === 'completed' ? STATUS_COLORS.completed : 'transparent',\n color: status === 'completed' ? '#fff' : STATUS_COLORS[status],\n border: `2px solid ${STATUS_COLORS[status]}`,\n fontSize: 14,\n fontWeight: 600,\n })\n\n const labelStyle: CSSProperties = {\n fontSize: 'var(--ycw-font-size-sm)',\n fontWeight: 500,\n }\n\n const descStyle: CSSProperties = {\n fontSize: 'var(--ycw-font-size-xs)',\n color: 'var(--ycw-color-text-muted)',\n }\n\n return (\n <ol\n className={['jr-stepper', `jr-stepper--${orientation}`, className].filter(Boolean).join(' ')}\n style={{ ...containerStyle, listStyle: 'none', padding: 0, margin: 0 }}\n aria-label=\"Progress\"\n >\n {steps.map((step) => {\n const status = step.status ?? 'pending'\n return (\n <li\n key={step.id}\n style={stepCellStyle(status)}\n aria-current={status === 'active' ? 'step' : undefined}\n >\n <span style={glyphStyle(status)} aria-hidden=\"true\">\n {STATUS_GLYPH[status]}\n </span>\n <span style={labelStyle}>{step.label}</span>\n {step.description && <span style={descStyle}>{step.description}</span>}\n </li>\n )\n })}\n </ol>\n )\n}\n\nexport default Stepper\n","/*\n * CWRF-013 Phase 2 PR-P2-#1 — FormField input wrapper.\n *\n * label + required indicator + description + control slot + error message.\n * NOT a control itself — wraps exactly ONE control (Input / Textarea /\n * Select / Checkbox / Switch / Slider) via the default slot. Authoring rule\n * enforced via catalog description (also lints in Phase 2 Tier 2-2):\n * FormField.children must be a single catalog control component.\n *\n * Why FormField vs the shadcn `Form` / `FormItem` primitives\n * ----------------------------------------------------------\n * shadcn 36 already includes Input / Textarea / Select / etc., but does\n * NOT ship a FormField wrapper (their `Form` primitive is react-hook-form\n * specific and not a fit for spec-driven generation). FormField in our\n * catalog is the missing piece that turns a bag of inputs into a coherent\n * accessible form: it guarantees label↔input association via `htmlFor` /\n * implicit wrapping, and surfaces `aria-invalid` / `aria-describedby` when\n * `error` is set.\n *\n * Design ref: 03_layout_primitives/02_layout_primitive_design.md §2.12\n */\n\nimport React, { type CSSProperties, type ReactNode } from 'react'\n\nexport interface FormFieldProps {\n props: {\n label: string\n name: string\n required?: boolean\n description?: string\n error?: string\n className?: string\n }\n children?: ReactNode\n}\n\nexport function FormField({ props, children }: FormFieldProps) {\n const { label, name, required, description, error, className } =\n props ?? ({} as FormFieldProps['props'])\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--ycw-spacing-xs)',\n }\n\n const labelStyle: CSSProperties = {\n fontSize: 'var(--ycw-font-size-sm)',\n fontWeight: 500,\n color: 'var(--ycw-color-text-default)',\n }\n\n const requiredMarkStyle: CSSProperties = {\n color: 'var(--ycw-color-status-error)',\n marginLeft: 4,\n }\n\n const descStyle: CSSProperties = {\n fontSize: 'var(--ycw-font-size-xs)',\n color: 'var(--ycw-color-text-muted)',\n }\n\n const errorStyle: CSSProperties = {\n fontSize: 'var(--ycw-font-size-xs)',\n color: 'var(--ycw-color-status-error)',\n }\n\n // Stable IDs so the label can target the inner control via htmlFor and\n // the description / error are linked through aria-describedby. Keys are\n // derived from `name` (form field name is a unique identifier anyway).\n const descId = description ? `jr-formfield-${name}-desc` : undefined\n const errId = error ? `jr-formfield-${name}-err` : undefined\n\n // CWRF-013 Phase 2 PR-P2-#1 follow-up — see ``layout-tokens.css`` rule\n // ``.jr-form-field[data-jr-formfield-owns-label] [data-slot=\"label\"]``.\n // We always render a wrapper ``<label>`` here, so we always advertise\n // ownership; the CSS rule then hides any inner shadcn ``<Label>``\n // (data-slot=\"label\") so the user sees a single label per field. The\n // attribute is intentionally *truthy-only* — leaving it ``undefined``\n // when not used keeps the DOM diff minimal.\n const ownsLabel = label ? 'true' : undefined\n\n return (\n <div\n className={['jr-form-field', className].filter(Boolean).join(' ')}\n data-jr-formfield-owns-label={ownsLabel}\n style={containerStyle}\n >\n <label htmlFor={`jr-formfield-${name}-input`} style={labelStyle}>\n {label}\n {required && (\n <span style={requiredMarkStyle} aria-label=\"required\">\n *\n </span>\n )}\n </label>\n {description && (\n <span id={descId} style={descStyle}>\n {description}\n </span>\n )}\n <div\n // The wrapped control rendered through children typically owns its\n // own input — we cannot inject `id={`jr-formfield-${name}-input`}`\n // without depending on the inner component contract. Phase 2 keeps\n // the `htmlFor` link advisory; Phase 3 follow-up may surface an\n // `inputId` channel through Renderer context. For most shadcn\n // controls the label+nesting fallback already works.\n aria-describedby={[descId, errId].filter(Boolean).join(' ') || undefined}\n aria-invalid={error ? true : undefined}\n >\n {children}\n </div>\n {error && (\n <span id={errId} style={errorStyle} role=\"alert\">\n {error}\n </span>\n )}\n </div>\n )\n}\n\nexport default FormField\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,WAAAA,iBAAe;AAC/B,SAAS,UAAU,eAAe,oBAAoB,sBAAsB;;;ACD5E,SAAS,WAAW,SAAS,cAAc;;;ACS3C,SAAS,sBAAiC;AAQ1C,IAAM,YAAY,oBAAI,IAA2B;AAEjD,IAAM,cAAc;AAEpB,SAAS,cAAoB;AAC3B,MAAI,UAAU,OAAO,YAAa;AAClC,QAAM,QAAQ,UAAU,KAAK,EAAE,KAAK,EAAE;AACtC,MAAI,MAAO,WAAU,OAAO,KAAK;AACnC;AAEO,SAAS,oBAAoB,QAA+B;AACjE,MAAI,QAAQ,UAAU,IAAI,MAAM;AAChC,MAAI,CAAC,OAAO;AACV,gBAAY;AACZ,YAAQ;AAAA,MACN,MAAM,CAAC;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AACA,cAAU,IAAI,QAAQ,KAAK;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAA8C;AACnE,aAAW,UAAU,CAAC,KAAK,MAAM,KAAK,GAAG;AACvC,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AACvC,UAAI,UAAU,OAAO,WAAW,YAAY,OAAO,MAAM,OAAO,SAAS,QAAW;AAClF,gBAAQ,KAAK,8CAA8C,MAAM;AACjE,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAAiB;AAAA,EAC3B;AACA,MAAI,UAAU;AACd,SAAO,QAAQ,SAAS,GAAG,GAAG;AAC5B,cAAU,QAAQ,MAAM,GAAG,EAAE;AAC7B,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAI,UAAU,OAAO,WAAW,YAAY,OAAO,MAAM,OAAO,SAAS,QAAW;AAClF,gBAAQ,KAAK,oDAAoD;AACjE,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAAiB;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,SAAS,UAAU,QAAgB,WAAgC;AACxE,QAAM,QAAQ,oBAAoB,MAAM;AACxC,QAAM;AACN,MAAI;AACF,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,CAAC,QAAS,QAAO,MAAM;AAC3B,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,OAAO;AAAA,IAC5B,QAAQ;AACN,YAAM,WAAW,cAAc,OAAO;AACtC,UAAI,CAAC,UAAU;AACb,gBAAQ,KAAK,+CAA+C,QAAQ,QAAQ,UAAU,GAAG,GAAG,CAAC;AAC7F,eAAO,MAAM;AAAA,MACf;AACA,cAAQ;AAAA,IACV;AACA,QAAI,SAAS,OAAO,UAAU,YAAY,MAAM,MAAM,MAAM,SAAS,QAAW;AAC9E,UAAI;AACF,uBAAe,MAAM,MAAyB,KAAwD;AAAA,MACxG,SAAS,UAAU;AACjB,gBAAQ,MAAM,oCAAoC,QAAQ,MAAM,MAAM,QAAQ;AAAA,MAChF;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,YAAQ,KAAK,gCAAgC,QAAQ,UAAU,UAAU,GAAG,GAAG,GAAG,CAAC;AAAA,EACrF;AACA,SAAO,MAAM;AACf;AAEO,SAAS,aAAa,QAAsB;AACjD,QAAM,QAAQ,UAAU,IAAI,MAAM;AAClC,MAAI,MAAO,OAAM,UAAU;AAC7B;AAEO,SAAS,QAAQ,QAA6B;AACnD,QAAM,QAAQ,UAAU,IAAI,MAAM;AAClC,SAAO,QAAS,MAAM,OAA2B;AACnD;;;AC/FA,SAAS,wBAAyC;AAElD,IAAM,SAAS,oBAAI,IAAwB;AAEpC,SAAS,iBACd,QACA,cACY;AACZ,MAAI,QAAQ,OAAO,IAAI,MAAM;AAC7B,MAAI,CAAC,OAAO;AACV,YAAQ,iBAAiB,gBAAgB,CAAC,CAAC;AAC3C,WAAO,IAAI,QAAQ,KAAK;AAAA,EAC1B;AACA,SAAO;AACT;AAEO,SAAS,gBACd,QACA,MACA,OACM;AACN,QAAM,QAAQ,OAAO,IAAI,MAAM;AAC/B,MAAI,MAAO,OAAM,IAAI,MAAM,KAAK;AAClC;AAEO,SAAS,SAAS,QAAwC;AAC/D,SAAO,OAAO,IAAI,MAAM;AAC1B;;;ACZA,IAAM,mBAAmB;AAOlB,SAAS,uBAA+B;AAC7C,QAAM,MACJ,OAAO,YAAY,eAAe,QAAQ,MACtC,QAAQ,IAAI,0BACZ;AACN,MAAI,OAAO,QAAQ,QAAQ,GAAI,QAAO;AACtC,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,QAAO;AACzC,SAAO,KAAK,MAAM,CAAC;AACrB;AAMO,IAAM,cAAN,MAAwB;AAAA,EAG7B,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAFZ,QAAQ,oBAAI,IAAU;AAAA,EAIvC,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,KAAuB;AACzB,QAAI,KAAK,aAAa,EAAG,QAAO;AAChC,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChC,QAAI,UAAU,OAAW,QAAO;AAChC,SAAK,MAAM,OAAO,GAAG;AACrB,SAAK,MAAM,IAAI,KAAK,KAAK;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,KAAQ,OAAgB;AAC1B,QAAI,KAAK,aAAa,EAAG;AACzB,QAAI,KAAK,MAAM,IAAI,GAAG,EAAG,MAAK,MAAM,OAAO,GAAG;AAC9C,SAAK,MAAM,IAAI,KAAK,KAAK;AACzB,WAAO,KAAK,MAAM,OAAO,KAAK,UAAU;AACtC,YAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AACvC,UAAI,UAAU,OAAW;AACzB,WAAK,MAAM,OAAO,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,IAAI,KAAiB;AACnB,WAAO,KAAK,MAAM,IAAI,GAAG;AAAA,EAC3B;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;AAEA,IAAI,gBAA2D;AAE/D,SAAS,WAA+C;AACtD,MAAI,iBAAiB,MAAM;AACzB,oBAAgB,IAAI,YAAmC,qBAAqB,CAAC;AAAA,EAC/E;AACA,SAAO;AACT;AAwBO,SAAS,SAAS,MAA+B;AACtD,MAAI;AACF,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYO,SAAS,UACd,SAC6D;AAC7D,SAAO,CAAC,MAAM,YAAY;AACxB,UAAM,WAAW,SAAS,IAAI;AAC9B,QAAI,YAAY,MAAM;AAEpB,aAAO,QAAQ,MAAM,OAAO;AAAA,IAC9B;AACA,UAAM,aAAa,oBAAoB,OAAO;AAC9C,UAAM,MAAM,GAAG,UAAU,KAAK,QAAQ;AACtC,UAAM,QAAQ,SAAS;AACvB,UAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,QAAI,WAAW,QAAW;AACxB,aAAO,EAAE,GAAG,QAAQ,WAAW,KAAK;AAAA,IACtC;AACA,UAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,UAAM,IAAI,KAAK,KAAK;AACpB,WAAO,EAAE,GAAG,OAAO,WAAW,MAAM;AAAA,EACtC;AACF;AAEA,SAAS,oBAAoB,SAAkC;AAC7D,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,QAAQ,SAAS,OAAO;AACpC,QAAM,WAAW,QAAQ,UAAU,SAC/B,IAAI,CAAC,GAAG,QAAQ,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,MAC1C;AAGJ,MAAI,QAAQ,aAAc,QAAO,GAAG,GAAG,IAAI,QAAQ,YAAY,KAAK,OAAO,CAAC;AAC5E,SAAO,GAAG,GAAG,IAAI,QAAQ;AAC3B;;;ACjIO,SAAS,uBAAgC;AAC9C,MAAI,OAAO,YAAY,eAAe,CAAC,QAAQ,IAAK,QAAO;AAC3D,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,SAAS,UAAU,SAAS,IAAK,QAAO;AAC5C,MAAI,SAAS,WAAW,SAAS,IAAK,QAAO;AAC7C,SAAO;AACT;AASA,IAAM,UAAU,oBAAI,IAAY;AAOhC,SAAS,YAAY,UAA6C;AAChE,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,SACJ,IAAI,CAAC,MAAM,GAAG,EAAE,aAAa,KAAK,EAAE,OAAO,EAAE,EAC7C,KAAK,EACL,KAAK,GAAG;AACb;AASO,SAAS,cACd,UACA,SACS;AACT,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAM,MAAM,YAAY,QAAQ;AAChC,MAAI,CAAC,SAAS,SAAS,QAAQ,IAAI,GAAG,EAAG,QAAO;AAChD,UAAQ,IAAI,GAAG;AAEf,MAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,SAAS,YAAY;AACxE,WAAO;AAAA,EACT;AAIA,QAAM,QAAQ,SAAS,IAAI,CAAC,MAAM,QAAQ,EAAE,aAAa,KAAK,EAAE,OAAO,EAAE;AACzE,UAAQ;AAAA,IACN,mBAAmB,SAAS,MAAM,gBAChC,SAAS,WAAW,IAAI,KAAK,GAC/B;AAAA,EAA8C,MAAM,KAAK,IAAI,CAAC;AAAA,EAChE;AACA,SAAO;AACT;AAWO,SAAS,kBAAkB,UAA2C;AAC3E,MAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,SAAS,WAAY;AAC1E,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,KAAK,sDAAsD;AACnE;AAAA,EACF;AACA,QAAM,QAAQ,SAAS,IAAI,CAAC,MAAM,QAAQ,EAAE,aAAa,KAAK,EAAE,OAAO,EAAE;AACzE,UAAQ;AAAA,IACN,uCAAuC,SAAS,MAAM,UACpD,SAAS,WAAW,IAAI,KAAK,GAC/B;AAAA,EAAM,MAAM,KAAK,IAAI,CAAC;AAAA,EACxB;AACF;;;ACtEA,IAAM,2BAA2B,CAAC,cAAc,WAAW,YAAY;AAGvE,SAAS,mBAAmB,IAA0C;AACpE,MAAI,CAAC,MAAM,GAAG,SAAS,YAAa,QAAO;AAC3C,QAAM,QAAQ,GAAG;AACjB,MAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO;AACvD,SAAO,yBAAyB,KAAK,CAAC,MAAM,KAAK,KAAK;AACxD;AAGA,SAAS,yBAAyB,IAA0C;AAC1E,MAAI,CAAC,MAAM,GAAG,SAAS,YAAa,QAAO;AAC3C,QAAM,QAAQ,GAAG;AACjB,MAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO;AACvD,QAAM,UAAW,MAAgC;AACjD,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QAAQ;AAAA,IACb,CAAC,MAAM,KAAK,QAAQ,OAAO,MAAM,YAAY,gBAAiB;AAAA,EAChE;AACF;AAGA,SAAS,iBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,EAAG,QAAO;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,MAAI,eAAe;AACnB,MAAI,uBAAuB;AAC3B,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,mBAAmB,EAAE,GAAG;AAC1B,eAAS,KAAK,GAAG;AACjB,YAAM,QAAQ,GAAG;AACjB,iBAAW,KAAK,0BAA0B;AACxC,YAAI,KAAK,MAAO,iBAAgB;AAAA,MAClC;AAAA,IACF;AACA,QAAI,yBAAyB,EAAE,GAAG;AAChC,UAAI,CAAC,SAAS,SAAS,GAAG,EAAG,UAAS,KAAK,GAAG;AAC9C,YAAM,UAAW,GAAG,MAAkC,WAAW,CAAC;AAClE,8BAAwB,QAAQ;AAAA,QAC9B,CAAC,MAAM,KAAK,QAAQ,OAAO,MAAM,YAAY,gBAAiB;AAAA,MAChE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,QAAM,QAAkB,CAAC;AACzB,MAAI,eAAe,GAAG;AACpB,UAAM,KAAK,gBAAgB,YAAY,6BAA6B;AAAA,EACtE;AACA,MAAI,uBAAuB,GAAG;AAC5B,UAAM;AAAA,MACJ,GAAG,oBAAoB;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,MAAM,SAAS,IACX,cAAc,MAAM,KAAK,IAAI,CAAC,KAC9B;AAAA,EACR;AACF;AAOA,SAAS,qBACP,KACA,IACA,KACiB;AACjB,QAAM,QAAS,GAAG,SAAS,CAAC;AAC5B,QAAM,YAAqC,CAAC;AAC5C,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,QAAI,yBAAyB,SAAS,CAA8C,GAAG;AACrF,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AACA,cAAU,CAAC,IAAI;AAAA,EACjB;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,QAAI;AAAA,MACF,cAAc,GAAG,SAAS,QACvB,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EACrB,KAAK,IAAI,CAAC;AAAA,MACb,EAAE,YAAY,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AACA,SAAO,EAAE,GAAG,IAAI,OAAO,UAAU;AACnC;AAOA,SAAS,0BACP,KACA,IACA,KACiB;AACjB,MAAI,CAAC,IAAI,OAAQ,QAAO;AACxB,QAAM,UAAW,GAAG,OAA+C,WAAW,CAAC;AAC/E,QAAM,kBAAkB,QACrB,IAAI,CAAC,GAAG,QAAQ;AACf,QAAI,KAAK,QAAQ,OAAO,MAAM,YAAY,gBAAiB,GAA+B;AACxF,YAAM,SAAU,EAAwB;AACxC,aAAO,OAAO,WAAW,WAAW,SAAS,IAAI,GAAG;AAAA,IACtD;AACA,WAAO;AAAA,EACT,CAAC,EACA,OAAO,CAAC,MAAmB,KAAK,IAAI;AACvC,MAAI,gBAAgB,WAAW,EAAG,QAAO;AACzC,MAAI;AAAA,IACF,cAAc,GAAG,wCAAwC,gBAAgB;AAAA,MACvE;AAAA,IACF,CAAC;AAAA,IACD,EAAE,YAAY,KAAK,SAAS,gBAAgB;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAItD,MAAI,CAAC,iBAAiB,IAAI,EAAG,QAAO;AAEpC,QAAM,eAAgD,CAAC;AACvD,MAAI,UAAU;AACd,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,SAA0B;AAC9B,QAAI,mBAAmB,EAAE,GAAG;AAC1B,YAAM,WAAW,IAAI,SAAS,KAAK,qBAAqB,KAAK,IAAI,GAAG;AACpE,UAAI,IAAI,QAAQ;AAEd,6BAAqB,KAAK,IAAI,GAAG;AAAA,MACnC;AACA,eAAS;AACT,UAAI,CAAC,IAAI,OAAQ,WAAU;AAAA,IAC7B;AACA,QAAI,yBAAyB,MAAM,GAAG;AACpC,eAAS,0BAA0B,KAAK,QAAQ,GAAG;AAAA,IACrD;AACA,iBAAa,GAAG,IAAI;AAAA,EACtB;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,UAAU,aAAa;AAC3C;AAEO,IAAM,kCAAmD;AAAA,EAC9D,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AACF;;;ACxIA,IAAM,qBAAqB;AAG3B,SAAS,qBAAqB,IAAmE;AAC/F,MAAI,CAAC,MAAM,GAAG,SAAS,YAAa,QAAO,CAAC;AAC5C,QAAM,QAAQ,GAAG;AACjB,MAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO,CAAC;AACxD,QAAM,UAAW,MAAgC;AACjD,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,CAAC;AACrC,QAAM,MAAwC,CAAC;AAC/C,UAAQ,QAAQ,CAAC,GAAG,QAAQ;AAC1B,QACE,KAAK,QACL,OAAO,MAAM,YACZ,EAA8B,eAAe,QAC9C,OAAQ,EAAwB,QAAQ,UACxC;AACA,UAAI,KAAK,EAAE,KAAM,EAAsB,KAAK,OAAO,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAGA,SAAS,2BAA2B,SAA+B;AACjE,SAAO,QAAQ,IAAI,CAAC,MAAM;AACxB,QAAI,KAAK,QAAQ,OAAO,MAAM,SAAU,QAAO;AAC/C,UAAM,EAAE,YAAY,aAAa,GAAG,KAAK,IAAI;AAC7C,WAAO;AAAA,EACT,CAAC;AACH;AAGA,SAAS,gBACP,MACA,KACoC;AACpC,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC;AAClC,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU;AAC5C,QAAI,EAAE,OAAQ,KAAkC;AAChD,UAAM,IAAK,IAAgC,GAAG;AAC9C,QAAI,OAAO,MAAM,YAAY,EAAE,SAAS,EAAG,MAAK,IAAI,CAAC;AAAA,aAC5C,OAAO,MAAM,SAAU,MAAK,IAAI,OAAO,CAAC,CAAC;AAAA,aACzC,OAAO,MAAM,UAAW,MAAK,IAAI,OAAO,CAAC,CAAC;AAAA,EACrD;AACA,SAAO,CAAC,GAAG,IAAI,EACZ,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EACjC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,EAAE;AACxC;AAGA,SAAS,cAAc,MAAgB,UAAiC;AACtE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU,QAAO;AACtB,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,MAAM,QAAQ,GAAG,QAAQ,KAAK,GAAG,SAAS,SAAS,QAAQ,EAAG,QAAO;AAAA,EAC3E;AACA,SAAO;AACT;AAGA,SAAS,YAAY,OAAoB,MAAsB;AAC7D,MAAI,CAAC,MAAM,IAAI,IAAI,GAAG;AACpB,UAAM,IAAI,IAAI;AACd,WAAO;AAAA,EACT;AACA,MAAI,IAAI;AACR,SAAO,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAG,MAAK;AACvC,QAAM,IAAI,GAAG,IAAI,IAAI,CAAC;AACtB,QAAM,IAAI,CAAC;AACX,SAAO;AACT;AAEA,SAASC,kBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU,QAAO;AACtB,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,qBAAqB,EAAE,EAAE,SAAS,EAAG,QAAO;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAASC,UAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,MAAI,mBAAmB;AACvB,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,UAAM,OAAO,qBAAqB,EAAE;AACpC,QAAI,KAAK,WAAW,EAAG;AACvB,aAAS,KAAK,GAAG;AAEjB,QAAI,IAAI,IAAI,KAAK;AACjB,QAAI,KAAK,SAAS,IAAK,MAAK;AAC5B,wBAAoB;AAAA,EACtB;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,SAAS,WAAW,IAChB,wCACA,0CAA0C,SAAS,MAAM,yBAAoB,gBAAgB;AAAA,EACrG;AACF;AAEA,SAASC,WAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,MAAI,CAACF,kBAAiB,IAAI,EAAG,QAAO;AAEpC,MAAI,IAAI,QAAQ;AAEd,eAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,YAAM,OAAO,qBAAqB,EAAE;AACpC,UAAI,KAAK,WAAW,EAAG;AACvB,UAAI;AAAA,QACF,cAAc,GAAG,SAAS,KAAK,MAAM;AAAA,QACrC,EAAE,YAAY,KAAK,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;AAAA,MACrD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;AAC3C,MAAI,eAAgD,EAAE,GAAG,SAAS;AAClE,MAAI,WAAW,KAAK;AACpB,MAAI,UAAU;AAEd,aAAW,CAAC,OAAO,UAAU,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,UAAM,iBAAiB,qBAAqB,UAAU;AACtD,QAAI,eAAe,WAAW,EAAG;AAEjC,UAAM,UAAW,WAAW,SAAS,CAAC;AACtC,UAAM,aAAa,GAAG,kBAAkB,GAAG,KAAK;AAEhD,UAAM,eAAe;AAAA,MACnB,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,UAAU,CAAC;AAAA,IACtD;AAEA,UAAM,aAA8B;AAAA,MAClC,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA;AAAA,QAET,YACE,OAAO,QAAQ,eAAe,YAAY,QAAQ,WAAW,SAAS,IAClE,QAAQ,aACR;AAAA,MACR;AAAA,IACF;AAEA,UAAM,eAAe,YAAY,OAAO,GAAG,KAAK,WAAW;AAC3D,UAAM,kBAA4B,CAAC;AACnC,eAAW,OAAO,gBAAgB;AAChC,YAAM,QAAQ,YAAY,OAAO,GAAG,KAAK,YAAY,IAAI,GAAG,EAAE;AAC9D,sBAAgB,KAAK,KAAK;AAC1B,mBAAa,KAAK,IAAI;AAAA,QACpB,MAAM;AAAA,QACN,OAAO;AAAA,UACL,QAAQ,IAAI;AAAA,UACZ,YAAY,GACV,OAAO,QAAQ,eAAe,YAAY,QAAQ,WAAW,SAAS,IAClE,QAAQ,aACR,UACN,IAAI,IAAI,GAAG;AAAA,UACX,SAAS,gBAAgB,QAAQ,MAAM,IAAI,GAAG;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AACA,iBAAa,YAAY,IAAI;AAAA,MAC3B,MAAM;AAAA,MACN,OAAO,EAAE,KAAK,KAAK;AAAA,MACnB,UAAU;AAAA,IACZ;AAEA,QAAI,KAAK,SAAS,OAAO;AAEvB,YAAM,WAAW,YAAY,OAAO,GAAG,KAAK,aAAa;AACzD,mBAAa,QAAQ,IAAI;AAAA,QACvB,MAAM;AAAA,QACN,OAAO,EAAE,KAAK,KAAK;AAAA,QACnB,UAAU,CAAC,cAAc,KAAK;AAAA,MAChC;AACA,mBAAa,KAAK,IAAI;AACtB,iBAAW;AAAA,IACb,OAAO;AACL,YAAM,YAAY,cAAc,MAAM,KAAK;AAC3C,UAAI,aAAa,MAAM;AAGrB,qBAAa,KAAK,IAAI;AACtB,YAAI;AAAA,UACF,cAAc,KAAK;AAAA,UACnB,EAAE,YAAY,MAAM;AAAA,QACtB;AAAA,MACF,OAAO;AACL,cAAM,SAAS,aAAa,SAAS,KAAK,SAAS,SAAS;AAC5D,cAAM,iBAAiB,MAAM,QAAQ,OAAO,QAAQ,IAAI,CAAC,GAAG,OAAO,QAAQ,IAAI,CAAC;AAChF,cAAM,MAAM,eAAe,QAAQ,KAAK;AACxC,YAAI,OAAO,EAAG,gBAAe,OAAO,KAAK,GAAG,YAAY;AAAA,YACnD,gBAAe,KAAK,YAAY;AACrC,qBAAa,SAAS,IAAI,EAAE,GAAG,QAAQ,UAAU,eAAe;AAChE,qBAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAEA,QAAI;AAAA,MACF,cAAc,KAAK,eAAe,eAAe,MAAM,+EAA0E,YAAY,mBAC1I,WAAW,MAAkC,UAChD;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ;AAAA,QACA,SAAS,eAAe,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,MAC1C;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,MAAM,UAAU,UAAU,aAAa;AAC3D;AAEO,IAAM,yCAA0D;AAAA,EACrE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAASA;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AACF;;;ACzNA,IAAM,cAAuC,oBAAI,IAAgB,CAAC,QAAQ,UAAU,MAAM,CAAC;AAG3F,SAAS,SAAS,IAAiC;AACjD,QAAM,IAAK,GAAG,SAAS,CAAC;AACxB,QAAM,MAAM,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,SAAS,IACtD,EAAE,OACF,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,SAAS,IAC5C,EAAE,OACF;AACN,SAAQ,YAAY,IAAI,GAAiB,IAAI,MAAM;AACrD;AAGA,SAASC,aAAY,OAAoB,MAAsB;AAC7D,MAAI,CAAC,MAAM,IAAI,IAAI,GAAG;AACpB,UAAM,IAAI,IAAI;AACd,WAAO;AAAA,EACT;AACA,MAAI,IAAI;AACR,SAAO,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAG,MAAK;AACvC,QAAM,IAAI,GAAG,IAAI,IAAI,CAAC;AACtB,QAAM,IAAI,CAAC;AACX,SAAO;AACT;AAEA,SAASC,kBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU,QAAO;AACtB,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,GAAG,SAAS,eAAgB,QAAO;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAASC,UAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,MAAI,WAAW;AACf,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,GAAG,SAAS,eAAgB;AAChC,aAAS,KAAK,GAAG;AAEjB,QAAI,SAAS,EAAE,MAAM,OAAQ,aAAY;AAAA,EAC3C;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,SAAS,WAAW,IAChB,mCACA,qCAAqC,SAAS,MAAM,uBAAkB,QAAQ;AAAA,EACtF;AACF;AAEA,SAAS,WACP,SACA,QACA,OACA,KACsE;AACtE,QAAM,OAAO,SAAS,MAAM;AAC5B,QAAM,QAAS,OAAO,SAAS,CAAC;AAChC,QAAM,QAAQ,MAAM;AACpB,QAAM,aAAa,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS;AAE/E,MAAI,YAAY;AACd,QAAI;AAAA,MACF,iBAAiB,OAAO,wCAAwC,OAAO,MAAM,OAAO,CAAC;AAAA,MACrF,EAAE,YAAY,SAAS,MAAM,WAAW,OAAO,MAAM,QAAQ;AAAA,IAC/D;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,MACL,SAAS,EAAE,CAAC,OAAO,GAAG,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,EAAE,EAAE;AAAA,MAC7D,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,MACL,SAAS,EAAE,CAAC,OAAO,GAAG,EAAE,MAAM,kBAAkB,OAAO,EAAE,MAAM,EAAE,EAAE;AAAA,MACnE,YAAY;AAAA,IACd;AAAA,EACF;AAGA,QAAM,YAAYF,aAAY,OAAO,GAAG,OAAO,UAAU;AACzD,QAAM,UAAUA,aAAY,OAAO,GAAG,OAAO,QAAQ;AACrD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,CAAC,OAAO,GAAG;AAAA,QACT,MAAM;AAAA,QACN,OAAO,EAAE,KAAK,KAAK;AAAA,QACnB,UAAU,CAAC,WAAW,OAAO;AAAA,MAC/B;AAAA,MACA,CAAC,SAAS,GAAG,EAAE,MAAM,kBAAkB,OAAO,EAAE,MAAM,EAAE;AAAA,MACxD,CAAC,OAAO,GAAG,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,EAAE;AAAA,IAClD;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEA,SAASG,WAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,MAAI,CAACF,kBAAiB,IAAI,EAAG,QAAO;AAEpC,MAAI,IAAI,QAAQ;AACd,eAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,UAAI,GAAG,SAAS,eAAgB;AAChC,YAAM,IAAI,SAAS,EAAE;AACrB,UAAI;AAAA,QACF,iBAAiB,GAAG,WAAW,CAAC,yBAC9B,MAAM,SACF,aACA,MAAM,WACJ,mBACA,iCACR;AAAA,QACA,EAAE,YAAY,KAAK,MAAM,EAAE;AAAA,MAC7B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;AAC3C,QAAM,eAAgD,EAAE,GAAG,SAAS;AACpE,MAAI,UAAU;AAEd,aAAW,CAAC,SAAS,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACxD,QAAI,OAAO,SAAS,eAAgB;AACpC,UAAM,EAAE,SAAS,WAAW,IAAI,WAAW,SAAS,QAAQ,OAAO,GAAG;AACtE,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,EAAG,cAAa,CAAC,IAAI;AAChE,QAAI;AAAA,MACF,iBAAiB,OAAO,qBAAqB,UAAU,YACrD,eAAe,SACX,oCACA,eAAe,WACb,mBACA,UACR;AAAA,MACA,EAAE,YAAY,SAAS,MAAM,WAAW;AAAA,IAC1C;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,UAAU,aAAa;AAC3C;AAEO,IAAM,qCAAsD;AAAA,EACjE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAASA;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AACF;;;ACvMA,IAAM,WAAW;AAEjB,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE;AAC9E;AAEA,SAAS,iBAAiB,KAAc,KAA2C;AACjF,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,UAAU,IAAI,KAAK;AACzB,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAM,IAAI,SAAS,KAAK,OAAO;AAC/B,QAAI,EAAG,QAAO,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE;AAIzD,UAAMC,MAAK,UAAU,OAAO,KAAK,QAAQ,GAAG;AAC5C,WAAO,EAAE,IAAAA,KAAI,OAAO,QAAQ;AAAA,EAC9B;AACA,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAM;AACZ,QAAM,WAAW,IAAI,SAAS,IAAI,QAAQ,IAAI;AAC9C,QAAM,QAAQ,OAAO,aAAa,YAAY,SAAS,SAAS,IAAI,WAAW,QAAQ,MAAM,CAAC;AAC9F,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAM,KAAK,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ,UAAU,KAAK,KAAK,QAAQ,GAAG;AAClG,QAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AACvD,QAAM,eAAe,IAAI,aAAa,IAAI,cAAc,IAAI;AAC5D,QAAM,YAAY,OAAO,iBAAiB,WAAW,eAAe;AACpE,SAAO,EAAE,IAAI,OAAO,MAAM,UAAU;AACtC;AAiBO,SAAS,wBAAwB,KAAuC;AAC7E,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO,CAAC;AAE/C,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IACJ,IAAI,CAAC,IAAI,MAAM,iBAAiB,IAAI,CAAC,CAAC,EACtC,OAAO,CAAC,OAAoC,OAAO,IAAI;AAAA,EAC5D;AACA,MAAI,OAAO,QAAQ,SAAU,QAAO,CAAC;AACrC,QAAM,MAAM;AAEZ,MAAI,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAC/B,UAAM,QAAiC,CAAC;AACxC,QAAI,UAAU;AACd,eAAW,OAAO,IAAI,UAAuB;AAC3C,UAAI,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAS,IAA8B,KAAK,GAAG;AACzF,mBAAW,MAAO,IAA6B,OAAO;AACpD,gBAAM,IAAI,iBAAiB,IAAI,SAAS;AACxC,cAAI,EAAG,OAAM,KAAK,CAAC;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,CAAC,SAAS,cAAc,MAAM,GAAY;AAC1D,UAAM,MAAM,IAAI,GAAG;AACnB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,aAAO,IACJ,IAAI,CAAC,IAAI,MAAM,iBAAiB,IAAI,CAAC,CAAC,EACtC,OAAO,CAAC,OAAoC,OAAO,IAAI;AAAA,IAC5D;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAuCO,SAAS,2BACd,YACA,UACA,YAAmC,CAAC,GACb;AACvB,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAGnC,MAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpD,UAAM,WAAkC,CAAC;AACzC,eAAW,QAAQ,UAAU;AAC3B,YAAM,WAAW,KAAK,WAAW,QAAQ,MAAM,EAAE,KAAK;AACtD,YAAM,MACJ,WAAW,KAAK,EAAE,MACd,SAAS,SAAS,IAAI,WAAW,QAAQ,IAAI;AACnD,UAAI,QAAQ,OAAW;AAGvB,YAAM,aAAa,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,IAAI;AACjG,UAAI,OAAO,eAAe,YAAY,WAAW,SAAS,GAAG;AAC3D,iBAAS,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC;AAAA,MACrC;AAAA,IACF;AACA,QAAI,SAAS,SAAS,EAAG,QAAO;AAAA,EAClC;AAGA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,YAAY,UAAU,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AACtD,UAAM,UAAiC,CAAC;AACxC,eAAW,QAAQ,UAAU;AAC3B,YAAM,aAAa,CAAC,KAAK,IAAI,KAAK,WAAW,QAAQ,MAAM,EAAE,CAAC,EAC3D,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC;AACnE,UAAI;AACJ,iBAAW,QAAQ,YAAY;AAC7B,cAAM,QAAQ,UAAU,KAAK,CAAC,MAAM,MAAM,QAAQ,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;AACxE,YAAI,OAAO;AAAE,gBAAM;AAAO;AAAA,QAAM;AAChC,cAAM,QAAQ,KAAK,YAAY;AAC/B,cAAM,MAAM,UAAU,QAAQ,KAAK;AACnC,YAAI,OAAO,GAAG;AAAE,gBAAM,UAAU,GAAG;AAAG;AAAA,QAAM;AAAA,MAC9C;AACA,UAAI,IAAK,SAAQ,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;AAAA,IACtC;AACA,QAAI,QAAQ,WAAW,SAAS,OAAQ,QAAO;AAAA,EACjD;AAGA,SAAO,SAAS,IAAI,CAAC,MAAM,MAA2B;AAAA,IACpD,KAAK;AAAA,IACL,UAAU,CAAC,KAAK,GAAG,KAAK,EAAE;AAAA,EAC5B,CAAC;AACH;;;AClGA,SAAS,YAAY,QAAiC;AACpD,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO,CAAC;AACnD,QAAM,UAAW,OAAiC;AAClD,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,CAAC;AACrC,SAAO,QACJ;AAAA,IACC,CAAC,MACC,MAAM,QACH,OAAO,MAAM,YACb,OAAQ,EAA0B,UAAU,YAC5C,OAAQ,EAA2B,WAAW;AAAA,EACrD,EACC,IAAI,CAAC,MAAM;AACV,UAAM,MAAoB,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAC7D,UAAM,UAAW,EAA4B;AAC7C,QAAI,YAAY,aAAa,YAAY,eAAe,YAAY,SAAS;AAC3E,UAAI,UAAU;AAAA,IAChB;AACA,UAAM,OAAQ,EAAyB;AACvC,QAAI,OAAO,SAAS,SAAU,KAAI,OAAO;AACzC,WAAO;AAAA,EACT,CAAC;AACL;AAEA,SAAS,eAAe,KAAoD;AAC1E,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAM;AACZ,QAAM,MAAgC,CAAC;AACvC,MAAI,MAAM;AACV,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,QAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,YAAM,QAAQ,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAChE,UAAI,MAAM,SAAS,GAAG;AACpB,YAAI,CAAC,IAAI;AACT,cAAM;AAAA,MACR;AAAA,IACF,WAAW,OAAO,MAAM,YAAY,EAAE,SAAS,GAAG;AAChD,UAAI,CAAC,IAAI,CAAC,CAAC;AACX,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO,MAAM,MAAM;AACrB;AAEA,SAASC,aAAY,OAAoB,MAAsB;AAC7D,MAAI,CAAC,MAAM,IAAI,IAAI,GAAG;AACpB,UAAM,IAAI,IAAI;AACd,WAAO;AAAA,EACT;AACA,MAAI,IAAI;AACR,SAAO,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAG,MAAK;AACvC,QAAM,IAAI,GAAG,IAAI,IAAI,CAAC;AACtB,QAAM,IAAI,CAAC;AACX,SAAO;AACT;AAEA,SAASC,kBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU,QAAO;AACtB,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,GAAG,SAAS,kBAAmB,QAAO;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAASC,UAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,MAAI,WAAW;AACf,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,GAAG,SAAS,kBAAmB;AACnC,aAAS,KAAK,GAAG;AACjB,UAAM,IAAK,GAAG,SAAS,CAAC;AACxB,UAAM,WAAW,wBAAwB,EAAE,OAAO;AAClD,QAAI,SAAS,SAAS,GAAG;AAKvB,kBAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,SAAS,WAAW,IAChB,sCACA,wCAAwC,SAAS,MAAM,uBAAkB,QAAQ;AAAA,EACzF;AACF;AAUA,SAASC,YACP,SACA,QACA,cACA,OACiB;AACjB,QAAM,IAAK,OAAO,SAAS,CAAC;AAC5B,QAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AACtD,QAAM,WAAW,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC/D,QAAM,UAAU,YAAY,EAAE,MAAM;AACpC,QAAM,WAAW,wBAAwB,EAAE,OAAO;AAClD,QAAM,YAAY,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,SAAS,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;AACxH,QAAM,aAAa,eAAe,EAAE,UAAU;AAG9C,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,YAA6B;AAAA,MACjC,MAAM;AAAA,MACN,OAAO;AAAA,QACL;AAAA,QACA,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,QAC7C,GAAI,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAIA,GAAI,UAAU,SAAS,IAAI,EAAE,UAAU,UAAU,IAAI,CAAC;AAAA,IACxD;AACA,WAAO;AAAA,MACL,SAAS,EAAE,CAAC,OAAO,GAAG,UAAU;AAAA,MAChC,sBAAsB,CAAC;AAAA,MACvB,cAAc;AAAA,MACd,cAAc;AAAA,MACd,SAAS;AAAA,IACX;AAAA,EACF;AAGA,QAAM,UAAUH,aAAY,OAAO,GAAG,OAAO,QAAQ;AACrD,QAAM,SAASA,aAAY,OAAO,GAAG,OAAO,OAAO;AACnD,QAAM,UAAUA,aAAY,OAAO,GAAG,OAAO,QAAQ;AAErD,QAAM,iBAAiB,2BAA2B,YAAY,UAAU,SAAS;AAEjF,QAAM,qBAAsD,CAAC;AAC7D,QAAM,uBAAiC,CAAC;AACxC,QAAM,sBAAgC,CAAC;AAEvC,aAAW,CAAC,WAAW,UAAU,KAAK,gBAAgB;AACpD,QAAI,WAAW,SAAS,cAAc,KAAK,CAAC,aAAa,IAAI,UAAU,GAAG;AAIxE,YAAM,iBAAiBA,aAAY,OAAO,GAAG,OAAO,kBAAkB,SAAS,EAAE;AACjF,yBAAmB,cAAc,IAAI;AAAA,QACnC,MAAM;AAAA,QACN,OAAO,CAAC;AAAA,MACV;AACA,2BAAqB,KAAK,cAAc;AACxC,0BAAoB,KAAK,cAAc;AAAA,IACzC,OAAO;AACL,0BAAoB,KAAK,UAAU;AAAA,IACrC;AAAA,EACF;AAKA,QAAM,YAAY,GAAG,OAAO;AAE5B,QAAM,UAA2C;AAAA,IAC/C,CAAC,OAAO,GAAG;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,QACL;AAAA,QACA,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,QAC7C,GAAI,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC1C;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,IACA,CAAC,OAAO,GAAG;AAAA,MACT,MAAM;AAAA,MACN,OAAO,EAAE,KAAK,OAAO;AAAA,MACrB,UAAU,CAAC,QAAQ,OAAO;AAAA,IAC5B;AAAA,IACA,CAAC,MAAM,GAAG;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,QACL,OAAO,SAAS,IAAI,CAAC,QAAQ;AAAA,UAC3B,IAAI,GAAG;AAAA,UACP,OAAO,GAAG;AAAA,UACV,GAAI,GAAG,SAAS,SAAY,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC;AAAA,QACnD,EAAE;AAAA,QACF,mBAAmB,SAAS,CAAC,GAAG;AAAA,QAChC,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA,CAAC,OAAO,GAAG;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU,eAAe,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;AAAA,QAC/C,cAAc;AAAA,MAChB;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAc,SAAS;AAAA,IACvB,cAAc,eAAe;AAAA,IAC7B,SAAS;AAAA,EACX;AACF;AAEA,SAASI,WAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,MAAI,CAACH,kBAAiB,IAAI,EAAG,QAAO;AAGpC,MAAI,IAAI,QAAQ;AACd,eAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,UAAI,GAAG,SAAS,kBAAmB;AACnC,YAAM,IAAK,GAAG,SAAS,CAAC;AACxB,YAAM,WAAW,wBAAwB,EAAE,OAAO,EAAE;AACpD,UAAI;AAAA,QACF,aAAa,IACT,oBAAoB,GAAG,kFACvB,oBAAoB,GAAG,oDAAoD,QAAQ;AAAA,QACvF,EAAE,YAAY,KAAK,SAAS;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAoC,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;AACvE,QAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;AAC3C,QAAM,eAAgD,EAAE,GAAG,SAAS;AACpE,MAAI,UAAU;AAEd,aAAW,CAAC,SAAS,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACxD,QAAI,OAAO,SAAS,kBAAmB;AACvC,UAAM,MAAME,YAAW,SAAS,QAAQ,cAAc,KAAK;AAC3D,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,OAAO,EAAG,cAAa,CAAC,IAAI;AACpE,QAAI;AAAA,MACF,oBAAoB,OAAO,wBAAwB,IAAI,OAAO,YAC5D,IAAI,YAAY,eACZ,qCACA,8BAA8B,IAAI,YAAY,oBAAoB,IAAI,YAAY,IACxF;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,cAAc,IAAI;AAAA,QAClB,cAAc,IAAI;AAAA,MACpB;AAAA,IACF;AACA,eAAW,kBAAkB,IAAI,sBAAsB;AACrD,UAAI;AAAA,QACF,oBAAoB,OAAO,oCAAoC,cAAc;AAAA,QAC7E,EAAE,YAAY,SAAS,eAAe;AAAA,MACxC;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,UAAU,aAAa;AAC3C;AAEO,IAAM,wCAAyD;AAAA,EACpE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAASF;AAAA,EACT,UAAAC;AAAA,EACA,WAAAE;AACF;;;ACrWA,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAEvB,SAAS,gBAAgB,IAA0C;AACjE,MAAI,CAAC,MAAM,GAAG,SAAS,eAAgB,QAAO;AAC9C,QAAM,QAAQ,GAAG;AACjB,MAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO;AACvD,SAAO,iBAAiB;AAC1B;AAEA,SAASC,kBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,gBAAgB,EAAE,EAAG,QAAO;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAASC,UAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,gBAAgB,EAAE,EAAG,UAAS,KAAK,GAAG;AAAA,EAC5C;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,SAAS,SAAS,IACd,0DAA0D,SAAS,MAAM,gBACzE;AAAA,EACR;AACF;AAEA,SAAS,WACP,KACA,IACA,KACiB;AACjB,QAAM,QAAS,GAAG,SAAS,CAAC;AAC5B,QAAM,YAAqC,CAAC;AAC5C,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,QAAI,MAAM,cAAe;AACzB,cAAU,CAAC,IAAI;AAAA,EACjB;AACA,MAAI;AAAA,IACF,gBAAgB,GAAG;AAAA,IACnB,EAAE,YAAY,KAAK,SAAS,CAAC,aAAa,EAAE;AAAA,EAC9C;AACA,SAAO,EAAE,GAAG,IAAI,OAAO,UAAU;AACnC;AAEA,SAASC,WAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,MAAI,CAACF,kBAAiB,IAAI,EAAG,QAAO;AAEpC,QAAM,eAAgD,CAAC;AACvD,MAAI,UAAU;AACd,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,CAAC,gBAAgB,EAAE,GAAG;AACxB,mBAAa,GAAG,IAAI;AACpB;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AAEd,iBAAW,KAAK,IAAI,GAAG;AACvB,mBAAa,GAAG,IAAI;AACpB;AAAA,IACF;AACA,iBAAa,GAAG,IAAI,WAAW,KAAK,IAAI,GAAG;AAC3C,cAAU;AAAA,EACZ;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,UAAU,aAAa;AAC3C;AAEO,IAAM,oCAAqD;AAAA,EAChE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAASA;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AACF;;;AC3FA,IAAMC,kBAAiB;AAEvB,SAAS,YAAY,IAA0C;AAC7D,MAAI,CAAC,MAAM,GAAG,SAASA,gBAAgB,QAAO;AAC9C,QAAM,QAAQ,GAAG;AACjB,MAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO;AACvD,SAAQ,MAA6B,SAAS;AAChD;AAEA,SAASC,kBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,YAAY,EAAE,EAAG,QAAO;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAASC,UAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,YAAY,EAAE,EAAG,UAAS,KAAK,GAAG;AAAA,EACxC;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,SAAS,SAAS,IACd,8EAAyE,SAAS,MAAM,gBACxF;AAAA,EACR;AACF;AAEA,SAAS,YACP,KACA,IACA,KACiB;AACjB,QAAM,QAAS,GAAG,SAAS,CAAC;AAC5B,QAAM,YAAqC,EAAE,GAAG,OAAO,MAAM,OAAO;AACpE,MAAI;AAAA,IACF,oBAAoB,GAAG;AAAA,IACvB,EAAE,YAAY,KAAK,MAAM,QAAQ,IAAI,OAAO;AAAA,EAC9C;AACA,SAAO,EAAE,GAAG,IAAI,OAAO,UAAU;AACnC;AAEA,SAASC,WAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,MAAI,CAACF,kBAAiB,IAAI,EAAG,QAAO;AAEpC,QAAM,eAAgD,CAAC;AACvD,MAAI,UAAU;AACd,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,CAAC,YAAY,EAAE,GAAG;AACpB,mBAAa,GAAG,IAAI;AACpB;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AAEd,kBAAY,KAAK,IAAI,GAAG;AACxB,mBAAa,GAAG,IAAI;AACpB;AAAA,IACF;AACA,iBAAa,GAAG,IAAI,YAAY,KAAK,IAAI,GAAG;AAC5C,cAAU;AAAA,EACZ;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,UAAU,aAAa;AAC3C;AAEO,IAAM,2CAA4D;AAAA,EACvE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAASA;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AACF;;;AC5GA,SAAS,SAAS;AAClB,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AACvB,SAAS,kCAAkC;AAG3C,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAExB,IAAM,aAAa;AAAA,EACxB,YAAY;AAAA,IACV,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,OAAO;AAAA,UACd,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,UAC7B,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,UACxB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,UAC7B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,UAC/B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,UAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,UAC7B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,UAC9B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC/B,CAAC;AAAA,MACH,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAeJ;AAAA,IACA,SAAS;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC;AAAA,QACvC,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,OAAO,EAAE,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC,EAAE,SAAS;AAAA,QAC/C,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,YAAY,EAAE,OAAO;AAAA,UACnB,SAAS,EAAE,OAAO;AAAA,UAClB,UAAU,EAAE,OAAO;AAAA,QACrB,CAAC,EAAE,SAAS;AAAA,QACZ,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,QACxC,SAAS,EAAE,KAAK,CAAC,WAAW,WAAW,WAAW,YAAY,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOhF,aAAa,EAAE,KAAK,CAAC,QAAQ,SAAS,OAAO,SAAS,QAAQ,QAAQ,CAAC,EAAE,SAAS;AAAA,QAClF,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,QAC1C,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,CAAC;AAAA,MACD,aACE;AAAA,IAUJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,YAAY;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,QACd,SAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,SAAS,EACtF,SAAS,yKAAyK;AAAA,QACrL,SAAS,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC,EAAE,SAAS,EAC5C,SAAS,iOAAwM;AAAA,MACtN,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAaJ;AAAA,IACA,WAAW;AAAA,MACT,OAAO,EAAE,OAAO;AAAA,QACd,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,UACxB,KAAK,EAAE,OAAO;AAAA,UACd,OAAO,EAAE,OAAO;AAAA,UAChB,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,UAC/B,MAAM,EAAE,KAAK,CAAC,QAAQ,UAAU,SAAS,YAAY,SAAS,CAAC,EAAE,SAAS;AAAA,UAC1E,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC;AAAA,QACF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,QAC/C,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC/B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,QAClC,YAAY,EAAE,OAAO,EAAE,SAAS,EAC7B,SAAS,2UAAuT;AAAA,QACnU,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,gTAAiS;AAAA,QAC7S,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,wPAAoO;AAAA,MAClP,CAAC;AAAA,MACD,aACE;AAAA,IAeJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,cAAc;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,YAAY,EAAE,QAAQ,EAAE,SAAS,EAC9B,SAAS,0HAA0H;AAAA,QACtI,YAAY,EAAE,OAAO,EAAE,SAAS,EAC7B,SAAS,oKAAoK;AAAA,QAChL,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,UACxB,OAAO,EAAE,OAAO;AAAA,UAChB,QAAQ,EAAE,OAAO;AAAA,UACjB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,CAAC,CAAC,EAAE,SAAS,EACV,SAAS,oIAAoI;AAAA,QAChJ,aAAa,EAAE,OAAO,EAAE,SAAS,EAC9B,SAAS,4DAAuD;AAAA,MACrE,CAAC;AAAA,MACD,OAAO,CAAC;AAAA,MACR,QAAQ,CAAC,iBAAiB,QAAQ;AAAA,MAClC,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,SAAS;AAAA,YACP,EAAE,OAAO,cAAc,QAAQ,gBAAgB,MAAM,SAAI;AAAA,YACzD,EAAE,OAAO,WAAW,QAAQ,gBAAgB;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA,MACA,aACE;AAAA,IAWJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,cAAc;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,QACd,QAAQ,EAAE,OAAO,EACd,SAAS,gGAAgG;AAAA,QAC5G,YAAY,EAAE,OAAO,EAClB,SAAS,yNAAyN;AAAA,QACrO,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,UACxB,OAAO,EAAE,OAAO;AAAA,UAChB,OAAO,EAAE,OAAO;AAAA,QAClB,CAAC,CAAC,EAAE,SAAS,EACV,SAAS,6LAAwL;AAAA,QACpM,UAAU,EAAE,QAAQ,EAAE,SAAS,EAC5B,SAAS,2HAA2H;AAAA,QACvI,aAAa,EAAE,OAAO,EAAE,SAAS,EAC9B,SAAS,sEAAsE;AAAA,QAClF,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,qDAAqD;AAAA,MACnE,CAAC;AAAA,MACD,OAAO,CAAC;AAAA,MACR,QAAQ,CAAC,eAAe;AAAA,MACxB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,SAAS;AAAA,YACP,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,YACnC,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,MACA,aACE;AAAA,IASJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaA,UAAU;AAAA,MACR,OAAO,EAAE,OAAO;AAAA,QACd,SAAS,EAAE,OAAO,EACf,SAAS,sHAAsH;AAAA,QAClI,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EACpC,SAAS,6HAA6H;AAAA,QACzI,cAAc,EAAE,OAAO,EAAE,SAAS,EAC/B,SAAS,8HAA8H;AAAA,QAC1I,cAAc,EAAE,MAAM,EAAE,OAAO;AAAA,UAC7B,QAAQ,EAAE,OAAO;AAAA,UACjB,KAAK,EAAE,KAAK,CAAC,OAAO,OAAO,SAAS,OAAO,KAAK,CAAC;AAAA,UACjD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC,EAAE,SAAS,EACV,SAAS,+HAA+H;AAAA,QAC3I,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,4DAA4D;AAAA,MAC1E,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,QAAQ,CAAC,cAAc;AAAA,MACvB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc,CAAC,EAAE,QAAQ,SAAS,KAAK,OAAO,OAAO,WAAW,CAAC;AAAA,QACnE;AAAA,QACA,UAAU,CAAC,kBAAkB;AAAA,MAC/B;AAAA,MACA,aACE;AAAA,IAcJ;AAAA,IACA,WAAW;AAAA,MACT,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,MAAM,EAAE,OAAO;AAAA,UACrB,MAAM,EAAE,OAAO;AAAA,UACf,QAAQ,EAAE,OAAO;AAAA,UACjB,QAAQ,EAAE,OAAO;AAAA,UACjB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC;AAAA,QACF,MAAM,EAAE,OAAO;AAAA,QACf,YAAY,EAAE,QAAQ,EAAE,SAAS;AAAA,QACjC,OAAO,EAAE,OAAO;AAAA,UACd,MAAM,EAAE,OAAO;AAAA,UACf,SAAS,EAAE,OAAO;AAAA,QACpB,CAAC,EAAE,SAAS;AAAA,QACZ,aAAa,EAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,MAC3D,CAAC;AAAA,MACD,aACE;AAAA,IAUJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,MAAM,EAAE,OAAO;AAAA,UACrB,IAAI,EAAE,OAAO;AAAA,UACb,OAAO,EAAE,OAAO;AAAA,UAChB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAChC,CAAC,CAAC;AAAA,QACF,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,QAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,KAAK,CAAC,WAAW,WAAW,WAAW,IAAI,CAAC,CAAC,CAAC;AAAA,QACjG,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC/B,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,MACrC,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,UAAU;AAAA,MACR,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,MAAM,EAAE,OAAO;AAAA,UACtB,IAAI,EAAE,OAAO;AAAA,UACb,OAAO,EAAE,OAAO;AAAA,UAChB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,UACjC,UAAU,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,CAAC;AAAA,UACtD,YAAY,EAAE,KAAK,CAAC,YAAY,YAAY,UAAU,SAAS,CAAC;AAAA,UAChE,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,UAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ,cAAc,YAAY,QAAQ,CAAC;AAAA,UAC3D,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC;AAAA,QACF,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,4DAA4D;AAAA,QACxE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,4FAA4F;AAAA,MAC1G,CAAC;AAAA,MACD,aACE;AAAA,IAWJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,gBAAgB;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,MAAM,EAAE,OAAO;AAAA,UACtB,IAAI,EAAE,OAAO;AAAA,UACb,OAAO,EAAE,OAAO;AAAA,UAChB,UAAU,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,CAAC;AAAA,UACtD,YAAY,EAAE,KAAK,CAAC,YAAY,YAAY,UAAU,SAAS,CAAC;AAAA,UAChE,QAAQ,EAAE,KAAK,CAAC,QAAQ,cAAc,YAAY,QAAQ,CAAC;AAAA,QAC7D,CAAC,CAAC;AAAA,MACJ,CAAC;AAAA,MACD,aACE;AAAA,IAYJ;AAAA,IACA,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,QAAQ,EAAE,MAAM,EAAE,OAAO;AAAA,UACvB,OAAO,EAAE,OAAO;AAAA,UAChB,QAAQ,EAAE,OAAO;AAAA,UACjB,YAAY,EAAE,KAAK,CAAC,eAAe,aAAa,cAAc,eAAe,cAAc,WAAW,CAAC;AAAA,UACvG,UAAU,EAAE,QAAQ;AAAA,UACpB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,UAC7B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,CAAC,CAAC;AAAA,QACF,aAAa,EAAE,KAAK,CAAC,YAAY,YAAY,CAAC,EAAE,SAAS;AAAA,QACzD,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,wDAAwD;AAAA,QACpE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,0DAA0D;AAAA,MACxE,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,oBAAoB;AAAA,MAClB,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,MAAM,EAAE,OAAO;AAAA,UAC5B,IAAI,EAAE,OAAO;AAAA,UACb,MAAM,EAAE,OAAO;AAAA,UACf,OAAO,EAAE,OAAO;AAAA,UAChB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,QAAQ,EAAE,KAAK,CAAC,YAAY,WAAW,cAAc,SAAS,CAAC;AAAA,UAC/D,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,UACtC,QAAQ,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,QACrD,CAAC,CAAC;AAAA,QACF,YAAY,EAAE,QAAQ,EAAE,SAAS;AAAA,QACjC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,2DAA2D;AAAA,QACvE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,6DAA6D;AAAA,MAC3E,CAAC;AAAA,MACD,aACE;AAAA,IAOJ;AAAA,IACA,kBAAkB;AAAA,MAChB,OAAO,EAAE,OAAO;AAAA,QACd,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,QAC3B,UAAU,EAAE,MAAM,EAAE,OAAO;AAAA,UACzB,MAAM,EAAE,OAAO;AAAA,UACf,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,CAAC,CAAC;AAAA,QACF,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAAA,QACnC,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,QACnC,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,QACpC,YAAY,EAAE,OAAO;AAAA,UACnB,KAAK,EAAE,OAAO;AAAA,UACd,KAAK,EAAE,OAAO;AAAA,QAChB,CAAC,EAAE,SAAS;AAAA,QACZ,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,+DAA+D;AAAA,QAC3E,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,2DAA2D;AAAA,MACzE,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,UAAU;AAAA,MACR,OAAO,EAAE,OAAO;AAAA,QACd,QAAQ,EAAE,MAAM,EAAE,OAAO;AAAA,UACvB,IAAI,EAAE,OAAO;AAAA,UACb,MAAM,EAAE,OAAO;AAAA,UACf,OAAO,EAAE,OAAO;AAAA,UAChB,QAAQ,EAAE,KAAK,CAAC,aAAa,eAAe,YAAY,SAAS,CAAC,EAAE,SAAS;AAAA,UAC7E,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,UACjC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EACxC,SAAS,gPAAgP;AAAA,QAC9P,CAAC,CAAC;AAAA,QACF,aAAa,EAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,QACzD,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EACpC,SAAS,8QAA8Q;AAAA,QAC1R,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,2DAA2D;AAAA,QACvE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,6DAA6D;AAAA,MAC3E,CAAC;AAAA,MACD,aACE;AAAA,IAMJ;AAAA,IACA,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,QAAQ,EAAE,OAAO;AAAA,QACjB,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO;AAAA,UACnC,OAAO,EAAE,OAAO;AAAA,UAChB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UACvC,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,UACjD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC;AAAA,QACF,YAAY,EAAE,QAAQ,EAAE,SAAS;AAAA,QACjC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,QAC9C,YAAY,EAAE,OAAO;AAAA,UACnB,OAAO,EAAE,OAAO;AAAA,UAChB,aAAa,EAAE,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC;AAAA,QAC7C,CAAC,EAAE,SAAS;AAAA,QACZ,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,wDAAwD;AAAA,QACpE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,yDAAyD;AAAA,MACvE,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,QACd,UAAU,EAAE,MAAM,EAAE,OAAO;AAAA,UACzB,OAAO,EAAE,OAAO;AAAA,UAChB,OAAO,EAAE,OAAO;AAAA,UAChB,MAAM,EAAE,KAAK,CAAC,YAAY,YAAY,OAAO,CAAC;AAAA,UAC9C,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC;AAAA,QACF,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,gBAAgB,EAAE,QAAQ,EAAE,SAAS;AAAA,QACrC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,wDAAwD;AAAA,QACpE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,0DAA0D;AAAA,MACxE,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,MAAM,EAAE,OAAO;AAAA,UACtB,OAAO,EAAE,OAAO;AAAA,UAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,QAAQ,WAAW,WAAW,IAAI,CAAC;AAAA,UAC3D,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,CAAC,CAAC;AAAA,QACF,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,QACnC,SAAS,EAAE,KAAK,CAAC,eAAe,SAAS,CAAC,EAAE,SAAS;AAAA,QACrD,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,mEAAmE;AAAA,QAC/E,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,0DAA0D;AAAA,MACxE,CAAC;AAAA,MACD,aACE;AAAA,IAaJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,UACxB,OAAO,EAAE,OAAO;AAAA,UAChB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,OAAO,EAAE,MAAM,EAAE,OAAO;AAAA,YACtB,IAAI,EAAE,OAAO;AAAA,YACb,OAAO,EAAE,OAAO;AAAA,YAChB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,YAC9B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,YACjC,QAAQ,EAAE,MAAM,EAAE,MAAM;AAAA,cACtB,EAAE,OAAO;AAAA,cACT,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,YAC9D,CAAC,CAAC,EAAE,SAAS;AAAA,YACb,UAAU,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,QAAQ,CAAC,EAAE,SAAS;AAAA,UACjE,CAAC,CAAC;AAAA,QACJ,CAAC,CAAC;AAAA,QACF,WAAW,EAAE,QAAQ,EAAE,SAAS,EAC7B,SAAS,6SAAwS;AAAA,QACpT,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,8DAA8D;AAAA,QAC1E,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,0DAA0D;AAAA,MACxE,CAAC;AAAA,MACD,aACE;AAAA,IAYJ;AAAA,IACA,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,OAAO;AAAA,QAChB,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,UACxB,MAAM,EAAE,OAAO;AAAA,UACf,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,UACjC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,UACxB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,UACxB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,QACpC,CAAC,CAAC;AAAA,QACF,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,QACpC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,2DAA2D;AAAA,QACvE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,4DAA4D;AAAA,MAC1E,CAAC;AAAA,MACD,aACE;AAAA,IASJ;AAAA,IACA,SAAS;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAAA,QACjC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,QAC3B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,QAC3B,YAAY,EAAE,KAAK,CAAC,aAAa,YAAY,aAAa,QAAQ,CAAC,EAAE,SAAS;AAAA,QAC9E,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,QAC3C,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,QAChC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,CAAC;AAAA,MACD,aACE;AAAA,IAeJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,OAAO;AAAA,QAChB,QAAQ,EAAE,MAAM,EAAE,OAAO;AAAA,UACvB,MAAM,EAAE,KAAK,CAAC,QAAQ,UAAU,UAAU,YAAY,SAAS,YAAY,QAAQ,MAAM,CAAC;AAAA,UAC1F,MAAM,EAAE,OAAO;AAAA,UACf,OAAO,EAAE,OAAO;AAAA,UAChB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,UACjC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,UAC/B,YAAY,EAAE,OAAO;AAAA,YACnB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,YACzB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,YACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,YAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,UAC/B,CAAC,EAAE,SAAS;AAAA,UACZ,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,YACxB,OAAO,EAAE,OAAO;AAAA,YAChB,OAAO,EAAE,OAAO;AAAA,UAClB,CAAC,CAAC,EAAE,SAAS;AAAA,UACb,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QACjC,CAAC,CAAC;AAAA,QACF,gBAAgB,EAAE,MAAM,EAAE,OAAO;AAAA,UAC/B,MAAM,EAAE,OAAO;AAAA,UACf,OAAO,EAAE,OAAO;AAAA,UAChB,SAAS,EAAE,OAAO;AAAA,QACpB,CAAC,CAAC,EAAE,SAAS;AAAA,QACb,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,MACpC,CAAC;AAAA,MACD,aACE;AAAA,IAWJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBA,WAAW;AAAA,MACT,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,OAAO;AAAA,QAChB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,UACxB,OAAO,EAAE,OAAO;AAAA,UAChB,QAAQ,EAAE,OAAO;AAAA,UACjB,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,SAAS,aAAa,CAAC,EAAE,SAAS;AAAA,UAC3E,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,UAClC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,UACxC,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,QAChC,CAAC,CAAC,EAAE,SAAS;AAAA,QACb,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAC1B,SAAS,8DAA8D;AAAA;AAAA;AAAA;AAAA,QAI1E,QAAQ,EAAE,OAAO;AAAA,UACf,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,YACxB,OAAO,EAAE,OAAO;AAAA,YAChB,QAAQ,EAAE,OAAO;AAAA,YACjB,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,SAAS,aAAa,CAAC,EAAE,SAAS;AAAA,YAC3E,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,YAC1B,cAAc,EAAE,OAAO,EAAE,SAAS,EAC/B,SAAS,iGAAuF;AAAA,YACnG,oBAAoB,EAAE,OAAO,EAAE,SAAS,EACrC,SAAS,qDAAqD;AAAA,YACjE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,2FAA2F;AAAA,UACzG,CAAC,CAAC;AAAA,QACJ,CAAC,EAAE,SAAS;AAAA,QACZ,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,yLAAoL;AAAA,QAChM,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,gHAAgH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAM5H,QAAQ,EAAE,OAAO,EAAE,SAAS,EACzB,SAAS,inBAA4mB;AAAA,QACxnB,aAAa,EAAE,OAAO,EAAE,SAAS,EAC9B,SAAS,sRAA4L;AAAA,QACxM,UAAU,EAAE,OAAO,EAAE,SAAS,EAC3B,SAAS,4PAAyN;AAAA,MACvO,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAsBJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,SAAS;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,MAAM,EAAE,OAAO;AAAA,UACtB,IAAI,EAAE,OAAO;AAAA,UACb,OAAO,EAAE,OAAO;AAAA,UAChB,MAAM,EAAE,OAAO,EAAE,SAAS,EACvB,SAAS,4TAAgT;AAAA,UAC5T,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAC/C,SAAS,8PAA8P;AAAA,UAC1Q,UAAU,EAAE,QAAQ,EAAE,SAAS,EAC5B,SAAS,sQAAiQ;AAAA,QAC/Q,CAAC,CAAC;AAAA,QACF,cAAc,EAAE,OAAO,EAAE,SAAS,EAC/B,SAAS,uIAAuI;AAAA,QACnJ,mBAAmB,EAAE,OAAO,EAAE,SAAS,EACpC,SAAS,0EAA0E;AAAA,QACtF,aAAa,EAAE,QAAQ,EAAE,SAAS,EAC/B,SAAS,6EAA6E;AAAA,QACzF,UAAU,EAAE,OAAO,EAAE,SAAS,EAC3B,SAAS,qFAAqF;AAAA,MACnG,CAAC;AAAA,MACD,aACE;AAAA,IAiBJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,UAAU,EAAE,MAAM,EAAE,OAAO;AAAA,UACzB,IAAI,EAAE,OAAO;AAAA,QACf,CAAC,CAAC;AAAA,QACF,cAAc,EAAE,OAAO,EACpB,SAAS,2FAA2F;AAAA,MACzG,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAUJ;AAAA,IACA,YAAY;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,OAAO;AAAA,QACf,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,QAClC,YAAY,EAAE,MAAM,EAAE,OAAO;AAAA,UAC3B,OAAO,EAAE,OAAO;AAAA,UAChB,KAAK,EAAE,OAAO;AAAA,UACd,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC,EAAE,SAAS;AAAA,QACb,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,QAC/B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,MACjC,CAAC;AAAA,MACD,aACE;AAAA,IAMJ;AAAA,IACA,OAAO;AAAA,MACL,OAAO,EAAE,OAAO;AAAA,QACd,UAAU,EAAE,OAAO;AAAA,QACnB,WAAW,EAAE,OAAO;AAAA,QACpB,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,QAChC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAChC,CAAC;AAAA,MACD,aACE;AAAA,IAUJ;AAAA,IACA,iBAAiB;AAAA,MACf,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,MAAM,EAAE,OAAO;AAAA,UAC5B,IAAI,EAAE,OAAO;AAAA,UACb,UAAU,EAAE,OAAO;AAAA,UACnB,MAAM,EAAE,OAAO;AAAA,UACf,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,UAC/B,MAAM,EAAE,KAAK,CAAC,WAAW,YAAY,YAAY,WAAW,CAAC,EAAE,SAAS;AAAA,QAC1E,CAAC,CAAC;AAAA,QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAC7B,SAAS,gWAA2V;AAAA,MACzW,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAOJ;AAAA,IACA,YAAY;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,MAAM,EAAE,OAAO;AAAA,UACtB,IAAI,EAAE,OAAO;AAAA,UACb,MAAM,EAAE,OAAO;AAAA,UACf,OAAO,EAAE,OAAO;AAAA,UAChB,KAAK,EAAE,OAAO;AAAA,UACd,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,UAC9B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,QAC7C,CAAC,CAAC;AAAA,QACF,YAAY,EAAE,MAAM,EAAE,OAAO;AAAA,UAC3B,IAAI,EAAE,OAAO;AAAA,UACb,MAAM,EAAE,OAAO;AAAA,UACf,MAAM,EAAE,OAAO;AAAA,UACf,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,CAAC,CAAC,EAAE,SAAS;AAAA,QACb,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,QACvC,UAAU,EAAE,KAAK,CAAC,OAAO,QAAQ,OAAO,CAAC,EAAE,SAAS;AAAA,QACpD,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,QAChC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,wDAAwD;AAAA,QACpE,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,0DAA0D;AAAA,MACxE,CAAC;AAAA,MACD,aACE;AAAA,IASJ;AAAA,IACA,OAAO;AAAA,MACL,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,KAAK,CAAC,QAAQ,OAAO,QAAQ,OAAO,SAAS,WAAW,SAAS,aAAa,CAAC;AAAA,QACvF,QAAQ,EAAE,MAAM,EAAE,OAAO;AAAA,UACvB,MAAM,EAAE,OAAO;AAAA,UACf,MAAM,EAAE,MAAM,EAAE,MAAM;AAAA,YACpB,EAAE,OAAO;AAAA,YACT,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC;AAAA,YAChE,EAAE,OAAO;AAAA,cACP,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC;AAAA,cACnC,MAAM,EAAE,OAAO;AAAA,cACf,MAAM,EAAE,OAAO;AAAA,cACf,KAAK,EAAE,OAAO;AAAA,cACd,OAAO,EAAE,OAAO;AAAA,cAChB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,YAC9B,CAAC;AAAA,UACH,CAAC,CAAC;AAAA,UACF,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,CAAC,CAAC;AAAA,QACF,OAAO,EAAE,OAAO;AAAA,UACd,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UACzC,MAAM,EAAE,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,QACxD,CAAC,EAAE,SAAS;AAAA,QACZ,OAAO,EAAE,OAAO;AAAA,UACd,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,UACzB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,CAAC,EAAE,SAAS;AAAA,QACZ,aAAa,EAAE,MAAM,EAAE,OAAO;AAAA,UAC5B,MAAM,EAAE,KAAK,CAAC,QAAQ,MAAM,CAAC;AAAA,UAC7B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,UACxB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,OAAO,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,SAAS;AAAA,QAC9C,CAAC,CAAC,EAAE,SAAS;AAAA,QACb,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC7B,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC9B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,SAAS,EAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,+DAA+D;AAAA,QAC3E,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,iEAAiE;AAAA,MAC/E,CAAC;AAAA,MACD,aACE;AAAA,IAMJ;AAAA,IACA,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,KAAK,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,KAAK,CAAC,QAAQ,QAAQ,CAAC;AAAA,QAC/B,MAAM,EAAE,KAAK,CAAC,OAAO,SAAS,aAAa,CAAC,EAAE,SAAS;AAAA,QACvD,SAAS,EAAE,MAAM,EAAE,OAAO;AAAA,UACxB,WAAW,EAAE,OAAO;AAAA,UACpB,aAAa,EAAE,OAAO;AAAA,UACtB,YAAY,EAAE,KAAK,CAAC,SAAS,QAAQ,UAAU,YAAY,WAAW,QAAQ,OAAO,CAAC,EAAE,SAAS;AAAA,UACjG,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AAAA,UACjE,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC/B,CAAC,CAAC,EAAE,SAAS;AAAA,QACb,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC/B,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,QACnC,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,QACnC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,QAC/B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA;AAAA,IAEA,YAAY;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,aAAa,EAAE,QAAQ,EAAE,SAAS,EAC/B,SAAS,yNAAyN;AAAA,QACrO,UAAU,EAAE,QAAQ,EAAE,SAAS,EAC5B,SAAS,yNAAyN;AAAA,MACvO,CAAC;AAAA,MACD,aACE;AAAA,IAQJ;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAMJ;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,YAAY;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,QACrC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,MAAM,EAAE,QAAQ,EAAE,SAAS,EACxB,SAAS,8NAA8N;AAAA,QAC1O,UAAU,EAAE,OAAO,EAAE,SAAS,EAC3B,SAAS,kMAAkM;AAAA,MAChN,CAAC;AAAA,MACD,aACE;AAAA,IAOJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,MACjC,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAIJ;AAAA,IACA,YAAY;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,QAE3B,UAAU,EAAE,KAAK,CAAC,QAAQ,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,MACxD,CAAC;AAAA,MACD,aACE;AAAA,IAMJ;AAAA,IACA,WAAW;AAAA,MACT,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS,EAC9B,SAAS,6PAA6P;AAAA,QACzQ,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,qBAAqB,EAAE,OAAO,EAAE,SAAS,EACtC,SAAS,mNAAmN;AAAA,MACjO,CAAC;AAAA,MACD,aACE;AAAA,IAQJ;AAAA,IACA,cAAc;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,YAAY,CAAC,EAAE,SAAS,EAC/C,SAAS,mhBAA8gB;AAAA,QAC1hB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAQJ;AAAA,IACA,YAAY;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA,IACA,kBAAkB;AAAA,MAChB,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,aACE;AAAA,IAKJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBA,MAAM;AAAA,MACJ,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,kjBAOA;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,o4BAWA;AAAA,IACN;AAAA,IACA,MAAM;AAAA,MACJ,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,ggBAOA;AAAA,IACN;AAAA,IACA,WAAW;AAAA,MACT,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,qeAMA;AAAA,IACN;AAAA,IACA,MAAM;AAAA,MACJ,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,omBAMA;AAAA,IACN;AAAA,IACA,WAAW;AAAA,MACT,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,iyBAQA;AAAA,IACN;AAAA,IACA,aAAa;AAAA,MACX,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,kcAMA;AAAA,IACN;AAAA,IACA,UAAU;AAAA,MACR,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,gnBAOA;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,omBAOA;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,opBAOA;AAAA,IACN;AAAA,IACA,UAAU;AAAA,MACR,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,6kBAOA;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,ykBAOA;AAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsBA,OAAO;AAAA,MACL,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,4uBAQA;AAAA,IACN;AAAA,IACA,UAAU;AAAA,MACR,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,4oBAOA;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,mvBAOA;AAAA,IACN;AAAA,IACA,UAAU;AAAA,MACR,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,kuBAOA;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,2nBAOA;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,+nBAOA;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,2oBAOA;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,kuBAQA;AAAA,IACN;AAAA;AAAA;AAAA;AAAA,IAIA,eAAe;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,QACd,SAAS,EAAE,OAAO;AAAA,UAChB,OAAO,EAAE,OAAO;AAAA,UAChB,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,SAAS,aAAa,CAAC,EAAE,SAAS;AAAA,UAC3E,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,UAC1C,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QACjC,CAAC;AAAA,QACD,OAAO,EAAE,OAAO;AAAA,QAChB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,UAAU,EAAE,KAAK,CAAC,eAAe,WAAW,MAAM,CAAC,EAAE,SAAS;AAAA,QAC9D,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,QAClC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,WAAW,EAAE,OAAO;AAAA,QACpB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAChC,CAAC;AAAA,MACD,aACE;AAAA,IAgBJ;AAAA,IACA,MAAM;AAAA,MACJ,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,2rBAOA;AAAA,IACN;AAAA,IACA,cAAc;AAAA,MACZ,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,8tBAOA;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,uqBAOA;AAAA,IACN;AAAA,IACA,aAAa;AAAA,MACX,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,wtBAOA;AAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA4BA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,+pBAQA;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,owBAOA;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,8qBAOA;AAAA,IACN;AAAA,IACA,MAAM;AAAA,MACJ,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,0mBAOA;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,4qBAOA;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,uuBAQA;AAAA,IACN;AAAA,IACA,UAAU;AAAA,MACR,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,ouBAOA;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,iuBAQA;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,svBAQA;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,0tBAOA;AAAA,IACN;AAAA,IACA,aAAa;AAAA,MACX,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,mtCAaA;AAAA,IACN;AAAA,IACA,YAAY;AAAA,MACV,GAAG,2BAA2B;AAAA,MAC9B,aACE,yBACE,25BAUA;AAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcA,KAAK;AAAA,MACH,OAAO,EAAE,OAAO;AAAA,QACd,SAAS,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,QACjE,KAAK,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,QAC7D,IAAI,EAAE,KAAK,CAAC,WAAW,UAAU,YAAY,QAAQ,CAAC,EAAE,SAAS;AAAA,QACjE,QAAQ,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,CAAC,EAAE,SAAS;AAAA,QAC5D,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC/B,WAAW,EAAE,KAAK,CAAC,OAAO,QAAQ,CAAC,EAAE,SAAS;AAAA,QAC9C,OAAO,EAAE,KAAK,CAAC,SAAS,UAAU,OAAO,SAAS,CAAC,EAAE,SAAS;AAAA,QAC9D,SAAS,EAAE,KAAK,CAAC,SAAS,UAAU,OAAO,WAAW,QAAQ,CAAC,EAAE,SAAS;AAAA,QAC1E,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAeJ;AAAA,IACA,KAAK;AAAA,MACH,OAAO,EAAE,OAAO;AAAA,QACd,KAAK,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,QAC7D,OAAO,EAAE,KAAK,CAAC,SAAS,UAAU,OAAO,WAAW,UAAU,CAAC,EAAE,SAAS;AAAA,QAC1E,SAAS,EAAE,KAAK,CAAC,SAAS,UAAU,OAAO,WAAW,QAAQ,CAAC,EAAE,SAAS;AAAA,QAC1E,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC3B,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAQJ;AAAA,IACA,QAAQ;AAAA,MACN,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,QAC9D,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC3B,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,CAAC;AAAA,MACD,OAAO,CAAC;AAAA,MACR,aACE;AAAA,IASJ;AAAA,IACA,SAAS;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,OAAO;AAAA,QAChB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC/B,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,QAClC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,QACvC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAWJ;AAAA,IACA,SAAS;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,MAAM,EAAE,OAAO;AAAA,UACtB,IAAI,EAAE,OAAO;AAAA,UACb,OAAO,EAAE,OAAO;AAAA,UAChB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,UACjC,QAAQ,EAAE,KAAK,CAAC,WAAW,UAAU,aAAa,OAAO,CAAC,EAAE,SAAS;AAAA,QACvE,CAAC,CAAC;AAAA,QACF,YAAY,EAAE,OAAO,EAAE,SAAS,EAC7B,SAAS,kEAAkE;AAAA,QAC9E,aAAa,EAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,QACzD,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,CAAC;AAAA,MACD,OAAO,CAAC;AAAA,MACR,aACE;AAAA,IAcJ;AAAA,IACA,WAAW;AAAA,MACT,OAAO,EAAE,OAAO;AAAA,QACd,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EACZ,SAAS,6EAA8E;AAAA,QAC1F,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC/B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EACxB,SAAS,wFAAwF;AAAA,QACpG,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAeJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,QAAQ;AAAA,MACN,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,CAAC,SAAS;AAAA,MACjB,aACE;AAAA,IAcJ;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,oBAAoB;AAAA,MAClB,QAAQ,EAAE,OAAO;AAAA,QACf,YAAY,EAAE,OAAO;AAAA,QACrB,iBAAiB,EAAE,OAAO;AAAA,MAC5B,CAAC;AAAA,MACD,aAAa;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACd,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC5D,aAAa;AAAA,IACf;AAAA,IACA,cAAc;AAAA,MACZ,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC;AAAA,MACpD,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,UAAU,cAAc,QAAQ,UAAU;AAIvD,IAAO,kBAAQ;;;ACniEf,IAAM,cAAc;AACpB,IAAM,eAAe;AAGrB,IAAM,kBAAuC,MAAM;AACjD,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,aAAa,WAAW;AAC9B,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACpD,UAAM,QAAQ,IAAI;AAClB,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,cAAc;AAC3E,UAAI,IAAI,IAAI;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT,GAAG;AAEH,SAAS,YAAY,IAA0C;AAC7D,MAAI,CAAC,MAAM,OAAO,GAAG,SAAS,SAAU,QAAO;AAC/C,MAAI,CAAC,eAAe,IAAI,GAAG,IAAI,EAAG,QAAO;AACzC,QAAM,QAAQ,GAAG;AACjB,MAAI,SAAS,QAAQ,OAAO,UAAU,SAAU,QAAO;AACvD,SAAO,eAAe,SAAS,EAAE,gBAAiB;AACpD;AAEA,SAASC,kBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,YAAY,EAAE,EAAG,QAAO;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAASC,UAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,YAAY,EAAE,EAAG,UAAS,KAAK,GAAG;AAAA,EACxC;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,SAAS,SAAS,IACd,sEAAiE,SAAS,MAAM,kDAChF;AAAA,EACR;AACF;AAEA,SAAS,OACP,KACA,IACA,KACiB;AACjB,QAAM,QAAS,GAAG,SAAS,CAAC;AAC5B,QAAM,EAAE,CAAC,WAAW,GAAG,QAAQ,GAAG,KAAK,IAAI;AAC3C,QAAM,YAAY,EAAE,GAAG,MAAM,CAAC,YAAY,GAAG,OAAO;AACpD,MAAI;AAAA,IACF,YAAY,GAAG,YAAY,GAAG,IAAI;AAAA,IAClC,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,MAAM,aAAa,IAAI,aAAa;AAAA,EACxE;AACA,SAAO,EAAE,GAAG,IAAI,OAAO,UAAU;AACnC;AAEA,SAASC,WAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,MAAI,CAACF,kBAAiB,IAAI,EAAG,QAAO;AAEpC,QAAM,eAAgD,CAAC;AACvD,MAAI,UAAU;AACd,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,QAAI,CAAC,YAAY,EAAE,GAAG;AACpB,mBAAa,GAAG,IAAI;AACpB;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AAEd,aAAO,KAAK,IAAI,GAAG;AACnB,mBAAa,GAAG,IAAI;AACpB;AAAA,IACF;AACA,iBAAa,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG;AACvC,cAAU;AAAA,EACZ;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,UAAU,aAAa;AAC3C;AAEO,IAAM,kCAAmD;AAAA,EAC9D,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAASA;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AACF;;;ACnFA,IAAM,qBAAwC,CAAC,UAAU,WAAW,QAAQ;AAG5E,IAAM,eAAe;AAGrB,IAAM,uBAAuB;AAG7B,IAAM,iBAAiB;AAUvB,SAAS,kBAAkB,IAA+D;AACxF,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,MAAO,GAA+B,oBAAoB;AAChE,MAAI,OAAO,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG,QAAO;AACzE,QAAM,MAAM;AACZ,QAAM,MAAwB,CAAC;AAC/B,MAAI,SAAS;AACb,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC/C,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAG;AAC3B,UAAM,OAAO,MAAM,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AACnE,QAAI,KAAK,WAAW,EAAG;AACvB,QAAI,IAAI,IAAI;AACZ,aAAS;AAAA,EACX;AACA,SAAO,SAAS,MAAM;AACxB;AAGA,SAAS,iBAAiB,KAAiC;AACzD,QAAM,WAAW,OAAO,KAAK,GAAG;AAChC,QAAM,UAAU,mBAAmB,OAAO,CAAC,MAAM,SAAS,SAAS,CAAC,CAAC;AACrE,QAAM,OAAO,SAAS,OAAO,CAAC,MAAM,CAAC,mBAAmB,SAAS,CAAC,CAAC;AACnE,SAAO,CAAC,GAAG,SAAS,GAAG,IAAI;AAC7B;AAEA,SAASC,kBAAiB,MAAyB;AACjD,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,kBAAkB,EAAE,EAAG,QAAO;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAASC,UAAS,MAAmC;AACnD,QAAM,WAAW,KAAK,YAAY,CAAC;AACnC,QAAM,WAAqB,CAAC;AAC5B,MAAI,yBAAyB;AAC7B,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChD,UAAM,QAAQ,kBAAkB,EAAE;AAClC,QAAI,CAAC,MAAO;AACZ,aAAS,KAAK,GAAG;AACjB,8BAA0B,iBAAiB,KAAK,EAAE;AAAA,EACpD;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,aACE,SAAS,SAAS,IACd,+CAA+C,sBAAsB,mCAAmC,SAAS,MAAM,eACvH;AAAA,EACR;AACF;AAEA,SAASC,WAAU,MAAgB,KAAiC;AAClE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,MAAI,CAACF,kBAAiB,IAAI,EAAG,QAAO;AAEpC,QAAM,eAAgD,EAAE,GAAG,SAAS;AACpE,MAAI,UAAU;AAEd,aAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC5D,UAAM,QAAQ,kBAAkB,QAAQ;AACxC,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,iBAAiB,KAAK;AACxC,UAAM,gBAA0B,CAAC;AAEjC,eAAW,YAAY,WAAW;AAChC,YAAM,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ;AACtD,oBAAc,KAAK,OAAO;AAE1B,UAAI,CAAC,IAAI,QAAQ;AACf,qBAAa,OAAO,IAAI;AAAA,UACtB,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,UAAU,MAAM,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AAAA,MACF,YAAY,SAAS,YAAY,SAAS,QAAQ,WAAW,wCAAwC,UAAU,MAAM,aAAa,UAAU,KAAK,IAAI,CAAC,4FAC3D,cAAc,KAAK,IAAI,CAAC;AAAA,MAGnH;AAAA,QACE,YAAY;AAAA,QACZ,MAAM,SAAS;AAAA,QACf,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAEA,QAAI,IAAI,OAAQ;AAEhB,UAAM,EAAE,CAAC,oBAAoB,GAAG,OAAO,UAAU,mBAAmB,GAAG,KAAK,IAAI;AAChF,SAAK;AACL,SAAK;AACL,iBAAa,SAAS,IAAI;AAAA,MACxB,GAAI;AAAA,MACJ,UAAU;AAAA,IACZ;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,EAAE,GAAG,MAAM,UAAU,aAAa;AAC3C;AAEO,IAAM,sCAAuD;AAAA,EAClE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAASA;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AACF;;;ACvIO,IAAM,eAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACHA,SAAS,WAAW,OAAmC;AACrD,MAAI,SAAS,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AAC/E,SAAO;AACT;AAUO,SAAS,YACd,MACA,SACe;AACf,QAAM,SAAS,SAAS,UAAU,qBAAqB;AACvD,QAAM,WAAW,IAAI,IAAI,SAAS,YAAY,CAAC,CAAC;AAChD,QAAMC,YACJ,SAAS,gBAAgB;AAC3B,QAAM,WAA6B,CAAC;AACpC,QAAM,UAAoB,CAAC;AAE3B,MAAI,UAAoB;AAExB,aAAW,KAAKA,WAAU;AACxB,QAAI,SAAS,IAAI,EAAE,EAAE,EAAG;AAExB,QAAI;AACJ,QAAI;AACF,kBAAY,EAAE,QAAQ,OAAO;AAAA,IAC/B,SAAS,KAAK;AACZ,eAAS,KAAK;AAAA,QACZ,eAAe,EAAE;AAAA,QACjB,SAAS,yCAAyC,eAAe,GAAG,CAAC;AAAA,MACvE,CAAC;AACD;AAAA,IACF;AACA,QAAI,CAAC,UAAW;AAEhB,QAAI,QAAQ;AAEV,UAAI;AACF,cAAM,MAAM,EAAE,WAAW,OAAO;AAChC,YAAI,KAAK;AACP,mBAAS,KAAK;AAAA,YACZ,eAAe,EAAE;AAAA,YACjB,SAAS,GAAG,IAAI,WAAW,iBAAiB,IAAI,iBAAiB,MAAM,iBAAiB,IAAI,iBAAiB,KAAK,IAAI,CAAC;AAAA,UACzH,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,eAAe,EAAE;AAAA,YACjB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,iBAAS,KAAK;AAAA,UACZ,eAAe,EAAE;AAAA,UACjB,SAAS,qBAAqB,eAAe,GAAG,CAAC;AAAA,QACnD,CAAC;AAAA,MACH;AAIA,YAAMC,OAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,CAAC,SAAS,SACd,SAAS,KAAK,EAAE,eAAe,EAAE,IAAI,SAAS,KAAK,CAAC;AAAA,MACxD;AACA,UAAI;AACF,UAAE,UAAU,SAASA,IAAG;AAAA,MAC1B,SAAS,KAAK;AACZ,iBAAS,KAAK;AAAA,UACZ,eAAe,EAAE;AAAA,UACjB,SAAS,iCAAiC,eAAe,GAAG,CAAC;AAAA,QAC/D,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,UAAM,MAAwB;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM,CAAC,SAAS,SACd,SAAS,KAAK,EAAE,eAAe,EAAE,IAAI,SAAS,KAAK,CAAC;AAAA,IACxD;AACA,QAAI;AACF,YAAM,OAAO,EAAE,UAAU,SAAS,GAAG;AACrC,UAAI,SAAS,SAAS;AACpB,kBAAU;AACV,gBAAQ,KAAK,EAAE,EAAE;AAAA,MACnB;AAAA,IACF,SAAS,KAAK;AACZ,eAAS,KAAK;AAAA,QACZ,eAAe,EAAE;AAAA,QACjB,SAAS,2CAA2C,eAAe,GAAG,CAAC;AAAA,MACzE,CAAC;AAAA,IAEH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,SAAS,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,UAAU,CAAC,MAAM,YAAY,YAAY,MAAM,OAAO,CAAC;AActE,SAAS,kBACd,MACA,SACU;AACV,MAAI,CAAC,WAAW,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,cAAc,MAAM,OAAO;AAG1C,MAAI,CAAC,OAAO,WAAW;AACrB,QAAI,SAAS,UAAU,qBAAqB,GAAG;AAC7C,wBAAkB,OAAO,QAAQ;AAAA,IACnC,OAAO;AACL,oBAAc,OAAO,QAAQ;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,eAAe,KAAsB;AAC5C,MAAI,eAAe,MAAO,QAAO,IAAI;AACrC,MAAI;AACF,WAAO,OAAO,GAAG;AAAA,EACnB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACnLA,IAAM,YAAY,oBAAI,IAAI,CAAC,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,CAAC;AAEjE,SAAS,qBAAqB,KAAuB;AACnD,MAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU,QAAO;AACnD,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,oBAAoB;AAE3D,QAAM,MAAM;AAGZ,MAAI,WAAW,KAAK;AAClB,UAAM,OAAO,IAAI;AACjB,QAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,UAAU,GAAG;AAC3C,aAAO;AAAA,QACL,OAAO,qBAAqB,KAAK,CAAC,CAAC;AAAA,QACnC,OAAO,qBAAqB,KAAK,CAAC,CAAC;AAAA,QACnC,GAAI,KAAK,SAAS,IAAI,EAAE,OAAO,qBAAqB,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,MACpE;AAAA,IACF;AACA,UAAMC,OAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,EAAG,CAAAA,KAAI,CAAC,IAAI,qBAAqB,CAAC;AACzE,WAAOA;AAAA,EACT;AAGA,OACG,YAAY,OAAO,WAAW,OAAO,YAAY,QAClD,QAAQ,OAAO,OAAO,IAAI,OAAO,YAAY,UAAU,IAAI,IAAI,EAAE,KAAK,WAAW,KACjF;AACA,UAAM,EAAE,IAAI,OAAO,GAAG,KAAK,IAAI;AAC/B,UAAMA,OAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,EAAG,CAAAA,KAAI,CAAC,IAAI,qBAAqB,CAAC;AAC1E,IAAAA,KAAI,EAAY,IAAI,qBAAqB,KAAK;AAC9C,WAAOA;AAAA,EACT;AAEA,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,EAAG,KAAI,CAAC,IAAI,qBAAqB,CAAC;AACzE,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAuB;AACjD,MAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU,QAAO;AACnD,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,kBAAkB;AAEzD,QAAM,SAAS;AACf,MAAI,eAAe,UAAU,OAAO,OAAO,cAAc,UAAU;AACjE,UAAM,QAAQ,OAAO,UAClB,QAAQ,2BAA2B,CAAC,GAAW,MAAc,OAAO,CAAC,GAAG,EACxE,QAAQ,kBAAkB,CAAC,GAAW,MAAc,MAAM,EAAE,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,GAAG;AAC/F,WAAO,EAAE,GAAG,QAAQ,WAAW,MAAM;AAAA,EACvC;AAEA,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,EAAG,KAAI,CAAC,IAAI,mBAAmB,CAAC;AAC1E,SAAO;AACT;AAkBO,SAAS,sBAAmD,KAAiB;AAClF,QAAM,WAAW,kBAAkB,GAAG;AACtC,SAAO,mBAAmB,qBAAqB,QAAQ,CAAC;AAC1D;;;AjBpFA,SAAS,WAAW,UAAuD;AACzE,QAAM,SAAS,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;AAC5C,QAAM,WAAW,oBAAI,IAAY;AAEjC,aAAW,MAAM,OAAO,OAAO,QAAQ,GAAG;AACxC,QAAI,MAAM,OAAO,OAAO,YAAY,cAAc,IAAI;AACpD,YAAM,WAAY,GAA8B;AAChD,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,mBAAW,KAAK,UAAU;AACxB,cAAI,OAAO,MAAM,SAAU,UAAS,IAAI,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,MAAM,QAAQ;AACvB,QAAI,CAAC,SAAS,IAAI,EAAE,EAAG,QAAO;AAAA,EAChC;AACA,SAAO,OAAO,OAAO,EAAE,KAAK,EAAE;AAChC;AAOO,SAAS,aACd,QACA,SACA,SACiB;AACjB,QAAM,oBAAoB,OAAO,CAAC;AAElC,QAAM,OAAO,QAAQ,MAAmB;AACtC,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,UAAM,QAAQ,oBAAoB,MAAM;AAExC,UAAM,aAAa,QAAQ,MAAM,MAAM,UAAU;AACjD,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,gBAAU,QAAQ,WAAW,CAAC,CAAC;AAAA,IACjC;AAEA,QAAI,CAAC,SAAS;AACZ,mBAAa,MAAM;AAAA,IACrB;AAEA,UAAM,MAAM,QAAQ,MAAM;AAC1B,QAAI,CAAC,KAAK,SAAU,QAAO;AAE3B,QAAI,CAAC,IAAI,MAAM;AACb,YAAM,UAAU,WAAW,IAAI,QAAmC;AAClE,UAAI,SAAS;AACX;AAAC,QAAC,IAA2C,OAAO;AACpD,gBAAQ,KAAK,iDAAiD,OAAO;AAAA,MACvE,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,aAAa,sBAAsB,GAAG;AAC5C,WAAO,EAAE,GAAI,WAAkD;AAAA,EACjE,GAAG,CAAC,QAAQ,SAAS,OAAO,CAAC;AAkB7B,YAAU,MAAM;AACd,QAAI,CAAC,MAAM,MAAO;AAClB,qBAAiB,QAAQ,KAAK,KAAK;AAAA,EACrC,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjB,YAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,aAAa,QAAQ;AAC3B,QAAI,cAAc,kBAAkB,SAAS;AAC3C,wBAAkB,UAAU;AAC5B;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,MAAM,kBAAkB,OAAO;AAC1D,sBAAkB,UAAU;AAE5B,UAAM,QAAQ,SAAS,MAAM;AAC7B,QAAI,CAAC,MAAO;AAEZ,eAAW,OAAO,YAAY;AAC5B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAI,QAAQ,MAAM,WAAW,SAAS,GAAG;AACvC,gBAAM,YAAY,OAAO,KAAK,MAAM,SAAS,MAAM;AACnD,cAAI,OAAO,OAAO,SAAS,OAAO,OAAO,WAAW;AAClD,4BAAgB,QAAQ,WAAW,OAAO,KAAK;AAAA,UACjD;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,SAAO,EAAE,MAAM,OAAO,SAAS,MAAM,KAAK,KAAK;AACjD;;;AkBzIA,OAAOC,WAAS,UAAU,YAAY;AACtC,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;;;AC2C1B,IAAM,wBAAwB;AAY9B,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuJ3B,SAAS,0BAAgC;AAC9C,eAAa,uBAAuB,kBAAkB;AACxD;;;AC7MA,OAAkB;AA6Dd;AAjCJ,IAAM,YAA8C;AAAA,EAClD,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AACX;AAEO,IAAM,gBAAuD,CAAC;AAAA,EACnE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAA6B,CAAC;AACpC,QAAM,QAAQ,MAAM;AACpB,MAAI,OAAO;AACT,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,YAAM,QAAQ,MAAM,GAAuB;AAC3C,UAAI,OAAO;AACT;AAAC,QAAC,MAAiC,MAAM,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,SACE,oBAAC,SAAI,WAAU,kBAAiB,OAC7B,UACH;AAEJ;;;ACxBA,SAAgB,eAAAC,oBAAmB;AACnC,SAAS,cAAAC,mBAAkB;;;ACtB3B,OAAkB;;;ACLlB,YAAY,YAAY;AACxB,OAAkB;AAsFV,gBAAAC,YAAA;AAlFR,IAAM,WAAW;AAEjB,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCd,SAAS,cAAc,GAAmB;AACxC,SAAO,EACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AACZ;AAIA,IAAMC,YAAW;AACjB,SAAS,QAAQ,GAAoB;AACnC,SAAO,EAAE,UAAU,KAAKA,UAAS,KAAK,CAAC;AACzC;AAEA,IAAM,aAAa;AAKZ,IAAM,OAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,MAAM;AACJ,eAAa,UAAU,KAAK;AAE5B,QAAM,OAAO,aACT,EAAE,eAAe,KAAc,IAC/B,EAAE,cAAc,aAAa,MAAM,MAAM,MAAe;AAE5D,QAAM,aAAa,cAAc,IAAI;AACrC,QAAM,aAAa,WAAW,UAAU;AAExC,MAAI,YAAY;AACd,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACzD,GAAG;AAAA,QAEJ,0BAAAA,KAAC,cAAW;AAAA;AAAA,IACd;AAAA,EAEJ;AAEA,MAAI,QAAQ,IAAI,GAAG;AACjB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACzD,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,YAAQ,KAAK,2BAA2B,IAAI,8BAA8B;AAAA,EAC5E;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,WAAW,qBAAqB,SAAS,EAClD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAG;AAAA,MAEH,eAAK,OAAO,CAAC,EAAE,YAAY;AAAA;AAAA,EAC9B;AAEJ;;;ADsCI,SAUI,OAAAE,MAVJ;AAhJJ,IAAMC,YAAW;AAEjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqHP,IAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EACA,OAAO;AAAA,EACP;AACF,MAAM;AACJ,eAAaD,WAAUC,MAAK;AAE5B,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,cAAc,OAAO;AAAA,IACrB,cAAc,IAAI;AAAA,IAClB;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAEV,QAAM,gBAAgB,EAAE,YAAY;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU,YAAY;AAAA,MACtB,iBAAe,YAAY,WAAW;AAAA,MACtC,cAAY;AAAA,MACZ,gBAAc,WAAW;AAAA,MACzB,SAAS,gBAAgB,UAAU;AAAA,MAElC;AAAA,gBAAQ,iBAAiB,YACxB,gBAAAF,KAAC,QAAK,MAAM,MAAM,WAAU,mBAAkB,IAC5C;AAAA,QACJ,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA,QACzC,QAAQ,iBAAiB,aACxB,gBAAAA,KAAC,QAAK,MAAM,MAAM,WAAU,mBAAkB,IAC5C;AAAA,QACH,UACC,gBAAAA,KAAC,QAAK,MAAK,YAAW,WAAU,sBAAqB,IACnD;AAAA;AAAA;AAAA,EACN;AAEJ;;;AElJA,YAAY,0BAA0B;AACtC,SAAS,kBAAkB;AAC3B,SAAgB,aAAa,aAAAG,YAAW,WAAAC,UAAS,UAAAC,SAAQ,gBAAgB;AAuPrE,mBACE,OAAAC,MAMQ,QAAAC,aAPV;AAhPJ,IAAMC,YAAW;AAEjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgKd,IAAM,gBAAuD;AAAA,EAC3D,aAAa;AAAA,EACb,SAAS;AAAA,EACT,MAAM;AACR;AAEA,IAAM,6BAGF;AAAA,EACF,aAAa;AAAA,EACb,SAAS;AAAA,EACT,MAAM;AACR;AAEO,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACF,MAAM;AACJ,eAAaD,WAAUC,MAAK;AAE5B,QAAM,EAAE,EAAE,IAAI,kBAAkB;AAEhC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,QAAM,kBAAkBC,QAAiC,IAAI;AAE7D,QAAM,UAAU,mBAAmB;AAInC,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ,aAAa,cAAe;AAGzC,UAAM,SAAS,OAAO,WAAW,MAAM;AACrC,sBAAgB,SAAS,MAAM;AAAA,IACjC,GAAG,CAAC;AACJ,WAAO,MAAM,OAAO,aAAa,MAAM;AAAA,EACzC,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,gBAAgB,YAAY,YAAY;AAC5C,QAAI,QAAS;AACb,QAAI;AACF,YAAM,SAAS,UAAU;AACzB,UAAI,kBAAkB,SAAS;AAC7B,2BAAmB,IAAI;AACvB,cAAM;AAAA,MACR;AACA,cAAQ,KAAK;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,MAAM,yCAAyC,GAAG;AAAA,IAC5D,UAAE;AACA,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,mBAAmB;AAAA,IACvB,CAAC,SAAkB;AACjB,UAAI,CAAC,QAAQ,QAAS;AACtB,cAAQ,IAAI;AACZ,UAAI,CAAC,KAAM,YAAW;AAAA,IACxB;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,EACpB;AAEA,QAAM,sBAAsB,eAAe,EAAE,yBAAyB;AACtE,QAAM,uBAAuB,gBAAgB,QAAQ;AACrD,QAAM,iBAAiB,2BAA2B,QAAQ;AAE1D,SACE,gBAAAJ,MAAA,YACE;AAAA,oBAAAD,KAAC,UAAQ,GAAG,SAAS,SAAS,MAAM,QAAQ,IAAI,GAAG;AAAA,IACnD,gBAAAA,KAAsB,2BAArB,EAA0B,MAAY,cAAc,kBACnD,0BAAAC,MAAsB,6BAArB,EACC;AAAA,sBAAAD,KAAsB,8BAArB,EAA6B,WAAU,8BAA6B;AAAA,MACrE,gBAAAC,MAAsB,8BAArB,EAA6B,WAAU,8BACtC;AAAA,wBAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,0BAAAA,MAAsB,4BAArB,EAA2B,WAAU,4BACpC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,cAAc,QAAQ;AAAA,gBAC5B,WAAW,kCAAkC,QAAQ;AAAA;AAAA,YACvD;AAAA,YACA,gBAAAA,KAAC,UAAM,iBAAM;AAAA,aACf;AAAA,UAYC,cACC,gBAAAA,KAAsB,kCAArB,EAAiC,WAAU,kCACzC,uBACH,IAEA,gBAAAA,KAAsB,kCAArB,EAAiC,WAAU,2CACzC,iBACH;AAAA,WAEJ;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,6BACb;AAAA,0BAAAD,KAAsB,6BAArB,EAA4B,SAAO,MAClC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU;AAAA,cACV,iBAAe,WAAW;AAAA,cAE1B,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,+BAAoB;AAAA;AAAA,UAC1D,GACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,SAAS;AAAA,cACT,MAAK;AAAA,cACL;AAAA,cACA,SAAS;AAAA;AAAA,UACX;AAAA,WACF;AAAA,SACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;AAmCO,IAAM,oBAA+D,CAAC;AAAA,EAC3E;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,WAAW;AAE9B,QAAM,gBAAgB,YAAY,YAAY;AAC5C,UAAM,WACH,QAAQ;AAAA,MACP,QAAQ,MAAM;AAAA,MACd,QAAQ,EAAE,QAAQ,MAAM,UAAU;AAAA,IACpC,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,cAAQ,MAAM,4CAA4C,GAAG;AAC7D,YAAM;AAAA,IACR,CAAC;AACH,WAAO,UAAU,EAAE,QAAQ,MAAM,UAAU,CAAC;AAAA,EAC9C,GAAG,CAAC,YAAY,MAAM,MAAM,SAAS,CAAC;AAEtC,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,CAAC,MAAM,SAAU;AACrB,SAAK,WACF,QAAQ;AAAA,MACP,QAAQ,MAAM;AAAA,MACd,QAAQ,EAAE,QAAQ,MAAM,SAAS;AAAA,IACnC,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,cAAQ,MAAM,2CAA2C,GAAG;AAAA,IAC9D,CAAC;AACH,WAAO,UAAU,EAAE,QAAQ,MAAM,SAAS,CAAC;AAAA,EAC7C,GAAG,CAAC,YAAY,MAAM,MAAM,QAAQ,CAAC;AAErC,QAAM,UAAUM;AAAA,IACd,OAAO;AAAA,MACL,OAAO,MAAM,QAAQ;AAAA,MACrB,SAAS,MAAM,QAAQ;AAAA,MACvB,MAAM,MAAM,QAAQ;AAAA,MACpB,MAAM,MAAM,QAAQ;AAAA,MACpB,UAAU,MAAM,QAAQ;AAAA,IAC1B;AAAA,IACA,CAAC,MAAM,OAAO;AAAA,EAChB;AAEA,SACE,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB,WAAW;AAAA,MACX,UAAU,MAAM,WAAW,eAAe;AAAA;AAAA,EAC5C;AAEJ;;;ACxaA,OAAkB;AAmFd,SACE,OAAAO,MADF,QAAAC,aAAA;AA9EJ,IAAMC,YAAW;AAEjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8Dd,IAAM,iBAAyE;AAAA,EAC7E,SAAS,EAAE,MAAM,YAAY,OAAO,qBAAM;AAAA,EAC1C,OAAO,EAAE,MAAM,SAAS,OAAO,2BAAO;AAAA,EACtC,OAAO,EAAE,MAAM,gBAAgB,OAAO,2BAAO;AAC/C;AAEO,IAAM,YAAsC,CAAC,EAAE,MAAM,OAAO,aAAa,KAAK,MAAM;AACzF,eAAaD,WAAUC,MAAK;AAE5B,QAAM,WAAW,eAAe,IAAI;AACpC,QAAM,eAAe,QAAQ,SAAS;AACtC,QAAM,gBAAgB,SAAS,SAAS;AAExC,SACE,gBAAAF,MAAC,SAAI,WAAW,gCAAgC,IAAI,IAAI,MAAK,UAAS,cAAY,MAChF;AAAA,oBAAAD,KAAC,QAAK,MAAM,cAAc,WAAU,uBAAsB,YAAU,MAAC;AAAA,IACrE,gBAAAA,KAAC,OAAE,WAAU,wBAAwB,yBAAc;AAAA,IAClD,cAAc,gBAAAA,KAAC,OAAE,WAAU,uBAAuB,uBAAY,IAAO;AAAA,KACxE;AAEJ;;;AC5FA,SAAS,WAAAI,gBAAe;AAsCjB,SAAS,kBAAkB,OAAwD;AACxF,QAAM,EAAE,aAAa,SAAS,OAAO,UAAU,QAAQ,IAAI;AAC3D,SAAOA,SAAQ,MAAM;AACnB,QAAI,aAAa;AACf,aAAO,SAAS,aAAa,KAAK;AAAA,IACpC;AACA,QAAI,OAAO;AACT,aAAO,SAAS,SAAS,KAAK;AAAA,IAChC;AACA,QAAI,SAAS;AACX,aAAO,SAAS,SAAS;AAAA,IAC3B;AACA,QAAI,UAAU;AACZ,aAAO,SAAS,UAAU;AAAA,IAC5B;AACA,UAAM,QAAQ,OAAO,YAAY,aAAa,QAAQ,IAAI,CAAC,CAAC;AAC5D,QAAI,OAAO;AACT,aAAO,SAAS,OAAO;AAAA,IACzB;AACA,WAAO,SAAS,SAAS;AAAA,EAM3B,GAAG,CAAC,aAAa,SAAS,OAAO,UAAU,OAAO,CAAC;AACrD;AAEA,SAAS,SACP,OACA,OACyB;AACzB,SAAO;AAAA,IACL;AAAA,IACA,WAAW,UAAU;AAAA,IACrB,SAAS,UAAU;AAAA,IACnB,YAAY,UAAU;AAAA,IACtB,SAAS,UAAU;AAAA,IACnB,cAAc,QACV,iBAAiB,QACf,MAAM,UACN,OAAO,KAAK,IACd;AAAA,EACN;AACF;;;ALqUQ,gBAAAC,MAwBA,QAAAC,aAxBA;AArXR,IAAMC,YAAW;AAOjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+Qd,IAAM,cAA+C;AAAA,EACnD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb;AAOA,IAAM,uBAAwD;AAAA,EAC5D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb;AAEA,IAAM,oBAAoB,oBAAI,IAAqB,CAAC,YAAY,YAAY,WAAW,CAAC;AAExF,SAAS,cAAc,KAA+B;AACpD,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,QAAQ,cAAc,QAAQ,cAAc,QAAQ,eAAe,QAAQ,WAAW;AACxF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,YAAsC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAChF,eAAaD,WAAUC,MAAK;AAE5B,QAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC9D,QAAM,WAAW,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AACvE,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;AAOhE,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,YACJ,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAC5E,QAAM,cAAc,kBAAkB,EAAE,SAAS,aAAa,OAAO,UAAU,CAAC;AAKhF,QAAM,aAAaC,YAAW;AAC9B,QAAM,eAAeC;AAAA,IACnB,CAAC,YAA6B;AAC5B,WAAK,WACF,QAAQ,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,EAAE,CAAC,EAC5F,MAAM,CAAC,QAAQ;AACd,gBAAQ,MAAM,8BAA8B,GAAG;AAAA,MACjD,CAAC;AACH,aAAO,UAAU,EAAE,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAAA,IACnE;AAAA,IACA,CAAC,YAAY,IAAI;AAAA,EACnB;AAEA,QAAM,UAAU,SAAS,wCAAwC;AAEjE,QAAM,gBAAgB,MAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,MAAM,OAAQ,UAAU,CAAC;AAQtF,QAAM,SAAS,cAAc,MAAM,MAAM;AACzC,QAAM,aAAa,kBAAkB,IAAI,MAAM;AAC/C,QAAM,cACJ,OAAO,MAAM,gBAAgB,YAAY,MAAM,YAAY,SAAS,IAChE,MAAM,cACN,qBAAqB,MAAM;AACjC,QAAM,WAAW,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AACvE,QAAM,aAAc,cAAc,YAAY,SAAS,KAAO,CAAC,cAAc,cAAc,SAAS;AAWpG,QAAM,qBAAqB,CAAC,GAAoB,QAAgB;AAC9D,UAAM,gBAAgB,EAAE,YAAY,iBAAiB,EAAE,YAAY;AACnE,QAAI,eAAe;AACjB,aACE,gBAAAL;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,EAAE,OAAO,EAAE,OAAO,SAAS,eAAe,MAAM,EAAE,KAAK;AAAA,UAChE,OAAO,EAAE,gBAAgB,eAAK,EAAE,KAAK;AAAA,UACrC,aAAa,EAAE;AAAA,UACf,UAAS;AAAA,UACT,WAAW,MAAM,aAAa,CAAC;AAAA;AAAA,QAL1B,UAAU,EAAE,MAAM,IAAI,GAAG;AAAA,MAMhC;AAAA,IAEJ;AACA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO,EAAE;AAAA,QACT,SAAS,EAAE,WAAW;AAAA,QACtB,MAAM,EAAE;AAAA,QACR,SAAS,MAAM,aAAa,CAAC;AAAA;AAAA,MAJxB,UAAU,EAAE,MAAM,IAAI,GAAG;AAAA,IAKhC;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAW,SACd;AAAA,oBAAAA,MAAC,YAAO,WAAU,yBAChB;AAAA,sBAAAA,MAAC,SAAI,WAAU,yBACb;AAAA,wBAAAD,KAAC,QAAG,WAAU,wBAAwB,mBAAS,aAAY;AAAA,QAC1D,WAAW,gBAAAA,KAAC,OAAE,WAAU,2BAA2B,oBAAS,IAAO;AAAA,SACtE;AAAA,MACC,QAAQ,SAAS,IAChB,gBAAAA,KAAC,SAAI,WAAU,0BACZ,kBAAQ,IAAI,CAAC,GAAG,MACf,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,EAAE;AAAA,UACT,SAAS,EAAE,WAAW;AAAA,UACtB,MAAM,EAAE;AAAA,UACR,SAAS,MAAM,aAAa,CAAC;AAAA;AAAA,QAJxB,GAAG,EAAE,MAAM,IAAI,CAAC;AAAA,MAKvB,CACD,GACH,IACE;AAAA,OACN;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,uBAAsB,cAAY,YAAY,OAC1D,sBAAY,UACX,gBAAAA,KAAC,aAAU,MAAK,SAAQ,aAAa,YAAY,cAAc,IAC7D,YAAY,YACd,gBAAAA,KAAC,aAAU,MAAK,WAAU,IAE1B,UAEJ;AAAA,IACC,aACC,aACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,qFAAqF,MAAM;AAAA,QACtG,MAAK;AAAA,QACL,aAAU;AAAA,QACV,eAAa;AAAA,QAEb,0BAAAC,MAAC,UAAK,WAAU,gCACd;AAAA,0BAAAD,KAAC,QAAK,MAAM,YAAY,MAAM,GAAG,WAAU,8BAA6B;AAAA,UACxE,gBAAAA,KAAC,UAAK,WAAU,+BAA+B,uBAAY;AAAA,UAC1D,WACC,gBAAAC,MAAC,UAAK,WAAU,4BAA2B;AAAA;AAAA,YAAE;AAAA,YAAS;AAAA,aAAC,IACrD;AAAA,WACN;AAAA;AAAA,IACF,IAEA,gBAAAD,KAAC,YAAO,WAAU,yBAChB,0BAAAA,KAAC,SAAI,WAAU,iCACZ,wBAAc,IAAI,kBAAkB,GACvC,GACF,IAEA;AAAA,KACN;AAEJ;;;AMncA,SAAgB,eAAAM,cAAa,YAAAC,iBAAgB;AAC7C,SAAS,cAAAC,aAAY,eAAe,qBAAqB;;;ACtBlD,SAAS,iBAAiB,MAAuB;AACtD,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,EAAG,QAAO;AAC1D,MAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AACjC,QAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,MAAM,SAAS,IAAI,wBAAwB,EAAE,KAAK,GAAG;AAC9D;AAEA,SAAS,yBAAyB,KAAqB;AACrD,SAAO,IAAI,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI;AACpD;;;AD2QU,SAaI,OAAAC,MAbJ,QAAAC,aAAA;AA1PV,IAAMC,YAAW;AAMjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuId,SAAS,yBAAyB,SAA0B;AAC1D,MAAI;AACF,WAAO,cAAuB,OAAO;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,sBAAwC;AAC/C,MAAI;AACF,UAAM,QAAQ,cAAc;AAC5B,WAAO,EAAE,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,KAAK,MAAM,OAAU;AAAA,EAChC;AACF;AAEO,IAAM,UAAkC,CAAC,EAAE,OAAO,KAAK,MAAM;AAClE,eAAaD,WAAUC,MAAK;AAE5B,QAAM,QAAuB,MAAM,QAAQ,MAAM,KAAK,IAClD,MAAM,MAAM,OAAO,CAAC,OAAO,MAAM,OAAO,GAAG,OAAO,YAAY,OAAO,GAAG,UAAU,QAAQ,IAC1F,CAAC;AACL,QAAM,eAAe,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AACnF,QAAM,oBAAoB,OAAO,MAAM,sBAAsB,WACzD,MAAM,oBACN,MAAM,CAAC,GAAG,MAAM;AACpB,QAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAM,WAAW,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AAEvE,QAAM,UAAU,iBAAiB,YAAY;AAC7C,QAAM,aAAa,yBAAyB,OAAO;AACnD,QAAM,EAAE,KAAK,SAAS,IAAI,oBAAoB;AAC9C,QAAM,aAAaC,YAAW;AAI9B,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,UAAiB,iBAAiB;AAShF,QAAM,WACJ,aAAa,SAAS,KAAK,OAAO,eAAe,WAC7C,aACA;AAKN,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAkB,KAAK;AAEzD,QAAM,eAAeC;AAAA,IACnB,CAAC,SAAsB;AACrB,UAAI,aAAa,SAAS,GAAG;AAC3B,YAAI;AACF,mBAAS,SAAS,KAAK,EAAE;AAAA,QAC3B,SAAS,KAAK;AACZ,kBAAQ,MAAM,8BAA8B,GAAG;AAAA,QACjD;AAAA,MACF,OAAO;AACL,2BAAmB,KAAK,EAAE;AAAA,MAC5B;AACA,UAAI,SAAS,SAAS,GAAG;AACvB,aAAK,WACF,QAAQ,EAAE,QAAQ,UAAU,QAAQ,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC,EACxE,MAAM,CAAC,QAAQ,QAAQ,MAAM,sCAAsC,GAAG,CAAC;AAAA,MAC5E;AACA,aAAO,cAAc,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC;AAAA,IACzD;AAAA,IACA,CAAC,YAAY,MAAM,UAAU,SAAS,cAAc,QAAQ;AAAA,EAC9D;AAEA,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,UAAU,eAAe,YAAY,uCAAuC;AAElF,SACE,gBAAAL,MAAC,WAAM,WAAW,SAAS,cAAW,sBACnC;AAAA,UAAM,IAAI,CAAC,SAAS;AACnB,YAAM,WAAW,KAAK,OAAO;AAC7B,YAAM,aAAa,KAAK,aAAa;AAKrC,YAAM,YACJ,KAAK,UAAU,UAAa,KAAK,UAAU,QAAQ,KAAK,UAAU;AAKpE,YAAM,MAAM;AAAA,QACV;AAAA,QACA,WAAW,6BAA6B;AAAA,QACxC,aAAa,+BAA+B;AAAA,QAC5C;AAAA,QACA;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACX,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW;AAAA,UACX,gBAAc,WAAW,SAAS;AAAA,UAClC,iBAAe,cAAc;AAAA,UAC7B,UAAU;AAAA,UACV,SAAS,MAAM;AACb,gBAAI,WAAY;AAChB,yBAAa,IAAI;AAAA,UACnB;AAAA,UAEC;AAAA,iBAAK,OACJ,gBAAAD,KAAC,QAAK,MAAM,KAAK,MAAM,WAAU,0BAAyB,YAAU,MAAC,IACnE;AAAA,YACJ,gBAAAA,KAAC,UAAK,WAAU,sBAAsB,eAAK,OAAM;AAAA,YAChD,YAAY,gBAAAA,KAAC,UAAK,WAAU,sBAAsB,eAAK,OAAM,IAAU;AAAA;AAAA;AAAA,QAfnE,KAAK;AAAA,MAgBZ;AAAA,IAEJ,CAAC;AAAA,IACA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;AAAA,QACrC,cAAY,YAAY,mBAAmB;AAAA,QAE1C,sBAAY,WAAM;AAAA;AAAA,IACrB,IACE;AAAA,KACN;AAEJ;;;AE5RA,OAAOO,UAAS,WAAAC,gBAAe;AAC/B,SAAS,iBAAAC,sBAAqB;AAqGxB,gBAAAC,YAAA;AAjGN,IAAMC,YAAW;AAOjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2Bd,SAAS,uBAAuB,SAA0B;AACxD,MAAI;AACF,WAAOC,eAAuB,OAAO;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,gBAA8C,CAAC,EAAE,OAAO,SAAS,MAAM;AAClF,eAAaF,WAAUC,MAAK;AAE5B,QAAM,WAAmCE;AAAA,IACvC,MACE,MAAM,QAAQ,MAAM,QAAQ,IACxB,MAAM,SAAS;AAAA,MACb,CAAC,MACC,MAAM,QAAQ,OAAO,MAAM,YAAY,OAAQ,EAAuB,OAAO;AAAA,IACjF,IACA,CAAC;AAAA,IACP,CAAC,MAAM,QAAQ;AAAA,EACjB;AAEA,QAAM,eAAe,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AACnF,QAAM,YAAY,uBAAuB,iBAAiB,YAAY,CAAC;AAEvE,QAAM,YAAYA,SAAQ,MAAM;AAC9B,QAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAI,OAAO,cAAc,UAAU;AACjC,YAAM,MAAM,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AACxD,UAAI,OAAO,EAAG,QAAO;AAAA,IACvB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,QAAQ,CAAC;AAExB,MAAI,SAAS,WAAW,EAAG,QAAO;AAKlC,QAAM,MAAMC,OAAM,SAAS,QAAQ,QAAQ;AAC3C,QAAM,SAAS,IAAI,SAAS;AAc5B,QAAM,WAAW,SAAS,SAAS,GAAG,MAAM;AAC5C,SACE,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,mBAAiB;AAAA,MACjB,MAAK;AAAA,MACL,aAAU;AAAA,MACV,eAAY;AAAA,MAEZ,0BAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UACV,mBAAiB;AAAA,UAEhB,oBAAU;AAAA;AAAA,QAJN;AAAA,MAKP;AAAA;AAAA,EACF;AAEJ;;;AC7KA,SAAgB,eAAAM,oBAAmB;AAoS7B,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AAlSN,IAAMC,YAAW;AAEjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsKd,IAAM,eAAmD;AAAA,EACvD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,SAAS,aAAa,OAA+B;AACnD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,MAAM,KAAK,EAAG,QAAO;AAC9D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,WAAW,MAAM,QAAQ,aAAa,EAAE,CAAC;AACnD,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAA0B;AACjD,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,IAAI;AACV,QAAM,IAAI;AACV,QAAM,MAAM;AACZ,SAAO,OACJ,IAAI,CAAC,GAAG,MAAM;AACb,UAAM,IAAI,MAAO,IAAI,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,KAAM,IAAI,MAAM;AAClE,UAAM,IAAI,IAAI,OAAQ,IAAI,OAAO,QAAS,IAAI,MAAM;AACpD,WAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,CAAC,EACA,KAAK,GAAG;AACb;AAoBO,IAAM,UAAkC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC5E,eAAaD,WAAUC,MAAK;AAE5B,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,SAAS,MAAM,eAAe;AACpC,QAAM,UAAU,aAAa,MAAM,KAAK;AAExC,MAAI;AACJ,MAAI,WAAW,QAAQ,MAAM,YAAY,YAAY,QAAQ,WAAW,MAAM,WAAW,UAAU;AACjG,iBAAa;AAAA,EACf,WAAW,WAAW,QAAQ,MAAM,YAAY,WAAW,QAAQ,WAAW,MAAM,WAAW,SAAS;AACtG,iBAAa;AAAA,EACf;AAEA,QAAM,OAAO,MAAM;AACnB,QAAM,YAAY,QAAQ,SAAS,OAAO,gBAAgB,IAAI,KAAK;AAEnE,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,YAAY,YAAY,gBAAgB,OAAO,KAAK;AAAA,IAC/D,SAAS,uBAAuB,MAAM,KAAK;AAAA,IAC3C,MAAM,WAAW,KAAK,IAAI,MAAM,UAAU,KAAK,IAAI;AAAA,EACrD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,QAAQ,MAAM;AACpB,QAAM,YACJ,UAAU,OAAO,WAAM,UAAU,SAAS,WAAM,UAAU,SAAS,WAAM;AAE3E,QAAM,eACJ,MAAM,UAAU,MAAM,MAAM,SAAS,OACjC,WACA,OAAO,MAAM,KAAK;AAExB,QAAM,QAAQ,MAAM;AACpB,QAAM,YAAY,SAAS,MAAM,SAAS,IAAI,gBAAgB,KAAK,IAAI;AAEvE,QAAM,cAAcC,aAAY,MAAM;AACpC,WAAO,aAAa,EAAE,OAAO,MAAM,OAAO,OAAO,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC;AAAA,EACtG,GAAG,CAAC,MAAM,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM,MAAM,KAAK,CAAC;AAM5D,QAAM,gBAAgBA;AAAA,IACpB,CAAC,MAA2C;AAC1C,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,UAAE,eAAe;AACjB,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,kBAAkB,aAAa,OAAO;AAE5C,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,MAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,MACX,cAAY,GAAG,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAG,GAAG,MAAM,OAAO,MAAM,MAAM,OAAO,EAAE;AAAA,MAElG;AAAA,wBAAAA,MAAC,OAAE,WAAU,sBACV;AAAA,4BACC,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,YAAU;AAAA;AAAA,UACZ,IACE;AAAA,UACH,MAAM,SAAS;AAAA,WAClB;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,oBACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,sBAAqB,OAAO,aAAa,EAAE,OAAO,WAAW,IAAI,QAC3E,wBACH;AAAA,UACC,MAAM,OAAO,gBAAAA,KAAC,UAAK,WAAU,qBAAqB,gBAAM,MAAK,IAAU;AAAA,UACvE,SAAS,YACR,gBAAAC,MAAC,UAAK,WAAW,0CAA0C,KAAK,IAC9D;AAAA,4BAAAD,KAAC,UAAK,eAAW,MAAE,qBAAU;AAAA,YAC5B,MAAM,SAAS,OACd,gBAAAC,MAAC,UAAK,WAAU,sBAAsB;AAAA,oBAAM,QAAQ,IAAI,MAAM;AAAA,cAAI,MAAM;AAAA,eAAM,IAC5E;AAAA,YACJ,gBAAAD,KAAC,UAAK,WAAU,wBAAwB,iBAAM;AAAA,aAChD,IACE,MAAM,SAAS,OACjB,gBAAAA,KAAC,UAAK,WAAU,+CACd,0BAAAC,MAAC,UAAK,WAAU,sBAAsB;AAAA,kBAAM,QAAQ,IAAI,MAAM;AAAA,YAAI,MAAM;AAAA,aAAM,GAChF,IACE;AAAA,WACN;AAAA,QACC,YACC,gBAAAD,KAAC,SAAI,WAAU,sBAAqB,SAAQ,cAAa,qBAAoB,QAAO,eAAW,MAC7F,0BAAAA,KAAC,cAAS,QAAQ,WAAW,GAC/B,IACE;AAAA,QACH;AAAA;AAAA;AAAA,EACH;AAEJ;;;AC/SA,OAAkB;AA+ET,gBAAAK,aAAA;AA5ET,IAAMC,YAAW;AAEjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DP,IAAM,aAAwC,CAAC,EAAE,OAAO,SAAS,MAAM;AAC5E,eAAaD,WAAUC,MAAK;AAE5B,QAAM,WAAW,SAAU,CAAC;AAC5B,QAAM,UAA6B,SAAS,WAAW;AACvD,QAAM,UAA6B,SAAS,YAAY,UAAU,UAAU;AAE5E,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,mBAAmB,OAAO;AAAA,IAC1B,YAAY,SAAS,2BAA2B,OAAO,KAAK;AAAA,EAC9D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SAAO,gBAAAF,MAAC,SAAI,WAAuB,UAAS;AAC9C;;;AC1GA,SAAgB,WAAAG,UAAS,YAAAC,iBAAgB;AACzC,SAAS,iBAAAC,sBAAqB;AA6PnB,gBAAAC,OAuHL,QAAAC,aAvHK;AA7OX,SAAS,uBAAuB,MAAuB;AACrD,MAAI;AACF,WAAOC,eAAuB,IAAI;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6Fd,SAAS,WAAW,OAAwB;AAC1C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI;AACF,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B,QAAQ;AACN,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAiEO,SAAS,qBACd,MACA,QAC2B;AAC3B,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,QAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,WAAO,KAAK;AAAA,MAAO,CAAC,QAClB,OAAO,OAAO,GAAG,EAAE,KAAK,CAAC,MAAM,WAAW,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,IACxE;AAAA,EACF;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,UAAU,OAAO,QAAQ,MAAiC;AAChE,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,WAAO,KAAK;AAAA,MAAO,CAAC,QAClB,QAAQ,MAAM,CAAC,CAAC,KAAK,IAAI,MAAM;AAC7B,YAAI,QAAQ,KAAM,QAAO;AACzB,YAAI,OAAO,SAAS,UAAU;AAC5B,cAAI,KAAK,WAAW,EAAG,QAAO;AAK9B,cAAI,OAAO,KAAK;AACd,mBAAO,WAAW,IAAI,GAAG,CAAC,EAAE,YAAY,MAAM,KAAK,YAAY;AAAA,UACjE;AACA,gBAAM,IAAI,KAAK,YAAY;AAC3B,iBAAO,OAAO,OAAO,GAAG,EAAE,KAAK,CAAC,MAAM,WAAW,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,QAC/E;AACA,YAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,cAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,gBAAM,OAAO,WAAW,IAAI,GAAG,CAAC;AAChC,iBAAO,KAAK,KAAK,CAAC,QAAQ,WAAW,GAAG,EAAE,YAAY,MAAM,KAAK,YAAY,CAAC;AAAA,QAChF;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,KACA,eACS;AACT,MAAI,IAAI,aAAa,KAAM,QAAO;AAClC,MAAI,IAAI,aAAa,MAAO,QAAO;AACnC,SAAO;AACT;AAEA,SAAS,WACP,KACA,KACiB;AACjB,QAAM,MAAM,IAAI,IAAI,GAAG;AACvB,QAAM,IAAI,IAAI,QAAQ;AAEtB,MAAI,MAAM,SAAS;AACjB,WAAO,gBAAAJ,MAAC,UAAK,WAAU,wBAAwB,qBAAW,GAAG,GAAE;AAAA,EACjE;AAEA,MAAI,MAAM,YAAY;AACpB,UAAM,IAAI,OAAO,QAAQ,WAAW,MAAM,WAAW,OAAO,GAAG,CAAC;AAChE,UAAM,MAAM,OAAO,SAAS,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI;AACjE,WACE,gBAAAA,MAAC,SAAI,WAAU,2BAA0B,OAAO,GAAG,GAAG,KACpD,0BAAAA,MAAC,SAAI,WAAU,gCAA+B,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI,GAAG,GAC7E;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW;AACnB,WAAO,WAAW,GAAG;AAAA,EACvB;AAEA,QAAM,OAAO,WAAW,GAAG;AAC3B,MAAI,IAAI,UAAU,IAAI,QAAQ;AAC5B,WAAO,GAAG,IAAI,UAAU,EAAE,GAAG,IAAI,GAAG,IAAI,UAAU,EAAE;AAAA,EACtD;AACA,SAAO;AACT;AAEO,IAAM,YAAsC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAChF,eAAaG,YAAUC,OAAK;AAE5B,QAAM,aAAa,MAAM;AACzB,QAAM,UAAU,MAAM;AACtB,QAAM,UAAU,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC;AAC1D,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAQjD,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,YACJ,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAC5E,QAAM,SAAS,kBAAkB;AAAA,IAC/B,SAAS;AAAA,IACT,OAAO;AAAA;AAAA;AAAA,EAGT,CAAC;AAKD,QAAM,aAAa,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC7E,QAAM,YAAY,uBAAuB,iBAAiB,UAAU,CAAC;AACrE,QAAM,cAAc,WAAW,SAAS,IAAI,YAAY;AAExD,MAAI,QAAQ,WAAW,KAAK,CAAC,MAAM,QAAQ,UAAU,EAAG,QAAO;AAC/D,QAAM,WAAW,QAAQ,MAAM,QAAQ;AACvC,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,WAAW,MAAM,gBAAgB;AACvC,QAAM,WACJ,OAAO,MAAM,aAAa,YAAY,MAAM,WAAW,IAAI,MAAM,WAAW;AAE9E,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAwB,IAAI;AAC1D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAyB,KAAK;AAE5D,QAAM,eAAeC;AAAA,IACnB,MAAM,qBAAqB,MAAM,WAAW;AAAA,IAC5C,CAAC,MAAM,WAAW;AAAA,EACpB;AAEA,QAAM,aAAaA,SAAQ,MAAM;AAC/B,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO;AACjD,QAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,QAAQ,EAAG,QAAO;AACtD,UAAM,OAAO,CAAC,GAAG,YAAY;AAC7B,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,KAAK,EAAE,OAAO;AACpB,YAAM,KAAK,EAAE,OAAO;AACpB,UAAI,OAAO,GAAI,QAAO;AACtB,UAAI,MAAM,KAAM,QAAO;AACvB,UAAI,MAAM,KAAM,QAAO;AACvB,UAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UAAU;AACpD,eAAO,YAAY,QAAQ,KAAK,KAAK,KAAK;AAAA,MAC5C;AACA,YAAM,KAAK,WAAW,EAAE;AACxB,YAAM,KAAK,WAAW,EAAE;AACxB,aAAO,YAAY,QAAQ,GAAG,cAAc,EAAE,IAAI,GAAG,cAAc,EAAE;AAAA,IACvE,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,SAAS,SAAS,UAAU,OAAO,CAAC;AAEtD,QAAM,cAAcA,SAAQ,MAAM;AAChC,QAAI,YAAY,KAAM,QAAO;AAC7B,WAAO,WAAW,MAAM,GAAG,QAAQ;AAAA,EACrC,GAAG,CAAC,YAAY,QAAQ,CAAC;AAEzB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,WAAW,YAAY,YAAY,kBAAkB,OAAO,KAAK;AAAA,EACnE,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,gBAAgB,CAAC,QAAgB;AACrC,UAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAC7C,QAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,QAAQ,EAAG;AAC/C,UAAM,OAAO,YAAY;AACzB,UAAM,UAA0B,OAAQ,YAAY,QAAQ,SAAS,QAAS;AAC9E,eAAW,GAAG;AACd,eAAW,OAAO;AAClB,WAAO,cAAc,EAAE,KAAK,WAAW,QAAQ,CAAC;AAAA,EAClD;AAMA,MAAI,OAAO,WAAW;AACpB,WACE,gBAAAL,MAAC,SAAI,WAAU,sBAAqB,cAAW,WAC7C;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,OAAO,SAAS;AAClB,WACE,gBAAAC,MAAC,SAAI,WAAU,sBAAqB,cAAW,SAC7C;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,OAAO,cAAc;AAAA,MACzD;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,oBAAAA,MAAC,WAAM,WAAW,YAChB;AAAA,sBAAAD,MAAC,WACC,0BAAAA,MAAC,QACE,kBAAQ,IAAI,CAAC,QAAQ;AACpB,cAAM,IAAI,IAAI,SAAS,OAClB,OAAO,IAAI,UAAU,WAAW,GAAG,IAAI,KAAK,OAAO,IAAI,QACxD;AACJ,cAAM,UAA2C,IAC7C,EAAE,OAAO,GAAG,UAAU,EAAE,IACxB;AACJ,cAAM,WAAW,YAAY,IAAI;AACjC,cAAM,iBAAiB,kBAAkB,KAAK,QAAQ;AACtD,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,iBAAiB,0DAA0D;AAAA,YACtF,OAAO;AAAA,YACP,OAAM;AAAA,YACN,SAAS,MAAM,cAAc,IAAI,GAAG;AAAA,YACpC,WAAW,CAAC,MAAM;AAChB,kBAAI,mBAAmB,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAAM;AAC1D,kBAAE,eAAe;AACjB,8BAAc,IAAI,GAAG;AAAA,cACvB;AAAA,YACF;AAAA,YACA,UAAU,iBAAiB,IAAI;AAAA,YAC/B,MAAM,iBAAiB,WAAW;AAAA,YAEjC;AAAA,kBAAI,SAAS,IAAI;AAAA,cACjB,iBACC,gBAAAD,MAAC,UAAK,WAAU,4BAA2B,eAAW,MACnD,qBAAY,YAAY,QAAQ,WAAM,WAAO,UAChD,IACE;AAAA;AAAA;AAAA,UAnBC,IAAI;AAAA,QAoBX;AAAA,MAEJ,CAAC,GACH,GACF;AAAA,MACA,gBAAAA,MAAC,WACE,sBAAY,WAAW,IACtB,gBAAAA,MAAC,QACC,0BAAAA,MAAC,QAAG,SAAS,KAAK,IAAI,GAAG,QAAQ,MAAM,GAAG,WAAU,wBACjD,oBACH,GACF,IAEA,YAAY,IAAI,CAAC,KAAK,OAAO;AAC3B,cAAM,KACJ,OAAO,IAAI,OAAO,YAAY,OAAO,IAAI,OAAO,WAC5C,OAAO,IAAI,EAAE,IACb,OAAO,EAAE;AACf,eACE,gBAAAA,MAAC,QACE,kBAAQ,IAAI,CAAC,QACZ,gBAAAA,MAAC,QAAkB,qBAAW,KAAK,GAAG,KAA7B,IAAI,GAA2B,CACzC,KAHM,EAIT;AAAA,MAEJ,CAAC,GAEL;AAAA,OACF;AAAA,IACC;AAAA,KACH;AAEJ;;;ACxcA,SAAgB,eAAAO,oBAAmB;AACnC,SAAS,cAAAC,aAAY,iBAAAC,sBAAqB;AAwKpC,SACmB,OAAAC,OADnB,QAAAC,aAAA;AAnKN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkHP,IAAM,eAA4C,CAAC,EAAE,OAAO,KAAK,MAAM;AAC5E,eAAaD,YAAUC,OAAK;AAE5B,QAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC9D,QAAM,aAAa,MAAM,eAAe;AACxC,QAAM,aAAa,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,SAAS,IACjF,MAAM,aACN;AACJ,QAAM,cAAc,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAChF,QAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;AAEhE,QAAM,EAAE,KAAK,SAAS,IAAIC,eAAc;AACxC,QAAM,aAAaC,YAAW;AAE9B,QAAM,qBAAqBC;AAAA,IACzB,CAAC,MAA2C;AAC1C,YAAM,QAAQ,EAAE,OAAO;AACvB,UAAI,YAAY;AACd,YAAI;AACF,mBAAS,iBAAiB,UAAU,GAAG,KAAK;AAAA,QAC9C,SAAS,KAAK;AACZ,kBAAQ,MAAM,mCAAmC,GAAG;AAAA,QACtD;AAAA,MACF;AACA,aAAO,iBAAiB,EAAE,OAAO,WAAW,CAAC;AAAA,IAC/C;AAAA,IACA,CAAC,YAAY,UAAU,IAAI;AAAA,EAC7B;AAEA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,WAA8C;AAC7C,WAAK,WACF,QAAQ,EAAE,QAAQ,OAAO,QAAQ,QAAQ,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,EAAE,CAAC,EACzF,MAAM,CAAC,QAAQ;AACd,gBAAQ,MAAM,iCAAiC,GAAG;AAAA,MACpD,CAAC;AACH,aAAO,UAAU,EAAE,QAAQ,OAAO,QAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,IACjE;AAAA,IACA,CAAC,YAAY,IAAI;AAAA,EACnB;AAEA,MAAI,SAAS,QAAQ,CAAC,cAAc,QAAQ,WAAW,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SACE,gBAAAL,MAAC,SAAI,WAAU,oBAAmB,MAAK,WAAU,cAAY,SAAS,iBACpE;AAAA,oBAAAA,MAAC,SAAI,WAAU,0BACZ;AAAA,eAAS,OAAO,gBAAAD,MAAC,QAAG,WAAU,2BAA2B,iBAAM,IAAQ;AAAA,MACvE,aACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV;AAAA,UACA,cAAY,UAAU,SAAS,OAAO;AAAA,UACtC,UAAU;AAAA;AAAA,MACZ,IACE;AAAA,OACN;AAAA,IACC,QAAQ,SAAS,IAChB,gBAAAA,MAAC,SAAI,WAAU,6BACZ,kBAAQ,IAAI,CAAC,GAAG,MACf,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO,EAAE;AAAA,QACT,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,MAAM,EAAE;AAAA,QACR,SAAS,MAAM,kBAAkB,CAAC;AAAA;AAAA,MAL7B,GAAG,EAAE,MAAM,IAAI,CAAC;AAAA,IAMvB,CACD,GACH,IACE;AAAA,KACN;AAEJ;;;ACrMA,SAAgB,eAAAO,cAAa,WAAAC,UAAS,YAAAC,iBAAgB;AACtD,SAAS,iBAAAC,sBAAqB;AA0JxB,gBAAAC,OAiBE,QAAAC,aAjBF;AAtJN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuFP,IAAM,eAA4C,CAAC,EAAE,OAAO,KAAK,MAAM;AAC5E,eAAaD,YAAUC,OAAK;AAE5B,QAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACjE,QAAM,aAAa,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC7E,QAAM,WAAW,MAAM,aAAa;AACpC,QAAM,UAAUC;AAAA,IACd,MAAO,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,QAAQ,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,UAAU,QAAQ,IAAI,CAAC;AAAA,IACtI,CAAC,MAAM,OAAO;AAAA,EAChB;AACA,QAAM,cAAc,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAChF,QAAM,cAAc,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAE9F,QAAM,EAAE,KAAK,SAAS,IAAIC,eAAc;AAExC,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAiB,EAAE;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAmB,CAAC,CAAC;AAE/C,QAAM,aAAaC;AAAA,IACjB,CAAC,SAA4B;AAC3B,UAAI,WAAW,SAAS,GAAG;AACzB,YAAI;AACF,mBAAS,iBAAiB,UAAU,GAAG,IAAI;AAAA,QAC7C,SAAS,KAAK;AACZ,kBAAQ,MAAM,mCAAmC,GAAG;AAAA,QACtD;AAAA,MACF;AACA,aAAO,iBAAiB,EAAE,QAAQ,YAAY,OAAO,KAAK,CAAC;AAAA,IAC7D;AAAA,IACA,CAAC,YAAY,QAAQ,UAAU,IAAI;AAAA,EACrC;AAEA,QAAM,qBAAqBA;AAAA,IACzB,CAAC,MAA4C;AAC3C,YAAM,IAAI,EAAE,OAAO;AACnB,gBAAU,CAAC;AACX,iBAAW,CAAC;AAAA,IACd;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,MAA4C;AAC3C,YAAM,IAAI,MAAM,KAAK,EAAE,OAAO,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AACjE,eAAS,CAAC;AACV,iBAAW,CAAC;AAAA,IACd;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,MAAI,OAAO,WAAW,KAAK,WAAW,WAAW,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,WAAW;AACpC,QAAM,cAAc,WAChB,gFACA;AAEJ,SACE,gBAAAN,MAAC,WAAM,WAAU,oBACf;AAAA,oBAAAD,MAAC,UAAK,WAAU,2BAA2B,uBAAY;AAAA,IACtD,WACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,UAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV,cAAY,aAAa,WAAW;AAAA,QAEnC,kBAAQ,IAAI,CAAC,MACZ,gBAAAA,MAAC,YAAqB,OAAO,EAAE,OAC5B,YAAE,SADQ,EAAE,KAEf,CACD;AAAA;AAAA,IACH,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,OAAO;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV,cAAY,aAAa,WAAW;AAAA,QAEpC;AAAA,0BAAAD,MAAC,YAAO,OAAM,IAAI,uBAAY;AAAA,UAC7B,QAAQ,IAAI,CAAC,MACZ,gBAAAA,MAAC,YAAqB,OAAO,EAAE,OAC5B,YAAE,SADQ,EAAE,KAEf,CACD;AAAA;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;;;AC7LA,SAAgB,eAAAQ,cAAa,WAAAC,UAAS,YAAAC,iBAAgB;AACtD,SAAS,iBAAAC,sBAAqB;AA4MnB,qBAAAC,WAAA,OAAAC,OAQH,QAAAC,cARG;AAvMX,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0JP,IAAM,WAAoC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC9E,eAAaD,YAAUC,OAAK;AAE5B,QAAM,UAAU,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AACpE,QAAM,gBAAgB,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AACtE,QAAM,eAAe,OAAO,MAAM,iBAAiB,YAAY,MAAM,aAAa,SAAS,IACvF,MAAM,eACN;AACJ,QAAM,kBAAkBC;AAAA,IACtB,MAAO,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,SAAS,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,IAC3G,CAAC,MAAM,QAAQ;AAAA,EACjB;AACA,QAAM,eAAeA;AAAA,IACnB,MACE,MAAM,QAAQ,MAAM,YAAY,IAC5B,MAAM,aAAa;AAAA,MACjB,CAAC,MACC,CAAC,CAAC,KAAK,OAAO,EAAE,WAAW,YAAY,CAAC,OAAO,OAAO,SAAS,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG;AAAA,IAC/F,IACA,CAAC;AAAA,IACP,CAAC,MAAM,YAAY;AAAA,EACrB;AAEA,QAAM,EAAE,KAAK,SAAS,IAAIC,eAAc;AACxC,QAAM,CAAC,QAAQ,SAAS,IAAIC;AAAA,IAC1B,MAAM,gBAAgB,WAAW,KAAK,gBAAgB,SAAS,OAAO;AAAA,EACxE;AAEA,QAAM,SAASC,aAAY,MAAM;AAC/B,UAAM,WAAW,CAAC;AAClB,cAAU,QAAQ;AAClB,UAAM,eAAe,WAAW,CAAC,OAAO,IAAI,CAAC;AAC7C,QAAI,cAAc;AAChB,UAAI;AACF,iBAAS,iBAAiB,YAAY,GAAG,YAAY;AAAA,MACvD,SAAS,KAAK;AACZ,gBAAQ,MAAM,+BAA+B,GAAG;AAAA,MAClD;AAAA,IACF;AACA,WAAO,gBAAgB,EAAE,SAAS,UAAU,cAAc,QAAQ,SAAS,CAAC;AAAA,EAC9E,GAAG,CAAC,QAAQ,SAAS,cAAc,UAAU,IAAI,CAAC;AAElD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,gBAAAP,MAAAD,WAAA,EAAG,UAAS;AAAA,EACrB;AAEA,QAAM,cAAc,iBAAiB,cAAc,OAAO;AAE1D,SACE,gBAAAE,OAAC,SAAI,WAAU,gBAAe,oBAAkB,SAC9C;AAAA,oBAAAA,OAAC,SAAI,WAAU,wBACb;AAAA,sBAAAA,OAAC,QAAG,WAAU,uBACZ;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAY,SAAS,YAAY,WAAW,KAAK,UAAU,WAAW;AAAA,YACtE,iBAAe;AAAA,YACf,SAAS;AAAA,YAET,0BAAAA,MAAC,QAAK,MAAK,iBAAgB,YAAU,MAAC;AAAA;AAAA,QACxC;AAAA,QACA,gBAAAA,MAAC,UAAM,uBAAY;AAAA,SACrB;AAAA,MACC,aAAa,SAAS,IACrB,gBAAAA,MAAC,SAAI,WAAU,sBAAqB,MAAK,UACtC,uBAAa,IAAI,CAAC,GAAG,MACpB,gBAAAC,OAAC,UAAuC,WAAU,qBAChD;AAAA,wBAAAD,MAAC,UAAK,WAAU,2BAA2B,YAAE,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,KAAI;AAAA,QAC9E,gBAAAA,MAAC,UAAK,WAAU,2BAA0B,cAAW,WAAU,oBAAC;AAAA,WAFvD,GAAG,EAAE,MAAM,IAAI,EAAE,GAAG,IAAI,CAAC,EAGpC,CACD,GACH,IACE;AAAA,OACN;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,sBAAqB,QAAQ,CAAC,QAC1C,UACH;AAAA,KACF;AAEJ;;;ACjPA,OAAkB;AA+SF,gBAAAQ,OACA,QAAAC,cADA;AA5ShB,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Jd,SAAS,QAAQ,GAAY,UAA0B;AACrD,QAAM,IAAI,OAAO,MAAM,WAAW,IAAI,WAAW,OAAO,CAAC,CAAC;AAC1D,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAsBA,SAAS,SAAS,QAAgB,QAAwB;AACxD,MAAI,SAAS,EAAG,QAAQ,SAAS,SAAU;AAC3C,SAAO,SAAS,IAAI,MAAM;AAC5B;AAEA,SAAS,kBACP,QACA,QACA,OACA,WACA,YACmD;AACnD,QAAM,MAAM,SAAS,QAAQ,MAAM;AACnC,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAE/C,MAAI,WAAW;AACb,WAAO;AAAA,MACL,WAAW,aAAa,kDAAkD;AAAA,MAC1E,OAAO,aACH,CAAC,IACD,EAAE,OAAO,GAAG,QAAQ,KAAK,YAAY,UAAU;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,YAAY;AACd,WAAO,EAAE,WAAW,iDAAiD,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI,EAAE;AAAA,EACxG;AAEA,MAAI,OAAO;AACT,UAAM,IAAI;AACV,QAAI,KAAK,MAAM,MAAM;AACnB,aAAO;AAAA,QACL,WAAW;AAAA,QACX,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI;AAAA,MACjC;AAAA,IACF;AACA,QAAI,KAAK,MAAM,SAAS;AACtB,aAAO;AAAA,QACL,WAAW;AAAA,QACX,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI;AAAA,MACjC;AAAA,IACF;AACA,WAAO,EAAE,WAAW,iDAAiD,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI,EAAE;AAAA,EACxG;AAEA,SAAO,EAAE,WAAW,uBAAuB,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI,EAAE;AAC9E;AAEO,IAAM,YAAsC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAChF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC;AACxD,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,QAAQ,MAAM;AACpB,QAAM,WAAW,MAAM,gBAAgB;AAEvC,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,WAAW,YAAY,YAAY,kBAAkB,OAAO,KAAK;AAAA,IACjE,WAAW,4BAA4B;AAAA,EACzC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAF,OAAC,SAAI,WAAW,WACd;AAAA,oBAAAD,MAAC,SAAI,WAAU,uBACZ,gBAAM,IAAI,CAAC,MAAM,QAAQ;AACxB,YAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAClD,YAAM,SAAS,QAAQ,KAAK,QAAQ,CAAC;AACrC,UAAI,aAAa;AACjB,UAAI,MAAM;AACV,UAAI,SAAS,GAAG;AACd,cAAO,SAAS,SAAU;AAC1B,qBAAa,MAAM;AAAA,MACrB,OAAO;AACL,cAAM,SAAS,IAAI,MAAM;AACzB,qBAAa,SAAS;AAAA,MACxB;AAEA,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAC/C,YAAM,EAAE,WAAW,WAAW,OAAO,UAAU,IAAI;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACF;AAEA,YAAM,gBAAgB;AACtB,YAAM,gBAAgB;AACtB,YAAM,OAAO,CAAC,eAAe,MAAM,KAAK,eAAe,IAAI,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG;AAC7F,YAAM,SAAS,SAAS;AAExB,YAAM,oBAAyC,WAC3C;AAAA,QACE,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ,GAAG,QAAQ;AAAA,QACnB,WAAW,WAAW,IAAI,IAAI;AAAA,MAChC,IACA;AAEJ,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UAEV,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS,MAAM,OAAO,eAAe,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,QAAQ,OAAO,CAAC;AAAA,UACpF,WAAW,CAAC,MAAM;AAChB,gBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,gBAAE,eAAe;AACjB,qBAAO,eAAe,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,QAAQ,OAAO,CAAC;AAAA,YACvE;AAAA,UACF;AAAA,UAEA;AAAA,4BAAAA,OAAC,SAAI,WAAU,4BACb;AAAA,8BAAAD,MAAC,OAAE,WAAU,wBAAwB,eAAK,QAAQ,UAAS;AAAA,cAC3D,gBAAAC,OAAC,OAAE,WAAU,uBAAsB,OAAO,aAAa,gBAAgB,QACpE;AAAA;AAAA,gBACA,aACC,gBAAAD,MAAC,UAAK,OAAO,EAAE,OAAO,6BAA6B,YAAY,UAAU,GAAG,kBAAI,IAC9E;AAAA,iBACN;AAAA,eACF;AAAA,YACA,gBAAAA,MAAC,SAAI,WAAU,wBACb,0BAAAA,MAAC,SAAI,WAAW,WAAW,OAAO,WAAW,oBAAoB,WAAW,GAC9E;AAAA,YACC,MAAM,aACL,gBAAAC,OAAC,OAAE,WAAU,yBAAwB;AAAA;AAAA,cAC1B;AAAA,cACR,OAAO,IAAI,IAAI,KAAK;AAAA,eACvB,IACE;AAAA;AAAA;AAAA,QA5BC,GAAG,KAAK,IAAI,IAAI,GAAG;AAAA,MA6B1B;AAAA,IAEJ,CAAC,GACH;AAAA,IACC;AAAA,KACH;AAEJ;;;ACvUA,OAAkB;AA8MZ,SACiB,OAAAG,OADjB,QAAAC,cAAA;AAxMN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyKd,IAAM,eAAsC,CAAC,QAAQ,QAAQ,WAAW,WAAW,IAAI;AAEvF,SAAS,gBAAgB,KAAmC;AAC1D,QAAM,IAAI,OAAO,OAAO,EAAE,EAAE,YAAY;AACxC,MAAI,aAAa,SAAS,CAAwB,EAAG,QAAO;AAC5D,SAAO;AACT;AAKA,IAAMC,eAAmD;AAAA,EACvD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,IAAI;AACN;AAEO,IAAM,gBAA8C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACxF,eAAaF,YAAUC,OAAK;AAE5B,QAAM,YAAY,kBAAkB;AAAA,IAClC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,MAAI,UAAU,SAAS;AACrB,WACE,gBAAAF,OAAC,aAAQ,WAAU,qBAAoB,cAAW,SAC/C;AAAA,YAAM,QAAQ,gBAAAD,MAAC,QAAG,WAAU,4BAA4B,gBAAM,OAAM,IAAQ;AAAA,MAC7E,gBAAAA,MAAC,aAAU,MAAK,SAAQ,aAAa,UAAU,cAAc;AAAA,MAC5D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,UAAU,WAAW;AACvB,WACE,gBAAAC,OAAC,aAAQ,WAAU,qBAAoB,cAAW,WAC/C;AAAA,YAAM,QAAQ,gBAAAD,MAAC,QAAG,WAAU,4BAA4B,gBAAM,OAAM,IAAQ;AAAA,MAC7E,gBAAAA,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,cAAc,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAC1D,QAAM,QAAQ,YAAY,IAAI,CAAC,QAAQ;AAAA,IACrC,OAAO,OAAO,GAAG,SAAS,EAAE;AAAA,IAC5B,QAAQ,gBAAgB,GAAG,MAAM;AAAA,IACjC,OAAO,GAAG,SAAS,OAAO,OAAO,GAAG,KAAK,IAAI;AAAA,IAC7C,WAAW,GAAG,aAAa,OAAO,OAAO,GAAG,SAAS,IAAI;AAAA,EAC3D,EAAE;AAEF,QAAM,SAAS,MAAM,OAAO,CAAC,OAAO,GAAG,WAAW,MAAM,EAAE;AAC1D,QAAM,QAAQ,MAAM;AACpB,QAAM,cAAc,QAAQ,IAAI,KAAK,MAAO,SAAS,QAAS,GAAG,IAAI;AAErE,QAAM,UAAgC,MAAM,YAAY,YAAY,YAAY;AAKhF,QAAM,YAAY,YAAY,YAAY,iDAAiD;AAC3F,QAAM,eAAe,QAAQ,MAAM,YAAY;AAC/C,QAAM,iBAAiB,YAAY,aAAa,CAAC,eAAe,SAAS;AAEzE,SACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,oBAAkB,gBAC1C;AAAA,oBAAgB,QAAQ,IACvB,gBAAAA,OAAC,SAAI,WAAU,+BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,qCACb;AAAA,wBAAAD,MAAC,UAAK,sBAAQ;AAAA,QACd,gBAAAC,OAAC,UACE;AAAA;AAAA,UAAO;AAAA,UAAE;AAAA,UAAM;AAAA,WAClB;AAAA,SACF;AAAA,MACA,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAY,MAAM,QAAQ,GAAG,MAAM,KAAK,+BAA0B;AAAA,UAClE,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,kBAAgB,GAAG,MAAM,OAAO,KAAK;AAAA,UAErC,0BAAAA,MAAC,SAAI,WAAU,oCAAmC,OAAO,EAAE,OAAO,GAAG,WAAW,IAAI,GAAG;AAAA;AAAA,MACzF;AAAA,OACF,IACE;AAAA,IACH,MAAM,QAAQ,gBAAAA,MAAC,QAAG,WAAU,4BAA4B,gBAAM,OAAM,IAAQ;AAAA,IAC7E,gBAAAA,MAAC,QAAG,WAAU,2BAA0B,MAAK,QAC1C,gBAAM,WAAW,IAChB,CAAC,MAAM,QAAQ,QAAQ,IAAI,OAC3B,gBAAAA,MAAC,QAAG,WAAU,4BAA2B,OAAO,EAAE,SAAS,gBAAgB,OAAO,gCAAgC,GAAG,sBAErH,IAEA,MAAM,IAAI,CAAC,IAAI,QACb,gBAAAA,MAAC,QACC,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS,MAAM,OAAO,kBAAkB,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,CAAC;AAAA,QAC1F,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,mBAAO,kBAAkB,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,CAAC;AAAA,UAC7E;AAAA,QACF;AAAA,QAEA;AAAA,0BAAAD,MAAC,UAAK,WAAW,oDAAoD,GAAG,MAAM,IAAI,eAAW,MAC3F,0BAAAA,MAAC,QAAK,MAAMI,aAAY,GAAG,MAAM,GAAG,GACtC;AAAA,UACA,gBAAAH,OAAC,SAAI,WAAU,2BACb;AAAA,4BAAAD,MAAC,SAAI,WAAU,4BAA4B,aAAG,SAAS,UAAI;AAAA,YAC1D,GAAG,YAAY,gBAAAA,MAAC,SAAI,WAAU,2BAA2B,aAAG,WAAU,IAAS;AAAA,YAC/E,GAAG,QAAQ,gBAAAA,MAAC,SAAI,WAAU,4BAA4B,aAAG,OAAM,IAAS;AAAA,aAC3E;AAAA;AAAA;AAAA,IACF,KArBO,GAAG,GAAG,IAAI,GAAG,KAAK,EAsB3B,CACD,GAEL;AAAA,IACC;AAAA,KACH;AAEJ;;;AClTA,OAAOK,WAAS,OAAO,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,WAAU,aAAAC,YAAW,eAAAC,oBAAmB;;;ACAhF,OAAkB;AA+FF,gBAAAC,OAER,QAAAC,cAFQ;AA5FhB,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0EP,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EAAS;AAAA,EAAG;AAAA,EAAG;AAAA,EAAO;AAAA,EAAM;AAAA,EAAU;AAAA,EAAQ;AAChD,MAAM;AACJ,eAAaD,YAAUC,OAAK;AAE5B,QAAM,QAAQ,SAAS,IAAI,SAAS,OAAO;AAC3C,QAAM,QAAQ,SAAS,IAAI,SAAS,MAAM;AAE1C,QAAM,QAA6B;AAAA,IACjC,MAAM,QAAQ,IAAI,KAAK,IAAI;AAAA,IAC3B,KAAK,QAAQ,IAAI,KAAK,IAAI;AAAA,IAC1B,WAAW,QAAQ,sBAAsB;AAAA,EAC3C;AAEA,SACE,gBAAAF,OAAC,SAAI,WAAW,aAAa,UAAU,KAAK,qBAAqB,IAAI,OAClE;AAAA,aAAS,gBAAAD,MAAC,SAAI,WAAU,qBAAqB,iBAAM;AAAA,IACnD,MAAM,IAAI,CAAC,GAAG,MACb,gBAAAC,OAAC,SAAY,WAAU,mBACpB;AAAA,QAAE,SAAS,gBAAAD,MAAC,UAAK,WAAU,sBAAqB,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG;AAAA,MACjF,gBAAAA,MAAC,UAAK,WAAU,qBAAqB,YAAE,OAAM;AAAA,MAC7C,gBAAAA,MAAC,UAAK,WAAU,mBAAmB,YAAE,OAAM;AAAA,SAHnC,CAIV,CACD;AAAA,IACA;AAAA,KACH;AAEJ;;;ADgPU,SAykBM,YAAAI,WAzkBN,OAAAC,OA+FF,QAAAC,cA/FE;AAxVV,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+Gd,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,UAAU,KAAa,KAAa,cAAc,GAAa;AACtE,QAAM,OAAO,MAAM;AACnB,MAAI,SAAS,EAAG,QAAO,CAAC,GAAG;AAC3B,QAAM,UAAU,OAAO;AACvB,QAAM,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,OAAO,CAAC,CAAC;AACxD,QAAM,MAAM,UAAU;AACtB,QAAM,OAAO,OAAO,MAAM,MAAM,OAAO,IAAI,IAAI,MAAM,OAAO,IAAI,IAAI,MAAM,KAAK;AAC/E,QAAM,QAAQ,KAAK,KAAK,MAAM,IAAI,IAAI;AACtC,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,OAAO,KAAK,MAAM,OAAO,MAAO,KAAK,MAAM;AACtD,UAAM,KAAK,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAmB;AAC1C,QAAM,MAAM,KAAK,IAAI,CAAC;AACtB,MAAI,OAAO,IAAW,QAAO,IAAI,IAAI,KAAW,QAAQ,CAAC,CAAC;AAC1D,MAAI,OAAO,IAAQ,QAAO,IAAI,IAAI,KAAO,QAAQ,CAAC,CAAC;AACnD,MAAI,OAAO,IAAO,QAAO,IAAI,IAAI,KAAO,QAAQ,CAAC,CAAC;AAClD,MAAI,OAAO,UAAU,CAAC,EAAG,QAAO,OAAO,CAAC;AACxC,SAAO,EAAE,QAAQ,CAAC;AACpB;AAEA,SAAS,SAAS,GAAW,KAAqB;AAChD,SAAO,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AACtD;AASA,SAAS,OAAO,GAAmE;AACjF,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,UAAU,KAAK,UAAU;AACzE;AAEA,SAAS,KAAK,GAAoF;AAChG,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAO,KAAK,EAAE,UAAU;AACxE;AAEA,SAAS,YAAY,GAAuB,GAAmB;AAC7D,SAAO,EAAE,SAAS,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,IAAI,gBAAgB,IAAI,gBAAgB,MAAM;AACzG;AAEA,SAAS,WAAW,GAA+B,WAAW,GAAW;AACvE,MAAI,MAAM,OAAW,QAAO;AAC5B,MAAI,OAAO,MAAM,SAAU,QAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAC3D,MAAI,OAAO,CAAC,EAAG,QAAO,OAAO,SAAS,EAAE,KAAK,IAAI,EAAE,QAAQ;AAC3D,MAAI,KAAK,CAAC,EAAG,QAAO,OAAO,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI;AACjD,SAAO;AACT;AAEA,SAAS,cAAc,GAAkG;AACvH,MAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAG,QAAO;AAC7B,SAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM;AAClE;AAEA,SAAS,gBAAgB,GAAmB,OAAuB;AACjE,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,KAAK,CAAC,KAAK,OAAO,CAAC,GAAG;AACxB,UAAM,KAAK,EAAE;AACb,QAAI,OAAO,OAAO,YAAY,OAAO,SAAS,EAAE,EAAG,QAAO;AAC1D,QAAI,OAAO,OAAO,UAAU;AAC1B,YAAM,IAAI,WAAW,EAAE;AACvB,aAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AA4CA,IAAM,oBAAoB;AAEnB,IAAM,QAA8B,CAAC,EAAE,OAAO,SAAS,MAAM;AAClE,eAAaD,YAAUC,OAAK;AAM5B,QAAM,aAAa,kBAAkB;AAAA,IACnC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE;AACpC,QAAM,UAAUC,QAAuB,IAAI;AAC3C,QAAM,CAAC,IAAI,KAAK,IAAIC,UAAS,CAAC;AAC9B,EAAAC,WAAU,MAAM;AACd,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,GAAI;AACT,UAAM,OAAO,MAAM;AACjB,YAAM,IAAI,KAAK,MAAM,GAAG,WAAW;AACnC,UAAI,IAAI,EAAG,OAAM,UAAS,SAAS,IAAI,OAAO,CAAE;AAAA,IAClD;AACA,SAAK;AACL,UAAM,KAAK,IAAI,eAAe,IAAI;AAClC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,UAAU,WAAW,IAAID,UAA0C,IAAI;AAC9E,QAAM,YAAYE,aAAY,CAAC,MAAuC;AACpE,UAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,gBAAY,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,EACnE,GAAG,CAAC,CAAC;AACL,QAAM,CAAC,cAAc,eAAe,IAAIF,UAAwB,IAAI;AACpE,QAAM,aAAaE,aAAY,MAAM;AAAE,gBAAY,IAAI;AAAG,oBAAgB,IAAI;AAAA,EAAE,GAAG,CAAC,CAAC;AAErF,QAAM,SAAS;AACf,QAAM,MAAM,MAAM;AAClB,QAAM,MAAM;AACZ,QAAM,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG;AACzC,QAAM,SAAS,MAAM,IAAI,IAAI,IAAI;AACjC,QAAM,SAAS,MAAM,IAAI,IAAI,IAAI;AAEjC,QAAM,aAAa,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC;AACjE,QAAM,aAAa,MAAM,WAAW;AAEpC,QAAM,SAASC,SAAQ,MAAM;AAC3B,UAAM,OAAO,MAAM,OAAO;AAC1B,QAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AAC1C,aAAO,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,IAClC;AACA,QAAI,IAAI;AACR,eAAW,KAAK,YAAY;AAC1B,YAAM,MAAM,EAAE,MAAM,UAAU;AAC9B,UAAI,MAAM,EAAG,KAAI;AAAA,IACnB;AACA,WAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,EAC1D,GAAG,CAAC,MAAM,OAAO,YAAY,UAAU,CAAC;AAExC,QAAM,YAAYA,SAAQ,MAAM;AAC9B,QAAI,CAAC,WAAW,OAAQ,QAAO;AAE/B,UAAM,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AACnD,UAAM,IAAI,OAAO;AAEjB,QAAI,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS;AAClD,YAAM,SAAS,WAAW,CAAC,GAAG,QAAQ,CAAC;AACvC,UAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,YAAM,SAAS,OAAO,IAAI,CAAC,OAAO;AAChC,YAAI,OAAO,OAAO,SAAU,QAAO,KAAK,IAAI,OAAO,SAAS,EAAE,IAAI,KAAK,CAAC;AACxE,YAAI,OAAO,EAAE,EAAG,QAAO,KAAK,IAAI,GAAG,KAAK;AACxC,YAAI,KAAK,EAAE,EAAG,QAAO,KAAK,IAAI,GAAG,CAAC;AAClC,eAAO;AAAA,MACT,CAAC;AACD,YAAM,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,KAAK;AACnD,YAAM,KAAK,EAAE,IAAI,SAAS;AAC1B,YAAM,KAAK,EAAE,IAAI,SAAS;AAC1B,YAAM,IAAI,KAAK,IAAI,QAAQ,MAAM,IAAI,IAAI;AACzC,YAAM,SAAS,MAAM,SAAS,UAAU,IAAI,OAAO;AACnD,UAAI,QAAQ,CAAC,KAAK,KAAK;AACvB,YAAM,SAA4B,CAAC;AACnC,aAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,cAAM,aAAc,IAAI,QAAS,KAAK,KAAK;AAC3C,cAAM,KAAK;AACX,cAAM,KAAK,QAAQ;AACnB,cAAM,YAAY,KAAK,MAAM;AAC7B,cAAM,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,cAAM,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,cAAM,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,cAAM,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,cAAM,QAAQ,aAAa,KAAK,KAAK,IAAI;AACzC,YAAI;AACJ,YAAI,SAAS,GAAG;AACd,gBAAM,KAAK,KAAK,SAAS,KAAK,IAAI,EAAE;AACpC,gBAAM,KAAK,KAAK,SAAS,KAAK,IAAI,EAAE;AACpC,gBAAM,KAAK,KAAK,SAAS,KAAK,IAAI,EAAE;AACpC,gBAAM,KAAK,KAAK,SAAS,KAAK,IAAI,EAAE;AACpC,cAAI,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE;AAAA,QACrH,OAAO;AACL,cAAI,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE;AAAA,QACtE;AACA,gBAAQ;AACR,cAAM,WAAW,iBAAiB;AAClC,cAAM,WAAW,WAAW,KAAK;AACjC,eAAO;AAAA,UACL,gBAAAR;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV;AAAA,cACA,MAAM,YAAY,WAAW,CAAC,GAAG,CAAC;AAAA,cAClC,QAAO;AAAA,cACP,aAAa,WAAW,MAAM;AAAA,cAC9B,cAAW;AAAA,cACX,WAAW,aAAa,KAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,QAAQ;AAAA,cACtF,OAAO,WAAW,EAAE,QAAQ,2DAA2D,IAAI;AAAA,cAC3F,cAAc,MAAM,gBAAgB,CAAC;AAAA,cACrC,cAAc,MAAM,gBAAgB,IAAI;AAAA;AAAA,YAVnC,OAAO,CAAC;AAAA,UAWf;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO,gBAAAA,MAAC,OAAG,kBAAO;AAAA,IACpB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,UAA8D,CAAC;AACrE,iBAAW,QAAQ,CAAC,IAAI,OAAO;AAC7B;AAAC,SAAC,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,IAAI,OAAO;AACnC,gBAAM,IAAI,gBAAgB,IAAI,EAAE;AAChC,gBAAM,IAAI,WAAW,IAAI,CAAC;AAC1B,cAAI,OAAO,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC,EAAG,SAAQ,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,QAC7E,CAAC;AAAA,MACH,CAAC;AACD,UAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,YAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,YAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,UAAI,OAAO,KAAK,IAAI,GAAG,EAAE;AACzB,UAAI,OAAO,KAAK,IAAI,GAAG,EAAE;AACzB,UAAI,OAAO,KAAK,IAAI,GAAG,EAAE;AACzB,UAAI,OAAO,KAAK,IAAI,GAAG,EAAE;AACzB,UAAI,SAAS,MAAM;AACjB,gBAAQ;AACR,gBAAQ;AAAA,MACV;AACA,UAAI,SAAS,MAAM;AACjB,gBAAQ;AACR,gBAAQ;AAAA,MACV;AACA,UAAI,UAAU;AACd,UAAI,UAAU;AACd,YAAM,aAAa,QAAQ,CAAC,OAAO;AACjC,YAAI,GAAG,SAAS,UAAU,GAAG,UAAU,UAAa,OAAO,SAAS,GAAG,KAAK,GAAG;AAC7E,oBAAU,KAAK,IAAI,SAAS,GAAG,KAAK;AACpC,oBAAU,KAAK,IAAI,SAAS,GAAG,KAAK;AAAA,QACtC;AACA,YAAI,GAAG,SAAS,QAAQ;AACtB,cAAI,GAAG,SAAS,UAAa,OAAO,SAAS,GAAG,IAAI,GAAG;AACrD,sBAAU,KAAK,IAAI,SAAS,GAAG,IAAI;AACnC,sBAAU,KAAK,IAAI,SAAS,GAAG,IAAI;AAAA,UACrC;AACA,cAAI,GAAG,OAAO,UAAa,OAAO,SAAS,GAAG,EAAE,GAAG;AACjD,sBAAU,KAAK,IAAI,SAAS,GAAG,EAAE;AACjC,sBAAU,KAAK,IAAI,SAAS,GAAG,EAAE;AAAA,UACnC;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,WAAU,MAAM,MAAM;AAC9F,UAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,WAAU,MAAM,MAAM;AAC9F,UAAI,YAAY,SAAS;AACvB,mBAAW;AACX,mBAAW;AAAA,MACb;AACA,YAAM,UAAU,CAAC,OAAe,EAAE,KAAM,KAAK,SAAS,OAAO,QAAQ,KAAM;AAC3E,YAAM,QAAQ,UAAU,WAAW;AACnC,YAAM,UAAU,CAAC,OAAe,EAAE,IAAI,UAAW,KAAK,WAAW,QAAS;AAC1E,YAAM,aAAgC,CAAC;AACvC,YAAM,aAAa,QAAQ,CAAC,IAAI,OAAO;AACrC,cAAM,SAAS,GAAG,SAAS,OAAO,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI;AACxE,cAAM,OAAO,GAAG,UAAU,WAAW,QAAQ;AAC7C,YAAI,GAAG,SAAS,UAAU,GAAG,SAAS,UAAa,GAAG,OAAO,QAAW;AACtE,gBAAM,KAAK,QAAQ,GAAG,IAAI;AAC1B,gBAAM,KAAK,QAAQ,GAAG,EAAE;AACxB,gBAAM,MAAM,KAAK,IAAI,IAAI,EAAE;AAC3B,gBAAM,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,GAAG,CAAC;AACvC,qBAAW;AAAA,YACT,gBAAAA,MAAC,UAA0B,GAAG,EAAE,GAAG,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG,MAAM,QAAQ,aAAa,MAAM,QAAO,UAAlG,UAAU,EAAE,EAA6F;AAAA,UACtH;AAAA,QACF;AACA,YAAI,GAAG,SAAS,UAAU,GAAG,UAAU,UAAa,OAAO,SAAS,GAAG,KAAK,GAAG;AAC7E,gBAAM,IAAI,QAAQ,GAAG,KAAK;AAC1B,qBAAW;AAAA,YACT,gBAAAA,MAAC,UAA0B,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,QAAQ,IAAI,GAAG,QAAgB,aAAa,GAAG,iBAAiB,QAA1G,UAAU,EAAE,EAAoG;AAAA,UAC7H;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,OAAO,QAAQ,IAAI,CAAC,GAAG,MAC3B,gBAAAA,MAAC,YAAuB,WAAU,6BAA4B,IAAI,QAAQ,EAAE,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,YAAY,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,gBAAa,IAC9J,0BAAAA,MAAC,WAAO,aAAG,WAAW,EAAE,EAAE,EAAE,QAAQ,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,gBAAgB,EAAE,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC,KAAI,KADpG,MAAM,CAAC,EAEpB,CACD;AACD,aACE,gBAAAC,OAAC,OACE;AAAA;AAAA,QACA;AAAA,SACH;AAAA,IAEJ;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,OAAO,MAAM;AAC3C,YAAM,KAAK,EAAE,IAAI,SAAS;AAC1B,YAAM,KAAK,EAAE,IAAI,SAAS;AAC1B,YAAM,OAAO,KAAK,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC5C,UAAI,SAAS;AACb,iBAAW,QAAQ,CAAC,OAAO;AACzB;AAAC,SAAC,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,OAAO;AAC/B,gBAAM,IAAI,WAAW,IAAI,CAAC;AAC1B,cAAI,OAAO,SAAS,CAAC,EAAG,UAAS,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC;AAAA,QAC/D,CAAC;AAAA,MACH,CAAC;AACD,YAAM,UAAU,CAAC,MAAc,CAAC,KAAK,KAAK,IAAK,IAAI,OAAQ,KAAK,KAAK;AACrE,YAAM,OAA0B,CAAC;AACjC,eAAS,OAAO,GAAG,QAAQ,GAAG,QAAQ;AACpC,cAAM,KAAM,OAAO,OAAQ;AAC3B,cAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,MAAM;AACjD,gBAAM,IAAI,QAAQ,CAAC;AACnB,iBAAO,GAAG,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AAAA,QAC1D,CAAC,EAAE,KAAK,GAAG;AACX,aAAK;AAAA,UACH,gBAAAD,MAAC,aAA2B,MAAK,QAAO,QAAO,sEAAqE,aAAa,GAAG,QAAQ,OAA9H,MAAM,IAAI,EAAyH;AAAA,QACnJ;AAAA,MACF;AACA,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAM,IAAI,QAAQ,CAAC;AACnB,aAAK;AAAA,UACH,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,cAC1B,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,cAC1B,QAAO;AAAA,cACP,aAAa;AAAA;AAAA,YANR,MAAM,CAAC;AAAA,UAOd;AAAA,QACF;AACA,cAAM,KAAK,MAAM,OAAO,MAAM,KAAK,IAAI,CAAC;AACxC,cAAM,KAAK,MAAM,OAAO,MAAM,KAAK,IAAI,CAAC;AACxC,cAAM,MAAM,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC;AACrC,aAAK;AAAA,UACH,gBAAAA,MAAC,UAAsB,WAAU,kBAAiB,GAAG,IAAI,GAAG,IAAI,YAAW,UAAS,kBAAiB,UAClG,cAAI,SAAS,IAAI,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,WAAM,OADjC,OAAO,CAAC,EAEnB;AAAA,QACF;AAAA,MACF;AACA,YAAM,QAA2B,CAAC;AAClC,iBAAW,QAAQ,CAAC,IAAI,OAAO;AAC7B,cAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,MAAM;AACpD,gBAAM,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;AACpC,gBAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC;AACvD,gBAAM,IAAI,QAAQ,CAAC;AACnB,gBAAM,KAAK,OAAO;AAClB,iBAAO,GAAG,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AAAA,QAC1D,CAAC,EAAE,KAAK,GAAG;AACX,cAAM,MAAM,YAAY,IAAI,EAAE;AAC9B,cAAM,KAAK,gBAAAA,MAAC,aAAyB,MAAM,KAAK,aAAa,MAAM,QAAQ,KAAK,aAAa,GAAG,QAAQ,UAA/E,MAAM,EAAE,EAA+E,CAAE;AAAA,MACpH,CAAC;AACD,aACE,gBAAAC,OAAC,OACE;AAAA;AAAA,QACA;AAAA,SACH;AAAA,IAEJ;AAEA,QAAI,MAAM,SAAS,eAAe;AAChC,UAAI,CAAC,EAAG,QAAO;AACf,YAAMQ,SAAQ,SAAS,KAAK,IAAI,GAAG,CAAC;AACpC,YAAM,QAAQ,KAAK,IAAI,GAAGA,SAAQ,IAAI;AACtC,YAAM,QAAQ,KAAK,IAAI,GAAGA,SAAQ,IAAI;AACtC,YAAM,MAAyB,CAAC;AAChC,YAAM,KAAe,CAAC;AACtB,aAAO,QAAQ,CAAC,GAAG,OAAO;AACxB,mBAAW,QAAQ,CAAC,OAAO;AACzB,gBAAM,IAAI,cAAc,GAAG,OAAO,EAAE,CAAC;AACrC,cAAI,GAAG;AACL,eAAG,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;AAAA,UACxC;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AACD,UAAIC,QAAO,GAAG,SAAS,KAAK,IAAI,GAAG,EAAE,IAAI;AACzC,UAAIC,QAAO,GAAG,SAAS,KAAK,IAAI,GAAG,EAAE,IAAI;AACzC,UAAI,CAAC,OAAO,SAASD,KAAI,EAAG,CAAAA,QAAO;AACnC,UAAI,CAAC,OAAO,SAASC,KAAI,EAAG,CAAAA,QAAO;AACnC,UAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,CAAAD,QAAO,MAAM,MAAM;AAC3F,UAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,CAAAC,QAAO,MAAM,MAAM;AAC3F,YAAMC,QAAOD,QAAOD,SAAQ;AAC5B,YAAM,UAAU,CAAC,MAAc,EAAE,IAAI,UAAW,IAAIA,SAAQE,QAAQ;AACpE,aAAO,QAAQ,CAAC,GAAG,OAAO;AACxB,cAAM,KAAK,EAAE,IAAI,KAAKH,SAAQA,SAAQ;AACtC,mBAAW,QAAQ,CAAC,IAAI,OAAO;AAC7B,gBAAM,IAAI,cAAc,GAAG,OAAO,EAAE,CAAC;AACrC,cAAI,CAAC,EAAG;AACR,gBAAM,MAAM,QAAQ,EAAE,IAAI;AAC1B,gBAAM,MAAM,QAAQ,EAAE,GAAG;AACzB,gBAAM,KAAK,QAAQ,EAAE,IAAI;AACzB,gBAAM,KAAK,QAAQ,EAAE,KAAK;AAC1B,gBAAM,MAAM,KAAK,IAAI,IAAI,EAAE;AAC3B,gBAAM,MAAM,KAAK,IAAI,IAAI,EAAE;AAC3B,gBAAM,MAAM,YAAY,IAAI,EAAE;AAC9B,gBAAM,UAAU,MAAM,WAAW,SAAS,KAAK,MAAM,QAAQ;AAC7D,gBAAM,KAAK,KAAK,QAAQ,IAAI;AAC5B,cAAI;AAAA,YACF,gBAAAT,MAAC,UAA2B,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAK,QAAQ,KAAK,aAAa,OAAO,eAAc,WAApH,KAAK,EAAE,IAAI,EAAE,EAA+G;AAAA,UACzI;AACA,cAAI;AAAA,YACF,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH,OAAO,QAAQ;AAAA,gBACf,QAAQ,KAAK,IAAI,GAAG,MAAM,GAAG;AAAA,gBAC7B,MAAM;AAAA,gBACN,aAAa,EAAE,SAAS,EAAE,OAAO,OAAO;AAAA,gBACxC,QAAQ;AAAA,gBACR,aAAa;AAAA;AAAA,cARR,KAAK,EAAE,IAAI,EAAE;AAAA,YASpB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AACD,aAAO,gBAAAA,MAAC,OAAG,eAAI;AAAA,IACjB;AAEA,QAAI,CAAC,EAAG,QAAO;AAEf,UAAM,UAAoB,CAAC;AAC3B,eAAW,QAAQ,CAAC,OAAO;AACzB,aAAO,QAAQ,CAAC,GAAG,OAAO;AACxB,cAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,GAAG;AACvC,YAAI,OAAO,SAAS,CAAC,EAAG,SAAQ,KAAK,CAAC;AAAA,MACxC,CAAC;AAAA,IACH,CAAC;AACD,UAAM,aAAa,QAAQ,CAAC,OAAO;AACjC,UAAI,GAAG,SAAS,UAAU,GAAG,UAAU,UAAa,OAAO,SAAS,GAAG,KAAK,EAAG,SAAQ,KAAK,GAAG,KAAK;AACpG,UAAI,GAAG,SAAS,QAAQ;AACtB,YAAI,GAAG,SAAS,UAAa,OAAO,SAAS,GAAG,IAAI,EAAG,SAAQ,KAAK,GAAG,IAAI;AAC3E,YAAI,GAAG,OAAO,UAAa,OAAO,SAAS,GAAG,EAAE,EAAG,SAAQ,KAAK,GAAG,EAAE;AAAA,MACvE;AAAA,IACF,CAAC;AACD,QAAI,OAAO,QAAQ,SAAS,KAAK,IAAI,GAAG,GAAG,OAAO,IAAI;AACtD,QAAI,OAAO,QAAQ,SAAS,KAAK,IAAI,GAAG,GAAG,SAAS,CAAC,IAAI;AACzD,QAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,QAAO,MAAM,MAAM;AAC3F,QAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,QAAO,MAAM,MAAM;AAC3F,UAAM,OAAO,OAAO,QAAQ;AAE5B,UAAM,SAAS,CAAC,MAAc,EAAE,IAAI,UAAW,IAAI,QAAQ,OAAQ;AACnE,UAAM,QAAQ,SAAS,KAAK,IAAI,GAAG,CAAC;AACpC,UAAM,QAAQ,OAAO,CAAC;AAEtB,UAAM,gBAAmC,CAAC;AAC1C,UAAM,aAAa,QAAQ,CAAC,IAAI,OAAO;AACrC,YAAM,SAAS,GAAG,SAAS,OAAO,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI;AACxE,YAAM,OAAO,GAAG,UAAU,WAAW,QAAQ;AAC7C,UAAI,GAAG,SAAS,UAAU,GAAG,SAAS,UAAa,GAAG,OAAO,QAAW;AACtE,cAAM,KAAK,OAAO,GAAG,IAAI;AACzB,cAAM,KAAK,OAAO,GAAG,EAAE;AACvB,cAAM,MAAM,KAAK,IAAI,IAAI,EAAE;AAC3B,cAAM,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,GAAG,CAAC;AACvC,sBAAc;AAAA,UACZ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,GAAG,EAAE;AAAA,cACL,GAAG;AAAA,cACH,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,aAAa;AAAA,cACb,QAAO;AAAA;AAAA,YAPF,OAAO,EAAE;AAAA,UAQhB;AAAA,QACF;AAAA,MACF;AACA,UAAI,GAAG,SAAS,UAAU,GAAG,UAAU,UAAa,OAAO,SAAS,GAAG,KAAK,GAAG;AAC7E,cAAM,IAAI,OAAO,GAAG,KAAK;AACzB,sBAAc;AAAA,UACZ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI,EAAE;AAAA,cACN,IAAI;AAAA,cACJ,IAAI,EAAE,IAAI;AAAA,cACV,IAAI;AAAA,cACJ;AAAA,cACA,aAAa;AAAA,cACb,iBAAiB;AAAA;AAAA,YAPZ,OAAO,EAAE;AAAA,UAQhB;AAAA,QACF;AACA,YAAI,GAAG,OAAO;AACZ,wBAAc;AAAA,YACZ,gBAAAA,MAAC,UAAwB,WAAU,kBAAiB,GAAG,EAAE,IAAI,SAAS,GAAG,GAAG,IAAI,GAAG,YAAW,OAAM,MAAM,QACvG,aAAG,MAAM,SAAS,KAAK,GAAG,GAAG,MAAM,MAAM,GAAG,EAAE,CAAC,WAAM,GAAG,SADhD,QAAQ,EAAE,EAErB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,MAAM,SAAS,OAAO;AACxB,YAAM,UAAU,QAAQ,MAAM,OAAO;AACrC,YAAM,WAAW;AACjB,YAAM,IAAI,KAAK,IAAI,GAAG,WAAW,MAAM;AACvC,YAAM,OAAO,UAAU,SAAS,IAAI,YAAa,SAAS,IAAI,YAAa;AAC3E,YAAM,OAA0B,CAAC;AACjC,aAAO,QAAQ,CAAC,GAAG,OAAO;AACxB,cAAM,KAAK,EAAE,IAAI,KAAK,QAAS,QAAQ,WAAY;AACnD,YAAI,SAAS;AACX,cAAI,MAAM;AACV,qBAAW,QAAQ,CAAC,IAAI,OAAO;AAC7B,kBAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,CAAC;AACrC,kBAAM,MAAM,OAAO,SAAS,CAAC,IAAI,IAAI;AACrC,kBAAM,QAAQ,OAAO,GAAG;AACxB,kBAAM,OAAO,OAAO,MAAM,GAAG;AAC7B,kBAAM,MAAM,KAAK,IAAI,OAAO,IAAI;AAChC,kBAAM,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,GAAG,QAAQ,IAAI,IAAI,CAAC;AAC5D,iBAAK;AAAA,cACH,gBAAAA,MAAC,UAA6B,WAAU,6BAA4B,GAAG,IAAI,GAAG,KAAK,OAAO,OAAO,MAAM,QAAQ,GAAG,MAAM,YAAY,IAAI,EAAE,GAAG,IAAI,GAAG,YAAS,IAC3J,0BAAAA,MAAC,WAAO,aAAG,GAAG,QAAQ,UAAU,KAAK,CAAC,EAAE,KAAK,gBAAgB,GAAG,CAAC,IAAG,KAD3D,OAAO,EAAE,IAAI,EAAE,EAE1B;AAAA,YACF;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,OAAO;AACL,qBAAW,QAAQ,CAAC,IAAI,OAAO;AAC7B,kBAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,CAAC;AACrC,kBAAM,MAAM,OAAO,SAAS,CAAC,IAAI,IAAI;AACrC,kBAAM,KAAK,OAAO,GAAG;AACrB,kBAAM,MAAM,KAAK,IAAI,OAAO,EAAE;AAC9B,kBAAM,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,QAAQ,IAAI,IAAI,CAAC;AAC1D,kBAAM,IAAI,KAAK,KAAK;AACpB,iBAAK;AAAA,cACH,gBAAAA,MAAC,UAA6B,WAAU,6BAA4B,GAAM,GAAG,KAAK,OAAO,OAAO,MAAM,QAAQ,GAAG,MAAM,YAAY,IAAI,EAAE,GAAG,IAAI,GAAG,YAAS,IAC1J,0BAAAA,MAAC,WAAO,aAAG,OAAO,EAAE,CAAC,WAAM,GAAG,QAAQ,UAAU,KAAK,CAAC,EAAE,KAAK,gBAAgB,GAAG,CAAC,IAAG,KAD3E,OAAO,EAAE,IAAI,EAAE,EAE1B;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AACD,aACE,gBAAAC,OAAC,OACE;AAAA;AAAA,QACA;AAAA,SACH;AAAA,IAEJ;AAEA,QAAI,MAAM,SAAS,UAAU,MAAM,SAAS,QAAQ;AAClD,YAAM,QAA2B,CAAC;AAClC,YAAM,QAA2B,CAAC;AAClC,YAAM,OAA0B,CAAC;AACjC,YAAM,YAAY,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,OAAO,EAAE,IAAI,MAAM,CAAC;AAC7D,iBAAW,QAAQ,CAAC,IAAI,OAAO;AAC7B,cAAM,SAAS,OACZ,IAAI,CAAC,GAAG,OAAO;AACd,gBAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,CAAC;AACrC,gBAAM,MAAM,OAAO,SAAS,CAAC,IAAI,IAAI;AACrC,gBAAM,IAAI,EAAE,IAAI,KAAK,QAAQ,QAAQ;AACrC,gBAAM,IAAI,OAAO,GAAG;AACpB,iBAAO,GAAG,CAAC,IAAI,CAAC;AAAA,QAClB,CAAC,EACA,KAAK,GAAG;AACX,cAAM,QAAQ,YAAY,IAAI,EAAE;AAChC,YAAI,MAAM,SAAS,QAAQ;AACzB,gBAAM,SAAS,EAAE,IAAI,QAAQ;AAC7B,gBAAM,QAAQ,EAAE,KAAK,IAAI,KAAK,QAAQ,QAAQ;AAC9C,gBAAM,aAAa,GAAG,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,KAAK,IAAI,SAAS;AACzE,gBAAM,KAAK,gBAAAD,MAAC,aAA2B,MAAM,OAAO,aAAa,KAAK,QAAO,QAAO,QAAQ,cAAnE,QAAQ,EAAE,EAAqE,CAAE;AAAA,QAC5G;AACA,cAAM;AAAA,UACJ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,QAAQ;AAAA,cACR,aAAa;AAAA,cACb,gBAAe;AAAA,cACf,eAAc;AAAA,cACd,QAAQ;AAAA;AAAA,YANH,QAAQ,EAAE;AAAA,UAOjB;AAAA,QACF;AACA,eAAO,QAAQ,CAAC,GAAG,OAAO;AACxB,gBAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,CAAC;AACrC,gBAAM,MAAM,OAAO,SAAS,CAAC,IAAI,IAAI;AACrC,gBAAM,IAAI,EAAE,IAAI,KAAK,QAAQ,QAAQ;AACrC,gBAAM,IAAI,OAAO,GAAG;AACpB,eAAK,KAAK,gBAAAA,MAAC,YAA+B,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,MAAM,SAA7C,OAAO,EAAE,IAAI,EAAE,EAAqC,CAAE;AAAA,QAC/E,CAAC;AAAA,MACH,CAAC;AACD,aACE,gBAAAC,OAAC,OACE;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,SACH;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,QAAQ,QAAQ,MAAM,aAAa,MAAM,SAAS,MAAM,MAAM,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK,YAAY,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;AAErJ,QAAM,SAASO,SAAQ,MAAM;AAC3B,UAAM,IAAI,OAAO;AACjB,UAAM,QAAQ,SAAS,KAAK,IAAI,GAAG,CAAC;AACpC,UAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,QAAQ,CAAC,CAAC,CAAC;AAChE,UAAM,OAAO,IAAI,KAAK,KAAK,KAAK,IAAI,EAAE,IAAI;AAC1C,WAAO,OAAO,IAAI,CAAC,KAAK,OAAO;AAC7B,UAAI,KAAK,SAAS,KAAK,OAAO,IAAI,EAAG,QAAO;AAC5C,YAAM,IAAI,IAAI,IAAI,KAAK,QAAQ,QAAQ;AACvC,YAAM,OAAO,IAAI,SAAS,WAAW,GAAG,IAAI,MAAM,GAAG,WAAW,CAAC,CAAC,WAAM;AACxE,aACE,gBAAAR,MAAC,UAAsB,WAAU,kBAAiB,GAAM,GAAG,MAAM,GAAG,YAAW,UAC5E,kBADQ,MAAM,EAAE,EAEnB;AAAA,IAEJ,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,QAAQ,IAAI,GAAG,GAAG,CAAC;AAE/B,QAAM,SAAS,WAAW,IAAI,CAAC,IAAI,MACjC,gBAAAC,OAAC,UAAqB,WAAU,yBAAwB,OAAO,GAAG,QAAQ,UAAU,IAAI,CAAC,IACvF;AAAA,oBAAAD,MAAC,UAAK,WAAU,2BAA0B,OAAO,EAAE,YAAY,YAAY,IAAI,CAAC,EAAE,GAAG;AAAA,IACpF,SAAS,GAAG,QAAQ,UAAU,IAAI,CAAC,IAAI,EAAE;AAAA,OAFjC,MAAM,CAAC,EAGlB,CACD;AAED,QAAM,UAAU,MAAM,SAAS,SAAS,MAAM,SAAS,WAAW,MAAM,SAAS;AACjF,QAAM,YAAY,MAAM,SAAS;AACjC,QAAM,oBAAoB,CAAC,WAAW,CAAC,aAAa,OAAO,SAAS,KAAK,WAAW,SAAS;AAE7F,QAAM,UACJ,WAAW,SAAS,MACnB,MAAM,SAAS,YACZ,WAAW,KAAK,CAAC,OAAO,EAAE,MAAM,UAAU,KAAK,CAAC,IAChD,MAAM,SAAS,SAAS,MAAM,SAAS,WACpC,WAAW,CAAC,GAAG,MAAM,UAAU,KAAK,IACrC,OAAO,SAAS;AAExB,QAAM,WAAWQ,SAAQ,MAAM;AAC7B,QAAI,WAAW,CAAC,WAAW,OAAQ,QAAO;AAC1C,UAAM,UAAoB,CAAC;AAC3B,eAAW,QAAQ,CAAC,OAAO;AACzB,aAAO,QAAQ,CAAC,GAAG,OAAO;AACxB,cAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,GAAG;AACvC,YAAI,OAAO,SAAS,CAAC,EAAG,SAAQ,KAAK,CAAC;AAAA,MACxC,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAI,OAAO,KAAK,IAAI,GAAG,GAAG,OAAO;AACjC,QAAI,OAAO,KAAK,IAAI,GAAG,GAAG,SAAS,CAAC;AACpC,QAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,QAAO,MAAM,MAAM;AAC3F,QAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,QAAO,MAAM,MAAM;AAC3F,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,QAAQ,UAAU,MAAM,MAAM,CAAC;AACrC,UAAM,SAAS,CAAC,MAAc,IAAI,IAAI,UAAW,IAAI,QAAQ,OAAQ;AACrE,WACE,gBAAAR,MAAC,OACE,gBAAM,IAAI,CAAC,GAAG,MAAM;AACnB,YAAM,IAAI,OAAO,CAAC;AAClB,UAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,SAAS,EAAG,QAAO;AACpD,aACE,gBAAAC,OAACY,QAAM,UAAN,EACC;AAAA,wBAAAb,MAAC,UAAK,WAAU,uBAAsB,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,QAAQ,IAAI,GAAG;AAAA,QACnF,gBAAAA,MAAC,UAAK,WAAU,kBAAiB,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,YAAW,OACjE,0BAAgB,CAAC,GACpB;AAAA,WAJmB,MAAM,CAAC,EAK5B;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ,GAAG,CAAC,SAAS,YAAY,QAAQ,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG,QAAQ,MAAM,CAAC;AAElG,QAAM,YAAYQ,SAAQ,MAAM;AAC9B,QAAI,CAAC,YAAY,WAAW,UAAW,QAAO;AAC9C,UAAM,IAAI,OAAO;AACjB,QAAI,CAAC,KAAK,CAAC,WAAW,OAAQ,QAAO;AACrC,UAAM,QAAQ,SAAS,KAAK,IAAI,GAAG,CAAC;AACpC,UAAM,SAAS,KAAK,OAAO,SAAS,IAAI,IAAI,IAAI,QAAQ,KAAK,KAAK;AAClE,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC;AAC/C,UAAM,SAAS,IAAI,IAAI,MAAM,QAAQ,QAAQ;AAC7C,QAAI,SAAS,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,KACxD,SAAS,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,GAAI,QAAO;AACvE,UAAM,OAAiB,CAAC;AACxB,eAAW,QAAQ,QAAM,OAAO,QAAQ,CAAC,GAAG,OAAO;AACjD,YAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,GAAG;AACvC,UAAI,OAAO,SAAS,CAAC,EAAG,MAAK,KAAK,CAAC;AAAA,IACrC,CAAC,CAAC;AACF,QAAI,KAAK,KAAK,SAAS,KAAK,IAAI,GAAG,GAAG,IAAI,IAAI;AAC9C,QAAI,KAAK,KAAK,SAAS,KAAK,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI;AACjD,QAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,MAAK,MAAM,MAAM;AACzF,QAAI,MAAM,OAAO,QAAQ,UAAa,OAAO,SAAS,MAAM,MAAM,GAAG,EAAG,MAAK,MAAM,MAAM;AACzF,UAAM,KAAK,KAAK,MAAM;AACtB,UAAM,KAAK,CAAC,MAAc,IAAI,IAAI,UAAW,IAAI,MAAM,KAAM;AAE7D,QAAI,MAAM,SAAS,eAAe;AAChC,YAAMM,QAAqB,CAAC;AAC5B,iBAAW,QAAQ,CAAC,IAAI,OAAO;AAC7B,cAAM,IAAI,cAAc,GAAG,OAAO,GAAG,CAAC;AACtC,YAAI,GAAG;AACL,gBAAM,IAAI,YAAY,IAAI,EAAE;AAC5B,UAAAA,MAAK,KAAK,EAAE,OAAO,GAAG,OAAO,QAAQ,OAAO,gBAAgB,EAAE,IAAI,EAAE,CAAC;AACrE,UAAAA,MAAK,KAAK,EAAE,OAAO,GAAG,OAAO,QAAQ,OAAO,gBAAgB,EAAE,IAAI,EAAE,CAAC;AACrE,UAAAA,MAAK,KAAK,EAAE,OAAO,GAAG,OAAO,OAAO,OAAO,gBAAgB,EAAE,GAAG,EAAE,CAAC;AACnE,UAAAA,MAAK,KAAK,EAAE,OAAO,GAAG,OAAO,SAAS,OAAO,gBAAgB,EAAE,KAAK,EAAE,CAAC;AAAA,QACzE;AAAA,MACF,CAAC;AACD,aAAO,EAAE,KAAK,QAAQ,MAAAA,OAAM,QAAQ,CAAC,GAAgD,OAAO,OAAO,GAAG,EAAE;AAAA,IAC1G;AAEA,UAAM,OAAqB,WAAW,IAAI,CAAC,IAAI,OAAO;AACpD,YAAM,IAAI,WAAW,GAAG,OAAO,GAAG,GAAG,CAAC;AACtC,aAAO,EAAE,OAAO,YAAY,IAAI,EAAE,GAAG,OAAO,GAAG,QAAQ,UAAU,KAAK,CAAC,IAAI,OAAO,gBAAgB,OAAO,SAAS,CAAC,IAAI,IAAI,CAAC,EAAE;AAAA,IAChI,CAAC;AACD,UAAM,SAAU,MAAM,SAAS,UAAU,MAAM,SAAS,SACpD,WAAW,IAAI,CAAC,IAAI,OAAO;AACzB,YAAM,IAAI,WAAW,GAAG,OAAO,GAAG,GAAG,CAAC;AACtC,aAAO,EAAE,GAAG,QAAQ,GAAG,GAAG,OAAO,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,OAAO,YAAY,IAAI,EAAE,EAAE;AAAA,IACpF,CAAC,IACD,CAAC;AACL,WAAO,EAAE,KAAK,QAAQ,MAAM,QAAQ,OAAO,OAAO,GAAG,EAAE;AAAA,EACzD,GAAG,CAAC,UAAU,SAAS,WAAW,QAAQ,QAAQ,QAAQ,IAAI,GAAG,IAAI,GAAG,YAAY,MAAM,MAAM,MAAM,OAAO,KAAK,MAAM,OAAO,GAAG,CAAC;AAEnI,QAAM,eAAeN,SAAQ,MAAM;AACjC,QAAI,iBAAiB,QAAS,MAAM,SAAS,SAAS,MAAM,SAAS,QAAU,QAAO;AACtF,UAAM,SAAS,WAAW,CAAC,GAAG,QAAQ,CAAC;AACvC,UAAM,SAAS,OAAO,IAAI,QAAM;AAC9B,UAAI,OAAO,OAAO,SAAU,QAAO,KAAK,IAAI,OAAO,SAAS,EAAE,IAAI,KAAK,CAAC;AACxE,UAAI,OAAO,EAAE,EAAG,QAAO,KAAK,IAAI,GAAG,KAAK;AACxC,UAAI,KAAK,EAAE,EAAG,QAAO,KAAK,IAAI,GAAG,CAAC;AAClC,aAAO;AAAA,IACT,CAAC;AACD,UAAM,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,KAAK;AACnD,UAAM,MAAM;AACZ,QAAI,MAAM,KAAK,OAAO,OAAO,OAAQ,QAAO;AAC5C,UAAM,QAAQ,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC;AACxC,WAAO;AAAA,MACL;AAAA,MACA,MAAM,CAAC;AAAA,QACL,OAAO,YAAY,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG;AAAA,QAC3C;AAAA,QACA,OAAO,GAAG,OAAO,GAAG,EAAE,eAAe,CAAC,MAAO,OAAO,GAAG,IAAI,QAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,MACrF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,cAAc,MAAM,MAAM,YAAY,MAAM,CAAC;AAIjD,MAAI,WAAW,SAAS;AACtB,WACE,gBAAAP,OAAC,SAAI,WAAU,YAAW,cAAW,SAClC;AAAA,YAAM,QAAQ,gBAAAD,MAAC,OAAE,WAAU,mBAAmB,gBAAM,OAAM,IAAO;AAAA,MAClE,gBAAAA,MAAC,aAAU,MAAK,SAAQ,aAAa,WAAW,cAAc;AAAA,MAC7D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,WAAW,WAAW;AACxB,WACE,gBAAAC,OAAC,SAAI,WAAU,YAAW,cAAW,WAClC;AAAA,YAAM,QAAQ,gBAAAD,MAAC,OAAE,WAAU,mBAAmB,gBAAM,OAAM,IAAO;AAAA,MAClE,gBAAAA,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,YACZ;AAAA,UAAM,QAAQ,gBAAAD,MAAC,OAAE,WAAU,mBAAmB,gBAAM,OAAM,IAAO;AAAA,IACjE,CAAC,UACA,gBAAAA,MAAC,SAAI,WAAU,mBAAkB,2BAAa,IAE9C,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAE,OAAC,SAAI,KAAK,SAAS,WAAU,sBAC3B;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,OAAO,GAAG,IAAI,GAAG;AAAA,YAC1B,MAAK;AAAA,YACL,mBAAiB,kBAAkB,GAAG;AAAA,YACtC,OAAO,EAAE,QAAQ,KAAK,QAAQ,WAAW,YAAY,YAAY,YAAY;AAAA,YAC7E,aAAa;AAAA,YACb,cAAc;AAAA,YAEd;AAAA,8BAAAD,MAAC,WAAM,IAAI,kBAAkB,GAAG,IAAK,gBAAM,SAAS,SAAQ;AAAA,cAC3D;AAAA,cACA,oBACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,gCAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,IAAI,IAAI;AAAA,oBACR,IAAI,IAAI,IAAI;AAAA,oBACZ,IAAI,IAAI,IAAI;AAAA,oBACZ,IAAI,IAAI,IAAI;AAAA;AAAA,gBACd;AAAA,gBACA,gBAAAA,MAAC,UAAK,WAAU,kBAAiB,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,QAAQ;AAAA,iBACxF,IACE,YACF,gBAAAC,OAAAF,WAAA,EACE;AAAA,gCAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,IAAI,IAAI;AAAA,oBACR,IAAI,IAAI,IAAI;AAAA,oBACZ,IAAI,IAAI,IAAI;AAAA,oBACZ,IAAI,IAAI,IAAI;AAAA;AAAA,gBACd;AAAA,gBACA,gBAAAA,MAAC,UAAK,WAAU,kBAAiB,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,QAAQ;AAAA,iBACxF,IACE;AAAA,cACH;AAAA,cACA,aACC,gBAAAC,OAAC,OACC;AAAA,gCAAAD,MAAC,UAAK,WAAU,uBAAsB,IAAI,UAAU,QAAQ,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,QAAQ;AAAA,gBAChH,UAAU,OAAO,IAAI,CAAC,IAAI,MACzB,gBAAAA,MAAC,YAAuB,WAAU,uBAAsB,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,QAAO,2BAA0B,aAAa,KAAnI,MAAM,CAAC,EAA+H,CACpJ;AAAA,iBACH;AAAA,cAED,oBAAoB,gBAAAA,MAAC,OAAG,kBAAO,IAAO;AAAA;AAAA;AAAA,QACzC;AAAA,QACC,aAAa,YACZ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAO;AAAA,YACP,GAAG,SAAS;AAAA,YACZ,GAAG,SAAS;AAAA,YACZ,OAAO,UAAU;AAAA,YACjB,MAAM,UAAU;AAAA,YAChB,QAAQ,MAAM;AAAA,YACd,QAAQ;AAAA;AAAA,QACV;AAAA,QAED,gBAAgB,YACf,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAO;AAAA,YACP,GAAG,SAAS;AAAA,YACZ,GAAG,SAAS;AAAA,YACZ,OAAO,aAAa;AAAA,YACpB,MAAM,aAAa;AAAA,YACnB,QAAQ,MAAM;AAAA,YACd,QAAQ;AAAA;AAAA,QACV;AAAA,SAEJ;AAAA,MACC,cAAc,OAAO,SAAS,gBAAAA,MAAC,SAAI,WAAU,oBAAoB,kBAAO,IAAS;AAAA,OACpF;AAAA,IAED;AAAA,KACH;AAEJ;;;AEj+BA,SAAgB,WAAAe,gBAAe;AAgNzB,SACE,OAAAC,OADF,QAAAC,cAAA;AA7MN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgJd,SAAS,oBAAoB,KAA0B;AACrD,QAAM,IAAI,OAAO,OAAO,EAAE,EAAE,YAAY;AACxC,MAAI,MAAM,aAAa,MAAM,aAAa,MAAM,aAAa,MAAM,KAAM,QAAO;AAChF,SAAO;AACT;AAEA,SAAS,UAAU,QAA4B;AAC7C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;AAcO,IAAM,cAA0C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACpF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,UAAU,MAAM;AACtB,QAAM,UAAU,MAAM;AACtB,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AACjD,QAAM,UAAU,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AACpD,QAAM,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,CAAC;AAC9E,QAAM,WAAW,QAAQ,MAAM,QAAQ;AAEvC,QAAM,cAAcC,SAAQ,MAAM;AAChC,QAAI,KAAK,WAAW,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtD,QAAI,UAAU;AACd,UAAM,QAAQ,KAAK,SAAS,QAAQ;AACpC,eAAW,OAAO,MAAM;AACtB,YAAM,SAAS,MAAM,IAAI,EAAE,KAAK,CAAC;AACjC,iBAAW,OAAO,SAAS;AACzB,cAAM,KAAK,oBAAoB,OAAO,GAAG,CAAC;AAC1C,YAAI,OAAO,UAAW,YAAW;AAAA,MACnC;AAAA,IACF;AACA,WAAO,QAAQ,IAAI,KAAK,MAAO,UAAU,QAAS,GAAG,IAAI;AAAA,EAC3D,GAAG,CAAC,MAAM,SAAS,KAAK,CAAC;AAEzB,MAAI,KAAK,WAAW,KAAK,QAAQ,WAAW,GAAG;AAC7C,QAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AAC/D,WACE,gBAAAH,OAAC,SAAI,WAAU,mBACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,0BACZ,eAAK,WAAW,KAAK,QAAQ,WAAW,IACrC,oDACA,KAAK,WAAW,IACd,sBACA,+BACR;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,mBACZ;AAAA,UAAM,eACL,gBAAAA,OAAC,SAAI,WAAU,6BAA4B,aAAU,UAAS;AAAA;AAAA,MACjD;AAAA,MAAY;AAAA,OACzB,IACE;AAAA,IACJ,gBAAAA,OAAC,WAAM,WAAU,0BACf;AAAA,sBAAAD,MAAC,WACC,0BAAAC,OAAC,QACC;AAAA,wBAAAD,MAAC,QAAG,OAAM,OAAM,WAAU,mDAAkD,0BAE5E;AAAA,QACC,QAAQ,IAAI,CAAC,QACZ,gBAAAA,MAAC,QAAa,OAAM,OAAM,WAAU,uBAAsB,OAAO,KAC9D,cAAI,SAAS,KAAK,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC,WAAM,OADrC,GAET,CACD;AAAA,SACH,GACF;AAAA,MACA,gBAAAA,MAAC,WACE,eAAK,IAAI,CAAC,QACT,gBAAAC,OAAC,QACC;AAAA,wBAAAA,OAAC,QAAG,OAAM,OAAM,WAAU,8BAA6B,OAAO,IAAI,OAC/D;AAAA,cAAI,SAAS,IAAI;AAAA,UACjB,IAAI,WAAW,gBAAAD,MAAC,UAAK,WAAU,mCAAmC,cAAI,UAAS,IAAU;AAAA,WAC5F;AAAA,QACC,QAAQ,IAAI,CAAC,QAAQ;AACpB,gBAAM,SAAS,oBAAoB,MAAM,IAAI,EAAE,IAAI,GAAG,CAAC;AACvD,gBAAM,YAAY,8CAA8C,MAAM;AACtE,gBAAM,QAAQ,GAAG,IAAI,SAAS,IAAI,EAAE,KAAK,GAAG,KAAK,UAAU,MAAM,CAAC;AAClE,iBACE,gBAAAA,MAAC,QAAa,WAAW,WACtB,qBACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAY;AAAA,cACZ,SAAS,MACP,OAAO,qBAAqB;AAAA,gBAC1B,OAAO,IAAI;AAAA,gBACX,UAAU;AAAA,gBACV;AAAA,cACF,CAAC;AAAA,cAGH,0BAAAA,MAAC,UAAK,WAAU,4BAA4B,oBAAU,MAAM,GAAE;AAAA;AAAA,UAChE,IAEA,gBAAAA,MAAC,UAAK,WAAU,gCAA+B,MAAK,OAAM,cAAY,OACpE,0BAAAA,MAAC,UAAK,WAAU,4BAA4B,oBAAU,MAAM,GAAE,GAChE,KAnBK,GAqBT;AAAA,QAEJ,CAAC;AAAA,WAjCM,IAAI,EAkCb,CACD,GACH;AAAA,OACF;AAAA,IACC,MAAM,eACL,gBAAAC,OAAC,SAAI,WAAU,2BACZ;AAAA,WAAK;AAAA,MAAO;AAAA,MAAS,QAAQ;AAAA,MAAO;AAAA,MAAY;AAAA,MAAY;AAAA,OAC/D,IACE;AAAA,IACH;AAAA,KACH;AAEJ;;;ACzPA,OAAkB;AA6JZ,SACE,OAAAI,OADF,QAAAC,cAAA;AAxJN,IAAMC,aAAW;AAKjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqIP,IAAM,WAAoC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC9E,eAAaD,YAAUC,OAAK;AAG5B,QAAM,YAAY,kBAAkB;AAAA,IAClC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,WAAW,MAAM;AACvB,QAAM,QAAQ,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAEpD,MAAI,UAAU,SAAS;AACrB,WACE,gBAAAF,OAAC,SAAI,WAAU,oBAAmB,cAAW,SAC3C;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,UAAU,cAAc;AAAA,MAC5D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,UAAU,WAAW;AACvB,WACE,gBAAAC,OAAC,SAAI,WAAU,oBAAmB,cAAW,WAC3C;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,GAAG;AAItB,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACrC,WACE,gBAAAC,OAAC,SAAI,WAAU,oBACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,2BAA0B,kCAAoB;AAAA,MAC5D;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,oBACb;AAAA,oBAAAD,MAAC,QAAG,WAAU,0BAAyB,MAAK,QACzC,gBAAM,IAAI,CAAC,MACV,gBAAAA,MAAC,QACC,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS,MAAM,OAAO,eAAe,EAAE,IAAI,EAAE,GAAG,CAAC;AAAA,QACjD,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,mBAAO,eAAe,EAAE,IAAI,EAAE,GAAG,CAAC;AAAA,UACpC;AAAA,QACF;AAAA,QAEA;AAAA,0BAAAA,OAAC,SAAI,WAAU,0BACb;AAAA,4BAAAD,MAAC,QAAG,WAAU,2BAA2B,YAAE,SAAS,EAAE,IAAG;AAAA,YACzD,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,wDAAwD,EAAE,QAAQ;AAAA,kBAE5E,YAAE;AAAA;AAAA,cACL;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,yDAAyD,EAAE,UAAU;AAAA,kBACjF;AAAA;AAAA,oBACK,EAAE;AAAA;AAAA;AAAA,cACR;AAAA,cACA,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,uDAAuD,EAAE,MAAM;AAAA,kBAEzE,YAAE;AAAA;AAAA,cACL;AAAA,eACF;AAAA,aACF;AAAA,UACC,EAAE,cAAc,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,YAAE,aAAY,IAAO;AAAA,UAC5E,EAAE,QACD,gBAAAC,OAAC,OAAE,WAAU,0BACX;AAAA,4BAAAD,MAAC,YAAO,oBAAM;AAAA,YAAS;AAAA,YAAE,EAAE;AAAA,aAC7B,IACE;AAAA,UACH,EAAE,aACD,gBAAAA,MAAC,OAAE,WAAU,gCAAgC,YAAE,YAAW,IACxD;AAAA;AAAA;AAAA,IACN,KA1CO,EAAE,EA2CX,CACD,GACH;AAAA,IACC;AAAA,KACH;AAEJ;;;AC7OA,OAAkB;AAyIZ,SACE,OAAAI,OADF,QAAAC,cAAA;AAtIN,IAAMC,aAAW;AAKjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqGd,IAAM,mBAAiC,CAAC,YAAY,YAAY,UAAU,SAAS;AACnF,IAAM,iBAA6B,CAAC,YAAY,QAAQ,UAAU,KAAK;AAkBhE,IAAM,iBAAgD,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC1F,eAAaD,YAAUC,OAAK;AAE5B,QAAM,WAAW,MAAM;AACvB,QAAM,QAAQ,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAEpD,MAAI,MAAM,WAAW,GAAG;AACtB,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACrC,WACE,gBAAAF,OAAC,SAAI,WAAU,oBACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,2BAA0B,kCAAoB;AAAA,MAC5D;AAAA,OACH;AAAA,EAEJ;AAIA,QAAM,UAAU,oBAAI,IAAkC;AACtD,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,GAAG,EAAE,QAAQ,KAAK,EAAE,UAAU;AAC1C,UAAM,OAAO,QAAQ,IAAI,GAAG,KAAK,CAAC;AAClC,SAAK,KAAK,CAAC;AACX,YAAQ,IAAI,KAAK,IAAI;AAAA,EACvB;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,oBACb;AAAA,oBAAAA,OAAC,WAAM,WAAU,4BAA2B,MAAK,QAAO,cAAW,eACjE;AAAA,sBAAAD,MAAC,WACC,0BAAAC,OAAC,QACC;AAAA,wBAAAD,MAAC,QAAG,WAAU,mCAAkC,OAAM,OAAM,mCAE5D;AAAA,QACC,iBAAiB,IAAI,CAAC,OACrB,gBAAAA,MAAC,QAAY,OAAM,OAChB,gBADM,EAET,CACD;AAAA,SACH,GACF;AAAA,MACA,gBAAAA,MAAC,WACE,yBAAe,IAAI,CAAC,QACnB,gBAAAC,OAAC,QACC;AAAA,wBAAAD,MAAC,QAAG,OAAM,OAAO,eAAI;AAAA,QACpB,iBAAiB,IAAI,CAAC,OAAO;AAC5B,gBAAM,YAAY,QAAQ,IAAI,GAAG,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC;AACnD,iBACE,gBAAAA,MAAC,QAAY,WAAU,2DACpB,oBAAU,WAAW,IACpB,gBAAAA,MAAC,UAAK,WAAU,0BAAyB,oBAAC,IAE1C,gBAAAA,MAAC,QACE,oBAAU,IAAI,CAAC,MACd,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,SAAS,MAAM,OAAO,eAAe,EAAE,IAAI,EAAE,GAAG,CAAC;AAAA,cACjD,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB,yBAAO,eAAe,EAAE,IAAI,EAAE,GAAG,CAAC;AAAA,gBACpC;AAAA,cACF;AAAA,cAEA;AAAA,gCAAAD,MAAC,UAAM,YAAE,SAAS,EAAE,IAAG;AAAA,gBACvB,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,uDAAuD,EAAE,MAAM;AAAA,oBAEzE,YAAE;AAAA;AAAA,gBACL;AAAA;AAAA;AAAA,YAhBK,EAAE;AAAA,UAiBT,CACD,GACH,KA1BK,EA4BT;AAAA,QAEJ,CAAC;AAAA,WAnCM,GAoCT,CACD,GACH;AAAA,OACF;AAAA,IACC;AAAA,KACH;AAEJ;;;AC/PA,OAAkB;AAqPZ,SACE,OAAAI,OADF,QAAAC,cAAA;AAhPN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwLd,IAAM,mBAA+C;AAAA,EACnD,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AACb;AAuBO,IAAM,gBAA8C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACxF,eAAaD,YAAUC,OAAK;AAG5B,QAAM,aAAa,kBAAkB;AAAA,IACnC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,YAAY,MAAM;AACxB,QAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC;AAEvD,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,WAAW,YAAY,YAAY,sBAAsB,OAAO,KAAK;AAAA,IACrE,gBAAgB,eAAe,kCAAkC;AAAA,EACnE,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,MAAI,WAAW,SAAS;AACtB,WACE,gBAAAF,OAAC,SAAI,WAAW,WAAW,cAAW,SACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,WAAW,cAAc;AAAA,MAC7D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,WAAW,WAAW;AACxB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,WACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,QAAI,CAAC,MAAM,QAAQ,SAAS,EAAG,QAAO;AACtC,WACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,sBAAAD,MAAC,OAAE,WAAU,4BAA2B,wCAA0B;AAAA,MACjE;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,oBAAAD,MAAC,QAAG,WAAU,2BAA0B,MAAK,QAC1C,iBAAO,IAAI,CAAC,OAAO,MAAM;AACxB,YAAM,WAAW,MAAM,OAAO,mBAAmB,EAAE,OAAO,GAAG,MAAM,CAAC;AACpE,aACA,gBAAAA,MAAC,QACC,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,UAAU;AAAA,UACV,cAAY,YAAY,IAAI,CAAC,KAAK,MAAM,SAAS,EAAE;AAAA,UACnD,SAAS;AAAA,UACT,WAAW,CAAC,MAAM;AAChB,gBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,gBAAE,eAAe;AACjB,uBAAS;AAAA,YACX;AAAA,UACF;AAAA,UAEC;AAAA,4BAAgB,aAAa,gBAAAD,MAAC,UAAK,WAAU,0BAAyB,eAAW,MAAC,IAAK;AAAA,YACxF,gBAAAA,MAAC,OAAE,WAAU,4BAA4B,gBAAM,SAAS,UAAI;AAAA,YAC5D,gBAAAA,MAAC,OAAE,WAAU,kCAAkC,gBAAM,UAAU,UAAI;AAAA,YAClE,MAAM,UAAU,gBAAAA,MAAC,OAAE,WAAU,8BAA8B,gBAAM,SAAQ,IAAO;AAAA,YACjF,gBAAAC,OAAC,SAAI,WAAU,6BACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,wDAAwD,MAAM,WAAW,QAAQ,IAAI;AAAA,kBAChG,OAAO,MAAM,WAAW,aAAa;AAAA,kBACrC,cAAY,MAAM,WAAW,aAAa;AAAA,kBAC1C,MAAK;AAAA,kBAEJ,gBAAM,WAAW,WAAM;AAAA;AAAA,cAC1B;AAAA,cACA,gBAAAC,OAAC,UAAK,WAAU,2BAA0B,OAAO,MAAM,YACrD;AAAA,gCAAAA,OAAC,UAAK,eAAW,MAAE;AAAA,mCAAiB,MAAM,UAAU,KAAK;AAAA,kBAAI;AAAA,mBAAC;AAAA,gBAC7D,MAAM;AAAA,iBACT;AAAA,cACC,MAAM,OACL,gBAAAD,MAAC,OAAE,WAAU,2BAA0B,MAAM,MAAM,MAAM,QAAO,UAAS,KAAI,uBAAsB,kBAEnG,IACE;AAAA,eACN;AAAA;AAAA;AAAA,MACF,KArCO,CAsCT;AAAA,IAEF,CAAC,GACH;AAAA,IACC;AAAA,KACH;AAEJ;;;ACjUA,OAAkB;AAmLZ,SACE,OAAAI,OADF,QAAAC,cAAA;AA9KN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqJP,IAAM,qBAAwD,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAClG,eAAaD,YAAUC,OAAK;AAG5B,QAAM,WAAW,kBAAkB;AAAA,IACjC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,iBAAiB,MAAM;AAC7B,QAAM,cAAc,MAAM,QAAQ,cAAc,IAAI,iBAAiB,CAAC;AAEtE,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,WAAW,YAAY,YAAY,2BAA2B,OAAO,KAAK;AAAA,EAC5E,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,MAAI,SAAS,SAAS;AACpB,WACE,gBAAAF,OAAC,SAAI,WAAW,WAAW,cAAW,SACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,SAAS,cAAc;AAAA,MAC3D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,SAAS,WAAW;AACtB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,WACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,YAAY,WAAW,GAAG;AAC5B,QAAI,CAAC,MAAM,QAAQ,cAAc,EAAG,QAAO;AAC3C,WACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,sBAAAD,MAAC,SAAI,WAAU,iCAAgC,sCAAwB;AAAA,MACtE;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,oBAAAD,MAAC,QAAG,WAAU,gCAA+B,MAAK,QAC/C,sBAAY,IAAI,CAAC,MAChB,gBAAAA,MAAC,QACC,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM,OAAO,qBAAqB,EAAE,IAAI,EAAE,GAAG,CAAC;AAAA,QACvD,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,mBAAO,qBAAqB,EAAE,IAAI,EAAE,GAAG,CAAC;AAAA,UAC1C;AAAA,QACF;AAAA,QACA,MAAK;AAAA,QACL,UAAU;AAAA,QAEV;AAAA,0BAAAA,OAAC,SAAI,WAAU,+BACb;AAAA,4BAAAD,MAAC,UAAK,WAAU,8BAA8B,YAAE,IAAG;AAAA,YACnD,gBAAAA,MAAC,UAAK,WAAW,kEAAkE,EAAE,MAAM,IACxF,YAAE,QACL;AAAA,aACF;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,gCAAgC,YAAE,QAAQ,UAAI;AAAA,UAC1D,EAAE,QACD,gBAAAC,OAAC,OAAE,WAAU,kCACX;AAAA,4BAAAD,MAAC,YAAO,oBAAM;AAAA,YAAS;AAAA,YAAE,EAAE;AAAA,aAC7B,IACE;AAAA,UACJ,gBAAAC,OAAC,OAAE,WAAU,kCACX;AAAA,4BAAAD,MAAC,YAAO,oBAAM;AAAA,YAAS;AAAA,YAAE,EAAE,SAAS;AAAA,aACtC;AAAA,UACC,EAAE,mBACD,gBAAAC,OAAC,OAAE,WAAU,kCACX;AAAA,4BAAAD,MAAC,YAAO,yBAAW;AAAA,YAAS;AAAA,YAAE,EAAE;AAAA,aAClC,IACE;AAAA,UACH,cAAc,EAAE,SACf,gBAAAC,OAAC,UAAK,WAAW,kEAAkE,EAAE,MAAM,IAAI;AAAA;AAAA,YACpF,EAAE;AAAA,aACb,IACE;AAAA;AAAA;AAAA,IACN,KAtCO,EAAE,EAuCX,CACD,GACH;AAAA,IACC;AAAA,KACH;AAEJ;;;AC7PA,SAAgB,aAAAG,YAAW,SAAAC,QAAO,WAAAC,WAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAgd7D,SACE,OAAAC,OADF,QAAAC,cAAA;AAzcN,IAAM,UAAU;AAChB,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,aAAa;AACnB,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,aAAa;AAInB,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAoCA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsKrB,SAAS,MAAM,GAAW,IAAY,IAAY;AAChD,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;AACrC;AAEA,SAAS,SAAS,GAA0B;AAC1C,QAAM,IAAI,KAAK,MAAM,CAAC;AACtB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAEA,SAAS,uBACP,OACa;AACb,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtD,QAAM,IAAI,MAAM;AAChB,MAAI,MAAM,EAAG,QAAO,oBAAI,IAAI;AAC5B,QAAM,QAAQ,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AACjC,QAAM,QAAoB,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC;AAC5D,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAW,KAAK,MAAM,CAAC,EAAE,OAAO;AAC9B,YAAM,IAAI,QAAQ,IAAI,CAAC;AACvB,UAAI,MAAM,OAAW;AACrB,YAAM,CAAC,EAAE,KAAK,CAAC;AACf,YAAM,CAAC;AAAA,IACT;AAAA,EACF;AACA,QAAM,IAAc,CAAC;AACrB,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,MAAM,CAAC,MAAM,EAAG,GAAE,KAAK,CAAC;AACxD,QAAM,QAAkB,CAAC;AACzB,SAAO,EAAE,QAAQ;AACf,UAAM,IAAI,EAAE,MAAM;AAClB,UAAM,KAAK,CAAC;AACZ,eAAW,KAAK,MAAM,CAAC,GAAG;AAAE,YAAM,CAAC;AAAK,UAAI,MAAM,CAAC,MAAM,EAAG,GAAE,KAAK,CAAC;AAAA,IAAE;AAAA,EACxE;AACA,MAAI,MAAM,WAAW,EAAG,QAAO,oBAAI,IAAI;AACvC,QAAM,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AAC/B,aAAW,KAAK,OAAO;AACrB,QAAI,OAAO;AACX,eAAW,KAAK,MAAM,CAAC,EAAE,OAAO;AAAE,YAAM,IAAI,QAAQ,IAAI,CAAC;AAAG,UAAI,MAAM,OAAW,QAAO,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC;AAAA,IAAE;AAC/G,QAAI,CAAC,IAAI,OAAO,MAAM,CAAC,EAAE;AAAA,EAC3B;AACA,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC;AAC5B,QAAM,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AAC/B,WAAS,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;AAC/B,UAAM,IAAI,MAAM,CAAC;AAAG,QAAI,OAAO;AAC/B,eAAW,KAAK,MAAM,CAAC,EAAG,QAAO,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC;AACtD,QAAI,CAAC,IAAI,MAAM,CAAC,EAAE,MAAM;AAAA,EAC1B;AACA,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,MAAM,KAAK,IAAI,GAAG,IAAI,IAAI;AAChC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAK,UAAS,IAAI,MAAM,CAAC,EAAE,EAAE;AAAA,EAClF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAe,OAAkD;AAC1F,QAAM,OAAO,QAAQ;AACrB,MAAI,QAAQ,EAAG,QAAO,CAAC;AACvB,QAAM,UAAU,OAAO;AACvB,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,IAAI;AACjB,aAAS;AACT,UAAM,OAAK,GAAG,EAAE,YAAY,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;AAAA,EACrD,WAAW,WAAW,IAAI;AACxB,aAAS,IAAI;AACb,UAAM,OAAK,GAAG,EAAE,YAAY,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;AAAA,EACrD,WAAW,WAAW,KAAK;AACzB,aAAS,KAAK;AACd,UAAM,IAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAC7F,UAAM,OAAK,EAAE,EAAE,YAAY,CAAC;AAAA,EAC9B,OAAO;AACL,aAAS,KAAK;AACd,UAAM,IAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAC7F,UAAM,OAAK,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC,KAAK,OAAO,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;AAAA,EAC1E;AACA,QAAM,QAAQ,KAAK,KAAK,QAAQ,MAAM,IAAI;AAC1C,QAAM,QAA2C,CAAC;AAClD,WAAS,IAAI,OAAO,KAAK,OAAO,KAAK,OAAQ,OAAM,KAAK,EAAE,OAAO,IAAI,SAAS,MAAM,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;AAC7G,MAAI,MAAM,SAAS,IAAI;AAAE,UAAM,IAAI,KAAK,KAAK,MAAM,SAAS,EAAE;AAAG,WAAO,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AAAA,EAAE;AAC5G,SAAO;AACT;AAOA,SAAS,UAAU,GAAiB;AAClC,QAAM,EAAE,IAAI,IAAI,IAAI,IAAI,SAAS,SAAS,IAAI;AAC9C,QAAM,MAAM,WAAW,KAAK,WAAW,WAAW,KAAK,KAAK,SAAS;AAErE,MAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,UAAMC,SAAQ,KAAK,KAAK,IAAI,WAAW,KAAK,MAAM,GAAG,IAAI;AACzD,WAAO,IAAI,EAAE,IAAI,EAAE,KAAKA,MAAK,KAAK,EAAE,KAAK,EAAE;AAAA,EAC7C;AAEA,QAAM,QAAQ,KAAK,WAAW,KAAK,IAAI,GAAG,GAAG;AAC7C,QAAM,OAAO,KAAK,KACd,KAAK,QAAQ,KAAK,QAAQ,SAAS,IACnC,KAAK,QAAQ,KAAK,QAAQ,SAAS;AACvC,SAAO,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,KAAK,EAAE,KAAK,EAAE;AACxE;AAIO,IAAM,aAAwC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAClF,eAAaF,YAAUC,OAAK;AAG5B,QAAM,UAAU,kBAAkB;AAAA,IAChC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,MAAME,OAAM,EAAE,QAAQ,MAAM,EAAE;AACpC,QAAM,QAAQC,QAAuB,IAAI;AACzC,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,UAAU;AAE/C,EAAAC,WAAU,MAAM;AACd,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,GAAI;AACT,UAAM,IAAI,GAAG;AACb,QAAI,IAAI,EAAG,WAAU,CAAC;AACtB,UAAM,KAAK,IAAI,eAAe,aAAW;AACvC,YAAM,OAAO,QAAQ,CAAC,GAAG;AACzB,UAAI,QAAQ,KAAK,QAAQ,EAAG,WAAU,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,IAC9D,CAAC;AACD,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC7D,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,aAAa,MAAM,QAAQ,MAAM,UAAU,IAAI,MAAM,aAAa,CAAC;AACzE,QAAM,mBAAmB,MAAM,qBAAqB;AACpD,QAAM,YAAY,MAAM,cAAc;AAEtC,QAAM,OAAOC,UAAQ,MAAM;AACzB,UAAM,SAAS,SACZ,IAAI,OAAK;AACR,YAAM,IAAI,SAAS,EAAE,KAAK;AAC1B,YAAM,IAAI,SAAS,EAAE,GAAG;AACxB,aAAO,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,IAAI,KAAK,QAAQ,KAAK,QAAQ,KAAK,EAAE;AAAA,IACzE,CAAC,EACA,OAAO,OAAK,EAAE,EAAE;AAEnB,QAAI,OAAO,UAAU,OAAO;AAC5B,eAAW,KAAK,QAAQ;AAAE,aAAO,KAAK,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;AAAG,aAAO,KAAK,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,IAAE;AAC3F,eAAW,KAAK,YAAY;AAAE,YAAM,IAAI,SAAS,EAAE,IAAI;AAAG,UAAI,KAAK,MAAM;AAAE,eAAO,KAAK,IAAI,MAAM,CAAC;AAAG,eAAO,KAAK,IAAI,MAAM,CAAC;AAAA,MAAE;AAAA,IAAE;AAChI,QAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,GAAG;AAAE,aAAO,KAAK,IAAI;AAAG,aAAO,OAAO;AAAA,IAAO;AAChG,QAAI,QAAQ,KAAM,QAAO,OAAO;AAChC,UAAM,UAAU,OAAO;AACvB,YAAQ,UAAU;AAClB,YAAQ,UAAU;AAClB,UAAM,OAAO,OAAO;AAEpB,UAAM,UAAU,OAAO;AACvB,UAAM,WAAW,MAAM,MAAM,KAAK,IAAI,GAAG,OAAO,GAAG,IAAI,EAAE;AACzD,UAAM,SAAS,KAAK,KAAK,UAAU,QAAQ,IAAI,QAAQ;AACvD,UAAMC,aAAY,KAAK,IAAI,QAAQ,MAAM;AAEzC,UAAM,SAAS;AACf,UAAMC,UAASD,aAAY,QAAQ;AACnC,UAAM,IAAI,OAAO;AACjB,UAAME,WAAU,SAAS;AACzB,UAAMC,UAASD,WAAU,IAAI;AAE7B,UAAM,MAAM,CAAC,OAAe,UAAW,KAAK,QAAQ,OAAQD;AAE5D,UAAM,UAAU,oBAAI,IAAoB;AACxC,WAAO,QAAQ,CAAC,GAAG,MAAM,QAAQ,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAE/C,UAAM,UAAU,OAAO,IAAI,QAAM;AAAA,MAC/B,IAAI,EAAE,EAAE;AAAA,MACR,KAAK,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,MAC1B,QAAQ,EAAE,EAAE,gBAAgB,CAAC,GAAG,OAAO,OAAK,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC5D,EAAE;AACF,UAAM,UAAU,mBAAmB,uBAAuB,OAAO,IAAI,oBAAI,IAAY;AAErF,UAAMG,QAAO,OAAO,IAAI,CAAC,GAAG,MAAM;AAChC,YAAM,KAAK,IAAI,EAAE,CAAC;AAClB,YAAM,KAAK,IAAI,EAAE,CAAC;AAClB,YAAM,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE;AAC7B,YAAM,IAAIF,WAAU,IAAI,SAAS,QAAQ,SAAS;AAClD,YAAM,KAAK,IAAI,QAAQ;AACvB,YAAM,OAAO,EAAE,EAAE,YAAY,QAAQ,OAAO,SAAS,EAAE,EAAE,QAAQ,IAAI,MAAM,EAAE,EAAE,UAAU,GAAG,GAAG,IAAI;AACnG,aAAO,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,MAAM,YAAY,oBAAoB,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE;AAAA,IAC9F,CAAC;AAGD,UAAM,YAAY,oBAAI,IAAoB;AAC1C,eAAW,KAAKE,MAAM,YAAW,KAAK,EAAE,EAAE,gBAAgB,CAAC,EAAG,KAAI,QAAQ,IAAI,CAAC,EAAG,WAAU,IAAI,IAAI,UAAU,IAAI,CAAC,KAAK,KAAK,CAAC;AAE9H,UAAM,SAAS,oBAAI,IAAoB;AACvC,UAAMC,SAAgB,CAAC;AACvB,eAAW,KAAKD,OAAM;AACpB,iBAAW,SAAS,EAAE,EAAE,gBAAgB,CAAC,GAAG;AAC1C,cAAM,IAAI,QAAQ,IAAI,KAAK;AAC3B,YAAI,KAAK,KAAM;AACf,cAAM,OAAOA,MAAK,CAAC;AACnB,cAAM,OAAO,OAAO,IAAI,KAAK,KAAK;AAClC,eAAO,IAAI,OAAO,OAAO,CAAC;AAC1B,QAAAC,OAAM,KAAK;AAAA,UACT,IAAI,KAAK,KAAK,KAAK;AAAA,UAAG,IAAI,KAAK;AAAA,UAC/B,IAAI,EAAE;AAAA,UAAI,IAAI,EAAE;AAAA,UAChB,SAAS;AAAA,UAAM,UAAU,UAAU,IAAI,KAAK,KAAK;AAAA,QACnD,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,QAAmE,CAAC;AAC1E,eAAW,KAAK,YAAY;AAC1B,YAAM,IAAI,SAAS,EAAE,IAAI;AACzB,UAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAM;AACvC,YAAM,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,CAAC;AAAA,IAClE;AACA,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAC9B,QAAI,UAAU,WAAW,YAAY;AACrC,UAAMC,SAAQ,MAAM,IAAI,OAAK;AAC3B,UAAI,QAAQ;AACZ,UAAI,EAAE,IAAI,UAAU,GAAI,SAAQ,CAAC;AACjC,gBAAU,EAAE;AAAG,kBAAY;AAC3B,aAAO,EAAE,GAAG,GAAG,MAAM;AAAA,IACvB,CAAC;AAED,UAAM,MAAM,KAAK,IAAI;AACrB,UAAMC,UAAS,aAAa,OAAO,QAAQ,OAAO,OAAO,IAAI,GAAG,IAAI;AACpE,UAAMC,SAAQ,kBAAkB,MAAM,IAAI,EAAE,IAAI,SAAO,EAAE,GAAG,SAAS,GAAG,OAAOP,SAAQ,OAAO,GAAG,MAAM,EAAE;AAEzG,WAAO,EAAE,WAAAD,YAAW,QAAAG,SAAQ,QAAQ,QAAAF,SAAQ,SAAAC,UAAS,MAAAE,OAAM,OAAAC,QAAO,OAAAC,QAAO,QAAAC,SAAQ,OAAAC,OAAM;AAAA,EACzF,GAAG,CAAC,UAAU,YAAY,kBAAkB,WAAW,MAAM,CAAC;AAI9D,MAAI,QAAQ,SAAS;AACnB,WACE,gBAAAjB,OAAC,SAAI,WAAU,YAAW,cAAW,SACnC;AAAA,sBAAAD,MAAC,QAAG,WAAU,mBAAmB,iBAAM;AAAA,MACvC,gBAAAA,MAAC,aAAU,MAAK,SAAQ,aAAa,QAAQ,cAAc;AAAA,MAC1D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,QAAQ,WAAW;AACrB,WACE,gBAAAC,OAAC,SAAI,WAAU,YAAW,cAAW,WACnC;AAAA,sBAAAD,MAAC,QAAG,WAAU,mBAAmB,iBAAM;AAAA,MACvC,gBAAAA,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAIA,MAAI,SAAS,WAAW,GAAG;AACzB,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,EAAG,QAAO;AACxC,WACE,gBAAAC,OAAC,SAAI,WAAU,YACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,mBAAmB,iBAAM;AAAA,MACvC,gBAAAA,MAAC,SAAI,WAAU,mBAAkB,kCAAoB;AAAA,MACpD;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,WACE,gBAAAC,OAAC,SAAI,WAAU,YACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,mBAAmB,iBAAM;AAAA,MACvC,gBAAAA,MAAC,SAAI,WAAU,mBAAkB,sEAAwD;AAAA,MACxF;AAAA,OACH;AAAA,EAEJ;AAIA,QAAM,EAAE,WAAW,QAAQ,QAAQ,SAAS,MAAM,OAAO,OAAO,QAAQ,MAAM,IAAI;AAClF,QAAM,cAAc;AACpB,QAAM,UAAU,SAAS;AAEzB,SACE,gBAAAC,OAAC,SAAI,WAAU,YACb;AAAA,oBAAAD,MAAC,QAAG,WAAU,mBAAmB,iBAAM;AAAA,IAEvC,gBAAAC,OAAC,SAAI,WAAU,kBAEb;AAAA,sBAAAA,OAAC,SAAI,WAAU,oBACb;AAAA,wBAAAD,MAAC,SAAI,OAAO,EAAE,QAAQ,QAAQ,GAAG;AAAA,QAChC,KAAK,IAAI,CAAC,GAAG,MACZ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,sBAAsB,IAAI,MAAM,IAAI,8BAA8B,EAAE;AAAA,YAC/E,OAAO,EAAE,QAAQ,MAAM;AAAA,YAEvB,0BAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,uBAAsB,OAAO,EAAE,EAAE,MAAO,YAAE,EAAE,MAAK;AAAA,cAChE,EAAE,EAAE,SAAS,gBAAAA,MAAC,UAAK,WAAU,6BAA6B,YAAE,EAAE,OAAM;AAAA,eACvE;AAAA;AAAA,UAPK,EAAE,EAAE;AAAA,QAQX,CACD;AAAA,SACH;AAAA,MAGA,gBAAAA,MAAC,SAAI,WAAU,sBAAqB,KAAK,OACvC,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,OAAO,SAAS,IAAI,MAAM;AAAA,UACnC,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO,EAAE,UAAU,OAAO;AAAA,UAC1B,MAAK;AAAA,UACL,cAAY,gBAAgB,KAAK,MAAM;AAAA,UAEvC;AAAA,4BAAAA,OAAC,UACE;AAAA,mBAAK,IAAI,OACR,gBAAAD,MAAC,cAA0B,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC,IAChD,0BAAAA,MAAC,UAAK,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,OAAO,IAAI,YAAY,IAAI,YAAY,KADrE,KAAK,EAAE,CAAC,EAEvB,CACD;AAAA,cAKD,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI,SAAS,GAAG;AAAA,kBAChB,cAAa;AAAA,kBACb,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,kBAAiB;AAAA,kBAEjB,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,IAAI;AAAA;AAAA,kBACN;AAAA;AAAA,cACF;AAAA,eACF;AAAA,YAGC,MAAM,IAAI,CAAC,IAAI,MACd,gBAAAA,MAAC,UAAoB,WAAU,uBAAsB,IAAI,GAAG,GAAG,IAAI,QAAQ,IAAI,GAAG,GAAG,IAAI,UAA9E,KAAK,CAAC,EAAgF,CAClG;AAAA,YAGA,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,MAAM,IAC5B,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAAqB,GAAG;AAAA,gBAAG,GAAG,UAAU,IAAI;AAAA,gBAAO,OAAO;AAAA,gBAAW,QAAQ;AAAA,gBAC5E,MAAK;AAAA;AAAA,cADI,MAAM,CAAC;AAAA,YACkD,IAClE,IAAI;AAAA,YAGP,MAAM,IAAI,CAAC,IAAI,MACd,gBAAAA,MAAC,UAAqB,WAAU,wBAAuB,GAAG,GAAG,GAAG,GAAG,SAAS,GAAG,YAAW,UACvF,aAAG,SADK,MAAM,CAAC,EAElB,CACD;AAAA,YAGD,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBAAO,IAAI;AAAA,gBAAQ,IAAI,QAAQ;AAAA,gBAAQ,IAAI;AAAA,gBAC/C,QAAO;AAAA,gBAAqE,aAAY;AAAA;AAAA,YAC1F;AAAA,YAGC,UAAU,QACT,gBAAAA,MAAC,UAAK,WAAU,mBAAkB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AAAA,YAInF,MAAM,IAAI,OAAK;AACd,oBAAM,IAAI;AACV,oBAAM,KAAK,SAAS,UAAU;AAC9B,oBAAM,OAAO,EAAE,OAAO,KAAK,KAAK;AAChC,oBAAM,QAAQ,EAAE,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI;AAC/C,qBACE,gBAAAC,OAAC,OAAa,WAAU,iDAAgD,SAAS,MAAM,OAAO,mBAAmB,EAAE,IAAI,EAAE,GAAG,CAAC,GAC3H;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,QAAQ,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAAA,oBAC3E;AAAA,oBACA,QAAO;AAAA,oBACP,aAAa;AAAA;AAAA,gBACf;AAAA,gBACA,gBAAAA,MAAC,UAAK,WAAU,sBAAqB,GAAG,EAAE,GAAG,GAAG,OAAO,YAAW,UAC/D,YAAE,KAAK,SAAS,IAAI,GAAG,EAAE,KAAK,MAAM,GAAG,CAAC,CAAC,WAAM,EAAE,MACpD;AAAA,mBATM,EAAE,EAUV;AAAA,YAEJ,CAAC;AAAA,YAGA,MAAM,IAAI,CAAC,GAAG,MACb,gBAAAC,OAAC,OACC;AAAA,8BAAAD,MAAC,UAAK,WAAU,uBAAsB,GAAG,UAAU,CAAC,GAAG;AAAA,cACvD,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,WAAW,GAAG,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,WAAW,GAAG,IAAI,EAAE,KAAK,QAAQ;AAAA;AAAA,cACjH;AAAA,iBALM,OAAO,CAAC,EAMhB,CACD;AAAA,YAGA,KAAK,IAAI,OAAK;AACb,oBAAM,OAAO,EAAE,EAAE,OAAO,KAAK,KAAK;AAClC,oBAAM,UAAU,MAAM,OAAO,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC;AACzD,qBACE,gBAAAC,OAAC,OAEC;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,GAAG,EAAE;AAAA,oBAAI,GAAG,EAAE;AAAA,oBAAG,OAAO,EAAE;AAAA,oBAAG,QAAQ;AAAA,oBACrC,IAAI;AAAA,oBAAY,IAAI;AAAA,oBACpB;AAAA,oBAAY,aAAa,EAAE,aAAa,OAAO;AAAA,oBAC/C;AAAA;AAAA,gBACF;AAAA,gBAEC,EAAE,QAAQ,QAAQ,EAAE,OAAO,KAC1B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,GAAG,EAAE;AAAA,oBAAI,GAAG,EAAE;AAAA,oBACd,OAAO,EAAE,IAAI,EAAE,OAAO;AAAA,oBAAK,QAAQ;AAAA,oBACnC;AAAA,oBACA,UAAU,cAAc,GAAG,IAAI,EAAE,CAAC;AAAA,oBAClC;AAAA,oBAEA,0BAAAA,MAAC,WAAO,aAAG,EAAE,EAAE,IAAI,KAAK,EAAE,IAAI,KAAI;AAAA;AAAA,gBACpC;AAAA,gBAGD,EAAE,cACD,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAG,EAAE;AAAA,oBAAI,GAAG,EAAE,IAAI;AAAA,oBAAG,OAAO;AAAA,oBAAK,QAAQ,QAAQ;AAAA,oBACjD,IAAI;AAAA,oBAAG,IAAI;AAAA,oBACX,MAAK;AAAA,oBAA4B,aAAa;AAAA,oBAC9C,OAAO,EAAE,eAAe,OAAO;AAAA;AAAA,gBACjC;AAAA,gBAKD,EAAE,cACD,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAG,EAAE;AAAA,oBAAI,GAAG,EAAE;AAAA,oBAAG,OAAO,EAAE;AAAA,oBAAG,QAAQ;AAAA,oBACrC,IAAI;AAAA,oBAAY,IAAI;AAAA,oBACpB,MAAM,cAAc,GAAG;AAAA,oBACvB,UAAU,cAAc,GAAG,IAAI,EAAE,CAAC;AAAA,oBAClC,OAAO,EAAE,eAAe,OAAO;AAAA,oBAC/B,uBAAoB;AAAA,oBACpB,eAAY;AAAA;AAAA,gBACd;AAAA,mBA3CI,EAAE,EAAE,EA6CZ;AAAA,YAEJ,CAAC;AAAA;AAAA;AAAA,MACH,GACF;AAAA,OACF;AAAA,IAEC;AAAA,KACH;AAEJ;;;AClrBA,SAAgB,WAAAmB,iBAAe;AA8NvB,SACK,OAAAC,OADL,QAAAC,cAAA;AA3NR,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgMP,IAAM,gBAA8C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACxF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,OAAoB,MAAM,SAAS,WAAW,WAAW;AAC/D,QAAM,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,IAAI,KAAK,IAAI;AAC/D,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,YAAY,MAAM;AACxB,QAAM,eAAe,MAAM,iBAAiB;AAC5C,QAAM,eAAe,MAAM,iBAAiB;AAC5C,QAAM,WAAW,MAAM,aAAa;AACpC,QAAM,SAAS,MAAM,QAAQ,KAAK,KAAK;AAEvC,QAAM,aAAkC;AAAA,IACtC,WAAW;AAAA,IACX,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,EAC1D;AAEA,QAAM,gBAAgBC,UAAQ,MAAM;AAClC,UAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,IAAI,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC;AAClE,WAAO,KAAK,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,OAAO,EAAE,SAAS,CAAC,CAAC;AAAA,EACnF,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,QAAM,cAAc,MAAM;AACxB,QAAI,CAAC,KAAK;AACR,aACE,gBAAAH,OAAC,SAAI,WAAU,kCAAiC;AAAA;AAAA,QAC3C,gBAAAD,MAAC,UAAK,iBAAG;AAAA,QAAO;AAAA,QAA2B;AAAA,QAAK;AAAA,SACrD;AAAA,IAEJ;AAEA,QAAI,SAAS,QAAQ;AACnB,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,QAAQ,MAAM,OAAO,gBAAgB,EAAE,MAAM,MAAM,WAAW,IAAI,CAAC;AAAA;AAAA,MACrE;AAAA,IAEJ;AAEA,QAAI,cAAc,eAAe;AAC/B,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV;AAAA,UACA,KAAK;AAAA,UACL,SAAQ;AAAA,UACR,QAAQ,MAAM,OAAO,gBAAgB,EAAE,MAAM,MAAM,WAAW,IAAI,CAAC;AAAA;AAAA,MACrE;AAAA,IAEJ;AAEA,QAAI,cAAc,OAAO;AACvB,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,QAAQ,MAAM,OAAO,gBAAgB,EAAE,MAAM,MAAM,WAAW,IAAI,CAAC;AAAA;AAAA,MACrE;AAAA,IAEJ;AAEA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV,aAAW;AAAA,QACX,SAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,cAAY;AAAA,QACZ,cAAc,MAAM,OAAO,gBAAgB,EAAE,MAAM,MAAM,aAAa,SAAS,IAAI,CAAC;AAAA;AAAA,IACtF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,qBACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,8BACb;AAAA,sBAAAD,MAAC,UAAK,WAAU,2BAA2B,gBAAK;AAAA,MAC/C,YAAY,gBAAAA,MAAC,UAAK,WAAU,2BAA2B,qBAAU,IAAU;AAAA,MAC5E,gBAAAA,MAAC,QAAG,WAAU,4BAA4B,iBAAM;AAAA,OAClD;AAAA,IACA,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,iCACb,0BAAAA,MAAC,SAAI,WAAU,4BAA2B,OAAO,YAC9C,sBAAY,GACf,GACF;AAAA,MACC,eACC,gBAAAC,OAAC,WAAM,WAAU,+BAA8B,cAAW,mBACxD;AAAA,wBAAAD,MAAC,QAAG,WAAU,qCAAoC,qBAAO;AAAA,QACxD,cAAc,WAAW,IACxB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,SAAS,QAAQ,UAAU,YAAY;AAAA,YACjD;AAAA;AAAA,QAED,IAEA,gBAAAA,MAAC,QAAG,WAAU,oCACX,wBAAc,IAAI,CAAC,GAAG,MACrB,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,SAAS,MAAM,OAAO,kBAAkB,EAAE,OAAO,GAAG,GAAG,EAAE,CAAC;AAAA,YAE1D;AAAA,8BAAAD,MAAC,SAAI,WAAU,kCAAkC,YAAE,WAAU;AAAA,cAC7D,gBAAAA,MAAC,SAAK,YAAE,aAAY;AAAA,cACnB,EAAE,cAAc,EAAE,UACjB,gBAAAC,OAAC,SAAI,WAAU,oCACZ;AAAA,iBAAC,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA,gBACpD,EAAE,eAAe,SACjB,EAAE,YAAY,KAAK,QAAQ,EAAE,YAAY,KAAK,QAC3C,OAAO,EAAE,YAAY,KAAK,QAAG,KAAK,EAAE,YAAY,KAAK,QAAG,MACxD;AAAA,iBACN,IACE,EAAE,eAAe,SAClB,EAAE,YAAY,KAAK,QAAQ,EAAE,YAAY,KAAK,QAC/C,gBAAAA,OAAC,SAAI,WAAU,oCAAmC;AAAA;AAAA,gBAC5C,EAAE,YAAY,KAAK;AAAA,gBAAI;AAAA,gBAAG,EAAE,YAAY,KAAK;AAAA,gBAAI;AAAA,iBACvD,IACE;AAAA;AAAA;AAAA,UAnBC,GAAG,EAAE,SAAS,IAAI,CAAC;AAAA,QAoB1B,CACD,GACH;AAAA,SAEJ,IACE;AAAA,OACN;AAAA,IACC;AAAA,KACH;AAEJ;;;ACpVA,SAAgB,WAAAI,iBAAe;AA2OzB,SACE,OAAAC,OADF,QAAAC,cAAA;AAtON,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8Gd,SAASC,OAAM,GAAW,IAAY,IAAoB;AACxD,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;AACrC;AAEA,SAAS,eACP,GACA,OACA,QACiC;AACjC,MAAI,KAAK,QAAQ,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,SAAS,OAAQ,QAAO;AACjE,QAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,MAAI,EAAE,OAAO,GAAI,QAAO;AACxB,QAAM,IAAIA,QAAO,IAAI,MAAM,OAAO,MAAM,GAAG,CAAC;AAC5C,QAAM,SAAS,KAAK,MAAM,IAAI,IAAI,EAAE;AACpC,SAAO;AAAA,IACL,YAAY,iDAAiD,MAAM;AAAA,EACrE;AACF;AAEO,IAAM,mBAAoD,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC9F,eAAaF,YAAUC,OAAK;AAE5B,QAAM,cAAc,kBAAkB;AAAA,IACpC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;AAChE,QAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC;AACnE,QAAM,YAAY,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC;AAChE,QAAM,gBAAgB,MAAM,kBAAkB;AAC9C,QAAM,eAAe,MAAM,iBAAiB;AAC5C,QAAM,aAAa,MAAM;AACzB,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,YACJ,YAAY,YAAY,uDAAuD;AAEjF,QAAM,OAAO,QAAQ;AACrB,QAAM,QAAQ,SAAS;AAEvB,QAAM,SAASE,UAAQ,MAAM;AAC3B,UAAM,OAA4B,CAAC;AACnC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,MAAM,UAAU,CAAC;AACvB,YAAM,MAAyB,CAAC;AAChC,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAM,IAAI,MAAM,CAAC;AACjB,YAAI,KAAK,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,IAAI,IAAI,IAAI;AAAA,MACjE;AACA,WAAK,KAAK,GAAG;AAAA,IACf;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,OAAO,IAAI,CAAC;AAE3B,QAAM,YAAYA,UAAQ,MAAM;AAC9B,UAAM,MAAM,oBAAI,IAAY;AAC5B,QAAI,CAAC,iBAAiB,UAAU,KAAK,SAAS,EAAG,QAAO;AACxD,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,MAAM,OAAO,CAAC;AACpB,YAAM,OAAO,IAAI,IAAI,CAAC,GAAG,MAAO,KAAK,OAAO,EAAE,GAAG,EAAE,IAAI,IAAK,EAAE,OAAO,OAAO;AAC5E,UAAI,KAAK,WAAW,EAAG;AACvB,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,iBAAW,EAAE,GAAG,EAAE,KAAK,MAAM;AAC3B,YAAI,MAAM,KAAM,KAAI,IAAI,IAAI,OAAO,CAAC;AAAA,MACtC;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,OAAO,MAAM,MAAM,CAAC;AAEvC,QAAM,cAAcA,UAAQ,MAAM;AAChC,QAAI,CAAC,gBAAgB,SAAS,KAAK,UAAU,EAAG,QAAO;AACvD,UAAM,UAAU,SAAS;AAAA,MAAI,CAAC,MAC5B,OAAO,EAAE,WAAW,YAAY,OAAO,SAAS,EAAE,MAAM,KAAK,EAAE,UAAU,IAAI,EAAE,SAAS;AAAA,IAC1F;AACA,UAAM,OAAO,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC9C,QAAI,EAAE,OAAO,GAAI,QAAO;AACxB,UAAM,MAAyB,CAAC;AAChC,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAI,MAAM;AACV,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAM,IAAI,OAAO,CAAC,EAAE,CAAC;AACrB,YAAI,KAAK,KAAM;AACf,eAAO,IAAI,QAAQ,CAAC;AACpB,gBAAQ,QAAQ,CAAC;AAAA,MACnB;AACA,UAAI,KAAK,OAAO,IAAI,MAAM,OAAO,IAAI;AAAA,IACvC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,MAAM,OAAO,UAAU,MAAM,CAAC;AAEhD,QAAM,iBAAiBA,UAAQ,MAAM;AACnC,QAAI,cAAc,OAAO,SAAS,WAAW,GAAG,KAAK,OAAO,SAAS,WAAW,GAAG,GAAG;AACpF,aAAO,EAAE,KAAK,WAAW,KAAK,KAAK,WAAW,IAAI;AAAA,IACpD;AACA,QAAI,KAAK;AACT,QAAI,KAAK;AACT,eAAW,OAAO,QAAQ;AACxB,iBAAW,KAAK,KAAK;AACnB,YAAI,KAAK,KAAM;AACf,aAAK,KAAK,IAAI,IAAI,CAAC;AACnB,aAAK,KAAK,IAAI,IAAI,CAAC;AAAA,MACrB;AAAA,IACF;AACA,QAAI,aAAa;AACf,iBAAW,KAAK,aAAa;AAC3B,YAAI,KAAK,KAAM;AACf,aAAK,KAAK,IAAI,IAAI,CAAC;AACnB,aAAK,KAAK,IAAI,IAAI,CAAC;AAAA,MACrB;AAAA,IACF;AACA,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,EAAG,QAAO;AACzD,QAAI,MAAM,GAAI,QAAO,EAAE,KAAK,KAAK,GAAG,KAAK,KAAK,EAAE;AAChD,WAAO,EAAE,KAAK,IAAI,KAAK,GAAG;AAAA,EAC5B,GAAG,CAAC,YAAY,QAAQ,WAAW,CAAC;AAEpC,MAAI,YAAY,SAAS;AACvB,WACE,gBAAAJ,OAAC,SAAI,WAAW,WAAW,cAAW,SACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,YAAY,cAAc;AAAA,MAC9D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,YAAY,WAAW;AACzB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,WACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,KAAK,SAAS,WAAW,GAAG;AACjD,WACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,sBAAAD,MAAC,SAAI,WAAU,+BACZ,kBAAQ,WAAW,KAAK,SAAS,WAAW,IACzC,sDACA,QAAQ,WAAW,IACjB,2BACA,wBACR;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,MAAK,UAAS,cAAW,qBAClD;AAAA,oBAAAA,OAAC,WAAM,WAAU,+BACf;AAAA,sBAAAD,MAAC,WACC,0BAAAC,OAAC,QACC;AAAA,wBAAAD,MAAC,QAAG,OAAM,OAAM,WAAU,6DAA4D,uBAEtF;AAAA,QACC,QAAQ,IAAI,CAAC,OAAO,MACnB,gBAAAA,MAAC,QAAW,OAAM,OAAM,WAAU,4BAC/B,mBADM,CAET,CACD;AAAA,SACH,GACF;AAAA,MACA,gBAAAA,MAAC,WACE,mBAAS,IAAI,CAAC,GAAG,MAChB,gBAAAC,OAAC,QACC;AAAA,wBAAAA,OAAC,QAAG,OAAM,OAAM,WAAU,4DACvB;AAAA,YAAE;AAAA,UACF,EAAE,QAAQ,EAAE,UAAU,OACrB,gBAAAD,MAAC,UAAK,WAAU,wCACb,WAAC,EAAE,UAAU,OAAO,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,QAAQ,IAAI,EACxD,OAAO,OAAO,EACd,KAAK,QAAK,GACf,IACE;AAAA,WACN;AAAA,QACC,QAAQ,IAAI,CAAC,GAAG,MAAM;AACrB,gBAAM,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK;AAC5B,gBAAM,UAAU,KAAK,OAAO,WAAM,OAAO,CAAC;AAC1C,gBAAM,SAAS,UAAU,IAAI,IAAI,OAAO,CAAC;AACzC,gBAAM,YAAY,eAAe,GAAG,gBAAgB,MAAM;AAC1D,gBAAM,WAAW,MACf,OAAO,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,GAAG,OAAO,EAAE,CAAC;AACvE,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,WACE,SACI,sFACA;AAAA,cAEN,OAAO;AAAA,cACP,MAAK;AAAA,cACL,UAAU;AAAA,cACV,cAAY,GAAG,EAAE,IAAI,YAAY,IAAI,CAAC,KAAK,OAAO;AAAA,cAClD,SAAS;AAAA,cACT,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB,2BAAS;AAAA,gBACX;AAAA,cACF;AAAA,cAEC;AAAA;AAAA,YAlBI;AAAA,UAmBP;AAAA,QAEJ,CAAC;AAAA,WAzCM,EAAE,QAAQ,OAAO,CAAC,CA0C3B,CACD,GACH;AAAA,MACC,cACC,gBAAAA,MAAC,WAAM,WAAU,+BACf,0BAAAC,OAAC,QACC;AAAA,wBAAAD,MAAC,QAAG,OAAM,OAAM,WAAU,4DAA2D,sBAErF;AAAA,QACC,YAAY,IAAI,CAAC,GAAG,MAAM;AACzB,gBAAM,UAAU,KAAK,OAAO,WAAM,OAAO,CAAC;AAC1C,gBAAM,YAAY,eAAe,GAAG,gBAAgB,KAAK;AACzD,iBACE,gBAAAA,MAAC,QAAW,WAAU,sDAAqD,OAAO,WAC/E,qBADM,CAET;AAAA,QAEJ,CAAC;AAAA,SACH,GACF,IACE;AAAA,OACN;AAAA,IACC;AAAA,KACH;AAEJ;;;AC7VA,SAAgB,iBAAiB,WAAAM,WAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAuW5D,SACE,OAAAC,OADF,QAAAC,cAAA;AAlWN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8Nd,SAAS,cACP,MACA,IACA,aACQ;AACR,MAAI,gBAAgB,cAAc;AAChC,UAAM,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG;AACrD,WAAO,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,EAChG;AACA,QAAM,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG;AACrD,SAAO,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC;AAChG;AAOA,SAAS,WACP,MACA,IACQ;AACR,QAAM,KAAK,GAAG,IAAI,KAAK;AACvB,QAAM,KAAK,GAAG,IAAI,KAAK;AACvB,QAAM,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK;AAClC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAChB,QAAM,OAAO;AACb,QAAM,QAAQ,GAAG,IAAI,KAAK;AAC1B,QAAM,QAAQ,GAAG,IAAI,KAAK;AAC1B,QAAM,KAAK,CAAC;AACZ,QAAM,KAAK;AACX,QAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,GAAG,IAAI,QAAQ,KAAK,OAAO,GAAG;AAChE,QAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,GAAG,IAAI,QAAQ,KAAK,OAAO,GAAG;AAChE,QAAM,KAAK,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC;AAC1B,SAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;AAC1B;AAEO,IAAM,WAAoC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC9E,eAAaD,YAAUC,OAAK;AAG5B,QAAM,UAAU,kBAAkB;AAAA,IAChC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,YAAY,MAAM;AACxB,QAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC;AACvD,QAAM,cAAc,MAAM,gBAAgB,eAAe,eAAe;AACxE,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,mBAAmB,MAAM,qBAAqB;AAEpD,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,gBAAgB,eAAe,4BAA4B;AAAA,IAC3D,YAAY,YAAY,yBAAyB;AAAA,EACnD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,YACJ,gBAAgB,eACZ,oDACA;AAEN,QAAM,UAAUC,QAAgC,IAAI;AACpD,QAAM,UAAUA,QAAO,oBAAI,IAA6B,CAAC;AACzD,QAAM,YAAY,CAAC,OAAe,CAAC,SAAiC;AAClE,QAAI,KAAM,SAAQ,QAAQ,IAAI,IAAI,IAAI;AAAA,QACjC,SAAQ,QAAQ,OAAO,EAAE;AAAA,EAChC;AAEA,QAAM,kBAAkBC,UAAwC,MAAM;AACpE,QAAI,CAAC,iBAAkB,QAAO,CAAC;AAC/B,UAAM,WAAW,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAChD,UAAM,QAAwC,CAAC;AAC/C,eAAW,MAAM,QAAQ;AACvB,UAAI,CAAC,MAAM,QAAQ,GAAG,YAAY,EAAG;AACrC,iBAAW,SAAS,GAAG,cAAc;AACnC,YAAI,OAAO,UAAU,SAAU;AAC/B,YAAI,CAAC,SAAS,IAAI,KAAK,KAAK,UAAU,GAAG,GAAI;AAC7C,cAAM,KAAK,EAAE,MAAM,OAAO,IAAI,GAAG,GAAG,CAAC;AAAA,MACvC;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,gBAAgB,CAAC;AAE7B,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAoB,CAAC,CAAC;AAEhD,kBAAgB,MAAM;AACpB,QAAI,CAAC,kBAAkB;AACrB,UAAI,MAAM,WAAW,EAAG,UAAS,CAAC,CAAC;AACnC;AAAA,IACF;AACA,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,KAAK,sBAAsB;AAC5C,UAAM,OAAkB,CAAC;AACzB,eAAW,EAAE,MAAM,QAAQ,IAAI,KAAK,KAAK,iBAAiB;AACxD,YAAM,SAAS,QAAQ,QAAQ,IAAI,MAAM;AACzC,YAAM,OAAO,QAAQ,QAAQ,IAAI,IAAI;AACrC,UAAI,CAAC,UAAU,CAAC,KAAM;AACtB,YAAM,IAAI,OAAO,sBAAsB;AACvC,YAAM,IAAI,KAAK,sBAAsB;AACrC,YAAM,OAAO;AAAA,QACX,GAAG,EAAE,OAAO,SAAS,OAAO,EAAE,QAAQ;AAAA,QACtC,GAAG,EAAE,MAAM,SAAS,MAAM,EAAE,SAAS;AAAA,MACvC;AACA,YAAM,KAAK;AAAA,QACT,GAAG,EAAE,OAAO,SAAS,OAAO,EAAE,QAAQ;AAAA,QACtC,GAAG,EAAE,MAAM,SAAS,MAAM,EAAE,SAAS;AAAA,MACvC;AACA,WAAK,KAAK;AAAA,QACR,KAAK,GAAG,MAAM,KAAK,IAAI;AAAA,QACvB;AAAA,QACA;AAAA,QACA,GAAG,cAAc,MAAM,IAAI,WAAW;AAAA,QACtC,OAAO,WAAW,MAAM,EAAE;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,UAAM,OACJ,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,QAAQ,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC;AACrE,QAAI,CAAC,KAAM,UAAS,IAAI;AAAA,EAC1B,GAAG,CAAC,iBAAiB,aAAa,kBAAkB,MAAM,CAAC;AAE3D,MAAI,QAAQ,SAAS;AACnB,WACE,gBAAAL,OAAC,SAAI,WAAW,WAAW,cAAW,SACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,QAAQ,cAAc;AAAA,MAC1D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,QAAQ,WAAW;AACrB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,WACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,QAAI,CAAC,MAAM,QAAQ,SAAS,EAAG,QAAO;AACtC,WACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,sBAAAD,MAAC,SAAI,WAAU,sBAAqB,iCAAmB;AAAA,MACtD;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,MAAK,QAAO,cAAW,YAChD;AAAA,oBAAAA,OAAC,QAAG,WAAW,WAAW,KAAK,SAAS,0BAAwB,mBAAmB,SAAS,QACzF;AAAA,aAAO,IAAI,CAAC,OAAO;AAClB,cAAM,SAAyB,GAAG,UAAU;AAC5C,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,wCAAwC,MAAM;AAAA,YACzD,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,OAAO,mBAAmB,EAAE,OAAO,GAAG,CAAC;AAAA,YACtD,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,kBAAE,eAAe;AACjB,uBAAO,mBAAmB,EAAE,OAAO,GAAG,CAAC;AAAA,cACzC;AAAA,YACF;AAAA,YAEC;AAAA,8BAAgB,cAAc,gBAAAD,MAAC,UAAK,WAAU,qBAAoB,eAAW,MAAC;AAAA,cAC/E,gBAAAA,MAAC,UAAK,WAAU,oBAAmB,eAAW,MAAC,KAAK,UAAU,GAAG,EAAE,GAAG;AAAA,cACtE,gBAAAA,MAAC,SAAI,WAAU,qBAAqB,aAAG,MAAK;AAAA,cAC3C,GAAG,QAAQ,gBAAAA,MAAC,SAAI,WAAU,sBAAsB,aAAG,OAAM,IAAS;AAAA,cACnE,gBAAAA,MAAC,QAAG,WAAU,sBAAsB,aAAG,OAAM;AAAA,cAC5C,GAAG,cAAc,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,aAAG,aAAY,IAAO;AAAA;AAAA;AAAA,UAjBrE,GAAG;AAAA,QAkBV;AAAA,MAEJ,CAAC;AAAA,MACA,oBAAoB,MAAM,SAAS,IAClC,gBAAAA,MAAC,SAAI,WAAU,0BAAyB,eAAY,QACjD,gBAAM,IAAI,CAAC,SACV,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,iBAAe,KAAK;AAAA,UACpB,eAAa,KAAK;AAAA,UAElB;AAAA,4BAAAD,MAAC,UAAK,WAAU,yBAAwB,GAAG,KAAK,GAAG;AAAA,YACnD,gBAAAA,MAAC,aAAQ,WAAU,8BAA6B,QAAQ,KAAK,OAAO;AAAA;AAAA;AAAA,QAL/D,KAAK;AAAA,MAMZ,CACD,GACH,IACE;AAAA,OACN;AAAA,IACC;AAAA,KACH;AAEJ;;;AC9aA,SAAgB,eAAAO,cAAa,WAAAC,WAAS,YAAAC,iBAAgB;AAgQ1C,gBAAAC,OAiBF,QAAAC,cAjBE;AA3PZ,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4Id,SAAS,aAAa,OAA8D;AAClF,QAAM,IAAI,oBAAI,IAAyB;AACvC,aAAW,MAAM,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG;AACzC,UAAM,IAAI,MAAM,EAAE;AAClB,QAAI,KAAK,GAAI,GAAE,IAAI,IAAI,CAAC;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,iBACP,IACA,SACA,KACA,MACQ;AACR,MAAI,KAAK,IAAI,EAAE,EAAG,QAAO,KAAK,IAAI,EAAE;AAEpC,QAAM,OAAO,QAAQ,IAAI,EAAE;AAC3B,MAAI,CAAC,MAAM;AACT,SAAK,IAAI,IAAI,IAAI,gBAAgB,UAAU,IAAI,IAAI,gBAAgB,QAAQ,OAAO,oBAAoB,CAAC;AACvG,WAAO,KAAK,IAAI,EAAE;AAAA,EACpB;AAEA,QAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AAEjE,MAAI,IAAI,gBAAgB,SAAS;AAC/B,QAAI,IAAI;AACR,eAAW,OAAO,SAAU,MAAK,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACzE,SAAK,IAAI,IAAI,CAAC;AACd,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,KAAK,OAAO,IAAI,KAAK;AACjC,QAAM,UAAU,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,IAAI,MAAM,OAAO,GAAG;AAElF,MAAI,IAAI,gBAAgB,OAAO;AAC7B,QAAI,IAAI,OAAO,SAAS,OAAO,IAAI,UAAU;AAC7C,eAAW,OAAO,SAAU,MAAK,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACzE,SAAK,IAAI,IAAI,CAAC;AACd,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,OAAO,SAAS,OAAO,IAAI,UAAU,OAAO;AACrD,aAAW,OAAO,UAAU;AAC1B,UAAM,IAAI,iBAAiB,KAAK,SAAS,KAAK,IAAI;AAClD,QAAI,OAAO,SAAS,CAAC,EAAG,MAAK,KAAK,IAAI,IAAI,CAAC;AAAA,EAC7C;AACA,OAAK,IAAI,IAAI,EAAE;AACf,SAAO;AACT;AAEA,SAAS,aAAa,GAAW,aAAkD;AACjF,MAAI,gBAAgB,SAAS,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AACzD,MAAI,OAAO,UAAU,CAAC,EAAG,QAAO,OAAO,CAAC;AACxC,SAAO,EAAE,QAAQ,CAAC;AACpB;AAEO,IAAM,gBAA8C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACxF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,YAAY,kBAAkB;AAAA,IAClC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,WAAW,MAAM,SAAS,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;AAChH,QAAM,SAAS,MAAM;AACrB,QAAM,aAAa,MAAM,eAAe;AACxC,QAAM,qBAAqB,MAAM,QAAQ,MAAM,eAAe,IAAI,MAAM,kBAAkB,CAAC;AAC3F,QAAM,aAAa,MAAM;AACzB,QAAM,UAAU,MAAM,WAAW;AAEjC,QAAM,UAAUC,UAAQ,MAAM,aAAa,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAEhE,QAAM,aAAaA,UAAQ,MAAM;AAC/B,QAAI,CAAC,cAAc,CAAC,UAAU,CAAC,QAAQ,IAAI,MAAM,EAAG,QAAO,oBAAI,IAAoB;AACnF,UAAM,OAAO,oBAAI,IAAoB;AACrC,qBAAiB,QAAQ,SAAS,YAAY,IAAI;AAClD,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,YAAY,MAAM,CAAC;AAEhC,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAsB,MAAM,IAAI,IAAI,kBAAkB,CAAC;AAEvF,QAAM,SAASC,aAAY,CAAC,OAAe;AACzC,gBAAY,CAAC,SAAS;AACpB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,CAAC,IAAY,UAAmC;AACjE,UAAM,OAAO,QAAQ,IAAI,EAAE;AAC3B,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AACjE,UAAM,cAAc,SAAS,SAAS;AACtC,UAAM,SAAS,CAAC,cAAc,SAAS,IAAI,EAAE;AAE7C,UAAM,aACJ,cAAc,WAAW,OACrB,aAAa,WAAW,IAAI,EAAE,KAAK,GAAG,WAAW,WAAW,IAC5D;AAEN,WACE,gBAAAL,OAAC,QACC;AAAA,sBAAAA,OAAC,SAAI,WAAU,0BACZ;AAAA,sBAAc,cACb,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,iBAAe;AAAA,YACf,cAAY,SAAS,aAAa;AAAA,YAClC,SAAS,CAAC,MAAM;AACd,gBAAE,gBAAgB;AAClB,qBAAO,EAAE;AAAA,YACX;AAAA,YAEC,mBAAS,WAAM;AAAA;AAAA,QAClB,IAEA,gBAAAA,MAAC,UAAK,WAAU,+DAA8D,eAAW,MAAC,kBAE1F;AAAA,QAEF,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,OAAO,eAAe,EAAE,IAAI,OAAO,OAAO,KAAK,MAAM,CAAC;AAAA,YAEpE;AAAA,mBAAK,OACJ,gBAAAD,MAAC,UAAK,WAAU,2BAA0B,eAAW,MAClD,eAAK,MACR,IACE;AAAA,cACJ,gBAAAA,MAAC,UAAM,eAAK,OAAM;AAAA,cACjB,KAAK,QAAQ,gBAAAA,MAAC,UAAK,WAAU,4BAA4B,eAAK,OAAM,IAAU;AAAA,cAC9E,eAAe,OACd,gBAAAA,MAAC,UAAK,WAAU,6BAA4B,OAAM,UAC/C,sBACH,IACE;AAAA;AAAA;AAAA,QACN;AAAA,SACF;AAAA,MACC,eAAe,SACd,gBAAAA,MAAC,QAAG,WAAU,0BAA0B,mBAAS,IAAI,CAAC,QAAQ,WAAW,KAAK,QAAQ,CAAC,CAAC,GAAE,IACxF;AAAA,SAzCG,EA0CT;AAAA,EAEJ;AAEA,QAAM,YACJ,YAAY,UAAU,+CAA+C;AAEvE,MAAI,UAAU,SAAS;AACrB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,SACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,UAAU,cAAc;AAAA,MAC5D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,UAAU,WAAW;AACvB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,WACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,MAAM,GAAG;AACnC,WACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,sBAAAD,MAAC,SAAI,WAAU,4BACZ,WAAC,SAAS,oBAAoB,cAAc,MAAM,gBACrD;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,kBACpC;AAAA,oBAAAD,MAAC,QAAG,WAAU,2BAA2B,qBAAW,QAAQ,CAAC,GAAE;AAAA,IAC9D;AAAA,KACH;AAEJ;;;AChVA,SAAgB,SAAAO,QAAO,WAAAC,WAAS,UAAAC,SAAQ,YAAAC,YAAU,aAAAC,kBAAiB;AAuO7D,SACE,OAAAC,OADF,QAAAC,cAAA;AAlON,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6Fd,SAAS,cAAc,GAAW,MAAuB;AACvD,QAAM,MAAM,KAAK,IAAI,CAAC;AACtB,MAAI;AACJ,MAAI,OAAO,IAAK,KAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,WAClC,OAAO,IAAK,KAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,WACvC,OAAO,IAAK,KAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,WACvC,OAAO,IAAK,KAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC3C,KAAI,OAAO,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AACtD,SAAO,OAAO,GAAG,CAAC,IAAI,IAAI,KAAK;AACjC;AAEA,IAAM,UAAU;AAET,IAAM,iBAAgD,CAAC,EAAE,OAAO,SAAS,MAAM;AACpF,eAAaD,YAAUC,OAAK;AAG5B,QAAM,UAAU,kBAAkB;AAAA,IAChC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,QAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC;AACnE,QAAM,OAAO,MAAM;AACnB,QAAM,iBAAiB,MAAM,mBAAmB;AAChD,QAAM,MAAMC,OAAM,EAAE,QAAQ,MAAM,EAAE;AACpC,QAAM,YAAY,aAAa,GAAG;AAClC,QAAM,YAAY,aAAa,GAAG;AAClC,QAAM,YAAY,aAAa,GAAG;AAElC,QAAM,UAAUC,QAAuB,IAAI;AAC3C,QAAM,CAAC,IAAI,KAAK,IAAIC,WAAS,CAAC;AAC9B,EAAAC,WAAU,MAAM;AACd,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,GAAI;AACT,UAAM,OAAO,MAAM;AACjB,YAAM,IAAI,KAAK,MAAM,GAAG,WAAW;AACnC,UAAI,IAAI,EAAG,OAAM,UAAS,SAAS,IAAI,OAAO,CAAE;AAAA,IAClD;AACA,SAAK;AACL,UAAM,KAAK,IAAI,eAAe,IAAI;AAClC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,SAASC,UAAQ,MAAM;AAC3B,QAAI,SAAS,WAAW,EAAG,QAAO;AAYlC,UAAM,eAAyB,CAAC;AAChC,QAAI,MAAM;AACV,UAAM,OAAiB,CAAC;AAExB,aAAS,MAAM,GAAG,MAAM,SAAS,QAAQ,OAAO;AAC9C,YAAM,KAAK,SAAS,GAAG;AACvB,YAAM,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,GAAG,QAAQ;AACjD,YAAM,IAA0B,GAAG,SAC7B,GAAG,UAAU,UAAU,IAAI,IAAI,aAAa;AAElD,UAAI,MAAM,SAAS;AACjB,qBAAa,KAAK,CAAC;AACnB,aAAK,KAAK,EAAE,KAAK,OAAO,GAAG,OAAO,KAAK,GAAG,MAAM,SAAS,MAAM,GAAG,OAAO,GAAG,WAAW,MAAM,CAAC;AAC9F,cAAM;AAAA,MACR,WAAW,MAAM,YAAY;AAC3B,cAAM,QAAQ,CAAC,KAAK,IAAI,CAAC;AACzB,cAAM,QAAQ;AACd,eAAO;AACP,cAAM,OAAO;AACb,qBAAa,KAAK,OAAO,IAAI;AAC7B,aAAK,KAAK,EAAE,KAAK,OAAO,GAAG,OAAO,KAAK,GAAG,MAAM,YAAY,MAAM,OAAO,WAAW,MAAM,CAAC;AAAA,MAC7F,OAAO;AACL,cAAM,OAAO;AACb,eAAO;AACP,cAAM,QAAQ;AACd,qBAAa,KAAK,MAAM,KAAK;AAC7B,aAAK,KAAK,EAAE,KAAK,OAAO,GAAG,OAAO,KAAK,GAAG,MAAM,YAAY,MAAM,OAAO,WAAW,MAAM,CAAC;AAAA,MAC7F;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,IAAI,GAAG,YAAY;AACnC,QAAI,OAAO,KAAK,IAAI,GAAG,YAAY;AACnC,UAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,YAAQ;AACR,YAAQ;AACR,UAAM,OAAO,KAAK,IAAI,MAAM,OAAO,IAAI;AAEvC,UAAM,IAAI,SAAS;AACnB,UAAM,OAAO;AACb,UAAM,OAAO;AACb,UAAM,OAAO;AACb,UAAMC,cAAa,IAAI,IAAI,KAAK;AAChC,UAAM,OAAOA,cAAa;AAC1B,UAAMC,OAAM,MAAM;AAClB,UAAM,SAASA,OAAM,OAAO;AAC5B,UAAMC,KAAI,OAAO,UAAU;AAC3B,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC;AACzD,UAAMC,UAAS,SAAS,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC;AACpE,UAAMC,QAAO,KAAK,IAAI,GAAGD,MAAK;AAE9B,UAAM,SAAS,CAAC,MAAc,QAAQ,KAAK,IAAI,QAAQ,QAAQ;AAC/D,UAAME,eAAc,OAAO;AAE3B,UAAMC,UAAS,KAAK,IAAI,CAAC,MAAM;AAC7B,YAAM,IAAI,OAAO,EAAE,OAAOF,QAAO,WAAWD,SAAQC,SAAQ;AAC5D,UAAI,MAAM,OAAO,KAAK,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;AAC1C,UAAI,SAAS,OAAO,KAAK,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;AAC7C,UAAI,YAAY;AAChB,UAAI,SAASC,cAAa;AAAE,iBAASA;AAAa,oBAAY;AAAA,MAAK;AACnE,UAAI,MAAM,MAAM;AAAE,cAAM;AAAM,oBAAY;AAAA,MAAK;AAC/C,YAAM,SAAS,EAAE,SAAS,aAAa,KAAK,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,KAAK;AAC3F,YAAM,UAAU,KAAK,IAAI,MAAM,KAAK,IAAI,OAAO,MAAM,GAAGA,YAAW,CAAC;AACpE,aAAO,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,IAAI,GAAG,SAAS,GAAG,GAAG,SAAS,UAAU;AAAA,IAC1E,CAAC;AAED,UAAME,aAAY,OAAO,CAAC;AAC1B,UAAMC,gBAAeD,cAAa,QAAQA,cAAaF;AAEvD,WAAO,EAAE,KAAAJ,MAAK,GAAAC,IAAG,MAAM,MAAM,QAAQ,QAAAI,SAAQ,WAAAC,YAAW,cAAAC,eAAc,MAAAJ,OAAM,QAAQ,OAAAD,QAAO,aAAAE,cAAa,YAAAL,YAAW;AAAA,EACrH,GAAG,CAAC,UAAU,EAAE,CAAC;AAEjB,MAAI,QAAQ,SAAS;AACnB,WACE,gBAAAR,OAAC,SAAI,WAAU,gBAAe,cAAW,SAAQ,MAAK,OAAM,cAAY,OAAO,oBAAoB,IAAI,MAAM,mBAC3G;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,QAAQ,cAAc;AAAA,MAC1D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,QAAQ,WAAW;AACrB,WACE,gBAAAC,OAAC,SAAI,WAAU,gBAAe,cAAW,WAAU,MAAK,OAAM,cAAY,OAAO,oBAAoB,IAAI,MAAM,mBAC7G;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,CAAC,UAAU,SAAS,WAAW,GAAG;AACpC,WACE,gBAAAC,OAAC,SAAI,WAAU,gBAAe,MAAK,OAAM,cAAY,OAAO,oBAAoB,IAAI,MAAM,mBACxF;AAAA,sBAAAD,MAAC,SAAI,WAAU,uBAAsB,gCAAkB;AAAA,MACtD;AAAA,OACH;AAAA,EAEJ;AAEA,QAAM,EAAE,KAAK,GAAG,QAAQ,WAAW,cAAc,MAAM,OAAO,aAAa,WAAW,IAAI;AAC1F,QAAM,eAAe,QAAQ;AAE7B,QAAM,gBAAmC,CAAC;AAC1C,MAAI,WAAW;AACf,QAAM,YAAY;AAClB,aAAW,KAAK,QAAQ;AACtB,UAAM,KAAK,EAAE,IAAI,OAAO;AACxB,QAAI,KAAK,WAAW,UAAW;AAC/B,eAAW;AACX,kBAAc;AAAA,MACZ,gBAAAA,MAAC,UAA0B,WAAU,uBAAsB,GAAG,IAAI,GAAG,EAAE,MAAM,GAAG,YAAW,UACxF,wBAAc,EAAE,KAAK,IAAI,KADjB,OAAO,EAAE,GAAG,EAEvB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAA+B,CAAC;AACtC,QAAM,YAAY,eAAe,IAAI;AACrC,QAAM,gBAAgB,eAAe,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC;AAC1E,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW;AACjD,UAAM,IAAI,OAAO,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,OAAO;AACxB,UAAM,KAAK,cAAc;AACzB,UAAM,MAAM,EAAE;AACd,UAAM,YAAY,IAAI,SAAS,gBAAgB,GAAG,IAAI,MAAM,GAAG,gBAAgB,CAAC,CAAC,WAAM;AACvF,QAAI,cAAc;AAChB,gBAAU;AAAA,QACR,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,GAAG;AAAA,YACH,GAAG;AAAA,YACH,YAAW;AAAA,YACX,WAAW,cAAc,EAAE,IAAI,EAAE;AAAA,YAEhC;AAAA;AAAA,UAPI,OAAO,EAAE,GAAG;AAAA,QAQnB;AAAA,MACF;AAAA,IACF,OAAO;AACL,gBAAU;AAAA,QACR,gBAAAA,MAAC,UAA0B,WAAU,uBAAsB,GAAG,IAAI,GAAG,IAAI,YAAW,UACjF,uBADQ,OAAO,EAAE,GAAG,EAEvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,gBAAe,MAAK,OAAM,cAAY,OAAO,oBAAoB,IAAI,MAAM,mBACxF;AAAA,oBAAAD,MAAC,SAAI,KAAK,SAAS,WAAU,0BAC3B,0BAAAC,OAAC,SAAI,WAAU,qBAAoB,SAAS,OAAO,GAAG,IAAI,CAAC,IAAI,OAAO,EAAE,QAAQ,EAAE,GAChF;AAAA,sBAAAA,OAAC,UACC;AAAA,wBAAAD,MAAC,cAAS,IAAI,cAAc,GAAG,IAC7B,0BAAAA,MAAC,UAAK,GAAG,OAAO,MAAM,GAAG,OAAO,MAAM,OAAO,OAAO,QAAQ,QAAQ,SAAS,GAC/E;AAAA,QACA,gBAAAC,OAAC,oBAAe,IAAI,WAAW,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KACrD;AAAA,0BAAAD,MAAC,UAAK,QAAO,MAAK,WAAU,8BAA6B,aAAY,QAAO;AAAA,UAC5E,gBAAAA,MAAC,UAAK,QAAO,QAAO,WAAU,8BAA6B,aAAY,QAAO;AAAA,WAChF;AAAA,QACA,gBAAAC,OAAC,oBAAe,IAAI,WAAW,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KACrD;AAAA,0BAAAD,MAAC,UAAK,QAAO,MAAK,WAAU,6BAA4B,aAAY,OAAM;AAAA,UAC1E,gBAAAA,MAAC,UAAK,QAAO,QAAO,WAAU,6BAA4B,aAAY,QAAO;AAAA,WAC/E;AAAA,QACA,gBAAAC,OAAC,oBAAe,IAAI,WAAW,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KACrD;AAAA,0BAAAD,MAAC,UAAK,QAAO,MAAK,WAAU,8BAA6B,aAAY,QAAO;AAAA,UAC5E,gBAAAA,MAAC,UAAK,QAAO,QAAO,WAAU,8BAA6B,aAAY,OAAM;AAAA,WAC/E;AAAA,SACF;AAAA,MACC,gBACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,IAAI,OAAO,OAAO;AAAA,UAClB,IAAI;AAAA,UACJ,IAAI,OAAO,OAAO,OAAO,SAAS;AAAA,UAClC,IAAI;AAAA;AAAA,MACN;AAAA,MAEF,gBAAAC,OAAC,OAAE,UAAU,mBAAmB,GAAG,KAChC;AAAA,0BACC,OAAO,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,MAAM;AAChC,gBAAM,OAAO,OAAO,IAAI,CAAC;AACzB,iBACE,gBAAAD;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV,IAAI,EAAE,IAAI;AAAA,cACV,IAAI,EAAE;AAAA,cACN,IAAI,KAAK;AAAA,cACT,IAAI,EAAE;AAAA;AAAA,YALD,WAAW,EAAE,GAAG;AAAA,UAMvB;AAAA,QAEJ,CAAC;AAAA,QACF,OAAO,IAAI,CAAC,MAAM;AACjB,gBAAM,MAAM,SAAS,EAAE,GAAG;AAC1B,gBAAM,cACJ,EAAE,SAAS,aAAa,QAAQ,SAAS,MAAM,EAAE,SAAS,UAAU,QAAQ,SAAS,MAAM,QAAQ,SAAS;AAC9G,gBAAM,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,QAAQ;AAC9C,iBACE,gBAAAC,OAAC,OACC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,GAAG,EAAE;AAAA,gBACL,GAAG,EAAE;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ,EAAE;AAAA,gBACV,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ;AAAA,gBAEA,0BAAAA,MAAC,WAAO,aAAG,EAAE,KAAK,KAAK,cAAc,EAAE,KAAK,IAAI,CAAC,IAAG;AAAA;AAAA,YACtD;AAAA,YACC,EAAE,aACD,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,QAAQ,OAAO,CAAC,OAAO,OAAO,IAAI,CAAC;AAAA;AAAA,YACnG;AAAA,eAjBI,OAAO,EAAE,GAAG,EAmBpB;AAAA,QAEJ,CAAC;AAAA,SACH;AAAA,MACC;AAAA,MACA;AAAA,OACH,GACF;AAAA,IACC;AAAA,KACH;AAEJ;;;AChYA,OAAkB;AA6MZ,SACE,OAAAkB,OADF,QAAAC,cAAA;AA3MN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4Jd,IAAM,gBAA4D;AAAA,EAChE,KAAK,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACpC,MAAM,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACrC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,QAAQ,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACvC,MAAM,EAAE,IAAI,WAAW,IAAI,UAAU;AACvC;AAEA,SAAS,YAAY,GAAsB;AACzC,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,KAAK,OAAO,MAAM,YAAY,WAAW,EAAG,QAAO,EAAE;AACzD,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,WAAW,GAA+C;AACjE,MAAI,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC,EAAE,MAAO,QAAO;AACvE,QAAM,UAAU,cAAc,EAAE,KAAK;AACrC,MAAI,QAAS,QAAO,EAAE,YAAY,QAAQ,IAAI,OAAO,QAAQ,GAAG;AAChE,SAAO,EAAE,YAAY,sBAAsB,EAAE,KAAK,sBAAsB,OAAO,EAAE,MAAM;AACzF;AAEA,SAAS,aAAa,MAA2C;AAC/D,SAAO,KAAK,YAAY,KAAK;AAC/B;AAEO,IAAM,cAA0C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACpF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,aAAa,MAAM;AACzB,QAAM,UAAU,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC;AAC1D,QAAM,UAAU,MAAM,WAAW;AAEjC,QAAM,YACJ,YAAY,YACR,6CACA;AAEN,QAAM,aAAa,kBAAkB;AAAA,IACnC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,MAAI,WAAW,SAAS;AACtB,WACE,gBAAAF,OAAC,SAAI,WAAW,WAAW,cAAW,SACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,SAAQ,aAAa,WAAW,cAAc;AAAA,MAC7D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,WAAW,WAAW;AACxB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,cAAW,WACpC;AAAA,sBAAAD,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI,CAAC,MAAM,QAAQ,UAAU,EAAG,QAAO;AACvC,WACE,gBAAAC,OAAC,SAAI,WAAW,WACd;AAAA,sBAAAD,MAAC,SAAI,WAAU,0BAAyB,iCAAmB;AAAA,MAC1D;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,MAAK;AAAA,MACL,cAAW;AAAA,MAEX;AAAA,wBAAAD,MAAC,SAAI,WAAU,0BACZ,kBAAQ,IAAI,CAAC,KAAK,aAAa;AAC9B,gBAAM,OAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;AACrD,gBAAM,SAAS,IAAI,SAAS;AAC5B,gBAAM,SAAS,GAAG,IAAI,UAAU,IAAI,KAAK,IAAI,QAAQ;AACrD,iBACE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV,OACE,SACK;AAAA,gBACC,CAAC,oBAA8B,GAAG;AAAA,cACpC,IACA;AAAA,cAGN;AAAA,gCAAAA,OAAC,YAAO,WAAU,6BACf;AAAA,sBAAI;AAAA,kBACJ,IAAI,SACH,gBAAAD,MAAC,UAAK,WAAU,+BAA+B,cAAI,QAAO,IACxD;AAAA,kBACJ,gBAAAC,OAAC,UAAK,OAAO,EAAE,YAAY,KAAK,SAAS,KAAK,GAAG;AAAA;AAAA,oBAAG,KAAK;AAAA,oBAAO;AAAA,qBAAC;AAAA,mBACnE;AAAA,gBACA,gBAAAD,MAAC,SAAI,WAAU,6BACZ,eAAK,IAAI,CAAC,SACT,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBAEC,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,UAAU;AAAA,oBACV,SAAS,MAAM,OAAO,2BAA2B,EAAE,MAAM,aAAa,UAAU,QAAQ,IAAI,CAAC;AAAA,oBAC7F,WAAW,CAAC,MAAM;AAChB,0BAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,0BAAE,eAAe;AACjB,+BAAO,2BAA2B,EAAE,MAAM,aAAa,UAAU,QAAQ,IAAI,CAAC;AAAA,sBAChF;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD,MAAC,QAAG,WAAU,+BAA+B,eAAK,OAAM;AAAA,sBACvD,aAAa,IAAI,IAChB,gBAAAA,MAAC,OAAE,WAAU,kCAAkC,uBAAa,IAAI,GAAE,IAChE;AAAA,sBACH,KAAK,UAAU,KAAK,OAAO,SAAS,IACnC,gBAAAA,MAAC,SAAI,WAAU,2BAA0B,cAAW,QACjD,eAAK,OAAO,IAAI,CAAC,GAAG,MACnB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,OAAO,WAAW,CAAC;AAAA,0BAElB,sBAAY,CAAC;AAAA;AAAA,wBAJT,GAAG,KAAK,EAAE,UAAU,CAAC;AAAA,sBAK5B,CACD,GACH,IACE;AAAA,sBACH,KAAK,WACJ,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAW,wDAAwD,KAAK,QAAQ;AAAA,0BAE/E,eAAK;AAAA;AAAA,sBACR,IACE;AAAA;AAAA;AAAA,kBAnCC,KAAK;AAAA,gBAoCZ,CACD,GACH;AAAA;AAAA;AAAA,YA1DK;AAAA,UA2DP;AAAA,QAEJ,CAAC,GACH;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;;;ACrTA,OAAkB;AAkKZ,SACE,OAAAI,OADF,QAAAC,cAAA;AA7JN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0IP,IAAM,gBAA8C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACxF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;AAChE,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,iBAAiB,MAAM;AAC7B,QAAM,YACJ,YAAY,UAAU,+CAA+C;AAEvE,QAAM,YAAY,kBAAkB;AAAA,IAClC,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ;AAAA,EACnF,CAAC;AAED,MAAI,UAAU,SAAS;AACrB,WACE,gBAAAF,OAAC,SAAI,WAAW,WAAW,MAAK,UAAS,cAAY,OAAO,cAAW,SACrE;AAAA,sBAAAD,MAAC,QAAG,WAAU,4BAA4B,iBAAM;AAAA,MAChD,gBAAAA,MAAC,aAAU,MAAK,SAAQ,aAAa,UAAU,cAAc;AAAA,MAC5D;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,UAAU,WAAW;AACvB,WACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,MAAK,UAAS,cAAY,OAAO,cAAW,WACrE;AAAA,sBAAAD,MAAC,QAAG,WAAU,4BAA4B,iBAAM;AAAA,MAChD,gBAAAA,MAAC,aAAU,MAAK,WAAU;AAAA,MACzB;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAW,WAAW,MAAK,UAAS,cAAY,OACnD;AAAA,oBAAAD,MAAC,QAAG,WAAU,4BAA4B,iBAAM;AAAA,IAC/C,QAAQ,WAAW,IAClB,gBAAAA,MAAC,SAAI,WAAU,4BAA2B,yBAAW,IAErD,gBAAAA,MAAC,QAAG,WAAU,2BACX,kBAAQ,IAAI,CAAC,KAAK,QAAQ;AACzB,YAAM,aAAa,kBAAkB,QAAQ,IAAI,SAAS;AAC1D,YAAM,WAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,cAAc,wCAAwC;AAAA,QAC1D,aAAa,qCAAqC;AAAA,MACpD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACX,aACE,gBAAAA,MAAC,QAA8B,WAAU,6BACvC,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW;AAAA,UACX,gBAAc;AAAA,UACd,SAAS,MACP,OAAO,mBAAmB;AAAA,YACxB,MAAM,IAAI;AAAA,YACV,OAAO,IAAI;AAAA,YACX,aAAa,IAAI;AAAA,UACnB,CAAC;AAAA,UAGH;AAAA,4BAAAA,OAAC,SAAI,WAAU,0BACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,2BAA2B,cAAI,MAAK;AAAA,cACpD,gBAAAC,OAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAU,GAClE;AAAA,oBAAI,cAAc,gBAAAD,MAAC,UAAK,WAAU,4BAA2B,yBAAW,IAAU;AAAA,gBAClF,IAAI,SAAS,QAAQ,OAAO,SAAS,IAAI,KAAK,IAC7C,gBAAAA,MAAC,UAAK,WAAU,4BAA4B,cAAI,MAAM,QAAQ,CAAC,GAAE,IAC/D;AAAA,iBACN;AAAA,eACF;AAAA,YACC,IAAI,cAAc,gBAAAA,MAAC,OAAE,WAAU,kCAAkC,cAAI,aAAY,IAAO;AAAA,YACxF,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,SAAS,IAC5C,gBAAAA,MAAC,QAAG,WAAU,2BACX,cAAI,KAAK,IAAI,CAAC,GAAG,MAChB,gBAAAA,MAAC,QAAY,eAAJ,CAAM,CAChB,GACH,IACE;AAAA,YACH,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,SAAS,IAC5C,gBAAAA,MAAC,QAAG,WAAU,2BACX,cAAI,KAAK,IAAI,CAAC,GAAG,MAChB,gBAAAA,MAAC,QAAY,eAAJ,CAAM,CAChB,GACH,IACE;AAAA;AAAA;AAAA,MACN,KArCO,GAAG,IAAI,IAAI,IAAI,GAAG,EAsC3B;AAAA,IAEJ,CAAC,GACH;AAAA,IAED;AAAA,KACH;AAEJ;;;ACpPA,SAAgB,WAAAI,iBAAe;AAsPzB,SACE,OAAAC,OADF,QAAAC,cAAA;AAnPN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2Id,SAAS,SAAS,KAAyD;AACzE,QAAM,IAAI,IAAI,KAAK,EAAE,MAAM,oBAAoB;AAC/C,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE;AAC3B,SAAO,EAAE,GAAI,KAAK,KAAM,KAAK,GAAI,KAAK,IAAK,KAAK,GAAG,IAAI,IAAI;AAC7D;AAEA,SAAS,KAAK,GAAW,GAAW,GAAmB;AACrD,SAAO,KAAK,IAAI,KAAK;AACvB;AAEA,SAAS,UAAU,KAAa,MAAc,GAAmB;AAC/D,QAAM,IAAI,SAAS,GAAG,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AACpD,QAAM,IAAI,SAAS,IAAI,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AACnD,QAAM,IAAI,KAAK,MAAM,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACtC,QAAM,IAAI,KAAK,MAAM,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACtC,QAAM,IAAI,KAAK,MAAM,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACtC,SAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3B;AAIA,SAAS,eACP,YACA,cAC+B;AAC/B,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,KAAK,WAAW,MAAM,UAAU;AAAA,IAC3C,KAAK;AACH,aAAO,EAAE,KAAK,WAAW,MAAM,UAAU;AAAA,IAC3C,KAAK;AACH,aAAO,EAAE,KAAK,WAAW,MAAM,UAAU;AAAA,IAC3C,KAAK,UAAU;AACb,YAAM,IAAI,MAAM,QAAQ,YAAY,IAAI,eAAe,CAAC;AACxD,UAAI,EAAE,UAAU,EAAG,QAAO,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE;AAC7D,aAAO,EAAE,KAAK,WAAW,MAAM,UAAU;AAAA,IAC3C;AAAA,IACA;AACE,aAAO,EAAE,KAAK,WAAW,MAAM,UAAU;AAAA,EAC7C;AACF;AAiBO,IAAM,UAAkC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC5E,eAAaD,YAAUC,OAAK;AAE5B,QAAM,aAAa,MAAM;AACzB,QAAM,aAAa,MAAM;AACzB,QAAM,UAAU,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC;AAC1D,QAAM,UAAU,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC;AAC1D,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC;AACzD,QAAMC,aAAY,MAAM,cAAc;AAKtC,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,EAAE,KAAK,UAAU,MAAM,UAAU,IAAI,eAAe,MAAM,YAAY,MAAM,YAAY;AAE9F,QAAM,EAAE,MAAM,KAAK,IAAIC,UAAQ,MAAM;AACnC,QAAI,KAAK,MAAM;AACf,QAAI,KAAK,MAAM;AACf,QAAI,MAAM,QAAQ,MAAM,QAAQ,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,KAAK,KAAK,IAAI;AACrF,aAAO,EAAE,MAAM,IAAI,MAAM,GAAG;AAAA,IAC9B;AACA,QAAI,SAAS;AACb,QAAI,SAAS;AACb,eAAW,OAAO,QAAQ;AACxB,UAAI,CAAC,MAAM,QAAQ,GAAG,EAAG;AACzB,iBAAW,KAAK,KAAK;AACnB,YAAI,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,GAAG;AAC/C,mBAAS,KAAK,IAAI,QAAQ,CAAC;AAC3B,mBAAS,KAAK,IAAI,QAAQ,CAAC;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,OAAO,SAAS,MAAM,EAAG,UAAS;AACvC,QAAI,CAAC,OAAO,SAAS,MAAM,EAAG,UAAS;AACvC,QAAI,WAAW,OAAQ,UAAS,SAAS;AACzC,WAAO,EAAE,MAAM,MAAM,QAAQ,MAAM,MAAM,OAAO;AAAA,EAClD,GAAG,CAAC,QAAQ,MAAM,KAAK,MAAM,GAAG,CAAC;AAEjC,QAAM,OAAO,KAAK,IAAI,MAAM,OAAO,IAAI;AAEvC,MAAI,QAAQ,WAAW,KAAK,QAAQ,WAAW,GAAG;AAChD,QAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,CAAC,MAAM,QAAQ,UAAU,EAAG,QAAO;AACrE,WACE,gBAAAJ,OAAC,SAAI,WAAW,cAAc,uCAAuC,cACnE;AAAA,sBAAAD,MAAC,SAAI,WAAU,qBAAoB,+CAAiC;AAAA,MACnE;AAAA,OACH;AAAA,EAEJ;AAEA,QAAM,gBAAgB,CAAC,KAAa,KAAa,UAAkB;AACjE,QAAI,CAAC,KAAM;AACX,SAAK,aAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,GAAG;AAAA,MACnB,QAAQ,QAAQ,GAAG;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,cAAc,uCAAuC;AAAA,MAChE,MAAK;AAAA,MACL,cAAW;AAAA,MAMX;AAAA,wBAAAA,OAAC,WAAM,WAAU,qBACf;AAAA,0BAAAD,MAAC,WACC,0BAAAC,OAAC,QACC;AAAA,4BAAAD,MAAC,QAAG,OAAM,OAAM,WAAU,qCAAoC;AAAA,YAC7D,QAAQ,IAAI,CAAC,MACZ,gBAAAA,MAAC,QAAW,OAAM,OAAM,WAAU,kBAAiB,OAAO,GACvD,eADM,CAET,CACD;AAAA,aACH,GACF;AAAA,UACA,gBAAAA,MAAC,WACE,kBAAQ,IAAI,CAAC,UAAU,OAAO;AAC7B,kBAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,IAAI,CAAC;AAC1D,mBACE,gBAAAC,OAAC,QACC;AAAA,8BAAAD,MAAC,QAAG,OAAM,OAAM,WAAU,yBAAwB,OAAO,UACtD,oBACH;AAAA,cACC,QAAQ,IAAI,CAAC,GAAG,OAAO;AACtB,sBAAM,MAAM,QAAQ,EAAE;AACtB,sBAAM,IAAI,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,IAAI,MAAM;AAClE,sBAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC;AACpD,sBAAM,KAAK,UAAU,UAAU,WAAW,CAAC;AAC3C,sBAAM,KAAK,IAAI,OAAO,YAAY;AAClC,sBAAM,QAAQ,OAAO,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AAK3D,sBAAM,OACJ,IAAI,OAAO,QAAQ,IAAI,OAAO,QAAQ;AACxC,sBAAM,SAAS,QAAQ,EAAE,KAAK,OAAO,EAAE;AACvC,sBAAM,YAAY,GAAG,QAAQ,KAAK,MAAM,KAAK,KAAK;AAClD,sBAAM,YAAY,sCAAsC,IAAI;AAC5D,uBACE,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,WAAW,cAAc,GAAG,SAAS,sCAAsC;AAAA,oBAC3E,MAAK;AAAA,oBACL,aAAW;AAAA,oBACX,OAAO;AAAA,sBACL,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,CAAC,iBAA2B,GAAG;AAAA,oBACjC;AAAA,oBACA,OAAO,GAAG,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,oBACpC,cAAY;AAAA,oBACZ,UAAU,cAAc,IAAI;AAAA,oBAC5B,SAAS,cAAc,MAAM,cAAc,IAAI,IAAI,CAAC,IAAI;AAAA,oBACxD,WACE,cACI,CAAC,MAAM;AACL,0BAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,0BAAE,eAAe;AACjB,sCAAc,IAAI,IAAI,CAAC;AAAA,sBACzB;AAAA,oBACF,IACA;AAAA,oBAGL,UAAAI,aACC,gBAAAJ,MAAC,UAAK,WAAU,0BAA0B,iBAAM,IAEhD,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,iBAAM;AAAA;AAAA,kBA3BrC;AAAA,gBA6BP;AAAA,cAEJ,CAAC;AAAA,iBArDM,YAAY,OAAO,EAAE,CAsD9B;AAAA,UAEJ,CAAC,GACH;AAAA,WACF;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;;;AC/VA,SAAgB,eAAAM,eAAa,aAAAC,YAAW,WAAAC,WAAS,UAAAC,SAAQ,YAAAC,kBAAgB;AACzE,SAAS,cAAAC,aAAY,iBAAAC,sBAAqB;AA4YpC,SAoCU,YAAAC,WApCV,OAAAC,OAiBY,QAAAC,cAjBZ;AAxYN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyPd,SAAS,gBAAgB,KAAoC;AAC3D,SAAO,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;AACpE;AAEA,SAAS,WAAW,GAAmC;AACrD,QAAM,MAAM,EAAE;AACd,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,SAAO,IAAI,OAAO,CAAC,MAAwB,KAAK,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,UAAU,QAAQ;AAC5G;AAEA,SAAS,cAAc,QAAsE;AAC3F,QAAM,IAA+C,CAAC;AACtD,aAAW,KAAK,QAAQ;AACtB,UAAM,IAAI,EAAE;AACZ,UAAM,OAAO,WAAW,CAAC;AACzB,QAAI,EAAE,SAAS,YAAY;AACzB,QAAE,EAAE,IAAI,IAAI,QAAQ,CAAC;AAAA,IACvB,WAAW,EAAE,SAAS,UAAU;AAC9B,YAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC9C,QAAE,EAAE,IAAI,IAAI,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,IACvC,WAAW,EAAE,SAAS,YAAY,EAAE,SAAS,SAAS;AACpD,YAAM,UAAU,OAAO,MAAM,WAAW,IAAI;AAC5C,YAAM,OAAO,WAAW,KAAK,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,IAAI,UAAU,KAAK,CAAC,GAAG,SAAS;AAC5F,QAAE,EAAE,IAAI,IAAI;AAAA,IACd,OAAO;AACL,QAAE,EAAE,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC,IAAI;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAiB,QAA2D;AACtG,SAAO,QAAQ,QAAQ,cAAc,CAAC,GAAG,QAAgB;AACvD,UAAM,IAAI,OAAO,GAAG;AACpB,WAAO,MAAM,UAAa,MAAM,OAAO,KAAK,OAAO,CAAC;AAAA,EACtD,CAAC;AACH;AAEO,IAAM,cAA0C,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACpF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,EAAE,KAAK,SAAS,IAAIC,eAAc;AAoBxC,QAAM,UAAUC,YAAW;AAE3B,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,IAAI,gBAAgB,MAAM,MAAM,IAAI,CAAC;AAC9E,QAAM,iBAAiB,MAAM,QAAQ,MAAM,cAAc,IAAI,MAAM,iBAAiB,CAAC;AACrF,QAAM,eAAe,MAAM;AAC3B,QAAM,UAAU,MAAM,WAAW;AAEjC,QAAM,UAAUC,UAAQ,MAAM,cAAc,MAAM,GAAG,CAAC,MAAM,CAAC;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAoD,OAAO;AACvF,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAiC,CAAC,CAAC;AACrE,QAAM,gBAAgBC,QAAgD,CAAC,CAAC;AAGxE,EAAAC,WAAU,MAAM;AACd,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,eAAS,SAAS,IAAI,IAAI,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQC;AAAA,IACZ,CAAC,MAAc,UAAqC;AAClD,gBAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE;AAChD,eAAS,SAAS,IAAI,IAAI,KAAK;AAC/B,aAAO,eAAe,EAAE,MAAM,MAAM,CAAC;AAAA,IACvC;AAAA,IACA,CAAC,MAAM,QAAQ;AAAA,EACjB;AAEA,QAAM,YACJ,YAAY,WAAW,4CAA4C;AAErE,QAAM,SAASA,cAAY,MAAM;AAM/B,YAAQ,IAAI,0CAA0C;AAAA,MACpD;AAAA,MACA,gBAAgB,OAAO,SAAS,YAAY;AAAA,MAC5C,YAAY,OAAO,KAAK,MAAM;AAAA,MAC9B;AAAA,MACA,eAAe,OAAO,KAAK,SAAS;AAAA,MACpC,WAAW,OAAO,OAAO,SAAS,EAAE,KAAK,EAAE;AAAA,IAC7C,CAAC;AACD,QAAI,CAAC,cAAc;AACjB,cAAQ,KAAK,yGAAoG;AACjH;AAAA,IACF;AACA,UAAM,WAAW,OAAO,OAAO,SAAS,EAAE,KAAK;AAC/C,UAAM,OAAgC,EAAE,QAAQ,cAAc,OAAO;AACrE,QAAI,SAAS,SAAS,EAAG,MAAK,UAAU;AAMxC,UAAM,SAAkC,EAAE,GAAG,QAAQ,QAAQ,aAAa;AAC1E,QAAI,SAAS,SAAS,EAAG,QAAO,UAAU;AAC1C,YAAQ,IAAI,oDAA+C;AAAA,MACzD,QAAQ;AAAA,MACR,YAAY,OAAO,KAAK,MAAM;AAAA,IAChC,CAAC;AACD,SAAK,QACF,QAAQ,EAAE,QAAQ,cAAc,OAAO,CAAC,EACxC,KAAK,MAAM;AACV,cAAQ,IAAI,6DAAwD,EAAE,QAAQ,aAAa,CAAC;AAAA,IAC9F,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,cAAQ,MAAM,6DAAwD,EAAE,QAAQ,cAAc,IAAI,CAAC;AAAA,IACrG,CAAC;AAIH,WAAO,eAAe,IAAI;AAAA,EAC5B,GAAG,CAAC,SAAS,MAAM,cAAc,QAAQ,SAAS,CAAC;AAEnD,SACE,gBAAAT,OAAC,cAAS,WAAW,WAAW,OAAO,EAAE,QAAQ,QAAQ,QAAQ,GAAG,SAAS,EAAE,GAC7E;AAAA,oBAAAD,MAAC,YAAO,WAAU,0BAA0B,iBAAM;AAAA,IAClD,gBAAAC,OAAC,SAAI,WAAU,2BACZ;AAAA,aAAO,IAAI,CAAC,MAAM;AACjB,cAAM,OAAO,WAAW,CAAC;AACzB,cAAM,SAAS,EAAE,YAAY;AAC7B,cAAM,cAAc,EAAE,WAAW,gBAAAD,MAAC,UAAK,eAAW,MAAC,gBAAE,IAAU;AAC/D,eACE,gBAAAC,OAAC,SAAiB,WAAU,0BACzB;AAAA,YAAE,SAAS,aACV,gBAAAA,OAAC,SAAI,WAAU,iCACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,SAAS,EAAE,IAAI;AAAA,gBACnB,MAAK;AAAA,gBACL,SAAS,QAAQ,OAAO,EAAE,IAAI,CAAC;AAAA,gBAC/B,UAAU,EAAE;AAAA,gBACZ,UAAU,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,OAAO,OAAO;AAAA;AAAA,YACjD;AAAA,YACA,gBAAAC,OAAC,WAAM,WAAU,0BAAyB,SAAS,SAAS,EAAE,IAAI,IAAI,OAAO,EAAE,YAAY,IAAI,GAC5F;AAAA,gBAAE;AAAA,cACF;AAAA,eACH;AAAA,aACF,IACE;AAAA,UACH,EAAE,SAAS,UACV,gBAAAA,OAAC,UAAK,WAAU,0BACb;AAAA,cAAE;AAAA,YACF;AAAA,aACH,IACE;AAAA,UACH,EAAE,SAAS,cAAc,EAAE,SAAS,UACnC,gBAAAA,OAAC,WAAM,WAAU,0BAAyB,SAAS,SAAS,EAAE,IAAI,IAC/D;AAAA,cAAE;AAAA,YACF;AAAA,aACH,IACE;AAAA,UACH,EAAE,SAAS,SACV,gBAAAA,OAAAF,WAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,SAAS,EAAE,IAAI;AAAA,gBACnB,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,aAAa,EAAE;AAAA,gBACf,UAAU,EAAE;AAAA,gBACZ,SAAS,EAAE,YAAY;AAAA,gBACvB,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,gBAClC,UAAU,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK;AAAA;AAAA,YAC/C;AAAA,YACC,SAAS,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,kBAAO,IAAO;AAAA,aAChE,IACE;AAAA,UACH,EAAE,SAAS,WACV,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,SAAS,EAAE,IAAI;AAAA,gBACnB,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,aAAa,EAAE;AAAA,gBACf,UAAU,EAAE;AAAA,gBACZ,KAAK,EAAE,YAAY;AAAA,gBACnB,KAAK,EAAE,YAAY;AAAA,gBACnB,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,CAAC;AAAA,gBACjC,UAAU,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,OAAO,iBAAiB,CAAC;AAAA;AAAA,YAC5D;AAAA,YACC,SAAS,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,kBAAO,IAAO;AAAA,aAChE,IACE;AAAA,UACH,EAAE,SAAS,WACV,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,SAAS,EAAE,IAAI;AAAA,cACnB,WAAU;AAAA,cACV,UAAU,EAAE;AAAA,cACZ,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,cAClC,UAAU,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK;AAAA,cAE3C,gBAAK,SAAS,IAAI,OAAO,CAAC,EAAE,OAAO,UAAK,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAC3D,gBAAAA,MAAC,YAAoC,OAAO,IAAI,OAC7C,cAAI,SAAS,YADH,IAAI,SAAS,SAE1B,CACD;AAAA;AAAA,UACH,IACE;AAAA,UACH,EAAE,SAAS,UACV,gBAAAA,MAAC,SAAI,WAAU,gCAA+B,MAAK,cAAa,cAAY,EAAE,OAC3E,eAAK,IAAI,CAAC,KAAK,OACd,gBAAAC,OAAC,WAAsB,WAAU,8BAC/B;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAM,eAAe,EAAE,IAAI;AAAA,gBAC3B,OAAO,IAAI;AAAA,gBACX,UAAU,EAAE,YAAY,OAAO;AAAA,gBAC/B,SAAS,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE,MAAM,IAAI;AAAA,gBAC9C,UAAU,MAAM,MAAM,EAAE,MAAM,IAAI,KAAK;AAAA;AAAA,YACzC;AAAA,YACC,IAAI;AAAA,eATK,IAAI,KAUhB,CACD,GACH,IACE;AAAA,UACH,EAAE,SAAS,aACV,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,SAAS,EAAE,IAAI;AAAA,gBACnB,WAAU;AAAA,gBACV,aAAa,EAAE;AAAA,gBACf,UAAU,EAAE;AAAA,gBACZ,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,gBAClC,UAAU,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK;AAAA;AAAA,YAC/C;AAAA,YACC,SAAS,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,kBAAO,IAAO;AAAA,aAChE,IACE;AAAA,UACH,EAAE,SAAS,SACV,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,SAAS,EAAE,IAAI;AAAA,gBACnB,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,UAAU,EAAE;AAAA,gBACZ,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,gBAClC,UAAU,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK;AAAA;AAAA,YAC/C;AAAA,YACC,SAAS,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,kBAAO,IAAO;AAAA,aAChE,IACE;AAAA,UACH,EAAE,SAAS,SACV,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAE;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,MAAM,cAAc,QAAQ,EAAE,IAAI,GAAG,MAAM;AAAA,gBACpD,YAAY,CAAC,MAAM;AAAE,oBAAE,eAAe;AAAG,oBAAE,gBAAgB;AAAA,gBAAE;AAAA,gBAC7D,QAAQ,CAAC,MAAM;AACb,oBAAE,eAAe;AACjB,oBAAE,gBAAgB;AAClB,wBAAM,UAAU,MAAM,KAAK,EAAE,aAAa,KAAK;AAC/C,sBAAI,QAAQ,SAAS,GAAG;AACtB,iCAAa,WAAS;AAAA,sBACpB,GAAG;AAAA,sBACH,CAAC,EAAE,IAAI,GAAG,EAAE,WAAW,CAAC,GAAI,KAAK,EAAE,IAAI,KAAK,CAAC,GAAI,GAAG,OAAO,IAAI,QAAQ,MAAM,GAAG,CAAC;AAAA,oBACnF,EAAE;AAAA,kBACJ;AAAA,gBACF;AAAA,gBAEA;AAAA,kCAAAD,MAAC,UAAK,WAAU,mCACb,YAAE,eAAe,sCACpB;AAAA,kBACA,gBAAAC,OAAC,UAAK,WAAU,4DAA2D;AAAA;AAAA,oBAAY,EAAE,WAAW,MAAM;AAAA,qBAAG;AAAA,kBAC7G,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK,CAAC,OAAO;AAAE,sCAAc,QAAQ,EAAE,IAAI,IAAI;AAAA,sBAAG;AAAA,sBAClD,MAAK;AAAA,sBACL,QAAQ,EAAE;AAAA,sBACV,UAAU,EAAE;AAAA,sBACZ,OAAO,EAAE,SAAS,OAAO;AAAA,sBACzB,UAAU,CAAC,MAAM;AACf,8BAAM,WAAW,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC;AAChD,4BAAI,SAAS,SAAS,GAAG;AACvB,uCAAa,WAAS;AAAA,4BACpB,GAAG;AAAA,4BACH,CAAC,EAAE,IAAI,GAAG,EAAE,WAAW,CAAC,GAAI,KAAK,EAAE,IAAI,KAAK,CAAC,GAAI,GAAG,QAAQ,IAAI,SAAS,MAAM,GAAG,CAAC;AAAA,0BACrF,EAAE;AAAA,wBACJ;AACA,4BAAI,EAAE,OAAQ,GAAE,OAAO,QAAQ;AAAA,sBACjC;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF;AAAA,aACE,UAAU,EAAE,IAAI,GAAG,UAAU,KAAK,KAClC,gBAAAA,MAAC,SAAI,WAAU,8BACZ,oBAAU,EAAE,IAAI,EAAG,IAAI,CAAC,MAAM,QAC7B,gBAAAC,OAAC,UAAiC,WAAU,8BAA6B;AAAA;AAAA,cACnE,KAAK;AAAA,cACT,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM;AACb,iCAAa,WAAS;AAAA,sBACpB,GAAG;AAAA,sBACH,CAAC,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,MAAM,MAAM,GAAG;AAAA,oBAC3D,EAAE;AAAA,kBACJ;AAAA,kBACD;AAAA;AAAA,cAAC;AAAA,iBAXO,GAAG,KAAK,IAAI,IAAI,GAAG,EAY9B,CACD,GACH;AAAA,YAED,SAAS,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,kBAAO,IAAO;AAAA,aAChE,IACE;AAAA,aAlLI,EAAE,IAmLZ;AAAA,MAEJ,CAAC;AAAA,MACA,eAAe,IAAI,CAAC,OACnB,gBAAAC,OAAC,SAAkB,WAAU,0BAC3B;AAAA,wBAAAD,MAAC,UAAK,WAAU,0BAA0B,aAAG,OAAM;AAAA,QACnD,gBAAAC,OAAC,SAAI,WAAU,6BAA4B,OAAO,GAAG,SAClD;AAAA,6BAAmB,GAAG,SAAS,MAAM;AAAA,UACtC,gBAAAD,MAAC,UAAK,WAAU,qCAAqC,aAAG,SAAQ;AAAA,WAClE;AAAA,WALQ,GAAG,IAMb,CACD;AAAA,MACA,eACC,gBAAAA,MAAC,SAAI,WAAU,gCACb,0BAAAA,MAAC,UAAO,OAAM,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,QAAQ,GACtE,IACE;AAAA,OACN;AAAA,IACC;AAAA,KACH;AAEJ;;;AC5lBA,SAAgB,aAAAW,kBAAiB;AAiDxB,qBAAAC,WAAA,OAAAC,aAAA;AAzBF,IAAM,QAA8B,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AACxE,QAAM,WAAW,OAAO,MAAM,aAAa,YAAY,MAAM,WAAW,IAAI,MAAM,WAAW;AAC7F,QAAM,YAAY,MAAM;AACxB,QAAM,YAAY,MAAM,cAAc;AACtC,QAAM,WAAW,MAAM;AAEvB,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,UAAW,QAAO;AACvB,QAAI,OAAO,cAAc,YAAY,UAAU,WAAW,EAAG,QAAO;AAEpE,QAAI,OAAO;AACX,UAAM,YACJ,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,KAAK,WAAW,IAAI,WAAW;AAEzF,UAAM,KAAK,OAAO,YAAY,MAAM;AAClC,cAAQ;AACR,aAAO,cAAc,EAAE,MAAM,WAAW,OAAO,EAAE,MAAM,WAAW,KAAK,IAAI,EAAE,EAAE,CAAC;AAChF,UAAI,aAAa,QAAQ,QAAQ,WAAW;AAC1C,eAAO,cAAc,EAAE;AAAA,MACzB;AAAA,IACF,GAAG,QAAQ;AAEX,WAAO,MAAM,OAAO,cAAc,EAAE;AAAA,EACtC,GAAG,CAAC,WAAW,UAAU,WAAW,UAAU,IAAI,CAAC;AAEnD,SAAO,gBAAAE,MAAAD,WAAA,EAAG,UAAS;AACrB;;;AClDA,SAAgB,eAAAE,eAAa,WAAAC,WAAS,YAAAC,kBAAgB;AAgM9C,SACE,OAAAC,OADF,QAAAC,cAAA;AA7LR,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8Gd,SAAS,mBACP,QACA,QACiC;AACjC,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,UAAM,IAAI,OAAO,CAAC;AAClB,QAAI,UAAU,EAAE,SAAS,UAAU,EAAE,KAAK;AACxC,UAAI,EAAE,OAAO;AACX,eAAO,EAAE,YAAY,EAAE,MAAM;AAAA,MAC/B;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAgB,QAAuC;AAChF,SAAO,OAAO,KAAK,CAAC,MAAM,UAAU,EAAE,SAAS,UAAU,EAAE,GAAG;AAChE;AAEO,IAAM,aAAwC,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAClF,eAAaD,YAAUC,OAAK;AAE5B,QAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,QAAM,WAAW,MAAM,YAAY;AACnC,QAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAM,WAAW,MAAM,aAAa;AAEpC,QAAM,kBAAkBC,UAAQ,MAAM;AACpC,UAAM,MAAM,MAAM,QAAQ,MAAM,UAAU,IAAI,MAAM,aAAa,CAAC;AAClE,WAAO,IAAI;AAAA,MACT,CAAC,MACC,KACA,OAAO,UAAU,EAAE,KAAK,KACxB,OAAO,UAAU,EAAE,GAAG,KACtB,EAAE,QAAQ,KACV,EAAE,OAAO,EAAE;AAAA,IACf;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,CAAC;AAErB,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,KAAK;AAE5C,QAAM,aAAaC,cAAY,YAAY;AACzC,QAAI,CAAC,YAAY,OAAO,cAAc,eAAe,CAAC,UAAU,WAAW,WAAW;AACpF,aAAO,QAAQ,EAAE,IAAI,OAAO,QAAQ,cAAc,CAAC;AACnD;AAAA,IACF;AACA,eAAW,IAAI;AACf,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,IAAI;AACxC,aAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,IAC7B,QAAQ;AACN,aAAO,QAAQ,EAAE,IAAI,OAAO,QAAQ,QAAQ,CAAC;AAAA,IAC/C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,IAAI,CAAC;AAEzB,QAAM,QAAQ,KAAK,WAAW,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI;AAExD,QAAM,YAAiC,CAAC;AACxC,MAAI,MAAM,WAAW;AACnB,cAAU,YAAY,MAAM;AAAA,EAC9B;AAEA,QAAM,aAAa,CAAC,MAAc,MAAc;AAC9C,UAAM,SAAS,IAAI;AACnB,UAAM,KAAK,kBAAkB,QAAQ,eAAe;AACpD,UAAM,WAAW,mBAAmB,QAAQ,eAAe;AAC3D,UAAM,YACJ,MAAM,CAAC,UAAU,aACb,yDACA;AACN,UAAM,YAA6C,UAAU,aAAa,EAAE,YAAY,SAAS,WAAW,IAAI;AAEhH,QAAI,aAAa;AACf,aACE,gBAAAL,OAAC,SAAY,WAAW,WAAW,OAAO,WACxC;AAAA,wBAAAD,MAAC,UAAK,WAAU,0BAA0B,kBAAO;AAAA,QACjD,gBAAAA,MAAC,UAAK,WAAU,wBAAwB,kBAAQ,KAAI;AAAA,WAF5C,CAGV;AAAA,IAEJ;AACA,WACE,gBAAAA,MAAC,SAAY,WAAW,WAAW,OAAO,EAAE,GAAG,WAAW,qBAAqB,MAAM,GACnF,0BAAAA,MAAC,UAAK,WAAU,wBAAuB,OAAO,EAAE,aAAa,UAAU,GACpE,kBAAQ,KACX,KAHQ,CAIV;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,kBAAiB,MAAK,UAAS,cAAW,QACvD;AAAA,oBAAAA,OAAC,YAAO,WAAU,wBAChB;AAAA,sBAAAD,MAAC,UAAM,oBAAS;AAAA,MAChB,gBAAAA,MAAC,SAAI,WAAU,gCACZ,qBACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,KAAK,WAAW;AAAA,UAC/B,UAAU;AAAA,UAET,oBAAU,WAAM;AAAA;AAAA,MACnB,IACE,MACN;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,wBAAuB,OAAO,OAAO,KAAK,SAAS,EAAE,SAAS,YAAY,QACtF,gBAAM,IAAI,CAAC,MAAM,MAAM,WAAW,MAAM,CAAC,CAAC,GAC7C;AAAA,IACC;AAAA,KACH;AAEJ;;;ACtOA,OAAkB;AAqJZ,gBAAAO,OAYc,QAAAC,cAZd;AAlJN,IAAMC,aAAW;AAEjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8Fd,IAAM,YAA4C;AAAA,EAChD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb;AAEA,SAAS,YAAY,GAAuC;AAC1D,SAAO,UAAU,KAAK,SAAS;AACjC;AA4BO,IAAM,kBAAkD,CAAC,EAAE,OAAO,UAAU,KAAK,MAAM;AAC5F,eAAaD,YAAUC,OAAK;AAE5B,QAAM,cAAc,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,cAAc,CAAC;AAE5E,QAAM,cAAc,CAAC,aAAqB;AACxC,QAAI,OAAO,aAAa,YAAa;AACrC,aAAS,eAAe,QAAQ,GAAG,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU,CAAC;AAC1F,WAAO,eAAe,EAAE,SAAS,CAAC;AAAA,EACpC;AAEA,SACE,gBAAAF,OAAC,SAAI,WAAU,uBAAsB,MAAK,UAAS,cAAW,qBAC5D;AAAA,oBAAAD,MAAC,SAAI,WAAU,6BAA6B,UAAS;AAAA,IACpD,YAAY,SAAS,IACpB,gBAAAA,MAAC,SAAI,WAAU,oCAAmC,MAAK,QACpD,sBAAY,IAAI,CAAC,MAAM;AACtB,YAAM,IAAI,EAAE;AACZ,aACE,gBAAAC,OAAC,aAAmB,WAAU,6BAA4B,MAAK,YAAW,sBAAoB,EAAE,IAC9F;AAAA,wBAAAD,MAAC,UAAK,WAAU,6BAA4B,eAAW,MACpD,sBAAY,CAAC,GAChB;AAAA,QACA,gBAAAC,OAAC,SAAI,WAAU,6BACb;AAAA,0BAAAA,OAAC,SAAI,WAAU,6BACb;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM,YAAY,EAAE,QAAQ;AAAA,gBACtC;AAAA;AAAA,kBACI,EAAE;AAAA;AAAA;AAAA,YACP;AAAA,YACC,EAAE,SAAS,gBAAAD,MAAC,UAAM,YAAE,QAAO,IAAU;AAAA,YACrC,EAAE,YAAY,gBAAAA,MAAC,UAAM,YAAE,WAAU,IAAU;AAAA,aAC9C;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,6BAA6B,YAAE,MAAK;AAAA,WACnD;AAAA,WAjBY,EAAE,EAkBhB;AAAA,IAEJ,CAAC,GACH,IACE;AAAA,KACN;AAEJ;;;ACpLA,OAAOI,WAAS,aAAAC,YAAW,WAAAC,iBAAe;AA0EhB,gBAAAC,aAAA;AArE1B,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASd,IAAM,gBAAgBC,QAAM,KAAK,MAAM,OAAO,yBAA+B,CAAC;AAE9E,SAAS,aAAa,MAAc,UAA4B;AAC9D,MAAI,UAAU;AACZ,UAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACnD,QAAI,QAAQ,SAAS,QAAQ,MAAO,QAAO;AAAA,EAC7C;AACA,QAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AACnD,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAM,MAAM,MAAM,CAAC,EAAE,SAAS,GAAI,IAAI,MAAO;AAC7C,QAAM,YAAY,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE;AACtC,MAAI,YAAY,EAAG,QAAO;AAC1B,QAAM,SAAS,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,MAAM,MAAM,CAAC;AACvD,SAAO,OAAO,MAAM,OAAK;AACvB,UAAM,OAAO,EAAE,MAAM,GAAG,EAAE;AAC1B,WAAO,KAAK,IAAI,OAAO,SAAS,KAAK;AAAA,EACvC,CAAC;AACH;AAsBO,IAAM,aAA8B,CAAC,EAAE,OAAO,KAAK,MAAM;AAC9D,eAAaF,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,KAAK,SAAS,MAAM,QAAQ,CAAC;AAElG,EAAAE,WAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB,EAAE,aAAa,MAAM,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAE3B,QAAM,OAAO,IAAI,WAAW;AAE5B,QAAM,QAAQC;AAAA,IACZ,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,SAAS,aAAa,MAAM,IAAI,QAAQ;AAAA,IACnE,CAAC,MAAM,IAAI,UAAU,IAAI,SAAS,IAAI,KAAK;AAAA,EAC7C;AAEA,MAAI,IAAI,QAAS,QAAO,gBAAAL,MAAC,SAAI,WAAU,0CAAyC,2BAAQ;AACxF,MAAI,IAAI,MAAO,QAAO,gBAAAA,MAAC,SAAI,WAAU,wCAAwC,cAAI,OAAM;AAEvF,MAAI,OAAO;AACT,WACE,gBAAAA,MAAC,SAAI,WAAU,mCACb,0BAAAA,MAACG,QAAM,UAAN,EAAe,UAAU,gBAAAH,MAAC,SAAI,WAAU,2BAA0B,2BAAQ,GACzE,0BAAAA,MAAC,iBAAc,SAAS,MAAM,GAChC,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAU,uCACb,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA;AAAA,EAClB,GACF;AAEJ;;;AChGA,SAAgB,aAAAM,kBAAiB;AAuCP,gBAAAC,aAAA;AAlC1B,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBP,IAAM,iBAAkC,CAAC,EAAE,OAAO,KAAK,MAAM;AAClE,eAAaD,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,KAAK,SAAS,MAAM,QAAQ,CAAC;AAElG,EAAAC,WAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB,EAAE,aAAa,MAAM,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAE3B,MAAI,IAAI,QAAS,QAAO,gBAAAH,MAAC,SAAI,WAAU,oDAAmD,2BAAQ;AAClG,MAAI,IAAI,MAAO,QAAO,gBAAAA,MAAC,SAAI,WAAU,kDAAkD,cAAI,OAAM;AAEjG,QAAM,OAAO,IAAI,WAAW;AAC5B,SACE,gBAAAA,MAAC,SAAI,WAAU,4CACb,0BAAAA,MAAC,YAAS,SAAS,MAAM,UAAU,MAAM,UAAU,GACrD;AAEJ;;;AChDA,SAAgB,aAAAI,mBAAiB;AAsCP,gBAAAC,aAAA;AAjC1B,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBP,IAAM,iBAAkC,CAAC,EAAE,OAAO,KAAK,MAAM;AAClE,eAAaD,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,KAAK,SAAS,MAAM,QAAQ,CAAC;AAElG,EAAAC,YAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB,EAAE,aAAa,MAAM,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAE3B,MAAI,IAAI,QAAS,QAAO,gBAAAH,MAAC,SAAI,WAAU,kDAAiD,2BAAQ;AAChG,MAAI,IAAI,MAAO,QAAO,gBAAAA,MAAC,SAAI,WAAU,gDAAgD,cAAI,OAAM;AAE/F,SACE,gBAAAA,MAAC,SAAI,WAAU,+CACb,0BAAAA,MAAC,gBAAa,SAAS,IAAI,WAAW,IAAI,GAC5C;AAEJ;;;AC9CA,SAAgB,aAAAI,mBAAiB;AAuCP,gBAAAC,aAAA;AAlC1B,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBP,IAAM,aAA8B,CAAC,EAAE,OAAO,KAAK,MAAM;AAC9D,eAAaD,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,KAAK,SAAS,MAAM,QAAQ,CAAC;AAElG,EAAAC,YAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB,EAAE,aAAa,MAAM,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAE3B,MAAI,IAAI,QAAS,QAAO,gBAAAH,MAAC,SAAI,WAAU,0CAAyC,2BAAQ;AACxF,MAAI,IAAI,MAAO,QAAO,gBAAAA,MAAC,SAAI,WAAU,wCAAwC,cAAI,OAAM;AAEvF,SACE,gBAAAA,MAAC,SAAI,WAAU,uCACb,0BAAAA,MAAC,YAAS,MAAM,IAAI,WAAW,MAAM,iBAAiB,MAAM,iBAAiB,GAC/E;AAEJ;;;AC/CA,SAAgB,aAAAI,mBAAiB;AAgDP,gBAAAC,aAAA;AA3C1B,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BP,IAAM,cAA+B,CAAC,EAAE,OAAO,KAAK,MAAM;AAC/D,eAAaD,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,IAAI,CAAC;AAE1E,EAAAC,YAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB,EAAE,aAAa,MAAM,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAE3B,MAAI,IAAI,QAAS,QAAO,gBAAAH,MAAC,SAAI,WAAU,4CAA2C,2BAAQ;AAC1F,MAAI,IAAI,MAAO,QAAO,gBAAAA,MAAC,SAAI,WAAU,0CAA0C,cAAI,OAAM;AAEzF,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,CAAC,IAAK,QAAO,gBAAAA,MAAC,SAAI,WAAU,0CAAyC,6BAAe;AAExF,SACE,gBAAAA,MAAC,SAAI,WAAU,yCACb,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,KAAK,MAAM,OAAO,MAAM;AAAA,MACxB,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA;AAAA,EAClB,GACF;AAEJ;;;AChEA,SAAgB,aAAAI,mBAAiB;AAsCP,gBAAAC,aAAA;AAjC1B,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBP,IAAM,cAA+B,CAAC,EAAE,OAAO,KAAK,MAAM;AAC/D,eAAaD,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,IAAI,CAAC;AAE1E,EAAAC,YAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB,EAAE,aAAa,MAAM,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAE3B,MAAI,IAAI,QAAS,QAAO,gBAAAH,MAAC,SAAI,WAAU,4CAA2C,2BAAQ;AAC1F,MAAI,IAAI,MAAO,QAAO,gBAAAA,MAAC,SAAI,WAAU,0CAA0C,cAAI,OAAM;AAEzF,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,CAAC,IAAK,QAAO,gBAAAA,MAAC,SAAI,WAAU,0CAAyC,6BAAe;AAExF,SACE,gBAAAA,MAAC,SAAI,WAAU,yCACb,0BAAAA,MAAC,aAAU,KAAU,UAAU,MAAM,YAAY,IAAI,UAAU,GACjE;AAEJ;;;ACjDA,SAAgB,aAAAI,mBAAiB;AAsCP,gBAAAC,aAAA;AAjC1B,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBP,IAAM,cAA+B,CAAC,EAAE,OAAO,KAAK,MAAM;AAC/D,eAAaD,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,IAAI,CAAC;AAE1E,EAAAC,YAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB,EAAE,aAAa,MAAM,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5G;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAE3B,MAAI,IAAI,QAAS,QAAO,gBAAAH,MAAC,SAAI,WAAU,4CAA2C,2BAAQ;AAC1F,MAAI,IAAI,MAAO,QAAO,gBAAAA,MAAC,SAAI,WAAU,0CAA0C,cAAI,OAAM;AAEzF,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,CAAC,IAAK,QAAO,gBAAAA,MAAC,SAAI,WAAU,0CAAyC,6BAAe;AAExF,SACE,gBAAAA,MAAC,SAAI,WAAU,yCACb,0BAAAA,MAAC,aAAU,KAAU,UAAU,MAAM,YAAY,IAAI,UAAU,GACjE;AAEJ;;;ACjDA,SAAgB,aAAAI,aAAW,WAAAC,iBAAe;;;ACA1C,SAAS,aAAAC,aAAW,WAAAC,WAAS,UAAAC,SAAQ,YAAAC,kBAAgB;AAwBrD,IAAM,oBAAoB;AAAA,EACxB;AAAA,EAAS;AAAA,EACT;AAAA,EACA;AAAA,EAAO;AAAA,EAAQ;AAAA,EACf;AAAA,EAAS;AAAA,EACT;AAAA,EACA;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAC3D;AAAA,EAAS;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACnC;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxB;AAAA,EAAQ;AAAA,EAAS;AAAA,EACjB;AAAA,EAAQ;AACV;AAEA,IAAM,YAAY,oBAAI,IAAY;AAAA,EAChC;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAQ;AAAA,EACxC;AAAA,EAAS;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAQ;AACrC,CAAC;AAED,IAAM,cAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EAAc,SAAS;AAAA,EAC/B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EAAa,UAAU;AAAA,EAChC,QAAQ;AAAA,EAAY,QAAQ;AAAA,EAC5B,QAAQ;AAAA,EACR,QAAQ;AAAA,EAAc,QAAQ;AAAA,EAAa,QAAQ;AAAA,EAAa,QAAQ;AAAA,EACxE,QAAQ;AAAA,EAAa,SAAS;AAAA,EAAc,QAAQ;AAAA,EACpD,QAAQ;AAAA,EAAc,OAAO;AAC/B;AAEA,SAAS,OAAO,MAAsB;AACpC,QAAM,IAAI,KAAK,YAAY,GAAG;AAC9B,SAAO,KAAK,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,IAAI;AAChD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,YAAY,OAAO,IAAI,CAAC,KAAK;AACtC;AAEA,SAAS,WAAW,MAAuB;AACzC,SAAO,UAAU,IAAI,OAAO,IAAI,CAAC;AACnC;AA0BO,SAAS,eAAe,MAAmD;AAChF,QAAM,SAAgC,gBAAgB;AAAA,IACpD,SAAS,KAAK;AAAA,IACd,YAAY,CAAC,GAAG,iBAAiB;AAAA,IACjC,SAAS,KAAK;AAAA,IACd,WAAW;AAAA,IACX,cAAc;AAAA,IACd,MAAM,CAAC,KAAK,QAAQ;AAAA,EACtB,CAAC;AAGD,QAAM,eAAeC,UAA4B,MAAM;AACrD,WAAO,OAAO,MACX,OAAO,CAAC,MAAM;AACb,UAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,SAAS,IAAI,GAAG;AACvF,YAAI,OAAO,YAAY,aAAa;AAClC,kBAAQ,KAAK,4CAA4C,EAAE,IAAI,EAAE;AAAA,QACnE;AACA,eAAO;AAAA,MACT;AACA,UAAI,EAAE,WAAW,QAAQ,CAAC,EAAE,KAAK;AAC/B,YAAI,OAAO,YAAY,aAAa;AAClC,kBAAQ,KAAK,mDAAmD,EAAE,IAAI,EAAE;AAAA,QAC1E;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC,EACA,IAAsB,CAAC,MAAM;AAC5B,YAAM,OAAO,UAAU,EAAE,IAAI;AAC7B,YAAM,OAAO,WAAW,EAAE,IAAI;AAC9B,UAAI,QAAQ,EAAE,WAAW,MAAM;AAC7B,eAAO,EAAE,MAAM,EAAE,MAAM,MAAM,SAAS,EAAE,SAAS,gBAAgB,MAAM;AAAA,MACzE;AACA,UAAI,QAAQ,EAAE,KAAK;AAEjB,eAAO,EAAE,MAAM,EAAE,MAAM,MAAM,KAAK,EAAE,KAAK,gBAAgB,KAAK;AAAA,MAChE;AACA,UAAI,EAAE,KAAK;AACT,eAAO,EAAE,MAAM,EAAE,MAAM,MAAM,KAAK,EAAE,KAAK,gBAAgB,MAAM;AAAA,MACjE;AACA,aAAO,EAAE,MAAM,EAAE,MAAM,MAAM,SAAS,EAAE,WAAW,IAAI,gBAAgB,MAAM;AAAA,IAC/E,CAAC;AAAA,EACL,GAAG,CAAC,OAAO,KAAK,CAAC;AAGjB,QAAM,CAAC,UAAU,WAAW,IAAIC,WAA8B,oBAAI,IAAI,CAAC;AACvE,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAwB,IAAI;AACpE,QAAM,SAASC,QAAO,CAAC;AAEvB,EAAAC,YAAU,MAAM;AACd,UAAM,UAAU,aAAa,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG;AACpE,QAAI,QAAQ,WAAW,GAAG;AACxB,kBAAY,oBAAI,IAAI,CAAC;AACrB,mBAAa,KAAK;AAClB,sBAAgB,IAAI;AACpB;AAAA,IACF;AACA,UAAM,MAAM,EAAE,OAAO;AACrB,UAAM,YAAY,MAAM,QAAQ,OAAO;AAEvC,iBAAa,IAAI;AACjB,oBAAgB,IAAI;AACpB,UAAM,OAAO,oBAAI,IAAoB;AAErC,YAAQ;AAAA,MACN,QAAQ;AAAA,QAAI,CAAC,MACX,MAAM,EAAE,KAAM,EAAE,aAAa,UAAgC,CAAC,EAAE,KAAK,CAAC,MAAM;AAC1E,cAAI,CAAC,EAAE,GAAI,OAAM,IAAI,MAAM,QAAQ,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE;AAC3D,iBAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE;AAAA,QACzD,CAAC;AAAA,MACH;AAAA,IACF,EAAE,KAAK,CAAC,YAAY;AAClB,UAAI,UAAU,EAAG;AACjB,YAAM,WAAqB,CAAC;AAC5B,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,WAAW,aAAa;AAC5B,eAAK,IAAI,EAAE,MAAM,MAAM,EAAE,MAAM,IAAI;AAAA,QACrC,OAAO;AACL,gBAAM,SAAS,EAAE,kBAAkB,QAAQ,EAAE,OAAO,UAAU,OAAO,EAAE,MAAM;AAC7E,mBAAS,KAAK,MAAM;AACpB,cAAI,OAAO,YAAY,aAAa;AAClC,oBAAQ,KAAK,sCAAsC,MAAM,EAAE;AAAA,UAC7D;AAAA,QACF;AAAA,MACF;AACA,kBAAY,IAAI;AAChB,mBAAa,KAAK;AAClB;AAAA,QACE,SAAS,SAAS,KAAK,KAAK,SAAS,IACjC,kBAAkB,SAAS,MAAM,kBACjC;AAAA,MACN;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AAAE,aAAO;AAAA,IAAU;AAAA,EAClC,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,QAAQH,UAAoB,MAAM;AACtC,WAAO,aAAa,IAAc,CAAC,MAAM;AACvC,UAAI,EAAE,gBAAgB;AACpB,cAAM,UAAU,SAAS,IAAI,EAAE,IAAI;AACnC,YAAI,WAAW,KAAM,QAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,QAAQ;AAElE,eAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,KAAK,EAAE,IAAK;AAAA,MACnD;AACA,UAAI,EAAE,WAAW,KAAM,QAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ;AAC/E,aAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,KAAK,EAAE,IAAK;AAAA,IACnD,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,QAAQ,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAAO,WAAW;AAAA,IAC3B,OAAO,OAAO,SAAS;AAAA,EACzB;AACF;;;AC9NA,SAAgB,aAAAI,aAAW,WAAAC,WAAS,UAAAC,SAAQ,YAAAC,YAAU,eAAAC,qBAAmB;;;ACmBlE,SAAS,QAAQ,MAAsB;AAC5C,QAAM,IAAI,KAAK,YAAY,GAAG;AAC9B,SAAO,IAAI,IAAI,KAAK,KAAK,MAAM,GAAG,CAAC;AACrC;AAGO,SAAS,SAAS,MAAsB;AAC7C,QAAM,IAAI,KAAK,YAAY,GAAG;AAC9B,SAAO,IAAI,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC;AACxC;AAaO,SAAS,gBAAgB,SAAiB,KAAqB;AACpE,QAAM,WAAW,IAAI,OAAO,MAAM;AAClC,QAAM,WAAW,YAAY,IAAI,IAAI,MAAM,GAAG,QAAQ,IAAI;AAE1D,MAAI,SAAS,WAAW,GAAG,GAAG;AAC5B,WAAO,cAAc,SAAS,MAAM,CAAC,CAAC;AAAA,EACxC;AAEA,QAAM,SAAS,UAAU,GAAG,OAAO,IAAI,QAAQ,KAAK;AACpD,SAAO,cAAc,MAAM;AAC7B;AAMO,SAAS,cAAc,MAAsB;AAClD,QAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,GAAG;AACjE,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,MAAM;AACjB,UAAI,MAAM,SAAS,EAAG,OAAM,IAAI;AAAA,IAClC,OAAO;AACL,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AASO,SAAS,cAAc,KAAsB;AAClD,MAAI,IAAI,WAAW,IAAI,EAAG,QAAO;AACjC,SAAO,wBAAwB,KAAK,GAAG;AACzC;;;AC1BO,SAAS,WAAW,OAAgC;AACzD,QAAM,EAAE,WAAW,YAAY,SAAS,MAAM,UAAU,QAAQ,IAAI;AACpE,QAAM,aAAa,MAAM,sBAAsB;AAC/C,MAAI,QAAQ,IAAI,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,UAAQ,IAAI,UAAU;AAEtB,QAAM,UAAU,QAAQ,UAAU;AAClC,MAAI,MAAM;AAIV,QAAM,IAAI;AAAA,IACR;AAAA,IACA,CAAC,OAAO,QAAgB,OAAe,cAAsB;AAC3D,YAAM,cAAc,iBAAiB,WAAW,SAAS,YAAY,SAAS,MAAM,UAAU,SAAS,UAAU;AACjH,UAAI,eAAe,KAAM,QAAO;AAChC,aAAO,GAAG,MAAM,IAAI,WAAW;AAC/B,WAAK;AAAA,IACP;AAAA,EACF;AAGA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,CAAC,OAAO,QAAgB,OAAe,cAAsB;AAC3D,YAAM,cAAc,iBAAiB,WAAW,SAAS,YAAY,SAAS,MAAM,UAAU,SAAS,UAAU;AACjH,UAAI,eAAe,KAAM,QAAO;AAChC,aAAO,GAAG,MAAM,IAAI,WAAW;AAC/B,WAAK;AAAA,IACP;AAAA,EACF;AAGA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,CAAC,OAAO,QAAgB,OAAe,WAAmB,WAAmB;AAC3E,YAAM,cAAc,iBAAiB,WAAW,SAAS,YAAY,SAAS,MAAM,UAAU,SAAS,UAAU;AACjH,UAAI,eAAe,KAAM,QAAO;AAChC,aAAO,GAAG,MAAM,IAAI,WAAW,IAAI,MAAM;AACzC,WAAK;AAAA,IACP;AAAA,EACF;AAGA,MAAI,YAAY;AACd,UAAM,mBAAmB,KAAK,UAAU;AACxC,UAAM,kBAAkB,KAAK,UAAU;AACvC,UAAM,mBAAmB,KAAK,UAAU;AACxC,UAAM,qBAAqB,KAAK,UAAU;AAAA,EAC5C;AAEA,SAAO;AACT;AAkBA,SAAS,mBAAmB,KAAa,cAA8B;AACrE,SAAO,YAAY,KAAK,UAAU,CAAC,SAAS;AAC1C,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,oBAAoB,OAAO,EAAG,QAAO;AACzC,WAAO,mBAAmB,IAAI,KAAK,KAAK,UAAU,YAAY,CAAC;AAAA,EACjE,CAAC;AACH;AASA,SAAS,kBAAkB,KAAa,cAA8B;AACpE,SAAO,qBAAqB,KAAK,cAAc,cAAc,QAAQ;AACvE;AAMA,SAAS,mBAAmB,KAAa,cAA8B;AACrE,SAAO,qBAAqB,KAAK,qBAAqB,cAAc,QAAQ;AAC9E;AAYA,SAAS,qBACP,KACA,UACA,cACA,iBACQ;AACR,MAAI,MAAM;AACV,MAAI,IAAI;AACR,QAAM,KAAK,IAAI,OAAO,SAAS,QAAQ,SAAS,MAAM,SAAS,GAAG,IAAI,SAAS,QAAQ,SAAS,QAAQ,GAAG;AAC3G,KAAG,YAAY;AACf,MAAI;AACJ,UAAQ,IAAI,GAAG,KAAK,GAAG,OAAO,MAAM;AAClC,UAAM,MAAM,EAAE;AACd,QAAI,MAAM,GAAG;AAEX,SAAG,YAAY,MAAM,EAAE,CAAC,EAAE;AAC1B;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI;AAC7C,QAAI,SAAS,OAAO,SAAS,IAAiC;AAC9D,UAAM,QAAQ,IAAI,OAAO,MAAM,EAAE,CAAC,EAAE,MAAM;AAC1C,QAAI,SAAS,gBAAgB,KAAK,KAAK,EAAG;AAC1C,UAAM,WAAW,eAAe,KAAK,MAAM,EAAE,CAAC,EAAE,MAAM;AACtD,QAAI,IAAI,OAAO,QAAQ,MAAM,IAAK;AAClC,UAAM,SAAS,aAAa,KAAK,QAAQ;AACzC,QAAI,CAAC,OAAQ;AACb,UAAM,OAAO,OAAO;AACpB,UAAM,QAAQ,mBAAmB,MAAM,CAAC;AACxC,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,4BAA4B,IAAI,EAAG;AAGvC,UAAM,UAAU,MAAM,SAAS,IAAI,KAAK,MAAM,QAAQ,MAAM,IAAI;AAChE,WAAO,IAAI,MAAM,GAAG,GAAG;AACvB,WAAO,EAAE,CAAC;AACV,WAAO;AACP,WAAO;AACP,WAAO;AACP,WAAO,KAAK,UAAU,YAAY;AAClC,WAAO;AACP,WAAO;AACP,WAAO;AACP,QAAI,OAAO;AACX,OAAG,YAAY,OAAO;AAAA,EACxB;AACA,SAAO,IAAI,MAAM,CAAC;AAClB,SAAO;AACT;AAYA,SAAS,qBAAqB,KAAa,cAA8B;AACvE,SAAO,IAAI;AAAA,IACT;AAAA,IACA,CAAC,MAAM,SAAiB;AACtB,YAAM,UAAU,KAAK,KAAK;AAE1B,UAAI,gBAAgB,OAAO,MAAM,EAAG,QAAO;AAC3C,aAAO,2BAA2B,OAAO,KAAK,KAAK,UAAU,YAAY,CAAC;AAAA,IAC5E;AAAA,EACF;AACF;AAIA,SAAS,oBAAoB,GAAoB;AAC/C,MAAI,EAAE,SAAS,EAAG,QAAO;AACzB,QAAM,IAAI,EAAE,OAAO,CAAC;AACpB,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,MAAI,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAG,QAAO;AAEzC,WAAS,IAAI,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK;AACrC,UAAM,IAAI,EAAE,OAAO,CAAC;AACpB,QAAI,MAAM,MAAM;AAAE;AAAK;AAAA,IAAS;AAChC,QAAI,MAAM,EAAG,QAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,GAAoB;AACvD,MAAI,CAAC,oBAAoB,CAAC,EAAG,QAAO;AACpC,QAAM,QAAQ,EAAE,MAAM,GAAG,EAAE;AAC3B,SAAO,6CAA6C,KAAK,KAAK;AAChE;AAUA,SAAS,YACP,KACA,SACAC,YACQ;AACR,QAAM,OAAO,QAAQ;AACrB,MAAI,MAAM;AACV,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,QAAQ;AACrB,UAAM,MAAM,eAAe,KAAK,SAAS,CAAC;AAC1C,QAAI,MAAM,GAAG;AACX,aAAO,IAAI,MAAM,CAAC;AAClB;AAAA,IACF;AACA,UAAM,WAAW,eAAe,KAAK,MAAM,IAAI;AAC/C,QAAI,IAAI,OAAO,QAAQ,MAAM,KAAK;AAChC,aAAO,IAAI,MAAM,GAAG,MAAM,IAAI;AAC9B,UAAI,MAAM;AACV;AAAA,IACF;AACA,UAAM,SAAS,aAAa,KAAK,QAAQ;AACzC,QAAI,CAAC,QAAQ;AACX,aAAO,IAAI,MAAM,CAAC;AAClB;AAAA,IACF;AACA,UAAM,cAAcA,WAAU,OAAO,IAAI;AACzC,QAAI,eAAe,MAAM;AACvB,aAAO,IAAI,MAAM,GAAG,OAAO,YAAY;AACvC,UAAI,OAAO;AACX;AAAA,IACF;AACA,WAAO,IAAI,MAAM,GAAG,MAAM,IAAI;AAC9B,WAAO;AACP,WAAO;AACP,WAAO;AACP,QAAI,OAAO;AAAA,EACb;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,SAAiB,MAAsB;AAC1E,MAAI,MAAM;AACV,SAAO,MAAM;AACX,UAAM,KAAK,IAAI,QAAQ,SAAS,GAAG;AACnC,QAAI,KAAK,EAAG,QAAO;AACnB,UAAM,OAAO,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC;AAC9C,UAAM,OAAO,IAAI,OAAO,KAAK,QAAQ,MAAM;AAC3C,UAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,KAAK,IAAI;AAC3C,UAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI;AAC1C,QAAI,UAAU,OAAQ,QAAO;AAC7B,UAAM,KAAK,QAAQ;AAAA,EACrB;AACF;AAEA,SAAS,eAAe,KAAa,MAAsB;AACzD,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,UAAU,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,EAAG;AACnD,SAAO;AACT;AAcO,SAAS,aAAa,KAAa,YAAqC;AAC7E,MAAI,IAAI,OAAO,UAAU,MAAM,IAAK,QAAO;AAC3C,MAAI,QAAQ;AACZ,MAAI,IAAI,aAAa;AAErB,MAAI,OAAO;AAEX,MAAI,oBAAoB;AACxB,SAAO,IAAI,IAAI,QAAQ;AACrB,UAAM,IAAI,IAAI,OAAO,CAAC;AACtB,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;AAC1C,cAAM,KAAK,IAAI,QAAQ,MAAM,CAAC;AAC9B,YAAI,KAAK,EAAG,QAAO;AACnB,YAAI,KAAK;AACT;AAAA,MACF;AACA,UAAI,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;AAC1C,cAAM,QAAQ,IAAI,QAAQ,MAAM,IAAI,CAAC;AACrC,YAAI,QAAQ,EAAG,QAAO;AACtB,YAAI,QAAQ;AACZ;AAAA,MACF;AACA,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC,UAAI,MAAM,KAAK;AAAE;AAAS;AAAK;AAAA,MAAS;AACxC,UAAI,MAAM,KAAK;AACb;AACA,YAAI,UAAU,GAAG;AACf,iBAAO,EAAE,MAAM,IAAI,MAAM,aAAa,GAAG,CAAC,GAAG,cAAc,IAAI,EAAE;AAAA,QACnE;AACA;AACA;AAAA,MACF;AACA;AACA;AAAA,IACF;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE,aAAK;AAAG;AAAA,MAAS;AACnC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC;AACA;AAAA,IACF;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE,aAAK;AAAG;AAAA,MAAS;AACnC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC;AACA;AAAA,IACF;AAEA,QAAI,MAAM,MAAM;AAAE,WAAK;AAAG;AAAA,IAAS;AACnC,QAAI,MAAM,KAAK;AAAE,aAAO;AAAG;AAAK;AAAA,IAAS;AACzC,QAAI,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;AAC1C;AACA,aAAO;AACP,WAAK;AAEL,YAAM,MAAM,cAAc,KAAK,CAAC;AAChC,UAAI,CAAC,IAAK,QAAO;AACjB,UAAI;AACJ,aAAO;AACP;AACA;AAAA,IACF;AACA;AAAA,EACF;AACA,OAAK;AACL,SAAO;AACT;AAOA,SAAS,cAAc,KAAa,MAA6B;AAC/D,MAAI,QAAQ;AACZ,MAAI,IAAI;AACR,MAAI,OAAO;AACX,SAAO,IAAI,IAAI,QAAQ;AACrB,UAAM,IAAI,IAAI,OAAO,CAAC;AACtB,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;AAC1C,cAAM,KAAK,IAAI,QAAQ,MAAM,CAAC;AAC9B,YAAI,KAAK,EAAG,QAAO;AACnB,YAAI,KAAK;AACT;AAAA,MACF;AACA,UAAI,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;AAC1C,cAAM,QAAQ,IAAI,QAAQ,MAAM,IAAI,CAAC;AACrC,YAAI,QAAQ,EAAG,QAAO;AACtB,YAAI,QAAQ;AACZ;AAAA,MACF;AACA,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC,UAAI,MAAM,KAAK;AAAE;AAAS;AAAK;AAAA,MAAS;AACxC,UAAI,MAAM,KAAK;AAAE;AAAS,YAAI,UAAU,EAAG,QAAO,IAAI;AAAG;AAAK;AAAA,MAAS;AACvE;AAAK;AAAA,IACP;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE,aAAK;AAAG;AAAA,MAAS;AACnC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC;AAAK;AAAA,IACP;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE,aAAK;AAAG;AAAA,MAAS;AACnC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAK;AAAA,MAAS;AACzC;AAAK;AAAA,IACP;AACA,QAAI,MAAM,MAAM;AAAE,WAAK;AAAG;AAAA,IAAS;AACnC,QAAI,MAAM,KAAK;AAAE,aAAO;AAAG;AAAK;AAAA,IAAS;AACzC,QAAI,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;AAC1C,YAAM,MAAM,cAAc,KAAK,IAAI,CAAC;AACpC,UAAI,OAAO,KAAM,QAAO;AACxB,UAAI;AAAK;AAAA,IACX;AACA;AAAA,EACF;AACA,SAAO;AACT;AAUA,SAAS,mBAAmB,KAAa,QAAgB,OAAO,kBAA4B;AAC1F,QAAM,MAAgB,CAAC;AACvB,MAAI,QAAQ;AACZ,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,IAAI,IAAI,OAAO,CAAC;AACtB,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAA,MAAS;AACpC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAA,MAAS;AACpC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAA,MAAS;AACpC,UAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AAAE;AAAS;AAAA,MAAS;AAC7D,UAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AAAE;AAAS;AAAA,MAAS;AAC7D,UAAI,MAAM,OAAO,UAAU,KAAK,IAAI,SAAS,OAAO;AAClD,YAAI,KAAK,IAAI,MAAM,OAAO,CAAC,CAAC;AAC5B,gBAAQ,IAAI;AAAA,MACd;AACA;AAAA,IACF;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE;AAAK;AAAA,MAAS;AAChC,UAAI,MAAM,IAAK,QAAO;AACtB;AAAA,IACF;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE;AAAK;AAAA,MAAS;AAChC,UAAI,MAAM,IAAK,QAAO;AACtB;AAAA,IACF;AACA,QAAI,MAAM,MAAM;AAAE;AAAK;AAAA,IAAS;AAChC,QAAI,MAAM,KAAK;AAAE,aAAO;AAAG;AAAA,IAAS;AAAA,EACtC;AACA,MAAI,KAAK,IAAI,MAAM,KAAK,CAAC;AACzB,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAmB;AAC1C,MAAI,QAAQ;AACZ,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,UAAM,IAAI,EAAE,OAAO,CAAC;AACpB,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAA,MAAS;AACpC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAA,MAAS;AACpC,UAAI,MAAM,KAAK;AAAE,eAAO;AAAG;AAAA,MAAS;AACpC,UAAI,MAAM,OAAO,MAAM,OAAO,MAAM,IAAK;AAAA,eAChC,MAAM,OAAO,MAAM,OAAO,MAAM,IAAK;AAC9C;AAAA,IACF;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE;AAAK;AAAA,MAAS;AAChC,UAAI,MAAM,IAAK,QAAO;AACtB;AAAA,IACF;AACA,QAAI,SAAS,GAAG;AACd,UAAI,MAAM,MAAM;AAAE;AAAK;AAAA,MAAS;AAChC,UAAI,MAAM,IAAK,QAAO;AACtB;AAAA,IACF;AACA,QAAI,MAAM,MAAM;AAAE;AAAK;AAAA,IAAS;AAChC,QAAI,MAAM,KAAK;AAAE,aAAO;AAAG;AAAA,IAAS;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,iBACP,WACA,SACA,eACA,SACA,MACA,UACA,SACA,YACe;AACf,MAAI,cAAc,SAAS,KAAK,UAAU,WAAW,OAAO,KAAK,UAAU,WAAW,OAAO,GAAG;AAC9F,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,WAAW,GAAG,KAAK,CAAC,UAAU,WAAW,GAAG,GAAG;AAC5D,aAAS;AAAA,MACP,uBAAuB,SAAS,QAAQ,aAAa;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AACA,QAAMC,YAAW,gBAAgB,SAAS,SAAS;AACnD,QAAM,OAAO,QAAQ,IAAIA,SAAQ;AACjC,MAAI,CAAC,MAAM;AACT,aAAS,KAAK,eAAe,SAAS,QAAQ,aAAa,yBAAyBA,SAAQ,GAAG;AAC/F,WAAO;AAAA,EACT;AAIA,MACE,KAAK,WAAW,SACfA,UAAS,SAAS,KAAK,KAAKA,UAAS,SAAS,MAAM,KAAKA,UAAS,SAAS,MAAM,IAClF;AACA,QAAI,CAAC,QAAQ,IAAIA,SAAQ,GAAG;AAC1B,YAAM,YAAY,WAAW;AAAA,QAC3B,WAAW,KAAK;AAAA,QAChB,YAAYA;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBAAmB;AAAA,MACrB,CAAC;AACD,UAAI,cAAc,KAAK,SAAS;AAC9B,eAAO,KAAK,QAAQ,MAAM,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,IAAI,IAAI;AACtB;;;ACviBO,SAAS,YAAY,OAAiC;AAC3D,QAAM,EAAE,UAAU,WAAW,SAAS,cAAc,oBAAoB,UAAU,SAAS,IAAI;AAC/F,QAAM,WAAW,QAAQ,SAAS;AAElC,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,UAAU;AAAA,EACzB,QAAQ;AACN,aAAS,KAAK,2CAA2C;AACzD,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,gBAAgB,UAAU,WAAW;AAAA,EACpD,SAAS,GAAG;AACV,aAAS,KAAK,sBAAuB,EAAY,OAAO,iBAAiB;AACzE,WAAO;AAAA,EACT;AAGA,aAAW,QAAQ,MAAM,KAAK,IAAI,iBAAiB,+BAA+B,CAAC,GAAG;AACpF,UAAM,OAAO,KAAK,aAAa,MAAM;AACrC,QAAI,cAAc,IAAI,KAAK,KAAK,WAAW,OAAO,EAAG;AACrD,UAAMC,YAAW,gBAAgB,UAAU,IAAI;AAC/C,UAAM,OAAO,QAAQ,IAAIA,SAAQ;AACjC,QAAI,CAAC,MAAM;AACT,eAAS,KAAK,eAAe,IAAI,2BAA2BA,SAAQ,GAAG;AACvE;AAAA,IACF;AACA,QAAI,KAAK,WAAW,MAAM;AAKxB,UAAI,KAAK,KAAK;AACZ,aAAK,aAAa,QAAQ,KAAK,GAAG;AAClC,iBAAS,KAAK,eAAe,IAAI,oCAAoCA,SAAQ,EAAE;AAAA,MACjF,OAAO;AACL,iBAAS,KAAK,eAAe,IAAI,uCAAuCA,SAAQ,GAAG;AAAA,MACrF;AACA;AAAA,IACF;AACA,UAAM,eAAe,aAAa,KAAK,SAASA,SAAQ;AACxD,UAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,MAAO,OAAM,aAAa,SAAS,KAAK;AAC5C,UAAM,aAAa,aAAaA,SAAQ;AACxC,UAAM,cAAc;AACpB,SAAK,YAAY,KAAK;AAAA,EACxB;AAGA,aAAW,UAAU,MAAM,KAAK,IAAI,iBAAiB,aAAa,CAAC,GAAG;AACpE,UAAM,MAAM,OAAO,aAAa,KAAK;AACrC,QAAI,cAAc,GAAG,KAAK,IAAI,WAAW,OAAO,EAAG;AACnD,UAAMA,YAAW,gBAAgB,UAAU,GAAG;AAC9C,UAAM,OAAO,QAAQ,IAAIA,SAAQ;AACjC,QAAI,CAAC,MAAM;AACT,eAAS,KAAK,gBAAgB,GAAG,2BAA2BA,SAAQ,GAAG;AACvE;AAAA,IACF;AACA,QAAI,KAAK,WAAW,MAAM;AACxB,UAAI,KAAK,KAAK;AACZ,eAAO,aAAa,OAAO,KAAK,GAAG;AACnC,iBAAS,KAAK,gBAAgB,GAAG,oCAAoCA,SAAQ,EAAE;AAAA,MACjF,OAAO;AACL,iBAAS,KAAK,gBAAgB,GAAG,uCAAuCA,SAAQ,GAAG;AAAA,MACrF;AACA;AAAA,IACF;AACA,UAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,UAAM,OAAO,OAAO,aAAa,MAAM;AACvC,QAAI,KAAM,QAAO,aAAa,QAAQ,IAAI;AAC1C,WAAO,aAAa,aAAaA,SAAQ;AACzC,WAAO,cAAc,KAAK,WAAW;AAKrC,SAAK;AACL,WAAO,YAAY,MAAM;AAAA,EAC3B;AAGA,aAAW,MAAM,MAAM,KAAK,IAAI,iBAAiB,4CAA4C,CAAC,GAAG;AAC/F,oBAAgB,IAAI,OAAO,EAAE,UAAU,SAAS,UAAU,SAAS,CAAC;AAAA,EACtE;AAGA,aAAW,MAAM,MAAM,KAAK,IAAI,iBAAiB,4BAA4B,CAAC,GAAG;AAC/E,UAAM,SAAS,GAAG,aAAa,QAAQ;AACvC,UAAM,YAAY,OACf,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,MAAM,QAAQ,OAAO,IAAI;AAC/B,YAAM,MAAM,QAAQ,KAAK,UAAU,QAAQ,MAAM,GAAG,GAAG;AACvD,YAAM,aAAa,QAAQ,KAAK,KAAK,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK;AACjE,UAAI,CAAC,OAAO,cAAc,GAAG,KAAK,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,GAAG;AACpF,eAAO;AAAA,MACT;AACA,YAAMA,YAAW,gBAAgB,UAAU,GAAG;AAC9C,YAAM,OAAO,QAAQ,IAAIA,SAAQ;AACjC,UAAI,CAAC,MAAM;AACT,iBAAS,KAAK,iBAAiB,GAAG,0BAA0BA,SAAQ,GAAG;AACvE,eAAO;AAAA,MACT;AACA,YAAM,IAAI,KAAK,OAAO,cAAc,MAAM,QAAQ;AAClD,aAAO,aAAa,GAAG,CAAC,IAAI,UAAU,KAAK;AAAA,IAC7C,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,IAAI;AACZ,OAAG,aAAa,UAAU,SAAS;AAAA,EACrC;AAGA,aAAW,UAAU,MAAM,KAAK,IAAI,iBAAiB,aAAa,CAAC,GAAG;AACpE,UAAM,MAAM,OAAO,aAAa,KAAK;AACrC,QAAI,cAAc,GAAG,KAAK,IAAI,WAAW,OAAO,EAAG;AACnD,UAAMA,YAAW,gBAAgB,UAAU,GAAG;AAC9C,UAAM,OAAO,QAAQ,IAAIA,SAAQ;AACjC,QAAI,CAAC,MAAM,SAAS;AAClB,eAAS,KAAK,gBAAgB,GAAG,2BAA2BA,SAAQ,GAAG;AACvE;AAAA,IACF;AACA,UAAM,SAAS,YAAY;AAAA,MACzB,GAAG;AAAA,MACH,UAAU,KAAK;AAAA,MACf,WAAWA;AAAA,IACb,CAAC;AACD,WAAO,gBAAgB,KAAK;AAC5B,WAAO,aAAa,UAAU,MAAM;AAAA,EACtC;AAGA,aAAW,QAAQ,MAAM;AAAA,IACvB,IAAI;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AACD,oBAAgB,MAAM,QAAQ,EAAE,UAAU,SAAS,UAAU,SAAS,CAAC;AAAA,EACzE;AAEA,SAAO,sBAAsB,IAAI,gBAAgB;AACnD;AASA,SAAS,gBAAgB,IAAa,MAAc,KAAqB;AACvE,QAAM,QAAQ,GAAG,aAAa,IAAI;AAClC,MAAI,CAAC,MAAO;AACZ,MAAI,cAAc,KAAK,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW,OAAO,EAAG;AACpF,QAAMA,YAAW,gBAAgB,IAAI,UAAU,KAAK;AACpD,QAAM,OAAO,IAAI,QAAQ,IAAIA,SAAQ;AACrC,MAAI,CAAC,MAAM;AACT,QAAI,SAAS,KAAK,IAAI,GAAG,QAAQ,YAAY,CAAC,IAAI,IAAI,KAAK,KAAK,2BAA2BA,SAAQ,GAAG;AACtG;AAAA,EACF;AACA,QAAM,MAAM,KAAK,OAAO,cAAc,MAAM,IAAI,QAAQ;AACxD,KAAG,aAAa,MAAM,GAAG;AAC3B;AAEA,SAAS,cAAc,MAAgB,MAAwB;AAC7D,MAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,OAAO,KAAK,WAAW;AAC7B,QAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC;AACtC,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,OAAK,KAAK,GAAG;AACb,SAAO;AACT;AA6BO,SAAS,kBAAkB,OAAuC;AACvE,QAAM,EAAE,UAAU,WAAW,SAAS,MAAM,SAAS,IAAI;AACzD,QAAM,oBAAoB,MAAM,sBAAsB;AACtD,QAAM,WAAW,QAAQ,SAAS;AAElC,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,UAAU;AAAA,EACzB,QAAQ;AACN,aAAS,KAAK,2CAA2C;AACzD,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,gBAAgB,UAAU,WAAW;AAAA,EACpD,SAAS,GAAG;AACV,aAAS,KAAK,sBAAuB,EAAY,OAAO,iBAAiB;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,IAAa,SAAuB;AACpD,UAAM,QAAQ,GAAG,aAAa,IAAI;AAClC,QAAI,CAAC,MAAO;AACZ,QAAI,cAAc,KAAK,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW,OAAO,EAAG;AACpF,UAAMA,YAAW,gBAAgB,UAAU,KAAK;AAChD,UAAM,OAAO,QAAQ,IAAIA,SAAQ;AACjC,QAAI,CAAC,MAAM;AACT,eAAS,KAAK,IAAI,GAAG,QAAQ,YAAY,CAAC,IAAI,IAAI,KAAK,KAAK,2BAA2BA,SAAQ,GAAG;AAClG;AAAA,IACF;AACA,OAAG,aAAa,MAAM,KAAK,IAAI,IAAI,CAAC;AAAA,EACtC;AAEA,aAAW,QAAQ,MAAM,KAAK,IAAI,iBAAiB,+BAA+B,CAAC,GAAG;AACpF,aAAS,MAAM,MAAM;AAAA,EACvB;AACA,aAAW,UAAU,MAAM,KAAK,IAAI,iBAAiB,aAAa,CAAC,GAAG;AACpE,aAAS,QAAQ,KAAK;AAAA,EACxB;AACA,aAAW,MAAM,MAAM,KAAK,IAAI,iBAAiB,wDAAwD,CAAC,GAAG;AAC3G,aAAS,IAAI,KAAK;AAAA,EACpB;AACA,aAAW,QAAQ,MAAM;AAAA,IACvB,IAAI;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AACD,aAAS,MAAM,MAAM;AAAA,EACvB;AAGA,aAAW,MAAM,MAAM,KAAK,IAAI,iBAAiB,4BAA4B,CAAC,GAAG;AAC/E,UAAM,SAAS,GAAG,aAAa,QAAQ;AACvC,UAAM,YAAY,OACf,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,MAAM,QAAQ,OAAO,IAAI;AAC/B,YAAM,MAAM,QAAQ,KAAK,UAAU,QAAQ,MAAM,GAAG,GAAG;AACvD,YAAM,aAAa,QAAQ,KAAK,KAAK,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK;AACjE,UAAI,CAAC,OAAO,cAAc,GAAG,KAAK,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,GAAG;AACpF,eAAO;AAAA,MACT;AACA,YAAMA,YAAW,gBAAgB,UAAU,GAAG;AAC9C,YAAM,OAAO,QAAQ,IAAIA,SAAQ;AACjC,UAAI,CAAC,MAAM;AACT,iBAAS,KAAK,iBAAiB,GAAG,0BAA0BA,SAAQ,GAAG;AACvE,eAAO;AAAA,MACT;AACA,YAAM,IAAI,KAAK,IAAI,IAAI;AACvB,aAAO,aAAa,GAAG,CAAC,IAAI,UAAU,KAAK;AAAA,IAC7C,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,IAAI;AACZ,OAAG,aAAa,UAAU,SAAS;AAAA,EACrC;AAGA,aAAW,UAAU,MAAM,KAAK,IAAI,iBAAiB,kCAAkC,CAAC,GAAG;AACzF,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,KAAM;AACX,WAAO,cAAc,WAAW;AAAA,MAC9B,WAAW;AAAA,MACX,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,oBAAI,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,sBAAsB,IAAI,gBAAgB;AACnD;;;AC9SO,SAAS,WAAW,OAAgC;AACzD,SAAO,YAAY,OAAO,oBAAI,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC;AACxD;AAEA,SAAS,YAAY,OAAwB,SAA8B;AACzE,QAAM,SAAS,QAAQ,MAAM,WAAW;AACxC,MAAI,MAAM,MAAM;AAShB,QAAM,IAAI;AAAA,IACR;AAAA,IACA,CAAC,OAAO,QAAQ,QAAQ,eAAe;AACrC,YAAM,MAAO,OAAkB,KAAK;AACpC,UAAI,cAAc,GAAG,KAAK,IAAI,WAAW,OAAO,EAAG,QAAO;AAC1D,YAAMC,YAAW,gBAAgB,QAAQ,GAAG;AAC5C,YAAM,OAAO,MAAM,QAAQ,IAAIA,SAAQ;AACvC,UAAI,CAAC,MAAM,WAAW,CAAC,MAAM,KAAK;AAChC,cAAM,SAAS,KAAK,gBAAgB,GAAG,kBAAkB,MAAM,WAAW,eAAeA,SAAQ,GAAG;AACpG,eAAO;AAAA,MACT;AACA,UAAI,QAAQ,IAAIA,SAAQ,GAAG;AACzB,cAAM,SAAS,KAAK,iCAAiCA,SAAQ,EAAE;AAC/D,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,KAAK,SAAS,UAAU,KAAK,MAAM;AACrD,UAAI,MAAM,SAAS,UAAU,YAAY,CAAC,KAAK,SAAS;AACtD,cAAM,KAAK,KAAK,OAAOC,eAAc,MAAM,MAAM,QAAQ;AACzD,cAAMC,MAAM,WAAsB,KAAK;AACvC,eAAOA,MAAK,gBAAgB,EAAE,MAAMA,GAAE,MAAM,gBAAgB,EAAE;AAAA,MAChE;AAGA,YAAM,eAAe,IAAI,IAAI,OAAO;AACpC,mBAAa,IAAIF,SAAQ;AACzB,YAAM,YAAY;AAAA,QAChB,EAAE,GAAG,OAAO,KAAK,KAAK,SAAS,aAAaA,UAAS;AAAA,QACrD;AAAA,MACF;AACA,YAAM,KAAM,WAAsB,KAAK;AACvC,aAAO,KAAK,UAAU,EAAE,MAAM,SAAS,OAAO;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,CAAC,OAAO,QAAQ,WAAW;AACzB,YAAM,MAAO,OAAkB,KAAK;AACpC,UAAI,cAAc,GAAG,KAAK,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,EAAG,QAAO;AACrF,UAAI,IAAI,WAAW,GAAG,EAAG,QAAO;AAChC,YAAMA,YAAW,gBAAgB,QAAQ,GAAG;AAC5C,YAAM,OAAO,MAAM,QAAQ,IAAIA,SAAQ;AACvC,UAAI,CAAC,MAAM;AACT,cAAM,SAAS,KAAK,YAAY,GAAG,mBAAmB,MAAM,WAAW,eAAeA,SAAQ,GAAG;AACjG,eAAO;AAAA,MACT;AACA,YAAM,IAAI,KAAK,OAAOC,eAAc,MAAM,MAAM,QAAQ;AACxD,aAAO,QAAQ,CAAC;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASA,eAAc,MAAgB,MAAwB;AAC7D,MAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,QAAM,OAAO,IAAI,KAAK,CAAC,KAAK,WAAW,EAAE,GAAG,EAAE,MAAM,KAAK,QAAQ,2BAA2B,CAAC;AAC7F,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,OAAK,KAAK,GAAG;AACb,SAAO;AACT;;;AC/EO,SAAS,oBAAoB,OAAkD;AACpF,QAAM,WAAqB,CAAC;AAC5B,QAAM,WAAqB,CAAC;AAE5B,QAAM,UAAU,IAAI,IAAsB,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7E,QAAM,OAAO,YAAY;AAAA,IACvB,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,cAAc,CAAC,SAAS,gBACtB,WAAW;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,oBAAoB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,oBAAoB,MAAM;AAAA,IAC1B;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,EAAE,MAAM,UAAU,SAAS;AACpC;;;ACnCO,IAAM,cAAN,MAAkB;AAAA,EACf,OAAO,oBAAI,IAAoB;AAAA,EAC/B,YAAY;AAAA,EACZ,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,IAAI,MAAwB;AAC1B,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AACA,QAAI,KAAK,IAAK,QAAO,KAAK;AAC1B,UAAM,SAAS,KAAK,KAAK,IAAI,KAAK,IAAI;AACtC,QAAI,OAAQ,QAAO;AACnB,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC;AACzC,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,SAAK,KAAK,IAAI,KAAK,MAAM,GAAG;AAC5B,SAAK,aAAa,QAAQ;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,MAAgB,YAA4B;AAClD,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,UAAM,MAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AACnC,QAAI,KAAK;AACP,UAAI,gBAAgB,GAAG;AACvB,WAAK,KAAK,OAAO,KAAK,IAAI;AAC1B,WAAK,aAAa,KAAK,SAAS,UAAU;AAAA,IAC5C;AACA,WAAO,KAAK,IAAI,EAAE,GAAG,MAAM,SAAS,YAAY,KAAK,OAAU,CAAC;AAAA,EAClE;AAAA;AAAA,EAGA,OAAe;AACb,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,QAAgB;AACd,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,UAAgB;AACd,QAAI,KAAK,SAAU;AACnB,eAAW,OAAO,KAAK,KAAK,OAAO,GAAG;AACpC,UAAI,gBAAgB,GAAG;AAAA,IACzB;AACA,SAAK,KAAK,MAAM;AAChB,SAAK,YAAY;AACjB,SAAK,WAAW;AAAA,EAClB;AACF;;;ACpEO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBhC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqB3B,IAAM,iBAAiB,0BAA0B;AAOjD,IAAM,qBAAqB,eAC/B,QAAQ,cAAc,EAAE,EACxB,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,uBAAuB,IAAI;;;ACjB/B,SAAS,uBAAuB,OAA+B;AACpE,QAAM,SAAS,KAAK,UAAU,MAAM,QAAQ;AAC5C,QAAM,eAAe,KAAK,UAAU,MAAM,YAAY,EAAE;AACxD,QAAM,eAAe,MAAM,iBAAiB;AAC5C,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA,iCAIkB,MAAM;AAAA,oBACnB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgD9B,eACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgCA,EACN;AAAA;AAAA;AAAA;AAIE,SAAO,6BAA6B,IAAI;AAC1C;AASO,SAAS,kBACd,OACA,SACA,YACA,WACwB;AACxB,QAAME,YAAmC,CAAC;AAC1C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,UAAW;AAC1B,UAAM,MAAM,QAAQ,IAAI,EAAE,IAAI,KAAK;AACnC,QAAI,IAAI,KAAK;AACX,MAAAA,UAAS,EAAE,IAAI,IAAI,IAAI;AACvB;AAAA,IACF;AACA,QAAI,IAAI,WAAW,KAAM;AACzB,UAAM,MAAM,WAAW,GAAG;AAC1B,QAAI,IAAK,CAAAA,UAAS,EAAE,IAAI,IAAI;AAAA,EAC9B;AACA,SAAOA;AACT;;;AChHO,SAAS,kBAAkB,OAA8C;AAC9E,QAAM,OAAO,IAAI,YAAY;AAC7B,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAa,MAAM,gBAAgB;AAGzC,QAAM,UAAU,IAAI,IAAsB,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAG7E,aAAW,QAAQ,MAAM,OAAO;AAC9B,QAAI,KAAK,SAAS,MAAM,UAAW;AACnC,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,CAAC,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM,EAAG;AAC/C,UAAM,SAAS,WAAW;AAAA,MACxB,KAAK,KAAK;AAAA,MACV,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,MACN,oBAAoB,OAAO;AAAA,MAC3B,UAAU,CAAC;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,KAAK,MAAM,EAAE,GAAG,MAAM,SAAS,OAAO,CAAC;AAAA,EACrD;AAKA,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,QAAQ,MAAM,OAAO;AAC9B,QAAI,KAAK,SAAS,MAAM,UAAW;AACnC,QAAI,CAAC,KAAK,QAAS;AACnB,UAAM,QAAQ,KAAK,KAAK,YAAY;AACpC,QAAI,CAAC,MAAM,SAAS,KAAK,KAAK,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC,MAAM,SAAS,MAAM,EAAG;AAClF,QAAI,QAAQ,IAAI,KAAK,IAAI,EAAG;AAC5B,UAAM,UAAU,QAAQ,IAAI,KAAK,IAAI,KAAK;AAC1C,UAAM,YAAY,WAAW;AAAA,MAC3B,WAAW,QAAQ,WAAW;AAAA,MAC9B,YAAY,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,IACrB,CAAC;AACD,QAAI,cAAc,QAAQ,SAAS;AACjC,cAAQ,IAAI,KAAK,MAAM,EAAE,GAAG,SAAS,SAAS,UAAU,CAAC;AAAA,IAC3D;AAAA,EACF;AAMA,aAAW,QAAQ,MAAM,OAAO;AAC9B,QAAI,KAAK,SAAS,MAAM,UAAW;AACnC,UAAM,MAAM,QAAQ,IAAI,KAAK,IAAI,KAAK;AACtC,QAAI,IAAI,IAAK;AACb,QAAI,IAAI,WAAW,KAAM;AACzB,SAAK,IAAI,GAAG;AAAA,EACd;AAGA,QAAM,gBAAgB,kBAAkB;AAAA,IACtC,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB,CAAC;AAGD,MAAI,WAAW;AACf,MAAI,YAAY;AACd,UAAMC,YAAW,kBAAkB,MAAM,OAAO,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,SAAS;AAC5F,UAAM,OAAO,uBAAuB;AAAA,MAClC,UAAAA;AAAA,MACA,UAAU,QAAQ,MAAM,SAAS;AAAA,MACjC,cAAc;AAAA,IAChB,CAAC;AACD,eAAW,gBAAgB,eAAe,IAAI;AAAA,EAChD;AAGA,QAAM,QAAQ,WAAW;AAGzB,QAAM,YAAsB;AAAA,IAC1B,MAAM,MAAM;AAAA,IACZ,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACA,QAAM,UAAU,KAAK,IAAI,SAAS;AAElC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAcA,SAAS,gBAAgB,MAAc,MAAsB;AAE3D,QAAM,OAAO,KAAK,MAAM,gBAAgB;AACxC,MAAI,MAAM;AACR,UAAM,MAAM,KAAK,QAAS,KAAK,CAAC,EAAE;AAClC,WAAO,KAAK,MAAM,GAAG,GAAG,IAAI,OAAO,KAAK,MAAM,GAAG;AAAA,EACnD;AACA,QAAM,WAAW,KAAK,MAAM,gBAAgB;AAC5C,MAAI,UAAU;AACZ,UAAM,MAAM,SAAS,QAAS,SAAS,CAAC,EAAE;AAC1C,WAAO,KAAK,MAAM,GAAG,GAAG,IAAI,OAAO,KAAK,MAAM,GAAG;AAAA,EACnD;AACA,QAAM,WAAW,KAAK,MAAM,gBAAgB;AAC5C,MAAI,UAAU;AACZ,UAAM,MAAM,SAAS,QAAS,SAAS,CAAC,EAAE;AAC1C,WAAO,KAAK,MAAM,GAAG,GAAG,IAAI,WAAW,OAAO,YAAY,KAAK,MAAM,GAAG;AAAA,EAC1E;AACA,SAAO,OAAO;AAChB;;;AC7JA,SAAS,YAAY,MAAuB;AAC1C,QAAM,QAAQ,KAAK,YAAY;AAC/B,SACE,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,OAAO,KACtB,MAAM,SAAS,MAAM;AAEzB;AAGO,SAAS,0BACd,UACA,OACiB;AACjB,QAAM,WAAW,oBAAI,IAAqB;AAE1C,MAAI,6CAA6C,KAAK,QAAQ,GAAG;AAC/D,aAAS,IAAI,mBAAmB;AAAA,EAClC;AACA,aAAW,UAAU,QAAQ;AAE7B,aAAW,KAAK,OAAO;AACrB,QAAI,CAAC,EAAE,QAAS;AAChB,QAAI,CAAC,YAAY,EAAE,IAAI,EAAG;AAC1B,eAAW,EAAE,SAAS,QAAQ;AAAA,EAChC;AAEA,QAAM,cAAwB,CAAC;AAC/B,MAAI,WAA8B;AAElC,MACE,SAAS,IAAI,mBAAmB,KAChC,SAAS,IAAI,mBAAmB,KAChC,SAAS,IAAI,oBAAoB,KACjC,SAAS,IAAI,qBAAqB,GAClC;AACA,eAAW;AACX,gBAAY,KAAK,kEAAkE;AAAA,EACrF;AACA,MAAI,SAAS,IAAI,iBAAiB,GAAG;AACnC,eAAW;AACX,gBAAY,KAAK,iFAAiF;AAAA,EACpG;AACA,MAAI,SAAS,IAAI,gBAAgB,GAAG;AAClC,eAAW;AACX,gBAAY,KAAK,yEAAyE;AAAA,EAC5F;AACA,MAAI,SAAS,IAAI,gBAAgB,GAAG;AAClC,eAAW;AACX,gBAAY,KAAK,+CAA+C;AAAA,EAClE;AACA,MAAI,SAAS,IAAI,QAAQ,GAAG;AAC1B,eAAW;AACX,gBAAY,KAAK,4CAA4C;AAAA,EAC/D;AACA,MAAI,SAAS,IAAI,0BAA0B,GAAG;AAC5C,eAAW;AACX,gBAAY,KAAK,uEAAuE;AAAA,EAC1F;AAEA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,MAAM,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAc,UAAsC;AAEtE,QAAM,WAAW;AACjB,aAAW,KAAK,KAAK,SAAS,QAAQ,GAAG;AACvC,UAAM,OAAO,EAAE,CAAC;AAChB,sBAAkB,MAAM,QAAQ;AAAA,EAClC;AAGA,QAAM,WAAW;AACjB,aAAW,KAAK,KAAK,SAAS,QAAQ,GAAG;AACvC,sBAAkB,EAAE,CAAC,GAAI,QAAQ;AAAA,EACnC;AAGA,MAAI,0BAA0B,KAAK,IAAI,EAAG,UAAS,IAAI,oBAAoB;AAI3E,MAAI,qCAAqC,KAAK,IAAI,GAAG;AACnD,aAAS,IAAI,qBAAqB;AAAA,EACpC;AAGA,MAAI,oCAAoC,KAAK,IAAI,GAAG;AAClD,aAAS,IAAI,iBAAiB;AAAA,EAChC;AAGA,aAAW,KAAK,KAAK,SAAS,kCAAkC,GAAG;AACjE,UAAM,MAAM,EAAE,CAAC;AACf,QAAI,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,UAAU,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,OAAO,GAAG;AAC9G;AAAA,IACF;AACA,aAAS,IAAI,gBAAgB;AAAA,EAC/B;AAEA,MAAI,2BAA2B,KAAK,IAAI,EAAG,UAAS,IAAI,gBAAgB;AACxE,MAAI,sBAAsB,KAAK,IAAI,EAAG,UAAS,IAAI,QAAQ;AAC3D,MAAI,qCAAqC,KAAK,IAAI,EAAG,UAAS,IAAI,gBAAgB;AAClF,MAAI,mCAAmC,KAAK,IAAI,EAAG,UAAS,IAAI,eAAe;AAC/E,MAAI,sDAAsD,KAAK,IAAI,GAAG;AACpE,aAAS,IAAI,0BAA0B;AAAA,EACzC;AACF;AAEA,SAAS,kBAAkB,MAAc,UAAsC;AAC7E,MAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG;AAChD,aAAS,IAAI,mBAAmB;AAAA,EAClC,WAAW,iBAAiB,KAAK,IAAI,GAAG;AAAA,EAExC,OAAO;AACL,aAAS,IAAI,oBAAoB;AAAA,EACnC;AACF;AAUO,SAAS,eACd,QACA,UACA,OAC6D;AAC7D,QAAM,YAAY,0BAA0B,UAAU,KAAK;AAC3D,MAAI,WAAW,UAAU;AACvB,QAAI,UAAU,YAAY,SAAS,GAAG;AACpC,cAAQ;AAAA,QACN;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO,EAAE,UAAU,UAAU,UAAU;AAAA,EACzC;AACA,MAAI,WAAW,OAAQ,QAAO,EAAE,UAAU,QAAQ,UAAU;AAC5D,SAAO,EAAE,UAAU,UAAU,UAAU,UAAU;AACnD;;;AC1KA,IAAM,WAAW;AAYV,SAAS,kBAAkB,MAAsB;AACtD,MAAI,iBAAiB,KAAK,IAAI,EAAG,QAAO;AAExC,QAAM,WAAW,KAAK,MAAM,gBAAgB;AAC5C,MAAI,UAAU;AACZ,UAAM,MAAM,SAAS,QAAS,SAAS,CAAC,EAAE;AAC1C,WAAO,KAAK,MAAM,GAAG,GAAG,IAAI,WAAW,KAAK,MAAM,GAAG;AAAA,EACvD;AAEA,QAAM,WAAW,KAAK,MAAM,gBAAgB;AAC5C,MAAI,UAAU;AACZ,UAAM,MAAM,SAAS,QAAS,SAAS,CAAC,EAAE;AAC1C,WAAO,KAAK,MAAM,GAAG,GAAG,IAAI,WAAW,WAAW,YAAY,KAAK,MAAM,GAAG;AAAA,EAC9E;AAEA,SAAO,WAAW;AACpB;;;AX6JM,gBAAAC,aAAA;AAnJN,IAAM,oBAAoB,KAAK,OAAO;AACtC,IAAM,gCAAgC,MAAM;AAO5C,IAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,kBAAkB;AAChC,QAAM,YAAYC,QAA0B,IAAI;AAChD,QAAM,iBAAiBA,QAAO,WAAW;AACzC,iBAAe,UAAU;AACzB,QAAM,iBAAiBA,QAAO,WAAW;AACzC,iBAAe,UAAU;AAGzB,QAAM,EAAE,eAAe,QAAQ,IAAIC,UAAQ,MAAM;AAC/C,UAAM,EAAE,SAAS,WAAW,SAAS,EAAE,IAAI,wBAAwB,OAAO;AAC1E,QAAI,OAAO;AACX,MAAE,QAAQ,CAAC,MAAM,QAAQ;AACvB,YAAM,SAAS,GAAG,kBAAkB,GAAG,GAAG,GAAG,kBAAkB;AAC/D,YAAM,WAAW,wBAAwB,GAAG,4NAAqN,KAAK,YAAY,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,CAAC;AAC7T,aAAO,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ;AAAA,IACzC,CAAC;AACD,WAAO,EAAE,eAAe,MAAM,SAAS,EAAE;AAAA,EAC3C,GAAG,CAAC,OAAO,CAAC;AACZ,QAAM,aAAaD,QAAO,OAAO;AACjC,aAAW,UAAU;AAGrB,QAAM,gBAAgBE,cAAY,CAAC,MAAoB;AACrD,QAAI,CAAC,UAAU,QAAS;AACxB,UAAM,YAAY,UAAU,QAAQ;AACpC,QAAI,EAAE,WAAW,UAAW;AAE5B,QAAI,EAAE,MAAM,SAAS,wBAAwB;AAC3C,UAAI,CAAC,EAAE,KAAK,MAAM;AAChB,4BAAoB,IAAI;AACxB;AAAA,MACF;AACA,YAAM,aAAa,UAAU,QAAQ,sBAAsB;AAC3D,YAAM,IAAI,EAAE,KAAK;AACjB,YAAM,aAAa,IAAI;AAAA,QACrB,EAAE,OAAO,WAAW;AAAA,QACpB,EAAE,MAAM,WAAW;AAAA,QACnB,EAAE;AAAA,QACF,EAAE;AAAA,MACJ;AACA,0BAAoB,EAAE,MAAM,EAAE,KAAK,MAAM,MAAM,WAAW,CAAC;AAAA,IAC7D;AAEA,QAAI,EAAE,MAAM,SAAS,mBAAmB;AACtC,YAAM,OAAO,EAAE,KAAK;AACpB,UAAI,KAAK,WAAW,OAAO,KAAK,eAAe,SAAS;AACtD,uBAAe,QAAQ,EAAE,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,MAC/C,WAAW,eAAe,SAAS;AACjC,uBAAe,QAAQ,IAAI;AAAA,MAC7B,OAAO;AACL,eAAO,KAAK,MAAM,UAAU,qBAAqB;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,EAAE,MAAM,SAAS,mBAAmB;AACtC,YAAM,MAAM,EAAE,KAAK;AACnB,YAAM,OAAO,WAAW,QAAQ,IAAI,GAAG;AACvC,UAAI,MAAM;AACR,YAAI,KAAK,OAAO,gBAAgB,WAAW,QAAQ,GAAG;AACpD,gBAAM,MAAM,KAAK,OAAO,gBAAgB,QAAQ,aAAa,UAAU;AACvE,yBAAe,UAAU,GAAG;AAC5B,iBAAO,KAAK,KAAK,UAAU,qBAAqB;AAAA,QAClD,OAAO;AACL,yBAAe,UAAU,KAAK,MAAM;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAEtB,EAAAC,YAAU,MAAM;AACd,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,gBACJ,CAAC,CAAC,aAAa,SACf,YAAY,MAAM,SAAS,KAC3B,CAAC,YAAY;AAEf,QAAM,kBAAkBF,UAAQ,MAAM;AACpC,QAAI,CAAC,cAAe,QAAO;AAC3B,UAAM,OAAO;AACb,UAAM,YAAY,KAAK,aAAa,SAAS,YAAY,YAAY;AACrE,UAAM,QAAQ,KAAK;AAEnB,UAAM,cACH,cAAc,UAAU,KAAK,MAAM,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,SAAS,UAAU,IAAI,CAAC;AACtF,UAAM,WAAW,KAAK,YAAY;AAClC,QAAI,aAAa,UAAU;AACzB,aAAO,EAAE,MAAM,SAAkB,SAAS,EAAE,6BAA6B,EAAE;AAAA,IAC7E;AAIA,QAAI,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,KAAK,CAAC,eAAe;AAC9D,aAAO,EAAE,MAAM,SAAkB,SAAS,EAAE,2BAA2B,EAAE;AAAA,IAC3E;AACA,UAAM,EAAE,UAAU,UAAU,IAAI,eAAe,KAAK,YAAY,QAAQ,eAAe,KAAK;AAC5F,WAAO,EAAE,MAAM,MAAe,UAAU,WAAW,WAAW,MAAM;AAAA,EACtE,GAAG,CAAC,eAAe,aAAa,UAAU,eAAe,CAAC,CAAC;AAG3D,QAAM,gBAAgB,aAAa;AACnC,QAAM,eAAeD,QAAwB,EAAE,MAAM,OAAO,CAAC;AAC7D,EAAAG,YAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,QAAI;AACJ,QAAI,aAAa,gBAAgB;AAC/B,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B,WAAW,iBAAiB,iBAAiB,SAAS,SAAS;AAC7D,aAAO,EAAE,MAAM,mBAAmB,QAAQ,gBAAgB,QAAQ;AAAA,IACpE,WAAW,iBAAiB,iBAAiB,SAAS,MAAM;AAC1D,aAAO,EAAE,MAAM,aAAa,UAAU,gBAAgB,UAAU,WAAW,gBAAgB,UAAU;AAAA,IACvG,OAAO;AACL,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB;AACA,QAAI,CAAC,UAAU,aAAa,SAAS,IAAI,GAAG;AAC1C,mBAAa,UAAU;AACvB,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,eAAe,aAAa,gBAAgB,eAAe,eAAe,CAAC;AAE/E,QAAM,oBAAuC;AAAA,IAC3C;AAAA,IACA,OAAO,EAAE,oBAAoB;AAAA,EAC/B;AAGA,MAAI,aAAa,gBAAgB;AAC/B,WACE,gBAAAJ,MAAC,SAAI,WAAU,yCAAwC,kBAAe,WACnE,YAAE,2BAA2B,GAChC;AAAA,EAEJ;AAEA,MAAI,iBAAiB,iBAAiB,SAAS,SAAS;AACtD,QAAI,OAAO,YAAY,aAAa;AAClC,cAAQ,KAAK,uCAAuC,gBAAgB,OAAO;AAAA,IAC7E;AACA,WAAO,gBAAAA,MAAC,sBAAmB,SAAS,eAAe,mBAAsC;AAAA,EAC3F;AAEA,MAAI,iBAAiB,iBAAiB,SAAS,QAAQ,gBAAgB,aAAa,UAAU;AAC5F,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,WAAW,gBAAgB;AAAA,QAC3B,OAAO,gBAAgB;AAAA,QACvB,oBAAoB,aAAa,sBAAsB;AAAA,QACvD;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,iBAAiB,iBAAiB,SAAS,QAAQ,gBAAgB,aAAa,QAAQ;AAC1F,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,WAAW,gBAAgB;AAAA,QAC3B,OAAO,gBAAgB;AAAA,QACvB,aAAa,aAAa,gBAAgB;AAAA,QAC1C;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO,gBAAAA,MAAC,sBAAmB,SAAS,eAAe,mBAAsC;AAC3F;AAEA,SAAS,UAAU,GAAoB,GAA6B;AAClE,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,MAAI,EAAE,SAAS,eAAe,EAAE,SAAS,aAAa;AACpD,WAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE;AAAA,EACxD;AACA,MAAI,EAAE,SAAS,qBAAqB,EAAE,SAAS,mBAAmB;AAChE,WAAO,EAAE,WAAW,EAAE;AAAA,EACxB;AACA,MAAI,EAAE,SAAS,WAAW,EAAE,SAAS,SAAS;AAC5C,WAAO,EAAE,YAAY,EAAE;AAAA,EACzB;AACA,SAAO;AACT;AAOA,IAAM,qBAAwD,CAAC,EAAE,SAAS,kBAAkB,MAAM;AAChG,QAAM,WAAW,kBAAkB,OAAO,IAAI,0BAA0B;AACxE,SACE,gBAAAA,MAAC,SAAI,WAAU,wBAAuB,kBAAe,UACnD,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,kBAAkB;AAAA,MACvB,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAO,kBAAkB;AAAA;AAAA,EAC3B,GACF;AAEJ;AAUA,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAWE,UAAQ,MAAM,YAAY,KAAK,GAAG,CAAC,KAAK,CAAC;AAC1D,QAAM,SAASA;AAAA,IACb,MACE,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;AAAA,IAGH,CAAC,UAAU,WAAW,UAAU,kBAAkB;AAAA,EACpD;AAGA,EAAAE,YAAU,MAAM;AACd,WAAO,MAAM;AACX,iBAAW,OAAO,OAAO,UAAU;AACjC,YAAI;AACF,cAAI,gBAAgB,GAAG;AAAA,QACzB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,WAAW,kBAAkB,OAAO,IAAI,IAAI,0BAA0B;AAE5E,SACE,gBAAAJ,MAAC,SAAI,WAAU,wBAAuB,kBAAe,kBAAiB,iBAAc,UAClF,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,kBAAkB;AAAA,MACvB,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAO,kBAAkB;AAAA;AAAA,EAC3B,GACF;AAEJ;AAUA,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAWE,UAAQ,MAAM,YAAY,KAAK,GAAG,CAAC,KAAK,CAAC;AAC1D,QAAM,CAAC,QAAQ,SAAS,IAAIG,WAAoC,IAAI;AAEpE,EAAAD,YAAU,MAAM;AACd,QAAI,UAAqC;AACzC,QAAI;AACF,gBAAU,kBAAkB,EAAE,UAAU,WAAW,OAAO,YAAY,CAAC;AACvE,gBAAU,OAAO;AAAA,IACnB,SAAS,GAAG;AACV,UAAI,OAAO,YAAY,aAAa;AAClC,gBAAQ,MAAM,sCAAsC,CAAC;AAAA,MACvD;AACA,gBAAU,IAAI;AAAA,IAChB;AACA,WAAO,MAAM;AACX,UAAI;AACF,iBAAS,KAAK,QAAQ;AAAA,MACxB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,UAAU,WAAW,UAAU,WAAW,CAAC;AAE/C,MAAI,CAAC,QAAQ;AACX,WACE,gBAAAJ,MAAC,SAAI,WAAU,yCAAwC,kBAAe,wBAEtE;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAU,wBAAuB,kBAAe,gBAAe,iBAAc,QAChF,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,kBAAkB;AAAA,MACvB,KAAK,OAAO;AAAA,MACZ,SAAS,OAAO;AAAA,MAChB,WAAU;AAAA,MACV,OAAO,kBAAkB;AAAA;AAAA,EAC3B,GACF;AAEJ;AAEA,SAAS,YAAY,OAA2B;AAC9C,SAAO,MACJ,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,SAAS,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAC/D,KAAK,IAAI;AACd;AAEA,IAAO,qBAAQ;;;AFlTJ,gBAAAM,OAOP,QAAAC,cAPO;AA3EX,IAAMC,aAAW;AACjB,IAAMC,UAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBd,IAAM,cAAc,CAAC,OAAwB;AAC3C,QAAM,QAAQ,GAAG,YAAY;AAC7B,SAAO,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM;AACzD;AAcO,IAAMC,cAA8B,CAAC,EAAE,OAAO,KAAK,MAAM;AAC9D,eAAaF,YAAUC,OAAK;AAC5B,QAAM,MAAM,YAAY;AAAA,IACtB,aAAa,MAAM;AAAA,IACnB,KAAK,MAAM;AAAA,IACX,SAAS,MAAM;AAAA,EACjB,CAAC;AAED,QAAM,OAAO,IAAI,WAAW;AAC5B,QAAM,WAAW,IAAI,YAAY,MAAM,SAAS;AAChD,QAAM,UAAU,IAAI,WAAW;AAE/B,QAAM,YAAYE;AAAA,IAChB,MAAM,YAAY,QAAQ,KAAK,CAAC,CAAC;AAAA,IACjC,CAAC,UAAU,OAAO;AAAA,EACpB;AAEA,QAAM,gBAAgB,eAAe;AAAA,IACnC,UAAU;AAAA,IACV;AAAA,IACA,SAAS,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI;AAAA,EAC7C,CAAC;AAED,EAAAC,YAAU,MAAM;AACd,QAAI,IAAI,QAAS;AACjB,QAAI,IAAI,OAAO;AACb,aAAO,gBAAgB,EAAE,aAAa,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC;AAAA,IAC7E,OAAO;AACL,aAAO,iBAAiB;AAAA,QACtB,aAAa,MAAM;AAAA,QACnB,UAAU,IAAI;AAAA,QACd,UAAU,IAAI;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EAEF,GAAG,CAAC,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC;AAEtC,MAAI,IAAI,WAAY,aAAa,cAAc,SAAU;AACvD,WAAO,gBAAAN,MAAC,SAAI,WAAU,0CAAyC,2BAAQ;AAAA,EACzE;AACA,MAAI,IAAI,OAAO;AACb,WAAO,gBAAAA,MAAC,SAAI,WAAU,wCAAwC,cAAI,OAAM;AAAA,EAC1E;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,uCACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT;AAAA,QACA,aACE,aAAa,cAAc,MAAM,SAAS,IACtC;AAAA,UACE,OAAO,cAAc;AAAA,UACrB,gBAAgB;AAAA,UAChB,UAAU,MAAM,YAAY;AAAA,QAC9B,IACA;AAAA;AAAA,IAER;AAAA,IACC,aAAa,cAAc,SAAS,cAAc,MAAM,WAAW,KAClE,gBAAAA,MAAC,SAAI,WAAU,2BAA2B,wBAAc,OAAM;AAAA,KAElE;AAEJ;;;AcrFA,OAAkB;AAad,gBAAAO,aAAA;AAHG,SAAS,OAAO,EAAE,OAAO,SAAS,GAAgB;AACvD,QAAM,OAAO,OAAO,QAAQ;AAC5B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oBAAoB,IAAI;AAAA,MACnC,gBAAc;AAAA,MAEb;AAAA;AAAA,EACH;AAEJ;;;ACvCA,OAA0D;;;ACanD,SAAS,WAAW,OAAqD;AAC9E,SAAO,QAAQ,qBAAqB,KAAK,MAAM;AACjD;AAGO,SAAS,UAAU,OAAoD;AAC5E,SAAO,QAAQ,oBAAoB,KAAK,MAAM;AAChD;AAGO,SAAS,MAAM,OAAgD;AACpE,SAAO,QAAQ,sBAAsB,KAAK,MAAM;AAClD;AAaO,SAAS,WAAW,OAAmD;AAC5E,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,UAAU,UAAU,eAAe,UAAU,QAAQ,aAAa;AAC3E;AAIO,SAAS,aAAa,OAAqD;AAChF,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,MAAO,QAAO;AAC5B,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,SAAU,QAAO;AAC/B,SAAO;AACT;;;ADGI,gBAAAC,aAAA;AA1BG,SAAS,IAAI,EAAE,OAAO,SAAS,GAAa;AACjD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,SAAU,CAAC;AAEf,QAAM,QAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,eAAe;AAAA,IACf,SAAS,WAAW,OAAO;AAAA,IAC3B,KAAK,WAAW,GAAG;AAAA,IACnB,YAAY,MAAM,EAAE;AAAA,IACpB,cAAc,UAAU,MAAM;AAAA,IAC9B,QAAQ,WAAW,8CAA8C;AAAA,IACjE,YAAY,WAAW,KAAK;AAAA,IAC5B,gBAAgB,aAAa,OAAO;AAAA,EACtC;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAW,CAAC,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,OAC9D,UACH;AAEJ;;;AE/DA,OAA0D;AAkCtD,gBAAAC,aAAA;AAbG,SAAS,IAAI,EAAE,OAAO,SAAS,GAAa;AACjD,QAAM,EAAE,KAAK,OAAO,SAAS,MAAM,UAAU,IAAI,SAAU,CAAC;AAE5D,QAAM,QAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK,WAAW,GAAG;AAAA,IACnB,YAAY,WAAW,KAAK;AAAA,IAC5B,gBAAgB,aAAa,OAAO;AAAA,IACpC,UAAU,OAAO,SAAS;AAAA,EAC5B;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAW,CAAC,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,OAC9D,UACH;AAEJ;;;ACpCA,OAA0C;AA0BtC,gBAAAC,aAAA;AAfG,SAAS,OAAO,EAAE,MAAM,GAAgB;AAC7C,QAAM,EAAE,MAAM,MAAM,UAAU,IAAI,SAAU,CAAC;AAE7C,QAAM,QAAuB,OACzB,EAAE,MAAM,EAAE,IACV;AAAA;AAAA;AAAA;AAAA,IAIE,UAAU,WAAW,IAAI;AAAA,IACzB,WAAW,WAAW,IAAI;AAAA,IAC1B,YAAY;AAAA,EACd;AAEJ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC5D;AAAA,MACA,eAAY;AAAA;AAAA,EACd;AAEJ;;;AC9BA,OAAsC;AAsDhC,SAEI,OAAAC,OAFJ,QAAAC,cAAA;AAxCC,SAAS,QAAQ,EAAE,OAAO,SAAS,GAAiB;AACzD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,SAAU,CAAC;AAEf,QAAM,iBAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ,WAAW,8CAA8C;AAAA,IACjE,YAAY;AAAA,EACd;AAEA,QAAM,aAAkC;AAAA,IACtC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,YAAiC;AAAA,IACrC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAEA,QAAM,eAAoC;AAAA,IACxC,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,EACP;AAEA,QAAM,MAAM,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE9D,MAAI,aAAa;AACf,WACE,gBAAAA,OAAC,aAAQ,WAAW,KAAK,OAAO,gBAAgB,MAAM,CAAC,kBACrD;AAAA,sBAAAD,MAAC,aAAQ,OAAO,EAAE,QAAQ,WAAW,WAAW,SAAS,GACvD,0BAAAA,MAAC,UAAK,OAAO,YAAa,iBAAM,GAClC;AAAA,MACC,eAAe,gBAAAA,MAAC,OAAE,OAAO,WAAY,uBAAY;AAAA,MAClD,gBAAAA,MAAC,SAAI,OAAO,cAAe,UAAS;AAAA,OACtC;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,aAAQ,WAAW,KAAK,OAAO,gBAC9B;AAAA,oBAAAD,MAAC,QAAG,OAAO,YAAa,iBAAM;AAAA,IAC7B,eAAe,gBAAAA,MAAC,OAAE,OAAO,WAAY,uBAAY;AAAA,IAClD,gBAAAA,MAAC,SAAI,OAAO,cAAe,UAAS;AAAA,KACtC;AAEJ;;;AC1EA,OAA0C;AAsFhC,SAKE,OAAAE,OALF,QAAAC,cAAA;AAlEV,IAAM,gBAA4C;AAAA,EAChD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AACT;AAEA,IAAM,eAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AACT;AAEO,SAAS,QAAQ,EAAE,MAAM,GAAiB;AAC/C,QAAM,EAAE,OAAO,cAAc,cAAc,UAAU,IAAI,SAAU,CAAC;AAEpE,QAAM,iBAAgC;AAAA,IACpC,SAAS;AAAA,IACT,eAAe,gBAAgB,eAAe,QAAQ;AAAA,IACtD,KAAK;AAAA,IACL,YAAY,gBAAgB,eAAe,WAAW;AAAA,EACxD;AAEA,QAAM,gBAAgB,CAAC,YAAuC;AAAA,IAC5D,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,YAAY,gBAAgB,eAAe,WAAW;AAAA,IACtD,OAAO,WAAW,YAAY,WAAW,UAAU,cAAc,MAAM,IAAI;AAAA,IAC3E,UAAU;AAAA,EACZ;AAEA,QAAM,aAAa,CAAC,YAAuC;AAAA,IACzD,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,YAAY,WAAW,cAAc,cAAc,YAAY;AAAA,IAC/D,OAAO,WAAW,cAAc,SAAS,cAAc,MAAM;AAAA,IAC7D,QAAQ,aAAa,cAAc,MAAM,CAAC;AAAA,IAC1C,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAEA,QAAM,aAA4B;AAAA,IAChC,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAEA,QAAM,YAA2B;AAAA,IAC/B,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,cAAc,eAAe,WAAW,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC3F,OAAO,EAAE,GAAG,gBAAgB,WAAW,QAAQ,SAAS,GAAG,QAAQ,EAAE;AAAA,MACrE,cAAW;AAAA,MAEV,gBAAM,IAAI,CAAC,SAAS;AACnB,cAAM,SAAS,KAAK,UAAU;AAC9B,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,cAAc,MAAM;AAAA,YAC3B,gBAAc,WAAW,WAAW,SAAS;AAAA,YAE7C;AAAA,8BAAAD,MAAC,UAAK,OAAO,WAAW,MAAM,GAAG,eAAY,QAC1C,uBAAa,MAAM,GACtB;AAAA,cACA,gBAAAA,MAAC,UAAK,OAAO,YAAa,eAAK,OAAM;AAAA,cACpC,KAAK,eAAe,gBAAAA,MAAC,UAAK,OAAO,WAAY,eAAK,aAAY;AAAA;AAAA;AAAA,UAR1D,KAAK;AAAA,QASZ;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;;;AC5FA,OAA0D;AAkEpD,SAGI,OAAAE,OAHJ,QAAAC,cAAA;AApDC,SAAS,UAAU,EAAE,OAAO,SAAS,GAAmB;AAC7D,QAAM,EAAE,OAAO,MAAM,UAAU,aAAa,OAAO,UAAU,IAC3D,SAAU,CAAC;AAEb,QAAM,iBAAgC;AAAA,IACpC,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,EACP;AAEA,QAAM,aAA4B;AAAA,IAChC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,oBAAmC;AAAA,IACvC,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAEA,QAAM,YAA2B;AAAA,IAC/B,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAEA,QAAM,aAA4B;AAAA,IAChC,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAKA,QAAM,SAAS,cAAc,gBAAgB,IAAI,UAAU;AAC3D,QAAM,QAAQ,QAAQ,gBAAgB,IAAI,SAAS;AASnD,QAAM,YAAY,QAAQ,SAAS;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAChE,gCAA8B;AAAA,MAC9B,OAAO;AAAA,MAEP;AAAA,wBAAAA,OAAC,WAAM,SAAS,gBAAgB,IAAI,UAAU,OAAO,YAClD;AAAA;AAAA,UACA,YACC,gBAAAD,MAAC,UAAK,OAAO,mBAAmB,cAAW,YAAW,eAEtD;AAAA,WAEJ;AAAA,QACC,eACC,gBAAAA,MAAC,UAAK,IAAI,QAAQ,OAAO,WACtB,uBACH;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAOC,oBAAkB,CAAC,QAAQ,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,YAC/D,gBAAc,QAAQ,OAAO;AAAA,YAE5B;AAAA;AAAA,QACH;AAAA,QACC,SACC,gBAAAA,MAAC,UAAK,IAAI,OAAO,OAAO,YAAY,MAAK,SACtC,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ApEzGA,wBAAwB;AAmDxB,SAAS,SAAS,SAA+D;AAC/E,QAAM,WAAW,KAAK,OAAO;AAC7B,SAAO,CAAC,UACNE,QAAM;AAAA,IAAc;AAAA,IAAU,EAAE,UAAUA,QAAM,cAAc,OAAO,EAAE,OAAO,EAAE,SAAS,QAAQ,OAAO,UAAU,EAAE,GAAG,sBAAiB,EAAE;AAAA,IACxIA,QAAM,cAAc,UAAU,KAAK;AAAA,EACrC;AACJ;AAEA,IAAM,YAAY,SAAS,MAAM,OAAO,yBAAgB,CAAC;AACzD,IAAM,cAAc,SAAS,MAAM,OAAO,2BAAkB,CAAC;AAC7D,IAAM,eAAe,SAAS,MAAM,OAAO,gCAAuB,CAAC;AACnE,IAAM,aAAa,SAAS,MAAM,OAAO,0BAAiB,CAAC;AAC3D,IAAM,cAAc,SAAS,MAAM,OAAO,2BAAkB,CAAC;AAC7D,IAAM,mBAAmB,SAAS,MAAM,OAAO,gCAAuB,CAAC;AAEhE,IAAM,EAAE,SAAS,IAAI,eAAe,SAAS;AAAA,EAClD,YAAY;AAAA,IACV;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAYC;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,MAAM,iBAAiB;AAAA,IACvB,OAAO,iBAAiB;AAAA,IACxB,MAAM,iBAAiB;AAAA,IACvB,WAAW,iBAAiB;AAAA,IAC5B,MAAM,iBAAiB;AAAA,IACvB,WAAW,iBAAiB;AAAA,IAC5B,aAAa,iBAAiB;AAAA,IAC9B,UAAU,iBAAiB;AAAA,IAC3B,OAAO,iBAAiB;AAAA,IACxB,OAAO,iBAAiB;AAAA,IACxB,UAAU,iBAAiB;AAAA,IAC3B,QAAQ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOzB,OAAO,iBAAiB;AAAA,IACxB,UAAU,iBAAiB;AAAA,IAC3B,QAAQ,iBAAiB;AAAA,IACzB,UAAU,iBAAiB;AAAA,IAC3B,OAAO,iBAAiB;AAAA,IACxB,QAAQ,iBAAiB;AAAA,IACzB,QAAQ,iBAAiB;AAAA,IACzB,QAAQ,iBAAiB;AAAA,IACzB,MAAM,iBAAiB;AAAA,IACvB,cAAc,iBAAiB;AAAA,IAC/B,QAAQ,iBAAiB;AAAA,IACzB,aAAa,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAS9B,QAAQ,iBAAiB;AAAA,IACzB,QAAQ,iBAAiB;AAAA,IACzB,SAAS,iBAAiB;AAAA,IAC1B,MAAM,iBAAiB;AAAA,IACvB,OAAO,iBAAiB;AAAA,IACxB,OAAO,iBAAiB;AAAA,IACxB,UAAU,iBAAiB;AAAA,IAC3B,SAAS,iBAAiB;AAAA,IAC1B,SAAS,iBAAiB;AAAA,IAC1B,SAAS,iBAAiB;AAAA,IAC1B,aAAa,iBAAiB;AAAA,IAC9B,YAAY,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAY7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,oBAAoB,OAAO,YAAqC;AAAA,IAAC;AAAA,IACjE,gBAAgB,OAAO,YAAqC;AAAA,IAAC;AAAA,IAC7D,cAAc,OAAO,YAAqC;AAAA,IAAC;AAAA,EAC7D;AACF,CAAU;;;AnB3NF,SACE,OAAAC,OADF,QAAAC,cAAA;AAhBR,IAAM,iBAA0D,CAAC;AAE1D,IAAM,uBAA4D,CAAC;AAAA,EACxE;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,EACjB,SAAS;AACX,MAAM;AACJ,QAAM,WAAWC,UAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,CAAC;AAC3D,QAAM,UAAUA,UAAQ,MAAM,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACpD,QAAM,EAAE,MAAM,UAAU,MAAM,IAAI,aAAa,QAAQ,SAAS,KAAK;AAErE,MAAI,CAAC,UAAU,QAAQ,CAAC,UAAU,UAAU;AAC1C,WACE,gBAAAF,MAAC,SAAI,WAAW,iBAAiB,aAAa,EAAE,IAAI,cAAY,OAC9D,0BAAAC,OAAC,SAAI,WAAU,qBACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,qBAAoB;AAAA,MACnC,gBAAAA,MAAC,UAAK,wBAAU;AAAA,OAClB,GACF;AAAA,EAEJ;AAEA,QAAM,qBAAqB,QACvB,EAAE,MAAM,IACR,EAAE,cAAc,SAAS,SAAS,CAAC,EAAE;AAEzC,SACE,gBAAAA,MAAC,SAAI,WAAW,iBAAiB,aAAa,EAAE,IAAI,cAAY,OAC9D,0BAAAA,MAAC,iBAAe,GAAG,oBACjB,0BAAAA,MAAC,sBACC,0BAAAA,MAAC,kBAAe,UAAU,gBAExB,0BAAAA,MAAC,SAAI,WAAU,cACb,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA;AAAA,EACX,GACF,GACF,GACF,GACF,GACF;AAEJ;","names":["useMemo","appliesPredicate","estimate","transform","allocateKey","appliesPredicate","estimate","transform","id","allocateKey","appliesPredicate","estimate","migrateOne","transform","appliesPredicate","estimate","transform","COMPONENT_TYPE","appliesPredicate","estimate","transform","appliesPredicate","estimate","transform","appliesPredicate","estimate","transform","registry","ctx","out","React","useCallback","useActions","jsx","EMOJI_RE","jsx","STYLE_ID","SHEET","useEffect","useMemo","useRef","jsx","jsxs","STYLE_ID","SHEET","useRef","useEffect","useMemo","jsx","jsxs","STYLE_ID","SHEET","useMemo","jsx","jsxs","STYLE_ID","SHEET","useActions","useCallback","useCallback","useState","useActions","jsx","jsxs","STYLE_ID","SHEET","useActions","useState","useCallback","React","useMemo","useStateValue","jsx","STYLE_ID","SHEET","useStateValue","useMemo","React","useCallback","jsx","jsxs","STYLE_ID","SHEET","useCallback","jsx","STYLE_ID","SHEET","useMemo","useState","useStateValue","jsx","jsxs","useStateValue","STYLE_ID","SHEET","useState","useMemo","useCallback","useActions","useStateStore","jsx","jsxs","STYLE_ID","SHEET","useStateStore","useActions","useCallback","useCallback","useMemo","useState","useStateStore","jsx","jsxs","STYLE_ID","SHEET","useMemo","useStateStore","useState","useCallback","useCallback","useMemo","useState","useStateStore","Fragment","jsx","jsxs","STYLE_ID","SHEET","useMemo","useStateStore","useState","useCallback","jsx","jsxs","STYLE_ID","SHEET","jsx","jsxs","STYLE_ID","SHEET","STATUS_ICON","React","useMemo","useRef","useState","useEffect","useCallback","jsx","jsxs","STYLE_ID","SHEET","Fragment","jsx","jsxs","STYLE_ID","SHEET","useRef","useState","useEffect","useCallback","useMemo","xBand","minV","maxV","span","React","rows","useMemo","jsx","jsxs","STYLE_ID","SHEET","useMemo","jsx","jsxs","STYLE_ID","SHEET","jsx","jsxs","STYLE_ID","SHEET","jsx","jsxs","STYLE_ID","SHEET","jsx","jsxs","STYLE_ID","SHEET","useEffect","useId","useMemo","useRef","useState","jsx","jsxs","STYLE_ID","SHEET","turnX","useId","useRef","useState","useEffect","useMemo","timelineW","chartW","bodyTop","totalH","bars","edges","msPts","todayX","ticks","useMemo","jsx","jsxs","STYLE_ID","SHEET","useMemo","useMemo","jsx","jsxs","STYLE_ID","SHEET","clamp","useMemo","useMemo","useRef","useState","jsx","jsxs","STYLE_ID","SHEET","useRef","useMemo","useState","useCallback","useMemo","useState","jsx","jsxs","STYLE_ID","SHEET","useMemo","useState","useCallback","useId","useMemo","useRef","useState","useEffect","jsx","jsxs","STYLE_ID","SHEET","useId","useRef","useState","useEffect","useMemo","labelAreaH","vbW","H","slotW","barW","chartBottom","placed","baselineY","showBaseline","jsx","jsxs","STYLE_ID","SHEET","jsx","jsxs","STYLE_ID","SHEET","useMemo","jsx","jsxs","STYLE_ID","SHEET","cellLabel","useMemo","useCallback","useEffect","useMemo","useRef","useState","useActions","useStateStore","Fragment","jsx","jsxs","STYLE_ID","SHEET","useStateStore","useActions","useMemo","useState","useRef","useEffect","useCallback","useEffect","Fragment","jsx","useCallback","useMemo","useState","jsx","jsxs","STYLE_ID","SHEET","useMemo","useState","useCallback","jsx","jsxs","STYLE_ID","SHEET","React","useEffect","useMemo","jsx","STYLE_ID","SHEET","React","useEffect","useMemo","useEffect","jsx","STYLE_ID","SHEET","useEffect","useEffect","jsx","STYLE_ID","SHEET","useEffect","useEffect","jsx","STYLE_ID","SHEET","useEffect","useEffect","jsx","STYLE_ID","SHEET","useEffect","useEffect","jsx","STYLE_ID","SHEET","useEffect","useEffect","jsx","STYLE_ID","SHEET","useEffect","useEffect","useMemo","useEffect","useMemo","useRef","useState","useMemo","useState","useRef","useEffect","useEffect","useMemo","useRef","useState","useCallback","transform","resolved","resolved","resolved","createBlobUrl","mq","registry","registry","jsx","useRef","useMemo","useCallback","useEffect","useState","jsx","jsxs","STYLE_ID","SHEET","HtmlViewer","useMemo","useEffect","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","HtmlViewer","jsx","jsxs","useMemo"]}
|