@weasel-js/forge 1.13.0-rc.0 → 1.13.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.
- package/dist/{FrameController-Tv3jrHyT.d.ts → FrameController-DgfVaENb.d.ts} +13 -1
- package/dist/{chunk-GH5RE5X5.js → chunk-2ZBZRBHI.js} +2 -2
- package/dist/{chunk-GH5RE5X5.js.map → chunk-2ZBZRBHI.js.map} +1 -1
- package/dist/{chunk-KEQBGDUZ.js → chunk-7XJNVJB5.js} +3 -3
- package/dist/{chunk-KEQBGDUZ.js.map → chunk-7XJNVJB5.js.map} +1 -1
- package/dist/{chunk-LTTEILXY.js → chunk-COT4I347.js} +3 -3
- package/dist/{chunk-LTTEILXY.js.map → chunk-COT4I347.js.map} +1 -1
- package/dist/{chunk-35DOPXHZ.js → chunk-GHPMNT2A.js} +13 -10
- package/dist/chunk-GHPMNT2A.js.map +1 -0
- package/dist/{chunk-STF6NQ5N.js → chunk-RVJHUY7W.js} +2 -2
- package/dist/chunk-RVJHUY7W.js.map +1 -0
- package/dist/{chunk-BUXUWAI4.js → chunk-WFT5IOHX.js} +61 -8
- package/dist/chunk-WFT5IOHX.js.map +1 -0
- package/dist/{chunk-RKQ277P5.js → chunk-XIBKYSRU.js} +5 -4
- package/dist/chunk-XIBKYSRU.js.map +1 -0
- package/dist/{config-Bd6FVlh7.d.ts → config-6fWf87Tt.d.ts} +3 -21
- package/dist/csf/preview-api.js +2 -2
- package/dist/frame/index.d.ts +14 -8
- package/dist/frame/index.js +109 -77
- package/dist/frame/index.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/library-CdTj-hFp.d.ts +21 -0
- package/dist/{mountFrame-FdJDb3TB.d.ts → mountFrame-Bs7u1ro-.d.ts} +1 -1
- package/dist/shell/index.css +2 -3
- package/dist/shell/index.css.map +1 -1
- package/dist/shell/index.d.ts +5 -4
- package/dist/shell/index.js +150 -94
- package/dist/shell/index.js.map +1 -1
- package/dist/test/index.css +2 -3
- package/dist/test/index.css.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.js +4 -4
- package/dist/vite/index.js +9 -2
- package/dist/vite/index.js.map +1 -1
- package/package.json +9 -9
- package/dist/chunk-35DOPXHZ.js.map +0 -1
- package/dist/chunk-BUXUWAI4.js.map +0 -1
- package/dist/chunk-RKQ277P5.js.map +0 -1
- package/dist/chunk-STF6NQ5N.js.map +0 -1
|
@@ -129,6 +129,12 @@ type ToFrame = {
|
|
|
129
129
|
| {
|
|
130
130
|
type: 'a11y.highlight';
|
|
131
131
|
targets: readonly (readonly string[])[];
|
|
132
|
+
}
|
|
133
|
+
/** Scrolls the frame document to `left`, `top` in CSS px: a lens's copy following its trial's frame. */
|
|
134
|
+
| {
|
|
135
|
+
type: 'scroll';
|
|
136
|
+
left: number;
|
|
137
|
+
top: number;
|
|
132
138
|
};
|
|
133
139
|
/** A message a story's frame sends the workshop. */
|
|
134
140
|
type FromFrame = {
|
|
@@ -162,6 +168,12 @@ type FromFrame = {
|
|
|
162
168
|
type: 'a11y';
|
|
163
169
|
id: string;
|
|
164
170
|
} & A11yOutcome)
|
|
171
|
+
/** Where the frame document stands, in CSS px: sent once after `ready`, then whenever it scrolls. */
|
|
172
|
+
| {
|
|
173
|
+
type: 'scroll';
|
|
174
|
+
left: number;
|
|
175
|
+
top: number;
|
|
176
|
+
}
|
|
165
177
|
/** `seq`, on a render fault only: how many `init`/`config`/`state`/`globals` messages the frame had received. */
|
|
166
178
|
| {
|
|
167
179
|
type: 'fault';
|
|
@@ -396,4 +408,4 @@ declare function startFrame({ story, channel, container, setup }: StartFrameOpti
|
|
|
396
408
|
/** Reports an import failure — there is no story to start. */
|
|
397
409
|
declare function reportImportFault(channel: Channel<ToFrame, FromFrame>, error: unknown): void;
|
|
398
410
|
|
|
399
|
-
export { type A11yFinding as A, type SectionDescription as B, type Channel as C, type
|
|
411
|
+
export { type A11yFinding as A, type SectionDescription as B, type Channel as C, type DepGraph as D, type FrameSetup as F, type Globals as G, type IndexEntry as I, type Layout as L, type MetaSpec as M, type PlayContext as P, type StartFrameOptions as S, type ToFrame as T, type Viewport as V, type ConfigAnswers as a, type FaultPhase as b, type FromFrame as c, type StorySpec as d, type ClockState as e, type SpanOverride as f, type A11yNode as g, type A11yReport as h, type ComponentDeps as i, type ComponentHistory as j, type Decorator as k, type GlobalsTarget as l, type IndexContext as m, type IndexRender as n, type IndexStoryProps as o, type LoadedStory as p, type StoryContext as q, reportImportFault as r, startFrame as s, type Span as t, type TimelineSpec as u, type CssVarReport as v, type A11yOutcome as w, type DescribedEntry as x, type DescribedShape as y, type SchemaDescription as z };
|
|
@@ -6,5 +6,5 @@ var PORT_HANDOFF = "weaselforge:port";
|
|
|
6
6
|
var FRAME_HELLO = "weaselforge:hello";
|
|
7
7
|
|
|
8
8
|
export { FRAME_HELLO, PORT_HANDOFF, PROTOCOL_VERSION };
|
|
9
|
-
//# sourceMappingURL=chunk-
|
|
10
|
-
//# sourceMappingURL=chunk-
|
|
9
|
+
//# sourceMappingURL=chunk-2ZBZRBHI.js.map
|
|
10
|
+
//# sourceMappingURL=chunk-2ZBZRBHI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/protocol/messages.ts"],"names":[],"mappings":";;;AAEO,IAAM,gBAAA,GAAmB;
|
|
1
|
+
{"version":3,"sources":["../src/protocol/messages.ts"],"names":[],"mappings":";;;AAEO,IAAM,gBAAA,GAAmB;AAmGzB,IAAM,YAAA,GAAe;AASrB,IAAM,WAAA,GAAc","file":"chunk-2ZBZRBHI.js","sourcesContent":["import type { SchemaDescription } from './schema.ts';\n\nexport const PROTOCOL_VERSION = 1;\n\n/** The workshop's toolbar globals as a story reads them, by name. */\nexport type Globals = Readonly<Record<string, unknown>>;\n/** How a story sits in its frame. */\nexport type Layout = 'centered' | 'padded' | 'fullscreen';\n/** A frame size a story asks for, in CSS pixels. */\nexport interface Viewport {\n width: number;\n height: number;\n}\n/** Where a frame's fault happened: loading the story, rendering it, or reading a message. */\nexport type FaultPhase = 'import' | 'render' | 'protocol';\n\n/** One custom property as the frame found it. */\nexport interface CssVarReport {\n name: string;\n value: string;\n /** Whether a `vars.set` override is in force on it. */\n overridden: boolean;\n /** Whether the story reads it, directly or through another property it reads. */\n used: boolean;\n}\n\n/** Visibility and validation answers, keyed by the config they were computed for. */\nexport interface ConfigAnswers {\n /** `stableStringify(config)` of the config the frame evaluated. */\n configKey: string;\n hidden: string[];\n errors: Record<string, string[]>;\n}\n\n/** One element axe faulted on, inside the frame's own document. */\nexport interface A11yNode {\n /** The CSS selectors, outermost first, that reach the element in the frame. */\n target: readonly string[];\n html: string;\n failureSummary?: string;\n}\n\n/** One axe rule's outcome on the story, with the elements it names. */\nexport interface A11yFinding {\n id: string;\n impact: 'minor' | 'moderate' | 'serious' | 'critical' | null;\n help: string;\n helpUrl: string;\n description: string;\n nodes: readonly A11yNode[];\n}\n\n/** What axe found on one story: the rules it failed, and the ones it could not decide. */\nexport interface A11yReport {\n violations: readonly A11yFinding[];\n incomplete: readonly A11yFinding[];\n /** Rules that passed, and rules no element on the page could be judged by. */\n passes: number;\n inapplicable: number;\n}\n\n/** What an axe run in the frame came back with. */\nexport type A11yOutcome = { ok: true; report: A11yReport } | { ok: false; message: string };\n\n/** A message the workshop sends a story's frame. */\nexport type ToFrame =\n | { type: 'init'; config: unknown; state: unknown; globals: Globals }\n | { type: 'config'; config: unknown }\n | { type: 'state'; state: unknown }\n | { type: 'globals'; globals: Globals }\n | { type: 'vars.set'; name: string; value: string | null }\n /** Run axe over the story's own subtree. Answered by `a11y` carrying the same `id`. */\n | { type: 'a11y.run'; id: string }\n /** Outlines the elements each `A11yNode.target` reaches, in place of the last ones; an empty list clears. */\n | { type: 'a11y.highlight'; targets: readonly (readonly string[])[] }\n /** Scrolls the frame document to `left`, `top` in CSS px: a lens's copy following its trial's frame. */\n | { type: 'scroll'; left: number; top: number };\n\n/** A message a story's frame sends the workshop. */\nexport type FromFrame =\n | { type: 'ready'; schema: SchemaDescription; layout: Layout; viewport: Viewport | null }\n /** Sent once, when the story's first render after `init` has committed. */\n | { type: 'rendered' }\n | { type: 'answers'; answers: ConfigAnswers }\n | { type: 'setConfig'; path: string; value: unknown }\n | { type: 'setState'; state: unknown }\n | { type: 'vars'; vars: CssVarReport[] }\n /** Asks the shell to show story `id` in this frame's trial in place of what it shows now. */\n | { type: 'open'; id: string }\n | ({ type: 'a11y'; id: string } & A11yOutcome)\n /** Where the frame document stands, in CSS px: sent once after `ready`, then whenever it scrolls. */\n | { type: 'scroll'; left: number; top: number }\n /** `seq`, on a render fault only: how many `init`/`config`/`state`/`globals` messages the frame had received. */\n | { type: 'fault'; phase: FaultPhase; message: string; stack?: string; seq?: number };\n\nexport interface Envelope<M> {\n v: number;\n msg: M;\n}\n\n/** Posted on the frame's window with the port transferred alongside it, as a `PortHandoff`. */\nexport const PORT_HANDOFF = 'weaselforge:port';\n\n/** What the shell posts with the port: `id` names what the frame shows, a story or an index. */\nexport interface PortHandoff {\n type: typeof PORT_HANDOFF;\n id: string;\n}\n\n/** Posted by a frame document to its parent as soon as its entry runs, asking for a port. */\nexport const FRAME_HELLO = 'weaselforge:hello';\n\nexport { stableStringify } from '@weasel-js/core';\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { stableStringify } from './chunk-
|
|
1
|
+
import { stableStringify } from './chunk-2ZBZRBHI.js';
|
|
2
2
|
import { createContext } from 'react';
|
|
3
3
|
import { isPlainObject } from '@weasel-js/core';
|
|
4
4
|
|
|
@@ -93,5 +93,5 @@ function withUnsent(sent, original) {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
export { ArgsContext, appliedLocal, coverOf, isPortSafe, portSafePart, withUnsent };
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
97
|
-
//# sourceMappingURL=chunk-
|
|
96
|
+
//# sourceMappingURL=chunk-7XJNVJB5.js.map
|
|
97
|
+
//# sourceMappingURL=chunk-7XJNVJB5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/csf/argsContext.ts","../src/csf/portSafe.ts"],"names":[],"mappings":"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","file":"chunk-KEQBGDUZ.js","sourcesContent":["import { type Context, createContext, type Dispatch, type SetStateAction } from 'react';\nimport { stableStringify } from '../protocol/messages';\n\ntype Args = Record<string, unknown>;\n\n/** A frame-local arg, and the config value it was set over: it applies only while config still holds that. */\nexport interface LocalArg {\n value: unknown;\n over: string;\n}\n\nexport type LocalArgs = Record<string, LocalArg>;\n\n/** A config value in the form `LocalArg.over` records. */\nexport const coverOf = (value: unknown): string => stableStringify(value) ?? ' undefined';\n\n/** The frame-local values that still apply over `config`. */\nexport const appliedLocal = (local: LocalArgs, config: Args): Args =>\n Object.fromEntries(\n Object.entries(local)\n .filter(([key, entry]) => coverOf(config[key]) === entry.over)\n .map(([key, entry]) => [key, entry.value]),\n );\n\nexport interface ArgsScope {\n /** The args the story renders with: its own, then config, then the frame-local ones that still apply. */\n args: Args;\n /** The trial's config as it stands. An `undefined` key means the story's own arg. */\n config: Args;\n defaults: Args;\n /** The story's own args, before config and the frame-local ones. */\n original: Args;\n setConfig: (path: string, value: unknown) => void;\n /** Args a MessagePort would not deliver intact, kept in the frame because config crosses one. */\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nexport const ArgsContext: Context<ArgsScope | null> = createContext<ArgsScope | null>(null);\n","import { isPlainObject } from '@weasel-js/core';\n\nconst g = globalThis as Record<string, unknown>;\nconst CLONED_WHOLE = new Set<unknown>(\n [\n 'Date',\n 'RegExp',\n 'ArrayBuffer',\n 'DataView',\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float16Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array',\n ]\n .map((name) => (g[name] as { prototype?: object } | undefined)?.prototype)\n .filter(Boolean),\n);\n\n/** Own keys a clone keeps: enumerable string keys, plus an array's `length`. */\nconst hasOnlyClonedKeys = (v: object): boolean =>\n Reflect.ownKeys(v).every(\n (key) =>\n typeof key === 'string' &&\n (Object.prototype.propertyIsEnumerable.call(v, key) || (Array.isArray(v) && key === 'length')),\n );\n\n/**\n * Whether a MessagePort delivers `value` as the same thing it was. `structuredClone` succeeding is\n * not enough: it copies a class instance's fields onto a plain object and drops its methods.\n */\nexport function isPortSafe(value: unknown): boolean {\n const seen = new Set<object>();\n const safe = (v: unknown): boolean => {\n if (v === null) return true;\n if (typeof v !== 'object') return typeof v !== 'function' && typeof v !== 'symbol';\n if (seen.has(v)) return true;\n seen.add(v);\n const proto = Object.getPrototypeOf(v);\n if (CLONED_WHOLE.has(proto)) return true;\n if (proto === Map.prototype)\n return hasOnlyClonedKeys(v) && [...(v as Map<unknown, unknown>)].every(([key, member]) => safe(key) && safe(member));\n if (proto === Set.prototype) return hasOnlyClonedKeys(v) && [...(v as Set<unknown>)].every(safe);\n if (proto !== Array.prototype && proto !== Object.prototype && proto !== null) return false;\n return hasOnlyClonedKeys(v) && Object.values(v).every(safe);\n };\n try {\n return safe(value);\n } catch {\n return false;\n }\n}\n\n/** A plain object or array whose members can be split: React elements are plain objects, but whole. */\nconst splittable = (v: unknown): v is Record<string, unknown> | unknown[] =>\n (Array.isArray(v) ? Object.getPrototypeOf(v) === Array.prototype : isPlainObject(v) && !('$$typeof' in v)) &&\n hasOnlyClonedKeys(v as object);\n\n/**\n * The part of `value` a port delivers intact, or null when none of it can cross. A plain object\n * keeps its port-safe fields; an array holds null where a member has no part.\n */\nexport function portSafePart(value: unknown): { value: unknown } | null {\n const walking = new Set<object>();\n const part = (v: unknown): { value: unknown } | null => {\n if (isPortSafe(v)) return { value: v };\n if (!splittable(v) || walking.has(v)) return null;\n walking.add(v);\n try {\n if (Array.isArray(v)) return { value: v.map((member) => part(member)?.value ?? null) };\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(v)) {\n const kept = part(member);\n if (kept) out[key] = kept.value;\n }\n return { value: out };\n } finally {\n walking.delete(v);\n }\n };\n try {\n return part(value);\n } catch {\n return null;\n }\n}\n\n/** `sent`, a value that crossed the port as `portSafePart(original)` or an edit of it, with what the part left behind put back. */\nexport function withUnsent(sent: unknown, original: unknown): unknown {\n if (isPortSafe(original)) return sent;\n if (sent === null && portSafePart(original) === null) return original;\n if (Array.isArray(original) && Array.isArray(sent))\n return sent.map((member, i) => (i < original.length ? withUnsent(member, original[i]) : member));\n if (!splittable(original) || Array.isArray(original) || !isPlainObject(sent)) return sent;\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(original)) {\n if (key in sent) out[key] = withUnsent(sent[key], member);\n else if (portSafePart(member) === null) out[key] = member;\n }\n for (const [key, member] of Object.entries(sent)) if (!(key in original)) out[key] = member;\n return out;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/csf/argsContext.ts","../src/csf/portSafe.ts"],"names":[],"mappings":"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","file":"chunk-7XJNVJB5.js","sourcesContent":["import { type Context, createContext, type Dispatch, type SetStateAction } from 'react';\nimport { stableStringify } from '../protocol/messages';\n\ntype Args = Record<string, unknown>;\n\n/** A frame-local arg, and the config value it was set over: it applies only while config still holds that. */\nexport interface LocalArg {\n value: unknown;\n over: string;\n}\n\nexport type LocalArgs = Record<string, LocalArg>;\n\n/** A config value in the form `LocalArg.over` records. */\nexport const coverOf = (value: unknown): string => stableStringify(value) ?? ' undefined';\n\n/** The frame-local values that still apply over `config`. */\nexport const appliedLocal = (local: LocalArgs, config: Args): Args =>\n Object.fromEntries(\n Object.entries(local)\n .filter(([key, entry]) => coverOf(config[key]) === entry.over)\n .map(([key, entry]) => [key, entry.value]),\n );\n\nexport interface ArgsScope {\n /** The args the story renders with: its own, then config, then the frame-local ones that still apply. */\n args: Args;\n /** The trial's config as it stands. An `undefined` key means the story's own arg. */\n config: Args;\n defaults: Args;\n /** The story's own args, before config and the frame-local ones. */\n original: Args;\n setConfig: (path: string, value: unknown) => void;\n /** Args a MessagePort would not deliver intact, kept in the frame because config crosses one. */\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nexport const ArgsContext: Context<ArgsScope | null> = createContext<ArgsScope | null>(null);\n","import { isPlainObject } from '@weasel-js/core';\n\nconst g = globalThis as Record<string, unknown>;\nconst CLONED_WHOLE = new Set<unknown>(\n [\n 'Date',\n 'RegExp',\n 'ArrayBuffer',\n 'DataView',\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float16Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array',\n ]\n .map((name) => (g[name] as { prototype?: object } | undefined)?.prototype)\n .filter(Boolean),\n);\n\n/** Own keys a clone keeps: enumerable string keys, plus an array's `length`. */\nconst hasOnlyClonedKeys = (v: object): boolean =>\n Reflect.ownKeys(v).every(\n (key) =>\n typeof key === 'string' &&\n (Object.prototype.propertyIsEnumerable.call(v, key) || (Array.isArray(v) && key === 'length')),\n );\n\n/**\n * Whether a MessagePort delivers `value` as the same thing it was. `structuredClone` succeeding is\n * not enough: it copies a class instance's fields onto a plain object and drops its methods.\n */\nexport function isPortSafe(value: unknown): boolean {\n const seen = new Set<object>();\n const safe = (v: unknown): boolean => {\n if (v === null) return true;\n if (typeof v !== 'object') return typeof v !== 'function' && typeof v !== 'symbol';\n if (seen.has(v)) return true;\n seen.add(v);\n const proto = Object.getPrototypeOf(v);\n if (CLONED_WHOLE.has(proto)) return true;\n if (proto === Map.prototype)\n return hasOnlyClonedKeys(v) && [...(v as Map<unknown, unknown>)].every(([key, member]) => safe(key) && safe(member));\n if (proto === Set.prototype) return hasOnlyClonedKeys(v) && [...(v as Set<unknown>)].every(safe);\n if (proto !== Array.prototype && proto !== Object.prototype && proto !== null) return false;\n return hasOnlyClonedKeys(v) && Object.values(v).every(safe);\n };\n try {\n return safe(value);\n } catch {\n return false;\n }\n}\n\n/** A plain object or array whose members can be split: React elements are plain objects, but whole. */\nconst splittable = (v: unknown): v is Record<string, unknown> | unknown[] =>\n (Array.isArray(v) ? Object.getPrototypeOf(v) === Array.prototype : isPlainObject(v) && !('$$typeof' in v)) &&\n hasOnlyClonedKeys(v as object);\n\n/**\n * The part of `value` a port delivers intact, or null when none of it can cross. A plain object\n * keeps its port-safe fields; an array holds null where a member has no part.\n */\nexport function portSafePart(value: unknown): { value: unknown } | null {\n const walking = new Set<object>();\n const part = (v: unknown): { value: unknown } | null => {\n if (isPortSafe(v)) return { value: v };\n if (!splittable(v) || walking.has(v)) return null;\n walking.add(v);\n try {\n if (Array.isArray(v)) return { value: v.map((member) => part(member)?.value ?? null) };\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(v)) {\n const kept = part(member);\n if (kept) out[key] = kept.value;\n }\n return { value: out };\n } finally {\n walking.delete(v);\n }\n };\n try {\n return part(value);\n } catch {\n return null;\n }\n}\n\n/** `sent`, a value that crossed the port as `portSafePart(original)` or an edit of it, with what the part left behind put back. */\nexport function withUnsent(sent: unknown, original: unknown): unknown {\n if (isPortSafe(original)) return sent;\n if (sent === null && portSafePart(original) === null) return original;\n if (Array.isArray(original) && Array.isArray(sent))\n return sent.map((member, i) => (i < original.length ? withUnsent(member, original[i]) : member));\n if (!splittable(original) || Array.isArray(original) || !isPlainObject(sent)) return sent;\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(original)) {\n if (key in sent) out[key] = withUnsent(sent[key], member);\n else if (portSafePart(member) === null) out[key] = member;\n }\n for (const [key, member] of Object.entries(sent)) if (!(key in original)) out[key] = member;\n return out;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { stableStringify } from './chunk-
|
|
1
|
+
import { stableStringify } from './chunk-2ZBZRBHI.js';
|
|
2
2
|
import { valueAtPath, isConfigBranch } from '@weasel-js/labkit/config';
|
|
3
3
|
import { isPlainObject } from '@weasel-js/core';
|
|
4
4
|
|
|
@@ -148,5 +148,5 @@ function storyHref(story, knobs = {}, params = {}) {
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
export { PLAYHEAD_PARAM, RESERVED_PARAMS, decodeKnob, encodeKnob, formatRoute, knobParams, knobPaths, knobsToParams, paramsToKnobs, parseRoute, reservedParams, sameKnob, storyHref };
|
|
151
|
-
//# sourceMappingURL=chunk-
|
|
152
|
-
//# sourceMappingURL=chunk-
|
|
151
|
+
//# sourceMappingURL=chunk-COT4I347.js.map
|
|
152
|
+
//# sourceMappingURL=chunk-COT4I347.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/route/url.ts"],"names":[],"mappings":"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","file":"chunk-LTTEILXY.js","sourcesContent":["import { type ConfigSchema, type ConfigShape, isConfigBranch, valueAtPath } from '@weasel-js/labkit/config';\nimport { isPlainObject } from '@weasel-js/core';\nimport { stableStringify } from '../protocol/messages';\n\n/**\n * Forge's URL, as pure functions: `#/<story id>?<params>`. The story and its params share the hash, so the page's\n * own query string stays the host's. A param is a knob — a story arg, addressed by its dotted config path\n * (`look.px`) — unless its name is reserved for the workshop itself.\n */\n\n/** The param a paused playhead is held in, in seconds. */\nexport const PLAYHEAD_PARAM = 't';\n\n/** Param names that are never knobs. */\nexport const RESERVED_PARAMS: ReadonlySet<string> = new Set([PLAYHEAD_PARAM]);\n\n/** Config keys forge keeps for itself, such as the `$globals` pins, start with this and never reach the URL. */\nconst INTERNAL_PREFIX = '$';\n\n/** What a forge hash holds: the story it names, and every param after it, knobs and reserved alike, in order. */\nexport interface ForgeRoute {\n story: string | null;\n params: Readonly<Record<string, string>>;\n}\n\n/** Reads a hash (`location.hash`, with or without its `#`). Anything not in the `#/<id>` form names no story. */\nexport function parseRoute(hash: string): ForgeRoute {\n const body = hash.startsWith('#') ? hash.slice(1) : hash;\n if (!body.startsWith('/')) return { story: null, params: {} };\n const at = body.indexOf('?');\n const path = at === -1 ? body.slice(1) : body.slice(1, at);\n let story: string | null;\n try {\n story = decodeURIComponent(path) || null;\n } catch {\n story = null;\n }\n const params: Record<string, string> = {};\n if (at !== -1) for (const [key, value] of new URLSearchParams(body.slice(at + 1))) params[key] = value;\n return { story, params };\n}\n\n/** The hash for `route`, with its leading `#`. The inverse of `parseRoute`. */\nexport function formatRoute(route: ForgeRoute): string {\n const query = new URLSearchParams(Object.entries(route.params)).toString();\n return `#/${encodeURIComponent(route.story ?? '')}${query ? `?${query}` : ''}`;\n}\n\n/** Whether a param name can be a knob: not reserved and not one of forge's own config keys. */\nexport function isKnobParam(name: string): boolean {\n return name !== '' && !RESERVED_PARAMS.has(name) && !name.startsWith(INTERNAL_PREFIX);\n}\n\n/** The params that are knobs, with the reserved ones left out. */\nexport function knobParams(params: Readonly<Record<string, string>>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).filter(([name]) => isKnobParam(name)));\n}\n\n/** The params that are not knobs. Kept as they are when the knobs are rewritten. */\nexport function reservedParams(params: Readonly<Record<string, string>>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).filter(([name]) => !isKnobParam(name)));\n}\n\n/** What a knob's value is decoded against: its schema leaf's declared kind, its default, and its choices. */\nexport interface KnobLeaf {\n kind: string | null;\n default: unknown;\n annotations?: { options?: readonly { value: string }[] };\n}\n\ntype Codec = 'number' | 'boolean' | 'string' | 'enum' | 'json';\n\n/** How a leaf's value travels: by its declared kind first, then by the type of its default. */\nfunction codecOf(leaf: KnobLeaf): Codec | null {\n switch (leaf.kind) {\n case 'number':\n case 'boolean':\n case 'string':\n case 'enum':\n return leaf.kind;\n case 'color':\n return 'string';\n case 'list':\n case 'json':\n return 'json';\n }\n const d = leaf.default;\n if (typeof d === 'number' || typeof d === 'boolean' || typeof d === 'string') return typeof d as Codec;\n return Array.isArray(d) || isPlainObject(d) ? 'json' : null;\n}\n\n/** A value as one param. Undefined for a value no param can carry, such as a function. */\nexport function encodeKnob(value: unknown): string | undefined {\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n return String(value);\n case 'object':\n return value !== null && (Array.isArray(value) || isPlainObject(value)) ? JSON.stringify(value) : undefined;\n default:\n return undefined;\n }\n}\n\n/** Whether `value` is something a leaf of codec `codec` could hold, so a well-formed param of the wrong type is refused. */\nfunction fits(codec: Codec, value: unknown, leaf: KnobLeaf): boolean {\n if (codec !== 'json') return true;\n const d = leaf.default;\n if (Array.isArray(d)) {\n if (!Array.isArray(value)) return false;\n return leaf.kind !== 'list' || value.every((item) => typeof item === 'string');\n }\n if (isPlainObject(d)) return isPlainObject(value);\n return true;\n}\n\n/**\n * One param read as `leaf`'s type: `{ value }`, or undefined for a param that does not parse as one — a number that\n * is not a number, an option the enum does not list, malformed JSON. A bare boolean param (`?dark`) reads as true.\n */\nexport function decodeKnob(raw: string, leaf: KnobLeaf): { value: unknown } | undefined {\n const codec = codecOf(leaf);\n switch (codec) {\n case 'number': {\n const n = raw.trim() === '' ? Number.NaN : Number(raw);\n return Number.isNaN(n) ? undefined : { value: n };\n }\n case 'boolean':\n if (raw === '' || raw === 'true' || raw === '1') return { value: true };\n if (raw === 'false' || raw === '0') return { value: false };\n return undefined;\n case 'string':\n return { value: raw };\n case 'enum': {\n const options = leaf.annotations?.options;\n return !options || options.some((o) => o.value === raw) ? { value: raw } : undefined;\n }\n case 'json': {\n try {\n const value: unknown = JSON.parse(raw);\n return fits(codec, value, leaf) ? { value } : undefined;\n } catch {\n return undefined;\n }\n }\n default:\n return undefined;\n }\n}\n\n/** One leaf a URL can address: its dotted path, and what its value decodes against. */\nexport interface KnobPath {\n path: string;\n leaf: KnobLeaf;\n}\n\n/** Every leaf of `schema` a param can carry, in schema order, with branches flattened into dotted paths. */\nexport function knobPaths(schema: Pick<ConfigSchema<unknown>, 'nodes'>): KnobPath[] {\n const out: KnobPath[] = [];\n const walk = (shape: ConfigShape, at: string): void => {\n for (const [key, entry] of Object.entries(shape)) {\n if (key.startsWith(INTERNAL_PREFIX) || key.includes('.')) continue;\n const path = at === '' ? key : `${at}.${key}`;\n if (isConfigBranch(entry)) walk(entry.children, path);\n else if (codecOf(entry) !== null) out.push({ path, leaf: entry });\n }\n };\n walk(schema.nodes, '');\n return out;\n}\n\n/** Whether two knob values are the same value, compared as data. */\nexport function sameKnob(a: unknown, b: unknown): boolean {\n return Object.is(a, b) || stableStringify(a) === stableStringify(b);\n}\n\n/**\n * The knob params for `config`: one per leaf whose value differs from its default, keyed by dotted path, in schema\n * order. A leaf absent from `config` is at its default.\n */\nexport function knobsToParams(schema: Pick<ConfigSchema<unknown>, 'nodes'>, config: unknown): Record<string, string> {\n const params: Record<string, string> = {};\n for (const { path, leaf } of knobPaths(schema)) {\n const value = valueAtPath(config, path);\n if (value === undefined || sameKnob(value, leaf.default)) continue;\n const encoded = encodeKnob(value);\n if (encoded !== undefined) params[path] = encoded;\n }\n return params;\n}\n\n/**\n * The knob values `params` sets, by dotted path, each coerced to its leaf's type. A param naming no leaf, a reserved\n * param, and one that does not parse as its leaf's type are left out rather than failing the rest.\n */\nexport function paramsToKnobs(\n schema: Pick<ConfigSchema<unknown>, 'nodes'>,\n params: Readonly<Record<string, string>>,\n): Record<string, unknown> {\n const knobs: Record<string, unknown> = {};\n for (const { path, leaf } of knobPaths(schema)) {\n const raw = params[path];\n if (raw === undefined || !isKnobParam(path)) continue;\n const decoded = decodeKnob(raw, leaf);\n if (decoded) knobs[path] = decoded.value;\n }\n return knobs;\n}\n\n/**\n * A link to a story at a given state, for a host that has no schema to hand: each knob is a dotted path and a value,\n * encoded by its own type. `params` adds workshop params, such as `t`.\n */\nexport function storyHref(\n story: string,\n knobs: Readonly<Record<string, unknown>> = {},\n params: Readonly<Record<string, string>> = {},\n): string {\n const encoded: Record<string, string> = {};\n for (const [path, value] of Object.entries(knobs)) {\n const raw = encodeKnob(value);\n if (raw !== undefined && isKnobParam(path)) encoded[path] = raw;\n }\n return formatRoute({ story, params: { ...encoded, ...reservedParams(params) } });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/route/url.ts"],"names":[],"mappings":"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","file":"chunk-COT4I347.js","sourcesContent":["import { type ConfigSchema, type ConfigShape, isConfigBranch, valueAtPath } from '@weasel-js/labkit/config';\nimport { isPlainObject } from '@weasel-js/core';\nimport { stableStringify } from '../protocol/messages';\n\n/**\n * Forge's URL, as pure functions: `#/<story id>?<params>`. The story and its params share the hash, so the page's\n * own query string stays the host's. A param is a knob — a story arg, addressed by its dotted config path\n * (`look.px`) — unless its name is reserved for the workshop itself.\n */\n\n/** The param a paused playhead is held in, in seconds. */\nexport const PLAYHEAD_PARAM = 't';\n\n/** Param names that are never knobs. */\nexport const RESERVED_PARAMS: ReadonlySet<string> = new Set([PLAYHEAD_PARAM]);\n\n/** Config keys forge keeps for itself, such as the `$globals` pins, start with this and never reach the URL. */\nconst INTERNAL_PREFIX = '$';\n\n/** What a forge hash holds: the story it names, and every param after it, knobs and reserved alike, in order. */\nexport interface ForgeRoute {\n story: string | null;\n params: Readonly<Record<string, string>>;\n}\n\n/** Reads a hash (`location.hash`, with or without its `#`). Anything not in the `#/<id>` form names no story. */\nexport function parseRoute(hash: string): ForgeRoute {\n const body = hash.startsWith('#') ? hash.slice(1) : hash;\n if (!body.startsWith('/')) return { story: null, params: {} };\n const at = body.indexOf('?');\n const path = at === -1 ? body.slice(1) : body.slice(1, at);\n let story: string | null;\n try {\n story = decodeURIComponent(path) || null;\n } catch {\n story = null;\n }\n const params: Record<string, string> = {};\n if (at !== -1) for (const [key, value] of new URLSearchParams(body.slice(at + 1))) params[key] = value;\n return { story, params };\n}\n\n/** The hash for `route`, with its leading `#`. The inverse of `parseRoute`. */\nexport function formatRoute(route: ForgeRoute): string {\n const query = new URLSearchParams(Object.entries(route.params)).toString();\n return `#/${encodeURIComponent(route.story ?? '')}${query ? `?${query}` : ''}`;\n}\n\n/** Whether a param name can be a knob: not reserved and not one of forge's own config keys. */\nexport function isKnobParam(name: string): boolean {\n return name !== '' && !RESERVED_PARAMS.has(name) && !name.startsWith(INTERNAL_PREFIX);\n}\n\n/** The params that are knobs, with the reserved ones left out. */\nexport function knobParams(params: Readonly<Record<string, string>>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).filter(([name]) => isKnobParam(name)));\n}\n\n/** The params that are not knobs. Kept as they are when the knobs are rewritten. */\nexport function reservedParams(params: Readonly<Record<string, string>>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).filter(([name]) => !isKnobParam(name)));\n}\n\n/** What a knob's value is decoded against: its schema leaf's declared kind, its default, and its choices. */\nexport interface KnobLeaf {\n kind: string | null;\n default: unknown;\n annotations?: { options?: readonly { value: string }[] };\n}\n\ntype Codec = 'number' | 'boolean' | 'string' | 'enum' | 'json';\n\n/** How a leaf's value travels: by its declared kind first, then by the type of its default. */\nfunction codecOf(leaf: KnobLeaf): Codec | null {\n switch (leaf.kind) {\n case 'number':\n case 'boolean':\n case 'string':\n case 'enum':\n return leaf.kind;\n case 'color':\n return 'string';\n case 'list':\n case 'json':\n return 'json';\n }\n const d = leaf.default;\n if (typeof d === 'number' || typeof d === 'boolean' || typeof d === 'string') return typeof d as Codec;\n return Array.isArray(d) || isPlainObject(d) ? 'json' : null;\n}\n\n/** A value as one param. Undefined for a value no param can carry, such as a function. */\nexport function encodeKnob(value: unknown): string | undefined {\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n return String(value);\n case 'object':\n return value !== null && (Array.isArray(value) || isPlainObject(value)) ? JSON.stringify(value) : undefined;\n default:\n return undefined;\n }\n}\n\n/** Whether `value` is something a leaf of codec `codec` could hold, so a well-formed param of the wrong type is refused. */\nfunction fits(codec: Codec, value: unknown, leaf: KnobLeaf): boolean {\n if (codec !== 'json') return true;\n const d = leaf.default;\n if (Array.isArray(d)) {\n if (!Array.isArray(value)) return false;\n return leaf.kind !== 'list' || value.every((item) => typeof item === 'string');\n }\n if (isPlainObject(d)) return isPlainObject(value);\n return true;\n}\n\n/**\n * One param read as `leaf`'s type: `{ value }`, or undefined for a param that does not parse as one — a number that\n * is not a number, an option the enum does not list, malformed JSON. A bare boolean param (`?dark`) reads as true.\n */\nexport function decodeKnob(raw: string, leaf: KnobLeaf): { value: unknown } | undefined {\n const codec = codecOf(leaf);\n switch (codec) {\n case 'number': {\n const n = raw.trim() === '' ? Number.NaN : Number(raw);\n return Number.isNaN(n) ? undefined : { value: n };\n }\n case 'boolean':\n if (raw === '' || raw === 'true' || raw === '1') return { value: true };\n if (raw === 'false' || raw === '0') return { value: false };\n return undefined;\n case 'string':\n return { value: raw };\n case 'enum': {\n const options = leaf.annotations?.options;\n return !options || options.some((o) => o.value === raw) ? { value: raw } : undefined;\n }\n case 'json': {\n try {\n const value: unknown = JSON.parse(raw);\n return fits(codec, value, leaf) ? { value } : undefined;\n } catch {\n return undefined;\n }\n }\n default:\n return undefined;\n }\n}\n\n/** One leaf a URL can address: its dotted path, and what its value decodes against. */\nexport interface KnobPath {\n path: string;\n leaf: KnobLeaf;\n}\n\n/** Every leaf of `schema` a param can carry, in schema order, with branches flattened into dotted paths. */\nexport function knobPaths(schema: Pick<ConfigSchema<unknown>, 'nodes'>): KnobPath[] {\n const out: KnobPath[] = [];\n const walk = (shape: ConfigShape, at: string): void => {\n for (const [key, entry] of Object.entries(shape)) {\n if (key.startsWith(INTERNAL_PREFIX) || key.includes('.')) continue;\n const path = at === '' ? key : `${at}.${key}`;\n if (isConfigBranch(entry)) walk(entry.children, path);\n else if (codecOf(entry) !== null) out.push({ path, leaf: entry });\n }\n };\n walk(schema.nodes, '');\n return out;\n}\n\n/** Whether two knob values are the same value, compared as data. */\nexport function sameKnob(a: unknown, b: unknown): boolean {\n return Object.is(a, b) || stableStringify(a) === stableStringify(b);\n}\n\n/**\n * The knob params for `config`: one per leaf whose value differs from its default, keyed by dotted path, in schema\n * order. A leaf absent from `config` is at its default.\n */\nexport function knobsToParams(schema: Pick<ConfigSchema<unknown>, 'nodes'>, config: unknown): Record<string, string> {\n const params: Record<string, string> = {};\n for (const { path, leaf } of knobPaths(schema)) {\n const value = valueAtPath(config, path);\n if (value === undefined || sameKnob(value, leaf.default)) continue;\n const encoded = encodeKnob(value);\n if (encoded !== undefined) params[path] = encoded;\n }\n return params;\n}\n\n/**\n * The knob values `params` sets, by dotted path, each coerced to its leaf's type. A param naming no leaf, a reserved\n * param, and one that does not parse as its leaf's type are left out rather than failing the rest.\n */\nexport function paramsToKnobs(\n schema: Pick<ConfigSchema<unknown>, 'nodes'>,\n params: Readonly<Record<string, string>>,\n): Record<string, unknown> {\n const knobs: Record<string, unknown> = {};\n for (const { path, leaf } of knobPaths(schema)) {\n const raw = params[path];\n if (raw === undefined || !isKnobParam(path)) continue;\n const decoded = decodeKnob(raw, leaf);\n if (decoded) knobs[path] = decoded.value;\n }\n return knobs;\n}\n\n/**\n * A link to a story at a given state, for a host that has no schema to hand: each knob is a dotted path and a value,\n * encoded by its own type. `params` adds workshop params, such as `t`.\n */\nexport function storyHref(\n story: string,\n knobs: Readonly<Record<string, unknown>> = {},\n params: Readonly<Record<string, string>> = {},\n): string {\n const encoded: Record<string, string> = {};\n for (const [path, value] of Object.entries(knobs)) {\n const raw = encodeKnob(value);\n if (raw !== undefined && isKnobParam(path)) encoded[path] = raw;\n }\n return formatRoute({ story, params: { ...encoded, ...reservedParams(params) } });\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isNative, ClockContext } from './chunk-L5XM5VKB.js';
|
|
2
2
|
import { isSafeOverride, storyNameFromExport, storyId, PROP_ARG_TYPES_EXPORT } from './chunk-5WS67HMU.js';
|
|
3
|
-
import { portSafePart, appliedLocal, withUnsent, coverOf, ArgsContext } from './chunk-
|
|
3
|
+
import { portSafePart, appliedLocal, withUnsent, coverOf, ArgsContext } from './chunk-7XJNVJB5.js';
|
|
4
4
|
import { useVisibleRaf, useLatest, isPlainObject } from '@weasel-js/core';
|
|
5
5
|
import { createContext, useSyncExternalStore, useRef, useEffect, useState, Component, useLayoutEffect, useContext, createElement } from 'react';
|
|
6
6
|
import { createEmitter } from '@weasel-js/registry';
|
|
@@ -898,6 +898,11 @@ function useNearViewport(ref, margin, initial = true) {
|
|
|
898
898
|
return near;
|
|
899
899
|
}
|
|
900
900
|
var scopeOf = (id) => `[data-fg-host="${id}"]`;
|
|
901
|
+
function applyGlobalsTo(host, hostId, globals, setup) {
|
|
902
|
+
const target = createGlobalsTarget(host, scopeOf(hostId));
|
|
903
|
+
setup.applyGlobals?.(globals, target);
|
|
904
|
+
return () => target.dispose();
|
|
905
|
+
}
|
|
901
906
|
function useHostConditions(host, opts) {
|
|
902
907
|
const { hostId, globals, overrides: persisted, setup } = opts;
|
|
903
908
|
const latest = useLatest({ setup });
|
|
@@ -923,15 +928,13 @@ function useHostConditions(host, opts) {
|
|
|
923
928
|
for (const [name, value] of Object.entries(persisted)) overrides.set(name, value);
|
|
924
929
|
applied.current = { ...persisted };
|
|
925
930
|
}, [host, hostId, persisted]);
|
|
926
|
-
useLayoutEffect(
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
return () => target.dispose();
|
|
931
|
-
}, [host, hostId, globals, latest]);
|
|
931
|
+
useLayoutEffect(
|
|
932
|
+
() => host ? applyGlobalsTo(host, hostId, globals, latest.current.setup) : void 0,
|
|
933
|
+
[host, hostId, globals, latest]
|
|
934
|
+
);
|
|
932
935
|
return overridesRef;
|
|
933
936
|
}
|
|
934
937
|
|
|
935
|
-
export { IN_VIEW_MARGIN, StoryHost, auditElement, createA11yHighlighter, createGlobalsTarget, createOverrides, cssRulesOf, indexRenderOf, loadStories, resolveCssVar, runAxe, scanCssVars, useClockLoop, useHostConditions, useNearViewport, useStoryClock, varRefs };
|
|
936
|
-
//# sourceMappingURL=chunk-
|
|
937
|
-
//# sourceMappingURL=chunk-
|
|
938
|
+
export { IN_VIEW_MARGIN, StoryHost, applyGlobalsTo, auditElement, createA11yHighlighter, createGlobalsTarget, createOverrides, cssRulesOf, indexRenderOf, loadStories, resolveCssVar, runAxe, scanCssVars, useClockLoop, useHostConditions, useNearViewport, useStoryClock, varRefs };
|
|
939
|
+
//# sourceMappingURL=chunk-GHPMNT2A.js.map
|
|
940
|
+
//# sourceMappingURL=chunk-GHPMNT2A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/frame/a11y.ts","../src/frame/a11yHighlight.ts","../src/frame/cssVarUse.ts","../src/frame/cssVars.ts","../src/frame/globalsTarget.ts","../src/timeline/useClockLoop.ts","../src/timeline/clock.ts","../src/timeline/StoryClock.tsx","../src/frame/StoryHost.tsx","../src/csf/argsToSchema.ts","../src/timeline/declare.ts","../src/csf/loadCsfModule.tsx","../src/story/native.ts","../src/story/load.ts","../src/frame/useNearViewport.ts","../src/shell/hostConditions.ts"],"names":["last","raf","useEffect","jsx","value","isPlainObject","useContext","useState","config","f","useLatest","useRef"],"mappings":";;;;;;;;;;;AAqBA,IAAM,OAAA,uBAAc,GAAA,CAAI,CAAC,SAAS,UAAA,EAAY,SAAA,EAAW,UAAU,CAAC,CAAA;AAEpE,SAAS,QAAQ,IAAA,EAA+B;AAC9C,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,EAAA;AAC9B,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAK,MAAA,GAAmC,IAAA;AAAA,IAClE,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA;AAAA,MAE/B,QAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,SAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,IAAI,CAAE,CAAA;AAAA,MACvF,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAI,KAAK,cAAA,KAAmB,MAAA,GAAY,EAAC,GAAI,EAAE,cAAA,EAAgB,IAAA,CAAK,cAAA;AAAe,KACrF,CAAE;AAAA,GACJ;AACF;AAEA,IAAI,OAAA,GAAqC,IAAA;AAGzC,SAAS,OAAA,GAA8B;AACrC,EAAA,OAAA,KAAY,OAAO,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAS,GAAA,CAA2C,WAAY,GAA4B,CAAA;AACjI,EAAA,OAAO,OAAA;AACT;AAGO,IAAM,UAAA,GAAgC;AAAA,EAC3C,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,wBAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAA;AAQA,IAAI,IAAA,GAAyB,QAAQ,OAAA,EAAQ;AAG7C,eAAsB,OAAO,OAAA,EAAkB,EAAE,OAAO,IAAA,EAAK,GAAmB,EAAC,EAAwB;AACvG,EAAA,MAAM,GAAA,GAAM,MAAM,OAAA,EAAQ;AAC1B,EAAA,MAAM,QAAQ,IAAA,GAAO,MAAA,GAAY,MAAA,CAAO,WAAA,CAAY,WAAW,GAAA,CAAI,CAAC,EAAA,KAAO,CAAC,IAAI,EAAE,OAAA,EAAS,KAAA,EAAO,CAAC,CAAC,CAAA;AACpG,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,GAAA,CAAI,SAAS,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,MAAS,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAClC,EAAA,IAAA,GAAO,OAAA;AACP,EAAA,MAAM,SAAS,MAAM,OAAA;AACrB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,IACzC,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,IACzC,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,IACtB,YAAA,EAAc,OAAO,YAAA,CAAa;AAAA,GACpC;AACF;AAGA,eAAsB,YAAA,CAAa,SAAkB,OAAA,EAA+C;AAClG,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,EAC5D,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EACtF;AACF;;;ACpFA,IAAM,GAAA,GAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYL,SAAS,aAAA,CAAc,KAAe,MAAA,EAA2C;AACtF,EAAA,IAAI,KAAA,GAA+B,GAAA;AACnC,EAAA,IAAI,KAAA,GAAwB,IAAA;AAC5B,EAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC7B,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,KAAA,CAAM,cAAc,QAAQ,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,KAAA,GACJ,KAAA,CAAM,UAAA,IAAe,KAAA,CAA4B,eAAA;AACnD,IAAA,IAAI,OAAO,KAAA,GAAQ,KAAA;AAAA,EACrB;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,sBAAsB,GAAA,EAAgC;AACpE,EAAA,IAAI,KAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,QAA6C,EAAC;AAClD,EAAA,MAAM,OAAO,GAAA,CAAI,WAAA;AAEjB,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAA,MAAW,EAAE,EAAA,EAAI,GAAA,EAAI,IAAK,KAAA,EAAO;AAC/B,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,GAAA,CAAI,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,CAAA;AAC7B,MAAA,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAA,CAAA;AAC3B,MAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC/B,MAAA,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAA,MAAW,EAAE,GAAA,EAAI,IAAK,KAAA,MAAW,MAAA,EAAO;AACxC,IAAA,KAAA,GAAQ,EAAC;AACT,IAAA,IAAA,EAAM,mBAAA,CAAoB,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA;AAC/C,IAAA,IAAA,EAAM,mBAAA,CAAoB,UAAU,KAAK,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,OAAA,EAAS;AACZ,MAAA,KAAA,EAAM;AACN,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,WAAW,aAAA,CAAc,GAAA,EAAK,MAAM,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,OAAO,IAAI,CAAA;AAC/F,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,GAAA,CAAI,cAAc,OAAO,CAAA;AACjC,QAAA,KAAA,CAAM,YAAA,CAAa,gCAAgC,EAAE,CAAA;AACrD,QAAA,KAAA,CAAM,WAAA,GAAc,GAAA;AACpB,QAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MACvB;AACA,MAAA,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO;AAC3B,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,QAAA,GAAA,CAAI,YAAA,CAAa,0BAA0B,EAAE,CAAA;AAC7C,QAAA,GAAA,CAAI,YAAA,CAAa,eAAe,MAAM,CAAA;AACtC,QAAA,GAAA,CAAI,IAAA,CAAK,OAAO,GAAG,CAAA;AACnB,QAAA,OAAO,EAAE,IAAI,GAAA,EAAI;AAAA,MACnB,CAAC,CAAA;AACD,MAAA,KAAA,EAAM;AACN,MAAA,IAAA,EAAM,gBAAA,CAAiB,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA;AAC5C,MAAA,IAAA,EAAM,gBAAA,CAAiB,UAAU,KAAK,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,EAAM;AACN,MAAA,KAAA,EAAO,MAAA,EAAO;AACd,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,GACF;AACF;;;ACtFA,IAAM,OAAA,GAAU,qBAAA;AAChB,IAAM,WAAA,GAAc,uCAAA;AAEpB,IAAM,QAAA,GAAW,sMAAA;AACjB,IAAM,UAAA,GAAa,CAAA;AAGZ,SAAS,OAAA,CAAQ,IAAA,EAAc,IAAA,mBAAoB,IAAI,KAAI,EAAgB;AAChF,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AACnC,EAAA,KAAA,MAAW,GAAG,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAK,CAAA;AAC7D,EAAA,OAAO,IAAA;AACT;AAQA,SAAS,KAAA,CAAM,UAAkB,IAAA,EAAsB;AACrD,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA,CAAQ,UAAU,EAAE,CAAA,CAAE,MAAK,IAAK,GAAA;AACzD,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,KAAM,MAAM,KAAA,EAAO,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,KAAK,IAAA,EAAK;AAAA,EACtI,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,EACrC;AACF;AAGA,SAAS,SAAA,CAAU,KAAA,EAAe,IAAA,EAAgC,KAAA,EAAiC;AACjG,EAAA,KAAA,MAAW,GAAG,IAAA,EAAM,KAAK,KAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG;AACzD,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAK,CAAA,wBAAS,GAAA,EAAY;AAChD,IAAA,OAAA,CAAQ,OAAQ,IAAI,CAAA;AACpB,IAAA,IAAA,CAAK,GAAA,CAAI,MAAO,IAAI,CAAA;AAAA,EACtB;AACA,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAQ,WAAA,EAAa,EAAE,GAAG,KAAK,CAAA;AAC1D;AAEA,SAAS,QAAQ,IAAA,EAAuB;AACtC,EAAA,MAAM,OAAO,IAAA,CAAK,OAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,OAAO,IAAA,GAAO,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AACnE;AAEA,SAAS,IAAA,CAAK,KAAA,EAAoB,IAAA,EAAe,IAAA,EAAgC,OAAoB,MAAA,EAAsB;AACzH,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,MAAM,WAAY,IAAA,CAAyD,UAAA;AAC3E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AACjC,MAAA,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,MAAM,KAAK,CAAA;AACxC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAY,IAAA,CAA8C,QAAA;AAChE,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAE5B,MAAA,IAAI,UAAU,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,KAAa,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAe,KAAA,CAAO,IAAA,CAAsB,cAAc,IAAI,CAAA;AACpE,IAAA,IAAI,EAAA,CAAG,MAAA,IAAU,EAAA,CAAG,KAAA,EAAO,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAA,EAAM,EAAA,CAAG,MAAA,GAAS,KAAA,GAAQ,IAAI,CAAA;AAAA,EACpF;AACF;AAEO,SAAS,WAAW,KAAA,EAA0C;AACnE,EAAA,IAAI;AACF,IAAA,OAAO,KAAA,CAAM,QAAA;AAAA,EACf,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,WAAA,CAAY,KAAe,IAAA,EAA4B;AACrE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAyB;AAC1C,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AAC/C,IAAA,MAAM,KAAA,GAAQ,WAAW,KAAK,CAAA;AAC9B,IAAA,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,EAC1C;AACA,EAAA,KAAA,MAAW,MAAM,KAAA,CAAM,IAAA,CAAK,IAAI,gBAAA,CAAiB,SAAS,CAAC,CAAA,EAAG;AAC5D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAC/B,IAAA,IAAI,MAAA,IAAU,EAAA,CAAG,QAAA,CAAS,IAAI,GAAG,SAAA,CAAU,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA,EAAI,IAAA,EAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAAA,EACxG;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,EAAI;AACvB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,GAAA,CAAI,IAAI,KAAK,EAAC,EAAG,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,IAAA;AACT;;;AChGA,IAAM,UAAU,CAAC,IAAA,EAAc,UAAuB,KAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAG9E,SAAS,SAAA,CAAU,OAAsB,KAAA,EAA0B;AACjE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,KAAA,CAAM,QAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AAEN,IAAA;AAAA,EACF;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,MAAM,WAAY,IAAA,CAAyD,UAAA;AAC3E,IAAA,IAAI,QAAA,EAAU,SAAA,CAAU,QAAA,EAAU,KAAK,CAAA;AAAA,SAClC,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAAA,EAClC;AACF;AAOO,SAAS,YACd,GAAA,EACA,UAAA,GAAwC,MAAM,KAAA,EAC9C,IAAA,GAAgB,IAAI,eAAA,EACJ;AAChB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,iBAAiB,SAAS,CAAC,CAAA,EAAG,OAAA,CAAQ,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,IAAI,KAAK,CAAA;AAC3G,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,SAAA,CAAU,OAAO,KAAK,CAAA;AAEvE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,EAAK,KAAA,EAAO,IAAI,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,EAAK,IAAI,CAAA;AAClC,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CACb,IAAA,EAAK,CACL,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,IAAI,IAAI,CAAA,IAAK,EAAA,EAAI,UAAA,EAAY,UAAA,CAAW,IAAI,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAE,CAAE,CAAA;AAChH;AAEA,SAAS,aAAA,CAAc,GAAA,EAAe,KAAA,EAAyB,IAAA,EAAoC;AACjG,EAAA,MAAM,OAAO,GAAA,CAAI,WAAA;AACjB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AACtC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,gBAAA,CAAiB,IAAI,EAAE,IAAA,EAAK;AAC9C,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,SAC5B,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,QAAQ,IAAA,KAAS,GAAA,CAAI,eAAA,GAAmB,GAAA,CAAI,QAAQ,IAAA,GAAQ,IAAA;AAClE,EAAA,KAAA,MAAW,EAAA,IAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,GAAG,CAAC,CAAA,GAAI,EAAC,EAAG;AAClF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACtC,IAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,QAAQ,KAAA,CAAM,gBAAA,CAAiB,QAAQ,CAAC,CAAE,EAAE,IAAA,EAAK;AACvD,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAI,KAAK,CAAA;AAC7B,MAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAA,EAC5B;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,aAAA,CAAc,GAAA,EAAe,IAAA,EAAc,IAAA,GAAgB,IAAI,eAAA,EAAyB;AACtG,EAAA,OAAO,aAAA,CAAc,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,IAAK,EAAA;AACvD;AAeO,SAAS,eAAA,CAAgB,GAAA,EAAe,KAAA,GAAQ,OAAA,EAAoB;AACzE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,EAAA,KAAA,CAAM,YAAA,CAAa,qBAAqB,EAAE,CAAA;AAG1C,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,KAAA,CAAM,UAAA,KAAe,GAAA,CAAI,IAAA,EAAM;AACjC,MAAA,IAAI,OAAO,KAAA,CAAM,kBAAA;AACjB,MAAA,OAAO,IAAA,EAAM,YAAA,CAAa,mBAAmB,CAAA,SAAU,IAAA,CAAK,kBAAA;AAC5D,MAAA,IAAI,SAAS,IAAA,EAAM;AAAA,IACrB;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACvB,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA,oBAAA,CAAA;AAG7B,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAA,CAAM,cAAc,MAAA,CAAO,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAA,GAAA,CAAA,GAAQ,EAAA;AACzD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,QAAQ,IAAI,cAAA,CAAe,IAAA,EAAM,KAAK,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAM,KAAK,CAAA;AACvG,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AACjD,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,IAAI,EAAE,IAAA,EAAK;AACrD,MAAA,OAAO,KAAA,IAAS,cAAA,CAAe,IAAA,EAAM,KAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA,GAAI,EAAC;AAAA,IAC5E,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,GAAG,QAAQ,CAAA;AAAA,EAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA,GAAU,EAAA;AAAA,EACrF,CAAA;AAEA,EAAA,QAAA,EAAS;AACT,EAAA,MAAM,WAAW,OAAO,gBAAA,KAAqB,cAAc,IAAA,GAAO,IAAI,iBAAiB,QAAQ,CAAA;AAC/F,EAAA,QAAA,EAAU,QAAQ,GAAA,CAAI,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,MAAM,KAAA,EAAO;AACf,MAAA,IAAI,KAAA,KAAU,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,WACjC,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAC3B,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AAAA,IACA,GAAA,EAAK,CAAC,IAAA,KAAS,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,IAC9B,IAAA,EAAM,CAAC,IAAA,KAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,IACnC,OAAA,GAAU;AACR,MAAA,QAAA,EAAU,UAAA,EAAW;AACrB,MAAA,KAAA,CAAM,MAAA,EAAO;AAAA,IACf;AAAA,GACF;AACF;;;ACzHO,SAAS,mBAAA,CAAoB,MAAmB,KAAA,EAAwD;AAC7G,EAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,EAAA,IAAI,KAAA,GAAiC,IAAA;AACrC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAM,GAAA,EAAK;AACT,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,GAAA,CAAI,cAAc,OAAO,CAAA;AACjC,QAAA,KAAA,CAAM,YAAA,CAAa,mBAAmB,KAAK,CAAA;AAC3C,QAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MACvB;AACA,MAAA,KAAA,CAAM,WAAA,GAAc,GAAA;AAAA,IACtB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,EAAO,MAAA,EAAO;AACd,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,GACF;AACF;AC1BA,IAAM,KAAA,GAAQ,MAAM,MAAM;AAAC,CAAA;AAC3B,IAAM,aAAa,MAAM,KAAA;AAIlB,SAAS,YAAA,CAAa,OAAqB,MAAA,EAAiC;AACjF,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,KAAA,EAAO,SAAA,IAAa,KAAA,EAAO,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA,EAAI,CAAE,OAAA,GAAU,UAAU,CAAA;AAC9G,EAAA,MAAMA,KAAAA,GAAO,OAAsB,IAAI,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,aAAA;AAAA,IACV,CAAC,KAAKC,IAAAA,KAAQ;AACZ,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,OAAOD,KAAAA,CAAK,OAAA;AAClB,MAAAA,MAAK,OAAA,GAAU,GAAA;AACf,MAAA,IAAI,IAAA,KAAS,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AACxC,MAAA,IAAI,MAAM,GAAA,EAAI,CAAE,OAAA,EAASC,KAAI,OAAA,EAAQ;AAAA,IACvC,CAAA;AAAA,IACA;AAAA,MACE,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,MAC3B,UAAU,MAAM;AACd,QAAAD,MAAK,OAAA,GAAU,IAAA;AAAA,MACjB;AAAA;AACF,GACF;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAAA,MAAK,OAAA,GAAU,IAAA;AACf,IAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,IAAA,OAAO,MAAM,IAAI,MAAA,EAAO;AAAA,EAC1B,CAAA,EAAG,CAAC,OAAA,EAAS,GAAG,CAAC,CAAA;AACnB;ACAO,SAAS,OAAO,IAAA,EAA0B;AAC/C,EAAA,MAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,KAAK,CAAA,GAAK,KAAK,KAAA,GAAmB,CAAA;AACrE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,QAAQ,KAAK,IAAA,CAAK,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,QAAA,GAAW,CAAA;AACvF,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,GAAQ,QAAA,EAAS;AACxC;AAEO,SAAS,SAAA,CAAU,MAAY,CAAA,EAAmB;AACvD,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,SAAU,IAAA,CAAK,KAAA;AACjC,EAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,EAAK,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,CAAC,CAAC,CAAA;AACnD;AAGO,SAAS,OAAA,CAAQ,OAAmB,OAAA,EAA6B;AACtE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA;AAC3B,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,KAAA,CAAM,IAAA;AAC7B,EAAA,MAAM,SAAS,GAAA,GAAM,KAAA;AACrB,EAAA,IAAI,MAAA,IAAU,GAAG,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAChE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,GAAO,OAAA,GAAU,KAAA,CAAM,IAAA;AAC1C,EAAA,IAAI,QAAQ,GAAA,EAAK,OAAO,EAAE,GAAG,KAAA,EAAO,MAAM,IAAA,EAAK;AAC/C,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAM,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,KAAA,EAAM;AAC9D,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAM,KAAA,GAAA,CAAU,IAAA,GAAO,SAAS,MAAA,EAAQ;AAC7D;AAEA,IAAM,SAAA,GAAY,CAAC,IAAA,KAA6C,OAAO,IAAA,KAAS,YAAY,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,GAAO,CAAA;AA4B5H,IAAM,MAAA,GAAS,CAAC,IAAA,EAAY,SAAA,KAC1B,SAAA,KAAc,OAAO,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,IAAA,EAAM,SAAS,CAAA;AAGtD,SAAS,WAAA,CAAY,MAAoB,OAAA,EAAgC;AAC9E,EAAA,IAAI,QAAA,GAAW,OAAO,IAAI,CAAA;AAC1B,EAAA,IAAI,QAAA,GAAwB,IAAA;AAG5B,EAAA,IAAI,SAAA,GAA4C,EAAE,IAAA,EAAM,OAAA,IAAW,IAAA,EAAK;AACxE,EAAA,IAAI,KAAA,GAAoB;AAAA,IACtB,IAAA,EAAM,MAAA,CAAO,QAAA,EAAU,SAAA,CAAU,IAAI,CAAA;AAAA,IACrC,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,KAAK,IAAA,IAAQ,IAAA;AAAA,IACnB,MAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI,KAAK,IAAA,GAAO,CAAA;AAAA,IACzC,IAAA,EAAM;AAAA,GACR;AACA,EAAA,MAAM,UAAU,aAAA,EAAc;AAC9B,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KACjB,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,IAAA,IAAQ,SAAA,CAAU,IAAA,KAAS,EAAA,CAAG,IAAA,GAAO,SAAA,CAAU,IAAA,GAAO,IAAA;AAExF,EAAA,IAAI,OAAA,GAAU,UAAU,KAAK,CAAA;AAE7B,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAA2B;AACtC,IAAA,MAAM,WAAA,GAAc,UAAU,IAAI,CAAA;AAClC,IAAA,IACE,WAAA,KAAgB,OAAA,IAChB,IAAA,CAAK,IAAA,KAAS,KAAA,CAAM,IAAA,IACpB,IAAA,CAAK,OAAA,KAAY,KAAA,CAAM,OAAA,IACvB,IAAA,CAAK,IAAA,KAAS,KAAA,CAAM,IAAA,IACpB,IAAA,CAAK,IAAA,KAAS,KAAA,CAAM,IAAA,IACpB,IAAA,CAAK,IAAA,CAAK,KAAA,KAAU,KAAA,CAAM,IAAA,CAAK,KAAA,IAC/B,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,IAAA,CAAK,GAAA;AAE7B,MAAA;AACF,IAAA,KAAA,GAAQ,IAAA;AACR,IAAA,OAAA,GAAU,WAAA;AACV,IAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,EACf,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAA2B;AACxC,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,GAAA,CAAI,IAAI,CAAA;AAAA,EACV,CAAA;AACA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAM,OAAO,QAAA,IAAY,QAAA;AACzB,IAAA,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,YAAY,MAAA,CAAO,IAAA,EAAM,SAAA,CAAU,IAAI,IAAI,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,EACtG,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,MAAM,KAAA;AAAA,IACX,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,IAAA,GAAO;AACL,MAAA,IAAI,MAAM,OAAA,EAAS;AAEnB,MAAA,KAAA,CAAM,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,IACvG,CAAA;AAAA,IACA,KAAA,EAAO,MAAM,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AAAA,IAC7C,IAAA,EAAM,CAAC,IAAA,KAAS,KAAA,CAAM,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAI,GAAG,CAAA;AAAA,IACrE,QAAQ,IAAA,EAAM;AACZ,MAAA,SAAA,GAAY,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,IAAI,CAAA,GAAI,OAAO,IAAA,EAAK;AACrD,MAAA,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,SAAA,CAAU,IAAI,CAAA,EAAG,CAAA;AAAA,IAC5E,CAAA;AAAA,IACA,SAAS,MAAM,OAAA;AAAA,IACf,OAAA,EAAS,CAAC,IAAA,KAAS,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,MAAM,CAAA;AAAA,IACzC,QAAQ,IAAA,EAAM;AACZ,MAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,MAAM,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,QAAQ,IAAA,EAAM;AACZ,MAAA,QAAA,GAAW,IAAA,GAAO,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AACjC,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IACA,QAAQ,IAAA,EAAM;AACZ,MAAA,QAAA,GAAW,OAAO,IAAI,CAAA;AACtB,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,MAAM,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,IAClD;AAAA,GACF;AACF;ACvJO,SAAS,aAAA,CAAc,MAA2B,OAAA,EAA4C;AACnG,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAS,MAAO,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,CAAA,GAAI,IAAK,CAAA;AACrF,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,IAAA,IAAQ,CAAC,KAAA,EAAO;AAClB,IAAA,OAAA,GAAU,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,CAAA;AACrC,IAAA,QAAA,CAAS,OAAO,CAAA;AAAA,EAClB,CAAA,MAAA,IAAW,CAAC,IAAA,IAAQ,KAAA,EAAO;AACzB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf;AACA,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA,GAAK,IAAA;AAC/D,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,WAAW,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,MAAM,CAAC,CAAA;AAC7B,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,aAAa,MAAM,IAAA;AAEzB,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAS,EAAgD;AACjF,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAC5C,EAAA,YAAA,CAAa,KAAK,CAAA;AAClB,EAAA,2BAAQ,YAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EAAO,OAAQ,QAAA,EAAS,CAAA;AACxD;AAMO,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAS,EAAiE;AACxH,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAY,CAAA;AACrC,EAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,EAAU,OAAO,QAAA;AACrC,EAAA,2BAAQ,QAAA,EAAA,EAAS,IAAA,EAAM,MAAM,QAAA,CAAS,MAAM,GAAI,QAAA,EAAS,CAAA;AAC3D;AChCA,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,GAAA,EAAI,EAAyD;AACzF,EAAA,OAAO,KAAA,CAAM,OAAO,GAAG,CAAA;AACzB;AAEA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,GAAA,EAAK,YAAW,EAA4D;AACtG,EAAA,IAAI,QAAyB,sBAAMC,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAc,GAAA,EAAU,CAAA;AACxE,EAAA,KAAA,MAAW,YAAY,CAAC,GAAG,MAAM,UAAA,EAAY,GAAG,UAAU,CAAA,EAAG;AAC3D,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,KAAA,GAAQ,MAAM,QAAA,CAAS,OAAA,EAAS,GAAG,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,KAAA,EAAM;AACf;AAQO,IAAM,SAAA,GAAN,cAAwB,SAAA,CAAyC;AAAA,EAC7D,KAAA,GAAuB,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AAAA,EAE5F,OAAO,wBAAA,CAAyB,KAAA,EAAuB,KAAA,EAAqD;AAC1G,IAAA,OAAO,KAAA,CAAM,QAAA,KAAa,KAAA,CAAM,QAAA,GAAW,IAAA,GAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC3G;AAAA,EAEA,OAAO,yBAAyB,KAAA,EAAwC;AACtE,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAK;AAAA,EAC/B;AAAA,EAES,kBAAkB,KAAA,EAAsB;AAC/C,IAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,EAC1B;AAAA,EAES,MAAA,GAAoB;AAC3B,IAAA,IAAI,IAAA,CAAK,MAAM,MAAA,EAAQ;AACrB,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AACvB,MAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAE,CAAA;AAAA,IAClG;AACA,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,UAAA,KAAe,IAAA,CAAK,KAAA;AACxC,IAAA,uBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,MAAA,EACxC,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,GAAA,EAAU,YAAwB,CAAA,EAC7D,CAAA;AAAA,EAEJ;AACF;ACCA,SAAS,UAAU,OAAA,EAAmC;AACpD,EAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AACpB,EAAA,IAAI,OAAA,KAAY,OAAO,OAAO,KAAA;AAC9B,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,EAAE,MAAM,OAAA,EAAQ;AACxD,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAK,OAAA,EAAS,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,KAAK,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AACjH;AAEA,SAAS,cAAc,OAAA,EAAmC;AACxD,EAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,EAAA,OAAO,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,GAAK,IAAA,GAAoB,IAAA;AACpG;AAEA,SAAS,SAAS,KAAA,EAA6B;AAC7C,EAAA,QAAQ,OAAO,KAAA;AAAO,IACpB,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,IACvB,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,CAAE,QAAQ,KAAK,CAAA;AAAA,IACxB,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,IACvB;AACE,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,aAAA,CAAc,KAAK,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA;AAAA;AAEtF;AAQA,SAAS,WAAW,OAAA,EAA0F;AAC5G,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAwB,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC3E,EAAA,IAAI,QAAQ,MAAA,KAAW,OAAA,CAAQ,UAAU,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AACtE,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAgB,GAAA,KAAgB;AAC9C,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACzB,IAAA,OAAO,KAAA,EAAO,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA;AAAA,EAC/E,CAAA;AACA,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAG,KAAK,EAAE,IAAA,CAAK,CAAC,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,CAAO,GAAG,GAAG,CAAA,KAAM,MAAS,CAAC,CAAA;AAC3G,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,IAAA;AAC9B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,EAAQ,GAAG,CAAA;AAC/B,IAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,SAAS,EAAC;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,EAAE,OAAO,IAAA,CAAK,CAAA;AAC3E,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,EAAE,IAAA,EAAM,UAAU,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,GAAG,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA,IAAK,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,EAAE,KAAK,QAAA,EAAS;AACzB;AAEA,SAAS,QAAA,CAAS,KAAA,EAAoB,KAAA,EAAgB,IAAA,EAA4C;AAChG,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAK,CAAA,GAAI,QAAQ,EAAC;AAC7C,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACtD,IAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AACpC,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAAA,EAC1B;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AACnD;AAGA,SAAS,MAAA,CAAO,OAAiB,KAAA,EAA6B;AAC5D,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,CAAE,QAAQ,KAAgB,CAAA;AAAA,IACnC,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAO,KAAe,CAAA;AAAA,IACjC,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAO,KAAe,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,KAAA,CAAM,MAAM,MAAA,GAAS,CAAA,GAAI,EAAE,IAAA,CAAK,KAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AAAA,IACzE,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,MAAS,CAAA;AAC1C,MAAA,OAAO,IAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,EAAC,EAAG,IAAI,CAAA,GAAwB,IAAA;AAAA,IACvF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAC5B,MAAA,OAAO,IAAI,UAAA,CAAW,aAAA,CAAc,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,OAAO,CAAA;AAAA,IACnG;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAS,GAAI,KAAA;AAC1B,MAAA,MAAM,OAAO,aAAA,CAAc,KAAK,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA;AACjD,MAAA,MAAM,QAAQ,MAAA,CAAO,WAAA;AAAA,QACnB,CAAC,GAAG,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM,CAAC,IAAA,EAAM,EAAE,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,IAAA,KAAS,IAAA,GAAO,KAAA,GAAQ,MAAA,EAAW,GAAG,CAAA,IAAK,EAAE,CAAC,CAAC;AAAA,OACxH;AACA,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,OAAA;AAC5E,MAAA,OAAO,IAAI,SAAA,CAAU,KAAA,EAAO,IAAA,CAAK,WAAA,EAAa,KAAK,OAAO,CAAA;AAAA,IAC5D;AAAA,IACA;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAGA,SAAS,UAAA,CAAW,SAAkB,KAAA,EAA6B;AACjE,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,MAAA,CAAO,OAAA,CAAQ,MAAM,KAAK,CAAA,GAAI,IAAA,KAAS,QAAA,CAAS,KAAK,CAAA;AAC9E;AAEA,SAAS,OAAA,CAAQ,MAAmC,OAAA,EAAkB;AACpE,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,OAAA,CAAQ,GAAA,KAAQ,MAAA,EAAW,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,GAAG,CAAA;AACpG,EAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,QAAiB,GAAA,CAAI,IAAA,CAAK,QAAQ,IAAI,CAAA;AAC3D,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CAAW,OAAA,EAAkB,OAAA,EAAkB,GAAA,EAAc,KAAA,EAA6B;AACjG,EAAA,MAAM,OAAA,GAAU,cAAc,OAAO,CAAA;AAErC,EAAA,MAAM,GAAA,GAAM,MAAU,GAAA,GAAM,KAAA,GAAQ,MAAA;AACpC,EAAA,QAAQ,QAAQ,IAAA;AAAM,IACpB,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAO,OAAA,CAAQ,CAAA,CAAE,OAAO,GAAA,EAAK,GAAG,OAAO,CAAA;AAC7C,MAAA,OAAO,OAAA,CAAQ,QAAQ,MAAA,IAAa,OAAA,CAAQ,QAAQ,MAAA,GAAY,IAAA,CAAK,OAAM,GAAI,IAAA;AAAA,IACjF;AAAA,IACA,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,GAAA,GAAM,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA,EAAO,GAAI,IAAA;AAAA,IAC5D,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,CAAA;AAAA,IACxB,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,IACjC,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,CAAE,MAAA,CAAO,GAAA,EAAK,CAAA;AAAA,IACvB,KAAK,QAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,MAAA,EAAW;AACd,MAAA,IAAI,CAAC,OAAA,EAAS,OAAO,OAAA,CAAQ,IAAA,KAAS,UAAa,GAAA,GAAM,UAAA,CAAW,OAAA,EAAS,KAAK,CAAA,GAAI,IAAA;AACtF,MAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AAAA,QACb,GAAA,EAAY;AAAA,QACZ,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,CAACC,MAAAA,KAAU;AAC7B,UAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,CAAMA,MAAK,CAAC,CAAA;AACrC,UAAA,OAAO,EAAE,KAAA,EAAAA,MAAAA,EAAO,KAAA,EAAOA,MAAAA,EAAO,GAAI,GAAA,GAAM,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,EAAC,EAAG;AAAA,QAC9D,CAAC,CAAA,GAAI;AAAA,OACP;AACA,MAAA,OAAO,OAAA,CAAQ,SAAS,OAAA,IAAW,OAAA,CAAQ,SAAS,cAAA,GAAiB,IAAA,CAAK,OAAM,GAAI,IAAA;AAAA,IACtF;AAAA,IACA,KAAK,QAAA;AACH,MAAA,OAAO,GAAA,GAAA,CAAO,OAAA,CAAQ,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,KAAS,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,IAChG;AACE,MAAA,OAAO,GAAA,GAAM,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAAA;AAErC;AAGA,SAAS,YAAY,SAAA,EAAgF;AACnG,EAAA,IAAI,EAAE,KAAA,IAAS,SAAA,CAAA,EAAY,OAAO,IAAA;AAClC,EAAA,MAAM,EAAE,KAAI,GAAI,SAAA;AAChB,EAAA,OAAO,CAAC,MAAA,KAAW;AACjB,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,UAAU,MAAA,KAAW,MAAA,EAAW,OAAQ,KAAA,KAAU,WAAe,SAAA,CAAU,MAAA;AAC/E,IAAA,IAAI,QAAQ,SAAA,EAAW,OAAO,OAAO,EAAA,CAAG,KAAA,EAAO,UAAU,EAAE,CAAA;AAC3D,IAAA,IAAI,KAAA,IAAS,WAAW,OAAO,CAAC,OAAO,EAAA,CAAG,KAAA,EAAO,UAAU,GAAG,CAAA;AAC9D,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,MAAO,SAAA,CAAU,MAAA,IAAU,IAAA,CAAA;AAAA,EACjD,CAAA;AACF;AAUA,SAAS,OAAA,CAAQ,GAAA,EAAa,KAAA,EAAgB,OAAA,EAA8B,QAAA,EAAwC;AAClH,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAA,EAAS,OAAA,KAAY,MAAA,IAAa,aAAA,CAAc,OAAA,IAAW,EAAE,CAAA,EAAG,OAAO,IAAA;AACxG,EAAA,OAAO,QAAA,CAAS,OAAO,IAAA,CAAK,GAAG,IAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AACtD;AAGO,SAAS,YAAA,CACd,IAAA,EACA,QAAA,EACA,QAAA,GAA4B,EAAC,EACN;AACvB,EAAA,MAAM,QAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,GAAA,oBAAO,IAAI,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAC,CAAA,EAAG;AAC3E,IAAA,MAAM,MAAM,GAAA,IAAO,IAAA;AAEnB,IAAA,MAAM,OAAO,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,IAAA;AAC7C,IAAA,IAAI,GAAA,IAAO,CAAC,IAAA,EAAM;AAClB,IAAA,MAAM,QAAQ,IAAA,EAAM,KAAA;AACpB,IAAA,MAAM,OAAA,GAAU,SAAS,GAAG,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,OAAA,GAAU,SAAA,CAAU,OAAO,CAAA,GAAI,KAAA;AAE/C,IAAA,IAAI,IAAA,GAAA,CACD,MAAM,OAAA,CAAQ,GAAA,EAAK,OAAO,OAAA,EAAS,QAAQ,IAAI,IAAA,MAC/C,OAAA,GAAU,WAAW,OAAA,EAAS,OAAA,IAAW,EAAC,EAAG,GAAA,EAAK,KAAK,CAAA,GAAI,GAAA,GAAM,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA,CAAA;AACtF,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,OAAA,KAAY,QAAQ,OAAA,KAAY,KAAA,IAAS,QAAQ,KAAA,EAAO,OAAA,CAAA,EAAU,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO;AACzF,IAAA,IAAI,SAAS,WAAA,EAAa,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,QAAQ,WAAW,CAAA;AAClE,IAAA,IAAI,SAAS,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,IAAI,CAAA;AACjD,IAAA,MAAM,YAAY,OAAA,EAAS,EAAA,GAAK,WAAA,CAAY,OAAA,CAAQ,EAAE,CAAA,GAAI,IAAA;AAC1D,IAAA,IAAI,SAAA,EAAW,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC3C,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,EACf;AACA,EAAA,OAAO,CAAA,CAAE,OAAO,KAAoB,CAAA;AACtC;;;ACzQA,IAAM,MAAA,GAAS,CAAC,KAAA,KACd,CAAC,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,OAAQ,KAAA,CAAiC,QAAA,KAAa,QAAA;AAIzF,SAAS,UAAA,CACd,KAAA,EACA,KAAA,GAAsC,CAAC,WAAW,MAAA,EACN;AAC5C,EAAA,IAAI,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,MAAM,KAAA;AAChC,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY,OAAO,CAAC,MAAA,KAAY,KAAA,CAA2C,KAAA,CAAM,MAAM,CAAC,CAAA;AAC7G,EAAA,OAAO,IAAA;AACT;;;ACsCA,IAAM,OAAA,GAA6B,CAAC,UAAA,EAAY,QAAA,EAAU,YAAY,CAAA;AAEtE,IAAM,OAAA,GAAU,CAAK,KAAA,KAAqC,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAG1H,IAAM,mBAAmB,CAAC,IAAA,KACxB,MAAA,CAAO,WAAA,CAAY,OAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS,CAAC,CAAA;AAGpF,IAAM,OAAA,GAAU,CAAC,GAAA,EAAa,MAAA,KAC5B,MAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,CAAO,SAAS,GAAG,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,KAAM,IAAA;AAGvE,SAAS,qBAAqB,OAAA,EAA2E;AACvG,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACvD,MAAA,IAAI,UAAU,MAAA,EAAW;AACzB,MAAA,GAAA,CAAI,GAAG,CAAA,GAAIC,aAAAA,CAAc,KAAK,KAAKA,aAAAA,CAAc,GAAA,CAAI,GAAG,CAAC,IAAI,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,EAAG,KAAK,CAAA,GAAI,KAAA;AAAA,IACpG;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAA,CAAgB,YAAqC,OAAA,EAAmD;AAC/G,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,MAAM,OAAA,GAAW,WAAW,QAAA,EACxB,OAAA;AACJ,EAAA,MAAM,SAAS,QAAA,EAAU,KAAA,GAAQ,UAAU,QAAA,CAAS,KAAK,GAAG,MAAA,GAAS,MAAA;AACrE,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAA2B,CAAA,IAAK,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA,CAAO,GAAA;AACtG,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,MAAA,EAAQ,KAAK,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,MAAM,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,MAAM,GAAG,OAAO,IAAA;AACxD,EAAA,OAAO,QAAA,EAAU,SAAA,GAAY,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAM,GAAI,EAAE,KAAA,EAAO,MAAA,EAAO;AAClF;AAEA,IAAM,UAAA,GAAa,cAAwC,IAAI,CAAA;AAE/D,SAAS,KAAA,GAAmB;AAC1B,EAAA,OAAOC,UAAAA,CAAW,UAAU,CAAA,IAAI,IAAK,IAAA;AACvC;AAEA,SAAS,IAAA,CAAK,EAAE,EAAA,EAAG,EAAuC;AACxD,EAAA,OAAO,EAAA,EAAG;AACZ;AAQA,IAAM,gBAAA,GAAmB,cAAkC,IAAI,CAAA;AAG/D,SAAS,MAAA,CAAO;AAAA,EACd,EAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIc;AACZ,EAAA,MAAM,KAAA,GAAQA,WAAW,gBAAgB,CAAA;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,QAAAA,CAAoB,EAAE,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,KAAU,EAAA,GAAK,QAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,QAAA,EAAS;AAC1E,EAAA,MAAM,CAAC,KAAA,EAAO,OAAO,CAAA,GAAI,MAAM,MAAM,CAAA;AACrC,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,MAAM,QAAQ,MAAA,CAAO,QAAA;AAErB,EAAAL,UAAU,MAAM;AACd,IAAA,KAAA,CAAM,CAAC,IAAA,KAAS;AACd,MAAA,MAAM,OAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,OAAO,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAC9F,MAAA,OAAO,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,MAAA,GAAS,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,IAClF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAClB,EAAA,OAAO,aAAA;AAAA,IACL,gBAAA,CAAiB,QAAA;AAAA,IACjB,EAAE,OAAO,MAAA,EAAO;AAAA,IAChB,cAAc,WAAA,CAAY,QAAA,EAAU,EAAE,KAAA,EAAO,OAAM,EAAG,aAAA,CAAc,IAAA,EAAM,EAAE,IAAI,MAAM,EAAA,CAAG,OAAO,CAAA,EAAG,CAAC;AAAA,GACtG;AACF;AAOO,SAAS,aAAA,CACd,GAAA,EACA,KAAA,EACA,iBAAA,GAA6C,EAAC,EAC/B;AACf,EAAA,MAAM,OAAQG,aAAAA,CAAc,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI,UAAU,EAAC;AAC1D,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,YAAA,GAAeA,cAAc,GAAA,CAAI,qBAAqB,CAAC,CAAA,GAAK,GAAA,CAAI,qBAAqB,CAAA,GAAgC,MAAA;AAE3H,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACrD,IAAA,IAAI,eAAe,qBAAA,EAAuB;AAC1C,IAAA,IAAI,UAAA,KAAe,SAAA,IAAa,UAAA,KAAe,qBAAA,IAAyB,eAAe,YAAA,EAAc;AACrG,IAAA,IAAI,KAAK,cAAA,IAAkB,CAAC,QAAQ,UAAA,EAAY,IAAA,CAAK,cAAc,CAAA,EAAG;AACtE,IAAA,IAAI,KAAK,cAAA,IAAkB,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,cAAc,CAAA,EAAG;AACrE,IAAA,IAAI,CAAC,KAAA,IAAU,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,UAAA,EAAa;AAG1E,IAAA,MAAM,IAAA,GAAoB,OAAO,KAAA,KAAU,UAAA,GAAa,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAmB,GAAK,KAAA;AACpG,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA;AACpC,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAA,IAAa,oBAAoB,UAAU,CAAA;AAC1E,IAAA,MAAM,OAAO,EAAE,GAAG,KAAK,IAAA,EAAM,GAAG,KAAK,IAAA,EAAK;AAC1C,IAAA,MAAM,aAAa,iBAAA,CAAkB,iBAAA,EAAmB,IAAA,CAAK,UAAA,EAAY,KAAK,UAAU,CAAA;AACxF,IAAA,MAAM,QAAA,GAAY,WAAW,QAAA,EAAyD,QAAA;AACtF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA;AAEnC,IAAA,MAAM,YAAY,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,IAAI,YAAA,GAAe,MAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,YAAA;AAAA,MACb,IAAA;AAAA,MACA,iBAAA,CAAkB,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAAA,MACzDA,aAAAA,CAAc,QAAQ,CAAA,GAAI,QAAA,GAAW;AAAC,KACxC;AACA,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAS;AACjC,IAAA,MAAM,eAAe,EAAE,GAAG,KAAK,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AACxD,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,MAAM,QAAA,GACJ,WAAW,SAAA,GAAY,CAAC,MAAM,aAAA,CAAc,SAAA,EAAW,CAAC,CAAA,GAAI,MAAA,CAAA;AAE9D,IAAA,MAAM,QAAA,GAAW,CAACG,OAAAA,KAChB,MAAA,CAAO,WAAA;AAAA,MACL,MAAA,CAAO,QAAQ,gBAAA,CAAiBA,OAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAKJ,MAAK,MAAM,CAAC,GAAA,EAAK,GAAA,IAAO,IAAA,GAAO,UAAA,CAAWA,MAAAA,EAAO,KAAK,GAAG,CAAC,CAAA,GAAIA,MAAK,CAAC;AAAA,KAC1H;AACF,IAAA,MAAM,aAAa,CAACI,OAAAA,EAAiB,OAAA,EAAkB,KAAA,GAAmB,EAAC,MAAmB;AAAA,MAC5F,IAAA,EAAM,gBAAA,CAAiB,EAAE,GAAG,MAAM,GAAG,QAAA,CAASA,OAAc,CAAA,EAAG,GAAG,YAAA,CAAa,KAAA,EAAOA,OAAc,GAAG,CAAA;AAAA,MACvG,OAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAmB,EAAA,KACjC,cAAc,MAAA,EAAQ;AAAA,MACpB,EAAA;AAAA,MACA,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,UAAS,KAA4C;AACpE,QAAA,MAAM,UAAU,UAAA,CAAW,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,SAAS,KAAK,CAAA;AACzD,QAAA,MAAM,KAAA,GAAmB;AAAA,UACvB,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,QAAA;AAAA,UACA,QAAA,EAAU,IAAA;AAAA,UACV,WAAW,GAAA,CAAI,SAAA;AAAA,UACf;AAAA,SACF;AACA,QAAA,OAAO,CAAC,OAAO,OAAO,CAAA;AAAA,MACxB,CAAA;AAAA,MACA;AAAA,KACD,CAAA;AAEH,IAAA,MAAM,KAAA,GACJ,CAAC,SAAA,KACD,CAAC,OAAO,GAAA,KACN,aAAA;AAAA,MACE,UAAA,CAAW,QAAA;AAAA,MACX,EAAE,OAAO,KAAA,EAAM;AAAA,MACf,OAAO,GAAA,EAAK,CAAC,YAAY,SAAA,CAAU,KAAA,EAAO,OAAO,CAAC;AAAA,KACpD;AAEJ,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,cAAc,UAAA,CAAW,KAAA;AAC/B,IAAA,MAAM,UAAU,WAAA,EAAa,OAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA;AAE/B,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,EAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA,EAAc,IAAA;AAAA,MACd,MAAA,EAAQ,CAAC,GAAA,KAAQ;AACf,QAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,QAAA,OAAO,MAAA,CAAO,KAAK,CAAC,OAAA,KAAY,SAAS,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,MACjE,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,GAAG,OAAA,CAAQ,KAAK,UAAU,CAAA,EAAG,GAAG,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,IAAI,KAAK,CAAA;AAAA,MAChF,QAAQ,MAAA,IAAU,OAAA,CAAQ,QAAA,CAAS,MAAM,IAAI,MAAA,GAAS,QAAA;AAAA,MACtD,QAAA,EAAU,eAAA,CAAgB,UAAA,EAAY,YAAY,CAAA;AAAA,MAClD,OAAA,EAAS,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,IAAA;AAAA,MACjD,IAAA,EAAM,IAAA,GACF,CAAC,EAAE,aAAA,EAAe,QAAAA,OAAAA,EAAQ,OAAA,EAAQ,KAChC,IAAA,CAAK,EAAE,GAAG,WAAWA,OAAAA,EAAQ,OAAO,CAAA,EAAG,aAAA,EAAe,IAAA,EAAM,OAAO,QAAQ,EAAA,KAAO,EAAA,EAAG,EAAG,CAAA,GAC1F,IAAA;AAAA,MACJ,QAAA,EAAU,UAAA,CAAW,WAAA,EAAa,QAAA,EAAU,CAACA,OAAAA,KAAW,UAAA,CAAWA,OAAAA,EAAQ,EAAE,CAAA,CAAE,IAAI;AAAA,KACpF,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AC3OO,SAAS,gBAAA,CAAiB,KAA8B,KAAA,EAA8B;AAC3F,EAAA,MAAM,QAAA,GAAqB,SAAS,GAAA,CAAI,OAAA,EAAS,MAAM,CAAA,GAAK,GAAA,CAAI,UAAuB,EAAC;AACxF,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACrD,IAAA,IAAI,eAAe,SAAA,IAAa,CAAC,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA,EAAG;AAC3D,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA;AAAA,MAC7B,KAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,mBAAA,CAAoB,UAAU,CAAA;AAAA,MACjD,UAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA,IAAUC,CAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,MAClC,YAAA,EAAc,KAAK,KAAA,IAAS,IAAA;AAAA,MAC5B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAA,EAAY,CAAC,GAAI,IAAA,CAAK,UAAA,IAAc,EAAC,EAAI,GAAI,QAAA,CAAS,UAAA,IAAc,EAAG,CAAA;AAAA,MACvE,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,MAAA,IAAU,UAAA;AAAA,MAC1C,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,MAC3B,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,QAAA,CAAS,OAAA,IAAW,IAAA;AAAA,MAC7C,IAAA,EAAM,KAAK,IAAA,IAAQ,IAAA;AAAA,MACnB,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,QAAA,IAAY,SAAS,QAAQ;AAAA,KACxD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;;;ACzBO,SAAS,WAAA,CACd,GAAA,EACA,KAAA,EACA,UAAA,EACe;AACf,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,MAAM,CAAA,GAC/B,gBAAA,CAAiB,GAAA,EAAK,KAAK,CAAA,GAC3B,aAAA,CAAc,GAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAC1C;AAGO,SAAS,cAAc,GAAA,EAAkD;AAC9E,EAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,EAAA,MAAM,MAAA,GAAS,SAAS,IAAA,EAAM,MAAM,IAAI,IAAA,EAAM,KAAA,GAAQ,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,KAAA;AAC/E,EAAA,OAAO,OAAO,MAAA,KAAW,UAAA,GAAc,MAAA,GAAyB,IAAA;AAClE;ACrBO,IAAM,cAAA,GAAiB;AAQvB,SAAS,eAAA,CAAgB,GAAA,EAAgC,MAAA,EAAgB,OAAA,GAAU,IAAA,EAAe;AACvG,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIF,SAAS,MAAM,OAAA,IAAW,OAAO,oBAAA,KAAyB,WAAW,CAAA;AAC7F,EAAAL,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,IAAM,OAAO,oBAAA,KAAyB,WAAA,EAAa;AAExD,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,QAAA,CAAS,UAAU,EAAE,CAAA;AACrB,MAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAgB;AAC7B,MAAA,IAAI,OAAO,QAAA,EAAU;AACrB,MAAA,QAAA,GAAW,EAAA;AACX,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,QAAA,CAAS,gBAAA,CAAiB,UAAU,OAAA,EAAS,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC7E,QAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,oBAAoB,QAAA,EAAU,OAAA,EAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AACjE,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA;AACA,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,KAAY;AACX,QAAA,MAAMF,KAAAA,GAAO,OAAA,CAAQ,EAAA,CAAG,EAAE,CAAA;AAC1B,QAAA,IAAI,CAACA,KAAAA,EAAM;AACX,QAAA,MAAM,OAAOA,KAAAA,CAAK,UAAA;AAClB,QAAA,MAAM,MAAMA,KAAAA,CAAK,kBAAA;AACjB,QAAA,OAAA;AAAA,UACE,OACI,GAAA,CAAI,MAAA,IAAU,IAAA,CAAK,GAAA,IAAO,IAAI,GAAA,IAAO,IAAA,CAAK,MAAA,IAAU,GAAA,CAAI,SAAS,IAAA,CAAK,IAAA,IAAQ,IAAI,IAAA,IAAQ,IAAA,CAAK,QAC/FA,KAAAA,CAAK;AAAA,SACX;AAEA,QAAA,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,CAACA,MAAK,cAAc,CAAA;AAAA,MAC7C,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,MAAA;AAAO,KACvC;AACA,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,KAAA,CAAM,KAAK,CAAA;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,MAAM,CAAC,CAAA;AAChB,EAAA,OAAO,IAAA;AACT;AC/CO,IAAM,OAAA,GAAU,CAAC,EAAA,KAAe,CAAA,eAAA,EAAkB,EAAE,CAAA,EAAA,CAAA;AAGpD,SAAS,cAAA,CAAe,IAAA,EAAmB,MAAA,EAAgB,OAAA,EAAkB,KAAA,EAA+B;AACjH,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AACxD,EAAA,KAAA,CAAM,YAAA,GAAe,SAAS,MAAM,CAAA;AACpC,EAAA,OAAO,MAAM,OAAO,OAAA,EAAQ;AAC9B;AAOO,SAAS,iBAAA,CACd,MACA,IAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,OAAM,GAAI,IAAA;AACzD,EAAA,MAAM,MAAA,GAASU,SAAAA,CAAU,EAAE,KAAA,EAAO,CAAA;AAClC,EAAA,MAAM,YAAA,GAAeC,OAAyB,IAAI,CAAA;AAElD,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAC5B,IAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAA,CAAO,OAAA,CAAQ,KAAA;AACxC,IAAA,YAAA,CAAa,OAAA,GAAU,eAAA;AAAA,MACrB,IAAA,CAAK,aAAA;AAAA,MACL,eAAe,CAAA,EAAG,KAAK,KAAK,KAAK,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,CAAA,GAAM;AAAA,KAC7D;AACA,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,SAAS,OAAA,EAAQ;AAC9B,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEzB,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAA+B,EAAE,CAAA;AACjD,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG,IAAI,EAAE,IAAA,IAAQ,SAAA,CAAA,EAAY,SAAA,CAAU,GAAA,CAAI,MAAM,IAAI,CAAA;AACnG,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAChF,IAAA,OAAA,CAAQ,OAAA,GAAU,EAAE,GAAG,SAAA,EAAU;AAAA,EACnC,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAC,CAAA;AAE5B,EAAA,eAAA;AAAA,IACE,MAAO,OAAO,cAAA,CAAe,IAAA,EAAM,QAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA;AAAA,IAC5E,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM;AAAA,GAChC;AAEA,EAAA,OAAO,YAAA;AACT","file":"chunk-GHPMNT2A.js","sourcesContent":["import type { A11yFinding, A11yOutcome, A11yReport } from '../protocol/messages';\n\n/** The shape of `axe.run`'s answer this module reads. */\ninterface AxeResult {\n violations: readonly AxeFinding[];\n incomplete: readonly AxeFinding[];\n passes: readonly unknown[];\n inapplicable: readonly unknown[];\n}\ninterface AxeFinding {\n id: string;\n impact?: string | null;\n help: string;\n helpUrl: string;\n description: string;\n nodes: readonly { target: readonly unknown[]; html: string; failureSummary?: string }[];\n}\ninterface AxeModule {\n run(context: Element, options?: unknown): Promise<AxeResult>;\n}\n\nconst IMPACTS = new Set(['minor', 'moderate', 'serious', 'critical']);\n\nfunction finding(from: AxeFinding): A11yFinding {\n const impact = from.impact ?? '';\n return {\n id: from.id,\n impact: IMPACTS.has(impact) ? (impact as A11yFinding['impact']) : null,\n help: from.help,\n helpUrl: from.helpUrl,\n description: from.description,\n nodes: from.nodes.map((node) => ({\n // An axe target entry is a selector, or an array of them for an element inside a shadow root.\n target: node.target.map((part) => (Array.isArray(part) ? part.join(' ') : String(part))),\n html: node.html,\n ...(node.failureSummary === undefined ? {} : { failureSummary: node.failureSummary }),\n })),\n };\n}\n\nlet loading: Promise<AxeModule> | null = null;\n\n/** axe is ~500 KB, so a frame that is never audited never pays for it. */\nfunction loadAxe(): Promise<AxeModule> {\n loading ??= import('axe-core').then((mod) => (mod as unknown as { default?: AxeModule }).default ?? (mod as unknown as AxeModule));\n return loading;\n}\n\n/** Rules that judge the page rather than the element audited; off when the element is one story on a page of many. */\nexport const PAGE_RULES: readonly string[] = [\n 'bypass',\n 'document-title',\n 'html-has-lang',\n 'html-lang-valid',\n 'html-xml-lang-mismatch',\n 'landmark-one-main',\n 'page-has-heading-one',\n 'region',\n];\n\nexport interface RunAxeOptions {\n /** Whether `element` stands for the whole page. False leaves `PAGE_RULES` out. Default true. */\n page?: boolean;\n}\n\n// axe refuses a run while another is under way in the same document, and the workshop page holds every story.\nlet last: Promise<unknown> = Promise.resolve();\n\n/** Runs axe over `element` and reduces its answer to what crosses the frame's channel. A run waits for the one before it. */\nexport async function runAxe(element: Element, { page = true }: RunAxeOptions = {}): Promise<A11yReport> {\n const axe = await loadAxe();\n const rules = page ? undefined : Object.fromEntries(PAGE_RULES.map((id) => [id, { enabled: false }]));\n const run = () => axe.run(element, rules ? { rules } : undefined);\n const running = last.then(run, run);\n last = running;\n const result = await running;\n return {\n violations: result.violations.map(finding),\n incomplete: result.incomplete.map(finding),\n passes: result.passes.length,\n inapplicable: result.inapplicable.length,\n };\n}\n\n/** `runAxe`, with a failure to run reported as an outcome rather than thrown. */\nexport async function auditElement(element: Element, options?: RunAxeOptions): Promise<A11yOutcome> {\n try {\n return { ok: true, report: await runAxe(element, options) };\n } catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n}\n","/** Outlines over the elements an axe finding names, drawn in the document that holds them. */\nexport interface A11yHighlighter {\n /** Outlines every element `targets` reaches, replacing what was shown; an empty list clears. */\n show(targets: readonly (readonly string[])[]): void;\n dispose(): void;\n}\n\nconst CSS = `[data-fg-a11y-highlight] {\n position: fixed;\n z-index: var(--wzl-z-drag, 10000);\n box-sizing: border-box;\n pointer-events: none;\n border: 2px solid var(--wzl-danger, #e5484d);\n border-radius: 2px;\n background: color-mix(in srgb, var(--wzl-danger, #e5484d) 15%, transparent);\n}\n`;\n\n/** The element an axe target reaches: each entry after the first steps into the frame or shadow root before it. */\nexport function resolveTarget(doc: Document, target: readonly string[]): Element | null {\n let scope: Document | ShadowRoot = doc;\n let found: Element | null = null;\n for (const selector of target) {\n try {\n found = scope.querySelector(selector);\n } catch {\n return null;\n }\n if (!found) return null;\n const inner: Document | ShadowRoot | null | undefined =\n found.shadowRoot ?? (found as HTMLIFrameElement).contentDocument;\n if (inner) scope = inner;\n }\n return found;\n}\n\nexport function createA11yHighlighter(doc: Document): A11yHighlighter {\n let style: HTMLStyleElement | null = null;\n let boxes: { el: Element; box: HTMLElement }[] = [];\n const view = doc.defaultView;\n\n const place = () => {\n for (const { el, box } of boxes) {\n const rect = el.getBoundingClientRect();\n box.style.left = `${rect.left}px`;\n box.style.top = `${rect.top}px`;\n box.style.width = `${rect.width}px`;\n box.style.height = `${rect.height}px`;\n }\n };\n\n const clear = () => {\n for (const { box } of boxes) box.remove();\n boxes = [];\n view?.removeEventListener('scroll', place, true);\n view?.removeEventListener('resize', place);\n };\n\n return {\n show(targets) {\n clear();\n const elements = targets.map((target) => resolveTarget(doc, target)).filter((el) => el !== null);\n if (elements.length === 0) return;\n if (!style) {\n style = doc.createElement('style');\n style.setAttribute('data-fg-a11y-highlight-style', '');\n style.textContent = CSS;\n doc.head.append(style);\n }\n boxes = elements.map((el) => {\n const box = doc.createElement('div');\n box.setAttribute('data-fg-a11y-highlight', '');\n box.setAttribute('aria-hidden', 'true');\n doc.body.append(box);\n return { el, box };\n });\n place();\n view?.addEventListener('scroll', place, true);\n view?.addEventListener('resize', place);\n },\n dispose() {\n clear();\n style?.remove();\n style = null;\n },\n };\n}\n","const VAR_REF = /var\\(\\s*(--[\\w-]+)/g;\nconst CUSTOM_DECL = /(?:^|[;{\\s])(--[\\w-]+)\\s*:\\s*([^;]*)/g;\n// A selector naming a pseudo-element, or a state the pointer or focus has to be in, matches no element at rest.\nconst RESTLESS = /::?(?:before|after|first-line|first-letter|marker|placeholder|selection|backdrop|file-selector-button)\\b|::[\\w-]+(?:\\([^)]*\\))?|:(?:hover|active|focus-visible|focus-within|focus|visited|target)\\b/g;\nconst STYLE_RULE = 1;\n\n/** Every custom property `text` reads with `var()`. */\nexport function varRefs(text: string, into: Set<string> = new Set()): Set<string> {\n if (!text.includes('var(')) return into;\n for (const [, name] of text.matchAll(VAR_REF)) into.add(name!);\n return into;\n}\n\n/** Where a selector lands relative to the story: on it or inside it, or on an ancestor whose declarations it inherits. */\ninterface Reach {\n readonly within: boolean;\n readonly above: boolean;\n}\n\nfunction reach(selector: string, root: Element): Reach {\n const resting = selector.replace(RESTLESS, '').trim() || '*';\n try {\n return { within: root.matches(resting) || root.querySelector(resting) !== null, above: root.parentElement?.closest(resting) != null };\n } catch {\n // A selector the engine can't query is kept rather than lost.\n return { within: true, above: true };\n }\n}\n\n/** A declaration block split into what it defines and the custom properties its other declarations read. */\nfunction readBlock(block: string, defs: Map<string, Set<string>>, seeds: Set<string> | null): void {\n for (const [, name, value] of block.matchAll(CUSTOM_DECL)) {\n const refs = defs.get(name!) ?? new Set<string>();\n varRefs(value!, refs);\n defs.set(name!, refs);\n }\n if (seeds) varRefs(block.replace(CUSTOM_DECL, ''), seeds);\n}\n\nfunction blockOf(rule: CSSRule): string {\n const text = rule.cssText;\n const open = text.indexOf('{');\n return open < 0 ? '' : text.slice(open + 1, text.lastIndexOf('}'));\n}\n\nfunction walk(rules: CSSRuleList, root: Element, defs: Map<string, Set<string>>, seeds: Set<string>, parent?: Reach): void {\n for (const rule of Array.from(rules)) {\n const imported = (rule as CSSRule & { styleSheet?: CSSStyleSheet | null }).styleSheet;\n if (imported) {\n const inner = cssRulesOf(imported);\n if (inner) walk(inner, root, defs, seeds);\n continue;\n }\n const children = (rule as CSSRule & { cssRules?: CSSRuleList }).cssRules;\n if (rule.type !== STYLE_RULE) {\n // @media, @supports, @layer and @container hold rules; a keyframe or a font face reaches no element.\n if (children) walk(children, root, defs, seeds, parent);\n continue;\n }\n // A nested rule's selector is relative to its parent's, so it inherits the parent's reach.\n const at = parent ?? reach((rule as CSSStyleRule).selectorText, root);\n if (at.within || at.above) readBlock(blockOf(rule), defs, at.within ? seeds : null);\n }\n}\n\nexport function cssRulesOf(sheet: CSSStyleSheet): CSSRuleList | null {\n try {\n return sheet.cssRules;\n } catch {\n // A cross-origin sheet refuses to be read.\n return null;\n }\n}\n\n/**\n * The custom properties the story under `root` uses: those read by a declaration of a rule matching an element in\n * it, or by its inline styles, and every property one of those reads in turn through a definition that reaches it.\n * A definition on an ancestor reaches it by inheritance; an ancestor's other declarations do not count as use.\n */\nexport function usedCssVars(doc: Document, root: Element): Set<string> {\n const defs = new Map<string, Set<string>>();\n const seeds = new Set<string>();\n for (const sheet of Array.from(doc.styleSheets)) {\n const rules = cssRulesOf(sheet);\n if (rules) walk(rules, root, defs, seeds);\n }\n for (const el of Array.from(doc.querySelectorAll('[style]'))) {\n const within = root.contains(el);\n if (within || el.contains(root)) readBlock(el.getAttribute('style') ?? '', defs, within ? seeds : null);\n }\n\n const used = new Set<string>();\n const queue = [...seeds];\n while (queue.length > 0) {\n const name = queue.pop()!;\n if (used.has(name)) continue;\n used.add(name);\n for (const ref of defs.get(name) ?? []) queue.push(ref);\n }\n return used;\n}\n","import type { CssVarReport } from '../protocol/messages';\nimport { usedCssVars, varRefs } from './cssVarUse';\nimport { isSafeOverride } from './safeOverride';\n\nconst collect = (text: string, names: Set<string>) => void varRefs(text, names);\n\n/** A grouping rule's text holds its children's; an `@import` holds only its URL, so its sheet is read too. */\nfunction walkRules(sheet: CSSStyleSheet, names: Set<string>): void {\n let rules: CSSRuleList;\n try {\n rules = sheet.cssRules;\n } catch {\n // A cross-origin sheet refuses to be read.\n return;\n }\n for (const rule of Array.from(rules)) {\n const imported = (rule as CSSRule & { styleSheet?: CSSStyleSheet | null }).styleSheet;\n if (imported) walkRules(imported, names);\n else collect(rule.cssText, names);\n }\n}\n\n/**\n * Every custom property the document references with `var()`, from inline styles and stylesheet rules — computed\n * styles have already substituted the reference away — each marked with whether the story under `root` uses it.\n * Values resolve on `root`, the document's by default, or else on the first element under it that declares one.\n */\nexport function scanCssVars(\n doc: Document,\n overridden: (name: string) => boolean = () => false,\n root: Element = doc.documentElement,\n): CssVarReport[] {\n const names = new Set<string>();\n for (const el of Array.from(doc.querySelectorAll('[style]'))) collect(el.getAttribute('style') ?? '', names);\n for (const sheet of Array.from(doc.styleSheets)) walkRules(sheet, names);\n\n const values = resolveValues(doc, names, root);\n const used = usedCssVars(doc, root);\n return [...names]\n .sort()\n .map((name) => ({ name, value: values.get(name) ?? '', overridden: overridden(name), used: used.has(name) }));\n}\n\nfunction resolveValues(doc: Document, names: Iterable<string>, root: Element): Map<string, string> {\n const view = doc.defaultView;\n const values = new Map<string, string>();\n if (!view) return values;\n const own = view.getComputedStyle(root);\n const missing: string[] = [];\n for (const name of names) {\n const value = own.getPropertyValue(name).trim();\n if (value) values.set(name, value);\n else missing.push(name);\n }\n const under = root === doc.documentElement ? (doc.body ?? root) : root;\n for (const el of missing.length > 0 ? Array.from(under.querySelectorAll('*')) : []) {\n const style = view.getComputedStyle(el);\n for (let i = missing.length - 1; i >= 0; i--) {\n const value = style.getPropertyValue(missing[i]!).trim();\n if (!value) continue;\n values.set(missing[i]!, value);\n missing.splice(i, 1);\n }\n if (missing.length === 0) break;\n }\n return values;\n}\n\n/** One custom property's value, resolved the way `scanCssVars` resolves each. */\nexport function resolveCssVar(doc: Document, name: string, root: Element = doc.documentElement): string {\n return resolveValues(doc, [name], root).get(name) ?? '';\n}\n\nexport interface Overrides {\n set(name: string, value: string | null): void;\n has(name: string): boolean;\n /** Whether `node` is the override style element or inside it. */\n owns(node: Node): boolean;\n dispose(): void;\n}\n\n/**\n * Custom property overrides as one rule on `scope`, kept last in `<head>`. `:not(#fg-overrides)` adds an ID's weight\n * without `!important`, so the rule outranks a theme's attribute selectors; a stylesheet that lands after it sends\n * the element back to the end.\n */\nexport function createOverrides(doc: Document, scope = ':root'): Overrides {\n const values = new Map<string, string>();\n const style = doc.createElement('style');\n style.setAttribute('data-fg-overrides', '');\n\n // Another instance's style counts as last place too, or two instances would take turns moving forever.\n const keepLast = () => {\n if (style.parentNode === doc.head) {\n let next = style.nextElementSibling;\n while (next?.hasAttribute('data-fg-overrides')) next = next.nextElementSibling;\n if (next === null) return;\n }\n doc.head.append(style);\n };\n const selector = `:is(${scope}):not(#fg-overrides)`;\n /** Each declaration goes through the rule's own CSSOM, which drops what the browser would not take as one value,\n * and the text is written back from what it kept; an override that could close the rule is never offered. */\n const write = () => {\n style.textContent = values.size > 0 ? `${selector} {}` : '';\n const rule = style.sheet?.cssRules[0] as CSSStyleRule | undefined;\n if (!rule) return;\n for (const [name, value] of values) if (isSafeOverride(name, value)) rule.style.setProperty(name, value);\n const decls = [...values.keys()].flatMap((name) => {\n const value = rule.style.getPropertyValue(name).trim();\n return value && isSafeOverride(name, value) ? [` ${name}: ${value};`] : [];\n });\n style.textContent = decls.length > 0 ? `${selector} {\\n${decls.join('\\n')}\\n}\\n` : '';\n };\n\n keepLast();\n const observer = typeof MutationObserver === 'undefined' ? null : new MutationObserver(keepLast);\n observer?.observe(doc.head, { childList: true });\n\n return {\n set(name, value) {\n if (value === null) values.delete(name);\n else values.set(name, value);\n write();\n },\n has: (name) => values.has(name),\n owns: (node) => style.contains(node),\n dispose() {\n observer?.disconnect();\n style.remove();\n },\n };\n}\n","/** What a setup's `applyGlobals` is handed: the element the globals apply to, and a way to style it alone. */\nexport interface GlobalsTarget {\n /** A frame document's root, or one story's host in the workshop document. */\n root: HTMLElement;\n /** A selector matching `root` and nothing else, so a rule written under it reaches only this target. */\n scope: string;\n /** Replaces the CSS forge keeps for this target. */\n style: (css: string) => void;\n}\n\n/** A target over `root`, owning one `<style>` in the document's head; `dispose` removes it. */\nexport function createGlobalsTarget(root: HTMLElement, scope: string): GlobalsTarget & { dispose: () => void } {\n const doc = root.ownerDocument;\n let style: HTMLStyleElement | null = null;\n return {\n root,\n scope,\n style(css) {\n if (!style) {\n style = doc.createElement('style');\n style.setAttribute('data-fg-globals', scope);\n doc.head.append(style);\n }\n style.textContent = css;\n },\n dispose() {\n style?.remove();\n style = null;\n },\n };\n}\n","import { useVisibleRaf, type VisibleRafTarget } from '@weasel-js/core';\nimport { useEffect, useRef, useSyncExternalStore } from 'react';\nimport type { Clock } from './clock';\n\nconst NEVER = () => () => {};\nconst notPlaying = () => false;\n\n/** Drives `clock` from frames while it plays. Frames stop while the page or `target` is out of sight, and the time\n * spent there is dropped rather than arriving as one long frame. */\nexport function useClockLoop(clock: Clock | null, target?: VisibleRafTarget): void {\n const playing = useSyncExternalStore(clock?.subscribe ?? NEVER, clock ? () => clock.get().playing : notPlaying);\n const last = useRef<number | null>(null);\n const raf = useVisibleRaf(\n (now, raf) => {\n if (!clock) return;\n const prev = last.current;\n last.current = now;\n if (prev !== null) clock.tick(now - prev);\n if (clock.get().playing) raf.request();\n },\n {\n ...(target ? { target } : {}),\n onResume: () => {\n last.current = null;\n },\n },\n );\n useEffect(() => {\n if (!playing) return;\n last.current = null;\n raf.request();\n return () => raf.cancel();\n }, [playing, raf]);\n}\n","import { createEmitter } from '@weasel-js/registry';\n\n/** What a story declares to get a playhead. Times are in ms, as `@weasel-js/ui`'s timeline components take them. */\nexport interface TimelineSpec {\n /** How long the span runs. */\n duration: number;\n /** Where the span begins; below zero gives a lead-in before the story's zero. A fresh trial opens here. Default 0. */\n start?: number;\n /** Whether playing past the end wraps back to `start`. Default true. */\n loop?: boolean;\n /** Playback speed multiplier. Default 1. */\n rate?: number;\n}\n\n/** The span a playhead may stand in, in ms. */\nexport interface Span {\n start: number;\n end: number;\n}\n\n/** Everything a clock holds. */\nexport interface ClockState {\n /** The playhead, in ms, always inside `span`. */\n time: number;\n playing: boolean;\n loop: boolean;\n rate: number;\n span: Span;\n}\n\n/** A span replacing the declared one at runtime, as `StoryTimeline.setSpan` takes it. */\nexport type SpanOverride = Pick<TimelineSpec, 'duration' | 'start'>;\n\nexport function spanOf(spec: SpanOverride): Span {\n const start = Number.isFinite(spec.start) ? (spec.start as number) : 0;\n const duration = Number.isFinite(spec.duration) && spec.duration > 0 ? spec.duration : 0;\n return { start, end: start + duration };\n}\n\nexport function clampTime(span: Span, t: number): number {\n if (Number.isNaN(t)) return span.start;\n return Math.min(span.end, Math.max(span.start, t));\n}\n\n/** `state` after `elapsed` ms of wall time. Past the end it wraps when looping, and otherwise stops there, paused. */\nexport function advance(state: ClockState, elapsed: number): ClockState {\n if (!state.playing) return state;\n const { start, end } = state.span;\n const length = end - start;\n if (length <= 0) return { ...state, time: start, playing: false };\n const next = state.time + elapsed * state.rate;\n if (next <= end) return { ...state, time: next };\n if (!state.loop) return { ...state, time: end, playing: false };\n return { ...state, time: start + ((next - start) % length) };\n}\n\nconst validRate = (rate: number | undefined): rate is number => typeof rate === 'number' && Number.isFinite(rate) && rate > 0;\n\n/** A story's clock: its state as an external store, and the moves the transport and the story make on it. */\nexport interface Clock {\n get(): ClockState;\n subscribe(listener: () => void): () => void;\n play(): void;\n pause(): void;\n seek(time: number): void;\n /**\n * Pauses at `time`, asked for from outside the story — a URL, a persisted value — and keeps asking: every span\n * change clamps it afresh, so a span that only arrives later can still hold it, until play, a seek or another\n * request moves the playhead. Null asks for the span's start, wherever it ends up.\n */\n request(time: number | null): void;\n /** The requested time while the span cannot hold it yet, or null. Whatever echoes the playhead outward waits on it. */\n pending(): number | null;\n setLoop(loop: boolean): void;\n setRate(rate: number): void;\n /** Replaces the declared span until called with null. */\n setSpan(span: SpanOverride | null): void;\n /** The story's declaration changed, as after an edit or a new config. Only its span is taken up. */\n declare(spec: TimelineSpec): void;\n /** Advances a playing clock by `elapsed` ms of wall time. */\n tick(elapsed: number): void;\n}\n\n/** Where a request puts the playhead in `span`; null asks for its start. */\nconst placed = (span: Span, requested: number | null): number =>\n requested === null ? span.start : clampTime(span, requested);\n\n/** A clock for `spec`, paused at a request for `initial`, which is the span start when none is given. */\nexport function createClock(spec: TimelineSpec, initial?: number | null): Clock {\n let declared = spanOf(spec);\n let override: Span | null = null;\n // Until something moves the playhead it stands where it was asked to, re-placed in every new span, so a span set\n // after mount still opens at the start — or at a URL's time beyond the span declared before it.\n let requested: { time: number | null } | null = { time: initial ?? null };\n let state: ClockState = {\n time: placed(declared, requested.time),\n playing: false,\n loop: spec.loop ?? true,\n rate: validRate(spec.rate) ? spec.rate : 1,\n span: declared,\n };\n const changed = createEmitter();\n const pendingIn = (at: ClockState): number | null =>\n requested && requested.time !== null && requested.time !== at.time ? requested.time : null;\n // What echoes the playhead outward waits on a pending request, so its coming and going notifies as a move does.\n let pending = pendingIn(state);\n\n const set = (next: ClockState): void => {\n const nextPending = pendingIn(next);\n if (\n nextPending === pending &&\n next.time === state.time &&\n next.playing === state.playing &&\n next.loop === state.loop &&\n next.rate === state.rate &&\n next.span.start === state.span.start &&\n next.span.end === state.span.end\n )\n return;\n state = next;\n pending = nextPending;\n changed.emit();\n };\n const moved = (next: ClockState): void => {\n requested = null;\n set(next);\n };\n const respan = (): void => {\n const span = override ?? declared;\n set({ ...state, span, time: requested ? placed(span, requested.time) : clampTime(span, state.time) });\n };\n\n return {\n get: () => state,\n subscribe: changed.subscribe,\n play() {\n if (state.playing) return;\n // Playing from the end starts over, as a player's play button does.\n moved({ ...state, playing: true, time: state.time >= state.span.end ? state.span.start : state.time });\n },\n pause: () => set({ ...state, playing: false }),\n seek: (time) => moved({ ...state, time: clampTime(state.span, time) }),\n request(time) {\n requested = { time: Number.isNaN(time) ? null : time };\n set({ ...state, playing: false, time: placed(state.span, requested.time) });\n },\n pending: () => pending,\n setLoop: (loop) => set({ ...state, loop }),\n setRate(rate) {\n if (validRate(rate)) set({ ...state, rate });\n },\n setSpan(span) {\n override = span ? spanOf(span) : null;\n respan();\n },\n declare(next) {\n declared = spanOf(next);\n respan();\n },\n tick(elapsed) {\n if (state.playing) moved(advance(state, elapsed));\n },\n };\n}\n","import { useLatest } from '@weasel-js/core';\nimport { type ReactNode, useContext, useEffect, useState } from 'react';\nimport type { LoadedStory } from '../story/types';\nimport { type Clock, createClock, type TimelineSpec } from './clock';\nimport { ClockContext } from './context';\nimport { useClockLoop } from './useClockLoop';\n\n/**\n * A clock for a story declaring `spec`, kept across renders and redeclared when the span it declares changes. It is\n * made when a declaration appears and dropped when it goes, as an edit can do either. `initial` is read only when\n * the clock is made.\n */\nexport function useStoryClock(spec: TimelineSpec | null, initial: () => number | null): Clock | null {\n const [clock, setClock] = useState(() => (spec ? createClock(spec, initial()) : null));\n let current = clock;\n if (spec && !clock) {\n current = createClock(spec, initial());\n setClock(current);\n } else if (!spec && clock) {\n current = null;\n setClock(null);\n }\n const latest = useLatest(spec);\n const spanKey = spec ? `${spec.start ?? 0}:${spec.duration}` : null;\n useEffect(() => {\n if (current && latest.current) current.declare(latest.current);\n }, [current, spanKey, latest]);\n return current;\n}\n\nconst NO_INITIAL = () => null;\n\nfunction OwnClock({ spec, children }: { spec: TimelineSpec; children: ReactNode }) {\n const clock = useStoryClock(spec, NO_INITIAL);\n useClockLoop(clock);\n return <ClockContext.Provider value={clock}>{children}</ClockContext.Provider>;\n}\n\n/**\n * Gives a story declaring a timeline a clock of its own where nothing above supplies one — an index page, a frame, a\n * story test. It stands paused at the span's start, with no transport, until the story moves it.\n */\nexport function WithStoryClock({ story, config, children }: { story: LoadedStory; config: unknown; children: ReactNode }) {\n const outer = useContext(ClockContext);\n if (outer || !story.timeline) return children;\n return <OwnClock spec={story.timeline(config)}>{children}</OwnClock>;\n}\n","import { Component, type ReactNode } from 'react';\nimport type { Decorator, LoadedStory, StoryContext } from '../story/types';\nimport { WithStoryClock } from '../timeline/StoryClock';\n\nexport interface StoryHostProps {\n story: LoadedStory;\n ctx: StoryContext;\n /** Outermost decorators, from the frame setup. */\n decorators: readonly Decorator[];\n /** A change clears a caught error, so new input retries the render. */\n resetKey: number;\n onError: (error: unknown) => void;\n}\n\nfunction RenderStory({ story, ctx }: { story: LoadedStory; ctx: StoryContext }): ReactNode {\n return story.render(ctx);\n}\n\nfunction Decorated({ story, ctx, decorators }: Omit<StoryHostProps, 'resetKey' | 'onError'>): ReactNode {\n let inner: () => ReactNode = () => <RenderStory story={story} ctx={ctx} />;\n for (const decorate of [...story.decorators, ...decorators]) {\n const wrapped = inner;\n inner = () => decorate(wrapped, ctx);\n }\n return inner();\n}\n\ninterface BoundaryState {\n error: unknown;\n failed: boolean;\n resetKey: number;\n}\n\nexport class StoryHost extends Component<StoryHostProps, BoundaryState> {\n override state: BoundaryState = { error: null, failed: false, resetKey: this.props.resetKey };\n\n static getDerivedStateFromProps(props: StoryHostProps, state: BoundaryState): Partial<BoundaryState> | null {\n return props.resetKey === state.resetKey ? null : { error: null, failed: false, resetKey: props.resetKey };\n }\n\n static getDerivedStateFromError(error: unknown): Partial<BoundaryState> {\n return { error, failed: true };\n }\n\n override componentDidCatch(error: unknown): void {\n this.props.onError(error);\n }\n\n override render(): ReactNode {\n if (this.state.failed) {\n const { error } = this.state;\n return <pre className=\"fg-frame__fault\">{error instanceof Error ? error.message : String(error)}</pre>;\n }\n const { story, ctx, decorators } = this.props;\n return (\n <WithStoryClock story={story} config={ctx.config}>\n <Decorated story={story} ctx={ctx} decorators={decorators} />\n </WithStoryClock>\n );\n }\n}\n","import { type ConfigNode, type ConfigSchema, type ConfigShape, f, ObjectNode, UnionNode } from '@weasel-js/labkit/config';\nimport { isPlainObject } from '@weasel-js/core';\nimport { iconFromData } from '@weasel-js/ui/components/Icon';\nimport { portSafePart } from './portSafe';\n\n/** Storybook's conditional control: shown only while an arg, or a global, meets the test. */\nexport type ArgCondition = ({ arg: string } | { global: string }) & {\n truthy?: boolean;\n exists?: boolean;\n eq?: unknown;\n neq?: unknown;\n};\n\n/**\n * Storybook's `SBType`, as far as forge reads it: the shape of an arg's value. A control is built from the parts of\n * an array, an object or a union, and a union of objects that each pin one field to a string is edited as a choice\n * of that string, with the chosen object's own fields under it.\n */\nexport type ArgShape =\n | { name: 'boolean' | 'string' | 'number' }\n | { name: 'enum'; value: readonly string[] }\n | { name: 'array'; value: ArgShape }\n | { name: 'object'; value: Readonly<Record<string, ArgShape>> }\n | { name: 'union'; value: readonly ArgShape[] };\n\n/** A CSF `argTypes` entry, as far as forge reads it. */\nexport interface ArgType {\n name?: string;\n description?: string;\n type?: ArgShape;\n control?:\n | string\n | false\n | {\n type?: string;\n min?: number;\n max?: number;\n step?: number;\n /** forge's own: a qualified icon ref (`ui:variantSolid`) per option, drawn in place of its label. */\n icons?: Readonly<Record<string, string>>;\n };\n options?: readonly unknown[];\n table?: { disable?: boolean };\n if?: ArgCondition;\n}\n\ninterface Leaf extends ConfigNode<unknown> {\n hidden(): Leaf;\n describe(description: string): Leaf;\n label(name: string): Leaf;\n showIf(predicate: (config: Record<string, unknown>) => boolean): Leaf;\n}\n\ninterface Control {\n type: string | undefined;\n min?: number;\n max?: number;\n step?: number;\n icons?: Readonly<Record<string, string>>;\n}\n\nfunction controlOf(argType: ArgType): Control | false {\n const { control } = argType;\n if (control === false) return false;\n if (typeof control === 'string') return { type: control };\n return { type: control?.type, min: control?.min, max: control?.max, step: control?.step, icons: control?.icons };\n}\n\nfunction stringOptions(argType: ArgType): string[] | null {\n const opts = argType.options;\n return opts && opts.length > 0 && opts.every((o) => typeof o === 'string') ? (opts as string[]) : null;\n}\n\nfunction inferred(value: unknown): Leaf | null {\n switch (typeof value) {\n case 'number':\n return f.number(value);\n case 'boolean':\n return f.boolean(value);\n case 'string':\n return f.string(value);\n default:\n return Array.isArray(value) || isPlainObject(value) ? f.custom('json', value) : null;\n }\n}\n\ntype ObjectShape = Extract<ArgShape, { name: 'object' }>;\n\n/**\n * A union's members by the string each pins one field to, with that field: the first field every member pins.\n * Members pinning the same string are one variant, holding the fields of each.\n */\nfunction variantsOf(members: readonly ArgShape[]): { tag: string; variants: Map<string, ObjectShape> } | null {\n const objects = members.filter((m): m is ObjectShape => m.name === 'object');\n if (objects.length !== members.length || objects.length === 0) return null;\n const pinned = (m: ObjectShape, key: string) => {\n const field = m.value[key];\n return field?.name === 'enum' && field.value.length === 1 ? field.value[0] : undefined;\n };\n const tag = Object.keys(objects[0]!.value).find((key) => objects.every((m) => pinned(m, key) !== undefined));\n if (tag === undefined) return null;\n const variants = new Map<string, ObjectShape>();\n for (const member of objects) {\n const name = pinned(member, tag)!;\n const held = variants.get(name)?.value ?? {};\n const added = Object.entries(member.value).filter(([key]) => !(key in held));\n variants.set(name, { name: 'object', value: { ...held, ...Object.fromEntries(added) } });\n }\n return { tag, variants };\n}\n\nfunction fieldsOf(shape: ObjectShape, value: unknown, omit?: string): Record<string, Leaf> | null {\n const held = isPlainObject(value) ? value : {};\n const fields: Record<string, Leaf> = {};\n for (const [key, field] of Object.entries(shape.value)) {\n if (key === omit) continue;\n const leaf = shaped(field, held[key]);\n if (leaf) fields[key] = leaf;\n }\n return Object.keys(fields).length > 0 ? fields : null;\n}\n\n/** A leaf editing a value of `shape`, starting at `value`; null for a shape no control can edit. */\nfunction shaped(shape: ArgShape, value: unknown): Leaf | null {\n switch (shape.name) {\n case 'boolean':\n return f.boolean(value as boolean);\n case 'string':\n return f.string(value as string);\n case 'number':\n return f.number(value as number);\n case 'enum':\n return shape.value.length > 0 ? f.enum(value as string, shape.value) : null;\n case 'array': {\n const item = shaped(shape.value, undefined);\n return item ? (f.list(Array.isArray(value) ? value : [], item) as unknown as Leaf) : null;\n }\n case 'object': {\n const fields = fieldsOf(shape, value);\n if (!fields) return null;\n const node = f.object(fields);\n return new ObjectNode(isPlainObject(value) ? value : node.default, node.annotations, node.options) as unknown as Leaf;\n }\n case 'union': {\n const union = variantsOf(shape.value);\n if (!union) return null;\n const { tag, variants } = union;\n const held = isPlainObject(value) ? value[tag] : undefined;\n const nodes = Object.fromEntries(\n [...variants].map(([name, member]) => [name, f.object(fieldsOf(member, held === name ? value : undefined, tag) ?? {})]),\n );\n const node = f.union(tag, nodes);\n const start = typeof held === 'string' && variants.has(held) ? value : node.default;\n return new UnionNode(start, node.annotations, node.options) as unknown as Leaf;\n }\n default:\n return null;\n }\n}\n\n/** A leaf for an object-valued arg: from its argType's shape where one is given and editable, else a JSON leaf. */\nfunction structured(argType: ArgType, value: unknown): Leaf | null {\n return (argType.type ? shaped(argType.type, value) : null) ?? inferred(value);\n}\n\nfunction bounded(node: ReturnType<typeof f.number>, control: Control) {\n let out = node;\n if (control.min !== undefined && control.max !== undefined) out = out.range(control.min, control.max);\n if (control.step !== undefined) out = out.step(control.step);\n return out;\n}\n\nfunction controlled(control: Control, argType: ArgType, has: boolean, value: unknown): Leaf | null {\n const options = stringOptions(argType);\n // Storybook passes an argTypes-only key as undefined, so the component's own default applies.\n const def = <T>() => (has ? value : undefined) as T;\n switch (control.type) {\n case 'number': {\n const node = bounded(f.number(def()), control);\n return control.min !== undefined && control.max !== undefined ? node.input() : node;\n }\n case 'range':\n case 'slider':\n return has ? bounded(f.number(def()), control).slider() : null;\n case 'boolean':\n return f.boolean(def());\n case 'switch':\n return f.boolean(def()).toggle();\n case 'text':\n case 'textarea':\n return f.string(def());\n case 'select':\n case 'radio':\n case 'inline-radio':\n case undefined: {\n if (!options) return control.type === undefined && has ? structured(argType, value) : null;\n const { icons } = control;\n const node = f.enum(\n def<string>(),\n icons ? options.map((value) => {\n const ref = iconFromData(icons[value]);\n return { value, label: value, ...(ref ? { icon: ref } : {}) };\n }) : options,\n );\n return control.type === 'radio' || control.type === 'inline-radio' ? node.radio() : node;\n }\n case 'object':\n return has ? (argType.type ? shaped(argType.type, value) : null) ?? f.custom('json', value) : null;\n default:\n return has ? inferred(value) : null;\n }\n}\n\n/** The config predicate for an `if`; null for a condition on a global, which a story's config does not hold. */\nfunction conditionOf(condition: ArgCondition): ((config: Record<string, unknown>) => boolean) | null {\n if (!('arg' in condition)) return null;\n const { arg } = condition;\n return (config) => {\n const value = config[arg];\n if (condition.exists !== undefined) return (value !== undefined) === condition.exists;\n if ('eq' in condition) return Object.is(value, condition.eq);\n if ('neq' in condition) return !Object.is(value, condition.neq);\n return Boolean(value) === (condition.truthy ?? true);\n };\n}\n\n/** `parameters.controls.matchers`: arg names that pick a control when the arg's argType names none. */\nexport interface ControlMatchers {\n color?: RegExp;\n /** labkit has no date leaf, so a date match keeps the leaf its value infers. */\n date?: RegExp;\n}\n\n/** Storybook's rule: a string arg with no control or options whose name matches `color` gets a color picker. */\nfunction matched(key: string, value: unknown, argType: ArgType | undefined, matchers: ControlMatchers): Leaf | null {\n if (typeof value !== 'string' || argType?.control !== undefined || stringOptions(argType ?? {})) return null;\n return matchers.color?.test(key) ? f.color(value) : null;\n}\n\n/** A labkit schema for a CSF story's args, refined by its `argTypes`. */\nexport function argsToSchema(\n args: Readonly<Record<string, unknown>>,\n argTypes: Readonly<Record<string, ArgType | undefined>>,\n matchers: ControlMatchers = {},\n): ConfigSchema<unknown> {\n const nodes: Record<string, Leaf> = {};\n for (const key of new Set([...Object.keys(args), ...Object.keys(argTypes)])) {\n const has = key in args;\n // A control carries only what crosses the port; the frame puts the rest back from `args` (`withUnsent`).\n const part = has ? portSafePart(args[key]) : null;\n if (has && !part) continue;\n const value = part?.value;\n const argType = argTypes[key];\n const control = argType ? controlOf(argType) : false;\n\n let node: Leaf | null =\n (has ? matched(key, value, argType, matchers) : null) ??\n (control ? controlled(control, argType ?? {}, has, value) : has ? inferred(value) : null);\n if (!node) continue;\n if (argType && (argType.control === false || argType.table?.disable)) node = node.hidden();\n if (argType?.description) node = node.describe(argType.description);\n if (argType?.name) node = node.label(argType.name);\n const shownWhen = argType?.if ? conditionOf(argType.if) : null;\n if (shownWhen) node = node.showIf(shownWhen);\n nodes[key] = node;\n }\n return f.schema(nodes as ConfigShape);\n}\n","import type { TimelineSpec } from './clock';\n\nconst isSpec = (value: unknown): value is TimelineSpec =>\n !!value && typeof value === 'object' && typeof (value as { duration?: unknown }).duration === 'number';\n\n/** A declared timeline as a function of config: a spec stands for itself at every config, a function is called with\n * the config. Anything else declares none. `adapt` turns the trial's config into what the function is handed. */\nexport function timelineOf(\n value: unknown,\n adapt: (config: unknown) => unknown = (config) => config,\n): ((config: unknown) => TimelineSpec) | null {\n if (isSpec(value)) return () => value;\n if (typeof value === 'function') return (config) => (value as (input: unknown) => TimelineSpec)(adapt(config));\n return null;\n}\n","import {\n type ComponentType,\n createContext,\n createElement,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport type { Globals, Layout, Viewport } from '../protocol/messages';\nimport { storyId, storyNameFromExport } from '../story/ids';\nimport type { Decorator, LoadedStory, PlayContext, StoryContext } from '../story/types';\nimport { type ArgsScope, ArgsContext, appliedLocal, coverOf, type LocalArgs } from './argsContext';\nimport { type ArgType, argsToSchema, type ControlMatchers } from './argsToSchema';\nimport { isPlainObject } from '@weasel-js/core';\nimport { withUnsent } from './portSafe';\nimport { PROP_ARG_TYPES_EXPORT } from './propArgTypes';\nimport { timelineOf } from '../timeline/declare';\n\ntype Args = Record<string, unknown>;\ntype CsfContext = {\n args: Args;\n globals: Globals;\n parameters: Record<string, unknown>;\n title: string;\n name: string;\n id: string;\n viewMode: 'story';\n};\ntype CsfRender = (args: Args, context: CsfContext) => ReactNode;\ntype CsfDecorator = (Story: ComponentType, context: CsfContext) => ReactNode;\ntype CsfPlay = (context: CsfContext & { canvasElement: HTMLElement; step: CsfStep }) => void | Promise<void>;\ntype CsfStep = (label: string, fn: () => void | Promise<void>) => Promise<void>;\n\ninterface Annotations {\n title?: string;\n name?: string;\n storyName?: string;\n component?: ComponentType<Args>;\n args?: Args;\n argTypes?: Record<string, ArgType>;\n parameters?: Record<string, unknown>;\n globals?: Record<string, unknown>;\n decorators?: CsfDecorator | CsfDecorator[];\n render?: CsfRender;\n play?: CsfPlay;\n includeStories?: string[] | RegExp;\n excludeStories?: string[] | RegExp;\n}\n\nconst LAYOUTS: readonly Layout[] = ['centered', 'padded', 'fullscreen'];\n\nconst asArray = <T,>(value: T | T[] | undefined): T[] => (value === undefined ? [] : Array.isArray(value) ? value : [value]);\n\n/** Storybook's `deleteUndefined`, which its args store applies after every update. */\nconst withoutUndefined = (args: Args): Args =>\n Object.fromEntries(Object.entries(args).filter(([, value]) => value !== undefined));\n\n/** Storybook's `matches` from `isExportStory`. */\nconst matches = (key: string, filter: string[] | RegExp) =>\n Array.isArray(filter) ? filter.includes(key) : key.match(filter) !== null;\n\n/** Storybook's `combineParameters`: plain objects merge deeply, anything else is replaced. */\nfunction combineParameters(...sources: (Record<string, unknown> | undefined)[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const source of sources) {\n for (const [key, value] of Object.entries(source ?? {})) {\n if (value === undefined) continue;\n out[key] = isPlainObject(value) && isPlainObject(out[key]) ? combineParameters(out[key], value) : value;\n }\n }\n return out;\n}\n\nfunction resolveViewport(parameters: Record<string, unknown>, globals: Record<string, unknown>): Viewport | null {\n const selected = globals.viewport as { value?: string; isRotated?: boolean } | undefined;\n const options = (parameters.viewport as { options?: Record<string, { styles?: { width?: string; height?: string } }> } | undefined)\n ?.options;\n const styles = selected?.value ? options?.[selected.value]?.styles : undefined;\n const px = (v: string | undefined) => (v && /^\\d+(\\.\\d+)?px$/.test(v) ? Number.parseFloat(v) : Number.NaN);\n const width = px(styles?.width);\n const height = px(styles?.height);\n if (Number.isNaN(width) || Number.isNaN(height)) return null;\n return selected?.isRotated ? { width: height, height: width } : { width, height };\n}\n\nconst InnerStory = createContext<(() => ReactNode) | null>(null);\n\nfunction Story(): ReactNode {\n return useContext(InnerStory)?.() ?? null;\n}\n\nfunction Call({ fn }: { fn: () => ReactNode }): ReactNode {\n return fn();\n}\n\ninterface StoryLocals {\n story: string;\n local: LocalArgs;\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nconst LocalArgsContext = createContext<StoryLocals | null>(null);\n\n/** The outermost scope of a story holds its frame-local args, so its decorators and render share them. */\nfunction Scoped({\n id,\n build,\n fn,\n}: {\n id: string;\n build: (local: StoryLocals) => [ArgsScope, CsfContext];\n fn: (context: CsfContext) => ReactNode;\n}): ReactNode {\n const outer = useContext(LocalArgsContext);\n const [local, setLocal] = useState<LocalArgs>({});\n const shared = outer?.story === id ? outer : { story: id, local, setLocal };\n const [scope, context] = build(shared);\n const { config } = scope;\n const prune = shared.setLocal;\n // An entry config has moved past must not come back if config later returns to the value it covered.\n useEffect(() => {\n prune((prev) => {\n const kept = Object.entries(prev).filter(([key, entry]) => coverOf(config[key]) === entry.over);\n return kept.length === Object.keys(prev).length ? prev : Object.fromEntries(kept);\n });\n }, [config, prune]);\n return createElement(\n LocalArgsContext.Provider,\n { value: shared },\n createElement(ArgsContext.Provider, { value: scope }, createElement(Call, { fn: () => fn(context) })),\n );\n}\n\n/**\n * Normalizes a Component Story Format module. `title` is the index entry's, which wins over the meta's own: the\n * index reads the meta without running it and falls back to the auto title for one it cannot read, so taking the\n * meta's here would give one story two ids. `parameters` are the project's, under the meta's and each story's.\n */\nexport function loadCsfModule(\n mod: Record<string, unknown>,\n title: string,\n projectParameters: Record<string, unknown> = {},\n): LoadedStory[] {\n const meta = (isPlainObject(mod.default) ? mod.default : {}) as Annotations;\n const stories: LoadedStory[] = [];\n const propArgTypes = isPlainObject(mod[PROP_ARG_TYPES_EXPORT]) ? (mod[PROP_ARG_TYPES_EXPORT] as Record<string, ArgType>) : undefined;\n\n for (const [exportName, value] of Object.entries(mod)) {\n if (exportName === PROP_ARG_TYPES_EXPORT) continue;\n if (exportName === 'default' || exportName === '__namedExportsOrder' || exportName === '__esModule') continue;\n if (meta.includeStories && !matches(exportName, meta.includeStories)) continue;\n if (meta.excludeStories && matches(exportName, meta.excludeStories)) continue;\n if (!value || (typeof value !== 'object' && typeof value !== 'function')) continue;\n\n // A CSF 2 function export hoists its annotations onto itself.\n const spec: Annotations = typeof value === 'function' ? { ...value, render: value as CsfRender } : (value as Annotations);\n const id = storyId(title, exportName);\n const name = spec.name || spec.storyName || storyNameFromExport(exportName);\n const args = { ...meta.args, ...spec.args };\n const parameters = combineParameters(projectParameters, meta.parameters, spec.parameters);\n const matchers = (parameters.controls as { matchers?: ControlMatchers } | undefined)?.matchers;\n const render = spec.render ?? meta.render;\n // A render that takes no args draws the same thing whatever a prop's control says.\n const fromProps = render === undefined || render.length > 0 ? propArgTypes : undefined;\n const config = argsToSchema(\n args,\n combineParameters(fromProps, meta.argTypes, spec.argTypes) as Record<string, ArgType>,\n isPlainObject(matchers) ? matchers : {},\n );\n const defaults = config.defaults() as Args;\n const storyGlobals = { ...meta.globals, ...spec.globals };\n const component = meta.component;\n const renderFn: CsfRender | undefined =\n render ?? (component ? (a) => createElement(component, a) : undefined);\n\n const withArgs = (config: Args): Args =>\n Object.fromEntries(\n Object.entries(withoutUndefined(config)).map(([key, value]) => [key, key in args ? withUnsent(value, args[key]) : value]),\n );\n const csfContext = (config: unknown, globals: Globals, local: LocalArgs = {}): CsfContext => ({\n args: withoutUndefined({ ...args, ...withArgs(config as Args), ...appliedLocal(local, config as Args) }),\n globals,\n parameters,\n title,\n name,\n id,\n viewMode: 'story',\n });\n const scoped = (ctx: StoryContext, fn: (context: CsfContext) => ReactNode): ReactNode =>\n createElement(Scoped, {\n id,\n build: ({ local, setLocal }: StoryLocals): [ArgsScope, CsfContext] => {\n const context = csfContext(ctx.config, ctx.globals, local);\n const scope: ArgsScope = {\n args: context.args,\n config: ctx.config as Args,\n defaults,\n original: args,\n setConfig: ctx.setConfig,\n setLocal,\n };\n return [scope, context];\n },\n fn,\n });\n\n const adapt =\n (decorator: CsfDecorator): Decorator =>\n (inner, ctx) =>\n createElement(\n InnerStory.Provider,\n { value: inner },\n scoped(ctx, (context) => decorator(Story, context)),\n );\n\n const layout = parameters.layout as Layout | undefined;\n const forgeParams = parameters.forge as { isolate?: unknown; timeline?: unknown } | undefined;\n const isolate = forgeParams?.isolate;\n const play = spec.play ?? meta.play;\n\n stories.push({\n id,\n title,\n name,\n exportName,\n config,\n initialState: null,\n render: (ctx) => {\n if (!renderFn) return null;\n return scoped(ctx, (context) => renderFn(context.args, context));\n },\n decorators: [...asArray(spec.decorators), ...asArray(meta.decorators)].map(adapt),\n layout: layout && LAYOUTS.includes(layout) ? layout : 'padded',\n viewport: resolveViewport(parameters, storyGlobals),\n isolate: typeof isolate === 'string' ? isolate : null,\n play: play\n ? ({ canvasElement, config, globals }: PlayContext) =>\n play({ ...csfContext(config, globals), canvasElement, step: async (_label, fn) => fn() })\n : null,\n timeline: timelineOf(forgeParams?.timeline, (config) => csfContext(config, {}).args),\n });\n }\n return stories;\n}\n","import { f } from '@weasel-js/labkit/config';\nimport { isNative } from './define';\nimport { storyId, storyNameFromExport } from './ids';\nimport { timelineOf } from '../timeline/declare';\nimport type { LoadedStory, MetaSpec, StorySpec } from './types';\n\n/**\n * Normalizes a module written with `meta` and `story`; exports that are not stories are skipped. `title` is the index\n * entry's, which wins over the meta's own: the index reads the meta without running it and can miss it, so taking\n * the meta's here would give one story two titles.\n */\nexport function loadNativeModule(mod: Record<string, unknown>, title: string): LoadedStory[] {\n const metaSpec: MetaSpec = isNative(mod.default, 'meta') ? (mod.default as MetaSpec) : {};\n const stories: LoadedStory[] = [];\n for (const [exportName, value] of Object.entries(mod)) {\n if (exportName === 'default' || !isNative(value, 'story')) continue;\n const spec = value as StorySpec<unknown, unknown>;\n stories.push({\n id: storyId(title, exportName),\n title,\n name: spec.name ?? storyNameFromExport(exportName),\n exportName,\n config: spec.config ?? f.schema({}),\n initialState: spec.state ?? null,\n render: spec.render,\n decorators: [...(spec.decorators ?? []), ...(metaSpec.decorators ?? [])],\n layout: spec.layout ?? metaSpec.layout ?? 'centered',\n viewport: spec.viewport ?? null,\n isolate: spec.isolate ?? metaSpec.isolate ?? null,\n play: spec.play ?? null,\n timeline: timelineOf(spec.timeline ?? metaSpec.timeline),\n });\n }\n return stories;\n}\n","import { loadCsfModule } from '../csf/loadCsfModule';\nimport { isNative } from './define';\nimport { loadNativeModule } from './native';\nimport type { IndexRender, LoadedStory } from './types';\n\n/**\n * A story module's stories: a module whose default export is a forge `meta` is native, anything else is CSF under\n * `parameters`. `title` is the module's index entry title, which every story takes as given.\n */\nexport function loadStories(\n mod: Record<string, unknown>,\n title: string,\n parameters?: Record<string, unknown>,\n): LoadedStory[] {\n return isNative(mod.default, 'meta')\n ? loadNativeModule(mod, title)\n : loadCsfModule(mod, title, parameters);\n}\n\n/** A module's own index page: a native meta's `index`, or a CSF meta's `parameters.forge.index`. */\nexport function indexRenderOf(mod: Record<string, unknown>): IndexRender | null {\n const meta = mod.default as { index?: unknown; parameters?: { forge?: { index?: unknown } } } | undefined;\n const render = isNative(meta, 'meta') ? meta?.index : meta?.parameters?.forge?.index;\n return typeof render === 'function' ? (render as IndexRender) : null;\n}\n","import { type RefObject, useEffect, useState } from 'react';\n\n/** How far past the viewport a trial's story stays mounted, so a small scroll back does not reload it. */\nexport const IN_VIEW_MARGIN = '50%';\n\n/**\n * Whether `ref`'s element lies within `margin` of its document's viewport; true where the browser cannot say.\n * Decided by where the element is, not by whether any of it shows: `isIntersecting` is false too for an element an\n * `overflow` ancestor clips away, as a narrow lab tile does to its content while the tiling changes. `initial` is\n * the answer before the browser has given one: false for content too costly to mount everywhere at once.\n */\nexport function useNearViewport(ref: RefObject<Element | null>, margin: string, initial = true): boolean {\n const [near, setNear] = useState(() => initial || typeof IntersectionObserver === 'undefined');\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof IntersectionObserver === 'undefined') return;\n // A fresh observe always reports, wherever the element is.\n const recheck = () => {\n observer.unobserve(el);\n observer.observe(el);\n };\n let watching = false;\n const watch = (on: boolean) => {\n if (on === watching) return;\n watching = on;\n if (on) {\n document.addEventListener('scroll', recheck, { capture: true, passive: true });\n window.addEventListener('resize', recheck);\n } else {\n document.removeEventListener('scroll', recheck, { capture: true });\n window.removeEventListener('resize', recheck);\n }\n };\n const observer = new IntersectionObserver(\n (entries) => {\n const last = entries.at(-1);\n if (!last) return;\n const root = last.rootBounds;\n const box = last.boundingClientRect;\n setNear(\n root\n ? box.bottom >= root.top && box.top <= root.bottom && box.right >= root.left && box.left <= root.right\n : last.isIntersecting,\n );\n // While nothing of it intersects, a clip can hide every move from the observer, so ask again on each scroll.\n watch(Boolean(root) && !last.isIntersecting);\n },\n { root: document, rootMargin: margin },\n );\n observer.observe(el);\n return () => {\n observer.disconnect();\n watch(false);\n };\n }, [ref, margin]);\n return near;\n}\n","import { useLatest } from '@weasel-js/core';\nimport { type RefObject, useLayoutEffect, useRef } from 'react';\nimport { createOverrides, type Overrides } from '../frame/cssVars';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { createGlobalsTarget } from '../frame/globalsTarget';\nimport type { Globals } from '../protocol/messages';\nimport type { CssOverrides } from './cssVars/overrides';\n\n/** A selector matching only the element carrying `id`. */\nexport const scopeOf = (id: string) => `[data-fg-host=\"${id}\"]`;\n\n/** Applies `globals` to the host carrying `hostId` through `setup`; the returned function removes what it styled. */\nexport function applyGlobalsTo(host: HTMLElement, hostId: string, globals: Globals, setup: FrameSetup): () => void {\n const target = createGlobalsTarget(host, scopeOf(hostId));\n setup.applyGlobals?.(globals, target);\n return () => target.dispose();\n}\n\n/**\n * The conditions a host element lives under: its globals target, and its CSS variable overrides rule with the\n * trial's persisted overrides put back and kept in step. Everything is scoped to `hostId`; no registry connection.\n * The returned ref holds the overrides while `host` is set.\n */\nexport function useHostConditions(\n host: HTMLElement | null,\n opts: { hostId: string; globals: Globals; overrides: CssOverrides; setup: FrameSetup },\n): RefObject<Overrides | null> {\n const { hostId, globals, overrides: persisted, setup } = opts;\n const latest = useLatest({ setup });\n const overridesRef = useRef<Overrides | null>(null);\n\n useLayoutEffect(() => {\n if (!host) return;\n const scope = scopeOf(hostId);\n const { cssVarsScope } = latest.current.setup;\n overridesRef.current = createOverrides(\n host.ownerDocument,\n cssVarsScope ? `${scope}, ${scope} :is(${cssVarsScope})` : scope,\n );\n return () => {\n overridesRef.current?.dispose();\n overridesRef.current = null;\n };\n }, [host, hostId, latest]);\n\n const applied = useRef<Record<string, string>>({});\n useLayoutEffect(() => {\n const overrides = overridesRef.current;\n if (!overrides) return;\n for (const name of Object.keys(applied.current)) if (!(name in persisted)) overrides.set(name, null);\n for (const [name, value] of Object.entries(persisted)) overrides.set(name, value);\n applied.current = { ...persisted };\n }, [host, hostId, persisted]);\n\n useLayoutEffect(\n () => (host ? applyGlobalsTo(host, hostId, globals, latest.current.setup) : undefined),\n [host, hostId, globals, latest],\n );\n\n return overridesRef;\n}\n"]}
|
|
@@ -56,5 +56,5 @@ function indexEntries(stories) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
export { byComponent, indexEntries, indexId, isIndexId };
|
|
59
|
-
//# sourceMappingURL=chunk-
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
59
|
+
//# sourceMappingURL=chunk-RVJHUY7W.js.map
|
|
60
|
+
//# sourceMappingURL=chunk-RVJHUY7W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/story/indexPages.ts"],"names":[],"mappings":"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","file":"chunk-RVJHUY7W.js","sourcesContent":["import { sanitize } from './ids';\nimport type { IndexEntry } from './types';\n\nconst SUFFIX = ':index';\n\n/** The name an index page goes by in the sidebar and in its trial's title. */\nexport const INDEX_NAME = 'Index';\n\n/** The id of `title`'s index page. A colon never survives `sanitize`, so no story id can collide with it. */\nexport function indexId(title: string): string {\n return `${sanitize(title)}${SUFFIX}`;\n}\n\nexport function isIndexId(id: string): boolean {\n return id.endsWith(SUFFIX);\n}\n\n/** A story file's name with its `.stories.tsx`-style suffix removed: `Bar` for `/x/Bar.stories.tsx`. */\nfunction stemOf(file: string): string {\n const name = file.replaceAll('\\\\', '/').split('/').pop() ?? file;\n return name.replace(/(?:\\.(?:story|stories))?\\.[^.]+$/i, '');\n}\n\n/**\n * The file that speaks for a title several story files share: the one named for the title's last segment, so\n * `Bar.stories.tsx` over `lab/BarArc.stories.tsx` for `ui/Bar`, else the first. Its meta describes the component.\n */\nexport function primaryFile(title: string, files: readonly string[]): string | undefined {\n const name = (title.split('/').pop() ?? title).toLowerCase();\n return files.find((file) => stemOf(file).toLowerCase() === name) ?? files[0];\n}\n\n/** `stories` grouped by title, in the order titles first appear, each title's primary file's stories first. */\nexport function byComponent<E extends Pick<IndexEntry, 'title' | 'file'>>(stories: readonly E[]): E[] {\n const byTitle = new Map<string, E[]>();\n for (const entry of stories) {\n const group = byTitle.get(entry.title);\n if (group) group.push(entry);\n else byTitle.set(entry.title, [entry]);\n }\n return [...byTitle].flatMap(([title, group]) => {\n const primary = primaryFile(title, [...new Set(group.map((entry) => entry.file))]);\n return [...group.filter((entry) => entry.file === primary), ...group.filter((entry) => entry.file !== primary)];\n });\n}\n\n/**\n * One index-page entry per title in `stories`, in the order titles first appear. It routes and runs like a story:\n * its `file` is the title's primary file, its descriptions are that file's, and its tags are those every story\n * of the title carries.\n */\nexport function indexEntries(stories: readonly IndexEntry[]): IndexEntry[] {\n const byTitle = new Map<string, IndexEntry>();\n for (const entry of byComponent(stories)) {\n const page = byTitle.get(entry.title);\n if (page) {\n if (page.tags) {\n const common = page.tags.filter((tag) => entry.tags?.includes(tag));\n if (common.length > 0) page.tags = common;\n else delete page.tags;\n }\n continue;\n }\n byTitle.set(entry.title, {\n id: indexId(entry.title),\n title: entry.title,\n name: INDEX_NAME,\n exportName: '',\n file: entry.file,\n ...(entry.componentDescription === undefined ? {} : { componentDescription: entry.componentDescription }),\n ...(entry.componentName === undefined ? {} : { componentName: entry.componentName }),\n ...(entry.tags === undefined ? {} : { tags: entry.tags }),\n });\n }\n return [...byTitle.values()];\n}\n"]}
|