@jxsuite/studio 1.0.0 → 1.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 (86) hide show
  1. package/dist/iframe-entry.js +622 -49
  2. package/dist/iframe-entry.js.map +15 -12
  3. package/dist/studio.css +1333 -0
  4. package/dist/studio.js +53069 -31746
  5. package/dist/studio.js.map +109 -74
  6. package/package.json +11 -9
  7. package/src/canvas/canvas-live-render.ts +21 -2
  8. package/src/canvas/canvas-render.ts +35 -16
  9. package/src/canvas/canvas-utils.ts +118 -72
  10. package/src/canvas/iframe-entry.ts +20 -0
  11. package/src/canvas/iframe-eval.ts +155 -0
  12. package/src/canvas/iframe-host.ts +131 -5
  13. package/src/canvas/iframe-inline-edit.ts +107 -1
  14. package/src/canvas/iframe-protocol.ts +43 -3
  15. package/src/canvas/iframe-render.ts +18 -0
  16. package/src/collab/collab-session.ts +23 -8
  17. package/src/collab/collab-state.ts +6 -3
  18. package/src/component-props.ts +104 -0
  19. package/src/editor/inline-edit-apply.ts +36 -1
  20. package/src/editor/inline-edit.ts +58 -1
  21. package/src/editor/shortcuts.ts +41 -12
  22. package/src/files/file-ops.ts +14 -0
  23. package/src/files/files.ts +53 -1
  24. package/src/grid/cell-editors.ts +288 -0
  25. package/src/grid/cell-popovers.ts +108 -0
  26. package/src/grid/csv-codec.ts +122 -0
  27. package/src/grid/edit-buffer.ts +490 -0
  28. package/src/grid/grid-controller.ts +417 -0
  29. package/src/grid/grid-layout.ts +83 -0
  30. package/src/grid/grid-open.ts +167 -0
  31. package/src/grid/grid-panel.ts +302 -0
  32. package/src/grid/grid-source.ts +210 -0
  33. package/src/grid/grid-view.ts +367 -0
  34. package/src/grid/schema-columns.ts +261 -0
  35. package/src/grid/sources/connector-source.ts +217 -0
  36. package/src/grid/sources/content-source.ts +542 -0
  37. package/src/grid/sources/csv-file-source.ts +247 -0
  38. package/src/grid/tabulator-tables.d.ts +120 -0
  39. package/src/panels/block-action-bar.ts +8 -3
  40. package/src/panels/chat-panel.ts +98 -0
  41. package/src/panels/data-grid.ts +9 -387
  42. package/src/panels/editors.ts +43 -17
  43. package/src/panels/events-panel.ts +137 -44
  44. package/src/panels/formula-workspace.ts +379 -0
  45. package/src/panels/frontmatter-fields.ts +231 -0
  46. package/src/panels/frontmatter-panel.ts +132 -0
  47. package/src/panels/git-panel.ts +1 -1
  48. package/src/panels/head-panel.ts +11 -175
  49. package/src/panels/properties-panel.ts +154 -144
  50. package/src/panels/right-panel.ts +9 -47
  51. package/src/panels/signals-panel.ts +115 -23
  52. package/src/panels/statement-editor.ts +710 -0
  53. package/src/panels/style-panel.ts +25 -1
  54. package/src/panels/stylebook-panel.ts +0 -2
  55. package/src/panels/tab-bar.ts +175 -6
  56. package/src/panels/tab-strip.ts +62 -6
  57. package/src/panels/toolbar.ts +37 -3
  58. package/src/services/ai-project-tools.ts +541 -0
  59. package/src/services/ai-session-store.ts +28 -0
  60. package/src/services/ai-system-prompt.ts +194 -24
  61. package/src/services/ai-tools.ts +88 -21
  62. package/src/services/automation.ts +16 -0
  63. package/src/services/document-assistant.ts +81 -11
  64. package/src/services/gated-registry.ts +72 -0
  65. package/src/services/live-preview.ts +0 -0
  66. package/src/services/preview-eval.ts +68 -0
  67. package/src/services/project-adoption.ts +31 -0
  68. package/src/site-context.ts +2 -0
  69. package/src/store.ts +4 -0
  70. package/src/studio.ts +83 -52
  71. package/src/tabs/patch-ops.ts +25 -0
  72. package/src/tabs/tab.ts +39 -1
  73. package/src/tabs/transact.ts +60 -13
  74. package/src/types.ts +12 -0
  75. package/src/ui/dynamic-slot.ts +272 -0
  76. package/src/ui/expression-editor.ts +423 -125
  77. package/src/ui/field-row.ts +5 -0
  78. package/src/ui/formula-catalog.ts +557 -0
  79. package/src/ui/formula-chips.ts +216 -0
  80. package/src/ui/formula-palette.ts +211 -0
  81. package/src/ui/layers.ts +40 -0
  82. package/src/ui/media-picker.ts +1 -1
  83. package/src/ui/panel-resize.ts +15 -1
  84. package/src/utils/preview-format.ts +26 -0
  85. package/src/view.ts +4 -4
  86. package/src/workspace/workspace.ts +14 -0
@@ -1,35 +1,38 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/canvas/iframe-channel.ts", "../../../node_modules/@vue/shared/dist/shared.esm-bundler.js", "../../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js", "../../runtime/src/expression.ts", "../../schema/src/guards.ts", "../../runtime/src/runtime.ts", "../src/canvas/path-mapping.ts", "../src/canvas/iframe-render.ts", "../src/utils/geometry.ts", "../src/state.ts", "../src/canvas/iframe-insert.ts", "../src/editor/inline-format.ts", "../src/editor/inline-edit.ts", "../src/canvas/iframe-interaction.ts", "../src/canvas/iframe-drop.ts", "../src/editor/inline-link.ts", "../src/utils/edit-display.ts", "../src/canvas/iframe-inline-edit.ts", "../src/canvas/iframe-slash.ts", "../src/canvas/iframe-keys.ts", "../../collab/src/ops.ts", "../src/utils/strip-events.ts", "../src/canvas/iframe-subtree.ts", "../src/canvas/iframe-patch.ts", "../src/canvas/serialize-scope.ts", "../src/canvas/iframe-entry.ts"],
3
+ "sources": ["../src/canvas/iframe-channel.ts", "../../../node_modules/@vue/shared/dist/shared.esm-bundler.js", "../../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js", "../../runtime/src/expression.ts", "../../schema/src/guards.ts", "../../runtime/src/statements.ts", "../../runtime/src/runtime.ts", "../src/canvas/path-mapping.ts", "../src/canvas/iframe-render.ts", "../src/utils/geometry.ts", "../src/state.ts", "../src/canvas/iframe-insert.ts", "../src/editor/inline-format.ts", "../src/editor/inline-edit.ts", "../src/canvas/iframe-interaction.ts", "../src/canvas/iframe-drop.ts", "../src/editor/inline-link.ts", "../src/utils/edit-display.ts", "../src/canvas/iframe-inline-edit.ts", "../src/canvas/iframe-slash.ts", "../src/canvas/iframe-keys.ts", "../../collab/src/ops.ts", "../src/utils/strip-events.ts", "../src/canvas/iframe-subtree.ts", "../src/canvas/iframe-patch.ts", "../src/utils/preview-format.ts", "../src/canvas/iframe-eval.ts", "../src/canvas/serialize-scope.ts", "../src/canvas/iframe-entry.ts"],
4
4
  "sourcesContent": [
5
5
  "/// <reference lib=\"dom\" />\n/**\n * IframeChannel — the typed message boundary between the editor (parent) and the canvas iframe.\n *\n * Per the migration's cross-origin bridge decision, the parent never touches the iframe's\n * `contentDocument`; everything (render commands, patches, geometry, selection, hit-tests) crosses\n * as serializable messages through this one interface. Phases 1+ instantiate it with concrete\n * message unions (`ParentToIframe`/`IframeToParent`); this module owns only the transport contract\n * plus an in-memory `fakeChannelPair` so cross-frame logic is unit-testable without a live iframe.\n */\n\n/**\n * A typed, bidirectional message channel. `TOut` is what this side sends; `TIn` is what it\n * receives. Implementations: a real `postMessage` channel over an `<iframe>` (added with the iframe\n * host), and {@link fakeChannelPair} for tests.\n */\nexport interface IframeChannel<TOut, TIn> {\n /** Send a message to the other side. */\n post: (message: TOut) => void;\n /** Subscribe to messages from the other side. Returns an unsubscribe function. */\n onMessage: (handler: (message: TIn) => void) => () => void;\n /** Detach all handlers and release the transport. */\n dispose: () => void;\n}\n\n/** Envelope key that tags every cross-frame message so foreign `message` events are ignored. */\nconst ENVELOPE = \"jx:canvas\";\n\ninterface PostMessageTarget {\n postMessage: (message: unknown, targetOrigin: string) => void;\n}\n\ninterface MessageSource {\n addEventListener: (type: \"message\", listener: (event: MessageEvent) => void) => void;\n removeEventListener: (type: \"message\", listener: (event: MessageEvent) => void) => void;\n}\n\n/**\n * A real `IframeChannel` over `window.postMessage`. Outbound messages are wrapped in an envelope\n * tagged with a shared `token`; inbound messages are dropped unless their `event.origin` matches\n * `acceptOrigin` (pass `\"*\"` to skip the origin check) AND they carry the same token. This is the\n * origin + secret-token authentication that keeps other local pages from driving the canvas.\n *\n * Parent side: `target` = the iframe's `contentWindow`, `source` = `window`, origins = the iframe\n * origin. Iframe side: `target` = `window.parent`, `source` = `window`, origins = the editor\n * origin.\n */\nexport function postMessageChannel<TOut, TIn>(opts: {\n target: PostMessageTarget;\n source: MessageSource;\n targetOrigin: string;\n acceptOrigin: string;\n token: string;\n}): IframeChannel<TOut, TIn> {\n const { target, source, targetOrigin, acceptOrigin, token } = opts;\n const handlers = new Set<(message: TIn) => void>();\n\n const listener = (event: MessageEvent) => {\n if (acceptOrigin !== \"*\" && event.origin !== acceptOrigin) {\n return;\n }\n const data = event.data as { [ENVELOPE]?: string; payload?: TIn } | null;\n if (!data || typeof data !== \"object\" || data[ENVELOPE] !== token) {\n return;\n }\n for (const handler of handlers) {\n handler(data.payload as TIn);\n }\n };\n source.addEventListener(\"message\", listener);\n\n return {\n dispose() {\n handlers.clear();\n source.removeEventListener(\"message\", listener);\n },\n onMessage(handler) {\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n post(message) {\n target.postMessage({ [ENVELOPE]: token, payload: message }, targetOrigin);\n },\n };\n}\n\n/**\n * Two in-memory channels wired to each other for tests. A message `parent.post(x)` is delivered to\n * the `iframe` side's handlers (and vice versa) only when `flush()` is called — so tests drive the\n * inherently-async postMessage ordering deterministically. Messages posted _during_ a flush are\n * queued for the next flush, never delivered re-entrantly.\n */\nexport function fakeChannelPair<ParentOut, IframeOut>(): {\n parent: IframeChannel<ParentOut, IframeOut>;\n iframe: IframeChannel<IframeOut, ParentOut>;\n flush: () => void;\n /** Number of messages waiting to be delivered (both directions). */\n pending: () => number;\n} {\n let toIframe: ParentOut[] = [];\n let toParent: IframeOut[] = [];\n const iframeHandlers = new Set<(m: ParentOut) => void>();\n const parentHandlers = new Set<(m: IframeOut) => void>();\n\n const parent: IframeChannel<ParentOut, IframeOut> = {\n dispose() {\n parentHandlers.clear();\n },\n onMessage(handler) {\n parentHandlers.add(handler);\n return () => parentHandlers.delete(handler);\n },\n post(message) {\n toIframe.push(message);\n },\n };\n\n const iframe: IframeChannel<IframeOut, ParentOut> = {\n dispose() {\n iframeHandlers.clear();\n },\n onMessage(handler) {\n iframeHandlers.add(handler);\n return () => iframeHandlers.delete(handler);\n },\n post(message) {\n toParent.push(message);\n },\n };\n\n function flush() {\n const forIframe = toIframe;\n const forParent = toParent;\n toIframe = [];\n toParent = [];\n for (const message of forIframe) {\n for (const handler of iframeHandlers) {\n handler(message);\n }\n }\n for (const message of forParent) {\n for (const handler of parentHandlers) {\n handler(message);\n }\n }\n }\n\n return {\n flush,\n iframe,\n parent,\n pending: () => toIframe.length + toParent.length,\n };\n}\n",
6
- "/**\n* @vue/shared v3.5.39\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \"&quot;\";\n break;\n case 38:\n escaped = \"&amp;\";\n break;\n case 39:\n escaped = \"&#39;\";\n break;\n case 60:\n escaped = \"&lt;\";\n break;\n case 62:\n escaped = \"&gt;\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n return src.replace(commentStripRE, \"\");\n}\nconst cssVarNameEscapeSymbolsRE = /[ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n",
7
- "/**\n* @vue/reactivity v3.5.39\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, isObject, makeMap, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this._warnOnRun = true;\n this.__v_skip = true;\n if (!detached && activeEffectScope) {\n if (activeEffectScope.active) {\n this.parent = activeEffectScope;\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n } else {\n this._active = false;\n this._warnOnRun = false;\n }\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && this._warnOnRun) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n if (activeEffectScope === this) {\n activeEffectScope = this.prevScope;\n } else {\n let current = activeEffectScope;\n while (current) {\n if (current.prevScope === this) {\n current.prevScope = this.prevScope;\n break;\n }\n current = current.prevScope;\n }\n }\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope) {\n if (activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n } else {\n this.flags &= -2;\n }\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n let wrappedFn = fn;\n let wrapInitialAccumulator = false;\n if (arr !== self) {\n if (needsWrap) {\n wrapInitialAccumulator = args.length === 0;\n wrappedFn = function(acc, item, index) {\n if (wrapInitialAccumulator) {\n wrapInitialAccumulator = false;\n acc = toWrapped(self, acc);\n }\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n const result = arr[method](wrappedFn, ...args);\n return wrapInitialAccumulator ? toWrapped(self, result) : result;\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver) && result) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return extend(\n // inheriting all iterator properties\n Object.create(innerIterator),\n {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n }\n }\n );\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n const target = toRaw(this);\n const proto = getProto(target);\n const rawValue = toRaw(value);\n const valueToAdd = !shallow && !isShallow(value) && !isReadonly(value) ? rawValue : value;\n const hadKey = proto.has.call(target, valueToAdd) || hasChanged(value, valueToAdd) && proto.has.call(target, value) || hasChanged(rawValue, valueToAdd) && proto.has.call(target, rawValue);\n if (!hadKey) {\n target.add(valueToAdd);\n trigger(target, \"add\", valueToAdd, valueToAdd);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction reactive(target) {\n if (/* @__PURE__ */ isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n if (target[\"__v_skip\"] || !Object.isExtensible(target)) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = targetTypeMap(toRawType(target));\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReactive(value) {\n if (/* @__PURE__ */ isReadonly(value)) {\n return /* @__PURE__ */ isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? /* @__PURE__ */ toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? /* @__PURE__ */ reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? /* @__PURE__ */ readonly(value) : value;\n\n// @__NO_SIDE_EFFECTS__\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction ref(value) {\n return createRef(value, false);\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (/* @__PURE__ */ isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return /* @__PURE__ */ isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (/* @__PURE__ */ isRef(oldValue) && !/* @__PURE__ */ isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, key, _defaultValue) {\n this._object = _object;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._key = isSymbol(key) ? key : String(key);\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || isSymbol(this._key) || !isIntegerKey(this._key)) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && /* @__PURE__ */ isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (/* @__PURE__ */ isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRef(source, key, defaultValue) {\n if (/* @__PURE__ */ isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return /* @__PURE__ */ ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n const res = _cb(...args);\n watchHandle();\n return res;\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (immediateFirstRun || deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n",
8
- "/// <reference lib=\"dom\" />\n/**\n * Jx Declarative Expression Engine (spec §19)\n *\n * Shared module used by both runtime (evaluateExpression) and compiler (compileExpression).\n *\n * @module expression\n */\n\nimport type { JxExpressionNode, JxExpressionOperand } from \"@jxsuite/schema/types\";\nimport type { JxScope } from \"./types.ts\";\n\n/** The runtime's expression node — the schema's expression model. */\nexport type ExpressionNode = JxExpressionNode;\nexport type ExpressionOperand = JxExpressionOperand;\n\n/** The `$map` iteration context object stored in scope during mapped rendering. */\ninterface ScopeMapCtx {\n item?: unknown;\n index?: number;\n [key: string]: unknown;\n}\n\n/** View the scope's `$map` iteration context, if present. */\nfunction scopeMap(state: JxScope): ScopeMapCtx | undefined {\n const map = state.$map;\n return map && typeof map === \"object\" ? (map as ScopeMapCtx) : undefined;\n}\n\ninterface CompileOpts {\n statePrefix?: string;\n eventParam?: string;\n}\n\nconst MUTATING_OPS = new Set([\n \"=\",\n \"+=\",\n \"-=\",\n \"*=\",\n \"/=\",\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n]);\nconst UNARY_OPS = new Set([\"!\", \"-\"]);\nconst BINARY_OPS = new Set([\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"===\",\n \"!==\",\n \"<\",\n \"<=\",\n \">\",\n \">=\",\n \"&&\",\n \"||\",\n]);\nconst ASSIGNMENT_OPS = new Set([\"=\", \"+=\", \"-=\", \"*=\", \"/=\"]);\nconst ARRAY_METHOD_OPS = new Set([\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"]);\nconst AGGREGATE_OPS = new Set([\"reduce\", \"map\", \"filter\"]);\n\nexport const BLESSED_OPERATORS = new Set([\n ...MUTATING_OPS,\n ...UNARY_OPS,\n ...BINARY_OPS,\n ...AGGREGATE_OPS,\n]);\n\n/**\n * @param {string} op\n * @returns {boolean}\n */\nexport function isMutating(op: string) {\n return MUTATING_OPS.has(op);\n}\n\n// ─── Runtime Evaluation ──────────────────────────────────────────────────────\n\ninterface IterCtx {\n acc?: unknown;\n item?: unknown;\n index?: number;\n}\n\n/** Resolve an operand to its runtime value. */\nfunction resolveOperand(\n operand: unknown,\n state: JxScope,\n event: Event | null,\n iterCtx?: IterCtx,\n): unknown {\n if (operand === null || operand === undefined) {\n return operand;\n }\n\n // Nested expression node\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"operator\" in operand) {\n return evaluateExpression(operand as ExpressionNode, state, event, iterCtx);\n }\n\n // $ref pointer\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"$ref\" in operand) {\n return resolveExprRef((operand as { $ref: string }).$ref, state, event, iterCtx);\n }\n\n // Array of operands (e.g., splice args)\n if (Array.isArray(operand)) {\n return operand.map((o: unknown) => resolveOperand(o, state, event, iterCtx));\n }\n\n // Literal\n return operand;\n}\n\n/** Resolve a $ref string within expression context. */\nfunction resolveExprRef(ref: string, state: JxScope, event: Event | null, iterCtx?: IterCtx) {\n if (ref === \"$reduce/acc\") {\n return iterCtx?.acc;\n }\n if (ref.startsWith(\"$reduce/\")) {\n return iterCtx?.acc;\n }\n if (ref.startsWith(\"event#/\")) {\n const path = ref.slice(\"event#/\".length);\n return getPath(event, path);\n }\n if (ref.startsWith(\"$map/\")) {\n const parts = ref.split(\"/\");\n const [, key] = parts;\n let base;\n const map = scopeMap(state);\n if (key === \"item\") {\n base = iterCtx?.item ?? map?.item ?? state[\"$map/item\"];\n } else if (key === \"index\") {\n base = iterCtx?.index ?? map?.index ?? state[\"$map/index\"];\n } else {\n base = map?.[key!] ?? state[`$map/${key}`];\n }\n return parts.length > 2 ? getPath(base, parts.slice(2).join(\"/\")) : base;\n }\n if (ref.startsWith(\"#/state/\")) {\n const sub = ref.slice(\"#/state/\".length);\n const slash = sub.indexOf(\"/\");\n if (slash === -1) {\n return state[sub];\n }\n return getPath(state[sub.slice(0, slash)], sub.slice(slash + 1));\n }\n if (ref.startsWith(\"parent#/\")) {\n return state[ref.slice(\"parent#/\".length)];\n }\n if (ref.startsWith(\"window#/\")) {\n return getPath(globalThis.window, ref.slice(\"window#/\".length));\n }\n if (ref.startsWith(\"document#/\")) {\n return getPath(globalThis.document, ref.slice(\"document#/\".length));\n }\n return state[ref] ?? null;\n}\n\n/** Resolve a $ref to a writable location — returns { obj, key } for assignment. */\nfunction resolveWritableRef(\n ref: string,\n state: JxScope,\n _event: Event | null,\n iterCtx?: IterCtx,\n): { obj: JxScope; key: string } {\n if (ref.startsWith(\"$map/\")) {\n const parts = ref.split(\"/\");\n const [, key] = parts;\n let base;\n const map = scopeMap(state);\n if (key === \"item\") {\n base = iterCtx?.item ?? map?.item ?? state[\"$map/item\"];\n } else if (key === \"index\") {\n base = iterCtx?.index ?? map?.index ?? state[\"$map/index\"];\n } else {\n base = map?.[key!] ?? state[`$map/${key}`];\n }\n if (parts.length > 2) {\n const pathParts = parts.slice(2);\n const lastKey = pathParts.pop();\n const obj = pathParts.length > 0 ? getPath(base, pathParts.join(\"/\")) : base;\n return { key: lastKey as string, obj: obj as JxScope };\n }\n return {\n key: key === \"item\" ? \"$map/item\" : \"$map/index\",\n obj: scopeMap(state) ?? state,\n };\n }\n if (ref.startsWith(\"#/state/\")) {\n const sub = ref.slice(\"#/state/\".length);\n const slash = sub.indexOf(\"/\");\n if (slash === -1) {\n return { key: sub, obj: state };\n }\n const parts = sub.split(\"/\");\n const lastKey = parts.pop();\n let obj = state;\n // Pointer paths address objects by construction (validated by the schema).\n for (const p of parts) {\n obj = obj[p] as JxScope;\n }\n return { key: lastKey as string, obj };\n }\n return { key: ref, obj: state };\n}\n\n/** Evaluate an expression node at runtime. */\nexport function evaluateExpression(\n node: ExpressionNode,\n state: JxScope,\n event: Event | null,\n iterCtx?: IterCtx,\n): unknown {\n const { operator, target, value, initial } = node;\n\n if (!BLESSED_OPERATORS.has(operator)) {\n throw new Error(`$expression: unknown operator \"${operator}\"`);\n }\n\n // ─── Unary ───\n if (UNARY_OPS.has(operator) && !(\"value\" in node)) {\n const operand: unknown = resolveOperand(target, state, event, iterCtx);\n if (operator === \"!\") {\n return !operand;\n }\n if (operator === \"-\") {\n return -(operand as number);\n }\n }\n\n // ─── Binary (pure) ───\n if (BINARY_OPS.has(operator)) {\n const left = resolveOperand(target, state, event, iterCtx) as number & string;\n const right = resolveOperand(value, state, event, iterCtx) as number & string;\n switch (operator) {\n case \"+\": {\n return left + right;\n }\n case \"-\": {\n return left - right;\n }\n case \"*\": {\n return left * right;\n }\n case \"/\": {\n return left / right;\n }\n case \"%\": {\n return left % right;\n }\n case \"===\": {\n return left === right;\n }\n case \"!==\": {\n return left !== right;\n }\n case \"<\": {\n return left < right;\n }\n case \"<=\": {\n return left <= right;\n }\n case \">\": {\n return left > right;\n }\n case \">=\": {\n return left >= right;\n }\n case \"&&\": {\n return left && right;\n }\n case \"||\": {\n return left || right;\n }\n default: {\n break;\n }\n }\n }\n\n // ─── Assignment ───\n if (ASSIGNMENT_OPS.has(operator)) {\n const rhs = resolveOperand(value, state, event, iterCtx) as number;\n const { obj, key } = resolveWritableRef(\n (target as { $ref: string }).$ref,\n state,\n event,\n iterCtx,\n );\n switch (operator) {\n case \"=\": {\n obj[key] = rhs;\n break;\n }\n case \"+=\": {\n const current = obj[key] as number;\n obj[key] = current + rhs;\n break;\n }\n case \"-=\": {\n const current = obj[key] as number;\n obj[key] = current - rhs;\n break;\n }\n case \"*=\": {\n const current = obj[key] as number;\n obj[key] = current * rhs;\n break;\n }\n case \"/=\": {\n const current = obj[key] as number;\n obj[key] = current / rhs;\n break;\n }\n default: {\n break;\n }\n }\n return;\n }\n\n // ─── Array methods ───\n if (ARRAY_METHOD_OPS.has(operator)) {\n const arr: unknown[] = resolveOperand(target, state, event, iterCtx) as unknown[];\n switch (operator) {\n case \"push\": {\n return arr.push(resolveOperand(value, state, event, iterCtx));\n }\n case \"unshift\": {\n return arr.unshift(resolveOperand(value, state, event, iterCtx));\n }\n case \"pop\": {\n return arr.pop();\n }\n case \"shift\": {\n return arr.shift();\n }\n case \"splice\": {\n const args: unknown[] = resolveOperand(value, state, event, iterCtx) as unknown[];\n return (arr.splice as (...a: unknown[]) => unknown[])(...args);\n }\n default: {\n break;\n }\n }\n }\n\n // ─── Aggregates (pure) ───\n if (AGGREGATE_OPS.has(operator)) {\n const arr: unknown[] = resolveOperand(target, state, event, iterCtx) as unknown[];\n if (operator === \"reduce\") {\n let acc: unknown = resolveOperand(initial, state, event, iterCtx);\n for (const [index, item] of arr.entries()) {\n acc = evaluateExpression(value as ExpressionNode, state, event, {\n acc,\n index,\n item,\n });\n }\n return acc;\n }\n if (operator === \"map\") {\n return arr.map((item: unknown, index: number) =>\n evaluateExpression(value as ExpressionNode, state, event, {\n ...iterCtx,\n index,\n item,\n }),\n );\n }\n if (operator === \"filter\") {\n return arr.filter((item: unknown, index: number) =>\n evaluateExpression(value as ExpressionNode, state, event, {\n ...iterCtx,\n index,\n item,\n }),\n );\n }\n }\n\n return undefined;\n}\n\n// ─── Compiler: Expression → JS Source ────────────────────────────────────────\n\n/** Compile an operand to a JS source string. */\nfunction compileOperand(operand: unknown, opts: CompileOpts): string {\n if (operand === null) {\n return \"null\";\n }\n if (operand === undefined) {\n return \"undefined\";\n }\n\n // Nested expression node\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"operator\" in operand) {\n return compileExpression(operand as ExpressionNode, opts);\n }\n\n // $ref pointer\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"$ref\" in operand) {\n return compileRef((operand as { $ref: string }).$ref, opts);\n }\n\n // Array of operands\n if (Array.isArray(operand)) {\n return operand.map((o: unknown) => compileOperand(o, opts)).join(\", \");\n }\n\n // Literal\n return JSON.stringify(operand);\n}\n\n/**\n * Compile a $ref to its JS equivalent.\n *\n * @param {string} ref\n * @param {CompileOpts} opts\n * @returns {string}\n */\nfunction compileRef(ref: string, opts: CompileOpts) {\n const s = opts.statePrefix ?? \"state\";\n const e = opts.eventParam ?? \"event\";\n\n if (ref === \"$reduce/acc\") {\n return \"_acc\";\n }\n if (ref.startsWith(\"$reduce/\")) {\n return \"_acc\";\n }\n\n if (ref.startsWith(\"event#/\")) {\n const path = ref.slice(\"event#/\".length);\n return `${e}.${path.replaceAll(\"/\", \".\")}`;\n }\n\n if (ref.startsWith(\"$map/\")) {\n const parts = ref.split(\"/\");\n const [, key] = parts;\n if (key === \"item\") {\n return parts.length > 2 ? `_item.${parts.slice(2).join(\".\")}` : \"_item\";\n }\n if (key === \"index\") {\n return \"_index\";\n }\n return `_${key}`;\n }\n\n if (ref.startsWith(\"#/state/\")) {\n const path = ref.slice(\"#/state/\".length);\n return `${s}.${path.replaceAll(\"/\", \".\")}`;\n }\n\n if (ref.startsWith(\"parent#/\")) {\n return `${s}.${ref.slice(\"parent#/\".length)}`;\n }\n if (ref.startsWith(\"window#/\")) {\n return `window.${ref.slice(\"window#/\".length).replaceAll(\"/\", \".\")}`;\n }\n if (ref.startsWith(\"document#/\")) {\n return `document.${ref.slice(\"document#/\".length).replaceAll(\"/\", \".\")}`;\n }\n\n return `${s}.${ref}`;\n}\n\n/** Compile a writable $ref target to its JS equivalent (for LHS of assignment). */\nfunction compileTarget(target: unknown, opts: CompileOpts): string {\n if (typeof target === \"object\" && target !== null && \"$ref\" in target) {\n return compileRef((target as { $ref: string }).$ref, opts);\n }\n return compileOperand(target, opts);\n}\n\n/**\n * Compile an expression node to a JS source string. Returns a statement for mutating ops, a value\n * expression for pure ops.\n *\n * @param {ExpressionNode} node\n * @param {CompileOpts} [opts]\n * @returns {string}\n */\nexport function compileExpression(node: ExpressionNode, opts: CompileOpts = {}): string {\n const { operator, target, value, initial } = node;\n\n // ─── Unary ───\n if (UNARY_OPS.has(operator) && !(\"value\" in node)) {\n const operand: string = compileOperand(target, opts);\n if (operator === \"!\") {\n return `!(${operand})`;\n }\n if (operator === \"-\") {\n return `-(${operand})`;\n }\n }\n\n // ─── Binary (pure) ───\n if (BINARY_OPS.has(operator)) {\n const left: string = compileOperand(target, opts);\n const right: string = compileOperand(value, opts);\n return `(${left} ${operator} ${right})`;\n }\n\n // ─── Assignment ───\n if (ASSIGNMENT_OPS.has(operator)) {\n const lhs: string = compileTarget(target, opts);\n const rhs: string = compileOperand(value, opts);\n return `${lhs} ${operator} ${rhs}`;\n }\n\n // ─── Array methods ───\n if (ARRAY_METHOD_OPS.has(operator)) {\n const arr: string = compileTarget(target, opts);\n switch (operator) {\n case \"push\": {\n return `${arr}.push(${compileOperand(value, opts)})`;\n }\n case \"unshift\": {\n return `${arr}.unshift(${compileOperand(value, opts)})`;\n }\n case \"pop\": {\n return `${arr}.pop()`;\n }\n case \"shift\": {\n return `${arr}.shift()`;\n }\n case \"splice\": {\n const args: string = Array.isArray(value)\n ? value.map((o: unknown) => compileOperand(o, opts)).join(\", \")\n : compileOperand(value, opts);\n return `${arr}.splice(${args})`;\n }\n default: {\n break;\n }\n }\n }\n\n // ─── Aggregates (pure) ───\n if (AGGREGATE_OPS.has(operator)) {\n const arr: string = compileOperand(target, opts);\n const itemExpr: string = compileExpression(value as ExpressionNode, opts);\n if (operator === \"reduce\") {\n const seed: string = compileOperand(initial, opts);\n return `${arr}.reduce((_acc, _item, _index) => ${itemExpr}, ${seed})`;\n }\n if (operator === \"map\") {\n return `${arr}.map((_item, _index) => ${itemExpr})`;\n }\n if (operator === \"filter\") {\n return `${arr}.filter((_item, _index) => ${itemExpr})`;\n }\n }\n\n return \"undefined\";\n}\n\n// ─── Utilities ───────────────────────────────────────────────────────────────\n\n/** Resolve a dotted/slashed path on an object. */\nfunction getPath(obj: unknown, path: string): unknown {\n let current: unknown = obj;\n for (const k of path.split(/[./]/)) {\n current = (current as Record<string, unknown>)?.[k];\n }\n return current;\n}\n",
9
- "/**\n * Type predicate guards for the Jx document model.\n *\n * These narrow `unknown`/union-typed values to precise domain types so call sites get real property\n * checking instead of casts. Every guard mirrors the runtime's actual detection logic (see\n * buildScope's five-shape algorithm in the runtime).\n */\n\nimport type {\n JsonObject,\n JsonValue,\n JxClassDef,\n JxElement,\n JxEventBinding,\n JxExpressionDef,\n JxFunctionDef,\n JxMappedArray,\n JxMutableNode,\n JxPrototypeDef,\n JxRef,\n JxServerFnDef,\n JxStateObject,\n JxStyle,\n} from \"../types\";\n\n// ─── JSON shape guards ──────────────────────────────────────────────────────────\n\n/** A plain object: not null, not an array. The base check for all object-shaped defs. */\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n// ─── Binding guards ─────────────────────────────────────────────────────────────\n\n/** A `{ $ref: \"#/...\" }` JSON Pointer reference. */\nexport function isRef(value: unknown): value is JxRef {\n return isJsonObject(value) && typeof value.$ref === \"string\";\n}\n\n// ─── State definition guards (the five-shape algorithm) ────────────────────────\n\n/** Shape 4: a function declaration — `{ $prototype: \"Function\", body | $src }`. */\nexport function isFunctionDef(value: unknown): value is JxFunctionDef {\n return isJsonObject(value) && value.$prototype === \"Function\";\n}\n\n/** Shape 5: a declarative expression entry — `{ $expression: { operator, target } }`. */\nexport function isExpressionDef(value: unknown): value is JxExpressionDef {\n return isJsonObject(value) && isJsonObject(value.$expression);\n}\n\n/** A non-Function `$prototype` instance (Request, Storage, ContentCollection, classes, …). */\nexport function isPrototypeDef(value: unknown): value is JxPrototypeDef {\n return (\n isJsonObject(value) && typeof value.$prototype === \"string\" && value.$prototype !== \"Function\"\n );\n}\n\n/** A `timing: \"server\"` function proxy (no `$prototype`, external `$src`/`$export`). */\nexport function isServerFnDef(value: unknown): value is JxServerFnDef {\n return (\n isJsonObject(value) &&\n value.timing === \"server\" &&\n typeof value.$src === \"string\" &&\n typeof value.$export === \"string\" &&\n !value.$prototype\n );\n}\n\n/** Shape 2: an expanded signal — an object carrying a `default` value. */\nexport function isExpandedSignal(value: unknown): value is JxStateObject & { default: JsonValue } {\n return isJsonObject(value) && !value.$prototype && !value.$expression && \"default\" in value;\n}\n\n/**\n * Schema-only keywords used to detect pure type definitions (Shape 2b). An object with ONLY these\n * keys and no `default` is a type def, not a signal.\n */\nexport const SCHEMA_KEYWORDS: ReadonlySet<string> = new Set([\n \"type\",\n \"enum\",\n \"minimum\",\n \"maximum\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"format\",\n \"items\",\n \"properties\",\n \"required\",\n \"description\",\n \"title\",\n \"$comment\",\n]);\n\n/** Shape 2b: a pure type definition — every key is a JSON Schema keyword. */\nexport function isSchemaOnlyDef(value: unknown): value is JxStateObject {\n if (!isJsonObject(value)) {\n return false;\n }\n for (const k of Object.keys(value)) {\n if (!SCHEMA_KEYWORDS.has(k)) {\n return false;\n }\n }\n return true;\n}\n\n/** True when an object carries at least one JSON Schema keyword. */\nexport function hasSchemaKeywords(value: unknown): value is JxStateObject {\n if (!isJsonObject(value)) {\n return false;\n }\n for (const k of Object.keys(value)) {\n if (SCHEMA_KEYWORDS.has(k)) {\n return true;\n }\n }\n return false;\n}\n\n// ─── Document structure guards ──────────────────────────────────────────────────\n\n/** A mapped (repeater) children object — `{ $prototype: \"Array\", items, map }`. */\nexport function isMappedArray(value: unknown): value is JxMappedArray {\n return isJsonObject(value) && value.$prototype === \"Array\";\n}\n\n/**\n * Whether a node's `children` holds at least one mapped array — either as the bare whole-children\n * slot (legacy) or as a member of the children array. Used by renderers and the compiler to decide\n * if a children list needs inline repeater expansion.\n */\nexport function childrenContainArray(children?: unknown): boolean {\n if (isMappedArray(children)) {\n return true;\n }\n return Array.isArray(children) && children.some((c) => isMappedArray(c));\n}\n\n/** A .class.json schema-defined class document — `{ $prototype: \"Class\" }`. */\nexport function isClassDef(value: unknown): value is JxClassDef {\n return isJsonObject(value) && value.$prototype === \"Class\";\n}\n\n/** An element-shaped node object (vs. a bare string/number child). */\nexport function isNodeObject(value: unknown): value is JxMutableNode & JxElement {\n return isJsonObject(value);\n}\n\n/** A `${...}` template-expression string. */\nexport function isTemplateString(value?: unknown): value is string {\n return typeof value === \"string\" && value.includes(\"${\");\n}\n\n// ─── Style guards & accessors ───────────────────────────────────────────────────\n\n/** A nested style object (selector/media block), as opposed to a scalar CSS value. */\nexport function isNestedStyle(value: string | number | JxStyle | undefined): value is JxStyle {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Read a nested style block (`:hover`, `@--md`, `& > li`, …), if present. */\nexport function getNestedStyle(style: JxStyle | undefined, key: string): JxStyle | undefined {\n const value = style?.[key];\n return isNestedStyle(value) ? value : undefined;\n}\n\n/** Read a nested style block, creating an empty one in place when absent or scalar. */\nexport function ensureNestedStyle(style: JxStyle, key: string): JxStyle {\n const existing = style[key];\n if (isNestedStyle(existing)) {\n return existing;\n }\n const created: JxStyle = {};\n style[key] = created;\n return created;\n}\n\n// ─── Event binding guards ───────────────────────────────────────────────────────\n\n/**\n * The value of an `on*` document key: a `$ref`, an inline function declaration, or a declarative\n * expression.\n */\nexport function isEventBinding(value: unknown): value is JxEventBinding {\n return isRef(value) || isFunctionDef(value) || isExpressionDef(value);\n}\n\n/** Read the event binding stored under an `on*` key of a node, if there is one. */\nexport function getEventBinding(\n node: JxMutableNode | JxElement,\n key: string,\n): JxEventBinding | undefined {\n const value = node[key];\n return isEventBinding(value) ? value : undefined;\n}\n\n// ─── Parameter helpers ──────────────────────────────────────────────────────────\n\n/** Resolve `parameters` entries (bare strings or CEM objects) to their names. */\nexport function paramNames(parameters: JxFunctionDef[\"parameters\"]): string[] {\n if (!parameters) {\n return [];\n }\n return parameters.map((p) => (typeof p === \"string\" ? p : p.name));\n}\n",
10
- "/// <reference lib=\"dom\" />\n/**\n * Jx — JSON-native reactive web component runtime\n * @version 3.0.0\n * @license MIT\n *\n * Four-step pipeline:\n * 1. resolve — fetch JSON source (or accept raw object)\n * 2. buildScope — state detection + reactive proxy construction\n * 3. render — walk resolved tree, build DOM, wire reactive effects\n * 4. output — append to target\n *\n * @module jx\n */\n\nimport {\n computed,\n effect,\n effectScope,\n isRef,\n onEffectCleanup,\n reactive,\n ref,\n} from \"@vue/reactivity\";\nimport { evaluateExpression, isMutating } from \"./expression.ts\";\nimport type { DynamicClass, JxEventHandler, JxPath, JxRenderOptions, JxScope } from \"./types.ts\";\nimport {\n isExpressionDef,\n isFunctionDef,\n isJsonObject,\n isMappedArray,\n isPrototypeDef,\n isRef as isRefValue,\n isServerFnDef,\n paramNames,\n} from \"@jxsuite/schema/guards\";\nimport type {\n JxAttributeValue,\n JxClassDef,\n JxDocument,\n JxElement,\n JxFunctionDef,\n JxHeadEntry,\n JxMappedArray,\n JxPrototypeDef,\n JxRef,\n JxServerFnDef,\n JxStyle,\n} from \"@jxsuite/schema/types\";\nimport type { Ref } from \"@vue/reactivity\";\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Mount a Jx document into a DOM container.\n *\n * @example\n * import { Jx } from \"@jxsuite/runtime\";\n * const state = await Jx(\"./counter.json\", document.getElementById(\"app\"));\n *\n * @param {string | JxDocument} source - Path to .json file, URL, or raw document object\n * @param {HTMLElement} [target] Default is `document.body`\n * @param {JxRenderOptions} [options]\n * @returns {Promise<JxScope>} Resolves with the live component scope (state reactive\n * proxy)\n */\nexport async function Jx(\n source: string | JxDocument,\n target: HTMLElement = document.body,\n options?: JxRenderOptions,\n) {\n const base = typeof source === \"string\" ? new URL(source, location.href).href : location.href;\n const doc = await resolve(source);\n\n // Register custom elements declared in $elements (depth-first)\n if (doc.$elements) {\n await registerElements(doc.$elements, base);\n }\n\n // Inject <head> elements declared in $head (link, meta, script, etc.)\n if (doc.$head) {\n injectHead(doc.$head, base);\n }\n\n if (doc.$media) {\n _rootMedia = doc.$media;\n }\n\n const state = await buildScope(doc, {}, base);\n target.append(renderNode(doc, state, options));\n if (typeof state.onMount === \"function\") {\n (state.onMount as (s: JxScope) => unknown)(state);\n }\n return state;\n}\n\n// ─── Step 1: Resolve ──────────────────────────────────────────────────────────\n\nconst _resolveCache = new Map<string, Promise<JxDocument>>();\n\nexport async function resolve(source: string | JxDocument): Promise<JxDocument> {\n if (typeof source !== \"string\") {\n return source;\n }\n if (_resolveCache.has(source)) {\n return _resolveCache.get(source)!;\n }\n const p = fetch(source).then((res) => {\n if (!res.ok) {\n throw new Error(`Jx: failed to fetch ${source} (${res.status})`);\n }\n // Trust boundary: fetched sources are Jx documents by contract.\n return res.json() as Promise<JxDocument>;\n });\n _resolveCache.set(source, p);\n return p;\n}\n\n// ─── Step 2: Build scope ──────────────────────────────────────────────────────\n\n/** JSON Schema keywords used to identify pure type definitions (Shape 2b). */\nconst SCHEMA_KEYWORDS = new Set([\n \"type\",\n \"properties\",\n \"items\",\n \"enum\",\n \"minimum\",\n \"maximum\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"required\",\n \"examples\",\n]);\n\n/** /** @type {{ skip: boolean }} */\nconst _serverFnConfig = { skip: false };\n/** Set to true to suppress timing: \"server\" resolution (used by Studio edit mode). */\nexport function setSkipServerFunctions(v: boolean) {\n _serverFnConfig.skip = v;\n}\n\n// ─── Dev-proxy auth token (Studio cross-origin canvas) ────────────────────────\n// The Studio canvas iframe is served from a token-gated loopback origin (createProjectServer): its\n// POST /__jx_resolve__ + /__jx_server__ routes 403 without ?token=<rpcToken>. The iframe boot reads\n// The token from its URL and calls setResolveToken so these dev-proxy fetches authenticate. Unset by\n// Default, leaving production + same-origin dev untouched (bare path, no query appended).\nlet _resolveToken: string | null = null;\nexport function setResolveToken(token: string | null) {\n _resolveToken = token || null;\n}\n/** Append the dev-proxy auth token to a privileged resolve path when one is configured. */\nfunction resolveProxyPath(path: string): string {\n return _resolveToken ? `${path}?token=${encodeURIComponent(_resolveToken)}` : path;\n}\n\n/** @deprecated No longer needed — ContentCollection/ContentEntry resolve via generic class path */\nexport function setSkipContentResolution(_v: boolean) {\n // No-op retained for API compatibility\n}\n\n/**\n * Observe runtime-created reactive values: runs `fn` immediately inside a reactive effect and\n * re-runs it whenever a tracked value changes; returns a disposer. Dep tracking in @vue/reactivity\n * is per module INSTANCE, so an effect created from another copy of the package (e.g. the studio's\n * own pin) can never track a ref/reactive created here — consumers that want to observe\n * runtime-resolved scope values (the Studio canvas iframe's dataScope re-post) must use this.\n *\n * @param {() => void} fn - Read the reactive values to observe inside this callback.\n * @returns {() => void} Disposer — stops the effect and its scope.\n */\nexport function observeScope(fn: () => void): () => void {\n const scope = effectScope(true);\n scope.run(() => {\n effect(fn);\n });\n return () => scope.stop();\n}\n\n/**\n * Run `fn` inside a detached reactive scope of THIS module's reactivity instance, returning its\n * result plus a disposer that stops every effect `fn` created. Callers that render via\n * {@link renderNode} and later tear the render down (the Studio canvas full render and its surgical\n * subtree re-renders) MUST use this instead of their own effectScope: scope collection is per\n * vue-reactivity module instance, so a scope from another copy of the package collects NOTHING and\n * its stop() silently leaks every binding effect of the superseded render.\n *\n * @param {() => T} fn - Work that may create reactive effects (typically a renderNode call).\n * @returns {{ result: T; stop: () => void }} The callback result and the scope disposer.\n */\nexport function runScoped<T>(fn: () => T): { result: T; stop: () => void } {\n const scope = effectScope(true);\n try {\n const result = scope.run(fn) as T;\n return { result, stop: () => scope.stop() };\n } catch (error) {\n // A throwing fn would otherwise leak the effects it created before failing.\n scope.stop();\n throw error;\n }\n}\n\n/**\n * Studio-canvas viewport-unit transpose. The canvas iframe is sized to its document's height, so\n * any viewport unit (`vh`/`vw`/`vmin`/`vmax`/`svh`/…) — which resolves against the iframe ELEMENT —\n * would feed back into an ever-growing height. When this is on, the runtime transposes them to\n * CONTAINER units (`cqh`/`cqw`/…) that resolve against the canvas's fixed-size query container (see\n * `canvas.html`): a predictable, feedback-free stand-in for the viewport. Off (the default) leaves\n * CSS untouched for real production rendering.\n */\nlet _canvasViewportTranspose = false;\nexport function setCanvasViewportTranspose(on: boolean) {\n _canvasViewportTranspose = on;\n}\n\nconst VIEWPORT_UNIT_RE = /(-?\\d*\\.?\\d+)(?:s|l|d)?v(h|w|min|max|i|b)\\b/gi;\nconst VIEWPORT_UNIT_MAP: Record<string, string> = {\n b: \"cqb\",\n h: \"cqh\",\n i: \"cqi\",\n max: \"cqmax\",\n min: \"cqmin\",\n w: \"cqw\",\n};\n\n/**\n * Transpose CSS viewport units → container-query units in a value string, but only when the\n * studio-canvas flag is set (otherwise the value is returned untouched). `100vh` → `100cqh`,\n * `50svw` → `50cqw`, `10vmin` → `10cqmin`, etc.\n */\nexport function transposeCanvasUnits(value: string): string {\n if (!_canvasViewportTranspose || !value.includes(\"v\")) {\n return value;\n }\n return value.replace(\n VIEWPORT_UNIT_RE,\n (_m, num: string, dim: string) => `${num}${VIEWPORT_UNIT_MAP[dim.toLowerCase()] ?? `cq${dim}`}`,\n );\n}\n\n/**\n * Studio-canvas anchor de-linking. In the editor canvas a rendered `<a href>` would navigate the\n * iframe when clicked, fighting element selection. When this is on, the runtime stamps the value on\n * `data-jx-href` instead of `href` so the anchor is inert (selectable, not a live link) while the\n * original target stays recoverable for richer link handling later. Off (the default) leaves\n * production rendering untouched; the studio sets it for design/edit (not preview — see\n * iframe-render).\n */\nlet _canvasDelinkAnchors = false;\nexport function setCanvasDelinkAnchors(on: boolean) {\n _canvasDelinkAnchors = on;\n}\n\n/** The attribute name to stamp `key` on `el` under — `href` → `data-jx-href` on de-linked anchors. */\nfunction canvasAttrName(el: HTMLElement, key: string): string {\n if (_canvasDelinkAnchors && key === \"href\" && (el.tagName === \"A\" || el.tagName === \"AREA\")) {\n return \"data-jx-href\";\n }\n return key;\n}\n\n/**\n * Build the reactive scope (state) from the document using the five-shape detection algorithm.\n *\n * @param {JxDocument} doc\n * @param {JxScope} [parentScope] Default is `{}`\n * @param {string} [base] Base URL for resolving $src imports. Default is `location.href`\n * @returns {Promise<JxScope>} Reactive proxy (state)\n */\nexport async function buildScope(\n doc: JxDocument,\n parentScope: JxScope = {},\n base: string = location.href,\n) {\n const raw: JxScope = {};\n\n // Merge parent scope properties\n for (const [key, val] of Object.entries(parentScope)) {\n raw[key] = val;\n }\n\n const defs = doc.state ?? {};\n\n // Pass 0: resolve bare $prototype names via import map\n const imports = doc.imports ?? {};\n for (const [, def] of Object.entries(defs)) {\n if (isPrototypeDef(def) && !def.$src) {\n const mapped = imports[def.$prototype];\n if (mapped) {\n if (!mapped.endsWith(\".class.json\")) {\n console.warn(\n `Jx: import \"${def.$prototype}\" must map to a .class.json path, got \"${mapped}\"`,\n );\n continue;\n }\n def.$src = mapped;\n }\n }\n }\n\n // First pass: collect naked values, expanded defaults, plain objects\n for (const [key, def] of Object.entries(defs)) {\n // 1. String value\n if (typeof def === \"string\") {\n if (!def.includes(\"${\")) {\n raw[key] = def;\n } // Shape 1: naked string\n continue; // Template strings handled in second pass\n }\n\n // 2. Number, boolean, null\n if (typeof def === \"number\" || typeof def === \"boolean\" || def === null) {\n raw[key] = def;\n continue;\n }\n\n // 3. Array\n if (Array.isArray(def)) {\n raw[key] = def;\n continue;\n }\n\n // 4. Object\n if (typeof def === \"object\") {\n if (def.$prototype) {\n continue;\n } // Handled in later passes\n if (isExpressionDef(def)) {\n continue;\n } // Handled in pass 2.5\n if (isServerFnDef(def)) {\n continue;\n } // Handled in fifth pass\n if (\"default\" in def) {\n raw[key] = def.default;\n continue;\n } // Shape 2: expanded signal\n if (hasSchemaKeywords(def)) {\n continue;\n } // Shape 2b: pure type def\n raw[key] = def; // Shape 1: plain object\n }\n }\n\n // Wrap in Vue reactive proxy — deep reactivity from this point on\n const state = reactive(raw);\n\n // Second pass: template strings → computed\n for (const [key, def] of Object.entries(defs)) {\n if (typeof def === \"string\" && def.includes(\"${\")) {\n state[key] = computed(() => evaluateTemplate(def, state));\n }\n }\n\n // Pass 2.5: $expression entries (Shape 5)\n for (const [key, def] of Object.entries(defs)) {\n if (isExpressionDef(def)) {\n const node = def.$expression;\n if (isMutating(node.operator)) {\n const handler: JxEventHandler = (s, event) => evaluateExpression(node, s, event);\n state[key] = handler;\n } else {\n state[key] = computed(() => evaluateExpression(node, state, null));\n }\n }\n }\n\n // Third pass: $prototype: \"Function\" entries\n for (const [key, def] of Object.entries(defs)) {\n if (isFunctionDef(def)) {\n state[key] = await resolveFunction(def, state, key, base);\n }\n }\n\n // Fourth pass: other $prototype entries (Request, Set, Map, etc.)\n for (const [key, def] of Object.entries(defs)) {\n if (isPrototypeDef(def)) {\n state[key] = await resolvePrototype(def, state, key, base);\n }\n }\n\n // Fifth pass: timing: \"server\" entries (dev mode — execute client-side, boundary unenforced)\n if (!_serverFnConfig.skip) {\n for (const [key, def] of Object.entries(defs)) {\n if (isServerFnDef(def)) {\n state[key] = await resolveServerFunction(def, state, key, base);\n }\n }\n }\n\n if (doc.$media) {\n state[\"$media\"] = doc.$media;\n } else if (!state[\"$media\"] && Object.keys(_rootMedia).length > 0) {\n state[\"$media\"] = _rootMedia;\n }\n\n return state;\n}\n\n/**\n * Check whether an object contains any JSON Schema keywords. Used to discriminate Shape 2b (pure\n * type definition) from Shape 1 (naked object).\n *\n * @param {JxScope} obj\n * @returns {boolean}\n */\nfunction hasSchemaKeywords(obj: object) {\n for (const k of Object.keys(obj)) {\n if (SCHEMA_KEYWORDS.has(k)) {\n return true;\n }\n }\n return false;\n}\nexport { hasSchemaKeywords };\n\n/**\n * Evaluate a template string in the context of state and optional $map. Templates use\n * `state.varName` and `$map.item` syntax.\n *\n * @param {string} str\n * @param {JxScope} state\n * @returns {string}\n */\nfunction evaluateTemplate(str: string, state: JxScope): string {\n const $map = state?.$map as { item?: unknown; index?: number } | undefined;\n const fn = new Function(\"state\", \"$map\", \"item\", \"index\", `return \\`${str}\\``) as (\n state: JxScope,\n $map: unknown,\n item: unknown,\n index: number | undefined,\n ) => string;\n return fn(state, $map, $map?.item, $map?.index);\n}\n\n// ─── Step 2b: Function resolution (Shape 4) ─────────────────────────────────\n\n/** Shape of a dynamically imported module: named exports plus an optional default. */\ntype ImportedModule = Record<string, unknown> & { default?: Record<string, unknown> };\n\n/** Minimal contract an externally-imported resolver class may implement. */\ninterface ExternalClassInstance {\n value?: unknown;\n resolve?: () => unknown;\n subscribe?: (cb: (newVal: unknown) => void) => void;\n}\n\n/** Module cache for $src imports (shared with external class resolution). */\nconst _moduleCache = new Map<string, ImportedModule>();\n\n/**\n * Resolve a $prototype: \"Function\" entry into a function or computed.\n *\n * Functions receive state as their first parameter at call time. Functions with a return statement\n * in their body are wrapped in computed() for reactive evaluation.\n *\n * @param {JxFunctionDef} def - State entry with $prototype: \"Function\"\n * @param {JxScope} state - Reactive scope proxy\n * @param {string} key - Def key name\n * @param {string} [base] - Base URL for resolving $src imports\n * @returns {Promise<unknown>}\n */\nasync function resolveFunction(def: JxFunctionDef, state: JxScope, key: string, base?: string) {\n if (def.body && def.$src) {\n throw new Error(`Jx: '${key}' declares both body and $src — these are mutually exclusive`);\n }\n if (!def.body && !def.$src) {\n const params = resolveParamNames(def);\n const noop = new Function(...params, \"\");\n Object.defineProperty(noop, \"name\", {\n configurable: true,\n value: def.name ?? key,\n });\n return noop;\n }\n\n let fn: ((...args: unknown[]) => unknown) | undefined;\n\n if (def.body) {\n const params = resolveParamNames(def);\n fn = new Function(...params, def.body) as (...args: unknown[]) => unknown;\n Object.defineProperty(fn, \"name\", {\n configurable: true,\n value: def.name ?? key,\n });\n } else {\n // $src: dynamic import (the body/$src dichotomy was validated above)\n const src = def.$src;\n if (!src) {\n throw new Error(`Jx: '${key}' has neither body nor $src`);\n }\n const exportName = def.$export ?? key;\n let mod: ImportedModule;\n if (_moduleCache.has(src)) {\n mod = _moduleCache.get(src)!;\n } else {\n if (base) {\n const resolvedSrc = new URL(src, base).href;\n try {\n mod = (await import(resolvedSrc)) as ImportedModule;\n } catch {\n mod = (await import(src)) as ImportedModule;\n }\n } else {\n mod = (await import(src)) as ImportedModule;\n }\n _moduleCache.set(src, mod);\n }\n const candidate = mod[exportName] ?? mod.default?.[exportName];\n if (typeof candidate !== \"function\") {\n throw new TypeError(`Jx: export \"${exportName}\" not found or not a function in \"${src}\"`);\n }\n fn = candidate as (...args: unknown[]) => unknown;\n }\n\n // Detect computed: body contains a return statement, or $src function introspection.\n // Functions with parameters (event handlers, callbacks) are never computed.\n const hasParams = (def.parameters ?? def.arguments ?? []).length > 0;\n let isComputed = false;\n if (!hasParams) {\n if (def.body) {\n isComputed = /\\breturn\\b/.test(def.body);\n } else if (fn) {\n isComputed = fn.length <= 1 && /\\breturn\\b/.test(fn.toString());\n }\n }\n if (isComputed) {\n return computed(() => fn(state));\n }\n\n return fn;\n}\n\n// ─── Step 3: Render ───────────────────────────────────────────────────────────\n\n/**\n * Extract parameter names from a function definition. Supports both legacy \"arguments\" (string\n * array) and CEM-compatible \"parameters\" (object array). Always ensures \"state\" is the first\n * parameter.\n *\n * @param {JxFunctionDef | JxPrototypeDef} def\n * @returns {string[]}\n */\nfunction resolveParamNames(def: JxFunctionDef | JxPrototypeDef) {\n const names = def.parameters ? paramNames(def.parameters) : (def.arguments ?? []);\n return names.length > 0 && names[0] === \"state\" ? names : [\"state\", ...names];\n}\n\n/**\n * Reserved Jx keys — never set as DOM properties.\n *\n * @type {Set<string>}\n */\nexport const RESERVED_KEYS = new Set([\n \"$schema\",\n \"$id\",\n \"$defs\",\n \"state\",\n \"$ref\",\n \"$props\",\n \"$elements\",\n \"$title\",\n \"$description\",\n \"$switch\",\n \"$prototype\",\n \"$src\",\n \"$export\",\n \"$media\",\n \"$map\",\n \"timing\",\n \"default\",\n \"description\",\n \"body\",\n \"parameters\",\n \"arguments\",\n \"name\",\n \"tagName\",\n \"children\",\n \"style\",\n \"attributes\",\n \"items\",\n \"map\",\n \"filter\",\n \"sort\",\n \"cases\",\n \"observedAttributes\",\n]);\n\n/**\n * Recursively render a Jx element definition into a DOM element.\n *\n * @param {JxElement | string | number | boolean} def\n * @param {JxScope} state - Reactive scope proxy (or child scope via Object.create)\n * @param {JxRenderOptions} [options]\n * @returns {HTMLElement | Text}\n */\nexport function renderNode(\n def: JxElement | string | number | boolean,\n state: JxScope,\n options?: JxRenderOptions,\n): HTMLElement | Text {\n const path = options?._path ?? [];\n\n // Text node children: bare strings/numbers/booleans produce DOM Text nodes\n if (typeof def === \"string\" || typeof def === \"number\" || typeof def === \"boolean\") {\n const textNode = document.createTextNode(String(def));\n if (typeof def === \"string\" && isTemplateString(def)) {\n effect(() => {\n textNode.textContent = evaluateTemplate(def, state);\n });\n }\n return textNode;\n }\n\n // Extend scope with any $-prefixed local bindings declared on this node\n let localState: JxScope = state;\n for (const [key, val] of Object.entries(def)) {\n if (key.startsWith(\"$\") && !RESERVED_KEYS.has(key)) {\n if (localState === state) {\n localState = Object.create(state) as JxScope;\n }\n localState[key] = isRefObj(val) ? resolveRef(val.$ref, state) : val;\n }\n }\n\n // Custom element with $props: set JS properties on the element instance\n const tagName = def.tagName ?? \"div\";\n const isCustomEl = tagName.includes(\"-\") && customElements.get(tagName);\n\n if (def.$props && isCustomEl) {\n return renderCustomElementWithProps(def, localState, options, path);\n }\n\n if (def.$props) {\n const { $props: _$props, ...rest } = def;\n return renderNode(rest, mergeProps(def, localState), options);\n }\n if (def.$switch) {\n return renderSwitch(def, localState, options);\n }\n\n const el = document.createElement(tagName);\n\n if (options?.onNodeCreated) {\n options.onNodeCreated(el, path, def, localState);\n }\n\n applyProperties(el, def, localState);\n applyStyle(\n el,\n def.style ?? {},\n (localState[\"$media\"] as Record<string, string>) ?? {},\n localState,\n );\n applyAttributes(el, def.attributes ?? {}, localState);\n\n const kids = def.children;\n if (isMappedArray(kids)) {\n // Legacy whole-children repeater: the items render directly into `el` (which keeps its own\n // TagName, e.g. <ul>), with no extra wrapper element.\n const arrOpts = options ? { ...options, _path: [...path, \"children\"] } : undefined;\n renderMappedArrayInto(el, kids, localState, arrOpts);\n } else if (Array.isArray(kids)) {\n for (let i = 0; i < kids.length; i++) {\n const child = kids[i]!;\n const childOpts = options ? { ...options, _path: [...path, \"children\", i] } : undefined;\n if (isMappedArray(child)) {\n // Array pseudo-element among siblings: expand inline, no wrapper.\n renderMappedArrayInto(el, child, localState, childOpts);\n } else {\n el.append(renderNode(child, localState, childOpts));\n }\n }\n }\n\n return el;\n}\n\n// ─── Template string utilities ────────────────────────────────────────────────\n\n/**\n * Check if a value is a template string (contains ${}).\n *\n * @param {unknown} val\n * @returns {boolean}\n */\nfunction isTemplateString(val: unknown): val is string {\n return typeof val === \"string\" && val.includes(\"${\");\n}\n\n// ─── Property / style / attribute application ─────────────────────────────────\n\n/**\n * @param {HTMLElement} el\n * @param {JxElement} def\n * @param {JxScope} state\n */\nfunction applyProperties(el: HTMLElement, def: JxElement, state: JxScope) {\n for (const [key, val] of Object.entries(def)) {\n if (RESERVED_KEYS.has(key)) {\n continue;\n }\n if (key.startsWith(\"$\")) {\n continue;\n } // Scope bindings — handled in renderNode\n\n if (key.startsWith(\"on\")) {\n // Event handler: $ref to a function\n if (isRefObj(val)) {\n const handler = resolveRef(val.$ref, state);\n if (typeof handler === \"function\") {\n const scope = state;\n const handlerFn = handler as (s: JxScope, e: Event) => unknown;\n el.addEventListener(key.slice(2), (e) => handlerFn(scope, e));\n }\n continue;\n }\n // Event handler: inline $prototype: \"Function\"\n if (isFunctionDef(val) && val.body) {\n const params = resolveParamNames(val);\n const fn = new Function(...params, val.body) as (s: JxScope, e: Event) => unknown;\n const scope = state;\n el.addEventListener(key.slice(2), (e) => fn(scope, e));\n continue;\n }\n // Event handler: inline $expression\n if (isExpressionDef(val)) {\n const node = val.$expression;\n const scope = state;\n el.addEventListener(key.slice(2), (e) => evaluateExpression(node, scope, e));\n continue;\n }\n }\n\n bindProperty(el, key, val, state);\n }\n}\n\n/**\n * @param {HTMLElement} el\n * @param {string} key\n * @param {unknown} val\n * @param {JxScope} state\n */\nfunction bindProperty(el: HTMLElement, key: string, val: unknown, state: JxScope) {\n const target = el as unknown as Record<string, unknown>;\n if (isRefObj(val)) {\n const refVal = val as { $ref: string };\n if (key === \"id\") {\n target[key] = resolveRef(refVal.$ref, state) as string;\n return;\n }\n effect(() => {\n target[key] = resolveRef(refVal.$ref, state);\n });\n return;\n }\n\n // Universal ${} reactivity — template strings in element properties\n if (isTemplateString(val)) {\n effect(() => {\n target[key] = evaluateTemplate(val as string, state);\n });\n return;\n }\n\n target[key] = val;\n}\n\n/**\n * Apply inline styles and emit a scoped <style> block for nested CSS selectors and @custom-media\n * breakpoint rules.\n *\n * @param {HTMLElement} el\n * @param {JxStyle} styleDef\n * @param {Record<string, string>} [mediaQueries] Named breakpoints from root $media. Default is\n * `{}`\n * @param {JxScope} [state] Component scope for template string evaluation. Default is `{}`\n */\nexport function applyStyle(\n el: HTMLElement,\n styleDef: JxStyle,\n mediaQueries: Record<string, string> = {},\n state: JxScope = {},\n) {\n const nested: Record<string, JxStyle> = {};\n const media: Record<string, JxStyle> = {};\n const baseDecls: Record<string, string> = {};\n\n // Collect properties overridden by media queries so we can avoid inline styles for them\n const mediaOverriddenProps = new Set<string>();\n for (const [prop, val] of Object.entries(styleDef)) {\n if (prop.startsWith(\"@\") && val && typeof val === \"object\") {\n for (const k of Object.keys(val)) {\n if (\n !k.startsWith(\":\") &&\n !k.startsWith(\".\") &&\n !k.startsWith(\"&\") &&\n !k.startsWith(\"[\") &&\n !k.startsWith(\"@\")\n ) {\n mediaOverriddenProps.add(k);\n }\n }\n }\n }\n\n for (const [prop, val] of Object.entries(styleDef)) {\n if (val !== null && typeof val === \"object\" && !Array.isArray(val)) {\n if (prop.startsWith(\"@\")) {\n media[prop] = val;\n } else {\n nested[prop] = val;\n }\n continue;\n }\n if (prop.startsWith(\"@\") || isNestedSelector(prop)) {\n // Scalar under a selector/media key — invalid style shape, drop it.\n continue;\n }\n if (val === undefined) {\n continue;\n }\n const scalar = String(val);\n if (prop.startsWith(\"--\")) {\n if (isTemplateString(val)) {\n effect(() => {\n el.style.setProperty(prop, transposeCanvasUnits(evaluateTemplate(val, state)));\n });\n } else {\n el.style.setProperty(prop, transposeCanvasUnits(scalar));\n }\n } else if (isTemplateString(val)) {\n effect(() => {\n (el.style as unknown as Record<string, string>)[prop] = transposeCanvasUnits(\n evaluateTemplate(val, state),\n );\n });\n } else if (mediaOverriddenProps.has(prop)) {\n // Goes through toCSSText (which transposes) — don't double-transpose here.\n baseDecls[prop] = scalar;\n } else {\n (el.style as unknown as Record<string, string>)[prop] = transposeCanvasUnits(scalar);\n }\n }\n\n const hasNested = Object.keys(nested).length > 0;\n const hasMedia = Object.keys(media).length > 0;\n const hasBaseDecls = Object.keys(baseDecls).length > 0;\n if (!hasNested && !hasMedia && !hasBaseDecls) {\n return;\n }\n\n const uid = `jx-${Math.random().toString(36).slice(2, 7)}`;\n el.dataset.jx = uid;\n\n let css = \"\";\n const baseCSS = toCSSText(baseDecls);\n if (baseCSS) {\n css += `[data-jx=\"${uid}\"] { ${baseCSS} }\\n`;\n }\n\n function emitNested(scope: string, rules: JxStyle) {\n const props = toCSSText(rules);\n if (props) {\n css += `${scope} { ${props} }\\n`;\n }\n for (const [sel, sub] of Object.entries(rules)) {\n if (sub === null || typeof sub !== \"object\" || Array.isArray(sub)) {\n continue;\n }\n if (sel.startsWith(\"@\")) {\n continue;\n }\n const resolved = sel.startsWith(\"&\")\n ? sel.replace(\"&\", scope)\n : sel.startsWith(\"[\")\n ? `${scope}${sel}`\n : sel.startsWith(\":\") || sel.startsWith(\".\")\n ? `${scope}${sel}`\n : `${scope} ${sel}`;\n emitNested(resolved, sub);\n }\n }\n\n for (const [sel, rules] of Object.entries(nested)) {\n const resolved = sel.startsWith(\"&\")\n ? sel.replace(\"&\", `[data-jx=\"${uid}\"]`)\n : sel.startsWith(\"[\")\n ? `[data-jx=\"${uid}\"]${sel}`\n : sel.startsWith(\":\") || sel.startsWith(\".\")\n ? `[data-jx=\"${uid}\"]${sel}`\n : `[data-jx=\"${uid}\"] ${sel}`;\n emitNested(resolved, rules);\n }\n\n function emitMediaNested(atRule: string, parentSel: string, obj: JxStyle) {\n for (const [sel, sub] of Object.entries(obj)) {\n if (sub === null || typeof sub !== \"object\" || Array.isArray(sub)) {\n continue;\n }\n if (sel.startsWith(\"@\")) {\n continue;\n }\n const resolved = sel.startsWith(\"&\")\n ? sel.replace(\"&\", parentSel)\n : sel.startsWith(\"[\")\n ? `${parentSel}${sel}`\n : sel.startsWith(\":\") || sel.startsWith(\".\")\n ? `${parentSel}${sel}`\n : `${parentSel} ${sel}`;\n const props = toCSSText(sub);\n if (props) {\n css += `${atRule} { ${resolved} { ${props} } }\\n`;\n }\n emitMediaNested(atRule, resolved, sub);\n }\n }\n\n for (const [key, rules] of Object.entries(media)) {\n if (key === \"@--\") {\n continue;\n } // Base canvas width, not a real media query\n const atRule = key.startsWith(\"@--\")\n ? `@media ${mediaQueries[key.slice(1)] ?? key.slice(1)}`\n : key.startsWith(\"@(\")\n ? `@media ${key.slice(1)}`\n : key;\n const scope = `[data-jx=\"${uid}\"]`;\n css += `${atRule} { ${scope} { ${toCSSText(rules)} } }\\n`;\n emitMediaNested(atRule, scope, rules);\n }\n\n const tag = document.createElement(\"style\");\n tag.textContent = css;\n tag.dataset.jxOwner = uid;\n document.head.append(tag);\n elementStyleTags.set(el, tag);\n}\n\n/**\n * Scoped <style> tags emitted per element by applyStyle (latest wins). Lets callers replace an\n * element's emitted styles instead of accumulating orphaned tags.\n */\nexport const elementStyleTags = new WeakMap<HTMLElement, HTMLStyleElement>();\n\n/**\n * Re-apply an element's style definition in place: removes the previously emitted scoped <style>\n * tag (if any), clears inline styles, and applies the new definition.\n *\n * @param {HTMLElement} el\n * @param {JxStyle | undefined} styleDef\n * @param {Record<string, string>} [mediaQueries]\n * @param {JxScope} [state]\n */\nexport function reapplyStyle(\n el: HTMLElement,\n styleDef: JxStyle | undefined,\n mediaQueries: Record<string, string> = {},\n state: JxScope = {},\n) {\n const prev = elementStyleTags.get(el);\n if (prev) {\n prev.remove();\n elementStyleTags.delete(el);\n }\n el.style.cssText = \"\";\n delete el.dataset.jx;\n applyStyle(el, styleDef ?? {}, mediaQueries, state);\n}\n\n/**\n * @param {HTMLElement} el\n * @param {Record<string, import(\"@jxsuite/schema/types\").JxAttributeValue>} attrs\n * @param {JxScope} state\n */\nfunction applyAttributes(el: HTMLElement, attrs: Record<string, JxAttributeValue>, state: JxScope) {\n for (const [k, v] of Object.entries(attrs)) {\n const attr = canvasAttrName(el, k);\n if (isRefObj(v)) {\n effect(() => el.setAttribute(attr, String(resolveRef(v.$ref, state) ?? \"\")));\n } else if (isTemplateString(v)) {\n effect(() => el.setAttribute(attr, String(evaluateTemplate(v, state))));\n } else {\n el.setAttribute(attr, String(v));\n }\n }\n}\n\n// ─── Array mapping ────────────────────────────────────────────────────────────\n\n/**\n * Render a mapped array (repeater) wrapper-less: its item instances are inserted directly into\n * `parentEl`, in place, ahead of an anchor comment that marks the array's position among the\n * parent's other children. Re-renders reactively when `items` (or the filter/sort sources) change;\n * each generation's item renders live in their own detached effect scope so nested arrays and\n * template bindings are disposed — not leaked or double-fired — on the next change.\n *\n * `options._path` is the array node's own document path (`[…, \"children\", i]`, or `[…, \"children\"]`\n * for a legacy whole-children repeater); item instances render at `[…that…, \"map\", index]`.\n *\n * @param {HTMLElement} parentEl\n * @param {import(\"@jxsuite/schema/types\").JxMappedArray} arrayDef\n * @param {JxScope} state\n * @param {JxRenderOptions} [options]\n */\nfunction renderMappedArrayInto(\n parentEl: HTMLElement,\n arrayDef: JxMappedArray,\n state: JxScope,\n options?: JxRenderOptions,\n) {\n const path = options?._path ?? [];\n const anchor = document.createComment(\"jx-array\");\n parentEl.append(anchor);\n const { items: itemsSrc, map: mapDef, filter: filterRef, sort: sortRef } = arrayDef;\n\n effect(() => {\n let items: unknown = isRefObj(itemsSrc) ? resolveRef(itemsSrc.$ref, state) : itemsSrc;\n if (Array.isArray(items) && isRefObj(filterRef)) {\n const fn = resolveRef(filterRef.$ref, state);\n if (typeof fn === \"function\") {\n items = items.filter(fn as (v: unknown) => boolean);\n }\n }\n if (Array.isArray(items) && isRefObj(sortRef)) {\n const fn = resolveRef(sortRef.$ref, state);\n if (typeof fn === \"function\") {\n items = [...(items as unknown[])].toSorted(fn as (a: unknown, b: unknown) => number);\n }\n }\n if (!Array.isArray(items) || !mapDef) {\n return;\n }\n\n // Render this generation's items inside a detached scope; the cleanup (run before the next\n // Re-render and when the enclosing render scope stops) tears it down and removes its nodes.\n const scope = effectScope(true);\n const nodes: ChildNode[] = [];\n scope.run(() => {\n for (const [index, item] of (items as unknown[]).entries()) {\n const child = Object.create(state) as JxScope;\n child.$map = { index, item };\n child[\"$map/item\"] = item;\n child[\"$map/index\"] = index;\n const childOpts = options ? { ...options, _path: [...path, \"map\", index] } : undefined;\n const node = renderNode(mapDef, child, childOpts);\n anchor.before(node);\n nodes.push(node);\n }\n });\n onEffectCleanup(() => {\n scope.stop();\n for (const n of nodes) {\n n.remove();\n }\n });\n });\n}\n\n// ─── $switch ──────────────────────────────────────────────────────────────────\n\n/**\n * @param {JxElement} def\n * @param {JxScope} state\n * @param {JxRenderOptions} [options]\n * @returns {HTMLElement}\n */\nfunction renderSwitch(def: JxElement, state: JxScope, options?: JxRenderOptions) {\n const path = options?._path ?? [];\n const container = document.createElement(def.tagName ?? \"div\");\n\n if (options?.onNodeCreated) {\n options.onNodeCreated(container, path, def, state);\n }\n\n applyProperties(container, def, state);\n applyStyle(container, def.style ?? {}, (state[\"$media\"] as Record<string, string>) ?? {}, state);\n applyAttributes(container, def.attributes ?? {}, state);\n let generation = 0;\n\n effect(() => {\n container.innerHTML = \"\";\n if (!isRefObj(def.$switch)) {\n return;\n }\n const key = resolveRef(def.$switch.$ref, state) as string;\n const caseDef = def.cases?.[key];\n if (!caseDef) {\n return;\n }\n\n if (isRefObj(caseDef)) {\n // External $ref — fetch and render asynchronously\n const gen = (generation += 1);\n const { href } = new URL(caseDef.$ref, location.href);\n resolve(href)\n .then(async (doc) => {\n if (gen !== generation) {\n return;\n }\n const childScope = await buildScope(doc, {}, href);\n if (gen !== generation) {\n return;\n }\n container.innerHTML = \"\";\n const childOpts = options ? { ...options, _path: [...path, \"cases\", key] } : undefined;\n container.append(renderNode(doc, childScope, childOpts));\n })\n .catch((error: unknown) =>\n console.error(\"Jx $switch: failed to load external case\", caseDef.$ref, error),\n );\n return;\n }\n\n const childOpts = options ? { ...options, _path: [...path, \"cases\", key] } : undefined;\n container.append(renderNode(caseDef, state, childOpts));\n });\n\n return container;\n}\n\n// ─── Prototype namespaces (Shape 5) ──────────────────────────────────────────\n\n/**\n * Resolve a $prototype definition into a value for the reactive scope.\n *\n * Returns a ref() for async/persistent entries (Request, Storage, Cookie, IndexedDB), or a plain\n * value for simple entries (Set, Map, FormData, Blob).\n *\n * @param {JxPrototypeDef} def - State entry with $prototype\n * @param {JxScope} state - Reactive scope proxy\n * @param {string} key - Def key (for diagnostics)\n * @param {string} [base] - Base URL for resolving $src imports\n * @returns {Promise<unknown>}\n */\nexport async function resolvePrototype(\n def: JxPrototypeDef,\n state: JxScope,\n key: string,\n base?: string,\n) {\n // ── External class via $src ─────────────────────────────────────────────────\n if (def.$src) {\n return resolveExternalPrototype(def, state, key, base);\n }\n\n switch (def.$prototype) {\n case \"Request\": {\n const s: Ref<unknown> = ref(null);\n const debounceMs = def.debounce ?? 0;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n if (!def.manual) {\n effect(() => {\n let url: string | undefined;\n if (isTemplateString(def.url)) {\n url = evaluateTemplate(def.url, state);\n } else {\n ({ url } = def);\n }\n if (!url || url === \"undefined\" || url.includes(\"undefined\")) {\n return;\n }\n\n const controller = new AbortController();\n onEffectCleanup(() => {\n controller.abort();\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n });\n\n const doFetch = () =>\n fetch(url, {\n method: def.method ?? \"GET\",\n signal: controller.signal,\n ...(def.headers && { headers: def.headers }),\n ...(def.body && {\n body: typeof def.body === \"object\" ? JSON.stringify(def.body) : def.body,\n }),\n })\n .then((r) => (r.ok ? r.json() : Promise.reject(r.statusText)))\n .then((d) => {\n s.value = d;\n })\n .catch((error: unknown) => {\n if (!(error instanceof Error && error.name === \"AbortError\")) {\n s.value = { error: String(error) };\n }\n });\n\n if (debounceMs > 0) {\n debounceTimer = setTimeout(doFetch, debounceMs);\n } else {\n void doFetch();\n }\n });\n }\n\n return s;\n }\n\n case \"URLSearchParams\": {\n return computed(() => {\n const p: Record<string, string> = {};\n for (const [k, v] of Object.entries(def)) {\n if (k !== \"$prototype\") {\n p[k] = (\n isRefObj(v)\n ? resolveRef(v.$ref, state)\n : isTemplateString(v)\n ? evaluateTemplate(v, state)\n : v\n ) as string;\n }\n }\n return new URLSearchParams(p).toString();\n });\n }\n\n case \"LocalStorage\":\n case \"SessionStorage\": {\n const store = def.$prototype === \"LocalStorage\" ? localStorage : sessionStorage;\n const k = def.key ?? key;\n let init: unknown;\n try {\n const s = store.getItem(k);\n init = s !== null ? (JSON.parse(s) as unknown) : (def.default ?? null);\n } catch {\n init = def.default ?? null;\n }\n const storageState: Ref<unknown> = ref(init);\n // Persist on change\n effect(() => {\n const v = storageState.value;\n if (v === null) {\n try {\n store.removeItem(k);\n } catch {}\n } else {\n try {\n store.setItem(k, JSON.stringify(v));\n } catch {}\n }\n });\n return storageState;\n }\n\n case \"Cookie\": {\n const name = def.name ?? key;\n const read = () => {\n const m = document.cookie.match(new RegExp(`(?:^|; )${name}=([^;]*)`));\n if (!m) {\n return null;\n }\n try {\n return JSON.parse(decodeURIComponent(m[1]!));\n } catch {\n return m[1];\n }\n };\n const cookieState: Ref<unknown> = ref(read() ?? def.default ?? null);\n // Persist on change\n effect(() => {\n const v = cookieState.value;\n let s = `${name}=${encodeURIComponent(JSON.stringify(v))}`;\n if (def.maxAge !== undefined) {\n s += `; Max-Age=${def.maxAge}`;\n }\n if (def.path) {\n s += `; Path=${def.path}`;\n }\n if (def.domain) {\n s += `; Domain=${def.domain}`;\n }\n if (def.secure) {\n s += `; Secure`;\n }\n if (def.sameSite) {\n s += `; SameSite=${def.sameSite}`;\n }\n // oxlint-disable-next-line unicorn/no-document-cookie -- the Cookie $prototype IS the cookie store binding\n document.cookie = s;\n });\n return cookieState;\n }\n\n case \"IndexedDB\": {\n const idbState: Ref<unknown> = ref(null);\n const {\n database,\n store,\n version = 1,\n keyPath = \"id\",\n autoIncrement = true,\n indexes = [],\n } = def;\n if (!database || !store) {\n throw new Error(`Jx: IndexedDB entry '${key}' requires database and store`);\n }\n const req = indexedDB.open(database, version);\n req.addEventListener(\"upgradeneeded\", (e) => {\n const db: IDBDatabase = (e.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(store)) {\n const os = db.createObjectStore(store, { autoIncrement, keyPath });\n for (const i of indexes) {\n os.createIndex(i.name, i.keyPath, { unique: i.unique ?? false });\n }\n }\n });\n req.addEventListener(\"success\", (e) => {\n const db: IDBDatabase = (e.target as IDBOpenDBRequest).result;\n idbState.value = {\n database,\n getStore: (mode: IDBTransactionMode = \"readwrite\") =>\n Promise.resolve(db.transaction(store, mode).objectStore(store)),\n isReady: true,\n store,\n version,\n };\n });\n req.addEventListener(\"error\", () => {\n idbState.value = { error: req.error?.message };\n });\n return idbState;\n }\n\n case \"Set\": {\n return new Set(Array.isArray(def.default) ? def.default : []);\n }\n\n case \"Map\": {\n return new Map(Object.entries(isJsonObject(def.default) ? def.default : {}));\n }\n\n case \"FormData\": {\n const fd = new FormData();\n for (const [k, v] of Object.entries(def.fields ?? {})) {\n fd.append(k, v as string);\n }\n return fd;\n }\n\n case \"Blob\": {\n return new Blob((def.parts as BlobPart[]) ?? [], {\n type: typeof def.type === \"string\" ? def.type : \"text/plain\",\n });\n }\n\n case \"ReadableStream\": {\n return null;\n }\n\n default: {\n console.warn(\n `Jx: unknown $prototype \"${def.$prototype}\" for \"${key}\". Did you mean to add '$src'?`,\n );\n return ref(null);\n }\n }\n}\n\n// ─── External class resolution ────────────────────────────────────────────────\n\n/** Reserved keys stripped from the config object passed to external class constructors. */\nconst EXTERNAL_RESERVED = new Set([\n \"$prototype\",\n \"$src\",\n \"$export\",\n \"timing\",\n \"default\",\n \"description\",\n \"body\",\n \"parameters\",\n \"arguments\",\n \"name\",\n]);\n\n/**\n * Resolve an external class prototype via $src.\n *\n * @param {JxPrototypeDef} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveExternalPrototype(\n def: JxPrototypeDef,\n state: JxScope,\n key: string,\n base?: string,\n) {\n const src = def.$src;\n\n // Non-Function $prototype must use .class.json as entrypoint\n if (!src || !src.endsWith(\".class.json\")) {\n throw new Error(\n `Jx: $prototype \"${def.$prototype}\" requires a .class.json $src, got \"${src}\". ` +\n `Wrap the class in a .class.json schema with $implementation.`,\n );\n }\n\n return resolveClassJson(def, state, key, base);\n}\n\n/**\n * Import a JS module and instantiate a class from it. Internal helper used by resolveClassJson for\n * $implementation.\n *\n * @param {JxScope} def - Original state entry (for config extraction)\n * @param {string} src - JS module URL to import\n * @param {string} exportName - Export name to look up\n * @param {string} [base] - Base URL for resolution\n * @returns {Promise<unknown>}\n */\nasync function importAndInstantiate(def: JxScope, src: string, exportName: string, base?: string) {\n let mod: ImportedModule;\n if (_moduleCache.has(src)) {\n mod = _moduleCache.get(src)!;\n } else {\n try {\n mod = (await import(src)) as ImportedModule;\n } catch {\n if (base) {\n const resolvedSrc = new URL(src, base).href;\n mod = (await import(resolvedSrc)) as ImportedModule;\n } else {\n throw new Error(`Failed to import \"${src}\"`);\n }\n }\n _moduleCache.set(src, mod);\n }\n\n const ExportedClass = mod[exportName] ?? mod.default?.[exportName];\n if (!ExportedClass) {\n throw new Error(`Jx: export \"${exportName}\" not found in \"${src}\"`);\n }\n if (typeof ExportedClass !== \"function\") {\n throw new TypeError(`Jx: \"${exportName}\" from \"${src}\" is not a class`);\n }\n\n const config: JxScope = {};\n for (const [k, v] of Object.entries(def)) {\n if (!EXTERNAL_RESERVED.has(k)) {\n config[k] = v;\n }\n }\n\n const Ctor = ExportedClass as new (config: JxScope) => ExternalClassInstance;\n const instance = new Ctor(config);\n\n let value: unknown;\n if (typeof instance.resolve === \"function\") {\n value = await instance.resolve();\n } else if (\"value\" in instance) {\n ({ value } = instance);\n } else {\n value = instance;\n }\n\n // Always wrap in ref for reactivity with external classes\n const s: Ref<unknown> = ref(value);\n if (typeof instance.subscribe === \"function\") {\n instance.subscribe((newVal: unknown) => {\n s.value = newVal;\n });\n }\n return s;\n}\n\n/**\n * Resolve a .class.json schema-defined class. Fetches the schema, follows $implementation if\n * hybrid, or constructs dynamically if self-contained.\n *\n * @param {JxPrototypeDef} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveClassJson(def: JxPrototypeDef, state: JxScope, key: string, base?: string) {\n const src = def.$src;\n if (!src) {\n throw new Error(`Jx: class entry '${key}' has no $src`);\n }\n let classDef: JxClassDef;\n\n // Bare specifiers (package references like @scope/pkg/file) can't be fetched directly —\n // Go straight to dev proxy which can resolve them via node_modules.\n const isBareSpecifier =\n !src.startsWith(\".\") &&\n !src.startsWith(\"/\") &&\n !src.startsWith(\"http\") &&\n !src.startsWith(\"file:\");\n if (isBareSpecifier) {\n return resolveViaDevProxy(def, state, key, base);\n }\n\n // Try fetching the .class.json file directly\n try {\n const url = base ? new URL(src, base).href : src;\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n // Trust boundary: fetched .class.json sources are class definitions by contract.\n classDef = (await res.json()) as JxClassDef;\n } catch {\n // Fall back to dev proxy (server will handle .class.json resolution)\n return resolveViaDevProxy(def, state, key, base);\n }\n\n // Hybrid mode: $implementation points to the real JS module\n if (classDef.$implementation) {\n // If the schema references $context (e.g. content types), the browser cannot provide\n // The required server-side context — go directly to dev proxy.\n const schemaStr = JSON.stringify(classDef);\n if (schemaStr.includes('\"#/$context/')) {\n return resolveViaDevProxy(def, state, key, base);\n }\n const schemaUrl = base ? new URL(src, base).href : new URL(src, location.href).href;\n const implSrc = new URL(classDef.$implementation, schemaUrl).href;\n const exportName = def.$export ?? classDef.title ?? def.$prototype;\n try {\n return await importAndInstantiate(def, implSrc, exportName, base);\n } catch {\n return resolveViaDevProxy(def, state, key, base);\n }\n }\n\n // Self-contained: construct class dynamically from schema\n const DynClass = classFromSchema(classDef);\n const config: JxScope = {};\n for (const [k, v] of Object.entries(def)) {\n if (!EXTERNAL_RESERVED.has(k)) {\n config[k] = v;\n }\n }\n const instance = new DynClass(config) as ExternalClassInstance;\n\n let value: unknown;\n if (typeof instance.resolve === \"function\") {\n value = await instance.resolve();\n } else if (\"value\" in instance) {\n ({ value } = instance);\n } else {\n value = instance;\n }\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(value);\n if (typeof instance.subscribe === \"function\") {\n instance.subscribe((newVal: unknown) => {\n s.value = newVal;\n });\n }\n return s;\n}\n\n/**\n * Dynamically construct a class from a .class.json schema definition. Browser-side: maps private\n * fields to _-prefixed public fields.\n *\n * @param {import(\"@jxsuite/schema/types\").JxClassDef} classDef\n * @returns {DynamicClass}\n */\nfunction classFromSchema(classDef: JxClassDef) {\n const fields = classDef.$defs?.fields ?? {};\n // JSON objects inherit Object.prototype.constructor — only an own object value counts.\n const rawCtor = classDef.$defs?.constructor;\n const ctor = typeof rawCtor === \"object\" ? rawCtor : undefined;\n const methods = classDef.$defs?.methods ?? {};\n\n // oxlint-disable-next-line typescript/no-extraneous-class -- methods are attached to the prototype dynamically below\n class DynClass {\n constructor(config: Record<string, unknown> = {}) {\n for (const [key, typedField] of Object.entries(fields)) {\n const id = typedField.identifier ?? key;\n const propName = typedField.access === \"private\" ? `_${id}` : id;\n if (config[id] !== undefined) {\n (this as Record<string, unknown>)[propName] = config[id];\n } else if (typedField.initializer !== undefined) {\n (this as Record<string, unknown>)[propName] = typedField.initializer;\n } else if (typedField.default !== undefined) {\n (this as Record<string, unknown>)[propName] = structuredClone(typedField.default);\n } else {\n (this as Record<string, unknown>)[propName] = null;\n }\n }\n if (ctor?.body) {\n const bodyStr = Array.isArray(ctor.body) ? ctor.body.join(\"\\n\") : ctor.body;\n (\n new Function(\"config\", bodyStr) as (\n this: unknown,\n config: Record<string, unknown>,\n ) => void\n ).call(this, config);\n }\n }\n }\n\n for (const [key, typedMethod] of Object.entries(methods)) {\n const name = typedMethod.identifier ?? key;\n const params = (typedMethod.parameters ?? []).map((p) => {\n if (p.$ref) {\n return p.$ref.split(\"/\").pop() as string;\n }\n const n = p.identifier ?? p.name;\n return typeof n === \"string\" ? n : \"arg\";\n });\n const bodyStr = Array.isArray(typedMethod.body)\n ? typedMethod.body.join(\"\\n\")\n : (typedMethod.body ?? \"\");\n\n if (typedMethod.role === \"accessor\") {\n const descriptor: PropertyDescriptor = {};\n if (typedMethod.getter) {\n descriptor.get = new Function(typedMethod.getter.body ?? \"\") as () => unknown;\n }\n if (typedMethod.setter) {\n const sp = (typedMethod.setter.parameters ?? []).map(\n (p) => p.$ref?.split(\"/\").pop() ?? \"v\",\n );\n descriptor.set = new Function(...sp, typedMethod.setter.body ?? \"\") as (v: unknown) => void;\n }\n Object.defineProperty(DynClass.prototype, name, {\n ...descriptor,\n configurable: true,\n });\n } else if (typedMethod.scope === \"static\") {\n (DynClass as unknown as DynamicClass)[name] = new Function(...params, bodyStr);\n } else {\n (DynClass as unknown as DynamicClass).prototype[name] = new Function(...params, bodyStr);\n }\n }\n\n Object.defineProperty(DynClass, \"name\", {\n configurable: true,\n value: classDef.title,\n });\n const dynCtor = DynClass as unknown as DynamicClass;\n return dynCtor;\n}\n\n/**\n * Dev-mode fallback: when an $src module cannot run in the browser, proxy the resolve() call\n * through the Jx dev server (POST /**jx_resolve**). Supports reactive template strings in config\n * values via Vue effect().\n *\n * @param {JxPrototypeDef} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveViaDevProxy(def: JxPrototypeDef, state: JxScope, key: string, base?: string) {\n const config: JxScope = {};\n for (const [k, v] of Object.entries(def)) {\n if (!EXTERNAL_RESERVED.has(k)) {\n config[k] = v;\n }\n }\n\n const hasTemplates = Object.values(config).some((v: unknown) => isTemplateString(v));\n\n /** @param {JxScope} resolvedConfig */\n const doResolve = (resolvedConfig: JxScope) =>\n fetch(resolveProxyPath(\"/__jx_resolve__\"), {\n body: JSON.stringify({\n $base: base,\n $export: def.$export,\n $prototype: def.$prototype,\n $src: def.$src,\n ...resolvedConfig,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n }).then((r) => {\n if (!r.ok) {\n throw new Error(`Jx dev proxy ${r.status} for \"${key}\"`);\n }\n return r.json();\n });\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(null);\n if (hasTemplates) {\n effect(() => {\n const resolvedConfig: JxScope = {};\n for (const [k, v] of Object.entries(config)) {\n resolvedConfig[k] = isTemplateString(v) ? evaluateTemplate(v, state) : v;\n }\n doResolve(resolvedConfig)\n .then((value: unknown) => {\n s.value = value;\n })\n .catch((error: unknown) => console.error(\"Jx dev proxy:\", error));\n });\n } else {\n doResolve(config)\n .then((value: unknown) => {\n s.value = value;\n })\n .catch((error: unknown) => console.error(\"Jx dev proxy:\", error));\n }\n return s;\n}\n\n// ─── Server function resolution (dev mode) ────────────────────────────────────\n\n/**\n * Resolve a timing: \"server\" entry in dev mode by executing the function client-side. In\n * production, the compiler replaces this with a fetch to the generated server handler.\n *\n * @param {JxScope} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveServerFunction(\n def: JxServerFnDef,\n state: JxScope,\n key: string,\n base?: string,\n) {\n const src = def.$src;\n const exportName = def.$export;\n\n let mod: ImportedModule;\n if (_moduleCache.has(src)) {\n mod = _moduleCache.get(src)!;\n } else {\n try {\n mod = (await import(src)) as ImportedModule;\n } catch {\n if (base) {\n try {\n const resolvedSrc = new URL(src, base).href;\n mod = (await import(resolvedSrc)) as ImportedModule;\n } catch {\n // Module cannot run in the browser — fall back to dev server proxy\n return resolveServerFunctionViaProxy(def, state, key, base);\n }\n } else {\n return resolveServerFunctionViaProxy(def, state, key, base);\n }\n }\n _moduleCache.set(src, mod);\n }\n\n const candidate = mod[exportName] ?? mod.default?.[exportName];\n if (!candidate) {\n throw new Error(`Jx: export \"${exportName}\" not found in \"${src}\" for \"${key}\"`);\n }\n if (typeof candidate !== \"function\") {\n throw new TypeError(`Jx: \"${exportName}\" from \"${src}\" is not a function`);\n }\n const fn = candidate as (args: JxScope) => Promise<unknown>;\n\n const rawArgs = def.arguments ?? {};\n const hasReactiveArg = Object.values(rawArgs).some((v: unknown) => isRefObj(v));\n const resolveArgs = () => {\n const args: JxScope = {};\n for (const [k, v] of Object.entries(rawArgs)) {\n args[k] = isRefObj(v) ? resolveRef(v.$ref, state) : v;\n }\n return args;\n };\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(null);\n if (hasReactiveArg) {\n effect(() => {\n const args = resolveArgs();\n onEffectCleanup(() => {});\n fn(args)\n .then((result: unknown) => {\n s.value = result;\n })\n .catch(() => {});\n });\n } else {\n s.value = await fn(resolveArgs());\n }\n return s;\n}\n\n/**\n * Dev-mode fallback: when a timing: \"server\" module cannot run in the browser, proxy the function\n * call through the Jx dev server (POST /**jx_server**). Supports reactive $ref arguments via Vue\n * effect().\n *\n * @param {JxScope} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveServerFunctionViaProxy(\n def: JxScope,\n state: JxScope,\n key: string,\n base?: string,\n) {\n const rawArgs = def.arguments ?? {};\n const hasReactiveArg = Object.values(rawArgs).some((v: unknown) => isRefObj(v));\n\n const resolveArgs = () => {\n const args: JxScope = {};\n for (const [k, v] of Object.entries(rawArgs)) {\n args[k] = isRefObj(v) ? resolveRef((v as { $ref: string }).$ref, state) : v;\n }\n return args;\n };\n\n /** @param {JxScope} args */\n const doResolve = (args: JxScope) =>\n fetch(resolveProxyPath(\"/__jx_server__\"), {\n body: JSON.stringify({\n $base: base,\n $export: def.$export,\n $src: def.$src,\n arguments: args,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n }).then((r) => {\n if (!r.ok) {\n throw new Error(`Jx server proxy ${r.status} for \"${key}\"`);\n }\n return r.json();\n });\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(null);\n if (hasReactiveArg) {\n effect(() => {\n const args = resolveArgs();\n onEffectCleanup(() => {});\n doResolve(args)\n .then((result: unknown) => {\n s.value = result;\n })\n .catch((error: unknown) => console.error(\"Jx server proxy:\", error));\n });\n } else {\n doResolve(resolveArgs())\n .then((result: unknown) => {\n s.value = result;\n })\n .catch((error: unknown) => console.error(\"Jx server proxy:\", error));\n }\n return s;\n}\n\n/**\n * Resolve a $ref string to a value in scope.\n *\n * With Vue reactivity, this reads directly from the reactive proxy. When called inside a effect or\n * computed, the read is tracked.\n *\n * @param {string} ref\n * @param {JxScope} state - Reactive scope proxy (or child scope)\n * @returns {unknown}\n */\nexport function resolveRef(refPath: string, state: JxScope) {\n if (typeof refPath !== \"string\") {\n return refPath;\n }\n if (refPath.startsWith(\"$map/\")) {\n const parts = refPath.split(\"/\");\n const [, key] = parts; // \"item\" or \"index\"\n const map = state.$map as Record<string, unknown> | undefined;\n const base = map?.[key!] ?? state[`$map/${key}`];\n return parts.length > 2 ? getPath(base, parts.slice(2).join(\"/\")) : base;\n }\n if (refPath.startsWith(\"#/state/\")) {\n const sub = refPath.slice(\"#/state/\".length);\n const slash = sub.indexOf(\"/\");\n if (slash === -1) {\n return state[sub];\n }\n return getPath(state[sub.slice(0, slash)], sub.slice(slash + 1));\n }\n if (refPath.startsWith(\"parent#/\")) {\n return state[refPath.slice(\"parent#/\".length)];\n }\n if (refPath.startsWith(\"window#/\")) {\n return getPath(globalThis.window, refPath.slice(\"window#/\".length));\n }\n if (refPath.startsWith(\"document#/\")) {\n return getPath(globalThis.document, refPath.slice(\"document#/\".length));\n }\n return state[refPath] ?? null;\n}\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\n/**\n * Check if v is a Vue ref (including computed).\n *\n * @param {unknown} v\n * @returns {boolean}\n */\nexport function isSignal(v: unknown) {\n return isRef(v);\n}\n\n/**\n * @param {unknown} v\n * @returns {v is import(\"@jxsuite/schema/types\").JxRef}\n */\nfunction isRefObj(v: unknown): v is JxRef {\n return isRefValue(v);\n}\n\n/**\n * @param {string} k\n * @returns {boolean}\n */\nfunction isNestedSelector(k: string) {\n return k.startsWith(\":\") || k.startsWith(\".\") || k.startsWith(\"&\") || k.startsWith(\"[\");\n}\n\n/**\n * @param {unknown} obj\n * @param {string} path\n * @returns {unknown}\n */\nfunction getPath(obj: unknown, path: string) {\n let current: unknown = obj;\n for (const k of path.split(/[./]/)) {\n current = (current as Record<string, unknown>)?.[k];\n }\n return current;\n}\n\n/**\n * @param {JxElement} def\n * @param {JxScope} parentState\n * @returns {JxScope}\n */\nfunction mergeProps(def: JxElement, parentState: JxScope): JxScope {\n const child = Object.create(parentState) as JxScope;\n for (const [k, v] of Object.entries(def.$props ?? {})) {\n child[k] = isRefObj(v) ? resolveRef(v.$ref, parentState) : v;\n }\n return child;\n}\n\n/**\n * Convert camelCase to kebab-case.\n *\n * @param {string} s\n * @returns {string}\n */\nexport function camelToKebab(s: string) {\n return s.replaceAll(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n}\n\n/**\n * Convert a style rules object to a CSS text string (skipping nested selectors).\n *\n * @param {Record<string, unknown> | object} rules\n * @returns {string}\n */\nexport function toCSSText(rules: Record<string, unknown> | object) {\n return Object.entries(rules)\n .filter(([k, v]) => !isNestedSelector(k) && (v === null || typeof v !== \"object\"))\n .map(([p, v]) => `${camelToKebab(p)}: ${transposeCanvasUnits(String(v))}`)\n .join(\"; \");\n}\n\n// ─── Custom Element Registration ──────────────────────────────────────────────\n\nlet _rootMedia: Record<string, string> = {};\nconst _elementDefs = new Map();\n\n/**\n * Seed the module-level root `$media` map used as the fallback for components that declare their\n * own `@--name` style blocks but carry no own `$media` (buildScope ~279-280). `Jx()` sets this from\n * the document during a full top-level render, but the Studio iframe canvas calls `buildScope`/\n * `renderNode` directly (never `Jx()`), so without seeding it a component's `@--md` would resolve\n * to the invalid `@media md`. Callers on the direct path MUST set it (with the merged `$media`)\n * before `buildScope`, and re-set it every render so a stale map from a previous document cannot\n * leak.\n *\n * @param {Record<string, string>} map\n */\nexport function setRootMedia(map: Record<string, string>): void {\n _rootMedia = map ?? {};\n}\n\n/**\n * Resolve and register $elements entries (depth-first).\n *\n * @param {JxDocument[\"$elements\"]} elements\n * @param {string} base\n * @returns {Promise<void>}\n */\nasync function registerElements(elements: NonNullable<JxDocument[\"$elements\"]>, base: string) {\n for (const entry of elements) {\n // Bare string: npm package side-effect import (registers custom elements)\n if (typeof entry === \"string\") {\n try {\n // Bare specifiers need a URL path for the browser; the dev server resolves\n // /node_modules/<pkg> to the package entry point via exports/module/main.\n const specifier =\n entry.startsWith(\"/\") || entry.startsWith(\".\") ? entry : `/node_modules/${entry}`;\n await import(specifier);\n } catch (error) {\n console.warn(`Jx: failed to import package \"${entry}\"`, error);\n }\n continue;\n }\n if (!isRefObj(entry)) {\n continue;\n }\n const { href } = new URL(entry.$ref, base);\n const doc = await resolve(href);\n if (!doc.tagName || !doc.tagName.includes(\"-\")) {\n continue;\n }\n if (customElements.get(doc.tagName)) {\n continue;\n }\n\n // Depth-first: register sub-dependencies first\n if (doc.$elements) {\n await registerElements(doc.$elements, href);\n }\n\n await defineElement(doc, href);\n }\n}\n\n/**\n * Inject head elements from $head declarations. Each entry is { tagName, attributes } — bare npm\n * specifiers in href/src are rewritten to /node_modules/ paths for the dev server.\n *\n * @param {import(\"@jxsuite/schema/types\").JxHeadEntry[]} entries\n * @param {string} _base - Document base URL for resolving relative paths\n */\nfunction injectHead(entries: JxHeadEntry[], _base: string) {\n for (const entry of entries) {\n if (!entry || !entry.tagName) {\n continue;\n }\n const tag = entry.tagName.toLowerCase();\n const attrs = { ...entry.attributes };\n // Resolve href/src: bare npm specifiers -> /node_modules/ path\n for (const key of [\"href\", \"src\"] as const) {\n const v = attrs[key];\n if (\n typeof v === \"string\" &&\n v &&\n !v.startsWith(\"/\") &&\n !v.startsWith(\".\") &&\n !v.startsWith(\"http\")\n ) {\n attrs[key] = `/node_modules/${v}`;\n }\n }\n\n // Deduplicate: skip if an identical element already exists\n const selector = `${tag}${attrs.href ? `[href=\"${attrs.href}\"]` : \"\"}${attrs.src ? `[src=\"${attrs.src}\"]` : \"\"}`;\n if (selector !== tag && document.head.querySelector(selector)) {\n continue;\n }\n\n const el = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) {\n el.setAttribute(k, String(v));\n }\n if (entry.textContent) {\n el.textContent = entry.textContent;\n }\n document.head.append(el);\n }\n}\n\n/**\n * Register a custom element from a Jx document.\n *\n * @param {string | JxDocument} source - URL to .json file, or raw document object\n * @param {string} [base] - Base URL for resolving $src imports\n * @returns {Promise<void>}\n */\nconst _definedSources = new Set<string>();\n\nexport async function defineElement(source: string | JxDocument, baseUrl?: string) {\n let base = baseUrl;\n let doc = source;\n if (typeof source === \"string\") {\n base = new URL(source, base ?? location.href).href;\n if (_definedSources.has(base)) {\n return;\n }\n _definedSources.add(base);\n doc = await resolve(source);\n }\n base ??= location.href;\n\n const source_: JxDocument = doc as JxDocument;\n\n const { tagName } = source_;\n if (!tagName || !tagName.includes(\"-\")) {\n throw new Error(`Jx defineElement: tagName \"${tagName}\" must contain a hyphen`);\n }\n if (customElements.get(tagName)) {\n return;\n }\n\n // Register sub-dependencies first\n if (source_.$elements) {\n await registerElements(source_.$elements, base);\n }\n\n _elementDefs.set(tagName, { base, doc: source_ });\n\n const def = source_;\n const observedAttrs = def.observedAttributes ?? [];\n\n const ElementClass = class extends HTMLElement {\n _jxInitialized = false;\n _state: JxScope | null = null;\n\n static get observedAttributes() {\n return observedAttrs;\n }\n\n async connectedCallback() {\n // An element carrying `data-jx-definition-root` IS the definition being rendered by an\n // External renderer (the studio canvas editing this component's own document) — its subtree\n // Is authored DOM, not an instantiation site. Self-initializing here would wipe that tree\n // And re-render it with default state (the \"component editor shows a live instance\" bug).\n if (this.dataset.jxDefinitionRoot !== undefined) {\n return;\n }\n if (this._jxInitialized) {\n return;\n }\n this._jxInitialized = true;\n\n const state = await buildScope(def, {}, base);\n\n // Read properties from directive encoding (markdown → data-jx-props)\n const propsAttr = this.dataset.jxProps;\n if (propsAttr) {\n try {\n const props = JSON.parse(propsAttr) as Record<string, unknown>;\n for (const [key, val] of Object.entries(props)) {\n if (key in (def.state ?? {})) {\n state[key] = val;\n }\n }\n } catch {}\n delete this.dataset.jxProps;\n }\n\n // Read literal `props.*` attributes (JSON-authored instances pass props this way; the\n // Compiler lifts them into $props at build, and this is the live-render mirror). String\n // Values only — HTML lowercases attribute names, so state keys must be lowercase to match.\n // Collect first: removing while iterating the live NamedNodeMap skips entries.\n const propAttrNames = this.getAttributeNames().filter(\n (name) => name.startsWith(\"props.\") && name.length > \"props.\".length,\n );\n for (const name of propAttrNames) {\n const key = name.slice(\"props.\".length);\n if (key in (def.state ?? {})) {\n state[key] = this.getAttribute(name);\n this.removeAttribute(name);\n }\n }\n\n // Merge $props set as JS properties by parent before connection\n for (const key of Object.keys(def.state ?? {})) {\n if (key in this && (this as Record<string, unknown>)[key] !== undefined) {\n state[key] = (this as Record<string, unknown>)[key];\n }\n }\n // Set up property getters/setters that forward into reactive state\n for (const key of Object.keys(def.state ?? {})) {\n if (!(key in HTMLElement.prototype)) {\n Object.defineProperty(this, key, {\n configurable: true,\n get: () => state[key],\n set: (v: unknown) => {\n state[key] = v;\n },\n });\n }\n }\n\n this._state = state;\n\n // Capture light DOM children (for slot distribution) before rendering\n const slottedChildren = [...this.childNodes];\n this.innerHTML = \"\";\n\n // Custom elements default to display:inline — use block so they behave as\n // Containers (matching <div> semantics). The component's own style can\n // Override this if needed.\n if (!this.style.display) {\n this.style.display = \"block\";\n }\n\n // Render template into light DOM (once, not in effect — inner effects handle reactivity)\n applyStyle(this, def.style ?? {}, (state[\"$media\"] as Record<string, string>) ?? {}, state);\n applyAttributes(this, def.attributes ?? {}, state);\n\n const children = Array.isArray(def.children) ? def.children : [];\n for (const childDef of children) {\n this.append(renderNode(childDef, state));\n }\n\n // Slot distribution (light DOM)\n distributeSlots(this, slottedChildren);\n\n // Lifecycle: onMount\n const { onMount } = state;\n if (typeof onMount === \"function\") {\n queueMicrotask(() => (onMount as (s: JxScope) => unknown)(state));\n }\n }\n\n disconnectedCallback() {\n if (typeof this._state?.onUnmount === \"function\") {\n (this._state.onUnmount as (s: JxScope) => unknown)(this._state);\n }\n }\n\n adoptedCallback() {\n if (typeof this._state?.onAdopted === \"function\") {\n (this._state.onAdopted as (s: JxScope) => unknown)(this._state);\n }\n }\n\n attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null) {\n if (!this._state || oldVal === newVal) {\n return;\n }\n const camelKey = name.replaceAll(/-([a-z])/g, (_: string, c: string) => c.toUpperCase());\n const current = this._state[camelKey];\n if (typeof current === \"number\") {\n this._state[camelKey] = Number(newVal);\n } else if (typeof current === \"boolean\") {\n this._state[camelKey] = newVal !== null && newVal !== \"false\";\n } else {\n this._state[camelKey] = newVal;\n }\n }\n };\n\n customElements.define(tagName, ElementClass);\n}\n\n/**\n * Render a registered custom element with $props (property-first interface).\n *\n * @param {JxElement} def\n * @param {JxScope} state\n * @param {JxRenderOptions} [options]\n * @param {JxPath} [path]\n * @returns {HTMLElement}\n */\nfunction renderCustomElementWithProps(\n def: JxElement,\n state: JxScope,\n options?: JxRenderOptions,\n path?: JxPath,\n) {\n const el = document.createElement(def.tagName ?? \"div\");\n\n if (options?.onNodeCreated) {\n options.onNodeCreated(el, path ?? [], def, state);\n }\n\n // Set JS properties from $props (before connection)\n for (const [key, val] of Object.entries(def.$props ?? {})) {\n if (isRefObj(val)) {\n const refVal = val;\n const resolved = resolveRef(refVal.$ref, state);\n (el as unknown as Record<string, unknown>)[key] = resolved;\n // Reactive forwarding: re-set the property when the source changes\n effect(() => {\n (el as unknown as Record<string, unknown>)[key] = resolveRef(refVal.$ref, state);\n });\n } else if (isTemplateString(val)) {\n effect(() => {\n (el as unknown as Record<string, unknown>)[key] = evaluateTemplate(val, state);\n });\n } else {\n (el as unknown as Record<string, unknown>)[key] = val;\n }\n }\n\n // Apply host-level style and attributes from the usage site\n applyStyle(el, def.style ?? {}, (state[\"$media\"] as Record<string, string>) ?? {}, state);\n applyAttributes(el, def.attributes ?? {}, state);\n\n // Append slotted children\n const children = Array.isArray(def.children) ? def.children : [];\n for (let i = 0; i < children.length; i++) {\n const childOpts = options && path ? { ...options, _path: [...path, \"children\", i] } : undefined;\n el.append(renderNode(children[i]!, state, childOpts));\n }\n\n return el;\n}\n\n/**\n * Light DOM slot distribution.\n *\n * @param {HTMLElement} host\n * @param {ChildNode[]} slottedChildren\n */\nfunction distributeSlots(host: HTMLElement, slottedChildren: ChildNode[]) {\n if (slottedChildren.length === 0) {\n return;\n }\n\n const slots = host.querySelectorAll(\"slot\");\n if (slots.length === 0) {\n return;\n }\n\n const named = new Map<string | null, ChildNode[]>();\n const unnamed: ChildNode[] = [];\n\n for (const child of slottedChildren) {\n if (child.nodeType === Node.ELEMENT_NODE && (child as Element).getAttribute(\"slot\")) {\n const name = (child as Element).getAttribute(\"slot\");\n if (!named.has(name)) {\n named.set(name, []);\n }\n (named.get(name) as ChildNode[]).push(child);\n } else {\n unnamed.push(child);\n }\n }\n\n for (const slot of slots) {\n const name = slot.getAttribute(\"name\");\n const matches = name ? (named.get(name) ?? []) : unnamed;\n if (matches.length > 0) {\n slot.innerHTML = \"\";\n for (const child of matches) {\n slot.append(child);\n }\n }\n }\n}\n",
6
+ "/**\n* @vue/shared v3.5.40\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \"&quot;\";\n break;\n case 38:\n escaped = \"&amp;\";\n break;\n case 39:\n escaped = \"&#39;\";\n break;\n case 60:\n escaped = \"&lt;\";\n break;\n case 62:\n escaped = \"&gt;\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^(?:-?>)+|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n let prev;\n do {\n prev = src;\n src = src.replace(commentStripRE, \"\");\n } while (src !== prev);\n return src;\n}\nconst cssVarNameEscapeSymbolsRE = /[ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n",
7
+ "/**\n* @vue/reactivity v3.5.40\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, isObject, makeMap, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this._warnOnRun = true;\n this.__v_skip = true;\n if (!detached && activeEffectScope) {\n if (activeEffectScope.active) {\n this.parent = activeEffectScope;\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n } else {\n this._active = false;\n this._warnOnRun = false;\n }\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n const scopes = this.scopes.slice();\n for (i = 0, l = scopes.length; i < l; i++) {\n scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n const scopes = this.scopes.slice();\n for (i = 0, l = scopes.length; i < l; i++) {\n scopes[i].resume();\n }\n }\n const effects = this.effects.slice();\n for (i = 0, l = effects.length; i < l; i++) {\n effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && this._warnOnRun) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n if (activeEffectScope === this) {\n activeEffectScope = this.prevScope;\n } else {\n let current = activeEffectScope;\n while (current) {\n if (current.prevScope === this) {\n current.prevScope = this.prevScope;\n break;\n }\n current = current.prevScope;\n }\n }\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n const scopes = this.scopes.slice();\n for (i = 0, l = scopes.length; i < l; i++) {\n scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope) {\n if (activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n } else {\n this.flags &= -2;\n }\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n let wrappedFn = fn;\n let wrapInitialAccumulator = false;\n if (arr !== self) {\n if (needsWrap) {\n wrapInitialAccumulator = args.length === 0;\n wrappedFn = function(acc, item, index) {\n if (wrapInitialAccumulator) {\n wrapInitialAccumulator = false;\n acc = toWrapped(self, acc);\n }\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n const result = arr[method](wrappedFn, ...args);\n return wrapInitialAccumulator ? toWrapped(self, result) : result;\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver) && result) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return extend(\n // inheriting all iterator properties\n Object.create(innerIterator),\n {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n }\n }\n );\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n const target = toRaw(this);\n const proto = getProto(target);\n const rawValue = toRaw(value);\n const valueToAdd = !shallow && !isShallow(value) && !isReadonly(value) ? rawValue : value;\n const hadKey = proto.has.call(target, valueToAdd) || hasChanged(value, valueToAdd) && proto.has.call(target, value) || hasChanged(rawValue, valueToAdd) && proto.has.call(target, rawValue);\n if (!hadKey) {\n target.add(valueToAdd);\n trigger(target, \"add\", valueToAdd, valueToAdd);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction reactive(target) {\n if (/* @__PURE__ */ isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n if (target[\"__v_skip\"] || !Object.isExtensible(target)) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = targetTypeMap(toRawType(target));\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReactive(value) {\n if (/* @__PURE__ */ isReadonly(value)) {\n return /* @__PURE__ */ isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? /* @__PURE__ */ toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? /* @__PURE__ */ reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? /* @__PURE__ */ readonly(value) : value;\n\n// @__NO_SIDE_EFFECTS__\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction ref(value) {\n return createRef(value, false);\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (/* @__PURE__ */ isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return /* @__PURE__ */ isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (/* @__PURE__ */ isRef(oldValue) && !/* @__PURE__ */ isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, key, _defaultValue) {\n this._object = _object;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._key = isSymbol(key) ? key : String(key);\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || isSymbol(this._key) || !isIntegerKey(this._key)) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && /* @__PURE__ */ isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (/* @__PURE__ */ isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRef(source, key, defaultValue) {\n if (/* @__PURE__ */ isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return /* @__PURE__ */ ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\n// @__NO_SIDE_EFFECTS__\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n const res = _cb(...args);\n watchHandle();\n return res;\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (immediateFirstRun || deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n",
8
+ "/// <reference lib=\"dom\" />\n/**\n * Jx Declarative Expression Engine (spec §19)\n *\n * Shared module used by both runtime (evaluateExpression) and compiler (compileExpression).\n *\n * @module expression\n */\n\nimport type { JxExpressionNode, JxExpressionOperand } from \"@jxsuite/schema/types\";\nimport type { JxScope } from \"./types.ts\";\n\n/** The runtime's expression node — the schema's expression model. */\nexport type ExpressionNode = JxExpressionNode;\nexport type ExpressionOperand = JxExpressionOperand;\n\n/** The `$map` iteration context object stored in scope during mapped rendering. */\ninterface ScopeMapCtx {\n item?: unknown;\n index?: number;\n [key: string]: unknown;\n}\n\n/** View the scope's `$map` iteration context, if present. */\nfunction scopeMap(state: JxScope): ScopeMapCtx | undefined {\n const map = state.$map;\n return map && typeof map === \"object\" ? (map as ScopeMapCtx) : undefined;\n}\n\ninterface CompileOpts {\n statePrefix?: string;\n eventParam?: string;\n /**\n * Parameter-name order per named-formula state key, used by `call` sites to map positional\n * argument lists onto the emitted formula functions' named-args object.\n */\n formulaParams?: Record<string, string[]>;\n}\n\nconst MUTATING_OPS = new Set([\n \"=\",\n \"+=\",\n \"-=\",\n \"*=\",\n \"/=\",\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n]);\nconst UNARY_OPS = new Set([\"!\", \"-\"]);\nconst BINARY_OPS = new Set([\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"===\",\n \"!==\",\n \"<\",\n \"<=\",\n \">\",\n \">=\",\n \"&&\",\n \"||\",\n \"??\",\n]);\nconst ASSIGNMENT_OPS = new Set([\"=\", \"+=\", \"-=\", \"*=\", \"/=\"]);\nconst ARRAY_METHOD_OPS = new Set([\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"]);\nconst AGGREGATE_OPS = new Set([\"reduce\", \"map\", \"filter\"]);\nconst CONDITIONAL_OPS = new Set([\"?:\", \"switch\"]);\n\n/**\n * Pure standard-library method operators (spec §19.4d): genuine `String.prototype` /\n * `Array.prototype` / `Number.prototype` methods that never mutate their receiver — the ES2023\n * change-by-copy family stands in where mutation would otherwise occur (`toSorted`, not `sort`).\n * Receiver in `target`; `value` carries the argument (bare scalar) or argument list (array), the\n * splice precedent. No token is invented.\n */\nexport const PURE_METHOD_OPS = new Set([\n // Array.prototype (and the String.prototype homonyms: includes/indexOf/slice/at/concat)\n \"includes\",\n \"indexOf\",\n \"lastIndexOf\",\n \"join\",\n \"slice\",\n \"concat\",\n \"at\",\n \"flat\",\n \"toSorted\",\n \"toReversed\",\n \"toSpliced\",\n \"with\",\n // String.prototype\n \"toUpperCase\",\n \"toLowerCase\",\n \"trim\",\n \"trimStart\",\n \"trimEnd\",\n \"split\",\n \"startsWith\",\n \"endsWith\",\n \"padStart\",\n \"padEnd\",\n \"replaceAll\",\n \"repeat\",\n \"charAt\",\n \"normalize\",\n \"toLocaleUpperCase\",\n \"toLocaleLowerCase\",\n // Number.prototype\n \"toFixed\",\n \"toPrecision\",\n \"toLocaleString\",\n]);\n\nexport const BLESSED_OPERATORS = new Set([\n ...MUTATING_OPS,\n ...UNARY_OPS,\n ...BINARY_OPS,\n ...AGGREGATE_OPS,\n ...CONDITIONAL_OPS,\n ...PURE_METHOD_OPS,\n \"call\",\n]);\n\n/**\n * Pure globals a `call` node may target through the `window#/` scheme (spec §19.4c). Every entry is\n * a genuine ECMAScript or WHATWG standard-library function with no side effects; anything off this\n * list is a compile-time error, keeping formula purity decidable.\n */\nexport const BLESSED_GLOBALS = new Set([\n // Global functions\n \"isNaN\",\n \"isFinite\",\n \"parseFloat\",\n \"parseInt\",\n \"encodeURIComponent\",\n \"decodeURIComponent\",\n \"structuredClone\",\n // Math\n \"Math/abs\",\n \"Math/ceil\",\n \"Math/floor\",\n \"Math/round\",\n \"Math/trunc\",\n \"Math/sign\",\n \"Math/sqrt\",\n \"Math/cbrt\",\n \"Math/pow\",\n \"Math/exp\",\n \"Math/log\",\n \"Math/log2\",\n \"Math/log10\",\n \"Math/min\",\n \"Math/max\",\n \"Math/hypot\",\n // Number\n \"Number/isInteger\",\n \"Number/isFinite\",\n \"Number/isNaN\",\n \"Number/parseFloat\",\n \"Number/parseInt\",\n // JSON\n \"JSON/parse\",\n \"JSON/stringify\",\n // Object\n \"Object/keys\",\n \"Object/values\",\n \"Object/entries\",\n \"Object/fromEntries\",\n // Array\n \"Array/from\",\n \"Array/isArray\",\n \"Array/of\",\n // String\n \"String/fromCharCode\",\n \"String/fromCodePoint\",\n // Intl (synthetic helpers — see BLESSED_HELPERS; Intl formatters are constructors,\n // So the plain-function call shape wraps construct-then-format)\n \"Intl/formatNumber\",\n \"Intl/formatDate\",\n \"Intl/formatRelativeTime\",\n]);\n\n/**\n * Synthetic blessed helpers (spec §19.4c): pure functions that have no direct `window` global\n * because the underlying standard-library API is a constructor. The interpreter dispatches to\n * these; the compiler emits the equivalent inline construct-then-format expression.\n */\nconst BLESSED_HELPERS: Record<string, (...a: unknown[]) => unknown> = {\n \"Intl/formatDate\": (value, locale, options) =>\n new Intl.DateTimeFormat(\n locale as string | undefined,\n options as Intl.DateTimeFormatOptions | undefined,\n ).format(new Date(value as string | number | Date)),\n \"Intl/formatNumber\": (value, locale, options) =>\n new Intl.NumberFormat(\n locale as string | undefined,\n options as Intl.NumberFormatOptions | undefined,\n ).format(value as number),\n \"Intl/formatRelativeTime\": (value, unit, locale, options) =>\n new Intl.RelativeTimeFormat(\n locale as string | undefined,\n options as Intl.RelativeTimeFormatOptions | undefined,\n ).format(value as number, unit as Intl.RelativeTimeFormatUnit),\n};\n\n/** Whether a `window#/…` callee ref is on the blessed pure-globals list. */\nexport function isBlessedGlobal(ref: string): boolean {\n return ref.startsWith(\"window#/\") && BLESSED_GLOBALS.has(ref.slice(\"window#/\".length));\n}\n\n/**\n * @param {string} op\n * @returns {boolean}\n */\nexport function isMutating(op: string) {\n return MUTATING_OPS.has(op);\n}\n\n// ─── Runtime Evaluation ──────────────────────────────────────────────────────\n\ninterface IterCtx {\n acc?: unknown;\n item?: unknown;\n index?: number;\n /** Named-formula arguments bound for the current `call` body ($args/<name> refs). */\n args?: Record<string, unknown>;\n /** Call-nesting depth; capped at MAX_CALL_DEPTH to bound recursive formulas. */\n callDepth?: number;\n}\n\n/** Recursion bound for `call` chains (formula → formula), mirroring MAX_REPORT_DEPTH. */\nexport const MAX_CALL_DEPTH = 64;\n\n/**\n * Editor-mode evaluation trace (spec §19.9). When passed, every node and operand reports its\n * evaluated value keyed by its path within the expression tree, and the branch-selecting operators\n * (`?:`, `switch` — plus the eager `&&`/`||`/`??`) yield values for ALL branches so a visual editor\n * can badge every node. Absent (production), evaluation is untouched.\n */\nexport interface ExpressionTrace {\n report: (path: (string | number)[], value: unknown) => void;\n /** Current node path — internal; leave unset at the call boundary. */\n path?: (string | number)[];\n /** Recursion depth — internal; reporting stops beyond MAX_REPORT_DEPTH. */\n depth?: number;\n}\n\n/** Reporting recursion bound: branch-forcing removes natural exit conditions, so cap the walk. */\nexport const MAX_REPORT_DEPTH = 64;\n\n/** Derive the trace for a child operand at path segment(s) `seg`; undefined once capped. */\nfunction subTrace(\n trace: ExpressionTrace | undefined,\n seg: string | number | (string | number)[],\n): ExpressionTrace | undefined {\n if (!trace) {\n return undefined;\n }\n const depth = (trace.depth ?? 0) + 1;\n if (depth > MAX_REPORT_DEPTH) {\n return undefined;\n }\n return {\n depth,\n path: [...(trace.path ?? []), ...(Array.isArray(seg) ? seg : [seg])],\n report: trace.report,\n };\n}\n\n/** Resolve an operand to its runtime value. */\nfunction resolveOperand(\n operand: unknown,\n state: JxScope,\n event: Event | null,\n iterCtx?: IterCtx,\n trace?: ExpressionTrace,\n): unknown {\n if (operand === null || operand === undefined) {\n return operand;\n }\n\n // Nested expression node\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"operator\" in operand) {\n return evaluateExpression(operand as ExpressionNode, state, event, iterCtx, trace);\n }\n\n // $ref pointer\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"$ref\" in operand) {\n const resolved = resolveExprRef((operand as { $ref: string }).$ref, state, event, iterCtx);\n trace?.report(trace.path ?? [], resolved);\n return resolved;\n }\n\n // Array of operands (e.g., splice args)\n if (Array.isArray(operand)) {\n return operand.map((o: unknown, i: number) =>\n resolveOperand(o, state, event, iterCtx, subTrace(trace, i)),\n );\n }\n\n // Literal\n trace?.report(trace.path ?? [], operand);\n return operand;\n}\n\n/** Resolve a $ref string within expression context. */\nfunction resolveExprRef(ref: string, state: JxScope, event: Event | null, iterCtx?: IterCtx) {\n if (ref === \"$reduce/acc\") {\n return iterCtx?.acc;\n }\n if (ref.startsWith(\"$reduce/\")) {\n return iterCtx?.acc;\n }\n if (ref.startsWith(\"$args/\")) {\n const parts = ref.slice(\"$args/\".length).split(\"/\");\n const base = iterCtx?.args?.[parts[0]!];\n return parts.length > 1 ? getPath(base, parts.slice(1).join(\"/\")) : base;\n }\n if (ref.startsWith(\"event#/\")) {\n const path = ref.slice(\"event#/\".length);\n return getPath(event, path);\n }\n if (ref.startsWith(\"$map/\")) {\n const parts = ref.split(\"/\");\n const [, key] = parts;\n let base;\n const map = scopeMap(state);\n if (key === \"item\") {\n base = iterCtx?.item ?? map?.item ?? state[\"$map/item\"];\n } else if (key === \"index\") {\n base = iterCtx?.index ?? map?.index ?? state[\"$map/index\"];\n } else {\n base = map?.[key!] ?? state[`$map/${key}`];\n }\n return parts.length > 2 ? getPath(base, parts.slice(2).join(\"/\")) : base;\n }\n if (ref.startsWith(\"#/state/\")) {\n const sub = ref.slice(\"#/state/\".length);\n const slash = sub.indexOf(\"/\");\n if (slash === -1) {\n return state[sub];\n }\n return getPath(state[sub.slice(0, slash)], sub.slice(slash + 1));\n }\n if (ref.startsWith(\"parent#/\")) {\n return state[ref.slice(\"parent#/\".length)];\n }\n if (ref.startsWith(\"window#/\")) {\n return getPath(globalThis.window, ref.slice(\"window#/\".length));\n }\n if (ref.startsWith(\"document#/\")) {\n return getPath(globalThis.document, ref.slice(\"document#/\".length));\n }\n return state[ref] ?? null;\n}\n\n/** Resolve a $ref to a writable location — returns { obj, key } for assignment. */\nfunction resolveWritableRef(\n ref: string,\n state: JxScope,\n _event: Event | null,\n iterCtx?: IterCtx,\n): { obj: JxScope; key: string } {\n if (ref.startsWith(\"$map/\")) {\n const parts = ref.split(\"/\");\n const [, key] = parts;\n let base;\n const map = scopeMap(state);\n if (key === \"item\") {\n base = iterCtx?.item ?? map?.item ?? state[\"$map/item\"];\n } else if (key === \"index\") {\n base = iterCtx?.index ?? map?.index ?? state[\"$map/index\"];\n } else {\n base = map?.[key!] ?? state[`$map/${key}`];\n }\n if (parts.length > 2) {\n const pathParts = parts.slice(2);\n const lastKey = pathParts.pop();\n const obj = pathParts.length > 0 ? getPath(base, pathParts.join(\"/\")) : base;\n return { key: lastKey as string, obj: obj as JxScope };\n }\n return {\n key: key === \"item\" ? \"$map/item\" : \"$map/index\",\n obj: scopeMap(state) ?? state,\n };\n }\n if (ref.startsWith(\"#/state/\")) {\n const sub = ref.slice(\"#/state/\".length);\n const slash = sub.indexOf(\"/\");\n if (slash === -1) {\n return { key: sub, obj: state };\n }\n const parts = sub.split(\"/\");\n const lastKey = parts.pop();\n let obj = state;\n // Pointer paths address objects by construction (validated by the schema).\n for (const p of parts) {\n obj = obj[p] as JxScope;\n }\n return { key: lastKey as string, obj };\n }\n return { key: ref, obj: state };\n}\n\n/** Evaluate an expression node at runtime. */\nexport function evaluateExpression(\n node: ExpressionNode,\n state: JxScope,\n event: Event | null,\n iterCtx?: IterCtx,\n trace?: ExpressionTrace,\n): unknown {\n const result = evaluateNode(node, state, event, iterCtx, trace);\n trace?.report(trace.path ?? [], result);\n return result;\n}\n\nfunction evaluateNode(\n node: ExpressionNode,\n state: JxScope,\n event: Event | null,\n iterCtx?: IterCtx,\n trace?: ExpressionTrace,\n): unknown {\n const { operator, target, value, initial } = node;\n\n if (!BLESSED_OPERATORS.has(operator)) {\n throw new Error(`$expression: unknown operator \"${operator}\"`);\n }\n\n // ─── Unary ───\n if (UNARY_OPS.has(operator) && !(\"value\" in node)) {\n const operand: unknown = resolveOperand(\n target,\n state,\n event,\n iterCtx,\n subTrace(trace, \"target\"),\n );\n if (operator === \"!\") {\n return !operand;\n }\n if (operator === \"-\") {\n return -(operand as number);\n }\n }\n\n // ─── Call (spec §19.4c) ───\n if (operator === \"call\") {\n const calleeRef = (target as { $ref?: string } | null)?.$ref;\n if (typeof calleeRef !== \"string\") {\n throw new TypeError(\"$expression: call target must be a $ref pointer\");\n }\n const callDepth = (iterCtx?.callDepth ?? 0) + 1;\n if (callDepth > MAX_CALL_DEPTH) {\n throw new Error(`$expression: call depth exceeded (${MAX_CALL_DEPTH})`);\n }\n const argValues = Array.isArray(value)\n ? value.map((o: unknown, i: number) =>\n resolveOperand(o, state, event, iterCtx, subTrace(trace, [\"value\", i])),\n )\n : [];\n\n // Blessed pure global via the window#/ scheme (Math.max, JSON.parse, …).\n if (calleeRef.startsWith(\"window#/\")) {\n if (!isBlessedGlobal(calleeRef)) {\n throw new Error(`$expression: \"${calleeRef}\" is not a blessed pure global`);\n }\n const globalPath = calleeRef.slice(\"window#/\".length);\n const helper = BLESSED_HELPERS[globalPath];\n if (helper) {\n return helper(...argValues);\n }\n const fn = getPath(globalThis.window, globalPath) as (...a: unknown[]) => unknown;\n const lastSlash = globalPath.lastIndexOf(\"/\");\n const thisArg =\n lastSlash === -1\n ? globalThis.window\n : getPath(globalThis.window, globalPath.slice(0, lastSlash));\n return fn.apply(thisArg, argValues);\n }\n\n const callee = resolveExprRef(calleeRef, state, event, iterCtx);\n // A scope callable (buildScope lowers parameterized formula entries to functions).\n if (typeof callee === \"function\") {\n return (callee as (...a: unknown[]) => unknown)(...argValues);\n }\n // A raw named-formula def (standalone evaluation, e.g. editor preview).\n if (callee && typeof callee === \"object\" && \"$expression\" in callee) {\n const def = callee as { $expression: ExpressionNode; parameters?: unknown[] };\n const args: Record<string, unknown> = {};\n for (const [i, p] of (def.parameters ?? []).entries()) {\n const name = typeof p === \"string\" ? p : ((p as { name?: string } | null)?.name ?? \"\");\n if (!name) {\n continue;\n }\n args[name] =\n argValues[i] === undefined && typeof p === \"object\" && p !== null && \"default\" in p\n ? (p as { default?: unknown }).default\n : argValues[i];\n }\n // The callee body's node paths are its own tree, not the call site's — no trace inside.\n return evaluateExpression(def.$expression, state, event, { args, callDepth });\n }\n throw new TypeError(`$expression: call target \"${calleeRef}\" is not callable`);\n }\n\n // ─── Conditional (pure) ───\n if (CONDITIONAL_OPS.has(operator)) {\n if (operator === \"?:\") {\n const test = resolveOperand(target, state, event, iterCtx, subTrace(trace, \"target\"));\n if (trace) {\n // Editor mode: evaluate both branches so each carries a live value.\n const consequent = resolveOperand(value, state, event, iterCtx, subTrace(trace, \"value\"));\n const alternate = resolveOperand(\n initial,\n state,\n event,\n iterCtx,\n subTrace(trace, \"initial\"),\n );\n return test ? consequent : alternate;\n }\n return test\n ? resolveOperand(value, state, event, iterCtx)\n : resolveOperand(initial, state, event, iterCtx);\n }\n // Switch — value-keyed selection; discriminant matched against case keys by string form.\n const discriminant = resolveOperand(target, state, event, iterCtx, subTrace(trace, \"target\"));\n const key = String(discriminant);\n const cases = node.cases ?? {};\n const matched = Object.hasOwn(cases, key);\n if (trace) {\n let result: unknown;\n for (const [k, caseOperand] of Object.entries(cases)) {\n const v = resolveOperand(caseOperand, state, event, iterCtx, subTrace(trace, [\"cases\", k]));\n if (k === key) {\n result = v;\n }\n }\n const fallback = resolveOperand(\n node.default,\n state,\n event,\n iterCtx,\n subTrace(trace, \"default\"),\n );\n return matched ? result : fallback;\n }\n return matched\n ? resolveOperand(cases[key], state, event, iterCtx)\n : resolveOperand(node.default, state, event, iterCtx);\n }\n\n // ─── Binary (pure) ───\n if (BINARY_OPS.has(operator)) {\n const left = resolveOperand(\n target,\n state,\n event,\n iterCtx,\n subTrace(trace, \"target\"),\n ) as number & string;\n const right = resolveOperand(value, state, event, iterCtx, subTrace(trace, \"value\")) as number &\n string;\n switch (operator) {\n case \"+\": {\n return left + right;\n }\n case \"-\": {\n return left - right;\n }\n case \"*\": {\n return left * right;\n }\n case \"/\": {\n return left / right;\n }\n case \"%\": {\n return left % right;\n }\n case \"===\": {\n return left === right;\n }\n case \"!==\": {\n return left !== right;\n }\n case \"<\": {\n return left < right;\n }\n case \"<=\": {\n return left <= right;\n }\n case \">\": {\n return left > right;\n }\n case \">=\": {\n return left >= right;\n }\n case \"&&\": {\n return left && right;\n }\n case \"||\": {\n return left || right;\n }\n case \"??\": {\n return (left as unknown) ?? (right as unknown);\n }\n default: {\n break;\n }\n }\n }\n\n // ─── Assignment ───\n if (ASSIGNMENT_OPS.has(operator)) {\n const rhs = resolveOperand(value, state, event, iterCtx, subTrace(trace, \"value\")) as number;\n const { obj, key } = resolveWritableRef(\n (target as { $ref: string }).$ref,\n state,\n event,\n iterCtx,\n );\n switch (operator) {\n case \"=\": {\n obj[key] = rhs;\n break;\n }\n case \"+=\": {\n const current = obj[key] as number;\n obj[key] = current + rhs;\n break;\n }\n case \"-=\": {\n const current = obj[key] as number;\n obj[key] = current - rhs;\n break;\n }\n case \"*=\": {\n const current = obj[key] as number;\n obj[key] = current * rhs;\n break;\n }\n case \"/=\": {\n const current = obj[key] as number;\n obj[key] = current / rhs;\n break;\n }\n default: {\n break;\n }\n }\n return;\n }\n\n // ─── Array methods ───\n if (ARRAY_METHOD_OPS.has(operator)) {\n const arr: unknown[] = resolveOperand(\n target,\n state,\n event,\n iterCtx,\n subTrace(trace, \"target\"),\n ) as unknown[];\n switch (operator) {\n case \"push\": {\n return arr.push(resolveOperand(value, state, event, iterCtx, subTrace(trace, \"value\")));\n }\n case \"unshift\": {\n return arr.unshift(resolveOperand(value, state, event, iterCtx, subTrace(trace, \"value\")));\n }\n case \"pop\": {\n return arr.pop();\n }\n case \"shift\": {\n return arr.shift();\n }\n case \"splice\": {\n const args: unknown[] = resolveOperand(\n value,\n state,\n event,\n iterCtx,\n subTrace(trace, \"value\"),\n ) as unknown[];\n return (arr.splice as (...a: unknown[]) => unknown[])(...args);\n }\n default: {\n break;\n }\n }\n }\n\n // ─── Pure standard-library methods (spec §19.4d) ───\n if (PURE_METHOD_OPS.has(operator)) {\n const receiver = resolveOperand(target, state, event, iterCtx, subTrace(trace, \"target\"));\n const args =\n value === undefined\n ? []\n : Array.isArray(value)\n ? (resolveOperand(value, state, event, iterCtx, subTrace(trace, \"value\")) as unknown[])\n : [resolveOperand(value, state, event, iterCtx, subTrace(trace, \"value\"))];\n const method = (receiver as Record<string, unknown> | null | undefined)?.[operator];\n if (typeof method !== \"function\") {\n // Null-safe, like path reads: a missing receiver or method yields undefined, not a throw.\n return undefined;\n }\n return (method as (...a: unknown[]) => unknown).apply(receiver, args);\n }\n\n // ─── Aggregates (pure) ───\n if (AGGREGATE_OPS.has(operator)) {\n const arr: unknown[] = resolveOperand(\n target,\n state,\n event,\n iterCtx,\n subTrace(trace, \"target\"),\n ) as unknown[];\n // Trace only the first iteration's per-item expression — one sample badge per node,\n // Not one report per array element.\n if (operator === \"reduce\") {\n let acc: unknown = resolveOperand(initial, state, event, iterCtx, subTrace(trace, \"initial\"));\n for (const [index, item] of arr.entries()) {\n acc = evaluateExpression(\n value as ExpressionNode,\n state,\n event,\n { acc, index, item },\n index === 0 ? subTrace(trace, \"value\") : undefined,\n );\n }\n return acc;\n }\n if (operator === \"map\") {\n return arr.map((item: unknown, index: number) =>\n evaluateExpression(\n value as ExpressionNode,\n state,\n event,\n { ...iterCtx, index, item },\n index === 0 ? subTrace(trace, \"value\") : undefined,\n ),\n );\n }\n if (operator === \"filter\") {\n return arr.filter((item: unknown, index: number) =>\n evaluateExpression(\n value as ExpressionNode,\n state,\n event,\n { ...iterCtx, index, item },\n index === 0 ? subTrace(trace, \"value\") : undefined,\n ),\n );\n }\n }\n\n return undefined;\n}\n\n// ─── Compiler: Expression → JS Source ────────────────────────────────────────\n\n/** Compile an operand to a JS source string. */\nfunction compileOperand(operand: unknown, opts: CompileOpts): string {\n if (operand === null) {\n return \"null\";\n }\n if (operand === undefined) {\n return \"undefined\";\n }\n\n // Nested expression node\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"operator\" in operand) {\n return compileExpression(operand as ExpressionNode, opts);\n }\n\n // $ref pointer\n if (typeof operand === \"object\" && !Array.isArray(operand) && \"$ref\" in operand) {\n return compileRef((operand as { $ref: string }).$ref, opts);\n }\n\n // Array of operands\n if (Array.isArray(operand)) {\n return operand.map((o: unknown) => compileOperand(o, opts)).join(\", \");\n }\n\n // Literal\n return JSON.stringify(operand);\n}\n\n/**\n * The module-scope function name a named formula compiles to. Shared by call-site emission here and\n * the declaration emission in the compiler targets.\n *\n * @param {string} key\n * @returns {string}\n */\nexport function formulaFnName(key: string) {\n return `_fx_${key.replaceAll(/[^A-Za-z0-9_$]/g, \"_\")}`;\n}\n\n/**\n * Compile a $ref to its JS equivalent.\n *\n * @param {string} ref\n * @param {CompileOpts} opts\n * @returns {string}\n */\nfunction compileRef(ref: string, opts: CompileOpts) {\n const s = opts.statePrefix ?? \"state\";\n const e = opts.eventParam ?? \"event\";\n\n if (ref === \"$reduce/acc\") {\n return \"_acc\";\n }\n if (ref.startsWith(\"$reduce/\")) {\n return \"_acc\";\n }\n if (ref.startsWith(\"$args/\")) {\n const parts = ref.slice(\"$args/\".length).split(\"/\");\n return `_args${parts.map((p) => `[${JSON.stringify(p)}]`).join(\"\")}`;\n }\n\n if (ref.startsWith(\"event#/\")) {\n const path = ref.slice(\"event#/\".length);\n return `${e}.${path.replaceAll(\"/\", \".\")}`;\n }\n\n if (ref.startsWith(\"$map/\")) {\n const parts = ref.split(\"/\");\n const [, key] = parts;\n if (key === \"item\") {\n return parts.length > 2 ? `_item.${parts.slice(2).join(\".\")}` : \"_item\";\n }\n if (key === \"index\") {\n return \"_index\";\n }\n return `_${key}`;\n }\n\n if (ref.startsWith(\"#/state/\")) {\n const path = ref.slice(\"#/state/\".length);\n return `${s}.${path.replaceAll(\"/\", \".\")}`;\n }\n\n if (ref.startsWith(\"parent#/\")) {\n return `${s}.${ref.slice(\"parent#/\".length)}`;\n }\n if (ref.startsWith(\"window#/\")) {\n return `window.${ref.slice(\"window#/\".length).replaceAll(\"/\", \".\")}`;\n }\n if (ref.startsWith(\"document#/\")) {\n return `document.${ref.slice(\"document#/\".length).replaceAll(\"/\", \".\")}`;\n }\n\n return `${s}.${ref}`;\n}\n\n/** Compile a writable $ref target to its JS equivalent (for LHS of assignment). */\nfunction compileTarget(target: unknown, opts: CompileOpts): string {\n if (typeof target === \"object\" && target !== null && \"$ref\" in target) {\n return compileRef((target as { $ref: string }).$ref, opts);\n }\n return compileOperand(target, opts);\n}\n\n/**\n * Compile an expression node to a JS source string. Returns a statement for mutating ops, a value\n * expression for pure ops.\n *\n * @param {ExpressionNode} node\n * @param {CompileOpts} [opts]\n * @returns {string}\n */\n/**\n * Emit the inline JS for a synthetic blessed helper (see BLESSED_HELPERS), or null for ordinary\n * globals that compile to a plain `window.<path>` call.\n *\n * @param {string} path - The `window#/`-stripped callee path (e.g. \"Intl/formatNumber\")\n * @param {string[]} args - Already-compiled argument expressions\n * @returns {string | null}\n */\nfunction compileHelperCall(path: string, args: string[]): string | null {\n const a = (i: number) => args[i] ?? \"undefined\";\n switch (path) {\n case \"Intl/formatNumber\": {\n return `new Intl.NumberFormat(${a(1)}, ${a(2)}).format(${a(0)})`;\n }\n case \"Intl/formatDate\": {\n return `new Intl.DateTimeFormat(${a(1)}, ${a(2)}).format(new Date(${a(0)}))`;\n }\n case \"Intl/formatRelativeTime\": {\n return `new Intl.RelativeTimeFormat(${a(2)}, ${a(3)}).format(${a(0)}, ${a(1)})`;\n }\n default: {\n return null;\n }\n }\n}\n\nexport function compileExpression(node: ExpressionNode, opts: CompileOpts = {}): string {\n const { operator, target, value, initial } = node;\n\n // ─── Unary ───\n if (UNARY_OPS.has(operator) && !(\"value\" in node)) {\n const operand: string = compileOperand(target, opts);\n if (operator === \"!\") {\n return `!(${operand})`;\n }\n if (operator === \"-\") {\n return `-(${operand})`;\n }\n }\n\n // ─── Call (spec §19.4c) ───\n if (operator === \"call\") {\n const calleeRef = (target as { $ref?: string } | null)?.$ref ?? \"\";\n const args = Array.isArray(value) ? value.map((o: unknown) => compileOperand(o, opts)) : [];\n if (calleeRef.startsWith(\"window#/\")) {\n if (!isBlessedGlobal(calleeRef)) {\n throw new Error(`$expression: \"${calleeRef}\" is not a blessed pure global`);\n }\n const helperJs = compileHelperCall(calleeRef.slice(\"window#/\".length), args);\n if (helperJs) {\n return helperJs;\n }\n return `window.${calleeRef.slice(\"window#/\".length).replaceAll(\"/\", \".\")}(${args.join(\", \")})`;\n }\n if (calleeRef.startsWith(\"#/state/\")) {\n const key = calleeRef.slice(\"#/state/\".length);\n const params = opts.formulaParams?.[key];\n if (params) {\n const named = params\n .map((p, i) => `${JSON.stringify(p)}: ${args[i] ?? \"undefined\"}`)\n .join(\", \");\n return `${formulaFnName(key)}(${opts.statePrefix ?? \"state\"}, { ${named} })`;\n }\n }\n // Fallback: the scope member itself is callable.\n return `${compileRef(calleeRef, opts)}(${args.join(\", \")})`;\n }\n\n // ─── Conditional (pure) ───\n if (CONDITIONAL_OPS.has(operator)) {\n if (operator === \"?:\") {\n const test: string = compileOperand(target, opts);\n const consequent: string = compileOperand(value, opts);\n const alternate: string = compileOperand(initial, opts);\n return `(${test} ? ${consequent} : ${alternate})`;\n }\n // Switch — bind the discriminant's string form once, then chain strict-equality tests.\n const discriminant: string = compileOperand(target, opts);\n const chain = Object.entries(node.cases ?? {})\n .map(([k, v]) => `_d === ${JSON.stringify(k)} ? ${compileOperand(v, opts)} : `)\n .join(\"\");\n const fallback = \"default\" in node ? compileOperand(node.default, opts) : \"undefined\";\n return `((_d) => ${chain}${fallback})(String(${discriminant}))`;\n }\n\n // ─── Binary (pure) ───\n if (BINARY_OPS.has(operator)) {\n const left: string = compileOperand(target, opts);\n const right: string = compileOperand(value, opts);\n return `(${left} ${operator} ${right})`;\n }\n\n // ─── Assignment ───\n if (ASSIGNMENT_OPS.has(operator)) {\n const lhs: string = compileTarget(target, opts);\n const rhs: string = compileOperand(value, opts);\n return `${lhs} ${operator} ${rhs}`;\n }\n\n // ─── Array methods ───\n if (ARRAY_METHOD_OPS.has(operator)) {\n const arr: string = compileTarget(target, opts);\n switch (operator) {\n case \"push\": {\n return `${arr}.push(${compileOperand(value, opts)})`;\n }\n case \"unshift\": {\n return `${arr}.unshift(${compileOperand(value, opts)})`;\n }\n case \"pop\": {\n return `${arr}.pop()`;\n }\n case \"shift\": {\n return `${arr}.shift()`;\n }\n case \"splice\": {\n const args: string = Array.isArray(value)\n ? value.map((o: unknown) => compileOperand(o, opts)).join(\", \")\n : compileOperand(value, opts);\n return `${arr}.splice(${args})`;\n }\n default: {\n break;\n }\n }\n }\n\n // ─── Pure standard-library methods (spec §19.4d) ───\n if (PURE_METHOD_OPS.has(operator)) {\n const receiver: string = compileOperand(target, opts);\n const args: string =\n value === undefined\n ? \"\"\n : Array.isArray(value)\n ? value.map((o: unknown) => compileOperand(o, opts)).join(\", \")\n : compileOperand(value, opts);\n // ?.method?.() matches the interpreter: missing receiver or method yields undefined.\n return `(${receiver})?.${operator}?.(${args})`;\n }\n\n // ─── Aggregates (pure) ───\n if (AGGREGATE_OPS.has(operator)) {\n const arr: string = compileOperand(target, opts);\n const itemExpr: string = compileExpression(value as ExpressionNode, opts);\n if (operator === \"reduce\") {\n const seed: string = compileOperand(initial, opts);\n return `${arr}.reduce((_acc, _item, _index) => ${itemExpr}, ${seed})`;\n }\n if (operator === \"map\") {\n return `${arr}.map((_item, _index) => ${itemExpr})`;\n }\n if (operator === \"filter\") {\n return `${arr}.filter((_item, _index) => ${itemExpr})`;\n }\n }\n\n return \"undefined\";\n}\n\n// ─── Utilities ───────────────────────────────────────────────────────────────\n\n/** Resolve a dotted/slashed path on an object. */\nfunction getPath(obj: unknown, path: string): unknown {\n let current: unknown = obj;\n for (const k of path.split(/[./]/)) {\n current = (current as Record<string, unknown>)?.[k];\n }\n return current;\n}\n\n// ─── Statement-Engine Surface (spec §20) ─────────────────────────────────────\n\n/**\n * Evaluate a bare operand (pointer, literal, or nested node) outside a node position — used by\n * statement execution (spec §20) for `if` tests and `$switch` discriminants.\n */\nexport function evaluateOperand(\n operand: unknown,\n state: JxScope,\n event: Event | null,\n iterCtx?: IterCtx,\n): unknown {\n return resolveOperand(operand, state, event, iterCtx);\n}\n\n/** Compile a bare operand to JS source — the statement compiler's counterpart to evaluateOperand. */\nexport function compileOperandSource(operand: unknown, opts: CompileOpts = {}): string {\n return compileOperand(operand, opts);\n}\n\nexport type { CompileOpts, IterCtx };\n",
9
+ "/**\n * Type predicate guards for the Jx document model.\n *\n * These narrow `unknown`/union-typed values to precise domain types so call sites get real property\n * checking instead of casts. Every guard mirrors the runtime's actual detection logic (see\n * buildScope's five-shape algorithm in the runtime).\n */\n\nimport type {\n JsonObject,\n JsonValue,\n JxClassDef,\n JxElement,\n JxEventBinding,\n JxExpressionDef,\n JxFunctionDef,\n JxMappedArray,\n JxMutableNode,\n JxPrototypeDef,\n JxRef,\n JxServerFnDef,\n JxStatement,\n JxStateObject,\n JxStyle,\n} from \"../types\";\n\n// ─── JSON shape guards ──────────────────────────────────────────────────────────\n\n/** A plain object: not null, not an array. The base check for all object-shaped defs. */\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n// ─── Binding guards ─────────────────────────────────────────────────────────────\n\n/** A `{ $ref: \"#/...\" }` JSON Pointer reference. */\nexport function isRef(value: unknown): value is JxRef {\n return isJsonObject(value) && typeof value.$ref === \"string\";\n}\n\n// ─── State definition guards (the five-shape algorithm) ────────────────────────\n\n/** Shape 4: a function declaration — `{ $prototype: \"Function\", body | $src }`. */\nexport function isFunctionDef(value: unknown): value is JxFunctionDef {\n return isJsonObject(value) && value.$prototype === \"Function\";\n}\n\n/** Shape 5: a declarative expression entry — `{ $expression: { operator, target } }`. */\nexport function isExpressionDef(value: unknown): value is JxExpressionDef {\n return isJsonObject(value) && isJsonObject(value.$expression);\n}\n\n/**\n * Shape 5 with `parameters`: a named formula — a pure, reusable computation invoked via the `call`\n * operator rather than lowered to a computed value.\n */\nexport function isNamedFormulaDef(\n value: unknown,\n): value is JxExpressionDef & { parameters: unknown[] } {\n return isExpressionDef(value) && Array.isArray(value.parameters) && value.parameters.length > 0;\n}\n\n/**\n * Shape 4 with a structured body: a Function entry whose `body` is a statement array (spec §20)\n * rather than opaque JS source.\n */\nexport function hasStructuredBody(\n value: unknown,\n): value is JxFunctionDef & { body: JxStatement[] } {\n return isFunctionDef(value) && Array.isArray(value.body);\n}\n\n/** A non-Function `$prototype` instance (Request, Storage, ContentCollection, classes, …). */\nexport function isPrototypeDef(value: unknown): value is JxPrototypeDef {\n return (\n isJsonObject(value) && typeof value.$prototype === \"string\" && value.$prototype !== \"Function\"\n );\n}\n\n/** A `timing: \"server\"` function proxy (no `$prototype`, external `$src`/`$export`). */\nexport function isServerFnDef(value: unknown): value is JxServerFnDef {\n return (\n isJsonObject(value) &&\n value.timing === \"server\" &&\n typeof value.$src === \"string\" &&\n typeof value.$export === \"string\" &&\n !value.$prototype\n );\n}\n\n/** Shape 2: an expanded signal — an object carrying a `default` value. */\nexport function isExpandedSignal(value: unknown): value is JxStateObject & { default: JsonValue } {\n return isJsonObject(value) && !value.$prototype && !value.$expression && \"default\" in value;\n}\n\n/**\n * Schema-only keywords used to detect pure type definitions (Shape 2b). An object with ONLY these\n * keys and no `default` is a type def, not a signal.\n */\nexport const SCHEMA_KEYWORDS: ReadonlySet<string> = new Set([\n \"type\",\n \"enum\",\n \"minimum\",\n \"maximum\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"format\",\n \"items\",\n \"properties\",\n \"required\",\n \"description\",\n \"title\",\n \"$comment\",\n]);\n\n/** Shape 2b: a pure type definition — every key is a JSON Schema keyword. */\nexport function isSchemaOnlyDef(value: unknown): value is JxStateObject {\n if (!isJsonObject(value)) {\n return false;\n }\n for (const k of Object.keys(value)) {\n if (!SCHEMA_KEYWORDS.has(k)) {\n return false;\n }\n }\n return true;\n}\n\n/** True when an object carries at least one JSON Schema keyword. */\nexport function hasSchemaKeywords(value: unknown): value is JxStateObject {\n if (!isJsonObject(value)) {\n return false;\n }\n for (const k of Object.keys(value)) {\n if (SCHEMA_KEYWORDS.has(k)) {\n return true;\n }\n }\n return false;\n}\n\n// ─── Document structure guards ──────────────────────────────────────────────────\n\n/** A mapped (repeater) children object — `{ $prototype: \"Array\", items, map }`. */\nexport function isMappedArray(value: unknown): value is JxMappedArray {\n return isJsonObject(value) && value.$prototype === \"Array\";\n}\n\n/**\n * Whether a node's `children` holds at least one mapped array — either as the bare whole-children\n * slot (legacy) or as a member of the children array. Used by renderers and the compiler to decide\n * if a children list needs inline repeater expansion.\n */\nexport function childrenContainArray(children?: unknown): boolean {\n if (isMappedArray(children)) {\n return true;\n }\n return Array.isArray(children) && children.some((c) => isMappedArray(c));\n}\n\n/** A .class.json schema-defined class document — `{ $prototype: \"Class\" }`. */\nexport function isClassDef(value: unknown): value is JxClassDef {\n return isJsonObject(value) && value.$prototype === \"Class\";\n}\n\n/** An element-shaped node object (vs. a bare string/number child). */\nexport function isNodeObject(value: unknown): value is JxMutableNode & JxElement {\n return isJsonObject(value);\n}\n\n/** A `${...}` template-expression string. */\nexport function isTemplateString(value?: unknown): value is string {\n return typeof value === \"string\" && value.includes(\"${\");\n}\n\n// ─── Style guards & accessors ───────────────────────────────────────────────────\n\n/** A nested style object (selector/media block), as opposed to a scalar CSS value. */\nexport function isNestedStyle(value: string | number | JxStyle | undefined): value is JxStyle {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Read a nested style block (`:hover`, `@--md`, `& > li`, …), if present. */\nexport function getNestedStyle(style: JxStyle | undefined, key: string): JxStyle | undefined {\n const value = style?.[key];\n return isNestedStyle(value) ? value : undefined;\n}\n\n/** Read a nested style block, creating an empty one in place when absent or scalar. */\nexport function ensureNestedStyle(style: JxStyle, key: string): JxStyle {\n const existing = style[key];\n if (isNestedStyle(existing)) {\n return existing;\n }\n const created: JxStyle = {};\n style[key] = created;\n return created;\n}\n\n// ─── Event binding guards ───────────────────────────────────────────────────────\n\n/**\n * The value of an `on*` document key: a `$ref`, an inline function declaration, or a declarative\n * expression.\n */\nexport function isEventBinding(value: unknown): value is JxEventBinding {\n return isRef(value) || isFunctionDef(value) || isExpressionDef(value);\n}\n\n/** Read the event binding stored under an `on*` key of a node, if there is one. */\nexport function getEventBinding(\n node: JxMutableNode | JxElement,\n key: string,\n): JxEventBinding | undefined {\n const value = node[key];\n return isEventBinding(value) ? value : undefined;\n}\n\n// ─── Parameter helpers ──────────────────────────────────────────────────────────\n\n/** Resolve `parameters` entries (bare strings or CEM objects) to their names. */\nexport function paramNames(parameters: JxFunctionDef[\"parameters\"]): string[] {\n if (!parameters) {\n return [];\n }\n return parameters.map((p) => (typeof p === \"string\" ? p : p.name));\n}\n",
10
+ "/// <reference lib=\"dom\" />\n/**\n * Jx Statement Engine (spec §20) — structured function bodies.\n *\n * A Function entry's `body` may be a statement array instead of opaque JS source. This module is\n * the statements counterpart to expression.ts, with the same dual shape: `runStatements`\n * (interpreter) and `compileStatements` (JS emitter), shared by the runtime and every compiler\n * target. Statement kinds reuse web-platform names only: bare expression nodes (§19), the JSON\n * Schema `if`/`then`/`else` triple, `$switch`/`cases` in statement position, and WHATWG's\n * `dispatchEvent` with `CustomEventInit` members.\n */\n\nimport {\n compileExpression,\n compileOperandSource,\n evaluateExpression,\n evaluateOperand,\n} from \"./expression.ts\";\n\nimport type { JxStatement } from \"@jxsuite/schema/types\";\nimport type { CompileOpts, ExpressionNode, IterCtx } from \"./expression.ts\";\nimport type { JxScope } from \"./types.ts\";\n\ninterface RunOpts {\n /** Named-formula-style arguments bound for $args/<name> refs in the body. */\n args?: Record<string, unknown>;\n /** Dispatch target for dispatchEvent statements; defaults to event?.currentTarget. */\n target?: EventTarget | null;\n}\n\nfunction statementKind(statement: JxStatement): \"expression\" | \"if\" | \"switch\" | \"dispatch\" {\n if (\"operator\" in statement) {\n return \"expression\";\n }\n if (\"if\" in statement) {\n return \"if\";\n }\n if (\"$switch\" in statement) {\n return \"switch\";\n }\n return \"dispatch\";\n}\n\n/**\n * Execute a statement list sequentially against the reactive scope. A statement whose value is a\n * thenable is awaited before the next runs (ECMA async/await semantics); purely synchronous bodies\n * complete synchronously before the returned promise settles.\n */\nexport async function runStatements(\n statements: JxStatement[],\n state: JxScope,\n event: Event | null,\n opts: RunOpts = {},\n): Promise<void> {\n const iterCtx: IterCtx | undefined = opts.args ? { args: opts.args } : undefined;\n for (const statement of statements) {\n switch (statementKind(statement)) {\n case \"expression\": {\n const result = evaluateExpression(statement as ExpressionNode, state, event, iterCtx);\n if (result && typeof (result as PromiseLike<unknown>).then === \"function\") {\n await (result as PromiseLike<unknown>);\n }\n break;\n }\n case \"if\": {\n const branch = statement as { if: unknown; then: JxStatement[]; else?: JxStatement[] };\n const taken = evaluateOperand(branch.if, state, event, iterCtx) ? branch.then : branch.else;\n if (Array.isArray(taken)) {\n await runStatements(taken, state, event, opts);\n }\n break;\n }\n case \"switch\": {\n const branch = statement as {\n $switch: unknown;\n cases: Record<string, JxStatement[]>;\n default?: JxStatement[];\n };\n const key = String(evaluateOperand(branch.$switch, state, event, iterCtx));\n const cases = branch.cases ?? {};\n const taken = Object.hasOwn(cases, key) ? cases[key] : branch.default;\n if (Array.isArray(taken)) {\n await runStatements(taken, state, event, opts);\n }\n break;\n }\n case \"dispatch\": {\n const dispatch = statement as {\n dispatchEvent: string;\n detail?: unknown;\n bubbles?: boolean;\n composed?: boolean;\n };\n const target = opts.target ?? event?.currentTarget;\n if (!target) {\n break;\n }\n const init: CustomEventInit = {};\n if (\"detail\" in dispatch) {\n init.detail = evaluateOperand(dispatch.detail, state, event, iterCtx);\n }\n if (dispatch.bubbles !== undefined) {\n init.bubbles = dispatch.bubbles;\n }\n if (dispatch.composed !== undefined) {\n init.composed = dispatch.composed;\n }\n target.dispatchEvent(new CustomEvent(dispatch.dispatchEvent, init));\n break;\n }\n default: {\n break;\n }\n }\n }\n}\n\ninterface StatementCompileOpts extends CompileOpts {\n /** JS expression for the dispatchEvent target; defaults to `(event && event.currentTarget)`. */\n dispatchTarget?: string;\n /** Indentation prefix for emitted lines. */\n indent?: string;\n}\n\n/**\n * Compile a statement list to a JS statement block (no surrounding braces). Mirrors `runStatements`\n * exactly; each statement kind lowers to its genuine ECMAScript form — expression statements,\n * `if`/`else`, `switch` over the discriminant's string form, and `dispatchEvent(new\n * CustomEvent(...))`.\n */\nexport function compileStatements(\n statements: JxStatement[],\n opts: StatementCompileOpts = {},\n): string {\n const indent = opts.indent ?? \"\";\n const lines: string[] = [];\n for (const statement of statements) {\n switch (statementKind(statement)) {\n case \"expression\": {\n lines.push(`${indent}${compileExpression(statement as ExpressionNode, opts)};`);\n break;\n }\n case \"if\": {\n const branch = statement as { if: unknown; then: JxStatement[]; else?: JxStatement[] };\n const test = compileOperandSource(branch.if, opts);\n const inner = { ...opts, indent: `${indent} ` };\n lines.push(`${indent}if (${test}) {`, compileStatements(branch.then ?? [], inner));\n if (branch.else) {\n lines.push(`${indent}} else {`, compileStatements(branch.else, inner));\n }\n lines.push(`${indent}}`);\n break;\n }\n case \"switch\": {\n const branch = statement as {\n $switch: unknown;\n cases: Record<string, JxStatement[]>;\n default?: JxStatement[];\n };\n const disc = compileOperandSource(branch.$switch, opts);\n const inner = { ...opts, indent: `${indent} ` };\n lines.push(`${indent}switch (String(${disc})) {`);\n for (const [key, caseStatements] of Object.entries(branch.cases ?? {})) {\n lines.push(\n `${indent} case ${JSON.stringify(key)}: {`,\n compileStatements(caseStatements, inner),\n `${indent} break;`,\n `${indent} }`,\n );\n }\n if (branch.default) {\n lines.push(\n `${indent} default: {`,\n compileStatements(branch.default, inner),\n `${indent} }`,\n );\n }\n lines.push(`${indent}}`);\n break;\n }\n case \"dispatch\": {\n const dispatch = statement as {\n dispatchEvent: string;\n detail?: unknown;\n bubbles?: boolean;\n composed?: boolean;\n };\n const eventName = opts.eventParam ?? \"event\";\n const target = opts.dispatchTarget ?? `(${eventName} && ${eventName}.currentTarget)`;\n const init: string[] = [];\n if (\"detail\" in dispatch) {\n init.push(`detail: ${compileOperandSource(dispatch.detail, opts)}`);\n }\n if (dispatch.bubbles !== undefined) {\n init.push(`bubbles: ${JSON.stringify(dispatch.bubbles)}`);\n }\n if (dispatch.composed !== undefined) {\n init.push(`composed: ${JSON.stringify(dispatch.composed)}`);\n }\n const initSource = init.length > 0 ? `, { ${init.join(\", \")} }` : \"\";\n lines.push(\n `${indent}${target}?.dispatchEvent(new CustomEvent(${JSON.stringify(dispatch.dispatchEvent)}${initSource}));`,\n );\n break;\n }\n default: {\n break;\n }\n }\n }\n return lines.join(\"\\n\");\n}\n",
11
+ "/// <reference lib=\"dom\" />\n/**\n * Jx — JSON-native reactive web component runtime\n * @version 3.0.0\n * @license MIT\n *\n * Four-step pipeline:\n * 1. resolve — fetch JSON source (or accept raw object)\n * 2. buildScope — state detection + reactive proxy construction\n * 3. render — walk resolved tree, build DOM, wire reactive effects\n * 4. output — append to target\n *\n * @module jx\n */\n\nimport {\n computed,\n effect,\n effectScope,\n isRef,\n onEffectCleanup,\n reactive,\n ref,\n toRaw,\n} from \"@vue/reactivity\";\nimport { evaluateExpression, isMutating } from \"./expression.ts\";\nimport type { DynamicClass, JxEventHandler, JxPath, JxRenderOptions, JxScope } from \"./types.ts\";\nimport {\n hasStructuredBody,\n isExpressionDef,\n isFunctionDef,\n isJsonObject,\n isMappedArray,\n isNamedFormulaDef,\n isPrototypeDef,\n isRef as isRefValue,\n isServerFnDef,\n paramNames,\n} from \"@jxsuite/schema/guards\";\nimport { runStatements } from \"./statements.ts\";\nimport type {\n JxAttributeValue,\n JxClassDef,\n JxDocument,\n JxElement,\n JxFunctionDef,\n JxHeadEntry,\n JxMappedArray,\n JxPrototypeDef,\n JxRef,\n JxServerFnDef,\n JxStyle,\n} from \"@jxsuite/schema/types\";\nimport type { Ref } from \"@vue/reactivity\";\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Mount a Jx document into a DOM container.\n *\n * @example\n * import { Jx } from \"@jxsuite/runtime\";\n * const state = await Jx(\"./counter.json\", document.getElementById(\"app\"));\n *\n * @param {string | JxDocument} source - Path to .json file, URL, or raw document object\n * @param {HTMLElement} [target] Default is `document.body`\n * @param {JxRenderOptions} [options]\n * @returns {Promise<JxScope>} Resolves with the live component scope (state reactive\n * proxy)\n */\nexport async function Jx(\n source: string | JxDocument,\n target: HTMLElement = document.body,\n options?: JxRenderOptions,\n) {\n const base = typeof source === \"string\" ? new URL(source, location.href).href : location.href;\n const doc = await resolve(source);\n\n // Register custom elements declared in $elements (depth-first)\n if (doc.$elements) {\n await registerElements(doc.$elements, base);\n }\n\n // Inject <head> elements declared in $head (link, meta, script, etc.)\n if (doc.$head) {\n injectHead(doc.$head, base);\n }\n\n if (doc.$media) {\n _rootMedia = doc.$media;\n }\n\n const state = await buildScope(doc, {}, base);\n target.append(renderNode(doc, state, options));\n if (typeof state.onMount === \"function\") {\n (state.onMount as (s: JxScope) => unknown)(state);\n }\n return state;\n}\n\n// ─── Step 1: Resolve ──────────────────────────────────────────────────────────\n\nconst _resolveCache = new Map<string, Promise<JxDocument>>();\n\nexport async function resolve(source: string | JxDocument): Promise<JxDocument> {\n if (typeof source !== \"string\") {\n return source;\n }\n if (_resolveCache.has(source)) {\n return _resolveCache.get(source)!;\n }\n const p = fetch(source).then((res) => {\n if (!res.ok) {\n throw new Error(`Jx: failed to fetch ${source} (${res.status})`);\n }\n // Trust boundary: fetched sources are Jx documents by contract.\n return res.json() as Promise<JxDocument>;\n });\n _resolveCache.set(source, p);\n return p;\n}\n\n// ─── Step 2: Build scope ──────────────────────────────────────────────────────\n\n/** JSON Schema keywords used to identify pure type definitions (Shape 2b). */\nconst SCHEMA_KEYWORDS = new Set([\n \"type\",\n \"properties\",\n \"items\",\n \"enum\",\n \"minimum\",\n \"maximum\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"required\",\n \"examples\",\n]);\n\n/** /** @type {{ skip: boolean }} */\nconst _serverFnConfig = { skip: false };\n/** Set to true to suppress timing: \"server\" resolution (used by Studio edit mode). */\nexport function setSkipServerFunctions(v: boolean) {\n _serverFnConfig.skip = v;\n}\n\n// ─── Dev-proxy auth token (Studio cross-origin canvas) ────────────────────────\n// The Studio canvas iframe is served from a token-gated loopback origin (createProjectServer): its\n// POST /__jx_resolve__ + /__jx_server__ routes 403 without ?token=<rpcToken>. The iframe boot reads\n// The token from its URL and calls setResolveToken so these dev-proxy fetches authenticate. Unset by\n// Default, leaving production + same-origin dev untouched (bare path, no query appended).\nlet _resolveToken: string | null = null;\nexport function setResolveToken(token: string | null) {\n _resolveToken = token || null;\n}\n/** Append the dev-proxy auth token to a privileged resolve path when one is configured. */\nfunction resolveProxyPath(path: string): string {\n return _resolveToken ? `${path}?token=${encodeURIComponent(_resolveToken)}` : path;\n}\n\n/** @deprecated No longer needed — ContentCollection/ContentEntry resolve via generic class path */\nexport function setSkipContentResolution(_v: boolean) {\n // No-op retained for API compatibility\n}\n\n/**\n * Observe runtime-created reactive values: runs `fn` immediately inside a reactive effect and\n * re-runs it whenever a tracked value changes; returns a disposer. Dep tracking in @vue/reactivity\n * is per module INSTANCE, so an effect created from another copy of the package (e.g. the studio's\n * own pin) can never track a ref/reactive created here — consumers that want to observe\n * runtime-resolved scope values (the Studio canvas iframe's dataScope re-post) must use this.\n *\n * @param {() => void} fn - Read the reactive values to observe inside this callback.\n * @returns {() => void} Disposer — stops the effect and its scope.\n */\nexport function observeScope(fn: () => void): () => void {\n const scope = effectScope(true);\n scope.run(() => {\n effect(fn);\n });\n return () => scope.stop();\n}\n\n/**\n * Run `fn` inside a detached reactive scope of THIS module's reactivity instance, returning its\n * result plus a disposer that stops every effect `fn` created. Callers that render via\n * {@link renderNode} and later tear the render down (the Studio canvas full render and its surgical\n * subtree re-renders) MUST use this instead of their own effectScope: scope collection is per\n * vue-reactivity module instance, so a scope from another copy of the package collects NOTHING and\n * its stop() silently leaks every binding effect of the superseded render.\n *\n * @param {() => T} fn - Work that may create reactive effects (typically a renderNode call).\n * @returns {{ result: T; stop: () => void }} The callback result and the scope disposer.\n */\nexport function runScoped<T>(fn: () => T): { result: T; stop: () => void } {\n const scope = effectScope(true);\n try {\n const result = scope.run(fn) as T;\n return { result, stop: () => scope.stop() };\n } catch (error) {\n // A throwing fn would otherwise leak the effects it created before failing.\n scope.stop();\n throw error;\n }\n}\n\n/**\n * Studio-canvas viewport-unit transpose. The canvas iframe is sized to its document's height, so\n * any viewport unit (`vh`/`vw`/`vmin`/`vmax`/`svh`/…) — which resolves against the iframe ELEMENT —\n * would feed back into an ever-growing height. When this is on, the runtime transposes them to\n * CONTAINER units (`cqh`/`cqw`/…) that resolve against the canvas's fixed-size query container (see\n * `canvas.html`): a predictable, feedback-free stand-in for the viewport. Off (the default) leaves\n * CSS untouched for real production rendering.\n */\nlet _canvasViewportTranspose = false;\nexport function setCanvasViewportTranspose(on: boolean) {\n _canvasViewportTranspose = on;\n}\n\nconst VIEWPORT_UNIT_RE = /(-?\\d*\\.?\\d+)(?:s|l|d)?v(h|w|min|max|i|b)\\b/gi;\nconst VIEWPORT_UNIT_MAP: Record<string, string> = {\n b: \"cqb\",\n h: \"cqh\",\n i: \"cqi\",\n max: \"cqmax\",\n min: \"cqmin\",\n w: \"cqw\",\n};\n\n/**\n * Transpose CSS viewport units → container-query units in a value string, but only when the\n * studio-canvas flag is set (otherwise the value is returned untouched). `100vh` → `100cqh`,\n * `50svw` → `50cqw`, `10vmin` → `10cqmin`, etc.\n */\nexport function transposeCanvasUnits(value: string): string {\n if (!_canvasViewportTranspose || !value.includes(\"v\")) {\n return value;\n }\n return value.replace(\n VIEWPORT_UNIT_RE,\n (_m, num: string, dim: string) => `${num}${VIEWPORT_UNIT_MAP[dim.toLowerCase()] ?? `cq${dim}`}`,\n );\n}\n\n/**\n * Studio-canvas anchor de-linking. In the editor canvas a rendered `<a href>` would navigate the\n * iframe when clicked, fighting element selection. When this is on, the runtime stamps the value on\n * `data-jx-href` instead of `href` so the anchor is inert (selectable, not a live link) while the\n * original target stays recoverable for richer link handling later. Off (the default) leaves\n * production rendering untouched; the studio sets it for design/edit (not preview — see\n * iframe-render).\n */\nlet _canvasDelinkAnchors = false;\nexport function setCanvasDelinkAnchors(on: boolean) {\n _canvasDelinkAnchors = on;\n}\n\n/** The attribute name to stamp `key` on `el` under — `href` → `data-jx-href` on de-linked anchors. */\nfunction canvasAttrName(el: HTMLElement, key: string): string {\n if (_canvasDelinkAnchors && key === \"href\" && (el.tagName === \"A\" || el.tagName === \"AREA\")) {\n return \"data-jx-href\";\n }\n return key;\n}\n\n/**\n * Studio-canvas prop-binding markers. When on, `bindProperty` stamps `data-jx-bound-prop=\"<key>\"`\n * on elements whose `textContent` is an invertible single-key state binding — the pure template\n * `\"${state.key}\"` or `{ \"$ref\": \"#/state/key\" }`. The studio canvas uses the marker to offer\n * inline editing of component-instance prop values; the rendered text must BE the prop value\n * verbatim, so mixed templates and deep paths are never stamped. Off (the default) leaves\n * production rendering untouched; the studio sets it for design/edit (not preview — see\n * iframe-render).\n */\nlet _stampPropBindings = false;\nexport function setStampPropBindings(on: boolean) {\n _stampPropBindings = on;\n}\n\n/** The single invertible template form: the whole string is exactly one `${state.key}` access. */\nconst PURE_STATE_TEMPLATE = /^\\s*\\$\\{\\s*state\\.(\\w+)\\s*\\}\\s*$/;\n\n/** The state key of an invertible `textContent` binding, or null (mixed template, deep path). */\nfunction boundPropKey(key: string, val: unknown, state: JxScope): string | null {\n if (!_stampPropBindings || key !== \"textContent\") {\n return null;\n }\n let sub: string | null = null;\n if (isRefObj(val)) {\n if (!val.$ref.startsWith(\"#/state/\")) {\n return null;\n }\n const rest = val.$ref.slice(\"#/state/\".length);\n sub = rest && !rest.includes(\"/\") ? rest : null;\n } else if (typeof val === \"string\") {\n sub = PURE_STATE_TEMPLATE.exec(val)?.[1] ?? null;\n }\n if (!sub) {\n return null;\n }\n // Only plain writable data entries are per-instance props. Computed/signal entries live as refs\n // In the raw scope (auto-unwrapped by the reactive proxy), and function/object entries (handlers,\n // $prototype instances) are not prop-overridable either — an instance $props write against any of\n // Them would clobber the definition's behavior, so their bindings are never marked editable.\n const stored = (toRaw(state) as Record<string, unknown>)[sub];\n if (isRef(stored) || typeof stored === \"function\") {\n return null;\n }\n if (typeof stored === \"object\" && stored !== null) {\n return null;\n }\n return sub;\n}\n\n/**\n * Build the reactive scope (state) from the document using the five-shape detection algorithm.\n *\n * @param {JxDocument} doc\n * @param {JxScope} [parentScope] Default is `{}`\n * @param {string} [base] Base URL for resolving $src imports. Default is `location.href`\n * @returns {Promise<JxScope>} Reactive proxy (state)\n */\nexport async function buildScope(\n doc: JxDocument,\n parentScope: JxScope = {},\n base: string = location.href,\n) {\n const raw: JxScope = {};\n\n // Merge parent scope properties\n for (const [key, val] of Object.entries(parentScope)) {\n raw[key] = val;\n }\n\n const defs = doc.state ?? {};\n\n // Pass 0: resolve bare $prototype names via import map\n const imports = doc.imports ?? {};\n for (const [, def] of Object.entries(defs)) {\n if (isPrototypeDef(def) && !def.$src) {\n const mapped = imports[def.$prototype];\n if (mapped) {\n if (!mapped.endsWith(\".class.json\")) {\n console.warn(\n `Jx: import \"${def.$prototype}\" must map to a .class.json path, got \"${mapped}\"`,\n );\n continue;\n }\n def.$src = mapped;\n }\n }\n }\n\n // First pass: collect naked values, expanded defaults, plain objects\n for (const [key, def] of Object.entries(defs)) {\n // 1. String value\n if (typeof def === \"string\") {\n if (!def.includes(\"${\")) {\n raw[key] = def;\n } // Shape 1: naked string\n continue; // Template strings handled in second pass\n }\n\n // 2. Number, boolean, null\n if (typeof def === \"number\" || typeof def === \"boolean\" || def === null) {\n raw[key] = def;\n continue;\n }\n\n // 3. Array\n if (Array.isArray(def)) {\n raw[key] = def;\n continue;\n }\n\n // 4. Object\n if (typeof def === \"object\") {\n if (def.$prototype) {\n continue;\n } // Handled in later passes\n if (isExpressionDef(def)) {\n continue;\n } // Handled in pass 2.5\n if (isServerFnDef(def)) {\n continue;\n } // Handled in fifth pass\n if (\"default\" in def) {\n raw[key] = def.default;\n continue;\n } // Shape 2: expanded signal\n if (hasSchemaKeywords(def)) {\n continue;\n } // Shape 2b: pure type def\n raw[key] = def; // Shape 1: plain object\n }\n }\n\n // Wrap in Vue reactive proxy — deep reactivity from this point on\n const state = reactive(raw);\n\n // Second pass: template strings → computed\n for (const [key, def] of Object.entries(defs)) {\n if (typeof def === \"string\" && def.includes(\"${\")) {\n state[key] = computed(() => evaluateTemplate(def, state));\n }\n }\n\n // Pass 2.5: $expression entries (Shape 5)\n for (const [key, def] of Object.entries(defs)) {\n if (isExpressionDef(def)) {\n const node = def.$expression;\n if (isNamedFormulaDef(def)) {\n // A named formula: callable with positional args mapped onto its declared parameters.\n const params = def.parameters as (string | { name?: string; default?: unknown })[];\n state[key] = (...argValues: unknown[]) => {\n const args: Record<string, unknown> = {};\n for (const [i, p] of params.entries()) {\n const name = typeof p === \"string\" ? p : (p?.name ?? \"\");\n if (!name) {\n continue;\n }\n args[name] =\n argValues[i] === undefined && typeof p === \"object\" && p !== null && \"default\" in p\n ? p.default\n : argValues[i];\n }\n return evaluateExpression(node, state, null, { args });\n };\n } else if (isMutating(node.operator)) {\n const handler: JxEventHandler = (s, event) => evaluateExpression(node, s, event);\n state[key] = handler;\n } else {\n state[key] = computed(() => evaluateExpression(node, state, null));\n }\n }\n }\n\n // Third pass: $prototype: \"Function\" entries\n for (const [key, def] of Object.entries(defs)) {\n if (hasStructuredBody(def)) {\n // Structured body (spec §20): with parameters → a callable mapping positional args onto\n // $args names (invoked via the call operator); without → an event handler.\n const { body } = def;\n if (Array.isArray(def.parameters) && def.parameters.length > 0) {\n const params = def.parameters as (string | { name?: string; default?: unknown })[];\n state[key] = (...argValues: unknown[]) => {\n const args: Record<string, unknown> = {};\n for (const [i, p] of params.entries()) {\n const name = typeof p === \"string\" ? p : (p?.name ?? \"\");\n if (!name) {\n continue;\n }\n args[name] =\n argValues[i] === undefined && typeof p === \"object\" && p !== null && \"default\" in p\n ? p.default\n : argValues[i];\n }\n return runStatements(body, state, null, { args });\n };\n } else {\n const handler: JxEventHandler = (s, event) => {\n void runStatements(body, s, event ?? null);\n };\n state[key] = handler;\n }\n } else if (isFunctionDef(def)) {\n state[key] = await resolveFunction(def, state, key, base);\n }\n }\n\n // Fourth pass: other $prototype entries (Request, Set, Map, etc.)\n for (const [key, def] of Object.entries(defs)) {\n if (isPrototypeDef(def)) {\n state[key] = await resolvePrototype(def, state, key, base);\n }\n }\n\n // Fifth pass: timing: \"server\" entries (dev mode — execute client-side, boundary unenforced)\n if (!_serverFnConfig.skip) {\n for (const [key, def] of Object.entries(defs)) {\n if (isServerFnDef(def)) {\n state[key] = await resolveServerFunction(def, state, key, base);\n }\n }\n }\n\n if (doc.$media) {\n state[\"$media\"] = doc.$media;\n } else if (!state[\"$media\"] && Object.keys(_rootMedia).length > 0) {\n state[\"$media\"] = _rootMedia;\n }\n\n return state;\n}\n\n/**\n * Check whether an object contains any JSON Schema keywords. Used to discriminate Shape 2b (pure\n * type definition) from Shape 1 (naked object).\n *\n * @param {JxScope} obj\n * @returns {boolean}\n */\nfunction hasSchemaKeywords(obj: object) {\n for (const k of Object.keys(obj)) {\n if (SCHEMA_KEYWORDS.has(k)) {\n return true;\n }\n }\n return false;\n}\nexport { hasSchemaKeywords };\n\n/**\n * Evaluate a template string in the context of state and optional $map. Templates use\n * `state.varName` and `$map.item` syntax.\n *\n * @param {string} str\n * @param {JxScope} state\n * @returns {string}\n */\nfunction evaluateTemplate(str: string, state: JxScope): string {\n const $map = state?.$map as { item?: unknown; index?: number } | undefined;\n const fn = new Function(\"state\", \"$map\", \"item\", \"index\", `return \\`${str}\\``) as (\n state: JxScope,\n $map: unknown,\n item: unknown,\n index: number | undefined,\n ) => string;\n return fn(state, $map, $map?.item, $map?.index);\n}\n\n// ─── Step 2b: Function resolution (Shape 4) ─────────────────────────────────\n\n/** Shape of a dynamically imported module: named exports plus an optional default. */\ntype ImportedModule = Record<string, unknown> & { default?: Record<string, unknown> };\n\n/** Minimal contract an externally-imported resolver class may implement. */\ninterface ExternalClassInstance {\n value?: unknown;\n resolve?: () => unknown;\n subscribe?: (cb: (newVal: unknown) => void) => void;\n}\n\n/** Module cache for $src imports (shared with external class resolution). */\nconst _moduleCache = new Map<string, ImportedModule>();\n\n/**\n * Resolve a $prototype: \"Function\" entry into a function or computed.\n *\n * Functions receive state as their first parameter at call time. Functions with a return statement\n * in their body are wrapped in computed() for reactive evaluation.\n *\n * @param {JxFunctionDef} def - State entry with $prototype: \"Function\"\n * @param {JxScope} state - Reactive scope proxy\n * @param {string} key - Def key name\n * @param {string} [base] - Base URL for resolving $src imports\n * @returns {Promise<unknown>}\n */\nasync function resolveFunction(def: JxFunctionDef, state: JxScope, key: string, base?: string) {\n if (def.body && def.$src) {\n throw new Error(`Jx: '${key}' declares both body and $src — these are mutually exclusive`);\n }\n if (!def.body && !def.$src) {\n const params = resolveParamNames(def);\n const noop = new Function(...params, \"\");\n Object.defineProperty(noop, \"name\", {\n configurable: true,\n value: def.name ?? key,\n });\n return noop;\n }\n\n let fn: ((...args: unknown[]) => unknown) | undefined;\n\n if (typeof def.body === \"string\") {\n const params = resolveParamNames(def);\n fn = new Function(...params, def.body) as (...args: unknown[]) => unknown;\n Object.defineProperty(fn, \"name\", {\n configurable: true,\n value: def.name ?? key,\n });\n } else {\n // $src: dynamic import (the body/$src dichotomy was validated above)\n const src = def.$src;\n if (!src) {\n throw new Error(`Jx: '${key}' has neither body nor $src`);\n }\n const exportName = def.$export ?? key;\n let mod: ImportedModule;\n if (_moduleCache.has(src)) {\n mod = _moduleCache.get(src)!;\n } else {\n if (base) {\n const resolvedSrc = new URL(src, base).href;\n try {\n mod = (await import(resolvedSrc)) as ImportedModule;\n } catch {\n mod = (await import(src)) as ImportedModule;\n }\n } else {\n mod = (await import(src)) as ImportedModule;\n }\n _moduleCache.set(src, mod);\n }\n const candidate = mod[exportName] ?? mod.default?.[exportName];\n if (typeof candidate !== \"function\") {\n throw new TypeError(`Jx: export \"${exportName}\" not found or not a function in \"${src}\"`);\n }\n fn = candidate as (...args: unknown[]) => unknown;\n }\n\n // Detect computed: body contains a return statement, or $src function introspection.\n // Functions with parameters (event handlers, callbacks) are never computed.\n const hasParams = (def.parameters ?? def.arguments ?? []).length > 0;\n let isComputed = false;\n if (!hasParams) {\n if (typeof def.body === \"string\") {\n isComputed = /\\breturn\\b/.test(def.body);\n } else if (fn) {\n isComputed = fn.length <= 1 && /\\breturn\\b/.test(fn.toString());\n }\n }\n if (isComputed) {\n return computed(() => fn(state));\n }\n\n return fn;\n}\n\n// ─── Step 3: Render ───────────────────────────────────────────────────────────\n\n/**\n * Extract parameter names from a function definition. Supports both legacy \"arguments\" (string\n * array) and CEM-compatible \"parameters\" (object array). Always ensures \"state\" is the first\n * parameter.\n *\n * @param {JxFunctionDef | JxPrototypeDef} def\n * @returns {string[]}\n */\nfunction resolveParamNames(def: JxFunctionDef | JxPrototypeDef) {\n const names = def.parameters ? paramNames(def.parameters) : (def.arguments ?? []);\n return names.length > 0 && names[0] === \"state\" ? names : [\"state\", ...names];\n}\n\n/**\n * Reserved Jx keys — never set as DOM properties.\n *\n * @type {Set<string>}\n */\nexport const RESERVED_KEYS = new Set([\n \"$schema\",\n \"$id\",\n \"$defs\",\n \"state\",\n \"$ref\",\n \"$props\",\n \"$elements\",\n \"$title\",\n \"$description\",\n \"$switch\",\n \"$prototype\",\n \"$src\",\n \"$export\",\n \"$media\",\n \"$map\",\n \"timing\",\n \"default\",\n \"description\",\n \"body\",\n \"parameters\",\n \"arguments\",\n \"name\",\n \"tagName\",\n \"children\",\n \"style\",\n \"attributes\",\n \"items\",\n \"map\",\n \"filter\",\n \"sort\",\n \"cases\",\n \"observedAttributes\",\n]);\n\n/**\n * Recursively render a Jx element definition into a DOM element.\n *\n * @param {JxElement | string | number | boolean} def\n * @param {JxScope} state - Reactive scope proxy (or child scope via Object.create)\n * @param {JxRenderOptions} [options]\n * @returns {HTMLElement | Text}\n */\nexport function renderNode(\n def: JxElement | string | number | boolean,\n state: JxScope,\n options?: JxRenderOptions,\n): HTMLElement | Text {\n const path = options?._path ?? [];\n\n // Text node children: bare strings/numbers/booleans produce DOM Text nodes\n if (typeof def === \"string\" || typeof def === \"number\" || typeof def === \"boolean\") {\n const textNode = document.createTextNode(String(def));\n if (typeof def === \"string\" && isTemplateString(def)) {\n effect(() => {\n textNode.textContent = evaluateTemplate(def, state);\n });\n }\n return textNode;\n }\n\n // Extend scope with any $-prefixed local bindings declared on this node\n let localState: JxScope = state;\n for (const [key, val] of Object.entries(def)) {\n if (key.startsWith(\"$\") && !RESERVED_KEYS.has(key)) {\n if (localState === state) {\n localState = Object.create(state) as JxScope;\n }\n localState[key] = isRefObj(val) ? resolveRef(val.$ref, state) : val;\n }\n }\n\n // Custom element with $props: set JS properties on the element instance\n const tagName = def.tagName ?? \"div\";\n const isCustomEl = tagName.includes(\"-\") && customElements.get(tagName);\n\n if (def.$props && isCustomEl) {\n return renderCustomElementWithProps(def, localState, options, path);\n }\n\n if (def.$props) {\n const { $props: _$props, ...rest } = def;\n return renderNode(rest, mergeProps(def, localState), options);\n }\n if (def.$switch) {\n return renderSwitch(def, localState, options);\n }\n\n const el = document.createElement(tagName);\n\n if (options?.onNodeCreated) {\n options.onNodeCreated(el, path, def, localState);\n }\n\n applyProperties(el, def, localState);\n applyStyle(\n el,\n def.style ?? {},\n (localState[\"$media\"] as Record<string, string>) ?? {},\n localState,\n );\n applyAttributes(el, def.attributes ?? {}, localState);\n\n const kids = def.children;\n if (isMappedArray(kids)) {\n // Legacy whole-children repeater: the items render directly into `el` (which keeps its own\n // TagName, e.g. <ul>), with no extra wrapper element.\n const arrOpts = options ? { ...options, _path: [...path, \"children\"] } : undefined;\n renderMappedArrayInto(el, kids, localState, arrOpts);\n } else if (Array.isArray(kids)) {\n for (let i = 0; i < kids.length; i++) {\n const child = kids[i]!;\n const childOpts = options ? { ...options, _path: [...path, \"children\", i] } : undefined;\n if (isMappedArray(child)) {\n // Array pseudo-element among siblings: expand inline, no wrapper.\n renderMappedArrayInto(el, child, localState, childOpts);\n } else {\n el.append(renderNode(child, localState, childOpts));\n }\n }\n }\n\n return el;\n}\n\n// ─── Template string utilities ────────────────────────────────────────────────\n\n/**\n * Check if a value is a template string (contains ${}).\n *\n * @param {unknown} val\n * @returns {boolean}\n */\nfunction isTemplateString(val: unknown): val is string {\n return typeof val === \"string\" && val.includes(\"${\");\n}\n\n// ─── Property / style / attribute application ─────────────────────────────────\n\n/**\n * @param {HTMLElement} el\n * @param {JxElement} def\n * @param {JxScope} state\n */\nfunction applyProperties(el: HTMLElement, def: JxElement, state: JxScope) {\n for (const [key, val] of Object.entries(def)) {\n if (RESERVED_KEYS.has(key)) {\n continue;\n }\n if (key.startsWith(\"$\")) {\n continue;\n } // Scope bindings — handled in renderNode\n\n if (key.startsWith(\"on\")) {\n // Event handler: $ref to a function\n if (isRefObj(val)) {\n const handler = resolveRef(val.$ref, state);\n if (typeof handler === \"function\") {\n const scope = state;\n const handlerFn = handler as (s: JxScope, e: Event) => unknown;\n el.addEventListener(key.slice(2), (e) => handlerFn(scope, e));\n }\n continue;\n }\n // Event handler: inline $prototype: \"Function\" with a structured body (spec §20)\n if (hasStructuredBody(val)) {\n const { body } = val;\n const scope = state;\n el.addEventListener(key.slice(2), (e) => {\n void runStatements(body, scope, e);\n });\n continue;\n }\n // Event handler: inline $prototype: \"Function\"\n if (isFunctionDef(val) && typeof val.body === \"string\") {\n const params = resolveParamNames(val);\n const fn = new Function(...params, val.body) as (s: JxScope, e: Event) => unknown;\n const scope = state;\n el.addEventListener(key.slice(2), (e) => fn(scope, e));\n continue;\n }\n // Event handler: inline $expression\n if (isExpressionDef(val)) {\n const node = val.$expression;\n const scope = state;\n el.addEventListener(key.slice(2), (e) => evaluateExpression(node, scope, e));\n continue;\n }\n }\n\n bindProperty(el, key, val, state);\n }\n}\n\n/**\n * @param {HTMLElement} el\n * @param {string} key\n * @param {unknown} val\n * @param {JxScope} state\n */\nfunction bindProperty(el: HTMLElement, key: string, val: unknown, state: JxScope) {\n const target = el as unknown as Record<string, unknown>;\n const boundProp = boundPropKey(key, val, state);\n if (boundProp) {\n el.dataset.jxBoundProp = boundProp;\n }\n if (isRefObj(val)) {\n const refVal = val as { $ref: string };\n if (key === \"id\") {\n target[key] = resolveRef(refVal.$ref, state) as string;\n return;\n }\n effect(() => {\n target[key] = resolveRef(refVal.$ref, state);\n });\n return;\n }\n\n // Universal ${} reactivity — template strings in element properties\n if (isTemplateString(val)) {\n effect(() => {\n target[key] = evaluateTemplate(val as string, state);\n });\n return;\n }\n\n target[key] = val;\n}\n\n/**\n * Apply inline styles and emit a scoped <style> block for nested CSS selectors and @custom-media\n * breakpoint rules.\n *\n * @param {HTMLElement} el\n * @param {JxStyle} styleDef\n * @param {Record<string, string>} [mediaQueries] Named breakpoints from root $media. Default is\n * `{}`\n * @param {JxScope} [state] Component scope for template string evaluation. Default is `{}`\n */\nexport function applyStyle(\n el: HTMLElement,\n styleDef: JxStyle,\n mediaQueries: Record<string, string> = {},\n state: JxScope = {},\n) {\n const nested: Record<string, JxStyle> = {};\n const media: Record<string, JxStyle> = {};\n const baseDecls: Record<string, string> = {};\n\n // Collect properties overridden by media queries so we can avoid inline styles for them\n const mediaOverriddenProps = new Set<string>();\n for (const [prop, val] of Object.entries(styleDef)) {\n if (prop.startsWith(\"@\") && val && typeof val === \"object\") {\n for (const k of Object.keys(val)) {\n if (\n !k.startsWith(\":\") &&\n !k.startsWith(\".\") &&\n !k.startsWith(\"&\") &&\n !k.startsWith(\"[\") &&\n !k.startsWith(\"@\")\n ) {\n mediaOverriddenProps.add(k);\n }\n }\n }\n }\n\n for (const [prop, val] of Object.entries(styleDef)) {\n if (val !== null && typeof val === \"object\" && !Array.isArray(val)) {\n if (prop.startsWith(\"@\")) {\n media[prop] = val;\n } else {\n nested[prop] = val;\n }\n continue;\n }\n if (prop.startsWith(\"@\") || isNestedSelector(prop)) {\n // Scalar under a selector/media key — invalid style shape, drop it.\n continue;\n }\n if (val === undefined) {\n continue;\n }\n const scalar = String(val);\n if (prop.startsWith(\"--\")) {\n if (isTemplateString(val)) {\n effect(() => {\n el.style.setProperty(prop, transposeCanvasUnits(evaluateTemplate(val, state)));\n });\n } else {\n el.style.setProperty(prop, transposeCanvasUnits(scalar));\n }\n } else if (isTemplateString(val)) {\n effect(() => {\n (el.style as unknown as Record<string, string>)[prop] = transposeCanvasUnits(\n evaluateTemplate(val, state),\n );\n });\n } else if (mediaOverriddenProps.has(prop)) {\n // Goes through toCSSText (which transposes) — don't double-transpose here.\n baseDecls[prop] = scalar;\n } else {\n (el.style as unknown as Record<string, string>)[prop] = transposeCanvasUnits(scalar);\n }\n }\n\n const hasNested = Object.keys(nested).length > 0;\n const hasMedia = Object.keys(media).length > 0;\n const hasBaseDecls = Object.keys(baseDecls).length > 0;\n if (!hasNested && !hasMedia && !hasBaseDecls) {\n return;\n }\n\n const uid = `jx-${Math.random().toString(36).slice(2, 7)}`;\n el.dataset.jx = uid;\n\n let css = \"\";\n const baseCSS = toCSSText(baseDecls);\n if (baseCSS) {\n css += `[data-jx=\"${uid}\"] { ${baseCSS} }\\n`;\n }\n\n function emitNested(scope: string, rules: JxStyle) {\n const props = toCSSText(rules);\n if (props) {\n css += `${scope} { ${props} }\\n`;\n }\n for (const [sel, sub] of Object.entries(rules)) {\n if (sub === null || typeof sub !== \"object\" || Array.isArray(sub)) {\n continue;\n }\n if (sel.startsWith(\"@\")) {\n continue;\n }\n const resolved = sel.startsWith(\"&\")\n ? sel.replace(\"&\", scope)\n : sel.startsWith(\"[\")\n ? `${scope}${sel}`\n : sel.startsWith(\":\") || sel.startsWith(\".\")\n ? `${scope}${sel}`\n : `${scope} ${sel}`;\n emitNested(resolved, sub);\n }\n }\n\n for (const [sel, rules] of Object.entries(nested)) {\n const resolved = sel.startsWith(\"&\")\n ? sel.replace(\"&\", `[data-jx=\"${uid}\"]`)\n : sel.startsWith(\"[\")\n ? `[data-jx=\"${uid}\"]${sel}`\n : sel.startsWith(\":\") || sel.startsWith(\".\")\n ? `[data-jx=\"${uid}\"]${sel}`\n : `[data-jx=\"${uid}\"] ${sel}`;\n emitNested(resolved, rules);\n }\n\n function emitMediaNested(atRule: string, parentSel: string, obj: JxStyle) {\n for (const [sel, sub] of Object.entries(obj)) {\n if (sub === null || typeof sub !== \"object\" || Array.isArray(sub)) {\n continue;\n }\n if (sel.startsWith(\"@\")) {\n continue;\n }\n const resolved = sel.startsWith(\"&\")\n ? sel.replace(\"&\", parentSel)\n : sel.startsWith(\"[\")\n ? `${parentSel}${sel}`\n : sel.startsWith(\":\") || sel.startsWith(\".\")\n ? `${parentSel}${sel}`\n : `${parentSel} ${sel}`;\n const props = toCSSText(sub);\n if (props) {\n css += `${atRule} { ${resolved} { ${props} } }\\n`;\n }\n emitMediaNested(atRule, resolved, sub);\n }\n }\n\n for (const [key, rules] of Object.entries(media)) {\n if (key === \"@--\") {\n continue;\n } // Base canvas width, not a real media query\n const atRule = key.startsWith(\"@--\")\n ? `@media ${mediaQueries[key.slice(1)] ?? key.slice(1)}`\n : key.startsWith(\"@(\")\n ? `@media ${key.slice(1)}`\n : key;\n const scope = `[data-jx=\"${uid}\"]`;\n css += `${atRule} { ${scope} { ${toCSSText(rules)} } }\\n`;\n emitMediaNested(atRule, scope, rules);\n }\n\n const tag = document.createElement(\"style\");\n tag.textContent = css;\n tag.dataset.jxOwner = uid;\n document.head.append(tag);\n elementStyleTags.set(el, tag);\n}\n\n/**\n * Scoped <style> tags emitted per element by applyStyle (latest wins). Lets callers replace an\n * element's emitted styles instead of accumulating orphaned tags.\n */\nexport const elementStyleTags = new WeakMap<HTMLElement, HTMLStyleElement>();\n\n/**\n * Re-apply an element's style definition in place: removes the previously emitted scoped <style>\n * tag (if any), clears inline styles, and applies the new definition.\n *\n * @param {HTMLElement} el\n * @param {JxStyle | undefined} styleDef\n * @param {Record<string, string>} [mediaQueries]\n * @param {JxScope} [state]\n */\nexport function reapplyStyle(\n el: HTMLElement,\n styleDef: JxStyle | undefined,\n mediaQueries: Record<string, string> = {},\n state: JxScope = {},\n) {\n const prev = elementStyleTags.get(el);\n if (prev) {\n prev.remove();\n elementStyleTags.delete(el);\n }\n el.style.cssText = \"\";\n delete el.dataset.jx;\n applyStyle(el, styleDef ?? {}, mediaQueries, state);\n}\n\n/**\n * @param {HTMLElement} el\n * @param {Record<string, import(\"@jxsuite/schema/types\").JxAttributeValue>} attrs\n * @param {JxScope} state\n */\nfunction applyAttributes(el: HTMLElement, attrs: Record<string, JxAttributeValue>, state: JxScope) {\n for (const [k, v] of Object.entries(attrs)) {\n const attr = canvasAttrName(el, k);\n if (isRefObj(v)) {\n effect(() => el.setAttribute(attr, String(resolveRef(v.$ref, state) ?? \"\")));\n } else if (isTemplateString(v)) {\n effect(() => el.setAttribute(attr, String(evaluateTemplate(v, state))));\n } else {\n el.setAttribute(attr, String(v));\n }\n }\n}\n\n// ─── Array mapping ────────────────────────────────────────────────────────────\n\n/**\n * Render a mapped array (repeater) wrapper-less: its item instances are inserted directly into\n * `parentEl`, in place, ahead of an anchor comment that marks the array's position among the\n * parent's other children. Re-renders reactively when `items` (or the filter/sort sources) change;\n * each generation's item renders live in their own detached effect scope so nested arrays and\n * template bindings are disposed — not leaked or double-fired — on the next change.\n *\n * `options._path` is the array node's own document path (`[…, \"children\", i]`, or `[…, \"children\"]`\n * for a legacy whole-children repeater); item instances render at `[…that…, \"map\", index]`.\n *\n * @param {HTMLElement} parentEl\n * @param {import(\"@jxsuite/schema/types\").JxMappedArray} arrayDef\n * @param {JxScope} state\n * @param {JxRenderOptions} [options]\n */\nfunction renderMappedArrayInto(\n parentEl: HTMLElement,\n arrayDef: JxMappedArray,\n state: JxScope,\n options?: JxRenderOptions,\n) {\n const path = options?._path ?? [];\n const anchor = document.createComment(\"jx-array\");\n parentEl.append(anchor);\n const { items: itemsSrc, map: mapDef, filter: filterRef, sort: sortRef } = arrayDef;\n\n effect(() => {\n let items: unknown = isRefObj(itemsSrc) ? resolveRef(itemsSrc.$ref, state) : itemsSrc;\n if (Array.isArray(items) && isRefObj(filterRef)) {\n const fn = resolveRef(filterRef.$ref, state);\n if (typeof fn === \"function\") {\n items = items.filter(fn as (v: unknown) => boolean);\n }\n }\n if (Array.isArray(items) && isRefObj(sortRef)) {\n const fn = resolveRef(sortRef.$ref, state);\n if (typeof fn === \"function\") {\n items = [...(items as unknown[])].toSorted(fn as (a: unknown, b: unknown) => number);\n }\n }\n if (!Array.isArray(items) || !mapDef) {\n return;\n }\n\n // Render this generation's items inside a detached scope; the cleanup (run before the next\n // Re-render and when the enclosing render scope stops) tears it down and removes its nodes.\n const scope = effectScope(true);\n const nodes: ChildNode[] = [];\n scope.run(() => {\n for (const [index, item] of (items as unknown[]).entries()) {\n const child = Object.create(state) as JxScope;\n child.$map = { index, item };\n child[\"$map/item\"] = item;\n child[\"$map/index\"] = index;\n const childOpts = options ? { ...options, _path: [...path, \"map\", index] } : undefined;\n const node = renderNode(mapDef, child, childOpts);\n anchor.before(node);\n nodes.push(node);\n }\n });\n onEffectCleanup(() => {\n scope.stop();\n for (const n of nodes) {\n n.remove();\n }\n });\n });\n}\n\n// ─── $switch ──────────────────────────────────────────────────────────────────\n\n/**\n * @param {JxElement} def\n * @param {JxScope} state\n * @param {JxRenderOptions} [options]\n * @returns {HTMLElement}\n */\nfunction renderSwitch(def: JxElement, state: JxScope, options?: JxRenderOptions) {\n const path = options?._path ?? [];\n const container = document.createElement(def.tagName ?? \"div\");\n\n if (options?.onNodeCreated) {\n options.onNodeCreated(container, path, def, state);\n }\n\n applyProperties(container, def, state);\n applyStyle(container, def.style ?? {}, (state[\"$media\"] as Record<string, string>) ?? {}, state);\n applyAttributes(container, def.attributes ?? {}, state);\n let generation = 0;\n\n effect(() => {\n container.innerHTML = \"\";\n if (!isRefObj(def.$switch)) {\n return;\n }\n const key = resolveRef(def.$switch.$ref, state) as string;\n const caseDef = def.cases?.[key];\n if (!caseDef) {\n return;\n }\n\n if (isRefObj(caseDef)) {\n // External $ref — fetch and render asynchronously\n const gen = (generation += 1);\n const { href } = new URL(caseDef.$ref, location.href);\n resolve(href)\n .then(async (doc) => {\n if (gen !== generation) {\n return;\n }\n const childScope = await buildScope(doc, {}, href);\n if (gen !== generation) {\n return;\n }\n container.innerHTML = \"\";\n const childOpts = options ? { ...options, _path: [...path, \"cases\", key] } : undefined;\n container.append(renderNode(doc, childScope, childOpts));\n })\n .catch((error: unknown) =>\n console.error(\"Jx $switch: failed to load external case\", caseDef.$ref, error),\n );\n return;\n }\n\n const childOpts = options ? { ...options, _path: [...path, \"cases\", key] } : undefined;\n container.append(renderNode(caseDef, state, childOpts));\n });\n\n return container;\n}\n\n// ─── Prototype namespaces (Shape 5) ──────────────────────────────────────────\n\n/**\n * Resolve a $prototype definition into a value for the reactive scope.\n *\n * Returns a ref() for async/persistent entries (Request, Storage, Cookie, IndexedDB), or a plain\n * value for simple entries (Set, Map, FormData, Blob).\n *\n * @param {JxPrototypeDef} def - State entry with $prototype\n * @param {JxScope} state - Reactive scope proxy\n * @param {string} key - Def key (for diagnostics)\n * @param {string} [base] - Base URL for resolving $src imports\n * @returns {Promise<unknown>}\n */\nexport async function resolvePrototype(\n def: JxPrototypeDef,\n state: JxScope,\n key: string,\n base?: string,\n) {\n // ── External class via $src ─────────────────────────────────────────────────\n if (def.$src) {\n return resolveExternalPrototype(def, state, key, base);\n }\n\n switch (def.$prototype) {\n case \"Request\": {\n const s: Ref<unknown> = ref(null);\n const debounceMs = def.debounce ?? 0;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n if (!def.manual) {\n effect(() => {\n let url: string | undefined;\n if (isTemplateString(def.url)) {\n url = evaluateTemplate(def.url, state);\n } else {\n ({ url } = def);\n }\n if (!url || url === \"undefined\" || url.includes(\"undefined\")) {\n return;\n }\n\n const controller = new AbortController();\n onEffectCleanup(() => {\n controller.abort();\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n });\n\n const doFetch = () =>\n fetch(url, {\n method: def.method ?? \"GET\",\n signal: controller.signal,\n ...(def.headers && { headers: def.headers }),\n ...(def.body && {\n body: typeof def.body === \"object\" ? JSON.stringify(def.body) : def.body,\n }),\n })\n .then((r) => (r.ok ? r.json() : Promise.reject(r.statusText)))\n .then((d) => {\n s.value = d;\n })\n .catch((error: unknown) => {\n if (!(error instanceof Error && error.name === \"AbortError\")) {\n s.value = { error: String(error) };\n }\n });\n\n if (debounceMs > 0) {\n debounceTimer = setTimeout(doFetch, debounceMs);\n } else {\n void doFetch();\n }\n });\n }\n\n return s;\n }\n\n case \"URLSearchParams\": {\n return computed(() => {\n const p: Record<string, string> = {};\n for (const [k, v] of Object.entries(def)) {\n if (k !== \"$prototype\") {\n p[k] = (\n isRefObj(v)\n ? resolveRef(v.$ref, state)\n : isTemplateString(v)\n ? evaluateTemplate(v, state)\n : v\n ) as string;\n }\n }\n return new URLSearchParams(p).toString();\n });\n }\n\n case \"LocalStorage\":\n case \"SessionStorage\": {\n const store = def.$prototype === \"LocalStorage\" ? localStorage : sessionStorage;\n const k = def.key ?? key;\n let init: unknown;\n try {\n const s = store.getItem(k);\n init = s !== null ? (JSON.parse(s) as unknown) : (def.default ?? null);\n } catch {\n init = def.default ?? null;\n }\n const storageState: Ref<unknown> = ref(init);\n // Persist on change\n effect(() => {\n const v = storageState.value;\n if (v === null) {\n try {\n store.removeItem(k);\n } catch {}\n } else {\n try {\n store.setItem(k, JSON.stringify(v));\n } catch {}\n }\n });\n return storageState;\n }\n\n case \"Cookie\": {\n const name = def.name ?? key;\n const read = () => {\n const m = document.cookie.match(new RegExp(`(?:^|; )${name}=([^;]*)`));\n if (!m) {\n return null;\n }\n try {\n return JSON.parse(decodeURIComponent(m[1]!));\n } catch {\n return m[1];\n }\n };\n const cookieState: Ref<unknown> = ref(read() ?? def.default ?? null);\n // Persist on change\n effect(() => {\n const v = cookieState.value;\n let s = `${name}=${encodeURIComponent(JSON.stringify(v))}`;\n if (def.maxAge !== undefined) {\n s += `; Max-Age=${def.maxAge}`;\n }\n if (def.path) {\n s += `; Path=${def.path}`;\n }\n if (def.domain) {\n s += `; Domain=${def.domain}`;\n }\n if (def.secure) {\n s += `; Secure`;\n }\n if (def.sameSite) {\n s += `; SameSite=${def.sameSite}`;\n }\n // oxlint-disable-next-line unicorn/no-document-cookie -- the Cookie $prototype IS the cookie store binding\n document.cookie = s;\n });\n return cookieState;\n }\n\n case \"IndexedDB\": {\n const idbState: Ref<unknown> = ref(null);\n const {\n database,\n store,\n version = 1,\n keyPath = \"id\",\n autoIncrement = true,\n indexes = [],\n } = def;\n if (!database || !store) {\n throw new Error(`Jx: IndexedDB entry '${key}' requires database and store`);\n }\n const req = indexedDB.open(database, version);\n req.addEventListener(\"upgradeneeded\", (e) => {\n const db: IDBDatabase = (e.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(store)) {\n const os = db.createObjectStore(store, { autoIncrement, keyPath });\n for (const i of indexes) {\n os.createIndex(i.name, i.keyPath, { unique: i.unique ?? false });\n }\n }\n });\n req.addEventListener(\"success\", (e) => {\n const db: IDBDatabase = (e.target as IDBOpenDBRequest).result;\n idbState.value = {\n database,\n getStore: (mode: IDBTransactionMode = \"readwrite\") =>\n Promise.resolve(db.transaction(store, mode).objectStore(store)),\n isReady: true,\n store,\n version,\n };\n });\n req.addEventListener(\"error\", () => {\n idbState.value = { error: req.error?.message };\n });\n return idbState;\n }\n\n case \"Set\": {\n return new Set(Array.isArray(def.default) ? def.default : []);\n }\n\n case \"Map\": {\n return new Map(Object.entries(isJsonObject(def.default) ? def.default : {}));\n }\n\n case \"FormData\": {\n const fd = new FormData();\n for (const [k, v] of Object.entries(def.fields ?? {})) {\n fd.append(k, v as string);\n }\n return fd;\n }\n\n case \"Blob\": {\n return new Blob((def.parts as BlobPart[]) ?? [], {\n type: typeof def.type === \"string\" ? def.type : \"text/plain\",\n });\n }\n\n case \"ReadableStream\": {\n return null;\n }\n\n default: {\n console.warn(\n `Jx: unknown $prototype \"${def.$prototype}\" for \"${key}\". Did you mean to add '$src'?`,\n );\n return ref(null);\n }\n }\n}\n\n// ─── External class resolution ────────────────────────────────────────────────\n\n/** Reserved keys stripped from the config object passed to external class constructors. */\nconst EXTERNAL_RESERVED = new Set([\n \"$prototype\",\n \"$src\",\n \"$export\",\n \"timing\",\n \"default\",\n \"description\",\n \"body\",\n \"parameters\",\n \"arguments\",\n \"name\",\n]);\n\n/**\n * Resolve an external class prototype via $src.\n *\n * @param {JxPrototypeDef} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveExternalPrototype(\n def: JxPrototypeDef,\n state: JxScope,\n key: string,\n base?: string,\n) {\n const src = def.$src;\n\n // Non-Function $prototype must use .class.json as entrypoint\n if (!src || !src.endsWith(\".class.json\")) {\n throw new Error(\n `Jx: $prototype \"${def.$prototype}\" requires a .class.json $src, got \"${src}\". ` +\n `Wrap the class in a .class.json schema with $implementation.`,\n );\n }\n\n return resolveClassJson(def, state, key, base);\n}\n\n/**\n * Import a JS module and instantiate a class from it. Internal helper used by resolveClassJson for\n * $implementation.\n *\n * @param {JxScope} def - Original state entry (for config extraction)\n * @param {string} src - JS module URL to import\n * @param {string} exportName - Export name to look up\n * @param {string} [base] - Base URL for resolution\n * @returns {Promise<unknown>}\n */\nasync function importAndInstantiate(def: JxScope, src: string, exportName: string, base?: string) {\n let mod: ImportedModule;\n if (_moduleCache.has(src)) {\n mod = _moduleCache.get(src)!;\n } else {\n try {\n mod = (await import(src)) as ImportedModule;\n } catch {\n if (base) {\n const resolvedSrc = new URL(src, base).href;\n mod = (await import(resolvedSrc)) as ImportedModule;\n } else {\n throw new Error(`Failed to import \"${src}\"`);\n }\n }\n _moduleCache.set(src, mod);\n }\n\n const ExportedClass = mod[exportName] ?? mod.default?.[exportName];\n if (!ExportedClass) {\n throw new Error(`Jx: export \"${exportName}\" not found in \"${src}\"`);\n }\n if (typeof ExportedClass !== \"function\") {\n throw new TypeError(`Jx: \"${exportName}\" from \"${src}\" is not a class`);\n }\n\n const config: JxScope = {};\n for (const [k, v] of Object.entries(def)) {\n if (!EXTERNAL_RESERVED.has(k)) {\n config[k] = v;\n }\n }\n\n const Ctor = ExportedClass as new (config: JxScope) => ExternalClassInstance;\n const instance = new Ctor(config);\n\n let value: unknown;\n if (typeof instance.resolve === \"function\") {\n value = await instance.resolve();\n } else if (\"value\" in instance) {\n ({ value } = instance);\n } else {\n value = instance;\n }\n\n // Always wrap in ref for reactivity with external classes\n const s: Ref<unknown> = ref(value);\n if (typeof instance.subscribe === \"function\") {\n instance.subscribe((newVal: unknown) => {\n s.value = newVal;\n });\n }\n return s;\n}\n\n/**\n * Resolve a .class.json schema-defined class. Fetches the schema, follows $implementation if\n * hybrid, or constructs dynamically if self-contained.\n *\n * @param {JxPrototypeDef} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveClassJson(def: JxPrototypeDef, state: JxScope, key: string, base?: string) {\n const src = def.$src;\n if (!src) {\n throw new Error(`Jx: class entry '${key}' has no $src`);\n }\n let classDef: JxClassDef;\n\n // Bare specifiers (package references like @scope/pkg/file) can't be fetched directly —\n // Go straight to dev proxy which can resolve them via node_modules.\n const isBareSpecifier =\n !src.startsWith(\".\") &&\n !src.startsWith(\"/\") &&\n !src.startsWith(\"http\") &&\n !src.startsWith(\"file:\");\n if (isBareSpecifier) {\n return resolveViaDevProxy(def, state, key, base);\n }\n\n // Try fetching the .class.json file directly\n try {\n const url = base ? new URL(src, base).href : src;\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n // Trust boundary: fetched .class.json sources are class definitions by contract.\n classDef = (await res.json()) as JxClassDef;\n } catch {\n // Fall back to dev proxy (server will handle .class.json resolution)\n return resolveViaDevProxy(def, state, key, base);\n }\n\n // Hybrid mode: $implementation points to the real JS module\n if (classDef.$implementation) {\n // If the schema references $context (e.g. content types), the browser cannot provide\n // The required server-side context — go directly to dev proxy.\n const schemaStr = JSON.stringify(classDef);\n if (schemaStr.includes('\"#/$context/')) {\n return resolveViaDevProxy(def, state, key, base);\n }\n const schemaUrl = base ? new URL(src, base).href : new URL(src, location.href).href;\n const implSrc = new URL(classDef.$implementation, schemaUrl).href;\n const exportName = def.$export ?? classDef.title ?? def.$prototype;\n try {\n return await importAndInstantiate(def, implSrc, exportName, base);\n } catch {\n return resolveViaDevProxy(def, state, key, base);\n }\n }\n\n // Self-contained: construct class dynamically from schema\n const DynClass = classFromSchema(classDef);\n const config: JxScope = {};\n for (const [k, v] of Object.entries(def)) {\n if (!EXTERNAL_RESERVED.has(k)) {\n config[k] = v;\n }\n }\n const instance = new DynClass(config) as ExternalClassInstance;\n\n let value: unknown;\n if (typeof instance.resolve === \"function\") {\n value = await instance.resolve();\n } else if (\"value\" in instance) {\n ({ value } = instance);\n } else {\n value = instance;\n }\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(value);\n if (typeof instance.subscribe === \"function\") {\n instance.subscribe((newVal: unknown) => {\n s.value = newVal;\n });\n }\n return s;\n}\n\n/**\n * Dynamically construct a class from a .class.json schema definition. Browser-side: maps private\n * fields to _-prefixed public fields.\n *\n * @param {import(\"@jxsuite/schema/types\").JxClassDef} classDef\n * @returns {DynamicClass}\n */\nfunction classFromSchema(classDef: JxClassDef) {\n const fields = classDef.$defs?.fields ?? {};\n // JSON objects inherit Object.prototype.constructor — only an own object value counts.\n const rawCtor = classDef.$defs?.constructor;\n const ctor = typeof rawCtor === \"object\" ? rawCtor : undefined;\n const methods = classDef.$defs?.methods ?? {};\n\n // oxlint-disable-next-line typescript/no-extraneous-class -- methods are attached to the prototype dynamically below\n class DynClass {\n constructor(config: Record<string, unknown> = {}) {\n for (const [key, typedField] of Object.entries(fields)) {\n const id = typedField.identifier ?? key;\n const propName = typedField.access === \"private\" ? `_${id}` : id;\n if (config[id] !== undefined) {\n (this as Record<string, unknown>)[propName] = config[id];\n } else if (typedField.initializer !== undefined) {\n (this as Record<string, unknown>)[propName] = typedField.initializer;\n } else if (typedField.default !== undefined) {\n (this as Record<string, unknown>)[propName] = structuredClone(typedField.default);\n } else {\n (this as Record<string, unknown>)[propName] = null;\n }\n }\n if (ctor?.body) {\n const bodyStr = Array.isArray(ctor.body) ? ctor.body.join(\"\\n\") : ctor.body;\n (\n new Function(\"config\", bodyStr) as (\n this: unknown,\n config: Record<string, unknown>,\n ) => void\n ).call(this, config);\n }\n }\n }\n\n for (const [key, typedMethod] of Object.entries(methods)) {\n const name = typedMethod.identifier ?? key;\n const params = (typedMethod.parameters ?? []).map((p) => {\n if (p.$ref) {\n return p.$ref.split(\"/\").pop() as string;\n }\n const n = p.identifier ?? p.name;\n return typeof n === \"string\" ? n : \"arg\";\n });\n const bodyStr = Array.isArray(typedMethod.body)\n ? typedMethod.body.join(\"\\n\")\n : (typedMethod.body ?? \"\");\n\n if (typedMethod.role === \"accessor\") {\n const descriptor: PropertyDescriptor = {};\n if (typedMethod.getter) {\n descriptor.get = new Function(typedMethod.getter.body ?? \"\") as () => unknown;\n }\n if (typedMethod.setter) {\n const sp = (typedMethod.setter.parameters ?? []).map(\n (p) => p.$ref?.split(\"/\").pop() ?? \"v\",\n );\n descriptor.set = new Function(...sp, typedMethod.setter.body ?? \"\") as (v: unknown) => void;\n }\n Object.defineProperty(DynClass.prototype, name, {\n ...descriptor,\n configurable: true,\n });\n } else if (typedMethod.scope === \"static\") {\n (DynClass as unknown as DynamicClass)[name] = new Function(...params, bodyStr);\n } else {\n (DynClass as unknown as DynamicClass).prototype[name] = new Function(...params, bodyStr);\n }\n }\n\n Object.defineProperty(DynClass, \"name\", {\n configurable: true,\n value: classDef.title,\n });\n const dynCtor = DynClass as unknown as DynamicClass;\n return dynCtor;\n}\n\n/**\n * Dev-mode fallback: when an $src module cannot run in the browser, proxy the resolve() call\n * through the Jx dev server (POST /**jx_resolve**). Supports reactive template strings in config\n * values via Vue effect().\n *\n * @param {JxPrototypeDef} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveViaDevProxy(def: JxPrototypeDef, state: JxScope, key: string, base?: string) {\n const config: JxScope = {};\n for (const [k, v] of Object.entries(def)) {\n if (!EXTERNAL_RESERVED.has(k)) {\n config[k] = v;\n }\n }\n\n const hasTemplates = Object.values(config).some((v: unknown) => isTemplateString(v));\n\n /** @param {JxScope} resolvedConfig */\n const doResolve = (resolvedConfig: JxScope) =>\n fetch(resolveProxyPath(\"/__jx_resolve__\"), {\n body: JSON.stringify({\n $base: base,\n $export: def.$export,\n $prototype: def.$prototype,\n $src: def.$src,\n ...resolvedConfig,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n }).then((r) => {\n if (!r.ok) {\n throw new Error(`Jx dev proxy ${r.status} for \"${key}\"`);\n }\n return r.json();\n });\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(null);\n if (hasTemplates) {\n effect(() => {\n const resolvedConfig: JxScope = {};\n for (const [k, v] of Object.entries(config)) {\n resolvedConfig[k] = isTemplateString(v) ? evaluateTemplate(v, state) : v;\n }\n doResolve(resolvedConfig)\n .then((value: unknown) => {\n s.value = value;\n })\n .catch((error: unknown) => console.error(\"Jx dev proxy:\", error));\n });\n } else {\n doResolve(config)\n .then((value: unknown) => {\n s.value = value;\n })\n .catch((error: unknown) => console.error(\"Jx dev proxy:\", error));\n }\n return s;\n}\n\n// ─── Server function resolution (dev mode) ────────────────────────────────────\n\n/**\n * Resolve a timing: \"server\" entry in dev mode by executing the function client-side. In\n * production, the compiler replaces this with a fetch to the generated server handler.\n *\n * @param {JxScope} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveServerFunction(\n def: JxServerFnDef,\n state: JxScope,\n key: string,\n base?: string,\n) {\n const src = def.$src;\n const exportName = def.$export;\n\n let mod: ImportedModule;\n if (_moduleCache.has(src)) {\n mod = _moduleCache.get(src)!;\n } else {\n try {\n mod = (await import(src)) as ImportedModule;\n } catch {\n if (base) {\n try {\n const resolvedSrc = new URL(src, base).href;\n mod = (await import(resolvedSrc)) as ImportedModule;\n } catch {\n // Module cannot run in the browser — fall back to dev server proxy\n return resolveServerFunctionViaProxy(def, state, key, base);\n }\n } else {\n return resolveServerFunctionViaProxy(def, state, key, base);\n }\n }\n _moduleCache.set(src, mod);\n }\n\n const candidate = mod[exportName] ?? mod.default?.[exportName];\n if (!candidate) {\n throw new Error(`Jx: export \"${exportName}\" not found in \"${src}\" for \"${key}\"`);\n }\n if (typeof candidate !== \"function\") {\n throw new TypeError(`Jx: \"${exportName}\" from \"${src}\" is not a function`);\n }\n const fn = candidate as (args: JxScope) => Promise<unknown>;\n\n const rawArgs = def.arguments ?? {};\n const hasReactiveArg = Object.values(rawArgs).some((v: unknown) => isRefObj(v));\n const resolveArgs = () => {\n const args: JxScope = {};\n for (const [k, v] of Object.entries(rawArgs)) {\n args[k] = isRefObj(v) ? resolveRef(v.$ref, state) : v;\n }\n return args;\n };\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(null);\n if (hasReactiveArg) {\n effect(() => {\n const args = resolveArgs();\n onEffectCleanup(() => {});\n fn(args)\n .then((result: unknown) => {\n s.value = result;\n })\n .catch(() => {});\n });\n } else {\n s.value = await fn(resolveArgs());\n }\n return s;\n}\n\n/**\n * Dev-mode fallback: when a timing: \"server\" module cannot run in the browser, proxy the function\n * call through the Jx dev server (POST /**jx_server**). Supports reactive $ref arguments via Vue\n * effect().\n *\n * @param {JxScope} def\n * @param {JxScope} state\n * @param {string} key\n * @param {string} [base]\n * @returns {Promise<unknown>}\n */\nasync function resolveServerFunctionViaProxy(\n def: JxScope,\n state: JxScope,\n key: string,\n base?: string,\n) {\n const rawArgs = def.arguments ?? {};\n const hasReactiveArg = Object.values(rawArgs).some((v: unknown) => isRefObj(v));\n\n const resolveArgs = () => {\n const args: JxScope = {};\n for (const [k, v] of Object.entries(rawArgs)) {\n args[k] = isRefObj(v) ? resolveRef((v as { $ref: string }).$ref, state) : v;\n }\n return args;\n };\n\n /** @param {JxScope} args */\n const doResolve = (args: JxScope) =>\n fetch(resolveProxyPath(\"/__jx_server__\"), {\n body: JSON.stringify({\n $base: base,\n $export: def.$export,\n $src: def.$src,\n arguments: args,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n }).then((r) => {\n if (!r.ok) {\n throw new Error(`Jx server proxy ${r.status} for \"${key}\"`);\n }\n return r.json();\n });\n\n // Always wrap in ref for reactivity\n const s: Ref<unknown> = ref(null);\n if (hasReactiveArg) {\n effect(() => {\n const args = resolveArgs();\n onEffectCleanup(() => {});\n doResolve(args)\n .then((result: unknown) => {\n s.value = result;\n })\n .catch((error: unknown) => console.error(\"Jx server proxy:\", error));\n });\n } else {\n doResolve(resolveArgs())\n .then((result: unknown) => {\n s.value = result;\n })\n .catch((error: unknown) => console.error(\"Jx server proxy:\", error));\n }\n return s;\n}\n\n/**\n * Resolve a $ref string to a value in scope.\n *\n * With Vue reactivity, this reads directly from the reactive proxy. When called inside a effect or\n * computed, the read is tracked.\n *\n * @param {string} ref\n * @param {JxScope} state - Reactive scope proxy (or child scope)\n * @returns {unknown}\n */\nexport function resolveRef(refPath: string, state: JxScope) {\n if (typeof refPath !== \"string\") {\n return refPath;\n }\n if (refPath.startsWith(\"$map/\")) {\n const parts = refPath.split(\"/\");\n const [, key] = parts; // \"item\" or \"index\"\n const map = state.$map as Record<string, unknown> | undefined;\n const base = map?.[key!] ?? state[`$map/${key}`];\n return parts.length > 2 ? getPath(base, parts.slice(2).join(\"/\")) : base;\n }\n if (refPath.startsWith(\"#/state/\")) {\n const sub = refPath.slice(\"#/state/\".length);\n const slash = sub.indexOf(\"/\");\n if (slash === -1) {\n return state[sub];\n }\n return getPath(state[sub.slice(0, slash)], sub.slice(slash + 1));\n }\n if (refPath.startsWith(\"parent#/\")) {\n return state[refPath.slice(\"parent#/\".length)];\n }\n if (refPath.startsWith(\"window#/\")) {\n return getPath(globalThis.window, refPath.slice(\"window#/\".length));\n }\n if (refPath.startsWith(\"document#/\")) {\n return getPath(globalThis.document, refPath.slice(\"document#/\".length));\n }\n return state[refPath] ?? null;\n}\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\n/**\n * Check if v is a Vue ref (including computed).\n *\n * @param {unknown} v\n * @returns {boolean}\n */\nexport function isSignal(v: unknown) {\n return isRef(v);\n}\n\n/**\n * @param {unknown} v\n * @returns {v is import(\"@jxsuite/schema/types\").JxRef}\n */\nfunction isRefObj(v: unknown): v is JxRef {\n return isRefValue(v);\n}\n\n/**\n * @param {string} k\n * @returns {boolean}\n */\nfunction isNestedSelector(k: string) {\n return k.startsWith(\":\") || k.startsWith(\".\") || k.startsWith(\"&\") || k.startsWith(\"[\");\n}\n\n/**\n * @param {unknown} obj\n * @param {string} path\n * @returns {unknown}\n */\nfunction getPath(obj: unknown, path: string) {\n let current: unknown = obj;\n for (const k of path.split(/[./]/)) {\n current = (current as Record<string, unknown>)?.[k];\n }\n return current;\n}\n\n/**\n * @param {JxElement} def\n * @param {JxScope} parentState\n * @returns {JxScope}\n */\nfunction mergeProps(def: JxElement, parentState: JxScope): JxScope {\n const child = Object.create(parentState) as JxScope;\n for (const [k, v] of Object.entries(def.$props ?? {})) {\n child[k] = isRefObj(v) ? resolveRef(v.$ref, parentState) : v;\n }\n return child;\n}\n\n/**\n * Convert camelCase to kebab-case.\n *\n * @param {string} s\n * @returns {string}\n */\nexport function camelToKebab(s: string) {\n return s.replaceAll(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n}\n\n/**\n * Convert a style rules object to a CSS text string (skipping nested selectors).\n *\n * @param {Record<string, unknown> | object} rules\n * @returns {string}\n */\nexport function toCSSText(rules: Record<string, unknown> | object) {\n return Object.entries(rules)\n .filter(([k, v]) => !isNestedSelector(k) && (v === null || typeof v !== \"object\"))\n .map(([p, v]) => `${camelToKebab(p)}: ${transposeCanvasUnits(String(v))}`)\n .join(\"; \");\n}\n\n// ─── Custom Element Registration ──────────────────────────────────────────────\n\nlet _rootMedia: Record<string, string> = {};\nconst _elementDefs = new Map();\n\n/**\n * Seed the module-level root `$media` map used as the fallback for components that declare their\n * own `@--name` style blocks but carry no own `$media` (buildScope ~279-280). `Jx()` sets this from\n * the document during a full top-level render, but the Studio iframe canvas calls `buildScope`/\n * `renderNode` directly (never `Jx()`), so without seeding it a component's `@--md` would resolve\n * to the invalid `@media md`. Callers on the direct path MUST set it (with the merged `$media`)\n * before `buildScope`, and re-set it every render so a stale map from a previous document cannot\n * leak.\n *\n * @param {Record<string, string>} map\n */\nexport function setRootMedia(map: Record<string, string>): void {\n _rootMedia = map ?? {};\n}\n\n/**\n * Resolve and register $elements entries (depth-first).\n *\n * @param {JxDocument[\"$elements\"]} elements\n * @param {string} base\n * @returns {Promise<void>}\n */\nasync function registerElements(elements: NonNullable<JxDocument[\"$elements\"]>, base: string) {\n for (const entry of elements) {\n // Bare string: npm package side-effect import (registers custom elements)\n if (typeof entry === \"string\") {\n try {\n // Bare specifiers need a URL path for the browser; the dev server resolves\n // /node_modules/<pkg> to the package entry point via exports/module/main.\n const specifier =\n entry.startsWith(\"/\") || entry.startsWith(\".\") ? entry : `/node_modules/${entry}`;\n await import(specifier);\n } catch (error) {\n console.warn(`Jx: failed to import package \"${entry}\"`, error);\n }\n continue;\n }\n if (!isRefObj(entry)) {\n continue;\n }\n const { href } = new URL(entry.$ref, base);\n const doc = await resolve(href);\n if (!doc.tagName || !doc.tagName.includes(\"-\")) {\n continue;\n }\n if (customElements.get(doc.tagName)) {\n continue;\n }\n\n // Depth-first: register sub-dependencies first\n if (doc.$elements) {\n await registerElements(doc.$elements, href);\n }\n\n await defineElement(doc, href);\n }\n}\n\n/**\n * Inject head elements from $head declarations. Each entry is { tagName, attributes } — bare npm\n * specifiers in href/src are rewritten to /node_modules/ paths for the dev server.\n *\n * @param {import(\"@jxsuite/schema/types\").JxHeadEntry[]} entries\n * @param {string} _base - Document base URL for resolving relative paths\n */\nfunction injectHead(entries: JxHeadEntry[], _base: string) {\n for (const entry of entries) {\n if (!entry || !entry.tagName) {\n continue;\n }\n const tag = entry.tagName.toLowerCase();\n const attrs = { ...entry.attributes };\n // Resolve href/src: bare npm specifiers -> /node_modules/ path\n for (const key of [\"href\", \"src\"] as const) {\n const v = attrs[key];\n if (\n typeof v === \"string\" &&\n v &&\n !v.startsWith(\"/\") &&\n !v.startsWith(\".\") &&\n !v.startsWith(\"http\")\n ) {\n attrs[key] = `/node_modules/${v}`;\n }\n }\n\n // Deduplicate: skip if an identical element already exists\n const selector = `${tag}${attrs.href ? `[href=\"${attrs.href}\"]` : \"\"}${attrs.src ? `[src=\"${attrs.src}\"]` : \"\"}`;\n if (selector !== tag && document.head.querySelector(selector)) {\n continue;\n }\n\n const el = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) {\n el.setAttribute(k, String(v));\n }\n if (entry.textContent) {\n el.textContent = entry.textContent;\n }\n document.head.append(el);\n }\n}\n\n/**\n * Register a custom element from a Jx document.\n *\n * @param {string | JxDocument} source - URL to .json file, or raw document object\n * @param {string} [base] - Base URL for resolving $src imports\n * @returns {Promise<void>}\n */\nconst _definedSources = new Set<string>();\n\nexport async function defineElement(source: string | JxDocument, baseUrl?: string) {\n let base = baseUrl;\n let doc = source;\n if (typeof source === \"string\") {\n base = new URL(source, base ?? location.href).href;\n if (_definedSources.has(base)) {\n return;\n }\n _definedSources.add(base);\n doc = await resolve(source);\n }\n base ??= location.href;\n\n const source_: JxDocument = doc as JxDocument;\n\n const { tagName } = source_;\n if (!tagName || !tagName.includes(\"-\")) {\n throw new Error(`Jx defineElement: tagName \"${tagName}\" must contain a hyphen`);\n }\n if (customElements.get(tagName)) {\n return;\n }\n\n // Register sub-dependencies first\n if (source_.$elements) {\n await registerElements(source_.$elements, base);\n }\n\n _elementDefs.set(tagName, { base, doc: source_ });\n\n const def = source_;\n const observedAttrs = def.observedAttributes ?? [];\n\n const ElementClass = class extends HTMLElement {\n _jxInitialized = false;\n _state: JxScope | null = null;\n\n static get observedAttributes() {\n return observedAttrs;\n }\n\n async connectedCallback() {\n // An element carrying `data-jx-definition-root` IS the definition being rendered by an\n // External renderer (the studio canvas editing this component's own document) — its subtree\n // Is authored DOM, not an instantiation site. Self-initializing here would wipe that tree\n // And re-render it with default state (the \"component editor shows a live instance\" bug).\n if (this.dataset.jxDefinitionRoot !== undefined) {\n return;\n }\n if (this._jxInitialized) {\n return;\n }\n this._jxInitialized = true;\n\n const state = await buildScope(def, {}, base);\n\n // Read properties from directive encoding (markdown → data-jx-props)\n const propsAttr = this.dataset.jxProps;\n if (propsAttr) {\n try {\n const props = JSON.parse(propsAttr) as Record<string, unknown>;\n for (const [key, val] of Object.entries(props)) {\n if (key in (def.state ?? {})) {\n state[key] = val;\n }\n }\n } catch {}\n delete this.dataset.jxProps;\n }\n\n // Read literal `props.*` attributes (JSON-authored instances pass props this way; the\n // Compiler lifts them into $props at build, and this is the live-render mirror). String\n // Values only — HTML lowercases attribute names, so state keys must be lowercase to match.\n // Collect first: removing while iterating the live NamedNodeMap skips entries.\n const propAttrNames = this.getAttributeNames().filter(\n (name) => name.startsWith(\"props.\") && name.length > \"props.\".length,\n );\n for (const name of propAttrNames) {\n const key = name.slice(\"props.\".length);\n if (key in (def.state ?? {})) {\n state[key] = this.getAttribute(name);\n this.removeAttribute(name);\n }\n }\n\n // Merge $props set as JS properties by parent before connection\n for (const key of Object.keys(def.state ?? {})) {\n if (key in this && (this as Record<string, unknown>)[key] !== undefined) {\n state[key] = (this as Record<string, unknown>)[key];\n }\n }\n // Set up property getters/setters that forward into reactive state\n for (const key of Object.keys(def.state ?? {})) {\n if (!(key in HTMLElement.prototype)) {\n Object.defineProperty(this, key, {\n configurable: true,\n get: () => state[key],\n set: (v: unknown) => {\n state[key] = v;\n },\n });\n }\n }\n\n this._state = state;\n\n // Capture light DOM children (for slot distribution) before rendering\n const slottedChildren = [...this.childNodes];\n this.innerHTML = \"\";\n\n // Custom elements default to display:inline — use block so they behave as\n // Containers (matching <div> semantics). The component's own style can\n // Override this if needed.\n if (!this.style.display) {\n this.style.display = \"block\";\n }\n\n // Render template into light DOM (once, not in effect — inner effects handle reactivity)\n applyStyle(this, def.style ?? {}, (state[\"$media\"] as Record<string, string>) ?? {}, state);\n applyAttributes(this, def.attributes ?? {}, state);\n\n const children = Array.isArray(def.children) ? def.children : [];\n for (const childDef of children) {\n this.append(renderNode(childDef, state));\n }\n\n // Slot distribution (light DOM)\n distributeSlots(this, slottedChildren);\n\n // Lifecycle: onMount\n const { onMount } = state;\n if (typeof onMount === \"function\") {\n queueMicrotask(() => (onMount as (s: JxScope) => unknown)(state));\n }\n }\n\n disconnectedCallback() {\n if (typeof this._state?.onUnmount === \"function\") {\n (this._state.onUnmount as (s: JxScope) => unknown)(this._state);\n }\n }\n\n adoptedCallback() {\n if (typeof this._state?.onAdopted === \"function\") {\n (this._state.onAdopted as (s: JxScope) => unknown)(this._state);\n }\n }\n\n attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null) {\n if (!this._state || oldVal === newVal) {\n return;\n }\n const camelKey = name.replaceAll(/-([a-z])/g, (_: string, c: string) => c.toUpperCase());\n const current = this._state[camelKey];\n if (typeof current === \"number\") {\n this._state[camelKey] = Number(newVal);\n } else if (typeof current === \"boolean\") {\n this._state[camelKey] = newVal !== null && newVal !== \"false\";\n } else {\n this._state[camelKey] = newVal;\n }\n }\n };\n\n customElements.define(tagName, ElementClass);\n}\n\n/**\n * Render a registered custom element with $props (property-first interface).\n *\n * @param {JxElement} def\n * @param {JxScope} state\n * @param {JxRenderOptions} [options]\n * @param {JxPath} [path]\n * @returns {HTMLElement}\n */\nfunction renderCustomElementWithProps(\n def: JxElement,\n state: JxScope,\n options?: JxRenderOptions,\n path?: JxPath,\n) {\n const el = document.createElement(def.tagName ?? \"div\");\n\n if (options?.onNodeCreated) {\n options.onNodeCreated(el, path ?? [], def, state);\n }\n\n // Set JS properties from $props (before connection)\n for (const [key, val] of Object.entries(def.$props ?? {})) {\n if (isRefObj(val)) {\n const refVal = val;\n const resolved = resolveRef(refVal.$ref, state);\n (el as unknown as Record<string, unknown>)[key] = resolved;\n // Reactive forwarding: re-set the property when the source changes\n effect(() => {\n (el as unknown as Record<string, unknown>)[key] = resolveRef(refVal.$ref, state);\n });\n } else if (isTemplateString(val)) {\n effect(() => {\n (el as unknown as Record<string, unknown>)[key] = evaluateTemplate(val, state);\n });\n } else {\n (el as unknown as Record<string, unknown>)[key] = val;\n }\n }\n\n // Apply host-level style and attributes from the usage site\n applyStyle(el, def.style ?? {}, (state[\"$media\"] as Record<string, string>) ?? {}, state);\n applyAttributes(el, def.attributes ?? {}, state);\n\n // Append slotted children\n const children = Array.isArray(def.children) ? def.children : [];\n for (let i = 0; i < children.length; i++) {\n const childOpts = options && path ? { ...options, _path: [...path, \"children\", i] } : undefined;\n el.append(renderNode(children[i]!, state, childOpts));\n }\n\n return el;\n}\n\n/**\n * Light DOM slot distribution.\n *\n * @param {HTMLElement} host\n * @param {ChildNode[]} slottedChildren\n */\nfunction distributeSlots(host: HTMLElement, slottedChildren: ChildNode[]) {\n if (slottedChildren.length === 0) {\n return;\n }\n\n const slots = host.querySelectorAll(\"slot\");\n if (slots.length === 0) {\n return;\n }\n\n const named = new Map<string | null, ChildNode[]>();\n const unnamed: ChildNode[] = [];\n\n for (const child of slottedChildren) {\n if (child.nodeType === Node.ELEMENT_NODE && (child as Element).getAttribute(\"slot\")) {\n const name = (child as Element).getAttribute(\"slot\");\n if (!named.has(name)) {\n named.set(name, []);\n }\n (named.get(name) as ChildNode[]).push(child);\n } else {\n unnamed.push(child);\n }\n }\n\n for (const slot of slots) {\n const name = slot.getAttribute(\"name\");\n const matches = name ? (named.get(name) ?? []) : unnamed;\n if (matches.length > 0) {\n slot.innerHTML = \"\";\n for (const child of matches) {\n slot.append(child);\n }\n }\n }\n}\n",
11
12
  "/// <reference lib=\"dom\" />\n/**\n * Render-path mapping — pure logic shared by the legacy in-realm path mapper (which stores paths in\n * the `elToPath` WeakMap) and the iframe host (which stamps them as `data-jx-path` attributes).\n *\n * The runtime fires `onNodeCreated(el, renderPath, def, state)` for every node. The render path is\n * not always the document path: layout-wrapped pages shift page content under a layout prefix, and\n * `prepareForEditMode` renders mapped arrays (`$prototype: Array`) as a `repeater-perimeter` whose\n * single child hop must be collapsed back to a `map` segment. {@link classifyRenderNode} resolves a\n * render path to either a document path or a \"layout\" marker; {@link serializeJxPath} encodes the\n * result for the `data-jx-path` attribute.\n */\n\nimport type { JxPath } from \"../state\";\n\n/** Context the mapper needs, computed once per render by whoever prepared the document. */\nexport interface PathMapCtx {\n canvasMode: string;\n layoutWrapped: boolean;\n pageContentPrefix: JxPath | null;\n pageContentOffset: number | null;\n arrayPaths: Set<string>;\n}\n\n/** A render node either belongs to the layout chrome (no document path) or maps to a document path. */\nexport type RenderNodeClass = { kind: \"layout\" } | { kind: \"path\"; path: JxPath };\n\n/**\n * Resolve a runtime render path to a document path (or flag it as layout-originated). Pure — the\n * caller decides whether to record the result in a WeakMap or a `data-jx-path` attribute.\n */\nexport function classifyRenderNode(path: JxPath, def: unknown, ctx: PathMapCtx): RenderNodeClass {\n // Layout-originated nodes have no page-document path; the caller marks them (data-jx-layout).\n if (ctx.layoutWrapped && typeof def === \"object\" && (def as { $__layout?: unknown })?.$__layout) {\n return { kind: \"layout\" };\n }\n\n let mappedPath = path;\n\n // Strip the layout prefix so paths are relative to the original page document.\n // Page children render at indices [offset, offset+1, …] when the layout places siblings before\n // The <slot>, so subtract the offset to recover the page's 0-based child indices.\n if (ctx.layoutWrapped && ctx.pageContentPrefix) {\n const pfx = ctx.pageContentPrefix;\n if (path.length >= pfx.length && pfx.every((seg, i) => path[i] === seg)) {\n const rest = path.slice(pfx.length);\n const [containerIdx] = rest;\n mappedPath =\n typeof containerIdx === \"number\"\n ? [\"children\", containerIdx - (ctx.pageContentOffset ?? 0), ...rest.slice(1)]\n : [\"children\", ...rest];\n }\n }\n\n // Collapse repeater-perimeter template hops: for an array document path P, a render path of\n // `[...P, \"children\", 0, ...rest]` maps to `[...P, \"map\", ...rest]`. Loop for nested repeaters.\n if ((ctx.canvasMode === \"design\" || ctx.canvasMode === \"edit\") && ctx.arrayPaths.size > 0) {\n let changed = true;\n while (changed) {\n changed = false;\n for (let i = 1; i < mappedPath.length - 1; i++) {\n if (\n mappedPath[i] === \"children\" &&\n mappedPath[i + 1] === 0 &&\n ctx.arrayPaths.has(mappedPath.slice(0, i).join(\"/\"))\n ) {\n mappedPath = [...mappedPath.slice(0, i), \"map\", ...mappedPath.slice(i + 2)];\n changed = true;\n break;\n }\n }\n }\n }\n\n return { kind: \"path\", path: mappedPath };\n}\n\n/** Encode a document path for the `data-jx-path` attribute (preserves string-vs-number segments). */\nexport function serializeJxPath(path: JxPath): string {\n return JSON.stringify(path);\n}\n\n/** Decode a `data-jx-path` attribute back into a document path. */\nexport function parseJxPath(serialized: string): JxPath {\n return JSON.parse(serialized) as JxPath;\n}\n",
12
- "/// <reference lib=\"dom\" />\n/**\n * In-iframe render core — turns a fully-resolved document into live DOM via @jxsuite/runtime,\n * stamping `data-jx-path` so the editor can map nodes back to document paths across the frame\n * boundary. The parent does the heavy resolution (layout distribution, site-context, `$head`,\n * components, edit-mode transforms) and posts the result; this core stays dependency-light (runtime\n * + reactivity + the pure path-mapping helpers) so the iframe bundle is small.\n *\n * Because the iframe is served from the real project origin, the runtime's verbatim\n * `el.setAttribute(\"src\", \"/images/foo.jpg\")` resolves natively — the fix that motivated the whole\n * migration, with no data: URL rewriting.\n */\n\nimport {\n buildScope,\n defineElement,\n renderNode,\n runScoped,\n setCanvasDelinkAnchors,\n setCanvasViewportTranspose,\n setRootMedia,\n setSkipServerFunctions,\n transposeCanvasUnits,\n} from \"@jxsuite/runtime\";\nimport { classifyRenderNode, serializeJxPath } from \"./path-mapping\";\nimport type { CanvasMode } from \"./iframe-protocol\";\nimport type { JxDocument } from \"@jxsuite/schema/types\";\nimport type { PathMapCtx } from \"./path-mapping\";\n\n/**\n * The retained render context a full render leaves behind so the surgical patcher can re-render an\n * individual subtree (insert/replace/attr edits) with the SAME scope, doc base, path mapping, and\n * mode — making a patched subtree indistinguishable from a full re-render.\n */\nexport interface IframeRenderCtx {\n /** The `$defs` scope built for the document (resolves `$ref`/state/`$media` bindings). */\n defs: Awaited<ReturnType<typeof buildScope>>;\n docBase: string;\n mapperCtx: PathMapCtx;\n mode: CanvasMode;\n}\n\nexport interface RenderHandle {\n /** Stop the render's reactive effect scope (call before re-rendering to avoid effect leaks). */\n dispose: () => void;\n /** Context for surgical subtree re-renders against this generation's scope/mapping. */\n ctx: IframeRenderCtx;\n}\n\ninterface HeadEntry {\n tagName?: string;\n attributes?: Record<string, unknown>;\n textContent?: string;\n}\n\n/**\n * Register the document's `$elements` (components) in this iframe realm so the runtime can render\n * them.\n */\nexport async function registerElements(doc: JxDocument, docBase: string): Promise<void> {\n const elements = (doc as { $elements?: unknown[] }).$elements;\n if (!Array.isArray(elements)) {\n return;\n }\n // Register in parallel, each guarded by a timeout so one slow/hanging component can't block the\n // Whole render (the document still renders; the unresolved tag just stays inert).\n await Promise.all(\n elements.map(async (entry) => {\n const task = (async () => {\n if (typeof entry === \"string\") {\n const specifier =\n entry.startsWith(\"/\") || entry.startsWith(\".\") ? entry : `/node_modules/${entry}`;\n await import(specifier);\n } else if (entry && typeof entry === \"object\" && \"$ref\" in entry) {\n await defineElement(new URL(String((entry as { $ref: string }).$ref), docBase).href);\n } else if (entry && typeof entry === \"object\") {\n await defineElement(entry as JxDocument, docBase);\n }\n })();\n try {\n await Promise.race([\n task,\n new Promise((_, reject) => {\n setTimeout(() => reject(new Error(\"register timeout\")), 5000);\n }),\n ]);\n } catch (error) {\n console.warn(\"iframe canvas: failed to register element\", JSON.stringify(entry), error);\n }\n }),\n );\n}\n\n/** Id of the injected design/edit-mode canvas stylesheet (placeholder affordances). */\nexport const EDIT_PLACEHOLDER_STYLE_ID = \"jx-canvas-edit-css\";\n\n/**\n * The design/edit-mode canvas CSS, ported from the parent editor stylesheet (index.html) with\n * iframe-safe fallbacks — the parent theme variables (--fg-dim/--radius/--accent) don't exist in\n * the iframe document. The placeholder CLASSES are stamped by prepareForEditMode (parent-side\n * resolution + surgical subtree renders), so preview mode never matches these rules — but the sheet\n * is still removed there (belt and braces). The `[contenteditable=\"true\"]:empty` hint is new: it\n * marks the caret's empty paragraph (e.g. right after an Enter split) and advertises the slash\n * menu.\n */\nexport const EDIT_PLACEHOLDER_CSS = `\n.empty-media-placeholder {\n display: inline-block;\n min-width: 120px;\n min-height: 80px;\n border: 1px dashed color-mix(in srgb, #808080 30%, transparent);\n border-radius: 4px;\n background: color-mix(in srgb, #808080 5%, transparent)\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' fill='none'%3E%3Crect x='4' y='8' width='32' height='24' rx='2' stroke='%23808080' stroke-opacity='.4' stroke-width='1.5'/%3E%3Ccircle cx='13' cy='16' r='3' stroke='%23808080' stroke-opacity='.4' stroke-width='1.5'/%3E%3Cpath d='M8 28l8-8 5 5 4-4 7 7' stroke='%23808080' stroke-opacity='.4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")\n center / 40px no-repeat;\n color: transparent;\n font-size: 0;\n overflow: hidden;\n}\n.empty-text-placeholder:not([contenteditable])::after {\n content: \"Click here to add text...\";\n color: color-mix(in srgb, #808080 40%, transparent);\n font-style: italic;\n font-size: 13px;\n pointer-events: none;\n}\n.empty-container-placeholder {\n border: 1px dashed color-mix(in srgb, #808080 25%, transparent);\n border-radius: 4px;\n min-height: 32px;\n position: relative;\n}\n.empty-container-placeholder::after {\n content: \"Drag elements here...\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: color-mix(in srgb, #808080 40%, transparent);\n font-style: italic;\n font-size: 11px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: none;\n white-space: nowrap;\n}\n[contenteditable=\"true\"]:empty::after {\n content: \"Type / for commands\";\n color: color-mix(in srgb, #808080 40%, transparent);\n font-style: italic;\n font-size: 13px;\n pointer-events: none;\n}\n`;\n\n/**\n * Keep the design/edit canvas stylesheet in sync with the render mode: present (idempotently) for\n * design/edit, removed otherwise (preview must look live; stylebook specimens must not show \"Click\n * here to add text...\" placeholders).\n */\nexport function syncEditModeCss(doc: Document, mode: CanvasMode): void {\n const existing = doc.head.querySelector(`#${EDIT_PLACEHOLDER_STYLE_ID}`);\n if (mode !== \"design\" && mode !== \"edit\") {\n existing?.remove();\n return;\n }\n if (existing) {\n return;\n }\n const style = doc.createElement(\"style\");\n style.id = EDIT_PLACEHOLDER_STYLE_ID;\n style.textContent = EDIT_PLACEHOLDER_CSS;\n doc.head.append(style);\n}\n\n/** Id of the injected stylebook-mode chrome stylesheet (section/card scaffolding). */\nexport const STYLEBOOK_STYLE_ID = \"jx-canvas-stylebook-css\";\n\n/**\n * Card/section chrome for the stylebook specimen document, ported from the parent editor stylesheet\n * with self-contained fallback values (the parent theme vars don't exist in the iframe).\n * Deliberately OMITS the parent's `.element-card-preview { pointer-events: none }` — the iframe\n * owns hit-testing and needs real hits on the specimens.\n */\nexport const STYLEBOOK_CSS = `\n.sb-root {\n padding: 16px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n}\n.sb-section {\n margin-bottom: 24px;\n}\n.sb-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: color-mix(in srgb, #808080 70%, transparent);\n padding: 8px 0 4px;\n border-bottom: 1px solid color-mix(in srgb, #808080 25%, transparent);\n margin-bottom: 8px;\n}\n.sb-body {\n padding: 4px 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.element-card {\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid color-mix(in srgb, #808080 30%, transparent);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 6px;\n}\n.element-card-preview {\n background: #fff;\n padding: 6px 8px;\n min-height: 32px;\n display: flex;\n align-items: center;\n overflow: hidden;\n}\n.element-card-preview > * {\n max-width: 100%;\n margin: 0;\n padding: 0;\n}\n.element-card-preview > hr {\n width: 100%;\n border: none;\n border-top: 1px solid color-mix(in srgb, #808080 40%, transparent);\n}\n.element-card-preview > input,\n.element-card-preview > textarea,\n.element-card-preview > select,\n.element-card-preview > button,\n.element-card-preview > progress,\n.element-card-preview > meter {\n font-size: 10px;\n}\n.element-card-label {\n padding: 2px 6px;\n font-size: 10px;\n color: color-mix(in srgb, #808080 70%, transparent);\n background: color-mix(in srgb, #808080 8%, transparent);\n text-align: center;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n.sb-fallback {\n padding: 12px;\n border: 1px dashed color-mix(in srgb, #808080 40%, transparent);\n border-radius: 4px;\n color: color-mix(in srgb, #808080 70%, transparent);\n}\n.sb-empty {\n padding: 48px;\n text-align: center;\n color: color-mix(in srgb, #808080 70%, transparent);\n font-size: 13px;\n}\n`;\n\n/**\n * Keep the stylebook chrome stylesheet in sync with the render mode: present (idempotently) for\n * stylebook, removed otherwise.\n */\nexport function syncStylebookCss(doc: Document, mode: CanvasMode): void {\n const existing = doc.head.querySelector(`#${STYLEBOOK_STYLE_ID}`);\n if (mode !== \"stylebook\") {\n existing?.remove();\n return;\n }\n if (existing) {\n return;\n }\n const style = doc.createElement(\"style\");\n style.id = STYLEBOOK_STYLE_ID;\n style.textContent = STYLEBOOK_CSS;\n doc.head.append(style);\n}\n\n/** Apply the project's site style: custom properties on :root, plain properties on <body>. */\nexport function applySiteStyle(siteStyle: Record<string, unknown> | null | undefined): void {\n if (!siteStyle || typeof siteStyle !== \"object\") {\n return;\n }\n const rootStyle = document.documentElement.style;\n const bodyStyle = document.body.style as unknown as Record<string, string>;\n for (const [key, value] of Object.entries(siteStyle)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n continue;\n }\n if (key.startsWith(\"--\")) {\n rootStyle.setProperty(key, transposeCanvasUnits(String(value)));\n } else {\n bodyStyle[key] = transposeCanvasUnits(String(value));\n }\n }\n}\n\n/** Inject the document's `$head` (link/meta/script) into the iframe's <head>, de-duped by href/src. */\nexport function injectHead(doc: JxDocument): void {\n const head = (doc as { $head?: HeadEntry[] }).$head;\n if (!Array.isArray(head)) {\n return;\n }\n for (const entry of head) {\n if (!entry?.tagName) {\n continue;\n }\n const tag = String(entry.tagName).toLowerCase();\n // Skip inline scripts in design/edit; they're for the live page, not the editor canvas.\n if (tag === \"script\" && !entry.attributes?.src) {\n continue;\n }\n const attrs = { ...entry.attributes } as Record<string, unknown>;\n for (const key of [\"href\", \"src\"]) {\n const val = attrs[key];\n if (\n typeof val === \"string\" &&\n !val.startsWith(\"/\") &&\n !val.startsWith(\".\") &&\n !val.startsWith(\"http\")\n ) {\n attrs[key] = `/node_modules/${val}`;\n }\n }\n const sel = `${tag}${attrs.href ? `[href=\"${String(attrs.href)}\"]` : \"\"}${attrs.src ? `[src=\"${String(attrs.src)}\"]` : \"\"}`;\n if (sel !== tag && document.head.querySelector(sel)) {\n continue;\n }\n const el = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) {\n el.setAttribute(k, String(v));\n }\n if (entry.textContent) {\n el.textContent = entry.textContent;\n }\n document.head.append(el);\n }\n}\n\n/** Build the `onNodeCreated` hook that stamps `data-jx-path` / `data-jx-layout` on rendered nodes. */\nexport function makeStamper(ctx: PathMapCtx) {\n return (created: Node, path: (string | number)[], def: unknown) => {\n if (!(created instanceof HTMLElement)) {\n return;\n }\n // The OPENED document's root can itself be a component definition (`tagName: \"eer-cta\"`). If\n // That tag is already registered in this realm (a previously-rendered page instantiated it —\n // Hosts persist across tab switches), the upgrade's connectedCallback would wipe the stamped\n // Editable tree and re-render a live instance with default state. Mark the root so the\n // Runtime's element class leaves it alone (see defineElement's connectedCallback guard).\n if (path.length === 0 && (def as { tagName?: string } | null)?.tagName?.includes(\"-\")) {\n created.dataset.jxDefinitionRoot = \"\";\n }\n const classified = classifyRenderNode(path, def, ctx);\n if (classified.kind === \"layout\") {\n created.dataset.jxLayout = \"\";\n return;\n }\n created.dataset.jxPath = serializeJxPath(classified.path);\n };\n}\n\n/**\n * Recover canvas images that fail their first load. Registered components create their <img> in\n * connectedCallback AFTER async registration, so on a cold first render those requests can fire\n * before the loopback server is warm and 404 — which the browser then caches as a\n * permanently-broken <img>. This re-fires a failed request a few times with backoff (exactly what\n * the manual canvas re-render does), recovering the image without a full re-render. Bounded\n * per-image so a genuinely missing file settles broken. Intentional data: placeholders never error,\n * so they're untouched. Returns a teardown that removes the listener. <img> error events don't\n * bubble, so listen in CAPTURE.\n */\nexport function installCanvasImageRetry(root: HTMLElement, maxAttempts = 3): () => void {\n const attempts = new WeakMap<HTMLImageElement, number>();\n const onError = (event: Event): void => {\n const img = event.target;\n if (!(img instanceof HTMLImageElement)) {\n return;\n }\n // A data: URL never errors (and an empty src isn't a real request) — nothing to retry.\n if (!img.src || img.src.startsWith(\"data:\")) {\n return;\n }\n const attempt = (attempts.get(img) ?? 0) + 1;\n if (attempt > maxAttempts) {\n // Bounded: a genuinely missing file settles broken instead of retrying forever.\n return;\n }\n attempts.set(img, attempt);\n setTimeout(() => {\n // Re-fire the request by clearing then re-assigning the same src (mirrors the manual re-render).\n const s = img.src;\n img.src = \"\";\n img.src = s;\n }, 150 * attempt);\n };\n root.addEventListener(\"error\", onError, true);\n return () => root.removeEventListener(\"error\", onError, true);\n}\n\n/**\n * Render a resolved document into `container`, replacing its current children. `mode` controls\n * whether server functions run (live in `preview`; skipped in `design`/`edit`). Returns a handle\n * whose `dispose()` stops the reactive scope.\n */\nexport async function renderResolvedDocument(opts: {\n container: HTMLElement;\n doc: JxDocument;\n docBase: string;\n mode: CanvasMode;\n mapperCtx: PathMapCtx;\n siteStyle?: Record<string, unknown> | null;\n}): Promise<RenderHandle> {\n setSkipServerFunctions(opts.mode !== \"preview\");\n // Transpose viewport units (vh/vw/…) → container units (cqh/cqw/…) so they resolve against the\n // Canvas's fixed-size query container (canvas.html) instead of the iframe element. That decouples\n // Them from the iframe height, letting the host size the iframe to its content without `100vh`\n // Sections feeding back into an ever-growing height. Set every render (the iframe always wants it).\n setCanvasViewportTranspose(true);\n // De-link `<a href>` in design/edit so clicks select the anchor instead of navigating the iframe;\n // Preview keeps real links live (mirrors the server-function gate above).\n setCanvasDelinkAnchors(opts.mode !== \"preview\");\n applySiteStyle(opts.siteStyle);\n injectHead(opts.doc);\n syncEditModeCss(opts.container.ownerDocument, opts.mode);\n syncStylebookCss(opts.container.ownerDocument, opts.mode);\n // Seed the runtime's root $media before buildScope so a COMPONENT with its own `@--name` blocks\n // But no own `$media` resolves the breakpoint to its real query (the iframe path calls buildScope\n // Directly and never the runtime's `Jx()` entry, which is the only other place _rootMedia is set).\n // Set it every render (even to `{}`) so a stale map from a previous document cannot leak.\n setRootMedia((opts.doc as { $media?: Record<string, string> }).$media ?? {});\n // Register components BEFORE renderNode. The runtime only applies a custom element's `$props` when\n // That element is ALREADY defined (renderNode gates renderCustomElementWithProps on a truthy\n // `customElements.get(tagName)`); if we register after render, every component paints with its\n // Props dropped — it upgrades in place to the empty default state (<img src=\"\">) — which was the\n // Empty-render regression. `registerElements` wraps each element in a per-element 5s Promise.race\n // Timeout and swallows failures internally, so awaiting it can't block the render indefinitely on\n // A slow/hanging component (the document still renders; an unresolved tag just stays inert).\n await registerElements(opts.doc, opts.docBase);\n const $defs = await buildScope(opts.doc, {}, opts.docBase);\n const onNodeCreated = makeStamper(opts.mapperCtx);\n // The scope MUST be the runtime's (runScoped): renderNode creates its binding effects with the\n // Runtime's copy of @vue/reactivity, and scope collection is per module instance — a studio\n // EffectScope here collects nothing and dispose() would leak every effect of this render.\n const { result: el, stop } = runScoped(\n () => renderNode(opts.doc, $defs, { _path: [], onNodeCreated }) as HTMLElement,\n );\n opts.container.replaceChildren(el);\n return {\n ctx: { defs: $defs, docBase: opts.docBase, mapperCtx: opts.mapperCtx, mode: opts.mode },\n dispose: stop,\n };\n}\n",
13
+ "/// <reference lib=\"dom\" />\n/**\n * In-iframe render core — turns a fully-resolved document into live DOM via @jxsuite/runtime,\n * stamping `data-jx-path` so the editor can map nodes back to document paths across the frame\n * boundary. The parent does the heavy resolution (layout distribution, site-context, `$head`,\n * components, edit-mode transforms) and posts the result; this core stays dependency-light (runtime\n * + reactivity + the pure path-mapping helpers) so the iframe bundle is small.\n *\n * Because the iframe is served from the real project origin, the runtime's verbatim\n * `el.setAttribute(\"src\", \"/images/foo.jpg\")` resolves natively — the fix that motivated the whole\n * migration, with no data: URL rewriting.\n */\n\nimport {\n buildScope,\n defineElement,\n renderNode,\n runScoped,\n setCanvasDelinkAnchors,\n setCanvasViewportTranspose,\n setRootMedia,\n setSkipServerFunctions,\n setStampPropBindings,\n transposeCanvasUnits,\n} from \"@jxsuite/runtime\";\nimport { classifyRenderNode, serializeJxPath } from \"./path-mapping\";\nimport type { CanvasMode } from \"./iframe-protocol\";\nimport type { JxDocument } from \"@jxsuite/schema/types\";\nimport type { PathMapCtx } from \"./path-mapping\";\n\n/**\n * The retained render context a full render leaves behind so the surgical patcher can re-render an\n * individual subtree (insert/replace/attr edits) with the SAME scope, doc base, path mapping, and\n * mode — making a patched subtree indistinguishable from a full re-render.\n */\nexport interface IframeRenderCtx {\n /** The `$defs` scope built for the document (resolves `$ref`/state/`$media` bindings). */\n defs: Awaited<ReturnType<typeof buildScope>>;\n docBase: string;\n mapperCtx: PathMapCtx;\n mode: CanvasMode;\n}\n\nexport interface RenderHandle {\n /** Stop the render's reactive effect scope (call before re-rendering to avoid effect leaks). */\n dispose: () => void;\n /** Context for surgical subtree re-renders against this generation's scope/mapping. */\n ctx: IframeRenderCtx;\n}\n\ninterface HeadEntry {\n tagName?: string;\n attributes?: Record<string, unknown>;\n textContent?: string;\n}\n\n/**\n * Register the document's `$elements` (components) in this iframe realm so the runtime can render\n * them.\n */\nexport async function registerElements(doc: JxDocument, docBase: string): Promise<void> {\n const elements = (doc as { $elements?: unknown[] }).$elements;\n if (!Array.isArray(elements)) {\n return;\n }\n // Register in parallel, each guarded by a timeout so one slow/hanging component can't block the\n // Whole render (the document still renders; the unresolved tag just stays inert).\n await Promise.all(\n elements.map(async (entry) => {\n const task = (async () => {\n if (typeof entry === \"string\") {\n const specifier =\n entry.startsWith(\"/\") || entry.startsWith(\".\") ? entry : `/node_modules/${entry}`;\n await import(specifier);\n } else if (entry && typeof entry === \"object\" && \"$ref\" in entry) {\n await defineElement(new URL(String((entry as { $ref: string }).$ref), docBase).href);\n } else if (entry && typeof entry === \"object\") {\n await defineElement(entry as JxDocument, docBase);\n }\n })();\n try {\n await Promise.race([\n task,\n new Promise((_, reject) => {\n setTimeout(() => reject(new Error(\"register timeout\")), 5000);\n }),\n ]);\n } catch (error) {\n console.warn(\"iframe canvas: failed to register element\", JSON.stringify(entry), error);\n }\n }),\n );\n}\n\n/** Id of the injected design/edit-mode canvas stylesheet (placeholder affordances). */\nexport const EDIT_PLACEHOLDER_STYLE_ID = \"jx-canvas-edit-css\";\n\n/**\n * The design/edit-mode canvas CSS, ported from the parent editor stylesheet (index.html) with\n * iframe-safe fallbacks — the parent theme variables (--fg-dim/--radius/--accent) don't exist in\n * the iframe document. The placeholder CLASSES are stamped by prepareForEditMode (parent-side\n * resolution + surgical subtree renders), so preview mode never matches these rules — but the sheet\n * is still removed there (belt and braces). The `[contenteditable=\"true\"]:empty` hint is new: it\n * marks the caret's empty paragraph (e.g. right after an Enter split) and advertises the slash\n * menu.\n */\nexport const EDIT_PLACEHOLDER_CSS = `\n.empty-media-placeholder {\n display: inline-block;\n min-width: 120px;\n min-height: 80px;\n border: 1px dashed color-mix(in srgb, #808080 30%, transparent);\n border-radius: 4px;\n background: color-mix(in srgb, #808080 5%, transparent)\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' fill='none'%3E%3Crect x='4' y='8' width='32' height='24' rx='2' stroke='%23808080' stroke-opacity='.4' stroke-width='1.5'/%3E%3Ccircle cx='13' cy='16' r='3' stroke='%23808080' stroke-opacity='.4' stroke-width='1.5'/%3E%3Cpath d='M8 28l8-8 5 5 4-4 7 7' stroke='%23808080' stroke-opacity='.4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")\n center / 40px no-repeat;\n color: transparent;\n font-size: 0;\n overflow: hidden;\n}\n.empty-text-placeholder:not([contenteditable])::after {\n content: \"Click here to add text...\";\n color: color-mix(in srgb, #808080 40%, transparent);\n font-style: italic;\n font-size: 13px;\n pointer-events: none;\n}\n.empty-container-placeholder {\n border: 1px dashed color-mix(in srgb, #808080 25%, transparent);\n border-radius: 4px;\n min-height: 32px;\n position: relative;\n}\n.empty-container-placeholder::after {\n content: \"Drag elements here...\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: color-mix(in srgb, #808080 40%, transparent);\n font-style: italic;\n font-size: 11px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: none;\n white-space: nowrap;\n}\n[contenteditable=\"true\"]:empty::after {\n content: \"Type / for commands\";\n color: color-mix(in srgb, #808080 40%, transparent);\n font-style: italic;\n font-size: 13px;\n pointer-events: none;\n}\n[data-jx-bound-prop]:hover {\n cursor: text;\n outline: 1px dashed color-mix(in srgb, #808080 40%, transparent);\n outline-offset: 1px;\n}\n[data-jx-bound-prop]:empty:not([contenteditable=\"plaintext-only\"]):not([contenteditable=\"true\"])::after {\n content: \"Empty \\\\2014 double-click to edit\";\n color: color-mix(in srgb, #808080 40%, transparent);\n font-style: italic;\n font-size: 13px;\n pointer-events: none;\n}\n`;\n\n/**\n * Keep the design/edit canvas stylesheet in sync with the render mode: present (idempotently) for\n * design/edit, removed otherwise (preview must look live; stylebook specimens must not show \"Click\n * here to add text...\" placeholders).\n */\nexport function syncEditModeCss(doc: Document, mode: CanvasMode): void {\n const existing = doc.head.querySelector(`#${EDIT_PLACEHOLDER_STYLE_ID}`);\n if (mode !== \"design\" && mode !== \"edit\") {\n existing?.remove();\n return;\n }\n if (existing) {\n return;\n }\n const style = doc.createElement(\"style\");\n style.id = EDIT_PLACEHOLDER_STYLE_ID;\n style.textContent = EDIT_PLACEHOLDER_CSS;\n doc.head.append(style);\n}\n\n/** Id of the injected stylebook-mode chrome stylesheet (section/card scaffolding). */\nexport const STYLEBOOK_STYLE_ID = \"jx-canvas-stylebook-css\";\n\n/**\n * Card/section chrome for the stylebook specimen document, ported from the parent editor stylesheet\n * with self-contained fallback values (the parent theme vars don't exist in the iframe).\n * Deliberately OMITS the parent's `.element-card-preview { pointer-events: none }` — the iframe\n * owns hit-testing and needs real hits on the specimens.\n */\nexport const STYLEBOOK_CSS = `\n.sb-root {\n padding: 16px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n}\n.sb-section {\n margin-bottom: 24px;\n}\n.sb-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: color-mix(in srgb, #808080 70%, transparent);\n padding: 8px 0 4px;\n border-bottom: 1px solid color-mix(in srgb, #808080 25%, transparent);\n margin-bottom: 8px;\n}\n.sb-body {\n padding: 4px 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.element-card {\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid color-mix(in srgb, #808080 30%, transparent);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 6px;\n}\n.element-card-preview {\n background: #fff;\n padding: 6px 8px;\n min-height: 32px;\n display: flex;\n align-items: center;\n overflow: hidden;\n}\n.element-card-preview > * {\n max-width: 100%;\n margin: 0;\n padding: 0;\n}\n.element-card-preview > hr {\n width: 100%;\n border: none;\n border-top: 1px solid color-mix(in srgb, #808080 40%, transparent);\n}\n.element-card-preview > input,\n.element-card-preview > textarea,\n.element-card-preview > select,\n.element-card-preview > button,\n.element-card-preview > progress,\n.element-card-preview > meter {\n font-size: 10px;\n}\n.element-card-label {\n padding: 2px 6px;\n font-size: 10px;\n color: color-mix(in srgb, #808080 70%, transparent);\n background: color-mix(in srgb, #808080 8%, transparent);\n text-align: center;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n.sb-fallback {\n padding: 12px;\n border: 1px dashed color-mix(in srgb, #808080 40%, transparent);\n border-radius: 4px;\n color: color-mix(in srgb, #808080 70%, transparent);\n}\n.sb-empty {\n padding: 48px;\n text-align: center;\n color: color-mix(in srgb, #808080 70%, transparent);\n font-size: 13px;\n}\n`;\n\n/**\n * Keep the stylebook chrome stylesheet in sync with the render mode: present (idempotently) for\n * stylebook, removed otherwise.\n */\nexport function syncStylebookCss(doc: Document, mode: CanvasMode): void {\n const existing = doc.head.querySelector(`#${STYLEBOOK_STYLE_ID}`);\n if (mode !== \"stylebook\") {\n existing?.remove();\n return;\n }\n if (existing) {\n return;\n }\n const style = doc.createElement(\"style\");\n style.id = STYLEBOOK_STYLE_ID;\n style.textContent = STYLEBOOK_CSS;\n doc.head.append(style);\n}\n\n/** Apply the project's site style: custom properties on :root, plain properties on <body>. */\nexport function applySiteStyle(siteStyle: Record<string, unknown> | null | undefined): void {\n if (!siteStyle || typeof siteStyle !== \"object\") {\n return;\n }\n const rootStyle = document.documentElement.style;\n const bodyStyle = document.body.style as unknown as Record<string, string>;\n for (const [key, value] of Object.entries(siteStyle)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n continue;\n }\n if (key.startsWith(\"--\")) {\n rootStyle.setProperty(key, transposeCanvasUnits(String(value)));\n } else {\n bodyStyle[key] = transposeCanvasUnits(String(value));\n }\n }\n}\n\n/** Inject the document's `$head` (link/meta/script) into the iframe's <head>, de-duped by href/src. */\nexport function injectHead(doc: JxDocument): void {\n const head = (doc as { $head?: HeadEntry[] }).$head;\n if (!Array.isArray(head)) {\n return;\n }\n for (const entry of head) {\n if (!entry?.tagName) {\n continue;\n }\n const tag = String(entry.tagName).toLowerCase();\n // Skip inline scripts in design/edit; they're for the live page, not the editor canvas.\n if (tag === \"script\" && !entry.attributes?.src) {\n continue;\n }\n const attrs = { ...entry.attributes } as Record<string, unknown>;\n for (const key of [\"href\", \"src\"]) {\n const val = attrs[key];\n if (\n typeof val === \"string\" &&\n !val.startsWith(\"/\") &&\n !val.startsWith(\".\") &&\n !val.startsWith(\"http\")\n ) {\n attrs[key] = `/node_modules/${val}`;\n }\n }\n const sel = `${tag}${attrs.href ? `[href=\"${String(attrs.href)}\"]` : \"\"}${attrs.src ? `[src=\"${String(attrs.src)}\"]` : \"\"}`;\n if (sel !== tag && document.head.querySelector(sel)) {\n continue;\n }\n const el = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) {\n el.setAttribute(k, String(v));\n }\n if (entry.textContent) {\n el.textContent = entry.textContent;\n }\n document.head.append(el);\n }\n}\n\n/** Build the `onNodeCreated` hook that stamps `data-jx-path` / `data-jx-layout` on rendered nodes. */\nexport function makeStamper(ctx: PathMapCtx) {\n return (created: Node, path: (string | number)[], def: unknown) => {\n if (!(created instanceof HTMLElement)) {\n return;\n }\n // The OPENED document's root can itself be a component definition (`tagName: \"eer-cta\"`). If\n // That tag is already registered in this realm (a previously-rendered page instantiated it —\n // Hosts persist across tab switches), the upgrade's connectedCallback would wipe the stamped\n // Editable tree and re-render a live instance with default state. Mark the root so the\n // Runtime's element class leaves it alone (see defineElement's connectedCallback guard).\n if (path.length === 0 && (def as { tagName?: string } | null)?.tagName?.includes(\"-\")) {\n created.dataset.jxDefinitionRoot = \"\";\n }\n const classified = classifyRenderNode(path, def, ctx);\n if (classified.kind === \"layout\") {\n created.dataset.jxLayout = \"\";\n return;\n }\n created.dataset.jxPath = serializeJxPath(classified.path);\n };\n}\n\n/**\n * Recover canvas images that fail their first load. Registered components create their <img> in\n * connectedCallback AFTER async registration, so on a cold first render those requests can fire\n * before the loopback server is warm and 404 — which the browser then caches as a\n * permanently-broken <img>. This re-fires a failed request a few times with backoff (exactly what\n * the manual canvas re-render does), recovering the image without a full re-render. Bounded\n * per-image so a genuinely missing file settles broken. Intentional data: placeholders never error,\n * so they're untouched. Returns a teardown that removes the listener. <img> error events don't\n * bubble, so listen in CAPTURE.\n */\nexport function installCanvasImageRetry(root: HTMLElement, maxAttempts = 3): () => void {\n const attempts = new WeakMap<HTMLImageElement, number>();\n const onError = (event: Event): void => {\n const img = event.target;\n if (!(img instanceof HTMLImageElement)) {\n return;\n }\n // A data: URL never errors (and an empty src isn't a real request) — nothing to retry.\n if (!img.src || img.src.startsWith(\"data:\")) {\n return;\n }\n const attempt = (attempts.get(img) ?? 0) + 1;\n if (attempt > maxAttempts) {\n // Bounded: a genuinely missing file settles broken instead of retrying forever.\n return;\n }\n attempts.set(img, attempt);\n setTimeout(() => {\n // Re-fire the request by clearing then re-assigning the same src (mirrors the manual re-render).\n const s = img.src;\n img.src = \"\";\n img.src = s;\n }, 150 * attempt);\n };\n root.addEventListener(\"error\", onError, true);\n return () => root.removeEventListener(\"error\", onError, true);\n}\n\n/**\n * Render a resolved document into `container`, replacing its current children. `mode` controls\n * whether server functions run (live in `preview`; skipped in `design`/`edit`). Returns a handle\n * whose `dispose()` stops the reactive scope.\n */\nexport async function renderResolvedDocument(opts: {\n container: HTMLElement;\n doc: JxDocument;\n docBase: string;\n mode: CanvasMode;\n mapperCtx: PathMapCtx;\n siteStyle?: Record<string, unknown> | null;\n}): Promise<RenderHandle> {\n setSkipServerFunctions(opts.mode !== \"preview\");\n // Transpose viewport units (vh/vw/…) → container units (cqh/cqw/…) so they resolve against the\n // Canvas's fixed-size query container (canvas.html) instead of the iframe element. That decouples\n // Them from the iframe height, letting the host size the iframe to its content without `100vh`\n // Sections feeding back into an ever-growing height. Set every render (the iframe always wants it).\n setCanvasViewportTranspose(true);\n // De-link `<a href>` in design/edit so clicks select the anchor instead of navigating the iframe;\n // Preview keeps real links live (mirrors the server-function gate above).\n setCanvasDelinkAnchors(opts.mode !== \"preview\");\n // Stamp `data-jx-bound-prop` on component-internal invertible text bindings in design/edit only —\n // The inline prop-edit affordance. Set every render so a preview/stylebook render in the same\n // Iframe clears it (page-level templates are inert in design/edit via prepareForEditMode, so only\n // Component internals get stamped).\n setStampPropBindings(opts.mode === \"design\" || opts.mode === \"edit\");\n applySiteStyle(opts.siteStyle);\n injectHead(opts.doc);\n syncEditModeCss(opts.container.ownerDocument, opts.mode);\n syncStylebookCss(opts.container.ownerDocument, opts.mode);\n // Seed the runtime's root $media before buildScope so a COMPONENT with its own `@--name` blocks\n // But no own `$media` resolves the breakpoint to its real query (the iframe path calls buildScope\n // Directly and never the runtime's `Jx()` entry, which is the only other place _rootMedia is set).\n // Set it every render (even to `{}`) so a stale map from a previous document cannot leak.\n setRootMedia((opts.doc as { $media?: Record<string, string> }).$media ?? {});\n // Register components BEFORE renderNode. The runtime only applies a custom element's `$props` when\n // That element is ALREADY defined (renderNode gates renderCustomElementWithProps on a truthy\n // `customElements.get(tagName)`); if we register after render, every component paints with its\n // Props dropped — it upgrades in place to the empty default state (<img src=\"\">) — which was the\n // Empty-render regression. `registerElements` wraps each element in a per-element 5s Promise.race\n // Timeout and swallows failures internally, so awaiting it can't block the render indefinitely on\n // A slow/hanging component (the document still renders; an unresolved tag just stays inert).\n await registerElements(opts.doc, opts.docBase);\n const $defs = await buildScope(opts.doc, {}, opts.docBase);\n const onNodeCreated = makeStamper(opts.mapperCtx);\n // The scope MUST be the runtime's (runScoped): renderNode creates its binding effects with the\n // Runtime's copy of @vue/reactivity, and scope collection is per module instance — a studio\n // EffectScope here collects nothing and dispose() would leak every effect of this render.\n const { result: el, stop } = runScoped(\n () => renderNode(opts.doc, $defs, { _path: [], onNodeCreated }) as HTMLElement,\n );\n opts.container.replaceChildren(el);\n return {\n ctx: { defs: $defs, docBase: opts.docBase, mapperCtx: opts.mapperCtx, mode: opts.mode },\n dispose: stop,\n };\n}\n",
13
14
  "/// <reference lib=\"dom\" />\n/**\n * Geometry read funnel — the single place the studio reads element bounds and does point hit-tests.\n *\n * Centralizing these reads is a seam for the iframe-canvas migration: today every call delegates\n * straight to the DOM, but routing them through one module lets later phases redirect\n * CANVAS-element geometry to rects posted out of the iframe (which the parent can't measure\n * directly) without touching dozens of call sites. A test (`geometry.test.ts`) asserts no raw\n * `getBoundingClientRect`/`elementFromPoint`/`elementsFromPoint` calls exist elsewhere in `src`.\n */\n\n/** Bounding rect of an element, in viewport coordinates. */\nexport function rectOf(el: Element): DOMRect {\n return el.getBoundingClientRect();\n}\n\n/**\n * Bounding rect of a Range, in viewport coordinates. Lives here (the one allowlisted home for\n * `getBoundingClientRect`) so the `geometry.test.ts` textual guard passes — the iframe-side\n * selection snapshot funnels its caret/selection geometry through this, never calling\n * `range.getBoundingClientRect()` directly.\n */\nexport function rectOfRange(r: Range): DOMRect {\n return r.getBoundingClientRect();\n}\n\n/** Topmost element at a viewport point, in `root` (defaults to the global document). */\nexport function elementAtPoint(\n x: number,\n y: number,\n root: Document | ShadowRoot = document,\n): Element | null {\n return root.elementFromPoint(x, y);\n}\n\n/** All elements at a viewport point, front-to-back, in `root` (defaults to the global document). */\nexport function elementsAtPoint(\n x: number,\n y: number,\n root: Document | ShadowRoot = document,\n): Element[] {\n return root.elementsFromPoint(x, y);\n}\n",
14
15
  "/// <reference lib=\"dom\" />\n/**\n * State.js — Builder state model and mutation API\n *\n * All state changes go through named mutation functions. State is immutable — every mutation\n * produces a new state object. History is a linear stack of { document, selection } snapshots.\n *\n * Path convention: [] = root document ['children', 0] = first child ['children', 0, 'children', 2]\n * = third child of first child\n */\n\nimport type { ProjectState } from \"./types\";\nimport { isRef } from \"@jxsuite/schema/guards\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\nexport type JxPath = (string | number)[];\n\ninterface HistorySnapshot {\n document: JxMutableNode;\n selection: JxPath | null;\n}\n\nexport interface StudioState {\n document: JxMutableNode;\n selection: JxPath | null;\n hover: JxPath | null;\n history: HistorySnapshot[];\n historyIndex: number;\n dirty: boolean;\n fileHandle: FileSystemFileHandle | null;\n documentPath: string | null;\n documentStack: StudioStackFrame[];\n handlersSource: string | null;\n mode: string;\n content: { frontmatter: Record<string, unknown> };\n ui: Record<string, unknown>;\n canvas: {\n status: string;\n scope: Record<string, unknown> | null;\n error: string | null;\n };\n}\n\ninterface StudioStackFrame {\n document: JxMutableNode;\n selection: JxPath | null;\n fileHandle: FileSystemFileHandle | null;\n documentPath: string | null;\n dirty: boolean;\n history: HistorySnapshot[];\n historyIndex: number;\n mode: string;\n}\n\n// ─── Path utilities ───────────────────────────────────────────────────────────\n\n/**\n * Walk the document tree and return the node at the given path.\n *\n * @param {JxMutableNode} doc\n * @param {JxPath} path\n * @returns {JxMutableNode}\n */\nexport function getNodeAtPath(doc: JxMutableNode, path: JxPath) {\n let node = doc;\n for (const key of path) {\n if (node == null) {\n return undefined as unknown as JxMutableNode;\n }\n // Paths address nodes by construction; non-node leaves surface as undefined above.\n node = node[key] as JxMutableNode;\n }\n return node;\n}\n\n/**\n * Shallow-clone every node along `path` from root to target, leaving non-path subtrees as shared\n * references. Returns the new root and the mutable target node at the end of the path.\n *\n * Used by mutation functions for structural-sharing history: the old root becomes an immutable\n * snapshot (shared subtrees are never mutated), and the new root is the live document.\n */\nexport function cloneAlongPath(\n doc: JxMutableNode,\n path: JxPath,\n): { root: JxMutableNode; target: JxMutableNode } {\n const root = Array.isArray(doc) ? [...doc] : { ...doc };\n let node: Record<string | number, unknown> = root as Record<string | number, unknown>;\n\n for (const key of path) {\n const child = node[key];\n if (child == null) {\n return { root: root as JxMutableNode, target: node as JxMutableNode };\n }\n const cloned = Array.isArray(child)\n ? [...(child as unknown[])]\n : { ...(child as Record<string, unknown>) };\n node[key] = cloned;\n node = cloned as Record<string | number, unknown>;\n }\n\n return { root: root as JxMutableNode, target: node as JxMutableNode };\n}\n\n/**\n * The node's children when they are a static array (the edit-mode invariant); an empty array for\n * mapped-array or absent children.\n *\n * @param {JxMutableNode | null | undefined} node\n * @returns {(JxMutableNode | string)[]}\n */\nexport function childList(node: JxMutableNode | null | undefined): (JxMutableNode | string)[] {\n return Array.isArray(node?.children) ? node.children : [];\n}\n\n/**\n * Normalize a document in place to the canonical array-member form: a legacy whole-children\n * repeater (`children: { $prototype: \"Array\", … }`) becomes a single member of a children array\n * (`children: [{ $prototype: \"Array\", … }]`). Recurses through children, repeater templates, and\n * `$switch` cases. Runs once when a document is loaded into a tab so every in-studio doc — and its\n * history checkpoints — uses the member form before any mutation.\n *\n * @param {unknown} node\n * @returns {unknown} The same node (mutated)\n */\nexport function normalizeArrayChildren(node: unknown): unknown {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n if (Array.isArray(node)) {\n for (const child of node) {\n normalizeArrayChildren(child);\n }\n return node;\n }\n const n = node as JxMutableNode;\n const { children } = n;\n if (\n children &&\n typeof children === \"object\" &&\n !Array.isArray(children) &&\n (children as JxMutableNode).$prototype === \"Array\"\n ) {\n n.children = [children as JxMutableNode];\n }\n if (Array.isArray(n.children)) {\n for (const child of n.children) {\n normalizeArrayChildren(child);\n }\n }\n if (n.$prototype === \"Array\" && n.map && typeof n.map === \"object\") {\n normalizeArrayChildren(n.map);\n }\n if (n.cases && typeof n.cases === \"object\") {\n for (const caseDef of Object.values(n.cases)) {\n normalizeArrayChildren(caseDef);\n }\n }\n return node;\n}\n\n/**\n * Return the path to the parent element (strips trailing 'children' + index).\n *\n * @param {JxPath} path\n * @returns {JxPath | null}\n */\nexport function parentElementPath(path: JxPath) {\n return path.length >= 2 ? path.slice(0, -2) : null;\n}\n\n/**\n * Return the child index (last segment of the path).\n *\n * @param {JxPath} path\n * @returns {string | number}\n */\nexport function childIndex(path: JxPath) {\n return path.at(-1);\n}\n\n/**\n * Serialize a path to a string key for Map lookups.\n *\n * @param {JxPath} path\n * @returns {string}\n */\nexport function pathKey(path: JxPath) {\n return path.join(\"/\");\n}\n\n/**\n * Compare two paths for equality.\n *\n * @param {JxPath | null} a\n * @param {JxPath | null} b\n * @returns {boolean}\n */\nexport function pathsEqual(a: JxPath | null, b: JxPath | null) {\n if (a === b) {\n return true;\n }\n if (!a || !b || a.length !== b.length) {\n return false;\n }\n return a.every((v, i) => v === b[i]);\n}\n\n/**\n * Returns true if `path` is an ancestor of (or equal to) `descendant`.\n *\n * @param {JxPath} path\n * @param {JxPath} descendant\n * @returns {boolean}\n */\nexport function isAncestor(path: JxPath, descendant: JxPath) {\n if (path.length > descendant.length) {\n return false;\n }\n return path.every((v, i) => v === descendant[i]);\n}\n\n// ─── Tree flattening (for layer panel) ────────────────────────────────────────\n\n/**\n * Flatten a Jx document into an array of { node, path, depth, nodeType } rows. Walks static\n * children arrays, $map templates, and $switch cases.\n *\n * NodeType: 'element' (default) | 'map' | 'case' | 'case-ref'\n *\n * @param {JxMutableNode | string | number | boolean} doc\n * @param {JxPath} [path]\n * @param {number} [depth]\n * @returns {{\n * node: JxMutableNode | string | number | boolean;\n * path: JxPath;\n * depth: number;\n * nodeType: string;\n * }[]}\n */\nexport interface FlatRow {\n node: JxMutableNode | string | number | boolean;\n path: JxPath;\n depth: number;\n nodeType: string;\n}\n\nexport function flattenTree(\n doc: JxMutableNode | string | number | boolean,\n path: JxPath = [],\n depth = 0,\n): FlatRow[] {\n // Text node children: bare primitives get a \"text\" row\n if (typeof doc === \"string\" || typeof doc === \"number\" || typeof doc === \"boolean\") {\n return [{ depth, node: doc, nodeType: \"text\", path }];\n }\n\n // Array pseudo-element (repeater): a first-class node at its own path. Emit the \"map\" row, then\n // Recurse into its single template at `[...path, \"map\"]`. This is reached both when the array is\n // A member of a children array (path `[…, \"children\", i]`) and the legacy whole-children form\n // (path `[…, \"children\"]`).\n if ((doc as JxMutableNode).$prototype === \"Array\") {\n const rows: FlatRow[] = [{ depth, node: doc, nodeType: \"map\", path }];\n const mapDef = (doc as JxMutableNode).map;\n if (mapDef && typeof mapDef === \"object\") {\n rows.push(...flattenTree(mapDef as JxMutableNode, [...path, \"map\"], depth + 1));\n }\n return rows;\n }\n\n const rows: FlatRow[] = [{ depth, node: doc, nodeType: \"element\", path }];\n\n // Custom component instances without user-authored children are atomic in the layer tree\n if (doc.$props && (doc.tagName || \"\").includes(\"-\") && !Array.isArray(doc.children)) {\n return rows;\n }\n\n const { children } = doc;\n\n if (Array.isArray(children)) {\n for (let i = 0; i < children.length; i++) {\n const childPath = [...path, \"children\", i];\n rows.push(...flattenTree(children[i]!, childPath, depth + 1));\n }\n } else if (\n children &&\n typeof children === \"object\" &&\n (children as JxMutableNode).$prototype === \"Array\"\n ) {\n // Legacy whole-children repeater: the array occupies the children slot itself.\n rows.push(...flattenTree(children as JxMutableNode, [...path, \"children\"], depth + 1));\n }\n\n // $switch — emit each case as a virtual child\n if (doc.$switch && doc.cases && typeof doc.cases === \"object\") {\n for (const [caseName, caseDef] of Object.entries(doc.cases)) {\n const casePath = [...path, \"cases\", caseName];\n if (caseDef && typeof caseDef === \"object\" && (caseDef as JxMutableNode).$ref) {\n rows.push({\n depth: depth + 1,\n node: caseDef as JxMutableNode,\n nodeType: \"case-ref\",\n path: casePath,\n });\n } else if (caseDef && typeof caseDef === \"object\") {\n rows.push({\n depth: depth + 1,\n node: caseDef as JxMutableNode,\n nodeType: \"case\",\n path: casePath,\n });\n // Recurse into case children (skip the case node itself — already emitted)\n const caseChildren = flattenTree(caseDef as JxMutableNode, casePath, depth + 2);\n rows.push(...caseChildren.slice(1));\n }\n }\n }\n\n return rows;\n}\n\n/**\n * Get a display label for a node (for layers + overlays).\n *\n * @param {JxMutableNode | null} node\n * @returns {string}\n */\nexport function nodeLabel(node: JxMutableNode | null) {\n if (!node) {\n return \"?\";\n }\n // $map container (Repeater)\n if (node.$prototype === \"Array\") {\n const { items } = node;\n const ref = (isRef(items) ? items.$ref : undefined) || \"items\";\n return `Repeater → ${ref}`;\n }\n if (node.$title) {\n return node.$title;\n }\n if (node.$id) {\n return node.$id;\n }\n if (node.tagName === \"slot\") {\n const name = node.attributes?.name;\n return typeof name === \"string\" && name.trim() ? `slot: ${name.trim()}` : \"slot\";\n }\n const tag = node.tagName ?? \"div\";\n const suffix = node.$switch ? \" ⇆\" : \"\";\n if (typeof node.textContent === \"string\" && node.textContent.length > 0) {\n return `${tag} — ${node.textContent.slice(0, 24)}${suffix}`;\n }\n return tag + suffix;\n}\n\n// ─── State factory ────────────────────────────────────────────────────────────\n\n/**\n * @param {JxMutableNode} doc\n * @returns {StudioState}\n */\nexport function createState(doc: JxMutableNode): StudioState {\n const initial = { document: doc, selection: null };\n return {\n canvas: {\n error: null, // Error message on failure\n scope: null, // $defs scope from runtime buildScope\n status: \"idle\", // \"idle\" | \"loading\" | \"ready\" | \"error\"\n },\n content: { frontmatter: {} }, // Frontmatter metadata for .md files\n dirty: false,\n document: doc,\n documentPath: null, // Root-relative path, e.g. \"examples/markdown/blog.json\"\n documentStack: [], // Frames for component navigation\n fileHandle: null,\n handlersSource: null,\n history: [initial],\n historyIndex: 0,\n hover: null,\n mode: \"component\", // 'component' | 'content'\n selection: null,\n ui: {\n activeMedia: null, // '--md' | null (base) — focused canvas/breakpoint\n activeSelector: null, // ':hover' | '.child' | null (base) — nested selector context\n editingFunction: null, // Null | { type: 'def', defName } | { type: 'event', path, eventKey }\n featureToggles: {}, // { '--dark': true } — non-size media toggles\n gitBranches: null, // { current, branches: [] }\n gitCommitMessage: \"\", // Commit message input\n gitDiffState: null,\n gitError: null, // Error message string\n gitLoading: false, // Loading indicator during async ops\n gitStatus: null, // { branch, ahead, behind, files: [] }\n inspectorSections: {}, // { identity: true, ... } — properties panel section open/closed state\n pendingInlineEdit: null, // Null | { path, mediaName } — deferred inline edit awaiting canvas readiness\n rightTab: \"properties\", // 'properties' | 'events' | 'style'\n settingsTab: \"stylebook\", // \"stylebook\" | \"definitions\" | \"contentTypes\"\n styleFilter: \"\", // Free-text filter for CSS property names\n styleFilterActive: false, // True = show only props with values set\n styleSections: {}, // { layout: true, ... } — section open/closed state\n styleShorthands: {}, // { padding: true, ... } — shorthand expand/collapse state\n stylebookCustomizedOnly: false, // Show only customized elements\n stylebookFilter: \"\", // Search filter text\n stylebookSelection: null, // Tag name string, e.g. \"h1\"\n stylebookTab: \"elements\", // \"elements\" | \"variables\"\n zoom: 1,\n },\n };\n}\n\n// ─── Doc/Session slice helpers ───────────────────────────────────────────────\n\n/**\n * Compose a flat StudioState from separate doc and session slices.\n *\n * @param {Partial<StudioState>} doc\n * @param {Partial<StudioState>} session\n * @returns {StudioState}\n */\nexport function toFlat(doc: Partial<StudioState>, session: Partial<StudioState>) {\n return { ...doc, ...session } as StudioState;\n}\n\n/**\n * Decompose a flat StudioState into doc and session slices.\n *\n * @param {StudioState} S\n * @returns {{ doc: Partial<StudioState>; session: Partial<StudioState> }}\n */\nexport function fromFlat(S: StudioState) {\n const {\n document,\n dirty,\n fileHandle,\n documentPath,\n documentStack,\n handlersSource,\n mode,\n content,\n history,\n historyIndex,\n selection,\n hover,\n ui,\n canvas,\n } = S;\n return {\n doc: {\n content,\n dirty,\n document,\n documentPath,\n documentStack,\n fileHandle,\n handlersSource,\n history,\n historyIndex,\n mode,\n },\n session: { canvas, hover, selection, ui },\n };\n}\n\n// ─── Project state (persists across document switches) ────────────────────────\n//\n// Shape: { root, name, projectRoot, isSiteProject, projectConfig,\n// Dirs: Map<string, DirEntry[]>, expanded: Set<string>,\n// SelectedPath: string|null, searchQuery: string }\n// DirEntry: { name, path, type: \"file\"|\"directory\", size, modified }\n\nexport let projectState: ProjectState | null = null;\n\n/** @param {ProjectState | null} ps */\nexport function setProjectState(ps: ProjectState | null) {\n projectState = ps;\n}\n\n/**\n * Return the current project state, asserting it is non-null. Only call when a project is known to\n * be loaded.\n *\n * @returns {ProjectState}\n */\nexport function requireProjectState() {\n return projectState as ProjectState;\n}\n\n// ─── Frontmatter mutation ───────────────────────────────────────────────────\n\n/**\n * Update a frontmatter field. Does not use applyMutation because frontmatter lives in S.content,\n * not S.document.\n *\n * @param {StudioState} state\n * @param {string} field\n * @param {unknown} value\n * @returns {StudioState}\n */\nexport function updateFrontmatter(state: StudioState, field: string, value: unknown) {\n const fm = { ...state.content?.frontmatter };\n if (value === undefined || value === null || value === \"\") {\n delete fm[field];\n } else {\n fm[field] = value;\n }\n return {\n ...state,\n content: { ...state.content, frontmatter: fm },\n dirty: true,\n };\n}\n\n// ─── Selection / hover ────────────────────────────────────────────────────────\n\n/**\n * @param {StudioState} state\n * @param {JxPath | null} path\n * @returns {StudioState}\n */\nexport function selectNode(state: StudioState, path: JxPath | null) {\n return { ...state, selection: path };\n}\n\n/**\n * @param {StudioState} state\n * @param {JxPath | null} path\n * @returns {StudioState}\n */\nexport function hoverNode(state: StudioState, path: JxPath | null) {\n return { ...state, hover: path };\n}\n\n// ─── Document stack (component navigation) ──────────────────────────────────\n\n/**\n * Push current document onto the stack and switch to editing a new document.\n *\n * @param {StudioState} state\n * @param {JxMutableNode} doc\n * @param {string | null} documentPath\n * @returns {StudioState}\n */\nexport function pushDocument(state: StudioState, doc: JxMutableNode, documentPath: string | null) {\n const frame = {\n dirty: state.dirty,\n document: state.document,\n documentPath: state.documentPath,\n fileHandle: state.fileHandle,\n history: state.history,\n historyIndex: state.historyIndex,\n mode: state.mode,\n selection: state.selection,\n };\n const newState = createState(doc);\n newState.documentStack = [...(state.documentStack || []), frame];\n newState.documentPath = documentPath;\n newState.ui = { ...state.ui, activeMedia: null, activeSelector: null };\n return newState;\n}\n\n/**\n * Pop the document stack and return to the previous document.\n *\n * @param {StudioState} state\n * @returns {StudioState}\n */\nexport function popDocument(state: StudioState) {\n if (!state.documentStack || state.documentStack.length === 0) {\n return state;\n }\n const stack = [...state.documentStack];\n const frame = stack.pop();\n return {\n ...state,\n ...frame,\n documentStack: stack,\n ui: { ...state.ui },\n };\n}\n",
15
16
  "/// <reference lib=\"dom\" />\n/**\n * In-iframe insertion-zone math (cross-origin \"+\" affordance). Runs INSIDE the canvas iframe, in\n * the iframe's own realm/coords, and is the structural cousin of {@link file://./iframe-drop.ts}:\n * where iframe-drop resolves a DRAG's placement, this resolves where a fresh element could be\n * INSERTED at the gaps around the hovered node, so the parent can float a clickable \"+\" there.\n *\n * It SALVAGES the pure edge/index math from the orphaned parent-realm\n * {@link file://../editor/insertion-helper.ts} (empty-container detection, row-vs-column layout via\n * getComputedStyle(parent), {@link EDGE_THRESHOLD}, leading/trailing edge → insert index) but\n * re-expresses it against IFRAME-realm rects ({@link rectOf}, stubbable) and the iframe's shadow\n * doc, and reproduces the parent's `parentElementPath`/`childIndex` resolution so the posted\n * `insertParentPath` + `index` feed the unchanged `mutateInsertNode(t, parentPath, index, def)`.\n *\n * PURE: it reads element rects through {@link rectOf} and `data-jx-path`, so it is unit-proven\n * against fake rects. The DOM adapter that resolves the hovered element from a point is CDP-only\n * (happy-dom's `elementFromPoint` returns null) and lives in iframe-interaction.\n */\n\nimport { parseJxPath } from \"./path-mapping\";\nimport { rectOf } from \"../utils/geometry\";\nimport { childIndex, parentElementPath } from \"../state\";\nimport type { InsertZone, SerializableRect } from \"./iframe-protocol\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\nimport type { JxPath } from \"../state\";\n\n/** Edge detection threshold in pixels (SALVAGED from insertion-helper.ts). */\nexport const EDGE_THRESHOLD = 14;\n\n/** The CSS class the renderer stamps on an empty container's placeholder (SALVAGED). */\nconst EMPTY_CONTAINER_CLASS = \"empty-container-placeholder\";\n\n/** Read an element's iframe-viewport rect as a {@link SerializableRect}. */\nfunction rectFor(el: Element): SerializableRect {\n const r = rectOf(el);\n return { height: r.height, width: r.width, x: r.x, y: r.y };\n}\n\n/**\n * Whether the hovered element's parent lays its children out in a ROW (so leading/trailing edges\n * are LEFT/RIGHT rather than TOP/BOTTOM). Ports the legacy direction test: flex `row*` or grid\n * `grid-auto-flow: column*`. Pure-ish — reads getComputedStyle, which the unit test stubs.\n */\nfunction isRowLayout(parent: HTMLElement): boolean {\n const style = getComputedStyle(parent);\n const { display } = style;\n const isFlex = display === \"flex\" || display === \"inline-flex\";\n const isGrid = display === \"grid\" || display === \"inline-grid\";\n return (\n (isFlex && style.flexDirection.startsWith(\"row\")) ||\n (isGrid && (style.gridAutoFlow ?? \"\").startsWith(\"column\"))\n );\n}\n\n/**\n * Compute the candidate insertion \"+\" zone(s) for a cursor over `targetEl`, PURE against\n * iframe-realm rects.\n *\n * `cursor` is in iframe-viewport coords (same space as {@link rectOf}); `shadowDoc` is the iframe's\n * non-reactive shadow doc (carried for parity with iframe-drop — the structural decision here needs\n * only the stamped path, but keeping the signature aligned lets the entry thread the same\n * accessor).\n *\n * Branching (SALVAGED from insertion-helper.ts onMouseMove):\n *\n * - Empty container (`empty-container-placeholder` class) → ONE centered zone that inserts as the\n * container's first child (`insertParentPath = targetPath`, `index = 0`).\n * - Otherwise resolve the parent's layout (row/grid-column vs column); when the cursor is within\n * {@link EDGE_THRESHOLD} of the leading edge → a sibling-before zone (`index = childIndex`); of\n * the trailing edge → a sibling-after zone (`index = childIndex + 1`); mid-element → null.\n *\n * Returns null for the root/degenerate cases (no addressable parent to insert a sibling into) and\n * when the cursor is not near an edge.\n */\nexport function computeInsertZones(\n targetEl: HTMLElement,\n cursor: { x: number; y: number },\n shadowDoc: JxMutableNode,\n): InsertZone[] | null {\n void shadowDoc;\n const serialized = targetEl.dataset?.jxPath;\n if (serialized == null) {\n return null;\n }\n const targetPath = parseJxPath(serialized) as JxPath;\n\n // Empty container: one centered \"+\" that inserts as the container's first child.\n if (targetEl.classList.contains(EMPTY_CONTAINER_CLASS)) {\n return [{ edge: \"center\", index: 0, insertParentPath: targetPath, rect: rectFor(targetEl) }];\n }\n\n // A sibling insert needs an addressable parent element path; the root (path.length < 2) has none.\n const parentPath = parentElementPath(targetPath);\n if (!parentPath) {\n return null;\n }\n const parent = targetEl.parentElement;\n if (!parent) {\n return null;\n }\n const childIdx = childIndex(targetPath);\n if (typeof childIdx !== \"number\") {\n return null;\n }\n\n const rect = rectFor(targetEl);\n if (isRowLayout(parent)) {\n const relX = cursor.x - rect.x;\n if (relX < EDGE_THRESHOLD) {\n return [edgeZone(\"left\", parentPath, childIdx, leadingEdgeRect(rect, true))];\n }\n if (rect.width - relX < EDGE_THRESHOLD) {\n return [edgeZone(\"right\", parentPath, childIdx + 1, trailingEdgeRect(rect, true))];\n }\n return null;\n }\n\n const relY = cursor.y - rect.y;\n if (relY < EDGE_THRESHOLD) {\n return [edgeZone(\"top\", parentPath, childIdx, leadingEdgeRect(rect, false))];\n }\n if (rect.height - relY < EDGE_THRESHOLD) {\n return [edgeZone(\"bottom\", parentPath, childIdx + 1, trailingEdgeRect(rect, false))];\n }\n return null;\n}\n\n/** Build a sibling-edge zone. */\nfunction edgeZone(\n edge: InsertZone[\"edge\"],\n insertParentPath: JxPath,\n index: number,\n rect: SerializableRect,\n): InsertZone {\n return { edge, index, insertParentPath, rect };\n}\n\n/**\n * A zero-thickness anchor rect at the target's LEADING edge — top edge (column) or left edge (row).\n * The parent centers the \"+\" on this box, so it collapses the relevant dimension to the edge.\n */\nfunction leadingEdgeRect(rect: SerializableRect, row: boolean): SerializableRect {\n return row\n ? { height: rect.height, width: 0, x: rect.x, y: rect.y }\n : { height: 0, width: rect.width, x: rect.x, y: rect.y };\n}\n\n/** A zero-thickness anchor rect at the target's TRAILING edge — bottom edge or right edge. */\nfunction trailingEdgeRect(rect: SerializableRect, row: boolean): SerializableRect {\n return row\n ? { height: rect.height, width: 0, x: rect.x + rect.width, y: rect.y }\n : { height: 0, width: rect.width, x: rect.x, y: rect.y + rect.height };\n}\n\n/**\n * A stable key for a zone set, so the iframe only re-posts when the affordance actually changes\n * (mirrors the hover de-dupe in startInteraction). Null/empty collapse to a single sentinel.\n */\nexport function insertZonesKey(zones: InsertZone[] | null): string {\n if (!zones || zones.length === 0) {\n return \"none\";\n }\n return zones.map((z) => `${z.edge}:${z.insertParentPath.join(\"/\")}:${z.index}`).join(\"|\");\n}\n",
16
17
  "/// <reference lib=\"dom\" />\n/**\n * Inline-format.js — Inline formatting engine for contenteditable editing\n *\n * Handles toggling inline formatting (bold, italic, code, etc.) with proper wrap/unwrap logic, DOM\n * normalization, and whitespace management.\n */\n\n/** Tags considered inline formatting wrappers */\nconst FORMAT_TAGS = new Set([\n \"strong\",\n \"em\",\n \"b\",\n \"i\",\n \"u\",\n \"del\",\n \"s\",\n \"strike\",\n \"code\",\n \"sub\",\n \"sup\",\n \"span\",\n]);\n\n/**\n * Check whether `tag` is currently active on both ends of the selection. Walks from anchor and\n * focus nodes up to editableRoot looking for the tag. Returns false if selection is outside\n * editableRoot or in plaintext-only mode.\n *\n * @param {string} tag\n * @param {HTMLElement | null} editableRoot\n * @returns {boolean}\n */\nexport function isTagActiveInSelection(tag: string, editableRoot: HTMLElement | null) {\n if (!editableRoot) {\n return false;\n }\n if (editableRoot.contentEditable === \"plaintext-only\") {\n return false;\n }\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return false;\n }\n\n const anchor = sel.anchorNode;\n const focus = sel.focusNode;\n if (!anchor || !focus) {\n return false;\n }\n if (!editableRoot.contains(anchor) || !editableRoot.contains(focus)) {\n return false;\n }\n\n /**\n * @param {Node | null} node\n * @returns {boolean}\n */\n const hasTag = (node: Node | null) => {\n let current = node;\n while (current && current !== editableRoot) {\n if (\n current.nodeType === Node.ELEMENT_NODE &&\n (current as Element).tagName.toLowerCase() === tag\n ) {\n return true;\n }\n current = current.parentNode;\n }\n return false;\n };\n\n return hasTag(anchor) && hasTag(focus);\n}\n\n/**\n * Toggle an inline format tag on/off for the current selection. If the tag is active → unwrap. If\n * not → wrap.\n *\n * @param {string} tag\n * @param {HTMLElement | null} editableRoot\n */\nexport function toggleInlineFormat(tag: string, editableRoot: HTMLElement | null) {\n if (!editableRoot) {\n return;\n }\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return;\n }\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n return;\n }\n if (!editableRoot.contains(range.commonAncestorContainer)) {\n return;\n }\n\n // Expand selection to fully include any partially-selected ${...} expressions\n expandRangeToTemplateExpressions(range);\n\n // Find all elements matching `tag` that intersect the selection\n const matches = findIntersectingElements(tag, range, editableRoot);\n\n if (matches.length > 0) {\n unwrapTagInRange(tag, range, editableRoot, matches);\n } else {\n wrapRangeInTag(tag, range, editableRoot);\n }\n\n normalizeInlineContent(editableRoot);\n}\n\n/**\n * Find all elements with the given tag that intersect the selection range.\n *\n * @param {string} tag\n * @param {Range} range\n * @param {HTMLElement} root\n * @returns {Element[]}\n */\nfunction findIntersectingElements(tag: string, range: Range, root: HTMLElement) {\n const matches: Element[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n /**\n * @param {Node} node\n * @returns {number}\n */\n acceptNode(node: Node) {\n if ((node as Element).tagName.toLowerCase() === tag && range.intersectsNode(node)) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n },\n });\n while (walker.nextNode()) {\n matches.push(walker.currentNode as Element);\n }\n return matches;\n}\n\n/**\n * Unwrap all instances of `tag` within the range. Processes in reverse document order to preserve\n * earlier offsets.\n *\n * @param {string} tag\n * @param {Range} range\n * @param {HTMLElement} editableRoot\n * @param {Element[]} matches\n */\nfunction unwrapTagInRange(\n _tag: string,\n _range: Range,\n _editableRoot: HTMLElement,\n matches: Element[],\n) {\n // Process in reverse so DOM mutations don't shift later nodes\n for (let i = matches.length - 1; i >= 0; i--) {\n const el = matches[i]!;\n unwrapElement(el);\n }\n}\n\n/**\n * Replace an element with its children (unwrap).\n *\n * @param {Element} el\n */\nfunction unwrapElement(el: Element) {\n const parent = el.parentNode;\n if (!parent) {\n return;\n }\n const frag = document.createDocumentFragment();\n while (el.firstChild) {\n frag.append(el.firstChild);\n }\n el.replaceWith(frag);\n}\n\n/**\n * Wrap the current selection range in a new element of the given tag. Handles whitespace:\n * leading/trailing whitespace stays outside the wrapper.\n *\n * @param {string} tag\n * @param {Range} range\n * @param {HTMLElement} _editableRoot\n */\nfunction wrapRangeInTag(tag: string, range: Range, _editableRoot: HTMLElement) {\n const contents = range.extractContents();\n\n // Trim leading whitespace from the fragment\n const leadingWS = trimLeadingWhitespace(contents);\n // Trim trailing whitespace from the fragment\n const trailingWS = trimTrailingWhitespace(contents);\n\n // If nothing left after trimming, re-insert everything and bail\n if (!contents.hasChildNodes()) {\n if (leadingWS) {\n range.insertNode(document.createTextNode(leadingWS));\n }\n if (trailingWS) {\n const t = document.createTextNode(trailingWS);\n range.collapse(false);\n range.insertNode(t);\n }\n return;\n }\n\n const wrapper = document.createElement(tag);\n wrapper.append(contents);\n\n // Build the insertion fragment: [leadingWS] [wrapper] [trailingWS]\n const frag = document.createDocumentFragment();\n if (leadingWS) {\n frag.append(document.createTextNode(leadingWS));\n }\n frag.append(wrapper);\n if (trailingWS) {\n frag.append(document.createTextNode(trailingWS));\n }\n\n range.insertNode(frag);\n\n // Restore selection around the wrapper's contents\n const sel = window.getSelection();\n if (sel) {\n sel.removeAllRanges();\n const newRange = document.createRange();\n newRange.selectNodeContents(wrapper);\n sel.addRange(newRange);\n }\n}\n\n/**\n * Remove and return leading whitespace from a document fragment. Only trims if the first node is a\n * text node starting with whitespace.\n *\n * @param {DocumentFragment} frag\n * @returns {string | null}\n */\nfunction trimLeadingWhitespace(frag: DocumentFragment) {\n const first = frag.firstChild;\n if (!first || first.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n const text = first.textContent ?? \"\";\n const match = text.match(/^(\\s+)/);\n if (!match) {\n return null;\n }\n const ws = match[1]!;\n if (text.length === ws.length) {\n // Entire node is whitespace — remove it\n first.remove();\n } else {\n first.textContent = text.slice(ws.length);\n }\n return ws;\n}\n\n/**\n * Remove and return trailing whitespace from a document fragment. Only trims if the last node is a\n * text node ending with whitespace.\n *\n * @param {DocumentFragment} frag\n * @returns {string | null}\n */\nfunction trimTrailingWhitespace(frag: DocumentFragment) {\n const last = frag.lastChild;\n if (!last || last.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n const text = last.textContent ?? \"\";\n const match = text.match(/(\\s+)$/);\n if (!match) {\n return null;\n }\n const ws = match[1]!;\n if (text.length === ws.length) {\n last.remove();\n } else {\n last.textContent = text.slice(0, -ws.length);\n }\n return ws;\n}\n\n// ─── Normalization ─────────────────────────────────────────────────────────────\n\n/**\n * Normalize the inline content of an editable root. Merges adjacent same-tag siblings, collapses\n * redundant nesting, removes empty inline elements, and lifts edge whitespace. Runs to\n * fixed-point.\n *\n * @param {HTMLElement | null} root\n */\nexport function normalizeInlineContent(root: HTMLElement | null) {\n if (!root) {\n return;\n }\n let changed = true;\n let iterations = 0;\n while (changed && iterations < 10) {\n changed = false;\n iterations += 1;\n\n // 1. Merge adjacent text nodes\n root.normalize();\n\n // 2. Merge adjacent same-tag siblings\n if (mergeAdjacentSiblings(root)) {\n changed = true;\n }\n\n // 3. Collapse redundant nesting (strong > strong → strong)\n if (collapseRedundantNesting(root)) {\n changed = true;\n }\n\n // 4. Remove empty inline elements\n if (removeEmptyInlines(root)) {\n changed = true;\n }\n\n // 5. Lift edge whitespace out of inline wrappers\n if (liftEdgeWhitespace(root)) {\n changed = true;\n }\n\n // 6. Unwrap bare <span> elements (no class, style, or attributes)\n if (unwrapBareSpans(root)) {\n changed = true;\n }\n }\n}\n\n/**\n * Merge adjacent sibling elements with the same tag name. E.g.,\n * <strong>a</strong><strong>b</strong> → <strong>ab</strong>\n *\n * @param {HTMLElement} root\n * @returns {boolean}\n */\nfunction mergeAdjacentSiblings(root: HTMLElement) {\n let changed = false;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const toMerge: [Element, Element][] = [];\n\n // Collect pairs first to avoid mutation during walk\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n const next = el.nextSibling;\n if (\n next &&\n next.nodeType === Node.ELEMENT_NODE &&\n (next as Element).tagName === el.tagName &&\n FORMAT_TAGS.has(el.tagName.toLowerCase()) &&\n attributesMatch(el, next as Element)\n ) {\n toMerge.push([el, next as Element]);\n }\n }\n\n // Process in reverse to preserve earlier offsets\n for (let i = toMerge.length - 1; i >= 0; i--) {\n const [el, next] = toMerge[i]!;\n // Move all children from next into el\n while (next.firstChild) {\n el.append(next.firstChild);\n }\n next.remove();\n changed = true;\n }\n return changed;\n}\n\n/**\n * Collapse redundant nesting where a parent and its only child share the same tag. E.g.,\n * <strong><strong>x</strong></strong> → <strong>x</strong>\n *\n * @param {HTMLElement} root\n * @returns {boolean}\n */\nfunction collapseRedundantNesting(root: HTMLElement) {\n let changed = false;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const toCollapse: Element[] = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n if (!FORMAT_TAGS.has(el.tagName.toLowerCase())) {\n continue;\n }\n // Check if only child is an element with the same tag\n if (\n el.childNodes.length === 1 &&\n el.firstChild !== null &&\n el.firstChild.nodeType === Node.ELEMENT_NODE &&\n (el.firstChild as Element).tagName === el.tagName\n ) {\n toCollapse.push(el);\n }\n }\n\n for (const el of toCollapse) {\n const inner = el.firstChild as Element;\n // Replace outer with inner's children\n while (inner.firstChild) {\n inner.before(inner.firstChild);\n }\n inner.remove();\n changed = true;\n }\n return changed;\n}\n\n/**\n * Remove empty inline elements.\n *\n * @param {HTMLElement} root\n * @returns {boolean}\n */\nfunction removeEmptyInlines(root: HTMLElement) {\n let changed = false;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const toRemove: Element[] = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n if (!FORMAT_TAGS.has(el.tagName.toLowerCase())) {\n continue;\n }\n if (el.childNodes.length === 0 && !el.textContent) {\n toRemove.push(el);\n }\n }\n\n for (const el of toRemove) {\n el.remove();\n changed = true;\n }\n return changed;\n}\n\n/**\n * Lift leading/trailing whitespace out of inline wrapper elements. E.g., <strong> text </strong> →\n * \" \"<strong>text</strong>\" \"\n *\n * @param {HTMLElement} root\n * @returns {boolean}\n */\nfunction liftEdgeWhitespace(root: HTMLElement) {\n let changed = false;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n /** @type {{ type: string; el: Element; ws: string }[]} */\n const ops = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n if (!FORMAT_TAGS.has(el.tagName.toLowerCase())) {\n continue;\n }\n if (el === root) {\n continue;\n }\n\n const first = el.firstChild;\n if (first && first.nodeType === Node.TEXT_NODE) {\n const text = first.textContent ?? \"\";\n const m = text.match(/^(\\s+)/);\n if (m && text.length > m[1]!.length) {\n ops.push({ el, type: \"lift-leading\", ws: m[1]! });\n }\n }\n\n const last = el.lastChild;\n if (last && last.nodeType === Node.TEXT_NODE && last !== first) {\n const text = last.textContent ?? \"\";\n const m = text.match(/(\\s+)$/);\n if (m && text.length > m[1]!.length) {\n ops.push({ el, type: \"lift-trailing\", ws: m[1]! });\n }\n }\n }\n\n for (const op of ops) {\n if (op.type === \"lift-leading\") {\n const firstChild = op.el.firstChild as Text;\n firstChild.textContent = (firstChild.textContent ?? \"\").slice(op.ws.length);\n op.el.parentNode?.insertBefore(document.createTextNode(op.ws), op.el);\n changed = true;\n } else if (op.type === \"lift-trailing\") {\n const lastChild = op.el.lastChild as Text;\n lastChild.textContent = (lastChild.textContent ?? \"\").slice(0, -op.ws.length);\n op.el.parentNode?.insertBefore(document.createTextNode(op.ws), op.el.nextSibling);\n changed = true;\n }\n }\n return changed;\n}\n\n/**\n * Unwrap bare <span> elements that have no class, style, or meaningful attributes. These are\n * semantically empty wrappers left over from formatting operations.\n *\n * @param {HTMLElement} root\n * @returns {boolean}\n */\nfunction unwrapBareSpans(root: HTMLElement) {\n let changed = false;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const toUnwrap: Element[] = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n if (el.tagName.toLowerCase() !== \"span\") {\n continue;\n }\n if (el === root) {\n continue;\n }\n // Keep spans with class, style, or any attributes\n if (el.attributes.length > 0) {\n continue;\n }\n toUnwrap.push(el);\n }\n\n for (const el of toUnwrap) {\n unwrapElement(el);\n changed = true;\n }\n return changed;\n}\n\n/**\n * Check if two elements have matching attributes (for merge eligibility). For simple formatting\n * tags, attributes don't matter. For <a>, href must match.\n *\n * @param {Element} a\n * @param {Element} b\n * @returns {boolean}\n */\nfunction attributesMatch(a: Element, b: Element) {\n const tag = a.tagName.toLowerCase();\n if (tag === \"a\") {\n return a.getAttribute(\"href\") === b.getAttribute(\"href\");\n }\n // For simple format tags, always match\n return true;\n}\n\n// ─── Template expression preservation ─────────────────────────────────────────\n\n/**\n * Expand a Range so that it fully includes any `${...}` template expressions that are partially\n * selected. Template expressions are atomic in Jx — if split across inline elements, the template\n * string breaks.\n *\n * Scans the text content of the start and end containers for `${...}` patterns and adjusts the\n * range boundaries outward to include the complete expression.\n *\n * @param {Range} range\n */\nexport function expandRangeToTemplateExpressions(range: Range) {\n expandBoundary(range, true); // Start\n expandBoundary(range, false); // End\n}\n\n/**\n * Expand one boundary (start or end) of a range to avoid splitting a ${...}. `isStart` = true\n * adjusts startContainer/startOffset, `isStart` = false adjusts endContainer/endOffset.\n *\n * @param {Range} range\n * @param {boolean} isStart\n */\nfunction expandBoundary(range: Range, isStart: boolean) {\n const node = isStart ? range.startContainer : range.endContainer;\n const offset = isStart ? range.startOffset : range.endOffset;\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n\n const text = node.textContent ?? \"\";\n\n // Find all ${...} expression spans in this text node (supporting nested braces)\n const exprs = findTemplateExpressions(text);\n for (const expr of exprs) {\n // Expr = { start, end } — character indices of \"$\" and the closing \"}\" + 1\n if (isStart) {\n // If the range starts inside this expression, move it to include the whole expr\n if (offset > expr.start && offset < expr.end) {\n range.setStart(node, expr.start);\n }\n } else if (offset > expr.start && offset < expr.end) {\n // If the range ends inside this expression, expand to include the whole expr\n range.setEnd(node, expr.end);\n }\n }\n}\n\n/**\n * Find all `${...}` expression spans in a string, handling nested braces. Returns array of { start,\n * end } where start is the index of '$' and end is one past the closing '}'.\n *\n * @param {string} text\n * @returns {{ start: number; end: number }[]}\n */\nexport function findTemplateExpressions(text: string) {\n /** @type {{ start: number; end: number }[]} */\n const results = [];\n let i = 0;\n while (i < text.length - 1) {\n if (text[i] === \"$\" && text[i + 1] === \"{\") {\n const start = i;\n let depth = 1;\n let j = i + 2;\n while (j < text.length && depth > 0) {\n if (text[j] === \"{\") {\n depth += 1;\n } else if (text[j] === \"}\") {\n depth -= 1;\n }\n j += 1;\n }\n if (depth === 0) {\n results.push({ end: j, start });\n i = j;\n continue;\n }\n }\n i += 1;\n }\n return results;\n}\n",
17
- "/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/**\n * Inline-edit.js — Contenteditable inline editing for content mode\n *\n * Manages the lifecycle of editing text-bearing block elements directly on the canvas. Handles rich\n * text formatting, Enter for new paragraphs, and slash commands for inserting elements.\n */\n\nimport elementsMeta from \"../../data/elements-meta.json\";\nimport { normalizeInlineContent, toggleInlineFormat } from \"./inline-format\";\nimport type { JxPath } from \"../state\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\n/**\n * The slash-menu surface inline editing drives. Injected (rather than imported) so this module\n * stays free of the menu's heavy `lit-html` / `ui/layers` dependencies — the editor realm wires the\n * real menu, the canvas iframe supplies its own (or a no-op) without bloating the slim iframe\n * bundle.\n */\nexport interface SlashController {\n show: (\n anchorEl: HTMLElement,\n filter: string,\n cbs: { onSelect: (cmd: SlashCommand) => void; showFilter?: boolean; commands?: SlashCommand[] },\n ) => void;\n dismiss: () => void;\n isOpen: () => boolean;\n}\n\nconst noopSlash: SlashController = {\n dismiss: () => {\n // No slash controller wired in this realm.\n },\n isOpen: () => false,\n show: () => {\n // No slash controller wired in this realm.\n },\n};\nlet slash: SlashController = noopSlash;\n\n/** Inject the slash-menu controller inline editing should drive (call once at realm init). */\nexport function setSlashController(controller: SlashController): void {\n slash = controller;\n}\n\nexport interface InlineAction {\n tag: string;\n label: string;\n icon?: string;\n command?: string;\n shortcut?: string;\n}\n\ninterface ElementDef {\n $inlineChildren?: string[];\n $inlineActions?: InlineAction[] | string;\n}\n\nexport interface SlashCommand {\n label: string;\n tag: string;\n description: string;\n}\n\nexport interface JxContentResult {\n textContent?: string | null;\n children?: (JxMutableNode | string)[];\n}\n\n// ─── Inline tag set (tags that represent rich text formatting) ─────────────\n\n/** Fallback set — used when parent context is unknown */\nconst INLINE_TAGS = new Set([\n \"em\",\n \"strong\",\n \"del\",\n \"code\",\n \"a\",\n \"span\",\n \"br\",\n \"img\",\n \"b\",\n \"i\",\n \"u\",\n \"sub\",\n \"sup\",\n \"s\",\n]);\n\n/** Tags that can be edited inline (text-bearing block elements) */\nconst EDITABLE_BLOCKS = new Set([\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"p\",\n \"li\",\n \"td\",\n \"th\",\n \"blockquote\",\n \"span\",\n \"a\",\n \"label\",\n]);\n\n// ─── Context-aware inline scoping ─────────────────────────────────────────\n\n/**\n * Check if a child tag is inline within the context of a given parent tag. Uses $inlineChildren\n * from elements-meta.json.\n *\n * @param {string} childTag\n * @param {string} parentTag\n * @returns {boolean}\n */\nexport function isInlineInContext(childTag: string, parentTag: string) {\n if (!parentTag) {\n return INLINE_TAGS.has(childTag);\n }\n const parentDef = (elementsMeta.$defs as Record<string, ElementDef>)[parentTag];\n if (!parentDef || !parentDef.$inlineChildren) {\n return false;\n }\n return parentDef.$inlineChildren.includes(childTag);\n}\n\n/**\n * Get the resolved $inlineActions for a given element tag. Follows string references (e.g., \"h1\" →\n * look up h1's actions).\n *\n * @param {string} tag\n * @returns {InlineAction[] | null}\n */\nexport function getInlineActions(tag: string) {\n const def = (elementsMeta.$defs as Record<string, ElementDef>)[tag];\n if (!def) {\n return null;\n }\n let actions = def.$inlineActions;\n if (typeof actions === \"string\") {\n const refDef = (elementsMeta.$defs as Record<string, ElementDef>)[actions];\n actions = refDef?.$inlineActions ?? undefined;\n }\n if (!Array.isArray(actions)) {\n return null;\n }\n return actions;\n}\n\n// ─── Editing state ─────────────────────────────────────────────────────────\n\nlet activeEl: HTMLElement | null = null; // Currently contenteditable element\nlet activePath: JxPath | null = null; // JSON path to the active element\n/**\n * @type {((\n * path: JxPath,\n * children: (JxMutableNode | string)[] | null,\n * textContent: string | null,\n * ) => void)\n * | null}\n */\nlet commitFn:\n | ((\n path: JxPath,\n children: (JxMutableNode | string)[] | null,\n textContent: string | null,\n ) => void)\n | null = null; // Function(path, newChildren, newTextContent) to commit changes\n/**\n * @type {((path: JxPath, beforeChildren: JxContentResult, afterChildren: JxContentResult) => void)\n * | null}\n */\nlet splitFn:\n | ((path: JxPath, beforeChildren: JxContentResult, afterChildren: JxContentResult) => void)\n | null = null; // Function(path, beforeChildren, afterChildren) to split paragraph\n/**\n * @type {((path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void)\n * | null}\n */\nlet insertFn:\n | ((path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void)\n | null = null; // Function(path, elementDef, commitData?) to insert after current block\nlet endFn: (() => void) | null = null; // Function() called when editing stops\n\n/**\n * When a parent toolbar (or its link popover) may take focus during a live session, the iframe sets\n * this so {@link handleBlur} does NOT schedule a `stopEditing()` (the BLOCKER focus-loss race fix —\n * a parent-toolbar click blurs the iframe editable, which must NOT tear the session down). Only an\n * explicit commit (Escape/Enter/click-away-in-iframe) ends the session while suspended.\n */\nlet _blurCloseSuspended = false;\n\n/** Suspend blur-driven `stopEditing` (call while the parent toolbar/popover may steal focus). */\nexport function suspendBlurClose() {\n _blurCloseSuspended = true;\n}\n\n/** Resume blur-driven `stopEditing` (call on real editEnd/teardown). */\nexport function resumeBlurClose() {\n _blurCloseSuspended = false;\n}\n\n/**\n * Check if an element is a text-bearing editable block.\n *\n * @param {HTMLElement} el\n * @returns {boolean}\n */\nexport function isEditableBlock(el: HTMLElement) {\n return EDITABLE_BLOCKS.has(el.tagName.toLowerCase());\n}\n\n/**\n * Check if a node is an inline child. When parentNode is provided, uses context-aware scoping from\n * metadata. Without parent, uses the fallback INLINE_TAGS set.\n *\n * @param {JxMutableNode} node\n * @param {JxMutableNode} [parentNode]\n * @returns {boolean}\n */\nexport function isInlineElement(node: JxMutableNode, parentNode?: JxMutableNode) {\n if (!node || typeof node !== \"object\") {\n return false;\n }\n const childTag = (node.tagName ?? \"div\").toLowerCase();\n if (parentNode) {\n const parentTag = (parentNode.tagName ?? \"div\").toLowerCase();\n return isInlineInContext(childTag, parentTag);\n }\n return INLINE_TAGS.has(childTag);\n}\n\n/**\n * Start inline editing on a canvas element.\n *\n * @param {HTMLElement} el - The canvas DOM element to edit\n * @param {JxPath} path - JSON path to the element\n * @param {{\n * onCommit: (\n * path: JxPath,\n * children: (JxMutableNode | string)[] | null,\n * textContent: string | null,\n * ) => void;\n * onSplit: (\n * path: JxPath,\n * beforeChildren: JxContentResult,\n * afterChildren: JxContentResult,\n * ) => void;\n * onInsert: (path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void;\n * onEnd: () => void;\n * }} callbacks\n */\nexport function startEditing(\n el: HTMLElement,\n path: JxPath,\n callbacks: {\n onCommit: (\n path: JxPath,\n children: (JxMutableNode | string)[] | null,\n textContent: string | null,\n ) => void;\n onSplit: (\n path: JxPath,\n beforeChildren: JxContentResult,\n afterChildren: JxContentResult,\n ) => void;\n onInsert: (path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void;\n onEnd: () => void;\n },\n) {\n if (activeEl) {\n // Re-enter (e.g. after a split/insert re-render): tear the old session down WITHOUT firing the\n // User-visible `onEnd` — a re-enter must not reset the parent toolbar via a stray `editEnd`.\n stopEditing(true);\n }\n\n activeEl = el;\n activePath = path;\n commitFn = callbacks.onCommit;\n splitFn = callbacks.onSplit;\n insertFn = callbacks.onInsert;\n endFn = callbacks.onEnd;\n\n // Enable editing\n el.contentEditable = \"true\";\n el.style.pointerEvents = \"auto\";\n el.style.outline = \"2px solid var(--accent, #4a9eff)\";\n el.style.outlineOffset = \"1px\";\n el.style.cursor = \"text\";\n el.focus();\n\n // Place cursor at end\n const sel = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n el.addEventListener(\"keydown\", handleKeydown);\n el.addEventListener(\"input\", handleInput);\n el.addEventListener(\"blur\", handleBlur);\n el.addEventListener(\"paste\", handlePaste);\n}\n\n/**\n * Stop editing and commit changes. Pass `silent` to skip the `onEnd` callback (used by the re-enter\n * path so a stop→start sequence doesn't post a user-visible `editEnd`).\n *\n * @param {boolean} [silent]\n */\nexport function stopEditing(silent = false) {\n if (!activeEl) {\n return;\n }\n\n commitChanges();\n slash.dismiss();\n\n activeEl.contentEditable = \"false\";\n activeEl.style.pointerEvents = \"\";\n activeEl.style.outline = \"\";\n activeEl.style.outlineOffset = \"\";\n activeEl.style.cursor = \"\";\n\n activeEl.removeEventListener(\"keydown\", handleKeydown);\n activeEl.removeEventListener(\"input\", handleInput);\n activeEl.removeEventListener(\"blur\", handleBlur);\n activeEl.removeEventListener(\"paste\", handlePaste);\n\n activeEl = null;\n activePath = null;\n commitFn = null;\n splitFn = null;\n insertFn = null;\n\n if (silent) {\n endFn = null;\n } else if (endFn) {\n const fn = endFn;\n endFn = null;\n fn();\n }\n}\n\n/**\n * Whether inline editing is currently active.\n *\n * @returns {boolean}\n */\nexport function isEditing() {\n return activeEl !== null;\n}\n\n/**\n * Get the currently editing element.\n *\n * @returns {HTMLElement | null}\n */\nexport function getActiveElement() {\n return activeEl;\n}\n\n/**\n * Get the document path of the currently editing element (null when no session is live).\n *\n * @returns {JxPath | null}\n */\nexport function getActivePath() {\n return activePath;\n}\n\n/**\n * Whether the DI'd slash menu reports itself open — session-lifecycle guards must not commit-and-\n * end on a pointerdown that is really a slash-menu interaction.\n *\n * @returns {boolean}\n */\nexport function isSlashActive() {\n return slash.isOpen();\n}\n\n// ─── Event handlers ────────────────────────────────────────────────────────\n\n/** @param {KeyboardEvent} e */\nfunction handleKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n stopEditing();\n return;\n }\n\n if (e.key === \"Enter\" && !e.shiftKey) {\n if (slash.isOpen()) {\n return;\n } // Shared slash menu captures Enter\n e.preventDefault();\n e.stopPropagation();\n handleEnterKey();\n return;\n }\n\n // Slash command trigger\n if (e.key === \"/\" && !e.ctrlKey && !e.metaKey) {\n // Check if at start of empty block or after a space/newline\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0);\n const textBefore = getTextBeforeCursor(range);\n if (textBefore === \"\" || textBefore.endsWith(\" \") || textBefore.endsWith(\"\\n\")) {\n // Let the / character be typed, then show menu on next input\n requestAnimationFrame(() => openSlashMenu());\n return;\n }\n }\n }\n\n // Rich text shortcuts\n if (e.ctrlKey || e.metaKey) {\n switch (e.key) {\n case \"b\": {\n e.preventDefault();\n toggleInlineFormat(\"strong\", activeEl);\n break;\n }\n case \"i\": {\n e.preventDefault();\n toggleInlineFormat(\"em\", activeEl);\n break;\n }\n case \"`\": {\n e.preventDefault();\n toggleInlineFormat(\"code\", activeEl);\n break;\n }\n default: {\n break;\n }\n }\n }\n\n // Dismiss slash menu on non-matching keys\n if (slash.isOpen() && ![\"ArrowUp\", \"ArrowDown\", \"Enter\", \"Backspace\", \"Delete\"].includes(e.key)) {\n // Let the input handler deal with filtering\n }\n}\n\nfunction handleInput() {\n // Check if slash menu should update or dismiss\n if (slash.isOpen()) {\n updateSlashMenu();\n }\n}\n\n/** @param {FocusEvent} _e */\nfunction handleBlur(_e: FocusEvent) {\n // Don't close if focus moved to slash menu\n if (slash.isOpen()) {\n return;\n }\n\n // The parent format toolbar/link popover may have taken focus across the bridge — blur must NOT\n // Tear the session down (Phase 4b-2 focus-loss BLOCKER). Only an explicit commit ends it.\n if (_blurCloseSuspended) {\n return;\n }\n\n // Delay to allow click events to fire\n setTimeout(() => {\n if (_blurCloseSuspended) {\n return;\n }\n if (activeEl && document.activeElement !== activeEl) {\n stopEditing();\n }\n }, 150);\n}\n\n/** @param {ClipboardEvent} e */\nfunction handlePaste(e: ClipboardEvent) {\n e.preventDefault();\n // Paste as plain text to avoid foreign HTML\n const text = e.clipboardData?.getData(\"text/plain\") ?? \"\";\n document.execCommand(\"insertText\", false, text);\n}\n\n// ─── Enter key: split paragraph ────────────────────────────────────────────\n\nfunction handleEnterKey() {\n if (!splitFn || !activeEl || !activePath) {\n return;\n }\n\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return;\n }\n\n const range = sel.getRangeAt(0);\n\n // Create two ranges: before cursor and after cursor\n const beforeRange = document.createRange();\n beforeRange.setStart(activeEl, 0);\n beforeRange.setEnd(range.startContainer, range.startOffset);\n\n const afterRange = document.createRange();\n afterRange.setStart(range.endContainer, range.endOffset);\n afterRange.setEnd(activeEl, activeEl.childNodes.length);\n\n // Extract content from both ranges\n const beforeFrag = beforeRange.cloneContents();\n const afterFrag = afterRange.cloneContents();\n\n const beforeChildren = fragmentToJx(beforeFrag);\n const afterChildren = fragmentToJx(afterFrag);\n\n // Stop editing before mutating state (which will re-render)\n const path = [...activePath];\n const split = splitFn;\n\n activeEl.contentEditable = \"false\";\n activeEl.removeEventListener(\"keydown\", handleKeydown);\n activeEl.removeEventListener(\"input\", handleInput);\n activeEl.removeEventListener(\"blur\", handleBlur);\n activeEl.removeEventListener(\"paste\", handlePaste);\n activeEl = null;\n activePath = null;\n commitFn = null;\n splitFn = null;\n insertFn = null;\n\n if (endFn) {\n const fn = endFn;\n endFn = null;\n fn();\n }\n\n split(path, beforeChildren, afterChildren);\n}\n\n// ─── Content sync: DOM → Jx ────────────────────────────────────────────\n\nfunction commitChanges() {\n if (!commitFn || !activeEl || !activePath) {\n return;\n }\n\n normalizeInlineContent(activeEl);\n const result = elementToJx(activeEl);\n commitFn(activePath, result.children ?? null, result.textContent ?? null);\n}\n\n/**\n * Normalize a node's children array: merge adjacent text nodes and fold all-text children into\n * textContent. Returns `{ textContent }` or `{ children }`.\n *\n * @param {{ children?: (JxMutableNode | string)[] }} node\n * @returns {JxContentResult}\n */\nexport function normalizeChildren(node: { children?: (JxMutableNode | string)[] }) {\n if (!Array.isArray(node.children) || node.children.length === 0) {\n return { textContent: \"\" };\n }\n\n // Step 1: Merge adjacent text nodes\n const merged = [];\n for (const child of node.children) {\n if (typeof child === \"string\" && merged.length > 0 && typeof merged.at(-1) === \"string\") {\n merged[merged.length - 1] += child;\n } else {\n merged.push(child);\n }\n }\n\n // Step 2: If all children are text, fold into textContent\n if (merged.every((c: JxMutableNode | string) => typeof c === \"string\")) {\n return { textContent: merged.join(\"\") };\n }\n\n return { children: merged };\n}\n\n/**\n * Convert a contenteditable element's content to Jx children/textContent. Returns { textContent }\n * for plain text or { children } for rich content.\n *\n * @param {HTMLElement} el\n * @returns {JxContentResult}\n */\nfunction elementToJx(el: HTMLElement): JxContentResult {\n const nodes = el.childNodes;\n\n // If just a single text node, use textContent\n if (nodes.length === 0) {\n return { textContent: \"\" };\n }\n if (nodes.length === 1 && nodes[0]!.nodeType === Node.TEXT_NODE) {\n return { textContent: nodes[0]!.textContent };\n }\n\n // Mixed content → children array\n const children: (JxMutableNode | string)[] = [];\n for (const child of nodes) {\n const jsx = domNodeToJx(child);\n if (jsx !== null && jsx !== undefined) {\n children.push(jsx);\n }\n }\n\n // Normalize: merge adjacent text nodes + fold all-text to textContent\n return normalizeChildren({ children });\n}\n\n/**\n * Convert a DOM node to a Jx element definition.\n *\n * @param {Node} node\n * @returns {JxMutableNode | string | null}\n */\nfunction domNodeToJx(node: Node) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent;\n if (!text) {\n return null;\n }\n return text; // Bare string — text node child\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const el = node as HTMLElement;\n const tag = el.tagName.toLowerCase();\n const result: JxMutableNode = { tagName: tag };\n\n // Map browser execCommand output to our tag conventions\n const tagMap: Record<string, string> = {\n b: \"strong\",\n i: \"em\",\n s: \"del\",\n strike: \"del\",\n };\n if (tagMap[tag]) {\n result.tagName = tagMap[tag];\n }\n\n // Attributes\n if (tag === \"a\" && (el as HTMLAnchorElement).href) {\n result.attributes = { href: el.getAttribute(\"href\") ?? \"\" };\n if ((el as HTMLAnchorElement).title) {\n result.attributes.title = (el as HTMLAnchorElement).title;\n }\n }\n if (tag === \"code\") {\n result.textContent = el.textContent;\n return result;\n }\n\n // Recurse children\n const { childNodes } = el;\n if (childNodes.length === 0) {\n result.textContent = \"\";\n } else if (childNodes.length === 1 && childNodes[0]!.nodeType === Node.TEXT_NODE) {\n result.textContent = childNodes[0]!.textContent;\n } else {\n result.children = [];\n for (const child of childNodes) {\n const jsx = domNodeToJx(child);\n if (jsx) {\n result.children.push(/** @type {JxMutableNode} */ jsx);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Convert a DocumentFragment to a Jx-compatible structure. Returns { textContent } or { children }.\n *\n * @param {DocumentFragment} frag\n * @returns {JxContentResult}\n */\nfunction fragmentToJx(frag: DocumentFragment) {\n const nodes = frag.childNodes;\n if (nodes.length === 0) {\n return { textContent: \"\" };\n }\n if (nodes.length === 1 && nodes[0]!.nodeType === Node.TEXT_NODE) {\n return { textContent: nodes[0]!.textContent };\n }\n\n const children: (JxMutableNode | string)[] = [];\n for (const child of nodes) {\n const jsx = domNodeToJx(child);\n if (jsx) {\n children.push(jsx);\n }\n }\n\n if (\n children.length === 1 &&\n typeof children[0] !== \"string\" &&\n children[0]!.tagName === \"span\" &&\n typeof children[0]!.textContent === \"string\"\n ) {\n return { textContent: children[0]!.textContent };\n }\n\n return children.length > 0 ? { children } : { textContent: \"\" };\n}\n\n// ─── Rich text helpers ─────────────────────────────────────────────────────\n\n/**\n * @param {Range} range\n * @returns {string}\n */\nfunction getTextBeforeCursor(range: Range) {\n const preRange = document.createRange();\n preRange.setStart(activeEl!, 0);\n preRange.setEnd(range.startContainer, range.startOffset);\n return preRange.toString();\n}\n\n// ─── Slash command menu (delegates to shared slash-menu.js) ──────────────\n\n/** Track the character offset where \"/\" was typed so we can detect backspace-past-slash */\nlet _slashFilterStart = 0;\n\nfunction openSlashMenu() {\n if (!activeEl || !insertFn || !activePath) {\n return;\n }\n\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return;\n }\n const range = sel.getRangeAt(0);\n _slashFilterStart = getTextBeforeCursor(range).length;\n\n slash.show(activeEl, \"\", { onSelect: handleSlashSelect });\n}\n\nfunction updateSlashMenu() {\n if (!activeEl) {\n return;\n }\n\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n slash.dismiss();\n return;\n }\n\n const range = sel.getRangeAt(0);\n const fullText = getTextBeforeCursor(range);\n const slashIdx = fullText.lastIndexOf(\"/\");\n\n if (slashIdx === -1 || fullText.length < _slashFilterStart - 1) {\n slash.dismiss();\n return;\n }\n\n const filter = fullText.slice(slashIdx + 1).toLowerCase();\n slash.show(activeEl, filter, { onSelect: handleSlashSelect });\n}\n\n/** @param {SlashCommand} cmd */\nfunction handleSlashSelect(cmd: SlashCommand) {\n if (!activeEl || !insertFn || !activePath) {\n return;\n }\n\n // Remove the /command text from the element\n const sel = window.getSelection();\n if (sel && sel.rangeCount) {\n const range = sel.getRangeAt(0);\n const fullText = getTextBeforeCursor(range);\n const slashIdx = fullText.lastIndexOf(\"/\");\n if (slashIdx !== -1) {\n const walker = document.createTreeWalker(activeEl, NodeFilter.SHOW_TEXT);\n let charCount = 0;\n let slashNode: Text | null = null;\n let slashOffset = 0;\n while (walker.nextNode()) {\n const node = walker.currentNode as Text;\n if (charCount + node.length > slashIdx) {\n slashNode = node;\n slashOffset = slashIdx - charCount;\n break;\n }\n charCount += node.length;\n }\n if (slashNode) {\n const delRange = document.createRange();\n delRange.setStart(slashNode, slashOffset);\n delRange.setEnd(range.startContainer, range.startOffset);\n delRange.deleteContents();\n }\n }\n }\n\n // Compute commit data inline instead of calling commitChanges() — avoids a separate\n // Update() call that would race with the insertFn update() (two concurrent async renders).\n normalizeInlineContent(activeEl);\n const commitResult = elementToJx(activeEl);\n\n const path = [...activePath];\n const insert = insertFn;\n\n activeEl.contentEditable = \"false\";\n activeEl.removeEventListener(\"keydown\", handleKeydown);\n activeEl.removeEventListener(\"input\", handleInput);\n activeEl.removeEventListener(\"blur\", handleBlur);\n activeEl.removeEventListener(\"paste\", handlePaste);\n activeEl = null;\n activePath = null;\n commitFn = null;\n splitFn = null;\n insertFn = null;\n\n if (endFn) {\n const fn = endFn;\n endFn = null;\n fn();\n }\n\n // Pass commit data so onInsert can batch commit + insert into a single update()\n insert(path, cmd, commitResult);\n}\n",
18
+ "/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/**\n * Inline-edit.js — Contenteditable inline editing for content mode\n *\n * Manages the lifecycle of editing text-bearing block elements directly on the canvas. Handles rich\n * text formatting, Enter for new paragraphs, and slash commands for inserting elements.\n */\n\nimport elementsMeta from \"../../data/elements-meta.json\";\nimport { normalizeInlineContent, toggleInlineFormat } from \"./inline-format\";\nimport type { JxPath } from \"../state\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\n/**\n * The slash-menu surface inline editing drives. Injected (rather than imported) so this module\n * stays free of the menu's heavy `lit-html` / `ui/layers` dependencies — the editor realm wires the\n * real menu, the canvas iframe supplies its own (or a no-op) without bloating the slim iframe\n * bundle.\n */\nexport interface SlashController {\n show: (\n anchorEl: HTMLElement,\n filter: string,\n cbs: { onSelect: (cmd: SlashCommand) => void; showFilter?: boolean; commands?: SlashCommand[] },\n ) => void;\n dismiss: () => void;\n isOpen: () => boolean;\n}\n\nconst noopSlash: SlashController = {\n dismiss: () => {\n // No slash controller wired in this realm.\n },\n isOpen: () => false,\n show: () => {\n // No slash controller wired in this realm.\n },\n};\nlet slash: SlashController = noopSlash;\n\n/** Inject the slash-menu controller inline editing should drive (call once at realm init). */\nexport function setSlashController(controller: SlashController): void {\n slash = controller;\n}\n\nexport interface InlineAction {\n tag: string;\n label: string;\n icon?: string;\n command?: string;\n shortcut?: string;\n}\n\ninterface ElementDef {\n $inlineChildren?: string[];\n $inlineActions?: InlineAction[] | string;\n}\n\nexport interface SlashCommand {\n label: string;\n tag: string;\n description: string;\n}\n\nexport interface JxContentResult {\n textContent?: string | null;\n children?: (JxMutableNode | string)[];\n}\n\n// ─── Inline tag set (tags that represent rich text formatting) ─────────────\n\n/** Fallback set — used when parent context is unknown */\nconst INLINE_TAGS = new Set([\n \"em\",\n \"strong\",\n \"del\",\n \"code\",\n \"a\",\n \"span\",\n \"br\",\n \"img\",\n \"b\",\n \"i\",\n \"u\",\n \"sub\",\n \"sup\",\n \"s\",\n]);\n\n/** Tags that can be edited inline (text-bearing block elements) */\nconst EDITABLE_BLOCKS = new Set([\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"p\",\n \"li\",\n \"td\",\n \"th\",\n \"blockquote\",\n \"span\",\n \"a\",\n \"label\",\n]);\n\n// ─── Context-aware inline scoping ─────────────────────────────────────────\n\n/**\n * Check if a child tag is inline within the context of a given parent tag. Uses $inlineChildren\n * from elements-meta.json.\n *\n * @param {string} childTag\n * @param {string} parentTag\n * @returns {boolean}\n */\nexport function isInlineInContext(childTag: string, parentTag: string) {\n if (!parentTag) {\n return INLINE_TAGS.has(childTag);\n }\n const parentDef = (elementsMeta.$defs as Record<string, ElementDef>)[parentTag];\n if (!parentDef || !parentDef.$inlineChildren) {\n return false;\n }\n return parentDef.$inlineChildren.includes(childTag);\n}\n\n/**\n * Get the resolved $inlineActions for a given element tag. Follows string references (e.g., \"h1\" →\n * look up h1's actions).\n *\n * @param {string} tag\n * @returns {InlineAction[] | null}\n */\nexport function getInlineActions(tag: string) {\n const def = (elementsMeta.$defs as Record<string, ElementDef>)[tag];\n if (!def) {\n return null;\n }\n let actions = def.$inlineActions;\n if (typeof actions === \"string\") {\n const refDef = (elementsMeta.$defs as Record<string, ElementDef>)[actions];\n actions = refDef?.$inlineActions ?? undefined;\n }\n if (!Array.isArray(actions)) {\n return null;\n }\n return actions;\n}\n\n// ─── Editing state ─────────────────────────────────────────────────────────\n\nlet activeEl: HTMLElement | null = null; // Currently contenteditable element\nlet activePath: JxPath | null = null; // JSON path to the active element\n/**\n * @type {((\n * path: JxPath,\n * children: (JxMutableNode | string)[] | null,\n * textContent: string | null,\n * ) => void)\n * | null}\n */\nlet commitFn:\n | ((\n path: JxPath,\n children: (JxMutableNode | string)[] | null,\n textContent: string | null,\n ) => void)\n | null = null; // Function(path, newChildren, newTextContent) to commit changes\n/**\n * @type {((path: JxPath, beforeChildren: JxContentResult, afterChildren: JxContentResult) => void)\n * | null}\n */\nlet splitFn:\n | ((path: JxPath, beforeChildren: JxContentResult, afterChildren: JxContentResult) => void)\n | null = null; // Function(path, beforeChildren, afterChildren) to split paragraph\n/**\n * @type {((path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void)\n * | null}\n */\nlet insertFn:\n | ((path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void)\n | null = null; // Function(path, elementDef, commitData?) to insert after current block\nlet endFn: (() => void) | null = null; // Function() called when editing stops\n\n/**\n * When a parent toolbar (or its link popover) may take focus during a live session, the iframe sets\n * this so {@link handleBlur} does NOT schedule a `stopEditing()` (the BLOCKER focus-loss race fix —\n * a parent-toolbar click blurs the iframe editable, which must NOT tear the session down). Only an\n * explicit commit (Escape/Enter/click-away-in-iframe) ends the session while suspended.\n */\nlet _blurCloseSuspended = false;\n\n/**\n * Plain (plaintext-only) session state — used for prop-bound text, where the committed value is a\n * plain string (a directive attribute), so rich formatting, Enter-split, and the slash menu are all\n * disabled: Enter commits, Escape restores `_plainOriginal` and commits unchanged (the host no-ops\n * an unchanged prop value).\n */\nlet _plainMode = false;\nlet _plainOriginal = \"\";\n\n/** Suspend blur-driven `stopEditing` (call while the parent toolbar/popover may steal focus). */\nexport function suspendBlurClose() {\n _blurCloseSuspended = true;\n}\n\n/** Resume blur-driven `stopEditing` (call on real editEnd/teardown). */\nexport function resumeBlurClose() {\n _blurCloseSuspended = false;\n}\n\n/**\n * Check if an element is a text-bearing editable block.\n *\n * @param {HTMLElement} el\n * @returns {boolean}\n */\nexport function isEditableBlock(el: HTMLElement) {\n return EDITABLE_BLOCKS.has(el.tagName.toLowerCase());\n}\n\n/**\n * Check if a node is an inline child. When parentNode is provided, uses context-aware scoping from\n * metadata. Without parent, uses the fallback INLINE_TAGS set.\n *\n * @param {JxMutableNode} node\n * @param {JxMutableNode} [parentNode]\n * @returns {boolean}\n */\nexport function isInlineElement(node: JxMutableNode, parentNode?: JxMutableNode) {\n if (!node || typeof node !== \"object\") {\n return false;\n }\n const childTag = (node.tagName ?? \"div\").toLowerCase();\n if (parentNode) {\n const parentTag = (parentNode.tagName ?? \"div\").toLowerCase();\n return isInlineInContext(childTag, parentTag);\n }\n return INLINE_TAGS.has(childTag);\n}\n\n/**\n * Start inline editing on a canvas element.\n *\n * @param {HTMLElement} el - The canvas DOM element to edit\n * @param {JxPath} path - JSON path to the element\n * @param {{\n * onCommit: (\n * path: JxPath,\n * children: (JxMutableNode | string)[] | null,\n * textContent: string | null,\n * ) => void;\n * onSplit: (\n * path: JxPath,\n * beforeChildren: JxContentResult,\n * afterChildren: JxContentResult,\n * ) => void;\n * onInsert: (path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void;\n * onEnd: () => void;\n * }} callbacks\n * @param {{ plainText?: boolean }} [opts] - `plainText` runs a plaintext-only session (prop-bound\n * text: no rich formatting/split/slash; Enter commits, Escape cancels)\n */\nexport function startEditing(\n el: HTMLElement,\n path: JxPath,\n callbacks: {\n onCommit: (\n path: JxPath,\n children: (JxMutableNode | string)[] | null,\n textContent: string | null,\n ) => void;\n onSplit: (\n path: JxPath,\n beforeChildren: JxContentResult,\n afterChildren: JxContentResult,\n ) => void;\n onInsert: (path: JxPath, elementDef: SlashCommand, commitData?: JxContentResult) => void;\n onEnd: () => void;\n },\n opts?: { plainText?: boolean },\n) {\n if (activeEl) {\n // Re-enter (e.g. after a split/insert re-render): tear the old session down WITHOUT firing the\n // User-visible `onEnd` — a re-enter must not reset the parent toolbar via a stray `editEnd`.\n stopEditing(true);\n }\n\n activeEl = el;\n activePath = path;\n commitFn = callbacks.onCommit;\n splitFn = callbacks.onSplit;\n insertFn = callbacks.onInsert;\n endFn = callbacks.onEnd;\n _plainMode = opts?.plainText === true;\n _plainOriginal = _plainMode ? (el.textContent ?? \"\") : \"\";\n\n // Enable editing\n if (_plainMode) {\n try {\n el.contentEditable = \"plaintext-only\";\n } catch {\n // Engines without plaintext-only support throw on assignment; paste is already plain via\n // HandlePaste, and the keydown plain branch inertifies the format shortcuts.\n el.contentEditable = \"true\";\n }\n } else {\n el.contentEditable = \"true\";\n }\n el.style.pointerEvents = \"auto\";\n el.style.outline = \"2px solid var(--accent, #4a9eff)\";\n el.style.outlineOffset = \"1px\";\n el.style.cursor = \"text\";\n el.focus();\n\n // Place cursor at end\n const sel = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n el.addEventListener(\"keydown\", handleKeydown);\n el.addEventListener(\"input\", handleInput);\n el.addEventListener(\"blur\", handleBlur);\n el.addEventListener(\"paste\", handlePaste);\n}\n\n/**\n * Stop editing and commit changes. Pass `silent` to skip the `onEnd` callback (used by the re-enter\n * path so a stop→start sequence doesn't post a user-visible `editEnd`).\n *\n * @param {boolean} [silent]\n */\nexport function stopEditing(silent = false) {\n if (!activeEl) {\n return;\n }\n\n commitChanges();\n slash.dismiss();\n\n activeEl.contentEditable = \"false\";\n activeEl.style.pointerEvents = \"\";\n activeEl.style.outline = \"\";\n activeEl.style.outlineOffset = \"\";\n activeEl.style.cursor = \"\";\n\n activeEl.removeEventListener(\"keydown\", handleKeydown);\n activeEl.removeEventListener(\"input\", handleInput);\n activeEl.removeEventListener(\"blur\", handleBlur);\n activeEl.removeEventListener(\"paste\", handlePaste);\n\n activeEl = null;\n activePath = null;\n commitFn = null;\n splitFn = null;\n insertFn = null;\n _plainMode = false;\n _plainOriginal = \"\";\n\n if (silent) {\n endFn = null;\n } else if (endFn) {\n const fn = endFn;\n endFn = null;\n fn();\n }\n}\n\n/**\n * Whether inline editing is currently active.\n *\n * @returns {boolean}\n */\nexport function isEditing() {\n return activeEl !== null;\n}\n\n/**\n * Get the currently editing element.\n *\n * @returns {HTMLElement | null}\n */\nexport function getActiveElement() {\n return activeEl;\n}\n\n/**\n * Get the document path of the currently editing element (null when no session is live).\n *\n * @returns {JxPath | null}\n */\nexport function getActivePath() {\n return activePath;\n}\n\n/**\n * Whether the DI'd slash menu reports itself open — session-lifecycle guards must not commit-and-\n * end on a pointerdown that is really a slash-menu interaction.\n *\n * @returns {boolean}\n */\nexport function isSlashActive() {\n return slash.isOpen();\n}\n\n// ─── Event handlers ────────────────────────────────────────────────────────\n\n/** @param {KeyboardEvent} e */\nfunction handleKeydown(e: KeyboardEvent) {\n if (_plainMode) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n if (activeEl) {\n // Cancel: restore the original text; the commit posts the unchanged value (host no-ops).\n activeEl.textContent = _plainOriginal;\n }\n stopEditing();\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n stopEditing();\n return;\n }\n // Inertify the browser's native rich shortcuts for the contentEditable=\"true\" fallback.\n if ((e.ctrlKey || e.metaKey) && [\"b\", \"i\", \"u\", \"`\"].includes(e.key)) {\n e.preventDefault();\n }\n return;\n }\n\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n stopEditing();\n return;\n }\n\n if (e.key === \"Enter\" && !e.shiftKey) {\n if (slash.isOpen()) {\n return;\n } // Shared slash menu captures Enter\n e.preventDefault();\n e.stopPropagation();\n handleEnterKey();\n return;\n }\n\n // Slash command trigger\n if (e.key === \"/\" && !e.ctrlKey && !e.metaKey) {\n // Check if at start of empty block or after a space/newline\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0);\n const textBefore = getTextBeforeCursor(range);\n if (textBefore === \"\" || textBefore.endsWith(\" \") || textBefore.endsWith(\"\\n\")) {\n // Let the / character be typed, then show menu on next input\n requestAnimationFrame(() => openSlashMenu());\n return;\n }\n }\n }\n\n // Rich text shortcuts\n if (e.ctrlKey || e.metaKey) {\n switch (e.key) {\n case \"b\": {\n e.preventDefault();\n toggleInlineFormat(\"strong\", activeEl);\n break;\n }\n case \"i\": {\n e.preventDefault();\n toggleInlineFormat(\"em\", activeEl);\n break;\n }\n case \"`\": {\n e.preventDefault();\n toggleInlineFormat(\"code\", activeEl);\n break;\n }\n default: {\n break;\n }\n }\n }\n\n // Dismiss slash menu on non-matching keys\n if (slash.isOpen() && ![\"ArrowUp\", \"ArrowDown\", \"Enter\", \"Backspace\", \"Delete\"].includes(e.key)) {\n // Let the input handler deal with filtering\n }\n}\n\nfunction handleInput() {\n // Check if slash menu should update or dismiss\n if (slash.isOpen()) {\n updateSlashMenu();\n }\n}\n\n/** @param {FocusEvent} _e */\nfunction handleBlur(_e: FocusEvent) {\n // Don't close if focus moved to slash menu\n if (slash.isOpen()) {\n return;\n }\n\n // The parent format toolbar/link popover may have taken focus across the bridge — blur must NOT\n // Tear the session down (Phase 4b-2 focus-loss BLOCKER). Only an explicit commit ends it.\n if (_blurCloseSuspended) {\n return;\n }\n\n // Delay to allow click events to fire\n setTimeout(() => {\n if (_blurCloseSuspended) {\n return;\n }\n if (activeEl && document.activeElement !== activeEl) {\n stopEditing();\n }\n }, 150);\n}\n\n/** @param {ClipboardEvent} e */\nfunction handlePaste(e: ClipboardEvent) {\n e.preventDefault();\n // Paste as plain text to avoid foreign HTML\n const text = e.clipboardData?.getData(\"text/plain\") ?? \"\";\n document.execCommand(\"insertText\", false, text);\n}\n\n// ─── Enter key: split paragraph ────────────────────────────────────────────\n\nfunction handleEnterKey() {\n if (!splitFn || !activeEl || !activePath) {\n return;\n }\n\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return;\n }\n\n const range = sel.getRangeAt(0);\n\n // Create two ranges: before cursor and after cursor\n const beforeRange = document.createRange();\n beforeRange.setStart(activeEl, 0);\n beforeRange.setEnd(range.startContainer, range.startOffset);\n\n const afterRange = document.createRange();\n afterRange.setStart(range.endContainer, range.endOffset);\n afterRange.setEnd(activeEl, activeEl.childNodes.length);\n\n // Extract content from both ranges\n const beforeFrag = beforeRange.cloneContents();\n const afterFrag = afterRange.cloneContents();\n\n const beforeChildren = fragmentToJx(beforeFrag);\n const afterChildren = fragmentToJx(afterFrag);\n\n // Stop editing before mutating state (which will re-render)\n const path = [...activePath];\n const split = splitFn;\n\n activeEl.contentEditable = \"false\";\n activeEl.removeEventListener(\"keydown\", handleKeydown);\n activeEl.removeEventListener(\"input\", handleInput);\n activeEl.removeEventListener(\"blur\", handleBlur);\n activeEl.removeEventListener(\"paste\", handlePaste);\n activeEl = null;\n activePath = null;\n commitFn = null;\n splitFn = null;\n insertFn = null;\n\n if (endFn) {\n const fn = endFn;\n endFn = null;\n fn();\n }\n\n split(path, beforeChildren, afterChildren);\n}\n\n// ─── Content sync: DOM → Jx ────────────────────────────────────────────\n\nfunction commitChanges() {\n if (!commitFn || !activeEl || !activePath) {\n return;\n }\n\n if (_plainMode) {\n // A prop value is a plain single-line string (a directive attribute) — flatten any newline\n // That survived plaintext editing and skip the rich DOM→Jx serialization entirely.\n commitFn(activePath, null, (activeEl.textContent ?? \"\").replaceAll(\"\\n\", \" \"));\n return;\n }\n\n normalizeInlineContent(activeEl);\n const result = elementToJx(activeEl);\n commitFn(activePath, result.children ?? null, result.textContent ?? null);\n}\n\n/**\n * Normalize a node's children array: merge adjacent text nodes and fold all-text children into\n * textContent. Returns `{ textContent }` or `{ children }`.\n *\n * @param {{ children?: (JxMutableNode | string)[] }} node\n * @returns {JxContentResult}\n */\nexport function normalizeChildren(node: { children?: (JxMutableNode | string)[] }) {\n if (!Array.isArray(node.children) || node.children.length === 0) {\n return { textContent: \"\" };\n }\n\n // Step 1: Merge adjacent text nodes\n const merged = [];\n for (const child of node.children) {\n if (typeof child === \"string\" && merged.length > 0 && typeof merged.at(-1) === \"string\") {\n merged[merged.length - 1] += child;\n } else {\n merged.push(child);\n }\n }\n\n // Step 2: If all children are text, fold into textContent\n if (merged.every((c: JxMutableNode | string) => typeof c === \"string\")) {\n return { textContent: merged.join(\"\") };\n }\n\n return { children: merged };\n}\n\n/**\n * Convert a contenteditable element's content to Jx children/textContent. Returns { textContent }\n * for plain text or { children } for rich content.\n *\n * @param {HTMLElement} el\n * @returns {JxContentResult}\n */\nfunction elementToJx(el: HTMLElement): JxContentResult {\n const nodes = el.childNodes;\n\n // If just a single text node, use textContent\n if (nodes.length === 0) {\n return { textContent: \"\" };\n }\n if (nodes.length === 1 && nodes[0]!.nodeType === Node.TEXT_NODE) {\n return { textContent: nodes[0]!.textContent };\n }\n\n // Mixed content → children array\n const children: (JxMutableNode | string)[] = [];\n for (const child of nodes) {\n const jsx = domNodeToJx(child);\n if (jsx !== null && jsx !== undefined) {\n children.push(jsx);\n }\n }\n\n // Normalize: merge adjacent text nodes + fold all-text to textContent\n return normalizeChildren({ children });\n}\n\n/**\n * Convert a DOM node to a Jx element definition.\n *\n * @param {Node} node\n * @returns {JxMutableNode | string | null}\n */\nfunction domNodeToJx(node: Node) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent;\n if (!text) {\n return null;\n }\n return text; // Bare string — text node child\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const el = node as HTMLElement;\n const tag = el.tagName.toLowerCase();\n const result: JxMutableNode = { tagName: tag };\n\n // Map browser execCommand output to our tag conventions\n const tagMap: Record<string, string> = {\n b: \"strong\",\n i: \"em\",\n s: \"del\",\n strike: \"del\",\n };\n if (tagMap[tag]) {\n result.tagName = tagMap[tag];\n }\n\n // Attributes\n if (tag === \"a\" && (el as HTMLAnchorElement).href) {\n result.attributes = { href: el.getAttribute(\"href\") ?? \"\" };\n if ((el as HTMLAnchorElement).title) {\n result.attributes.title = (el as HTMLAnchorElement).title;\n }\n }\n if (tag === \"code\") {\n result.textContent = el.textContent;\n return result;\n }\n\n // Recurse children\n const { childNodes } = el;\n if (childNodes.length === 0) {\n result.textContent = \"\";\n } else if (childNodes.length === 1 && childNodes[0]!.nodeType === Node.TEXT_NODE) {\n result.textContent = childNodes[0]!.textContent;\n } else {\n result.children = [];\n for (const child of childNodes) {\n const jsx = domNodeToJx(child);\n if (jsx) {\n result.children.push(/** @type {JxMutableNode} */ jsx);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Convert a DocumentFragment to a Jx-compatible structure. Returns { textContent } or { children }.\n *\n * @param {DocumentFragment} frag\n * @returns {JxContentResult}\n */\nfunction fragmentToJx(frag: DocumentFragment) {\n const nodes = frag.childNodes;\n if (nodes.length === 0) {\n return { textContent: \"\" };\n }\n if (nodes.length === 1 && nodes[0]!.nodeType === Node.TEXT_NODE) {\n return { textContent: nodes[0]!.textContent };\n }\n\n const children: (JxMutableNode | string)[] = [];\n for (const child of nodes) {\n const jsx = domNodeToJx(child);\n if (jsx) {\n children.push(jsx);\n }\n }\n\n if (\n children.length === 1 &&\n typeof children[0] !== \"string\" &&\n children[0]!.tagName === \"span\" &&\n typeof children[0]!.textContent === \"string\"\n ) {\n return { textContent: children[0]!.textContent };\n }\n\n return children.length > 0 ? { children } : { textContent: \"\" };\n}\n\n// ─── Rich text helpers ─────────────────────────────────────────────────────\n\n/**\n * @param {Range} range\n * @returns {string}\n */\nfunction getTextBeforeCursor(range: Range) {\n const preRange = document.createRange();\n preRange.setStart(activeEl!, 0);\n preRange.setEnd(range.startContainer, range.startOffset);\n return preRange.toString();\n}\n\n// ─── Slash command menu (delegates to shared slash-menu.js) ──────────────\n\n/** Track the character offset where \"/\" was typed so we can detect backspace-past-slash */\nlet _slashFilterStart = 0;\n\nfunction openSlashMenu() {\n if (!activeEl || !insertFn || !activePath) {\n return;\n }\n\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return;\n }\n const range = sel.getRangeAt(0);\n _slashFilterStart = getTextBeforeCursor(range).length;\n\n slash.show(activeEl, \"\", { onSelect: handleSlashSelect });\n}\n\nfunction updateSlashMenu() {\n if (!activeEl) {\n return;\n }\n\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n slash.dismiss();\n return;\n }\n\n const range = sel.getRangeAt(0);\n const fullText = getTextBeforeCursor(range);\n const slashIdx = fullText.lastIndexOf(\"/\");\n\n if (slashIdx === -1 || fullText.length < _slashFilterStart - 1) {\n slash.dismiss();\n return;\n }\n\n const filter = fullText.slice(slashIdx + 1).toLowerCase();\n slash.show(activeEl, filter, { onSelect: handleSlashSelect });\n}\n\n/** @param {SlashCommand} cmd */\nfunction handleSlashSelect(cmd: SlashCommand) {\n if (!activeEl || !insertFn || !activePath) {\n return;\n }\n\n // Remove the /command text from the element\n const sel = window.getSelection();\n if (sel && sel.rangeCount) {\n const range = sel.getRangeAt(0);\n const fullText = getTextBeforeCursor(range);\n const slashIdx = fullText.lastIndexOf(\"/\");\n if (slashIdx !== -1) {\n const walker = document.createTreeWalker(activeEl, NodeFilter.SHOW_TEXT);\n let charCount = 0;\n let slashNode: Text | null = null;\n let slashOffset = 0;\n while (walker.nextNode()) {\n const node = walker.currentNode as Text;\n if (charCount + node.length > slashIdx) {\n slashNode = node;\n slashOffset = slashIdx - charCount;\n break;\n }\n charCount += node.length;\n }\n if (slashNode) {\n const delRange = document.createRange();\n delRange.setStart(slashNode, slashOffset);\n delRange.setEnd(range.startContainer, range.startOffset);\n delRange.deleteContents();\n }\n }\n }\n\n // Compute commit data inline instead of calling commitChanges() — avoids a separate\n // Update() call that would race with the insertFn update() (two concurrent async renders).\n normalizeInlineContent(activeEl);\n const commitResult = elementToJx(activeEl);\n\n const path = [...activePath];\n const insert = insertFn;\n\n activeEl.contentEditable = \"false\";\n activeEl.removeEventListener(\"keydown\", handleKeydown);\n activeEl.removeEventListener(\"input\", handleInput);\n activeEl.removeEventListener(\"blur\", handleBlur);\n activeEl.removeEventListener(\"paste\", handlePaste);\n activeEl = null;\n activePath = null;\n commitFn = null;\n splitFn = null;\n insertFn = null;\n\n if (endFn) {\n const fn = endFn;\n endFn = null;\n fn();\n }\n\n // Pass commit data so onInsert can batch commit + insert into a single update()\n insert(path, cmd, commitResult);\n}\n",
18
19
  "/// <reference lib=\"dom\" />\n/**\n * In-iframe interaction — listens for pointer events inside the canvas iframe, resolves the target\n * to its nearest `data-jx-path` node, and reports hit (click) / hover (move) to the parent with the\n * node's iframe-space rect. The parent owns selection + overlay rendering (cross-origin bridge);\n * the iframe only reports what was pointed at.\n */\n\nimport { parseJxPath, serializeJxPath } from \"./path-mapping\";\nimport { rectOf } from \"../utils/geometry\";\nimport { computeInsertZones, insertZonesKey } from \"./iframe-insert\";\nimport { getActiveElement, isEditing } from \"../editor/inline-edit\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type { IframeToParent, NodeHit, ParentToIframe } from \"./iframe-protocol\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\n/** Walk up from an element to the nearest ancestor carrying a `data-jx-path`; null if none. */\nfunction nearestPathEl(start: Element | null): HTMLElement | null {\n let el = start instanceof Element ? (start as HTMLElement) : null;\n while (el) {\n if (el.dataset?.jxPath) {\n return el;\n }\n el = el.parentElement;\n }\n return null;\n}\n\n/** Walk up from an event target to the nearest element carrying a `data-jx-path`; null if none. */\nexport function nearestHit(target: EventTarget | null): NodeHit | null {\n const el = nearestPathEl(target instanceof Element ? target : null);\n if (!el) {\n return null;\n }\n const r = rectOf(el);\n return {\n path: parseJxPath(el.dataset.jxPath as string),\n rect: { height: r.height, width: r.width, x: r.x, y: r.y },\n };\n}\n\n/**\n * Measure the current rect of each requested document path by locating its `data-jx-path` element.\n * Paths with no matching node are omitted. The serialized path is the same string the renderer\n * stamps, so a stored selection path round-trips back to its element.\n */\nexport function measureHits(paths: (string | number)[][], doc: Document = document): NodeHit[] {\n const out: NodeHit[] = [];\n for (const path of paths) {\n const serialized = serializeJxPath(path);\n // Wrap in single quotes (the serialized JSON only ever uses double quotes) and escape the few\n // Characters that could still break out of an attribute-value selector.\n const esc = serialized.replaceAll(\"\\\\\", String.raw`\\\\`).replaceAll(\"'\", String.raw`\\'`);\n const el = doc.querySelector(`[data-jx-path='${esc}']`);\n if (el) {\n const r = rectOf(el);\n out.push({ path, rect: { height: r.height, width: r.width, x: r.x, y: r.y } });\n }\n }\n return out;\n}\n\n/**\n * The iframe-side capabilities the interaction wiring needs beyond raw pointer events. Injected\n * from {@link file://./iframe-entry.ts} (the entry owns the shadow doc), mirroring how\n * {@link file://./iframe-drop.ts}'s `startGrabDetector` receives its deps rather than reaching for\n * module state.\n */\nexport interface InteractionDeps {\n /**\n * The iframe's current non-reactive shadow doc (path coordinate space), or null before the first\n * render. Threaded so the insertion-zone computation reads the SAME doc the patch/drag paths\n * use.\n */\n getShadowDoc: () => JxMutableNode | null;\n /**\n * The live render's canvas mode. Insertion \"+\" zones are a document-editing affordance —\n * suppressed for stylebook renders (specimens aren't insert targets). Absent = permissive.\n */\n getMode?: () => string;\n}\n\n/**\n * Wire pointer listeners on the iframe document and report hit/hover (and, when `deps` is given,\n * the insertion \"+\" zones) to the parent. Hover/zones are only reported when they change, to keep\n * the channel quiet. Returns a teardown function.\n *\n * The insertion-zone hook hangs off the SAME pointermove as hover (the cross-origin cousin of the\n * legacy in-realm insertion-helper mousemove): it resolves the hovered `[data-jx-path]` element and\n * posts `insertZones` only when the zone set's key changes; `null` is posted on pointerleave and\n * whenever the cursor sits mid-element (no near-edge zone), so the parent clears any stale \"+\".\n */\nexport function startInteraction(\n channel: IframeChannel<IframeToParent, ParentToIframe>,\n doc: Document = document,\n deps?: InteractionDeps,\n): () => void {\n let lastHoverKey: string | null = null;\n let lastZonesKey: string | null = null;\n\n const onClick = (e: Event) => {\n const hit = nearestHit(e.target);\n if (hit) {\n channel.post({ hit, kind: \"hit\" });\n }\n };\n\n const reportHover = (hit: NodeHit | null) => {\n const key = hit ? JSON.stringify(hit.path) : null;\n if (key === lastHoverKey) {\n return;\n }\n lastHoverKey = key;\n channel.post({ hit, kind: \"hover\" });\n };\n\n /** Resolve + post the insertion \"+\" zones for an iframe-viewport cursor, deduped by key. */\n const reportInsertZones = (target: EventTarget | null, cursor: { x: number; y: number }) => {\n if (!deps || deps.getMode?.() === \"stylebook\") {\n return;\n }\n const shadowDoc = deps.getShadowDoc();\n const el = nearestPathEl(target instanceof Element ? target : null);\n const zones = el && shadowDoc ? computeInsertZones(el, cursor, shadowDoc) : null;\n const key = insertZonesKey(zones);\n if (key === lastZonesKey) {\n return;\n }\n lastZonesKey = key;\n channel.post({ kind: \"insertZones\", zones });\n };\n\n const onMove = (e: Event) => {\n reportHover(nearestHit(e.target));\n const pe = e as PointerEvent;\n reportInsertZones(e.target, { x: pe.clientX, y: pe.clientY });\n };\n const onLeave = () => {\n reportHover(null);\n if (deps && lastZonesKey !== \"none\") {\n lastZonesKey = \"none\";\n channel.post({ kind: \"insertZones\", zones: null });\n }\n };\n\n const onContextMenu = (e: Event) => {\n const me = e as MouseEvent;\n // Inside the ACTIVE editable keep the NATIVE menu (spellcheck / paste) — the session owns it.\n const active = isEditing() ? getActiveElement() : null;\n if (active && e.target instanceof Node && active.contains(e.target)) {\n return;\n }\n // Suppress the browser menu everywhere else (legacy parity — the deleted panel-events handler\n // PreventDefaulted even with no element hit) and let the parent show the Jx element menu.\n e.preventDefault();\n const hit = nearestHit(e.target);\n channel.post({\n kind: \"contextMenu\",\n path: hit ? hit.path : null,\n x: me.clientX,\n y: me.clientY,\n });\n };\n\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"pointermove\", onMove, true);\n doc.addEventListener(\"pointerleave\", onLeave, true);\n doc.addEventListener(\"contextmenu\", onContextMenu, true);\n\n return () => {\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"pointermove\", onMove, true);\n doc.removeEventListener(\"pointerleave\", onLeave, true);\n doc.removeEventListener(\"contextmenu\", onContextMenu, true);\n };\n}\n",
19
20
  "/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/**\n * In-iframe drop math (Phase 4c). Runs INSIDE the canvas iframe, in the iframe's own realm/coords.\n *\n * Split for testability: - {@link resolveDropTarget} is the thin DOM adapter (point hit-test →\n * nearest `data-jx-path`); it is CDP-ONLY because happy-dom's `elementFromPoint` returns null (no\n * layout), so it carries no branching logic worth unit-proving against a fake. -\n * {@link computeDropInstruction} is PURE: it reads element rects through {@link rectOf} (stubbable)\n * and the iframe's shadow doc, and resolves the structural placement. It ports the legacy\n * `getCanvasDropResult`/`nearestChildEdge` math (canvas-dnd.ts) against IFRAME-realm geometry, and\n * reproduces the EXACT `[...parentPath, \"children\", index]` targetPath shape so the parent's\n * realm-agnostic `applyDropInstruction` resolves the same parent/index.\n *\n * The drop is computed FRESH in the iframe's `drop` handler from the live DOM — a `dragOver`\n * preview is display-only and never the source of truth (patch-mid-drag safety).\n */\n\nimport { parseJxPath } from \"./path-mapping\";\nimport { rectOf, elementAtPoint } from \"../utils/geometry\";\nimport { getNodeAtPath, isAncestor, pathsEqual } from \"../state\";\nimport { isEditing } from \"../editor/inline-edit\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type { DragSrcKind, DropPreview, IframeToParent, ParentToIframe } from \"./iframe-protocol\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\nimport type { JxPath } from \"../state\";\n\n/**\n * Void (self-closing) HTML tags that cannot accept children — a leaf for drop purposes. COPIED from\n * the store's `VOID_ELEMENTS` literal so this module stays dependency-light (the iframe bundle must\n * not pull in the store). Keep in sync with store.ts:VOID_ELEMENTS.\n */\nconst VOID_TAGS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\n/**\n * Walk up from an element to the nearest ancestor carrying a `data-jx-path`. Refactored out of the\n * `nearestHit` walk (iframe-interaction.ts) to take an element directly so the hit-test adapter can\n * reuse it. Returns null when no addressable node is found.\n */\nfunction nearestPathEl(start: Element | null): HTMLElement | null {\n let el = start instanceof Element ? (start as HTMLElement) : null;\n while (el) {\n if (el.dataset?.jxPath) {\n return el;\n }\n el = el.parentElement;\n }\n return null;\n}\n\n/**\n * Point hit-test in iframe-viewport coords (`x`,`y`): the topmost element, then walk to the nearest\n * `[data-jx-path]` ancestor. CDP-ONLY — happy-dom's `elementFromPoint` returns null (no layout), so\n * this thin adapter is exercised under a real browser, not a unit test.\n */\nexport function resolveDropTarget(x: number, y: number, doc: Document): HTMLElement | null {\n const hit = elementAtPoint(x, y, doc);\n return nearestPathEl(hit);\n}\n\n/**\n * Compute the structural drop placement for a cursor over `targetEl`, PURE against iframe-realm\n * rects.\n *\n * `cursorY` is in iframe-viewport coords (same space as {@link rectOf}); `shadowDoc` is the\n * iframe's non-reactive shadow doc (path coordinate space); `src` is the realm-agnostic drag\n * source.\n *\n * Branching (ported from canvas-dnd.ts getCanvasDropResult/nearestChildEdge):\n *\n * - Root (path.length===0) with element children → nearest child edge (reorder-above/below that\n * child).\n * - Leaf (void tag, or no element children) → relY<0.5 above (edge top) else below (edge bottom).\n * - Container → relY<0.25 above, >0.75 below, else make-child (edge inside). Returns null when the\n * drop is disallowed (a tree-node onto its own ancestor or itself).\n */\nexport function computeDropInstruction(\n targetEl: HTMLElement,\n cursorY: number,\n shadowDoc: JxMutableNode,\n src: DragSrcKind,\n): DropPreview | null {\n const serialized = targetEl.dataset?.jxPath;\n if (serialized == null) {\n return null;\n }\n const targetPath = parseJxPath(serialized) as JxPath;\n\n // Root: pick the nearest child edge among the element's element children.\n if (targetPath.length === 0) {\n const children = [...targetEl.children] as HTMLElement[];\n if (children.length === 0) {\n return canDrop(src, targetPath)\n ? {\n edge: \"inside\",\n instruction: \"make-child\",\n referenceRect: rectFor(targetEl),\n targetPath,\n }\n : null;\n }\n return nearestChildEdge(children, cursorY, targetPath, src);\n }\n\n if (!canDrop(src, targetPath)) {\n return null;\n }\n\n const node = getNodeAtPath(shadowDoc, targetPath) as JxMutableNode | undefined;\n const tag = (node?.tagName || \"div\").toLowerCase();\n const hasElementChildren =\n Array.isArray(node?.children) &&\n node.children.some((c: unknown) => c != null && typeof c === \"object\");\n const isLeaf = VOID_TAGS.has(tag) || !hasElementChildren;\n\n const rect = rectFor(targetEl);\n const relY = rect.height === 0 ? 0 : (cursorY - rect.y) / rect.height;\n\n if (isLeaf) {\n return relY < 0.5\n ? { edge: \"top\", instruction: \"reorder-above\", referenceRect: rect, targetPath }\n : { edge: \"bottom\", instruction: \"reorder-below\", referenceRect: rect, targetPath };\n }\n if (relY < 0.25) {\n return { edge: \"top\", instruction: \"reorder-above\", referenceRect: rect, targetPath };\n }\n if (relY > 0.75) {\n return { edge: \"bottom\", instruction: \"reorder-below\", referenceRect: rect, targetPath };\n }\n return { edge: \"inside\", instruction: \"make-child\", referenceRect: rect, targetPath };\n}\n\n/**\n * Resolve the nearest child-edge drop among `children` (ports nearestChildEdge, canvas-dnd.ts). The\n * resulting `targetPath` is `[...parentPath, \"children\", closestIdx]` so the parent's\n * parentElementPath(slice(0,-2)) / childIndex(at(-1)) read the same parent + index.\n */\nfunction nearestChildEdge(\n children: HTMLElement[],\n cursorY: number,\n parentPath: JxPath,\n src: DragSrcKind,\n): DropPreview | null {\n let closestDist = Infinity;\n let instruction: \"reorder-above\" | \"reorder-below\" = \"reorder-below\";\n let closestIdx = children.length - 1;\n\n for (let i = 0; i < children.length; i++) {\n const rect = rectFor(children[i]!);\n const topDist = Math.abs(cursorY - rect.y);\n const bottomDist = Math.abs(cursorY - (rect.y + rect.height));\n if (topDist < closestDist) {\n closestDist = topDist;\n instruction = \"reorder-above\";\n closestIdx = i;\n }\n if (bottomDist < closestDist) {\n closestDist = bottomDist;\n instruction = \"reorder-below\";\n closestIdx = i;\n }\n }\n\n const childPath = [...parentPath, \"children\", closestIdx] as JxPath;\n if (!canDrop(src, childPath)) {\n return null;\n }\n return {\n edge: instruction === \"reorder-above\" ? \"top\" : \"bottom\",\n instruction,\n referenceRect: rectFor(children[closestIdx]!),\n targetPath: childPath,\n };\n}\n\n/** A tree-node may not drop onto its own subtree (ancestor-or-self); a block may always drop. */\nfunction canDrop(src: DragSrcKind, targetPath: JxPath): boolean {\n if (src.type !== \"tree-node\") {\n return true;\n }\n const srcPath = src.path as JxPath;\n if (pathsEqual(srcPath, targetPath)) {\n return false;\n }\n return !isAncestor(srcPath, targetPath);\n}\n\n/** Read an element's iframe-viewport rect as a {@link DropPreview} `referenceRect`. */\nfunction rectFor(el: Element): DropPreview[\"referenceRect\"] {\n const r = rectOf(el);\n return { height: r.height, width: r.width, x: r.x, y: r.y };\n}\n\n// ─── Flow 3: grab-anywhere drag detector (Phase 4c, commit 3; rebuilt 4c flow-3 fix) ──────────────\n// The iframe owns no pragmatic-dnd, so an element-body drag is detected manually: a pointerdown on a\n// `[data-jx-path]` arms a candidate, and the first pointermove past a small threshold posts\n// `dragOriginate`. A drag that begins inside the iframe delivers its held-button pointermoves to the\n// IFRAME document (implicit pointer capture), so the PARENT never sees them while the cursor is over\n// The canvas. Flow 3 is therefore FULLY IFRAME-DRIVEN: after originating, the detector keeps driving\n// — it computes the preview/drop LOCALLY from its own cursor (already iframe-viewport coords, no\n// Parent->iframe round-trip) and posts dragOver/dropResult directly. The parent only adopts the\n// Iframe's dragSeq, draws the indicator, positions the ghost from the posted cursor, and applies the\n// Drop. (Flows 1/2/4 stay parent-originated: pragmatic's parent-document pointer stream does deliver\n// Moves over the iframe for a drag that began in parent DOM, so those are sound and untouched.)\n\n/** Pixels the pointer must travel from pointerdown before a body-grab counts as a drag. */\nconst GRAB_THRESHOLD = 4;\n\n/**\n * Whether an iframe-originated (flow 3) drag is currently active. Read by iframe-keys to suppress\n * forwarding Escape to the parent during such a drag (the iframe owns cancel locally, see\n * {@link cancelIframeDrag}), and by the entry's dragEnd/dragCancel handling.\n */\nlet dragActive = false;\n\n/** True while a flow-3 (iframe-originated) drag is live. */\nexport function isDragActive(): boolean {\n return dragActive;\n}\n\n/** The local cancel hook (clears preview/auto-scroll + posts dragEnd) installed by the active drag. */\nlet cancelHook: (() => void) | null = null;\n\n/**\n * Cancel the active iframe-originated drag locally: clear any in-iframe drag state and run the\n * installed cancel hook (the entry posts `dragEnd` so the parent tears down ghost/indicator). A\n * no-op when no flow-3 drag is active. Single-sourced through here (and the parent's pragmatic\n * cancel for the parent-source flows) so cancel never double-fires.\n */\nexport function cancelIframeDrag(): void {\n if (!dragActive) {\n return;\n }\n const hook = cancelHook;\n clearIframeDrag();\n hook?.();\n}\n\n/** Reset the flow-3 drag state without firing the cancel hook (used on natural drop/dragEnd). */\nexport function clearIframeDrag(): void {\n dragActive = false;\n cancelHook = null;\n}\n\n/**\n * Mark a flow-3 drag active and register its local cancel hook. Called by the entry when it accepts\n * an iframe-originated session (after posting dragOriginate). Idempotent per drag.\n */\nexport function beginIframeDrag(onCancel: () => void): void {\n dragActive = true;\n cancelHook = onCancel;\n}\n\n/**\n * Whether a pointerdown on `target` may originate a body-grab drag: it must resolve to a\n * `[data-jx-path]` element and NOT be inside an active inline-edit session (typing/selecting text\n * must never start a reorder). Returns the resolved path, or null when no drag should originate.\n */\nexport function grabCandidatePath(target: EventTarget | null): JxPath | null {\n if (isEditing()) {\n return null;\n }\n const el = nearestPathEl(target instanceof Element ? target : null);\n if (!el) {\n return null;\n }\n return parseJxPath(el.dataset.jxPath as string) as JxPath;\n}\n\n/** Whether the pointer has moved past the grab threshold from its pointerdown origin (PURE). */\nexport function passedGrabThreshold(\n origin: { x: number; y: number },\n now: { x: number; y: number },\n): boolean {\n return (\n Math.abs(now.x - origin.x) >= GRAB_THRESHOLD || Math.abs(now.y - origin.y) >= GRAB_THRESHOLD\n );\n}\n\n// ─── Auto-scroll (Phase 4c, commit 6) ──────────────────────────────────────────\n\n/** Edge band height (px from the top/bottom of the viewport) that triggers auto-scroll. */\nexport const AUTO_SCROLL_BAND = 40;\n\n/** Pixels scrolled per auto-scroll frame. */\nexport const AUTO_SCROLL_STEP = 12;\n\n/**\n * The auto-scroll direction for a cursor `y` within a viewport of height `viewportH` (PURE).\n * Returns `-1` (scroll up) when the cursor is in the top `band`, `+1` (scroll down) in the bottom\n * `band`, or `0` outside both bands. The iframe's rAF loop multiplies this by\n * {@link AUTO_SCROLL_STEP} and keeps scrolling while it stays non-zero (a stationary edge-hold\n * self-sustains).\n */\nexport function scrollDirection(y: number, viewportH: number, band = AUTO_SCROLL_BAND): -1 | 0 | 1 {\n if (y < band) {\n return -1;\n }\n if (y > viewportH - band) {\n return 1;\n }\n return 0;\n}\n\n/**\n * The iframe-side capabilities the flow-3 detector needs to DRIVE a drag locally. Injected from\n * {@link file://./iframe-entry.ts} (the entry owns the render generation, the shadow doc, and the\n * self-sustaining auto-scroll loop) rather than duplicated here, so the detector and the\n * `dragMove`/`drop` message handlers share the EXACT same preview/drop math and auto-scroll state.\n */\nexport interface GrabDetectorDeps {\n /**\n * Resolve the display preview / authoritative drop for an IFRAME-VIEWPORT cursor (point hit-test\n * → nearest `[data-jx-path]` → pure {@link computeDropInstruction}); null when over no droppable.\n * Identical to the function the `dragMove`/`drop` handlers use — flow 3 takes the iframe-local\n * cursor DIRECTLY (no parentCursorToIframe; the iframe already owns its coordinate space).\n */\n previewAt: (cursor: { x: number; y: number }, src: DragSrcKind) => DropPreview | null;\n /** The generation the iframe's DOM currently reflects, so replies can be stale-gated parent-side. */\n gen: () => number;\n /**\n * The live render's canvas mode. Grab-anywhere drags are a document-editing affordance —\n * suppressed for stylebook renders (specimens can't be reordered). Absent = permissive.\n */\n getMode?: () => string;\n /**\n * Arm the self-sustaining auto-scroll loop for a flow-3 cursor. `src` lets the loop recompute the\n * preview during an edge-hold (the parent never posts a dragStart for flow 3, so the entry's own\n * `dragSrc` is null); the loop also re-posts dragOver WITH the cursor so the ghost keeps\n * tracking.\n */\n armAutoScroll: (cursor: { x: number; y: number }, dragSeq: number, src: DragSrcKind) => void;\n /** Stop the auto-scroll loop (on drop / band-exit / cancel). */\n stopAutoScroll: () => void;\n}\n\n/**\n * Wire the flow-3 grab detector on the iframe document and DRIVE the whole gesture locally (the\n * iframe owns the pointer it started — its held-button moves never reach the parent document).\n *\n * - Pointerdown on a node body (primary button, not while editing) arms a candidate.\n * - The first pointermove past {@link GRAB_THRESHOLD} originates: bumps the local seq, marks the drag\n * active (with a cancel hook that posts `dragEnd`), posts `dragOriginate{path,dragSeq}`, and then\n * immediately drives the first move.\n * - Every later pointermove computes the preview LOCALLY from its own (iframe-viewport) cursor and\n * posts `dragOver{dragSeq, gen, preview, cursor}` (the parent positions the ghost from `cursor`)\n * and updates auto-scroll.\n * - Pointerup computes the drop FRESH and posts `dropResult`, then tears down.\n *\n * The parent adopts this seq ({@link file://../panels/canvas-dnd-bridge.ts}'s\n * `startIframeOriginatedDrag` → `adoptDragSession`) so the dragOver/dropResult pass its seq gate;\n * it attaches NO parent-document listeners for flow 3. Returns a teardown. `deps` injects the\n * iframe-side preview/gen/auto-scroll capabilities (see {@link GrabDetectorDeps}).\n */\nexport function startGrabDetector(\n channel: IframeChannel<IframeToParent, ParentToIframe>,\n doc: Document = document,\n deps?: GrabDetectorDeps,\n): () => void {\n let candidate: { path: JxPath; origin: { x: number; y: number } } | null = null;\n let localSeq = 0;\n // The realm-agnostic source kind for the live drag, kept in closure so previewAt's canDrop\n // (isAncestor/self) sees the grabbed node's path for the whole gesture.\n let src: DragSrcKind | null = null;\n\n const onPointerDown = (e: PointerEvent) => {\n // Only a primary-button drag originates; ignore right/middle and multi-touch gestures.\n if (e.button !== 0) {\n return;\n }\n if (deps?.getMode?.() === \"stylebook\") {\n return;\n }\n const path = grabCandidatePath(e.target);\n if (!path) {\n return;\n }\n candidate = { origin: { x: e.clientX, y: e.clientY }, path };\n };\n\n // A REAL mouse press-drag over an <img> (draggable by default) or a text selection starts a\n // NATIVE HTML5 drag, which fires pointercancel and hijacks the pointer stream — the grab dies\n // Before it originates (synthetic/CDP input never triggers this, which is why only real-mouse\n // Drags broke). While a grab candidate is armed or a drag is live, native drags are never wanted;\n // Outside that (no path target, inline editing) native behavior is preserved.\n const onDragStart = (e: Event) => {\n if (candidate || dragActive) {\n e.preventDefault();\n }\n };\n\n // Suppress text selection only while the drag is LIVE (plain clicks and inline editing keep\n // Native selection); the origination path below also clears any selection the pre-threshold\n // Moves already started.\n const onSelectStart = (e: Event) => {\n if (dragActive) {\n e.preventDefault();\n }\n };\n\n /** Compute + post the dragOver preview for the live cursor, and (re)arm auto-scroll. */\n const drive = (cursor: { x: number; y: number }) => {\n if (!src) {\n return;\n }\n const preview = deps ? deps.previewAt(cursor, src) : null;\n channel.post({\n cursor,\n dragSeq: localSeq,\n gen: deps ? deps.gen() : -1,\n kind: \"dragOver\",\n preview,\n });\n deps?.armAutoScroll(cursor, localSeq, src);\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const cursor = { x: e.clientX, y: e.clientY };\n if (!dragActive) {\n if (!candidate || !passedGrabThreshold(candidate.origin, cursor)) {\n return;\n }\n localSeq += 1;\n const { path } = candidate;\n candidate = null;\n src = { path: [...path], type: \"tree-node\" };\n beginIframeDrag(() => channel.post({ dragSeq: localSeq, kind: \"dragEnd\" }));\n // Drop any text selection the pre-threshold moves started (real-mouse drags select as they\n // Go); onSelectStart keeps new selections suppressed for the rest of the gesture.\n doc.getSelection?.()?.removeAllRanges();\n channel.post({ dragSeq: localSeq, kind: \"dragOriginate\", path: [...path] });\n // Fall through and drive the first move immediately (the originating move is also a move).\n }\n drive(cursor);\n };\n\n const onPointerUp = (e: PointerEvent) => {\n candidate = null;\n if (!dragActive || !src) {\n return;\n }\n const cursor = { x: e.clientX, y: e.clientY };\n const drop = deps ? deps.previewAt(cursor, src) : null;\n channel.post({\n dragSeq: localSeq,\n gen: deps ? deps.gen() : -1,\n instruction: drop ? drop.instruction : null,\n kind: \"dropResult\",\n targetPath: drop ? drop.targetPath : null,\n });\n src = null;\n deps?.stopAutoScroll();\n clearIframeDrag();\n };\n\n doc.addEventListener(\"pointerdown\", onPointerDown, true);\n doc.addEventListener(\"pointermove\", onPointerMove, true);\n doc.addEventListener(\"pointerup\", onPointerUp, true);\n doc.addEventListener(\"dragstart\", onDragStart, true);\n doc.addEventListener(\"selectstart\", onSelectStart, true);\n\n return () => {\n doc.removeEventListener(\"pointerdown\", onPointerDown, true);\n doc.removeEventListener(\"pointermove\", onPointerMove, true);\n doc.removeEventListener(\"pointerup\", onPointerUp, true);\n doc.removeEventListener(\"dragstart\", onDragStart, true);\n doc.removeEventListener(\"selectstart\", onSelectStart, true);\n };\n}\n",
20
21
  "/// <reference lib=\"dom\" />\n/**\n * Inline link + template-token application for contenteditable editing.\n *\n * Realm-agnostic: every DOM access uses ambient `window`/`document`, so bundled into the canvas\n * iframe these operate on the iframe realm where the edited DOM (and its Selection) live. The\n * parent format toolbar never calls these — it posts an `applyFormat` intent and the iframe applies\n * it here (Phase 4b-2).\n *\n * `document.execCommand` is uncoverable under happy-dom (no implementation), so it is wrapped in a\n * one-line shim {@link exec} that the branch logic calls; tests stub `document.execCommand` and\n * assert at the stub level (documented as stub-level, not behavioral).\n */\n\nimport { normalizeInlineContent } from \"./inline-format\";\n\n/** The one uncoverable call, isolated so the surrounding branch logic stays unit-testable. */\nconst exec = (cmd: string, val?: string): boolean => document.execCommand(cmd, false, val);\n\n/**\n * Read the link state of the current selection relative to `root`: walk the selection's anchor node\n * up to `root` looking for an `<a>`. Returns the author-entered `href` attribute (NOT the resolved\n * `.href` property), so relative/templated URLs round-trip unchanged.\n */\nexport function linkStateForSelection(root: HTMLElement): { active: boolean; href: string | null } {\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return { active: false, href: null };\n }\n let node: Node | null = sel.anchorNode;\n while (node && node !== root) {\n if (node.nodeType === Node.ELEMENT_NODE && (node as Element).tagName.toLowerCase() === \"a\") {\n return { active: true, href: (node as Element).getAttribute(\"href\") };\n }\n node = node.parentNode;\n }\n return { active: false, href: null };\n}\n\n/**\n * Find the `<a>` that contains the selection anchor (up to `root`), if any.\n *\n * @param {HTMLElement} root\n * @returns {HTMLAnchorElement | null}\n */\nfunction anchorInSelection(root: HTMLElement): HTMLAnchorElement | null {\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return null;\n }\n let node: Node | null = sel.anchorNode;\n while (node && node !== root) {\n if (node.nodeType === Node.ELEMENT_NODE && (node as Element).tagName.toLowerCase() === \"a\") {\n return node as HTMLAnchorElement;\n }\n node = node.parentNode;\n }\n return null;\n}\n\n/**\n * Apply (or remove) a link on the current selection within `root`. With an existing `<a>` in the\n * selection: rewrite its `href`, or unwrap it when `href` is null/empty. Otherwise create a link\n * via `execCommand(\"createLink\")`. Always normalizes the inline content afterwards.\n */\nexport function applyLink(root: HTMLElement, href: string | null): void {\n const existing = anchorInSelection(root);\n if (existing) {\n if (href) {\n existing.setAttribute(\"href\", href);\n } else {\n // Unwrap: replace the anchor with its children, preserving the text.\n const frag = document.createDocumentFragment();\n while (existing.firstChild) {\n frag.append(existing.firstChild);\n }\n existing.replaceWith(frag);\n }\n } else if (href) {\n exec(\"createLink\", href);\n }\n normalizeInlineContent(root);\n}\n\n/** Insert a `${token}` template expression at the caret inside `root` (joins the native undo stack). */\nexport function insertTemplateToken(root: HTMLElement, token: string): void {\n root.focus();\n exec(\"insertText\", `\\${${token}}`);\n}\n",
21
22
  "/// <reference lib=\"dom\" />\n/**\n * Edit-mode display transforms — extracted from studio.js (Phase 4i). Pure stateless functions that\n * convert document trees for visual editing (template expressions, $map, $switch, empty\n * placeholders).\n */\n\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\nconst mediaTags = new Set([\"img\", \"video\", \"source\", \"iframe\", \"audio\"]);\nconst TRANSPARENT_PX =\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\";\n// A neutral, visible gray placeholder for image-like bindings in edit mode (e.g. a component `image`\n// Prop bound to ${...}). The component renders <img src={prop}> internally, so a transparent pixel\n// Would collapse to nothing — a gray SVG box reads as an intentional placeholder instead.\nconst PLACEHOLDER_IMG =\n \"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='32'%20height='32'%3E%3Crect%20width='32'%20height='32'%20fill='%23d0d0d0'/%3E%3C/svg%3E\";\n\n// Prop/attribute names that feed an <img>/background, so a ${...} binding would otherwise render a\n// Broken image in edit mode. Matched by exact name or common camelCase suffix (featuredImage, heroBg).\nconst IMAGE_KEY_RE =\n /(src|poster|image|bg|background|icon|logo|photo|avatar|thumbnail|cover|banner)$/i;\nfunction isImageUrlKey(key: string): boolean {\n return IMAGE_KEY_RE.test(key);\n}\n\nconst textTags = new Set([\n \"p\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"blockquote\",\n \"li\",\n \"dt\",\n \"dd\",\n \"th\",\n \"td\",\n \"span\",\n \"strong\",\n \"em\",\n \"small\",\n \"mark\",\n \"code\",\n \"abbr\",\n \"q\",\n \"sub\",\n \"sup\",\n \"time\",\n \"a\",\n \"button\",\n \"label\",\n \"legend\",\n \"caption\",\n \"summary\",\n \"pre\",\n \"option\",\n]);\n\nconst containerTags = new Set([\n \"div\",\n \"section\",\n \"article\",\n \"aside\",\n \"header\",\n \"footer\",\n \"main\",\n \"nav\",\n \"figure\",\n \"figcaption\",\n \"details\",\n \"fieldset\",\n \"form\",\n \"ul\",\n \"ol\",\n \"dl\",\n \"table\",\n]);\n\n/** All placeholder classes prepareForEditMode may add to an empty element. */\nexport const EMPTY_PLACEHOLDER_CLASSES = [\n \"empty-text-placeholder\",\n \"empty-container-placeholder\",\n] as const;\n\n/**\n * The empty-placeholder class prepareForEditMode would add for this node, or null. Used by the\n * canvas patcher to keep placeholder classes in sync when patching text without a full render.\n *\n * @param {JxMutableNode} node\n */\nexport function computeEmptyPlaceholderClass(node: JxMutableNode): string | null {\n if (!node.tagName || node.textContent || node.innerHTML) {\n return null;\n }\n // Layout-originated nodes ($__layout, set by markLayoutNodes) are read-only in page context;\n // Edit affordances like \"Click here to add text\" don't apply to them.\n if (node.$__layout) {\n return null;\n }\n if (Array.isArray(node.children) && node.children.length > 0) {\n return null;\n }\n if (textTags.has(node.tagName)) {\n return \"empty-text-placeholder\";\n }\n if (containerTags.has(node.tagName)) {\n return \"empty-container-placeholder\";\n }\n return null;\n}\n\n/**\n * Convert a template string to a displayable expression for edit mode. Replaces ${expr} with ❮ expr\n * ❯ so the runtime renders it as literal text.\n *\n * @param {string} str\n */\nexport function templateToEditDisplay(str: string) {\n return str.replaceAll(/\\$\\{([^}]+)\\}/g, \"\\u276A $1 \\u276B\");\n}\n\n/**\n * Reverse templateToEditDisplay: walk all text nodes in `el` and replace ❪ expr ❫ back to ${expr}\n * so the user edits raw template syntax.\n *\n * @param {HTMLElement} el\n */\nexport function restoreTemplateExpressions(el: HTMLElement) {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n while (walker.nextNode()) {\n const node = walker.currentNode as Text;\n if (node.data.includes(\"\\u276A\")) {\n node.data = node.data.replaceAll(/\\u276A\\s*(.*?)\\s*\\u276B/g, \"${$1}\");\n }\n }\n}\n\n/**\n * Build the edit-mode visual for a mapped array: a `<div class=\"repeater-perimeter\">` wrapping a\n * single prepared instance of the map template. Always one element (an empty perimeter when the\n * template is missing) so the array keeps a 1:1 DOM node at its sibling index. The perimeter is an\n * edit-only device — it is never compiled or rendered in preview.\n *\n * @param {JxMutableNode} arrayObj\n * @returns {Record<string, unknown>}\n */\nfunction arrayToPerimeter(arrayObj: JxMutableNode): Record<string, unknown> {\n const template = arrayObj.map;\n return {\n children:\n template && typeof template === \"object\"\n ? [prepareForEditMode(template as JxMutableNode)]\n : [],\n className: \"repeater-perimeter\",\n tagName: \"div\",\n };\n}\n\n/**\n * Prepare a document for edit-mode rendering. Replaces template strings with readable literal text,\n * $prototype:Array with placeholders, and $ref bindings with display labels. Preserves state so the\n * runtime can still initialise scope.\n *\n * @param {JxMutableNode} node\n * @returns {JxMutableNode}\n */\nexport function prepareForEditMode(node: JxMutableNode): JxMutableNode {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n if (Array.isArray(node)) {\n // Arrays of nodes round-trip element-wise; the array itself is not a node.\n return (node as JxMutableNode[]).map((n) => prepareForEditMode(n)) as unknown as JxMutableNode;\n }\n\n // A mapped-array node itself → its edit-mode perimeter (e.g. when the patcher re-renders an\n // Array node directly). Members inside a children array funnel here via the children branch.\n if ((node as Record<string, unknown>).$prototype === \"Array\") {\n return arrayToPerimeter(node) as unknown as JxMutableNode;\n }\n\n const /** @type {Record<string, unknown>} */ obj = node as Record<string, unknown>;\n\n const out: Record<string, unknown> = {};\n let needsMediaPlaceholder = false;\n const isMediaElement = mediaTags.has((obj.tagName as string) || \"\");\n\n // Check if this media element lacks a resolvable src (top-level or in attributes)\n if (isMediaElement) {\n const attrs = obj.attributes as Record<string, unknown> | undefined;\n const topSrc = obj.src;\n const attrSrc = attrs?.src;\n const topPoster = obj.poster;\n const attrPoster = attrs?.poster;\n const hasSrc = (topSrc && topSrc !== \"\") || (attrSrc && attrSrc !== \"\");\n const hasPoster = (topPoster && topPoster !== \"\") || (attrPoster && attrPoster !== \"\");\n if (!hasSrc && !hasPoster) {\n needsMediaPlaceholder = true;\n }\n }\n\n for (const [k, v] of Object.entries(obj)) {\n if (k === \"state\" || k === \"$media\" || k === \"$elements\") {\n out[k] = v; // Preserve as-is for runtime resolution\n } else if (k === \"$props\" && v && typeof v === \"object\") {\n // Process $props values: convert template strings to display format\n const propsOut: Record<string, unknown> = {};\n for (const [pk, pv] of Object.entries(v)) {\n if (typeof pv === \"string\" && pv.includes(\"${\")) {\n // Image-like prop → neutral placeholder (the component renders it as an <img src>); link\n // Targets → inert \"\"; everything else → the readable ❪ expr ❫ binding text.\n if (isImageUrlKey(pk)) {\n propsOut[pk] = PLACEHOLDER_IMG;\n } else if (pk === \"href\" || pk === \"action\") {\n propsOut[pk] = \"\";\n } else {\n propsOut[pk] = templateToEditDisplay(pv);\n }\n } else if (pv && typeof pv === \"object\" && (pv as Record<string, unknown>).$ref) {\n const ref = (pv as Record<string, unknown>).$ref as string;\n const label = ref.startsWith(\"#/state/\") ? ref.slice(8) : ref;\n propsOut[pk] = `{${label}}`;\n } else {\n propsOut[pk] = pv;\n }\n }\n out[k] = propsOut;\n } else if (k === \"children\") {\n if (Array.isArray(v)) {\n // Each member recurses; array pseudo-elements become a single repeater-perimeter element\n // (via the top-level array case) so they stay a 1:1 DOM node among their siblings.\n out.children = v.map((c) => prepareForEditMode(c as JxMutableNode));\n } else if (\n v &&\n typeof v === \"object\" &&\n (v as Record<string, unknown>).$prototype === \"Array\"\n ) {\n // Legacy whole-children repeater → a single perimeter as the sole child.\n out.children = [prepareForEditMode(v as JxMutableNode)];\n } else {\n out.children = prepareForEditMode(v as JxMutableNode);\n }\n } else if (k === \"cases\" && obj.$switch && v && typeof v === \"object\") {\n // Replace $switch cases with a placeholder showing the first case or a label\n const caseKeys = Object.keys(v);\n if (caseKeys.length > 0) {\n const firstCase = (v as Record<string, unknown>)[caseKeys[0]!];\n out.children =\n firstCase && typeof firstCase === \"object\" && !(firstCase as Record<string, unknown>).$ref\n ? [prepareForEditMode(firstCase as JxMutableNode)]\n : [\n {\n style: {\n background: \"color-mix(in srgb, var(--danger) 8%, transparent)\",\n border: \"1px dashed color-mix(in srgb, var(--danger) 40%, transparent)\",\n borderRadius: \"4px\",\n color: \"var(--danger)\",\n fontFamily: \"'JetBrains Mono', 'SF Mono', 'Fira Code', monospace\",\n fontSize: \"11px\",\n fontStyle: \"italic\",\n padding: \"6px 10px\",\n },\n tagName: \"div\",\n textContent: `[$switch: ${caseKeys.join(\" | \")}]`,\n },\n ];\n }\n } else if (k === \"attributes\" && isMediaElement && v && typeof v === \"object\") {\n // Process attributes for media elements: replace src/poster with transparent pixel\n const attrs = v as Record<string, unknown>;\n const processed: Record<string, unknown> = {};\n for (const [ak, av] of Object.entries(attrs)) {\n if (ak === \"src\" || ak === \"poster\") {\n if (typeof av === \"string\" && av !== \"\" && !av.includes(\"${\")) {\n processed[ak] = av;\n } else {\n needsMediaPlaceholder = true;\n processed[ak] = TRANSPARENT_PX;\n }\n } else if (typeof av === \"string\" && av.includes(\"${\")) {\n const isUrlAttr = ak === \"href\" || ak === \"action\";\n processed[ak] = isUrlAttr ? \"\" : templateToEditDisplay(av);\n } else if (av && typeof av === \"object\" && (av as Record<string, unknown>).$ref) {\n const ref = (av as Record<string, unknown>).$ref as string;\n const label = ref.startsWith(\"#/state/\") ? ref.slice(8) : ref;\n processed[ak] = `{${label}}`;\n } else {\n processed[ak] = av;\n }\n }\n out.attributes = processed;\n } else if (k === \"style\") {\n // Replace template strings in style values with empty strings\n if (v && typeof v === \"object\") {\n const s: Record<string, unknown> = {};\n for (const [sk, sv] of Object.entries(v)) {\n s[sk] = typeof sv === \"string\" && sv.includes(\"${\") ? \"\" : sv;\n }\n out.style = s;\n } else {\n out.style = v;\n }\n } else if (typeof v === \"string\" && v.includes(\"${\")) {\n // Template string in a display property → show raw expression\n const isMediaSrc =\n (k === \"src\" || k === \"poster\") && mediaTags.has((obj.tagName as string) || \"\");\n if (isMediaSrc) {\n needsMediaPlaceholder = true;\n out[k] = TRANSPARENT_PX;\n } else {\n const isUrlAttr = k === \"src\" || k === \"href\" || k === \"poster\" || k === \"action\";\n out[k] = isUrlAttr ? \"\" : templateToEditDisplay(v);\n }\n } else if (v && typeof v === \"object\" && (v as Record<string, unknown>).$ref) {\n // $ref binding → show ref path as literal text\n const ref = (v as Record<string, unknown>).$ref as string;\n const label = ref.startsWith(\"#/state/\") ? ref.slice(8) : ref;\n const isMediaSrc =\n (k === \"src\" || k === \"poster\") && mediaTags.has((obj.tagName as string) || \"\");\n if (isMediaSrc) {\n needsMediaPlaceholder = true;\n out[k] = TRANSPARENT_PX;\n } else {\n out[k] = `{${label}}`;\n }\n } else {\n // Empty src/poster on media elements → use transparent pixel placeholder\n if (\n (k === \"src\" || k === \"poster\") &&\n v === \"\" &&\n mediaTags.has((obj.tagName as string) || \"\")\n ) {\n needsMediaPlaceholder = true;\n out[k] = TRANSPARENT_PX;\n } else {\n out[k] = prepareForEditMode(v as JxMutableNode);\n }\n }\n }\n\n // Mark empty elements with placeholder classes for design-mode visibility\n const placeholderClass = computeEmptyPlaceholderClass(out as JxMutableNode);\n if (placeholderClass) {\n out.className = out.className ? `${out.className} ${placeholderClass}` : placeholderClass;\n }\n\n // Media elements with missing/dynamic src get a placeholder class\n if (needsMediaPlaceholder) {\n const cls = (out.className as string) || \"\";\n if (!cls.includes(\"empty-media-placeholder\")) {\n out.className = cls ? `${cls} empty-media-placeholder` : \"empty-media-placeholder\";\n }\n }\n\n return out;\n}\n",
22
- "/// <reference lib=\"dom\" />\n/**\n * In-iframe inline editing — runs the contenteditable session INSIDE the canvas iframe (Selection /\n * Range / execCommand are per-realm singletons bound to their document, so the editing must happen\n * where the edited DOM lives) and posts the serializable results to the parent, which applies them\n * via transactDoc. Double-click enters editing; the parent posts `enterEdit` to re-enter on the new\n * element after a split/insert re-renders.\n *\n * Phase 4b-2 adds the format-toolbar bridge: the iframe owns the Selection and posts a serializable\n * `selectionChanged` snapshot (active tags + caret rect + link state + seq); the parent toolbar\n * renders pressed-state/position from it and posts `applyFormat` intents back, which this module\n * applies to the iframe's cached range. The parent NEVER reads the iframe DOM/Selection.\n *\n * NOTE ON REALM ISOLATION (unit tests can't prove it): the session engine (`inline-edit.ts` +\n * `inline-format.ts`) and `inline-link.ts` are bundled into the iframe and use ambient\n * `window`/`document`, so at runtime `window === iframe.contentWindow`. Under happy-dom there is\n * one shared global, so the cross-realm focus/Selection behavior (a parent-toolbar click blurring\n * the iframe; CSS Custom Highlight painting) is STRUCTURAL, verified by CDP — not by this unit\n * suite.\n */\n\nimport {\n getActiveElement,\n isEditableBlock,\n isEditing,\n isSlashActive,\n resumeBlurClose,\n startEditing,\n stopEditing,\n suspendBlurClose,\n} from \"../editor/inline-edit\";\nimport { isTagActiveInSelection, toggleInlineFormat } from \"../editor/inline-format\";\nimport { applyLink, insertTemplateToken, linkStateForSelection } from \"../editor/inline-link\";\nimport { restoreTemplateExpressions } from \"../utils/edit-display\";\nimport { rectOfRange } from \"../utils/geometry\";\nimport { parseJxPath, serializeJxPath } from \"./path-mapping\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type {\n ApplyFormatIntent,\n IframeToParent,\n ParentToIframe,\n SelectionSnapshot,\n SerializableRect,\n} from \"./iframe-protocol\";\nimport type { JxPath } from \"../state\";\n\n/** Toolbar command → inline tag (mirrors the parent's old `cmdToTag`, now iframe-side). */\nconst CMD_TO_TAG: Record<string, string> = {\n bold: \"strong\",\n code: \"code\",\n italic: \"em\",\n strikethrough: \"del\",\n subscript: \"sub\",\n superscript: \"sup\",\n underline: \"u\",\n};\n\n/** Inline tags whose active state the snapshot reports (everything except `a`, handled via link). */\nconst ACTIVE_TAG_PROBES = [\"strong\", \"em\", \"u\", \"del\", \"sub\", \"sup\", \"code\"];\n\n/** CSS Custom Highlight name + the id of the injected `::highlight()` style rule. */\nconst HIGHLIGHT_NAME = \"jx-pending-format\";\nconst HIGHLIGHT_STYLE_ID = \"jx-pending-format-style\";\n\n/** Walk up from an event target to the nearest editable element carrying a `data-jx-path`. */\nfunction findEditableTarget(target: EventTarget | null): { el: HTMLElement; path: JxPath } | null {\n let el = target instanceof Element ? target : null;\n while (el) {\n if (el instanceof HTMLElement && el.dataset.jxPath && isEditableBlock(el)) {\n return { el, path: parseJxPath(el.dataset.jxPath) };\n }\n el = el.parentElement;\n }\n return null;\n}\n\n/** Locate the rendered element for a document path via its stamped `data-jx-path`. */\nfunction elementForPath(container: HTMLElement, path: JxPath): HTMLElement | null {\n const serialized = serializeJxPath(path);\n const esc = serialized.replaceAll(\"\\\\\", String.raw`\\\\`).replaceAll(\"'\", String.raw`\\'`);\n const el = container.querySelector(`[data-jx-path='${esc}']`);\n return el instanceof HTMLElement ? el : null;\n}\n\n/** A DOMRect → the serializable rect shape the snapshot carries (iframe-viewport coords). */\nfunction toSerializableRect(rect: DOMRect): SerializableRect {\n return { height: rect.height, width: rect.width, x: rect.x, y: rect.y };\n}\n\n/**\n * Wire double-click → inline editing on `container`'s editable elements, the parent `enterEdit`\n * re-entry, the selection-snapshot post stream, and the `applyFormat` apply path. The session's\n * onCommit/onSplit/onInsert/onEnd results are posted to the parent. Returns a teardown function.\n */\nexport function startIframeInlineEdit(\n channel: IframeChannel<IframeToParent, ParentToIframe>,\n container: HTMLElement,\n opts?: { getMode?: () => string },\n): () => void {\n const doc = container.ownerDocument;\n\n // Inline editing exists only in design/edit renders — a stylebook (or preview) render must not\n // Start a contenteditable session on its nodes. An absent getMode is permissive (tests).\n const editingAllowed = () => {\n const mode = opts?.getMode?.();\n return mode === undefined || mode === \"design\" || mode === \"edit\";\n };\n\n // The most recent non-empty range inside the active editable. Cached AGGRESSIVELY (not just on\n // Selectionchange) because focus can collapse the live selection before the post-blur event runs.\n let lastNonEmptyRange: Range | null = null;\n // Monotonic per session; the parent drops stale snapshots.\n let seq = 0;\n\n /** The live selection's first range, if it sits inside the active editable. */\n const liveRangeInEditable = (el: HTMLElement): Range | null => {\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return null;\n }\n const range = sel.getRangeAt(0);\n return el.contains(range.commonAncestorContainer) ? range : null;\n };\n\n /** Cache the live range when it's non-empty and inside the active editable. */\n const cacheRange = () => {\n const el = getActiveElement();\n if (!el) {\n return;\n }\n const range = liveRangeInEditable(el);\n if (range && !range.collapsed) {\n lastNonEmptyRange = range.cloneRange();\n }\n };\n\n /**\n * Inject the `::highlight()` rule once so the cached range is visible while the toolbar has\n * focus.\n */\n const ensureHighlightStyle = () => {\n if (doc.querySelector(`#${HIGHLIGHT_STYLE_ID}`)) {\n return;\n }\n const style = doc.createElement(\"style\");\n style.id = HIGHLIGHT_STYLE_ID;\n style.textContent = `::highlight(${HIGHLIGHT_NAME}) { background-color: Highlight; color: HighlightText; }`;\n doc.head.append(style);\n };\n\n /**\n * Paint (or clear) the cached range via the CSS Custom Highlight API so the selection stays\n * visible while the parent link-URL field is focused. Feature-detected: happy-dom lacks\n * `Highlight`/`CSS.highlights`, so this is a silent no-op there (and in non-Chromium engines).\n */\n const updateHighlight = () => {\n const HighlightCtor = (globalThis as { Highlight?: unknown }).Highlight as\n | (new (range: Range) => unknown)\n | undefined;\n const highlights = (globalThis.CSS as unknown as { highlights?: Map<string, unknown> })\n ?.highlights;\n if (!HighlightCtor || !highlights) {\n return;\n }\n if (lastNonEmptyRange && lastNonEmptyRange.startContainer.isConnected) {\n ensureHighlightStyle();\n highlights.set(HIGHLIGHT_NAME, new HighlightCtor(lastNonEmptyRange.cloneRange()));\n } else {\n highlights.delete(HIGHLIGHT_NAME);\n }\n };\n\n /** Tear down the Custom Highlight (on teardown / real editEnd). */\n const clearHighlight = () => {\n const highlights = (globalThis.CSS as unknown as { highlights?: Map<string, unknown> })\n ?.highlights;\n highlights?.delete(HIGHLIGHT_NAME);\n };\n\n /**\n * Build the serializable selection snapshot from the live selection (falling back to the cached\n * range for geometry when the live one collapsed). Returns null when no session is active.\n */\n const buildSnapshot = (): SelectionSnapshot | null => {\n const el = getActiveElement();\n if (!el || !el.dataset.jxPath) {\n return null;\n }\n const liveRange = liveRangeInEditable(el);\n const geomRange = liveRange ?? lastNonEmptyRange;\n const rect = geomRange ? toSerializableRect(rectOfRange(geomRange)) : null;\n const collapsed = liveRange ? liveRange.collapsed : true;\n\n const activeTags = ACTIVE_TAG_PROBES.filter((tag) => isTagActiveInSelection(tag, el));\n const link = linkStateForSelection(el);\n if (link.active) {\n activeTags.push(\"a\");\n }\n\n seq += 1;\n return {\n activeTags,\n collapsed,\n kind: \"selectionChanged\",\n link,\n localScope: null,\n path: parseJxPath(el.dataset.jxPath),\n rect,\n seq,\n };\n };\n\n /** Recompute + post a snapshot (and repaint the highlight) when a session is live. */\n const onSelectionChange = () => {\n if (!isEditing()) {\n return;\n }\n // Cache the (possibly just-changed) live range BEFORE painting/snapshotting so the highlight and\n // The snapshot reflect the current selection — selectionchange is one of the aggressive triggers.\n cacheRange();\n updateHighlight();\n const snapshot = buildSnapshot();\n if (snapshot) {\n channel.post(snapshot);\n }\n };\n\n const enterEditAt = (el: HTMLElement, path: JxPath) => {\n // Show raw `${expr}` syntax for editing (the render displays it as ❪ expr ❫).\n restoreTemplateExpressions(el);\n channel.post({ kind: \"editStart\", path });\n // While the session is live the parent toolbar/popover may take focus — a blur must not tear\n // The session down across the bridge (focus-loss BLOCKER fix).\n suspendBlurClose();\n startEditing(el, path, {\n onCommit: (p, children, textContent) =>\n channel.post({ children, kind: \"editCommit\", path: p, textContent }),\n onEnd: () => {\n // A real session end: stop suspending blur-close and drop the selection viz.\n resumeBlurClose();\n clearHighlight();\n lastNonEmptyRange = null;\n channel.post({ kind: \"editEnd\" });\n },\n onInsert: (p, cmd, commitData) =>\n channel.post({ cmd, commitData, kind: \"editInsert\", path: p }),\n onSplit: (p, before, after) => channel.post({ after, before, kind: \"editSplit\", path: p }),\n });\n // Post an initial (collapsed-caret) snapshot so the toolbar shows on entry.\n cacheRange();\n onSelectionChange();\n };\n\n /** Apply a format/link/insert intent to the iframe's cached selection range. */\n const applyFormatIntent = (intent: ApplyFormatIntent) => {\n const el = getActiveElement();\n if (!el) {\n return; // Session not active → no-op.\n }\n // Restore the cached range ONLY if it's still usable (the DOM may have re-rendered).\n if (\n lastNonEmptyRange &&\n lastNonEmptyRange.startContainer.isConnected &&\n el.contains(lastNonEmptyRange.commonAncestorContainer)\n ) {\n const sel = window.getSelection();\n el.focus();\n sel?.removeAllRanges();\n sel?.addRange(lastNonEmptyRange);\n }\n\n if (intent.command === \"link\") {\n applyLink(el, intent.href);\n } else if (intent.command === \"insertData\") {\n insertTemplateToken(el, intent.token);\n } else {\n const tag = CMD_TO_TAG[intent.command];\n if (tag) {\n toggleInlineFormat(tag, el);\n }\n }\n\n // Re-emit so the parent's pressed-state/position updates. The parent guards re-render of an\n // OPEN link popover (so this won't yank a mid-edit URL field).\n cacheRange();\n onSelectionChange();\n };\n\n const onDblClick = (e: Event) => {\n if (!editingAllowed()) {\n return;\n }\n const hit = findEditableTarget(e.target);\n if (hit) {\n enterEditAt(hit.el, hit.path);\n }\n };\n\n const onMouseUp = () => cacheRange();\n const onKeyUp = () => cacheRange();\n // Capture-phase blur: cache the range before focus moves out (the bubbling blur fires too late).\n const onBlurCapture = () => cacheRange();\n\n /**\n * Commit-on-click-away: a pointerdown INSIDE the iframe but OUTSIDE the active editable ends the\n * session (committing via the engine's stopEditing → onCommit). Blur-close stays suspended for\n * the whole session (a parent-toolbar click across the bridge must not kill it), so without this\n * an in-canvas click-away would never commit — text edits would never reach the document.\n */\n const onPointerDownCapture = (e: Event) => {\n if (!isEditing() || isSlashActive()) {\n return;\n }\n const el = getActiveElement();\n if (el && e.target instanceof Node && !el.contains(e.target)) {\n stopEditing();\n }\n };\n\n doc.addEventListener(\"dblclick\", onDblClick, true);\n doc.addEventListener(\"selectionchange\", onSelectionChange);\n doc.addEventListener(\"mouseup\", onMouseUp, true);\n doc.addEventListener(\"keyup\", onKeyUp, true);\n doc.addEventListener(\"blur\", onBlurCapture, true);\n doc.addEventListener(\"pointerdown\", onPointerDownCapture, true);\n\n const off = channel.onMessage((msg) => {\n if (msg.kind === \"applyFormat\") {\n applyFormatIntent(msg.intent);\n return;\n }\n if (msg.kind === \"endEdit\") {\n // The parent detected intent leaving the edit surface in ITS realm (tab switch, chrome click\n // Outside the edit toolbars) — commit and end, a no-op when no session is live.\n if (isEditing()) {\n stopEditing();\n }\n return;\n }\n if (msg.kind !== \"enterEdit\") {\n return;\n }\n if (!editingAllowed()) {\n return;\n }\n const el = elementForPath(container, msg.path);\n if (el && isEditableBlock(el)) {\n enterEditAt(el, msg.path);\n }\n });\n\n return () => {\n doc.removeEventListener(\"dblclick\", onDblClick, true);\n doc.removeEventListener(\"selectionchange\", onSelectionChange);\n doc.removeEventListener(\"mouseup\", onMouseUp, true);\n doc.removeEventListener(\"keyup\", onKeyUp, true);\n doc.removeEventListener(\"blur\", onBlurCapture, true);\n doc.removeEventListener(\"pointerdown\", onPointerDownCapture, true);\n off();\n clearHighlight();\n lastNonEmptyRange = null;\n resumeBlurClose();\n if (isEditing()) {\n stopEditing();\n }\n };\n}\n",
23
+ "/// <reference lib=\"dom\" />\n/**\n * In-iframe inline editing — runs the contenteditable session INSIDE the canvas iframe (Selection /\n * Range / execCommand are per-realm singletons bound to their document, so the editing must happen\n * where the edited DOM lives) and posts the serializable results to the parent, which applies them\n * via transactDoc. Double-click enters editing; the parent posts `enterEdit` to re-enter on the new\n * element after a split/insert re-renders.\n *\n * Phase 4b-2 adds the format-toolbar bridge: the iframe owns the Selection and posts a serializable\n * `selectionChanged` snapshot (active tags + caret rect + link state + seq); the parent toolbar\n * renders pressed-state/position from it and posts `applyFormat` intents back, which this module\n * applies to the iframe's cached range. The parent NEVER reads the iframe DOM/Selection.\n *\n * NOTE ON REALM ISOLATION (unit tests can't prove it): the session engine (`inline-edit.ts` +\n * `inline-format.ts`) and `inline-link.ts` are bundled into the iframe and use ambient\n * `window`/`document`, so at runtime `window === iframe.contentWindow`. Under happy-dom there is\n * one shared global, so the cross-realm focus/Selection behavior (a parent-toolbar click blurring\n * the iframe; CSS Custom Highlight painting) is STRUCTURAL, verified by CDP — not by this unit\n * suite.\n */\n\nimport {\n getActiveElement,\n isEditableBlock,\n isEditing,\n isSlashActive,\n resumeBlurClose,\n startEditing,\n stopEditing,\n suspendBlurClose,\n} from \"../editor/inline-edit\";\nimport { isTagActiveInSelection, toggleInlineFormat } from \"../editor/inline-format\";\nimport { applyLink, insertTemplateToken, linkStateForSelection } from \"../editor/inline-link\";\nimport { restoreTemplateExpressions } from \"../utils/edit-display\";\nimport { rectOfRange } from \"../utils/geometry\";\nimport { getNodeAtPath } from \"../state\";\nimport { parseJxPath, serializeJxPath } from \"./path-mapping\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type {\n ApplyFormatIntent,\n IframeToParent,\n ParentToIframe,\n SelectionSnapshot,\n SerializableRect,\n} from \"./iframe-protocol\";\nimport type { JxPath } from \"../state\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\n/** Toolbar command → inline tag (mirrors the parent's old `cmdToTag`, now iframe-side). */\nconst CMD_TO_TAG: Record<string, string> = {\n bold: \"strong\",\n code: \"code\",\n italic: \"em\",\n strikethrough: \"del\",\n subscript: \"sub\",\n superscript: \"sup\",\n underline: \"u\",\n};\n\n/** Inline tags whose active state the snapshot reports (everything except `a`, handled via link). */\nconst ACTIVE_TAG_PROBES = [\"strong\", \"em\", \"u\", \"del\", \"sub\", \"sup\", \"code\"];\n\n/** CSS Custom Highlight name + the id of the injected `::highlight()` style rule. */\nconst HIGHLIGHT_NAME = \"jx-pending-format\";\nconst HIGHLIGHT_STYLE_ID = \"jx-pending-format-style\";\n\n/** Walk up from an event target to the nearest editable element carrying a `data-jx-path`. */\nfunction findEditableTarget(target: EventTarget | null): { el: HTMLElement; path: JxPath } | null {\n let el = target instanceof Element ? target : null;\n while (el) {\n if (el instanceof HTMLElement && el.dataset.jxPath && isEditableBlock(el)) {\n return { el, path: parseJxPath(el.dataset.jxPath) };\n }\n el = el.parentElement;\n }\n return null;\n}\n\n/**\n * Walk up from an event target to the nearest element carrying `data-jx-bound-prop` (a component-\n * internal element whose text is an invertible prop binding — stamped by the runtime, see\n * setStampPropBindings). Component internals are unstamped, so hitting a `data-jx-path` element\n * first means the target sits in page-level DOM (or slotted content) — not a prop-bound target.\n */\nfunction findPropBoundTarget(target: EventTarget | null): { el: HTMLElement; prop: string } | null {\n let el = target instanceof Element ? target : null;\n while (el) {\n if (el instanceof HTMLElement) {\n if (el.dataset.jxBoundProp) {\n return { el, prop: el.dataset.jxBoundProp };\n }\n if (el.dataset.jxPath) {\n return null;\n }\n }\n el = el.parentElement;\n }\n return null;\n}\n\n/**\n * The instance that owns a prop-bound element: its nearest custom-element ancestor (that element's\n * connectedCallback rendered the marker with its state, so the walk can never skip the owner).\n */\nfunction ownerInstanceOf(el: HTMLElement): HTMLElement | null {\n let cur = el.parentElement;\n while (cur) {\n if (cur.tagName.includes(\"-\")) {\n return cur;\n }\n cur = cur.parentElement;\n }\n return null;\n}\n\n/** Locate the rendered element for a document path via its stamped `data-jx-path`. */\nfunction elementForPath(container: HTMLElement, path: JxPath): HTMLElement | null {\n const serialized = serializeJxPath(path);\n const esc = serialized.replaceAll(\"\\\\\", String.raw`\\\\`).replaceAll(\"'\", String.raw`\\'`);\n const el = container.querySelector(`[data-jx-path='${esc}']`);\n return el instanceof HTMLElement ? el : null;\n}\n\n/** A DOMRect → the serializable rect shape the snapshot carries (iframe-viewport coords). */\nfunction toSerializableRect(rect: DOMRect): SerializableRect {\n return { height: rect.height, width: rect.width, x: rect.x, y: rect.y };\n}\n\n/**\n * Wire double-click → inline editing on `container`'s editable elements, the parent `enterEdit`\n * re-entry, the selection-snapshot post stream, and the `applyFormat` apply path. The session's\n * onCommit/onSplit/onInsert/onEnd results are posted to the parent. Returns a teardown function.\n */\nexport function startIframeInlineEdit(\n channel: IframeChannel<IframeToParent, ParentToIframe>,\n container: HTMLElement,\n opts?: { getMode?: () => string; getShadowDoc?: () => JxMutableNode | null },\n): () => void {\n const doc = container.ownerDocument;\n\n // Inline editing exists only in design/edit renders — a stylebook (or preview) render must not\n // Start a contenteditable session on its nodes. An absent getMode is permissive (tests).\n const editingAllowed = () => {\n const mode = opts?.getMode?.();\n return mode === undefined || mode === \"design\" || mode === \"edit\";\n };\n\n // The most recent non-empty range inside the active editable. Cached AGGRESSIVELY (not just on\n // Selectionchange) because focus can collapse the live selection before the post-blur event runs.\n let lastNonEmptyRange: Range | null = null;\n // Monotonic per session; the parent drops stale snapshots.\n let seq = 0;\n\n /** The live selection's first range, if it sits inside the active editable. */\n const liveRangeInEditable = (el: HTMLElement): Range | null => {\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n return null;\n }\n const range = sel.getRangeAt(0);\n return el.contains(range.commonAncestorContainer) ? range : null;\n };\n\n /** Cache the live range when it's non-empty and inside the active editable. */\n const cacheRange = () => {\n const el = getActiveElement();\n if (!el) {\n return;\n }\n const range = liveRangeInEditable(el);\n if (range && !range.collapsed) {\n lastNonEmptyRange = range.cloneRange();\n }\n };\n\n /**\n * Inject the `::highlight()` rule once so the cached range is visible while the toolbar has\n * focus.\n */\n const ensureHighlightStyle = () => {\n if (doc.querySelector(`#${HIGHLIGHT_STYLE_ID}`)) {\n return;\n }\n const style = doc.createElement(\"style\");\n style.id = HIGHLIGHT_STYLE_ID;\n style.textContent = `::highlight(${HIGHLIGHT_NAME}) { background-color: Highlight; color: HighlightText; }`;\n doc.head.append(style);\n };\n\n /**\n * Paint (or clear) the cached range via the CSS Custom Highlight API so the selection stays\n * visible while the parent link-URL field is focused. Feature-detected: happy-dom lacks\n * `Highlight`/`CSS.highlights`, so this is a silent no-op there (and in non-Chromium engines).\n */\n const updateHighlight = () => {\n const HighlightCtor = (globalThis as { Highlight?: unknown }).Highlight as\n | (new (range: Range) => unknown)\n | undefined;\n const highlights = (globalThis.CSS as unknown as { highlights?: Map<string, unknown> })\n ?.highlights;\n if (!HighlightCtor || !highlights) {\n return;\n }\n if (lastNonEmptyRange && lastNonEmptyRange.startContainer.isConnected) {\n ensureHighlightStyle();\n highlights.set(HIGHLIGHT_NAME, new HighlightCtor(lastNonEmptyRange.cloneRange()));\n } else {\n highlights.delete(HIGHLIGHT_NAME);\n }\n };\n\n /** Tear down the Custom Highlight (on teardown / real editEnd). */\n const clearHighlight = () => {\n const highlights = (globalThis.CSS as unknown as { highlights?: Map<string, unknown> })\n ?.highlights;\n highlights?.delete(HIGHLIGHT_NAME);\n };\n\n /**\n * Build the serializable selection snapshot from the live selection (falling back to the cached\n * range for geometry when the live one collapsed). Returns null when no session is active.\n */\n const buildSnapshot = (): SelectionSnapshot | null => {\n const el = getActiveElement();\n if (!el || !el.dataset.jxPath) {\n return null;\n }\n const liveRange = liveRangeInEditable(el);\n const geomRange = liveRange ?? lastNonEmptyRange;\n const rect = geomRange ? toSerializableRect(rectOfRange(geomRange)) : null;\n const collapsed = liveRange ? liveRange.collapsed : true;\n\n const activeTags = ACTIVE_TAG_PROBES.filter((tag) => isTagActiveInSelection(tag, el));\n const link = linkStateForSelection(el);\n if (link.active) {\n activeTags.push(\"a\");\n }\n\n seq += 1;\n return {\n activeTags,\n collapsed,\n kind: \"selectionChanged\",\n link,\n localScope: null,\n path: parseJxPath(el.dataset.jxPath),\n rect,\n seq,\n };\n };\n\n /** Recompute + post a snapshot (and repaint the highlight) when a session is live. */\n const onSelectionChange = () => {\n if (!isEditing()) {\n return;\n }\n // Cache the (possibly just-changed) live range BEFORE painting/snapshotting so the highlight and\n // The snapshot reflect the current selection — selectionchange is one of the aggressive triggers.\n cacheRange();\n updateHighlight();\n const snapshot = buildSnapshot();\n if (snapshot) {\n channel.post(snapshot);\n }\n };\n\n const enterEditAt = (el: HTMLElement, path: JxPath) => {\n // Show raw `${expr}` syntax for editing (the render displays it as ❪ expr ❫).\n restoreTemplateExpressions(el);\n channel.post({ kind: \"editStart\", path });\n // While the session is live the parent toolbar/popover may take focus — a blur must not tear\n // The session down across the bridge (focus-loss BLOCKER fix).\n suspendBlurClose();\n startEditing(el, path, {\n onCommit: (p, children, textContent) =>\n channel.post({ children, kind: \"editCommit\", path: p, textContent }),\n onEnd: () => {\n // A real session end: stop suspending blur-close and drop the selection viz.\n resumeBlurClose();\n clearHighlight();\n lastNonEmptyRange = null;\n channel.post({ kind: \"editEnd\" });\n },\n onInsert: (p, cmd, commitData) =>\n channel.post({ cmd, commitData, kind: \"editInsert\", path: p }),\n onSplit: (p, before, after) => channel.post({ after, before, kind: \"editSplit\", path: p }),\n });\n // Post an initial (collapsed-caret) snapshot so the toolbar shows on entry.\n cacheRange();\n onSelectionChange();\n };\n\n /**\n * Whether the instance's RAW `$props[prop]` value (from the pre-edit-display shadow doc) is\n * plain-text editable. Template-valued (`\"${...}\"`) and `$ref`-valued props render display sugar,\n * not the value — committing typed text would silently destroy the binding, so they're blocked.\n * An absent getShadowDoc is permissive (tests, same contract as getMode).\n */\n const propEditableAt = (hostPath: JxPath, prop: string): boolean => {\n const shadowDoc = opts?.getShadowDoc?.();\n if (!shadowDoc) {\n return true;\n }\n const node = getNodeAtPath(shadowDoc, hostPath) as JxMutableNode | undefined;\n const raw = (node?.$props as Record<string, unknown> | undefined)?.[prop];\n if (raw == null) {\n return true; // Unset — editing ADDS the prop, overriding the definition default.\n }\n if (typeof raw === \"object\") {\n return false;\n }\n return !(typeof raw === \"string\" && raw.includes(\"${\"));\n };\n\n /**\n * Enter a plain (plaintext-only) session on a prop-bound component-internal element. The session\n * path is the INSTANCE path — the marker element has no path of its own, and an external `$props`\n * patch at the host path must disturb (commit + end) this session before detaching its element.\n */\n const enterPropEditAt = (el: HTMLElement, hostPath: JxPath, prop: string) => {\n channel.post({ kind: \"editStart\", path: hostPath, prop });\n suspendBlurClose();\n startEditing(\n el,\n hostPath,\n {\n onCommit: (p, _children, textContent) =>\n channel.post({ kind: \"editCommitProp\", path: p, prop, value: textContent ?? \"\" }),\n onEnd: () => {\n resumeBlurClose();\n clearHighlight();\n lastNonEmptyRange = null;\n channel.post({ kind: \"editEnd\" });\n },\n // Prop values are single plain strings — no split, no slash-insert.\n onInsert: () => {},\n onSplit: () => {},\n },\n { plainText: true },\n );\n };\n\n /** Apply a format/link/insert intent to the iframe's cached selection range. */\n const applyFormatIntent = (intent: ApplyFormatIntent) => {\n const el = getActiveElement();\n if (!el) {\n return; // Session not active → no-op.\n }\n // Restore the cached range ONLY if it's still usable (the DOM may have re-rendered).\n if (\n lastNonEmptyRange &&\n lastNonEmptyRange.startContainer.isConnected &&\n el.contains(lastNonEmptyRange.commonAncestorContainer)\n ) {\n const sel = window.getSelection();\n el.focus();\n sel?.removeAllRanges();\n sel?.addRange(lastNonEmptyRange);\n }\n\n if (intent.command === \"link\") {\n applyLink(el, intent.href);\n } else if (intent.command === \"insertData\") {\n insertTemplateToken(el, intent.token);\n } else {\n const tag = CMD_TO_TAG[intent.command];\n if (tag) {\n toggleInlineFormat(tag, el);\n }\n }\n\n // Re-emit so the parent's pressed-state/position updates. The parent guards re-render of an\n // OPEN link popover (so this won't yank a mid-edit URL field).\n cacheRange();\n onSelectionChange();\n };\n\n const onDblClick = (e: Event) => {\n if (!editingAllowed()) {\n return;\n }\n // Prop-bound targets win: they sit in unstamped component internals, deeper than any editable\n // Page block, and once a marker is hit the event must NOT fall through to rich editing (an\n // Instance nested inside a page-level editable would otherwise rich-edit that whole ancestor).\n const propHit = findPropBoundTarget(e.target);\n if (propHit) {\n const host = ownerInstanceOf(propHit.el);\n const hostPathRaw = host?.dataset.jxPath;\n if (host && hostPathRaw) {\n const hostPath = parseJxPath(hostPathRaw);\n if (propEditableAt(hostPath, propHit.prop)) {\n enterPropEditAt(propHit.el, hostPath, propHit.prop);\n }\n }\n // A path-less host is itself internal to another definition — its $props live in a document\n // Not open in this tab, so there is no write-back target: blocked.\n return;\n }\n const hit = findEditableTarget(e.target);\n if (hit) {\n enterEditAt(hit.el, hit.path);\n }\n };\n\n const onMouseUp = () => cacheRange();\n const onKeyUp = () => cacheRange();\n // Capture-phase blur: cache the range before focus moves out (the bubbling blur fires too late).\n const onBlurCapture = () => cacheRange();\n\n /**\n * Commit-on-click-away: a pointerdown INSIDE the iframe but OUTSIDE the active editable ends the\n * session (committing via the engine's stopEditing → onCommit). Blur-close stays suspended for\n * the whole session (a parent-toolbar click across the bridge must not kill it), so without this\n * an in-canvas click-away would never commit — text edits would never reach the document.\n */\n const onPointerDownCapture = (e: Event) => {\n if (!isEditing() || isSlashActive()) {\n return;\n }\n const el = getActiveElement();\n if (el && e.target instanceof Node && !el.contains(e.target)) {\n stopEditing();\n }\n };\n\n doc.addEventListener(\"dblclick\", onDblClick, true);\n doc.addEventListener(\"selectionchange\", onSelectionChange);\n doc.addEventListener(\"mouseup\", onMouseUp, true);\n doc.addEventListener(\"keyup\", onKeyUp, true);\n doc.addEventListener(\"blur\", onBlurCapture, true);\n doc.addEventListener(\"pointerdown\", onPointerDownCapture, true);\n\n const off = channel.onMessage((msg) => {\n if (msg.kind === \"applyFormat\") {\n applyFormatIntent(msg.intent);\n return;\n }\n if (msg.kind === \"endEdit\") {\n // The parent detected intent leaving the edit surface in ITS realm (tab switch, chrome click\n // Outside the edit toolbars) — commit and end, a no-op when no session is live.\n if (isEditing()) {\n stopEditing();\n }\n return;\n }\n if (msg.kind !== \"enterEdit\") {\n return;\n }\n if (!editingAllowed()) {\n return;\n }\n const el = elementForPath(container, msg.path);\n if (el && isEditableBlock(el)) {\n enterEditAt(el, msg.path);\n }\n });\n\n return () => {\n doc.removeEventListener(\"dblclick\", onDblClick, true);\n doc.removeEventListener(\"selectionchange\", onSelectionChange);\n doc.removeEventListener(\"mouseup\", onMouseUp, true);\n doc.removeEventListener(\"keyup\", onKeyUp, true);\n doc.removeEventListener(\"blur\", onBlurCapture, true);\n doc.removeEventListener(\"pointerdown\", onPointerDownCapture, true);\n off();\n clearHighlight();\n lastNonEmptyRange = null;\n resumeBlurClose();\n if (isEditing()) {\n stopEditing();\n }\n };\n}\n",
23
24
  "/// <reference lib=\"dom\" />\n/**\n * Iframe-realm slash-menu bridge — the inline-edit engine detects \"/\" and drives a DI'd\n * {@link SlashController}; the real lit/Spectrum menu can't render in the slim iframe bundle, so\n * this controller proxies it across the postMessage bridge. It posts `slashShow` (with the edited\n * element's IFRAME-VIEWPORT rect + the typed filter) / `slashDismiss`; the host shows the parent\n * menu and posts back `slashSelect` / `slashDismissed`.\n *\n * While the menu is open, the four navigation keys are intercepted here CAPTURE-PHASE — before the\n * engine's element-level keydown — and posted as `slashNav` for the parent menu's key handler. That\n * restores the legacy \"shared slash menu captures Enter\" contract (the engine's own Enter handler\n * defers when `slash.isOpen()`), and keeps Escape from ending the edit session while the menu is\n * up.\n */\n\nimport { setSlashController } from \"../editor/inline-edit\";\nimport { rectOf } from \"../utils/geometry\";\nimport type { SlashCommand, SlashController } from \"../editor/inline-edit\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type { IframeToParent, ParentToIframe } from \"./iframe-protocol\";\n\ntype SlashNavKey = Extract<IframeToParent, { kind: \"slashNav\" }>[\"key\"];\n\nconst NAV_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"Enter\", \"Escape\"]);\n\n/**\n * Register the bridge SlashController for this iframe realm and wire its keyboard/dismissal\n * listeners. Returns a teardown function (restores a no-op controller).\n */\nexport function startIframeSlashBridge(\n channel: IframeChannel<IframeToParent, ParentToIframe>,\n doc: Document,\n): () => void {\n let open = false;\n // Kept across `slashDismissed`: the parent's select() dismisses the menu BEFORE it fires\n // OnSelect, so a slashSelect legitimately arrives after the dismissal notification.\n let onSelect: ((cmd: SlashCommand) => void) | null = null;\n let lastPostedFilter: string | null = null;\n\n const controller: SlashController = {\n dismiss: () => {\n if (!open) {\n return;\n }\n open = false;\n lastPostedFilter = null;\n channel.post({ kind: \"slashDismiss\" });\n },\n isOpen: () => open,\n show: (anchorEl, filter, cbs) => {\n ({ onSelect } = cbs);\n if (open && filter === lastPostedFilter) {\n return;\n }\n open = true;\n lastPostedFilter = filter;\n const r = rectOf(anchorEl);\n channel.post({\n filter,\n kind: \"slashShow\",\n rect: { height: r.height, width: r.width, x: r.left, y: r.top },\n });\n },\n };\n setSlashController(controller);\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (!open || !NAV_KEYS.has(e.key)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n channel.post({ key: e.key as SlashNavKey, kind: \"slashNav\" });\n };\n const onMouseDown = () => {\n // The parent menu's outside-click listener can't see iframe clicks — any in-iframe press while\n // The menu is open dismisses it (legacy parity: the popover is never inside this document). The\n // Engine's click-away commit is gated on slash.isOpen(), so the dismissal wins and the edit\n // Session survives the click.\n if (open) {\n controller.dismiss();\n }\n };\n doc.addEventListener(\"keydown\", onKeyDown, true);\n doc.addEventListener(\"mousedown\", onMouseDown, true);\n\n const off = channel.onMessage((msg) => {\n if (msg.kind === \"slashSelect\") {\n open = false;\n lastPostedFilter = null;\n onSelect?.({ ...msg.cmd });\n return;\n }\n if (msg.kind === \"slashDismissed\") {\n open = false;\n lastPostedFilter = null;\n }\n });\n\n return () => {\n doc.removeEventListener(\"keydown\", onKeyDown, true);\n doc.removeEventListener(\"mousedown\", onMouseDown, true);\n off();\n setSlashController({\n dismiss: () => {\n // Bridge torn down — no menu in this realm.\n },\n isOpen: () => false,\n show: () => {\n // Bridge torn down — no menu in this realm.\n },\n });\n };\n}\n",
24
25
  "/// <reference lib=\"dom\" />\n/**\n * In-iframe keyboard forwarding. Studio's shortcuts are bound to the EDITOR document, so once focus\n * moves into the canvas iframe (a click selects a node there) undo/redo/save/delete/duplicate/arrow\n * navigation stop firing. This captures the global-shortcut subset inside the iframe, prevents the\n * browser default, and posts a flattened event the parent re-dispatches to its shortcut handler.\n *\n * The subset mirrors `editor/shortcuts.ts`: any Ctrl/Cmd combo, plus the bare editing/navigation\n * keys. Keystrokes while an editable element (input / contenteditable — e.g. a future inline edit)\n * is focused inside the iframe are left alone so typing still works.\n */\n\nimport { cancelIframeDrag, isDragActive } from \"./iframe-drop\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type { IframeToParent, ParentToIframe, SerializedKey } from \"./iframe-protocol\";\n\n/** Bare (non-modifier) keys the editor's shortcut handler acts on. */\nconst BARE_FORWARD_KEYS: ReadonlySet<string> = new Set([\n \"Delete\",\n \"Backspace\",\n \"Escape\",\n \"Enter\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n]);\n\n/** Whether `el` is a text-entry target whose own keystrokes must not be hijacked. */\nfunction isEditableTarget(el: EventTarget | null): boolean {\n if (!(el instanceof HTMLElement)) {\n return false;\n }\n if (el.isContentEditable) {\n return true;\n }\n return el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\";\n}\n\n/** Whether this keydown belongs to the global-shortcut subset the parent handles. */\nexport function shouldForwardKey(e: KeyboardEvent): boolean {\n if (isEditableTarget(e.target)) {\n return false;\n }\n return e.ctrlKey || e.metaKey || BARE_FORWARD_KEYS.has(e.key);\n}\n\n/** Flatten a KeyboardEvent to the structured-cloneable subset the bridge carries. */\nexport function serializeKey(e: KeyboardEvent): SerializedKey {\n return {\n altKey: e.altKey,\n code: e.code,\n ctrlKey: e.ctrlKey,\n key: e.key,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey,\n };\n}\n\n/**\n * Listen for global-shortcut keystrokes on the iframe document, prevent their default, and forward\n * them to the parent. Returns a teardown function.\n */\nexport function startKeyForwarding(\n channel: IframeChannel<IframeToParent, ParentToIframe>,\n doc: Document = document,\n): () => void {\n const onKey = (e: KeyboardEvent) => {\n // Escape during a flow-3 (iframe-originated) drag cancels locally — the iframe owns cancel for\n // That case (single-sourced through iframe-drop), so it must NOT also forward Escape to the\n // Parent (which would tear down via a second path and double-fire).\n if (e.key === \"Escape\" && isDragActive()) {\n e.preventDefault();\n cancelIframeDrag();\n return;\n }\n if (!shouldForwardKey(e)) {\n return;\n }\n e.preventDefault();\n channel.post({ event: serializeKey(e), kind: \"forwardKey\" });\n };\n doc.addEventListener(\"keydown\", onKey, true);\n return () => doc.removeEventListener(\"keydown\", onKey, true);\n}\n",
25
26
  "/**\n * The canonical Jx document-op vocabulary and its pure applier. A `JxDocOp` is a value-carrying,\n * replayable mutation of a plain-JSON Jx document tree, addressed by `JxPath` (alternating\n * \"children\" / index segments for structure, plus node keys). Studio's transaction pipeline records\n * forward/inverse pairs of these for history replay; the collab bridge mirrors them into a shared\n * Y.Doc.\n *\n * This module is deliberately yjs-free and dependency-light: the slim canvas-iframe bundle imports\n * the applier for its non-reactive shadow doc, and it MUST stay byte-identical in behavior to the\n * parent's history replay — both sides import this one implementation.\n */\n\nimport type { JxMutableNode, JxPath } from \"@jxsuite/schema/types\";\n\n/** Value-carrying document mutation, replayable in either direction. */\nexport type JxDocOp =\n /** Set (or delete, when value is undefined) a key on the node at path. */\n | { op: \"set-key\"; path: JxPath; key: string; value?: unknown }\n /** Insert a node at parentPath.children[index]. */\n | { op: \"insert-child\"; parentPath: JxPath; index: number; node: unknown }\n /** Remove parentPath.children[index]. */\n | { op: \"remove-child\"; parentPath: JxPath; index: number }\n /** Replace parentPath.children[index] with node. */\n | { op: \"set-child\"; parentPath: JxPath; index: number; node: unknown }\n /** Raw two-splice move: remove fromParent.children[fromIndex], insert at toParent[toIndex]. */\n | {\n op: \"move-child\";\n fromParentPath: JxPath;\n fromIndex: number;\n toParentPath: JxPath;\n toIndex: number;\n };\n\nexport interface JxDocOpPair {\n forward: JxDocOp;\n inverse: JxDocOp;\n}\n\n/** JSON round-trip clone — also normalizes away reactive proxies / functions / undefined. */\nfunction jsonClone<T>(value: T): T {\n // oxlint-disable-next-line unicorn/prefer-structured-clone -- structuredClone throws on reactive proxies; JSON normalization is the point\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\n/** Deep-clone a recorded value (undefined/null pass through; reactive proxies are read through). */\nexport function cloneValue<T>(v: T): T {\n return v === undefined || v === null ? v : (jsonClone(v as object) as T);\n}\n\n/**\n * Walk a plain document tree by path. Paths address nodes by construction; missing segments and\n * non-node leaves surface as undefined (typed as node for caller ergonomics, matching Studio's\n * historical helper).\n */\nexport function getNodeAtPath(doc: JxMutableNode, path: JxPath): JxMutableNode {\n let node = doc;\n for (const key of path) {\n if (node == null) {\n return undefined as unknown as JxMutableNode;\n }\n node = node[key] as JxMutableNode;\n }\n return node;\n}\n\n/** The node's children array, lazily created; throws if `node` is itself a children array or mapped. */\nexport function childArray(node: JxMutableNode): (JxMutableNode | string)[] {\n // Defense-in-depth: a path that resolves to a children array (rather than a node) would\n // Otherwise get a bogus `.children` property tacked on here, silently storing the insert where\n // Nothing renders. Callers must pass a node; fail loudly if they don't.\n if (Array.isArray(node)) {\n throw new TypeError(\"Cannot insert into a children array; parentPath must point at a node\");\n }\n if (!node.children) {\n node.children = [];\n }\n if (!Array.isArray(node.children)) {\n throw new TypeError(\"Cannot insert into mapped-array children; edit the map template instead\");\n }\n return node.children;\n}\n\n/**\n * Apply a replayable doc op to a bare document tree. Values/nodes are cloned in, so the tree never\n * aliases the op object. Throws (with a machine-readable reason) when a target path is missing.\n */\nexport function applyDocOpToDoc(doc: JxMutableNode, op: JxDocOp): void {\n switch (op.op) {\n case \"set-key\": {\n const node = getNodeAtPath(doc, op.path);\n if (!node) {\n throw new Error(`doc-op-node-not-found:${op.path.join(\"/\")}`);\n }\n const target = node as Record<string, unknown>;\n if (op.value === undefined) {\n delete target[op.key];\n } else {\n target[op.key] = cloneValue(op.value);\n }\n return;\n }\n case \"insert-child\": {\n const parent = getNodeAtPath(doc, op.parentPath);\n childArray(parent).splice(op.index, 0, cloneValue(op.node) as JxMutableNode);\n return;\n }\n case \"remove-child\": {\n const parent = getNodeAtPath(doc, op.parentPath);\n childArray(parent).splice(op.index, 1);\n return;\n }\n case \"set-child\": {\n const parent = getNodeAtPath(doc, op.parentPath);\n childArray(parent).splice(op.index, 1, cloneValue(op.node) as JxMutableNode);\n return;\n }\n case \"move-child\": {\n const fromParent = getNodeAtPath(doc, op.fromParentPath);\n const toParent = getNodeAtPath(doc, op.toParentPath);\n const [node] = childArray(fromParent).splice(op.fromIndex, 1);\n childArray(toParent).splice(op.toIndex, 0, node!);\n return;\n }\n default: {\n throw new Error(`unknown-doc-op:${(op as JxDocOp).op}`);\n }\n }\n}\n",
26
27
  "/**\n * Strip `on*` event-handler bindings from a Jx document tree (returns a shallow-rebuilt copy). Used\n * to neutralize handlers before edit/design rendering so the canvas never wires live behavior, and\n * to drop `timing: \"server\"` state entries the canvas can't run.\n *\n * Lives in its own dependency-light module (it pulls only the pure `@jxsuite/schema/guards`\n * predicate) so the slim canvas-iframe subtree renderer can import it without dragging in the\n * editor's reactive `store.ts`; `store.ts` re-exports it for the legacy in-realm patcher.\n */\n\nimport { isEventBinding } from \"@jxsuite/schema/guards\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\n/** Strip all `on*` event-handler properties (and server-timed state) from a document tree. */\nexport function stripEventHandlers(node: JxMutableNode): JxMutableNode {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n if (Array.isArray(node)) {\n // Arrays of nodes round-trip element-wise; the array itself is not a node.\n return node.map((n: JxMutableNode) => stripEventHandlers(n)) as unknown as JxMutableNode;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node)) {\n if (k.startsWith(\"on\") && isEventBinding(v)) {\n continue;\n }\n if (k === \"children\") {\n out.children = Array.isArray(v)\n ? v.map((c: JxMutableNode) => stripEventHandlers(c))\n : stripEventHandlers(v as JxMutableNode);\n } else if (k === \"cases\" && typeof v === \"object\") {\n const cases: Record<string, unknown> = {};\n for (const [ck, cv] of Object.entries(v as Record<string, unknown>)) {\n cases[ck] = stripEventHandlers(cv as JxMutableNode);\n }\n out.cases = cases;\n } else if (k === \"state\" && typeof v === \"object\" && v !== null) {\n const state: Record<string, unknown> = {};\n for (const [sk, sv] of Object.entries(v as Record<string, unknown>)) {\n if (sv && typeof sv === \"object\" && (sv as Record<string, unknown>).timing === \"server\") {\n continue;\n }\n state[sk] = sv;\n }\n out.state = state;\n } else if (k === \"style\" || k === \"attributes\" || k === \"$media\") {\n out[k] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n",
27
28
  "/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/**\n * In-iframe subtree rendering for surgical structural patches (insert / replace / attribute edits).\n * The cross-frame analog of `canvas-subtree-render.ts`: it re-renders a single shadow-doc node into\n * fresh DOM using the SAME edit-mode transform, runtime renderer, scope (`$defs`), path mapping,\n * and mode the full render used — so a patched subtree is indistinguishable from a full re-render.\n *\n * Dependency-light (runtime + reactivity + the pure path/edit helpers) so it stays inside the slim\n * canvas-iframe bundle. Where the legacy patcher records render scopes in the `elToRenderScope`\n * WeakMap, this stamps `data-jx-path` and tracks per-subtree effect scopes locally.\n */\n\nimport { elementStyleTags, renderNode, runScoped } from \"@jxsuite/runtime\";\nimport { getNodeAtPath } from \"../state\";\nimport { makeStamper } from \"./iframe-render\";\nimport { prepareForEditMode } from \"../utils/edit-display\";\nimport { stripEventHandlers } from \"../utils/strip-events\";\nimport type { IframeRenderCtx } from \"./iframe-render\";\nimport type { JxPath } from \"../state\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\n\n/**\n * The scope disposer each surgically-rendered subtree root owns (for disposal on remove/replace).\n * Disposers come from the RUNTIME's runScoped — renderNode's effects belong to the runtime's copy\n * of vue-reactivity, so a studio-instance effectScope here would collect nothing and leak every\n * binding effect of a superseded subtree (they keep firing against detached DOM).\n */\nconst elScope = new WeakMap<HTMLElement, () => void>();\n/** Every live subtree disposer, so a full re-render can stop them all (they're detached roots). */\nconst liveScopes = new Set<() => void>();\n\n/**\n * Render the shadow-doc node at `docPath` into a detached DOM subtree, stamped with `data-jx-path`\n * and edit-mode-prepared exactly like the full render. Throws when the path resolves to nothing.\n */\nexport function renderSubtreeIframe(\n shadowDoc: JxMutableNode,\n docPath: JxPath,\n ctx: IframeRenderCtx,\n): HTMLElement | Text {\n const node = getNodeAtPath(shadowDoc, docPath) as JxMutableNode | string | undefined;\n if (node === undefined) {\n throw new Error(`iframe-patch-node-not-found:${docPath.join(\"/\")}`);\n }\n const def = typeof node === \"string\" ? node : prepareForEditMode(stripEventHandlers(node));\n const { result: rendered, stop } = runScoped(() =>\n renderNode(def, ctx.defs, {\n _path: docPathToRenderPath(docPath, ctx),\n onNodeCreated: makeStamper(ctx.mapperCtx),\n }),\n );\n // Track the disposer for bulk dispose on full re-render; element disposers are also keyed by their\n // Root element so a targeted remove/replace can stop just that subtree (a bare text node owns none).\n liveScopes.add(stop);\n if (rendered instanceof HTMLElement) {\n elScope.set(rendered, stop);\n }\n return rendered;\n}\n\n/**\n * Release a removed/replaced subtree: stop the effect scopes rooted inside it and drop the scoped\n * `<style>` tags the runtime emitted for its elements (otherwise they orphan in the iframe head).\n */\nexport function disposeSubtree(el: Element): void {\n const targets: Element[] = [el, ...el.querySelectorAll(\"*\")];\n for (const t of targets) {\n if (!(t instanceof HTMLElement)) {\n continue;\n }\n const tag = elementStyleTags.get(t);\n if (tag) {\n tag.remove();\n elementStyleTags.delete(t);\n }\n const stop = elScope.get(t);\n if (stop) {\n stop();\n liveScopes.delete(stop);\n elScope.delete(t);\n }\n }\n}\n\n/** Stop every live subtree scope — called before a full re-render replaces the whole document. */\nexport function disposeAllSubtrees(): void {\n for (const stop of liveScopes) {\n stop();\n }\n liveScopes.clear();\n}\n\n/**\n * Inverse of the path mapper's layout-prefix strip: shadow-doc paths are page-relative, render\n * paths are layout-merged. Re-applies the slot-container offset so the runtime renders the subtree\n * at the same render path the full render used. ($map/$switch paths never reach here — they\n * escalate.)\n */\nfunction docPathToRenderPath(docPath: JxPath, ctx: IframeRenderCtx): (string | number)[] {\n const { mapperCtx } = ctx;\n if (mapperCtx.layoutWrapped && mapperCtx.pageContentPrefix && docPath[0] === \"children\") {\n const [, idx] = docPath;\n return typeof idx === \"number\"\n ? [\n ...mapperCtx.pageContentPrefix,\n idx + (mapperCtx.pageContentOffset ?? 0),\n ...docPath.slice(2),\n ]\n : [...mapperCtx.pageContentPrefix, ...docPath.slice(1)];\n }\n return docPath;\n}\n",
28
29
  "/// <reference lib=\"dom\" />\n/**\n * In-iframe surgical patcher — applies value-carrying forward ops to the iframe's shadow doc and\n * the live DOM, so an edit updates in place instead of re-rendering the whole document. This is the\n * cross-frame analog of `canvas-patcher.ts`: the parent classifies + records ops and posts the\n * forward (value-carrying) half; the iframe folds them into its non-reactive shadow doc and mutates\n * the DOM it owns.\n *\n * It applies the full op set the legacy patcher does: in-place `set-key` writes (`style`/\n * `textContent`, and inert event bindings); structural relocation (`remove-child`/`move-child`) as\n * pure DOM moves with `data-jx-path` remapping; and subtree re-renders (`insert-child`/`set-child`,\n * and any other `set-key` that changes rendered output) via {@link renderSubtreeIframe}. Any op it\n * can't apply throws, which the caller reports as `patchError` so the parent escalates to a full\n * render.\n */\n\nimport { reapplyStyle } from \"@jxsuite/runtime\";\nimport { getNodeAtPath } from \"../state\";\nimport { applyDocOpToDoc } from \"../tabs/doc-op-apply\";\nimport { parseJxPath, serializeJxPath } from \"./path-mapping\";\nimport { disposeSubtree, renderSubtreeIframe } from \"./iframe-subtree\";\nimport {\n computeEmptyPlaceholderClass,\n EMPTY_PLACEHOLDER_CLASSES,\n templateToEditDisplay,\n} from \"../utils/edit-display\";\nimport type { IframeRenderCtx } from \"./iframe-render\";\nimport type { WireDocOp } from \"./iframe-protocol\";\nimport type { JxPath } from \"../state\";\nimport type { JxMutableNode, JxStyle } from \"@jxsuite/schema/types\";\n\n/**\n * Apply a batch of forward ops. Every op is folded into the shadow doc first (so DOM reads see\n * post-mutation truth, mirroring the parent patcher reading its already-mutated reactive doc), then\n * each op patches the DOM. Throws on the first op it cannot apply surgically.\n */\nexport function applyIframePatch(\n shadowDoc: JxMutableNode,\n forwardOps: WireDocOp[],\n container: HTMLElement,\n ctx?: IframeRenderCtx,\n): void {\n for (const op of forwardOps) {\n applyDocOpToDoc(shadowDoc, op);\n }\n for (const op of forwardOps) {\n applyOpToDom(shadowDoc, op, container, ctx);\n }\n}\n\n/** The render context, asserted present for ops that re-render a subtree (the caller always has it). */\nfunction requireCtx(ctx: IframeRenderCtx | undefined): IframeRenderCtx {\n if (!ctx) {\n throw new Error(\"iframe-patch-no-render-ctx\");\n }\n return ctx;\n}\n\nfunction applyOpToDom(\n doc: JxMutableNode,\n op: WireDocOp,\n container: HTMLElement,\n ctx: IframeRenderCtx | undefined,\n): void {\n switch (op.op) {\n case \"set-key\": {\n if (op.key === \"style\") {\n patchStyle(doc, op.path, container, ctx);\n return;\n }\n if (op.key === \"textContent\") {\n patchText(doc, op.path, container);\n return;\n }\n // Event bindings are stripped from the design/edit render — nothing to patch.\n if (op.key.startsWith(\"on\")) {\n return;\n }\n // Any other key (attributes / $props / cases / tagName / a non-event prop) changes rendered\n // Output, so re-render the node's subtree in place — mirrors the legacy patcher's replace.\n replaceSubtree(doc, op.path, container, requireCtx(ctx));\n return;\n }\n case \"insert-child\": {\n insertChild(doc, op.parentPath, op.index, container, requireCtx(ctx));\n return;\n }\n case \"set-child\": {\n replaceSubtree(doc, [...op.parentPath, \"children\", op.index], container, requireCtx(ctx));\n return;\n }\n case \"remove-child\": {\n removeChild(doc, op.parentPath, op.index, container);\n return;\n }\n case \"move-child\": {\n moveChild(doc, op.fromParentPath, op.fromIndex, op.toParentPath, op.toIndex, container);\n return;\n }\n default: {\n // The WireDocOp union is exhaustively handled above; this guards a future op kind.\n throw new Error(`iframe-patch-unsupported-op:${JSON.stringify(op)}`);\n }\n }\n}\n\n// ─── Structural ops needing a subtree render (Phase 3b-2) ───────────────────────\n\n/** Render the inserted node and splice it into the parent's DOM, shifting later siblings up. */\nfunction insertChild(\n doc: JxMutableNode,\n parentPath: JxPath,\n index: number,\n container: HTMLElement,\n ctx: IframeRenderCtx,\n): void {\n const parentEl = requireElement(container, parentPath);\n const parentNode = getNodeAtPath(doc, parentPath);\n const newEl = renderSubtreeIframe(doc, [...parentPath, \"children\", index], ctx);\n // Remap existing siblings BEFORE attaching the new subtree so it isn't itself remapped.\n remapChildPaths(container, parentPath, index, 1);\n insertAt(parentEl, newEl, domChildReference(parentEl, parentNode, index));\n syncContainerPlaceholder(parentEl, parentNode);\n}\n\n/** Re-render the node at `docPath` and swap it into the DOM in place (disposing the old subtree). */\nfunction replaceSubtree(\n doc: JxMutableNode,\n docPath: JxPath,\n container: HTMLElement,\n ctx: IframeRenderCtx,\n): void {\n const oldEl = requireElement(container, docPath);\n const newEl = renderSubtreeIframe(doc, docPath, ctx);\n disposeSubtree(oldEl);\n oldEl.replaceWith(newEl);\n}\n\n// ─── Structural ops (no subtree render: pure DOM move + data-jx-path remap) ──────\n\n/** Remove the element at `parentPath/children/index`, shift later siblings down, dispose its scope. */\nfunction removeChild(\n doc: JxMutableNode,\n parentPath: JxPath,\n index: number,\n container: HTMLElement,\n): void {\n const el = requireElement(container, [...parentPath, \"children\", index]);\n const parentEl = el.parentElement;\n disposeSubtree(el);\n el.remove();\n remapChildPaths(container, parentPath, index + 1, -1);\n if (parentEl) {\n syncContainerPlaceholder(parentEl, getNodeAtPath(doc, parentPath));\n }\n}\n\n/**\n * Move the element from `fromParentPath/children/fromIndex` to `toParentPath/children/toIndex`.\n * Detach first, shift the from-parent's later siblings down, then re-read the to-parent's (possibly\n * shifted) path, shift its siblings up, rewrite the moved subtree's path prefix, and reinsert. The\n * shadow doc is already folded, so `toIndex` and the to-parent's children reflect post-move truth.\n */\nfunction moveChild(\n doc: JxMutableNode,\n fromParentPath: JxPath,\n fromIndex: number,\n toParentPath: JxPath,\n toIndex: number,\n container: HTMLElement,\n): void {\n const fromPath = [...fromParentPath, \"children\", fromIndex];\n const el = requireElement(container, fromPath);\n const fromParentEl = el.parentElement;\n // Resolve the destination element before any remap renames it out from under us.\n const toParentEl = requireElement(container, toParentPath);\n\n el.remove();\n remapChildPaths(container, fromParentPath, fromIndex + 1, -1);\n // The detach remap may have shifted the to-parent's own path — read it fresh.\n const toPrefix = elementPath(toParentEl) ?? toParentPath;\n remapChildPaths(container, toPrefix, toIndex, 1);\n rewriteSubtreePathPrefix(el, fromPath, [...toPrefix, \"children\", toIndex]);\n\n const toParentNode = getNodeAtPath(doc, toPrefix);\n insertAt(toParentEl, el, domChildReference(toParentEl, toParentNode, toIndex));\n\n // Emptiness may have changed at either end (e.g. moved the last/only child out, or into an empty\n // Container) — keep both parents' placeholder classes in sync with the folded doc.\n if (fromParentEl) {\n syncContainerPlaceholder(\n fromParentEl,\n getNodeAtPath(doc, elementPath(fromParentEl) ?? fromParentPath),\n );\n }\n syncContainerPlaceholder(toParentEl, toParentNode);\n}\n\n/**\n * Keep a container's empty-placeholder class in sync with its (folded) doc node after a child\n * change.\n */\nfunction syncContainerPlaceholder(parentEl: Element, parentNode: JxMutableNode | undefined): void {\n for (const cls of EMPTY_PLACEHOLDER_CLASSES) {\n parentEl.classList.remove(cls);\n }\n const placeholder = parentNode ? computeEmptyPlaceholderClass(parentNode) : null;\n if (placeholder) {\n parentEl.classList.add(placeholder);\n }\n}\n\n/** Insert `node` before `ref`, or append when `ref` is null (inserting at the end). */\nfunction insertAt(parentEl: Element, node: Node, ref: ChildNode | null): void {\n if (ref) {\n ref.before(node);\n } else {\n parentEl.append(node);\n }\n}\n\n/**\n * The DOM node currently occupying `children[index]` of `parentEl`, or null to append. The runtime\n * renders an optional leading text node (when the parent has its own textContent) followed by one\n * node per child entry, in order — so the index is offset by that text node.\n */\nfunction domChildReference(\n parentEl: Element,\n parentNode: JxMutableNode | undefined,\n index: number,\n): ChildNode | null {\n const text = parentNode?.textContent;\n const textOffset = text != null && String(text) !== \"\" ? 1 : 0;\n return parentEl.childNodes[textOffset + index] ?? null;\n}\n\n/**\n * Shift the child-index segment of every `data-jx-path` under `container` whose path is\n * `[...parentPath, \"children\", i, ...]` with `i >= fromIndex`, by `delta`. Mirrors the legacy\n * patcher's `elToPath` remap, but the iframe stores paths as `data-jx-path` attributes.\n */\nfunction remapChildPaths(\n container: HTMLElement,\n parentPath: JxPath,\n fromIndex: number,\n delta: number,\n): void {\n const depth = parentPath.length;\n for (const el of container.querySelectorAll<HTMLElement>(\"[data-jx-path]\")) {\n const p = elementPath(el);\n if (!p || p.length < depth + 2 || p[depth] !== \"children\") {\n continue;\n }\n const idx = p[depth + 1];\n if (typeof idx !== \"number\" || idx < fromIndex) {\n continue;\n }\n if (!parentPath.every((seg, i) => p[i] === seg)) {\n continue;\n }\n const np = [...p];\n np[depth + 1] = idx + delta;\n el.dataset.jxPath = serializeJxPath(np);\n }\n}\n\n/** Rewrite the `data-jx-path` of `el` and its descendants, replacing `oldPrefix` with `newPrefix`. */\nfunction rewriteSubtreePathPrefix(el: HTMLElement, oldPrefix: JxPath, newPrefix: JxPath): void {\n const targets: HTMLElement[] = [el, ...el.querySelectorAll<HTMLElement>(\"[data-jx-path]\")];\n for (const t of targets) {\n const p = elementPath(t);\n if (!p || p.length < oldPrefix.length || !oldPrefix.every((seg, i) => p[i] === seg)) {\n continue;\n }\n t.dataset.jxPath = serializeJxPath([...newPrefix, ...p.slice(oldPrefix.length)]);\n }\n}\n\n/** Read an element's stamped document path, or null when it carries no `data-jx-path`. */\nfunction elementPath(el: HTMLElement): JxPath | null {\n const raw = el.dataset.jxPath;\n return raw === undefined ? null : parseJxPath(raw);\n}\n\n/**\n * Re-emit the node's style onto its element, matching the full render's edit-mode style transform.\n * Pass the document's merged `$media` map (the same one resolveCanvasDocument put on the render\n * doc, carried on the render ctx's built scope) through to reapplyStyle so an `@--name` block\n * resolves to its real `@media (min-width:…)` query — otherwise a surgical edit on a media-bearing\n * node would re-emit an invalid `@media name` and silently drop the responsive rule until the next\n * full render.\n */\nfunction patchStyle(\n doc: JxMutableNode,\n path: (string | number)[],\n container: HTMLElement,\n ctx: IframeRenderCtx | undefined,\n): void {\n const el = requireElement(container, path);\n const node = getNodeAtPath(doc, path);\n const mediaQueries = (ctx?.defs?.[\"$media\"] as Record<string, string> | undefined) ?? {};\n reapplyStyle(el, editModeStyle(node?.style), mediaQueries);\n}\n\n/** Write the node's display text, syncing the empty-placeholder class like the full render. */\nfunction patchText(doc: JxMutableNode, path: (string | number)[], container: HTMLElement): void {\n const el = requireElement(container, path);\n const node = getNodeAtPath(doc, path);\n el.textContent = textDisplayValue(node);\n for (const cls of EMPTY_PLACEHOLDER_CLASSES) {\n el.classList.remove(cls);\n }\n const placeholder = node ? computeEmptyPlaceholderClass(node) : null;\n if (placeholder) {\n el.classList.add(placeholder);\n }\n}\n\n/** Locate the rendered element for a document path via its stamped `data-jx-path` attribute. */\nfunction requireElement(container: HTMLElement, path: (string | number)[]): HTMLElement {\n const serialized = serializeJxPath(path);\n const esc = serialized.replaceAll(\"\\\\\", String.raw`\\\\`).replaceAll(\"'\", String.raw`\\'`);\n const el = container.querySelector(`[data-jx-path='${esc}']`);\n if (!(el instanceof HTMLElement)) {\n throw new Error(`iframe-patch-element-not-found:${serialized}`);\n }\n return el;\n}\n\n/**\n * Edit-mode style transform — mirrors prepareForEditMode (and the legacy patcher's editModeStyle):\n * top-level template-string values are blanked so no reactive bindings are created for them.\n */\nfunction editModeStyle(style: JxStyle | undefined): JxStyle | undefined {\n if (!style || typeof style !== \"object\") {\n return undefined;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(style)) {\n out[k] = typeof v === \"string\" && v.includes(\"${\") ? \"\" : v;\n }\n return out as JxStyle;\n}\n\n/**\n * Display text for a node's textContent in design/edit mode — mirrors prepareForEditMode's\n * template-string and $ref display rules (and the legacy patcher's textDisplayValue).\n */\nfunction textDisplayValue(node: JxMutableNode | undefined): string {\n const v = (node as { textContent?: unknown } | undefined)?.textContent;\n if (v == null) {\n return \"\";\n }\n if (typeof v === \"string\") {\n return v.includes(\"${\") ? templateToEditDisplay(v) : v;\n }\n if (typeof v === \"object\" && (v as Record<string, unknown>).$ref) {\n const ref = String((v as Record<string, unknown>).$ref);\n const label = ref.startsWith(\"#/state/\") ? ref.slice(8) : ref;\n return `{${label}}`;\n }\n return String(v);\n}\n",
30
+ "/**\n * Display formatting for live expression-preview values, shared by the parent-side snapshot\n * evaluator (services/preview-eval.ts) and the in-iframe live evaluator (canvas/iframe-eval.ts) so\n * both realms badge values with identical truncation rules. Dependency-light and DOM-free (the\n * strip-events pattern) so importing it never grows the iframe bundle.\n */\n\nconst MAX_BADGE_LENGTH = 48;\n\n/** Format a runtime value as a short badge string. */\nexport function formatPreviewValue(value?: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n let text: string;\n try {\n text =\n typeof value === \"string\" ? JSON.stringify(value) : (JSON.stringify(value) ?? \"undefined\");\n } catch {\n text = String(value);\n }\n if (text.length > MAX_BADGE_LENGTH) {\n text = `${text.slice(0, MAX_BADGE_LENGTH - 1)}…`;\n }\n return text;\n}\n",
31
+ "/**\n * In-iframe live expression evaluation (M6) — answers the parent's `evalExpr` requests against the\n * LIVE resolved scope of the current render (buildScope's `$defs`), so previews see real repeater\n * items, real `window#/` globals, and uncapped data values instead of the parent's serialized\n * snapshot.\n *\n * Safety: every expression evaluates against a fresh plain-data clone of the scope (a per-key JSON\n * round-trip, the serialize-scope idiom — it reads through the runtime's reactive proxies), so\n * mutating operators write into the clone and never touch the live canvas. Named-formula callables\n * (pure `$expression` entries with parameters) are kept BY REFERENCE so `call` nodes work; every\n * other function (side-effecting handlers, server fns) is dropped so a preview can never run one.\n */\n\nimport { evaluateExpression } from \"@jxsuite/runtime/expression\";\nimport { resolveRef } from \"@jxsuite/runtime\";\nimport { formatPreviewValue } from \"../utils/preview-format\";\n\nimport type { ExpressionNode } from \"@jxsuite/runtime/expression\";\nimport type { EvalExprResult } from \"./iframe-protocol\";\n\ntype Scope = Record<string, unknown>;\n\n/** Whether the raw (document) state entry is a pure named-formula (`$expression` + parameters). */\nfunction isNamedFormulaEntry(entry: unknown): boolean {\n return (\n typeof entry === \"object\" &&\n entry !== null &&\n !Array.isArray(entry) &&\n \"$expression\" in entry &&\n Array.isArray((entry as { parameters?: unknown }).parameters)\n );\n}\n\n/**\n * Clone the live `$defs` scope into a plain object safe to evaluate (and mutate) against. Data\n * values are JSON round-tripped per key (reads through reactive proxies, unwraps top-level refs);\n * functions survive only when their raw state entry is a pure named formula — anything else\n * callable (event handlers, structured-body functions, server fns) is dropped so a stray `call`\n * can't run a side effect against the live canvas.\n */\nexport function cloneLiveScope(defs: Scope, rawState: Record<string, unknown> | null): Scope {\n const out: Scope = {};\n for (const key of Object.keys(defs)) {\n try {\n // Reading through the reactive proxy auto-unwraps a top-level ref/computed — and can throw (a\n // Computed getter that throws), which maps the key to null instead of aborting the clone.\n const value = defs[key];\n if (typeof value === \"function\") {\n if (isNamedFormulaEntry(rawState?.[key])) {\n out[key] = value; // A pure formula callable — safe (and needed) for `call` nodes.\n }\n continue;\n }\n const json = JSON.stringify(value);\n out[key] = json === undefined ? null : (JSON.parse(json) as unknown);\n } catch {\n out[key] = null;\n }\n }\n return out;\n}\n\n/**\n * Bind repeater `$map` contexts for a node at `contextPath`: walk the shadow doc along the path\n * and, at every repeater crossing (a `$prototype: \"Array\"` node entered through its `map`\n * template), resolve the repeater's `items` against the scope built so far and layer the FIRST\n * item's `$map` context (item + index 0) over it — the same shape `renderMappedArrayInto` gives\n * rendered items, so `$map/item` / `$map/index` refs preview against real data. Nested repeaters\n * chain naturally (an inner `items` ref may read the outer `$map/item`).\n */\nexport function bindRepeaterContext(\n scope: Scope,\n shadowDoc: unknown,\n contextPath: (string | number)[] | null,\n): Scope {\n if (!contextPath || contextPath.length === 0) {\n return scope;\n }\n let node: unknown = shadowDoc;\n let bound = scope;\n for (const seg of contextPath) {\n if (!node || typeof node !== \"object\") {\n break;\n }\n const rec = node as Record<string, unknown>;\n if (rec.$prototype === \"Array\" && seg === \"map\") {\n // Entering the repeater's template — bind the first item's context before descending.\n const itemsDef = rec.items;\n const items: unknown =\n itemsDef && typeof itemsDef === \"object\" && \"$ref\" in itemsDef\n ? resolveRef((itemsDef as { $ref: string }).$ref, bound)\n : itemsDef;\n if (Array.isArray(items) && items.length > 0) {\n let item: unknown;\n try {\n // Items resolved from the shadow doc (a literal array) must not be mutable through the\n // Preview scope — clone; scope-resolved items are already clone data, so this is free.\n item = structuredClone(items[0]);\n } catch {\n item = null;\n }\n const child = Object.create(bound) as Scope;\n child.$map = { index: 0, item };\n child[\"$map/item\"] = item;\n child[\"$map/index\"] = 0;\n bound = child;\n }\n }\n node = rec[seg as keyof typeof rec];\n }\n return bound;\n}\n\n/**\n * Evaluate each requested expression against a fresh clone of the live scope (with the repeater\n * context for `contextPath` bound), reporting every sub-node's value through the engine's trace\n * hook as pre-formatted display strings. Exceptions are guarded per expression into `error`.\n */\nexport function evaluateLiveExprs(\n exprs: { id: string; node: unknown }[],\n defs: Scope,\n shadowDoc: unknown,\n contextPath: (string | number)[] | null,\n): EvalExprResult[] {\n const rawState =\n shadowDoc && typeof shadowDoc === \"object\"\n ? ((shadowDoc as { state?: Record<string, unknown> }).state ?? null)\n : null;\n return exprs.map(({ id, node }) => {\n const values = new Map<string, string>();\n // A fresh scope per expression: a mutating operator writes into this clone only, and can never\n // Leak into the next expression's evaluation (or the live canvas).\n let scope: Scope;\n try {\n scope = bindRepeaterContext(cloneLiveScope(defs, rawState), shadowDoc, contextPath);\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error), id, values: [] };\n }\n try {\n if (!node || typeof node !== \"object\" || !(\"operator\" in node)) {\n throw new Error(\"not an expression node\");\n }\n evaluateExpression(node as ExpressionNode, scope, null, undefined, {\n report: (path, value) => values.set(path.join(\"/\"), formatPreviewValue(value)),\n });\n return { id, values: [...values.entries()] };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : String(error),\n id,\n values: [...values.entries()],\n };\n }\n });\n}\n",
29
32
  "/**\n * Serialize the iframe's resolved `$defs` scope (buildScope's output) into a structured-clone-safe\n * plain object the iframe can postMessage to the parent editor. The data-explorer panel reads this\n * from `S.canvas.scope` to show each data source's live value; the iframe (not the parent) resolves\n * the scope since the iframe canvas migration moved buildScope into the iframe realm.\n *\n * The input is the resolved `$defs` — typically a Vue reactive proxy. Reading `defs[key]`\n * auto-unwraps a top-level `ref`/`computed` to its current value; a JSON round-trip then reads\n * THROUGH any nested reactive proxies and drops non-cloneable residue (nested functions, symbols,\n * proxy artifacts) so the result crosses postMessage without a DataCloneError.\n *\n * Pure and DOM-free — no reactivity/runtime imports — so it stays trivially unit-testable.\n */\n\n/**\n * Per-value size cap (in JSON-string chars). A single large content collection can be tens of KB;\n * past this cap we store a small placeholder so one big data source can't bloat every render's\n * postMessage. Generous on purpose — most scope values are far smaller.\n */\nconst MAX_VALUE_CHARS = 256_000;\n\n/** The placeholder stored in place of a value whose JSON string exceeds {@link MAX_VALUE_CHARS}. */\nconst LARGE_VALUE_PLACEHOLDER = \"[large value omitted]\";\n\n/**\n * Produce a structured-clone-safe snapshot of `defs` for the data-explorer.\n *\n * For each own enumerable key: - functions (`typeof v === \"function\"`) are SKIPPED entirely\n * (handlers/server fns aren't data); - other values are JSON deep-cloned\n * (`JSON.parse(JSON.stringify(v))`) inside try/catch — a throw (e.g. a computed getter that throws)\n * or a circular/unserializable value maps the key to `null`; - a value whose JSON string exceeds\n * the size cap is replaced with a short placeholder string.\n *\n * @param defs The resolved `$defs` scope (may be a Vue reactive proxy).\n * @returns A plain object safe to `postMessage` (every value is JSON-round-trippable).\n */\nexport function serializeDataScope(defs: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(defs)) {\n try {\n // Reading through the reactive proxy auto-unwraps a top-level ref/computed to its value, and\n // Can THROW (a computed getter that throws) — done inside the try so that maps the key to null\n // Rather than aborting the whole snapshot.\n const value = defs[key];\n if (typeof value === \"function\") {\n continue; // Data sources only — a resolved server/handler fn isn't a \"value\".\n }\n const json = JSON.stringify(value);\n if (json === undefined) {\n // JSON.stringify returns undefined for a bare function/symbol/undefined at the top level.\n out[key] = null;\n continue;\n }\n if (json.length > MAX_VALUE_CHARS) {\n out[key] = LARGE_VALUE_PLACEHOLDER;\n continue;\n }\n out[key] = JSON.parse(json) as unknown;\n } catch {\n // A circular structure or a throwing getter → the key exists but carries no serializable value.\n out[key] = null;\n }\n }\n return out;\n}\n",
30
- "/// <reference lib=\"dom\" />\n/**\n * Canvas iframe entry — runs INSIDE the canvas iframe. It opens a postMessage channel to the parent\n * editor, announces `ready`, and renders the documents the parent posts via `render`. Kept tiny: it\n * pulls in only the render core, so the iframe bundle stays small.\n */\n\nimport { postMessageChannel } from \"./iframe-channel\";\nimport { installCanvasImageRetry, renderResolvedDocument } from \"./iframe-render\";\nimport { measureHits, startInteraction } from \"./iframe-interaction\";\nimport {\n AUTO_SCROLL_STEP,\n clearIframeDrag,\n computeDropInstruction,\n resolveDropTarget,\n scrollDirection,\n startGrabDetector,\n} from \"./iframe-drop\";\nimport { startIframeInlineEdit } from \"./iframe-inline-edit\";\nimport { startIframeSlashBridge } from \"./iframe-slash\";\nimport { startKeyForwarding } from \"./iframe-keys\";\nimport { applyIframePatch } from \"./iframe-patch\";\nimport { disposeAllSubtrees } from \"./iframe-subtree\";\nimport { serializeDataScope } from \"./serialize-scope\";\nimport { getActivePath, isEditing, stopEditing } from \"../editor/inline-edit\";\nimport { isAncestor } from \"../state\";\nimport type { JxDocOp } from \"../tabs/patch-ops\";\nimport type { JxPath } from \"../state\";\n// ObserveScope MUST come from the runtime: the $defs refs are created by the runtime's copy of\n// @vue/reactivity, and dep tracking is per module instance — an effect from the studio's own copy\n// Would never re-run when a dev-proxy data source settles.\nimport { observeScope, reapplyStyle, setResolveToken } from \"@jxsuite/runtime\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type { CanvasMode, DragSrcKind, IframeToParent, ParentToIframe } from \"./iframe-protocol\";\nimport type { JxDocument, JxMutableNode, JxStyle } from \"@jxsuite/schema/types\";\nimport type { IframeRenderCtx, RenderHandle } from \"./iframe-render\";\n\n/**\n * Resolve the drop placement for a forwarded cursor: point hit-test → nearest `[data-jx-path]` →\n * pure {@link computeDropInstruction}. Returns null when the cursor resolves to no droppable target.\n * Shared by the `dragMove` (display-only preview) and `drop` (fresh, authoritative) handlers.\n */\nfunction previewAt(\n cursor: { x: number; y: number },\n src: DragSrcKind,\n shadowDoc: JxMutableNode,\n doc: Document,\n) {\n const targetEl = resolveDropTarget(cursor.x, cursor.y, doc);\n if (!targetEl) {\n return null;\n }\n return computeDropInstruction(targetEl, cursor.y, shadowDoc, src);\n}\n\n/** Set-key keys the patcher applies IN PLACE (never a subtree re-render) — safe under a live edit. */\nconst IN_PLACE_KEYS = new Set([\"style\", \"textContent\"]);\n\n/**\n * Whether applying `forwardOps` would re-render/detach the element of the live edit session: any op\n * that is NOT an in-place set-key (style/text/event) whose affected node is an ancestor-or-self of\n * the active edit path. Structural ops affect the PARENT's children (any sibling churn under an\n * ancestor can reflow/replace the edited element's position), so their parent path is compared.\n */\nexport function patchDisturbsActiveEdit(forwardOps: JxDocOp[]): boolean {\n const activePath = getActivePath();\n if (!activePath) {\n return false;\n }\n for (const op of forwardOps) {\n let affected: JxPath;\n if (op.op === \"set-key\") {\n if (IN_PLACE_KEYS.has(op.key) || op.key.startsWith(\"on\")) {\n continue;\n }\n affected = op.path;\n } else if (op.op === \"move-child\") {\n affected = op.fromParentPath;\n if (isAncestor(affected, activePath) || isAncestor(op.toParentPath, activePath)) {\n return true;\n }\n continue;\n } else {\n affected = op.parentPath;\n }\n if (isAncestor(affected, activePath)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Drive a channel: render each `render` message into `container`, dropping stale generations, and\n * acknowledge with `renderComplete`/`renderError`. Exposed (rather than inlined in {@link boot}) so\n * tests can exercise it with a fake channel. Returns a teardown function.\n */\nexport function startCanvasIframe(opts: {\n channel: IframeChannel<IframeToParent, ParentToIframe>;\n container: HTMLElement;\n}): () => void {\n const { channel, container } = opts;\n let handle: RenderHandle | null = null;\n // Disposer for the live render's dataScope re-post effect (see the render handler); stopped\n // Alongside the handle so a superseded render's refs can't keep posting.\n let stopDataScopeWatch: (() => void) | null = null;\n let latestGen = -1;\n // The raw page doc the current DOM was rendered from — the patch source-of-truth. `renderedGen`\n // Tracks which generation it (and the DOM) reflect, so patches for an in-flight/superseded render\n // Are handled correctly rather than applied against the wrong tree.\n let shadowDoc: JxMutableNode | null = null;\n let renderedGen = -1;\n // The mode of the LIVE render — gates the interactive surfaces (inline editing, insert zones,\n // Grab-drags) that only design/edit modes own. Adopted alongside shadowDoc.\n let currentMode: CanvasMode = \"design\";\n // The current render's retained context (scope/mapping), used to render subtrees for structural\n // Patches. Set together with `shadowDoc`, so it's non-null whenever a patch is applied.\n let renderCtx: IframeRenderCtx | null = null;\n\n // Cross-frame drag session (Phase 4c). `dragStart` records the source kind + the gen the session\n // Began against; dragMove/drop tag every reply with both so the parent can stale-gate them.\n let dragSrc: DragSrcKind | null = null;\n let dragGen = -1;\n // The parent-session id (from dragStart), so NATIVE drag events routed into this frame can post\n // DragOver/dropResult tagged for the parent's seq gate.\n let sessionSeq = -1;\n\n // ─── Auto-scroll (commit 6) — a SELF-SUSTAINING rAF loop. When a dragMove lands in an edge band,\n // The loop each frame scrolls the viewport AND re-hit-tests the CACHED cursor (elementFromPoint is\n // Viewport-relative, so the same x,y now resolves to a different node after the scroll) and re-posts\n // The over-preview. It is NOT driven by dragMove (the pointer is stationary at an edge-hold). Stops\n // On: band exit (next dragMove, dir 0), drop/dragEnd/dragCancel, or scroll extent reached (scrollY\n // Unchanged). The win/rAF body is the only uncovered line; scrollDirection is PURE + unit-tested.\n let autoScrollFrame = 0;\n // The cached edge-hold cursor. For a flow-3 (iframe-driven) drag it also carries the drag `src`\n // (the parent never posts a dragStart, so `dragSrc`/`dragGen` are null) and `withCursor`, so the\n // Loop re-posts dragOver WITH the cursor to keep the parent's ghost tracking during an edge-hold\n // (the parent has no pointer of its own then). Parent-driven flows (1/2/4) leave `src` undefined\n // And `withCursor` false — the tick falls back to `dragSrc`/`dragGen` and the parent moves the\n // Ghost from its own raw pointer.\n let autoScrollCursor: {\n x: number;\n y: number;\n dragSeq: number;\n withCursor: boolean;\n src?: DragSrcKind;\n gen?: number;\n } | null = null;\n const win = container.ownerDocument.defaultView;\n\n function stopAutoScroll(): void {\n if (autoScrollFrame && win) {\n win.cancelAnimationFrame(autoScrollFrame);\n }\n autoScrollFrame = 0;\n autoScrollCursor = null;\n }\n\n function autoScrollTick(): void {\n autoScrollFrame = 0;\n // Flow 3 supplies its own src on the cached cursor; flows 1/2/4 use the session's dragSrc.\n const src = autoScrollCursor?.src ?? dragSrc;\n if (!win || !autoScrollCursor || !src || !shadowDoc) {\n return;\n }\n const dir = scrollDirection(autoScrollCursor.y, win.innerHeight);\n if (dir === 0) {\n return;\n }\n const before = win.scrollY;\n win.scrollBy(0, dir * AUTO_SCROLL_STEP);\n if (win.scrollY === before) {\n // Scroll extent reached — nothing more to reveal, so stop the loop.\n return;\n }\n const preview = previewAt(autoScrollCursor, src, shadowDoc, container.ownerDocument);\n channel.post({\n // Flow 3 (withCursor) re-posts the cursor so the parent keeps tracking the ghost at an edge-hold.\n ...(autoScrollCursor.withCursor\n ? { cursor: { x: autoScrollCursor.x, y: autoScrollCursor.y } }\n : {}),\n dragSeq: autoScrollCursor.dragSeq,\n gen: autoScrollCursor.gen ?? dragGen,\n kind: \"dragOver\",\n preview,\n });\n autoScrollFrame = win.requestAnimationFrame(autoScrollTick);\n }\n\n /**\n * (Re)evaluate auto-scroll for a dragMove cursor: arm the loop in a band, stop it outside. The\n * optional `flow3` carries the iframe-driven drag's src/gen (and forces the cursor to be\n * re-posted during edge-holds); parent-driven flows pass nothing and the loop uses\n * `dragSrc`/`dragGen`.\n */\n function updateAutoScroll(\n cursor: { x: number; y: number },\n dragSeq: number,\n flow3?: { src: DragSrcKind; gen: number },\n ): void {\n if (!win || scrollDirection(cursor.y, win.innerHeight) === 0) {\n stopAutoScroll();\n return;\n }\n autoScrollCursor = {\n dragSeq,\n withCursor: flow3 != null,\n x: cursor.x,\n y: cursor.y,\n ...(flow3 ? { gen: flow3.gen, src: flow3.src } : {}),\n };\n if (!autoScrollFrame) {\n autoScrollFrame = win.requestAnimationFrame(autoScrollTick);\n }\n }\n\n // Report pointer hit/hover (resolved to data-jx-path) to the parent, which owns selection +\n // Overlays — the cross-origin bridge means the parent never reads our DOM directly. The shadow-doc\n // Accessor feeds the insertion \"+\" zone computation hung off the same pointermove (the parent\n // Draws the clickable \"+\" and runs the slash-menu → mutateInsertNode flow on click).\n const stopInteraction = startInteraction(channel, container.ownerDocument, {\n getMode: () => currentMode,\n getShadowDoc: () => shadowDoc,\n });\n // Forward global-shortcut keystrokes to the parent — its shortcut handler is bound to the editor\n // Document, so without this they'd be swallowed whenever focus is inside the canvas iframe.\n const stopKeyForwarding = startKeyForwarding(channel, container.ownerDocument);\n // Run inline editing (contenteditable) here, posting committed/split/insert results to the parent.\n const stopInlineEdit = startIframeInlineEdit(channel, container, {\n getMode: () => currentMode,\n });\n // Bridge the engine's slash menu to the parent's Spectrum menu (show/nav/select over the channel).\n const stopSlashBridge = startIframeSlashBridge(channel, container.ownerDocument);\n // Flow 3 (grab-anywhere): detect an element-body drag and DRIVE it locally. A drag that begins in\n // The iframe gets its held-button moves in the IFRAME document (not the parent), so the iframe\n // Computes the preview/drop from its own cursor and posts dragOver/dropResult directly; the parent\n // Only adopts the seq, draws the indicator, and positions the ghost from the posted cursor. The\n // Detector reuses the SAME previewAt + auto-scroll loop the dragMove/drop handlers use.\n const stopGrabDetector = startGrabDetector(channel, container.ownerDocument, {\n armAutoScroll: (cursor, dragSeq, src) =>\n updateAutoScroll(cursor, dragSeq, { gen: renderedGen, src }),\n gen: () => renderedGen,\n getMode: () => currentMode,\n previewAt: (cursor, src) =>\n shadowDoc ? previewAt(cursor, src, shadowDoc, container.ownerDocument) : null,\n stopAutoScroll,\n });\n // Auto-recover canvas images that 404 on a cold first render (component <img>s created in\n // ConnectedCallback fire late, before the loopback server is warm). Re-fires the failed request a\n // Few times — what the manual data-sidebar \"Refresh\" does, but without a full re-render.\n const stopImageRetry = installCanvasImageRetry(container);\n\n // ─── Content-height auto-sizing ─────────────────────────────────────────────\n // Measure the content height and post it so the host sizes the iframe to fit — the canvas then never\n // Scrolls internally (the parent overlay can't follow an internal scroll, and every node stays inside\n // The iframe box so it's hit-testable). The runtime transposes viewport units to container units, so\n // This converges instead of feeding back; `MAX` is a backstop if some unit slips through. `container`\n // Is `#jx-canvas-root`, which overflows the fixed-size query container freely, so its scrollHeight is\n // The true content height.\n const MAX_CANVAS_HEIGHT = 30_000;\n let lastPostedHeight = -1;\n function postContentHeight(): void {\n const measured = Math.min(container.scrollHeight, MAX_CANVAS_HEIGHT);\n if (measured > 0 && Math.abs(measured - lastPostedHeight) >= 1) {\n lastPostedHeight = measured;\n // A component-definition root (marked by makeStamper) is a fragment, not a page — tell the host\n // So it can drop its 480px iframe floor and let a short component hug its content.\n const root = container.firstElementChild;\n const fragment = root instanceof HTMLElement && root.dataset.jxDefinitionRoot !== undefined;\n channel.post({ fragment, height: measured, kind: \"contentHeight\" });\n }\n }\n const ResizeObs = win?.ResizeObserver;\n const heightObserver = ResizeObs ? new ResizeObs(() => postContentHeight()) : null;\n heightObserver?.observe(container);\n\n // ─── Wheel forwarding (canvas zoom/pan) ─────────────────────────────────────\n // The iframe is sized to its content (never scrolls itself), so wheel events over it are meant for\n // The parent canvas: ctrl/cmd+wheel = zoom, plain = pan. A cross-origin OOPIF doesn't bubble wheel to\n // The parent, so forward the deltas + modifiers + cursor; the host redispatches to its wheel handler.\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n channel.post({\n ctrlKey: e.ctrlKey,\n deltaX: e.deltaX,\n deltaY: e.deltaY,\n kind: \"forwardWheel\",\n metaKey: e.metaKey,\n shiftKey: e.shiftKey,\n x: e.clientX,\n y: e.clientY,\n });\n };\n container.ownerDocument.addEventListener(\"wheel\", onWheel, { passive: false });\n\n // ─── Native drag routing (flows 1/2/4 over the canvas) ─────────────────────\n // Chromium delivers native dragover/drop to the frame UNDER THE CURSOR, so once a\n // Parent-originated drag (palette / layers / ⠿ handle) crosses onto the canvas the parent stops\n // Seeing dragover — it can't forward dragMove, and cross-origin nothing preventDefaults here,\n // Giving the \"not allowed\" cursor and a dead drop. So handle the native stream directly: while a\n // Parent session is live (dragSrc set), accept the drag, post dragOver previews from OUR\n // ClientX/y (already iframe-local — no rect conversion), and on drop post the authoritative\n // DropResult. The cursor rides on dragOver so the parent can keep its ghost tracking (it has no\n // Pointer stream of its own while the drag is over this frame).\n //\n // A native stream arriving with NO session yet (dragSrc null) is a parent drag that crossed onto\n // The canvas before the parent could bind a host (it never sees a cursor inside the iframe rect) —\n // Post nativeDragEnter so the bridge binds the session here. Throttled: dragover fires\n // Continuously (~350ms even stationary), and an unclaimable stream (e.g. an OS file drag) would\n // Otherwise spam the channel forever.\n const NATIVE_ENTER_REPOST_MS = 300;\n let lastNativeEnterPost = 0;\n const onNativeDragOver = (e: DragEvent) => {\n if (!dragSrc) {\n const now = Date.now();\n if (now - lastNativeEnterPost >= NATIVE_ENTER_REPOST_MS) {\n lastNativeEnterPost = now;\n channel.post({ kind: \"nativeDragEnter\" });\n }\n return;\n }\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"move\";\n }\n const cursor = { x: e.clientX, y: e.clientY };\n const preview = shadowDoc\n ? previewAt(cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({ cursor, dragSeq: sessionSeq, gen: dragGen, kind: \"dragOver\", preview });\n updateAutoScroll(cursor, sessionSeq);\n };\n const onNativeDrop = (e: DragEvent) => {\n if (!dragSrc) {\n return;\n }\n e.preventDefault();\n const cursor = { x: e.clientX, y: e.clientY };\n const preview = shadowDoc\n ? previewAt(cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({\n dragSeq: sessionSeq,\n gen: dragGen,\n instruction: preview?.instruction ?? null,\n kind: \"dropResult\",\n targetPath: preview?.targetPath ?? null,\n });\n dragSrc = null;\n dragGen = -1;\n sessionSeq = -1;\n stopAutoScroll();\n clearIframeDrag();\n };\n container.ownerDocument.addEventListener(\"dragenter\", onNativeDragOver, true);\n container.ownerDocument.addEventListener(\"dragover\", onNativeDragOver, true);\n container.ownerDocument.addEventListener(\"drop\", onNativeDrop, true);\n\n const off = channel.onMessage((msg) => {\n if (msg.kind === \"measure\") {\n channel.post({\n hits: measureHits(msg.paths, container.ownerDocument),\n kind: \"geometry\",\n reqId: msg.reqId,\n });\n return;\n }\n if (msg.kind === \"patch\") {\n const { gen } = msg;\n if (gen < renderedGen) {\n // A newer full render already supersedes this edit — drop it.\n return;\n }\n if (gen > renderedGen || !shadowDoc || !renderCtx) {\n // The render this patch targets hasn't landed yet; let the parent escalate to a full render.\n channel.post({ gen, kind: \"patchError\", message: \"patch-ahead-of-render\" });\n return;\n }\n // A structural/subtree op that re-renders the active editable (or an ancestor) would detach\n // The session's element mid-edit — commit and end the session first (in-place style/text\n // Patches elsewhere leave it alone).\n if (isEditing() && patchDisturbsActiveEdit(msg.forwardOps)) {\n stopEditing();\n }\n try {\n applyIframePatch(shadowDoc, msg.forwardOps, container, renderCtx);\n channel.post({ gen, kind: \"patchComplete\" });\n } catch (error) {\n channel.post({\n gen,\n kind: \"patchError\",\n message: String((error as Error)?.message ?? error),\n });\n }\n return;\n }\n if (msg.kind === \"styleUpdate\") {\n // Stylebook live style edit: swap the ROOT's style and re-run the runtime's style applier —\n // One reapply regenerates the whole scoped-CSS cascade (real @media included) without a\n // Re-render. A stale gen is dropped; the superseding render carries the same style.\n if (msg.gen !== renderedGen || !shadowDoc) {\n return;\n }\n (shadowDoc as { style?: JxStyle }).style = msg.style as JxStyle;\n const rootEl = container.firstElementChild;\n if (rootEl instanceof HTMLElement) {\n reapplyStyle(\n rootEl,\n msg.style as JxStyle,\n (shadowDoc as { $media?: Record<string, string> }).$media ?? {},\n );\n }\n return;\n }\n if (msg.kind === \"dragStart\") {\n // Begin a drag session: retain the source kind + the gen it targets. dragMove/drop replies are\n // Tagged with this gen so the parent drops any that arrive after a re-render superseded it.\n dragSrc = msg.src;\n dragGen = msg.gen;\n sessionSeq = msg.dragSeq;\n return;\n }\n if (msg.kind === \"dragEnd\" || msg.kind === \"dragCancel\") {\n // The pointer left the canvas / the session was cancelled: forget the session so a late move\n // Or drop is a no-op, and clear any flow-3 (iframe-originated) drag state + auto-scroll.\n dragSrc = null;\n dragGen = -1;\n sessionSeq = -1;\n stopAutoScroll();\n clearIframeDrag();\n return;\n }\n if (msg.kind === \"dragMove\") {\n // Display-only preview: hit-test the forwarded cursor, compute the placement, post dragOver.\n // Null target/instruction → post a null preview so the parent clears any stale indicator.\n const preview =\n dragSrc && shadowDoc\n ? previewAt(msg.cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({ dragSeq: msg.dragSeq, gen: dragGen, kind: \"dragOver\", preview });\n // Arm/stop the self-sustaining auto-scroll for this cursor (an edge-hold keeps scrolling).\n updateAutoScroll(msg.cursor, msg.dragSeq);\n return;\n }\n if (msg.kind === \"drop\") {\n // Compute the drop FRESH from the live DOM (never from a cached preview) and post the result.\n const preview =\n dragSrc && shadowDoc\n ? previewAt(msg.cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({\n dragSeq: msg.dragSeq,\n gen: dragGen,\n instruction: preview?.instruction ?? null,\n kind: \"dropResult\",\n targetPath: preview?.targetPath ?? null,\n });\n dragSrc = null;\n dragGen = -1;\n sessionSeq = -1;\n stopAutoScroll();\n clearIframeDrag();\n return;\n }\n if (msg.kind !== \"render\" || msg.gen < latestGen) {\n return;\n }\n // A render replaces the DOM under a live edit session — COMMIT it first (never discard). The\n // Resulting editCommit/editEnd post synchronously here, so on the FIFO channel they precede\n // This render's renderComplete and the parent routes them by the host's not-yet-flipped tab\n // Identity — a commit racing a tab switch still lands in the document it belonged to.\n if (isEditing()) {\n stopEditing();\n }\n latestGen = msg.gen;\n const { gen, mapperCtx } = msg;\n const rawDoc = msg.shadowDoc as JxMutableNode;\n void (async () => {\n try {\n // Drop the previous render's reactive scopes (root + any surgically-rendered subtrees).\n disposeAllSubtrees();\n stopDataScopeWatch?.();\n stopDataScopeWatch = null;\n handle?.dispose();\n handle = await renderResolvedDocument({\n container,\n doc: msg.doc as JxDocument,\n docBase: msg.docBase,\n mapperCtx: {\n arrayPaths: new Set(mapperCtx.arrayPaths),\n canvasMode: mapperCtx.canvasMode,\n layoutWrapped: mapperCtx.layoutWrapped,\n pageContentOffset: mapperCtx.pageContentOffset,\n pageContentPrefix: mapperCtx.pageContentPrefix,\n },\n mode: msg.mode,\n siteStyle: msg.siteStyle,\n });\n if (gen === latestGen) {\n // Adopt this generation's shadow doc + render context only once it's the live render.\n shadowDoc = rawDoc;\n renderCtx = handle.ctx;\n renderedGen = gen;\n currentMode = msg.mode;\n channel.post({ gen, kind: \"renderComplete\" });\n // Thread a serializable snapshot of the resolved $defs to the parent so the data-explorer\n // Panel shows live data (the iframe, not the parent, now resolves the scope). Inside a\n // Reactive effect: dev-proxy data sources ($prototype/$src) return a ref that fills AFTER\n // BuildScope returns, and serializeDataScope reads defs[key], so the effect tracks those\n // Refs and RE-POSTS an updated snapshot when the data settles (the host gen-gates stale\n // Ones). Isolated in try/catch: a serialization failure never breaks the render ack above.\n const defs = handle.ctx.defs as Record<string, unknown>;\n stopDataScopeWatch = observeScope(() => {\n try {\n channel.post({ gen, kind: \"dataScope\", scope: serializeDataScope(defs) });\n } catch {\n // A pathological scope can't be serialized — skip; the render itself succeeded.\n }\n });\n // Size the iframe to the freshly-rendered content (the ResizeObserver tracks later reflows).\n postContentHeight();\n }\n } catch (error) {\n channel.post({\n gen,\n kind: \"renderError\",\n message: String((error as Error)?.message ?? error),\n });\n }\n })();\n });\n\n channel.post({ kind: \"ready\" });\n return () => {\n off();\n stopInteraction();\n stopKeyForwarding();\n stopInlineEdit();\n stopSlashBridge();\n stopGrabDetector();\n stopImageRetry();\n stopAutoScroll();\n heightObserver?.disconnect();\n container.ownerDocument.removeEventListener(\"wheel\", onWheel);\n container.ownerDocument.removeEventListener(\"dragenter\", onNativeDragOver, true);\n container.ownerDocument.removeEventListener(\"dragover\", onNativeDragOver, true);\n container.ownerDocument.removeEventListener(\"drop\", onNativeDrop, true);\n stopDataScopeWatch?.();\n handle?.dispose();\n };\n}\n\n/** The window surface {@link bootCanvasIframe} needs — injected so it's testable without a frame. */\ninterface BootWindow {\n location: { search: string };\n document: { querySelector: (selectors: string) => Element | null; body: HTMLElement };\n parent: { postMessage: (message: unknown, targetOrigin: string) => void };\n addEventListener: (type: \"message\", listener: (event: MessageEvent) => void) => void;\n removeEventListener: (type: \"message\", listener: (event: MessageEvent) => void) => void;\n}\n\n/**\n * Boot the entry against a window: open a token+origin-authenticated channel to the parent (origin\n * and token are passed in via the iframe URL) and render into `#jx-canvas-root` (or `<body>`).\n */\nexport function bootCanvasIframe(win: BootWindow): () => void {\n const params = new URLSearchParams(win.location.search);\n // Authenticate the runtime dev-proxy resolve/server fetches to the token-gated loopback server.\n // The server rpcToken rides the iframe URL as `rpcToken`; the `token` param is the separate\n // PostMessage channel secret (set by the host). Absent on dev/chromium, where setResolveToken no-ops.\n setResolveToken(params.get(\"rpcToken\"));\n // ParentOrigin authenticates the parent peer. The host (iframe-host.ts) passes it ONLY for an\n // Http(s) parent (dev / chromium — same-origin, the origin round-trips). It OMITS it for a\n // Non-http(s) parent (electrobun views://), whose custom scheme may not surface as a postMessage\n // Origin: a missing value here means fall back to \"*\" — token-gated, NOT a silent omission — and\n // Log it loudly so the looser origin check is visible.\n const explicitParentOrigin = params.get(\"parentOrigin\");\n const parentOrigin = explicitParentOrigin || \"*\";\n if (!explicitParentOrigin) {\n console.warn(\n \"[jx-canvas] no parentOrigin in iframe URL — accepting messages from any origin (token-gated). \" +\n \"The parent origin did not round-trip; the channel relies on the shared token alone.\",\n );\n }\n const container = (win.document.querySelector(\"#jx-canvas-root\") ??\n win.document.body) as HTMLElement;\n const channel = postMessageChannel<IframeToParent, ParentToIframe>({\n acceptOrigin: parentOrigin,\n source: win,\n target: win.parent,\n targetOrigin: parentOrigin,\n token: params.get(\"token\") || \"\",\n });\n return startCanvasIframe({ channel, container });\n}\n\n// Boot only when actually loaded as the iframe document (has a real parent frame), never in tests.\nif (typeof window !== \"undefined\" && window.parent !== window) {\n bootCanvasIframe(window as unknown as BootWindow);\n}\n"
33
+ "/// <reference lib=\"dom\" />\n/**\n * Canvas iframe entry — runs INSIDE the canvas iframe. It opens a postMessage channel to the parent\n * editor, announces `ready`, and renders the documents the parent posts via `render`. Kept tiny: it\n * pulls in only the render core, so the iframe bundle stays small.\n */\n\nimport { postMessageChannel } from \"./iframe-channel\";\nimport { installCanvasImageRetry, renderResolvedDocument } from \"./iframe-render\";\nimport { measureHits, startInteraction } from \"./iframe-interaction\";\nimport {\n AUTO_SCROLL_STEP,\n clearIframeDrag,\n computeDropInstruction,\n resolveDropTarget,\n scrollDirection,\n startGrabDetector,\n} from \"./iframe-drop\";\nimport { startIframeInlineEdit } from \"./iframe-inline-edit\";\nimport { startIframeSlashBridge } from \"./iframe-slash\";\nimport { startKeyForwarding } from \"./iframe-keys\";\nimport { applyIframePatch } from \"./iframe-patch\";\nimport { disposeAllSubtrees } from \"./iframe-subtree\";\nimport { evaluateLiveExprs } from \"./iframe-eval\";\nimport { serializeDataScope } from \"./serialize-scope\";\nimport { getActivePath, isEditing, stopEditing } from \"../editor/inline-edit\";\nimport { isAncestor } from \"../state\";\nimport type { JxDocOp } from \"../tabs/patch-ops\";\nimport type { JxPath } from \"../state\";\n// ObserveScope MUST come from the runtime: the $defs refs are created by the runtime's copy of\n// @vue/reactivity, and dep tracking is per module instance — an effect from the studio's own copy\n// Would never re-run when a dev-proxy data source settles.\nimport { observeScope, reapplyStyle, setResolveToken } from \"@jxsuite/runtime\";\nimport type { IframeChannel } from \"./iframe-channel\";\nimport type { CanvasMode, DragSrcKind, IframeToParent, ParentToIframe } from \"./iframe-protocol\";\nimport type { JxDocument, JxMutableNode, JxStyle } from \"@jxsuite/schema/types\";\nimport type { IframeRenderCtx, RenderHandle } from \"./iframe-render\";\n\n/**\n * Resolve the drop placement for a forwarded cursor: point hit-test → nearest `[data-jx-path]` →\n * pure {@link computeDropInstruction}. Returns null when the cursor resolves to no droppable target.\n * Shared by the `dragMove` (display-only preview) and `drop` (fresh, authoritative) handlers.\n */\nfunction previewAt(\n cursor: { x: number; y: number },\n src: DragSrcKind,\n shadowDoc: JxMutableNode,\n doc: Document,\n) {\n const targetEl = resolveDropTarget(cursor.x, cursor.y, doc);\n if (!targetEl) {\n return null;\n }\n return computeDropInstruction(targetEl, cursor.y, shadowDoc, src);\n}\n\n/** Set-key keys the patcher applies IN PLACE (never a subtree re-render) — safe under a live edit. */\nconst IN_PLACE_KEYS = new Set([\"style\", \"textContent\"]);\n\n/**\n * Whether applying `forwardOps` would re-render/detach the element of the live edit session: any op\n * that is NOT an in-place set-key (style/text/event) whose affected node is an ancestor-or-self of\n * the active edit path. Structural ops affect the PARENT's children (any sibling churn under an\n * ancestor can reflow/replace the edited element's position), so their parent path is compared.\n */\nexport function patchDisturbsActiveEdit(forwardOps: JxDocOp[]): boolean {\n const activePath = getActivePath();\n if (!activePath) {\n return false;\n }\n for (const op of forwardOps) {\n let affected: JxPath;\n if (op.op === \"set-key\") {\n if (IN_PLACE_KEYS.has(op.key) || op.key.startsWith(\"on\")) {\n continue;\n }\n affected = op.path;\n } else if (op.op === \"move-child\") {\n affected = op.fromParentPath;\n if (isAncestor(affected, activePath) || isAncestor(op.toParentPath, activePath)) {\n return true;\n }\n continue;\n } else {\n affected = op.parentPath;\n }\n if (isAncestor(affected, activePath)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Drive a channel: render each `render` message into `container`, dropping stale generations, and\n * acknowledge with `renderComplete`/`renderError`. Exposed (rather than inlined in {@link boot}) so\n * tests can exercise it with a fake channel. Returns a teardown function.\n */\nexport function startCanvasIframe(opts: {\n channel: IframeChannel<IframeToParent, ParentToIframe>;\n container: HTMLElement;\n}): () => void {\n const { channel, container } = opts;\n let handle: RenderHandle | null = null;\n // Disposer for the live render's dataScope re-post effect (see the render handler); stopped\n // Alongside the handle so a superseded render's refs can't keep posting.\n let stopDataScopeWatch: (() => void) | null = null;\n let latestGen = -1;\n // The raw page doc the current DOM was rendered from — the patch source-of-truth. `renderedGen`\n // Tracks which generation it (and the DOM) reflect, so patches for an in-flight/superseded render\n // Are handled correctly rather than applied against the wrong tree.\n let shadowDoc: JxMutableNode | null = null;\n let renderedGen = -1;\n // The mode of the LIVE render — gates the interactive surfaces (inline editing, insert zones,\n // Grab-drags) that only design/edit modes own. Adopted alongside shadowDoc.\n let currentMode: CanvasMode = \"design\";\n // The current render's retained context (scope/mapping), used to render subtrees for structural\n // Patches. Set together with `shadowDoc`, so it's non-null whenever a patch is applied.\n let renderCtx: IframeRenderCtx | null = null;\n\n // Cross-frame drag session (Phase 4c). `dragStart` records the source kind + the gen the session\n // Began against; dragMove/drop tag every reply with both so the parent can stale-gate them.\n let dragSrc: DragSrcKind | null = null;\n let dragGen = -1;\n // The parent-session id (from dragStart), so NATIVE drag events routed into this frame can post\n // DragOver/dropResult tagged for the parent's seq gate.\n let sessionSeq = -1;\n\n // ─── Auto-scroll (commit 6) — a SELF-SUSTAINING rAF loop. When a dragMove lands in an edge band,\n // The loop each frame scrolls the viewport AND re-hit-tests the CACHED cursor (elementFromPoint is\n // Viewport-relative, so the same x,y now resolves to a different node after the scroll) and re-posts\n // The over-preview. It is NOT driven by dragMove (the pointer is stationary at an edge-hold). Stops\n // On: band exit (next dragMove, dir 0), drop/dragEnd/dragCancel, or scroll extent reached (scrollY\n // Unchanged). The win/rAF body is the only uncovered line; scrollDirection is PURE + unit-tested.\n let autoScrollFrame = 0;\n // The cached edge-hold cursor. For a flow-3 (iframe-driven) drag it also carries the drag `src`\n // (the parent never posts a dragStart, so `dragSrc`/`dragGen` are null) and `withCursor`, so the\n // Loop re-posts dragOver WITH the cursor to keep the parent's ghost tracking during an edge-hold\n // (the parent has no pointer of its own then). Parent-driven flows (1/2/4) leave `src` undefined\n // And `withCursor` false — the tick falls back to `dragSrc`/`dragGen` and the parent moves the\n // Ghost from its own raw pointer.\n let autoScrollCursor: {\n x: number;\n y: number;\n dragSeq: number;\n withCursor: boolean;\n src?: DragSrcKind;\n gen?: number;\n } | null = null;\n const win = container.ownerDocument.defaultView;\n\n function stopAutoScroll(): void {\n if (autoScrollFrame && win) {\n win.cancelAnimationFrame(autoScrollFrame);\n }\n autoScrollFrame = 0;\n autoScrollCursor = null;\n }\n\n function autoScrollTick(): void {\n autoScrollFrame = 0;\n // Flow 3 supplies its own src on the cached cursor; flows 1/2/4 use the session's dragSrc.\n const src = autoScrollCursor?.src ?? dragSrc;\n if (!win || !autoScrollCursor || !src || !shadowDoc) {\n return;\n }\n const dir = scrollDirection(autoScrollCursor.y, win.innerHeight);\n if (dir === 0) {\n return;\n }\n const before = win.scrollY;\n win.scrollBy(0, dir * AUTO_SCROLL_STEP);\n if (win.scrollY === before) {\n // Scroll extent reached — nothing more to reveal, so stop the loop.\n return;\n }\n const preview = previewAt(autoScrollCursor, src, shadowDoc, container.ownerDocument);\n channel.post({\n // Flow 3 (withCursor) re-posts the cursor so the parent keeps tracking the ghost at an edge-hold.\n ...(autoScrollCursor.withCursor\n ? { cursor: { x: autoScrollCursor.x, y: autoScrollCursor.y } }\n : {}),\n dragSeq: autoScrollCursor.dragSeq,\n gen: autoScrollCursor.gen ?? dragGen,\n kind: \"dragOver\",\n preview,\n });\n autoScrollFrame = win.requestAnimationFrame(autoScrollTick);\n }\n\n /**\n * (Re)evaluate auto-scroll for a dragMove cursor: arm the loop in a band, stop it outside. The\n * optional `flow3` carries the iframe-driven drag's src/gen (and forces the cursor to be\n * re-posted during edge-holds); parent-driven flows pass nothing and the loop uses\n * `dragSrc`/`dragGen`.\n */\n function updateAutoScroll(\n cursor: { x: number; y: number },\n dragSeq: number,\n flow3?: { src: DragSrcKind; gen: number },\n ): void {\n if (!win || scrollDirection(cursor.y, win.innerHeight) === 0) {\n stopAutoScroll();\n return;\n }\n autoScrollCursor = {\n dragSeq,\n withCursor: flow3 != null,\n x: cursor.x,\n y: cursor.y,\n ...(flow3 ? { gen: flow3.gen, src: flow3.src } : {}),\n };\n if (!autoScrollFrame) {\n autoScrollFrame = win.requestAnimationFrame(autoScrollTick);\n }\n }\n\n // Report pointer hit/hover (resolved to data-jx-path) to the parent, which owns selection +\n // Overlays — the cross-origin bridge means the parent never reads our DOM directly. The shadow-doc\n // Accessor feeds the insertion \"+\" zone computation hung off the same pointermove (the parent\n // Draws the clickable \"+\" and runs the slash-menu → mutateInsertNode flow on click).\n const stopInteraction = startInteraction(channel, container.ownerDocument, {\n getMode: () => currentMode,\n getShadowDoc: () => shadowDoc,\n });\n // Forward global-shortcut keystrokes to the parent — its shortcut handler is bound to the editor\n // Document, so without this they'd be swallowed whenever focus is inside the canvas iframe.\n const stopKeyForwarding = startKeyForwarding(channel, container.ownerDocument);\n // Run inline editing (contenteditable) here, posting committed/split/insert results to the parent.\n // The shadow-doc accessor gates prop-bound sessions on the RAW instance prop value (template/$ref\n // Valued props render display sugar and must not be plain-text edited).\n const stopInlineEdit = startIframeInlineEdit(channel, container, {\n getMode: () => currentMode,\n getShadowDoc: () => shadowDoc,\n });\n // Bridge the engine's slash menu to the parent's Spectrum menu (show/nav/select over the channel).\n const stopSlashBridge = startIframeSlashBridge(channel, container.ownerDocument);\n // Flow 3 (grab-anywhere): detect an element-body drag and DRIVE it locally. A drag that begins in\n // The iframe gets its held-button moves in the IFRAME document (not the parent), so the iframe\n // Computes the preview/drop from its own cursor and posts dragOver/dropResult directly; the parent\n // Only adopts the seq, draws the indicator, and positions the ghost from the posted cursor. The\n // Detector reuses the SAME previewAt + auto-scroll loop the dragMove/drop handlers use.\n const stopGrabDetector = startGrabDetector(channel, container.ownerDocument, {\n armAutoScroll: (cursor, dragSeq, src) =>\n updateAutoScroll(cursor, dragSeq, { gen: renderedGen, src }),\n gen: () => renderedGen,\n getMode: () => currentMode,\n previewAt: (cursor, src) =>\n shadowDoc ? previewAt(cursor, src, shadowDoc, container.ownerDocument) : null,\n stopAutoScroll,\n });\n // Auto-recover canvas images that 404 on a cold first render (component <img>s created in\n // ConnectedCallback fire late, before the loopback server is warm). Re-fires the failed request a\n // Few times — what the manual data-sidebar \"Refresh\" does, but without a full re-render.\n const stopImageRetry = installCanvasImageRetry(container);\n\n // ─── Content-height auto-sizing ─────────────────────────────────────────────\n // Measure the content height and post it so the host sizes the iframe to fit — the canvas then never\n // Scrolls internally (the parent overlay can't follow an internal scroll, and every node stays inside\n // The iframe box so it's hit-testable). The runtime transposes viewport units to container units, so\n // This converges instead of feeding back; `MAX` is a backstop if some unit slips through. `container`\n // Is `#jx-canvas-root`, which overflows the fixed-size query container freely, so its scrollHeight is\n // The true content height.\n const MAX_CANVAS_HEIGHT = 30_000;\n let lastPostedHeight = -1;\n function postContentHeight(): void {\n const measured = Math.min(container.scrollHeight, MAX_CANVAS_HEIGHT);\n if (measured > 0 && Math.abs(measured - lastPostedHeight) >= 1) {\n lastPostedHeight = measured;\n // A component-definition root (marked by makeStamper) is a fragment, not a page — tell the host\n // So it can drop its 480px iframe floor and let a short component hug its content.\n const root = container.firstElementChild;\n const fragment = root instanceof HTMLElement && root.dataset.jxDefinitionRoot !== undefined;\n channel.post({ fragment, height: measured, kind: \"contentHeight\" });\n }\n }\n const ResizeObs = win?.ResizeObserver;\n const heightObserver = ResizeObs ? new ResizeObs(() => postContentHeight()) : null;\n heightObserver?.observe(container);\n\n // ─── Wheel forwarding (canvas zoom/pan) ─────────────────────────────────────\n // The iframe is sized to its content (never scrolls itself), so wheel events over it are meant for\n // The parent canvas: ctrl/cmd+wheel = zoom, plain = pan. A cross-origin OOPIF doesn't bubble wheel to\n // The parent, so forward the deltas + modifiers + cursor; the host redispatches to its wheel handler.\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n channel.post({\n ctrlKey: e.ctrlKey,\n deltaX: e.deltaX,\n deltaY: e.deltaY,\n kind: \"forwardWheel\",\n metaKey: e.metaKey,\n shiftKey: e.shiftKey,\n x: e.clientX,\n y: e.clientY,\n });\n };\n container.ownerDocument.addEventListener(\"wheel\", onWheel, { passive: false });\n\n // ─── Native drag routing (flows 1/2/4 over the canvas) ─────────────────────\n // Chromium delivers native dragover/drop to the frame UNDER THE CURSOR, so once a\n // Parent-originated drag (palette / layers / ⠿ handle) crosses onto the canvas the parent stops\n // Seeing dragover — it can't forward dragMove, and cross-origin nothing preventDefaults here,\n // Giving the \"not allowed\" cursor and a dead drop. So handle the native stream directly: while a\n // Parent session is live (dragSrc set), accept the drag, post dragOver previews from OUR\n // ClientX/y (already iframe-local — no rect conversion), and on drop post the authoritative\n // DropResult. The cursor rides on dragOver so the parent can keep its ghost tracking (it has no\n // Pointer stream of its own while the drag is over this frame).\n //\n // A native stream arriving with NO session yet (dragSrc null) is a parent drag that crossed onto\n // The canvas before the parent could bind a host (it never sees a cursor inside the iframe rect) —\n // Post nativeDragEnter so the bridge binds the session here. Throttled: dragover fires\n // Continuously (~350ms even stationary), and an unclaimable stream (e.g. an OS file drag) would\n // Otherwise spam the channel forever.\n const NATIVE_ENTER_REPOST_MS = 300;\n let lastNativeEnterPost = 0;\n const onNativeDragOver = (e: DragEvent) => {\n if (!dragSrc) {\n const now = Date.now();\n if (now - lastNativeEnterPost >= NATIVE_ENTER_REPOST_MS) {\n lastNativeEnterPost = now;\n channel.post({ kind: \"nativeDragEnter\" });\n }\n return;\n }\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"move\";\n }\n const cursor = { x: e.clientX, y: e.clientY };\n const preview = shadowDoc\n ? previewAt(cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({ cursor, dragSeq: sessionSeq, gen: dragGen, kind: \"dragOver\", preview });\n updateAutoScroll(cursor, sessionSeq);\n };\n const onNativeDrop = (e: DragEvent) => {\n if (!dragSrc) {\n return;\n }\n e.preventDefault();\n const cursor = { x: e.clientX, y: e.clientY };\n const preview = shadowDoc\n ? previewAt(cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({\n dragSeq: sessionSeq,\n gen: dragGen,\n instruction: preview?.instruction ?? null,\n kind: \"dropResult\",\n targetPath: preview?.targetPath ?? null,\n });\n dragSrc = null;\n dragGen = -1;\n sessionSeq = -1;\n stopAutoScroll();\n clearIframeDrag();\n };\n container.ownerDocument.addEventListener(\"dragenter\", onNativeDragOver, true);\n container.ownerDocument.addEventListener(\"dragover\", onNativeDragOver, true);\n container.ownerDocument.addEventListener(\"drop\", onNativeDrop, true);\n\n const off = channel.onMessage((msg) => {\n if (msg.kind === \"measure\") {\n channel.post({\n hits: measureHits(msg.paths, container.ownerDocument),\n kind: \"geometry\",\n reqId: msg.reqId,\n });\n return;\n }\n if (msg.kind === \"evalExpr\") {\n // Live expression preview (M6): evaluate against the LIVE render's resolved scope — but only\n // The render the request targeted. A stale/ahead gen gets an empty reply (never values from\n // The wrong scope); the parent additionally gen-gates the reply against its own state.\n const results =\n msg.gen === renderedGen && renderCtx && shadowDoc\n ? evaluateLiveExprs(\n msg.exprs,\n renderCtx.defs as Record<string, unknown>,\n shadowDoc,\n msg.contextPath,\n )\n : [];\n channel.post({ gen: msg.gen, kind: \"evalResult\", reqId: msg.reqId, results });\n return;\n }\n if (msg.kind === \"patch\") {\n const { gen } = msg;\n if (gen < renderedGen) {\n // A newer full render already supersedes this edit — drop it.\n return;\n }\n if (gen > renderedGen || !shadowDoc || !renderCtx) {\n // The render this patch targets hasn't landed yet; let the parent escalate to a full render.\n channel.post({ gen, kind: \"patchError\", message: \"patch-ahead-of-render\" });\n return;\n }\n // A structural/subtree op that re-renders the active editable (or an ancestor) would detach\n // The session's element mid-edit — commit and end the session first (in-place style/text\n // Patches elsewhere leave it alone).\n if (isEditing() && patchDisturbsActiveEdit(msg.forwardOps)) {\n stopEditing();\n }\n try {\n applyIframePatch(shadowDoc, msg.forwardOps, container, renderCtx);\n channel.post({ gen, kind: \"patchComplete\" });\n } catch (error) {\n channel.post({\n gen,\n kind: \"patchError\",\n message: String((error as Error)?.message ?? error),\n });\n }\n return;\n }\n if (msg.kind === \"styleUpdate\") {\n // Stylebook live style edit: swap the ROOT's style and re-run the runtime's style applier —\n // One reapply regenerates the whole scoped-CSS cascade (real @media included) without a\n // Re-render. A stale gen is dropped; the superseding render carries the same style.\n if (msg.gen !== renderedGen || !shadowDoc) {\n return;\n }\n (shadowDoc as { style?: JxStyle }).style = msg.style as JxStyle;\n const rootEl = container.firstElementChild;\n if (rootEl instanceof HTMLElement) {\n reapplyStyle(\n rootEl,\n msg.style as JxStyle,\n (shadowDoc as { $media?: Record<string, string> }).$media ?? {},\n );\n }\n return;\n }\n if (msg.kind === \"dragStart\") {\n // Begin a drag session: retain the source kind + the gen it targets. dragMove/drop replies are\n // Tagged with this gen so the parent drops any that arrive after a re-render superseded it.\n dragSrc = msg.src;\n dragGen = msg.gen;\n sessionSeq = msg.dragSeq;\n return;\n }\n if (msg.kind === \"dragEnd\" || msg.kind === \"dragCancel\") {\n // The pointer left the canvas / the session was cancelled: forget the session so a late move\n // Or drop is a no-op, and clear any flow-3 (iframe-originated) drag state + auto-scroll.\n dragSrc = null;\n dragGen = -1;\n sessionSeq = -1;\n stopAutoScroll();\n clearIframeDrag();\n return;\n }\n if (msg.kind === \"dragMove\") {\n // Display-only preview: hit-test the forwarded cursor, compute the placement, post dragOver.\n // Null target/instruction → post a null preview so the parent clears any stale indicator.\n const preview =\n dragSrc && shadowDoc\n ? previewAt(msg.cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({ dragSeq: msg.dragSeq, gen: dragGen, kind: \"dragOver\", preview });\n // Arm/stop the self-sustaining auto-scroll for this cursor (an edge-hold keeps scrolling).\n updateAutoScroll(msg.cursor, msg.dragSeq);\n return;\n }\n if (msg.kind === \"drop\") {\n // Compute the drop FRESH from the live DOM (never from a cached preview) and post the result.\n const preview =\n dragSrc && shadowDoc\n ? previewAt(msg.cursor, dragSrc, shadowDoc, container.ownerDocument)\n : null;\n channel.post({\n dragSeq: msg.dragSeq,\n gen: dragGen,\n instruction: preview?.instruction ?? null,\n kind: \"dropResult\",\n targetPath: preview?.targetPath ?? null,\n });\n dragSrc = null;\n dragGen = -1;\n sessionSeq = -1;\n stopAutoScroll();\n clearIframeDrag();\n return;\n }\n if (msg.kind !== \"render\" || msg.gen < latestGen) {\n return;\n }\n // A render replaces the DOM under a live edit session — COMMIT it first (never discard). The\n // Resulting editCommit/editEnd post synchronously here, so on the FIFO channel they precede\n // This render's renderComplete and the parent routes them by the host's not-yet-flipped tab\n // Identity — a commit racing a tab switch still lands in the document it belonged to.\n if (isEditing()) {\n stopEditing();\n }\n latestGen = msg.gen;\n const { gen, mapperCtx } = msg;\n const rawDoc = msg.shadowDoc as JxMutableNode;\n void (async () => {\n try {\n // Drop the previous render's reactive scopes (root + any surgically-rendered subtrees).\n disposeAllSubtrees();\n stopDataScopeWatch?.();\n stopDataScopeWatch = null;\n handle?.dispose();\n handle = await renderResolvedDocument({\n container,\n doc: msg.doc as JxDocument,\n docBase: msg.docBase,\n mapperCtx: {\n arrayPaths: new Set(mapperCtx.arrayPaths),\n canvasMode: mapperCtx.canvasMode,\n layoutWrapped: mapperCtx.layoutWrapped,\n pageContentOffset: mapperCtx.pageContentOffset,\n pageContentPrefix: mapperCtx.pageContentPrefix,\n },\n mode: msg.mode,\n siteStyle: msg.siteStyle,\n });\n if (gen === latestGen) {\n // Adopt this generation's shadow doc + render context only once it's the live render.\n shadowDoc = rawDoc;\n renderCtx = handle.ctx;\n renderedGen = gen;\n currentMode = msg.mode;\n channel.post({ gen, kind: \"renderComplete\" });\n // Thread a serializable snapshot of the resolved $defs to the parent so the data-explorer\n // Panel shows live data (the iframe, not the parent, now resolves the scope). Inside a\n // Reactive effect: dev-proxy data sources ($prototype/$src) return a ref that fills AFTER\n // BuildScope returns, and serializeDataScope reads defs[key], so the effect tracks those\n // Refs and RE-POSTS an updated snapshot when the data settles (the host gen-gates stale\n // Ones). Isolated in try/catch: a serialization failure never breaks the render ack above.\n const defs = handle.ctx.defs as Record<string, unknown>;\n stopDataScopeWatch = observeScope(() => {\n try {\n channel.post({ gen, kind: \"dataScope\", scope: serializeDataScope(defs) });\n } catch {\n // A pathological scope can't be serialized — skip; the render itself succeeded.\n }\n });\n // Size the iframe to the freshly-rendered content (the ResizeObserver tracks later reflows).\n postContentHeight();\n }\n } catch (error) {\n channel.post({\n gen,\n kind: \"renderError\",\n message: String((error as Error)?.message ?? error),\n });\n }\n })();\n });\n\n channel.post({ kind: \"ready\" });\n return () => {\n off();\n stopInteraction();\n stopKeyForwarding();\n stopInlineEdit();\n stopSlashBridge();\n stopGrabDetector();\n stopImageRetry();\n stopAutoScroll();\n heightObserver?.disconnect();\n container.ownerDocument.removeEventListener(\"wheel\", onWheel);\n container.ownerDocument.removeEventListener(\"dragenter\", onNativeDragOver, true);\n container.ownerDocument.removeEventListener(\"dragover\", onNativeDragOver, true);\n container.ownerDocument.removeEventListener(\"drop\", onNativeDrop, true);\n stopDataScopeWatch?.();\n handle?.dispose();\n };\n}\n\n/** The window surface {@link bootCanvasIframe} needs — injected so it's testable without a frame. */\ninterface BootWindow {\n location: { search: string };\n document: { querySelector: (selectors: string) => Element | null; body: HTMLElement };\n parent: { postMessage: (message: unknown, targetOrigin: string) => void };\n addEventListener: (type: \"message\", listener: (event: MessageEvent) => void) => void;\n removeEventListener: (type: \"message\", listener: (event: MessageEvent) => void) => void;\n}\n\n/**\n * Boot the entry against a window: open a token+origin-authenticated channel to the parent (origin\n * and token are passed in via the iframe URL) and render into `#jx-canvas-root` (or `<body>`).\n */\nexport function bootCanvasIframe(win: BootWindow): () => void {\n const params = new URLSearchParams(win.location.search);\n // Authenticate the runtime dev-proxy resolve/server fetches to the token-gated loopback server.\n // The server rpcToken rides the iframe URL as `rpcToken`; the `token` param is the separate\n // PostMessage channel secret (set by the host). Absent on dev/chromium, where setResolveToken no-ops.\n setResolveToken(params.get(\"rpcToken\"));\n // ParentOrigin authenticates the parent peer. The host (iframe-host.ts) passes it ONLY for an\n // Http(s) parent (dev / chromium — same-origin, the origin round-trips). It OMITS it for a\n // Non-http(s) parent (electrobun views://), whose custom scheme may not surface as a postMessage\n // Origin: a missing value here means fall back to \"*\" — token-gated, NOT a silent omission — and\n // Log it loudly so the looser origin check is visible.\n const explicitParentOrigin = params.get(\"parentOrigin\");\n const parentOrigin = explicitParentOrigin || \"*\";\n if (!explicitParentOrigin) {\n console.warn(\n \"[jx-canvas] no parentOrigin in iframe URL — accepting messages from any origin (token-gated). \" +\n \"The parent origin did not round-trip; the channel relies on the shared token alone.\",\n );\n }\n const container = (win.document.querySelector(\"#jx-canvas-root\") ??\n win.document.body) as HTMLElement;\n const channel = postMessageChannel<IframeToParent, ParentToIframe>({\n acceptOrigin: parentOrigin,\n source: win,\n target: win.parent,\n targetOrigin: parentOrigin,\n token: params.get(\"token\") || \"\",\n });\n return startCanvasIframe({ channel, container });\n}\n\n// Boot only when actually loaded as the iframe document (has a real parent frame), never in tests.\nif (typeof window !== \"undefined\" && window.parent !== window) {\n bootCanvasIframe(window as unknown as BootWindow);\n}\n"
31
34
  ],
32
- "mappings": ";AA0BA,IAAM,WAAW;AAqBV,SAAS,kBAA6B,CAAC,MAMjB;AAAA,EAC3B,QAAQ,QAAQ,QAAQ,cAAc,cAAc,UAAU;AAAA,EAC9D,MAAM,WAAW,IAAI;AAAA,EAErB,MAAM,WAAW,CAAC,UAAwB;AAAA,IACxC,IAAI,iBAAiB,OAAO,MAAM,WAAW,cAAc;AAAA,MACzD;AAAA,IACF;AAAA,IACA,MAAM,OAAO,MAAM;AAAA,IACnB,IAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,KAAK,cAAc,OAAO;AAAA,MACjE;AAAA,IACF;AAAA,IACA,WAAW,WAAW,UAAU;AAAA,MAC9B,QAAQ,KAAK,OAAc;AAAA,IAC7B;AAAA;AAAA,EAEF,OAAO,iBAAiB,WAAW,QAAQ;AAAA,EAE3C,OAAO;AAAA,IACL,OAAO,GAAG;AAAA,MACR,SAAS,MAAM;AAAA,MACf,OAAO,oBAAoB,WAAW,QAAQ;AAAA;AAAA,IAEhD,SAAS,CAAC,SAAS;AAAA,MACjB,SAAS,IAAI,OAAO;AAAA,MACpB,OAAO,MAAM,SAAS,OAAO,OAAO;AAAA;AAAA,IAEtC,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO,YAAY,GAAG,WAAW,OAAO,SAAS,QAAQ,GAAG,YAAY;AAAA;AAAA,EAE5E;AAAA;;;AC7EF,SAAS,OAAO,CAAC,KAAK;AAAA,EACpB,MAAM,sBAAsB,OAAO,OAAO,IAAI;AAAA,EAC9C,WAAW,OAAO,IAAI,MAAM,GAAG;AAAA,IAAG,IAAI,OAAO;AAAA,EAC7C,OAAO,CAAC,SAAQ,OAAO;AAAA;AAGzB,IAAM,YAAwD,OAAO,OAAO,CAAC,CAAC;AAC9E,IAAM,YAAwD,OAAO,OAAO,CAAC,CAAC;AAO9E,IAAM,SAAS,OAAO;AAOtB,IAAM,iBAAiB,OAAO,UAAU;AACxC,IAAM,SAAS,CAAC,KAAK,QAAQ,eAAe,KAAK,KAAK,GAAG;AACzD,IAAM,UAAU,MAAM;AACtB,IAAM,QAAQ,CAAC,QAAQ,aAAa,GAAG,MAAM;AAI7C,IAAM,aAAa,CAAC,QAAQ,OAAO,QAAQ;AAC3C,IAAM,WAAW,CAAC,QAAQ,OAAO,QAAQ;AACzC,IAAM,WAAW,CAAC,QAAQ,OAAO,QAAQ;AACzC,IAAM,WAAW,CAAC,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AAIzD,IAAM,iBAAiB,OAAO,UAAU;AACxC,IAAM,eAAe,CAAC,UAAU,eAAe,KAAK,KAAK;AACzD,IAAM,YAAY,CAAC,UAAU;AAAA,EAC3B,OAAO,aAAa,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA;AAGxC,IAAM,eAAe,CAAC,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI,OAAO,OAAO,KAAK,SAAS,KAAK,EAAE,MAAM;AAQ7G,IAAM,sBAAsB,CAAC,OAAO;AAAA,EAClC,MAAM,wBAAwB,OAAO,OAAO,IAAI;AAAA,EAChD,OAAQ,CAAC,QAAQ;AAAA,IACf,MAAM,MAAM,MAAM;AAAA,IAClB,OAAO,QAAQ,MAAM,OAAO,GAAG,GAAG;AAAA;AAAA;AAGtC,IAAM,aAAa;AACnB,IAAM,WAAW,oBACf,CAAC,QAAQ;AAAA,EACP,OAAO,IAAI,QAAQ,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC;AAAA,CAElE;AACA,IAAM,cAAc;AACpB,IAAM,YAAY,oBAChB,CAAC,QAAQ,IAAI,QAAQ,aAAa,KAAK,EAAE,YAAY,CACvD;AACA,IAAM,aAAa,oBAAoB,CAAC,QAAQ;AAAA,EAC9C,OAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAAA,CACjD;AACD,IAAM,eAAe,oBACnB,CAAC,QAAQ;AAAA,EACP,MAAM,IAAI,MAAM,KAAK,WAAW,GAAG,MAAM;AAAA,EACzC,OAAO;AAAA,CAEX;AACA,IAAM,aAAa,CAAC,OAAO,aAAa,CAAC,OAAO,GAAG,OAAO,QAAQ;AA6PlE,IAAM,sBAAsB;AAE5B,IAAM,gCAAgC,QACpC,sBAAsB,oJACxB;;;AC3UA,SAAS,IAAI,CAAC,QAAQ,MAAM;AAAA,EAC1B,QAAQ,KAAK,cAAc,OAAO,GAAG,IAAI;AAAA;AAG3C,IAAI;AAAA;AACJ,MAAM,YAAY;AAAA,EAEhB,WAAW,CAAC,WAAW,OAAO;AAAA,IAC5B,KAAK,WAAW;AAAA,IAIhB,KAAK,UAAU;AAAA,IAIf,KAAK,MAAM;AAAA,IAIX,KAAK,UAAU,CAAC;AAAA,IAIhB,KAAK,WAAW,CAAC;AAAA,IACjB,KAAK,YAAY;AAAA,IACjB,KAAK,aAAa;AAAA,IAClB,KAAK,WAAW;AAAA,IAChB,IAAI,CAAC,YAAY,mBAAmB;AAAA,MAClC,IAAI,kBAAkB,QAAQ;AAAA,QAC5B,KAAK,SAAS;AAAA,QACd,KAAK,SAAS,kBAAkB,WAAW,kBAAkB,SAAS,CAAC,IAAI,KACzE,IACF,IAAI;AAAA,MACN,EAAO;AAAA,QACL,KAAK,UAAU;AAAA,QACf,KAAK,aAAa;AAAA;AAAA,IAEtB;AAAA;AAAA,MAEE,MAAM,GAAG;AAAA,IACX,OAAO,KAAK;AAAA;AAAA,EAEd,KAAK,GAAG;AAAA,IACN,IAAI,KAAK,SAAS;AAAA,MAChB,KAAK,YAAY;AAAA,MACjB,IAAI,GAAG;AAAA,MACP,IAAI,KAAK,QAAQ;AAAA,QACf,KAAK,IAAI,GAAG,IAAI,KAAK,OAAO,OAAQ,IAAI,GAAG,KAAK;AAAA,UAC9C,KAAK,OAAO,GAAG,MAAM;AAAA,QACvB;AAAA,MACF;AAAA,MACA,KAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAQ,IAAI,GAAG,KAAK;AAAA,QAC/C,KAAK,QAAQ,GAAG,MAAM;AAAA,MACxB;AAAA,IACF;AAAA;AAAA,EAKF,MAAM,GAAG;AAAA,IACP,IAAI,KAAK,SAAS;AAAA,MAChB,IAAI,KAAK,WAAW;AAAA,QAClB,KAAK,YAAY;AAAA,QACjB,IAAI,GAAG;AAAA,QACP,IAAI,KAAK,QAAQ;AAAA,UACf,KAAK,IAAI,GAAG,IAAI,KAAK,OAAO,OAAQ,IAAI,GAAG,KAAK;AAAA,YAC9C,KAAK,OAAO,GAAG,OAAO;AAAA,UACxB;AAAA,QACF;AAAA,QACA,KAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAQ,IAAI,GAAG,KAAK;AAAA,UAC/C,KAAK,QAAQ,GAAG,OAAO;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAEF,GAAG,CAAC,IAAI;AAAA,IACN,IAAI,KAAK,SAAS;AAAA,MAChB,MAAM,qBAAqB;AAAA,MAC3B,IAAI;AAAA,QACF,oBAAoB;AAAA,QACpB,OAAO,GAAG;AAAA,gBACV;AAAA,QACA,oBAAoB;AAAA;AAAA,IAExB,EAAO,SAAiD,KAAK,YAAY;AAAA,MACvE,KAAK,sCAAsC;AAAA,IAC7C;AAAA;AAAA,EAMF,EAAE,GAAG;AAAA,IACH,IAAI,EAAE,KAAK,QAAQ,GAAG;AAAA,MACpB,KAAK,YAAY;AAAA,MACjB,oBAAoB;AAAA,IACtB;AAAA;AAAA,EAMF,GAAG,GAAG;AAAA,IACJ,IAAI,KAAK,MAAM,KAAK,EAAE,KAAK,QAAQ,GAAG;AAAA,MACpC,IAAI,sBAAsB,MAAM;AAAA,QAC9B,oBAAoB,KAAK;AAAA,MAC3B,EAAO;AAAA,QACL,IAAI,UAAU;AAAA,QACd,OAAO,SAAS;AAAA,UACd,IAAI,QAAQ,cAAc,MAAM;AAAA,YAC9B,QAAQ,YAAY,KAAK;AAAA,YACzB;AAAA,UACF;AAAA,UACA,UAAU,QAAQ;AAAA,QACpB;AAAA;AAAA,MAEF,KAAK,YAAiB;AAAA,IACxB;AAAA;AAAA,EAEF,IAAI,CAAC,YAAY;AAAA,IACf,IAAI,KAAK,SAAS;AAAA,MAChB,KAAK,UAAU;AAAA,MACf,IAAI,GAAG;AAAA,MACP,KAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAQ,IAAI,GAAG,KAAK;AAAA,QAC/C,KAAK,QAAQ,GAAG,KAAK;AAAA,MACvB;AAAA,MACA,KAAK,QAAQ,SAAS;AAAA,MACtB,KAAK,IAAI,GAAG,IAAI,KAAK,SAAS,OAAQ,IAAI,GAAG,KAAK;AAAA,QAChD,KAAK,SAAS,GAAG;AAAA,MACnB;AAAA,MACA,KAAK,SAAS,SAAS;AAAA,MACvB,IAAI,KAAK,QAAQ;AAAA,QACf,KAAK,IAAI,GAAG,IAAI,KAAK,OAAO,OAAQ,IAAI,GAAG,KAAK;AAAA,UAC9C,KAAK,OAAO,GAAG,KAAK,IAAI;AAAA,QAC1B;AAAA,QACA,KAAK,OAAO,SAAS;AAAA,MACvB;AAAA,MACA,IAAI,CAAC,KAAK,YAAY,KAAK,UAAU,CAAC,YAAY;AAAA,QAChD,MAAM,OAAO,KAAK,OAAO,OAAO,IAAI;AAAA,QACpC,IAAI,QAAQ,SAAS,MAAM;AAAA,UACzB,KAAK,OAAO,OAAO,KAAK,SAAS;AAAA,UACjC,KAAK,QAAQ,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,MACA,KAAK,SAAc;AAAA,IACrB;AAAA;AAEJ;AACA,SAAS,WAAW,CAAC,UAAU;AAAA,EAC7B,OAAO,IAAI,YAAY,QAAQ;AAAA;AAejC,IAAI;AAmBJ,IAAM,qCAAqC,IAAI;AAAA;AAC/C,MAAM,eAAe;AAAA,EACnB,WAAW,CAAC,IAAI;AAAA,IACd,KAAK,KAAK;AAAA,IAIV,KAAK,OAAY;AAAA,IAIjB,KAAK,WAAgB;AAAA,IAIrB,KAAK,QAAQ,IAAI;AAAA,IAIjB,KAAK,OAAY;AAAA,IAIjB,KAAK,UAAe;AAAA,IACpB,KAAK,YAAiB;AAAA,IACtB,IAAI,mBAAmB;AAAA,MACrB,IAAI,kBAAkB,QAAQ;AAAA,QAC5B,kBAAkB,QAAQ,KAAK,IAAI;AAAA,MACrC,EAAO;AAAA,QACL,KAAK,SAAS;AAAA;AAAA,IAElB;AAAA;AAAA,EAEF,KAAK,GAAG;AAAA,IACN,KAAK,SAAS;AAAA;AAAA,EAEhB,MAAM,GAAG;AAAA,IACP,IAAI,KAAK,QAAQ,IAAI;AAAA,MACnB,KAAK,SAAS;AAAA,MACd,IAAI,mBAAmB,IAAI,IAAI,GAAG;AAAA,QAChC,mBAAmB,OAAO,IAAI;AAAA,QAC9B,KAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA;AAAA,EAKF,MAAM,GAAG;AAAA,IACP,IAAI,KAAK,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK;AAAA,MACxC;AAAA,IACF;AAAA,IACA,IAAI,EAAE,KAAK,QAAQ,IAAI;AAAA,MACrB,MAAM,IAAI;AAAA,IACZ;AAAA;AAAA,EAEF,GAAG,GAAG;AAAA,IACJ,IAAI,EAAE,KAAK,QAAQ,IAAI;AAAA,MACrB,OAAO,KAAK,GAAG;AAAA,IACjB;AAAA,IACA,KAAK,SAAS;AAAA,IACd,cAAc,IAAI;AAAA,IAClB,YAAY,IAAI;AAAA,IAChB,MAAM,aAAa;AAAA,IACnB,MAAM,kBAAkB;AAAA,IACxB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,IAAI;AAAA,MACF,OAAO,KAAK,GAAG;AAAA,cACf;AAAA,MACA,IAAiD,cAAc,MAAM;AAAA,QACnE,KACE,+EACF;AAAA,MACF;AAAA,MACA,YAAY,IAAI;AAAA,MAChB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,KAAK,SAAS;AAAA;AAAA;AAAA,EAGlB,IAAI,GAAG;AAAA,IACL,IAAI,KAAK,QAAQ,GAAG;AAAA,MAClB,SAAS,OAAO,KAAK,KAAM,MAAM,OAAO,KAAK,SAAS;AAAA,QACpD,UAAU,IAAI;AAAA,MAChB;AAAA,MACA,KAAK,OAAO,KAAK,WAAgB;AAAA,MACjC,cAAc,IAAI;AAAA,MAClB,KAAK,UAAU,KAAK,OAAO;AAAA,MAC3B,KAAK,SAAS;AAAA,IAChB;AAAA;AAAA,EAEF,OAAO,GAAG;AAAA,IACR,IAAI,KAAK,QAAQ,IAAI;AAAA,MACnB,mBAAmB,IAAI,IAAI;AAAA,IAC7B,EAAO,SAAI,KAAK,WAAW;AAAA,MACzB,KAAK,UAAU;AAAA,IACjB,EAAO;AAAA,MACL,KAAK,WAAW;AAAA;AAAA;AAAA,EAMpB,UAAU,GAAG;AAAA,IACX,IAAI,QAAQ,IAAI,GAAG;AAAA,MACjB,KAAK,IAAI;AAAA,IACX;AAAA;AAAA,MAEE,KAAK,GAAG;AAAA,IACV,OAAO,QAAQ,IAAI;AAAA;AAEvB;AACA,IAAI,aAAa;AACjB,IAAI;AACJ,IAAI;AACJ,SAAS,KAAK,CAAC,KAAK,aAAa,OAAO;AAAA,EACtC,IAAI,SAAS;AAAA,EACb,IAAI,YAAY;AAAA,IACd,IAAI,OAAO;AAAA,IACX,kBAAkB;AAAA,IAClB;AAAA,EACF;AAAA,EACA,IAAI,OAAO;AAAA,EACX,aAAa;AAAA;AAEf,SAAS,UAAU,GAAG;AAAA,EACpB;AAAA;AAEF,SAAS,QAAQ,GAAG;AAAA,EAClB,IAAI,EAAE,aAAa,GAAG;AAAA,IACpB;AAAA,EACF;AAAA,EACA,IAAI,iBAAiB;AAAA,IACnB,IAAI,IAAI;AAAA,IACR,kBAAuB;AAAA,IACvB,OAAO,GAAG;AAAA,MACR,MAAM,OAAO,EAAE;AAAA,MACf,EAAE,OAAY;AAAA,MACd,EAAE,SAAS;AAAA,MACX,IAAI;AAAA,IACN;AAAA,EACF;AAAA,EACA,IAAI;AAAA,EACJ,OAAO,YAAY;AAAA,IACjB,IAAI,IAAI;AAAA,IACR,aAAkB;AAAA,IAClB,OAAO,GAAG;AAAA,MACR,MAAM,OAAO,EAAE;AAAA,MACf,EAAE,OAAY;AAAA,MACd,EAAE,SAAS;AAAA,MACX,IAAI,EAAE,QAAQ,GAAG;AAAA,QACf,IAAI;AAAA,UAEF,EAAE,QAAQ;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,IAAI,CAAC;AAAA,YAAO,QAAQ;AAAA;AAAA,MAExB;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IAAO,MAAM;AAAA;AAEnB,SAAS,WAAW,CAAC,KAAK;AAAA,EACxB,SAAS,OAAO,IAAI,KAAM,MAAM,OAAO,KAAK,SAAS;AAAA,IACnD,KAAK,UAAU;AAAA,IACf,KAAK,iBAAiB,KAAK,IAAI;AAAA,IAC/B,KAAK,IAAI,aAAa;AAAA,EACxB;AAAA;AAEF,SAAS,WAAW,CAAC,KAAK;AAAA,EACxB,IAAI;AAAA,EACJ,IAAI,OAAO,IAAI;AAAA,EACf,IAAI,OAAO;AAAA,EACX,OAAO,MAAM;AAAA,IACX,MAAM,OAAO,KAAK;AAAA,IAClB,IAAI,KAAK,YAAY,IAAI;AAAA,MACvB,IAAI,SAAS;AAAA,QAAM,OAAO;AAAA,MAC1B,UAAU,IAAI;AAAA,MACd,UAAU,IAAI;AAAA,IAChB,EAAO;AAAA,MACL,OAAO;AAAA;AAAA,IAET,KAAK,IAAI,aAAa,KAAK;AAAA,IAC3B,KAAK,iBAAsB;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO;AAAA,EACX,IAAI,WAAW;AAAA;AAEjB,SAAS,OAAO,CAAC,KAAK;AAAA,EACpB,SAAS,OAAO,IAAI,KAAM,MAAM,OAAO,KAAK,SAAS;AAAA,IACnD,IAAI,KAAK,IAAI,YAAY,KAAK,WAAW,KAAK,IAAI,aAAa,gBAAgB,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,YAAY,KAAK,UAAU;AAAA,MACvI,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,IAAI,QAAQ;AAAA,IACd,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAET,SAAS,eAAe,CAAC,UAAU;AAAA,EACjC,IAAI,SAAS,QAAQ,KAAK,EAAE,SAAS,QAAQ,KAAK;AAAA,IAChD;AAAA,EACF;AAAA,EACA,SAAS,SAAS;AAAA,EAClB,IAAI,SAAS,kBAAkB,eAAe;AAAA,IAC5C;AAAA,EACF;AAAA,EACA,SAAS,gBAAgB;AAAA,EACzB,IAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,QAAQ,CAAC,SAAS,QAAQ,CAAC,SAAS,UAAU,CAAC,QAAQ,QAAQ,IAAI;AAAA,IACzG;AAAA,EACF;AAAA,EACA,SAAS,SAAS;AAAA,EAClB,MAAM,MAAM,SAAS;AAAA,EACrB,MAAM,UAAU;AAAA,EAChB,MAAM,kBAAkB;AAAA,EACxB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,IAAI;AAAA,IACF,YAAY,QAAQ;AAAA,IACpB,MAAM,QAAQ,SAAS,GAAG,SAAS,MAAM;AAAA,IACzC,IAAI,IAAI,YAAY,KAAK,WAAW,OAAO,SAAS,MAAM,GAAG;AAAA,MAC3D,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS;AAAA,MAClB,IAAI;AAAA,IACN;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,YACN;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY,QAAQ;AAAA,IACpB,SAAS,SAAS;AAAA;AAAA;AAGtB,SAAS,SAAS,CAAC,MAAM,OAAO,OAAO;AAAA,EACrC,QAAQ,KAAK,SAAS,YAAY;AAAA,EAClC,IAAI,SAAS;AAAA,IACX,QAAQ,UAAU;AAAA,IAClB,KAAK,UAAe;AAAA,EACtB;AAAA,EACA,IAAI,SAAS;AAAA,IACX,QAAQ,UAAU;AAAA,IAClB,KAAK,UAAe;AAAA,EACtB;AAAA,EACA,IAAiD,IAAI,aAAa,MAAM;AAAA,IACtE,IAAI,WAAW;AAAA,EACjB;AAAA,EACA,IAAI,IAAI,SAAS,MAAM;AAAA,IACrB,IAAI,OAAO;AAAA,IACX,IAAI,CAAC,WAAW,IAAI,UAAU;AAAA,MAC5B,IAAI,SAAS,SAAS;AAAA,MACtB,SAAS,IAAI,IAAI,SAAS,KAAM,GAAG,IAAI,EAAE,SAAS;AAAA,QAChD,UAAU,GAAG,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAM,IAAI,KAAK;AAAA,IACjC,IAAI,IAAI,OAAO,IAAI,GAAG;AAAA,EACxB;AAAA;AAEF,SAAS,SAAS,CAAC,MAAM;AAAA,EACvB,QAAQ,SAAS,YAAY;AAAA,EAC7B,IAAI,SAAS;AAAA,IACX,QAAQ,UAAU;AAAA,IAClB,KAAK,UAAe;AAAA,EACtB;AAAA,EACA,IAAI,SAAS;AAAA,IACX,QAAQ,UAAU;AAAA,IAClB,KAAK,UAAe;AAAA,EACtB;AAAA;AAEF,SAAS,MAAM,CAAC,IAAI,SAAS;AAAA,EAC3B,IAAI,GAAG,kBAAkB,gBAAgB;AAAA,IACvC,KAAK,GAAG,OAAO;AAAA,EACjB;AAAA,EACA,MAAM,IAAI,IAAI,eAAe,EAAE;AAAA,EAC/B,IAAI,SAAS;AAAA,IACX,OAAO,GAAG,OAAO;AAAA,EACnB;AAAA,EACA,IAAI;AAAA,IACF,EAAE,IAAI;AAAA,IACN,OAAO,KAAK;AAAA,IACZ,EAAE,KAAK;AAAA,IACP,MAAM;AAAA;AAAA,EAER,MAAM,SAAS,EAAE,IAAI,KAAK,CAAC;AAAA,EAC3B,OAAO,SAAS;AAAA,EAChB,OAAO;AAAA;AAKT,IAAI,cAAc;AAClB,IAAM,aAAa,CAAC;AACpB,SAAS,aAAa,GAAG;AAAA,EACvB,WAAW,KAAK,WAAW;AAAA,EAC3B,cAAc;AAAA;AAMhB,SAAS,aAAa,GAAG;AAAA,EACvB,MAAM,OAAO,WAAW,IAAI;AAAA,EAC5B,cAAc,SAAc,YAAI,OAAO;AAAA;AAEzC,SAAS,eAAe,CAAC,IAAI,eAAe,OAAO;AAAA,EACjD,IAAI,qBAAqB,gBAAgB;AAAA,IACvC,UAAU,UAAU;AAAA,EACtB,EAAO,SAAiD,CAAC,cAAc;AAAA,IACrE,KACE,iFACF;AAAA,EACF;AAAA;AAEF,SAAS,aAAa,CAAC,GAAG;AAAA,EACxB,QAAQ,YAAY;AAAA,EACpB,EAAE,UAAe;AAAA,EACjB,IAAI,SAAS;AAAA,IACX,MAAM,UAAU;AAAA,IAChB,YAAiB;AAAA,IACjB,IAAI;AAAA,MACF,QAAQ;AAAA,cACR;AAAA,MACA,YAAY;AAAA;AAAA,EAEhB;AAAA;AAGF,IAAI,gBAAgB;AAAA;AACpB,MAAM,KAAK;AAAA,EACT,WAAW,CAAC,KAAK,KAAK;AAAA,IACpB,KAAK,MAAM;AAAA,IACX,KAAK,MAAM;AAAA,IACX,KAAK,UAAU,IAAI;AAAA,IACnB,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,iBAAsB;AAAA;AAE3F;AAAA;AACA,MAAM,IAAI;AAAA,EAER,WAAW,CAAC,UAAU;AAAA,IACpB,KAAK,WAAW;AAAA,IAChB,KAAK,UAAU;AAAA,IAIf,KAAK,aAAkB;AAAA,IAIvB,KAAK,OAAY;AAAA,IAIjB,KAAK,MAAW;AAAA,IAChB,KAAK,MAAW;AAAA,IAIhB,KAAK,KAAK;AAAA,IAIV,KAAK,WAAW;AAAA,IAChB,IAAI,MAA2C;AAAA,MAC7C,KAAK,WAAgB;AAAA,IACvB;AAAA;AAAA,EAEF,KAAK,CAAC,WAAW;AAAA,IACf,IAAI,CAAC,aAAa,CAAC,eAAe,cAAc,KAAK,UAAU;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,IAAI,OAAO,KAAK;AAAA,IAChB,IAAI,SAAc,aAAK,KAAK,QAAQ,WAAW;AAAA,MAC7C,OAAO,KAAK,aAAa,IAAI,KAAK,WAAW,IAAI;AAAA,MACjD,IAAI,CAAC,UAAU,MAAM;AAAA,QACnB,UAAU,OAAO,UAAU,WAAW;AAAA,MACxC,EAAO;AAAA,QACL,KAAK,UAAU,UAAU;AAAA,QACzB,UAAU,SAAS,UAAU;AAAA,QAC7B,UAAU,WAAW;AAAA;AAAA,MAEvB,OAAO,IAAI;AAAA,IACb,EAAO,SAAI,KAAK,YAAY,IAAI;AAAA,MAC9B,KAAK,UAAU,KAAK;AAAA,MACpB,IAAI,KAAK,SAAS;AAAA,QAChB,MAAM,OAAO,KAAK;AAAA,QAClB,KAAK,UAAU,KAAK;AAAA,QACpB,IAAI,KAAK,SAAS;AAAA,UAChB,KAAK,QAAQ,UAAU;AAAA,QACzB;AAAA,QACA,KAAK,UAAU,UAAU;AAAA,QACzB,KAAK,UAAe;AAAA,QACpB,UAAU,SAAS,UAAU;AAAA,QAC7B,UAAU,WAAW;AAAA,QACrB,IAAI,UAAU,SAAS,MAAM;AAAA,UAC3B,UAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAiD,UAAU,SAAS;AAAA,MAClE,UAAU,QACR,OACE;AAAA,QACE,QAAQ;AAAA,MACV,GACA,SACF,CACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAET,OAAO,CAAC,WAAW;AAAA,IACjB,KAAK;AAAA,IACL;AAAA,IACA,KAAK,OAAO,SAAS;AAAA;AAAA,EAEvB,MAAM,CAAC,WAAW;AAAA,IAChB,WAAW;AAAA,IACX,IAAI;AAAA,MACF,IAAI,MAA2C;AAAA,QAC7C,SAAS,OAAO,KAAK,SAAU,MAAM,OAAO,KAAK,SAAS;AAAA,UACxD,IAAI,KAAK,IAAI,aAAa,EAAE,KAAK,IAAI,QAAQ,IAAI;AAAA,YAC/C,KAAK,IAAI,UACP,OACE;AAAA,cACE,QAAQ,KAAK;AAAA,YACf,GACA,SACF,CACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,OAAO,KAAK,KAAM,MAAM,OAAO,KAAK,SAAS;AAAA,QACpD,IAAI,KAAK,IAAI,OAAO,GAAG;AAAA,UAErB,KAAK,IAAI,IAAI,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,cACA;AAAA,MACA,SAAS;AAAA;AAAA;AAGf;AACA,SAAS,MAAM,CAAC,MAAM;AAAA,EACpB,KAAK,IAAI;AAAA,EACT,IAAI,KAAK,IAAI,QAAQ,GAAG;AAAA,IACtB,MAAM,WAAW,KAAK,IAAI;AAAA,IAC1B,IAAI,YAAY,CAAC,KAAK,IAAI,MAAM;AAAA,MAC9B,SAAS,SAAS,IAAI;AAAA,MACtB,SAAS,IAAI,SAAS,KAAM,GAAG,IAAI,EAAE,SAAS;AAAA,QAC5C,OAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,IACA,MAAM,cAAc,KAAK,IAAI;AAAA,IAC7B,IAAI,gBAAgB,MAAM;AAAA,MACxB,KAAK,UAAU;AAAA,MACf,IAAI;AAAA,QAAa,YAAY,UAAU;AAAA,IACzC;AAAA,IACA,IAAiD,KAAK,IAAI,aAAkB,WAAG;AAAA,MAC7E,KAAK,IAAI,WAAW;AAAA,IACtB;AAAA,IACA,KAAK,IAAI,OAAO;AAAA,EAClB;AAAA;AAEF,IAAM,4BAA4B,IAAI;AACtC,IAAM,8BAA8B,OACU,gBAC9C;AACA,IAAM,sCAAsC,OACE,kBAC9C;AACA,IAAM,oCAAoC,OACI,eAC9C;AACA,SAAS,KAAK,CAAC,QAAQ,MAAM,KAAK;AAAA,EAChC,IAAI,eAAe,WAAW;AAAA,IAC5B,IAAI,UAAU,UAAU,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC,SAAS;AAAA,MACZ,UAAU,IAAI,QAAQ,0BAA0B,IAAI,GAAK;AAAA,IAC3D;AAAA,IACA,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,IACzB,IAAI,CAAC,KAAK;AAAA,MACR,QAAQ,IAAI,KAAK,MAAM,IAAI,GAAK;AAAA,MAChC,IAAI,MAAM;AAAA,MACV,IAAI,MAAM;AAAA,IACZ;AAAA,IACA,IAAI,MAA2C;AAAA,MAC7C,IAAI,MAAM;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EAGF;AAAA;AAEF,SAAS,OAAO,CAAC,QAAQ,MAAM,KAAK,UAAU,UAAU,WAAW;AAAA,EACjE,MAAM,UAAU,UAAU,IAAI,MAAM;AAAA,EACpC,IAAI,CAAC,SAAS;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM,MAAM,CAAC,QAAQ;AAAA,IACnB,IAAI,KAAK;AAAA,MACP,IAAI,MAA2C;AAAA,QAC7C,IAAI,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IAGF;AAAA;AAAA,EAEF,WAAW;AAAA,EACX,IAAI,SAAS,SAAS;AAAA,IACpB,QAAQ,QAAQ,GAAG;AAAA,EACrB,EAAO;AAAA,IACL,MAAM,gBAAgB,QAAQ,MAAM;AAAA,IACpC,MAAM,eAAe,iBAAiB,aAAa,GAAG;AAAA,IACtD,IAAI,iBAAiB,QAAQ,UAAU;AAAA,MACrC,MAAM,YAAY,OAAO,QAAQ;AAAA,MACjC,QAAQ,QAAQ,CAAC,KAAK,SAAS;AAAA,QAC7B,IAAI,SAAS,YAAY,SAAS,qBAAqB,CAAC,SAAS,IAAI,KAAK,QAAQ,WAAW;AAAA,UAC3F,IAAI,GAAG;AAAA,QACT;AAAA,OACD;AAAA,IACH,EAAO;AAAA,MACL,IAAI,QAAa,aAAK,QAAQ,IAAS,SAAC,GAAG;AAAA,QACzC,IAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,MACtB;AAAA,MACA,IAAI,cAAc;AAAA,QAChB,IAAI,QAAQ,IAAI,iBAAiB,CAAC;AAAA,MACpC;AAAA,MACA,QAAQ;AAAA,aACD;AAAA,UACH,IAAI,CAAC,eAAe;AAAA,YAClB,IAAI,QAAQ,IAAI,WAAW,CAAC;AAAA,YAC5B,IAAI,MAAM,MAAM,GAAG;AAAA,cACjB,IAAI,QAAQ,IAAI,mBAAmB,CAAC;AAAA,YACtC;AAAA,UACF,EAAO,SAAI,cAAc;AAAA,YACvB,IAAI,QAAQ,IAAI,QAAQ,CAAC;AAAA,UAC3B;AAAA,UACA;AAAA,aACG;AAAA,UACH,IAAI,CAAC,eAAe;AAAA,YAClB,IAAI,QAAQ,IAAI,WAAW,CAAC;AAAA,YAC5B,IAAI,MAAM,MAAM,GAAG;AAAA,cACjB,IAAI,QAAQ,IAAI,mBAAmB,CAAC;AAAA,YACtC;AAAA,UACF;AAAA,UACA;AAAA,aACG;AAAA,UACH,IAAI,MAAM,MAAM,GAAG;AAAA,YACjB,IAAI,QAAQ,IAAI,WAAW,CAAC;AAAA,UAC9B;AAAA,UACA;AAAA;AAAA;AAAA;AAAA,EAIR,SAAS;AAAA;AAOX,SAAS,iBAAiB,CAAC,OAAO;AAAA,EAChC,MAAM,MAAM,MAAM,KAAK;AAAA,EACvB,IAAI,QAAQ;AAAA,IAAO,OAAO;AAAA,EAC1B,MAAM,KAAK,WAAW,iBAAiB;AAAA,EACvC,OAAO,UAAU,KAAK,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA;AAEpD,SAAS,gBAAgB,CAAC,KAAK;AAAA,EAC7B,MAAM,MAAM,MAAM,GAAG,GAAG,WAAW,iBAAiB;AAAA,EACpD,OAAO;AAAA;AAET,SAAS,SAAS,CAAC,QAAQ,MAAM;AAAA,EAC/B,IAAI,WAAW,MAAM,GAAG;AAAA,IACtB,OAAO,WAAW,MAAM,IAAI,WAAW,WAAW,IAAI,CAAC,IAAI,WAAW,IAAI;AAAA,EAC5E;AAAA,EACA,OAAO,WAAW,IAAI;AAAA;AAExB,IAAM,wBAAwB;AAAA,EAC5B,WAAW;AAAA,GACV,OAAO,SAAS,GAAG;AAAA,IAClB,OAAO,SAAS,MAAM,OAAO,UAAU,CAAC,SAAS,UAAU,MAAM,IAAI,CAAC;AAAA;AAAA,EAExE,MAAM,IAAI,MAAM;AAAA,IACd,OAAO,kBAAkB,IAAI,EAAE,OAC7B,GAAG,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAC1D;AAAA;AAAA,EAEF,OAAO,GAAG;AAAA,IACR,OAAO,SAAS,MAAM,WAAW,CAAC,UAAU;AAAA,MAC1C,MAAM,KAAK,UAAU,MAAM,MAAM,EAAE;AAAA,MACnC,OAAO;AAAA,KACR;AAAA;AAAA,EAEH,KAAK,CAAC,IAAI,SAAS;AAAA,IACjB,OAAO,MAAM,MAAM,SAAS,IAAI,SAAc,WAAG,SAAS;AAAA;AAAA,EAE5D,MAAM,CAAC,IAAI,SAAS;AAAA,IAClB,OAAO,MACL,MACA,UACA,IACA,SACA,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,UAAU,MAAM,IAAI,CAAC,GAC5C,SACF;AAAA;AAAA,EAEF,IAAI,CAAC,IAAI,SAAS;AAAA,IAChB,OAAO,MACL,MACA,QACA,IACA,SACA,CAAC,SAAS,UAAU,MAAM,IAAI,GAC9B,SACF;AAAA;AAAA,EAEF,SAAS,CAAC,IAAI,SAAS;AAAA,IACrB,OAAO,MAAM,MAAM,aAAa,IAAI,SAAc,WAAG,SAAS;AAAA;AAAA,EAEhE,QAAQ,CAAC,IAAI,SAAS;AAAA,IACpB,OAAO,MACL,MACA,YACA,IACA,SACA,CAAC,SAAS,UAAU,MAAM,IAAI,GAC9B,SACF;AAAA;AAAA,EAEF,aAAa,CAAC,IAAI,SAAS;AAAA,IACzB,OAAO,MAAM,MAAM,iBAAiB,IAAI,SAAc,WAAG,SAAS;AAAA;AAAA,EAGpE,OAAO,CAAC,IAAI,SAAS;AAAA,IACnB,OAAO,MAAM,MAAM,WAAW,IAAI,SAAc,WAAG,SAAS;AAAA;AAAA,EAE9D,QAAQ,IAAI,MAAM;AAAA,IAChB,OAAO,YAAY,MAAM,YAAY,IAAI;AAAA;AAAA,EAE3C,OAAO,IAAI,MAAM;AAAA,IACf,OAAO,YAAY,MAAM,WAAW,IAAI;AAAA;AAAA,EAE1C,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,kBAAkB,IAAI,EAAE,KAAK,SAAS;AAAA;AAAA,EAG/C,WAAW,IAAI,MAAM;AAAA,IACnB,OAAO,YAAY,MAAM,eAAe,IAAI;AAAA;AAAA,EAE9C,GAAG,CAAC,IAAI,SAAS;AAAA,IACf,OAAO,MAAM,MAAM,OAAO,IAAI,SAAc,WAAG,SAAS;AAAA;AAAA,EAE1D,GAAG,GAAG;AAAA,IACJ,OAAO,WAAW,MAAM,KAAK;AAAA;AAAA,EAE/B,IAAI,IAAI,MAAM;AAAA,IACZ,OAAO,WAAW,MAAM,QAAQ,IAAI;AAAA;AAAA,EAEtC,MAAM,CAAC,OAAO,MAAM;AAAA,IAClB,OAAO,OAAO,MAAM,UAAU,IAAI,IAAI;AAAA;AAAA,EAExC,WAAW,CAAC,OAAO,MAAM;AAAA,IACvB,OAAO,OAAO,MAAM,eAAe,IAAI,IAAI;AAAA;AAAA,EAE7C,KAAK,GAAG;AAAA,IACN,OAAO,WAAW,MAAM,OAAO;AAAA;AAAA,EAGjC,IAAI,CAAC,IAAI,SAAS;AAAA,IAChB,OAAO,MAAM,MAAM,QAAQ,IAAI,SAAc,WAAG,SAAS;AAAA;AAAA,EAE3D,MAAM,IAAI,MAAM;AAAA,IACd,OAAO,WAAW,MAAM,UAAU,IAAI;AAAA;AAAA,EAExC,UAAU,GAAG;AAAA,IACX,OAAO,kBAAkB,IAAI,EAAE,WAAW;AAAA;AAAA,EAE5C,QAAQ,CAAC,UAAU;AAAA,IACjB,OAAO,kBAAkB,IAAI,EAAE,SAAS,QAAQ;AAAA;AAAA,EAElD,SAAS,IAAI,MAAM;AAAA,IACjB,OAAO,kBAAkB,IAAI,EAAE,UAAU,GAAG,IAAI;AAAA;AAAA,EAElD,OAAO,IAAI,MAAM;AAAA,IACf,OAAO,WAAW,MAAM,WAAW,IAAI;AAAA;AAAA,EAEzC,MAAM,GAAG;AAAA,IACP,OAAO,SAAS,MAAM,UAAU,CAAC,SAAS,UAAU,MAAM,IAAI,CAAC;AAAA;AAEnE;AACA,SAAS,QAAQ,CAAC,OAAM,QAAQ,WAAW;AAAA,EACzC,MAAM,MAAM,iBAAiB,KAAI;AAAA,EACjC,MAAM,OAAO,IAAI,QAAQ;AAAA,EACzB,IAAI,QAAQ,SAAQ,CAAC,UAAU,KAAI,GAAG;AAAA,IACpC,KAAK,QAAQ,KAAK;AAAA,IAClB,KAAK,OAAO,MAAM;AAAA,MAChB,MAAM,SAAS,KAAK,MAAM;AAAA,MAC1B,IAAI,CAAC,OAAO,MAAM;AAAA,QAChB,OAAO,QAAQ,UAAU,OAAO,KAAK;AAAA,MACvC;AAAA,MACA,OAAO;AAAA;AAAA,EAEX;AAAA,EACA,OAAO;AAAA;AAET,IAAM,aAAa,MAAM;AACzB,SAAS,KAAK,CAAC,OAAM,QAAQ,IAAI,SAAS,cAAc,MAAM;AAAA,EAC5D,MAAM,MAAM,iBAAiB,KAAI;AAAA,EACjC,MAAM,YAAY,QAAQ,SAAQ,CAAC,UAAU,KAAI;AAAA,EACjD,MAAM,WAAW,IAAI;AAAA,EACrB,IAAI,aAAa,WAAW,SAAS;AAAA,IACnC,MAAM,UAAU,SAAS,MAAM,OAAM,IAAI;AAAA,IACzC,OAAO,YAAY,WAAW,OAAO,IAAI;AAAA,EAC3C;AAAA,EACA,IAAI,YAAY;AAAA,EAChB,IAAI,QAAQ,OAAM;AAAA,IAChB,IAAI,WAAW;AAAA,MACb,YAAY,QAAQ,CAAC,MAAM,OAAO;AAAA,QAChC,OAAO,GAAG,KAAK,MAAM,UAAU,OAAM,IAAI,GAAG,OAAO,KAAI;AAAA;AAAA,IAE3D,EAAO,SAAI,GAAG,SAAS,GAAG;AAAA,MACxB,YAAY,QAAQ,CAAC,MAAM,OAAO;AAAA,QAChC,OAAO,GAAG,KAAK,MAAM,MAAM,OAAO,KAAI;AAAA;AAAA,IAE1C;AAAA,EACF;AAAA,EACA,MAAM,SAAS,SAAS,KAAK,KAAK,WAAW,OAAO;AAAA,EACpD,OAAO,aAAa,eAAe,aAAa,MAAM,IAAI;AAAA;AAE5D,SAAS,MAAM,CAAC,OAAM,QAAQ,IAAI,MAAM;AAAA,EACtC,MAAM,MAAM,iBAAiB,KAAI;AAAA,EACjC,MAAM,YAAY,QAAQ,SAAQ,CAAC,UAAU,KAAI;AAAA,EACjD,IAAI,YAAY;AAAA,EAChB,IAAI,yBAAyB;AAAA,EAC7B,IAAI,QAAQ,OAAM;AAAA,IAChB,IAAI,WAAW;AAAA,MACb,yBAAyB,KAAK,WAAW;AAAA,MACzC,YAAY,QAAQ,CAAC,KAAK,MAAM,OAAO;AAAA,QACrC,IAAI,wBAAwB;AAAA,UAC1B,yBAAyB;AAAA,UACzB,MAAM,UAAU,OAAM,GAAG;AAAA,QAC3B;AAAA,QACA,OAAO,GAAG,KAAK,MAAM,KAAK,UAAU,OAAM,IAAI,GAAG,OAAO,KAAI;AAAA;AAAA,IAEhE,EAAO,SAAI,GAAG,SAAS,GAAG;AAAA,MACxB,YAAY,QAAQ,CAAC,KAAK,MAAM,OAAO;AAAA,QACrC,OAAO,GAAG,KAAK,MAAM,KAAK,MAAM,OAAO,KAAI;AAAA;AAAA,IAE/C;AAAA,EACF;AAAA,EACA,MAAM,SAAS,IAAI,QAAQ,WAAW,GAAG,IAAI;AAAA,EAC7C,OAAO,yBAAyB,UAAU,OAAM,MAAM,IAAI;AAAA;AAE5D,SAAS,WAAW,CAAC,OAAM,QAAQ,MAAM;AAAA,EACvC,MAAM,MAAM,MAAM,KAAI;AAAA,EACtB,MAAM,KAAK,WAAW,iBAAiB;AAAA,EACvC,MAAM,MAAM,IAAI,QAAQ,GAAG,IAAI;AAAA,EAC/B,KAAK,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAAK,EAAE,GAAG;AAAA,IACrD,KAAK,KAAK,MAAM,KAAK,EAAE;AAAA,IACvB,OAAO,IAAI,QAAQ,GAAG,IAAI;AAAA,EAC5B;AAAA,EACA,OAAO;AAAA;AAET,SAAS,UAAU,CAAC,OAAM,QAAQ,OAAO,CAAC,GAAG;AAAA,EAC3C,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM,MAAM,MAAM,KAAI,EAAE,QAAQ,MAAM,OAAM,IAAI;AAAA,EAChD,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA;AAGT,IAAM,qCAAqC,QAAQ,6BAA6B;AAChF,IAAM,iBAAiB,IAAI,oBACT,OAAO,oBAAoB,MAAM,EAAE,OAAO,CAAC,QAAQ,QAAQ,eAAe,QAAQ,QAAQ,EAAE,IAAI,CAAC,QAAQ,OAAO,IAAI,EAAE,OAAO,QAAQ,CACvJ;AACA,SAAS,eAAc,CAAC,KAAK;AAAA,EAC3B,IAAI,CAAC,SAAS,GAAG;AAAA,IAAG,MAAM,OAAO,GAAG;AAAA,EACpC,MAAM,MAAM,MAAM,IAAI;AAAA,EACtB,MAAM,KAAK,OAAO,GAAG;AAAA,EACrB,OAAO,IAAI,eAAe,GAAG;AAAA;AAAA;AAE/B,MAAM,oBAAoB;AAAA,EACxB,WAAW,CAAC,cAAc,OAAO,aAAa,OAAO;AAAA,IACnD,KAAK,cAAc;AAAA,IACnB,KAAK,aAAa;AAAA;AAAA,EAEpB,GAAG,CAAC,QAAQ,KAAK,UAAU;AAAA,IACzB,IAAI,QAAQ;AAAA,MAAY,OAAO,OAAO;AAAA,IACtC,MAAM,cAAc,KAAK,aAAa,aAAa,KAAK;AAAA,IACxD,IAAI,QAAQ,kBAAkB;AAAA,MAC5B,OAAO,CAAC;AAAA,IACV,EAAO,SAAI,QAAQ,kBAAkB;AAAA,MACnC,OAAO;AAAA,IACT,EAAO,SAAI,QAAQ,iBAAiB;AAAA,MAClC,OAAO;AAAA,IACT,EAAO,SAAI,QAAQ,WAAW;AAAA,MAC5B,IAAI,cAAc,cAAc,aAAa,qBAAqB,cAAc,aAAa,qBAAqB,aAAa,IAAI,MAAM,KAEzI,OAAO,eAAe,MAAM,MAAM,OAAO,eAAe,QAAQ,GAAG;AAAA,QACjE,OAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,gBAAgB,QAAQ,MAAM;AAAA,IACpC,IAAI,CAAC,aAAa;AAAA,MAChB,IAAI;AAAA,MACJ,IAAI,kBAAkB,KAAK,sBAAsB,OAAO;AAAA,QACtD,OAAO;AAAA,MACT;AAAA,MACA,IAAI,QAAQ,kBAAkB;AAAA,QAC5B,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,MAAM,QAAQ,IAClB,QACA,KAIA,MAAM,MAAM,IAAI,SAAS,QAC3B;AAAA,IACA,IAAI,SAAS,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,mBAAmB,GAAG,GAAG;AAAA,MACrE,OAAO;AAAA,IACT;AAAA,IACA,IAAI,CAAC,aAAa;AAAA,MAChB,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B;AAAA,IACA,IAAI,YAAY;AAAA,MACd,OAAO;AAAA,IACT;AAAA,IACA,IAAI,MAAM,GAAG,GAAG;AAAA,MACd,MAAM,QAAQ,iBAAiB,aAAa,GAAG,IAAI,MAAM,IAAI;AAAA,MAC7D,OAAO,eAAe,SAAS,KAAK,IAAI,SAAS,KAAK,IAAI;AAAA,IAC5D;AAAA,IACA,IAAI,SAAS,GAAG,GAAG;AAAA,MACjB,OAAO,cAAc,SAAS,GAAG,IAAI,SAAS,GAAG;AAAA,IACnD;AAAA,IACA,OAAO;AAAA;AAEX;AAAA;AACA,MAAM,+BAA+B,oBAAoB;AAAA,EACvD,WAAW,CAAC,aAAa,OAAO;AAAA,IAC9B,MAAM,OAAO,UAAU;AAAA;AAAA,EAEzB,GAAG,CAAC,QAAQ,KAAK,OAAO,UAAU;AAAA,IAChC,IAAI,WAAW,OAAO;AAAA,IACtB,MAAM,wBAAwB,QAAQ,MAAM,KAAK,aAAa,GAAG;AAAA,IACjE,IAAI,CAAC,KAAK,YAAY;AAAA,MACpB,MAAM,qBAAqB,WAAW,QAAQ;AAAA,MAC9C,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,KAAK,GAAG;AAAA,QAC3C,WAAW,MAAM,QAAQ;AAAA,QACzB,QAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,MACA,IAAI,CAAC,yBAAyB,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,GAAG;AAAA,QAC9D,IAAI,oBAAoB;AAAA,UACtB,IAAI,MAA2C;AAAA,YAC7C,KACE,yBAAyB,OAAO,GAAG,kCACnC,OAAO,IACT;AAAA,UACF;AAAA,UACA,OAAO;AAAA,QACT,EAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB,OAAO;AAAA;AAAA,MAEX;AAAA,IACF;AAAA,IACA,MAAM,SAAS,wBAAwB,OAAO,GAAG,IAAI,OAAO,SAAS,OAAO,QAAQ,GAAG;AAAA,IACvF,MAAM,SAAS,QAAQ,IACrB,QACA,KACA,OACA,MAAM,MAAM,IAAI,SAAS,QAC3B;AAAA,IACA,IAAI,WAAW,MAAM,QAAQ,KAAK,QAAQ;AAAA,MACxC,IAAI,CAAC,QAAQ;AAAA,QACX,QAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,MACnC,EAAO,SAAI,WAAW,OAAO,QAAQ,GAAG;AAAA,QACtC,QAAQ,QAAQ,OAAO,KAAK,OAAO,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAET,cAAc,CAAC,QAAQ,KAAK;AAAA,IAC1B,MAAM,SAAS,OAAO,QAAQ,GAAG;AAAA,IACjC,MAAM,WAAW,OAAO;AAAA,IACxB,MAAM,SAAS,QAAQ,eAAe,QAAQ,GAAG;AAAA,IACjD,IAAI,UAAU,QAAQ;AAAA,MACpB,QAAQ,QAAQ,UAAU,KAAU,WAAG,QAAQ;AAAA,IACjD;AAAA,IACA,OAAO;AAAA;AAAA,EAET,GAAG,CAAC,QAAQ,KAAK;AAAA,IACf,MAAM,SAAS,QAAQ,IAAI,QAAQ,GAAG;AAAA,IACtC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe,IAAI,GAAG,GAAG;AAAA,MAC9C,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA;AAAA,EAET,OAAO,CAAC,QAAQ;AAAA,IACd,MACE,QACA,WACA,QAAQ,MAAM,IAAI,WAAW,WAC/B;AAAA,IACA,OAAO,QAAQ,QAAQ,MAAM;AAAA;AAEjC;AAAA;AACA,MAAM,gCAAgC,oBAAoB;AAAA,EACxD,WAAW,CAAC,aAAa,OAAO;AAAA,IAC9B,MAAM,MAAM,UAAU;AAAA;AAAA,EAExB,GAAG,CAAC,QAAQ,KAAK;AAAA,IACf,IAAI,MAA2C;AAAA,MAC7C,KACE,yBAAyB,OAAO,GAAG,kCACnC,MACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAET,cAAc,CAAC,QAAQ,KAAK;AAAA,IAC1B,IAAI,MAA2C;AAAA,MAC7C,KACE,4BAA4B,OAAO,GAAG,kCACtC,MACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAEX;AACA,IAAM,kCAAkC,IAAI;AAC5C,IAAM,mCAAmC,IAAI;AAI7C,IAAM,YAAY,CAAC,UAAU;AAC7B,IAAM,WAAW,CAAC,MAAM,QAAQ,eAAe,CAAC;AAChD,SAAS,oBAAoB,CAAC,QAAQ,aAAa,YAAY;AAAA,EAC7D,OAAO,QAAQ,IAAI,MAAM;AAAA,IACvB,MAAM,SAAS,KAAK;AAAA,IACpB,MAAM,YAAY,MAAM,MAAM;AAAA,IAC9B,MAAM,cAAc,MAAM,SAAS;AAAA,IACnC,MAAM,SAAS,WAAW,aAAa,WAAW,OAAO,YAAY;AAAA,IACrE,MAAM,YAAY,WAAW,UAAU;AAAA,IACvC,MAAM,gBAAgB,OAAO,QAAQ,GAAG,IAAI;AAAA,IAC5C,MAAM,OAAO,aAAa,YAAY,cAAc,aAAa;AAAA,IACjE,CAAC,eAAe,MACd,WACA,WACA,YAAY,sBAAsB,WACpC;AAAA,IACA,OAAO,OAEL,OAAO,OAAO,aAAa,GAC3B;AAAA,MAEE,IAAI,GAAG;AAAA,QACL,QAAQ,OAAO,SAAS,cAAc,KAAK;AAAA,QAC3C,OAAO,OAAO,EAAE,OAAO,KAAK,IAAI;AAAA,UAC9B,OAAO,SAAS,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,MAAM,EAAE,CAAC,IAAI,KAAK,KAAK;AAAA,UAC7D;AAAA,QACF;AAAA;AAAA,IAEJ,CACF;AAAA;AAAA;AAGJ,SAAS,oBAAoB,CAAC,MAAM;AAAA,EAClC,OAAO,QAAQ,IAAI,MAAM;AAAA,IACvB,IAAI,MAA2C;AAAA,MAC7C,MAAM,MAAM,KAAK,KAAK,WAAW,KAAK,SAAS;AAAA,MAC/C,KACE,GAAG,WAAW,IAAI,eAAe,kCACjC,MAAM,IAAI,CACZ;AAAA,IACF;AAAA,IACA,OAAO,SAAS,WAAW,QAAQ,SAAS,UAAe,YAAI;AAAA;AAAA;AAGnE,SAAS,sBAAsB,CAAC,UAAU,SAAS;AAAA,EACjD,MAAM,mBAAmB;AAAA,IACvB,GAAG,CAAC,KAAK;AAAA,MACP,MAAM,SAAS,KAAK;AAAA,MACpB,MAAM,YAAY,MAAM,MAAM;AAAA,MAC9B,MAAM,SAAS,MAAM,GAAG;AAAA,MACxB,IAAI,CAAC,UAAU;AAAA,QACb,IAAI,WAAW,KAAK,MAAM,GAAG;AAAA,UAC3B,MAAM,WAAW,OAAO,GAAG;AAAA,QAC7B;AAAA,QACA,MAAM,WAAW,OAAO,MAAM;AAAA,MAChC;AAAA,MACA,QAAQ,QAAQ,SAAS,SAAS;AAAA,MAClC,MAAM,OAAO,UAAU,YAAY,WAAW,aAAa;AAAA,MAC3D,IAAI,IAAI,KAAK,WAAW,GAAG,GAAG;AAAA,QAC5B,OAAO,KAAK,OAAO,IAAI,GAAG,CAAC;AAAA,MAC7B,EAAO,SAAI,IAAI,KAAK,WAAW,MAAM,GAAG;AAAA,QACtC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC;AAAA,MAChC,EAAO,SAAI,WAAW,WAAW;AAAA,QAC/B,OAAO,IAAI,GAAG;AAAA,MAChB;AAAA;AAAA,QAEE,IAAI,GAAG;AAAA,MACT,MAAM,SAAS,KAAK;AAAA,MACpB,CAAC,YAAY,MAAM,MAAM,MAAM,GAAG,WAAW,WAAW;AAAA,MACxD,OAAO,OAAO;AAAA;AAAA,IAEhB,GAAG,CAAC,KAAK;AAAA,MACP,MAAM,SAAS,KAAK;AAAA,MACpB,MAAM,YAAY,MAAM,MAAM;AAAA,MAC9B,MAAM,SAAS,MAAM,GAAG;AAAA,MACxB,IAAI,CAAC,UAAU;AAAA,QACb,IAAI,WAAW,KAAK,MAAM,GAAG;AAAA,UAC3B,MAAM,WAAW,OAAO,GAAG;AAAA,QAC7B;AAAA,QACA,MAAM,WAAW,OAAO,MAAM;AAAA,MAChC;AAAA,MACA,OAAO,QAAQ,SAAS,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM;AAAA;AAAA,IAEhF,OAAO,CAAC,UAAU,SAAS;AAAA,MACzB,MAAM,WAAW;AAAA,MACjB,MAAM,SAAS,SAAS;AAAA,MACxB,MAAM,YAAY,MAAM,MAAM;AAAA,MAC9B,MAAM,OAAO,UAAU,YAAY,WAAW,aAAa;AAAA,MAC3D,CAAC,YAAY,MAAM,WAAW,WAAW,WAAW;AAAA,MACpD,OAAO,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAAA,QACpC,OAAO,SAAS,KAAK,SAAS,KAAK,KAAK,GAAG,KAAK,GAAG,GAAG,QAAQ;AAAA,OAC/D;AAAA;AAAA,EAEL;AAAA,EACA,OACE,kBACA,WAAW;AAAA,IACT,KAAK,qBAAqB,KAAK;AAAA,IAC/B,KAAK,qBAAqB,KAAK;AAAA,IAC/B,QAAQ,qBAAqB,QAAQ;AAAA,IACrC,OAAO,qBAAqB,OAAO;AAAA,EACrC,IAAI;AAAA,IACF,GAAG,CAAC,OAAO;AAAA,MACT,MAAM,SAAS,MAAM,IAAI;AAAA,MACzB,MAAM,QAAQ,SAAS,MAAM;AAAA,MAC7B,MAAM,WAAW,MAAM,KAAK;AAAA,MAC5B,MAAM,aAAa,CAAC,WAAW,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,KAAK,IAAI,WAAW;AAAA,MACpF,MAAM,SAAS,MAAM,IAAI,KAAK,QAAQ,UAAU,KAAK,WAAW,OAAO,UAAU,KAAK,MAAM,IAAI,KAAK,QAAQ,KAAK,KAAK,WAAW,UAAU,UAAU,KAAK,MAAM,IAAI,KAAK,QAAQ,QAAQ;AAAA,MAC1L,IAAI,CAAC,QAAQ;AAAA,QACX,OAAO,IAAI,UAAU;AAAA,QACrB,QAAQ,QAAQ,OAAO,YAAY,UAAU;AAAA,MAC/C;AAAA,MACA,OAAO;AAAA;AAAA,IAET,GAAG,CAAC,KAAK,OAAO;AAAA,MACd,IAAI,CAAC,WAAW,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,KAAK,GAAG;AAAA,QACvD,QAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,MACA,MAAM,SAAS,MAAM,IAAI;AAAA,MACzB,QAAQ,KAAK,QAAQ,SAAS,MAAM;AAAA,MACpC,IAAI,SAAS,IAAI,KAAK,QAAQ,GAAG;AAAA,MACjC,IAAI,CAAC,QAAQ;AAAA,QACX,MAAM,MAAM,GAAG;AAAA,QACf,SAAS,IAAI,KAAK,QAAQ,GAAG;AAAA,MAC/B,EAAO,SAAI,MAA2C;AAAA,QACpD,kBAAkB,QAAQ,KAAK,GAAG;AAAA,MACpC;AAAA,MACA,MAAM,WAAW,IAAI,KAAK,QAAQ,GAAG;AAAA,MACrC,OAAO,IAAI,KAAK,KAAK;AAAA,MACrB,IAAI,CAAC,QAAQ;AAAA,QACX,QAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,MACnC,EAAO,SAAI,WAAW,OAAO,QAAQ,GAAG;AAAA,QACtC,QAAQ,QAAQ,OAAO,KAAK,OAAO,QAAQ;AAAA,MAC7C;AAAA,MACA,OAAO;AAAA;AAAA,IAET,MAAM,CAAC,KAAK;AAAA,MACV,MAAM,SAAS,MAAM,IAAI;AAAA,MACzB,QAAQ,KAAK,QAAQ,SAAS,MAAM;AAAA,MACpC,IAAI,SAAS,IAAI,KAAK,QAAQ,GAAG;AAAA,MACjC,IAAI,CAAC,QAAQ;AAAA,QACX,MAAM,MAAM,GAAG;AAAA,QACf,SAAS,IAAI,KAAK,QAAQ,GAAG;AAAA,MAC/B,EAAO,SAAI,MAA2C;AAAA,QACpD,kBAAkB,QAAQ,KAAK,GAAG;AAAA,MACpC;AAAA,MACA,MAAM,WAAW,MAAM,IAAI,KAAK,QAAQ,GAAG,IAAS;AAAA,MACpD,MAAM,SAAS,OAAO,OAAO,GAAG;AAAA,MAChC,IAAI,QAAQ;AAAA,QACV,QAAQ,QAAQ,UAAU,KAAU,WAAG,QAAQ;AAAA,MACjD;AAAA,MACA,OAAO;AAAA;AAAA,IAET,KAAK,GAAG;AAAA,MACN,MAAM,SAAS,MAAM,IAAI;AAAA,MACzB,MAAM,WAAW,OAAO,SAAS;AAAA,MACjC,MAAM,YAAwD,MAAM,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;AAAA,MAC9G,MAAM,SAAS,OAAO,MAAM;AAAA,MAC5B,IAAI,UAAU;AAAA,QACZ,QACE,QACA,SACK,WACA,WACL,SACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA;AAAA,EAEX,CACF;AAAA,EACA,MAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB,QAAQ,CAAC,WAAW;AAAA,IAClC,iBAAiB,UAAU,qBAAqB,QAAQ,UAAU,OAAO;AAAA,GAC1E;AAAA,EACD,OAAO;AAAA;AAET,SAAS,2BAA2B,CAAC,aAAa,SAAS;AAAA,EACzD,MAAM,mBAAmB,uBAAuB,aAAa,OAAO;AAAA,EACpE,OAAO,CAAC,QAAQ,KAAK,aAAa;AAAA,IAChC,IAAI,QAAQ,kBAAkB;AAAA,MAC5B,OAAO,CAAC;AAAA,IACV,EAAO,SAAI,QAAQ,kBAAkB;AAAA,MACnC,OAAO;AAAA,IACT,EAAO,SAAI,QAAQ,WAAW;AAAA,MAC5B,OAAO;AAAA,IACT;AAAA,IACA,OAAO,QAAQ,IACb,OAAO,kBAAkB,GAAG,KAAK,OAAO,SAAS,mBAAmB,QACpE,KACA,QACF;AAAA;AAAA;AAGJ,IAAM,4BAA4B;AAAA,EAChC,qBAAqB,4BAA4B,OAAO,KAAK;AAC/D;AAIA,IAAM,6BAA6B;AAAA,EACjC,qBAAqB,4BAA4B,MAAM,KAAK;AAC9D;AAIA,SAAS,iBAAiB,CAAC,QAAQ,KAAK,KAAK;AAAA,EAC3C,MAAM,SAAS,MAAM,GAAG;AAAA,EACxB,IAAI,WAAW,OAAO,IAAI,KAAK,QAAQ,MAAM,GAAG;AAAA,IAC9C,MAAM,OAAO,UAAU,MAAM;AAAA,IAC7B,KACE,YAAY,sEAAsE,SAAS,QAAQ,aAAa,gKAClH;AAAA,EACF;AAAA;AAGF,IAAM,8BAA8B,IAAI;AACxC,IAAM,qCAAqC,IAAI;AAC/C,IAAM,8BAA8B,IAAI;AACxC,IAAM,qCAAqC,IAAI;AAC/C,SAAS,aAAa,CAAC,SAAS;AAAA,EAC9B,QAAQ;AAAA,SACD;AAAA,SACA;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACH,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAIb,SAAS,QAAQ,CAAC,QAAQ;AAAA,EACxB,oBAAoB,WAAW,MAAM,GAAG;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,qBACL,QACA,OACA,iBACA,2BACA,WACF;AAAA;AAaF,SAAS,QAAQ,CAAC,QAAQ;AAAA,EACxB,OAAO,qBACL,QACA,MACA,kBACA,4BACA,WACF;AAAA;AAYF,SAAS,oBAAoB,CAAC,QAAQ,aAAa,cAAc,oBAAoB,UAAU;AAAA,EAC7F,IAAI,CAAC,SAAS,MAAM,GAAG;AAAA,IACrB,IAAI,MAA2C;AAAA,MAC7C,KACE,wBAAwB,cAAc,aAAa,eAAe,OAChE,MACF,GACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,cAAc,EAAE,eAAe,OAAO,oBAAoB;AAAA,IACnE,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,eAAe,CAAC,OAAO,aAAa,MAAM,GAAG;AAAA,IACtD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,gBAAgB,SAAS,IAAI,MAAM;AAAA,EACzC,IAAI,eAAe;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,aAAa,cAAc,UAAU,MAAM,CAAC;AAAA,EAClD,IAAI,eAAe,GAAiB;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,IAAI,MAChB,QACA,eAAe,IAAqB,qBAAqB,YAC3D;AAAA,EACA,SAAS,IAAI,QAAQ,KAAK;AAAA,EAC1B,OAAO;AAAA;AAGT,SAAS,UAAU,CAAC,OAAO;AAAA,EACzB,oBAAoB,WAAW,KAAK,GAAG;AAAA,IACrC,uBAAuB,WAAW,MAAM,UAAU;AAAA,EACpD;AAAA,EACA,OAAO,CAAC,EAAE,SAAS,MAAM;AAAA;AAG3B,SAAS,UAAU,CAAC,OAAO;AAAA,EACzB,OAAO,CAAC,EAAE,SAAS,MAAM;AAAA;AAG3B,SAAS,SAAS,CAAC,OAAO;AAAA,EACxB,OAAO,CAAC,EAAE,SAAS,MAAM;AAAA;AAG3B,SAAS,OAAO,CAAC,OAAO;AAAA,EACtB,OAAO,QAAQ,CAAC,CAAC,MAAM,aAAa;AAAA;AAGtC,SAAS,KAAK,CAAC,UAAU;AAAA,EACvB,MAAM,MAAM,YAAY,SAAS;AAAA,EACjC,OAAO,sBAAsB,MAAM,GAAG,IAAI;AAAA;AAQ5C,IAAM,aAAa,CAAC,UAAU,SAAS,KAAK,oBAAoB,SAAS,KAAK,IAAI;AAClF,IAAM,aAAa,CAAC,UAAU,SAAS,KAAK,oBAAoB,SAAS,KAAK,IAAI;AAGlF,SAAS,KAAK,CAAC,GAAG;AAAA,EAChB,OAAO,IAAI,EAAE,iBAAiB,OAAO;AAAA;AAGvC,SAAS,GAAG,CAAC,OAAO;AAAA,EAClB,OAAO,UAAU,OAAO,KAAK;AAAA;AAM/B,SAAS,SAAS,CAAC,UAAU,SAAS;AAAA,EACpC,oBAAoB,MAAM,QAAQ,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,IAAI,QAAQ,UAAU,OAAO;AAAA;AAAA;AAEtC,MAAM,QAAQ;AAAA,EACZ,WAAW,CAAC,OAAO,YAAY;AAAA,IAC7B,KAAK,MAAM,IAAI;AAAA,IACf,KAAK,eAAe;AAAA,IACpB,KAAK,mBAAmB;AAAA,IACxB,KAAK,YAAY,aAAa,QAAQ,MAAM,KAAK;AAAA,IACjD,KAAK,SAAS,aAAa,QAAQ,WAAW,KAAK;AAAA,IACnD,KAAK,mBAAmB;AAAA;AAAA,MAEtB,KAAK,GAAG;AAAA,IACV,IAAI,MAA2C;AAAA,MAC7C,KAAK,IAAI,MAAM;AAAA,QACb,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA,IAGA,OAAO,KAAK;AAAA;AAAA,MAEV,KAAK,CAAC,UAAU;AAAA,IAClB,MAAM,WAAW,KAAK;AAAA,IACtB,MAAM,iBAAiB,KAAK,oBAAoB,UAAU,QAAQ,KAAK,WAAW,QAAQ;AAAA,IAC1F,WAAW,iBAAiB,WAAW,MAAM,QAAQ;AAAA,IACrD,IAAI,WAAW,UAAU,QAAQ,GAAG;AAAA,MAClC,KAAK,YAAY;AAAA,MACjB,KAAK,SAAS,iBAAiB,WAAW,WAAW,QAAQ;AAAA,MAC7D,IAAI,MAA2C;AAAA,QAC7C,KAAK,IAAI,QAAQ;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IAGF;AAAA;AAEJ;AAmIA,MAAM,gBAAgB;AAAA,EACpB,WAAW,CAAC,IAAI,QAAQ,OAAO;AAAA,IAC7B,KAAK,KAAK;AAAA,IACV,KAAK,SAAS;AAAA,IAId,KAAK,SAAc;AAAA,IAInB,KAAK,MAAM,IAAI,IAAI,IAAI;AAAA,IAIvB,KAAK,YAAY;AAAA,IAMjB,KAAK,OAAY;AAAA,IAIjB,KAAK,WAAgB;AAAA,IAIrB,KAAK,QAAQ;AAAA,IAIb,KAAK,gBAAgB,gBAAgB;AAAA,IAIrC,KAAK,OAAY;AAAA,IAEjB,KAAK,SAAS;AAAA,IACd,KAAK,oBAAoB,CAAC;AAAA,IAC1B,KAAK,QAAQ;AAAA;AAAA,EAKf,MAAM,GAAG;AAAA,IACP,KAAK,SAAS;AAAA,IACd,IAAI,EAAE,KAAK,QAAQ,MACnB,cAAc,MAAM;AAAA,MAClB,MAAM,MAAM,IAAI;AAAA,MAChB,OAAO;AAAA,IACT,EAAO,SAAI;AAAA;AAAA;AAAA,MAET,KAAK,GAAG;AAAA,IACV,MAAM,OAAmD,KAAK,IAAI,MAAM;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAAC;AAAA,IACD,gBAAgB,IAAI;AAAA,IACpB,IAAI,MAAM;AAAA,MACR,KAAK,UAAU,KAAK,IAAI;AAAA,IAC1B;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,MAEV,KAAK,CAAC,UAAU;AAAA,IAClB,IAAI,KAAK,QAAQ;AAAA,MACf,KAAK,OAAO,QAAQ;AAAA,IACtB,EAAO,SAAI,MAA2C;AAAA,MACpD,KAAK,oDAAoD;AAAA,IAC3D;AAAA;AAEJ;AAEA,SAAS,QAAQ,CAAC,iBAAiB,cAAc,QAAQ,OAAO;AAAA,EAC9D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,WAAW,eAAe,GAAG;AAAA,IAC/B,SAAS;AAAA,EACX,EAAO;AAAA,IACL,SAAS,gBAAgB;AAAA,IACzB,SAAS,gBAAgB;AAAA;AAAA,EAE3B,MAAM,OAAO,IAAI,gBAAgB,QAAQ,QAAQ,KAAK;AAAA,EACtD,IAAiD,gBAAgB,CAAC,OAAO;AAAA,IACvE,KAAK,UAAU,aAAa;AAAA,IAC5B,KAAK,YAAY,aAAa;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;;;ACrtDT,SAAS,QAAQ,CAAC,OAAyC;AAAA,EACzD,MAAM,MAAM,MAAM;AAAA,EAClB,OAAO,OAAO,OAAO,QAAQ,WAAY,MAAsB;AAAA;AAQjE,IAAM,eAAe,IAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,YAAY,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;AACpC,IAAM,aAAa,IAAI,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,iBAAiB,IAAI,IAAI,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI,CAAC;AAC5D,IAAM,mBAAmB,IAAI,IAAI,CAAC,QAAQ,OAAO,SAAS,WAAW,QAAQ,CAAC;AAC9E,IAAM,gBAAgB,IAAI,IAAI,CAAC,UAAU,OAAO,QAAQ,CAAC;AAElD,IAAM,oBAAoB,IAAI,IAAI;AAAA,EACvC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,CAAC;AAMM,SAAS,UAAU,CAAC,IAAY;AAAA,EACrC,OAAO,aAAa,IAAI,EAAE;AAAA;AAY5B,SAAS,cAAc,CACrB,SACA,OACA,OACA,SACS;AAAA,EACT,IAAI,YAAY,QAAQ,YAAY,WAAW;AAAA,IAC7C,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,KAAK,cAAc,SAAS;AAAA,IACnF,OAAO,mBAAmB,SAA2B,OAAO,OAAO,OAAO;AAAA,EAC5E;AAAA,EAGA,IAAI,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,KAAK,UAAU,SAAS;AAAA,IAC/E,OAAO,eAAgB,QAA6B,MAAM,OAAO,OAAO,OAAO;AAAA,EACjF;AAAA,EAGA,IAAI,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B,OAAO,QAAQ,IAAI,CAAC,MAAe,eAAe,GAAG,OAAO,OAAO,OAAO,CAAC;AAAA,EAC7E;AAAA,EAGA,OAAO;AAAA;AAIT,SAAS,cAAc,CAAC,MAAa,OAAgB,OAAqB,SAAmB;AAAA,EAC3F,IAAI,SAAQ,eAAe;AAAA,IACzB,OAAO,SAAS;AAAA,EAClB;AAAA,EACA,IAAI,KAAI,WAAW,UAAU,GAAG;AAAA,IAC9B,OAAO,SAAS;AAAA,EAClB;AAAA,EACA,IAAI,KAAI,WAAW,SAAS,GAAG;AAAA,IAC7B,MAAM,OAAO,KAAI,MAAM,UAAU,MAAM;AAAA,IACvC,OAAO,QAAQ,OAAO,IAAI;AAAA,EAC5B;AAAA,EACA,IAAI,KAAI,WAAW,OAAO,GAAG;AAAA,IAC3B,MAAM,QAAQ,KAAI,MAAM,GAAG;AAAA,IAC3B,SAAS,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM,MAAM,SAAS,KAAK;AAAA,IAC1B,IAAI,QAAQ,QAAQ;AAAA,MAClB,OAAO,SAAS,QAAQ,KAAK,QAAQ,MAAM;AAAA,IAC7C,EAAO,SAAI,QAAQ,SAAS;AAAA,MAC1B,OAAO,SAAS,SAAS,KAAK,SAAS,MAAM;AAAA,IAC/C,EAAO;AAAA,MACL,OAAO,MAAM,QAAS,MAAM,QAAQ;AAAA;AAAA,IAEtC,OAAO,MAAM,SAAS,IAAI,QAAQ,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI;AAAA,EACtE;AAAA,EACA,IAAI,KAAI,WAAW,UAAU,GAAG;AAAA,IAC9B,MAAM,MAAM,KAAI,MAAM,WAAW,MAAM;AAAA,IACvC,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAC7B,IAAI,UAAU,IAAI;AAAA,MAChB,OAAO,MAAM;AAAA,IACf;AAAA,IACA,OAAO,QAAQ,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,EACjE;AAAA,EACA,IAAI,KAAI,WAAW,UAAU,GAAG;AAAA,IAC9B,OAAO,MAAM,KAAI,MAAM,WAAW,MAAM;AAAA,EAC1C;AAAA,EACA,IAAI,KAAI,WAAW,UAAU,GAAG;AAAA,IAC9B,OAAO,QAAQ,WAAW,QAAQ,KAAI,MAAM,WAAW,MAAM,CAAC;AAAA,EAChE;AAAA,EACA,IAAI,KAAI,WAAW,YAAY,GAAG;AAAA,IAChC,OAAO,QAAQ,WAAW,UAAU,KAAI,MAAM,aAAa,MAAM,CAAC;AAAA,EACpE;AAAA,EACA,OAAO,MAAM,SAAQ;AAAA;AAIvB,SAAS,kBAAkB,CACzB,MACA,OACA,QACA,SAC+B;AAAA,EAC/B,IAAI,KAAI,WAAW,OAAO,GAAG;AAAA,IAC3B,MAAM,QAAQ,KAAI,MAAM,GAAG;AAAA,IAC3B,SAAS,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM,MAAM,SAAS,KAAK;AAAA,IAC1B,IAAI,QAAQ,QAAQ;AAAA,MAClB,OAAO,SAAS,QAAQ,KAAK,QAAQ,MAAM;AAAA,IAC7C,EAAO,SAAI,QAAQ,SAAS;AAAA,MAC1B,OAAO,SAAS,SAAS,KAAK,SAAS,MAAM;AAAA,IAC/C,EAAO;AAAA,MACL,OAAO,MAAM,QAAS,MAAM,QAAQ;AAAA;AAAA,IAEtC,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,MAAM,YAAY,MAAM,MAAM,CAAC;AAAA,MAC/B,MAAM,UAAU,UAAU,IAAI;AAAA,MAC9B,MAAM,MAAM,UAAU,SAAS,IAAI,QAAQ,MAAM,UAAU,KAAK,GAAG,CAAC,IAAI;AAAA,MACxE,OAAO,EAAE,KAAK,SAAmB,IAAoB;AAAA,IACvD;AAAA,IACA,OAAO;AAAA,MACL,KAAK,QAAQ,SAAS,cAAc;AAAA,MACpC,KAAK,SAAS,KAAK,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,IAAI,KAAI,WAAW,UAAU,GAAG;AAAA,IAC9B,MAAM,MAAM,KAAI,MAAM,WAAW,MAAM;AAAA,IACvC,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAC7B,IAAI,UAAU,IAAI;AAAA,MAChB,OAAO,EAAE,KAAK,KAAK,KAAK,MAAM;AAAA,IAChC;AAAA,IACA,MAAM,QAAQ,IAAI,MAAM,GAAG;AAAA,IAC3B,MAAM,UAAU,MAAM,IAAI;AAAA,IAC1B,IAAI,MAAM;AAAA,IAEV,WAAW,KAAK,OAAO;AAAA,MACrB,MAAM,IAAI;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,KAAK,SAAmB,IAAI;AAAA,EACvC;AAAA,EACA,OAAO,EAAE,KAAK,MAAK,KAAK,MAAM;AAAA;AAIzB,SAAS,kBAAkB,CAChC,MACA,OACA,OACA,SACS;AAAA,EACT,QAAQ,UAAU,QAAQ,OAAO,YAAY;AAAA,EAE7C,IAAI,CAAC,kBAAkB,IAAI,QAAQ,GAAG;AAAA,IACpC,MAAM,IAAI,MAAM,kCAAkC,WAAW;AAAA,EAC/D;AAAA,EAGA,IAAI,UAAU,IAAI,QAAQ,KAAK,EAAE,WAAW,OAAO;AAAA,IACjD,MAAM,UAAmB,eAAe,QAAQ,OAAO,OAAO,OAAO;AAAA,IACrE,IAAI,aAAa,KAAK;AAAA,MACpB,OAAO,CAAC;AAAA,IACV;AAAA,IACA,IAAI,aAAa,KAAK;AAAA,MACpB,OAAO,CAAE;AAAA,IACX;AAAA,EACF;AAAA,EAGA,IAAI,WAAW,IAAI,QAAQ,GAAG;AAAA,IAC5B,MAAM,OAAO,eAAe,QAAQ,OAAO,OAAO,OAAO;AAAA,IACzD,MAAM,QAAQ,eAAe,OAAO,OAAO,OAAO,OAAO;AAAA,IACzD,QAAQ;AAAA,WACD,KAAK;AAAA,QACR,OAAO,OAAO;AAAA,MAChB;AAAA,WACK,KAAK;AAAA,QACR,OAAO,OAAO;AAAA,MAChB;AAAA,WACK,KAAK;AAAA,QACR,OAAO,OAAO;AAAA,MAChB;AAAA,WACK,KAAK;AAAA,QACR,OAAO,OAAO;AAAA,MAChB;AAAA,WACK,KAAK;AAAA,QACR,OAAO,OAAO;AAAA,MAChB;AAAA,WACK,OAAO;AAAA,QACV,OAAO,SAAS;AAAA,MAClB;AAAA,WACK,OAAO;AAAA,QACV,OAAO,SAAS;AAAA,MAClB;AAAA,WACK,KAAK;AAAA,QACR,OAAO,OAAO;AAAA,MAChB;AAAA,WACK,MAAM;AAAA,QACT,OAAO,QAAQ;AAAA,MACjB;AAAA,WACK,KAAK;AAAA,QACR,OAAO,OAAO;AAAA,MAChB;AAAA,WACK,MAAM;AAAA,QACT,OAAO,QAAQ;AAAA,MACjB;AAAA,WACK,MAAM;AAAA,QACT,OAAO,QAAQ;AAAA,MACjB;AAAA,WACK,MAAM;AAAA,QACT,OAAO,QAAQ;AAAA,MACjB;AAAA,eACS;AAAA,QACP;AAAA,MACF;AAAA;AAAA,EAEJ;AAAA,EAGA,IAAI,eAAe,IAAI,QAAQ,GAAG;AAAA,IAChC,MAAM,MAAM,eAAe,OAAO,OAAO,OAAO,OAAO;AAAA,IACvD,QAAQ,KAAK,QAAQ,mBAClB,OAA4B,MAC7B,OACA,OACA,OACF;AAAA,IACA,QAAQ;AAAA,WACD,KAAK;AAAA,QACR,IAAI,OAAO;AAAA,QACX;AAAA,MACF;AAAA,WACK,MAAM;AAAA,QACT,MAAM,UAAU,IAAI;AAAA,QACpB,IAAI,OAAO,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,WACK,MAAM;AAAA,QACT,MAAM,UAAU,IAAI;AAAA,QACpB,IAAI,OAAO,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,WACK,MAAM;AAAA,QACT,MAAM,UAAU,IAAI;AAAA,QACpB,IAAI,OAAO,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,WACK,MAAM;AAAA,QACT,MAAM,UAAU,IAAI;AAAA,QACpB,IAAI,OAAO,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,eACS;AAAA,QACP;AAAA,MACF;AAAA;AAAA,IAEF;AAAA,EACF;AAAA,EAGA,IAAI,iBAAiB,IAAI,QAAQ,GAAG;AAAA,IAClC,MAAM,MAAiB,eAAe,QAAQ,OAAO,OAAO,OAAO;AAAA,IACnE,QAAQ;AAAA,WACD,QAAQ;AAAA,QACX,OAAO,IAAI,KAAK,eAAe,OAAO,OAAO,OAAO,OAAO,CAAC;AAAA,MAC9D;AAAA,WACK,WAAW;AAAA,QACd,OAAO,IAAI,QAAQ,eAAe,OAAO,OAAO,OAAO,OAAO,CAAC;AAAA,MACjE;AAAA,WACK,OAAO;AAAA,QACV,OAAO,IAAI,IAAI;AAAA,MACjB;AAAA,WACK,SAAS;AAAA,QACZ,OAAO,IAAI,MAAM;AAAA,MACnB;AAAA,WACK,UAAU;AAAA,QACb,MAAM,OAAkB,eAAe,OAAO,OAAO,OAAO,OAAO;AAAA,QACnE,OAAQ,IAAI,OAA0C,GAAG,IAAI;AAAA,MAC/D;AAAA,eACS;AAAA,QACP;AAAA,MACF;AAAA;AAAA,EAEJ;AAAA,EAGA,IAAI,cAAc,IAAI,QAAQ,GAAG;AAAA,IAC/B,MAAM,MAAiB,eAAe,QAAQ,OAAO,OAAO,OAAO;AAAA,IACnE,IAAI,aAAa,UAAU;AAAA,MACzB,IAAI,MAAe,eAAe,SAAS,OAAO,OAAO,OAAO;AAAA,MAChE,YAAY,OAAO,SAAS,IAAI,QAAQ,GAAG;AAAA,QACzC,MAAM,mBAAmB,OAAyB,OAAO,OAAO;AAAA,UAC9D;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,IAAI,aAAa,OAAO;AAAA,MACtB,OAAO,IAAI,IAAI,CAAC,MAAe,UAC7B,mBAAmB,OAAyB,OAAO,OAAO;AAAA,WACrD;AAAA,QACH;AAAA,QACA;AAAA,MACF,CAAC,CACH;AAAA,IACF;AAAA,IACA,IAAI,aAAa,UAAU;AAAA,MACzB,OAAO,IAAI,OAAO,CAAC,MAAe,UAChC,mBAAmB,OAAyB,OAAO,OAAO;AAAA,WACrD;AAAA,QACH;AAAA,QACA;AAAA,MACF,CAAC,CACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA;AAoLF,SAAS,OAAO,CAAC,KAAc,MAAuB;AAAA,EACpD,IAAI,UAAmB;AAAA,EACvB,WAAW,KAAK,KAAK,MAAM,MAAM,GAAG;AAAA,IAClC,UAAW,UAAsC;AAAA,EACnD;AAAA,EACA,OAAO;AAAA;;;ACjiBF,SAAS,YAAY,CAAC,OAAqC;AAAA,EAChE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAAA;AAMrE,SAAS,MAAK,CAAC,OAAgC;AAAA,EACpD,OAAO,aAAa,KAAK,KAAK,OAAO,MAAM,SAAS;AAAA;AAM/C,SAAS,aAAa,CAAC,OAAwC;AAAA,EACpE,OAAO,aAAa,KAAK,KAAK,MAAM,eAAe;AAAA;AAI9C,SAAS,eAAe,CAAC,OAA0C;AAAA,EACxE,OAAO,aAAa,KAAK,KAAK,aAAa,MAAM,WAAW;AAAA;AAIvD,SAAS,cAAc,CAAC,OAAyC;AAAA,EACtE,OACE,aAAa,KAAK,KAAK,OAAO,MAAM,eAAe,YAAY,MAAM,eAAe;AAAA;AAKjF,SAAS,aAAa,CAAC,OAAwC;AAAA,EACpE,OACE,aAAa,KAAK,KAClB,MAAM,WAAW,YACjB,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,YAAY,YACzB,CAAC,MAAM;AAAA;AAaJ,IAAM,kBAAuC,IAAI,IAAI;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AA+BM,SAAS,aAAa,CAAC,OAAwC;AAAA,EACpE,OAAO,aAAa,KAAK,KAAK,MAAM,eAAe;AAAA;AA4D9C,SAAS,cAAc,CAAC,OAAyC;AAAA,EACtE,OAAO,OAAM,KAAK,KAAK,cAAc,KAAK,KAAK,gBAAgB,KAAK;AAAA;AAe/D,SAAS,UAAU,CAAC,YAAmD;AAAA,EAC5E,IAAI,CAAC,YAAY;AAAA,IACf,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,WAAW,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,IAAK;AAAA;;;AC3GnE,IAAM,gBAAgB,IAAI;AAE1B,eAAsB,OAAO,CAAC,QAAkD;AAAA,EAC9E,IAAI,OAAO,WAAW,UAAU;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,cAAc,IAAI,MAAM,GAAG;AAAA,IAC7B,OAAO,cAAc,IAAI,MAAM;AAAA,EACjC;AAAA,EACA,MAAM,IAAI,MAAM,MAAM,EAAE,KAAK,CAAC,QAAQ;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI;AAAA,MACX,MAAM,IAAI,MAAM,uBAAuB,WAAW,IAAI,SAAS;AAAA,IACjE;AAAA,IAEA,OAAO,IAAI,KAAK;AAAA,GACjB;AAAA,EACD,cAAc,IAAI,QAAQ,CAAC;AAAA,EAC3B,OAAO;AAAA;AAMT,IAAM,mBAAkB,IAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,kBAAkB,EAAE,MAAM,MAAM;AAE/B,SAAS,sBAAsB,CAAC,GAAY;AAAA,EACjD,gBAAgB,OAAO;AAAA;AAQzB,IAAI,gBAA+B;AAC5B,SAAS,eAAe,CAAC,OAAsB;AAAA,EACpD,gBAAgB,SAAS;AAAA;AAG3B,SAAS,gBAAgB,CAAC,MAAsB;AAAA,EAC9C,OAAO,gBAAgB,GAAG,cAAc,mBAAmB,aAAa,MAAM;AAAA;AAkBzE,SAAS,YAAY,CAAC,IAA4B;AAAA,EACvD,MAAM,QAAQ,YAAY,IAAI;AAAA,EAC9B,MAAM,IAAI,MAAM;AAAA,IACd,OAAO,EAAE;AAAA,GACV;AAAA,EACD,OAAO,MAAM,MAAM,KAAK;AAAA;AAcnB,SAAS,SAAY,CAAC,IAA8C;AAAA,EACzE,MAAM,QAAQ,YAAY,IAAI;AAAA,EAC9B,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,IAAI,EAAE;AAAA,IAC3B,OAAO,EAAE,QAAQ,MAAM,MAAM,MAAM,KAAK,EAAE;AAAA,IAC1C,OAAO,OAAO;AAAA,IAEd,MAAM,KAAK;AAAA,IACX,MAAM;AAAA;AAAA;AAYV,IAAI,2BAA2B;AACxB,SAAS,0BAA0B,CAAC,IAAa;AAAA,EACtD,2BAA2B;AAAA;AAG7B,IAAM,mBAAmB;AACzB,IAAM,oBAA4C;AAAA,EAChD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,KAAK;AAAA,EACL,GAAG;AACL;AAOO,SAAS,oBAAoB,CAAC,OAAuB;AAAA,EAC1D,IAAI,CAAC,4BAA4B,CAAC,MAAM,SAAS,GAAG,GAAG;AAAA,IACrD,OAAO;AAAA,EACT;AAAA,EACA,OAAO,MAAM,QACX,kBACA,CAAC,IAAI,KAAa,QAAgB,GAAG,MAAM,kBAAkB,IAAI,YAAY,MAAM,KAAK,OAC1F;AAAA;AAWF,IAAI,uBAAuB;AACpB,SAAS,sBAAsB,CAAC,IAAa;AAAA,EAClD,uBAAuB;AAAA;AAIzB,SAAS,cAAc,CAAC,IAAiB,KAAqB;AAAA,EAC5D,IAAI,wBAAwB,QAAQ,WAAW,GAAG,YAAY,OAAO,GAAG,YAAY,SAAS;AAAA,IAC3F,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAWT,eAAsB,UAAU,CAC9B,KACA,cAAuB,CAAC,GACxB,OAAe,SAAS,MACxB;AAAA,EACA,MAAM,MAAe,CAAC;AAAA,EAGtB,YAAY,KAAK,QAAQ,OAAO,QAAQ,WAAW,GAAG;AAAA,IACpD,IAAI,OAAO;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,IAAI,SAAS,CAAC;AAAA,EAG3B,MAAM,UAAU,IAAI,WAAW,CAAC;AAAA,EAChC,cAAc,SAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC1C,IAAI,eAAe,IAAG,KAAK,CAAC,KAAI,MAAM;AAAA,MACpC,MAAM,SAAS,QAAQ,KAAI;AAAA,MAC3B,IAAI,QAAQ;AAAA,QACV,IAAI,CAAC,OAAO,SAAS,aAAa,GAAG;AAAA,UACnC,QAAQ,KACN,eAAe,KAAI,oDAAoD,SACzE;AAAA,UACA;AAAA,QACF;AAAA,QACA,KAAI,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAGA,YAAY,KAAK,SAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAE7C,IAAI,OAAO,SAAQ,UAAU;AAAA,MAC3B,IAAI,CAAC,KAAI,SAAS,IAAI,GAAG;AAAA,QACvB,IAAI,OAAO;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IAGA,IAAI,OAAO,SAAQ,YAAY,OAAO,SAAQ,aAAa,SAAQ,MAAM;AAAA,MACvE,IAAI,OAAO;AAAA,MACX;AAAA,IACF;AAAA,IAGA,IAAI,MAAM,QAAQ,IAAG,GAAG;AAAA,MACtB,IAAI,OAAO;AAAA,MACX;AAAA,IACF;AAAA,IAGA,IAAI,OAAO,SAAQ,UAAU;AAAA,MAC3B,IAAI,KAAI,YAAY;AAAA,QAClB;AAAA,MACF;AAAA,MACA,IAAI,gBAAgB,IAAG,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,MACA,IAAI,cAAc,IAAG,GAAG;AAAA,QACtB;AAAA,MACF;AAAA,MACA,IAAI,aAAa,MAAK;AAAA,QACpB,IAAI,OAAO,KAAI;AAAA,QACf;AAAA,MACF;AAAA,MACA,IAAI,kBAAkB,IAAG,GAAG;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,IAAI,OAAO;AAAA,IACb;AAAA,EACF;AAAA,EAGA,MAAM,QAAQ,SAAS,GAAG;AAAA,EAG1B,YAAY,KAAK,SAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC7C,IAAI,OAAO,SAAQ,YAAY,KAAI,SAAS,IAAI,GAAG;AAAA,MACjD,MAAM,OAAO,SAAS,MAAM,iBAAiB,MAAK,KAAK,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA,EAGA,YAAY,KAAK,SAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC7C,IAAI,gBAAgB,IAAG,GAAG;AAAA,MACxB,MAAM,OAAO,KAAI;AAAA,MACjB,IAAI,WAAW,KAAK,QAAQ,GAAG;AAAA,QAC7B,MAAM,UAA0B,CAAC,GAAG,UAAU,mBAAmB,MAAM,GAAG,KAAK;AAAA,QAC/E,MAAM,OAAO;AAAA,MACf,EAAO;AAAA,QACL,MAAM,OAAO,SAAS,MAAM,mBAAmB,MAAM,OAAO,IAAI,CAAC;AAAA;AAAA,IAErE;AAAA,EACF;AAAA,EAGA,YAAY,KAAK,SAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC7C,IAAI,cAAc,IAAG,GAAG;AAAA,MACtB,MAAM,OAAO,MAAM,gBAAgB,MAAK,OAAO,KAAK,IAAI;AAAA,IAC1D;AAAA,EACF;AAAA,EAGA,YAAY,KAAK,SAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC7C,IAAI,eAAe,IAAG,GAAG;AAAA,MACvB,MAAM,OAAO,MAAM,iBAAiB,MAAK,OAAO,KAAK,IAAI;AAAA,IAC3D;AAAA,EACF;AAAA,EAGA,IAAI,CAAC,gBAAgB,MAAM;AAAA,IACzB,YAAY,KAAK,SAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,MAC7C,IAAI,cAAc,IAAG,GAAG;AAAA,QACtB,MAAM,OAAO,MAAM,sBAAsB,MAAK,OAAO,KAAK,IAAI;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,IAAI,QAAQ;AAAA,IACd,MAAM,YAAY,IAAI;AAAA,EACxB,EAAO,SAAI,CAAC,MAAM,aAAa,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AAAA,IACjE,MAAM,YAAY;AAAA,EACpB;AAAA,EAEA,OAAO;AAAA;AAUT,SAAS,iBAAiB,CAAC,KAAa;AAAA,EACtC,WAAW,KAAK,OAAO,KAAK,GAAG,GAAG;AAAA,IAChC,IAAI,iBAAgB,IAAI,CAAC,GAAG;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAYT,SAAS,gBAAgB,CAAC,KAAa,OAAwB;AAAA,EAC7D,MAAM,OAAO,OAAO;AAAA,EACpB,MAAM,KAAK,IAAI,SAAS,SAAS,QAAQ,QAAQ,SAAS,YAAY,OAAO;AAAA,EAM7E,OAAO,GAAG,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA;AAgBhD,IAAM,eAAe,IAAI;AAczB,eAAe,eAAe,CAAC,MAAoB,OAAgB,KAAa,MAAe;AAAA,EAC7F,IAAI,KAAI,QAAQ,KAAI,MAAM;AAAA,IACxB,MAAM,IAAI,MAAM,QAAQ,iEAAgE;AAAA,EAC1F;AAAA,EACA,IAAI,CAAC,KAAI,QAAQ,CAAC,KAAI,MAAM;AAAA,IAC1B,MAAM,SAAS,kBAAkB,IAAG;AAAA,IACpC,MAAM,OAAO,IAAI,SAAS,GAAG,QAAQ,EAAE;AAAA,IACvC,OAAO,eAAe,MAAM,QAAQ;AAAA,MAClC,cAAc;AAAA,MACd,OAAO,KAAI,QAAQ;AAAA,IACrB,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,EAEJ,IAAI,KAAI,MAAM;AAAA,IACZ,MAAM,SAAS,kBAAkB,IAAG;AAAA,IACpC,KAAK,IAAI,SAAS,GAAG,QAAQ,KAAI,IAAI;AAAA,IACrC,OAAO,eAAe,IAAI,QAAQ;AAAA,MAChC,cAAc;AAAA,MACd,OAAO,KAAI,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH,EAAO;AAAA,IAEL,MAAM,MAAM,KAAI;AAAA,IAChB,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,MAAM,QAAQ,gCAAgC;AAAA,IAC1D;AAAA,IACA,MAAM,aAAa,KAAI,WAAW;AAAA,IAClC,IAAI;AAAA,IACJ,IAAI,aAAa,IAAI,GAAG,GAAG;AAAA,MACzB,MAAM,aAAa,IAAI,GAAG;AAAA,IAC5B,EAAO;AAAA,MACL,IAAI,MAAM;AAAA,QACR,MAAM,cAAc,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,QACvC,IAAI;AAAA,UACF,MAAO,MAAa;AAAA,UACpB,MAAM;AAAA,UACN,MAAO,MAAa;AAAA;AAAA,MAExB,EAAO;AAAA,QACL,MAAO,MAAa;AAAA;AAAA,MAEtB,aAAa,IAAI,KAAK,GAAG;AAAA;AAAA,IAE3B,MAAM,YAAY,IAAI,eAAe,IAAI,UAAU;AAAA,IACnD,IAAI,OAAO,cAAc,YAAY;AAAA,MACnC,MAAM,IAAI,UAAU,eAAe,+CAA+C,MAAM;AAAA,IAC1F;AAAA,IACA,KAAK;AAAA;AAAA,EAKP,MAAM,aAAa,KAAI,cAAc,KAAI,aAAa,CAAC,GAAG,SAAS;AAAA,EACnE,IAAI,aAAa;AAAA,EACjB,IAAI,CAAC,WAAW;AAAA,IACd,IAAI,KAAI,MAAM;AAAA,MACZ,aAAa,aAAa,KAAK,KAAI,IAAI;AAAA,IACzC,EAAO,SAAI,IAAI;AAAA,MACb,aAAa,GAAG,UAAU,KAAK,aAAa,KAAK,GAAG,SAAS,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EACA,IAAI,YAAY;AAAA,IACd,OAAO,SAAS,MAAM,GAAG,KAAK,CAAC;AAAA,EACjC;AAAA,EAEA,OAAO;AAAA;AAaT,SAAS,iBAAiB,CAAC,MAAqC;AAAA,EAC9D,MAAM,QAAQ,KAAI,aAAa,WAAW,KAAI,UAAU,IAAK,KAAI,aAAa,CAAC;AAAA,EAC/E,OAAO,MAAM,SAAS,KAAK,MAAM,OAAO,UAAU,QAAQ,CAAC,SAAS,GAAG,KAAK;AAAA;AAQvE,IAAM,gBAAgB,IAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUM,SAAS,UAAU,CACxB,MACA,OACA,SACoB;AAAA,EACpB,MAAM,OAAO,SAAS,SAAS,CAAC;AAAA,EAGhC,IAAI,OAAO,SAAQ,YAAY,OAAO,SAAQ,YAAY,OAAO,SAAQ,WAAW;AAAA,IAClF,MAAM,WAAW,SAAS,eAAe,OAAO,IAAG,CAAC;AAAA,IACpD,IAAI,OAAO,SAAQ,YAAY,iBAAiB,IAAG,GAAG;AAAA,MACpD,OAAO,MAAM;AAAA,QACX,SAAS,cAAc,iBAAiB,MAAK,KAAK;AAAA,OACnD;AAAA,IACH;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,aAAsB;AAAA,EAC1B,YAAY,KAAK,QAAQ,OAAO,QAAQ,IAAG,GAAG;AAAA,IAC5C,IAAI,IAAI,WAAW,GAAG,KAAK,CAAC,cAAc,IAAI,GAAG,GAAG;AAAA,MAClD,IAAI,eAAe,OAAO;AAAA,QACxB,aAAa,OAAO,OAAO,KAAK;AAAA,MAClC;AAAA,MACA,WAAW,OAAO,SAAS,GAAG,IAAI,WAAW,IAAI,MAAM,KAAK,IAAI;AAAA,IAClE;AAAA,EACF;AAAA,EAGA,MAAM,UAAU,KAAI,WAAW;AAAA,EAC/B,MAAM,aAAa,QAAQ,SAAS,GAAG,KAAK,eAAe,IAAI,OAAO;AAAA,EAEtE,IAAI,KAAI,UAAU,YAAY;AAAA,IAC5B,OAAO,6BAA6B,MAAK,YAAY,SAAS,IAAI;AAAA,EACpE;AAAA,EAEA,IAAI,KAAI,QAAQ;AAAA,IACd,QAAQ,QAAQ,YAAY,SAAS;AAAA,IACrC,OAAO,WAAW,MAAM,WAAW,MAAK,UAAU,GAAG,OAAO;AAAA,EAC9D;AAAA,EACA,IAAI,KAAI,SAAS;AAAA,IACf,OAAO,aAAa,MAAK,YAAY,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,KAAK,SAAS,cAAc,OAAO;AAAA,EAEzC,IAAI,SAAS,eAAe;AAAA,IAC1B,QAAQ,cAAc,IAAI,MAAM,MAAK,UAAU;AAAA,EACjD;AAAA,EAEA,gBAAgB,IAAI,MAAK,UAAU;AAAA,EACnC,WACE,IACA,KAAI,SAAS,CAAC,GACb,WAAW,aAAwC,CAAC,GACrD,UACF;AAAA,EACA,gBAAgB,IAAI,KAAI,cAAc,CAAC,GAAG,UAAU;AAAA,EAEpD,MAAM,OAAO,KAAI;AAAA,EACjB,IAAI,cAAc,IAAI,GAAG;AAAA,IAGvB,MAAM,UAAU,UAAU,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,UAAU,EAAE,IAAI;AAAA,IACzE,sBAAsB,IAAI,MAAM,YAAY,OAAO;AAAA,EACrD,EAAO,SAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,IAC9B,SAAS,IAAI,EAAG,IAAI,KAAK,QAAQ,KAAK;AAAA,MACpC,MAAM,QAAQ,KAAK;AAAA,MACnB,MAAM,YAAY,UAAU,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI;AAAA,MAC9E,IAAI,cAAc,KAAK,GAAG;AAAA,QAExB,sBAAsB,IAAI,OAAO,YAAY,SAAS;AAAA,MACxD,EAAO;AAAA,QACL,GAAG,OAAO,WAAW,OAAO,YAAY,SAAS,CAAC;AAAA;AAAA,IAEtD;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAWT,SAAS,gBAAgB,CAAC,KAA6B;AAAA,EACrD,OAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,IAAI;AAAA;AAUrD,SAAS,eAAe,CAAC,IAAiB,MAAgB,OAAgB;AAAA,EACxE,YAAY,KAAK,QAAQ,OAAO,QAAQ,IAAG,GAAG;AAAA,IAC5C,IAAI,cAAc,IAAI,GAAG,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,IAAI,IAAI,WAAW,GAAG,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,IAAI,IAAI,WAAW,IAAI,GAAG;AAAA,MAExB,IAAI,SAAS,GAAG,GAAG;AAAA,QACjB,MAAM,UAAU,WAAW,IAAI,MAAM,KAAK;AAAA,QAC1C,IAAI,OAAO,YAAY,YAAY;AAAA,UACjC,MAAM,QAAQ;AAAA,UACd,MAAM,YAAY;AAAA,UAClB,GAAG,iBAAiB,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,UAAU,OAAO,CAAC,CAAC;AAAA,QAC9D;AAAA,QACA;AAAA,MACF;AAAA,MAEA,IAAI,cAAc,GAAG,KAAK,IAAI,MAAM;AAAA,QAClC,MAAM,SAAS,kBAAkB,GAAG;AAAA,QACpC,MAAM,KAAK,IAAI,SAAS,GAAG,QAAQ,IAAI,IAAI;AAAA,QAC3C,MAAM,QAAQ;AAAA,QACd,GAAG,iBAAiB,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,MAEA,IAAI,gBAAgB,GAAG,GAAG;AAAA,QACxB,MAAM,OAAO,IAAI;AAAA,QACjB,MAAM,QAAQ;AAAA,QACd,GAAG,iBAAiB,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,mBAAmB,MAAM,OAAO,CAAC,CAAC;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,IAEA,aAAa,IAAI,KAAK,KAAK,KAAK;AAAA,EAClC;AAAA;AASF,SAAS,YAAY,CAAC,IAAiB,KAAa,KAAc,OAAgB;AAAA,EAChF,MAAM,SAAS;AAAA,EACf,IAAI,SAAS,GAAG,GAAG;AAAA,IACjB,MAAM,SAAS;AAAA,IACf,IAAI,QAAQ,MAAM;AAAA,MAChB,OAAO,OAAO,WAAW,OAAO,MAAM,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,OAAO,MAAM;AAAA,MACX,OAAO,OAAO,WAAW,OAAO,MAAM,KAAK;AAAA,KAC5C;AAAA,IACD;AAAA,EACF;AAAA,EAGA,IAAI,iBAAiB,GAAG,GAAG;AAAA,IACzB,OAAO,MAAM;AAAA,MACX,OAAO,OAAO,iBAAiB,KAAe,KAAK;AAAA,KACpD;AAAA,IACD;AAAA,EACF;AAAA,EAEA,OAAO,OAAO;AAAA;AAaT,SAAS,UAAU,CACxB,IACA,UACA,eAAuC,CAAC,GACxC,QAAiB,CAAC,GAClB;AAAA,EACA,MAAM,SAAkC,CAAC;AAAA,EACzC,MAAM,QAAiC,CAAC;AAAA,EACxC,MAAM,YAAoC,CAAC;AAAA,EAG3C,MAAM,uBAAuB,IAAI;AAAA,EACjC,YAAY,MAAM,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAAA,IAClD,IAAI,KAAK,WAAW,GAAG,KAAK,OAAO,OAAO,QAAQ,UAAU;AAAA,MAC1D,WAAW,KAAK,OAAO,KAAK,GAAG,GAAG;AAAA,QAChC,IACE,CAAC,EAAE,WAAW,GAAG,KACjB,CAAC,EAAE,WAAW,GAAG,KACjB,CAAC,EAAE,WAAW,GAAG,KACjB,CAAC,EAAE,WAAW,GAAG,KACjB,CAAC,EAAE,WAAW,GAAG,GACjB;AAAA,UACA,qBAAqB,IAAI,CAAC;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,MAAM,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAAA,IAClD,IAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AAAA,MAClE,IAAI,KAAK,WAAW,GAAG,GAAG;AAAA,QACxB,MAAM,QAAQ;AAAA,MAChB,EAAO;AAAA,QACL,OAAO,QAAQ;AAAA;AAAA,MAEjB;AAAA,IACF;AAAA,IACA,IAAI,KAAK,WAAW,GAAG,KAAK,iBAAiB,IAAI,GAAG;AAAA,MAElD;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAAA,IACA,MAAM,SAAS,OAAO,GAAG;AAAA,IACzB,IAAI,KAAK,WAAW,IAAI,GAAG;AAAA,MACzB,IAAI,iBAAiB,GAAG,GAAG;AAAA,QACzB,OAAO,MAAM;AAAA,UACX,GAAG,MAAM,YAAY,MAAM,qBAAqB,iBAAiB,KAAK,KAAK,CAAC,CAAC;AAAA,SAC9E;AAAA,MACH,EAAO;AAAA,QACL,GAAG,MAAM,YAAY,MAAM,qBAAqB,MAAM,CAAC;AAAA;AAAA,IAE3D,EAAO,SAAI,iBAAiB,GAAG,GAAG;AAAA,MAChC,OAAO,MAAM;AAAA,QACV,GAAG,MAA4C,QAAQ,qBACtD,iBAAiB,KAAK,KAAK,CAC7B;AAAA,OACD;AAAA,IACH,EAAO,SAAI,qBAAqB,IAAI,IAAI,GAAG;AAAA,MAEzC,UAAU,QAAQ;AAAA,IACpB,EAAO;AAAA,MACJ,GAAG,MAA4C,QAAQ,qBAAqB,MAAM;AAAA;AAAA,EAEvF;AAAA,EAEA,MAAM,YAAY,OAAO,KAAK,MAAM,EAAE,SAAS;AAAA,EAC/C,MAAM,WAAW,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,EAC7C,MAAM,eAAe,OAAO,KAAK,SAAS,EAAE,SAAS;AAAA,EACrD,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,cAAc;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,EACvD,GAAG,QAAQ,KAAK;AAAA,EAEhB,IAAI,MAAM;AAAA,EACV,MAAM,UAAU,UAAU,SAAS;AAAA,EACnC,IAAI,SAAS;AAAA,IACX,OAAO,aAAa,WAAW;AAAA;AAAA,EACjC;AAAA,EAEA,SAAS,UAAU,CAAC,OAAe,OAAgB;AAAA,IACjD,MAAM,QAAQ,UAAU,KAAK;AAAA,IAC7B,IAAI,OAAO;AAAA,MACT,OAAO,GAAG,WAAW;AAAA;AAAA,IACvB;AAAA,IACA,YAAY,KAAK,QAAQ,OAAO,QAAQ,KAAK,GAAG;AAAA,MAC9C,IAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AAAA,QACjE;AAAA,MACF;AAAA,MACA,IAAI,IAAI,WAAW,GAAG,GAAG;AAAA,QACvB;AAAA,MACF;AAAA,MACA,MAAM,WAAW,IAAI,WAAW,GAAG,IAC/B,IAAI,QAAQ,KAAK,KAAK,IACtB,IAAI,WAAW,GAAG,IAChB,GAAG,QAAQ,QACX,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG,IACvC,GAAG,QAAQ,QACX,GAAG,SAAS;AAAA,MACpB,WAAW,UAAU,GAAG;AAAA,IAC1B;AAAA;AAAA,EAGF,YAAY,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,IACjD,MAAM,WAAW,IAAI,WAAW,GAAG,IAC/B,IAAI,QAAQ,KAAK,aAAa,OAAO,IACrC,IAAI,WAAW,GAAG,IAChB,aAAa,QAAQ,QACrB,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG,IACvC,aAAa,QAAQ,QACrB,aAAa,SAAS;AAAA,IAC9B,WAAW,UAAU,KAAK;AAAA,EAC5B;AAAA,EAEA,SAAS,eAAe,CAAC,QAAgB,WAAmB,KAAc;AAAA,IACxE,YAAY,KAAK,QAAQ,OAAO,QAAQ,GAAG,GAAG;AAAA,MAC5C,IAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AAAA,QACjE;AAAA,MACF;AAAA,MACA,IAAI,IAAI,WAAW,GAAG,GAAG;AAAA,QACvB;AAAA,MACF;AAAA,MACA,MAAM,WAAW,IAAI,WAAW,GAAG,IAC/B,IAAI,QAAQ,KAAK,SAAS,IAC1B,IAAI,WAAW,GAAG,IAChB,GAAG,YAAY,QACf,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG,IACvC,GAAG,YAAY,QACf,GAAG,aAAa;AAAA,MACxB,MAAM,QAAQ,UAAU,GAAG;AAAA,MAC3B,IAAI,OAAO;AAAA,QACT,OAAO,GAAG,YAAY,cAAc;AAAA;AAAA,MACtC;AAAA,MACA,gBAAgB,QAAQ,UAAU,GAAG;AAAA,IACvC;AAAA;AAAA,EAGF,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,IAChD,IAAI,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,IACA,MAAM,SAAS,IAAI,WAAW,KAAK,IAC/B,UAAU,aAAa,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MACnD,IAAI,WAAW,IAAI,IACjB,UAAU,IAAI,MAAM,CAAC,MACrB;AAAA,IACN,MAAM,QAAQ,aAAa;AAAA,IAC3B,OAAO,GAAG,YAAY,WAAW,UAAU,KAAK;AAAA;AAAA,IAChD,gBAAgB,QAAQ,OAAO,KAAK;AAAA,EACtC;AAAA,EAEA,MAAM,MAAM,SAAS,cAAc,OAAO;AAAA,EAC1C,IAAI,cAAc;AAAA,EAClB,IAAI,QAAQ,UAAU;AAAA,EACtB,SAAS,KAAK,OAAO,GAAG;AAAA,EACxB,iBAAiB,IAAI,IAAI,GAAG;AAAA;AAOvB,IAAM,mBAAmB,IAAI;AAW7B,SAAS,YAAY,CAC1B,IACA,UACA,eAAuC,CAAC,GACxC,QAAiB,CAAC,GAClB;AAAA,EACA,MAAM,OAAO,iBAAiB,IAAI,EAAE;AAAA,EACpC,IAAI,MAAM;AAAA,IACR,KAAK,OAAO;AAAA,IACZ,iBAAiB,OAAO,EAAE;AAAA,EAC5B;AAAA,EACA,GAAG,MAAM,UAAU;AAAA,EACnB,OAAO,GAAG,QAAQ;AAAA,EAClB,WAAW,IAAI,YAAY,CAAC,GAAG,cAAc,KAAK;AAAA;AAQpD,SAAS,eAAe,CAAC,IAAiB,OAAyC,OAAgB;AAAA,EACjG,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;AAAA,IAC1C,MAAM,OAAO,eAAe,IAAI,CAAC;AAAA,IACjC,IAAI,SAAS,CAAC,GAAG;AAAA,MACf,OAAO,MAAM,GAAG,aAAa,MAAM,OAAO,WAAW,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,IAC7E,EAAO,SAAI,iBAAiB,CAAC,GAAG;AAAA,MAC9B,OAAO,MAAM,GAAG,aAAa,MAAM,OAAO,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,IACxE,EAAO;AAAA,MACL,GAAG,aAAa,MAAM,OAAO,CAAC,CAAC;AAAA;AAAA,EAEnC;AAAA;AAoBF,SAAS,qBAAqB,CAC5B,UACA,UACA,OACA,SACA;AAAA,EACA,MAAM,OAAO,SAAS,SAAS,CAAC;AAAA,EAChC,MAAM,SAAS,SAAS,cAAc,UAAU;AAAA,EAChD,SAAS,OAAO,MAAM;AAAA,EACtB,QAAQ,OAAO,UAAU,KAAK,QAAQ,QAAQ,WAAW,MAAM,YAAY;AAAA,EAE3E,OAAO,MAAM;AAAA,IACX,IAAI,QAAiB,SAAS,QAAQ,IAAI,WAAW,SAAS,MAAM,KAAK,IAAI;AAAA,IAC7E,IAAI,MAAM,QAAQ,KAAK,KAAK,SAAS,SAAS,GAAG;AAAA,MAC/C,MAAM,KAAK,WAAW,UAAU,MAAM,KAAK;AAAA,MAC3C,IAAI,OAAO,OAAO,YAAY;AAAA,QAC5B,QAAQ,MAAM,OAAO,EAA6B;AAAA,MACpD;AAAA,IACF;AAAA,IACA,IAAI,MAAM,QAAQ,KAAK,KAAK,SAAS,OAAO,GAAG;AAAA,MAC7C,MAAM,KAAK,WAAW,QAAQ,MAAM,KAAK;AAAA,MACzC,IAAI,OAAO,OAAO,YAAY;AAAA,QAC5B,QAAQ,CAAC,GAAI,KAAmB,EAAE,SAAS,EAAwC;AAAA,MACrF;AAAA,IACF;AAAA,IACA,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,QAAQ;AAAA,MACpC;AAAA,IACF;AAAA,IAIA,MAAM,QAAQ,YAAY,IAAI;AAAA,IAC9B,MAAM,QAAqB,CAAC;AAAA,IAC5B,MAAM,IAAI,MAAM;AAAA,MACd,YAAY,OAAO,SAAU,MAAoB,QAAQ,GAAG;AAAA,QAC1D,MAAM,QAAQ,OAAO,OAAO,KAAK;AAAA,QACjC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,QAC3B,MAAM,eAAe;AAAA,QACrB,MAAM,gBAAgB;AAAA,QACtB,MAAM,YAAY,UAAU,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,OAAO,KAAK,EAAE,IAAI;AAAA,QAC7E,MAAM,OAAO,WAAW,QAAQ,OAAO,SAAS;AAAA,QAChD,OAAO,OAAO,IAAI;AAAA,QAClB,MAAM,KAAK,IAAI;AAAA,MACjB;AAAA,KACD;AAAA,IACD,gBAAgB,MAAM;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,WAAW,KAAK,OAAO;AAAA,QACrB,EAAE,OAAO;AAAA,MACX;AAAA,KACD;AAAA,GACF;AAAA;AAWH,SAAS,YAAY,CAAC,MAAgB,OAAgB,SAA2B;AAAA,EAC/E,MAAM,OAAO,SAAS,SAAS,CAAC;AAAA,EAChC,MAAM,YAAY,SAAS,cAAc,KAAI,WAAW,KAAK;AAAA,EAE7D,IAAI,SAAS,eAAe;AAAA,IAC1B,QAAQ,cAAc,WAAW,MAAM,MAAK,KAAK;AAAA,EACnD;AAAA,EAEA,gBAAgB,WAAW,MAAK,KAAK;AAAA,EACrC,WAAW,WAAW,KAAI,SAAS,CAAC,GAAI,MAAM,aAAwC,CAAC,GAAG,KAAK;AAAA,EAC/F,gBAAgB,WAAW,KAAI,cAAc,CAAC,GAAG,KAAK;AAAA,EACtD,IAAI,aAAa;AAAA,EAEjB,OAAO,MAAM;AAAA,IACX,UAAU,YAAY;AAAA,IACtB,IAAI,CAAC,SAAS,KAAI,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,MAAM,MAAM,WAAW,KAAI,QAAQ,MAAM,KAAK;AAAA,IAC9C,MAAM,UAAU,KAAI,QAAQ;AAAA,IAC5B,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,OAAO,GAAG;AAAA,MAErB,MAAM,MAAO,cAAc;AAAA,MAC3B,QAAQ,SAAS,IAAI,IAAI,QAAQ,MAAM,SAAS,IAAI;AAAA,MACpD,QAAQ,IAAI,EACT,KAAK,OAAO,QAAQ;AAAA,QACnB,IAAI,QAAQ,YAAY;AAAA,UACtB;AAAA,QACF;AAAA,QACA,MAAM,aAAa,MAAM,WAAW,KAAK,CAAC,GAAG,IAAI;AAAA,QACjD,IAAI,QAAQ,YAAY;AAAA,UACtB;AAAA,QACF;AAAA,QACA,UAAU,YAAY;AAAA,QACtB,MAAM,aAAY,UAAU,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,SAAS,GAAG,EAAE,IAAI;AAAA,QAC7E,UAAU,OAAO,WAAW,KAAK,YAAY,UAAS,CAAC;AAAA,OACxD,EACA,MAAM,CAAC,UACN,QAAQ,MAAM,4CAA4C,QAAQ,MAAM,KAAK,CAC/E;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,UAAU,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,SAAS,GAAG,EAAE,IAAI;AAAA,IAC7E,UAAU,OAAO,WAAW,SAAS,OAAO,SAAS,CAAC;AAAA,GACvD;AAAA,EAED,OAAO;AAAA;AAiBT,eAAsB,gBAAgB,CACpC,MACA,OACA,KACA,MACA;AAAA,EAEA,IAAI,KAAI,MAAM;AAAA,IACZ,OAAO,yBAAyB,MAAK,OAAO,KAAK,IAAI;AAAA,EACvD;AAAA,EAEA,QAAQ,KAAI;AAAA,SACL,WAAW;AAAA,MACd,MAAM,IAAkB,IAAI,IAAI;AAAA,MAChC,MAAM,aAAa,KAAI,YAAY;AAAA,MACnC,IAAI,gBAAsD;AAAA,MAE1D,IAAI,CAAC,KAAI,QAAQ;AAAA,QACf,OAAO,MAAM;AAAA,UACX,IAAI;AAAA,UACJ,IAAI,iBAAiB,KAAI,GAAG,GAAG;AAAA,YAC7B,MAAM,iBAAiB,KAAI,KAAK,KAAK;AAAA,UACvC,EAAO;AAAA,aACJ,EAAE,IAAI,IAAI;AAAA;AAAA,UAEb,IAAI,CAAC,OAAO,QAAQ,eAAe,IAAI,SAAS,WAAW,GAAG;AAAA,YAC5D;AAAA,UACF;AAAA,UAEA,MAAM,aAAa,IAAI;AAAA,UACvB,gBAAgB,MAAM;AAAA,YACpB,WAAW,MAAM;AAAA,YACjB,IAAI,kBAAkB,MAAM;AAAA,cAC1B,aAAa,aAAa;AAAA,YAC5B;AAAA,WACD;AAAA,UAED,MAAM,UAAU,MACd,MAAM,KAAK;AAAA,YACT,QAAQ,KAAI,UAAU;AAAA,YACtB,QAAQ,WAAW;AAAA,eACf,KAAI,WAAW,EAAE,SAAS,KAAI,QAAQ;AAAA,eACtC,KAAI,QAAQ;AAAA,cACd,MAAM,OAAO,KAAI,SAAS,WAAW,KAAK,UAAU,KAAI,IAAI,IAAI,KAAI;AAAA,YACtE;AAAA,UACF,CAAC,EACE,KAAK,CAAC,MAAO,EAAE,KAAK,EAAE,KAAK,IAAI,QAAQ,OAAO,EAAE,UAAU,CAAE,EAC5D,KAAK,CAAC,MAAM;AAAA,YACX,EAAE,QAAQ;AAAA,WACX,EACA,MAAM,CAAC,UAAmB;AAAA,YACzB,IAAI,EAAE,iBAAiB,SAAS,MAAM,SAAS,eAAe;AAAA,cAC5D,EAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,EAAE;AAAA,YACnC;AAAA,WACD;AAAA,UAEL,IAAI,aAAa,GAAG;AAAA,YAClB,gBAAgB,WAAW,SAAS,UAAU;AAAA,UAChD,EAAO;AAAA,YACA,QAAQ;AAAA;AAAA,SAEhB;AAAA,MACH;AAAA,MAEA,OAAO;AAAA,IACT;AAAA,SAEK,mBAAmB;AAAA,MACtB,OAAO,SAAS,MAAM;AAAA,QACpB,MAAM,IAA4B,CAAC;AAAA,QACnC,YAAY,GAAG,MAAM,OAAO,QAAQ,IAAG,GAAG;AAAA,UACxC,IAAI,MAAM,cAAc;AAAA,YACtB,EAAE,KACA,SAAS,CAAC,IACN,WAAW,EAAE,MAAM,KAAK,IACxB,iBAAiB,CAAC,IAChB,iBAAiB,GAAG,KAAK,IACzB;AAAA,UAEV;AAAA,QACF;AAAA,QACA,OAAO,IAAI,gBAAgB,CAAC,EAAE,SAAS;AAAA,OACxC;AAAA,IACH;AAAA,SAEK;AAAA,SACA,kBAAkB;AAAA,MACrB,MAAM,QAAQ,KAAI,eAAe,iBAAiB,eAAe;AAAA,MACjE,MAAM,IAAI,KAAI,OAAO;AAAA,MACrB,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,MAAM,IAAI,MAAM,QAAQ,CAAC;AAAA,QACzB,OAAO,MAAM,OAAQ,KAAK,MAAM,CAAC,IAAiB,KAAI,WAAW;AAAA,QACjE,MAAM;AAAA,QACN,OAAO,KAAI,WAAW;AAAA;AAAA,MAExB,MAAM,eAA6B,IAAI,IAAI;AAAA,MAE3C,OAAO,MAAM;AAAA,QACX,MAAM,IAAI,aAAa;AAAA,QACvB,IAAI,MAAM,MAAM;AAAA,UACd,IAAI;AAAA,YACF,MAAM,WAAW,CAAC;AAAA,YAClB,MAAM;AAAA,QACV,EAAO;AAAA,UACL,IAAI;AAAA,YACF,MAAM,QAAQ,GAAG,KAAK,UAAU,CAAC,CAAC;AAAA,YAClC,MAAM;AAAA;AAAA,OAEX;AAAA,MACD,OAAO;AAAA,IACT;AAAA,SAEK,UAAU;AAAA,MACb,MAAM,OAAO,KAAI,QAAQ;AAAA,MACzB,MAAM,OAAO,MAAM;AAAA,QACjB,MAAM,IAAI,SAAS,OAAO,MAAM,IAAI,OAAO,WAAW,cAAc,CAAC;AAAA,QACrE,IAAI,CAAC,GAAG;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA,IAAI;AAAA,UACF,OAAO,KAAK,MAAM,mBAAmB,EAAE,EAAG,CAAC;AAAA,UAC3C,MAAM;AAAA,UACN,OAAO,EAAE;AAAA;AAAA;AAAA,MAGb,MAAM,cAA4B,IAAI,KAAK,KAAK,KAAI,WAAW,IAAI;AAAA,MAEnE,OAAO,MAAM;AAAA,QACX,MAAM,IAAI,YAAY;AAAA,QACtB,IAAI,IAAI,GAAG,QAAQ,mBAAmB,KAAK,UAAU,CAAC,CAAC;AAAA,QACvD,IAAI,KAAI,WAAW,WAAW;AAAA,UAC5B,KAAK,aAAa,KAAI;AAAA,QACxB;AAAA,QACA,IAAI,KAAI,MAAM;AAAA,UACZ,KAAK,UAAU,KAAI;AAAA,QACrB;AAAA,QACA,IAAI,KAAI,QAAQ;AAAA,UACd,KAAK,YAAY,KAAI;AAAA,QACvB;AAAA,QACA,IAAI,KAAI,QAAQ;AAAA,UACd,KAAK;AAAA,QACP;AAAA,QACA,IAAI,KAAI,UAAU;AAAA,UAChB,KAAK,cAAc,KAAI;AAAA,QACzB;AAAA,QAEA,SAAS,SAAS;AAAA,OACnB;AAAA,MACD,OAAO;AAAA,IACT;AAAA,SAEK,aAAa;AAAA,MAChB,MAAM,WAAyB,IAAI,IAAI;AAAA,MACvC;AAAA,QACE;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,UAAU,CAAC;AAAA,UACT;AAAA,MACJ,IAAI,CAAC,YAAY,CAAC,OAAO;AAAA,QACvB,MAAM,IAAI,MAAM,wBAAwB,kCAAkC;AAAA,MAC5E;AAAA,MACA,MAAM,MAAM,UAAU,KAAK,UAAU,OAAO;AAAA,MAC5C,IAAI,iBAAiB,iBAAiB,CAAC,MAAM;AAAA,QAC3C,MAAM,KAAmB,EAAE,OAA4B;AAAA,QACvD,IAAI,CAAC,GAAG,iBAAiB,SAAS,KAAK,GAAG;AAAA,UACxC,MAAM,KAAK,GAAG,kBAAkB,OAAO,EAAE,eAAe,QAAQ,CAAC;AAAA,UACjE,WAAW,KAAK,SAAS;AAAA,YACvB,GAAG,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,MAAM,CAAC;AAAA,UACjE;AAAA,QACF;AAAA,OACD;AAAA,MACD,IAAI,iBAAiB,WAAW,CAAC,MAAM;AAAA,QACrC,MAAM,KAAmB,EAAE,OAA4B;AAAA,QACvD,SAAS,QAAQ;AAAA,UACf;AAAA,UACA,UAAU,CAAC,OAA2B,gBACpC,QAAQ,QAAQ,GAAG,YAAY,OAAO,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA,UAChE,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,OACD;AAAA,MACD,IAAI,iBAAiB,SAAS,MAAM;AAAA,QAClC,SAAS,QAAQ,EAAE,OAAO,IAAI,OAAO,QAAQ;AAAA,OAC9C;AAAA,MACD,OAAO;AAAA,IACT;AAAA,SAEK,OAAO;AAAA,MACV,OAAO,IAAI,IAAI,MAAM,QAAQ,KAAI,OAAO,IAAI,KAAI,UAAU,CAAC,CAAC;AAAA,IAC9D;AAAA,SAEK,OAAO;AAAA,MACV,OAAO,IAAI,IAAI,OAAO,QAAQ,aAAa,KAAI,OAAO,IAAI,KAAI,UAAU,CAAC,CAAC,CAAC;AAAA,IAC7E;AAAA,SAEK,YAAY;AAAA,MACf,MAAM,KAAK,IAAI;AAAA,MACf,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAI,UAAU,CAAC,CAAC,GAAG;AAAA,QACrD,GAAG,OAAO,GAAG,CAAW;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,IACT;AAAA,SAEK,QAAQ;AAAA,MACX,OAAO,IAAI,KAAM,KAAI,SAAwB,CAAC,GAAG;AAAA,QAC/C,MAAM,OAAO,KAAI,SAAS,WAAW,KAAI,OAAO;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,SAEK,kBAAkB;AAAA,MACrB,OAAO;AAAA,IACT;AAAA,aAES;AAAA,MACP,QAAQ,KACN,2BAA2B,KAAI,oBAAoB,mCACrD;AAAA,MACA,OAAO,IAAI,IAAI;AAAA,IACjB;AAAA;AAAA;AAOJ,IAAM,oBAAoB,IAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAWD,eAAe,wBAAwB,CACrC,MACA,OACA,KACA,MACA;AAAA,EACA,MAAM,MAAM,KAAI;AAAA,EAGhB,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,aAAa,GAAG;AAAA,IACxC,MAAM,IAAI,MACR,mBAAmB,KAAI,iDAAiD,oEAE1E;AAAA,EACF;AAAA,EAEA,OAAO,iBAAiB,MAAK,OAAO,KAAK,IAAI;AAAA;AAa/C,eAAe,oBAAoB,CAAC,MAAc,KAAa,YAAoB,MAAe;AAAA,EAChG,IAAI;AAAA,EACJ,IAAI,aAAa,IAAI,GAAG,GAAG;AAAA,IACzB,MAAM,aAAa,IAAI,GAAG;AAAA,EAC5B,EAAO;AAAA,IACL,IAAI;AAAA,MACF,MAAO,MAAa;AAAA,MACpB,MAAM;AAAA,MACN,IAAI,MAAM;AAAA,QACR,MAAM,cAAc,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,QACvC,MAAO,MAAa;AAAA,MACtB,EAAO;AAAA,QACL,MAAM,IAAI,MAAM,qBAAqB,MAAM;AAAA;AAAA;AAAA,IAG/C,aAAa,IAAI,KAAK,GAAG;AAAA;AAAA,EAG3B,MAAM,gBAAgB,IAAI,eAAe,IAAI,UAAU;AAAA,EACvD,IAAI,CAAC,eAAe;AAAA,IAClB,MAAM,IAAI,MAAM,eAAe,6BAA6B,MAAM;AAAA,EACpE;AAAA,EACA,IAAI,OAAO,kBAAkB,YAAY;AAAA,IACvC,MAAM,IAAI,UAAU,QAAQ,qBAAqB,qBAAqB;AAAA,EACxE;AAAA,EAEA,MAAM,SAAkB,CAAC;AAAA,EACzB,YAAY,GAAG,MAAM,OAAO,QAAQ,IAAG,GAAG;AAAA,IACxC,IAAI,CAAC,kBAAkB,IAAI,CAAC,GAAG;AAAA,MAC7B,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,OAAO;AAAA,EACb,MAAM,WAAW,IAAI,KAAK,MAAM;AAAA,EAEhC,IAAI;AAAA,EACJ,IAAI,OAAO,SAAS,YAAY,YAAY;AAAA,IAC1C,QAAQ,MAAM,SAAS,QAAQ;AAAA,EACjC,EAAO,SAAI,WAAW,UAAU;AAAA,KAC7B,EAAE,MAAM,IAAI;AAAA,EACf,EAAO;AAAA,IACL,QAAQ;AAAA;AAAA,EAIV,MAAM,IAAkB,IAAI,KAAK;AAAA,EACjC,IAAI,OAAO,SAAS,cAAc,YAAY;AAAA,IAC5C,SAAS,UAAU,CAAC,WAAoB;AAAA,MACtC,EAAE,QAAQ;AAAA,KACX;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAaT,eAAe,gBAAgB,CAAC,MAAqB,OAAgB,KAAa,MAAe;AAAA,EAC/F,MAAM,MAAM,KAAI;AAAA,EAChB,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,IAAI,MAAM,oBAAoB,kBAAkB;AAAA,EACxD;AAAA,EACA,IAAI;AAAA,EAIJ,MAAM,kBACJ,CAAC,IAAI,WAAW,GAAG,KACnB,CAAC,IAAI,WAAW,GAAG,KACnB,CAAC,IAAI,WAAW,MAAM,KACtB,CAAC,IAAI,WAAW,OAAO;AAAA,EACzB,IAAI,iBAAiB;AAAA,IACnB,OAAO,mBAAmB,MAAK,OAAO,KAAK,IAAI;AAAA,EACjD;AAAA,EAGA,IAAI;AAAA,IACF,MAAM,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,OAAO;AAAA,IAC7C,MAAM,MAAM,MAAM,MAAM,GAAG;AAAA,IAC3B,IAAI,CAAC,IAAI,IAAI;AAAA,MACX,MAAM,IAAI,MAAM,QAAQ,IAAI,QAAQ;AAAA,IACtC;AAAA,IAEA,WAAY,MAAM,IAAI,KAAK;AAAA,IAC3B,MAAM;AAAA,IAEN,OAAO,mBAAmB,MAAK,OAAO,KAAK,IAAI;AAAA;AAAA,EAIjD,IAAI,SAAS,iBAAiB;AAAA,IAG5B,MAAM,YAAY,KAAK,UAAU,QAAQ;AAAA,IACzC,IAAI,UAAU,SAAS,cAAc,GAAG;AAAA,MACtC,OAAO,mBAAmB,MAAK,OAAO,KAAK,IAAI;AAAA,IACjD;AAAA,IACA,MAAM,YAAY,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE;AAAA,IAC/E,MAAM,UAAU,IAAI,IAAI,SAAS,iBAAiB,SAAS,EAAE;AAAA,IAC7D,MAAM,aAAa,KAAI,WAAW,SAAS,SAAS,KAAI;AAAA,IACxD,IAAI;AAAA,MACF,OAAO,MAAM,qBAAqB,MAAK,SAAS,YAAY,IAAI;AAAA,MAChE,MAAM;AAAA,MACN,OAAO,mBAAmB,MAAK,OAAO,KAAK,IAAI;AAAA;AAAA,EAEnD;AAAA,EAGA,MAAM,WAAW,gBAAgB,QAAQ;AAAA,EACzC,MAAM,SAAkB,CAAC;AAAA,EACzB,YAAY,GAAG,MAAM,OAAO,QAAQ,IAAG,GAAG;AAAA,IACxC,IAAI,CAAC,kBAAkB,IAAI,CAAC,GAAG;AAAA,MAC7B,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EACA,MAAM,WAAW,IAAI,SAAS,MAAM;AAAA,EAEpC,IAAI;AAAA,EACJ,IAAI,OAAO,SAAS,YAAY,YAAY;AAAA,IAC1C,QAAQ,MAAM,SAAS,QAAQ;AAAA,EACjC,EAAO,SAAI,WAAW,UAAU;AAAA,KAC7B,EAAE,MAAM,IAAI;AAAA,EACf,EAAO;AAAA,IACL,QAAQ;AAAA;AAAA,EAIV,MAAM,IAAkB,IAAI,KAAK;AAAA,EACjC,IAAI,OAAO,SAAS,cAAc,YAAY;AAAA,IAC5C,SAAS,UAAU,CAAC,WAAoB;AAAA,MACtC,EAAE,QAAQ;AAAA,KACX;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAUT,SAAS,eAAe,CAAC,UAAsB;AAAA,EAC7C,MAAM,SAAS,SAAS,OAAO,UAAU,CAAC;AAAA,EAE1C,MAAM,UAAU,SAAS,OAAO;AAAA,EAChC,MAAM,OAAO,OAAO,YAAY,WAAW,UAAU;AAAA,EACrD,MAAM,UAAU,SAAS,OAAO,WAAW,CAAC;AAAA;AAAA,EAG5C,MAAM,SAAS;AAAA,IACb,WAAW,CAAC,SAAkC,CAAC,GAAG;AAAA,MAChD,YAAY,KAAK,eAAe,OAAO,QAAQ,MAAM,GAAG;AAAA,QACtD,MAAM,KAAK,WAAW,cAAc;AAAA,QACpC,MAAM,WAAW,WAAW,WAAW,YAAY,IAAI,OAAO;AAAA,QAC9D,IAAI,OAAO,QAAQ,WAAW;AAAA,UAC3B,KAAiC,YAAY,OAAO;AAAA,QACvD,EAAO,SAAI,WAAW,gBAAgB,WAAW;AAAA,UAC9C,KAAiC,YAAY,WAAW;AAAA,QAC3D,EAAO,SAAI,WAAW,YAAY,WAAW;AAAA,UAC1C,KAAiC,YAAY,gBAAgB,WAAW,OAAO;AAAA,QAClF,EAAO;AAAA,UACJ,KAAiC,YAAY;AAAA;AAAA,MAElD;AAAA,MACA,IAAI,MAAM,MAAM;AAAA,QACd,MAAM,UAAU,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK;AAAA,CAAI,IAAI,KAAK;AAAA,QAErE,IAAI,SAAS,UAAU,OAAO,EAI9B,KAAK,MAAM,MAAM;AAAA,MACrB;AAAA;AAAA,EAEJ;AAAA,EAEA,YAAY,KAAK,gBAAgB,OAAO,QAAQ,OAAO,GAAG;AAAA,IACxD,MAAM,OAAO,YAAY,cAAc;AAAA,IACvC,MAAM,UAAU,YAAY,cAAc,CAAC,GAAG,IAAI,CAAC,MAAM;AAAA,MACvD,IAAI,EAAE,MAAM;AAAA,QACV,OAAO,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI;AAAA,MAC/B;AAAA,MACA,MAAM,IAAI,EAAE,cAAc,EAAE;AAAA,MAC5B,OAAO,OAAO,MAAM,WAAW,IAAI;AAAA,KACpC;AAAA,IACD,MAAM,UAAU,MAAM,QAAQ,YAAY,IAAI,IAC1C,YAAY,KAAK,KAAK;AAAA,CAAI,IACzB,YAAY,QAAQ;AAAA,IAEzB,IAAI,YAAY,SAAS,YAAY;AAAA,MACnC,MAAM,aAAiC,CAAC;AAAA,MACxC,IAAI,YAAY,QAAQ;AAAA,QACtB,WAAW,MAAM,IAAI,SAAS,YAAY,OAAO,QAAQ,EAAE;AAAA,MAC7D;AAAA,MACA,IAAI,YAAY,QAAQ;AAAA,QACtB,MAAM,MAAM,YAAY,OAAO,cAAc,CAAC,GAAG,IAC/C,CAAC,MAAM,EAAE,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK,GACrC;AAAA,QACA,WAAW,MAAM,IAAI,SAAS,GAAG,IAAI,YAAY,OAAO,QAAQ,EAAE;AAAA,MACpE;AAAA,MACA,OAAO,eAAe,SAAS,WAAW,MAAM;AAAA,WAC3C;AAAA,QACH,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,EAAO,SAAI,YAAY,UAAU,UAAU;AAAA,MACxC,SAAqC,QAAQ,IAAI,SAAS,GAAG,QAAQ,OAAO;AAAA,IAC/E,EAAO;AAAA,MACJ,SAAqC,UAAU,QAAQ,IAAI,SAAS,GAAG,QAAQ,OAAO;AAAA;AAAA,EAE3F;AAAA,EAEA,OAAO,eAAe,UAAU,QAAQ;AAAA,IACtC,cAAc;AAAA,IACd,OAAO,SAAS;AAAA,EAClB,CAAC;AAAA,EACD,MAAM,UAAU;AAAA,EAChB,OAAO;AAAA;AAcT,eAAe,kBAAkB,CAAC,MAAqB,OAAgB,KAAa,MAAe;AAAA,EACjG,MAAM,SAAkB,CAAC;AAAA,EACzB,YAAY,GAAG,MAAM,OAAO,QAAQ,IAAG,GAAG;AAAA,IACxC,IAAI,CAAC,kBAAkB,IAAI,CAAC,GAAG;AAAA,MAC7B,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,OAAO,OAAO,MAAM,EAAE,KAAK,CAAC,MAAe,iBAAiB,CAAC,CAAC;AAAA,EAGnF,MAAM,YAAY,CAAC,mBACjB,MAAM,iBAAiB,iBAAiB,GAAG;AAAA,IACzC,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO;AAAA,MACP,SAAS,KAAI;AAAA,MACb,YAAY,KAAI;AAAA,MAChB,MAAM,KAAI;AAAA,SACP;AAAA,IACL,CAAC;AAAA,IACD,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,QAAQ;AAAA,EACV,CAAC,EAAE,KAAK,CAAC,MAAM;AAAA,IACb,IAAI,CAAC,EAAE,IAAI;AAAA,MACT,MAAM,IAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM;AAAA,IACzD;AAAA,IACA,OAAO,EAAE,KAAK;AAAA,GACf;AAAA,EAGH,MAAM,IAAkB,IAAI,IAAI;AAAA,EAChC,IAAI,cAAc;AAAA,IAChB,OAAO,MAAM;AAAA,MACX,MAAM,iBAA0B,CAAC;AAAA,MACjC,YAAY,GAAG,MAAM,OAAO,QAAQ,MAAM,GAAG;AAAA,QAC3C,eAAe,KAAK,iBAAiB,CAAC,IAAI,iBAAiB,GAAG,KAAK,IAAI;AAAA,MACzE;AAAA,MACA,UAAU,cAAc,EACrB,KAAK,CAAC,UAAmB;AAAA,QACxB,EAAE,QAAQ;AAAA,OACX,EACA,MAAM,CAAC,UAAmB,QAAQ,MAAM,iBAAiB,KAAK,CAAC;AAAA,KACnE;AAAA,EACH,EAAO;AAAA,IACL,UAAU,MAAM,EACb,KAAK,CAAC,UAAmB;AAAA,MACxB,EAAE,QAAQ;AAAA,KACX,EACA,MAAM,CAAC,UAAmB,QAAQ,MAAM,iBAAiB,KAAK,CAAC;AAAA;AAAA,EAEpE,OAAO;AAAA;AAeT,eAAe,qBAAqB,CAClC,MACA,OACA,KACA,MACA;AAAA,EACA,MAAM,MAAM,KAAI;AAAA,EAChB,MAAM,aAAa,KAAI;AAAA,EAEvB,IAAI;AAAA,EACJ,IAAI,aAAa,IAAI,GAAG,GAAG;AAAA,IACzB,MAAM,aAAa,IAAI,GAAG;AAAA,EAC5B,EAAO;AAAA,IACL,IAAI;AAAA,MACF,MAAO,MAAa;AAAA,MACpB,MAAM;AAAA,MACN,IAAI,MAAM;AAAA,QACR,IAAI;AAAA,UACF,MAAM,cAAc,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,UACvC,MAAO,MAAa;AAAA,UACpB,MAAM;AAAA,UAEN,OAAO,8BAA8B,MAAK,OAAO,KAAK,IAAI;AAAA;AAAA,MAE9D,EAAO;AAAA,QACL,OAAO,8BAA8B,MAAK,OAAO,KAAK,IAAI;AAAA;AAAA;AAAA,IAG9D,aAAa,IAAI,KAAK,GAAG;AAAA;AAAA,EAG3B,MAAM,YAAY,IAAI,eAAe,IAAI,UAAU;AAAA,EACnD,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,eAAe,6BAA6B,aAAa,MAAM;AAAA,EACjF;AAAA,EACA,IAAI,OAAO,cAAc,YAAY;AAAA,IACnC,MAAM,IAAI,UAAU,QAAQ,qBAAqB,wBAAwB;AAAA,EAC3E;AAAA,EACA,MAAM,KAAK;AAAA,EAEX,MAAM,UAAU,KAAI,aAAa,CAAC;AAAA,EAClC,MAAM,iBAAiB,OAAO,OAAO,OAAO,EAAE,KAAK,CAAC,MAAe,SAAS,CAAC,CAAC;AAAA,EAC9E,MAAM,cAAc,MAAM;AAAA,IACxB,MAAM,OAAgB,CAAC;AAAA,IACvB,YAAY,GAAG,MAAM,OAAO,QAAQ,OAAO,GAAG;AAAA,MAC5C,KAAK,KAAK,SAAS,CAAC,IAAI,WAAW,EAAE,MAAM,KAAK,IAAI;AAAA,IACtD;AAAA,IACA,OAAO;AAAA;AAAA,EAIT,MAAM,IAAkB,IAAI,IAAI;AAAA,EAChC,IAAI,gBAAgB;AAAA,IAClB,OAAO,MAAM;AAAA,MACX,MAAM,OAAO,YAAY;AAAA,MACzB,gBAAgB,MAAM,EAAE;AAAA,MACxB,GAAG,IAAI,EACJ,KAAK,CAAC,WAAoB;AAAA,QACzB,EAAE,QAAQ;AAAA,OACX,EACA,MAAM,MAAM,EAAE;AAAA,KAClB;AAAA,EACH,EAAO;AAAA,IACL,EAAE,QAAQ,MAAM,GAAG,YAAY,CAAC;AAAA;AAAA,EAElC,OAAO;AAAA;AAcT,eAAe,6BAA6B,CAC1C,MACA,OACA,KACA,MACA;AAAA,EACA,MAAM,UAAU,KAAI,aAAa,CAAC;AAAA,EAClC,MAAM,iBAAiB,OAAO,OAAO,OAAO,EAAE,KAAK,CAAC,MAAe,SAAS,CAAC,CAAC;AAAA,EAE9E,MAAM,cAAc,MAAM;AAAA,IACxB,MAAM,OAAgB,CAAC;AAAA,IACvB,YAAY,GAAG,MAAM,OAAO,QAAQ,OAAO,GAAG;AAAA,MAC5C,KAAK,KAAK,SAAS,CAAC,IAAI,WAAY,EAAuB,MAAM,KAAK,IAAI;AAAA,IAC5E;AAAA,IACA,OAAO;AAAA;AAAA,EAIT,MAAM,YAAY,CAAC,SACjB,MAAM,iBAAiB,gBAAgB,GAAG;AAAA,IACxC,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO;AAAA,MACP,SAAS,KAAI;AAAA,MACb,MAAM,KAAI;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,IACD,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,QAAQ;AAAA,EACV,CAAC,EAAE,KAAK,CAAC,MAAM;AAAA,IACb,IAAI,CAAC,EAAE,IAAI;AAAA,MACT,MAAM,IAAI,MAAM,mBAAmB,EAAE,eAAe,MAAM;AAAA,IAC5D;AAAA,IACA,OAAO,EAAE,KAAK;AAAA,GACf;AAAA,EAGH,MAAM,IAAkB,IAAI,IAAI;AAAA,EAChC,IAAI,gBAAgB;AAAA,IAClB,OAAO,MAAM;AAAA,MACX,MAAM,OAAO,YAAY;AAAA,MACzB,gBAAgB,MAAM,EAAE;AAAA,MACxB,UAAU,IAAI,EACX,KAAK,CAAC,WAAoB;AAAA,QACzB,EAAE,QAAQ;AAAA,OACX,EACA,MAAM,CAAC,UAAmB,QAAQ,MAAM,oBAAoB,KAAK,CAAC;AAAA,KACtE;AAAA,EACH,EAAO;AAAA,IACL,UAAU,YAAY,CAAC,EACpB,KAAK,CAAC,WAAoB;AAAA,MACzB,EAAE,QAAQ;AAAA,KACX,EACA,MAAM,CAAC,UAAmB,QAAQ,MAAM,oBAAoB,KAAK,CAAC;AAAA;AAAA,EAEvE,OAAO;AAAA;AAaF,SAAS,UAAU,CAAC,SAAiB,OAAgB;AAAA,EAC1D,IAAI,OAAO,YAAY,UAAU;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,QAAQ,WAAW,OAAO,GAAG;AAAA,IAC/B,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,IAC/B,SAAS,OAAO;AAAA,IAChB,MAAM,MAAM,MAAM;AAAA,IAClB,MAAM,OAAO,MAAM,QAAS,MAAM,QAAQ;AAAA,IAC1C,OAAO,MAAM,SAAS,IAAI,SAAQ,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI;AAAA,EACtE;AAAA,EACA,IAAI,QAAQ,WAAW,UAAU,GAAG;AAAA,IAClC,MAAM,MAAM,QAAQ,MAAM,WAAW,MAAM;AAAA,IAC3C,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAC7B,IAAI,UAAU,IAAI;AAAA,MAChB,OAAO,MAAM;AAAA,IACf;AAAA,IACA,OAAO,SAAQ,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,EACjE;AAAA,EACA,IAAI,QAAQ,WAAW,UAAU,GAAG;AAAA,IAClC,OAAO,MAAM,QAAQ,MAAM,WAAW,MAAM;AAAA,EAC9C;AAAA,EACA,IAAI,QAAQ,WAAW,UAAU,GAAG;AAAA,IAClC,OAAO,SAAQ,WAAW,QAAQ,QAAQ,MAAM,WAAW,MAAM,CAAC;AAAA,EACpE;AAAA,EACA,IAAI,QAAQ,WAAW,YAAY,GAAG;AAAA,IACpC,OAAO,SAAQ,WAAW,UAAU,QAAQ,MAAM,aAAa,MAAM,CAAC;AAAA,EACxE;AAAA,EACA,OAAO,MAAM,YAAY;AAAA;AAmB3B,SAAS,QAAQ,CAAC,GAAwB;AAAA,EACxC,OAAO,OAAW,CAAC;AAAA;AAOrB,SAAS,gBAAgB,CAAC,GAAW;AAAA,EACnC,OAAO,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG;AAAA;AAQxF,SAAS,QAAO,CAAC,KAAc,MAAc;AAAA,EAC3C,IAAI,UAAmB;AAAA,EACvB,WAAW,KAAK,KAAK,MAAM,MAAM,GAAG;AAAA,IAClC,UAAW,UAAsC;AAAA,EACnD;AAAA,EACA,OAAO;AAAA;AAQT,SAAS,UAAU,CAAC,MAAgB,aAA+B;AAAA,EACjE,MAAM,QAAQ,OAAO,OAAO,WAAW;AAAA,EACvC,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAI,UAAU,CAAC,CAAC,GAAG;AAAA,IACrD,MAAM,KAAK,SAAS,CAAC,IAAI,WAAW,EAAE,MAAM,WAAW,IAAI;AAAA,EAC7D;AAAA,EACA,OAAO;AAAA;AASF,SAAS,YAAY,CAAC,GAAW;AAAA,EACtC,OAAO,EAAE,WAAW,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,GAAG;AAAA;AASrD,SAAS,SAAS,CAAC,OAAyC;AAAA,EACjE,OAAO,OAAO,QAAQ,KAAK,EACxB,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,MAAM,QAAQ,OAAO,MAAM,SAAS,EAChF,IAAI,EAAE,GAAG,OAAO,GAAG,aAAa,CAAC,MAAM,qBAAqB,OAAO,CAAC,CAAC,GAAG,EACxE,KAAK,IAAI;AAAA;AAKd,IAAI,aAAqC,CAAC;AAC1C,IAAM,eAAe,IAAI;AAalB,SAAS,YAAY,CAAC,KAAmC;AAAA,EAC9D,aAAa,OAAO,CAAC;AAAA;AAUvB,eAAe,gBAAgB,CAAC,UAAgD,MAAc;AAAA,EAC5F,WAAW,SAAS,UAAU;AAAA,IAE5B,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,IAAI;AAAA,QAGF,MAAM,YACJ,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,IAAI,QAAQ,iBAAiB;AAAA,QAC5E,MAAa;AAAA,QACb,OAAO,OAAO;AAAA,QACd,QAAQ,KAAK,iCAAiC,UAAU,KAAK;AAAA;AAAA,MAE/D;AAAA,IACF;AAAA,IACA,IAAI,CAAC,SAAS,KAAK,GAAG;AAAA,MACpB;AAAA,IACF;AAAA,IACA,QAAQ,SAAS,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,IACzC,MAAM,MAAM,MAAM,QAAQ,IAAI;AAAA,IAC9B,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,GAAG,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,IAAI,eAAe,IAAI,IAAI,OAAO,GAAG;AAAA,MACnC;AAAA,IACF;AAAA,IAGA,IAAI,IAAI,WAAW;AAAA,MACjB,MAAM,iBAAiB,IAAI,WAAW,IAAI;AAAA,IAC5C;AAAA,IAEA,MAAM,cAAc,KAAK,IAAI;AAAA,EAC/B;AAAA;AAuDF,IAAM,kBAAkB,IAAI;AAE5B,eAAsB,aAAa,CAAC,QAA6B,SAAkB;AAAA,EACjF,IAAI,OAAO;AAAA,EACX,IAAI,MAAM;AAAA,EACV,IAAI,OAAO,WAAW,UAAU;AAAA,IAC9B,OAAO,IAAI,IAAI,QAAQ,QAAQ,SAAS,IAAI,EAAE;AAAA,IAC9C,IAAI,gBAAgB,IAAI,IAAI,GAAG;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,gBAAgB,IAAI,IAAI;AAAA,IACxB,MAAM,MAAM,QAAQ,MAAM;AAAA,EAC5B;AAAA,EACA,SAAS,SAAS;AAAA,EAElB,MAAM,UAAsB;AAAA,EAE5B,QAAQ,YAAY;AAAA,EACpB,IAAI,CAAC,WAAW,CAAC,QAAQ,SAAS,GAAG,GAAG;AAAA,IACtC,MAAM,IAAI,MAAM,8BAA8B,gCAAgC;AAAA,EAChF;AAAA,EACA,IAAI,eAAe,IAAI,OAAO,GAAG;AAAA,IAC/B;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,WAAW;AAAA,IACrB,MAAM,iBAAiB,QAAQ,WAAW,IAAI;AAAA,EAChD;AAAA,EAEA,aAAa,IAAI,SAAS,EAAE,MAAM,KAAK,QAAQ,CAAC;AAAA,EAEhD,MAAM,OAAM;AAAA,EACZ,MAAM,gBAAgB,KAAI,sBAAsB,CAAC;AAAA,EAEjD,MAAM,eAAe,cAAc,YAAY;AAAA,IAC7C,iBAAiB;AAAA,IACjB,SAAyB;AAAA,eAEd,kBAAkB,GAAG;AAAA,MAC9B,OAAO;AAAA;AAAA,SAGH,kBAAiB,GAAG;AAAA,MAKxB,IAAI,KAAK,QAAQ,qBAAqB,WAAW;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,IAAI,KAAK,gBAAgB;AAAA,QACvB;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AAAA,MAEtB,MAAM,QAAQ,MAAM,WAAW,MAAK,CAAC,GAAG,IAAI;AAAA,MAG5C,MAAM,YAAY,KAAK,QAAQ;AAAA,MAC/B,IAAI,WAAW;AAAA,QACb,IAAI;AAAA,UACF,MAAM,QAAQ,KAAK,MAAM,SAAS;AAAA,UAClC,YAAY,KAAK,QAAQ,OAAO,QAAQ,KAAK,GAAG;AAAA,YAC9C,IAAI,QAAQ,KAAI,SAAS,CAAC,IAAI;AAAA,cAC5B,MAAM,OAAO;AAAA,YACf;AAAA,UACF;AAAA,UACA,MAAM;AAAA,QACR,OAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,MAMA,MAAM,gBAAgB,KAAK,kBAAkB,EAAE,OAC7C,CAAC,SAAS,KAAK,WAAW,QAAQ,KAAK,KAAK,SAAS,SAAS,MAChE;AAAA,MACA,WAAW,QAAQ,eAAe;AAAA,QAChC,MAAM,MAAM,KAAK,MAAM,SAAS,MAAM;AAAA,QACtC,IAAI,QAAQ,KAAI,SAAS,CAAC,IAAI;AAAA,UAC5B,MAAM,OAAO,KAAK,aAAa,IAAI;AAAA,UACnC,KAAK,gBAAgB,IAAI;AAAA,QAC3B;AAAA,MACF;AAAA,MAGA,WAAW,OAAO,OAAO,KAAK,KAAI,SAAS,CAAC,CAAC,GAAG;AAAA,QAC9C,IAAI,OAAO,QAAS,KAAiC,SAAS,WAAW;AAAA,UACvE,MAAM,OAAQ,KAAiC;AAAA,QACjD;AAAA,MACF;AAAA,MAEA,WAAW,OAAO,OAAO,KAAK,KAAI,SAAS,CAAC,CAAC,GAAG;AAAA,QAC9C,IAAI,EAAE,OAAO,YAAY,YAAY;AAAA,UACnC,OAAO,eAAe,MAAM,KAAK;AAAA,YAC/B,cAAc;AAAA,YACd,KAAK,MAAM,MAAM;AAAA,YACjB,KAAK,CAAC,MAAe;AAAA,cACnB,MAAM,OAAO;AAAA;AAAA,UAEjB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,SAAS;AAAA,MAGd,MAAM,kBAAkB,CAAC,GAAG,KAAK,UAAU;AAAA,MAC3C,KAAK,YAAY;AAAA,MAKjB,IAAI,CAAC,KAAK,MAAM,SAAS;AAAA,QACvB,KAAK,MAAM,UAAU;AAAA,MACvB;AAAA,MAGA,WAAW,MAAM,KAAI,SAAS,CAAC,GAAI,MAAM,aAAwC,CAAC,GAAG,KAAK;AAAA,MAC1F,gBAAgB,MAAM,KAAI,cAAc,CAAC,GAAG,KAAK;AAAA,MAEjD,MAAM,WAAW,MAAM,QAAQ,KAAI,QAAQ,IAAI,KAAI,WAAW,CAAC;AAAA,MAC/D,WAAW,YAAY,UAAU;AAAA,QAC/B,KAAK,OAAO,WAAW,UAAU,KAAK,CAAC;AAAA,MACzC;AAAA,MAGA,gBAAgB,MAAM,eAAe;AAAA,MAGrC,QAAQ,YAAY;AAAA,MACpB,IAAI,OAAO,YAAY,YAAY;AAAA,QACjC,eAAe,MAAO,QAAoC,KAAK,CAAC;AAAA,MAClE;AAAA;AAAA,IAGF,oBAAoB,GAAG;AAAA,MACrB,IAAI,OAAO,KAAK,QAAQ,cAAc,YAAY;AAAA,QAC/C,KAAK,OAAO,UAAsC,KAAK,MAAM;AAAA,MAChE;AAAA;AAAA,IAGF,eAAe,GAAG;AAAA,MAChB,IAAI,OAAO,KAAK,QAAQ,cAAc,YAAY;AAAA,QAC/C,KAAK,OAAO,UAAsC,KAAK,MAAM;AAAA,MAChE;AAAA;AAAA,IAGF,wBAAwB,CAAC,MAAc,QAAuB,QAAuB;AAAA,MACnF,IAAI,CAAC,KAAK,UAAU,WAAW,QAAQ;AAAA,QACrC;AAAA,MACF;AAAA,MACA,MAAM,WAAW,KAAK,WAAW,aAAa,CAAC,GAAW,MAAc,EAAE,YAAY,CAAC;AAAA,MACvF,MAAM,UAAU,KAAK,OAAO;AAAA,MAC5B,IAAI,OAAO,YAAY,UAAU;AAAA,QAC/B,KAAK,OAAO,YAAY,OAAO,MAAM;AAAA,MACvC,EAAO,SAAI,OAAO,YAAY,WAAW;AAAA,QACvC,KAAK,OAAO,YAAY,WAAW,QAAQ,WAAW;AAAA,MACxD,EAAO;AAAA,QACL,KAAK,OAAO,YAAY;AAAA;AAAA;AAAA,EAG9B;AAAA,EAEA,eAAe,OAAO,SAAS,YAAY;AAAA;AAY7C,SAAS,4BAA4B,CACnC,MACA,OACA,SACA,MACA;AAAA,EACA,MAAM,KAAK,SAAS,cAAc,KAAI,WAAW,KAAK;AAAA,EAEtD,IAAI,SAAS,eAAe;AAAA,IAC1B,QAAQ,cAAc,IAAI,QAAQ,CAAC,GAAG,MAAK,KAAK;AAAA,EAClD;AAAA,EAGA,YAAY,KAAK,QAAQ,OAAO,QAAQ,KAAI,UAAU,CAAC,CAAC,GAAG;AAAA,IACzD,IAAI,SAAS,GAAG,GAAG;AAAA,MACjB,MAAM,SAAS;AAAA,MACf,MAAM,WAAW,WAAW,OAAO,MAAM,KAAK;AAAA,MAC7C,GAA0C,OAAO;AAAA,MAElD,OAAO,MAAM;AAAA,QACV,GAA0C,OAAO,WAAW,OAAO,MAAM,KAAK;AAAA,OAChF;AAAA,IACH,EAAO,SAAI,iBAAiB,GAAG,GAAG;AAAA,MAChC,OAAO,MAAM;AAAA,QACV,GAA0C,OAAO,iBAAiB,KAAK,KAAK;AAAA,OAC9E;AAAA,IACH,EAAO;AAAA,MACJ,GAA0C,OAAO;AAAA;AAAA,EAEtD;AAAA,EAGA,WAAW,IAAI,KAAI,SAAS,CAAC,GAAI,MAAM,aAAwC,CAAC,GAAG,KAAK;AAAA,EACxF,gBAAgB,IAAI,KAAI,cAAc,CAAC,GAAG,KAAK;AAAA,EAG/C,MAAM,WAAW,MAAM,QAAQ,KAAI,QAAQ,IAAI,KAAI,WAAW,CAAC;AAAA,EAC/D,SAAS,IAAI,EAAG,IAAI,SAAS,QAAQ,KAAK;AAAA,IACxC,MAAM,YAAY,WAAW,OAAO,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI;AAAA,IACtF,GAAG,OAAO,WAAW,SAAS,IAAK,OAAO,SAAS,CAAC;AAAA,EACtD;AAAA,EAEA,OAAO;AAAA;AAST,SAAS,eAAe,CAAC,MAAmB,iBAA8B;AAAA,EACxE,IAAI,gBAAgB,WAAW,GAAG;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,KAAK,iBAAiB,MAAM;AAAA,EAC1C,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,UAAuB,CAAC;AAAA,EAE9B,WAAW,SAAS,iBAAiB;AAAA,IACnC,IAAI,MAAM,aAAa,KAAK,gBAAiB,MAAkB,aAAa,MAAM,GAAG;AAAA,MACnF,MAAM,OAAQ,MAAkB,aAAa,MAAM;AAAA,MACnD,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG;AAAA,QACpB,MAAM,IAAI,MAAM,CAAC,CAAC;AAAA,MACpB;AAAA,MACC,MAAM,IAAI,IAAI,EAAkB,KAAK,KAAK;AAAA,IAC7C,EAAO;AAAA,MACL,QAAQ,KAAK,KAAK;AAAA;AAAA,EAEtB;AAAA,EAEA,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,OAAO,KAAK,aAAa,MAAM;AAAA,IACrC,MAAM,UAAU,OAAQ,MAAM,IAAI,IAAI,KAAK,CAAC,IAAK;AAAA,IACjD,IAAI,QAAQ,SAAS,GAAG;AAAA,MACtB,KAAK,YAAY;AAAA,MACjB,WAAW,SAAS,SAAS;AAAA,QAC3B,KAAK,OAAO,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;;;ACnxEK,SAAS,kBAAkB,CAAC,MAAc,MAAc,KAAkC;AAAA,EAE/F,IAAI,IAAI,iBAAiB,OAAO,SAAQ,YAAa,MAAiC,WAAW;AAAA,IAC/F,OAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAAA,EAEA,IAAI,aAAa;AAAA,EAKjB,IAAI,IAAI,iBAAiB,IAAI,mBAAmB;AAAA,IAC9C,MAAM,MAAM,IAAI;AAAA,IAChB,IAAI,KAAK,UAAU,IAAI,UAAU,IAAI,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,GAAG,GAAG;AAAA,MACvE,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,OAAO,gBAAgB;AAAA,MACvB,aACE,OAAO,iBAAiB,WACpB,CAAC,YAAY,gBAAgB,IAAI,qBAAqB,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,IAC1E,CAAC,YAAY,GAAG,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAIA,KAAK,IAAI,eAAe,YAAY,IAAI,eAAe,WAAW,IAAI,WAAW,OAAO,GAAG;AAAA,IACzF,IAAI,UAAU;AAAA,IACd,OAAO,SAAS;AAAA,MACd,UAAU;AAAA,MACV,SAAS,IAAI,EAAG,IAAI,WAAW,SAAS,GAAG,KAAK;AAAA,QAC9C,IACE,WAAW,OAAO,cAClB,WAAW,IAAI,OAAO,KACtB,IAAI,WAAW,IAAI,WAAW,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GACnD;AAAA,UACA,aAAa,CAAC,GAAG,WAAW,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,WAAW,MAAM,IAAI,CAAC,CAAC;AAAA,UAC1E,UAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,MAAM,QAAQ,MAAM,WAAW;AAAA;AAInC,SAAS,eAAe,CAAC,MAAsB;AAAA,EACpD,OAAO,KAAK,UAAU,IAAI;AAAA;AAIrB,SAAS,WAAW,CAAC,YAA4B;AAAA,EACtD,OAAO,KAAK,MAAM,UAAU;AAAA;;;ACzB9B,eAAsB,iBAAgB,CAAC,KAAiB,SAAgC;AAAA,EACtF,MAAM,WAAY,IAAkC;AAAA,EACpD,IAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAAA,IAC5B;AAAA,EACF;AAAA,EAGA,MAAM,QAAQ,IACZ,SAAS,IAAI,OAAO,UAAU;AAAA,IAC5B,MAAM,QAAQ,YAAY;AAAA,MACxB,IAAI,OAAO,UAAU,UAAU;AAAA,QAC7B,MAAM,YACJ,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,IAAI,QAAQ,iBAAiB;AAAA,QAC5E,MAAa;AAAA,MACf,EAAO,SAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;AAAA,QAChE,MAAM,cAAc,IAAI,IAAI,OAAQ,MAA2B,IAAI,GAAG,OAAO,EAAE,IAAI;AAAA,MACrF,EAAO,SAAI,SAAS,OAAO,UAAU,UAAU;AAAA,QAC7C,MAAM,cAAc,OAAqB,OAAO;AAAA,MAClD;AAAA,OACC;AAAA,IACH,IAAI;AAAA,MACF,MAAM,QAAQ,KAAK;AAAA,QACjB;AAAA,QACA,IAAI,QAAQ,CAAC,GAAG,WAAW;AAAA,UACzB,WAAW,MAAM,OAAO,IAAI,MAAM,kBAAkB,CAAC,GAAG,IAAI;AAAA,SAC7D;AAAA,MACH,CAAC;AAAA,MACD,OAAO,OAAO;AAAA,MACd,QAAQ,KAAK,6CAA6C,KAAK,UAAU,KAAK,GAAG,KAAK;AAAA;AAAA,GAEzF,CACH;AAAA;AAIK,IAAM,4BAA4B;AAWlC,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsD7B,SAAS,eAAe,CAAC,KAAe,MAAwB;AAAA,EACrE,MAAM,WAAW,IAAI,KAAK,cAAc,IAAI,2BAA2B;AAAA,EACvE,IAAI,SAAS,YAAY,SAAS,QAAQ;AAAA,IACxC,UAAU,OAAO;AAAA,IACjB;AAAA,EACF;AAAA,EACA,IAAI,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,IAAI,cAAc,OAAO;AAAA,EACvC,MAAM,KAAK;AAAA,EACX,MAAM,cAAc;AAAA,EACpB,IAAI,KAAK,OAAO,KAAK;AAAA;AAIhB,IAAM,qBAAqB;AAQ3B,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqFtB,SAAS,gBAAgB,CAAC,KAAe,MAAwB;AAAA,EACtE,MAAM,WAAW,IAAI,KAAK,cAAc,IAAI,oBAAoB;AAAA,EAChE,IAAI,SAAS,aAAa;AAAA,IACxB,UAAU,OAAO;AAAA,IACjB;AAAA,EACF;AAAA,EACA,IAAI,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,IAAI,cAAc,OAAO;AAAA,EACvC,MAAM,KAAK;AAAA,EACX,MAAM,cAAc;AAAA,EACpB,IAAI,KAAK,OAAO,KAAK;AAAA;AAIhB,SAAS,cAAc,CAAC,WAA6D;AAAA,EAC1F,IAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAAA,IAC/C;AAAA,EACF;AAAA,EACA,MAAM,YAAY,SAAS,gBAAgB;AAAA,EAC3C,MAAM,YAAY,SAAS,KAAK;AAAA,EAChC,YAAY,KAAK,UAAU,OAAO,QAAQ,SAAS,GAAG;AAAA,IACpD,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,MACxE;AAAA,IACF;AAAA,IACA,IAAI,IAAI,WAAW,IAAI,GAAG;AAAA,MACxB,UAAU,YAAY,KAAK,qBAAqB,OAAO,KAAK,CAAC,CAAC;AAAA,IAChE,EAAO;AAAA,MACL,UAAU,OAAO,qBAAqB,OAAO,KAAK,CAAC;AAAA;AAAA,EAEvD;AAAA;AAIK,SAAS,UAAU,CAAC,KAAuB;AAAA,EAChD,MAAM,OAAQ,IAAgC;AAAA,EAC9C,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AAAA,IACxB;AAAA,EACF;AAAA,EACA,WAAW,SAAS,MAAM;AAAA,IACxB,IAAI,CAAC,OAAO,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,IACA,MAAM,MAAM,OAAO,MAAM,OAAO,EAAE,YAAY;AAAA,IAE9C,IAAI,QAAQ,YAAY,CAAC,MAAM,YAAY,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,KAAK,MAAM,WAAW;AAAA,IACpC,WAAW,OAAO,CAAC,QAAQ,KAAK,GAAG;AAAA,MACjC,MAAM,MAAM,MAAM;AAAA,MAClB,IACE,OAAO,QAAQ,YACf,CAAC,IAAI,WAAW,GAAG,KACnB,CAAC,IAAI,WAAW,GAAG,KACnB,CAAC,IAAI,WAAW,MAAM,GACtB;AAAA,QACA,MAAM,OAAO,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,IACA,MAAM,MAAM,GAAG,MAAM,MAAM,OAAO,UAAU,OAAO,MAAM,IAAI,QAAQ,KAAK,MAAM,MAAM,SAAS,OAAO,MAAM,GAAG,QAAQ;AAAA,IACvH,IAAI,QAAQ,OAAO,SAAS,KAAK,cAAc,GAAG,GAAG;AAAA,MACnD;AAAA,IACF;AAAA,IACA,MAAM,KAAK,SAAS,cAAc,GAAG;AAAA,IACrC,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;AAAA,MAC1C,GAAG,aAAa,GAAG,OAAO,CAAC,CAAC;AAAA,IAC9B;AAAA,IACA,IAAI,MAAM,aAAa;AAAA,MACrB,GAAG,cAAc,MAAM;AAAA,IACzB;AAAA,IACA,SAAS,KAAK,OAAO,EAAE;AAAA,EACzB;AAAA;AAIK,SAAS,WAAW,CAAC,KAAiB;AAAA,EAC3C,OAAO,CAAC,SAAe,MAA2B,SAAiB;AAAA,IACjE,IAAI,EAAE,mBAAmB,cAAc;AAAA,MACrC;AAAA,IACF;AAAA,IAMA,IAAI,KAAK,WAAW,KAAM,MAAqC,SAAS,SAAS,GAAG,GAAG;AAAA,MACrF,QAAQ,QAAQ,mBAAmB;AAAA,IACrC;AAAA,IACA,MAAM,aAAa,mBAAmB,MAAM,MAAK,GAAG;AAAA,IACpD,IAAI,WAAW,SAAS,UAAU;AAAA,MAChC,QAAQ,QAAQ,WAAW;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,QAAQ,QAAQ,SAAS,gBAAgB,WAAW,IAAI;AAAA;AAAA;AAcrD,SAAS,uBAAuB,CAAC,MAAmB,cAAc,GAAe;AAAA,EACtF,MAAM,WAAW,IAAI;AAAA,EACrB,MAAM,UAAU,CAAC,UAAuB;AAAA,IACtC,MAAM,MAAM,MAAM;AAAA,IAClB,IAAI,EAAE,eAAe,mBAAmB;AAAA,MACtC;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,WAAW,OAAO,GAAG;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,MAAM,WAAW,SAAS,IAAI,GAAG,KAAK,KAAK;AAAA,IAC3C,IAAI,UAAU,aAAa;AAAA,MAEzB;AAAA,IACF;AAAA,IACA,SAAS,IAAI,KAAK,OAAO;AAAA,IACzB,WAAW,MAAM;AAAA,MAEf,MAAM,IAAI,IAAI;AAAA,MACd,IAAI,MAAM;AAAA,MACV,IAAI,MAAM;AAAA,OACT,MAAM,OAAO;AAAA;AAAA,EAElB,KAAK,iBAAiB,SAAS,SAAS,IAAI;AAAA,EAC5C,OAAO,MAAM,KAAK,oBAAoB,SAAS,SAAS,IAAI;AAAA;AAQ9D,eAAsB,sBAAsB,CAAC,MAOnB;AAAA,EACxB,uBAAuB,KAAK,SAAS,SAAS;AAAA,EAK9C,2BAA2B,IAAI;AAAA,EAG/B,uBAAuB,KAAK,SAAS,SAAS;AAAA,EAC9C,eAAe,KAAK,SAAS;AAAA,EAC7B,WAAW,KAAK,GAAG;AAAA,EACnB,gBAAgB,KAAK,UAAU,eAAe,KAAK,IAAI;AAAA,EACvD,iBAAiB,KAAK,UAAU,eAAe,KAAK,IAAI;AAAA,EAKxD,aAAc,KAAK,IAA4C,UAAU,CAAC,CAAC;AAAA,EAQ3E,MAAM,kBAAiB,KAAK,KAAK,KAAK,OAAO;AAAA,EAC7C,MAAM,QAAQ,MAAM,WAAW,KAAK,KAAK,CAAC,GAAG,KAAK,OAAO;AAAA,EACzD,MAAM,gBAAgB,YAAY,KAAK,SAAS;AAAA,EAIhD,QAAQ,QAAQ,IAAI,SAAS,UAC3B,MAAM,WAAW,KAAK,KAAK,OAAO,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,CAChE;AAAA,EACA,KAAK,UAAU,gBAAgB,EAAE;AAAA,EACjC,OAAO;AAAA,IACL,KAAK,EAAE,MAAM,OAAO,SAAS,KAAK,SAAS,WAAW,KAAK,WAAW,MAAM,KAAK,KAAK;AAAA,IACtF,SAAS;AAAA,EACX;AAAA;;;AC5bK,SAAS,MAAM,CAAC,IAAsB;AAAA,EAC3C,OAAO,GAAG,sBAAsB;AAAA;AAS3B,SAAS,WAAW,CAAC,GAAmB;AAAA,EAC7C,OAAO,EAAE,sBAAsB;AAAA;AAI1B,SAAS,cAAc,CAC5B,GACA,GACA,OAA8B,UACd;AAAA,EAChB,OAAO,KAAK,iBAAiB,GAAG,CAAC;AAAA;;;AC+B5B,SAAS,aAAa,CAAC,KAAoB,MAAc;AAAA,EAC9D,IAAI,OAAO;AAAA,EACX,WAAW,OAAO,MAAM;AAAA,IACtB,IAAI,QAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,OAAO,KAAK;AAAA,EACd;AAAA,EACA,OAAO;AAAA;AA+FF,SAAS,iBAAiB,CAAC,MAAc;AAAA,EAC9C,OAAO,KAAK,UAAU,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AAAA;AASzC,SAAS,UAAU,CAAC,MAAc;AAAA,EACvC,OAAO,KAAK,GAAG,EAAE;AAAA;AAoBZ,SAAS,UAAU,CAAC,GAAkB,GAAkB;AAAA,EAC7D,IAAI,MAAM,GAAG;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,EAAE;AAAA;AAU9B,SAAS,UAAU,CAAC,MAAc,YAAoB;AAAA,EAC3D,IAAI,KAAK,SAAS,WAAW,QAAQ;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,MAAM,CAAC,GAAG,MAAM,MAAM,WAAW,EAAE;AAAA;;;AChM1C,IAAM,iBAAiB;AAG9B,IAAM,wBAAwB;AAG9B,SAAS,OAAO,CAAC,IAA+B;AAAA,EAC9C,MAAM,IAAI,OAAO,EAAE;AAAA,EACnB,OAAO,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE;AAAA;AAQ5D,SAAS,WAAW,CAAC,QAA8B;AAAA,EACjD,MAAM,QAAQ,iBAAiB,MAAM;AAAA,EACrC,QAAQ,YAAY;AAAA,EACpB,MAAM,SAAS,YAAY,UAAU,YAAY;AAAA,EACjD,MAAM,SAAS,YAAY,UAAU,YAAY;AAAA,EACjD,OACG,UAAU,MAAM,cAAc,WAAW,KAAK,KAC9C,WAAW,MAAM,gBAAgB,IAAI,WAAW,QAAQ;AAAA;AAwBtD,SAAS,kBAAkB,CAChC,UACA,QACA,WACqB;AAAA,EAErB,MAAM,aAAa,SAAS,SAAS;AAAA,EACrC,IAAI,cAAc,MAAM;AAAA,IACtB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,aAAa,YAAY,UAAU;AAAA,EAGzC,IAAI,SAAS,UAAU,SAAS,qBAAqB,GAAG;AAAA,IACtD,OAAO,CAAC,EAAE,MAAM,UAAU,OAAO,GAAG,kBAAkB,YAAY,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAAA,EAC7F;AAAA,EAGA,MAAM,aAAa,kBAAkB,UAAU;AAAA,EAC/C,IAAI,CAAC,YAAY;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS,SAAS;AAAA,EACxB,IAAI,CAAC,QAAQ;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,MAAM,WAAW,WAAW,UAAU;AAAA,EACtC,IAAI,OAAO,aAAa,UAAU;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAC7B,IAAI,YAAY,MAAM,GAAG;AAAA,IACvB,MAAM,OAAO,OAAO,IAAI,KAAK;AAAA,IAC7B,IAAI,OAAO,gBAAgB;AAAA,MACzB,OAAO,CAAC,SAAS,QAAQ,YAAY,UAAU,gBAAgB,MAAM,IAAI,CAAC,CAAC;AAAA,IAC7E;AAAA,IACA,IAAI,KAAK,QAAQ,OAAO,gBAAgB;AAAA,MACtC,OAAO,CAAC,SAAS,SAAS,YAAY,WAAW,GAAG,iBAAiB,MAAM,IAAI,CAAC,CAAC;AAAA,IACnF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAO,IAAI,KAAK;AAAA,EAC7B,IAAI,OAAO,gBAAgB;AAAA,IACzB,OAAO,CAAC,SAAS,OAAO,YAAY,UAAU,gBAAgB,MAAM,KAAK,CAAC,CAAC;AAAA,EAC7E;AAAA,EACA,IAAI,KAAK,SAAS,OAAO,gBAAgB;AAAA,IACvC,OAAO,CAAC,SAAS,UAAU,YAAY,WAAW,GAAG,iBAAiB,MAAM,KAAK,CAAC,CAAC;AAAA,EACrF;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,QAAQ,CACf,MACA,kBACA,OACA,MACY;AAAA,EACZ,OAAO,EAAE,MAAM,OAAO,kBAAkB,KAAK;AAAA;AAO/C,SAAS,eAAe,CAAC,MAAwB,KAAgC;AAAA,EAC/E,OAAO,MACH,EAAE,QAAQ,KAAK,QAAQ,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE,IACtD,EAAE,QAAQ,GAAG,OAAO,KAAK,OAAO,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA;AAI3D,SAAS,gBAAgB,CAAC,MAAwB,KAAgC;AAAA,EAChF,OAAO,MACH,EAAE,QAAQ,KAAK,QAAQ,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,OAAO,GAAG,KAAK,EAAE,IACnE,EAAE,QAAQ,GAAG,OAAO,KAAK,OAAO,GAAG,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,OAAO;AAAA;AAOlE,SAAS,cAAc,CAAC,OAAoC;AAAA,EACjE,IAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,iBAAiB,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG;AAAA;;ACzJ1F,IAAM,cAAc,IAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAWM,SAAS,sBAAsB,CAAC,KAAa,cAAkC;AAAA,EACpF,IAAI,CAAC,cAAc;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,aAAa,oBAAoB,kBAAkB;AAAA,IACrD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,IAAI;AAAA,EACnB,MAAM,QAAQ,IAAI;AAAA,EAClB,IAAI,CAAC,UAAU,CAAC,OAAO;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,aAAa,SAAS,MAAM,KAAK,CAAC,aAAa,SAAS,KAAK,GAAG;AAAA,IACnE,OAAO;AAAA,EACT;AAAA,EAMA,MAAM,SAAS,CAAC,SAAsB;AAAA,IACpC,IAAI,UAAU;AAAA,IACd,OAAO,WAAW,YAAY,cAAc;AAAA,MAC1C,IACE,QAAQ,aAAa,KAAK,gBACzB,QAAoB,QAAQ,YAAY,MAAM,KAC/C;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,OAAO,OAAO,MAAM,KAAK,OAAO,KAAK;AAAA;AAUhC,SAAS,kBAAkB,CAAC,KAAa,cAAkC;AAAA,EAChF,IAAI,CAAC,cAAc;AAAA,IACjB;AAAA,EACF;AAAA,EACA,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,IAAI,WAAW,CAAC;AAAA,EAC9B,IAAI,MAAM,WAAW;AAAA,IACnB;AAAA,EACF;AAAA,EACA,IAAI,CAAC,aAAa,SAAS,MAAM,uBAAuB,GAAG;AAAA,IACzD;AAAA,EACF;AAAA,EAGA,iCAAiC,KAAK;AAAA,EAGtC,MAAM,UAAU,yBAAyB,KAAK,OAAO,YAAY;AAAA,EAEjE,IAAI,QAAQ,SAAS,GAAG;AAAA,IACtB,iBAAiB,KAAK,OAAO,cAAc,OAAO;AAAA,EACpD,EAAO;AAAA,IACL,eAAe,KAAK,OAAO,YAAY;AAAA;AAAA,EAGzC,uBAAuB,YAAY;AAAA;AAWrC,SAAS,wBAAwB,CAAC,KAAa,OAAc,MAAmB;AAAA,EAC9E,MAAM,UAAqB,CAAC;AAAA,EAC5B,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,cAAc;AAAA,IAKtE,UAAU,CAAC,MAAY;AAAA,MACrB,IAAK,KAAiB,QAAQ,YAAY,MAAM,OAAO,MAAM,eAAe,IAAI,GAAG;AAAA,QACjF,OAAO,WAAW;AAAA,MACpB;AAAA,MACA,OAAO,WAAW;AAAA;AAAA,EAEtB,CAAC;AAAA,EACD,OAAO,OAAO,SAAS,GAAG;AAAA,IACxB,QAAQ,KAAK,OAAO,WAAsB;AAAA,EAC5C;AAAA,EACA,OAAO;AAAA;AAYT,SAAS,gBAAgB,CACvB,MACA,QACA,eACA,SACA;AAAA,EAEA,SAAS,IAAI,QAAQ,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,IAC5C,MAAM,KAAK,QAAQ;AAAA,IACnB,cAAc,EAAE;AAAA,EAClB;AAAA;AAQF,SAAS,aAAa,CAAC,IAAa;AAAA,EAClC,MAAM,SAAS,GAAG;AAAA,EAClB,IAAI,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO,SAAS,uBAAuB;AAAA,EAC7C,OAAO,GAAG,YAAY;AAAA,IACpB,KAAK,OAAO,GAAG,UAAU;AAAA,EAC3B;AAAA,EACA,GAAG,YAAY,IAAI;AAAA;AAWrB,SAAS,cAAc,CAAC,KAAa,OAAc,eAA4B;AAAA,EAC7E,MAAM,WAAW,MAAM,gBAAgB;AAAA,EAGvC,MAAM,YAAY,sBAAsB,QAAQ;AAAA,EAEhD,MAAM,aAAa,uBAAuB,QAAQ;AAAA,EAGlD,IAAI,CAAC,SAAS,cAAc,GAAG;AAAA,IAC7B,IAAI,WAAW;AAAA,MACb,MAAM,WAAW,SAAS,eAAe,SAAS,CAAC;AAAA,IACrD;AAAA,IACA,IAAI,YAAY;AAAA,MACd,MAAM,IAAI,SAAS,eAAe,UAAU;AAAA,MAC5C,MAAM,SAAS,KAAK;AAAA,MACpB,MAAM,WAAW,CAAC;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,SAAS,cAAc,GAAG;AAAA,EAC1C,QAAQ,OAAO,QAAQ;AAAA,EAGvB,MAAM,OAAO,SAAS,uBAAuB;AAAA,EAC7C,IAAI,WAAW;AAAA,IACb,KAAK,OAAO,SAAS,eAAe,SAAS,CAAC;AAAA,EAChD;AAAA,EACA,KAAK,OAAO,OAAO;AAAA,EACnB,IAAI,YAAY;AAAA,IACd,KAAK,OAAO,SAAS,eAAe,UAAU,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,WAAW,IAAI;AAAA,EAGrB,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,KAAK;AAAA,IACP,IAAI,gBAAgB;AAAA,IACpB,MAAM,WAAW,SAAS,YAAY;AAAA,IACtC,SAAS,mBAAmB,OAAO;AAAA,IACnC,IAAI,SAAS,QAAQ;AAAA,EACvB;AAAA;AAUF,SAAS,qBAAqB,CAAC,MAAwB;AAAA,EACrD,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,CAAC,SAAS,MAAM,aAAa,KAAK,WAAW;AAAA,IAC/C,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,MAAM,eAAe;AAAA,EAClC,MAAM,QAAQ,KAAK,MAAM,QAAQ;AAAA,EACjC,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,MAAM;AAAA,EACjB,IAAI,KAAK,WAAW,GAAG,QAAQ;AAAA,IAE7B,MAAM,OAAO;AAAA,EACf,EAAO;AAAA,IACL,MAAM,cAAc,KAAK,MAAM,GAAG,MAAM;AAAA;AAAA,EAE1C,OAAO;AAAA;AAUT,SAAS,sBAAsB,CAAC,MAAwB;AAAA,EACtD,MAAM,OAAO,KAAK;AAAA,EAClB,IAAI,CAAC,QAAQ,KAAK,aAAa,KAAK,WAAW;AAAA,IAC7C,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,KAAK,eAAe;AAAA,EACjC,MAAM,QAAQ,KAAK,MAAM,QAAQ;AAAA,EACjC,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,MAAM;AAAA,EACjB,IAAI,KAAK,WAAW,GAAG,QAAQ;AAAA,IAC7B,KAAK,OAAO;AAAA,EACd,EAAO;AAAA,IACL,KAAK,cAAc,KAAK,MAAM,GAAG,CAAC,GAAG,MAAM;AAAA;AAAA,EAE7C,OAAO;AAAA;AAYF,SAAS,sBAAsB,CAAC,MAA0B;AAAA,EAC/D,IAAI,CAAC,MAAM;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,UAAU;AAAA,EACd,IAAI,aAAa;AAAA,EACjB,OAAO,WAAW,aAAa,IAAI;AAAA,IACjC,UAAU;AAAA,IACV,cAAc;AAAA,IAGd,KAAK,UAAU;AAAA,IAGf,IAAI,sBAAsB,IAAI,GAAG;AAAA,MAC/B,UAAU;AAAA,IACZ;AAAA,IAGA,IAAI,yBAAyB,IAAI,GAAG;AAAA,MAClC,UAAU;AAAA,IACZ;AAAA,IAGA,IAAI,mBAAmB,IAAI,GAAG;AAAA,MAC5B,UAAU;AAAA,IACZ;AAAA,IAGA,IAAI,mBAAmB,IAAI,GAAG;AAAA,MAC5B,UAAU;AAAA,IACZ;AAAA,IAGA,IAAI,gBAAgB,IAAI,GAAG;AAAA,MACzB,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAUF,SAAS,qBAAqB,CAAC,MAAmB;AAAA,EAChD,IAAI,UAAU;AAAA,EACd,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,YAAY;AAAA,EACtE,MAAM,UAAgC,CAAC;AAAA,EAGvC,OAAO,OAAO,SAAS,GAAG;AAAA,IACxB,MAAM,KAAK,OAAO;AAAA,IAClB,MAAM,OAAO,GAAG;AAAA,IAChB,IACE,QACA,KAAK,aAAa,KAAK,gBACtB,KAAiB,YAAY,GAAG,WACjC,YAAY,IAAI,GAAG,QAAQ,YAAY,CAAC,KACxC,gBAAgB,IAAI,IAAe,GACnC;AAAA,MACA,QAAQ,KAAK,CAAC,IAAI,IAAe,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAGA,SAAS,IAAI,QAAQ,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,IAC5C,OAAO,IAAI,QAAQ,QAAQ;AAAA,IAE3B,OAAO,KAAK,YAAY;AAAA,MACtB,GAAG,OAAO,KAAK,UAAU;AAAA,IAC3B;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;AAUT,SAAS,wBAAwB,CAAC,MAAmB;AAAA,EACnD,IAAI,UAAU;AAAA,EACd,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,YAAY;AAAA,EACtE,MAAM,aAAwB,CAAC;AAAA,EAE/B,OAAO,OAAO,SAAS,GAAG;AAAA,IACxB,MAAM,KAAK,OAAO;AAAA,IAClB,IAAI,CAAC,YAAY,IAAI,GAAG,QAAQ,YAAY,CAAC,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,IACE,GAAG,WAAW,WAAW,KACzB,GAAG,eAAe,QAClB,GAAG,WAAW,aAAa,KAAK,gBAC/B,GAAG,WAAuB,YAAY,GAAG,SAC1C;AAAA,MACA,WAAW,KAAK,EAAE;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,WAAW,MAAM,YAAY;AAAA,IAC3B,MAAM,QAAQ,GAAG;AAAA,IAEjB,OAAO,MAAM,YAAY;AAAA,MACvB,MAAM,OAAO,MAAM,UAAU;AAAA,IAC/B;AAAA,IACA,MAAM,OAAO;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;AAST,SAAS,kBAAkB,CAAC,MAAmB;AAAA,EAC7C,IAAI,UAAU;AAAA,EACd,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,YAAY;AAAA,EACtE,MAAM,WAAsB,CAAC;AAAA,EAE7B,OAAO,OAAO,SAAS,GAAG;AAAA,IACxB,MAAM,KAAK,OAAO;AAAA,IAClB,IAAI,CAAC,YAAY,IAAI,GAAG,QAAQ,YAAY,CAAC,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,IAAI,GAAG,WAAW,WAAW,KAAK,CAAC,GAAG,aAAa;AAAA,MACjD,SAAS,KAAK,EAAE;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,WAAW,MAAM,UAAU;AAAA,IACzB,GAAG,OAAO;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;AAUT,SAAS,kBAAkB,CAAC,MAAmB;AAAA,EAC7C,IAAI,UAAU;AAAA,EACd,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,YAAY;AAAA,EAEtE,MAAM,MAAM,CAAC;AAAA,EAEb,OAAO,OAAO,SAAS,GAAG;AAAA,IACxB,MAAM,KAAK,OAAO;AAAA,IAClB,IAAI,CAAC,YAAY,IAAI,GAAG,QAAQ,YAAY,CAAC,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,IAAI,OAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,GAAG;AAAA,IACjB,IAAI,SAAS,MAAM,aAAa,KAAK,WAAW;AAAA,MAC9C,MAAM,OAAO,MAAM,eAAe;AAAA,MAClC,MAAM,IAAI,KAAK,MAAM,QAAQ;AAAA,MAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,GAAI,QAAQ;AAAA,QACnC,IAAI,KAAK,EAAE,IAAI,MAAM,gBAAgB,IAAI,EAAE,GAAI,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,GAAG;AAAA,IAChB,IAAI,QAAQ,KAAK,aAAa,KAAK,aAAa,SAAS,OAAO;AAAA,MAC9D,MAAM,OAAO,KAAK,eAAe;AAAA,MACjC,MAAM,IAAI,KAAK,MAAM,QAAQ;AAAA,MAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,GAAI,QAAQ;AAAA,QACnC,IAAI,KAAK,EAAE,IAAI,MAAM,iBAAiB,IAAI,EAAE,GAAI,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,MAAM,KAAK;AAAA,IACpB,IAAI,GAAG,SAAS,gBAAgB;AAAA,MAC9B,MAAM,aAAa,GAAG,GAAG;AAAA,MACzB,WAAW,eAAe,WAAW,eAAe,IAAI,MAAM,GAAG,GAAG,MAAM;AAAA,MAC1E,GAAG,GAAG,YAAY,aAAa,SAAS,eAAe,GAAG,EAAE,GAAG,GAAG,EAAE;AAAA,MACpE,UAAU;AAAA,IACZ,EAAO,SAAI,GAAG,SAAS,iBAAiB;AAAA,MACtC,MAAM,YAAY,GAAG,GAAG;AAAA,MACxB,UAAU,eAAe,UAAU,eAAe,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG,MAAM;AAAA,MAC5E,GAAG,GAAG,YAAY,aAAa,SAAS,eAAe,GAAG,EAAE,GAAG,GAAG,GAAG,WAAW;AAAA,MAChF,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAUT,SAAS,eAAe,CAAC,MAAmB;AAAA,EAC1C,IAAI,UAAU;AAAA,EACd,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,YAAY;AAAA,EACtE,MAAM,WAAsB,CAAC;AAAA,EAE7B,OAAO,OAAO,SAAS,GAAG;AAAA,IACxB,MAAM,KAAK,OAAO;AAAA,IAClB,IAAI,GAAG,QAAQ,YAAY,MAAM,QAAQ;AAAA,MACvC;AAAA,IACF;AAAA,IACA,IAAI,OAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,IAEA,IAAI,GAAG,WAAW,SAAS,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,SAAS,KAAK,EAAE;AAAA,EAClB;AAAA,EAEA,WAAW,MAAM,UAAU;AAAA,IACzB,cAAc,EAAE;AAAA,IAChB,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;AAWT,SAAS,eAAe,CAAC,GAAY,GAAY;AAAA,EAC/C,MAAM,MAAM,EAAE,QAAQ,YAAY;AAAA,EAClC,IAAI,QAAQ,KAAK;AAAA,IACf,OAAO,EAAE,aAAa,MAAM,MAAM,EAAE,aAAa,MAAM;AAAA,EACzD;AAAA,EAEA,OAAO;AAAA;AAeF,SAAS,gCAAgC,CAAC,OAAc;AAAA,EAC7D,eAAe,OAAO,IAAI;AAAA,EAC1B,eAAe,OAAO,KAAK;AAAA;AAU7B,SAAS,cAAc,CAAC,OAAc,SAAkB;AAAA,EACtD,MAAM,OAAO,UAAU,MAAM,iBAAiB,MAAM;AAAA,EACpD,MAAM,SAAS,UAAU,MAAM,cAAc,MAAM;AAAA,EACnD,IAAI,KAAK,aAAa,KAAK,WAAW;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAAK,eAAe;AAAA,EAGjC,MAAM,QAAQ,wBAAwB,IAAI;AAAA,EAC1C,WAAW,QAAQ,OAAO;AAAA,IAExB,IAAI,SAAS;AAAA,MAEX,IAAI,SAAS,KAAK,SAAS,SAAS,KAAK,KAAK;AAAA,QAC5C,MAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MACjC;AAAA,IACF,EAAO,SAAI,SAAS,KAAK,SAAS,SAAS,KAAK,KAAK;AAAA,MAEnD,MAAM,OAAO,MAAM,KAAK,GAAG;AAAA,IAC7B;AAAA,EACF;AAAA;AAUK,SAAS,uBAAuB,CAAC,MAAc;AAAA,EAEpD,MAAM,UAAU,CAAC;AAAA,EACjB,IAAI,IAAI;AAAA,EACR,OAAO,IAAI,KAAK,SAAS,GAAG;AAAA,IAC1B,IAAI,KAAK,OAAO,OAAO,KAAK,IAAI,OAAO,KAAK;AAAA,MAC1C,MAAM,QAAQ;AAAA,MACd,IAAI,QAAQ;AAAA,MACZ,IAAI,IAAI,IAAI;AAAA,MACZ,OAAO,IAAI,KAAK,UAAU,QAAQ,GAAG;AAAA,QACnC,IAAI,KAAK,OAAO,KAAK;AAAA,UACnB,SAAS;AAAA,QACX,EAAO,SAAI,KAAK,OAAO,KAAK;AAAA,UAC1B,SAAS;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACP;AAAA,MACA,IAAI,UAAU,GAAG;AAAA,QACf,QAAQ,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;AAAA,QAC9B,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AAAA,EACP;AAAA,EACA,OAAO;AAAA;;;AC3lBT,IAAM,YAA6B;AAAA,EACjC,SAAS,MAAM;AAAA,EAGf,QAAQ,MAAM;AAAA,EACd,MAAM,MAAM;AAGd;AACA,IAAI,QAAyB;AAGtB,SAAS,kBAAkB,CAAC,YAAmC;AAAA,EACpE,QAAQ;AAAA;AA8BV,IAAM,cAAc,IAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,kBAAkB,IAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAgDD,IAAI,WAA+B;AACnC,IAAI,aAA4B;AAShC,IAAI,WAMO;AAKX,IAAI,UAEO;AAKX,IAAI,WAEO;AACX,IAAI,QAA6B;AAQjC,IAAI,sBAAsB;AAGnB,SAAS,gBAAgB,GAAG;AAAA,EACjC,sBAAsB;AAAA;AAIjB,SAAS,eAAe,GAAG;AAAA,EAChC,sBAAsB;AAAA;AASjB,SAAS,eAAe,CAAC,IAAiB;AAAA,EAC/C,OAAO,gBAAgB,IAAI,GAAG,QAAQ,YAAY,CAAC;AAAA;AA2C9C,SAAS,YAAY,CAC1B,IACA,MACA,WAcA;AAAA,EACA,IAAI,UAAU;AAAA,IAGZ,YAAY,IAAI;AAAA,EAClB;AAAA,EAEA,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW,UAAU;AAAA,EACrB,UAAU,UAAU;AAAA,EACpB,WAAW,UAAU;AAAA,EACrB,QAAQ,UAAU;AAAA,EAGlB,GAAG,kBAAkB;AAAA,EACrB,GAAG,MAAM,gBAAgB;AAAA,EACzB,GAAG,MAAM,UAAU;AAAA,EACnB,GAAG,MAAM,gBAAgB;AAAA,EACzB,GAAG,MAAM,SAAS;AAAA,EAClB,GAAG,MAAM;AAAA,EAGT,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,MAAM,QAAQ,SAAS,YAAY;AAAA,EACnC,MAAM,mBAAmB,EAAE;AAAA,EAC3B,MAAM,SAAS,KAAK;AAAA,EACpB,IAAI,KAAK;AAAA,IACP,IAAI,gBAAgB;AAAA,IACpB,IAAI,SAAS,KAAK;AAAA,EACpB;AAAA,EAEA,GAAG,iBAAiB,WAAW,aAAa;AAAA,EAC5C,GAAG,iBAAiB,SAAS,WAAW;AAAA,EACxC,GAAG,iBAAiB,QAAQ,UAAU;AAAA,EACtC,GAAG,iBAAiB,SAAS,WAAW;AAAA;AASnC,SAAS,WAAW,CAAC,SAAS,OAAO;AAAA,EAC1C,IAAI,CAAC,UAAU;AAAA,IACb;AAAA,EACF;AAAA,EAEA,cAAc;AAAA,EACd,MAAM,QAAQ;AAAA,EAEd,SAAS,kBAAkB;AAAA,EAC3B,SAAS,MAAM,gBAAgB;AAAA,EAC/B,SAAS,MAAM,UAAU;AAAA,EACzB,SAAS,MAAM,gBAAgB;AAAA,EAC/B,SAAS,MAAM,SAAS;AAAA,EAExB,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACrD,SAAS,oBAAoB,SAAS,WAAW;AAAA,EACjD,SAAS,oBAAoB,QAAQ,UAAU;AAAA,EAC/C,SAAS,oBAAoB,SAAS,WAAW;AAAA,EAEjD,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,IAAI,QAAQ;AAAA,IACV,QAAQ;AAAA,EACV,EAAO,SAAI,OAAO;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,QAAQ;AAAA,IACR,GAAG;AAAA,EACL;AAAA;AAQK,SAAS,SAAS,GAAG;AAAA,EAC1B,OAAO,aAAa;AAAA;AAQf,SAAS,gBAAgB,GAAG;AAAA,EACjC,OAAO;AAAA;AAQF,SAAS,aAAa,GAAG;AAAA,EAC9B,OAAO;AAAA;AASF,SAAS,aAAa,GAAG;AAAA,EAC9B,OAAO,MAAM,OAAO;AAAA;AAMtB,SAAS,aAAa,CAAC,GAAkB;AAAA,EACvC,IAAI,EAAE,QAAQ,UAAU;AAAA,IACtB,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,YAAY;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,IAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AAAA,IACpC,IAAI,MAAM,OAAO,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,IACA,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,eAAe;AAAA,IACf;AAAA,EACF;AAAA,EAGA,IAAI,EAAE,QAAQ,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,SAAS;AAAA,IAE7C,MAAM,MAAM,OAAO,aAAa;AAAA,IAChC,IAAI,OAAO,IAAI,aAAa,GAAG;AAAA,MAC7B,MAAM,QAAQ,IAAI,WAAW,CAAC;AAAA,MAC9B,MAAM,aAAa,oBAAoB,KAAK;AAAA,MAC5C,IAAI,eAAe,MAAM,WAAW,SAAS,GAAG,KAAK,WAAW,SAAS;AAAA,CAAI,GAAG;AAAA,QAE9E,sBAAsB,MAAM,cAAc,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IAAI,EAAE,WAAW,EAAE,SAAS;AAAA,IAC1B,QAAQ,EAAE;AAAA,WACH,KAAK;AAAA,QACR,EAAE,eAAe;AAAA,QACjB,mBAAmB,UAAU,QAAQ;AAAA,QACrC;AAAA,MACF;AAAA,WACK,KAAK;AAAA,QACR,EAAE,eAAe;AAAA,QACjB,mBAAmB,MAAM,QAAQ;AAAA,QACjC;AAAA,MACF;AAAA,WACK,KAAK;AAAA,QACR,EAAE,eAAe;AAAA,QACjB,mBAAmB,QAAQ,QAAQ;AAAA,QACnC;AAAA,MACF;AAAA,eACS;AAAA,QACP;AAAA,MACF;AAAA;AAAA,EAEJ;AAAA,EAGA,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC,WAAW,aAAa,SAAS,aAAa,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,CAEjG;AAAA;AAGF,SAAS,WAAW,GAAG;AAAA,EAErB,IAAI,MAAM,OAAO,GAAG;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA;AAIF,SAAS,UAAU,CAAC,IAAgB;AAAA,EAElC,IAAI,MAAM,OAAO,GAAG;AAAA,IAClB;AAAA,EACF;AAAA,EAIA,IAAI,qBAAqB;AAAA,IACvB;AAAA,EACF;AAAA,EAGA,WAAW,MAAM;AAAA,IACf,IAAI,qBAAqB;AAAA,MACvB;AAAA,IACF;AAAA,IACA,IAAI,YAAY,SAAS,kBAAkB,UAAU;AAAA,MACnD,YAAY;AAAA,IACd;AAAA,KACC,GAAG;AAAA;AAIR,SAAS,WAAW,CAAC,GAAmB;AAAA,EACtC,EAAE,eAAe;AAAA,EAEjB,MAAM,OAAO,EAAE,eAAe,QAAQ,YAAY,KAAK;AAAA,EACvD,SAAS,YAAY,cAAc,OAAO,IAAI;AAAA;AAKhD,SAAS,cAAc,GAAG;AAAA,EACxB,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,YAAY;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAI,WAAW,CAAC;AAAA,EAG9B,MAAM,cAAc,SAAS,YAAY;AAAA,EACzC,YAAY,SAAS,UAAU,CAAC;AAAA,EAChC,YAAY,OAAO,MAAM,gBAAgB,MAAM,WAAW;AAAA,EAE1D,MAAM,aAAa,SAAS,YAAY;AAAA,EACxC,WAAW,SAAS,MAAM,cAAc,MAAM,SAAS;AAAA,EACvD,WAAW,OAAO,UAAU,SAAS,WAAW,MAAM;AAAA,EAGtD,MAAM,aAAa,YAAY,cAAc;AAAA,EAC7C,MAAM,YAAY,WAAW,cAAc;AAAA,EAE3C,MAAM,iBAAiB,aAAa,UAAU;AAAA,EAC9C,MAAM,gBAAgB,aAAa,SAAS;AAAA,EAG5C,MAAM,OAAO,CAAC,GAAG,UAAU;AAAA,EAC3B,MAAM,QAAQ;AAAA,EAEd,SAAS,kBAAkB;AAAA,EAC3B,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACrD,SAAS,oBAAoB,SAAS,WAAW;AAAA,EACjD,SAAS,oBAAoB,QAAQ,UAAU;AAAA,EAC/C,SAAS,oBAAoB,SAAS,WAAW;AAAA,EACjD,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,IAAI,OAAO;AAAA,IACT,MAAM,KAAK;AAAA,IACX,QAAQ;AAAA,IACR,GAAG;AAAA,EACL;AAAA,EAEA,MAAM,MAAM,gBAAgB,aAAa;AAAA;AAK3C,SAAS,aAAa,GAAG;AAAA,EACvB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,uBAAuB,QAAQ;AAAA,EAC/B,MAAM,SAAS,YAAY,QAAQ;AAAA,EACnC,SAAS,YAAY,OAAO,YAAY,MAAM,OAAO,eAAe,IAAI;AAAA;AAUnE,SAAS,iBAAiB,CAAC,MAAiD;AAAA,EACjF,IAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,WAAW,GAAG;AAAA,IAC/D,OAAO,EAAE,aAAa,GAAG;AAAA,EAC3B;AAAA,EAGA,MAAM,SAAS,CAAC;AAAA,EAChB,WAAW,SAAS,KAAK,UAAU;AAAA,IACjC,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,OAAO,OAAO,GAAG,EAAE,MAAM,UAAU;AAAA,MACvF,OAAO,OAAO,SAAS,MAAM;AAAA,IAC/B,EAAO;AAAA,MACL,OAAO,KAAK,KAAK;AAAA;AAAA,EAErB;AAAA,EAGA,IAAI,OAAO,MAAM,CAAC,MAA8B,OAAO,MAAM,QAAQ,GAAG;AAAA,IACtE,OAAO,EAAE,aAAa,OAAO,KAAK,EAAE,EAAE;AAAA,EACxC;AAAA,EAEA,OAAO,EAAE,UAAU,OAAO;AAAA;AAU5B,SAAS,WAAW,CAAC,IAAkC;AAAA,EACrD,MAAM,QAAQ,GAAG;AAAA,EAGjB,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,OAAO,EAAE,aAAa,GAAG;AAAA,EAC3B;AAAA,EACA,IAAI,MAAM,WAAW,KAAK,MAAM,GAAI,aAAa,KAAK,WAAW;AAAA,IAC/D,OAAO,EAAE,aAAa,MAAM,GAAI,YAAY;AAAA,EAC9C;AAAA,EAGA,MAAM,WAAuC,CAAC;AAAA,EAC9C,WAAW,SAAS,OAAO;AAAA,IACzB,MAAM,MAAM,YAAY,KAAK;AAAA,IAC7B,IAAI,QAAQ,QAAQ,QAAQ,WAAW;AAAA,MACrC,SAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAAA,EAGA,OAAO,kBAAkB,EAAE,SAAS,CAAC;AAAA;AASvC,SAAS,WAAW,CAAC,MAAY;AAAA,EAC/B,IAAI,KAAK,aAAa,KAAK,WAAW;AAAA,IACpC,MAAM,OAAO,KAAK;AAAA,IAClB,IAAI,CAAC,MAAM;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,KAAK,aAAa,KAAK,cAAc;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK;AAAA,EACX,MAAM,MAAM,GAAG,QAAQ,YAAY;AAAA,EACnC,MAAM,SAAwB,EAAE,SAAS,IAAI;AAAA,EAG7C,MAAM,SAAiC;AAAA,IACrC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,QAAQ;AAAA,EACV;AAAA,EACA,IAAI,OAAO,MAAM;AAAA,IACf,OAAO,UAAU,OAAO;AAAA,EAC1B;AAAA,EAGA,IAAI,QAAQ,OAAQ,GAAyB,MAAM;AAAA,IACjD,OAAO,aAAa,EAAE,MAAM,GAAG,aAAa,MAAM,KAAK,GAAG;AAAA,IAC1D,IAAK,GAAyB,OAAO;AAAA,MACnC,OAAO,WAAW,QAAS,GAAyB;AAAA,IACtD;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,QAAQ;AAAA,IAClB,OAAO,cAAc,GAAG;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAGA,QAAQ,eAAe;AAAA,EACvB,IAAI,WAAW,WAAW,GAAG;AAAA,IAC3B,OAAO,cAAc;AAAA,EACvB,EAAO,SAAI,WAAW,WAAW,KAAK,WAAW,GAAI,aAAa,KAAK,WAAW;AAAA,IAChF,OAAO,cAAc,WAAW,GAAI;AAAA,EACtC,EAAO;AAAA,IACL,OAAO,WAAW,CAAC;AAAA,IACnB,WAAW,SAAS,YAAY;AAAA,MAC9B,MAAM,MAAM,YAAY,KAAK;AAAA,MAC7B,IAAI,KAAK;AAAA,QACP,OAAO,SAAS,KAAkC,GAAG;AAAA,MACvD;AAAA,IACF;AAAA;AAAA,EAGF,OAAO;AAAA;AAST,SAAS,YAAY,CAAC,MAAwB;AAAA,EAC5C,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,OAAO,EAAE,aAAa,GAAG;AAAA,EAC3B;AAAA,EACA,IAAI,MAAM,WAAW,KAAK,MAAM,GAAI,aAAa,KAAK,WAAW;AAAA,IAC/D,OAAO,EAAE,aAAa,MAAM,GAAI,YAAY;AAAA,EAC9C;AAAA,EAEA,MAAM,WAAuC,CAAC;AAAA,EAC9C,WAAW,SAAS,OAAO;AAAA,IACzB,MAAM,MAAM,YAAY,KAAK;AAAA,IAC7B,IAAI,KAAK;AAAA,MACP,SAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,IACE,SAAS,WAAW,KACpB,OAAO,SAAS,OAAO,YACvB,SAAS,GAAI,YAAY,UACzB,OAAO,SAAS,GAAI,gBAAgB,UACpC;AAAA,IACA,OAAO,EAAE,aAAa,SAAS,GAAI,YAAY;AAAA,EACjD;AAAA,EAEA,OAAO,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,aAAa,GAAG;AAAA;AAShE,SAAS,mBAAmB,CAAC,OAAc;AAAA,EACzC,MAAM,WAAW,SAAS,YAAY;AAAA,EACtC,SAAS,SAAS,UAAW,CAAC;AAAA,EAC9B,SAAS,OAAO,MAAM,gBAAgB,MAAM,WAAW;AAAA,EACvD,OAAO,SAAS,SAAS;AAAA;AAM3B,IAAI,oBAAoB;AAExB,SAAS,aAAa,GAAG;AAAA,EACvB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,IAAI,WAAW,CAAC;AAAA,EAC9B,oBAAoB,oBAAoB,KAAK,EAAE;AAAA,EAE/C,MAAM,KAAK,UAAU,IAAI,EAAE,UAAU,kBAAkB,CAAC;AAAA;AAG1D,SAAS,eAAe,GAAG;AAAA,EACzB,IAAI,CAAC,UAAU;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,IAC3B,MAAM,QAAQ;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAI,WAAW,CAAC;AAAA,EAC9B,MAAM,WAAW,oBAAoB,KAAK;AAAA,EAC1C,MAAM,WAAW,SAAS,YAAY,GAAG;AAAA,EAEzC,IAAI,aAAa,MAAM,SAAS,SAAS,oBAAoB,GAAG;AAAA,IAC9D,MAAM,QAAQ;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAS,MAAM,WAAW,CAAC,EAAE,YAAY;AAAA,EACxD,MAAM,KAAK,UAAU,QAAQ,EAAE,UAAU,kBAAkB,CAAC;AAAA;AAI9D,SAAS,iBAAiB,CAAC,KAAmB;AAAA,EAC5C,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY;AAAA,IACzC;AAAA,EACF;AAAA,EAGA,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,OAAO,IAAI,YAAY;AAAA,IACzB,MAAM,QAAQ,IAAI,WAAW,CAAC;AAAA,IAC9B,MAAM,WAAW,oBAAoB,KAAK;AAAA,IAC1C,MAAM,WAAW,SAAS,YAAY,GAAG;AAAA,IACzC,IAAI,aAAa,IAAI;AAAA,MACnB,MAAM,SAAS,SAAS,iBAAiB,UAAU,WAAW,SAAS;AAAA,MACvE,IAAI,YAAY;AAAA,MAChB,IAAI,YAAyB;AAAA,MAC7B,IAAI,cAAc;AAAA,MAClB,OAAO,OAAO,SAAS,GAAG;AAAA,QACxB,MAAM,OAAO,OAAO;AAAA,QACpB,IAAI,YAAY,KAAK,SAAS,UAAU;AAAA,UACtC,YAAY;AAAA,UACZ,cAAc,WAAW;AAAA,UACzB;AAAA,QACF;AAAA,QACA,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,IAAI,WAAW;AAAA,QACb,MAAM,WAAW,SAAS,YAAY;AAAA,QACtC,SAAS,SAAS,WAAW,WAAW;AAAA,QACxC,SAAS,OAAO,MAAM,gBAAgB,MAAM,WAAW;AAAA,QACvD,SAAS,eAAe;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAIA,uBAAuB,QAAQ;AAAA,EAC/B,MAAM,eAAe,YAAY,QAAQ;AAAA,EAEzC,MAAM,OAAO,CAAC,GAAG,UAAU;AAAA,EAC3B,MAAM,SAAS;AAAA,EAEf,SAAS,kBAAkB;AAAA,EAC3B,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACrD,SAAS,oBAAoB,SAAS,WAAW;AAAA,EACjD,SAAS,oBAAoB,QAAQ,UAAU;AAAA,EAC/C,SAAS,oBAAoB,SAAS,WAAW;AAAA,EACjD,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,IAAI,OAAO;AAAA,IACT,MAAM,KAAK;AAAA,IACX,QAAQ;AAAA,IACR,GAAG;AAAA,EACL;AAAA,EAGA,OAAO,MAAM,KAAK,YAAY;AAAA;;;ACpzBhC,SAAS,aAAa,CAAC,OAA2C;AAAA,EAChE,IAAI,KAAK,iBAAiB,UAAW,QAAwB;AAAA,EAC7D,OAAO,IAAI;AAAA,IACT,IAAI,GAAG,SAAS,QAAQ;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IACA,KAAK,GAAG;AAAA,EACV;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,UAAU,CAAC,QAA4C;AAAA,EACrE,MAAM,KAAK,cAAc,kBAAkB,UAAU,SAAS,IAAI;AAAA,EAClE,IAAI,CAAC,IAAI;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,OAAO,EAAE;AAAA,EACnB,OAAO;AAAA,IACL,MAAM,YAAY,GAAG,QAAQ,MAAgB;AAAA,IAC7C,MAAM,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE;AAAA,EAC3D;AAAA;AAQK,SAAS,WAAW,CAAC,OAA8B,MAAgB,UAAqB;AAAA,EAC7F,MAAM,MAAiB,CAAC;AAAA,EACxB,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,aAAa,gBAAgB,IAAI;AAAA,IAGvC,MAAM,MAAM,WAAW,WAAW,MAAM,OAAO,OAAO,EAAE,WAAW,KAAK,OAAO,OAAO;AAAA,IACtF,MAAM,KAAK,IAAI,cAAc,kBAAkB,OAAO;AAAA,IACtD,IAAI,IAAI;AAAA,MACN,MAAM,IAAI,OAAO,EAAE;AAAA,MACnB,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAiCF,SAAS,gBAAgB,CAC9B,SACA,MAAgB,UAChB,MACY;AAAA,EACZ,IAAI,eAA8B;AAAA,EAClC,IAAI,eAA8B;AAAA,EAElC,MAAM,UAAU,CAAC,MAAa;AAAA,IAC5B,MAAM,MAAM,WAAW,EAAE,MAAM;AAAA,IAC/B,IAAI,KAAK;AAAA,MACP,QAAQ,KAAK,EAAE,KAAK,MAAM,MAAM,CAAC;AAAA,IACnC;AAAA;AAAA,EAGF,MAAM,cAAc,CAAC,QAAwB;AAAA,IAC3C,MAAM,MAAM,MAAM,KAAK,UAAU,IAAI,IAAI,IAAI;AAAA,IAC7C,IAAI,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AAAA,IACA,eAAe;AAAA,IACf,QAAQ,KAAK,EAAE,KAAK,MAAM,QAAQ,CAAC;AAAA;AAAA,EAIrC,MAAM,oBAAoB,CAAC,QAA4B,WAAqC;AAAA,IAC1F,IAAI,CAAC,QAAQ,KAAK,UAAU,MAAM,aAAa;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK,aAAa;AAAA,IACpC,MAAM,KAAK,cAAc,kBAAkB,UAAU,SAAS,IAAI;AAAA,IAClE,MAAM,QAAQ,MAAM,YAAY,mBAAmB,IAAI,QAAQ,SAAS,IAAI;AAAA,IAC5E,MAAM,MAAM,eAAe,KAAK;AAAA,IAChC,IAAI,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AAAA,IACA,eAAe;AAAA,IACf,QAAQ,KAAK,EAAE,MAAM,eAAe,MAAM,CAAC;AAAA;AAAA,EAG7C,MAAM,SAAS,CAAC,MAAa;AAAA,IAC3B,YAAY,WAAW,EAAE,MAAM,CAAC;AAAA,IAChC,MAAM,KAAK;AAAA,IACX,kBAAkB,EAAE,QAAQ,EAAE,GAAG,GAAG,SAAS,GAAG,GAAG,QAAQ,CAAC;AAAA;AAAA,EAE9D,MAAM,UAAU,MAAM;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,IAAI,QAAQ,iBAAiB,QAAQ;AAAA,MACnC,eAAe;AAAA,MACf,QAAQ,KAAK,EAAE,MAAM,eAAe,OAAO,KAAK,CAAC;AAAA,IACnD;AAAA;AAAA,EAGF,MAAM,gBAAgB,CAAC,MAAa;AAAA,IAClC,MAAM,KAAK;AAAA,IAEX,MAAM,SAAS,UAAU,IAAI,iBAAiB,IAAI;AAAA,IAClD,IAAI,UAAU,EAAE,kBAAkB,QAAQ,OAAO,SAAS,EAAE,MAAM,GAAG;AAAA,MACnE;AAAA,IACF;AAAA,IAGA,EAAE,eAAe;AAAA,IACjB,MAAM,MAAM,WAAW,EAAE,MAAM;AAAA,IAC/B,QAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,MAAM,MAAM,IAAI,OAAO;AAAA,MACvB,GAAG,GAAG;AAAA,MACN,GAAG,GAAG;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,IAAI,iBAAiB,SAAS,SAAS,IAAI;AAAA,EAC3C,IAAI,iBAAiB,eAAe,QAAQ,IAAI;AAAA,EAChD,IAAI,iBAAiB,gBAAgB,SAAS,IAAI;AAAA,EAClD,IAAI,iBAAiB,eAAe,eAAe,IAAI;AAAA,EAEvD,OAAO,MAAM;AAAA,IACX,IAAI,oBAAoB,SAAS,SAAS,IAAI;AAAA,IAC9C,IAAI,oBAAoB,eAAe,QAAQ,IAAI;AAAA,IACnD,IAAI,oBAAoB,gBAAgB,SAAS,IAAI;AAAA,IACrD,IAAI,oBAAoB,eAAe,eAAe,IAAI;AAAA;AAAA;;;AC7I9D,IAAM,YAAY,IAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOD,SAAS,cAAa,CAAC,OAA2C;AAAA,EAChE,IAAI,KAAK,iBAAiB,UAAW,QAAwB;AAAA,EAC7D,OAAO,IAAI;AAAA,IACT,IAAI,GAAG,SAAS,QAAQ;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IACA,KAAK,GAAG;AAAA,EACV;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,iBAAiB,CAAC,GAAW,GAAW,KAAmC;AAAA,EACzF,MAAM,MAAM,eAAe,GAAG,GAAG,GAAG;AAAA,EACpC,OAAO,eAAc,GAAG;AAAA;AAmBnB,SAAS,sBAAsB,CACpC,UACA,SACA,WACA,KACoB;AAAA,EACpB,MAAM,aAAa,SAAS,SAAS;AAAA,EACrC,IAAI,cAAc,MAAM;AAAA,IACtB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,aAAa,YAAY,UAAU;AAAA,EAGzC,IAAI,WAAW,WAAW,GAAG;AAAA,IAC3B,MAAM,WAAW,CAAC,GAAG,SAAS,QAAQ;AAAA,IACtC,IAAI,SAAS,WAAW,GAAG;AAAA,MACzB,OAAO,QAAQ,KAAK,UAAU,IAC1B;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe,SAAQ,QAAQ;AAAA,QAC/B;AAAA,MACF,IACA;AAAA,IACN;AAAA,IACA,OAAO,iBAAiB,UAAU,SAAS,YAAY,GAAG;AAAA,EAC5D;AAAA,EAEA,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,cAAc,WAAW,UAAU;AAAA,EAChD,MAAM,OAAO,MAAM,WAAW,OAAO,YAAY;AAAA,EACjD,MAAM,qBACJ,MAAM,QAAQ,MAAM,QAAQ,KAC5B,KAAK,SAAS,KAAK,CAAC,MAAe,KAAK,QAAQ,OAAO,MAAM,QAAQ;AAAA,EACvE,MAAM,SAAS,UAAU,IAAI,GAAG,KAAK,CAAC;AAAA,EAEtC,MAAM,OAAO,SAAQ,QAAQ;AAAA,EAC7B,MAAM,OAAO,KAAK,WAAW,IAAI,KAAK,UAAU,KAAK,KAAK,KAAK;AAAA,EAE/D,IAAI,QAAQ;AAAA,IACV,OAAO,OAAO,MACV,EAAE,MAAM,OAAO,aAAa,iBAAiB,eAAe,MAAM,WAAW,IAC7E,EAAE,MAAM,UAAU,aAAa,iBAAiB,eAAe,MAAM,WAAW;AAAA,EACtF;AAAA,EACA,IAAI,OAAO,MAAM;AAAA,IACf,OAAO,EAAE,MAAM,OAAO,aAAa,iBAAiB,eAAe,MAAM,WAAW;AAAA,EACtF;AAAA,EACA,IAAI,OAAO,MAAM;AAAA,IACf,OAAO,EAAE,MAAM,UAAU,aAAa,iBAAiB,eAAe,MAAM,WAAW;AAAA,EACzF;AAAA,EACA,OAAO,EAAE,MAAM,UAAU,aAAa,cAAc,eAAe,MAAM,WAAW;AAAA;AAQtF,SAAS,gBAAgB,CACvB,UACA,SACA,YACA,KACoB;AAAA,EACpB,IAAI,cAAc;AAAA,EAClB,IAAI,cAAiD;AAAA,EACrD,IAAI,aAAa,SAAS,SAAS;AAAA,EAEnC,SAAS,IAAI,EAAG,IAAI,SAAS,QAAQ,KAAK;AAAA,IACxC,MAAM,OAAO,SAAQ,SAAS,EAAG;AAAA,IACjC,MAAM,UAAU,KAAK,IAAI,UAAU,KAAK,CAAC;AAAA,IACzC,MAAM,aAAa,KAAK,IAAI,WAAW,KAAK,IAAI,KAAK,OAAO;AAAA,IAC5D,IAAI,UAAU,aAAa;AAAA,MACzB,cAAc;AAAA,MACd,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAAA,IACA,IAAI,aAAa,aAAa;AAAA,MAC5B,cAAc;AAAA,MACd,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,CAAC,GAAG,YAAY,YAAY,UAAU;AAAA,EACxD,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,MAAM,gBAAgB,kBAAkB,QAAQ;AAAA,IAChD;AAAA,IACA,eAAe,SAAQ,SAAS,WAAY;AAAA,IAC5C,YAAY;AAAA,EACd;AAAA;AAIF,SAAS,OAAO,CAAC,KAAkB,YAA6B;AAAA,EAC9D,IAAI,IAAI,SAAS,aAAa;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI,WAAW,SAAS,UAAU,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,CAAC,WAAW,SAAS,UAAU;AAAA;AAIxC,SAAS,QAAO,CAAC,IAA2C;AAAA,EAC1D,MAAM,IAAI,OAAO,EAAE;AAAA,EACnB,OAAO,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE;AAAA;AAgB5D,IAAM,iBAAiB;AAOvB,IAAI,aAAa;AAGV,SAAS,YAAY,GAAY;AAAA,EACtC,OAAO;AAAA;AAIT,IAAI,aAAkC;AAQ/B,SAAS,gBAAgB,GAAS;AAAA,EACvC,IAAI,CAAC,YAAY;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AAAA,EACb,gBAAgB;AAAA,EAChB,OAAO;AAAA;AAIF,SAAS,eAAe,GAAS;AAAA,EACtC,aAAa;AAAA,EACb,aAAa;AAAA;AAOR,SAAS,eAAe,CAAC,UAA4B;AAAA,EAC1D,aAAa;AAAA,EACb,aAAa;AAAA;AAQR,SAAS,iBAAiB,CAAC,QAA2C;AAAA,EAC3E,IAAI,UAAU,GAAG;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,eAAc,kBAAkB,UAAU,SAAS,IAAI;AAAA,EAClE,IAAI,CAAC,IAAI;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,OAAO,YAAY,GAAG,QAAQ,MAAgB;AAAA;AAIzC,SAAS,mBAAmB,CACjC,QACA,KACS;AAAA,EACT,OACE,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,kBAAkB,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK;AAAA;AAO3E,IAAM,mBAAmB;AAGzB,IAAM,mBAAmB;AASzB,SAAS,eAAe,CAAC,GAAW,WAAmB,OAAO,kBAA8B;AAAA,EACjG,IAAI,IAAI,MAAM;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,IAAI,IAAI,YAAY,MAAM;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAqDF,SAAS,iBAAiB,CAC/B,SACA,MAAgB,UAChB,MACY;AAAA,EACZ,IAAI,YAAuE;AAAA,EAC3E,IAAI,WAAW;AAAA,EAGf,IAAI,MAA0B;AAAA,EAE9B,MAAM,gBAAgB,CAAC,MAAoB;AAAA,IAEzC,IAAI,EAAE,WAAW,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,IACA,IAAI,MAAM,UAAU,MAAM,aAAa;AAAA,MACrC;AAAA,IACF;AAAA,IACA,MAAM,OAAO,kBAAkB,EAAE,MAAM;AAAA,IACvC,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,GAAG,KAAK;AAAA;AAAA,EAQ7D,MAAM,cAAc,CAAC,MAAa;AAAA,IAChC,IAAI,aAAa,YAAY;AAAA,MAC3B,EAAE,eAAe;AAAA,IACnB;AAAA;AAAA,EAMF,MAAM,gBAAgB,CAAC,MAAa;AAAA,IAClC,IAAI,YAAY;AAAA,MACd,EAAE,eAAe;AAAA,IACnB;AAAA;AAAA,EAIF,MAAM,QAAQ,CAAC,WAAqC;AAAA,IAClD,IAAI,CAAC,KAAK;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM,UAAU,OAAO,KAAK,UAAU,QAAQ,GAAG,IAAI;AAAA,IACrD,QAAQ,KAAK;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MACT,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,IACD,MAAM,cAAc,QAAQ,UAAU,GAAG;AAAA;AAAA,EAG3C,MAAM,gBAAgB,CAAC,MAAoB;AAAA,IACzC,MAAM,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAAA,IAC5C,IAAI,CAAC,YAAY;AAAA,MACf,IAAI,CAAC,aAAa,CAAC,oBAAoB,UAAU,QAAQ,MAAM,GAAG;AAAA,QAChE;AAAA,MACF;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ,SAAS;AAAA,MACjB,YAAY;AAAA,MACZ,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,YAAY;AAAA,MAC3C,gBAAgB,MAAM,QAAQ,KAAK,EAAE,SAAS,UAAU,MAAM,UAAU,CAAC,CAAC;AAAA,MAG1E,IAAI,eAAe,GAAG,gBAAgB;AAAA,MACtC,QAAQ,KAAK,EAAE,SAAS,UAAU,MAAM,iBAAiB,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;AAAA,IAE5E;AAAA,IACA,MAAM,MAAM;AAAA;AAAA,EAGd,MAAM,cAAc,CAAC,MAAoB;AAAA,IACvC,YAAY;AAAA,IACZ,IAAI,CAAC,cAAc,CAAC,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,MAAM,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAAA,IAC5C,MAAM,OAAO,OAAO,KAAK,UAAU,QAAQ,GAAG,IAAI;AAAA,IAClD,QAAQ,KAAK;AAAA,MACX,SAAS;AAAA,MACT,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,MACzB,aAAa,OAAO,KAAK,cAAc;AAAA,MACvC,MAAM;AAAA,MACN,YAAY,OAAO,KAAK,aAAa;AAAA,IACvC,CAAC;AAAA,IACD,MAAM;AAAA,IACN,MAAM,eAAe;AAAA,IACrB,gBAAgB;AAAA;AAAA,EAGlB,IAAI,iBAAiB,eAAe,eAAe,IAAI;AAAA,EACvD,IAAI,iBAAiB,eAAe,eAAe,IAAI;AAAA,EACvD,IAAI,iBAAiB,aAAa,aAAa,IAAI;AAAA,EACnD,IAAI,iBAAiB,aAAa,aAAa,IAAI;AAAA,EACnD,IAAI,iBAAiB,eAAe,eAAe,IAAI;AAAA,EAEvD,OAAO,MAAM;AAAA,IACX,IAAI,oBAAoB,eAAe,eAAe,IAAI;AAAA,IAC1D,IAAI,oBAAoB,eAAe,eAAe,IAAI;AAAA,IAC1D,IAAI,oBAAoB,aAAa,aAAa,IAAI;AAAA,IACtD,IAAI,oBAAoB,aAAa,aAAa,IAAI;AAAA,IACtD,IAAI,oBAAoB,eAAe,eAAe,IAAI;AAAA;AAAA;;;AChd9D,IAAM,OAAO,CAAC,KAAa,QAA0B,SAAS,YAAY,KAAK,OAAO,GAAG;AAOlF,SAAS,qBAAqB,CAAC,MAA6D;AAAA,EACjG,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,IAC3B,OAAO,EAAE,QAAQ,OAAO,MAAM,KAAK;AAAA,EACrC;AAAA,EACA,IAAI,OAAoB,IAAI;AAAA,EAC5B,OAAO,QAAQ,SAAS,MAAM;AAAA,IAC5B,IAAI,KAAK,aAAa,KAAK,gBAAiB,KAAiB,QAAQ,YAAY,MAAM,KAAK;AAAA,MAC1F,OAAO,EAAE,QAAQ,MAAM,MAAO,KAAiB,aAAa,MAAM,EAAE;AAAA,IACtE;AAAA,IACA,OAAO,KAAK;AAAA,EACd;AAAA,EACA,OAAO,EAAE,QAAQ,OAAO,MAAM,KAAK;AAAA;AASrC,SAAS,iBAAiB,CAAC,MAA6C;AAAA,EACtE,MAAM,MAAM,OAAO,aAAa;AAAA,EAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAoB,IAAI;AAAA,EAC5B,OAAO,QAAQ,SAAS,MAAM;AAAA,IAC5B,IAAI,KAAK,aAAa,KAAK,gBAAiB,KAAiB,QAAQ,YAAY,MAAM,KAAK;AAAA,MAC1F,OAAO;AAAA,IACT;AAAA,IACA,OAAO,KAAK;AAAA,EACd;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,SAAS,CAAC,MAAmB,MAA2B;AAAA,EACtE,MAAM,WAAW,kBAAkB,IAAI;AAAA,EACvC,IAAI,UAAU;AAAA,IACZ,IAAI,MAAM;AAAA,MACR,SAAS,aAAa,QAAQ,IAAI;AAAA,IACpC,EAAO;AAAA,MAEL,MAAM,OAAO,SAAS,uBAAuB;AAAA,MAC7C,OAAO,SAAS,YAAY;AAAA,QAC1B,KAAK,OAAO,SAAS,UAAU;AAAA,MACjC;AAAA,MACA,SAAS,YAAY,IAAI;AAAA;AAAA,EAE7B,EAAO,SAAI,MAAM;AAAA,IACf,KAAK,cAAc,IAAI;AAAA,EACzB;AAAA,EACA,uBAAuB,IAAI;AAAA;AAItB,SAAS,mBAAmB,CAAC,MAAmB,OAAqB;AAAA,EAC1E,KAAK,MAAM;AAAA,EACX,KAAK,cAAc,MAAM,QAAQ;AAAA;;;AC9EnC,IAAM,YAAY,IAAI,IAAI,CAAC,OAAO,SAAS,UAAU,UAAU,OAAO,CAAC;AACvE,IAAM,iBACJ;AAIF,IAAM,kBACJ;AAIF,IAAM,eACJ;AACF,SAAS,aAAa,CAAC,KAAsB;AAAA,EAC3C,OAAO,aAAa,KAAK,GAAG;AAAA;AAG9B,IAAM,WAAW,IAAI,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,gBAAgB,IAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AACF;AAQO,SAAS,4BAA4B,CAAC,MAAoC;AAAA,EAC/E,IAAI,CAAC,KAAK,WAAW,KAAK,eAAe,KAAK,WAAW;AAAA,IACvD,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,KAAK,WAAW;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS,GAAG;AAAA,IAC5D,OAAO;AAAA,EACT;AAAA,EACA,IAAI,SAAS,IAAI,KAAK,OAAO,GAAG;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,cAAc,IAAI,KAAK,OAAO,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AASF,SAAS,qBAAqB,CAAC,KAAa;AAAA,EACjD,OAAO,IAAI,WAAW,kBAAkB,QAAkB;AAAA;AASrD,SAAS,0BAA0B,CAAC,IAAiB;AAAA,EAC1D,MAAM,SAAS,SAAS,iBAAiB,IAAI,WAAW,SAAS;AAAA,EACjE,OAAO,OAAO,SAAS,GAAG;AAAA,IACxB,MAAM,OAAO,OAAO;AAAA,IACpB,IAAI,KAAK,KAAK,SAAS,GAAQ,GAAG;AAAA,MAChC,KAAK,OAAO,KAAK,KAAK,WAAW,4BAA4B,OAAO;AAAA,IACtE;AAAA,EACF;AAAA;AAYF,SAAS,gBAAgB,CAAC,UAAkD;AAAA,EAC1E,MAAM,WAAW,SAAS;AAAA,EAC1B,OAAO;AAAA,IACL,UACE,YAAY,OAAO,aAAa,WAC5B,CAAC,mBAAmB,QAAyB,CAAC,IAC9C,CAAC;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA;AAWK,SAAS,kBAAkB,CAAC,MAAoC;AAAA,EACrE,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,IAEvB,OAAQ,KAAyB,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC;AAAA,EACnE;AAAA,EAIA,IAAK,KAAiC,eAAe,SAAS;AAAA,IAC5D,OAAO,iBAAiB,IAAI;AAAA,EAC9B;AAAA,EAEA,MAA6C,MAAM;AAAA,EAEnD,MAAM,MAA+B,CAAC;AAAA,EACtC,IAAI,wBAAwB;AAAA,EAC5B,MAAM,iBAAiB,UAAU,IAAK,IAAI,WAAsB,EAAE;AAAA,EAGlE,IAAI,gBAAgB;AAAA,IAClB,MAAM,QAAQ,IAAI;AAAA,IAClB,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM,UAAU,OAAO;AAAA,IACvB,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,aAAa,OAAO;AAAA,IAC1B,MAAM,SAAU,UAAU,WAAW,MAAQ,WAAW,YAAY;AAAA,IACpE,MAAM,YAAa,aAAa,cAAc,MAAQ,cAAc,eAAe;AAAA,IACnF,IAAI,CAAC,UAAU,CAAC,WAAW;AAAA,MACzB,wBAAwB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,YAAY,GAAG,MAAM,OAAO,QAAQ,GAAG,GAAG;AAAA,IACxC,IAAI,MAAM,WAAW,MAAM,YAAY,MAAM,aAAa;AAAA,MACxD,IAAI,KAAK;AAAA,IACX,EAAO,SAAI,MAAM,YAAY,KAAK,OAAO,MAAM,UAAU;AAAA,MAEvD,MAAM,WAAoC,CAAC;AAAA,MAC3C,YAAY,IAAI,OAAO,OAAO,QAAQ,CAAC,GAAG;AAAA,QACxC,IAAI,OAAO,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG;AAAA,UAG/C,IAAI,cAAc,EAAE,GAAG;AAAA,YACrB,SAAS,MAAM;AAAA,UACjB,EAAO,SAAI,OAAO,UAAU,OAAO,UAAU;AAAA,YAC3C,SAAS,MAAM;AAAA,UACjB,EAAO;AAAA,YACL,SAAS,MAAM,sBAAsB,EAAE;AAAA;AAAA,QAE3C,EAAO,SAAI,MAAM,OAAO,OAAO,YAAa,GAA+B,MAAM;AAAA,UAC/E,MAAM,OAAO,GAA+B;AAAA,UAC5C,MAAM,QAAQ,KAAI,WAAW,UAAU,IAAI,KAAI,MAAM,CAAC,IAAI;AAAA,UAC1D,SAAS,MAAM,IAAI;AAAA,QACrB,EAAO;AAAA,UACL,SAAS,MAAM;AAAA;AAAA,MAEnB;AAAA,MACA,IAAI,KAAK;AAAA,IACX,EAAO,SAAI,MAAM,YAAY;AAAA,MAC3B,IAAI,MAAM,QAAQ,CAAC,GAAG;AAAA,QAGpB,IAAI,WAAW,EAAE,IAAI,CAAC,MAAM,mBAAmB,CAAkB,CAAC;AAAA,MACpE,EAAO,SACL,KACA,OAAO,MAAM,YACZ,EAA8B,eAAe,SAC9C;AAAA,QAEA,IAAI,WAAW,CAAC,mBAAmB,CAAkB,CAAC;AAAA,MACxD,EAAO;AAAA,QACL,IAAI,WAAW,mBAAmB,CAAkB;AAAA;AAAA,IAExD,EAAO,SAAI,MAAM,WAAW,IAAI,WAAW,KAAK,OAAO,MAAM,UAAU;AAAA,MAErE,MAAM,WAAW,OAAO,KAAK,CAAC;AAAA,MAC9B,IAAI,SAAS,SAAS,GAAG;AAAA,QACvB,MAAM,YAAa,EAA8B,SAAS;AAAA,QAC1D,IAAI,WACF,aAAa,OAAO,cAAc,YAAY,CAAE,UAAsC,OAClF,CAAC,mBAAmB,SAA0B,CAAC,IAC/C;AAAA,UACE;AAAA,YACE,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,YACA,SAAS;AAAA,YACT,aAAa,aAAa,SAAS,KAAK,KAAK;AAAA,UAC/C;AAAA,QACF;AAAA,MACR;AAAA,IACF,EAAO,SAAI,MAAM,gBAAgB,kBAAkB,KAAK,OAAO,MAAM,UAAU;AAAA,MAE7E,MAAM,QAAQ;AAAA,MACd,MAAM,YAAqC,CAAC;AAAA,MAC5C,YAAY,IAAI,OAAO,OAAO,QAAQ,KAAK,GAAG;AAAA,QAC5C,IAAI,OAAO,SAAS,OAAO,UAAU;AAAA,UACnC,IAAI,OAAO,OAAO,YAAY,OAAO,MAAM,CAAC,GAAG,SAAS,IAAI,GAAG;AAAA,YAC7D,UAAU,MAAM;AAAA,UAClB,EAAO;AAAA,YACL,wBAAwB;AAAA,YACxB,UAAU,MAAM;AAAA;AAAA,QAEpB,EAAO,SAAI,OAAO,OAAO,YAAY,GAAG,SAAS,IAAI,GAAG;AAAA,UACtD,MAAM,YAAY,OAAO,UAAU,OAAO;AAAA,UAC1C,UAAU,MAAM,YAAY,KAAK,sBAAsB,EAAE;AAAA,QAC3D,EAAO,SAAI,MAAM,OAAO,OAAO,YAAa,GAA+B,MAAM;AAAA,UAC/E,MAAM,OAAO,GAA+B;AAAA,UAC5C,MAAM,QAAQ,KAAI,WAAW,UAAU,IAAI,KAAI,MAAM,CAAC,IAAI;AAAA,UAC1D,UAAU,MAAM,IAAI;AAAA,QACtB,EAAO;AAAA,UACL,UAAU,MAAM;AAAA;AAAA,MAEpB;AAAA,MACA,IAAI,aAAa;AAAA,IACnB,EAAO,SAAI,MAAM,SAAS;AAAA,MAExB,IAAI,KAAK,OAAO,MAAM,UAAU;AAAA,QAC9B,MAAM,IAA6B,CAAC;AAAA,QACpC,YAAY,IAAI,OAAO,OAAO,QAAQ,CAAC,GAAG;AAAA,UACxC,EAAE,MAAM,OAAO,OAAO,YAAY,GAAG,SAAS,IAAI,IAAI,KAAK;AAAA,QAC7D;AAAA,QACA,IAAI,QAAQ;AAAA,MACd,EAAO;AAAA,QACL,IAAI,QAAQ;AAAA;AAAA,IAEhB,EAAO,SAAI,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,GAAG;AAAA,MAEpD,MAAM,cACH,MAAM,SAAS,MAAM,aAAa,UAAU,IAAK,IAAI,WAAsB,EAAE;AAAA,MAChF,IAAI,YAAY;AAAA,QACd,wBAAwB;AAAA,QACxB,IAAI,KAAK;AAAA,MACX,EAAO;AAAA,QACL,MAAM,YAAY,MAAM,SAAS,MAAM,UAAU,MAAM,YAAY,MAAM;AAAA,QACzE,IAAI,KAAK,YAAY,KAAK,sBAAsB,CAAC;AAAA;AAAA,IAErD,EAAO,SAAI,KAAK,OAAO,MAAM,YAAa,EAA8B,MAAM;AAAA,MAE5E,MAAM,OAAO,EAA8B;AAAA,MAC3C,MAAM,QAAQ,KAAI,WAAW,UAAU,IAAI,KAAI,MAAM,CAAC,IAAI;AAAA,MAC1D,MAAM,cACH,MAAM,SAAS,MAAM,aAAa,UAAU,IAAK,IAAI,WAAsB,EAAE;AAAA,MAChF,IAAI,YAAY;AAAA,QACd,wBAAwB;AAAA,QACxB,IAAI,KAAK;AAAA,MACX,EAAO;AAAA,QACL,IAAI,KAAK,IAAI;AAAA;AAAA,IAEjB,EAAO;AAAA,MAEL,KACG,MAAM,SAAS,MAAM,aACtB,MAAM,MACN,UAAU,IAAK,IAAI,WAAsB,EAAE,GAC3C;AAAA,QACA,wBAAwB;AAAA,QACxB,IAAI,KAAK;AAAA,MACX,EAAO;AAAA,QACL,IAAI,KAAK,mBAAmB,CAAkB;AAAA;AAAA;AAAA,EAGpD;AAAA,EAGA,MAAM,mBAAmB,6BAA6B,GAAoB;AAAA,EAC1E,IAAI,kBAAkB;AAAA,IACpB,IAAI,YAAY,IAAI,YAAY,GAAG,IAAI,aAAa,qBAAqB;AAAA,EAC3E;AAAA,EAGA,IAAI,uBAAuB;AAAA,IACzB,MAAM,MAAO,IAAI,aAAwB;AAAA,IACzC,IAAI,CAAC,IAAI,SAAS,yBAAyB,GAAG;AAAA,MAC5C,IAAI,YAAY,MAAM,GAAG,gCAAgC;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;;ACtTT,IAAM,aAAqC;AAAA,EACzC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AACb;AAGA,IAAM,oBAAoB,CAAC,UAAU,MAAM,KAAK,OAAO,OAAO,OAAO,MAAM;AAG3E,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAG3B,SAAS,kBAAkB,CAAC,QAAsE;AAAA,EAChG,IAAI,KAAK,kBAAkB,UAAU,SAAS;AAAA,EAC9C,OAAO,IAAI;AAAA,IACT,IAAI,cAAc,eAAe,GAAG,QAAQ,UAAU,gBAAgB,EAAE,GAAG;AAAA,MACzE,OAAO,EAAE,IAAI,MAAM,YAAY,GAAG,QAAQ,MAAM,EAAE;AAAA,IACpD;AAAA,IACA,KAAK,GAAG;AAAA,EACV;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,cAAc,CAAC,WAAwB,MAAkC;AAAA,EAChF,MAAM,aAAa,gBAAgB,IAAI;AAAA,EACvC,MAAM,MAAM,WAAW,WAAW,MAAM,OAAO,OAAO,EAAE,WAAW,KAAK,OAAO,OAAO;AAAA,EACtF,MAAM,KAAK,UAAU,cAAc,kBAAkB,OAAO;AAAA,EAC5D,OAAO,cAAc,cAAc,KAAK;AAAA;AAI1C,SAAS,kBAAkB,CAAC,MAAiC;AAAA,EAC3D,OAAO,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,OAAO,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA;AAQjE,SAAS,qBAAqB,CACnC,SACA,WACA,MACY;AAAA,EACZ,MAAM,MAAM,UAAU;AAAA,EAItB,MAAM,iBAAiB,MAAM;AAAA,IAC3B,MAAM,OAAO,MAAM,UAAU;AAAA,IAC7B,OAAO,SAAS,aAAa,SAAS,YAAY,SAAS;AAAA;AAAA,EAK7D,IAAI,oBAAkC;AAAA,EAEtC,IAAI,MAAM;AAAA,EAGV,MAAM,sBAAsB,CAAC,OAAkC;AAAA,IAC7D,MAAM,MAAM,OAAO,aAAa;AAAA,IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY;AAAA,MAC3B,OAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,IAAI,WAAW,CAAC;AAAA,IAC9B,OAAO,GAAG,SAAS,MAAM,uBAAuB,IAAI,QAAQ;AAAA;AAAA,EAI9D,MAAM,aAAa,MAAM;AAAA,IACvB,MAAM,KAAK,iBAAiB;AAAA,IAC5B,IAAI,CAAC,IAAI;AAAA,MACP;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,oBAAoB,EAAE;AAAA,IACpC,IAAI,SAAS,CAAC,MAAM,WAAW;AAAA,MAC7B,oBAAoB,MAAM,WAAW;AAAA,IACvC;AAAA;AAAA,EAOF,MAAM,uBAAuB,MAAM;AAAA,IACjC,IAAI,IAAI,cAAc,IAAI,oBAAoB,GAAG;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,IAAI,cAAc,OAAO;AAAA,IACvC,MAAM,KAAK;AAAA,IACX,MAAM,cAAc,eAAe;AAAA,IACnC,IAAI,KAAK,OAAO,KAAK;AAAA;AAAA,EAQvB,MAAM,kBAAkB,MAAM;AAAA,IAC5B,MAAM,gBAAiB,WAAuC;AAAA,IAG9D,MAAM,aAAc,WAAW,KAC3B;AAAA,IACJ,IAAI,CAAC,iBAAiB,CAAC,YAAY;AAAA,MACjC;AAAA,IACF;AAAA,IACA,IAAI,qBAAqB,kBAAkB,eAAe,aAAa;AAAA,MACrE,qBAAqB;AAAA,MACrB,WAAW,IAAI,gBAAgB,IAAI,cAAc,kBAAkB,WAAW,CAAC,CAAC;AAAA,IAClF,EAAO;AAAA,MACL,WAAW,OAAO,cAAc;AAAA;AAAA;AAAA,EAKpC,MAAM,iBAAiB,MAAM;AAAA,IAC3B,MAAM,aAAc,WAAW,KAC3B;AAAA,IACJ,YAAY,OAAO,cAAc;AAAA;AAAA,EAOnC,MAAM,gBAAgB,MAAgC;AAAA,IACpD,MAAM,KAAK,iBAAiB;AAAA,IAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ,QAAQ;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,IACA,MAAM,YAAY,oBAAoB,EAAE;AAAA,IACxC,MAAM,YAAY,aAAa;AAAA,IAC/B,MAAM,OAAO,YAAY,mBAAmB,YAAY,SAAS,CAAC,IAAI;AAAA,IACtE,MAAM,YAAY,YAAY,UAAU,YAAY;AAAA,IAEpD,MAAM,aAAa,kBAAkB,OAAO,CAAC,QAAQ,uBAAuB,KAAK,EAAE,CAAC;AAAA,IACpF,MAAM,OAAO,sBAAsB,EAAE;AAAA,IACrC,IAAI,KAAK,QAAQ;AAAA,MACf,WAAW,KAAK,GAAG;AAAA,IACrB;AAAA,IAEA,OAAO;AAAA,IACP,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,MAAM,YAAY,GAAG,QAAQ,MAAM;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAIF,MAAM,oBAAoB,MAAM;AAAA,IAC9B,IAAI,CAAC,UAAU,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IAGA,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,MAAM,WAAW,cAAc;AAAA,IAC/B,IAAI,UAAU;AAAA,MACZ,QAAQ,KAAK,QAAQ;AAAA,IACvB;AAAA;AAAA,EAGF,MAAM,cAAc,CAAC,IAAiB,SAAiB;AAAA,IAErD,2BAA2B,EAAE;AAAA,IAC7B,QAAQ,KAAK,EAAE,MAAM,aAAa,KAAK,CAAC;AAAA,IAGxC,iBAAiB;AAAA,IACjB,aAAa,IAAI,MAAM;AAAA,MACrB,UAAU,CAAC,GAAG,UAAU,gBACtB,QAAQ,KAAK,EAAE,UAAU,MAAM,cAAc,MAAM,GAAG,YAAY,CAAC;AAAA,MACrE,OAAO,MAAM;AAAA,QAEX,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,oBAAoB;AAAA,QACpB,QAAQ,KAAK,EAAE,MAAM,UAAU,CAAC;AAAA;AAAA,MAElC,UAAU,CAAC,GAAG,KAAK,eACjB,QAAQ,KAAK,EAAE,KAAK,YAAY,MAAM,cAAc,MAAM,EAAE,CAAC;AAAA,MAC/D,SAAS,CAAC,GAAG,QAAQ,UAAU,QAAQ,KAAK,EAAE,OAAO,QAAQ,MAAM,aAAa,MAAM,EAAE,CAAC;AAAA,IAC3F,CAAC;AAAA,IAED,WAAW;AAAA,IACX,kBAAkB;AAAA;AAAA,EAIpB,MAAM,oBAAoB,CAAC,WAA8B;AAAA,IACvD,MAAM,KAAK,iBAAiB;AAAA,IAC5B,IAAI,CAAC,IAAI;AAAA,MACP;AAAA,IACF;AAAA,IAEA,IACE,qBACA,kBAAkB,eAAe,eACjC,GAAG,SAAS,kBAAkB,uBAAuB,GACrD;AAAA,MACA,MAAM,MAAM,OAAO,aAAa;AAAA,MAChC,GAAG,MAAM;AAAA,MACT,KAAK,gBAAgB;AAAA,MACrB,KAAK,SAAS,iBAAiB;AAAA,IACjC;AAAA,IAEA,IAAI,OAAO,YAAY,QAAQ;AAAA,MAC7B,UAAU,IAAI,OAAO,IAAI;AAAA,IAC3B,EAAO,SAAI,OAAO,YAAY,cAAc;AAAA,MAC1C,oBAAoB,IAAI,OAAO,KAAK;AAAA,IACtC,EAAO;AAAA,MACL,MAAM,MAAM,WAAW,OAAO;AAAA,MAC9B,IAAI,KAAK;AAAA,QACP,mBAAmB,KAAK,EAAE;AAAA,MAC5B;AAAA;AAAA,IAKF,WAAW;AAAA,IACX,kBAAkB;AAAA;AAAA,EAGpB,MAAM,aAAa,CAAC,MAAa;AAAA,IAC/B,IAAI,CAAC,eAAe,GAAG;AAAA,MACrB;AAAA,IACF;AAAA,IACA,MAAM,MAAM,mBAAmB,EAAE,MAAM;AAAA,IACvC,IAAI,KAAK;AAAA,MACP,YAAY,IAAI,IAAI,IAAI,IAAI;AAAA,IAC9B;AAAA;AAAA,EAGF,MAAM,YAAY,MAAM,WAAW;AAAA,EACnC,MAAM,UAAU,MAAM,WAAW;AAAA,EAEjC,MAAM,gBAAgB,MAAM,WAAW;AAAA,EAQvC,MAAM,uBAAuB,CAAC,MAAa;AAAA,IACzC,IAAI,CAAC,UAAU,KAAK,cAAc,GAAG;AAAA,MACnC;AAAA,IACF;AAAA,IACA,MAAM,KAAK,iBAAiB;AAAA,IAC5B,IAAI,MAAM,EAAE,kBAAkB,QAAQ,CAAC,GAAG,SAAS,EAAE,MAAM,GAAG;AAAA,MAC5D,YAAY;AAAA,IACd;AAAA;AAAA,EAGF,IAAI,iBAAiB,YAAY,YAAY,IAAI;AAAA,EACjD,IAAI,iBAAiB,mBAAmB,iBAAiB;AAAA,EACzD,IAAI,iBAAiB,WAAW,WAAW,IAAI;AAAA,EAC/C,IAAI,iBAAiB,SAAS,SAAS,IAAI;AAAA,EAC3C,IAAI,iBAAiB,QAAQ,eAAe,IAAI;AAAA,EAChD,IAAI,iBAAiB,eAAe,sBAAsB,IAAI;AAAA,EAE9D,MAAM,MAAM,QAAQ,UAAU,CAAC,QAAQ;AAAA,IACrC,IAAI,IAAI,SAAS,eAAe;AAAA,MAC9B,kBAAkB,IAAI,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,WAAW;AAAA,MAG1B,IAAI,UAAU,GAAG;AAAA,QACf,YAAY;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,aAAa;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,IAAI,CAAC,eAAe,GAAG;AAAA,MACrB;AAAA,IACF;AAAA,IACA,MAAM,KAAK,eAAe,WAAW,IAAI,IAAI;AAAA,IAC7C,IAAI,MAAM,gBAAgB,EAAE,GAAG;AAAA,MAC7B,YAAY,IAAI,IAAI,IAAI;AAAA,IAC1B;AAAA,GACD;AAAA,EAED,OAAO,MAAM;AAAA,IACX,IAAI,oBAAoB,YAAY,YAAY,IAAI;AAAA,IACpD,IAAI,oBAAoB,mBAAmB,iBAAiB;AAAA,IAC5D,IAAI,oBAAoB,WAAW,WAAW,IAAI;AAAA,IAClD,IAAI,oBAAoB,SAAS,SAAS,IAAI;AAAA,IAC9C,IAAI,oBAAoB,QAAQ,eAAe,IAAI;AAAA,IACnD,IAAI,oBAAoB,eAAe,sBAAsB,IAAI;AAAA,IACjE,IAAI;AAAA,IACJ,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,IAAI,UAAU,GAAG;AAAA,MACf,YAAY;AAAA,IACd;AAAA;AAAA;;;ACrVJ,IAAM,WAAW,IAAI,IAAI,CAAC,WAAW,aAAa,SAAS,QAAQ,CAAC;AAM7D,SAAS,sBAAsB,CACpC,SACA,KACY;AAAA,EACZ,IAAI,OAAO;AAAA,EAGX,IAAI,WAAiD;AAAA,EACrD,IAAI,mBAAkC;AAAA,EAEtC,MAAM,aAA8B;AAAA,IAClC,SAAS,MAAM;AAAA,MACb,IAAI,CAAC,MAAM;AAAA,QACT;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,QAAQ,KAAK,EAAE,MAAM,eAAe,CAAC;AAAA;AAAA,IAEvC,QAAQ,MAAM;AAAA,IACd,MAAM,CAAC,UAAU,QAAQ,QAAQ;AAAA,OAC9B,EAAE,SAAS,IAAI;AAAA,MAChB,IAAI,QAAQ,WAAW,kBAAkB;AAAA,QACvC;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,MAAM,IAAI,OAAO,QAAQ;AAAA,MACzB,QAAQ,KAAK;AAAA,QACX;AAAA,QACA,MAAM;AAAA,QACN,MAAM,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI;AAAA,MAChE,CAAC;AAAA;AAAA,EAEL;AAAA,EACA,mBAAmB,UAAU;AAAA,EAE7B,MAAM,YAAY,CAAC,MAAqB;AAAA,IACtC,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,GAAG,GAAG;AAAA,MACjC;AAAA,IACF;AAAA,IACA,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,QAAQ,KAAK,EAAE,KAAK,EAAE,KAAoB,MAAM,WAAW,CAAC;AAAA;AAAA,EAE9D,MAAM,cAAc,MAAM;AAAA,IAKxB,IAAI,MAAM;AAAA,MACR,WAAW,QAAQ;AAAA,IACrB;AAAA;AAAA,EAEF,IAAI,iBAAiB,WAAW,WAAW,IAAI;AAAA,EAC/C,IAAI,iBAAiB,aAAa,aAAa,IAAI;AAAA,EAEnD,MAAM,MAAM,QAAQ,UAAU,CAAC,QAAQ;AAAA,IACrC,IAAI,IAAI,SAAS,eAAe;AAAA,MAC9B,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,WAAW,KAAK,IAAI,IAAI,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,kBAAkB;AAAA,MACjC,OAAO;AAAA,MACP,mBAAmB;AAAA,IACrB;AAAA,GACD;AAAA,EAED,OAAO,MAAM;AAAA,IACX,IAAI,oBAAoB,WAAW,WAAW,IAAI;AAAA,IAClD,IAAI,oBAAoB,aAAa,aAAa,IAAI;AAAA,IACtD,IAAI;AAAA,IACJ,mBAAmB;AAAA,MACjB,SAAS,MAAM;AAAA,MAGf,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,IAGd,CAAC;AAAA;AAAA;;;AC9FL,IAAM,oBAAyC,IAAI,IAAI;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,SAAS,gBAAgB,CAAC,IAAiC;AAAA,EACzD,IAAI,EAAE,cAAc,cAAc;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,GAAG,mBAAmB;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EACA,OAAO,GAAG,YAAY,WAAW,GAAG,YAAY,cAAc,GAAG,YAAY;AAAA;AAIxE,SAAS,gBAAgB,CAAC,GAA2B;AAAA,EAC1D,IAAI,iBAAiB,EAAE,MAAM,GAAG;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,OAAO,EAAE,WAAW,EAAE,WAAW,kBAAkB,IAAI,EAAE,GAAG;AAAA;AAIvD,SAAS,YAAY,CAAC,GAAiC;AAAA,EAC5D,OAAO;AAAA,IACL,QAAQ,EAAE;AAAA,IACV,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,IACX,KAAK,EAAE;AAAA,IACP,SAAS,EAAE;AAAA,IACX,UAAU,EAAE;AAAA,EACd;AAAA;AAOK,SAAS,kBAAkB,CAChC,SACA,MAAgB,UACJ;AAAA,EACZ,MAAM,QAAQ,CAAC,MAAqB;AAAA,IAIlC,IAAI,EAAE,QAAQ,YAAY,aAAa,GAAG;AAAA,MACxC,EAAE,eAAe;AAAA,MACjB,iBAAiB;AAAA,MACjB;AAAA,IACF;AAAA,IACA,IAAI,CAAC,iBAAiB,CAAC,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,IACA,EAAE,eAAe;AAAA,IACjB,QAAQ,KAAK,EAAE,OAAO,aAAa,CAAC,GAAG,MAAM,aAAa,CAAC;AAAA;AAAA,EAE7D,IAAI,iBAAiB,WAAW,OAAO,IAAI;AAAA,EAC3C,OAAO,MAAM,IAAI,oBAAoB,WAAW,OAAO,IAAI;AAAA;;;AC5C7D,SAAS,SAAY,CAAC,OAAa;AAAA,EAEjC,OAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA;AAIlC,SAAS,UAAa,CAAC,GAAS;AAAA,EACrC,OAAO,MAAM,aAAa,MAAM,OAAO,IAAK,UAAU,CAAW;AAAA;AAQ5D,SAAS,cAAa,CAAC,KAAoB,MAA6B;AAAA,EAC7E,IAAI,OAAO;AAAA,EACX,WAAW,OAAO,MAAM;AAAA,IACtB,IAAI,QAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,EACd;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,UAAU,CAAC,MAAiD;AAAA,EAI1E,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,IACvB,MAAM,IAAI,UAAU,sEAAsE;AAAA,EAC5F;AAAA,EACA,IAAI,CAAC,KAAK,UAAU;AAAA,IAClB,KAAK,WAAW,CAAC;AAAA,EACnB;AAAA,EACA,IAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,IACjC,MAAM,IAAI,UAAU,yEAAyE;AAAA,EAC/F;AAAA,EACA,OAAO,KAAK;AAAA;AAOP,SAAS,eAAe,CAAC,KAAoB,IAAmB;AAAA,EACrE,QAAQ,GAAG;AAAA,SACJ,WAAW;AAAA,MACd,MAAM,OAAO,eAAc,KAAK,GAAG,IAAI;AAAA,MACvC,IAAI,CAAC,MAAM;AAAA,QACT,MAAM,IAAI,MAAM,yBAAyB,GAAG,KAAK,KAAK,GAAG,GAAG;AAAA,MAC9D;AAAA,MACA,MAAM,SAAS;AAAA,MACf,IAAI,GAAG,UAAU,WAAW;AAAA,QAC1B,OAAO,OAAO,GAAG;AAAA,MACnB,EAAO;AAAA,QACL,OAAO,GAAG,OAAO,WAAW,GAAG,KAAK;AAAA;AAAA,MAEtC;AAAA,IACF;AAAA,SACK,gBAAgB;AAAA,MACnB,MAAM,SAAS,eAAc,KAAK,GAAG,UAAU;AAAA,MAC/C,WAAW,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,IAAI,CAAkB;AAAA,MAC3E;AAAA,IACF;AAAA,SACK,gBAAgB;AAAA,MACnB,MAAM,SAAS,eAAc,KAAK,GAAG,UAAU;AAAA,MAC/C,WAAW,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;AAAA,MACrC;AAAA,IACF;AAAA,SACK,aAAa;AAAA,MAChB,MAAM,SAAS,eAAc,KAAK,GAAG,UAAU;AAAA,MAC/C,WAAW,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,IAAI,CAAkB;AAAA,MAC3E;AAAA,IACF;AAAA,SACK,cAAc;AAAA,MACjB,MAAM,aAAa,eAAc,KAAK,GAAG,cAAc;AAAA,MACvD,MAAM,WAAW,eAAc,KAAK,GAAG,YAAY;AAAA,MACnD,OAAO,QAAQ,WAAW,UAAU,EAAE,OAAO,GAAG,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAK;AAAA,MAChD;AAAA,IACF;AAAA,aACS;AAAA,MACP,MAAM,IAAI,MAAM,kBAAmB,GAAe,IAAI;AAAA,IACxD;AAAA;AAAA;;AC/GG,SAAS,kBAAkB,CAAC,MAAoC;AAAA,EACrE,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,IAEvB,OAAO,KAAK,IAAI,CAAC,MAAqB,mBAAmB,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,MAAM,MAA+B,CAAC;AAAA,EACtC,YAAY,GAAG,MAAM,OAAO,QAAQ,IAAI,GAAG;AAAA,IACzC,IAAI,EAAE,WAAW,IAAI,KAAK,eAAe,CAAC,GAAG;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,IAAI,MAAM,YAAY;AAAA,MACpB,IAAI,WAAW,MAAM,QAAQ,CAAC,IAC1B,EAAE,IAAI,CAAC,MAAqB,mBAAmB,CAAC,CAAC,IACjD,mBAAmB,CAAkB;AAAA,IAC3C,EAAO,SAAI,MAAM,WAAW,OAAO,MAAM,UAAU;AAAA,MACjD,MAAM,QAAiC,CAAC;AAAA,MACxC,YAAY,IAAI,OAAO,OAAO,QAAQ,CAA4B,GAAG;AAAA,QACnE,MAAM,MAAM,mBAAmB,EAAmB;AAAA,MACpD;AAAA,MACA,IAAI,QAAQ;AAAA,IACd,EAAO,SAAI,MAAM,WAAW,OAAO,MAAM,YAAY,MAAM,MAAM;AAAA,MAC/D,MAAM,QAAiC,CAAC;AAAA,MACxC,YAAY,IAAI,OAAO,OAAO,QAAQ,CAA4B,GAAG;AAAA,QACnE,IAAI,MAAM,OAAO,OAAO,YAAa,GAA+B,WAAW,UAAU;AAAA,UACvF;AAAA,QACF;AAAA,QACA,MAAM,MAAM;AAAA,MACd;AAAA,MACA,IAAI,QAAQ;AAAA,IACd,EAAO,SAAI,MAAM,WAAW,MAAM,gBAAgB,MAAM,UAAU;AAAA,MAChE,IAAI,KAAK;AAAA,IACX,EAAO;AAAA,MACL,IAAI,KAAK;AAAA;AAAA,EAEb;AAAA,EACA,OAAO;AAAA;;;ACxBT,IAAM,UAAU,IAAI;AAEpB,IAAM,aAAa,IAAI;AAMhB,SAAS,mBAAmB,CACjC,WACA,SACA,KACoB;AAAA,EACpB,MAAM,OAAO,cAAc,WAAW,OAAO;AAAA,EAC7C,IAAI,SAAS,WAAW;AAAA,IACtB,MAAM,IAAI,MAAM,+BAA+B,QAAQ,KAAK,GAAG,GAAG;AAAA,EACpE;AAAA,EACA,MAAM,OAAM,OAAO,SAAS,WAAW,OAAO,mBAAmB,mBAAmB,IAAI,CAAC;AAAA,EACzF,QAAQ,QAAQ,UAAU,SAAS,UAAU,MAC3C,WAAW,MAAK,IAAI,MAAM;AAAA,IACxB,OAAO,oBAAoB,SAAS,GAAG;AAAA,IACvC,eAAe,YAAY,IAAI,SAAS;AAAA,EAC1C,CAAC,CACH;AAAA,EAGA,WAAW,IAAI,IAAI;AAAA,EACnB,IAAI,oBAAoB,aAAa;AAAA,IACnC,QAAQ,IAAI,UAAU,IAAI;AAAA,EAC5B;AAAA,EACA,OAAO;AAAA;AAOF,SAAS,cAAc,CAAC,IAAmB;AAAA,EAChD,MAAM,UAAqB,CAAC,IAAI,GAAG,GAAG,iBAAiB,GAAG,CAAC;AAAA,EAC3D,WAAW,KAAK,SAAS;AAAA,IACvB,IAAI,EAAE,aAAa,cAAc;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,MAAM,MAAM,iBAAiB,IAAI,CAAC;AAAA,IAClC,IAAI,KAAK;AAAA,MACP,IAAI,OAAO;AAAA,MACX,iBAAiB,OAAO,CAAC;AAAA,IAC3B;AAAA,IACA,MAAM,OAAO,QAAQ,IAAI,CAAC;AAAA,IAC1B,IAAI,MAAM;AAAA,MACR,KAAK;AAAA,MACL,WAAW,OAAO,IAAI;AAAA,MACtB,QAAQ,OAAO,CAAC;AAAA,IAClB;AAAA,EACF;AAAA;AAIK,SAAS,kBAAkB,GAAS;AAAA,EACzC,WAAW,QAAQ,YAAY;AAAA,IAC7B,KAAK;AAAA,EACP;AAAA,EACA,WAAW,MAAM;AAAA;AASnB,SAAS,mBAAmB,CAAC,SAAiB,KAA2C;AAAA,EACvF,QAAQ,cAAc;AAAA,EACtB,IAAI,UAAU,iBAAiB,UAAU,qBAAqB,QAAQ,OAAO,YAAY;AAAA,IACvF,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO,QAAQ,WAClB;AAAA,MACE,GAAG,UAAU;AAAA,MACb,OAAO,UAAU,qBAAqB;AAAA,MACtC,GAAG,QAAQ,MAAM,CAAC;AAAA,IACpB,IACA,CAAC,GAAG,UAAU,mBAAmB,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC1D;AAAA,EACA,OAAO;AAAA;;;AC3EF,SAAS,gBAAgB,CAC9B,WACA,YACA,WACA,KACM;AAAA,EACN,WAAW,MAAM,YAAY;AAAA,IAC3B,gBAAgB,WAAW,EAAE;AAAA,EAC/B;AAAA,EACA,WAAW,MAAM,YAAY;AAAA,IAC3B,aAAa,WAAW,IAAI,WAAW,GAAG;AAAA,EAC5C;AAAA;AAIF,SAAS,UAAU,CAAC,KAAmD;AAAA,EACrE,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,YAAY,CACnB,KACA,IACA,WACA,KACM;AAAA,EACN,QAAQ,GAAG;AAAA,SACJ,WAAW;AAAA,MACd,IAAI,GAAG,QAAQ,SAAS;AAAA,QACtB,WAAW,KAAK,GAAG,MAAM,WAAW,GAAG;AAAA,QACvC;AAAA,MACF;AAAA,MACA,IAAI,GAAG,QAAQ,eAAe;AAAA,QAC5B,UAAU,KAAK,GAAG,MAAM,SAAS;AAAA,QACjC;AAAA,MACF;AAAA,MAEA,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG;AAAA,QAC3B;AAAA,MACF;AAAA,MAGA,eAAe,KAAK,GAAG,MAAM,WAAW,WAAW,GAAG,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,SACK,gBAAgB;AAAA,MACnB,YAAY,KAAK,GAAG,YAAY,GAAG,OAAO,WAAW,WAAW,GAAG,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,SACK,aAAa;AAAA,MAChB,eAAe,KAAK,CAAC,GAAG,GAAG,YAAY,YAAY,GAAG,KAAK,GAAG,WAAW,WAAW,GAAG,CAAC;AAAA,MACxF;AAAA,IACF;AAAA,SACK,gBAAgB;AAAA,MACnB,YAAY,KAAK,GAAG,YAAY,GAAG,OAAO,SAAS;AAAA,MACnD;AAAA,IACF;AAAA,SACK,cAAc;AAAA,MACjB,UAAU,KAAK,GAAG,gBAAgB,GAAG,WAAW,GAAG,cAAc,GAAG,SAAS,SAAS;AAAA,MACtF;AAAA,IACF;AAAA,aACS;AAAA,MAEP,MAAM,IAAI,MAAM,+BAA+B,KAAK,UAAU,EAAE,GAAG;AAAA,IACrE;AAAA;AAAA;AAOJ,SAAS,WAAW,CAClB,KACA,YACA,OACA,WACA,KACM;AAAA,EACN,MAAM,WAAW,eAAe,WAAW,UAAU;AAAA,EACrD,MAAM,aAAa,cAAc,KAAK,UAAU;AAAA,EAChD,MAAM,QAAQ,oBAAoB,KAAK,CAAC,GAAG,YAAY,YAAY,KAAK,GAAG,GAAG;AAAA,EAE9E,gBAAgB,WAAW,YAAY,OAAO,CAAC;AAAA,EAC/C,SAAS,UAAU,OAAO,kBAAkB,UAAU,YAAY,KAAK,CAAC;AAAA,EACxE,yBAAyB,UAAU,UAAU;AAAA;AAI/C,SAAS,cAAc,CACrB,KACA,SACA,WACA,KACM;AAAA,EACN,MAAM,QAAQ,eAAe,WAAW,OAAO;AAAA,EAC/C,MAAM,QAAQ,oBAAoB,KAAK,SAAS,GAAG;AAAA,EACnD,eAAe,KAAK;AAAA,EACpB,MAAM,YAAY,KAAK;AAAA;AAMzB,SAAS,WAAW,CAClB,KACA,YACA,OACA,WACM;AAAA,EACN,MAAM,KAAK,eAAe,WAAW,CAAC,GAAG,YAAY,YAAY,KAAK,CAAC;AAAA,EACvE,MAAM,WAAW,GAAG;AAAA,EACpB,eAAe,EAAE;AAAA,EACjB,GAAG,OAAO;AAAA,EACV,gBAAgB,WAAW,YAAY,QAAQ,GAAG,EAAE;AAAA,EACpD,IAAI,UAAU;AAAA,IACZ,yBAAyB,UAAU,cAAc,KAAK,UAAU,CAAC;AAAA,EACnE;AAAA;AASF,SAAS,SAAS,CAChB,KACA,gBACA,WACA,cACA,SACA,WACM;AAAA,EACN,MAAM,WAAW,CAAC,GAAG,gBAAgB,YAAY,SAAS;AAAA,EAC1D,MAAM,KAAK,eAAe,WAAW,QAAQ;AAAA,EAC7C,MAAM,eAAe,GAAG;AAAA,EAExB,MAAM,aAAa,eAAe,WAAW,YAAY;AAAA,EAEzD,GAAG,OAAO;AAAA,EACV,gBAAgB,WAAW,gBAAgB,YAAY,GAAG,EAAE;AAAA,EAE5D,MAAM,WAAW,YAAY,UAAU,KAAK;AAAA,EAC5C,gBAAgB,WAAW,UAAU,SAAS,CAAC;AAAA,EAC/C,yBAAyB,IAAI,UAAU,CAAC,GAAG,UAAU,YAAY,OAAO,CAAC;AAAA,EAEzE,MAAM,eAAe,cAAc,KAAK,QAAQ;AAAA,EAChD,SAAS,YAAY,IAAI,kBAAkB,YAAY,cAAc,OAAO,CAAC;AAAA,EAI7E,IAAI,cAAc;AAAA,IAChB,yBACE,cACA,cAAc,KAAK,YAAY,YAAY,KAAK,cAAc,CAChE;AAAA,EACF;AAAA,EACA,yBAAyB,YAAY,YAAY;AAAA;AAOnD,SAAS,wBAAwB,CAAC,UAAmB,YAA6C;AAAA,EAChG,WAAW,OAAO,2BAA2B;AAAA,IAC3C,SAAS,UAAU,OAAO,GAAG;AAAA,EAC/B;AAAA,EACA,MAAM,cAAc,aAAa,6BAA6B,UAAU,IAAI;AAAA,EAC5E,IAAI,aAAa;AAAA,IACf,SAAS,UAAU,IAAI,WAAW;AAAA,EACpC;AAAA;AAIF,SAAS,QAAQ,CAAC,UAAmB,MAAY,MAA6B;AAAA,EAC5E,IAAI,MAAK;AAAA,IACP,KAAI,OAAO,IAAI;AAAA,EACjB,EAAO;AAAA,IACL,SAAS,OAAO,IAAI;AAAA;AAAA;AASxB,SAAS,iBAAiB,CACxB,UACA,YACA,OACkB;AAAA,EAClB,MAAM,OAAO,YAAY;AAAA,EACzB,MAAM,aAAa,QAAQ,QAAQ,OAAO,IAAI,MAAM,KAAK,IAAI;AAAA,EAC7D,OAAO,SAAS,WAAW,aAAa,UAAU;AAAA;AAQpD,SAAS,eAAe,CACtB,WACA,YACA,WACA,OACM;AAAA,EACN,MAAM,QAAQ,WAAW;AAAA,EACzB,WAAW,MAAM,UAAU,iBAA8B,gBAAgB,GAAG;AAAA,IAC1E,MAAM,IAAI,YAAY,EAAE;AAAA,IACxB,IAAI,CAAC,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,WAAW,YAAY;AAAA,MACzD;AAAA,IACF;AAAA,IACA,MAAM,MAAM,EAAE,QAAQ;AAAA,IACtB,IAAI,OAAO,QAAQ,YAAY,MAAM,WAAW;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,IAAI,CAAC,WAAW,MAAM,CAAC,KAAK,MAAM,EAAE,OAAO,GAAG,GAAG;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,MAAM,KAAK,CAAC,GAAG,CAAC;AAAA,IAChB,GAAG,QAAQ,KAAK,MAAM;AAAA,IACtB,GAAG,QAAQ,SAAS,gBAAgB,EAAE;AAAA,EACxC;AAAA;AAIF,SAAS,wBAAwB,CAAC,IAAiB,WAAmB,WAAyB;AAAA,EAC7F,MAAM,UAAyB,CAAC,IAAI,GAAG,GAAG,iBAA8B,gBAAgB,CAAC;AAAA,EACzF,WAAW,KAAK,SAAS;AAAA,IACvB,MAAM,IAAI,YAAY,CAAC;AAAA,IACvB,IAAI,CAAC,KAAK,EAAE,SAAS,UAAU,UAAU,CAAC,UAAU,MAAM,CAAC,KAAK,MAAM,EAAE,OAAO,GAAG,GAAG;AAAA,MACnF;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,SAAS,gBAAgB,CAAC,GAAG,WAAW,GAAG,EAAE,MAAM,UAAU,MAAM,CAAC,CAAC;AAAA,EACjF;AAAA;AAIF,SAAS,WAAW,CAAC,IAAgC;AAAA,EACnD,MAAM,MAAM,GAAG,QAAQ;AAAA,EACvB,OAAO,QAAQ,YAAY,OAAO,YAAY,GAAG;AAAA;AAWnD,SAAS,UAAU,CACjB,KACA,MACA,WACA,KACM;AAAA,EACN,MAAM,KAAK,eAAe,WAAW,IAAI;AAAA,EACzC,MAAM,OAAO,cAAc,KAAK,IAAI;AAAA,EACpC,MAAM,eAAgB,KAAK,OAAO,aAAoD,CAAC;AAAA,EACvF,aAAa,IAAI,cAAc,MAAM,KAAK,GAAG,YAAY;AAAA;AAI3D,SAAS,SAAS,CAAC,KAAoB,MAA2B,WAA8B;AAAA,EAC9F,MAAM,KAAK,eAAe,WAAW,IAAI;AAAA,EACzC,MAAM,OAAO,cAAc,KAAK,IAAI;AAAA,EACpC,GAAG,cAAc,iBAAiB,IAAI;AAAA,EACtC,WAAW,OAAO,2BAA2B;AAAA,IAC3C,GAAG,UAAU,OAAO,GAAG;AAAA,EACzB;AAAA,EACA,MAAM,cAAc,OAAO,6BAA6B,IAAI,IAAI;AAAA,EAChE,IAAI,aAAa;AAAA,IACf,GAAG,UAAU,IAAI,WAAW;AAAA,EAC9B;AAAA;AAIF,SAAS,cAAc,CAAC,WAAwB,MAAwC;AAAA,EACtF,MAAM,aAAa,gBAAgB,IAAI;AAAA,EACvC,MAAM,MAAM,WAAW,WAAW,MAAM,OAAO,OAAO,EAAE,WAAW,KAAK,OAAO,OAAO;AAAA,EACtF,MAAM,KAAK,UAAU,cAAc,kBAAkB,OAAO;AAAA,EAC5D,IAAI,EAAE,cAAc,cAAc;AAAA,IAChC,MAAM,IAAI,MAAM,kCAAkC,YAAY;AAAA,EAChE;AAAA,EACA,OAAO;AAAA;AAOT,SAAS,aAAa,CAAC,OAAiD;AAAA,EACtE,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC;AAAA,EACF;AAAA,EACA,MAAM,MAA+B,CAAC;AAAA,EACtC,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;AAAA,IAC1C,IAAI,KAAK,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,IAAI,KAAK;AAAA,EAC5D;AAAA,EACA,OAAO;AAAA;AAOT,SAAS,gBAAgB,CAAC,MAAyC;AAAA,EACjE,MAAM,IAAK,MAAgD;AAAA,EAC3D,IAAI,KAAK,MAAM;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,MAAM,UAAU;AAAA,IACzB,OAAO,EAAE,SAAS,IAAI,IAAI,sBAAsB,CAAC,IAAI;AAAA,EACvD;AAAA,EACA,IAAI,OAAO,MAAM,YAAa,EAA8B,MAAM;AAAA,IAChE,MAAM,OAAM,OAAQ,EAA8B,IAAI;AAAA,IACtD,MAAM,QAAQ,KAAI,WAAW,UAAU,IAAI,KAAI,MAAM,CAAC,IAAI;AAAA,IAC1D,OAAO,IAAI;AAAA,EACb;AAAA,EACA,OAAO,OAAO,CAAC;AAAA;;;ACtVjB,IAAM,kBAAkB;AAGxB,IAAM,0BAA0B;AAczB,SAAS,kBAAkB,CAAC,MAAwD;AAAA,EACzF,MAAM,MAA+B,CAAC;AAAA,EACtC,WAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AAAA,IACnC,IAAI;AAAA,MAIF,MAAM,QAAQ,KAAK;AAAA,MACnB,IAAI,OAAO,UAAU,YAAY;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,MAAM,OAAO,KAAK,UAAU,KAAK;AAAA,MACjC,IAAI,SAAS,WAAW;AAAA,QAEtB,IAAI,OAAO;AAAA,QACX;AAAA,MACF;AAAA,MACA,IAAI,KAAK,SAAS,iBAAiB;AAAA,QACjC,IAAI,OAAO;AAAA,QACX;AAAA,MACF;AAAA,MACA,IAAI,OAAO,KAAK,MAAM,IAAI;AAAA,MAC1B,MAAM;AAAA,MAEN,IAAI,OAAO;AAAA;AAAA,EAEf;AAAA,EACA,OAAO;AAAA;;;ACrBT,SAAS,SAAS,CAChB,QACA,KACA,WACA,KACA;AAAA,EACA,MAAM,WAAW,kBAAkB,OAAO,GAAG,OAAO,GAAG,GAAG;AAAA,EAC1D,IAAI,CAAC,UAAU;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,OAAO,uBAAuB,UAAU,OAAO,GAAG,WAAW,GAAG;AAAA;AAIlE,IAAM,gBAAgB,IAAI,IAAI,CAAC,SAAS,aAAa,CAAC;AAQ/C,SAAS,uBAAuB,CAAC,YAAgC;AAAA,EACtE,MAAM,cAAa,cAAc;AAAA,EACjC,IAAI,CAAC,aAAY;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EACA,WAAW,MAAM,YAAY;AAAA,IAC3B,IAAI;AAAA,IACJ,IAAI,GAAG,OAAO,WAAW;AAAA,MACvB,IAAI,cAAc,IAAI,GAAG,GAAG,KAAK,GAAG,IAAI,WAAW,IAAI,GAAG;AAAA,QACxD;AAAA,MACF;AAAA,MACA,WAAW,GAAG;AAAA,IAChB,EAAO,SAAI,GAAG,OAAO,cAAc;AAAA,MACjC,WAAW,GAAG;AAAA,MACd,IAAI,WAAW,UAAU,WAAU,KAAK,WAAW,GAAG,cAAc,WAAU,GAAG;AAAA,QAC/E,OAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EAAO;AAAA,MACL,WAAW,GAAG;AAAA;AAAA,IAEhB,IAAI,WAAW,UAAU,WAAU,GAAG;AAAA,MACpC,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,iBAAiB,CAAC,MAGnB;AAAA,EACb,QAAQ,SAAS,cAAc;AAAA,EAC/B,IAAI,SAA8B;AAAA,EAGlC,IAAI,qBAA0C;AAAA,EAC9C,IAAI,YAAY;AAAA,EAIhB,IAAI,YAAkC;AAAA,EACtC,IAAI,cAAc;AAAA,EAGlB,IAAI,cAA0B;AAAA,EAG9B,IAAI,YAAoC;AAAA,EAIxC,IAAI,UAA8B;AAAA,EAClC,IAAI,UAAU;AAAA,EAGd,IAAI,aAAa;AAAA,EAQjB,IAAI,kBAAkB;AAAA,EAOtB,IAAI,mBAOO;AAAA,EACX,MAAM,MAAM,UAAU,cAAc;AAAA,EAEpC,SAAS,cAAc,GAAS;AAAA,IAC9B,IAAI,mBAAmB,KAAK;AAAA,MAC1B,IAAI,qBAAqB,eAAe;AAAA,IAC1C;AAAA,IACA,kBAAkB;AAAA,IAClB,mBAAmB;AAAA;AAAA,EAGrB,SAAS,cAAc,GAAS;AAAA,IAC9B,kBAAkB;AAAA,IAElB,MAAM,MAAM,kBAAkB,OAAO;AAAA,IACrC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,WAAW;AAAA,MACnD;AAAA,IACF;AAAA,IACA,MAAM,MAAM,gBAAgB,iBAAiB,GAAG,IAAI,WAAW;AAAA,IAC/D,IAAI,QAAQ,GAAG;AAAA,MACb;AAAA,IACF;AAAA,IACA,MAAM,SAAS,IAAI;AAAA,IACnB,IAAI,SAAS,GAAG,MAAM,gBAAgB;AAAA,IACtC,IAAI,IAAI,YAAY,QAAQ;AAAA,MAE1B;AAAA,IACF;AAAA,IACA,MAAM,UAAU,UAAU,kBAAkB,KAAK,WAAW,UAAU,aAAa;AAAA,IACnF,QAAQ,KAAK;AAAA,SAEP,iBAAiB,aACjB,EAAE,QAAQ,EAAE,GAAG,iBAAiB,GAAG,GAAG,iBAAiB,EAAE,EAAE,IAC3D,CAAC;AAAA,MACL,SAAS,iBAAiB;AAAA,MAC1B,KAAK,iBAAiB,OAAO;AAAA,MAC7B,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,IACD,kBAAkB,IAAI,sBAAsB,cAAc;AAAA;AAAA,EAS5D,SAAS,gBAAgB,CACvB,QACA,SACA,OACM;AAAA,IACN,IAAI,CAAC,OAAO,gBAAgB,OAAO,GAAG,IAAI,WAAW,MAAM,GAAG;AAAA,MAC5D,eAAe;AAAA,MACf;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,MACjB;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,SACN,QAAQ,EAAE,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,IACpD;AAAA,IACA,IAAI,CAAC,iBAAiB;AAAA,MACpB,kBAAkB,IAAI,sBAAsB,cAAc;AAAA,IAC5D;AAAA;AAAA,EAOF,MAAM,kBAAkB,iBAAiB,SAAS,UAAU,eAAe;AAAA,IACzE,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,EACtB,CAAC;AAAA,EAGD,MAAM,oBAAoB,mBAAmB,SAAS,UAAU,aAAa;AAAA,EAE7E,MAAM,iBAAiB,sBAAsB,SAAS,WAAW;AAAA,IAC/D,SAAS,MAAM;AAAA,EACjB,CAAC;AAAA,EAED,MAAM,kBAAkB,uBAAuB,SAAS,UAAU,aAAa;AAAA,EAM/E,MAAM,mBAAmB,kBAAkB,SAAS,UAAU,eAAe;AAAA,IAC3E,eAAe,CAAC,QAAQ,SAAS,QAC/B,iBAAiB,QAAQ,SAAS,EAAE,KAAK,aAAa,IAAI,CAAC;AAAA,IAC7D,KAAK,MAAM;AAAA,IACX,SAAS,MAAM;AAAA,IACf,WAAW,CAAC,QAAQ,QAClB,YAAY,UAAU,QAAQ,KAAK,WAAW,UAAU,aAAa,IAAI;AAAA,IAC3E;AAAA,EACF,CAAC;AAAA,EAID,MAAM,iBAAiB,wBAAwB,SAAS;AAAA,EASxD,MAAM,oBAAoB;AAAA,EAC1B,IAAI,mBAAmB;AAAA,EACvB,SAAS,iBAAiB,GAAS;AAAA,IACjC,MAAM,WAAW,KAAK,IAAI,UAAU,cAAc,iBAAiB;AAAA,IACnE,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,gBAAgB,KAAK,GAAG;AAAA,MAC9D,mBAAmB;AAAA,MAGnB,MAAM,OAAO,UAAU;AAAA,MACvB,MAAM,WAAW,gBAAgB,eAAe,KAAK,QAAQ,qBAAqB;AAAA,MAClF,QAAQ,KAAK,EAAE,UAAU,QAAQ,UAAU,MAAM,gBAAgB,CAAC;AAAA,IACpE;AAAA;AAAA,EAEF,MAAM,YAAY,KAAK;AAAA,EACvB,MAAM,iBAAiB,YAAY,IAAI,UAAU,MAAM,kBAAkB,CAAC,IAAI;AAAA,EAC9E,gBAAgB,QAAQ,SAAS;AAAA,EAMjC,MAAM,UAAU,CAAC,MAAkB;AAAA,IACjC,EAAE,eAAe;AAAA,IACjB,QAAQ,KAAK;AAAA,MACX,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,MAAM;AAAA,MACN,SAAS,EAAE;AAAA,MACX,UAAU,EAAE;AAAA,MACZ,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,IACP,CAAC;AAAA;AAAA,EAEH,UAAU,cAAc,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AAAA,EAiB7E,MAAM,yBAAyB;AAAA,EAC/B,IAAI,sBAAsB;AAAA,EAC1B,MAAM,mBAAmB,CAAC,MAAiB;AAAA,IACzC,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,MAAM,KAAK,IAAI;AAAA,MACrB,IAAI,MAAM,uBAAuB,wBAAwB;AAAA,QACvD,sBAAsB;AAAA,QACtB,QAAQ,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAAA,IACA,EAAE,eAAe;AAAA,IACjB,IAAI,EAAE,cAAc;AAAA,MAClB,EAAE,aAAa,aAAa;AAAA,IAC9B;AAAA,IACA,MAAM,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAAA,IAC5C,MAAM,UAAU,YACZ,UAAU,QAAQ,SAAS,WAAW,UAAU,aAAa,IAC7D;AAAA,IACJ,QAAQ,KAAK,EAAE,QAAQ,SAAS,YAAY,KAAK,SAAS,MAAM,YAAY,QAAQ,CAAC;AAAA,IACrF,iBAAiB,QAAQ,UAAU;AAAA;AAAA,EAErC,MAAM,eAAe,CAAC,MAAiB;AAAA,IACrC,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,EAAE,eAAe;AAAA,IACjB,MAAM,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAAA,IAC5C,MAAM,UAAU,YACZ,UAAU,QAAQ,SAAS,WAAW,UAAU,aAAa,IAC7D;AAAA,IACJ,QAAQ,KAAK;AAAA,MACX,SAAS;AAAA,MACT,KAAK;AAAA,MACL,aAAa,SAAS,eAAe;AAAA,MACrC,MAAM;AAAA,MACN,YAAY,SAAS,cAAc;AAAA,IACrC,CAAC;AAAA,IACD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA;AAAA,EAElB,UAAU,cAAc,iBAAiB,aAAa,kBAAkB,IAAI;AAAA,EAC5E,UAAU,cAAc,iBAAiB,YAAY,kBAAkB,IAAI;AAAA,EAC3E,UAAU,cAAc,iBAAiB,QAAQ,cAAc,IAAI;AAAA,EAEnE,MAAM,MAAM,QAAQ,UAAU,CAAC,QAAQ;AAAA,IACrC,IAAI,IAAI,SAAS,WAAW;AAAA,MAC1B,QAAQ,KAAK;AAAA,QACX,MAAM,YAAY,IAAI,OAAO,UAAU,aAAa;AAAA,QACpD,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,MACb,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,SAAS;AAAA,MACxB,QAAQ,cAAQ;AAAA,MAChB,IAAI,OAAM,aAAa;AAAA,QAErB;AAAA,MACF;AAAA,MACA,IAAI,OAAM,eAAe,CAAC,aAAa,CAAC,WAAW;AAAA,QAEjD,QAAQ,KAAK,EAAE,WAAK,MAAM,cAAc,SAAS,wBAAwB,CAAC;AAAA,QAC1E;AAAA,MACF;AAAA,MAIA,IAAI,UAAU,KAAK,wBAAwB,IAAI,UAAU,GAAG;AAAA,QAC1D,YAAY;AAAA,MACd;AAAA,MACA,IAAI;AAAA,QACF,iBAAiB,WAAW,IAAI,YAAY,WAAW,SAAS;AAAA,QAChE,QAAQ,KAAK,EAAE,WAAK,MAAM,gBAAgB,CAAC;AAAA,QAC3C,OAAO,OAAO;AAAA,QACd,QAAQ,KAAK;AAAA,UACX;AAAA,UACA,MAAM;AAAA,UACN,SAAS,OAAQ,OAAiB,WAAW,KAAK;AAAA,QACpD,CAAC;AAAA;AAAA,MAEH;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,eAAe;AAAA,MAI9B,IAAI,IAAI,QAAQ,eAAe,CAAC,WAAW;AAAA,QACzC;AAAA,MACF;AAAA,MACC,UAAkC,QAAQ,IAAI;AAAA,MAC/C,MAAM,SAAS,UAAU;AAAA,MACzB,IAAI,kBAAkB,aAAa;AAAA,QACjC,aACE,QACA,IAAI,OACH,UAAkD,UAAU,CAAC,CAChE;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,aAAa;AAAA,MAG5B,UAAU,IAAI;AAAA,MACd,UAAU,IAAI;AAAA,MACd,aAAa,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,aAAa,IAAI,SAAS,cAAc;AAAA,MAGvD,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,MACb,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,YAAY;AAAA,MAG3B,MAAM,UACJ,WAAW,YACP,UAAU,IAAI,QAAQ,SAAS,WAAW,UAAU,aAAa,IACjE;AAAA,MACN,QAAQ,KAAK,EAAE,SAAS,IAAI,SAAS,KAAK,SAAS,MAAM,YAAY,QAAQ,CAAC;AAAA,MAE9E,iBAAiB,IAAI,QAAQ,IAAI,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,QAAQ;AAAA,MAEvB,MAAM,UACJ,WAAW,YACP,UAAU,IAAI,QAAQ,SAAS,WAAW,UAAU,aAAa,IACjE;AAAA,MACN,QAAQ,KAAK;AAAA,QACX,SAAS,IAAI;AAAA,QACb,KAAK;AAAA,QACL,aAAa,SAAS,eAAe;AAAA,QACrC,MAAM;AAAA,QACN,YAAY,SAAS,cAAc;AAAA,MACrC,CAAC;AAAA,MACD,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,MACb,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB;AAAA,IACF;AAAA,IACA,IAAI,IAAI,SAAS,YAAY,IAAI,MAAM,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,IAKA,IAAI,UAAU,GAAG;AAAA,MACf,YAAY;AAAA,IACd;AAAA,IACA,YAAY,IAAI;AAAA,IAChB,QAAQ,KAAK,cAAc;AAAA,IAC3B,MAAM,SAAS,IAAI;AAAA,KACb,YAAY;AAAA,MAChB,IAAI;AAAA,QAEF,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,QACrB,QAAQ,QAAQ;AAAA,QAChB,SAAS,MAAM,uBAAuB;AAAA,UACpC;AAAA,UACA,KAAK,IAAI;AAAA,UACT,SAAS,IAAI;AAAA,UACb,WAAW;AAAA,YACT,YAAY,IAAI,IAAI,UAAU,UAAU;AAAA,YACxC,YAAY,UAAU;AAAA,YACtB,eAAe,UAAU;AAAA,YACzB,mBAAmB,UAAU;AAAA,YAC7B,mBAAmB,UAAU;AAAA,UAC/B;AAAA,UACA,MAAM,IAAI;AAAA,UACV,WAAW,IAAI;AAAA,QACjB,CAAC;AAAA,QACD,IAAI,QAAQ,WAAW;AAAA,UAErB,YAAY;AAAA,UACZ,YAAY,OAAO;AAAA,UACnB,cAAc;AAAA,UACd,cAAc,IAAI;AAAA,UAClB,QAAQ,KAAK,EAAE,KAAK,MAAM,iBAAiB,CAAC;AAAA,UAO5C,MAAM,OAAO,OAAO,IAAI;AAAA,UACxB,qBAAqB,aAAa,MAAM;AAAA,YACtC,IAAI;AAAA,cACF,QAAQ,KAAK,EAAE,KAAK,MAAM,aAAa,OAAO,mBAAmB,IAAI,EAAE,CAAC;AAAA,cACxE,MAAM;AAAA,WAGT;AAAA,UAED,kBAAkB;AAAA,QACpB;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ,KAAK;AAAA,UACX;AAAA,UACA,MAAM;AAAA,UACN,SAAS,OAAQ,OAAiB,WAAW,KAAK;AAAA,QACpD,CAAC;AAAA;AAAA,OAEF;AAAA,GACJ;AAAA,EAED,QAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC9B,OAAO,MAAM;AAAA,IACX,IAAI;AAAA,IACJ,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB,WAAW;AAAA,IAC3B,UAAU,cAAc,oBAAoB,SAAS,OAAO;AAAA,IAC5D,UAAU,cAAc,oBAAoB,aAAa,kBAAkB,IAAI;AAAA,IAC/E,UAAU,cAAc,oBAAoB,YAAY,kBAAkB,IAAI;AAAA,IAC9E,UAAU,cAAc,oBAAoB,QAAQ,cAAc,IAAI;AAAA,IACtE,qBAAqB;AAAA,IACrB,QAAQ,QAAQ;AAAA;AAAA;AAiBb,SAAS,gBAAgB,CAAC,KAA6B;AAAA,EAC5D,MAAM,SAAS,IAAI,gBAAgB,IAAI,SAAS,MAAM;AAAA,EAItD,gBAAgB,OAAO,IAAI,UAAU,CAAC;AAAA,EAMtC,MAAM,uBAAuB,OAAO,IAAI,cAAc;AAAA,EACtD,MAAM,eAAe,wBAAwB;AAAA,EAC7C,IAAI,CAAC,sBAAsB;AAAA,IACzB,QAAQ,KACN,mGACE,qFACJ;AAAA,EACF;AAAA,EACA,MAAM,YAAa,IAAI,SAAS,cAAc,iBAAiB,KAC7D,IAAI,SAAS;AAAA,EACf,MAAM,UAAU,mBAAmD;AAAA,IACjE,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,QAAQ,IAAI;AAAA,IACZ,cAAc;AAAA,IACd,OAAO,OAAO,IAAI,OAAO,KAAK;AAAA,EAChC,CAAC;AAAA,EACD,OAAO,kBAAkB,EAAE,SAAS,UAAU,CAAC;AAAA;AAIjD,IAAI,OAAO,WAAW,eAAe,OAAO,WAAW,QAAQ;AAAA,EAC7D,iBAAiB,MAA+B;AAClD;",
33
- "debugId": "FE3AC1CBD1F2F79E64756E2164756E21",
35
+ "mappings": "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",
36
+ "debugId": "861006CEFE04044264756E2164756E21",
34
37
  "names": []
35
38
  }