@exponential-at/ui 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +360 -2
  4. package/catalog/a11y.json +668 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +4752 -0
  8. package/catalog/core.schema.json +22667 -0
  9. package/catalog/host.json +64 -0
  10. package/catalog/layout.json +20 -0
  11. package/catalog/limits.json +9 -0
  12. package/catalog/locale.json +48 -0
  13. package/catalog/macros.json +3417 -0
  14. package/catalog/recipes.json +61 -0
  15. package/catalog/strings.json +72 -0
  16. package/catalog/style.json +128 -0
  17. package/catalog/theme.schema.json +42543 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +217 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +683 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +96 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +154 -0
  27. package/conformance/manifest.json +224 -0
  28. package/conformance/parity-compare.ts +191 -0
  29. package/conformance/parity-report.schema.json +73 -0
  30. package/conformance/parity.ts +412 -0
  31. package/conformance/pixel.ts +177 -0
  32. package/conformance/primitives-page.ts +49 -0
  33. package/conformance/report.schema.json +66 -0
  34. package/conformance/run.ts +118 -0
  35. package/dist/chunks/index-98npjvsd.js +3940 -0
  36. package/dist/chunks/index-98npjvsd.js.map +27 -0
  37. package/dist/chunks/index-gwkt14w3.js +7314 -0
  38. package/dist/chunks/index-gwkt14w3.js.map +10 -0
  39. package/dist/chunks/index-njt7yzzm.js +134 -0
  40. package/dist/chunks/index-njt7yzzm.js.map +9 -0
  41. package/dist/chunks/index-we7va6v6.js +7984 -0
  42. package/dist/chunks/index-we7va6v6.js.map +15 -0
  43. package/dist/chunks/index-xrm6f7wc.js +2563 -0
  44. package/dist/chunks/index-xrm6f7wc.js.map +10 -0
  45. package/dist/conformance.js +182749 -0
  46. package/dist/conformance.js.map +10 -0
  47. package/dist/entries/prompt.js +251 -0
  48. package/dist/entries/prompt.js.map +11 -0
  49. package/dist/entries/schema.js +1725 -0
  50. package/dist/entries/schema.js.map +11 -0
  51. package/dist/host/index.js +122 -0
  52. package/dist/host/index.js.map +9 -0
  53. package/dist/index.js +3213 -0
  54. package/dist/index.js.map +27 -0
  55. package/dist/types/src/a11y.d.ts +21 -0
  56. package/dist/types/src/animation.d.ts +76 -0
  57. package/dist/types/src/basic-map.d.ts +38 -0
  58. package/dist/types/src/builder.d.ts +50 -0
  59. package/dist/types/src/catalog.d.ts +54 -0
  60. package/dist/types/src/catalog.described.d.ts +33 -0
  61. package/dist/types/src/catalog.generated.d.ts +829 -0
  62. package/dist/types/src/chart.d.ts +46 -0
  63. package/dist/types/src/code.d.ts +44 -0
  64. package/dist/types/src/color.d.ts +20 -0
  65. package/dist/types/src/conformance.d.ts +39 -0
  66. package/dist/types/src/connector/app.d.ts +14 -0
  67. package/dist/types/src/connector/connector.d.ts +77 -0
  68. package/dist/types/src/connector/index.d.ts +4 -0
  69. package/dist/types/src/css.d.ts +29 -0
  70. package/dist/types/src/define.d.ts +66 -0
  71. package/dist/types/src/direction.d.ts +16 -0
  72. package/dist/types/src/dynamic.d.ts +159 -0
  73. package/dist/types/src/entries/prompt.d.ts +11 -0
  74. package/dist/types/src/entries/schema.d.ts +8 -0
  75. package/dist/types/src/expr.d.ts +71 -0
  76. package/dist/types/src/extension.d.ts +4 -0
  77. package/dist/types/src/format.d.ts +112 -0
  78. package/dist/types/src/geometry.d.ts +40 -0
  79. package/dist/types/src/host/contract.d.ts +188 -0
  80. package/dist/types/src/host/decoders.d.ts +61 -0
  81. package/dist/types/src/host/index.d.ts +11 -0
  82. package/dist/types/src/host/package.d.ts +58 -0
  83. package/dist/types/src/host/policy.d.ts +105 -0
  84. package/dist/types/src/host/router.d.ts +34 -0
  85. package/dist/types/src/host/runtime.d.ts +205 -0
  86. package/dist/types/src/host/sources.d.ts +15 -0
  87. package/dist/types/src/host/transports.d.ts +109 -0
  88. package/dist/types/src/index.d.ts +63 -0
  89. package/dist/types/src/layout.d.ts +20 -0
  90. package/dist/types/src/limits.d.ts +21 -0
  91. package/dist/types/src/list.d.ts +133 -0
  92. package/dist/types/src/locale.d.ts +22 -0
  93. package/dist/types/src/macros.d.ts +29 -0
  94. package/dist/types/src/overlay.d.ts +27 -0
  95. package/dist/types/src/prompt.d.ts +44 -0
  96. package/dist/types/src/recipes.d.ts +17 -0
  97. package/dist/types/src/reducer.d.ts +41 -0
  98. package/dist/types/src/resizable.d.ts +38 -0
  99. package/dist/types/src/schema.d.ts +7 -0
  100. package/dist/types/src/strings.d.ts +13 -0
  101. package/dist/types/src/style.d.ts +201 -0
  102. package/dist/types/src/test-preload.d.ts +1 -0
  103. package/dist/types/src/text-shimmer.d.ts +24 -0
  104. package/dist/types/src/theme-types.d.ts +162 -0
  105. package/dist/types/src/theme.d.ts +73 -0
  106. package/dist/types/src/themes.d.ts +22 -0
  107. package/dist/types/src/tree-guides.d.ts +17 -0
  108. package/dist/types/src/types.d.ts +314 -0
  109. package/dist/types/src/validate.d.ts +31 -0
  110. package/dist/types/src/web/base-css.d.ts +1 -0
  111. package/dist/types/src/web/box-css.d.ts +55 -0
  112. package/dist/types/src/web/coerce.d.ts +32 -0
  113. package/dist/types/src/web/data.d.ts +105 -0
  114. package/dist/types/src/web/dates.d.ts +12 -0
  115. package/dist/types/src/web/form.d.ts +44 -0
  116. package/dist/types/src/web/host-types.d.ts +119 -0
  117. package/dist/types/src/web/index.d.ts +28 -0
  118. package/dist/types/src/web/inputs.d.ts +55 -0
  119. package/dist/types/src/web/list.d.ts +13 -0
  120. package/dist/types/src/web/listbox.d.ts +14 -0
  121. package/dist/types/src/web/markdown.d.ts +96 -0
  122. package/dist/types/src/web/media.d.ts +62 -0
  123. package/dist/types/src/web/parts.d.ts +4 -0
  124. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  125. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  126. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  127. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  128. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  129. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  130. package/dist/types/src/web/primitives/button.d.ts +6 -0
  131. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  132. package/dist/types/src/web/primitives/card.d.ts +9 -0
  133. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  134. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  135. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  136. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  137. package/dist/types/src/web/primitives/command.d.ts +134 -0
  138. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  139. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  140. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  141. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  142. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  143. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  144. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  145. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  146. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  147. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  148. package/dist/types/src/web/primitives/index.d.ts +48 -0
  149. package/dist/types/src/web/primitives/input.d.ts +5 -0
  150. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  151. package/dist/types/src/web/primitives/label.d.ts +3 -0
  152. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  153. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  154. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  155. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  156. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  157. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  158. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  159. package/dist/types/src/web/primitives/select.d.ts +47 -0
  160. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  161. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  162. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  163. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  164. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  165. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  166. package/dist/types/src/web/primitives/table.d.ts +11 -0
  167. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  168. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  169. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  170. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  171. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  172. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  173. package/dist/types/src/web/share.d.ts +6 -0
  174. package/dist/types/src/web/table.d.ts +20 -0
  175. package/dist/types/src/web/theme-css.d.ts +69 -0
  176. package/dist/types/src/web/urls.d.ts +21 -0
  177. package/dist/web/index.js +2303 -0
  178. package/dist/web/index.js.map +26 -0
  179. package/dist/web/primitives/index.js +1450 -0
  180. package/dist/web/primitives/index.js.map +57 -0
  181. package/docs/components.generated.json +6238 -0
  182. package/docs/round-1-contract.md +679 -0
  183. package/docs/round-2-contract.md +476 -0
  184. package/docs/round-3-contract.md +174 -0
  185. package/docs/themes.generated.json +3503 -0
  186. package/fixtures/animations.json +2890 -0
  187. package/fixtures/bench-list.json +58 -0
  188. package/fixtures/bind-time.json +30664 -0
  189. package/fixtures/catalog-basic-map.json +1692 -0
  190. package/fixtures/catalog-components.json +9323 -0
  191. package/fixtures/catalog-extension.json +620 -0
  192. package/fixtures/catalog-macros.json +36370 -0
  193. package/fixtures/code-tokens.json +1993 -0
  194. package/fixtures/conformance-baseline.json +55544 -0
  195. package/fixtures/conformance-cases.json +49 -0
  196. package/fixtures/conformance-known.json +2123 -0
  197. package/fixtures/control-geometry.json +4200 -0
  198. package/fixtures/dashboard.data.json +74 -0
  199. package/fixtures/dashboard.json +752 -0
  200. package/fixtures/demo-surface.json +47 -0
  201. package/fixtures/format.json +870 -0
  202. package/fixtures/host-policy.json +1067 -0
  203. package/fixtures/host-router.json +1152 -0
  204. package/fixtures/host-transport.json +590 -0
  205. package/fixtures/interactions-round1.json +773 -0
  206. package/fixtures/kitchen-sink.expanded.json +10844 -0
  207. package/fixtures/kitchen-sink.json +3049 -0
  208. package/fixtures/layout-geometry-round1.json +7278 -0
  209. package/fixtures/layout-geometry.json +2072 -0
  210. package/fixtures/overlay-geometry.json +272 -0
  211. package/fixtures/primitive-specimens.json +58 -0
  212. package/fixtures/prompt-budget.json +33 -0
  213. package/fixtures/resizable.json +714 -0
  214. package/fixtures/round4-contract.json +2985 -0
  215. package/fixtures/specimens.json +9832 -0
  216. package/fixtures/style-conditions.json +336 -0
  217. package/fixtures/template-items.json +2215 -0
  218. package/fixtures/text-direction.json +309 -0
  219. package/fixtures/text-shimmer.json +96 -0
  220. package/fixtures/theme-extends.json +573 -0
  221. package/fixtures/theme-invalid.json +1296 -0
  222. package/fixtures/theme-recipes.json +58600 -0
  223. package/fixtures/theme-resolved.json +23949 -0
  224. package/fixtures/toast-stack.json +215 -0
  225. package/fixtures/tree-guides.json +224 -0
  226. package/fixtures/virtual-list.json +733 -0
  227. package/generated/ExponentialUICatalog.generated.kt +67 -0
  228. package/generated/ExponentialUICatalog.generated.swift +67 -0
  229. package/generated/ExponentialUIThemes.generated.kt +23 -0
  230. package/generated/ExponentialUIThemes.generated.swift +23 -0
  231. package/generated/catalog.descriptions.generated.rs +6 -0
  232. package/generated/catalog.generated.rs +80 -0
  233. package/generated/catalog.themes.generated.rs +34 -0
  234. package/generated/core.descriptions.json +2505 -0
  235. package/generated/core.runtime.json +3609 -0
  236. package/package.json +87 -4
  237. package/themes/exponential.recipes.json +49 -0
  238. package/themes/exponential.theme.json +755 -0
  239. package/themes/neutral.theme.json +5676 -0
  240. package/themes/orange.theme.json +43 -0
  241. package/themes/playful.theme.json +219 -0
  242. package/vendor/a2ui/LICENSE.txt +203 -0
  243. package/vendor/a2ui/README.md +27 -0
  244. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  245. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  246. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  247. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  248. package/vendor/a2ui/v0_9/common_types.json +315 -0
  249. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  250. package/vendor/json-render/LICENSE.txt +201 -0
  251. package/vendor/json-render/README.md +13 -0
@@ -0,0 +1,27 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/layout.ts", "../src/list.ts", "../src/resizable.ts", "../src/direction.ts", "../src/animation.ts", "../src/locale.ts", "../src/code.ts", "../src/text-shimmer.ts", "../src/a11y.ts", "../src/chart.ts", "../src/extension.ts", "../src/define.ts", "../src/css.ts", "../src/builder.ts", "../src/geometry.ts", "../src/overlay.ts", "../src/connector/connector.ts", "../src/connector/app.ts"],
4
+ "sourcesContent": [
5
+ "// Round 2 (docs/round-2-contract.md §7): the shared layout numbers\n// (catalog/layout.json), one place for the TS reference and the generated\n// constants of every target.\n\nimport layoutJson from \"../catalog/layout.json\" with { type: \"json\" }\n\nexport const LAYOUT_CONSTANTS: Readonly<Record<string, number>> = Object.fromEntries(Object.entries(layoutJson).filter(([k]) => !k.startsWith(`$`))) as Record<string, number>\nexport const WINDOW_THRESHOLD: number = layoutJson.windowThreshold\nexport const WINDOW_OVERSCAN: number = layoutJson.windowOverscan\nexport const RESIZE_STEP: number = layoutJson.resizeStep\nexport const PANEL_MIN: number = layoutJson.panelMin\nexport const RESIZE_HANDLE_HIT: number = layoutJson.resizeHandleHit\nexport const FIELD_INTRINSIC_WIDTH: number = layoutJson.fieldIntrinsicWidth\nexport const MEDIA_INTRINSIC_WIDTH: number = layoutJson.mediaIntrinsicWidth\nexport const MEDIA_ASPECT_RATIO: number = layoutJson.mediaAspectRatio\nexport const TREE_GUIDE_COLUMN: number = layoutJson.treeGuideColumn\n/** Round 3: the elbow's corner radius and how far the guide verticals overshoot a row's top edge (paint only). */\nexport const TREE_GUIDE_RADIUS: number = layoutJson.treeGuideRadius\nexport const TREE_GUIDE_BRIDGE: number = layoutJson.treeGuideBridge\n/** EXP-1259: the pending Button's delay, the Skeleton's pulse and the SearchList's bottom fade (feedback-states.json, search-list.json). */\nexport const PENDING_DELAY_MS: number = layoutJson.pendingDelayMs\nexport const SKELETON_PULSE_MS: number = layoutJson.skeletonPulseMs\nexport const SKELETON_OPACITY_LOW: number = layoutJson.skeletonOpacityLow\nexport const SKELETON_OPACITY_HIGH: number = layoutJson.skeletonOpacityHigh\nexport const SKELETON_REDUCED_OPACITY: number = layoutJson.skeletonReducedOpacity\nexport const SEARCH_LIST_FADE: number = layoutJson.searchListFade\n",
6
+ "// Round 2 (docs/round-2-contract.md §4–5): the LIST numbers every renderer\n// shares — template item keys and instance ids (duplicates and empty keys →\n// `#<index>`, instance suffixes accumulate through nested templates), Table\n// row keys, the virtual window over measured extents (vertical OR horizontal:\n// one axis), sticky section headers and scrollToIndex. Pure, mirrored by the\n// Rust core; fixtures/template-items.json and fixtures/virtual-list.json lock\n// it.\n\nimport { absolutePath, readPointer } from \"./dynamic\"\nimport type { ChildTemplate, ReduceIssue, UiNode } from \"./types\"\n\nimport { WINDOW_OVERSCAN, WINDOW_THRESHOLD } from \"./layout\"\nimport { LIMIT_ISSUES, MAX_COMPONENTS, MAX_TEMPLATE_ITEMS } from \"./limits\"\nexport { WINDOW_THRESHOLD, WINDOW_OVERSCAN } from \"./layout\"\n\n/** The instance key of every item: the value at `keyPointer` (relative to\n * the item; objects as their JSON) — `#<index>` when that value is missing,\n * null, `` or a DUPLICATE of an earlier item's key (more `#`s until unique);\n * without a pointer, the index. */\nexport function templateItemKeys(items: readonly unknown[], keyPointer?: string): string[] {\n const seen = new Set<string>()\n return items.map((item, index) => {\n let key = String(index)\n if (keyPointer !== undefined) {\n const v = readPointer(item, keyPointer.startsWith(`/`) ? keyPointer : `/${keyPointer}`)\n const own = v === undefined || v === null || v === `` ? null : typeof v === `object` ? JSON.stringify(v) : String(v)\n key = own !== null && !seen.has(own) ? own : `#${index}`\n while (seen.has(key)) key = `#${key}`\n }\n seen.add(key)\n return key\n })\n}\n\nconst escapeToken = (token: string) => token.replace(/~/g, `~0`).replace(/\\//g, `~1`)\n\n/** Table row keys: the `rowKey` FIELD (default `id`) under the same rules\n * (`#<index>` for missing, empty or duplicate). */\nexport function tableRowKeys(rows: readonly unknown[], rowKey = `id`): string[] {\n return templateItemKeys(rows, `/${escapeToken(rowKey)}`)\n}\n\n/** A key as one instance-suffix segment: `~` → `~0`, `.` → `~1` (as JSON\n * pointer escapes `/`), so dotted keys never collide across nesting levels\n * (`a.b` + `c` vs `a` + `b.c`). */\nexport const instanceSegment = (key: string) => key.replace(/~/g, `~0`).replace(/\\./g, `~1`)\n\nexport interface TemplateInstance {\n /** The item's key (see `templateItemKeys`). */\n key: string\n /** The item's data pointer: its scope (`/posts/3`). */\n path: string\n index: number\n /** The suffix every node of the item wears: the enclosing instance's\n * suffix + `.<key>`, the key escaped by `instanceSegment` (`.a` for an\n * outer item, `.a.0` inside it, `.a~1b` for key `a.b`). A node's painted\n * id = its id + the suffix. */\n instance: string\n}\n\n/** The items a node's `template` renders in a data scope: one per array\n * item at `template.path` (relative to `scope`), keyed by `template.key`.\n * `instance` = the suffix of the item the template sits in (`` at the top). */\nexport function templateInstances(data: unknown, template: ChildTemplate, scope = ``, instance = ``): TemplateInstance[] {\n const path = absolutePath(template.path, { base: scope })\n const list = readPointer(data, path)\n if (!Array.isArray(list)) return []\n const keys = templateItemKeys(list, template.key)\n // VAPP-103: never more than `maxTemplateItems` (a renderer counts them\n // per surface; past the limit the rest is not rendered).\n return list.slice(0, MAX_TEMPLATE_ITEMS).map((_, index) => ({ key: keys[index], path: `${path}/${index}`, index, instance: `${instance}.${instanceSegment(keys[index])}` }))\n}\n\n/** A template site's key in a `TemplateBudget`: the node holding the\n * template + the data scope it sits in. */\nexport const templateSiteKey = (nodeId: string, scope: string) => `${nodeId}\\u0000${scope}`\n\nexport interface TemplateBudget {\n /** Items each visited template site builds (absent = a site the walk\n * never reached: it sits in an item that is not built). */\n allowed: Map<string, number>\n /** ONE issue per build: the template component whose next item did not\n * fit (`LIMIT_ISSUES.templateItems` or `LIMIT_ISSUES.components`); null =\n * everything fits. */\n issue: ReduceIssue | null\n}\n\n/** Nodes one subtree builds by itself (children + slots; the items of a\n * template inside it count when they are instantiated). Iterative. */\nfunction staticSize(root: UiNode): number {\n let n = 0\n const stack: UiNode[] = [root]\n while (stack.length) {\n const node = stack.pop()!\n n++\n for (const slot of Object.values(node.slots ?? {})) stack.push(slot)\n for (const child of node.children) stack.push(child)\n }\n return n\n}\n\ntype BudgetEntry =\n | { node: UiNode; scope: string }\n | { site: string; component: string; tpl: UiNode; path: string; size: number; index: number; length: number }\n\n/** VAPP-103: the template items ONE surface builds, in the Rust layout\n * build's order (depth-first: a node's slots and static children, then its\n * template items, each item's own subtree, nested items included, before\n * the next item). The build holds `maxComponents` nodes: it starts at the\n * reduced root tree's own nodes (children + slots; template definitions\n * aside), and every item costs 1 against `maxTemplateItems` AND its\n * template subtree's nodes. The first item that does not fit either budget\n * and every later one is not built, with ONE issue on that template\n * component. A windowed List (more than `WINDOW_THRESHOLD` rows) mounts\n * its rows on demand: its items are not counted up front. Iterative. */\nexport function templateBudget(root: UiNode, data: unknown, templateNode: (componentId: string) => UiNode | undefined): TemplateBudget {\n const allowed = new Map<string, number>()\n const sizes = new Map<UiNode, number>()\n const sizeOf = (tpl: UiNode) => {\n let n = sizes.get(tpl)\n if (n === undefined) sizes.set(tpl, (n = staticSize(tpl)))\n return n\n }\n let items = 0\n let nodes = staticSize(root)\n let issue: ReduceIssue | null = null\n const stack: BudgetEntry[] = [{ node: root, scope: `` }]\n while (stack.length) {\n const entry = stack.pop()!\n if (`site` in entry) {\n if (issue || entry.index >= entry.length) continue\n if (items >= MAX_TEMPLATE_ITEMS) issue = { id: entry.component, message: LIMIT_ISSUES.templateItems }\n else if (nodes + entry.size > MAX_COMPONENTS) issue = { id: entry.component, message: LIMIT_ISSUES.components }\n if (issue) continue\n items++\n nodes += entry.size\n allowed.set(entry.site, entry.index + 1)\n stack.push({ ...entry, index: entry.index + 1 })\n stack.push({ node: entry.tpl, scope: `${entry.path}/${entry.index}` })\n continue\n }\n const { node, scope } = entry\n const next: BudgetEntry[] = []\n for (const slot of Object.values(node.slots ?? {})) next.push({ node: slot, scope })\n for (const child of node.children) next.push({ node: child, scope })\n const template = node.template\n const tpl = template ? templateNode(template.component) : undefined\n if (template && tpl) {\n const path = absolutePath(template.path, { base: scope })\n const list = readPointer(data, path)\n const windowed = Array.isArray(list) && node.component === `List` && node.children.length + list.length > WINDOW_THRESHOLD\n if (Array.isArray(list) && !windowed) {\n const site = templateSiteKey(node.id, scope)\n allowed.set(site, 0)\n next.push({ site, component: template.component, tpl, path, size: sizeOf(tpl), index: 0, length: list.length })\n }\n }\n for (let i = next.length - 1; i >= 0; i--) stack.push(next[i]!)\n }\n return { allowed, issue }\n}\n\n// ---------------------------------------------------------------------------\n// The virtual window (one axis)\n// ---------------------------------------------------------------------------\n\n/** Start offsets of items laid end to end on one axis with `gap` between\n * them (a `divided` list adds `$control.hairline` to the gap; the divider\n * is centred in it): `offsets[i]` = where item i starts, `offsets[count]` =\n * the content length. */\nexport function itemOffsets(extents: readonly number[], gap = 0): number[] {\n const out = new Array<number>(extents.length + 1)\n let at = 0\n for (let i = 0; i < extents.length; i++) {\n out[i] = at\n at += extents[i] + (i < extents.length - 1 ? gap : 0)\n }\n out[extents.length] = at\n return out\n}\n\n/** Every item's extent on the list's axis: a measured item keeps its\n * extent; an unmeasured one (`null`) takes the MEAN of the measured\n * extents once any item is measured (the content length stays stable while\n * rows measure in, so a fling lands on the real end), else `row` (the\n * theme's `$control.row`). */\nexport function itemExtents(measured: readonly (number | null | undefined)[], row: number): number[] {\n let sum = 0\n let n = 0\n for (const m of measured) {\n if (typeof m === `number`) {\n sum += m\n n++\n }\n }\n const estimate = n ? sum / n : row\n return measured.map((m) => (typeof m === `number` ? m : estimate))\n}\n\nexport interface WindowRange {\n /** First rendered item. */\n start: number\n /** One past the last rendered item. */\n end: number\n /** Space before `start` / after `end - 1` (the spacers). */\n before: number\n after: number\n /** The content length. */\n total: number\n}\n\n/** The first index in [lo, hi) whose `test` holds, for a test that is\n * false then true along the range (binary search); `hi` when none. */\nfunction firstWhere(lo: number, hi: number, test: (i: number) => boolean): number {\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (test(mid)) hi = mid\n else lo = mid + 1\n }\n return lo\n}\n\n/** The items to render for a viewport `[scroll, scroll + viewport)` on the\n * list's axis (both relative to the list's content start; a list without a\n * bounded size windows against its nearest scrolling ancestor or the host\n * viewport, translated into this frame): every item that intersects it\n * (an item ending exactly at the viewport start still counts) plus\n * `overscan` items on each side. Unmeasured items take `itemExtents`'s\n * estimate (the caller's extents). `offsets` = `itemOffsets(extents, gap)` when the\n * caller caches it (recompute only when an extent changes): the window is\n * then two binary searches, O(log n) per scroll frame. */\nexport function virtualWindow(extents: readonly number[], gap: number, scroll: number, viewport: number, overscan = WINDOW_OVERSCAN, offsets?: readonly number[]): WindowRange {\n const count = extents.length\n const off = offsets ?? itemOffsets(extents, gap)\n const total = off[count]\n let start = firstWhere(0, count, (i) => off[i] + extents[i] >= scroll)\n let end = firstWhere(start, count, (i) => off[i] >= scroll + viewport)\n start = Math.max(0, start - overscan)\n end = Math.min(count, end + overscan)\n if (end <= start) return { start, end: start, before: 0, after: total, total }\n const before = off[start]\n const after = total - (off[end - 1] + extents[end - 1])\n return { start, end, before, after, total }\n}\n\nexport type ScrollAlign = `start` | `center` | `end` | `nearest`\n\n/** The scroll offset that brings item `index` into a viewport of length\n * `viewport` currently at `scroll` (the `scrollToIndex` command): `start` =\n * its start at the viewport start (after `inset`, the pinned header's\n * extent), `end` = its end at the viewport end, `center` = centred,\n * `nearest` (default) = the smallest move that shows it whole (none when it\n * already is). Clamped to `[0, max(0, total - viewport)]`. `offsets` = the\n * cached `itemOffsets`, as for `virtualWindow`. */\nexport function scrollOffsetForIndex(extents: readonly number[], gap: number, index: number, viewport: number, scroll: number, align: ScrollAlign = `nearest`, inset = 0, offsets?: readonly number[]): number {\n const off = offsets ?? itemOffsets(extents, gap)\n const total = off[extents.length]\n if (index < 0 || index >= extents.length) return scroll\n const top = off[index]\n const size = extents[index]\n let next = scroll\n if (align === `start`) next = top - inset\n else if (align === `end`) next = top + size - viewport\n else if (align === `center`) next = top + size / 2 - (viewport + inset) / 2\n else if (top - inset < scroll) next = top - inset\n else if (top + size > scroll + viewport) next = top + size - viewport\n return Math.max(0, Math.min(Math.max(0, total - viewport), next))\n}\n\n// ---------------------------------------------------------------------------\n// Sections and sticky headers\n// ---------------------------------------------------------------------------\n\nexport interface ListSection {\n /** The `sectionBy` value its items share (as `displayString`; `` for\n * missing). */\n value: string\n /** Index of the section's first item in the data. */\n start: number\n count: number\n}\n\n/** Consecutive template items with the same `sectionBy` value (a pointer\n * relative to each item) form a section; the data order is kept (sort the\n * data to group it). */\nexport function listSections(items: readonly unknown[], sectionBy: string): ListSection[] {\n const out: ListSection[] = []\n const pointer = sectionBy.startsWith(`/`) ? sectionBy : `/${sectionBy}`\n items.forEach((item, index) => {\n const v = readPointer(item, pointer)\n const value = v === undefined || v === null ? `` : typeof v === `object` ? JSON.stringify(v) : String(v)\n const last = out[out.length - 1]\n if (last && last.value === value) last.count++\n else out.push({ value, start: index, count: 1 })\n })\n return out\n}\n\n/** The flat ROW list a sectioned list windows: a header row before each\n * section's items (`{header: sectionIndex}` / `{item: dataIndex}`). */\nexport function sectionRows(sections: readonly ListSection[]): ({ header: number } | { item: number })[] {\n const rows: ({ header: number } | { item: number })[] = []\n sections.forEach((s, i) => {\n rows.push({ header: i })\n for (let k = 0; k < s.count; k++) rows.push({ item: s.start + k })\n })\n return rows\n}\n\n/** `scrollToIndex` on a SECTIONED list: the DATA index → its flat row\n * (`sectionRows`; -1 = absent → no move), then `scrollOffsetForIndex` over\n * the rows' extents with `inset` = the extent of the item's own section\n * header when headers are sticky (it pins over the item), else 0. */\nexport function scrollOffsetForItem(rows: readonly ({ header: number } | { item: number })[], rowExtents: readonly number[], gap: number, dataIndex: number, viewport: number, scroll: number, align: ScrollAlign = `nearest`, stickyHeaders = false, offsets?: readonly number[]): number {\n const row = rows.findIndex((r) => `item` in r && r.item === dataIndex)\n if (row < 0) return scroll\n let header = row\n while (header >= 0 && !(`header` in rows[header])) header--\n const inset = stickyHeaders && header >= 0 ? rowExtents[header] : 0\n return scrollOffsetForIndex(rowExtents, gap, row, viewport, scroll, align, inset, offsets)\n}\n\n/** The sticky header at a scroll offset: the LAST header row starting at or\n * before `scroll` is pinned at the viewport start — pushed back by the next\n * header as it arrives (its offset = min(scroll, nextHeaderStart −\n * extent)). `rowOffsets` = itemOffsets of the flat rows; `headerRows` = the\n * flat indices of the header rows, ascending. Null before the first header\n * reaches the viewport start. Binary search: O(log headers). The pinned header is rendered even when the\n * window does not contain it. */\nexport function stickyHeader(rowOffsets: readonly number[], rowExtents: readonly number[], headerRows: readonly number[], scroll: number): { row: number; offset: number } | null {\n const pinned = firstWhere(0, headerRows.length, (h) => rowOffsets[headerRows[h]] > scroll) - 1\n if (pinned < 0) return null\n const row = headerRows[pinned]\n const next = headerRows[pinned + 1]\n const extent = rowExtents[row]\n const offset = next === undefined ? scroll : Math.min(scroll, rowOffsets[next] - extent)\n return { row, offset }\n}\n",
7
+ "// Round 2 (docs/round-2-contract.md §1, Resizable): the panel arithmetic\n// every renderer shares, so a drag or a key press gives the same sizes\n// everywhere. Sizes are PERCENTAGES of the group's main axis minus its\n// handles (they sum to 100); only the two panels beside the moved handle\n// change. Pure, mirrored by the Rust core; fixtures/resizable.json locks it.\n\n/** One panel's limits (Resizable `panels[i]`), percent. */\nexport interface PanelLimits {\n min?: number\n max?: number\n /** Dragging below half its `min` collapses it to 0; Enter toggles. */\n collapsible?: boolean\n}\n\nimport { PANEL_MIN, RESIZE_STEP } from \"./layout\"\nexport { PANEL_MIN, RESIZE_HANDLE_HIT, RESIZE_STEP } from \"./layout\"\n\nconst EPS = 1e-9\nconst clampN = (v: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, v))\n/** Results are rounded to 1e-6 so every platform prints the same numbers. */\nconst tidy = (v: number) => {\n const r = Math.round(v * 1e6) / 1e6\n return Object.is(r, -0) ? 0 : r\n}\n\nfunction limitsOf(limits: readonly PanelLimits[] | undefined, i: number, count: number): { min: number; max: number; collapsible: boolean } {\n const l = limits?.[i] ?? {}\n const cap = 100 / Math.max(1, count)\n const min = clampN(typeof l.min === `number` && Number.isFinite(l.min) ? l.min : PANEL_MIN, 0, cap)\n const max = clampN(typeof l.max === `number` && Number.isFinite(l.max) ? l.max : 100, min, 100)\n return { min, max, collapsible: l.collapsible === true }\n}\n\n/** The sizes a group of `count` panels starts with: the valid given sizes\n * (finite, ≥ 0), the missing ones sharing what is left of 100 (equal split\n * when nothing is given), scaled to sum 100, then each clamped into its\n * [min, max] (a collapsible panel may stay at 0) with the difference handed\n * to the panels that still have room, in order. A `min` above 100 / count\n * is lowered to it. */\nexport function normalizeSizes(sizes: readonly unknown[] | undefined, count: number, limits?: readonly PanelLimits[]): number[] {\n if (count <= 0) return []\n const given = Array.from({ length: count }, (_, i) => {\n const v = sizes?.[i]\n return typeof v === `number` && Number.isFinite(v) && v >= 0 ? v : null\n })\n const missing = given.filter((v) => v === null).length\n let out: number[]\n if (missing === count) out = given.map(() => 100 / count)\n else {\n const sum = given.reduce<number>((s, v) => s + (v ?? 0), 0)\n const rest = Math.max(0, 100 - sum)\n out = given.map((v) => v ?? rest / missing)\n }\n const total = out.reduce((s, v) => s + v, 0)\n out = total > EPS ? out.map((v) => (v * 100) / total) : out.map(() => 100 / count)\n const lim = out.map((_, i) => limitsOf(limits, i, count))\n out = out.map((v, i) => (lim[i].collapsible && v <= EPS ? 0 : clampN(v, lim[i].min, lim[i].max)))\n let diff = 100 - out.reduce((s, v) => s + v, 0)\n for (let i = 0; i < count && Math.abs(diff) > EPS; i++) {\n if (lim[i].collapsible && out[i] === 0) continue\n const room = diff > 0 ? lim[i].max - out[i] : lim[i].min - out[i]\n const take = diff > 0 ? Math.min(diff, room) : Math.max(diff, room)\n out[i] += take\n diff -= take\n }\n return out.map(tidy)\n}\n\n/** Move handle `handle` (between panels `handle` and `handle + 1`) by\n * `delta` percentage points (positive = the first panel grows). Always\n * computed from the sizes at the START of a drag (no drift). The move is\n * clamped so both panels stay in their [min, max]; a collapsible panel\n * dragged below half its min collapses to 0 (the other takes its space, if\n * it can), and a collapsed one dragged past half its min reopens: at its\n * min, or where the pointer is when that is further (clamped as above).\n * Other panels never change. */\nexport function resizePanels(sizes: readonly number[], handle: number, delta: number, limits?: readonly PanelLimits[]): number[] {\n const out = [...sizes]\n const a = handle\n const b = handle + 1\n if (a < 0 || b >= sizes.length || !Number.isFinite(delta)) return out.map(tidy)\n const la = limitsOf(limits, a, sizes.length)\n const lb = limitsOf(limits, b, sizes.length)\n const lo = Math.max(la.min - sizes[a], sizes[b] - lb.max)\n const hi = Math.min(la.max - sizes[a], sizes[b] - lb.min)\n let d = clampN(delta, Math.min(lo, 0), Math.max(hi, 0))\n // Collapsing and reopening.\n if (la.collapsible && delta < 0 && sizes[a] > 0 && sizes[a] + delta < la.min / 2 && sizes[b] + sizes[a] <= lb.max + EPS) d = -sizes[a]\n else if (lb.collapsible && delta > 0 && sizes[b] > 0 && sizes[b] - delta < lb.min / 2 && sizes[a] + sizes[b] <= la.max + EPS) d = sizes[b]\n // A collapsed panel dragged past half its min reopens at its min at least,\n // then follows the pointer (up to its max and the neighbour's min).\n else if (la.collapsible && sizes[a] === 0) d = delta >= la.min / 2 && hi >= la.min - EPS ? clampN(delta, la.min, hi) : 0\n else if (lb.collapsible && sizes[b] === 0) d = -delta >= lb.min / 2 && -lo >= lb.min - EPS ? -clampN(-delta, lb.min, -lo) : 0\n out[a] = sizes[a] + d\n out[b] = sizes[b] - d\n return out.map(tidy)\n}\n\nexport type ResizeKey = `ArrowLeft` | `ArrowRight` | `ArrowUp` | `ArrowDown` | `Home` | `End` | `Enter`\n\n/** A key on a focused handle. Arrows move the HANDLE on screen by\n * RESIZE_STEP (horizontal group: Left/Right — in rtl the first panel sits\n * on the right, so ArrowRight shrinks it; vertical group: Up/Down); Home /\n * End take the first panel to its min / max (as far as the second allows);\n * Enter collapses the first panel when collapsible (else the second),\n * reopening a collapsed one at its min. Other keys change nothing. */\nexport function keyboardResize(sizes: readonly number[], handle: number, key: ResizeKey | string, orientation: `horizontal` | `vertical`, direction: `ltr` | `rtl` = `ltr`, limits?: readonly PanelLimits[]): number[] {\n const a = handle\n const b = handle + 1\n if (a < 0 || b >= sizes.length) return sizes.map(tidy)\n const la = limitsOf(limits, a, sizes.length)\n const lb = limitsOf(limits, b, sizes.length)\n const flip = orientation === `horizontal` && direction === `rtl` ? -1 : 1\n const step = (sign: number) => resizePanels(sizes, handle, sign * RESIZE_STEP, limits)\n switch (key) {\n case `ArrowRight`:\n return orientation === `horizontal` ? step(flip) : sizes.map(tidy)\n case `ArrowLeft`:\n return orientation === `horizontal` ? step(-flip) : sizes.map(tidy)\n case `ArrowDown`:\n return orientation === `vertical` ? step(1) : sizes.map(tidy)\n case `ArrowUp`:\n return orientation === `vertical` ? step(-1) : sizes.map(tidy)\n case `Home`:\n return resizePanels(sizes, handle, la.min - sizes[a], limits)\n case `End`:\n return resizePanels(sizes, handle, la.max - sizes[a], limits)\n case `Enter`: {\n const out = [...sizes]\n if (la.collapsible) {\n const d = sizes[a] > 0 ? -sizes[a] : Math.min(la.min, sizes[b] - lb.min)\n if (sizes[b] - d > lb.max + EPS || d === 0) return sizes.map(tidy)\n out[a] += d\n out[b] -= d\n } else if (lb.collapsible) {\n const d = sizes[b] > 0 ? sizes[b] : -Math.min(lb.min, sizes[a] - la.min)\n if (sizes[a] + d > la.max + EPS || d === 0) return sizes.map(tidy)\n out[a] += d\n out[b] -= d\n }\n return out.map(tidy)\n }\n default:\n return sizes.map(tidy)\n }\n}\n\n/** Panel lengths in px on the main axis: the container minus every handle\n * (`handleExtent` each, `$control.hairline`), shared by the sizes. */\nexport function panelExtents(sizes: readonly number[], container: number, handleExtent = 1): number[] {\n const avail = Math.max(0, container - Math.max(0, sizes.length - 1) * handleExtent)\n return sizes.map((s) => tidy((avail * s) / 100))\n}\n\n/** A pointer movement (px on the main axis, screen direction) as the\n * percentage delta `resizePanels` takes (rtl horizontal groups flip it). */\nexport function dragDelta(px: number, container: number, panelCount: number, orientation: `horizontal` | `vertical`, direction: `ltr` | `rtl` = `ltr`, handleExtent = 1): number {\n const avail = Math.max(1, container - Math.max(0, panelCount - 1) * handleExtent)\n const flip = orientation === `horizontal` && direction === `rtl` ? -1 : 1\n return tidy(((px * 100) / avail) * flip)\n}\n",
8
+ "// Round 2 (docs/round-2-contract.md §2, direction): `direction` may sit on\n// ANY node and is inherited; everything direction-dependent reads the\n// NODE's resolved direction, not the surface's: flex row order, logical\n// insets and paddings, mirrored glyphs and `textAlign` start/end (the\n// implicit alignment of text is `start`). fixtures/text-direction.json locks\n// it. Pure.\n\nimport { resolveConditions, type ConditionContext } from \"./style\"\nimport type { UiNode } from \"./types\"\n\nexport type Direction = `ltr` | `rtl`\nexport type PhysicalAlign = `left` | `right` | `center` | `justify`\n\nfunction ownDirection(node: UiNode, ctx: ConditionContext | undefined): Direction | undefined {\n if (!node.style) return undefined\n const style = ctx ? resolveConditions(node.style, ctx) : node.style\n const d = style.direction\n return d === `ltr` || d === `rtl` ? d : undefined\n}\n\n/** Every node's direction: its own style `direction` (resolved against\n * `ctx` when given), else its parent's; the root's parent is the surface\n * (catalog/locale.json `textDirection(locale)`). Slots inherit from their\n * owner. A template's items take the direction of the node that renders\n * them (call again with that direction for the template node). */\nexport function nodeDirections(root: UiNode, surface: Direction, ctx?: ConditionContext): Record<string, Direction> {\n const out: Record<string, Direction> = {}\n const walk = (n: UiNode, inherited: Direction) => {\n const dir = ownDirection(n, ctx) ?? inherited\n out[n.id] = dir\n for (const slot of Object.values(n.slots ?? {})) walk(slot, dir)\n for (const child of n.children) walk(child, dir)\n }\n walk(root, surface)\n return out\n}\n\n/** `start`/`end` (and an absent value = `start`) as the physical side for\n * a direction; `left`, `right`, `center` and `justify` stay. */\nexport function physicalTextAlign(align: unknown, direction: Direction): PhysicalAlign {\n switch (align) {\n case `left`:\n case `right`:\n case `center`:\n case `justify`:\n return align\n case `end`:\n return direction === `rtl` ? `left` : `right`\n default:\n return direction === `rtl` ? `right` : `left`\n }\n}\n\n/** A node's text alignment: its style `textAlign`, else a Text's `align`\n * prop, else `start` — resolved against the node's direction. */\nexport function nodeTextAlign(node: UiNode, direction: Direction, ctx?: ConditionContext): PhysicalAlign {\n const style = node.style ? (ctx ? resolveConditions(node.style, ctx) : node.style) : {}\n return physicalTextAlign(style.textAlign ?? node.props.align, direction)\n}\n",
9
+ "// Round 2 (docs/round-2-contract.md §2, animation): the token-only\n// `animation` style key. catalog/style.json `animations` holds the keyframe\n// sets; this module turns one into what a painter needs at a moment —\n// duration from the theme's motion tokens, per-segment easing, the channel\n// values (opacity, translate, rotate, scale, the shimmer band) — and into\n// CSS @keyframes. fixtures/animations.json locks the sampled frames. Pure.\n\nimport styleJson from \"../catalog/style.json\" with { type: \"json\" }\nimport { parseTokenRef } from \"./catalog\"\nimport type { Easing, ResolvedTheme } from \"./theme-types\"\n\nexport interface Keyframe {\n offset: number\n opacity?: number\n translateX?: number\n translateY?: number\n rotate?: number\n scale?: number\n band?: number\n}\n\nexport interface AnimationDef {\n duration: string\n factor: number\n easing: string\n iterations: number | `infinite`\n rest: number\n keyframes: Keyframe[]\n band?: { color: string; stops: { offset: number; alpha: number }[] }\n}\n\n/** The keyframe sets by name (style.json `animations`, `$comment` aside). */\nexport const ANIMATIONS: Readonly<Record<string, AnimationDef>> = Object.fromEntries(Object.entries(styleJson.animations).filter(([k]) => !k.startsWith(`$`))) as unknown as Record<string, AnimationDef>\nexport const ANIMATION_NAMES: readonly string[] = Object.keys(ANIMATIONS)\n\n/** One frame: every channel at its value (`band` null = no shimmer band). */\nexport interface AnimationFrame {\n opacity: number\n translateX: number\n translateY: number\n rotate: number\n scale: number\n band: number | null\n}\n\nexport interface AnimationTiming {\n durationMs: number\n /** A cubic bezier or `linear`. */\n easing: Easing | `linear`\n iterations: number | `infinite`\n}\n\nconst LINEAR: `linear` = `linear`\n\n/** Duration and easing of an animation under a theme: the `duration` token\n * (or `durationToken`, the node's `animationDuration`) × `factor`. */\nexport function animationTiming(name: string, theme: ResolvedTheme, durationToken?: string): AnimationTiming | null {\n const def = ANIMATIONS[name]\n if (!def) return null\n const token = parseTokenRef(durationToken ?? def.duration)\n const base = token && token.group === `motion` ? theme.tokens.motion[token.name] : undefined\n const fallback = parseTokenRef(def.duration)\n const ms = (base ?? (fallback ? theme.tokens.motion[fallback.name] : 0) ?? 0) * def.factor\n const ease = parseTokenRef(def.easing)\n const easing = def.easing === LINEAR ? LINEAR : ease && ease.group === `ease` ? (theme.tokens.ease[ease.name] ?? LINEAR) : LINEAR\n return { durationMs: ms, easing, iterations: def.iterations }\n}\n\n/** y of a CSS cubic-bezier at x (bisection on x, 60 steps: deterministic). */\nexport function cubicBezier(curve: Easing, x: number): number {\n const [x1, y1, x2, y2] = curve\n if (x <= 0) return 0\n if (x >= 1) return 1\n const bx = (t: number) => 3 * x1 * t * (1 - t) ** 2 + 3 * x2 * t * t * (1 - t) + t ** 3\n const by = (t: number) => 3 * y1 * t * (1 - t) ** 2 + 3 * y2 * t * t * (1 - t) + t ** 3\n let lo = 0\n let hi = 1\n for (let i = 0; i < 60; i++) {\n const mid = (lo + hi) / 2\n if (bx(mid) < x) lo = mid\n else hi = mid\n }\n return by((lo + hi) / 2)\n}\n\nconst CHANNELS = [`opacity`, `translateX`, `translateY`, `rotate`, `scale`] as const\nconst REST: AnimationFrame = { opacity: 1, translateX: 0, translateY: 0, rotate: 0, scale: 1, band: null }\nconst r4 = (v: number) => {\n const r = Math.round(v * 1e4) / 1e4\n return Object.is(r, -0) ? 0 : r\n}\n\nfunction frameAt(def: AnimationDef, progress: number, easing: Easing | `linear`): AnimationFrame {\n const ks = def.keyframes\n let k = 0\n while (k < ks.length - 2 && progress > ks[k + 1].offset) k++\n const a = ks[k]\n const b = ks[Math.min(k + 1, ks.length - 1)]\n const span = b.offset - a.offset\n const local = span > 0 ? Math.max(0, Math.min(1, (progress - a.offset) / span)) : 1\n const t = easing === LINEAR ? local : cubicBezier(easing, local)\n const out: AnimationFrame = { ...REST }\n for (const ch of CHANNELS) {\n const va = a[ch] ?? REST[ch]\n const vb = b[ch] ?? REST[ch]\n out[ch] = r4(va + (vb - va) * t)\n }\n if (a.band !== undefined && b.band !== undefined) out.band = r4(a.band + (b.band - a.band) * t)\n return out\n}\n\n/** The frame `elapsedMs` after the node entered the tree. Finished finite\n * animations hold their last keyframe; reduced motion = the `rest`\n * keyframe (no band). */\nexport function animationFrame(name: string, elapsedMs: number, theme: ResolvedTheme, options: { reducedMotion?: boolean; durationToken?: string } = {}): AnimationFrame | null {\n const def = ANIMATIONS[name]\n const timing = animationTiming(name, theme, options.durationToken)\n if (!def || !timing) return null\n if (options.reducedMotion) {\n const rest = frameAt(def, def.rest, LINEAR)\n return { ...rest, band: null }\n }\n const d = timing.durationMs\n if (d <= 0) return frameAt(def, 1, LINEAR)\n const iterations = timing.iterations === `infinite` ? Infinity : timing.iterations\n const t = Math.max(0, elapsedMs)\n if (t >= d * iterations) return frameAt(def, 1, timing.easing)\n return frameAt(def, (t % d) / d, timing.easing)\n}\n\n/** What a painter shows: the node's own opacity × the frame's (an\n * animation MULTIPLIES opacity; it never replaces it). */\nexport function paintedOpacity(own: number | undefined, frame: AnimationFrame | null): number {\n return r4((own ?? 1) * (frame?.opacity ?? 1))\n}\n\nconst css = (n: number) => String(r4(n))\n\n/** The custom properties the keyframes animate, registered so they\n * interpolate: `--xui-a-opacity` (the animation's opacity factor; the node's\n * `opacity` = own × it, see css.ts styleToCss) and `--xui-band` (the shimmer\n * band). A CSS renderer adds this ONCE per document beside the keyframes. */\nexport const ANIMATION_PROPERTIES_CSS = `@property --xui-a-opacity{syntax:\"<number>\";inherits:false;initial-value:1}@property --xui-band{syntax:\"<number>\";inherits:true;initial-value:1}`\n\n/** Whether a keyframe set animates opacity (its node's CSS opacity then\n * multiplies `--xui-a-opacity`). */\nexport function animatesOpacity(name: string): boolean {\n return ANIMATIONS[name]?.keyframes.some((k) => k.opacity !== undefined) ?? false\n}\n\n/** The CSS `@keyframes xui-<name>` rule (individual `translate`/`rotate`/\n * `scale` properties compose OUTSIDE the node's own `transform`; opacity\n * moves `--xui-a-opacity`, which the node's `opacity` multiplies, so the\n * author's opacity survives the `both` fill; the shimmer band moves\n * `--xui-band`, which the renderer's overlay reads). Needs\n * `ANIMATION_PROPERTIES_CSS`. */\nexport function keyframesCss(name: string): string {\n const def = ANIMATIONS[name]\n if (!def) return ``\n const steps = def.keyframes.map((k) => {\n const decl: string[] = []\n if (k.opacity !== undefined) decl.push(`--xui-a-opacity:${css(k.opacity)}`)\n if (k.translateX !== undefined || k.translateY !== undefined) decl.push(`translate:${css(k.translateX ?? 0)}px ${css(k.translateY ?? 0)}px`)\n if (k.rotate !== undefined) decl.push(`rotate:${css(k.rotate)}deg`)\n if (k.scale !== undefined) decl.push(`scale:${css(k.scale)}`)\n if (k.band !== undefined) decl.push(`--xui-band:${css(k.band)}`)\n return `${css(k.offset * 100)}%{${decl.join(`;`)}}`\n })\n return `@keyframes xui-${name}{${steps.join(``)}}`\n}\n\n/** The CSS `animation` shorthand for a resolved timing (per-segment easing\n * is CSS's own semantics). */\nexport function animationCss(name: string, timing: AnimationTiming): string {\n const easing = timing.easing === LINEAR ? `linear` : `cubic-bezier(${timing.easing.join(`, `)})`\n const iterations = timing.iterations === `infinite` ? `infinite` : String(timing.iterations)\n return `xui-${name} ${timing.durationMs}ms ${easing} ${iterations} both`\n}\n",
10
+ "// Round 1 (docs/round-1-contract.md §4): the locale decisions every renderer\n// shares (catalog/locale.json): the week start by region, the likely region\n// of a bare language, deprecated language codes, the right-to-left languages\n// and the directional glyphs mirrored under rtl. Formatting itself is the\n// platform's ICU; these are the parts that must not differ between them.\n\nimport localeJson from \"../catalog/locale.json\" with { type: \"json\" }\n\nexport const DEFAULT_LOCALE: string = localeJson.default\n\nexport interface LocaleParts {\n language: string\n region: string | null\n}\n\nconst ALIASES: Readonly<Record<string, string>> = localeJson.languageAliases\n\n/** `pt-BR` → {pt, BR}; `zh-Hant-TW` → {zh, TW}; `de` → {de, null}. The\n * region = the first 2-letter or 3-digit subtag after the language; a\n * deprecated language code is normalised (`iw` → `he`, `ji` → `yi`, `in` →\n * `id`: `languageAliases`). */\nexport function parseLocale(locale: string): LocaleParts {\n const tags = locale.replace(/_/g, `-`).split(`-`).filter(Boolean)\n const raw = (tags[0] ?? ``).toLowerCase()\n const language = ALIASES[raw] ?? raw\n const region = tags.slice(1).find((t) => /^[A-Za-z]{2}$|^\\d{3}$/.test(t))\n return { language, region: region ? region.toUpperCase() : null }\n}\n\nconst WEEK_START_BY_REGION: Record<string, number> = (() => {\n const out: Record<string, number> = {}\n for (const [day, regions] of Object.entries(localeJson.weekStart.regions)) for (const r of regions) out[r] = Number(day)\n return out\n})()\n\n/** The region a locale's data comes from: its own, else the language's\n * likely region (CLDR likelySubtags), else null. */\nexport function localeRegion(locale: string): string | null {\n const { language, region } = parseLocale(locale)\n return region ?? (localeJson.likelyRegion as Record<string, string>)[language] ?? null\n}\n\n/** The first day of the week, 0 = Sunday … 6 = Saturday. */\nexport function weekStart(locale: string): number {\n const r = localeRegion(locale)\n return r !== null && r in WEEK_START_BY_REGION ? WEEK_START_BY_REGION[r] : localeJson.weekStart.default\n}\n\n/** `rtl` for the right-to-left languages, else `ltr`. */\nexport function textDirection(locale: string): `ltr` | `rtl` {\n return localeJson.rtl.includes(parseLocale(locale).language) ? `rtl` : `ltr`\n}\n\n/** The directional glyphs (icons.json names) a painter mirrors under rtl. */\nexport const RTL_MIRRORED_ICONS: readonly string[] = localeJson.rtlMirroredIcons\n\n/** True when `icon` is drawn mirrored (scaleX(-1), outermost) in this\n * direction. */\nexport function mirrorsInRtl(icon: string, direction: `ltr` | `rtl`): boolean {\n return direction === `rtl` && RTL_MIRRORED_ICONS.includes(icon)\n}\n",
11
+ "// Round 1 (docs/round-1-contract.md §3): CodeBlock's BUILT-IN tokenizer, the\n// reference every renderer mirrors (catalog/code.json `$comment` lists the\n// rules in order; fixtures/code-tokens.json locks the output). Deliberately\n// small: one forward scan, no regex backtracking, no nesting beyond markup\n// tags, so the Rust core, Swift and Kotlin port it line by line.\n\nimport codeJson from \"../catalog/code.json\" with { type: \"json\" }\n\nexport interface CodeToken {\n kind: string\n text: string\n}\n\ninterface LanguageSpec {\n plain?: boolean\n ansi?: boolean\n lineKinds?: Record<string, string>\n lineComment?: string[]\n blockComment?: [string, string][]\n strings?: string[]\n multiline?: string[]\n keyStrings?: boolean\n markup?: boolean\n numbers?: boolean\n identExtra?: string\n keywords?: string[]\n caseInsensitive?: boolean\n keyIdents?: boolean\n typeNames?: string[]\n types?: string\n operators?: string\n punctuation?: string\n}\n\nexport const CODE_LANGUAGES: Record<string, LanguageSpec> = codeJson.languages as unknown as Record<string, LanguageSpec>\nexport const CODE_LANGUAGE_NAMES: readonly string[] = Object.keys(CODE_LANGUAGES)\n\nconst isDigit = (c: string | undefined) => c !== undefined && c >= `0` && c <= `9`\nconst isAlpha = (c: string | undefined) => c !== undefined && ((c >= `a` && c <= `z`) || (c >= `A` && c <= `Z`))\nconst isSpace = (c: string | undefined) => c === ` ` || c === `\\t`\n\n/** The next char after `j` that is not a space or tab. */\nfunction nextNonSpace(code: string, j: number): string | undefined {\n let k = j\n while (isSpace(code[k])) k++\n return code[k]\n}\n\n/** The source as flat tokens (text may span lines). `lineStart` = whether\n * index 0 sits at the start of a line (an ansi run that begins mid-line\n * does not). */\nfunction scan(code: string, spec: LanguageSpec, lineStart = true): CodeToken[] {\n const out: CodeToken[] = []\n const n = code.length\n const operators = spec.operators ?? codeJson.defaults.operators\n const punctuation = spec.punctuation ?? codeJson.defaults.punctuation\n const extra = spec.identExtra ?? ``\n const identStart = (c: string | undefined) => isAlpha(c) || c === `_` || c === `$` || (c !== undefined && extra.includes(c))\n const identPart = (c: string | undefined) => identStart(c) || isDigit(c)\n const keywords = new Set(spec.keywords ?? [])\n const typeNames = new Set(spec.typeNames ?? [])\n const push = (kind: string, text: string) => out.push({ kind, text })\n const lastSignificant = () => {\n for (let k = out.length - 1; k >= 0; k--) if (out[k].text.trim() !== ``) return out[k]\n return undefined\n }\n if (spec.plain) return code ? [{ kind: `plain`, text: code }] : []\n let i = 0\n let inTag = false\n while (i < n) {\n const c = code[i]\n if (c === `\\n`) {\n push(`plain`, c)\n i++\n continue\n }\n // (1) line kinds\n if (spec.lineKinds && (i === 0 ? lineStart : code[i - 1] === `\\n` || isSpaceRunToLineStart(code, i, lineStart))) {\n // EXP-1324: the LONGEST listed prefix wins (`FAILED` over `FAIL`).\n let prefix: string | undefined\n for (const p of Object.keys(spec.lineKinds)) if (code.startsWith(p, i) && (!prefix || p.length > prefix.length)) prefix = p\n if (prefix && !isSpace(c)) {\n let j = i\n while (j < n && code[j] !== `\\n`) j++\n push(spec.lineKinds[prefix], code.slice(i, j))\n i = j\n continue\n }\n }\n // (2) line comments\n const line = !inTag ? (spec.lineComment ?? []).find((p) => code.startsWith(p, i)) : undefined\n if (line) {\n let j = i\n while (j < n && code[j] !== `\\n`) j++\n push(`comment`, code.slice(i, j))\n i = j\n continue\n }\n // (3) block comments\n const block = !inTag ? (spec.blockComment ?? []).find(([open]) => code.startsWith(open, i)) : undefined\n if (block) {\n const end = code.indexOf(block[1], i + block[0].length)\n const j = end < 0 ? n : end + block[1].length\n push(`comment`, code.slice(i, j))\n i = j\n continue\n }\n // (4) strings\n if ((spec.strings ?? []).includes(c) && (!spec.markup || inTag)) {\n const multi = (spec.multiline ?? []).includes(c)\n let j = i + 1\n while (j < n) {\n if (code[j] === `\\\\`) {\n j += 2\n continue\n }\n if (code[j] === c) {\n j++\n break\n }\n if (code[j] === `\\n` && !multi) break\n j++\n }\n j = Math.min(j, n)\n const kind = spec.keyStrings && nextNonSpace(code, j) === `:` ? `property` : `string`\n push(kind, code.slice(i, j))\n i = j\n continue\n }\n // (5) markup\n if (spec.markup) {\n if (!inTag) {\n if (c === `<` && (isAlpha(code[i + 1]) || code[i + 1] === `/` || code[i + 1] === `!`)) {\n const open = code[i + 1] === `/` ? `</` : `<`\n push(`punctuation`, open)\n let j = i + open.length\n const start = j\n while (j < n && (isAlpha(code[j]) || isDigit(code[j]) || code[j] === `-` || code[j] === `:` || code[j] === `!`)) j++\n if (j > start) push(`tag`, code.slice(start, j))\n inTag = true\n i = j\n continue\n }\n let j = i\n while (j < n && code[j] !== `<` && code[j] !== `\\n`) j++\n if (j === i) j = i + 1\n push(`plain`, code.slice(i, j))\n i = j\n continue\n }\n if (c === `>` || code.startsWith(`/>`, i)) {\n const close = c === `>` ? `>` : `/>`\n push(`punctuation`, close)\n inTag = false\n i += close.length\n continue\n }\n if (c === `=`) {\n push(`operator`, c)\n i++\n continue\n }\n if (isAlpha(c) || c === `_` || c === `:` || c === `@`) {\n let j = i\n while (j < n && (isAlpha(code[j]) || isDigit(code[j]) || `_:@.-`.includes(code[j]))) j++\n push(`attribute`, code.slice(i, j))\n i = j\n continue\n }\n if (isSpace(c)) {\n let j = i\n while (isSpace(code[j])) j++\n push(`plain`, code.slice(i, j))\n i = j\n continue\n }\n push(`plain`, c)\n i++\n continue\n }\n // (6) numbers\n if (spec.numbers !== false && (isDigit(c) || (c === `.` && isDigit(code[i + 1])))) {\n let j = i + 1\n while (j < n && (isDigit(code[j]) || isAlpha(code[j]) || code[j] === `_` || code[j] === `.`)) j++\n push(`number`, code.slice(i, j))\n i = j\n continue\n }\n // (7) identifiers\n if (identStart(c)) {\n let j = i + 1\n while (j < n && identPart(code[j])) j++\n const word = code.slice(i, j)\n const key = spec.caseInsensitive ? word.toLowerCase() : word\n const next = nextNonSpace(code, j)\n const after = (() => {\n let k = j\n while (isSpace(code[k])) k++\n return code[k + 1]\n })()\n const prev = lastSignificant()\n let kind = `plain`\n if (keywords.has(key)) kind = `keyword`\n else if (spec.keyIdents && next === `:` && after !== `:`) kind = `property`\n else if (next === `(`) kind = `function`\n else if (prev && prev.kind === `punctuation` && prev.text.endsWith(`.`)) kind = `property`\n else if (typeNames.has(word) || (spec.types === `capitalized` && word[0] >= `A` && word[0] <= `Z`)) kind = `type`\n push(kind, word)\n i = j\n continue\n }\n // (8) spaces\n if (isSpace(c)) {\n let j = i\n while (isSpace(code[j])) j++\n push(`plain`, code.slice(i, j))\n i = j\n continue\n }\n // (9) operators\n if (operators.includes(c)) {\n let j = i\n while (j < n && operators.includes(code[j])) j++\n push(`operator`, code.slice(i, j))\n i = j\n continue\n }\n // (10) punctuation, (11) anything else\n push(punctuation.includes(c) ? `punctuation` : `plain`, c)\n i++\n }\n return out\n}\n\n/** True when only spaces/tabs separate `i` from the start of its line\n * (`lineStart` = whether the text's index 0 starts a line). */\nfunction isSpaceRunToLineStart(code: string, i: number, lineStart = true): boolean {\n let k = i - 1\n while (k >= 0 && isSpace(code[k])) k--\n return k < 0 ? lineStart : code[k] === `\\n`\n}\n\n/** EXP-1324 `ansi`: one run of the escape-free text, with the SGR colour\n * (a codeToken kind) it was printed in, or null. */\nexport interface AnsiRun {\n kind: string | null\n text: string\n}\n\nconst isCsiParam = (c: number) => c >= 0x30 && c <= 0x3f\nconst isCsiIntermediate = (c: number) => c >= 0x20 && c <= 0x2f\nconst isCsiFinal = (c: number) => c >= 0x40 && c <= 0x7e\n\n/** The SGR colour after applying `params` (left to right) to `kind`:\n * 31/91 error, 32/92 success, 33/93 warning, 2/90 comment, 0/39/empty\n * reset; any other parameter leaves the colour as it was. */\nfunction sgrKind(params: string, kind: string | null): string | null {\n let out = kind\n for (const raw of params.split(`;`)) {\n const p = raw === `` ? 0 : Number(raw)\n if (p === 0 || p === 39) out = null\n else if (p === 31 || p === 91) out = `error`\n else if (p === 32 || p === 92) out = `success`\n else if (p === 33 || p === 93) out = `warning`\n else if (p === 2 || p === 90) out = `comment`\n }\n return out\n}\n\n/** The source with every ANSI CSI escape removed, split into runs by SGR\n * colour (catalog/code.json `$comment`, `ansi`). Adjacent runs of one\n * colour merge; an incomplete escape stays text. */\nexport function ansiRuns(source: string): AnsiRun[] {\n const runs: AnsiRun[] = []\n let kind: string | null = null\n let text = ``\n const flush = () => {\n if (text === ``) return\n const last = runs[runs.length - 1]\n if (last && last.kind === kind) last.text += text\n else runs.push({ kind, text })\n text = ``\n }\n let i = 0\n const n = source.length\n while (i < n) {\n if (source.charCodeAt(i) === 0x1b && source[i + 1] === `[`) {\n let j = i + 2\n while (j < n && isCsiParam(source.charCodeAt(j))) j++\n const params = source.slice(i + 2, j)\n while (j < n && isCsiIntermediate(source.charCodeAt(j))) j++\n if (j < n && isCsiFinal(source.charCodeAt(j))) {\n if (source[j] === `m`) {\n const next = sgrKind(params, kind)\n if (next !== kind) {\n flush()\n kind = next\n }\n }\n i = j + 1\n continue\n }\n }\n text += source[i]\n i++\n }\n flush()\n return runs\n}\n\n/** `ansi`: coloured runs verbatim, uncoloured ones through the scanner. */\nfunction scanAnsi(code: string, spec: LanguageSpec): CodeToken[] {\n const out: CodeToken[] = []\n let atLine = true\n for (const run of ansiRuns(code)) {\n if (run.kind) out.push({ kind: run.kind, text: run.text })\n else out.push(...scan(run.text, spec, atLine))\n atLine = isSpaceRunToLineStart(run.text, run.text.length, atLine)\n }\n return out\n}\n\n/** The text a CodeBlock shows and copies: the source with CRLF → LF and,\n * for `ansi`, every escape removed. */\nexport function codeText(source: string, language: string): string {\n const code = source.replace(/\\r\\n?/g, `\\n`)\n return CODE_LANGUAGES[language]?.ansi ? ansiRuns(code).map((r) => r.text).join(``) : code\n}\n\n/** The source tokenized per LINE: each line's tokens concatenate to exactly\n * its text (no `\\n`), adjacent tokens of one kind merged; an empty line is\n * an empty list. An unknown language tokenizes as `plain`. */\nexport function tokenizeCode(source: string, language: string): CodeToken[][] {\n const code = source.replace(/\\r\\n?/g, `\\n`)\n const spec = CODE_LANGUAGES[language] ?? CODE_LANGUAGES.plain\n const lines: CodeToken[][] = [[]]\n for (const token of spec.ansi ? scanAnsi(code, spec) : scan(code, spec)) {\n const pieces = token.text.split(`\\n`)\n pieces.forEach((piece, index) => {\n if (index > 0) lines.push([])\n if (piece === ``) return\n const line = lines[lines.length - 1]\n const last = line[line.length - 1]\n if (last && last.kind === token.kind) last.text += piece\n else line.push({ kind: token.kind, text: piece })\n })\n }\n return lines\n}\n",
12
+ "// EXP-1324: the Text `shimmer` (catalog/style.json `textShimmer`): the\n// colours a painter fills the glyphs with while a TraceItem runs. Pure; the\n// Rust core's `text_shimmer` ports it and fixtures/text-shimmer.json locks it.\n\nimport styleJson from \"../catalog/style.json\" with { type: \"json\" }\nimport { parseColor, toHex } from \"./color\"\n\nexport const TEXT_SHIMMER = styleJson.textShimmer\n\nexport interface TextShimmer {\n /** The text colour (`#rrggbb[aa]`). */\n base: string\n /** The band's centre. */\n highlight: string\n /** The 50% OKLab mix at ± spread/2. */\n mid: string\n durationMs: number\n angleDeg: number\n spreadPx: number\n}\n\ntype Lab = [number, number, number]\n\nconst toLinear = (c: number) => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4))\nconst toGamma = (c: number) => {\n const x = Math.max(0, Math.min(1, c))\n return x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055\n}\n\nfunction rgbToOklab(r: number, g: number, b: number): Lab {\n const [lr, lg, lb] = [toLinear(r / 255), toLinear(g / 255), toLinear(b / 255)]\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb)\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb)\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb)\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ]\n}\n\nfunction oklabToRgb([L, a, b]: Lab): [number, number, number] {\n const l = Math.pow(L + 0.3963377774 * a + 0.2158037573 * b, 3)\n const m = Math.pow(L - 0.1055613458 * a - 0.0638541728 * b, 3)\n const s = Math.pow(L - 0.0894841775 * a - 1.291485548 * b, 3)\n return [\n toGamma(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s) * 255,\n toGamma(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s) * 255,\n toGamma(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s) * 255,\n ]\n}\n\nconst hex = (lab: Lab, alpha: number) => {\n const [r, g, b] = oklabToRgb(lab)\n return toHex({ r, g, b, a: alpha })\n}\n\n/** The shimmer colours for a text colour (`#rrggbb[aa]`); `dark` = the\n * surface's dark mode. An unparsable colour shimmers from black. */\nexport function textShimmer(color: string, dark: boolean): TextShimmer {\n const t = TEXT_SHIMMER\n const c = parseColor(color) ?? { r: 0, g: 0, b: 0, a: 1 }\n const base = rgbToOklab(c.r, c.g, c.b)\n let high: Lab = base\n let highAlpha = c.a * t.lightAlphaFactor\n if (dark) {\n high = [Math.min(1, Math.max(t.highlightLightnessMin, base[0] + t.highlightLightnessBoost)), base[1], base[2]]\n highAlpha = Math.min(1, c.a + t.highlightAlphaBoost)\n }\n const sum = c.a + highAlpha\n const mid: Lab = sum > 0 ? [0, 1, 2].map((i) => (base[i] * c.a + high[i] * highAlpha) / sum) as Lab : base\n return {\n base: toHex(c),\n highlight: hex(high, highAlpha),\n mid: hex(mid, sum / 2),\n durationMs: t.durationMs,\n angleDeg: t.angleDeg,\n spreadPx: t.spreadPx,\n }\n}\n",
13
+ "// Round 1 (docs/round-1-contract.md §6): the accessibility contract as data\n// (catalog/a11y.json): the machine-readable role vocabulary, per component\n// its role, prose notes and keyboard expectations, the rules every component\n// keeps, and the commands a host may send a surface. Macro parts carry their\n// role, states and name on the expanded node (`accessibility`, from the\n// template's `$a11y`, src/macros.ts).\n\nimport a11yJson from \"../catalog/a11y.json\" with { type: \"json\" }\n\nexport interface ComponentA11y {\n /** The role of the component's main accessible object: one of `A11Y_ROLES`. */\n role: string\n /** Prose: composite parts, states, which built-in strings name it. */\n notes: string\n /** Keyboard expectations, one line per key group. */\n keys: readonly string[]\n}\n\n/** The machine-readable roles: ARIA names, plus `text` (static text) and\n * `hidden` (out of the accessibility tree). */\nexport const A11Y_ROLES: readonly string[] = a11yJson.roles\nexport const A11Y_RULES: readonly string[] = a11yJson.rules\nexport const A11Y_COMMANDS: Readonly<Record<string, { args: readonly string[]; description: string }>> = a11yJson.commands\nexport const COMPONENT_A11Y: Readonly<Record<string, ComponentA11y>> = a11yJson.components\n\n/** A component's entry, if it has one (extensions declare their own). */\nexport function componentA11y(name: string): ComponentA11y | undefined {\n return COMPONENT_A11Y[name]\n}\n\n/** True for a role of the vocabulary. */\nexport function isA11yRole(value: unknown): boolean {\n return typeof value === `string` && A11Y_ROLES.includes(value)\n}\n",
14
+ "// Round 1 (docs/round-1-contract.md §3, Chart): the numbers every painter\n// must agree on so a chart is pixel-faithful across platforms — the value\n// extent per kind and the \"nice\" axis ticks (Heckbert's nice numbers). Pure,\n// mirrored by the Rust core and the native painters; geometry (bars, arcs)\n// stays each painter's, fed by these.\n\nexport interface ChartSeries {\n name: string\n values: readonly number[]\n tone?: string\n}\n\n/** The value range the y axis spans: `min` defaults to 0 (lower when a value\n * is negative), `max` to the largest value (at least 0) — for `stackedBar`\n * the largest category sum of the POSITIVE values, and `min` the lowest sum\n * of the NEGATIVE ones (positive and negative stacks grow apart from 0).\n * Sparkline spans its own min..max. Pie/donut use the same. Non-finite\n * values are skipped. Loops, never spreads: a 150k-point series is fine. */\nexport function chartExtent(kind: string, series: readonly ChartSeries[], min?: number, max?: number): { min: number; max: number } {\n let lo = Infinity\n let hi = -Infinity\n if (kind === `stackedBar`) {\n let n = 0\n for (const s of series) n = Math.max(n, s.values.length)\n for (let i = 0; i < n; i++) {\n let pos = 0\n let neg = 0\n for (const s of series) {\n const v = s.values[i]\n if (!Number.isFinite(v)) continue\n if (v > 0) pos += v\n else neg += v\n }\n if (pos > hi) hi = pos\n if (neg < lo) lo = neg\n }\n } else {\n for (const s of series)\n for (const v of s.values) {\n if (!Number.isFinite(v)) continue\n if (v < lo) lo = v\n if (v > hi) hi = v\n }\n }\n if (kind !== `sparkline`) {\n lo = Math.min(0, lo)\n hi = Math.max(0, hi)\n }\n if (!Number.isFinite(lo)) lo = 0\n if (!Number.isFinite(hi)) hi = 0\n lo = min ?? lo\n hi = max ?? hi\n if (hi <= lo) hi = lo + 1\n return { min: lo, max: hi }\n}\n\n/** The numbers a Chart's accessible name fills `$string.chartSummary` with:\n * the series names (\", \"-joined) and the extent of the data (not the axis). */\nexport function chartSummaryParams(series: readonly ChartSeries[]): { series: string; min: number; max: number } {\n let lo = Infinity\n let hi = -Infinity\n for (const s of series)\n for (const v of s.values) {\n if (!Number.isFinite(v)) continue\n if (v < lo) lo = v\n if (v > hi) hi = v\n }\n return { series: series.map((s) => s.name).filter(Boolean).join(`, `), min: Number.isFinite(lo) ? lo : 0, max: Number.isFinite(hi) ? hi : 0 }\n}\n\n/** The numbers a sparkline's accessible name fills `$string.sparklineSummary`\n * with: first, last, min, max of the finite values (0 when there are none). */\nexport function sparklineSummaryParams(values: readonly number[]): { first: number; last: number; min: number; max: number } {\n const finite = values.filter((v) => Number.isFinite(v))\n if (finite.length === 0) return { first: 0, last: 0, min: 0, max: 0 }\n let lo = Infinity\n let hi = -Infinity\n for (const v of finite) {\n if (v < lo) lo = v\n if (v > hi) hi = v\n }\n return { first: finite[0], last: finite[finite.length - 1], min: lo, max: hi }\n}\n\nfunction niceNum(x: number, round: boolean): number {\n const exp = Math.floor(Math.log10(x))\n const f = x / 10 ** exp\n const nf = round ? (f < 1.5 ? 1 : f < 3 ? 2 : f < 7 ? 5 : 10) : f <= 1 ? 1 : f <= 2 ? 2 : f <= 5 ? 5 : 10\n return nf * 10 ** exp\n}\n\n/** Axis ticks over [min, max]: a nice step (1, 2 or 5 × 10^n) giving about\n * `target` ticks, the range widened to whole steps, every tick rounded to\n * the step's decimals. */\nexport function niceTicks(min: number, max: number, target = 5): { min: number; max: number; step: number; ticks: number[] } {\n const lo = Math.min(min, max)\n const hi = max === min ? min + 1 : Math.max(min, max)\n const range = niceNum(hi - lo, false)\n const step = niceNum(range / Math.max(1, target - 1), true)\n const decimals = Math.max(0, -Math.floor(Math.log10(step)))\n const fix = (v: number) => Number(v.toFixed(decimals))\n const niceMin = fix(Math.floor(lo / step) * step)\n const niceMax = fix(Math.ceil(hi / step) * step)\n const ticks: number[] = []\n for (let v = niceMin, i = 0; v <= niceMax + step / 2 && i < 100; i++, v = niceMin + i * step) ticks.push(fix(v))\n return { min: niceMin, max: niceMax, step, ticks }\n}\n\n/** The colour token of series (or slice) i: its tone's colour when set,\n * else `$color.chart1..8` in order, wrapping. */\nexport function seriesColor(index: number, tone?: string): string {\n if (tone) return tone === `danger` ? `$color.destructive` : tone === `neutral` ? `$color.mutedForeground` : `$color.${tone}`\n return `$color.chart${(index % 8) + 1}`\n}\n\n/** The donut's hole as a share of its radius (pie = 0). */\nexport const DONUT_HOLE = 0.6\n/** Rows past which Table and List window their children (catalog/layout.json). */\nexport { WINDOW_THRESHOLD } from \"./layout\"\n",
15
+ "// VAPP-85: extension catalogs. An extension = its own catalog id, `extends`\n// the core, its components (natives a host paints, macros expanded from its\n// own templates) and no name that shadows a core one. The Exponential app's\n// extension (IssueRow, RunRow, …) lives with the app (packages/ui) and is the\n// first user of this; apps add theirs the same way.\n\nimport { CORE_CATALOG_ID, coreCatalog } from \"./catalog\"\nimport type { ExtensionDef } from \"./types\"\n\nconst CATALOG_ID = /^https?:\\/\\/[^\\s]+$/\nconst NAME = /^[A-Z][A-Za-z0-9]*$/\n\nexport function validateExtension(def: ExtensionDef): string[] {\n const errors: string[] = []\n if (!CATALOG_ID.test(def.id)) errors.push(`id must be a URL-shaped catalog id`)\n if (def.extends !== CORE_CATALOG_ID) errors.push(`extends must be ${CORE_CATALOG_ID}`)\n if (!def.name) errors.push(`name is required`)\n const names = Object.keys(def.components)\n if (names.length === 0) errors.push(`an extension defines at least one component`)\n for (const [name, component] of Object.entries(def.components)) {\n if (!NAME.test(name)) errors.push(`${name}: component names are PascalCase`)\n if (name in coreCatalog.components) errors.push(`${name}: shadows a core component`)\n if (!component.description) errors.push(`${name}: description is required`)\n for (const [prop, schema] of Object.entries(component.props)) {\n if (!schema.description) errors.push(`${name}.${prop}: description is required`)\n if (schema.type === `enum` && schema.enum && !(schema.enum in coreCatalog.enums) && !(schema.enum in (def.enums ?? {})))\n errors.push(`${name}.${prop}: enum ${schema.enum} is not defined`)\n if (schema.type === `object` && schema.shape && !(schema.shape in coreCatalog.defs) && !(schema.shape in (def.defs ?? {})))\n errors.push(`${name}.${prop}: shape ${schema.shape} is not defined`)\n }\n if (component.kind === `macro` && !def.macros?.[name]) errors.push(`${name}: a macro needs a template in macros`)\n }\n for (const name of Object.keys(def.macros ?? {})) {\n if (def.components[name]?.kind !== `macro`) errors.push(`macros.${name}: no macro component of that name`)\n }\n for (const name of Object.keys(def.enums ?? {})) {\n if (name in coreCatalog.enums) errors.push(`enums.${name}: shadows a core enum`)\n }\n return errors\n}\n\n/** The definition, checked; throws with every problem listed. */\nexport function defineExtension(def: ExtensionDef): ExtensionDef {\n const errors = validateExtension(def)\n if (errors.length > 0) throw new Error(`extension ${def.id}:\\n${errors.join(`\\n`)}`)\n return def\n}\n",
16
+ "// VAPP-108: the typed authoring DSL for humans. `defineSurface` takes a\n// nested, TYPED tree (every component's props autocomplete from the catalog\n// types generate.ts emits into catalog.generated.ts) and returns the flat\n// A2UI list, the messages a host consumes, and the validator's issues: the\n// same reducer an agent's JSON goes through, so what compiles is what\n// renders ×4. No runtime dependency beyond the reducer.\n//\n// const surface = defineSurface(\n// ui.Stack({ gap: \"md\" }, [\n// ui.Section({ title: \"Devices\", icon: \"nav-devices\" }),\n// ui.List({ divided: true }, { template: ui.Row({ title: bind(\"label\") }), path: \"/devices/rows\", key: \"id\" }),\n// ]),\n// { surfaceId: \"devices\" }\n// )\n// surface.issues // [] when valid\n// surface.components // the flat list (updateComponents)\n// surface.messages // createSurface + updateComponents (+ updateDataModel)\n// surface.jsonl // what an agent would send\n\nimport { COMPONENT_NAMES, type ComponentName, type ComponentProps } from \"./catalog.generated\"\nimport { CORE_CATALOG_ID } from \"./catalog\"\nimport { reduceSurface } from \"./reducer\"\nimport type { Action, AuthoredAccessibility, DataBinding, ExtensionDef, FlatComponent, FunctionCall, ReduceIssue, UiNode, Visible } from \"./types\"\n\n/** A node of the typed tree: `component` picks the props type. */\nexport interface SurfaceNode<C extends ComponentName = ComponentName> {\n /** Explicit id; `defineSurface` assigns `root` to the top node and `<component>-<n>` to the rest. */\n id?: string\n component: C\n props: ComponentProps[C]\n style?: Record<string, unknown>\n on?: Record<string, Action>\n visible?: Visible\n accessibility?: AuthoredAccessibility\n /** Static children, or one template rendered per item of `path`. */\n children?: SurfaceNode[] | TemplateChildren\n slots?: Record<string, SurfaceNode>\n}\n\nexport interface TemplateChildren {\n template: SurfaceNode\n /** The JSON pointer of the array. */\n path: string\n /** The item field that identifies it. */\n key?: string\n}\n\nexport interface DefineOptions {\n surfaceId?: string\n catalogId?: string\n extensions?: readonly ExtensionDef[]\n /** Initial data model writes: pointer → value (one updateDataModel each). */\n data?: Record<string, unknown>\n}\n\nexport interface DefinedSurface {\n surfaceId: string\n catalogId: string\n components: FlatComponent[]\n issues: ReduceIssue[]\n /** The normalized tree (macros expanded), for a host that paints directly. */\n root: UiNode\n messages: Record<string, unknown>[]\n jsonl: string\n}\n\n/** A data binding: `{ path }`. A pointer relative to the item inside a template. */\nexport const bind = (path: string): DataBinding => ({ path })\n/** A client function call: `{ call, args }`. */\nexport const call = (name: string, args?: Record<string, unknown>): FunctionCall => ({ call: name, ...(args ? { args } : {}) })\n/** An action that sends an event to the agent / server. */\nexport const event = (name: string, context?: Record<string, unknown>): Action => ({ event: { name, ...(context ? { context } : {}) } })\n/** An action that runs a client function (`set`, `openUrl`, `app.toast`…). */\nexport const run = (name: string, args?: Record<string, unknown>): Action => ({ functionCall: call(name, args) })\n\ntype Extra<C extends ComponentName> = Omit<SurfaceNode<C>, `component` | `props` | `children`>\n\n/** The typed factory per component: `ui.Stack(props, children?, extra?)`. */\nexport type Factory<C extends ComponentName> = (props: ComponentProps[C], children?: SurfaceNode[] | TemplateChildren, extra?: Extra<C>) => SurfaceNode<C>\n\n/** `ui.Card({ title: \"…\" }, [ui.Text({ text: \"…\" })])`: one factory per\n * catalog component, typed by name. Props only: style, on, visible,\n * slots and an explicit id go in the third argument. */\nexport const ui: { [C in ComponentName]: Factory<C> } = Object.fromEntries(\n COMPONENT_NAMES.map((name) => [name, ((props: ComponentProps[typeof name], children?: SurfaceNode[] | TemplateChildren, extra?: Extra<typeof name>) => ({ component: name, props, ...(children ? { children } : {}), ...extra })) as Factory<typeof name>])\n) as { [C in ComponentName]: Factory<C> }\n\n/** A typed node from a name (for a component picked at runtime). */\nexport function el<C extends ComponentName>(component: C, props: ComponentProps[C], children?: SurfaceNode[] | TemplateChildren, extra?: Extra<C>): SurfaceNode<C> {\n return { component, props, ...(children ? { children } : {}), ...extra }\n}\n\n/** The tree → the flat list, ids assigned (the top node is `root`; an\n * unnamed node is `<component lower-case>-<n>`, unique within the tree). */\nexport function flattenSurface(tree: SurfaceNode, rootId = `root`): FlatComponent[] {\n const out: FlatComponent[] = []\n const taken = new Set<string>()\n const counters = new Map<string, number>()\n const nameOf = (n: SurfaceNode, isRoot: boolean): string => {\n if (n.id) {\n if (taken.has(n.id)) throw new Error(`defineSurface: duplicate id \"${n.id}\"`)\n taken.add(n.id)\n return n.id\n }\n if (isRoot && !taken.has(rootId)) {\n taken.add(rootId)\n return rootId\n }\n const base = n.component.charAt(0).toLowerCase() + n.component.slice(1)\n let id: string\n do {\n const next = (counters.get(base) ?? 0) + 1\n counters.set(base, next)\n id = `${base}-${next}`\n } while (taken.has(id))\n taken.add(id)\n return id\n }\n const walk = (n: SurfaceNode, isRoot: boolean): string => {\n const id = nameOf(n, isRoot)\n const flat: FlatComponent = { id, component: n.component, ...(n.props as Record<string, unknown>) }\n if (n.style) flat.style = n.style\n if (n.on) flat.on = n.on\n if (n.visible !== undefined) flat.visible = n.visible\n if (n.accessibility) flat.accessibility = n.accessibility\n out.push(flat)\n if (Array.isArray(n.children)) flat.children = n.children.map((c) => walk(c, false))\n else if (n.children) {\n const t = walk(n.children.template, false)\n flat.children = { componentId: t, path: n.children.path, ...(n.children.key ? { key: n.children.key } : {}) }\n }\n if (n.slots) flat.slots = Object.fromEntries(Object.entries(n.slots).map(([slot, child]) => [slot, walk(child, false)]))\n return id\n }\n walk(tree, true)\n return out\n}\n\n/** The typed tree → everything a host or an agent transport needs. Never\n * throws on a bad surface: read `issues`. */\nexport function defineSurface(tree: SurfaceNode, options: DefineOptions = {}): DefinedSurface {\n const surfaceId = options.surfaceId ?? `main`\n const catalogId = options.catalogId ?? CORE_CATALOG_ID\n const components = flattenSurface(tree)\n const { root, issues } = reduceSurface(components, { catalogId, extensions: options.extensions })\n const messages: Record<string, unknown>[] = [\n { version: `v0.9`, createSurface: { surfaceId, catalogId } },\n { version: `v0.9`, updateComponents: { surfaceId, components } },\n ...Object.entries(options.data ?? {}).map(([path, value]) => ({ version: `v0.9`, updateDataModel: { surfaceId, path, value } })),\n ]\n return { surfaceId, catalogId, components, issues, root, messages, jsonl: messages.map((m) => JSON.stringify(m)).join(`\\n`) }\n}\n",
17
+ "// VAPP-92: resolved style → CSS declarations. The ONE mapping web consumers\n// share (the theme builder's preview now, the React renderer in VAPP-87): the\n// Box style keys are CSS-named on purpose (the VAPP-4 \"CSS equals taffy\"\n// rules), so most keys only change case; the few logical shorthands and the\n// theme's value types (shadow layers, font families, easing curves,\n// gradients) are handled here.\n\nimport { easingCss, shadowCss } from \"./theme\"\nimport { ANIMATIONS, animatesOpacity, animationCss, animationTiming } from \"./animation\"\nimport type { Easing, FontSpec, ResolvedStyle, ResolvedTheme, Shadow } from \"./theme-types\"\n\nconst UNITLESS = new Set([`flexGrow`, `flexShrink`, `opacity`, `fontWeight`, `aspectRatio`])\nconst SHORTHANDS: Record<string, string[]> = {\n paddingHorizontal: [`padding-left`, `padding-right`],\n paddingVertical: [`padding-top`, `padding-bottom`],\n paddingInlineStart: [`padding-inline-start`],\n paddingInlineEnd: [`padding-inline-end`],\n marginHorizontal: [`margin-left`, `margin-right`],\n marginVertical: [`margin-top`, `margin-bottom`],\n marginInlineStart: [`margin-inline-start`],\n marginInlineEnd: [`margin-inline-end`],\n insetInlineStart: [`inset-inline-start`],\n insetInlineEnd: [`inset-inline-end`],\n insetBlockStart: [`inset-block-start`],\n insetBlockEnd: [`inset-block-end`],\n backgroundGradient: [`background-image`],\n backdropBlur: [`backdrop-filter`],\n}\n/** Keys that are not declarations of their own (folded into another). */\nconst FOLDED = new Set([`transitionEasing`, `native`, `animationDuration`])\n\nconst kebab = (key: string) => key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)\n\ninterface GradientValue {\n angle: number\n stops: { color: string; offset: number }[]\n}\n\nexport function gradientCss(gradient: GradientValue): string {\n return `linear-gradient(${gradient.angle}deg, ${gradient.stops.map((s) => `${s.color} ${Math.round(s.offset * 10000) / 100}%`).join(`, `)})`\n}\n\n/** A CSS string literal: backslashes and quotes escaped, so a family name\n * can never end the string early (`validateTheme` also refuses them). */\nexport function cssString(text: string): string {\n return `\"${text.replace(/\\\\/g, `\\\\\\\\`).replace(/\"/g, `\\\\\"`)}\"`\n}\n\n/** `font-family` for a theme family: the quoted name, then its `fonts`\n * fallback list. Shared by the web layer's `web/theme-css.ts`. */\nexport function fontStack(family: string, fonts: Record<string, FontSpec>): string {\n const fallback = fonts[family]?.fallback\n return fallback ? `${cssString(family)}, ${fallback}` : cssString(family)\n}\n\nfunction cssValue(key: string, value: unknown, fonts: Record<string, FontSpec>, style: Record<string, unknown>): string | null {\n if (key === `boxShadow`) return Array.isArray(value) ? shadowCss(value as Shadow[]) : String(value)\n if (key === `fontFamily`) return fontStack(String(value), fonts)\n if (key === `gridTemplateAreas` && Array.isArray(value)) return value.map((row) => `\"${row}\"`).join(` `)\n if (key === `backgroundGradient`) return typeof value === `object` && value !== null ? gradientCss(value as GradientValue) : null\n if (key === `backdropBlur`) return typeof value === `number` ? `blur(${value}px)` : null\n if (key === `transition`) {\n if (typeof value !== `number`) return null\n const easing = style.transitionEasing\n return `all ${value}ms${Array.isArray(easing) ? ` ${easingCss(easing as Easing)}` : ``}`\n }\n if (typeof value === `number`) return UNITLESS.has(key) ? String(value) : `${value}px`\n if (typeof value === `boolean`) return null\n return String(value)\n}\n\n/** Flat declarations for one resolved style (condition blocks are the\n * caller's: resolve them against the surface first). `native` is not CSS\n * and is dropped; `transitionEasing` folds into `transition`; round 2:\n * `backdropBlur` (px) → `backdrop-filter` (+ the -webkit- twin);\n * `animation` (+ `animationDuration`, ms once resolved) → the `animation`\n * shorthand over `@keyframes xui-<name>` (src/animation.ts keyframesCss)\n * when `theme` is given (its motion tokens time it), else nothing; a set\n * that animates opacity makes `opacity` = own × `var(--xui-a-opacity, 1)`\n * (register it: ANIMATION_PROPERTIES_CSS). The caller drops `animation`\n * under reduced motion. */\nexport function styleToCss(style: ResolvedStyle | Record<string, unknown>, fonts: Record<string, FontSpec> = {}, theme?: ResolvedTheme): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [key, value] of Object.entries(style)) {\n if (value === undefined || FOLDED.has(key)) continue\n if (key === `animation`) {\n const timing = theme && typeof value === `string` ? animationTiming(value, theme) : null\n if (!timing) continue\n // `animationDuration` arrives resolved (a $motion token → ms): it\n // replaces the animation's own token, its factor kept.\n const duration = (style as Record<string, unknown>).animationDuration\n const durationMs = typeof duration === `number` ? duration * (ANIMATIONS[value as string]?.factor ?? 1) : timing.durationMs\n out.animation = animationCss(value as string, { ...timing, durationMs })\n continue\n }\n if (key.startsWith(`@`) || key.startsWith(`:`)) continue\n if (typeof value === `object` && value !== null && !Array.isArray(value) && key !== `backgroundGradient`) continue\n const css = cssValue(key, value, fonts, style)\n if (css === null) continue\n const targets = SHORTHANDS[key] ?? [kebab(key)]\n for (const target of targets) out[target] = css\n }\n // The animation's opacity MULTIPLIES the node's (style.json `animations`).\n if (out.animation && animatesOpacity(String(style.animation))) out.opacity = out.opacity ? `calc(${out.opacity} * var(--xui-a-opacity, 1))` : `var(--xui-a-opacity, 1)`\n if (out[`backdrop-filter`]) out[`-webkit-backdrop-filter`] = out[`backdrop-filter`]\n const anyBorder = [`border-width`, `border-top-width`, `border-right-width`, `border-bottom-width`, `border-left-width`].some((k) => out[k] && out[k] !== `0px`)\n if (anyBorder && !out[`border-style`]) out[`border-style`] = `solid`\n if (anyBorder && !out[`border-color`]) out[`border-color`] = `transparent`\n return out\n}\n\n/** The same as one `style=\"\"` attribute string. */\nexport function styleAttribute(style: ResolvedStyle | Record<string, unknown>, fonts: Record<string, FontSpec> = {}): string {\n return Object.entries(styleToCss(style, fonts))\n .map(([k, v]) => `${k}:${v}`)\n .join(`;`)\n}\n",
18
+ "// VAPP-92: the theme builder's engine (ui.exponential.at mounts the UI,\n// `builder/` in this package is the standalone page). Pure data in, data\n// out: import a shadcn `globals.css` / tweakcn export as a starting point,\n// express a draft as the smallest `extends` theme, and export JSON.\n\nimport { TOKEN_GROUPS } from \"./catalog\"\nimport { toThemeHex } from \"./color\"\nimport { MODES, THEME_SCHEMA_ID, loadTheme } from \"./theme\"\nimport type { ModeName, ResolvedTheme, Shadow, ThemeIssue, ThemeSource } from \"./theme-types\"\n\n/** shadcn / tweakcn variable → theme colour name. */\nexport const SHADCN_COLOR_VARS: Record<string, string> = {\n background: `background`,\n foreground: `foreground`,\n card: `card`,\n \"card-foreground\": `cardForeground`,\n popover: `popover`,\n \"popover-foreground\": `popoverForeground`,\n primary: `primary`,\n \"primary-foreground\": `primaryForeground`,\n secondary: `secondary`,\n \"secondary-foreground\": `secondaryForeground`,\n muted: `muted`,\n \"muted-foreground\": `mutedForeground`,\n accent: `accent`,\n \"accent-foreground\": `accentForeground`,\n destructive: `destructive`,\n \"destructive-foreground\": `destructiveForeground`,\n success: `success`,\n \"success-foreground\": `successForeground`,\n warning: `warning`,\n \"warning-foreground\": `warningForeground`,\n info: `info`,\n \"info-foreground\": `infoForeground`,\n border: `border`,\n input: `input`,\n ring: `ring`,\n \"chart-1\": `chart1`,\n \"chart-2\": `chart2`,\n \"chart-3\": `chart3`,\n \"chart-4\": `chart4`,\n \"chart-5\": `chart5`,\n}\n\nexport interface ThemeImport {\n modes: Partial<Record<ModeName, { color: Record<string, `#${string}`>; shadow?: Record<string, Shadow[]> }>>\n tokens: { radius?: Record<string, number>; type?: { family?: Record<string, string> } }\n fonts: Record<string, { fallback?: string; source: `host` }>\n /** Variables the importer did not understand (`--sidebar`, `var()` refs…). */\n unmapped: string[]\n}\n\nconst BLOCK = /([^{}]+)\\{([^{}]*)\\}/g\nconst DECL = /--([a-zA-Z0-9-]+)\\s*:\\s*([^;]+);?/g\n\nfunction selectorMode(selector: string): ModeName | null {\n const s = selector.trim()\n if (/\\.dark\\b|\\[data-theme=[\"']?dark|prefers-color-scheme:\\s*dark/.test(s)) return `dark`\n if (/^(:root|:host|html|body)(\\s*,\\s*(:root|:host|html|body))*$/.test(s) || /\\.light\\b/.test(s)) return `light`\n return null\n}\n\nfunction px(value: string): number | null {\n const v = value.trim()\n if (v.endsWith(`rem`)) return Math.round(parseFloat(v) * 16 * 100) / 100\n if (v.endsWith(`px`)) return parseFloat(v)\n if (v.endsWith(`em`)) return Math.round(parseFloat(v) * 16 * 100) / 100\n const n = parseFloat(v)\n return Number.isFinite(n) && /^-?[\\d.]+$/.test(v) ? n : null\n}\n\n/** `0 1px 2px 0 hsl(0 0% 0% / 0.05), …` → layers; null when not parseable. */\nexport function parseShadow(value: string): Shadow[] | null {\n const v = value.trim()\n if (v === `none`) return []\n const layers: Shadow[] = []\n // split on commas outside parentheses\n let depth = 0\n let start = 0\n const parts: string[] = []\n for (let i = 0; i < v.length; i++) {\n if (v[i] === `(`) depth++\n else if (v[i] === `)`) depth--\n else if (v[i] === `,` && depth === 0) {\n parts.push(v.slice(start, i))\n start = i + 1\n }\n }\n parts.push(v.slice(start))\n for (const part of parts) {\n const m = /^\\s*(-?[\\d.]+(?:px)?)\\s+(-?[\\d.]+(?:px)?)\\s+(-?[\\d.]+(?:px)?)(?:\\s+(-?[\\d.]+(?:px)?))?\\s+(.+?)\\s*$/.exec(part)\n if (!m) return null\n const color = toThemeHex(m[5])\n if (!color) return null\n layers.push({ x: parseFloat(m[1]), y: parseFloat(m[2]), blur: parseFloat(m[3]), spread: m[4] ? parseFloat(m[4]) : 0, color })\n }\n return layers\n}\n\nfunction firstFamily(value: string): { family: string; fallback?: string } {\n const parts = value.split(`,`).map((s) => s.trim().replace(/^[\"']|[\"']$/g, ``)).filter(Boolean)\n return { family: parts[0] ?? value.trim(), fallback: parts.length > 1 ? parts.slice(1).join(`, `) : undefined }\n}\n\n/** A shadcn `globals.css` (v4 oklch, v3 bare-HSL triplets) or a tweakcn\n * export → the colours per mode, the radius ladder, the families and the\n * shadows it carried. Everything else is listed under `unmapped`. */\nexport function importShadcnCss(css: string): ThemeImport {\n const out: ThemeImport = { modes: {}, tokens: {}, fonts: {}, unmapped: [] }\n const unmapped = new Set<string>()\n const text = css.replace(/\\/\\*[\\s\\S]*?\\*\\//g, ``)\n const addFamily = (slot: string, value: string) => {\n const { family, fallback } = firstFamily(value)\n ;((out.tokens.type ??= {}).family ??= {})[slot] = family\n out.fonts[family] = { ...(fallback ? { fallback } : {}), source: `host` }\n }\n for (const block of text.matchAll(BLOCK)) {\n const mode = selectorMode(block[1])\n for (const decl of block[2].matchAll(DECL)) {\n const name = decl[1]\n const value = decl[2].trim()\n const colorName = SHADCN_COLOR_VARS[name]\n if (colorName) {\n const hex = toThemeHex(value)\n if (!hex || !mode) {\n unmapped.add(`--${name}`)\n continue\n }\n ;(out.modes[mode] ??= { color: {} }).color[colorName] = hex\n continue\n }\n if (name === `radius`) {\n const base = px(value)\n if (base === null) {\n unmapped.add(`--${name}`)\n continue\n }\n // Tailwind's calc ladder around --radius (= lg).\n out.tokens.radius = {\n none: 0,\n sm: Math.max(0, base - 4),\n md: Math.max(0, base - 2),\n lg: base,\n xl: base + 4,\n xl2: base + 8,\n xl3: base + 12,\n full: 9999,\n }\n continue\n }\n if (name === `font-sans` || name === `font-mono`) {\n if (value.includes(`var(`)) unmapped.add(`--${name}`)\n else addFamily(name.slice(5), value)\n continue\n }\n const shadow = /^shadow-(sm|md|lg)$/.exec(name)\n if (shadow && mode) {\n const layers = parseShadow(value)\n if (!layers) {\n unmapped.add(`--${name}`)\n continue\n }\n const m = (out.modes[mode] ??= { color: {} })\n ;(m.shadow ??= {})[shadow[1]] = layers\n continue\n }\n unmapped.add(`--${name}`)\n }\n }\n out.unmapped = [...unmapped].sort()\n return out\n}\n\n/** The import as a theme file. With a `base` it becomes an `extends` theme\n * carrying only what the CSS said; without one it is a root and the\n * caller fills the rest (the builder starts from a built-in anyway). */\nexport function themeFromImport(imp: ThemeImport, meta: { id: string; name: string; extends?: string }): ThemeSource {\n const theme: ThemeSource = { $schema: THEME_SCHEMA_ID, id: meta.id, name: meta.name }\n if (meta.extends) theme.extends = meta.extends\n const modes: ThemeSource[`modes`] = {}\n for (const mode of MODES) {\n const m = imp.modes[mode]\n if (!m) continue\n modes[mode] = { color: m.color, ...(m.shadow ? { shadow: m.shadow } : {}) }\n if (m.shadow && !m.shadow.none) modes[mode]!.shadow = { none: [], ...m.shadow }\n }\n if (Object.keys(modes).length > 0) theme.modes = modes\n const tokens: NonNullable<ThemeSource[`tokens`]> = {}\n if (imp.tokens.radius) tokens.radius = imp.tokens.radius\n if (imp.tokens.type?.family) tokens.type = { family: imp.tokens.type.family }\n if (Object.keys(tokens).length > 0) theme.tokens = tokens\n if (Object.keys(imp.fonts).length > 0) theme.fonts = imp.fonts\n return theme\n}\n\nconst same = (a: unknown, b: unknown) => JSON.stringify(a) === JSON.stringify(b)\n\n/** The smallest theme that, extending `base`, resolves to `full`: only the\n * values that differ. Recipes pass through as the draft's own rules (they\n * are already overrides). */\nexport function diffTheme(full: ResolvedTheme | ThemeSource, base: ResolvedTheme, meta?: { id?: string; name?: string }): ThemeSource {\n const resolved = `chain` in full ? full : loadTheme(full, { themes: [base] })\n const out: ThemeSource = { $schema: THEME_SCHEMA_ID, id: meta?.id ?? resolved.id, name: meta?.name ?? resolved.name, extends: base.id }\n const modes: ThemeSource[`modes`] = {}\n for (const mode of MODES) {\n const color: Record<string, `#${string}`> = {}\n const shadow: Record<string, Shadow[]> = {}\n for (const [k, v] of Object.entries(resolved.modes[mode].color)) if (base.modes[mode].color[k] !== v) color[k] = v\n for (const [k, v] of Object.entries(resolved.modes[mode].shadow)) if (!same(base.modes[mode].shadow[k], v)) shadow[k] = v\n const m: { color?: Record<string, `#${string}`>; shadow?: Record<string, Shadow[]> } = {}\n if (Object.keys(color).length > 0) m.color = color\n if (Object.keys(shadow).length > 0) m.shadow = shadow\n if (Object.keys(m).length > 0) modes[mode] = m\n }\n if (Object.keys(modes).length > 0) out.modes = modes\n // Round 1: the high-contrast overlays diff the same way.\n const contrast: ThemeSource[`contrast`] = {}\n for (const mode of MODES) {\n const mine = resolved.contrast?.[mode] ?? { color: {}, shadow: {} }\n const theirs = base.contrast?.[mode] ?? { color: {}, shadow: {} }\n const color: Record<string, `#${string}`> = {}\n const shadow: Record<string, Shadow[]> = {}\n for (const [k, v] of Object.entries(mine.color)) if (theirs.color[k] !== v) color[k] = v\n for (const [k, v] of Object.entries(mine.shadow)) if (!same(theirs.shadow[k], v)) shadow[k] = v\n const m: { color?: Record<string, `#${string}`>; shadow?: Record<string, Shadow[]> } = {}\n if (Object.keys(color).length > 0) m.color = color\n if (Object.keys(shadow).length > 0) m.shadow = shadow\n if (Object.keys(m).length > 0) contrast[mode] = m\n }\n if (Object.keys(contrast).length > 0) out.contrast = contrast\n const tokens: Record<string, unknown> = {}\n for (const group of Object.keys(TOKEN_GROUPS)) {\n if (group === `color` || group === `shadow`) continue\n const [top, sub] = group.split(`.`)\n const mine = sub ? (resolved.tokens.type as Record<string, Record<string, unknown>>)[sub] : (resolved.tokens as unknown as Record<string, Record<string, unknown>>)[top]\n const theirs = sub ? (base.tokens.type as Record<string, Record<string, unknown>>)[sub] : (base.tokens as unknown as Record<string, Record<string, unknown>>)[top]\n const diff: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(mine ?? {})) if (!same(theirs?.[k], v)) diff[k] = v\n if (Object.keys(diff).length === 0) continue\n if (sub) ((tokens.type ??= {}) as Record<string, unknown>)[sub] = diff\n else tokens[top] = diff\n }\n if (Object.keys(tokens).length > 0) out.tokens = tokens as ThemeSource[`tokens`]\n const fonts: ThemeSource[`fonts`] = {}\n for (const [k, v] of Object.entries(resolved.fonts)) if (!same(base.fonts[k], v)) fonts[k] = v\n if (Object.keys(fonts).length > 0) out.fonts = fonts\n if (`chain` in full) {\n // A resolved theme carries the base's rules too: keep only the tail each part added.\n const recipes: NonNullable<ThemeSource[`recipes`]> = {}\n for (const [component, byPart] of Object.entries(resolved.recipes)) {\n for (const [part, rules] of Object.entries(byPart)) {\n const baseRules = base.recipes[component]?.[part] ?? []\n const tail = rules.slice(baseRules.length)\n if (tail.length > 0) ((recipes[component] ??= {})[part] = tail)\n }\n }\n if (Object.keys(recipes).length > 0) out.recipes = recipes\n } else if (full.recipes && Object.keys(full.recipes).length > 0) out.recipes = full.recipes\n return out\n}\n\n/** Pretty JSON with `$schema` first, the export the builder downloads. */\nexport function exportThemeJson(theme: ThemeSource): string {\n const { $schema: _ignored, ...rest } = theme\n return `${JSON.stringify({ $schema: `https://ui.exponential.at/schemas/theme/v1.json`, ...rest }, null, 2)}\\n`\n}\n\n/** `JSON.parse` + load, never throwing: the builder's \"paste a theme\" path. */\nexport function parseThemeJson(text: string, themes: readonly (ThemeSource | ResolvedTheme)[]): { theme: ResolvedTheme | null; source: ThemeSource | null; issues: ThemeIssue[] } {\n let source: unknown\n try {\n source = JSON.parse(text)\n } catch (error) {\n return { theme: null, source: null, issues: [{ path: `theme`, message: `not JSON: ${(error as Error).message}` }] }\n }\n try {\n return { theme: loadTheme(source, { themes }), source: source as ThemeSource, issues: [] }\n } catch (error) {\n const issues = (error as { issues?: ThemeIssue[] }).issues ?? [{ path: `theme`, message: (error as Error).message }]\n return { theme: null, source: source as ThemeSource, issues }\n }\n}\n",
19
+ "// VAPP-92: the MEASURE contract a painter (built-in or a host's override,\n// VAPP-91) must keep for a control: its box comes from the theme's tokens\n// through the recipe of the part that IS the control (Button/root,\n// Switch/track, Checkbox/box…), never from the painter. The fixture\n// `control-geometry.json` records every built-in theme × control × size,\n// and `checkGeometry` is what the conformance suite runs an override through.\n\nimport { resolveRecipe } from \"./theme\"\nimport type { ModeName, ResolvedStyle, ResolvedTheme } from \"./theme-types\"\n\n/** The part whose recipe sizes each control. */\nexport const CONTROL_PARTS: Record<string, string> = {\n Button: `root`,\n Toggle: `root`,\n Segmented: `item`,\n Input: `field`,\n Textarea: `field`,\n Select: `trigger`,\n DatePicker: `trigger`,\n Checkbox: `box`,\n Radio: `item`,\n Switch: `track`,\n Slider: `thumb`,\n Avatar: `root`,\n Icon: `root`,\n Spinner: `root`,\n Ring: `root`,\n Tabs: `tab`,\n // Round 1: the new fields keep the input height contract.\n NumberField: `field`,\n ChipInput: `field`,\n TimePicker: `trigger`,\n DateRangePicker: `trigger`,\n}\n\nexport const GEOMETRY_KEYS = [`width`, `height`, `minWidth`, `minHeight`, `paddingHorizontal`, `paddingVertical`, `padding`, `gap`, `borderWidth`, `borderRadius`] as const\nexport type GeometryKey = (typeof GEOMETRY_KEYS)[number]\nexport type ControlGeometry = Partial<Record<GeometryKey, number>>\n\n/** The numeric box of a control for a theme (mode-independent: lengths do\n * not change with the mode). */\nexport function controlGeometry(theme: ResolvedTheme, component: string, props: Record<string, unknown> = {}, states: readonly string[] = []): ControlGeometry {\n const part = CONTROL_PARTS[component] ?? `root`\n const style: ResolvedStyle = resolveRecipe(theme, { component, part, props, states }, `light` as ModeName)\n const out: ControlGeometry = {}\n for (const key of GEOMETRY_KEYS) {\n const v = style[key]\n if (typeof v === `number`) out[key] = v\n }\n return out\n}\n\n/** What a painter reports after measuring the control it drew. */\nexport interface MeasuredBox {\n width?: number\n height?: number\n paddingHorizontal?: number\n paddingVertical?: number\n borderWidth?: number\n borderRadius?: number\n}\n\n/** A host's replacement painter for one native kind (the VAPP-91 extension\n * API): it may draw anything, but `measure` must return the theme's box. */\nexport interface PainterOverride {\n component: string\n measure(theme: ResolvedTheme, props: Record<string, unknown>, states?: readonly string[]): MeasuredBox\n}\n\nexport interface GeometryIssue {\n key: string\n expected: number\n actual: number | undefined\n}\n\n/** Every geometry key the theme fixes that the measured box misses or\n * changes (a key the theme leaves open is the painter's). */\nexport function checkGeometry(expected: ControlGeometry, measured: MeasuredBox, tolerance = 0.5): GeometryIssue[] {\n const issues: GeometryIssue[] = []\n const probe = (key: GeometryKey, actual: number | undefined) => {\n const want = expected[key]\n if (want === undefined) return\n if (actual === undefined || Math.abs(actual - want) > tolerance) issues.push({ key, expected: want, actual })\n }\n probe(`width`, measured.width)\n // A control with a minimum height (Textarea) grows from it: the recipe's\n // `height` is its one-line base, so only the floor is checked (VAPP-91).\n if (expected.minHeight === undefined) probe(`height`, measured.height)\n probe(`paddingHorizontal`, measured.paddingHorizontal)\n probe(`paddingVertical`, measured.paddingVertical)\n probe(`borderWidth`, measured.borderWidth)\n probe(`borderRadius`, measured.borderRadius)\n if (expected.minHeight !== undefined && (measured.height === undefined || measured.height + tolerance < expected.minHeight))\n issues.push({ key: `minHeight`, expected: expected.minHeight, actual: measured.height })\n return issues\n}\n\n/** Run an override through every case the fixture holds for its kind. */\nexport function verifyPainterGeometry(\n override: PainterOverride,\n theme: ResolvedTheme,\n cases: readonly { props: Record<string, unknown>; states?: readonly string[] }[]\n): { name: string; issues: GeometryIssue[] }[] {\n return cases\n .map((c) => ({\n name: Object.entries(c.props).map(([k, v]) => `${k}=${String(v)}`).join(`,`) || `default`,\n issues: checkGeometry(controlGeometry(theme, override.component, c.props, c.states), override.measure(theme, c.props, c.states)),\n }))\n .filter((r) => r.issues.length > 0)\n}\n",
20
+ "// VAPP-87: the OVERLAY placement contract every renderer keeps (the React\n// renderer through Radix's popper, the Rust core's layer manager, VAPP-86).\n// One pure function: an anchor box, the overlay's size, the viewport, a\n// preferred side → where the overlay lands. Rules: `OVERLAY_OFFSET` px from\n// the anchor on the preferred side, centred along the other axis; FLIP to\n// the opposite side when the preferred side has less room than the\n// overlay needs and the opposite has more; then SHIFT along the cross axis\n// to stay `OVERLAY_PADDING` inside the viewport. `fixtures/overlay-geometry.json`\n// locks the results; the browser suite checks Radix lands within tolerance.\n\nexport const OVERLAY_OFFSET = 4\nexport const OVERLAY_PADDING = 8\n\nexport type OverlaySide = `top` | `right` | `bottom` | `left`\nexport type OverlayAlign = `start` | `center` | `end`\n\nexport interface Rect {\n x: number\n y: number\n width: number\n height: number\n}\nexport interface Size {\n width: number\n height: number\n}\n\nexport interface OverlayPlacement {\n x: number\n y: number\n side: OverlaySide\n /** True when the preferred side was swapped for its opposite. */\n flipped: boolean\n}\n\nconst OPPOSITE: Record<OverlaySide, OverlaySide> = { top: `bottom`, bottom: `top`, left: `right`, right: `left` }\n\nfunction room(side: OverlaySide, anchor: Rect, viewport: Size, padding: number): number {\n switch (side) {\n case `top`:\n return anchor.y - padding\n case `bottom`:\n return viewport.height - (anchor.y + anchor.height) - padding\n case `left`:\n return anchor.x - padding\n case `right`:\n return viewport.width - (anchor.x + anchor.width) - padding\n }\n}\n\nexport function placeOverlay(\n anchor: Rect,\n size: Size,\n viewport: Size,\n options: { side?: OverlaySide; align?: OverlayAlign; offset?: number; padding?: number } = {}\n): OverlayPlacement {\n const preferred = options.side ?? `bottom`\n const align = options.align ?? `center`\n const offset = options.offset ?? OVERLAY_OFFSET\n const padding = options.padding ?? OVERLAY_PADDING\n const vertical = preferred === `top` || preferred === `bottom`\n const needed = (vertical ? size.height : size.width) + offset\n let side = preferred\n let flipped = false\n if (room(preferred, anchor, viewport, padding) < needed && room(OPPOSITE[preferred], anchor, viewport, padding) > room(preferred, anchor, viewport, padding)) {\n side = OPPOSITE[preferred]\n flipped = true\n }\n let x: number\n let y: number\n const alongX = (): number => (align === `start` ? anchor.x : align === `end` ? anchor.x + anchor.width - size.width : anchor.x + anchor.width / 2 - size.width / 2)\n const alongY = (): number => (align === `start` ? anchor.y : align === `end` ? anchor.y + anchor.height - size.height : anchor.y + anchor.height / 2 - size.height / 2)\n switch (side) {\n case `top`:\n x = alongX()\n y = anchor.y - offset - size.height\n break\n case `bottom`:\n x = alongX()\n y = anchor.y + anchor.height + offset\n break\n case `left`:\n x = anchor.x - offset - size.width\n y = alongY()\n break\n case `right`:\n x = anchor.x + anchor.width + offset\n y = alongY()\n break\n }\n // Shift along the cross axis to stay inside the viewport.\n if (vertical === (side === `top` || side === `bottom`)) {\n if (side === `top` || side === `bottom`) x = Math.min(Math.max(x, padding), Math.max(padding, viewport.width - padding - size.width))\n else y = Math.min(Math.max(y, padding), Math.max(padding, viewport.height - padding - size.height))\n } else if (side === `top` || side === `bottom`) x = Math.min(Math.max(x, padding), Math.max(padding, viewport.width - padding - size.width))\n else y = Math.min(Math.max(y, padding), Math.max(padding, viewport.height - padding - size.height))\n return { x: round(x), y: round(y), side, flipped }\n}\n\nconst round = (n: number) => Math.round(n * 1000) / 1000\n",
21
+ "// VAPP-91: the Exponential connector. A third-party host runs a declarative\n// app against an Exponential instance: OAuth to Exponential (the MCP OAuth\n// grant, EXP-792 — discovery, dynamic client registration, PKCE S256, the\n// person's consent picks the teams/boards) and `exp:` binding resolvers over\n// that instance's MCP tools (an OAuth token is confined to /api/mcp and to\n// its grant). Plain fetch + WebCrypto; it knows the instance's PUBLIC HTTP\n// API only, nothing of the app's code.\n\nimport type { HostFunction } from \"../host/runtime\"\nimport type { ParsedSource, SourceEmit, SourceResolvers } from \"../host/sources\"\n\nexport interface AuthServerMetadata {\n issuer: string\n authorization_endpoint: string\n token_endpoint: string\n registration_endpoint?: string\n}\n\nexport interface ConnectorTokens {\n accessToken: string\n refreshToken?: string\n /** Epoch ms. */\n expiresAt?: number\n}\n\nexport interface ConnectorOptions {\n /** The Exponential instance, e.g. `https://app.exponential.at`. */\n baseUrl: string\n /** Where the instance sends the person back with `?code=&state=`. */\n redirectUri: string\n clientName?: string\n /** A client id registered earlier (skips dynamic registration). */\n clientId?: string\n tokens?: ConnectorTokens\n /** Called whenever tokens change (persist them). */\n onTokens?: (tokens: ConnectorTokens) => void\n fetch?: typeof fetch\n /** Seconds between re-reads of a bound source (MCP has no live feed). */\n pollSeconds?: number\n}\n\nconst b64url = (bytes: Uint8Array) => btoa(String.fromCharCode(...bytes)).replace(/\\+/g, `-`).replace(/\\//g, `_`).replace(/=+$/, ``)\n\n/** A PKCE verifier and its S256 challenge. */\nexport async function pkcePair(): Promise<{ verifier: string; challenge: string }> {\n const verifier = b64url(crypto.getRandomValues(new Uint8Array(32)))\n const digest = new Uint8Array(await crypto.subtle.digest(`SHA-256`, new TextEncoder().encode(verifier)))\n return { verifier, challenge: b64url(digest) }\n}\n\nexport class ExponentialConnector {\n private metadata?: AuthServerMetadata\n private clientId?: string\n tokens?: ConnectorTokens\n private rpcId = 0\n\n constructor(private options: ConnectorOptions) {\n this.clientId = options.clientId\n this.tokens = options.tokens\n }\n\n private get fetch(): typeof fetch {\n return this.options.fetch ?? fetch\n }\n\n private url(path: string): string {\n return new URL(path, this.options.baseUrl).href\n }\n\n async discover(): Promise<AuthServerMetadata> {\n if (this.metadata) return this.metadata\n const res = await this.fetch(this.url(`/.well-known/oauth-authorization-server`))\n if (!res.ok) throw new Error(`discovery failed: HTTP ${res.status}`)\n this.metadata = (await res.json()) as AuthServerMetadata\n return this.metadata\n }\n\n /** Dynamic client registration (a public client: PKCE, no secret). */\n async register(): Promise<string> {\n if (this.clientId) return this.clientId\n const meta = await this.discover()\n if (!meta.registration_endpoint) throw new Error(`the instance offers no dynamic client registration; pass clientId`)\n const res = await this.fetch(meta.registration_endpoint, {\n method: `POST`,\n headers: { \"content-type\": `application/json` },\n body: JSON.stringify({ client_name: this.options.clientName ?? `Exponential UI host`, redirect_uris: [this.options.redirectUri], grant_types: [`authorization_code`, `refresh_token`], response_types: [`code`], token_endpoint_auth_method: `none` }),\n })\n if (!res.ok) throw new Error(`registration failed: HTTP ${res.status}`)\n this.clientId = ((await res.json()) as { client_id: string }).client_id\n return this.clientId\n }\n\n /** Where to send the person. Keep `verifier`, `state` AND `clientId`\n * for the callback: a connector rebuilt after the redirect needs the\n * dynamically registered client id (pass it to `exchange`, or as\n * `ConnectorOptions.clientId`), or the code was issued to a client the\n * token request does not name. */\n async authorizeUrl(): Promise<{ url: string; verifier: string; state: string; clientId: string }> {\n const meta = await this.discover()\n const clientId = await this.register()\n const { verifier, challenge } = await pkcePair()\n const state = b64url(crypto.getRandomValues(new Uint8Array(16)))\n const url = new URL(meta.authorization_endpoint)\n url.search = new URLSearchParams({ response_type: `code`, client_id: clientId, redirect_uri: this.options.redirectUri, code_challenge: challenge, code_challenge_method: `S256`, state, scope: `openid profile email offline_access` }).toString()\n return { url: url.href, verifier, state, clientId }\n }\n\n private async token(body: Record<string, string>): Promise<ConnectorTokens> {\n const meta = await this.discover()\n const res = await this.fetch(meta.token_endpoint, { method: `POST`, headers: { \"content-type\": `application/x-www-form-urlencoded` }, body: new URLSearchParams({ client_id: this.clientId ?? ``, ...body }).toString() })\n if (!res.ok) throw new Error(`token request failed: HTTP ${res.status}`)\n const json = (await res.json()) as { access_token: string; refresh_token?: string; expires_in?: number }\n this.tokens = { accessToken: json.access_token, refreshToken: json.refresh_token ?? this.tokens?.refreshToken, expiresAt: json.expires_in ? Date.now() + json.expires_in * 1000 : undefined }\n this.options.onTokens?.(this.tokens)\n return this.tokens\n }\n\n /** The callback: trade the code for tokens. `clientId` = the one\n * `authorizeUrl` returned (required unless this connector registered it\n * or got it in its options): the exchange never registers a new client,\n * whose id the code was not issued to. */\n async exchange(code: string, verifier: string, clientId?: string): Promise<ConnectorTokens> {\n if (clientId) this.clientId = clientId\n if (!this.clientId) throw new Error(`no client id for the token exchange; pass the clientId authorizeUrl returned`)\n return this.token({ grant_type: `authorization_code`, code, code_verifier: verifier, redirect_uri: this.options.redirectUri })\n }\n\n async refresh(): Promise<ConnectorTokens> {\n if (!this.tokens?.refreshToken) throw new Error(`no refresh token; authorize again`)\n return this.token({ grant_type: `refresh_token`, refresh_token: this.tokens.refreshToken })\n }\n\n /** One MCP tool call on the instance, as the person who consented.\n * Returns the tool's JSON payload (its text content parsed). */\n async callTool(name: string, args: Record<string, unknown> = {}): Promise<unknown> {\n if (!this.tokens) throw new Error(`not connected; authorize first`)\n if (this.tokens.expiresAt && this.tokens.expiresAt < Date.now() + 30_000 && this.tokens.refreshToken) await this.refresh()\n const res = await this.fetch(this.url(`/api/mcp`), {\n method: `POST`,\n headers: { \"content-type\": `application/json`, accept: `application/json, text/event-stream`, authorization: `Bearer ${this.tokens.accessToken}` },\n body: JSON.stringify({ jsonrpc: `2.0`, id: ++this.rpcId, method: `tools/call`, params: { name, arguments: args } }),\n })\n if (!res.ok) throw new Error(`MCP HTTP ${res.status}`)\n const text = await res.text()\n const line = text.trimStart().startsWith(`{`) ? text : (text.split(`\\n`).find((l) => l.startsWith(`data:`))?.slice(5) ?? `{}`)\n const reply = JSON.parse(line) as { result?: { content?: { type: string; text?: string }[]; structuredContent?: unknown; isError?: boolean }; error?: { message?: string } }\n if (reply.error) throw new Error(reply.error.message ?? `MCP error`)\n const result = reply.result ?? {}\n const body = result.structuredContent ?? (result.content ?? []).filter((c) => c.type === `text`).map((c) => c.text ?? ``).join(``)\n if (result.isError) throw new Error(typeof body === `string` ? body : `tool error`)\n if (typeof body !== `string`) return body\n try {\n return JSON.parse(body)\n } catch {\n return body\n }\n }\n\n /** The `exp:` scheme over MCP: `exp:issues?board=<id>&team=<id>&limit=<n>&search=<q>`,\n * `exp:boards?team=<id>`, `exp:teams`, `exp:members?team=<id>`. Each\n * emits `{rows, count}` and re-reads every `pollSeconds` (default 30, the\n * `poll` param overrides; 0 = once). Unknown names emit `null`. */\n sources(): SourceResolvers {\n return { exp: (source, emit) => this.follow(source, emit) }\n }\n\n private follow(source: ParsedSource, emit: SourceEmit): () => void {\n const p = source.params\n const read = async (): Promise<unknown> => {\n switch (source.name) {\n case `issues`: {\n const args: Record<string, unknown> = { limit: Number(p.limit ?? 50) }\n if (p.board) args.boardId = p.board\n if (p.team) args.teamId = p.team\n if (p.search) args.search = p.search\n return this.callTool(`exponential_issues_list`, args)\n }\n case `boards`:\n return this.callTool(`exponential_boards_list`, p.team ? { teamId: p.team } : {})\n case `teams`:\n return this.callTool(`exponential_teams_list`, {})\n case `members`:\n return this.callTool(`exponential_members_list`, p.team ? { teamId: p.team } : {})\n default:\n return null\n }\n }\n let live = true\n let timer: ReturnType<typeof setTimeout> | undefined\n const seconds = Number(p.poll ?? this.options.pollSeconds ?? 30)\n const tick = async () => {\n try {\n const value = await read()\n if (!live) return\n const rows = Array.isArray(value) ? value : (value as { rows?: unknown[] } | null)?.rows\n emit(rows ? { rows, count: rows.length } : value)\n } catch (e) {\n if (live) emit({ rows: [], count: 0, error: e instanceof Error ? e.message : String(e) })\n }\n if (live && seconds > 0) timer = setTimeout(tick, seconds * 1000)\n }\n void tick()\n return () => {\n live = false\n if (timer) clearTimeout(timer)\n }\n }\n\n /** `exponential.mcp({tool, arguments})` for an ExponentialHost (gate it\n * with an `ask` policy: it acts as the person). */\n functions(): Record<string, HostFunction> {\n return { \"exponential.mcp\": (args) => this.callTool(String(args.tool ?? ``), (args.arguments ?? {}) as Record<string, unknown>) }\n }\n}\n",
22
+ "// VAPP-91: running a declarative app (VAPP-82) in any host: install the\n// package, apply a template onto a surface, bind its sources (the host's own\n// resolvers, or the Exponential connector's `exp:` ones), and let the\n// package's `functions` list narrow the policy. The apps product's own host\n// plugin is this plus its theme and extension.\n\nimport type { ServerMessage } from \"../host/contract\"\nimport type { PackageIssue, AppPackage } from \"../host/package\"\nimport { ExponentialHost } from \"../host/runtime\"\nimport type { HostOptions } from \"../host/runtime\"\n\nexport interface AppHostOptions extends HostOptions {\n /** The package to run. */\n package: AppPackage\n}\n\nexport interface AppHost {\n host: ExponentialHost\n issues: PackageIssue[]\n /** Apply a template of the package onto a surface (default: the first). */\n open(surfaceId: string, templateId?: string, data?: unknown): void\n}\n\nexport function createAppHost(options: AppHostOptions): AppHost {\n const { package: pkg, ...rest } = options\n const host = new ExponentialHost(rest)\n const issues = host.installPackage(pkg)\n return {\n host,\n issues,\n open(surfaceId, templateId = Object.keys(pkg.templates)[0]!, data) {\n const message: ServerMessage = { version: `v0.9`, applyTemplate: { surfaceId, templateId, packageId: pkg.id, ...(data === undefined ? {} : { data }) } }\n host.receive(message)\n },\n }\n}\n"
23
+ ],
24
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAM,mBAAqD,OAAO,YAAY,OAAO,QAAQ,cAAU,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC;AAC5I,IAAM,mBAA2B,eAAW;AAC5C,IAAM,kBAA0B,eAAW;AAC3C,IAAM,cAAsB,eAAW;AACvC,IAAM,YAAoB,eAAW;AACrC,IAAM,oBAA4B,eAAW;AAC7C,IAAM,wBAAgC,eAAW;AACjD,IAAM,wBAAgC,eAAW;AACjD,IAAM,qBAA6B,eAAW;AAC9C,IAAM,oBAA4B,eAAW;AAE7C,IAAM,oBAA4B,eAAW;AAC7C,IAAM,oBAA4B,eAAW;AAE7C,IAAM,mBAA2B,eAAW;AAC5C,IAAM,oBAA4B,eAAW;AAC7C,IAAM,uBAA+B,eAAW;AAChD,IAAM,wBAAgC,eAAW;AACjD,IAAM,2BAAmC,eAAW;AACpD,IAAM,mBAA2B,eAAW;;;ACN5C,SAAS,gBAAgB,CAAC,OAA2B,YAA+B;AAAA,EACzF,MAAM,OAAO,IAAI;AAAA,EACjB,OAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAAA,IAChC,IAAI,MAAM,OAAO,KAAK;AAAA,IACtB,IAAI,eAAe,WAAW;AAAA,MAC5B,MAAM,IAAI,aAAY,MAAM,WAAW,WAAW,GAAG,IAAI,aAAa,IAAI,YAAY;AAAA,MACtF,MAAM,MAAM,MAAM,aAAa,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM,WAAW,KAAK,UAAU,CAAC,IAAI,OAAO,CAAC;AAAA,MACnH,MAAM,QAAQ,QAAQ,CAAC,KAAK,IAAI,GAAG,IAAI,MAAM,IAAI;AAAA,MACjD,OAAO,KAAK,IAAI,GAAG;AAAA,QAAG,MAAM,IAAI;AAAA,IAClC;AAAA,IACA,KAAK,IAAI,GAAG;AAAA,IACZ,OAAO;AAAA,GACR;AAAA;AAGH,IAAM,cAAc,CAAC,UAAkB,MAAM,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI;AAI7E,SAAS,YAAY,CAAC,MAA0B,SAAS,MAAgB;AAAA,EAC9E,OAAO,iBAAiB,MAAM,IAAI,YAAY,MAAM,GAAG;AAAA;AAMlD,IAAM,kBAAkB,CAAC,QAAgB,IAAI,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI;AAkBpF,SAAS,iBAAiB,CAAC,MAAe,UAAyB,QAAQ,IAAI,WAAW,IAAwB;AAAA,EACvH,MAAM,OAAO,cAAa,SAAS,MAAM,EAAE,MAAM,MAAM,CAAC;AAAA,EACxD,MAAM,OAAO,aAAY,MAAM,IAAI;AAAA,EACnC,IAAI,CAAC,MAAM,QAAQ,IAAI;AAAA,IAAG,OAAO,CAAC;AAAA,EAClC,MAAM,OAAO,iBAAiB,MAAM,SAAS,GAAG;AAAA,EAGhD,OAAO,KAAK,MAAM,GAAG,mBAAkB,EAAE,IAAI,CAAC,GAAG,WAAW,EAAE,KAAK,KAAK,QAAQ,MAAM,GAAG,QAAQ,SAAS,OAAO,UAAU,GAAG,YAAY,gBAAgB,KAAK,MAAM,IAAI,EAAE;AAAA;AAKtK,IAAM,kBAAkB,CAAC,QAAgB,UAAkB,GAAG,aAAe;AAcpF,SAAS,UAAU,CAAC,MAAsB;AAAA,EACxC,IAAI,IAAI;AAAA,EACR,MAAM,QAAkB,CAAC,IAAI;AAAA,EAC7B,OAAO,MAAM,QAAQ;AAAA,IACnB,MAAM,OAAO,MAAM,IAAI;AAAA,IACvB;AAAA,IACA,WAAW,QAAQ,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC;AAAA,MAAG,MAAM,KAAK,IAAI;AAAA,IACnE,WAAW,SAAS,KAAK;AAAA,MAAU,MAAM,KAAK,KAAK;AAAA,EACrD;AAAA,EACA,OAAO;AAAA;AAiBF,SAAS,cAAc,CAAC,MAAc,MAAe,cAA2E;AAAA,EACrI,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,SAAS,CAAC,QAAgB;AAAA,IAC9B,IAAI,IAAI,MAAM,IAAI,GAAG;AAAA,IACrB,IAAI,MAAM;AAAA,MAAW,MAAM,IAAI,KAAM,IAAI,WAAW,GAAG,CAAE;AAAA,IACzD,OAAO;AAAA;AAAA,EAET,IAAI,QAAQ;AAAA,EACZ,IAAI,QAAQ,WAAW,IAAI;AAAA,EAC3B,IAAI,QAA4B;AAAA,EAChC,MAAM,QAAuB,CAAC,EAAE,MAAM,MAAM,OAAO,GAAG,CAAC;AAAA,EACvD,OAAO,MAAM,QAAQ;AAAA,IACnB,MAAM,QAAQ,MAAM,IAAI;AAAA,IACxB,IAAI,UAAU,OAAO;AAAA,MACnB,IAAI,SAAS,MAAM,SAAS,MAAM;AAAA,QAAQ;AAAA,MAC1C,IAAI,SAAS;AAAA,QAAoB,QAAQ,EAAE,IAAI,MAAM,WAAW,SAAS,cAAa,cAAc;AAAA,MACpG,KAAK,IAAI,QAAQ,MAAM,OAAO;AAAA,QAAgB,QAAQ,EAAE,IAAI,MAAM,WAAW,SAAS,cAAa,WAAW;AAAA,MAC9G,IAAI;AAAA,QAAO;AAAA,MACX;AAAA,MACA,SAAS,MAAM;AAAA,MACf,QAAQ,IAAI,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,MACvC,MAAM,KAAK,KAAK,OAAO,OAAO,MAAM,QAAQ,EAAE,CAAC;AAAA,MAC/C,MAAM,KAAK,EAAE,MAAM,MAAM,KAAK,OAAO,GAAG,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,IACA,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,OAAsB,CAAC;AAAA,IAC7B,WAAW,QAAQ,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC;AAAA,MAAG,KAAK,KAAK,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA,IACnF,WAAW,SAAS,KAAK;AAAA,MAAU,KAAK,KAAK,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,IACnE,MAAM,WAAW,KAAK;AAAA,IACtB,MAAM,MAAM,WAAW,aAAa,SAAS,SAAS,IAAI;AAAA,IAC1D,IAAI,YAAY,KAAK;AAAA,MACnB,MAAM,OAAO,cAAa,SAAS,MAAM,EAAE,MAAM,MAAM,CAAC;AAAA,MACxD,MAAM,OAAO,aAAY,MAAM,IAAI;AAAA,MACnC,MAAM,WAAW,MAAM,QAAQ,IAAI,KAAK,KAAK,cAAc,UAAU,KAAK,SAAS,SAAS,KAAK,SAAS;AAAA,MAC1G,IAAI,MAAM,QAAQ,IAAI,KAAK,CAAC,UAAU;AAAA,QACpC,MAAM,OAAO,gBAAgB,KAAK,IAAI,KAAK;AAAA,QAC3C,QAAQ,IAAI,MAAM,CAAC;AAAA,QACnB,KAAK,KAAK,EAAE,MAAM,WAAW,SAAS,WAAW,KAAK,MAAM,MAAM,OAAO,GAAG,GAAG,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC;AAAA,MAChH;AAAA,IACF;AAAA,IACA,SAAS,IAAI,KAAK,SAAS,EAAG,KAAK,GAAG;AAAA,MAAK,MAAM,KAAK,KAAK,EAAG;AAAA,EAChE;AAAA,EACA,OAAO,EAAE,SAAS,MAAM;AAAA;AAWnB,SAAS,WAAW,CAAC,SAA4B,MAAM,GAAa;AAAA,EACzE,MAAM,MAAM,IAAI,MAAc,QAAQ,SAAS,CAAC;AAAA,EAChD,IAAI,KAAK;AAAA,EACT,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK;AAAA,IACvC,IAAI,KAAK;AAAA,IACT,MAAM,QAAQ,MAAM,IAAI,QAAQ,SAAS,IAAI,MAAM;AAAA,EACrD;AAAA,EACA,IAAI,QAAQ,UAAU;AAAA,EACtB,OAAO;AAAA;AAQF,SAAS,WAAW,CAAC,UAAkD,KAAuB;AAAA,EACnG,IAAI,MAAM;AAAA,EACV,IAAI,IAAI;AAAA,EACR,WAAW,KAAK,UAAU;AAAA,IACxB,IAAI,OAAO,MAAM,UAAU;AAAA,MACzB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,IAAI,MAAM,IAAI;AAAA,EAC/B,OAAO,SAAS,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,QAAS;AAAA;AAiBnE,SAAS,UAAU,CAAC,IAAY,IAAY,MAAsC;AAAA,EAChF,OAAO,KAAK,IAAI;AAAA,IACd,MAAM,MAAO,KAAK,OAAQ;AAAA,IAC1B,IAAI,KAAK,GAAG;AAAA,MAAG,KAAK;AAAA,IACpB;AAAA,MAAK,KAAK,MAAM;AAAA,EAClB;AAAA,EACA,OAAO;AAAA;AAYF,SAAS,aAAa,CAAC,SAA4B,KAAa,QAAgB,UAAkB,WAAW,iBAAiB,SAA0C;AAAA,EAC7K,MAAM,QAAQ,QAAQ;AAAA,EACtB,MAAM,MAAM,WAAW,YAAY,SAAS,GAAG;AAAA,EAC/C,MAAM,QAAQ,IAAI;AAAA,EAClB,IAAI,QAAQ,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,QAAQ,MAAM,MAAM;AAAA,EACrE,IAAI,MAAM,WAAW,OAAO,OAAO,CAAC,MAAM,IAAI,MAAM,SAAS,QAAQ;AAAA,EACrE,QAAQ,KAAK,IAAI,GAAG,QAAQ,QAAQ;AAAA,EACpC,MAAM,KAAK,IAAI,OAAO,MAAM,QAAQ;AAAA,EACpC,IAAI,OAAO;AAAA,IAAO,OAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,GAAG,OAAO,OAAO,MAAM;AAAA,EAC7E,MAAM,SAAS,IAAI;AAAA,EACnB,MAAM,QAAQ,SAAS,IAAI,MAAM,KAAK,QAAQ,MAAM;AAAA,EACpD,OAAO,EAAE,OAAO,KAAK,QAAQ,OAAO,MAAM;AAAA;AAYrC,SAAS,oBAAoB,CAAC,SAA4B,KAAa,OAAe,UAAkB,QAAgB,QAAqB,WAAW,QAAQ,GAAG,SAAqC;AAAA,EAC7M,MAAM,MAAM,WAAW,YAAY,SAAS,GAAG;AAAA,EAC/C,MAAM,QAAQ,IAAI,QAAQ;AAAA,EAC1B,IAAI,QAAQ,KAAK,SAAS,QAAQ;AAAA,IAAQ,OAAO;AAAA,EACjD,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,OAAO,QAAQ;AAAA,EACrB,IAAI,OAAO;AAAA,EACX,IAAI,UAAU;AAAA,IAAS,OAAO,MAAM;AAAA,EACpC,KAAK,IAAI,UAAU;AAAA,IAAO,OAAO,MAAM,OAAO;AAAA,EAC9C,KAAK,IAAI,UAAU;AAAA,IAAU,OAAO,MAAM,OAAO,KAAK,WAAW,SAAS;AAAA,EAC1E,KAAK,IAAI,MAAM,QAAQ;AAAA,IAAQ,OAAO,MAAM;AAAA,EAC5C,KAAK,IAAI,MAAM,OAAO,SAAS;AAAA,IAAU,OAAO,MAAM,OAAO;AAAA,EAC7D,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,QAAQ,QAAQ,GAAG,IAAI,CAAC;AAAA;AAmB3D,SAAS,YAAY,CAAC,OAA2B,WAAkC;AAAA,EACxF,MAAM,MAAqB,CAAC;AAAA,EAC5B,MAAM,UAAU,UAAU,WAAW,GAAG,IAAI,YAAY,IAAI;AAAA,EAC5D,MAAM,QAAQ,CAAC,MAAM,UAAU;AAAA,IAC7B,MAAM,IAAI,aAAY,MAAM,OAAO;AAAA,IACnC,MAAM,QAAQ,MAAM,aAAa,MAAM,OAAO,KAAK,OAAO,MAAM,WAAW,KAAK,UAAU,CAAC,IAAI,OAAO,CAAC;AAAA,IACvG,MAAM,OAAO,IAAI,IAAI,SAAS;AAAA,IAC9B,IAAI,QAAQ,KAAK,UAAU;AAAA,MAAO,KAAK;AAAA,IACvC;AAAA,MAAK,IAAI,KAAK,EAAE,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,GAChD;AAAA,EACD,OAAO;AAAA;AAKF,SAAS,WAAW,CAAC,UAA6E;AAAA,EACvG,MAAM,OAAkD,CAAC;AAAA,EACzD,SAAS,QAAQ,CAAC,GAAG,MAAM;AAAA,IACzB,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IACvB,SAAS,IAAI,EAAG,IAAI,EAAE,OAAO;AAAA,MAAK,KAAK,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAAA,GAClE;AAAA,EACD,OAAO;AAAA;AAOF,SAAS,mBAAmB,CAAC,MAA0D,YAA+B,KAAa,WAAmB,UAAkB,QAAgB,QAAqB,WAAW,gBAAgB,OAAO,SAAqC;AAAA,EACzR,MAAM,MAAM,KAAK,UAAU,CAAC,OAAM,UAAU,MAAK,EAAE,SAAS,SAAS;AAAA,EACrE,IAAI,MAAM;AAAA,IAAG,OAAO;AAAA,EACpB,IAAI,SAAS;AAAA,EACb,OAAO,UAAU,KAAK,EAAE,YAAY,KAAK;AAAA,IAAU;AAAA,EACnD,MAAM,QAAQ,iBAAiB,UAAU,IAAI,WAAW,UAAU;AAAA,EAClE,OAAO,qBAAqB,YAAY,KAAK,KAAK,UAAU,QAAQ,OAAO,OAAO,OAAO;AAAA;AAUpF,SAAS,YAAY,CAAC,YAA+B,YAA+B,YAA+B,QAAwD;AAAA,EAChL,MAAM,SAAS,WAAW,GAAG,WAAW,QAAQ,CAAC,MAAM,WAAW,WAAW,MAAM,MAAM,IAAI;AAAA,EAC7F,IAAI,SAAS;AAAA,IAAG,OAAO;AAAA,EACvB,MAAM,MAAM,WAAW;AAAA,EACvB,MAAM,OAAO,WAAW,SAAS;AAAA,EACjC,MAAM,SAAS,WAAW;AAAA,EAC1B,MAAM,SAAS,SAAS,YAAY,SAAS,KAAK,IAAI,QAAQ,WAAW,QAAQ,MAAM;AAAA,EACvF,OAAO,EAAE,KAAK,OAAO;AAAA;;AC/TvB,IAAM,MAAM;AACZ,IAAM,SAAS,CAAC,GAAW,IAAY,OAAe,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;AAElF,IAAM,OAAO,CAAC,MAAc;AAAA,EAC1B,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,IAAI;AAAA,EAChC,OAAO,OAAO,GAAG,GAAG,EAAE,IAAI,IAAI;AAAA;AAGhC,SAAS,QAAQ,CAAC,QAA4C,GAAW,OAAmE;AAAA,EAC1I,MAAM,IAAI,SAAS,MAAM,CAAC;AAAA,EAC1B,MAAM,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK;AAAA,EACnC,MAAM,MAAM,OAAO,OAAO,EAAE,QAAQ,YAAY,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,MAAM,WAAW,GAAG,GAAG;AAAA,EAClG,MAAM,MAAM,OAAO,OAAO,EAAE,QAAQ,YAAY,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG;AAAA,EAC9F,OAAO,EAAE,KAAK,KAAK,aAAa,EAAE,gBAAgB,KAAK;AAAA;AASlD,SAAS,cAAc,CAAC,OAAuC,OAAe,QAA2C;AAAA,EAC9H,IAAI,SAAS;AAAA,IAAG,OAAO,CAAC;AAAA,EACxB,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM;AAAA,IACpD,MAAM,IAAI,QAAQ;AAAA,IAClB,OAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,KAAK,KAAK,IAAI,IAAI;AAAA,GACpE;AAAA,EACD,MAAM,UAAU,MAAM,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE;AAAA,EAChD,IAAI;AAAA,EACJ,IAAI,YAAY;AAAA,IAAO,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK;AAAA,EACxD,KAAK;AAAA,IACH,MAAM,MAAM,MAAM,OAAe,CAAC,GAAG,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,IAC1D,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG;AAAA,IAClC,MAAM,MAAM,IAAI,CAAC,MAAM,KAAK,OAAO,OAAO;AAAA;AAAA,EAE5C,MAAM,QAAQ,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,EAC3C,MAAM,QAAQ,MAAM,IAAI,IAAI,CAAC,MAAO,IAAI,MAAO,KAAK,IAAI,IAAI,IAAI,MAAM,MAAM,KAAK;AAAA,EACjF,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM,SAAS,QAAQ,GAAG,KAAK,CAAC;AAAA,EACxD,MAAM,IAAI,IAAI,CAAC,GAAG,MAAO,IAAI,GAAG,eAAe,KAAK,MAAM,IAAI,OAAO,GAAG,IAAI,GAAG,KAAK,IAAI,GAAG,GAAG,CAAE;AAAA,EAChG,IAAI,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,EAC9C,SAAS,IAAI,EAAG,IAAI,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;AAAA,IACtD,IAAI,IAAI,GAAG,eAAe,IAAI,OAAO;AAAA,MAAG;AAAA,IACxC,MAAM,OAAO,OAAO,IAAI,IAAI,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;AAAA,IAC/D,MAAM,OAAO,OAAO,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI;AAAA,IAClE,IAAI,MAAM;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,OAAO,IAAI,IAAI,IAAI;AAAA;AAWd,SAAS,YAAY,CAAC,OAA0B,QAAgB,OAAe,QAA2C;AAAA,EAC/H,MAAM,MAAM,CAAC,GAAG,KAAK;AAAA,EACrB,MAAM,IAAI;AAAA,EACV,MAAM,IAAI,SAAS;AAAA,EACnB,IAAI,IAAI,KAAK,KAAK,MAAM,UAAU,CAAC,OAAO,SAAS,KAAK;AAAA,IAAG,OAAO,IAAI,IAAI,IAAI;AAAA,EAC9E,MAAM,KAAK,SAAS,QAAQ,GAAG,MAAM,MAAM;AAAA,EAC3C,MAAM,KAAK,SAAS,QAAQ,GAAG,MAAM,MAAM;AAAA,EAC3C,MAAM,KAAK,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK,GAAG,GAAG;AAAA,EACxD,MAAM,KAAK,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK,GAAG,GAAG;AAAA,EACxD,IAAI,IAAI,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC;AAAA,EAEtD,IAAI,GAAG,eAAe,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,QAAQ,GAAG,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,GAAG,MAAM;AAAA,IAAK,IAAI,CAAC,MAAM;AAAA,EACpI,KAAK,IAAI,GAAG,eAAe,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,QAAQ,GAAG,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,GAAG,MAAM;AAAA,IAAK,IAAI,MAAM;AAAA,EAGxI,KAAK,IAAI,GAAG,eAAe,MAAM,OAAO;AAAA,IAAG,IAAI,SAAS,GAAG,MAAM,KAAK,MAAM,GAAG,MAAM,MAAM,OAAO,OAAO,GAAG,KAAK,EAAE,IAAI;AAAA,EACvH,KAAK,IAAI,GAAG,eAAe,MAAM,OAAO;AAAA,IAAG,IAAI,CAAC,SAAS,GAAG,MAAM,KAAK,CAAC,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,IAAI;AAAA,EAC5H,IAAI,KAAK,MAAM,KAAK;AAAA,EACpB,IAAI,KAAK,MAAM,KAAK;AAAA,EACpB,OAAO,IAAI,IAAI,IAAI;AAAA;AAWd,SAAS,cAAc,CAAC,OAA0B,QAAgB,KAAyB,aAAwC,YAA2B,OAAO,QAA2C;AAAA,EACrN,MAAM,IAAI;AAAA,EACV,MAAM,IAAI,SAAS;AAAA,EACnB,IAAI,IAAI,KAAK,KAAK,MAAM;AAAA,IAAQ,OAAO,MAAM,IAAI,IAAI;AAAA,EACrD,MAAM,KAAK,SAAS,QAAQ,GAAG,MAAM,MAAM;AAAA,EAC3C,MAAM,KAAK,SAAS,QAAQ,GAAG,MAAM,MAAM;AAAA,EAC3C,MAAM,OAAO,gBAAgB,gBAAgB,cAAc,QAAQ,KAAK;AAAA,EACxE,MAAM,OAAO,CAAC,SAAiB,aAAa,OAAO,QAAQ,OAAO,aAAa,MAAM;AAAA,EACrF,QAAQ;AAAA,IACN,KAAK;AAAA,MACH,OAAO,gBAAgB,eAAe,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,IACnE,KAAK;AAAA,MACH,OAAO,gBAAgB,eAAe,KAAK,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,IACpE,KAAK;AAAA,MACH,OAAO,gBAAgB,aAAa,KAAK,CAAC,IAAI,MAAM,IAAI,IAAI;AAAA,IAC9D,KAAK;AAAA,MACH,OAAO,gBAAgB,aAAa,KAAK,EAAE,IAAI,MAAM,IAAI,IAAI;AAAA,IAC/D,KAAK;AAAA,MACH,OAAO,aAAa,OAAO,QAAQ,GAAG,MAAM,MAAM,IAAI,MAAM;AAAA,IAC9D,KAAK;AAAA,MACH,OAAO,aAAa,OAAO,QAAQ,GAAG,MAAM,MAAM,IAAI,MAAM;AAAA,IAC9D,KAAK,SAAS;AAAA,MACZ,MAAM,MAAM,CAAC,GAAG,KAAK;AAAA,MACrB,IAAI,GAAG,aAAa;AAAA,QAClB,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAG,GAAG;AAAA,QACvE,IAAI,MAAM,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM;AAAA,UAAG,OAAO,MAAM,IAAI,IAAI;AAAA,QACjE,IAAI,MAAM;AAAA,QACV,IAAI,MAAM;AAAA,MACZ,EAAE,KAAK,IAAI,GAAG,aAAa;AAAA,QACzB,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,KAAK,CAAC,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAG,GAAG;AAAA,QACvE,IAAI,MAAM,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM;AAAA,UAAG,OAAO,MAAM,IAAI,IAAI;AAAA,QACjE,IAAI,MAAM;AAAA,QACV,IAAI,MAAM;AAAA,MACZ;AAAA,MACA,OAAO,IAAI,IAAI,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,MACE,OAAO,MAAM,IAAI,IAAI;AAAA;AAAA;AAMpB,SAAS,YAAY,CAAC,OAA0B,WAAmB,eAAe,GAAa;AAAA,EACpG,MAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,YAAY;AAAA,EAClF,OAAO,MAAM,IAAI,CAAC,MAAM,KAAM,QAAQ,IAAK,GAAG,CAAC;AAAA;AAK1C,SAAS,SAAS,CAAC,IAAY,WAAmB,YAAoB,aAAwC,YAA2B,OAAO,eAAe,GAAW;AAAA,EAC/K,MAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,aAAa,CAAC,IAAI,YAAY;AAAA,EAChF,MAAM,OAAO,gBAAgB,gBAAgB,cAAc,QAAQ,KAAK;AAAA,EACxE,OAAO,KAAO,KAAK,MAAO,QAAS,IAAI;AAAA;;AClJzC,SAAS,YAAY,CAAC,MAAc,KAA0D;AAAA,EAC5F,IAAI,CAAC,KAAK;AAAA,IAAO;AAAA,EACjB,MAAM,QAAQ,MAAM,mBAAkB,KAAK,OAAO,GAAG,IAAI,KAAK;AAAA,EAC9D,MAAM,IAAI,MAAM;AAAA,EAChB,OAAO,MAAM,SAAS,MAAM,QAAQ,IAAI;AAAA;AAQnC,SAAS,cAAc,CAAC,MAAc,SAAoB,KAAmD;AAAA,EAClH,MAAM,MAAiC,CAAC;AAAA,EACxC,MAAM,OAAO,CAAC,GAAW,cAAyB;AAAA,IAChD,MAAM,MAAM,aAAa,GAAG,GAAG,KAAK;AAAA,IACpC,IAAI,EAAE,MAAM;AAAA,IACZ,WAAW,QAAQ,OAAO,OAAO,EAAE,SAAS,CAAC,CAAC;AAAA,MAAG,KAAK,MAAM,GAAG;AAAA,IAC/D,WAAW,SAAS,EAAE;AAAA,MAAU,KAAK,OAAO,GAAG;AAAA;AAAA,EAEjD,KAAK,MAAM,OAAO;AAAA,EAClB,OAAO;AAAA;AAKF,SAAS,iBAAiB,CAAC,OAAgB,WAAqC;AAAA,EACrF,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,MACH,OAAO;AAAA,IACT,KAAK;AAAA,MACH,OAAO,cAAc,QAAQ,SAAS;AAAA,IACxC;AAAA,MACE,OAAO,cAAc,QAAQ,UAAU;AAAA;AAAA;AAMtC,SAAS,aAAa,CAAC,MAAc,WAAsB,KAAuC;AAAA,EACvG,MAAM,QAAQ,KAAK,QAAS,MAAM,mBAAkB,KAAK,OAAO,GAAG,IAAI,KAAK,QAAS,CAAC;AAAA,EACtF,OAAO,kBAAkB,MAAM,aAAa,KAAK,MAAM,OAAO,SAAS;AAAA;;ACzBlE,IAAM,aAAqD,OAAO,YAAY,OAAO,QAAQ,cAAU,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC;AACtJ,IAAM,kBAAqC,OAAO,KAAK,UAAU;AAmBxE,IAAM,SAAmB;AAIlB,SAAS,eAAe,CAAC,MAAc,OAAsB,eAAgD;AAAA,EAClH,MAAM,MAAM,WAAW;AAAA,EACvB,IAAI,CAAC;AAAA,IAAK,OAAO;AAAA,EACjB,MAAM,QAAQ,eAAc,iBAAiB,IAAI,QAAQ;AAAA,EACzD,MAAM,OAAO,SAAS,MAAM,UAAU,WAAW,MAAM,OAAO,OAAO,MAAM,QAAQ;AAAA,EACnF,MAAM,WAAW,eAAc,IAAI,QAAQ;AAAA,EAC3C,MAAM,MAAM,SAAS,WAAW,MAAM,OAAO,OAAO,SAAS,QAAQ,MAAM,KAAK,IAAI;AAAA,EACpF,MAAM,OAAO,eAAc,IAAI,MAAM;AAAA,EACrC,MAAM,SAAS,IAAI,WAAW,SAAS,SAAS,QAAQ,KAAK,UAAU,SAAU,MAAM,OAAO,KAAK,KAAK,SAAS,SAAU;AAAA,EAC3H,OAAO,EAAE,YAAY,IAAI,QAAQ,YAAY,IAAI,WAAW;AAAA;AAIvD,SAAS,WAAW,CAAC,OAAe,GAAmB;AAAA,EAC5D,OAAO,IAAI,IAAI,IAAI,MAAM;AAAA,EACzB,IAAI,KAAK;AAAA,IAAG,OAAO;AAAA,EACnB,IAAI,KAAK;AAAA,IAAG,OAAO;AAAA,EACnB,MAAM,KAAK,CAAC,MAAc,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,EACtF,MAAM,KAAK,CAAC,MAAc,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,EACtF,IAAI,KAAK;AAAA,EACT,IAAI,KAAK;AAAA,EACT,SAAS,IAAI,EAAG,IAAI,IAAI,KAAK;AAAA,IAC3B,MAAM,OAAO,KAAK,MAAM;AAAA,IACxB,IAAI,GAAG,GAAG,IAAI;AAAA,MAAG,KAAK;AAAA,IACtB;AAAA,MAAK,KAAK;AAAA,EACZ;AAAA,EACA,OAAO,IAAI,KAAK,MAAM,CAAC;AAAA;AAGzB,IAAM,WAAW,CAAC,WAAW,cAAc,cAAc,UAAU,OAAO;AAC1E,IAAM,OAAuB,EAAE,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,KAAK;AACzG,IAAM,KAAK,CAAC,MAAc;AAAA,EACxB,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,IAAI;AAAA,EAChC,OAAO,OAAO,GAAG,GAAG,EAAE,IAAI,IAAI;AAAA;AAGhC,SAAS,OAAO,CAAC,KAAmB,UAAkB,QAA2C;AAAA,EAC/F,MAAM,KAAK,IAAI;AAAA,EACf,IAAI,IAAI;AAAA,EACR,OAAO,IAAI,GAAG,SAAS,KAAK,WAAW,GAAG,IAAI,GAAG;AAAA,IAAQ;AAAA,EACzD,MAAM,IAAI,GAAG;AAAA,EACb,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,SAAS,CAAC;AAAA,EAC1C,MAAM,OAAO,EAAE,SAAS,EAAE;AAAA,EAC1B,MAAM,QAAQ,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,WAAW,EAAE,UAAU,IAAI,CAAC,IAAI;AAAA,EAClF,MAAM,IAAI,WAAW,SAAS,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAC/D,MAAM,MAAsB,KAAK,KAAK;AAAA,EACtC,WAAW,MAAM,UAAU;AAAA,IACzB,MAAM,KAAK,EAAE,OAAO,KAAK;AAAA,IACzB,MAAM,KAAK,EAAE,OAAO,KAAK;AAAA,IACzB,IAAI,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;AAAA,EACjC;AAAA,EACA,IAAI,EAAE,SAAS,aAAa,EAAE,SAAS;AAAA,IAAW,IAAI,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9F,OAAO;AAAA;AAMF,SAAS,cAAc,CAAC,MAAc,WAAmB,OAAsB,UAA+D,CAAC,GAA0B;AAAA,EAC9K,MAAM,MAAM,WAAW;AAAA,EACvB,MAAM,SAAS,gBAAgB,MAAM,OAAO,QAAQ,aAAa;AAAA,EACjE,IAAI,CAAC,OAAO,CAAC;AAAA,IAAQ,OAAO;AAAA,EAC5B,IAAI,QAAQ,eAAe;AAAA,IACzB,MAAM,OAAO,QAAQ,KAAK,IAAI,MAAM,MAAM;AAAA,IAC1C,OAAO,KAAK,MAAM,MAAM,KAAK;AAAA,EAC/B;AAAA,EACA,MAAM,IAAI,OAAO;AAAA,EACjB,IAAI,KAAK;AAAA,IAAG,OAAO,QAAQ,KAAK,GAAG,MAAM;AAAA,EACzC,MAAM,aAAa,OAAO,eAAe,aAAa,WAAW,OAAO;AAAA,EACxE,MAAM,IAAI,KAAK,IAAI,GAAG,SAAS;AAAA,EAC/B,IAAI,KAAK,IAAI;AAAA,IAAY,OAAO,QAAQ,KAAK,GAAG,OAAO,MAAM;AAAA,EAC7D,OAAO,QAAQ,KAAM,IAAI,IAAK,GAAG,OAAO,MAAM;AAAA;AAKzC,SAAS,cAAc,CAAC,KAAyB,OAAsC;AAAA,EAC5F,OAAO,IAAI,OAAO,MAAM,OAAO,WAAW,EAAE;AAAA;AAG9C,IAAM,MAAM,CAAC,MAAc,OAAO,GAAG,CAAC,CAAC;AAMhC,IAAM,2BAA2B;AAIjC,SAAS,eAAe,CAAC,MAAuB;AAAA,EACrD,OAAO,WAAW,OAAO,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY,SAAS,KAAK;AAAA;AAStE,SAAS,YAAY,CAAC,MAAsB;AAAA,EACjD,MAAM,MAAM,WAAW;AAAA,EACvB,IAAI,CAAC;AAAA,IAAK,OAAO;AAAA,EACjB,MAAM,QAAQ,IAAI,UAAU,IAAI,CAAC,MAAM;AAAA,IACrC,MAAM,OAAiB,CAAC;AAAA,IACxB,IAAI,EAAE,YAAY;AAAA,MAAW,KAAK,KAAK,mBAAmB,IAAI,EAAE,OAAO,GAAG;AAAA,IAC1E,IAAI,EAAE,eAAe,aAAa,EAAE,eAAe;AAAA,MAAW,KAAK,KAAK,aAAa,IAAI,EAAE,cAAc,CAAC,OAAO,IAAI,EAAE,cAAc,CAAC,KAAK;AAAA,IAC3I,IAAI,EAAE,WAAW;AAAA,MAAW,KAAK,KAAK,UAAU,IAAI,EAAE,MAAM,MAAM;AAAA,IAClE,IAAI,EAAE,UAAU;AAAA,MAAW,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,GAAG;AAAA,IAC5D,IAAI,EAAE,SAAS;AAAA,MAAW,KAAK,KAAK,cAAc,IAAI,EAAE,IAAI,GAAG;AAAA,IAC/D,OAAO,GAAG,IAAI,EAAE,SAAS,GAAG,MAAM,KAAK,KAAK,GAAG;AAAA,GAChD;AAAA,EACD,OAAO,kBAAkB,QAAQ,MAAM,KAAK,EAAE;AAAA;AAKzC,SAAS,YAAY,CAAC,MAAc,QAAiC;AAAA,EAC1E,MAAM,SAAS,OAAO,WAAW,SAAS,WAAW,gBAAgB,OAAO,OAAO,KAAK,IAAI;AAAA,EAC5F,MAAM,aAAa,OAAO,eAAe,aAAa,aAAa,OAAO,OAAO,UAAU;AAAA,EAC3F,OAAO,OAAO,QAAQ,OAAO,gBAAgB,UAAU;AAAA;;ACxKlD,IAAM,iBAAyB,eAAW;AAOjD,IAAM,UAA4C,eAAW;AAMtD,SAAS,WAAW,CAAC,QAA6B;AAAA,EACvD,MAAM,OAAO,OAAO,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EAChE,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY;AAAA,EACxC,MAAM,WAAW,QAAQ,QAAQ;AAAA,EACjC,MAAM,SAAS,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,wBAAwB,KAAK,CAAC,CAAC;AAAA,EACxE,OAAO,EAAE,UAAU,QAAQ,SAAS,OAAO,YAAY,IAAI,KAAK;AAAA;AAGlE,IAAM,wBAAgD,MAAM;AAAA,EAC1D,MAAM,MAA8B,CAAC;AAAA,EACrC,YAAY,KAAK,YAAY,OAAO,QAAQ,eAAW,UAAU,OAAO;AAAA,IAAG,WAAW,KAAK;AAAA,MAAS,IAAI,KAAK,OAAO,GAAG;AAAA,EACvH,OAAO;AAAA,GACN;AAII,SAAS,YAAY,CAAC,QAA+B;AAAA,EAC1D,QAAQ,UAAU,WAAW,YAAY,MAAM;AAAA,EAC/C,OAAO,UAAW,eAAW,aAAwC,aAAa;AAAA;AAI7E,SAAS,SAAS,CAAC,QAAwB;AAAA,EAChD,MAAM,IAAI,aAAa,MAAM;AAAA,EAC7B,OAAO,MAAM,QAAQ,KAAK,uBAAuB,qBAAqB,KAAK,eAAW,UAAU;AAAA;AAI3F,SAAS,aAAa,CAAC,QAA+B;AAAA,EAC3D,OAAO,eAAW,IAAI,SAAS,YAAY,MAAM,EAAE,QAAQ,IAAI,QAAQ;AAAA;AAIlE,IAAM,qBAAwC,eAAW;AAIzD,SAAS,YAAY,CAAC,MAAc,WAAmC;AAAA,EAC5E,OAAO,cAAc,SAAS,mBAAmB,SAAS,IAAI;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzBzD,IAAM,iBAA+C,aAAS;AAC9D,IAAM,sBAAyC,OAAO,KAAK,cAAc;AAEhF,IAAM,UAAU,CAAC,MAA0B,MAAM,aAAa,KAAK,OAAO,KAAK;AAC/E,IAAM,UAAU,CAAC,MAA0B,MAAM,cAAe,KAAK,OAAO,KAAK,OAAS,KAAK,OAAO,KAAK;AAC3G,IAAM,UAAU,CAAC,MAA0B,MAAM,OAAO,MAAM;AAG9D,SAAS,YAAY,CAAC,MAAc,GAA+B;AAAA,EACjE,IAAI,IAAI;AAAA,EACR,OAAO,QAAQ,KAAK,EAAE;AAAA,IAAG;AAAA,EACzB,OAAO,KAAK;AAAA;AAMd,SAAS,IAAI,CAAC,MAAc,MAAoB,YAAY,MAAmB;AAAA,EAC7E,MAAM,MAAmB,CAAC;AAAA,EAC1B,MAAM,IAAI,KAAK;AAAA,EACf,MAAM,YAAY,KAAK,aAAa,aAAS,SAAS;AAAA,EACtD,MAAM,cAAc,KAAK,eAAe,aAAS,SAAS;AAAA,EAC1D,MAAM,QAAQ,KAAK,cAAc;AAAA,EACjC,MAAM,aAAa,CAAC,MAA0B,QAAQ,CAAC,KAAK,MAAM,OAAO,MAAM,OAAQ,MAAM,aAAa,MAAM,SAAS,CAAC;AAAA,EAC1H,MAAM,YAAY,CAAC,MAA0B,WAAW,CAAC,KAAK,QAAQ,CAAC;AAAA,EACvE,MAAM,WAAW,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC;AAAA,EAC5C,MAAM,YAAY,IAAI,IAAI,KAAK,aAAa,CAAC,CAAC;AAAA,EAC9C,MAAM,OAAO,CAAC,MAAc,SAAiB,IAAI,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,EACpE,MAAM,kBAAkB,MAAM;AAAA,IAC5B,SAAS,IAAI,IAAI,SAAS,EAAG,KAAK,GAAG;AAAA,MAAK,IAAI,IAAI,GAAG,KAAK,KAAK,MAAM;AAAA,QAAI,OAAO,IAAI;AAAA,IACpF;AAAA;AAAA,EAEF,IAAI,KAAK;AAAA,IAAO,OAAO,OAAO,CAAC,EAAE,MAAM,SAAS,MAAM,KAAK,CAAC,IAAI,CAAC;AAAA,EACjE,IAAI,IAAI;AAAA,EACR,IAAI,QAAQ;AAAA,EACZ,OAAO,IAAI,GAAG;AAAA,IACZ,MAAM,IAAI,KAAK;AAAA,IACf,IAAI,MAAM;AAAA,GAAM;AAAA,MACd,KAAK,SAAS,CAAC;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,cAAc,MAAM,IAAI,YAAY,KAAK,IAAI,OAAO;AAAA,KAAQ,sBAAsB,MAAM,GAAG,SAAS,IAAI;AAAA,MAE/G,IAAI;AAAA,MACJ,WAAW,KAAK,OAAO,KAAK,KAAK,SAAS;AAAA,QAAG,IAAI,KAAK,WAAW,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,OAAO;AAAA,UAAS,SAAS;AAAA,MAC1H,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG;AAAA,QACzB,IAAI,IAAI;AAAA,QACR,OAAO,IAAI,KAAK,KAAK,OAAO;AAAA;AAAA,UAAM;AAAA,QAClC,KAAK,KAAK,UAAU,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,QAC7C,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,CAAC,SAAS,KAAK,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,CAAC,CAAC,IAAI;AAAA,IACpF,IAAI,MAAM;AAAA,MACR,IAAI,IAAI;AAAA,MACR,OAAO,IAAI,KAAK,KAAK,OAAO;AAAA;AAAA,QAAM;AAAA,MAClC,KAAK,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MAChC,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,CAAC,SAAS,KAAK,gBAAgB,CAAC,GAAG,KAAK,EAAE,UAAU,KAAK,WAAW,MAAM,CAAC,CAAC,IAAI;AAAA,IAC9F,IAAI,OAAO;AAAA,MACT,MAAM,MAAM,KAAK,QAAQ,MAAM,IAAI,IAAI,MAAM,GAAG,MAAM;AAAA,MACtD,MAAM,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM,GAAG;AAAA,MACvC,KAAK,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MAChC,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,KAAK,KAAK,WAAW,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,UAAU,QAAQ;AAAA,MAC/D,MAAM,SAAS,KAAK,aAAa,CAAC,GAAG,SAAS,CAAC;AAAA,MAC/C,IAAI,IAAI,IAAI;AAAA,MACZ,OAAO,IAAI,GAAG;AAAA,QACZ,IAAI,KAAK,OAAO,MAAM;AAAA,UACpB,KAAK;AAAA,UACL;AAAA,QACF;AAAA,QACA,IAAI,KAAK,OAAO,GAAG;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AAAA,QACA,IAAI,KAAK,OAAO;AAAA,KAAQ,CAAC;AAAA,UAAO;AAAA,QAChC;AAAA,MACF;AAAA,MACA,IAAI,KAAK,IAAI,GAAG,CAAC;AAAA,MACjB,MAAM,OAAO,KAAK,cAAc,aAAa,MAAM,CAAC,MAAM,MAAM,aAAa;AAAA,MAC7E,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MAC3B,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,QAAQ;AAAA,MACf,IAAI,CAAC,OAAO;AAAA,QACV,IAAI,MAAM,QAAQ,QAAQ,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,OAAO,OAAO,KAAK,IAAI,OAAO,MAAM;AAAA,UACrF,MAAM,OAAO,KAAK,IAAI,OAAO,MAAM,OAAO;AAAA,UAC1C,KAAK,eAAe,IAAI;AAAA,UACxB,IAAI,IAAI,IAAI,KAAK;AAAA,UACjB,MAAM,QAAQ;AAAA,UACd,OAAO,IAAI,MAAM,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK,EAAE,KAAK,KAAK,OAAO,OAAO,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,YAAM;AAAA,UACjH,IAAI,IAAI;AAAA,YAAO,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC,CAAC;AAAA,UAC/C,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ;AAAA,QACF;AAAA,QACA,IAAI,IAAI;AAAA,QACR,OAAO,IAAI,KAAK,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA;AAAA,UAAM;AAAA,QACrD,IAAI,MAAM;AAAA,UAAG,IAAI,IAAI;AAAA,QACrB,KAAK,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,QAC9B,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,MACA,IAAI,MAAM,OAAO,KAAK,WAAW,MAAM,CAAC,GAAG;AAAA,QACzC,MAAM,QAAQ,MAAM,MAAM,MAAM;AAAA,QAChC,KAAK,eAAe,KAAK;AAAA,QACzB,QAAQ;AAAA,QACR,KAAK,MAAM;AAAA,QACX;AAAA,MACF;AAAA,MACA,IAAI,MAAM,KAAK;AAAA,QACb,KAAK,YAAY,CAAC;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,CAAC,KAAK,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AAAA,QACrD,IAAI,IAAI;AAAA,QACR,OAAO,IAAI,MAAM,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK,EAAE,KAAK,QAAQ,SAAS,KAAK,EAAE;AAAA,UAAI;AAAA,QACrF,KAAK,aAAa,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,QAClC,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,CAAC,GAAG;AAAA,QACd,IAAI,IAAI;AAAA,QACR,OAAO,QAAQ,KAAK,EAAE;AAAA,UAAG;AAAA,QACzB,KAAK,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,QAC9B,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,MACA,KAAK,SAAS,CAAC;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,YAAY,UAAU,QAAQ,CAAC,KAAM,MAAM,OAAO,QAAQ,KAAK,IAAI,EAAE,IAAK;AAAA,MACjF,IAAI,IAAI,IAAI;AAAA,MACZ,OAAO,IAAI,MAAM,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK,EAAE,KAAK,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,QAAM;AAAA,MAC9F,KAAK,UAAU,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MAC/B,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,IAAI,WAAW,CAAC,GAAG;AAAA,MACjB,IAAI,IAAI,IAAI;AAAA,MACZ,OAAO,IAAI,KAAK,UAAU,KAAK,EAAE;AAAA,QAAG;AAAA,MACpC,MAAM,OAAO,KAAK,MAAM,GAAG,CAAC;AAAA,MAC5B,MAAM,MAAM,KAAK,kBAAkB,KAAK,YAAY,IAAI;AAAA,MACxD,MAAM,OAAO,aAAa,MAAM,CAAC;AAAA,MACjC,MAAM,SAAS,MAAM;AAAA,QACnB,IAAI,IAAI;AAAA,QACR,OAAO,QAAQ,KAAK,EAAE;AAAA,UAAG;AAAA,QACzB,OAAO,KAAK,IAAI;AAAA,SACf;AAAA,MACH,MAAM,OAAO,gBAAgB;AAAA,MAC7B,IAAI,OAAO;AAAA,MACX,IAAI,SAAS,IAAI,GAAG;AAAA,QAAG,OAAO;AAAA,MAC9B,KAAK,IAAI,KAAK,aAAa,SAAS,OAAO,UAAU;AAAA,QAAK,OAAO;AAAA,MACjE,KAAK,IAAI,SAAS;AAAA,QAAK,OAAO;AAAA,MAC9B,KAAK,IAAI,QAAQ,KAAK,SAAS,iBAAiB,KAAK,KAAK,SAAS,GAAG;AAAA,QAAG,OAAO;AAAA,MAChF,KAAK,IAAI,UAAU,IAAI,IAAI,KAAM,KAAK,UAAU,iBAAiB,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,QAAM,OAAO;AAAA,MAC3G,KAAK,MAAM,IAAI;AAAA,MACf,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,CAAC,GAAG;AAAA,MACd,IAAI,IAAI;AAAA,MACR,OAAO,QAAQ,KAAK,EAAE;AAAA,QAAG;AAAA,MACzB,KAAK,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MAC9B,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,IAAI,UAAU,SAAS,CAAC,GAAG;AAAA,MACzB,IAAI,IAAI;AAAA,MACR,OAAO,IAAI,KAAK,UAAU,SAAS,KAAK,EAAE;AAAA,QAAG;AAAA,MAC7C,KAAK,YAAY,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MACjC,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,KAAK,YAAY,SAAS,CAAC,IAAI,gBAAgB,SAAS,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAKT,SAAS,qBAAqB,CAAC,MAAc,GAAW,YAAY,MAAe;AAAA,EACjF,IAAI,IAAI,IAAI;AAAA,EACZ,OAAO,KAAK,KAAK,QAAQ,KAAK,EAAE;AAAA,IAAG;AAAA,EACnC,OAAO,IAAI,IAAI,YAAY,KAAK,OAAO;AAAA;AAAA;AAUzC,IAAM,aAAa,CAAC,MAAc,KAAK,MAAQ,KAAK;AACpD,IAAM,oBAAoB,CAAC,MAAc,KAAK,MAAQ,KAAK;AAC3D,IAAM,aAAa,CAAC,MAAc,KAAK,MAAQ,KAAK;AAKpD,SAAS,OAAO,CAAC,QAAgB,MAAoC;AAAA,EACnE,IAAI,MAAM;AAAA,EACV,WAAW,OAAO,OAAO,MAAM,GAAG,GAAG;AAAA,IACnC,MAAM,IAAI,QAAQ,KAAK,IAAI,OAAO,GAAG;AAAA,IACrC,IAAI,MAAM,KAAK,MAAM;AAAA,MAAI,MAAM;AAAA,IAC/B,KAAK,IAAI,MAAM,MAAM,MAAM;AAAA,MAAI,MAAM;AAAA,IACrC,KAAK,IAAI,MAAM,MAAM,MAAM;AAAA,MAAI,MAAM;AAAA,IACrC,KAAK,IAAI,MAAM,MAAM,MAAM;AAAA,MAAI,MAAM;AAAA,IACrC,KAAK,IAAI,MAAM,KAAK,MAAM;AAAA,MAAI,MAAM;AAAA,EACtC;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,QAAQ,CAAC,QAA2B;AAAA,EAClD,MAAM,OAAkB,CAAC;AAAA,EACzB,IAAI,OAAsB;AAAA,EAC1B,IAAI,OAAO;AAAA,EACX,MAAM,QAAQ,MAAM;AAAA,IAClB,IAAI,SAAS;AAAA,MAAI;AAAA,IACjB,MAAM,OAAO,KAAK,KAAK,SAAS;AAAA,IAChC,IAAI,QAAQ,KAAK,SAAS;AAAA,MAAM,KAAK,QAAQ;AAAA,IAC7C;AAAA,MAAK,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,IAC7B,OAAO;AAAA;AAAA,EAET,IAAI,IAAI;AAAA,EACR,MAAM,IAAI,OAAO;AAAA,EACjB,OAAO,IAAI,GAAG;AAAA,IACZ,IAAI,OAAO,WAAW,CAAC,MAAM,MAAQ,OAAO,IAAI,OAAO,KAAK;AAAA,MAC1D,IAAI,IAAI,IAAI;AAAA,MACZ,OAAO,IAAI,KAAK,WAAW,OAAO,WAAW,CAAC,CAAC;AAAA,QAAG;AAAA,MAClD,MAAM,SAAS,OAAO,MAAM,IAAI,GAAG,CAAC;AAAA,MACpC,OAAO,IAAI,KAAK,kBAAkB,OAAO,WAAW,CAAC,CAAC;AAAA,QAAG;AAAA,MACzD,IAAI,IAAI,KAAK,WAAW,OAAO,WAAW,CAAC,CAAC,GAAG;AAAA,QAC7C,IAAI,OAAO,OAAO,KAAK;AAAA,UACrB,MAAM,OAAO,QAAQ,QAAQ,IAAI;AAAA,UACjC,IAAI,SAAS,MAAM;AAAA,YACjB,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,IAAI,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,OAAO;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA;AAIT,SAAS,QAAQ,CAAC,MAAc,MAAiC;AAAA,EAC/D,MAAM,MAAmB,CAAC;AAAA,EAC1B,IAAI,SAAS;AAAA,EACb,WAAW,OAAO,SAAS,IAAI,GAAG;AAAA,IAChC,IAAI,IAAI;AAAA,MAAM,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,IACzD;AAAA,MAAK,IAAI,KAAK,GAAG,KAAK,IAAI,MAAM,MAAM,MAAM,CAAC;AAAA,IAC7C,SAAS,sBAAsB,IAAI,MAAM,IAAI,KAAK,QAAQ,MAAM;AAAA,EAClE;AAAA,EACA,OAAO;AAAA;AAKF,SAAS,QAAQ,CAAC,QAAgB,UAA0B;AAAA,EACjE,MAAM,OAAO,OAAO,QAAQ,UAAU;AAAA,CAAI;AAAA,EAC1C,OAAO,eAAe,WAAW,OAAO,SAAS,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;AAAA;AAMhF,SAAS,YAAY,CAAC,QAAgB,UAAiC;AAAA,EAC5E,MAAM,OAAO,OAAO,QAAQ,UAAU;AAAA,CAAI;AAAA,EAC1C,MAAM,OAAO,eAAe,aAAa,eAAe;AAAA,EACxD,MAAM,QAAuB,CAAC,CAAC,CAAC;AAAA,EAChC,WAAW,SAAS,KAAK,OAAO,SAAS,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,GAAG;AAAA,IACvE,MAAM,SAAS,MAAM,KAAK,MAAM;AAAA,CAAI;AAAA,IACpC,OAAO,QAAQ,CAAC,OAAO,UAAU;AAAA,MAC/B,IAAI,QAAQ;AAAA,QAAG,MAAM,KAAK,CAAC,CAAC;AAAA,MAC5B,IAAI,UAAU;AAAA,QAAI;AAAA,MAClB,MAAM,OAAO,MAAM,MAAM,SAAS;AAAA,MAClC,MAAM,OAAO,KAAK,KAAK,SAAS;AAAA,MAChC,IAAI,QAAQ,KAAK,SAAS,MAAM;AAAA,QAAM,KAAK,QAAQ;AAAA,MACnD;AAAA,QAAK,KAAK,KAAK,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AAAA,KACjD;AAAA,EACH;AAAA,EACA,OAAO;AAAA;;ACpVF,IAAM,eAAe,cAAU;AAgBtC,IAAM,WAAW,CAAC,MAAe,KAAK,UAAU,IAAI,QAAQ,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG;AAC7F,IAAM,UAAU,CAAC,MAAc;AAAA,EAC7B,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AAAA,EACpC,OAAO,KAAK,YAAY,QAAQ,IAAI,QAAQ,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI;AAAA;AAGrE,SAAS,UAAU,CAAC,GAAW,GAAW,GAAgB;AAAA,EACxD,OAAO,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,GAAG,GAAG,SAAS,IAAI,GAAG,GAAG,SAAS,IAAI,GAAG,CAAC;AAAA,EAC7E,MAAM,IAAI,KAAK,KAAK,eAAe,KAAK,eAAe,KAAK,eAAe,EAAE;AAAA,EAC7E,MAAM,IAAI,KAAK,KAAK,eAAe,KAAK,eAAe,KAAK,eAAe,EAAE;AAAA,EAC7E,MAAM,IAAI,KAAK,KAAK,eAAe,KAAK,eAAe,KAAK,eAAe,EAAE;AAAA,EAC7E,OAAO;AAAA,IACL,eAAe,IAAI,cAAc,IAAI,eAAe;AAAA,IACpD,eAAe,IAAI,cAAc,IAAI,eAAe;AAAA,IACpD,eAAe,IAAI,eAAe,IAAI,cAAc;AAAA,EACtD;AAAA;AAGF,SAAS,UAAU,EAAE,GAAG,GAAG,IAAmC;AAAA,EAC5D,MAAM,IAAI,KAAK,IAAI,IAAI,eAAe,IAAI,eAAe,GAAG,CAAC;AAAA,EAC7D,MAAM,IAAI,KAAK,IAAI,IAAI,eAAe,IAAI,eAAe,GAAG,CAAC;AAAA,EAC7D,MAAM,IAAI,KAAK,IAAI,IAAI,eAAe,IAAI,cAAc,GAAG,CAAC;AAAA,EAC5D,OAAO;AAAA,IACL,QAAQ,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC,IAAI;AAAA,IAClE,QAAQ,gBAAgB,IAAI,eAAe,IAAI,eAAe,CAAC,IAAI;AAAA,IACnE,QAAQ,gBAAgB,IAAI,eAAe,IAAI,cAAc,CAAC,IAAI;AAAA,EACpE;AAAA;AAGF,IAAM,MAAM,CAAC,KAAU,UAAkB;AAAA,EACvC,OAAO,GAAG,GAAG,KAAK,WAAW,GAAG;AAAA,EAChC,OAAO,OAAM,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC;AAAA;AAK7B,SAAS,WAAW,CAAC,OAAe,MAA4B;AAAA,EACrE,MAAM,IAAI;AAAA,EACV,MAAM,IAAI,YAAW,KAAK,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EACxD,MAAM,OAAO,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAAA,EACrC,IAAI,OAAY;AAAA,EAChB,IAAI,YAAY,EAAE,IAAI,EAAE;AAAA,EACxB,IAAI,MAAM;AAAA,IACR,OAAO,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,uBAAuB,KAAK,KAAK,EAAE,uBAAuB,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE;AAAA,IAC7G,YAAY,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,mBAAmB;AAAA,EACrD;AAAA,EACA,MAAM,MAAM,EAAE,IAAI;AAAA,EAClB,MAAM,MAAW,MAAM,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,aAAa,GAAG,IAAW;AAAA,EACtG,OAAO;AAAA,IACL,MAAM,OAAM,CAAC;AAAA,IACb,WAAW,IAAI,MAAM,SAAS;AAAA,IAC9B,KAAK,IAAI,KAAK,MAAM,CAAC;AAAA,IACrB,YAAY,EAAE;AAAA,IACd,UAAU,EAAE;AAAA,IACZ,UAAU,EAAE;AAAA,EACd;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1DK,IAAM,aAAgC,aAAS;AAC/C,IAAM,aAAgC,aAAS;AAC/C,IAAM,gBAA4F,aAAS;AAC3G,IAAM,iBAA0D,aAAS;AAGzE,SAAS,aAAa,CAAC,MAAyC;AAAA,EACrE,OAAO,eAAe;AAAA;AAIjB,SAAS,UAAU,CAAC,OAAyB;AAAA,EAClD,OAAO,OAAO,UAAU,YAAY,WAAW,SAAS,KAAK;AAAA;;ACdxD,SAAS,WAAW,CAAC,MAAc,QAAgC,KAAc,KAA4C;AAAA,EAClI,IAAI,KAAK;AAAA,EACT,IAAI,KAAK;AAAA,EACT,IAAI,SAAS,cAAc;AAAA,IACzB,IAAI,IAAI;AAAA,IACR,WAAW,KAAK;AAAA,MAAQ,IAAI,KAAK,IAAI,GAAG,EAAE,OAAO,MAAM;AAAA,IACvD,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,IAAI,MAAM;AAAA,MACV,IAAI,MAAM;AAAA,MACV,WAAW,KAAK,QAAQ;AAAA,QACtB,MAAM,IAAI,EAAE,OAAO;AAAA,QACnB,IAAI,CAAC,OAAO,SAAS,CAAC;AAAA,UAAG;AAAA,QACzB,IAAI,IAAI;AAAA,UAAG,OAAO;AAAA,QAClB;AAAA,UAAK,OAAO;AAAA,MACd;AAAA,MACA,IAAI,MAAM;AAAA,QAAI,KAAK;AAAA,MACnB,IAAI,MAAM;AAAA,QAAI,KAAK;AAAA,IACrB;AAAA,EACF,EAAE,KAAK;AAAA,IACL,WAAW,KAAK;AAAA,MACd,WAAW,KAAK,EAAE,QAAQ;AAAA,QACxB,IAAI,CAAC,OAAO,SAAS,CAAC;AAAA,UAAG;AAAA,QACzB,IAAI,IAAI;AAAA,UAAI,KAAK;AAAA,QACjB,IAAI,IAAI;AAAA,UAAI,KAAK;AAAA,MACnB;AAAA;AAAA,EAEJ,IAAI,SAAS,aAAa;AAAA,IACxB,KAAK,KAAK,IAAI,GAAG,EAAE;AAAA,IACnB,KAAK,KAAK,IAAI,GAAG,EAAE;AAAA,EACrB;AAAA,EACA,IAAI,CAAC,OAAO,SAAS,EAAE;AAAA,IAAG,KAAK;AAAA,EAC/B,IAAI,CAAC,OAAO,SAAS,EAAE;AAAA,IAAG,KAAK;AAAA,EAC/B,KAAK,OAAO;AAAA,EACZ,KAAK,OAAO;AAAA,EACZ,IAAI,MAAM;AAAA,IAAI,KAAK,KAAK;AAAA,EACxB,OAAO,EAAE,KAAK,IAAI,KAAK,GAAG;AAAA;AAKrB,SAAS,kBAAkB,CAAC,QAA8E;AAAA,EAC/G,IAAI,KAAK;AAAA,EACT,IAAI,KAAK;AAAA,EACT,WAAW,KAAK;AAAA,IACd,WAAW,KAAK,EAAE,QAAQ;AAAA,MACxB,IAAI,CAAC,OAAO,SAAS,CAAC;AAAA,QAAG;AAAA,MACzB,IAAI,IAAI;AAAA,QAAI,KAAK;AAAA,MACjB,IAAI,IAAI;AAAA,QAAI,KAAK;AAAA,IACnB;AAAA,EACF,OAAO,EAAE,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,GAAG,KAAK,OAAO,SAAS,EAAE,IAAI,KAAK,GAAG,KAAK,OAAO,SAAS,EAAE,IAAI,KAAK,EAAE;AAAA;AAKvI,SAAS,sBAAsB,CAAC,QAAsF;AAAA,EAC3H,MAAM,SAAS,OAAO,OAAO,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAAA,EACtD,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE;AAAA,EACpE,IAAI,KAAK;AAAA,EACT,IAAI,KAAK;AAAA,EACT,WAAW,KAAK,QAAQ;AAAA,IACtB,IAAI,IAAI;AAAA,MAAI,KAAK;AAAA,IACjB,IAAI,IAAI;AAAA,MAAI,KAAK;AAAA,EACnB;AAAA,EACA,OAAO,EAAE,OAAO,OAAO,IAAI,MAAM,OAAO,OAAO,SAAS,IAAI,KAAK,IAAI,KAAK,GAAG;AAAA;AAG/E,SAAS,OAAO,CAAC,GAAW,OAAwB;AAAA,EAClD,MAAM,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,EACpC,MAAM,IAAI,IAAI,MAAM;AAAA,EACpB,MAAM,KAAK,QAAS,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAM,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,EACvG,OAAO,KAAK,MAAM;AAAA;AAMb,SAAS,SAAS,CAAC,KAAa,KAAa,SAAS,GAAgE;AAAA,EAC3H,MAAM,KAAK,KAAK,IAAI,KAAK,GAAG;AAAA,EAC5B,MAAM,KAAK,QAAQ,MAAM,MAAM,IAAI,KAAK,IAAI,KAAK,GAAG;AAAA,EACpD,MAAM,QAAQ,QAAQ,KAAK,IAAI,KAAK;AAAA,EACpC,MAAM,OAAO,QAAQ,QAAQ,KAAK,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI;AAAA,EAC1D,MAAM,WAAW,KAAK,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,EAC1D,MAAM,MAAM,CAAC,MAAc,OAAO,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACrD,MAAM,UAAU,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI;AAAA,EAChD,MAAM,UAAU,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI;AAAA,EAC/C,MAAM,QAAkB,CAAC;AAAA,EACzB,SAAS,IAAI,SAAS,IAAI,EAAG,KAAK,UAAU,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,UAAU,IAAI;AAAA,IAAM,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,EAC/G,OAAO,EAAE,KAAK,SAAS,KAAK,SAAS,MAAM,MAAM;AAAA;AAK5C,SAAS,WAAW,CAAC,OAAe,MAAuB;AAAA,EAChE,IAAI;AAAA,IAAM,OAAO,SAAS,WAAW,uBAAuB,SAAS,YAAY,2BAA2B,UAAU;AAAA,EACtH,OAAO,eAAgB,QAAQ,IAAK;AAAA;AAI/B,IAAM,aAAa;;AC3G1B,IAAM,aAAa;AACnB,IAAM,OAAO;AAEN,SAAS,iBAAiB,CAAC,KAA6B;AAAA,EAC7D,MAAM,SAAmB,CAAC;AAAA,EAC1B,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;AAAA,IAAG,OAAO,KAAK,oCAAoC;AAAA,EAC9E,IAAI,IAAI,YAAY;AAAA,IAAiB,OAAO,KAAK,mBAAmB,kBAAiB;AAAA,EACrF,IAAI,CAAC,IAAI;AAAA,IAAM,OAAO,KAAK,kBAAkB;AAAA,EAC7C,MAAM,QAAQ,OAAO,KAAK,IAAI,UAAU;AAAA,EACxC,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO,KAAK,6CAA6C;AAAA,EACjF,YAAY,MAAM,cAAc,OAAO,QAAQ,IAAI,UAAU,GAAG;AAAA,IAC9D,IAAI,CAAC,KAAK,KAAK,IAAI;AAAA,MAAG,OAAO,KAAK,GAAG,sCAAsC;AAAA,IAC3E,IAAI,QAAQ,aAAY;AAAA,MAAY,OAAO,KAAK,GAAG,gCAAgC;AAAA,IACnF,IAAI,CAAC,UAAU;AAAA,MAAa,OAAO,KAAK,GAAG,+BAA+B;AAAA,IAC1E,YAAY,MAAM,WAAW,OAAO,QAAQ,UAAU,KAAK,GAAG;AAAA,MAC5D,IAAI,CAAC,OAAO;AAAA,QAAa,OAAO,KAAK,GAAG,QAAQ,+BAA+B;AAAA,MAC/E,IAAI,OAAO,SAAS,UAAU,OAAO,QAAQ,EAAE,OAAO,QAAQ,aAAY,UAAU,EAAE,OAAO,SAAS,IAAI,SAAS,CAAC;AAAA,QAClH,OAAO,KAAK,GAAG,QAAQ,cAAc,OAAO,qBAAqB;AAAA,MACnE,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,EAAE,OAAO,SAAS,aAAY,SAAS,EAAE,OAAO,UAAU,IAAI,QAAQ,CAAC;AAAA,QACrH,OAAO,KAAK,GAAG,QAAQ,eAAe,OAAO,sBAAsB;AAAA,IACvE;AAAA,IACA,IAAI,UAAU,SAAS,WAAW,CAAC,IAAI,SAAS;AAAA,MAAO,OAAO,KAAK,GAAG,0CAA0C;AAAA,EAClH;AAAA,EACA,WAAW,QAAQ,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC,GAAG;AAAA,IAChD,IAAI,IAAI,WAAW,OAAO,SAAS;AAAA,MAAS,OAAO,KAAK,UAAU,uCAAuC;AAAA,EAC3G;AAAA,EACA,WAAW,QAAQ,OAAO,KAAK,IAAI,SAAS,CAAC,CAAC,GAAG;AAAA,IAC/C,IAAI,QAAQ,aAAY;AAAA,MAAO,OAAO,KAAK,SAAS,2BAA2B;AAAA,EACjF;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,eAAe,CAAC,KAAiC;AAAA,EAC/D,MAAM,SAAS,kBAAkB,GAAG;AAAA,EACpC,IAAI,OAAO,SAAS;AAAA,IAAG,MAAM,IAAI,MAAM,aAAa,IAAI;AAAA,EAAQ,OAAO,KAAK;AAAA,CAAI,GAAG;AAAA,EACnF,OAAO;AAAA;;ACsBF,IAAM,OAAO,CAAC,UAA+B,EAAE,KAAK;AAEpD,IAAM,OAAO,CAAC,MAAc,UAAkD,EAAE,MAAM,SAAU,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG;AAEtH,IAAM,QAAQ,CAAC,MAAc,aAA+C,EAAE,OAAO,EAAE,SAAU,UAAU,EAAE,QAAQ,IAAI,CAAC,EAAG,EAAE;AAE/H,IAAM,MAAM,CAAC,MAAc,UAA4C,EAAE,cAAc,KAAK,MAAM,IAAI,EAAE;AAUxG,IAAM,KAA2C,OAAO,YAC7D,iBAAgB,IAAI,CAAC,SAAS,CAAC,MAAO,CAAC,OAAoC,UAA6C,WAAgC,EAAE,WAAW,MAAM,UAAW,WAAW,EAAE,SAAS,IAAI,CAAC,MAAO,MAAM,EAA2B,CAAC,CAC5P;AAGO,SAAS,EAA2B,CAAC,WAAc,OAA0B,UAA6C,OAAkC;AAAA,EACjK,OAAO,EAAE,WAAW,UAAW,WAAW,EAAE,SAAS,IAAI,CAAC,MAAO,MAAM;AAAA;AAKlE,SAAS,cAAc,CAAC,MAAmB,SAAS,QAAyB;AAAA,EAClF,MAAM,MAAuB,CAAC;AAAA,EAC9B,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,WAAW,IAAI;AAAA,EACrB,MAAM,SAAS,CAAC,GAAgB,WAA4B;AAAA,IAC1D,IAAI,EAAE,IAAI;AAAA,MACR,IAAI,MAAM,IAAI,EAAE,EAAE;AAAA,QAAG,MAAM,IAAI,MAAM,gCAAgC,EAAE,KAAK;AAAA,MAC5E,MAAM,IAAI,EAAE,EAAE;AAAA,MACd,OAAO,EAAE;AAAA,IACX;AAAA,IACA,IAAI,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG;AAAA,MAChC,MAAM,IAAI,MAAM;AAAA,MAChB,OAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,EAAE,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,UAAU,MAAM,CAAC;AAAA,IACtE,IAAI;AAAA,IACJ,GAAG;AAAA,MACD,MAAM,QAAQ,SAAS,IAAI,IAAI,KAAK,KAAK;AAAA,MACzC,SAAS,IAAI,MAAM,IAAI;AAAA,MACvB,KAAK,GAAG,QAAQ;AAAA,IAClB,SAAS,MAAM,IAAI,EAAE;AAAA,IACrB,MAAM,IAAI,EAAE;AAAA,IACZ,OAAO;AAAA;AAAA,EAET,MAAM,OAAO,CAAC,GAAgB,WAA4B;AAAA,IACxD,MAAM,KAAK,OAAO,GAAG,MAAM;AAAA,IAC3B,MAAM,OAAsB,EAAE,IAAI,WAAW,EAAE,cAAe,EAAE,MAAkC;AAAA,IAClG,IAAI,EAAE;AAAA,MAAO,KAAK,QAAQ,EAAE;AAAA,IAC5B,IAAI,EAAE;AAAA,MAAI,KAAK,KAAK,EAAE;AAAA,IACtB,IAAI,EAAE,YAAY;AAAA,MAAW,KAAK,UAAU,EAAE;AAAA,IAC9C,IAAI,EAAE;AAAA,MAAe,KAAK,gBAAgB,EAAE;AAAA,IAC5C,IAAI,KAAK,IAAI;AAAA,IACb,IAAI,MAAM,QAAQ,EAAE,QAAQ;AAAA,MAAG,KAAK,WAAW,EAAE,SAAS,IAAI,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC;AAAA,IACnF,KAAK,IAAI,EAAE,UAAU;AAAA,MACnB,MAAM,IAAI,KAAK,EAAE,SAAS,UAAU,KAAK;AAAA,MACzC,KAAK,WAAW,EAAE,aAAa,GAAG,MAAM,EAAE,SAAS,SAAU,EAAE,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,IAAI,CAAC,EAAG;AAAA,IAC9G;AAAA,IACA,IAAI,EAAE;AAAA,MAAO,KAAK,QAAQ,OAAO,YAAY,OAAO,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,IACvH,OAAO;AAAA;AAAA,EAET,KAAK,MAAM,IAAI;AAAA,EACf,OAAO;AAAA;AAKF,SAAS,aAAa,CAAC,MAAmB,UAAyB,CAAC,GAAmB;AAAA,EAC5F,MAAM,YAAY,QAAQ,aAAa;AAAA,EACvC,MAAM,YAAY,QAAQ,aAAa;AAAA,EACvC,MAAM,aAAa,eAAe,IAAI;AAAA,EACtC,QAAQ,MAAM,WAAW,eAAc,YAAY,EAAE,WAAW,YAAY,QAAQ,WAAW,CAAC;AAAA,EAChG,MAAM,WAAsC;AAAA,IAC1C,EAAE,SAAS,QAAQ,eAAe,EAAE,WAAW,UAAU,EAAE;AAAA,IAC3D,EAAE,SAAS,QAAQ,kBAAkB,EAAE,WAAW,WAAW,EAAE;AAAA,IAC/D,GAAG,OAAO,QAAQ,QAAQ,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,YAAY,EAAE,SAAS,QAAQ,iBAAiB,EAAE,WAAW,MAAM,MAAM,EAAE,EAAE;AAAA,EACjI;AAAA,EACA,OAAO,EAAE,WAAW,WAAW,YAAY,QAAQ,MAAM,UAAU,OAAO,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK;AAAA,CAAI,EAAE;AAAA;;AC3I9H,IAAM,WAAW,IAAI,IAAI,CAAC,YAAY,cAAc,WAAW,cAAc,aAAa,CAAC;AAC3F,IAAM,aAAuC;AAAA,EAC3C,mBAAmB,CAAC,gBAAgB,eAAe;AAAA,EACnD,iBAAiB,CAAC,eAAe,gBAAgB;AAAA,EACjD,oBAAoB,CAAC,sBAAsB;AAAA,EAC3C,kBAAkB,CAAC,oBAAoB;AAAA,EACvC,kBAAkB,CAAC,eAAe,cAAc;AAAA,EAChD,gBAAgB,CAAC,cAAc,eAAe;AAAA,EAC9C,mBAAmB,CAAC,qBAAqB;AAAA,EACzC,iBAAiB,CAAC,mBAAmB;AAAA,EACrC,kBAAkB,CAAC,oBAAoB;AAAA,EACvC,gBAAgB,CAAC,kBAAkB;AAAA,EACnC,iBAAiB,CAAC,mBAAmB;AAAA,EACrC,eAAe,CAAC,iBAAiB;AAAA,EACjC,oBAAoB,CAAC,kBAAkB;AAAA,EACvC,cAAc,CAAC,iBAAiB;AAClC;AAEA,IAAM,SAAS,IAAI,IAAI,CAAC,oBAAoB,UAAU,mBAAmB,CAAC;AAE1E,IAAM,QAAQ,CAAC,QAAgB,IAAI,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,GAAG;AAO1E,SAAS,WAAW,CAAC,UAAiC;AAAA,EAC3D,OAAO,mBAAmB,SAAS,aAAa,SAAS,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,SAAS,KAAK,MAAM,EAAE,SAAS,GAAK,IAAI,MAAM,EAAE,KAAK,IAAI;AAAA;AAKnI,SAAS,SAAS,CAAC,MAAsB;AAAA,EAC9C,OAAO,IAAI,KAAK,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAAA;AAKrD,SAAS,SAAS,CAAC,QAAgB,OAAyC;AAAA,EACjF,MAAM,WAAW,MAAM,SAAS;AAAA,EAChC,OAAO,WAAW,GAAG,UAAU,MAAM,MAAM,aAAa,UAAU,MAAM;AAAA;AAG1E,SAAS,QAAQ,CAAC,KAAa,OAAgB,OAAiC,OAA+C;AAAA,EAC7H,IAAI,QAAQ;AAAA,IAAa,OAAO,MAAM,QAAQ,KAAK,IAAI,WAAU,KAAiB,IAAI,OAAO,KAAK;AAAA,EAClG,IAAI,QAAQ;AAAA,IAAc,OAAO,UAAU,OAAO,KAAK,GAAG,KAAK;AAAA,EAC/D,IAAI,QAAQ,uBAAuB,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO,MAAM,IAAI,CAAC,QAAQ,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,EACvG,IAAI,QAAQ;AAAA,IAAsB,OAAO,OAAO,UAAU,YAAY,UAAU,OAAO,YAAY,KAAsB,IAAI;AAAA,EAC7H,IAAI,QAAQ;AAAA,IAAgB,OAAO,OAAO,UAAU,WAAW,QAAQ,aAAa;AAAA,EACpF,IAAI,QAAQ,cAAc;AAAA,IACxB,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO;AAAA,IACtC,MAAM,SAAS,MAAM;AAAA,IACrB,OAAO,OAAO,UAAU,MAAM,QAAQ,MAAM,IAAI,IAAI,WAAU,MAAgB,MAAM;AAAA,EACtF;AAAA,EACA,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,SAAS,IAAI,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG;AAAA,EAC7E,IAAI,OAAO,UAAU;AAAA,IAAW,OAAO;AAAA,EACvC,OAAO,OAAO,KAAK;AAAA;AAad,SAAS,UAAU,CAAC,OAAgD,QAAkC,CAAC,GAAG,OAA+C;AAAA,EAC9J,MAAM,MAA8B,CAAC;AAAA,EACrC,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,IAChD,IAAI,UAAU,aAAa,OAAO,IAAI,GAAG;AAAA,MAAG;AAAA,IAC5C,IAAI,QAAQ,aAAa;AAAA,MACvB,MAAM,SAAS,SAAS,OAAO,UAAU,WAAW,gBAAgB,OAAO,KAAK,IAAI;AAAA,MACpF,IAAI,CAAC;AAAA,QAAQ;AAAA,MAGb,MAAM,WAAY,MAAkC;AAAA,MACpD,MAAM,aAAa,OAAO,aAAa,WAAW,YAAY,WAAW,QAAkB,UAAU,KAAK,OAAO;AAAA,MACjH,IAAI,YAAY,aAAa,OAAiB,KAAK,QAAQ,WAAW,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,IACA,IAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG;AAAA,MAAG;AAAA,IAChD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,KAAK,QAAQ;AAAA,MAAsB;AAAA,IAC1G,MAAM,MAAM,SAAS,KAAK,OAAO,OAAO,KAAK;AAAA,IAC7C,IAAI,QAAQ;AAAA,MAAM;AAAA,IAClB,MAAM,UAAU,WAAW,QAAQ,CAAC,MAAM,GAAG,CAAC;AAAA,IAC9C,WAAW,UAAU;AAAA,MAAS,IAAI,UAAU;AAAA,EAC9C;AAAA,EAEA,IAAI,IAAI,aAAa,gBAAgB,OAAO,MAAM,SAAS,CAAC;AAAA,IAAG,IAAI,UAAU,IAAI,UAAU,QAAQ,IAAI,uCAAuC;AAAA,EAC9I,IAAI,IAAI;AAAA,IAAoB,IAAI,6BAA6B,IAAI;AAAA,EACjE,MAAM,YAAY,CAAC,gBAAgB,oBAAoB,sBAAsB,uBAAuB,mBAAmB,EAAE,KAAK,CAAC,MAAM,IAAI,MAAM,IAAI,OAAO,KAAK;AAAA,EAC/J,IAAI,aAAa,CAAC,IAAI;AAAA,IAAiB,IAAI,kBAAkB;AAAA,EAC7D,IAAI,aAAa,CAAC,IAAI;AAAA,IAAiB,IAAI,kBAAkB;AAAA,EAC7D,OAAO;AAAA;AAIF,SAAS,cAAc,CAAC,OAAgD,QAAkC,CAAC,GAAW;AAAA,EAC3H,OAAO,OAAO,QAAQ,WAAW,OAAO,KAAK,CAAC,EAC3C,IAAI,EAAE,GAAG,OAAO,GAAG,KAAK,GAAG,EAC3B,KAAK,GAAG;AAAA;;ACxGN,IAAM,oBAA4C;AAAA,EACvD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,wBAAwB;AAAA,EACxB,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,0BAA0B;AAAA,EAC1B,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,MAAM;AAAA,EACN,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb;AAUA,IAAM,QAAQ;AACd,IAAM,OAAO;AAEb,SAAS,YAAY,CAAC,UAAmC;AAAA,EACvD,MAAM,IAAI,SAAS,KAAK;AAAA,EACxB,IAAI,+DAA+D,KAAK,CAAC;AAAA,IAAG,OAAO;AAAA,EACnF,IAAI,6DAA6D,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC;AAAA,IAAG,OAAO;AAAA,EACxG,OAAO;AAAA;AAGT,SAAS,EAAE,CAAC,OAA8B;AAAA,EACxC,MAAM,IAAI,MAAM,KAAK;AAAA,EACrB,IAAI,EAAE,SAAS,KAAK;AAAA,IAAG,OAAO,KAAK,MAAM,WAAW,CAAC,IAAI,KAAK,GAAG,IAAI;AAAA,EACrE,IAAI,EAAE,SAAS,IAAI;AAAA,IAAG,OAAO,WAAW,CAAC;AAAA,EACzC,IAAI,EAAE,SAAS,IAAI;AAAA,IAAG,OAAO,KAAK,MAAM,WAAW,CAAC,IAAI,KAAK,GAAG,IAAI;AAAA,EACpE,MAAM,IAAI,WAAW,CAAC;AAAA,EACtB,OAAO,OAAO,SAAS,CAAC,KAAK,aAAa,KAAK,CAAC,IAAI,IAAI;AAAA;AAInD,SAAS,WAAW,CAAC,OAAgC;AAAA,EAC1D,MAAM,IAAI,MAAM,KAAK;AAAA,EACrB,IAAI,MAAM;AAAA,IAAQ,OAAO,CAAC;AAAA,EAC1B,MAAM,SAAmB,CAAC;AAAA,EAE1B,IAAI,QAAQ;AAAA,EACZ,IAAI,QAAQ;AAAA,EACZ,MAAM,QAAkB,CAAC;AAAA,EACzB,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,IACjC,IAAI,EAAE,OAAO;AAAA,MAAK;AAAA,IAClB,KAAK,IAAI,EAAE,OAAO;AAAA,MAAK;AAAA,IACvB,KAAK,IAAI,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,MACpC,MAAM,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC;AAAA,MAC5B,QAAQ,IAAI;AAAA,IACd;AAAA,EACF;AAAA,EACA,MAAM,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,EACzB,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,IAAI,qGAAqG,KAAK,IAAI;AAAA,IACxH,IAAI,CAAC;AAAA,MAAG,OAAO;AAAA,IACf,MAAM,QAAQ,YAAW,EAAE,EAAE;AAAA,IAC7B,IAAI,CAAC;AAAA,MAAO,OAAO;AAAA,IACnB,OAAO,KAAK,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,GAAG,WAAW,EAAE,EAAE,GAAG,MAAM,WAAW,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,WAAW,EAAE,EAAE,IAAI,GAAG,MAAM,CAAC;AAAA,EAC9H;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,OAAsD;AAAA,EACzE,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,CAAC,EAAE,OAAO,OAAO;AAAA,EAC9F,OAAO,EAAE,QAAQ,MAAM,MAAM,MAAM,KAAK,GAAG,UAAU,MAAM,SAAS,IAAI,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI,IAAI,UAAU;AAAA;AAMzG,SAAS,eAAe,CAAC,KAA0B;AAAA,EACxD,MAAM,MAAmB,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAC1E,MAAM,WAAW,IAAI;AAAA,EACrB,MAAM,OAAO,IAAI,QAAQ,qBAAqB,EAAE;AAAA,EAChD,MAAM,YAAY,CAAC,MAAc,UAAkB;AAAA,IACjD,QAAQ,QAAQ,aAAa,YAAY,KAAK;AAAA,MAC3C,IAAI,OAAO,SAAS,CAAC,GAAG,WAAW,CAAC,GAAG,QAAQ;AAAA,IAClD,IAAI,MAAM,UAAU,KAAM,WAAW,EAAE,SAAS,IAAI,CAAC,GAAI,QAAQ,OAAO;AAAA;AAAA,EAE1E,WAAW,SAAS,KAAK,SAAS,KAAK,GAAG;AAAA,IACxC,MAAM,OAAO,aAAa,MAAM,EAAE;AAAA,IAClC,WAAW,QAAQ,MAAM,GAAG,SAAS,IAAI,GAAG;AAAA,MAC1C,MAAM,OAAO,KAAK;AAAA,MAClB,MAAM,QAAQ,KAAK,GAAG,KAAK;AAAA,MAC3B,MAAM,YAAY,kBAAkB;AAAA,MACpC,IAAI,WAAW;AAAA,QACb,MAAM,MAAM,YAAW,KAAK;AAAA,QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM;AAAA,UACjB,SAAS,IAAI,KAAK,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,SACE,IAAI,MAAM,UAAU,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,aAAa;AAAA,QACxD;AAAA,MACF;AAAA,MACA,IAAI,SAAS,UAAU;AAAA,QACrB,MAAM,OAAO,GAAG,KAAK;AAAA,QACrB,IAAI,SAAS,MAAM;AAAA,UACjB,SAAS,IAAI,KAAK,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,QAEA,IAAI,OAAO,SAAS;AAAA,UAClB,MAAM;AAAA,UACN,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;AAAA,UACxB,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;AAAA,UACxB,IAAI;AAAA,UACJ,IAAI,OAAO;AAAA,UACX,KAAK,OAAO;AAAA,UACZ,KAAK,OAAO;AAAA,UACZ,MAAM;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI,SAAS,eAAe,SAAS,aAAa;AAAA,QAChD,IAAI,MAAM,SAAS,MAAM;AAAA,UAAG,SAAS,IAAI,KAAK,MAAM;AAAA,QACpD;AAAA,UAAK,UAAU,KAAK,MAAM,CAAC,GAAG,KAAK;AAAA,QACnC;AAAA,MACF;AAAA,MACA,MAAM,SAAS,sBAAsB,KAAK,IAAI;AAAA,MAC9C,IAAI,UAAU,MAAM;AAAA,QAClB,MAAM,SAAS,YAAY,KAAK;AAAA,QAChC,IAAI,CAAC,QAAQ;AAAA,UACX,SAAS,IAAI,KAAK,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,QACA,MAAM,IAAK,IAAI,MAAM,UAAU,EAAE,OAAO,CAAC,EAAE;AAAA,SACzC,EAAE,WAAW,CAAC,GAAG,OAAO,MAAM;AAAA,QAChC;AAAA,MACF;AAAA,MACA,SAAS,IAAI,KAAK,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,IAAI,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK;AAAA,EAClC,OAAO;AAAA;AAMF,SAAS,eAAe,CAAC,KAAkB,MAAmE;AAAA,EACnH,MAAM,QAAqB,EAAE,SAAS,kBAAiB,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,EACpF,IAAI,KAAK;AAAA,IAAS,MAAM,UAAU,KAAK;AAAA,EACvC,MAAM,QAA8B,CAAC;AAAA,EACrC,WAAW,QAAQ,QAAO;AAAA,IACxB,MAAM,IAAI,IAAI,MAAM;AAAA,IACpB,IAAI,CAAC;AAAA,MAAG;AAAA,IACR,MAAM,QAAQ,EAAE,OAAO,EAAE,UAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAG;AAAA,IAC1E,IAAI,EAAE,UAAU,CAAC,EAAE,OAAO;AAAA,MAAM,MAAM,MAAO,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO;AAAA,EAChF;AAAA,EACA,IAAI,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,IAAG,MAAM,QAAQ;AAAA,EACjD,MAAM,SAA6C,CAAC;AAAA,EACpD,IAAI,IAAI,OAAO;AAAA,IAAQ,OAAO,SAAS,IAAI,OAAO;AAAA,EAClD,IAAI,IAAI,OAAO,MAAM;AAAA,IAAQ,OAAO,OAAO,EAAE,QAAQ,IAAI,OAAO,KAAK,OAAO;AAAA,EAC5E,IAAI,OAAO,KAAK,MAAM,EAAE,SAAS;AAAA,IAAG,MAAM,SAAS;AAAA,EACnD,IAAI,OAAO,KAAK,IAAI,KAAK,EAAE,SAAS;AAAA,IAAG,MAAM,QAAQ,IAAI;AAAA,EACzD,OAAO;AAAA;AAGT,IAAM,OAAO,CAAC,GAAY,MAAe,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAKxE,SAAS,SAAS,CAAC,MAAmC,MAAqB,MAAoD;AAAA,EACpI,MAAM,WAAW,WAAW,OAAO,OAAO,WAAU,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,EAC5E,MAAM,MAAmB,EAAE,SAAS,kBAAiB,IAAI,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,QAAQ,SAAS,MAAM,SAAS,KAAK,GAAG;AAAA,EACtI,MAAM,QAA8B,CAAC;AAAA,EACrC,WAAW,QAAQ,QAAO;AAAA,IACxB,MAAM,QAAsC,CAAC;AAAA,IAC7C,MAAM,SAAmC,CAAC;AAAA,IAC1C,YAAY,GAAG,MAAM,OAAO,QAAQ,SAAS,MAAM,MAAM,KAAK;AAAA,MAAG,IAAI,KAAK,MAAM,MAAM,MAAM,OAAO;AAAA,QAAG,MAAM,KAAK;AAAA,IACjH,YAAY,GAAG,MAAM,OAAO,QAAQ,SAAS,MAAM,MAAM,MAAM;AAAA,MAAG,IAAI,CAAC,KAAK,KAAK,MAAM,MAAM,OAAO,IAAI,CAAC;AAAA,QAAG,OAAO,KAAK;AAAA,IACxH,MAAM,IAAiF,CAAC;AAAA,IACxF,IAAI,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,MAAG,EAAE,QAAQ;AAAA,IAC7C,IAAI,OAAO,KAAK,MAAM,EAAE,SAAS;AAAA,MAAG,EAAE,SAAS;AAAA,IAC/C,IAAI,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA,MAAG,MAAM,QAAQ;AAAA,EAC/C;AAAA,EACA,IAAI,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,IAAG,IAAI,QAAQ;AAAA,EAE/C,MAAM,WAAoC,CAAC;AAAA,EAC3C,WAAW,QAAQ,QAAO;AAAA,IACxB,MAAM,OAAO,SAAS,WAAW,SAAS,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IAClE,MAAM,SAAS,KAAK,WAAW,SAAS,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IAChE,MAAM,QAAsC,CAAC;AAAA,IAC7C,MAAM,SAAmC,CAAC;AAAA,IAC1C,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAK,KAAK;AAAA,MAAG,IAAI,OAAO,MAAM,OAAO;AAAA,QAAG,MAAM,KAAK;AAAA,IACvF,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAK,MAAM;AAAA,MAAG,IAAI,CAAC,KAAK,OAAO,OAAO,IAAI,CAAC;AAAA,QAAG,OAAO,KAAK;AAAA,IAC9F,MAAM,IAAiF,CAAC;AAAA,IACxF,IAAI,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,MAAG,EAAE,QAAQ;AAAA,IAC7C,IAAI,OAAO,KAAK,MAAM,EAAE,SAAS;AAAA,MAAG,EAAE,SAAS;AAAA,IAC/C,IAAI,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA,MAAG,SAAS,QAAQ;AAAA,EAClD;AAAA,EACA,IAAI,OAAO,KAAK,QAAQ,EAAE,SAAS;AAAA,IAAG,IAAI,WAAW;AAAA,EACrD,MAAM,SAAkC,CAAC;AAAA,EACzC,WAAW,SAAS,OAAO,KAAK,aAAY,GAAG;AAAA,IAC7C,IAAI,UAAU,WAAW,UAAU;AAAA,MAAU;AAAA,IAC7C,OAAO,KAAK,OAAO,MAAM,MAAM,GAAG;AAAA,IAClC,MAAM,OAAO,MAAO,SAAS,OAAO,KAAiD,OAAQ,SAAS,OAA8D;AAAA,IACpK,MAAM,SAAS,MAAO,KAAK,OAAO,KAAiD,OAAQ,KAAK,OAA8D;AAAA,IAC9J,MAAM,OAAgC,CAAC;AAAA,IACvC,YAAY,GAAG,MAAM,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAAG,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC;AAAA,QAAG,KAAK,KAAK;AAAA,IACtF,IAAI,OAAO,KAAK,IAAI,EAAE,WAAW;AAAA,MAAG;AAAA,IACpC,IAAI;AAAA,OAAO,OAAO,SAAS,CAAC,GAA+B,OAAO;AAAA,IAClE;AAAA,MAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EACA,IAAI,OAAO,KAAK,MAAM,EAAE,SAAS;AAAA,IAAG,IAAI,SAAS;AAAA,EACjD,MAAM,QAA8B,CAAC;AAAA,EACrC,YAAY,GAAG,MAAM,OAAO,QAAQ,SAAS,KAAK;AAAA,IAAG,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,MAAG,MAAM,KAAK;AAAA,EAC7F,IAAI,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,IAAG,IAAI,QAAQ;AAAA,EAC/C,IAAI,WAAW,MAAM;AAAA,IAEnB,MAAM,UAA+C,CAAC;AAAA,IACtD,YAAY,WAAW,WAAW,OAAO,QAAQ,SAAS,OAAO,GAAG;AAAA,MAClE,YAAY,MAAM,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,QAClD,MAAM,YAAY,KAAK,QAAQ,aAAa,SAAS,CAAC;AAAA,QACtD,MAAM,OAAO,MAAM,MAAM,UAAU,MAAM;AAAA,QACzC,IAAI,KAAK,SAAS;AAAA,WAAK,QAAQ,eAAe,CAAC,GAAG,QAAQ;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,IAAI,OAAO,KAAK,OAAO,EAAE,SAAS;AAAA,MAAG,IAAI,UAAU;AAAA,EACrD,EAAE,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,KAAK,OAAO,EAAE,SAAS;AAAA,IAAG,IAAI,UAAU,KAAK;AAAA,EACpF,OAAO;AAAA;AAIF,SAAS,eAAe,CAAC,OAA4B;AAAA,EAC1D,QAAQ,SAAS,aAAa,SAAS;AAAA,EACvC,OAAO,GAAG,KAAK,UAAU,EAAE,SAAS,sDAAsD,KAAK,GAAG,MAAM,CAAC;AAAA;AAAA;AAIpG,SAAS,cAAc,CAAC,MAAc,QAAqI;AAAA,EAChL,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,KAAK,MAAM,IAAI;AAAA,IACxB,OAAO,OAAO;AAAA,IACd,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,QAAQ,CAAC,EAAE,MAAM,SAAS,SAAS,aAAc,MAAgB,UAAU,CAAC,EAAE;AAAA;AAAA,EAEpH,IAAI;AAAA,IACF,OAAO,EAAE,OAAO,WAAU,QAAQ,EAAE,OAAO,CAAC,GAAG,QAA+B,QAAQ,CAAC,EAAE;AAAA,IACzF,OAAO,OAAO;AAAA,IACd,MAAM,SAAU,MAAoC,UAAU,CAAC,EAAE,MAAM,SAAS,SAAU,MAAgB,QAAQ,CAAC;AAAA,IACnH,OAAO,EAAE,OAAO,MAAM,QAA+B,OAAO;AAAA;AAAA;;AC5QzD,IAAM,gBAAwC;AAAA,EACnD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EAEN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,iBAAiB;AACnB;AAEO,IAAM,gBAAgB,CAAC,SAAS,UAAU,YAAY,aAAa,qBAAqB,mBAAmB,WAAW,OAAO,eAAe,cAAc;AAM1J,SAAS,eAAe,CAAC,OAAsB,WAAmB,QAAiC,CAAC,GAAG,SAA4B,CAAC,GAAoB;AAAA,EAC7J,MAAM,OAAO,cAAc,cAAc;AAAA,EACzC,MAAM,QAAuB,eAAc,OAAO,EAAE,WAAW,MAAM,OAAO,OAAO,GAAG,OAAmB;AAAA,EACzG,MAAM,MAAuB,CAAC;AAAA,EAC9B,WAAW,OAAO,eAAe;AAAA,IAC/B,MAAM,IAAI,MAAM;AAAA,IAChB,IAAI,OAAO,MAAM;AAAA,MAAU,IAAI,OAAO;AAAA,EACxC;AAAA,EACA,OAAO;AAAA;AA4BF,SAAS,aAAa,CAAC,UAA2B,UAAuB,YAAY,KAAsB;AAAA,EAChH,MAAM,SAA0B,CAAC;AAAA,EACjC,MAAM,QAAQ,CAAC,KAAkB,WAA+B;AAAA,IAC9D,MAAM,OAAO,SAAS;AAAA,IACtB,IAAI,SAAS;AAAA,MAAW;AAAA,IACxB,IAAI,WAAW,aAAa,KAAK,IAAI,SAAS,IAAI,IAAI;AAAA,MAAW,OAAO,KAAK,EAAE,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA;AAAA,EAE9G,MAAM,SAAS,SAAS,KAAK;AAAA,EAG7B,IAAI,SAAS,cAAc;AAAA,IAAW,MAAM,UAAU,SAAS,MAAM;AAAA,EACrE,MAAM,qBAAqB,SAAS,iBAAiB;AAAA,EACrD,MAAM,mBAAmB,SAAS,eAAe;AAAA,EACjD,MAAM,eAAe,SAAS,WAAW;AAAA,EACzC,MAAM,gBAAgB,SAAS,YAAY;AAAA,EAC3C,IAAI,SAAS,cAAc,cAAc,SAAS,WAAW,aAAa,SAAS,SAAS,YAAY,SAAS;AAAA,IAC/G,OAAO,KAAK,EAAE,KAAK,aAAa,UAAU,SAAS,WAAW,QAAQ,SAAS,OAAO,CAAC;AAAA,EACzF,OAAO;AAAA;AAIF,SAAS,qBAAqB,CACnC,UACA,OACA,OAC6C;AAAA,EAC7C,OAAO,MACJ,IAAI,CAAC,OAAO;AAAA,IACX,MAAM,OAAO,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG,KAAK;AAAA,IAChF,QAAQ,cAAc,gBAAgB,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,QAAQ,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;AAAA,EACjI,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC;AAAA;;AClG/B,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAwB/B,IAAM,WAA6C,EAAE,KAAK,UAAU,QAAQ,OAAO,MAAM,SAAS,OAAO,OAAO;AAEhH,SAAS,IAAI,CAAC,MAAmB,QAAc,UAAgB,SAAyB;AAAA,EACtF,QAAQ;AAAA,IACN,KAAK;AAAA,MACH,OAAO,OAAO,IAAI;AAAA,IACpB,KAAK;AAAA,MACH,OAAO,SAAS,UAAU,OAAO,IAAI,OAAO,UAAU;AAAA,IACxD,KAAK;AAAA,MACH,OAAO,OAAO,IAAI;AAAA,IACpB,KAAK;AAAA,MACH,OAAO,SAAS,SAAS,OAAO,IAAI,OAAO,SAAS;AAAA;AAAA;AAInD,SAAS,YAAY,CAC1B,QACA,MACA,UACA,UAA2F,CAAC,GAC1E;AAAA,EAClB,MAAM,YAAY,QAAQ,QAAQ;AAAA,EAClC,MAAM,QAAQ,QAAQ,SAAS;AAAA,EAC/B,MAAM,SAAS,QAAQ,UAAU;AAAA,EACjC,MAAM,UAAU,QAAQ,WAAW;AAAA,EACnC,MAAM,WAAW,cAAc,SAAS,cAAc;AAAA,EACtD,MAAM,UAAU,WAAW,KAAK,SAAS,KAAK,SAAS;AAAA,EACvD,IAAI,OAAO;AAAA,EACX,IAAI,UAAU;AAAA,EACd,IAAI,KAAK,WAAW,QAAQ,UAAU,OAAO,IAAI,UAAU,KAAK,SAAS,YAAY,QAAQ,UAAU,OAAO,IAAI,KAAK,WAAW,QAAQ,UAAU,OAAO,GAAG;AAAA,IAC5J,OAAO,SAAS;AAAA,IAChB,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM,SAAS,MAAe,UAAU,UAAU,OAAO,IAAI,UAAU,QAAQ,OAAO,IAAI,OAAO,QAAQ,KAAK,QAAQ,OAAO,IAAI,OAAO,QAAQ,IAAI,KAAK,QAAQ;AAAA,EACjK,MAAM,SAAS,MAAe,UAAU,UAAU,OAAO,IAAI,UAAU,QAAQ,OAAO,IAAI,OAAO,SAAS,KAAK,SAAS,OAAO,IAAI,OAAO,SAAS,IAAI,KAAK,SAAS;AAAA,EACrK,QAAQ;AAAA,IACN,KAAK;AAAA,MACH,IAAI,OAAO;AAAA,MACX,IAAI,OAAO,IAAI,SAAS,KAAK;AAAA,MAC7B;AAAA,IACF,KAAK;AAAA,MACH,IAAI,OAAO;AAAA,MACX,IAAI,OAAO,IAAI,OAAO,SAAS;AAAA,MAC/B;AAAA,IACF,KAAK;AAAA,MACH,IAAI,OAAO,IAAI,SAAS,KAAK;AAAA,MAC7B,IAAI,OAAO;AAAA,MACX;AAAA,IACF,KAAK;AAAA,MACH,IAAI,OAAO,IAAI,OAAO,QAAQ;AAAA,MAC9B,IAAI,OAAO;AAAA,MACX;AAAA;AAAA,EAGJ,IAAI,cAAc,SAAS,SAAS,SAAS,WAAW;AAAA,IACtD,IAAI,SAAS,SAAS,SAAS;AAAA,MAAU,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,GAAG,KAAK,IAAI,SAAS,SAAS,QAAQ,UAAU,KAAK,KAAK,CAAC;AAAA,IACpI;AAAA,MAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,GAAG,KAAK,IAAI,SAAS,SAAS,SAAS,UAAU,KAAK,MAAM,CAAC;AAAA,EACpG,EAAE,KAAK,IAAI,SAAS,SAAS,SAAS;AAAA,IAAU,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,GAAG,KAAK,IAAI,SAAS,SAAS,QAAQ,UAAU,KAAK,KAAK,CAAC;AAAA,EAC3I;AAAA,IAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,GAAG,KAAK,IAAI,SAAS,SAAS,SAAS,UAAU,KAAK,MAAM,CAAC;AAAA,EAClG,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,MAAM,QAAQ;AAAA;AAGnD,IAAM,QAAQ,CAAC,MAAc,KAAK,MAAM,IAAI,IAAI,IAAI;;AC1DpD,IAAM,SAAS,CAAC,UAAsB,KAAK,OAAO,aAAa,GAAG,KAAK,CAAC,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AAG5H,eAAe,QAAQ,GAAqD;AAAA,EACjF,MAAM,WAAW,OAAO,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC;AAAA,EAClE,MAAM,SAAS,IAAI,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI,YAAY,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,EACvG,OAAO,EAAE,UAAU,WAAW,OAAO,MAAM,EAAE;AAAA;AAAA;AAGxC,MAAM,qBAAqB;AAAA,EAMZ;AAAA,EALZ;AAAA,EACA;AAAA,EACR;AAAA,EACQ,QAAQ;AAAA,EAEhB,WAAW,CAAS,SAA2B;AAAA,IAA3B;AAAA,IAClB,KAAK,WAAW,QAAQ;AAAA,IACxB,KAAK,SAAS,QAAQ;AAAA;AAAA,MAGZ,KAAK,GAAiB;AAAA,IAChC,OAAO,KAAK,QAAQ,SAAS;AAAA;AAAA,EAGvB,GAAG,CAAC,MAAsB;AAAA,IAChC,OAAO,IAAI,IAAI,MAAM,KAAK,QAAQ,OAAO,EAAE;AAAA;AAAA,QAGvC,QAAQ,GAAgC;AAAA,IAC5C,IAAI,KAAK;AAAA,MAAU,OAAO,KAAK;AAAA,IAC/B,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,IAAI,yCAAyC,CAAC;AAAA,IAChF,IAAI,CAAC,IAAI;AAAA,MAAI,MAAM,IAAI,MAAM,0BAA0B,IAAI,QAAQ;AAAA,IACnE,KAAK,WAAY,MAAM,IAAI,KAAK;AAAA,IAChC,OAAO,KAAK;AAAA;AAAA,QAIR,QAAQ,GAAoB;AAAA,IAChC,IAAI,KAAK;AAAA,MAAU,OAAO,KAAK;AAAA,IAC/B,MAAM,OAAO,MAAM,KAAK,SAAS;AAAA,IACjC,IAAI,CAAC,KAAK;AAAA,MAAuB,MAAM,IAAI,MAAM,mEAAmE;AAAA,IACpH,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,uBAAuB;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,aAAa,KAAK,QAAQ,cAAc,uBAAuB,eAAe,CAAC,KAAK,QAAQ,WAAW,GAAG,aAAa,CAAC,sBAAsB,eAAe,GAAG,gBAAgB,CAAC,MAAM,GAAG,4BAA4B,OAAO,CAAC;AAAA,IACvP,CAAC;AAAA,IACD,IAAI,CAAC,IAAI;AAAA,MAAI,MAAM,IAAI,MAAM,6BAA6B,IAAI,QAAQ;AAAA,IACtE,KAAK,YAAa,MAAM,IAAI,KAAK,GAA6B;AAAA,IAC9D,OAAO,KAAK;AAAA;AAAA,QAQR,YAAY,GAAgF;AAAA,IAChG,MAAM,OAAO,MAAM,KAAK,SAAS;AAAA,IACjC,MAAM,WAAW,MAAM,KAAK,SAAS;AAAA,IACrC,QAAQ,UAAU,cAAc,MAAM,SAAS;AAAA,IAC/C,MAAM,QAAQ,OAAO,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC;AAAA,IAC/D,MAAM,MAAM,IAAI,IAAI,KAAK,sBAAsB;AAAA,IAC/C,IAAI,SAAS,IAAI,gBAAgB,EAAE,eAAe,QAAQ,WAAW,UAAU,cAAc,KAAK,QAAQ,aAAa,gBAAgB,WAAW,uBAAuB,QAAQ,OAAO,OAAO,sCAAsC,CAAC,EAAE,SAAS;AAAA,IACjP,OAAO,EAAE,KAAK,IAAI,MAAM,UAAU,OAAO,SAAS;AAAA;AAAA,QAGtC,KAAK,CAAC,MAAwD;AAAA,IAC1E,MAAM,OAAO,MAAM,KAAK,SAAS;AAAA,IACjC,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,gBAAgB,EAAE,QAAQ,QAAQ,SAAS,EAAE,gBAAgB,oCAAoC,GAAG,MAAM,IAAI,gBAAgB,EAAE,WAAW,KAAK,YAAY,OAAO,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;AAAA,IACzN,IAAI,CAAC,IAAI;AAAA,MAAI,MAAM,IAAI,MAAM,8BAA8B,IAAI,QAAQ;AAAA,IACvE,MAAM,OAAQ,MAAM,IAAI,KAAK;AAAA,IAC7B,KAAK,SAAS,EAAE,aAAa,KAAK,cAAc,cAAc,KAAK,iBAAiB,KAAK,QAAQ,cAAc,WAAW,KAAK,aAAa,KAAK,IAAI,IAAI,KAAK,aAAa,OAAO,UAAU;AAAA,IAC5L,KAAK,QAAQ,WAAW,KAAK,MAAM;AAAA,IACnC,OAAO,KAAK;AAAA;AAAA,QAOR,QAAQ,CAAC,MAAc,UAAkB,UAA6C;AAAA,IAC1F,IAAI;AAAA,MAAU,KAAK,WAAW;AAAA,IAC9B,IAAI,CAAC,KAAK;AAAA,MAAU,MAAM,IAAI,MAAM,8EAA8E;AAAA,IAClH,OAAO,KAAK,MAAM,EAAE,YAAY,sBAAsB,MAAM,eAAe,UAAU,cAAc,KAAK,QAAQ,YAAY,CAAC;AAAA;AAAA,QAGzH,OAAO,GAA6B;AAAA,IACxC,IAAI,CAAC,KAAK,QAAQ;AAAA,MAAc,MAAM,IAAI,MAAM,mCAAmC;AAAA,IACnF,OAAO,KAAK,MAAM,EAAE,YAAY,iBAAiB,eAAe,KAAK,OAAO,aAAa,CAAC;AAAA;AAAA,QAKtF,QAAQ,CAAC,MAAc,OAAgC,CAAC,GAAqB;AAAA,IACjF,IAAI,CAAC,KAAK;AAAA,MAAQ,MAAM,IAAI,MAAM,gCAAgC;AAAA,IAClE,IAAI,KAAK,OAAO,aAAa,KAAK,OAAO,YAAY,KAAK,IAAI,IAAI,SAAU,KAAK,OAAO;AAAA,MAAc,MAAM,KAAK,QAAQ;AAAA,IACzH,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,IAAI,UAAU,GAAG;AAAA,MACjD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,uCAAuC,eAAe,UAAU,KAAK,OAAO,cAAc;AAAA,MACjJ,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,IAAI,EAAE,KAAK,OAAO,QAAQ,cAAc,QAAQ,EAAE,MAAM,WAAW,KAAK,EAAE,CAAC;AAAA,IACpH,CAAC;AAAA,IACD,IAAI,CAAC,IAAI;AAAA,MAAI,MAAM,IAAI,MAAM,YAAY,IAAI,QAAQ;AAAA,IACrD,MAAM,OAAO,MAAM,IAAI,KAAK;AAAA,IAC5B,MAAM,OAAO,KAAK,UAAU,EAAE,WAAW,GAAG,IAAI,OAAQ,KAAK,MAAM;AAAA,CAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK;AAAA,IACzH,MAAM,QAAQ,KAAK,MAAM,IAAI;AAAA,IAC7B,IAAI,MAAM;AAAA,MAAO,MAAM,IAAI,MAAM,MAAM,MAAM,WAAW,WAAW;AAAA,IACnE,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,IAChC,MAAM,OAAO,OAAO,sBAAsB,OAAO,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE;AAAA,IACjI,IAAI,OAAO;AAAA,MAAS,MAAM,IAAI,MAAM,OAAO,SAAS,WAAW,OAAO,YAAY;AAAA,IAClF,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,IAAI;AAAA,MACF,OAAO,KAAK,MAAM,IAAI;AAAA,MACtB,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,EAQX,OAAO,GAAoB;AAAA,IACzB,OAAO,EAAE,KAAK,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,IAAI,EAAE;AAAA;AAAA,EAGpD,MAAM,CAAC,QAAsB,MAA8B;AAAA,IACjE,MAAM,IAAI,OAAO;AAAA,IACjB,MAAM,OAAO,YAA8B;AAAA,MACzC,QAAQ,OAAO;AAAA,QACb,KAAK,UAAU;AAAA,UACb,MAAM,OAAgC,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,EAAE;AAAA,UACrE,IAAI,EAAE;AAAA,YAAO,KAAK,UAAU,EAAE;AAAA,UAC9B,IAAI,EAAE;AAAA,YAAM,KAAK,SAAS,EAAE;AAAA,UAC5B,IAAI,EAAE;AAAA,YAAQ,KAAK,SAAS,EAAE;AAAA,UAC9B,OAAO,KAAK,SAAS,2BAA2B,IAAI;AAAA,QACtD;AAAA,QACA,KAAK;AAAA,UACH,OAAO,KAAK,SAAS,2BAA2B,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC;AAAA,QAClF,KAAK;AAAA,UACH,OAAO,KAAK,SAAS,0BAA0B,CAAC,CAAC;AAAA,QACnD,KAAK;AAAA,UACH,OAAO,KAAK,SAAS,4BAA4B,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC;AAAA,QACnF;AAAA,UACE,OAAO;AAAA;AAAA;AAAA,IAGb,IAAI,OAAO;AAAA,IACX,IAAI;AAAA,IACJ,MAAM,UAAU,OAAO,EAAE,QAAQ,KAAK,QAAQ,eAAe,EAAE;AAAA,IAC/D,MAAM,OAAO,YAAY;AAAA,MACvB,IAAI;AAAA,QACF,MAAM,QAAQ,MAAM,KAAK;AAAA,QACzB,IAAI,CAAC;AAAA,UAAM;AAAA,QACX,MAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAS,OAAuC;AAAA,QACpF,KAAK,OAAO,EAAE,MAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAAA,QAChD,OAAO,GAAG;AAAA,QACV,IAAI;AAAA,UAAM,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,GAAG,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE,CAAC;AAAA;AAAA,MAE1F,IAAI,QAAQ,UAAU;AAAA,QAAG,QAAQ,WAAW,MAAM,UAAU,IAAI;AAAA;AAAA,IAE7D,KAAK;AAAA,IACV,OAAO,MAAM;AAAA,MACX,OAAO;AAAA,MACP,IAAI;AAAA,QAAO,aAAa,KAAK;AAAA;AAAA;AAAA,EAMjC,SAAS,GAAiC;AAAA,IACxC,OAAO,EAAE,mBAAmB,CAAC,SAAS,KAAK,SAAS,OAAO,KAAK,QAAQ,EAAE,GAAI,KAAK,aAAa,CAAC,CAA6B,EAAE;AAAA;AAEpI;;AC9LO,SAAS,aAAa,CAAC,SAAkC;AAAA,EAC9D,QAAQ,SAAS,QAAQ,SAAS;AAAA,EAClC,MAAM,OAAO,IAAI,iBAAgB,IAAI;AAAA,EACrC,MAAM,SAAS,KAAK,eAAe,GAAG;AAAA,EACtC,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,CAAC,WAAW,aAAa,OAAO,KAAK,IAAI,SAAS,EAAE,IAAK,MAAM;AAAA,MACjE,MAAM,UAAyB,EAAE,SAAS,QAAQ,eAAe,EAAE,WAAW,YAAY,WAAW,IAAI,OAAQ,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK,EAAG,EAAE;AAAA,MACvJ,KAAK,QAAQ,OAAO;AAAA;AAAA,EAExB;AAAA;",
25
+ "debugId": "B7BF51E65B713F9764756E2164756E21",
26
+ "names": []
27
+ }
@@ -0,0 +1,21 @@
1
+ export interface ComponentA11y {
2
+ /** The role of the component's main accessible object: one of `A11Y_ROLES`. */
3
+ role: string;
4
+ /** Prose: composite parts, states, which built-in strings name it. */
5
+ notes: string;
6
+ /** Keyboard expectations, one line per key group. */
7
+ keys: readonly string[];
8
+ }
9
+ /** The machine-readable roles: ARIA names, plus `text` (static text) and
10
+ * `hidden` (out of the accessibility tree). */
11
+ export declare const A11Y_ROLES: readonly string[];
12
+ export declare const A11Y_RULES: readonly string[];
13
+ export declare const A11Y_COMMANDS: Readonly<Record<string, {
14
+ args: readonly string[];
15
+ description: string;
16
+ }>>;
17
+ export declare const COMPONENT_A11Y: Readonly<Record<string, ComponentA11y>>;
18
+ /** A component's entry, if it has one (extensions declare their own). */
19
+ export declare function componentA11y(name: string): ComponentA11y | undefined;
20
+ /** True for a role of the vocabulary. */
21
+ export declare function isA11yRole(value: unknown): boolean;
@@ -0,0 +1,76 @@
1
+ import type { Easing, ResolvedTheme } from "./theme-types.js";
2
+ export interface Keyframe {
3
+ offset: number;
4
+ opacity?: number;
5
+ translateX?: number;
6
+ translateY?: number;
7
+ rotate?: number;
8
+ scale?: number;
9
+ band?: number;
10
+ }
11
+ export interface AnimationDef {
12
+ duration: string;
13
+ factor: number;
14
+ easing: string;
15
+ iterations: number | `infinite`;
16
+ rest: number;
17
+ keyframes: Keyframe[];
18
+ band?: {
19
+ color: string;
20
+ stops: {
21
+ offset: number;
22
+ alpha: number;
23
+ }[];
24
+ };
25
+ }
26
+ /** The keyframe sets by name (style.json `animations`, `$comment` aside). */
27
+ export declare const ANIMATIONS: Readonly<Record<string, AnimationDef>>;
28
+ export declare const ANIMATION_NAMES: readonly string[];
29
+ /** One frame: every channel at its value (`band` null = no shimmer band). */
30
+ export interface AnimationFrame {
31
+ opacity: number;
32
+ translateX: number;
33
+ translateY: number;
34
+ rotate: number;
35
+ scale: number;
36
+ band: number | null;
37
+ }
38
+ export interface AnimationTiming {
39
+ durationMs: number;
40
+ /** A cubic bezier or `linear`. */
41
+ easing: Easing | `linear`;
42
+ iterations: number | `infinite`;
43
+ }
44
+ /** Duration and easing of an animation under a theme: the `duration` token
45
+ * (or `durationToken`, the node's `animationDuration`) × `factor`. */
46
+ export declare function animationTiming(name: string, theme: ResolvedTheme, durationToken?: string): AnimationTiming | null;
47
+ /** y of a CSS cubic-bezier at x (bisection on x, 60 steps: deterministic). */
48
+ export declare function cubicBezier(curve: Easing, x: number): number;
49
+ /** The frame `elapsedMs` after the node entered the tree. Finished finite
50
+ * animations hold their last keyframe; reduced motion = the `rest`
51
+ * keyframe (no band). */
52
+ export declare function animationFrame(name: string, elapsedMs: number, theme: ResolvedTheme, options?: {
53
+ reducedMotion?: boolean;
54
+ durationToken?: string;
55
+ }): AnimationFrame | null;
56
+ /** What a painter shows: the node's own opacity × the frame's (an
57
+ * animation MULTIPLIES opacity; it never replaces it). */
58
+ export declare function paintedOpacity(own: number | undefined, frame: AnimationFrame | null): number;
59
+ /** The custom properties the keyframes animate, registered so they
60
+ * interpolate: `--xui-a-opacity` (the animation's opacity factor; the node's
61
+ * `opacity` = own × it, see css.ts styleToCss) and `--xui-band` (the shimmer
62
+ * band). A CSS renderer adds this ONCE per document beside the keyframes. */
63
+ export declare const ANIMATION_PROPERTIES_CSS = "@property --xui-a-opacity{syntax:\"<number>\";inherits:false;initial-value:1}@property --xui-band{syntax:\"<number>\";inherits:true;initial-value:1}";
64
+ /** Whether a keyframe set animates opacity (its node's CSS opacity then
65
+ * multiplies `--xui-a-opacity`). */
66
+ export declare function animatesOpacity(name: string): boolean;
67
+ /** The CSS `@keyframes xui-<name>` rule (individual `translate`/`rotate`/
68
+ * `scale` properties compose OUTSIDE the node's own `transform`; opacity
69
+ * moves `--xui-a-opacity`, which the node's `opacity` multiplies, so the
70
+ * author's opacity survives the `both` fill; the shimmer band moves
71
+ * `--xui-band`, which the renderer's overlay reads). Needs
72
+ * `ANIMATION_PROPERTIES_CSS`. */
73
+ export declare function keyframesCss(name: string): string;
74
+ /** The CSS `animation` shorthand for a resolved timing (per-segment easing
75
+ * is CSS's own semantics). */
76
+ export declare function animationCss(name: string, timing: AnimationTiming): string;
@@ -0,0 +1,38 @@
1
+ import type { Action, ChildTemplate, FlatComponent } from "./types.js";
2
+ interface PropRule {
3
+ from?: string;
4
+ map?: Record<string, unknown>;
5
+ default?: unknown;
6
+ const?: unknown;
7
+ }
8
+ interface ComponentRule {
9
+ to: string;
10
+ props: Record<string, string | PropRule>;
11
+ children?: `children` | `child`;
12
+ transform?: string;
13
+ }
14
+ export declare const basicMap: {
15
+ from: string;
16
+ to: string;
17
+ version: string;
18
+ placeholderIcon: string;
19
+ components: Record<string, ComponentRule>;
20
+ transforms: Record<string, string>;
21
+ icons: Record<string, string | null>;
22
+ functions: Record<string, string>;
23
+ };
24
+ /** What a basic component becomes before the reducer nests its children. */
25
+ export interface MappedComponent {
26
+ component: string;
27
+ props: Record<string, unknown>;
28
+ childrenIds: string[];
29
+ template?: ChildTemplate;
30
+ slots: Record<string, string>;
31
+ on?: Record<string, Action>;
32
+ style?: Record<string, unknown>;
33
+ }
34
+ export declare function mapBasicIcon(name: unknown): string;
35
+ /** Map one basic component; `null` when the table has no row (→ Unknown). */
36
+ export declare function mapBasicComponent(flat: FlatComponent, lookup: (id: string) => FlatComponent | undefined): MappedComponent | null;
37
+ export declare const BASIC_TRANSFORM_NAMES: readonly string[];
38
+ export {};