@stream-mdx/core 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +26 -37
- package/dist/code-highlighting.cjs +0 -1
- package/dist/code-highlighting.mjs +0 -1
- package/dist/index.cjs +94 -2
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +93 -2
- package/dist/inline-parser.cjs +0 -1
- package/dist/inline-parser.mjs +0 -1
- package/dist/mixed-content.cjs +0 -1
- package/dist/mixed-content.mjs +0 -1
- package/dist/perf/backpressure.cjs +0 -1
- package/dist/perf/backpressure.mjs +0 -1
- package/dist/perf/patch-batching.cjs +0 -1
- package/dist/perf/patch-batching.mjs +0 -1
- package/dist/perf/patch-coalescing.cjs +0 -1
- package/dist/perf/patch-coalescing.mjs +0 -1
- package/dist/security.cjs +1 -2
- package/dist/security.d.cts +1 -1
- package/dist/security.d.ts +1 -1
- package/dist/security.mjs +1 -2
- package/dist/streaming/custom-matcher.cjs +118 -0
- package/dist/streaming/custom-matcher.d.cts +22 -0
- package/dist/streaming/custom-matcher.d.ts +22 -0
- package/dist/streaming/custom-matcher.mjs +93 -0
- package/dist/types.cjs +0 -1
- package/dist/types.mjs +0 -1
- package/dist/utils.cjs +0 -1
- package/dist/utils.mjs +0 -1
- package/dist/worker-html-sanitizer.cjs +0 -1
- package/dist/worker-html-sanitizer.mjs +0 -1
- package/package.json +12 -2
- package/dist/code-highlighting.cjs.map +0 -1
- package/dist/code-highlighting.mjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/inline-parser.cjs.map +0 -1
- package/dist/inline-parser.mjs.map +0 -1
- package/dist/mixed-content.cjs.map +0 -1
- package/dist/mixed-content.mjs.map +0 -1
- package/dist/perf/backpressure.cjs.map +0 -1
- package/dist/perf/backpressure.mjs.map +0 -1
- package/dist/perf/patch-batching.cjs.map +0 -1
- package/dist/perf/patch-batching.mjs.map +0 -1
- package/dist/perf/patch-coalescing.cjs.map +0 -1
- package/dist/perf/patch-coalescing.mjs.map +0 -1
- package/dist/security.cjs.map +0 -1
- package/dist/security.mjs.map +0 -1
- package/dist/types.cjs.map +0 -1
- package/dist/types.mjs.map +0 -1
- package/dist/utils.cjs.map +0 -1
- package/dist/utils.mjs.map +0 -1
- package/dist/worker-html-sanitizer.cjs.map +0 -1
- package/dist/worker-html-sanitizer.mjs.map +0 -1
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/block-snapshot.ts","../src/code-highlighting.ts","../src/inline-parser.ts","../src/worker-html-sanitizer.ts","../src/mixed-content.ts","../src/utils.ts","../src/security.ts","../src/perf/backpressure.ts","../src/perf/patch-coalescing.ts"],"sourcesContent":["export * from \"./types\";\nexport * from \"./block-snapshot\";\nexport * from \"./code-highlighting\";\nexport * from \"./utils\";\nexport * from \"./mixed-content\";\nexport * from \"./security\";\nexport * from \"./inline-parser\";\nexport * from \"./worker-html-sanitizer\";\nexport * from \"./perf/backpressure\";\nexport * from \"./perf/patch-coalescing\";\n","// Core contracts (public types) - V2 Markdown Renderer\n// Based on final_spec.md architecture\n\n/**\n * Core Block representation for streaming markdown\n */\nexport interface Block {\n id: string; // stable content hash\n type: \"paragraph\" | \"heading\" | \"code\" | \"list\" | \"blockquote\" | \"mdx\" | \"html\" | \"table\" | \"footnote-def\" | \"footnotes\" | string;\n isFinalized: boolean;\n payload: {\n raw: string;\n inline?: InlineNode[]; // serialized inline tree\n highlightedHtml?: string; // safe HTML (code only)\n sanitizedHtml?: string; // sanitized HTML (html blocks)\n compiledMdxRef?: { id: string } | null; // server-compiled artifact key\n compiledMdxModule?: CompiledMdxModule | null; // inline compiled module (worker/client side)\n meta?: Record<string, unknown>; // e.g., code fence info, table align\n range?: { from: number; to: number }; // original source offsets\n };\n}\n\nexport interface CompiledMdxModule {\n id: string;\n code: string;\n dependencies?: string[];\n source?: \"server\" | \"worker\";\n}\n\nexport interface MixedContentSegment {\n kind: \"text\" | \"html\" | \"mdx\";\n value: string;\n range?: { from: number; to: number };\n inline?: InlineNode[];\n sanitized?: string;\n status?: \"pending\" | \"compiled\" | \"error\";\n error?: string;\n}\n\nexport interface InlineHtmlDescriptor {\n tagName: string;\n attributes: Record<string, string>;\n raw: string;\n sanitized: string;\n rawInner: string;\n sanitizedInner: string;\n text: string;\n}\n\nexport type ProtectedRangeKind = \"math-inline\" | \"math-display\" | \"code-inline\" | \"code-block\" | \"code-fence\" | \"html-inline\" | \"html-block\" | \"autolink\";\n\nexport interface ProtectedRange {\n from: number;\n to: number;\n kind: ProtectedRangeKind;\n}\n\n/**\n * Inline node types for rich text rendering\n */\nexport type InlineNode =\n | { kind: \"text\"; text: string }\n | { kind: \"strong\"; children: InlineNode[] }\n | { kind: \"em\"; children: InlineNode[] }\n | { kind: \"strike\"; children: InlineNode[] }\n | { kind: \"code\"; text: string }\n | { kind: \"link\"; href?: string; title?: string; children: InlineNode[] }\n | { kind: \"image\"; src: string; alt?: string; title?: string }\n | { kind: \"br\" }\n // extensible:\n | { kind: \"mention\"; handle: string }\n | { kind: \"citation\"; id: string }\n | { kind: \"math-inline\"; tex: string }\n | { kind: \"math-display\"; tex: string }\n | { kind: \"footnote-ref\"; label: string; number?: number };\n\n/**\n * Worker communication protocol\n */\nexport type WorkerIn =\n | {\n type: \"INIT\";\n initialContent?: string;\n prewarmLangs?: string[];\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean };\n mdx?: { compileMode?: \"server\" | \"worker\" };\n }\n | { type: \"APPEND\"; text: string }\n | { type: \"FINALIZE\" }\n | { type: \"MDX_COMPILED\"; blockId: string; compiledId: string }\n | { type: \"MDX_ERROR\"; blockId: string; error?: string }\n | { type: \"SET_CREDITS\"; credits: number };\n\nexport type WorkerPhase = WorkerIn[\"type\"] | \"UNKNOWN\";\n\nexport interface WorkerErrorPayload {\n message: string;\n name?: string;\n stack?: string;\n}\n\nexport type WorkerOut =\n | { type: \"INITIALIZED\"; blocks: Block[] }\n | { type: \"PATCH\"; tx: number; patches: Patch[]; metrics?: PatchMetrics }\n | { type: \"RESET\"; reason: string }\n | { type: \"METRICS\"; metrics: PerformanceMetrics }\n | { type: \"ERROR\"; phase: WorkerPhase; error: WorkerErrorPayload; blockId?: string; meta?: Record<string, unknown>; timestamp?: number };\n\n/**\n * Inline plugin system\n */\nexport interface InlinePlugin {\n id: string;\n priority: number; // lower runs earlier\n apply(nodes: InlineNode[]): InlineNode[];\n}\n\nexport interface RegexInlinePlugin extends InlinePlugin {\n re: RegExp; // global; must not match across newlines\n toNode: (match: RegExpExecArray) => InlineNode | InlineNode[];\n /**\n * Optional fast-path predicate. If provided and returns false for a given text node,\n * the regex is skipped for that node.\n */\n fastCheck?: (text: string) => boolean;\n}\n\nexport interface ASTInlinePlugin extends InlinePlugin {\n visit: (node: InlineNode, ctx: { replace(node: InlineNode, next: InlineNode | InlineNode[]): void }) => void;\n}\n\n/**\n * Language normalization\n */\nexport const LANGUAGE_ALIASES: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"tsx\",\n js: \"javascript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n yml: \"yaml\",\n tf: \"terraform\",\n py: \"python\",\n rb: \"ruby\",\n // ...extendable map\n};\n\n/**\n * Performance metrics from worker\n */\nexport interface PerformanceMetrics {\n tx?: number;\n timestamp?: number;\n parseMs?: number;\n parseTime: number;\n enrichMs?: number;\n diffMs?: number;\n serializeMs?: number;\n highlightTime: number;\n shikiMs?: number;\n mdxDetectMs?: number;\n patchBytes?: number;\n patchCount?: number;\n queueDepth?: number;\n blocksProduced: number;\n grammarEngine: \"js\" | \"wasm\";\n blockCountByType?: Record<string, number>;\n blockEnrichMsByType?: Record<string, number>;\n blockSizeByType?: Record<string, number>;\n highlightByLanguage?: Record<string, { timeMs: number; count: number }>;\n appendLineBatches?: number;\n appendLineTotalLines?: number;\n appendLineMaxLines?: number;\n}\n\n/**\n * Incremental patch protocol (initial block-level implementation).\n * These types will evolve to support subtree updates.\n */\nexport const PATCH_ROOT_ID = \"__root__\";\n\nexport interface NodeSnapshot {\n id: string;\n type: string;\n props?: Record<string, unknown>;\n children?: NodeSnapshot[];\n range?: { from: number; to: number };\n meta?: Record<string, unknown>;\n}\n\nexport interface NodePath {\n blockId: string;\n nodeId?: string;\n indexPath?: number[];\n}\n\nexport type Patch =\n | { op: \"insertChild\"; at: NodePath; index: number; node: NodeSnapshot }\n | { op: \"deleteChild\"; at: NodePath; index: number }\n | { op: \"replaceChild\"; at: NodePath; index: number; node: NodeSnapshot }\n | { op: \"setProps\"; at: NodePath; props: Record<string, unknown> }\n | { op: \"setPropsBatch\"; entries: SetPropsBatchEntry[] }\n | { op: \"finalize\"; at: NodePath }\n | { op: \"reorder\"; at: NodePath; from: number; to: number; count: number }\n | {\n op: \"appendLines\";\n at: NodePath;\n startIndex: number;\n lines: string[];\n highlight?: Array<string | null>;\n }\n | {\n op: \"setHTML\";\n at: NodePath;\n html: string;\n policy?: string;\n block?: Block;\n meta?: Record<string, unknown>;\n sanitized?: boolean;\n };\n\nexport interface PatchMetrics {\n patchCount: number;\n changedBlocks: number;\n diffTime?: number;\n parseTime?: number;\n enrichTime?: number;\n queueDepth?: number;\n patchBytes?: number;\n appendLineBatches?: number;\n appendLineTotalLines?: number;\n appendLineMaxLines?: number;\n}\n\nexport interface SetPropsBatchEntry {\n at: NodePath;\n props: Record<string, unknown>;\n}\n\nexport interface CoalescingMetrics {\n inputPatchCount: number;\n outputPatchCount: number;\n coalescedCount: number;\n durationMs: number;\n appendLinesCoalesced: number;\n setPropsCoalesced: number;\n insertChildCoalesced: number;\n}\n","import { parser as mdParser } from \"@lezer/markdown\";\nimport { extractCodeLines, extractCodeWrapperAttributes, extractHighlightedLines, stripCodeFence } from \"./code-highlighting\";\nimport { InlineParser } from \"./inline-parser\";\nimport { extractMixedContentSegments } from \"./mixed-content\";\nimport type {\n Block,\n InlineNode,\n MixedContentSegment,\n NodeSnapshot,\n NodePath,\n Patch,\n SetPropsBatchEntry,\n} from \"./types\";\nimport { PATCH_ROOT_ID } from \"./types\";\nimport { normalizeBlockquoteText, parseCodeFenceInfo } from \"./utils\";\n\nexport function cloneBlock(block: Block): Block {\n return {\n ...block,\n payload: {\n ...block.payload,\n inline: block.payload.inline ? cloneInlineNodes(block.payload.inline) : undefined,\n highlightedHtml: block.payload.highlightedHtml,\n sanitizedHtml: block.payload.sanitizedHtml,\n compiledMdxRef: block.payload.compiledMdxRef ? { ...block.payload.compiledMdxRef } : undefined,\n compiledMdxModule: block.payload.compiledMdxModule\n ? {\n ...block.payload.compiledMdxModule,\n dependencies: Array.isArray(block.payload.compiledMdxModule.dependencies) ? [...block.payload.compiledMdxModule.dependencies] : undefined,\n }\n : block.payload.compiledMdxModule === null\n ? null\n : undefined,\n meta: block.payload.meta ? structuredCloneIfPossible(block.payload.meta) : undefined,\n range: block.payload.range ? { ...block.payload.range } : undefined,\n },\n };\n}\n\nexport function blocksStructurallyEqual(a: Block, b: Block): boolean {\n if (a.type !== b.type) return false;\n if (a.isFinalized !== b.isFinalized) return false;\n if (a.payload.raw !== b.payload.raw) return false;\n const metaA = a.payload.meta ?? null;\n const metaB = b.payload.meta ?? null;\n if (!deepEqual(metaA, metaB)) return false;\n return true;\n}\n\nexport function createBlockSnapshot(block: Block): NodeSnapshot {\n const base: NodeSnapshot = {\n id: block.id,\n type: block.type,\n props: {\n block: cloneBlock(block),\n },\n meta: block.payload.meta ? structuredCloneIfPossible(block.payload.meta) : undefined,\n range: block.payload.range ? { ...block.payload.range } : undefined,\n children: [],\n };\n\n switch (block.type) {\n case \"paragraph\":\n return enrichParagraphSnapshot(block, base);\n case \"blockquote\":\n return enrichBlockquoteSnapshot(block, base);\n case \"list\":\n return enrichListSnapshot(block, base);\n case \"table\":\n return enrichTableSnapshot(block, base);\n case \"code\":\n return enrichCodeSnapshot(block, base);\n default:\n return base;\n }\n}\n\nconst listInlineParser = new InlineParser();\n\nfunction enrichListSnapshot(block: Block, snapshot: NodeSnapshot): NodeSnapshot {\n const raw = block.payload.raw ?? \"\";\n const baseOffset = block.payload.range?.from ?? 0;\n const listTree = mdParser.parse(raw);\n const listNode = findListNode(listTree.topNode);\n if (!listNode) {\n return fallbackListSnapshot(block, snapshot);\n }\n\n const ordered = listNode.type.name === \"OrderedList\" || Boolean((block.payload.meta as { ordered?: boolean } | undefined)?.ordered);\n snapshot.props = { ...(snapshot.props ?? {}), ordered, items: undefined };\n snapshot.children = buildListItemSnapshots(block, listNode, ordered, block.id, baseOffset, raw);\n return snapshot;\n}\n\nfunction findListNode(node: any | null | undefined): any | null {\n if (!node) return null;\n const name = node.type.name;\n if (name === \"BulletList\" || name === \"OrderedList\") {\n return node;\n }\n const cursor = node.cursor();\n if (cursor.firstChild()) {\n do {\n const childName = cursor.type.name;\n if (childName === \"BulletList\" || childName === \"OrderedList\") {\n return cursor.node;\n }\n } while (cursor.nextSibling());\n }\n return null;\n}\n\nfunction buildListItemSnapshots(block: Block, listNode: any, ordered: boolean, idPrefix: string, baseOffset: number, raw: string): NodeSnapshot[] {\n const items: NodeSnapshot[] = [];\n const cursor = listNode.cursor();\n let index = 0;\n if (cursor.firstChild()) {\n do {\n if (cursor.type.name === \"ListItem\") {\n const itemId = `${idPrefix}::item:${index}`;\n items.push(buildListItemSnapshot(block, cursor.node, ordered, index, itemId, baseOffset, raw));\n index++;\n }\n } while (cursor.nextSibling());\n }\n return items;\n}\n\nfunction buildListItemSnapshot(\n block: Block,\n listItemNode: any,\n ordered: boolean,\n index: number,\n id: string,\n baseOffset: number,\n raw: string,\n): NodeSnapshot {\n const childSnapshots: NodeSnapshot[] = [];\n const segmentSnapshots: NodeSnapshot[] = [];\n let inlineNodes: InlineNode[] = [];\n let plainText = \"\";\n let paragraphHandled = false;\n let paragraphIndex = 0;\n let subListIndex = 0;\n let blockquoteIndex = 0;\n let codeIndex = 0;\n let htmlIndex = 0;\n let headingIndex = 0;\n let isTask = false;\n let taskChecked: boolean | undefined;\n\n const cursor = listItemNode.cursor();\n if (cursor.firstChild()) {\n do {\n const name = cursor.type.name;\n if (name === \"ListMark\") {\n continue;\n }\n if (name === \"Paragraph\") {\n const paragraphRaw = raw.slice(cursor.from, cursor.to);\n const paragraphData = processListItemParagraph(paragraphRaw);\n const parsedInline = paragraphData.inline;\n if (!paragraphHandled) {\n inlineNodes = parsedInline;\n plainText = inlineNodesToPlainText(parsedInline);\n if (paragraphData.segments.length > 0) {\n paragraphData.segments.forEach((segment, segmentIndex) => {\n segmentSnapshots.push(createSegmentSnapshot(id, segment, segmentIndex, \"list-item\"));\n });\n }\n if (paragraphData.task) {\n isTask = true;\n taskChecked = paragraphData.task.checked;\n }\n paragraphHandled = true;\n } else {\n const paraId = `${id}::paragraph:${paragraphIndex++}`;\n const nestedSegments = paragraphData.segments;\n childSnapshots.push({\n id: paraId,\n type: \"paragraph\",\n props: {\n inline: cloneInlineNodes(parsedInline),\n text: inlineNodesToPlainText(parsedInline),\n },\n range: createRange(baseOffset + cursor.from, baseOffset + cursor.to),\n children: nestedSegments.map((segment, segmentIndex) => createSegmentSnapshot(paraId, segment, segmentIndex, \"paragraph\")),\n });\n }\n } else if (name === \"BulletList\" || name === \"OrderedList\") {\n const nestedId = `${id}::list:${subListIndex++}`;\n const nestedOrdered = name === \"OrderedList\";\n childSnapshots.push(buildListNodeSnapshot(block, cursor.node, nestedOrdered, nestedId, baseOffset, raw));\n } else if (name === \"Blockquote\") {\n const quoteId = `${id}::blockquote:${blockquoteIndex++}`;\n childSnapshots.push(buildBlockquoteSnapshot(block, cursor.node, quoteId, baseOffset, raw));\n } else if (name === \"FencedCode\" || name === \"IndentedCode\") {\n const codeId = `${id}::code:${codeIndex++}`;\n const isFenced = name === \"FencedCode\";\n const snapshot = buildCodeBlockSnapshot(block, cursor.node, codeId, baseOffset, raw, isFenced);\n if (snapshot) {\n childSnapshots.push(snapshot);\n }\n } else if (name === \"HTMLBlock\") {\n const htmlId = `${id}::html:${htmlIndex++}`;\n childSnapshots.push(buildHtmlSnapshot(block, cursor.node, htmlId, baseOffset, raw));\n } else if (name === \"ATXHeading\" || name === \"SetextHeading\") {\n const headingId = `${id}::heading:${headingIndex++}`;\n childSnapshots.push(buildHeadingSnapshot(block, cursor.node, headingId, baseOffset, raw));\n }\n } while (cursor.nextSibling());\n }\n\n const itemSnapshot: NodeSnapshot = {\n id,\n type: \"list-item\",\n props: {\n index,\n ordered,\n inline: cloneInlineNodes(inlineNodes),\n text: plainText,\n task: isTask,\n checked: isTask ? Boolean(taskChecked) : undefined,\n },\n range: createRange(baseOffset + listItemNode.from, baseOffset + listItemNode.to),\n children: [...segmentSnapshots, ...childSnapshots],\n };\n\n return itemSnapshot;\n}\n\ninterface ListItemParagraphData {\n inline: InlineNode[];\n segments: MixedContentSegment[];\n task?: { checked: boolean };\n}\n\nfunction processListItemParagraph(raw: string): ListItemParagraphData {\n const normalized = normalizeParagraphText(raw);\n const { content, task } = stripTaskMarker(normalized);\n const inline = listInlineParser.parse(content);\n const segments = extractMixedContentSegments(content, undefined, (value) => listInlineParser.parse(value));\n return {\n inline,\n segments,\n task,\n };\n}\n\nfunction stripTaskMarker(input: string): { content: string; task?: { checked: boolean } } {\n const taskMatch = input.match(/^\\s*\\[( |x|X|-)\\][ \\t]?/);\n if (!taskMatch) {\n return { content: input };\n }\n\n const marker = taskMatch[1];\n const checked = marker.toLowerCase() === \"x\";\n const remainder = input.slice(taskMatch[0].length).replace(/^\\s+/, \"\");\n return {\n content: remainder,\n task: { checked },\n };\n}\n\nfunction buildBlockquoteSnapshot(block: Block, quoteNode: any, id: string, baseOffset: number, raw: string): NodeSnapshot {\n const quoteRaw = raw.slice(quoteNode.from, quoteNode.to);\n const normalized = normalizeBlockquoteText(quoteRaw);\n const inline = listInlineParser.parse(normalized);\n const segments = extractMixedContentSegments(normalized, undefined, (value) => listInlineParser.parse(value));\n\n const quoteBlock: Block = {\n id,\n type: \"blockquote\",\n isFinalized: true,\n payload: {\n raw: normalized,\n inline: cloneInlineNodes(inline),\n meta: segments.some((segment) => segment.kind !== \"text\")\n ? {\n mixedSegments: segments,\n }\n : undefined,\n range: createRange(baseOffset + quoteNode.from, baseOffset + quoteNode.to),\n },\n };\n\n return createBlockSnapshot(quoteBlock);\n}\n\nfunction buildCodeBlockSnapshot(block: Block, codeNode: any, id: string, baseOffset: number, raw: string, _isFenced: boolean): NodeSnapshot | null {\n const segment = raw.slice(codeNode.from, codeNode.to);\n const normalized = stripListIndentation(segment);\n const { code, info: infoString, hadFence } = stripCodeFence(normalized);\n const body = hadFence ? code : dedentIndentedCode(normalized);\n const { lang, meta } = parseCodeFenceInfo(infoString);\n const codeBlock: Block = {\n id,\n type: \"code\",\n isFinalized: true,\n payload: {\n raw: normalized,\n meta: { ...meta, lang: lang || \"text\", code: body },\n range: createRange(baseOffset + codeNode.from, baseOffset + codeNode.to),\n },\n };\n return createBlockSnapshot(codeBlock);\n}\n\nfunction buildHtmlSnapshot(block: Block, htmlNode: any, id: string, baseOffset: number, raw: string): NodeSnapshot {\n const htmlRaw = stripListIndentation(raw.slice(htmlNode.from, htmlNode.to));\n const htmlBlock: Block = {\n id,\n type: \"html\",\n isFinalized: true,\n payload: {\n raw: htmlRaw,\n sanitizedHtml: undefined,\n meta: undefined,\n range: createRange(baseOffset + htmlNode.from, baseOffset + htmlNode.to),\n },\n };\n return createBlockSnapshot(htmlBlock);\n}\n\nfunction buildHeadingSnapshot(block: Block, headingNode: any, id: string, baseOffset: number, raw: string): NodeSnapshot {\n const headingRaw = stripListIndentation(raw.slice(headingNode.from, headingNode.to));\n const inline = listInlineParser.parse(removeHeadingMarkers(headingRaw));\n const headingBlock: Block = {\n id,\n type: \"heading\",\n isFinalized: true,\n payload: {\n raw: headingRaw,\n inline: cloneInlineNodes(inline),\n range: createRange(baseOffset + headingNode.from, baseOffset + headingNode.to),\n },\n };\n return createBlockSnapshot(headingBlock);\n}\n\nfunction buildListNodeSnapshot(block: Block, listNode: any, ordered: boolean, id: string, baseOffset: number, raw: string): NodeSnapshot {\n return {\n id,\n type: \"list\",\n props: {\n ordered,\n },\n range: createRange(baseOffset + listNode.from, baseOffset + listNode.to),\n children: buildListItemSnapshots(block, listNode, ordered, id, baseOffset, raw),\n };\n}\n\nfunction enrichParagraphSnapshot(block: Block, snapshot: NodeSnapshot): NodeSnapshot {\n const meta = block.payload.meta as { mixedSegments?: MixedContentSegment[] } | undefined;\n const segments = Array.isArray(meta?.mixedSegments) ? (meta?.mixedSegments ?? []) : [];\n if (!segments.length) {\n return snapshot;\n }\n\n snapshot.children = segments.map((segment, index) => createSegmentSnapshot(block.id, segment, index, \"paragraph\"));\n return snapshot;\n}\n\nfunction enrichBlockquoteSnapshot(block: Block, snapshot: NodeSnapshot): NodeSnapshot {\n const meta = block.payload.meta as { mixedSegments?: MixedContentSegment[] } | undefined;\n const segments = Array.isArray(meta?.mixedSegments) ? (meta?.mixedSegments ?? []) : [];\n if (!segments.length) {\n return snapshot;\n }\n\n snapshot.children = segments.map((segment, index) => createSegmentSnapshot(block.id, segment, index, \"blockquote\"));\n return snapshot;\n}\n\nfunction createSegmentSnapshot(\n parentId: string,\n segment: MixedContentSegment,\n index: number,\n parentType: \"paragraph\" | \"blockquote\" | \"list-item\",\n): NodeSnapshot {\n const id = `${parentId}::${parentType}:segment:${index}`;\n const range = segment.range ? { ...segment.range } : undefined;\n switch (segment.kind) {\n case \"html\":\n return {\n id,\n type: `${parentType}-html`,\n props: {\n html: segment.sanitized ?? segment.value,\n raw: segment.value,\n },\n meta: segment.sanitized ? { sanitized: true } : undefined,\n range,\n children: [],\n };\n case \"mdx\":\n return {\n id,\n type: `${parentType}-mdx`,\n props: {\n raw: segment.value,\n status: segment.status ?? \"pending\",\n error: segment.error,\n },\n range,\n children: [],\n };\n default:\n return {\n id,\n type: `${parentType}-text`,\n props: {\n text: segment.value,\n inline: segment.inline ? cloneInlineNodes(segment.inline) : undefined,\n },\n range,\n children: [],\n };\n }\n}\n\nfunction fallbackListSnapshot(block: Block, snapshot: NodeSnapshot): NodeSnapshot {\n const meta = block.payload.meta as { ordered?: boolean; items?: InlineNode[][] } | undefined;\n const ordered = Boolean(meta?.ordered);\n const items = Array.isArray(meta?.items) ? (meta?.items as InlineNode[][]) : [];\n snapshot.props = { ...(snapshot.props ?? {}), ordered, items: undefined };\n snapshot.children = items.map((inlineNodes, index) => ({\n id: `${block.id}::item:${index}`,\n type: \"list-item\",\n props: {\n index,\n ordered,\n inline: cloneInlineNodes(inlineNodes),\n text: inlineNodesToPlainText(inlineNodes),\n },\n children: [],\n }));\n return snapshot;\n}\n\nfunction normalizeParagraphText(input: string): string {\n if (!input) return \"\";\n const lines = input.split(\"\\n\");\n let minIndent = Number.POSITIVE_INFINITY;\n for (const line of lines) {\n const trimmed = line.trimEnd();\n if (trimmed.length === 0) continue;\n const match = line.match(/^(\\s*)/);\n const indent = match ? match[1].length : 0;\n minIndent = Math.min(minIndent, indent);\n }\n if (!Number.isFinite(minIndent)) {\n return \"\";\n }\n return lines\n .map((line) => (line.length >= minIndent ? line.slice(minIndent) : line))\n .join(\"\\n\")\n .trim();\n}\n\nfunction stripListIndentation(input: string): string {\n if (!input) return \"\";\n const lines = input.split(\"\\n\");\n let minIndent = Number.POSITIVE_INFINITY;\n for (const line of lines) {\n const trimmed = line.trimEnd();\n if (trimmed.length === 0) continue;\n const match = line.match(/^(\\s*)/);\n const indent = match ? match[1].length : 0;\n minIndent = Math.min(minIndent, indent);\n }\n if (!Number.isFinite(minIndent) || minIndent === 0) {\n return input.trim();\n }\n return lines\n .map((line) => (line.length >= minIndent ? line.slice(minIndent) : \"\"))\n .join(\"\\n\")\n .trim();\n}\n\nfunction parseFencedCodeSegment(input: string): { infoString: string; code: string } | null {\n const normalized = input.replace(/\\r\\n/g, \"\\n\").trim();\n const match = normalized.match(/^```([^\\n]*)\\n([\\s\\S]*?)\\n?```$/);\n if (!match) return null;\n const infoString = match[1] ? match[1].trim() : \"\";\n const code = match[2] ? match[2].replace(/\\n?$/, \"\") : \"\";\n return { infoString, code };\n}\n\nfunction dedentIndentedCode(input: string): string {\n if (!input) return \"\";\n const lines = input.split(\"\\n\");\n let minIndent = Number.POSITIVE_INFINITY;\n for (const line of lines) {\n if (line.trim().length === 0) continue;\n const match = line.match(/^(\\s*)/);\n const indent = match ? match[1].length : 0;\n minIndent = Math.min(minIndent, indent);\n }\n if (!Number.isFinite(minIndent)) {\n return input.trim();\n }\n return lines\n .map((line) => (line.length >= minIndent ? line.slice(minIndent) : \"\"))\n .join(\"\\n\")\n .trimEnd();\n}\n\nfunction removeHeadingMarkers(input: string): string {\n return input\n .replace(/^#{1,6}\\s+/, \"\")\n .replace(/\\s+={2,}\\s*$|\\s+-{2,}\\s*$/m, \"\")\n .trim();\n}\n\nfunction createRange(from: number, to: number): { from: number; to: number } | undefined {\n if (!Number.isFinite(from) || !Number.isFinite(to) || to < from) {\n return undefined;\n }\n return { from, to };\n}\n\nfunction enrichTableSnapshot(block: Block, snapshot: NodeSnapshot): NodeSnapshot {\n const meta = block.payload.meta as\n | {\n header?: InlineNode[][];\n rows?: InlineNode[][][];\n align?: Array<\"left\" | \"center\" | \"right\" | null>;\n }\n | undefined;\n const header = Array.isArray(meta?.header) ? (meta?.header as InlineNode[][]) : [];\n const rows = Array.isArray(meta?.rows) ? (meta?.rows as InlineNode[][][]) : [];\n const align = Array.isArray(meta?.align) ? (meta?.align ?? []) : [];\n\n const children: NodeSnapshot[] = [];\n\n if (header.length > 0) {\n children.push({\n id: `${block.id}::thead`,\n type: \"table-header\",\n props: { columns: header.length },\n children: header.map((cellInline, cellIndex) => ({\n id: `${block.id}::th:${cellIndex}`,\n type: \"table-header-cell\",\n props: {\n index: cellIndex,\n align: align[cellIndex] ?? null,\n inline: cloneInlineNodes(cellInline),\n text: inlineNodesToPlainText(cellInline),\n },\n children: [],\n })),\n });\n }\n\n const bodyChildren = rows.map((rowCells, rowIndex) => ({\n id: `${block.id}::row:${rowIndex}`,\n type: \"table-row\",\n props: { index: rowIndex },\n children: rowCells.map((cellInline, cellIndex) => ({\n id: `${block.id}::td:${rowIndex}:${cellIndex}`,\n type: \"table-cell\",\n props: {\n rowIndex,\n index: cellIndex,\n align: align[cellIndex] ?? null,\n inline: cloneInlineNodes(cellInline),\n text: inlineNodesToPlainText(cellInline),\n },\n children: [],\n })),\n }));\n\n children.push({\n id: `${block.id}::tbody`,\n type: \"table-body\",\n props: { rows: rows.length },\n children: bodyChildren,\n });\n\n snapshot.children = children;\n return snapshot;\n}\n\nfunction enrichCodeSnapshot(block: Block, snapshot: NodeSnapshot): NodeSnapshot {\n const source = typeof block.payload.meta?.code === \"string\" ? (block.payload.meta?.code as string) : (block.payload.raw ?? \"\");\n const lines = extractCodeLines(source);\n const highlightedHtml = block.payload.highlightedHtml ?? \"\";\n const highlightedLines = extractHighlightedLines(highlightedHtml, lines.length);\n const { preAttrs, codeAttrs } = extractCodeWrapperAttributes(highlightedHtml);\n const lang = typeof block.payload.meta?.lang === \"string\" ? String(block.payload.meta?.lang) : undefined;\n snapshot.props = {\n ...(snapshot.props ?? {}),\n lang,\n preAttrs,\n codeAttrs,\n };\n snapshot.children = lines.map((line, index) => ({\n id: `${block.id}::line:${index}`,\n type: \"code-line\",\n props: {\n index,\n text: line,\n html: highlightedLines[index] ?? null,\n },\n children: [],\n }));\n return snapshot;\n}\n\nfunction cloneInlineNodes(nodes: InlineNode[]): InlineNode[] {\n return nodes.map((node) => {\n if (\"children\" in node && Array.isArray(node.children)) {\n return { ...node, children: cloneInlineNodes(node.children) };\n }\n return { ...node };\n });\n}\n\nexport function inlineNodesToPlainText(nodes: InlineNode[]): string {\n let result = \"\";\n for (const node of nodes) {\n switch (node.kind) {\n case \"text\":\n result += node.text;\n break;\n case \"code\":\n result += node.text;\n break;\n case \"link\":\n case \"strong\":\n case \"em\":\n case \"mention\":\n case \"citation\":\n case \"math-inline\":\n case \"math-display\":\n if (\"children\" in node && Array.isArray(node.children)) {\n result += inlineNodesToPlainText(node.children);\n } else if (\"text\" in node && typeof node.text === \"string\") {\n result += node.text;\n }\n break;\n case \"footnote-ref\":\n result += `[^${node.label}]`;\n break;\n case \"image\":\n result += node.alt ?? \"\";\n break;\n default:\n break;\n }\n }\n return result;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (typeof a !== \"object\") return false;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== (b as unknown[]).length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], (b as unknown[])[i])) return false;\n }\n return true;\n }\n\n const keysA = Object.keys(a as Record<string, unknown>);\n const keysB = Object.keys(b as Record<string, unknown>);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) return false;\n }\n return true;\n}\n\ntype StructuredCloneFn = (value: unknown) => unknown;\n\nfunction structuredCloneIfPossible<T>(value: T): T {\n const globalClone = (globalThis as { structuredClone?: StructuredCloneFn }).structuredClone;\n if (typeof globalClone === \"function\") {\n try {\n return globalClone(value) as T;\n } catch {\n // fall through to JSON cloning\n }\n }\n return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * Lightweight document snapshot utilities for worker-driven streaming.\n * These helpers maintain a minimal node tree so non-React environments\n * (e.g., TUIs) can apply worker patches and materialize Block arrays.\n */\n\ninterface SnapshotNode {\n id: string;\n type: string;\n parentId: string | null;\n children: string[];\n props: Record<string, unknown>;\n block?: Block;\n}\n\nexport interface DocumentSnapshot {\n nodes: Map<string, SnapshotNode>;\n rootId: string;\n blocks: Block[];\n}\n\nexport function createInitialSnapshot(initialBlocks: Block[] = []): DocumentSnapshot {\n const nodes = new Map<string, SnapshotNode>();\n const root: SnapshotNode = {\n id: PATCH_ROOT_ID,\n type: \"__root__\",\n parentId: null,\n children: [],\n props: {},\n };\n nodes.set(root.id, root);\n\n const snapshot: DocumentSnapshot = {\n nodes,\n rootId: root.id,\n blocks: [],\n };\n\n for (const block of initialBlocks) {\n const blockSnapshot = createBlockSnapshot(cloneBlock(block));\n insertSnapshotAt(snapshot, root, root.children.length, blockSnapshot);\n }\n\n snapshot.blocks = buildBlocks(snapshot);\n return snapshot;\n}\n\nexport function applyPatchBatch(snapshot: DocumentSnapshot, patches: Patch[]): Block[] {\n if (!snapshot || !Array.isArray(patches) || patches.length === 0) {\n return snapshot?.blocks ?? [];\n }\n\n for (const patch of patches) {\n switch (patch.op) {\n case \"insertChild\": {\n const parent = resolveParentNode(snapshot, patch.at);\n if (!parent) break;\n insertSnapshotAt(snapshot, parent, patch.index, patch.node);\n break;\n }\n case \"deleteChild\": {\n const parent = resolveParentNode(snapshot, patch.at);\n if (!parent) break;\n if (patch.index < 0 || patch.index >= parent.children.length) break;\n const childId = parent.children.splice(patch.index, 1)[0];\n if (childId) {\n removeSubtree(snapshot, childId);\n }\n break;\n }\n case \"replaceChild\": {\n const parent = resolveParentNode(snapshot, patch.at);\n if (!parent) break;\n if (patch.index < 0 || patch.index >= parent.children.length) break;\n const targetId = parent.children[patch.index];\n if (targetId) {\n removeSubtree(snapshot, targetId);\n }\n insertSnapshotAt(snapshot, parent, patch.index, patch.node);\n break;\n }\n case \"setProps\": {\n const target = resolveTargetNode(snapshot, patch.at);\n if (!target) break;\n applyPropsToNode(target, patch.props);\n break;\n }\n case \"setPropsBatch\": {\n const entries = Array.isArray(patch.entries) ? (patch.entries as SetPropsBatchEntry[]) : [];\n for (const entry of entries) {\n if (!entry?.at) continue;\n const target = resolveTargetNode(snapshot, entry.at);\n if (!target) continue;\n applyPropsToNode(target, entry.props);\n }\n break;\n }\n case \"finalize\": {\n const target = resolveTargetNode(snapshot, patch.at);\n if (!target?.block) break;\n target.block = cloneBlock(target.block);\n target.block.isFinalized = true;\n break;\n }\n case \"reorder\": {\n const parent = resolveParentNode(snapshot, patch.at);\n if (!parent || parent.children.length === 0) break;\n const length = parent.children.length;\n const from = clamp(patch.from, 0, length - 1);\n const count = Math.max(1, Math.min(patch.count, length - from));\n let to = clamp(patch.to, 0, length);\n if (to > from) {\n to = Math.max(0, to - count);\n }\n const moved = parent.children.splice(from, count);\n parent.children.splice(to, 0, ...moved);\n break;\n }\n case \"appendLines\": {\n const parent = resolveTargetNode(snapshot, patch.at);\n if (!parent) break;\n appendLinesToCodeNode(snapshot, parent, patch.startIndex, patch.lines ?? [], patch.highlight ?? []);\n break;\n }\n case \"setHTML\": {\n const target = resolveTargetNode(snapshot, patch.at);\n if (!target) break;\n const props: Record<string, unknown> = {\n html: patch.html,\n policy: patch.policy,\n meta: patch.meta,\n };\n if (patch.block) {\n props.block = patch.block;\n }\n applyPropsToNode(target, props);\n break;\n }\n default:\n break;\n }\n }\n\n snapshot.blocks = buildBlocks(snapshot);\n return snapshot.blocks;\n}\n\nfunction buildBlocks(snapshot: DocumentSnapshot): Block[] {\n const root = snapshot.nodes.get(snapshot.rootId);\n if (!root) {\n return [];\n }\n const result: Block[] = [];\n for (const childId of root.children) {\n const child = snapshot.nodes.get(childId);\n if (child?.block) {\n result.push(cloneBlock(child.block));\n }\n }\n return result;\n}\n\nfunction insertSnapshotAt(snapshot: DocumentSnapshot, parent: SnapshotNode, index: number, nodeSnapshot: NodeSnapshot): SnapshotNode | null {\n if (!parent) return null;\n removeSubtree(snapshot, nodeSnapshot.id);\n const node = buildNodeFromSnapshot(snapshot, nodeSnapshot, parent.id);\n if (!node) return null;\n const clamped = clamp(index, 0, parent.children.length);\n parent.children.splice(clamped, 0, node.id);\n return node;\n}\n\nfunction buildNodeFromSnapshot(snapshot: DocumentSnapshot, snapshotNode: NodeSnapshot, parentId: string | null): SnapshotNode | null {\n if (!snapshotNode || !snapshotNode.id) {\n return null;\n }\n const props = { ...(snapshotNode.props ?? {}) };\n let block: Block | undefined;\n if (props.block && typeof props.block === \"object\") {\n block = cloneBlock(props.block as Block);\n delete props.block;\n }\n\n const node: SnapshotNode = {\n id: snapshotNode.id,\n type: snapshotNode.type,\n parentId,\n children: [],\n props,\n block,\n };\n\n snapshot.nodes.set(node.id, node);\n\n const childSnapshots = Array.isArray(snapshotNode.children) ? snapshotNode.children : [];\n for (const child of childSnapshots) {\n const built = buildNodeFromSnapshot(snapshot, child, node.id);\n if (built) {\n node.children.push(built.id);\n }\n }\n\n return node;\n}\n\nfunction removeSubtree(snapshot: DocumentSnapshot, nodeId: string) {\n const node = snapshot.nodes.get(nodeId);\n if (!node) return;\n for (const childId of [...node.children]) {\n removeSubtree(snapshot, childId);\n }\n snapshot.nodes.delete(node.id);\n if (node.parentId) {\n const parent = snapshot.nodes.get(node.parentId);\n if (parent) {\n parent.children = parent.children.filter((id) => id !== node.id);\n }\n }\n}\n\nfunction resolveParentNode(snapshot: DocumentSnapshot, path: NodePath): SnapshotNode | null {\n if (!path) return null;\n if (path.nodeId) {\n return snapshot.nodes.get(path.nodeId) ?? null;\n }\n if (path.blockId === PATCH_ROOT_ID) {\n return snapshot.nodes.get(snapshot.rootId) ?? null;\n }\n return snapshot.nodes.get(path.blockId) ?? null;\n}\n\nfunction resolveTargetNode(snapshot: DocumentSnapshot, path: NodePath): SnapshotNode | null {\n if (!path) return null;\n if (path.nodeId) {\n return snapshot.nodes.get(path.nodeId) ?? null;\n }\n return snapshot.nodes.get(path.blockId) ?? null;\n}\n\nfunction applyPropsToNode(node: SnapshotNode, props: Record<string, unknown> | undefined) {\n if (!node || !props) return;\n const next = { ...node.props };\n for (const [key, value] of Object.entries(props)) {\n if (key === \"block\" && value && typeof value === \"object\") {\n node.block = cloneBlock(value as Block);\n continue;\n }\n if (value === undefined) {\n delete next[key];\n } else {\n next[key] = value;\n }\n }\n node.props = next;\n}\n\nfunction appendLinesToCodeNode(\n snapshot: DocumentSnapshot,\n parent: SnapshotNode,\n startIndex: number,\n lines: string[],\n highlights: Array<string | null>,\n) {\n if (parent.type !== \"code\") return;\n const insertionIndex = Math.max(0, Math.min(startIndex, parent.children.length));\n let currentIndex = insertionIndex;\n for (let i = 0; i < lines.length; i++) {\n const lineId = `${parent.id}::line:${currentIndex}`;\n removeSubtree(snapshot, lineId);\n const child: SnapshotNode = {\n id: lineId,\n type: \"code-line\",\n parentId: parent.id,\n children: [],\n props: {\n index: currentIndex,\n text: lines[i] ?? \"\",\n html: highlights[i] ?? null,\n },\n };\n snapshot.nodes.set(child.id, child);\n parent.children.splice(currentIndex, 0, child.id);\n currentIndex++;\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min;\n return Math.max(min, Math.min(max, value));\n}\n","export type HighlightedLine = string | null;\n\nfunction normalizeNewlines(input: string): string {\n return input.replace(/\\r\\n?/g, \"\\n\");\n}\n\nfunction isFenceLine(line: string): boolean {\n return /^```/.test(line.trim());\n}\n\nexport function stripCodeFence(raw: string): { code: string; info: string; hadFence: boolean } {\n if (!raw) {\n return { code: \"\", info: \"\", hadFence: false };\n }\n const normalized = normalizeNewlines(raw);\n const lines = normalized.split(\"\\n\");\n if (lines.length === 0) {\n return { code: normalized, info: \"\", hadFence: false };\n }\n\n const firstLine = lines[0];\n if (!isFenceLine(firstLine)) {\n return { code: normalized, info: \"\", hadFence: false };\n }\n\n const info = firstLine.slice(3).trim();\n let endIndex = lines.length - 1;\n while (endIndex > 0 && lines[endIndex].trim().length === 0) {\n endIndex--;\n }\n if (endIndex > 0 && isFenceLine(lines[endIndex])) {\n const codeLines = lines.slice(1, endIndex);\n return { code: codeLines.join(\"\\n\"), info, hadFence: true };\n }\n\n // During streaming, code block may not have closing fence yet\n // Still extract and return the info from the opening fence\n const codeLines = lines.slice(1);\n return { code: codeLines.join(\"\\n\"), info, hadFence: true };\n}\n\nfunction getDomParser(): DOMParser | null {\n if (typeof window !== \"undefined\" && typeof window.DOMParser === \"function\") {\n return new window.DOMParser();\n }\n if (typeof DOMParser !== \"undefined\") {\n try {\n return new DOMParser();\n } catch (e) {\n return null;\n }\n }\n return null;\n}\n\nexport function extractHighlightedLines(html: string, fallbackLength: number): HighlightedLine[] {\n if (!html) {\n return new Array(Math.max(0, fallbackLength)).fill(null);\n }\n\n const parser = getDomParser();\n if (parser) {\n try {\n const doc = parser.parseFromString(`<div>${html}</div>`, \"text/html\");\n const nodes = doc.querySelectorAll(\"span.line\");\n if (nodes.length > 0) {\n const lines: HighlightedLine[] = [];\n for (const node of nodes) {\n lines.push(node instanceof Element ? node.innerHTML : null);\n }\n return normalizeHighlightedLines(lines, fallbackLength);\n }\n } catch (error) {\n // fall through to manual extraction\n }\n }\n\n return manualExtractHighlightedLines(html, fallbackLength);\n}\n\nfunction normalizeHighlightedLines(lines: HighlightedLine[], fallbackLength: number): HighlightedLine[] {\n if (!lines || lines.length === 0) {\n return new Array(Math.max(0, fallbackLength)).fill(null);\n }\n const length = Math.max(fallbackLength, lines.length);\n const result: HighlightedLine[] = new Array(length).fill(null);\n for (let i = 0; i < lines.length; i++) {\n result[i] = lines[i];\n }\n return result;\n}\n\nfunction manualExtractHighlightedLines(html: string, fallbackLength: number): HighlightedLine[] {\n const lineRegex = /<span class=\"line\"(?:\\s+[^>]*)?>/gi;\n const lines: string[] = [];\n let match: RegExpExecArray | null = lineRegex.exec(html);\n\n while (match !== null) {\n const openTagEnd = html.indexOf(\">\", match.index);\n if (openTagEnd === -1) break;\n let cursor = openTagEnd + 1;\n let depth = 1;\n let buffer = \"\";\n\n while (cursor < html.length && depth > 0) {\n const nextTagStart = html.indexOf(\"<\", cursor);\n if (nextTagStart === -1) {\n buffer += html.slice(cursor);\n cursor = html.length;\n break;\n }\n if (nextTagStart > cursor) {\n buffer += html.slice(cursor, nextTagStart);\n }\n cursor = nextTagStart;\n if (html.startsWith(\"</span>\", cursor)) {\n depth -= 1;\n cursor += 7;\n if (depth === 0) break;\n buffer += \"</span>\";\n continue;\n }\n const tagEnd = html.indexOf(\">\", cursor);\n if (tagEnd === -1) {\n buffer += html.slice(cursor);\n cursor = html.length;\n break;\n }\n const tag = html.slice(cursor, tagEnd + 1);\n if (/^<span\\b/i.test(tag)) {\n depth += 1;\n }\n buffer += tag;\n cursor = tagEnd + 1;\n }\n\n lines.push(buffer);\n lineRegex.lastIndex = cursor;\n match = lineRegex.exec(html);\n }\n\n return normalizeHighlightedLines(lines, fallbackLength);\n}\n\nexport function dedentIndentedCode(raw: string): string {\n if (!raw) return \"\";\n const normalized = normalizeNewlines(raw);\n const lines = normalized.split(\"\\n\");\n let minIndent = Number.POSITIVE_INFINITY;\n for (const line of lines) {\n const match = line.match(/^\\s+/);\n if (!match) continue;\n minIndent = Math.min(minIndent, match[0].length);\n }\n if (!Number.isFinite(minIndent) || minIndent === 0) {\n return normalized;\n }\n return lines.map((line) => (line.startsWith(\" \".repeat(minIndent)) ? line.slice(minIndent) : line)).join(\"\\n\");\n}\n\nexport function extractCodeLines(raw: string): string[] {\n if (!raw) return [];\n const normalized = normalizeNewlines(raw);\n const { code, hadFence } = stripCodeFence(normalized);\n if (hadFence) {\n return code.split(\"\\n\");\n }\n if (/^\\s{4}/m.test(normalized)) {\n return dedentIndentedCode(normalized).split(\"\\n\");\n }\n return normalized.split(\"\\n\");\n}\n\nexport function extractCodeWrapperAttributes(html: string): {\n preAttrs?: Record<string, string>;\n codeAttrs?: Record<string, string>;\n} {\n if (!html) {\n return {};\n }\n const preMatch = html.match(/<pre\\b([^>]*)>/i);\n const codeMatch = html.match(/<code\\b([^>]*)>/i);\n return {\n preAttrs: preMatch ? filterAllowedAttributes(parseAttributeFragment(preMatch[1] ?? \"\")) : undefined,\n codeAttrs: codeMatch ? filterAllowedAttributes(parseAttributeFragment(codeMatch[1] ?? \"\")) : undefined,\n };\n}\n\nfunction parseAttributeFragment(fragment: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const regex = /([a-zA-Z_:][\\w:.-]*)\\s*=\\s*\"([^\"]*)\"/g;\n let match: RegExpExecArray | null = regex.exec(fragment);\n while (match !== null) {\n const [, name, value] = match;\n attrs[name] = value;\n match = regex.exec(fragment);\n }\n return attrs;\n}\n\nfunction filterAllowedAttributes(attrs: Record<string, string>): Record<string, string> {\n const allowed = new Set([\"class\", \"style\", \"data-theme\"]);\n const filtered: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n if (allowed.has(key) || key.startsWith(\"data-\")) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n","import type { Tree } from \"@lezer/common\";\nimport type { ASTInlinePlugin, InlineNode, InlinePlugin, RegexInlinePlugin } from \"./types\";\n\nexport interface InlineParserOptions {\n /**\n * Maximum number of cached inline parses to retain. The inline parser is used\n * heavily during streaming; an unbounded cache can grow without limit when\n * parsing many intermediate states.\n */\n maxCacheEntries?: number;\n}\n\nexport interface InlineParseOptions {\n /**\n * Enable/disable memoization for this call. For streaming (non-finalized)\n * content, caching intermediate states is typically wasteful.\n */\n cache?: boolean;\n}\n\n/**\n * Main inline parser that combines Lezer parsing with plugins\n */\nexport class InlineParser {\n private plugins: InlinePlugin[] = [];\n private cache = new Map<string, InlineNode[]>();\n private maxCacheEntries: number;\n\n constructor(options: InlineParserOptions = {}) {\n this.maxCacheEntries = Number.isFinite(options.maxCacheEntries ?? Number.NaN) ? Math.max(0, options.maxCacheEntries ?? 0) : 2000;\n // Register default plugins\n this.registerDefaultPlugins();\n }\n\n /**\n * Register a plugin with the parser\n */\n registerPlugin(plugin: InlinePlugin): void {\n this.plugins.push(plugin);\n // Sort by priority (lower runs earlier)\n this.plugins.sort((a, b) => a.priority - b.priority);\n // Clear cache when plugins change\n this.cache.clear();\n }\n\n /**\n * Parse inline content with memoization\n */\n parse(content: string, options: InlineParseOptions = {}): InlineNode[] {\n const shouldCache = options.cache !== false && this.maxCacheEntries > 0;\n\n if (shouldCache) {\n const cached = this.cache.get(content);\n if (cached) {\n // Refresh LRU order (Map preserves insertion order)\n this.cache.delete(content);\n this.cache.set(content, cached);\n return cached;\n }\n }\n\n // Parse with Lezer first\n const lezerNodes = this.parseWithLezer(content);\n\n // Apply plugins in order\n let result = lezerNodes;\n for (const plugin of this.plugins) {\n if (\"apply\" in plugin) {\n result = plugin.apply(result);\n } else if (\"re\" in plugin) {\n // Handle regex plugins\n result = applyRegexPlugin(result, plugin as RegexInlinePlugin);\n }\n }\n\n if (shouldCache) {\n // Cache result (LRU bounded).\n this.cache.set(content, result);\n while (this.cache.size > this.maxCacheEntries) {\n const oldestKey = this.cache.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n this.cache.delete(oldestKey);\n }\n }\n\n return result;\n }\n\n /**\n * Clear the memoization cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Parse with Lezer inline parser as a fallback/base layer\n * For V2, we primarily use our plugin system for better control\n */\n private parseWithLezer(content: string): InlineNode[] {\n // For now, start with plain text and let plugins handle everything\n // This avoids conflicts between Lezer's parsing and our plugin precedence\n return [{ kind: \"text\", text: content }];\n }\n\n /**\n * Convert Lezer tree to our InlineNode format (currently simplified)\n * TODO: Integrate Lezer more deeply while respecting plugin precedence\n */\n private convertLezerToInlineNodes(tree: Tree | null, content: string): InlineNode[] {\n // Simplified approach: return text and let plugins handle parsing\n // This ensures our precedence-based plugin system has full control\n return [{ kind: \"text\", text: content }];\n }\n\n /**\n * Register default plugins with proper precedence ordering\n * Lower priority numbers = higher precedence (run first)\n */\n private registerDefaultPlugins(): void {\n // Handle escaped punctuation before other plugins consume the characters\n this.registerPlugin({\n id: \"escaped-character\",\n priority: 0,\n re: /\\\\([\\\\`*_{}\\[\\]()#+\\-.!>])/g,\n toNode: (match) => ({\n kind: \"text\",\n text: match[1],\n }),\n fastCheck: (text) => text.indexOf(\"\\\\\") !== -1,\n } as RegexInlinePlugin);\n\n // HIGHEST PRECEDENCE: Display math first (longer pattern)\n this.registerPlugin({\n id: \"math-display\",\n priority: 1,\n re: /\\$\\$([^$]+?)\\$\\$/g,\n toNode: (match) => ({ kind: \"math-display\", tex: match[1].trim() }),\n fastCheck: (text) => text.indexOf(\"$$\") !== -1,\n } as RegexInlinePlugin);\n\n // Inline math (shorter pattern, runs after display math)\n this.registerPlugin({\n id: \"math-inline\",\n priority: 2,\n re: /\\$([^$\\n]+?)\\$/g, // Non-greedy to prevent spanning multiple expressions\n toNode: (match) => ({ kind: \"math-inline\", tex: match[1].trim() }),\n fastCheck: (text) => text.indexOf(\"$\") !== -1,\n } as RegexInlinePlugin);\n\n // Code spans (high precedence to avoid conflicts with other syntax)\n this.registerPlugin({\n id: \"code-spans\",\n priority: 3,\n re: /`([^`\\n]+?)`/g,\n toNode: (match) => ({ kind: \"code\", text: match[1] }),\n fastCheck: (text) => text.indexOf(\"`\") !== -1,\n } as RegexInlinePlugin);\n\n // Links (before emphasis to handle [text](url) properly)\n this.registerPlugin({\n id: \"links\",\n priority: 4,\n re: /\\[([^\\]]+?)\\]\\(([^)]+?)\\)/g,\n toNode: (match) => ({\n kind: \"link\",\n href: match[2].trim(),\n children: [{ kind: \"text\", text: match[1] }],\n }),\n fastCheck: (text) => text.indexOf(\"](\") !== -1,\n } as RegexInlinePlugin);\n\n // Footnote references: [^label]\n this.registerPlugin({\n id: \"footnote-refs\",\n priority: 6,\n re: /\\[\\^([A-Za-z0-9_-]+)\\]/g,\n toNode: (match) => ({ kind: \"footnote-ref\", label: match[1] }),\n fastCheck: (text) => text.indexOf(\"[^\") !== -1,\n } as RegexInlinePlugin);\n\n // Images (similar to links but with !)\n this.registerPlugin({\n id: \"images\",\n priority: 5,\n re: /!\\[([^\\]]*?)\\]\\(([^)]+?)\\)/g,\n toNode: (match) => ({\n kind: \"image\",\n src: match[2].trim(),\n alt: match[1],\n }),\n fastCheck: (text) => text.indexOf(\"![\") !== -1,\n } as RegexInlinePlugin);\n\n // Strong emphasis (***text*** or **text**)\n this.registerPlugin({\n id: \"strong-emphasis\",\n priority: 6,\n re: /\\*\\*\\*([^*\\n]+?)\\*\\*\\*|\\*\\*([^*\\n]+?)\\*\\*/g,\n toNode: (match) => ({\n kind: \"strong\",\n children: [{ kind: \"text\", text: match[1] || match[2] }],\n }),\n fastCheck: (text) => text.indexOf(\"**\") !== -1,\n } as RegexInlinePlugin);\n\n // Strikethrough (~~text~~)\n this.registerPlugin({\n id: \"strikethrough\",\n priority: 7,\n re: /~~([^~\\n]+?)~~/g,\n toNode: (match) => ({\n kind: \"strike\",\n children: [{ kind: \"text\", text: match[1] }],\n }),\n fastCheck: (text) => text.indexOf(\"~~\") !== -1,\n } as RegexInlinePlugin);\n\n // Regular emphasis (*text*)\n this.registerPlugin({\n id: \"emphasis\",\n priority: 8,\n re: /\\*([^*\\n]+?)\\*/g,\n toNode: (match) => ({\n kind: \"em\",\n children: [{ kind: \"text\", text: match[1] }],\n }),\n fastCheck: (text) => text.indexOf(\"*\") !== -1,\n } as RegexInlinePlugin);\n\n // Citations plugin: [^id] or @cite{...}\n this.registerPlugin({\n id: \"citations\",\n priority: 10,\n re: /\\[\\^([^\\]]+)\\]|@cite\\{([^}]+)\\}/g,\n toNode: (match) => ({ kind: \"citation\", id: match[1] || match[2] }),\n fastCheck: (text) => text.indexOf(\"@\") !== -1 || text.indexOf(\"[^\") !== -1,\n } as RegexInlinePlugin);\n\n // Mentions plugin: @username (lower precedence)\n this.registerPlugin({\n id: \"mentions\",\n priority: 15,\n re: /@([a-zA-Z0-9_]+)/g,\n toNode: (match) => ({ kind: \"mention\", handle: match[1] }),\n fastCheck: (text) => text.indexOf(\"@\") !== -1,\n } as RegexInlinePlugin);\n }\n}\n\n/**\n * Helper to apply regex-based inline plugins with proper precedence\n */\nexport function applyRegexPlugin(nodes: InlineNode[], plugin: RegexInlinePlugin): InlineNode[] {\n const result: InlineNode[] = [];\n const fastCheck = typeof plugin.fastCheck === \"function\" ? plugin.fastCheck : null;\n\n for (const node of nodes) {\n if (node.kind === \"text\") {\n if (fastCheck && !fastCheck(node.text)) {\n result.push(node);\n continue;\n }\n const parts = splitTextByRegexWithPrecedence(node.text, plugin.re, plugin.toNode);\n result.push(...parts);\n } else if (\"children\" in node && Array.isArray(node.children)) {\n // Recursively apply to children\n result.push({\n ...node,\n children: applyRegexPlugin(node.children, plugin),\n });\n } else {\n result.push(node);\n }\n }\n\n return result;\n}\n\n/**\n * Helper to apply AST visitor plugins\n */\nexport function applyASTPlugin(nodes: InlineNode[], plugin: ASTInlinePlugin): InlineNode[] {\n const result: InlineNode[] = [];\n\n for (const node of nodes) {\n const replacements: Array<{ original: InlineNode; replacement: InlineNode | InlineNode[] }> = [];\n\n plugin.visit(node, {\n replace(original, replacement) {\n replacements.push({ original, replacement });\n },\n });\n\n if (replacements.length > 0) {\n // Apply replacements\n for (const { replacement } of replacements) {\n if (Array.isArray(replacement)) {\n result.push(...replacement);\n } else {\n result.push(replacement);\n }\n }\n } else {\n // Recursively process children if no replacements\n if (\"children\" in node && Array.isArray(node.children)) {\n result.push({\n ...node,\n children: applyASTPlugin(node.children, plugin),\n });\n } else {\n result.push(node);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Split text by regex with precedence-aware processing\n */\nfunction splitTextByRegexWithPrecedence(text: string, regex: RegExp, toNode: (match: RegExpExecArray) => InlineNode | InlineNode[]): InlineNode[] {\n const result: InlineNode[] = [];\n let lastIndex = 0;\n regex.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n // Add text before match\n if (match.index > lastIndex) {\n const beforeText = text.slice(lastIndex, match.index);\n if (beforeText) {\n result.push({ kind: \"text\", text: beforeText });\n }\n }\n\n // Add converted node(s)\n const converted = toNode(match);\n if (Array.isArray(converted)) {\n result.push(...converted);\n } else {\n result.push(converted);\n }\n\n lastIndex = regex.lastIndex;\n\n // Prevent infinite loop for zero-width matches\n if (match.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n const remainingText = text.slice(lastIndex);\n if (remainingText) {\n result.push({ kind: \"text\", text: remainingText });\n }\n }\n\n return result;\n}\n\n/**\n * Legacy function name for backward compatibility\n */\nfunction splitTextByRegex(text: string, regex: RegExp, toNode: (match: RegExpExecArray) => InlineNode | InlineNode[]): InlineNode[] {\n return splitTextByRegexWithPrecedence(text, regex, toNode);\n}\n","import * as rehypeParse from \"rehype-parse\";\nimport * as rehypeSanitize from \"rehype-sanitize\";\nimport * as rehypeStringify from \"rehype-stringify\";\nimport { unified } from \"unified\";\n\nconst { defaultSchema } = rehypeSanitize;\n\ntype Schema = typeof defaultSchema;\ntype AttributeDefinition = string | [string, ...(string | number | boolean | RegExp | null | undefined)[]];\n\nconst SANITIZED_SCHEMA: Schema = createSchema();\n\nconst sanitizeProcessor = unified()\n .use(rehypeParse.default, { fragment: true })\n .use(rehypeSanitize.default, SANITIZED_SCHEMA)\n .use(rehypeStringify.default)\n .freeze();\n\nexport function sanitizeHtmlInWorker(html: string): string {\n if (!html) return \"\";\n try {\n return sanitizeProcessor.processSync(html).toString();\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to sanitize HTML in worker:\", error);\n return \"\";\n }\n}\n\nfunction createSchema(): Schema {\n const base = JSON.parse(JSON.stringify(defaultSchema)) as Schema;\n const tagSet = new Set<string>(base.tagNames ?? []);\n const allowedTags = [\n \"div\",\n \"span\",\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"del\",\n \"ins\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"ul\",\n \"ol\",\n \"li\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"a\",\n \"img\",\n \"section\",\n \"article\",\n \"aside\",\n \"nav\",\n \"header\",\n \"footer\",\n \"main\",\n \"annotation\",\n \"semantics\",\n \"mtext\",\n \"mn\",\n \"mo\",\n \"mi\",\n \"mspace\",\n \"mrow\",\n \"mfrac\",\n \"msup\",\n \"msub\",\n \"msubsup\",\n \"munder\",\n \"mover\",\n \"munderover\",\n \"msqrt\",\n \"mroot\",\n \"mtable\",\n \"mtr\",\n \"mtd\",\n \"sub\",\n \"sup\",\n \"kbd\",\n ];\n for (const tag of allowedTags) {\n tagSet.add(tag);\n }\n base.tagNames = Array.from(tagSet);\n\n base.attributes = {\n ...(base.attributes || {}),\n \"*\": mergeAttributes(base.attributes?.[\"*\"] as AttributeDefinition[] | undefined, [\"className\", \"id\", \"title\", \"style\", \"data-*\", \"aria-*\"]),\n a: mergeAttributes(base.attributes?.a as AttributeDefinition[] | undefined, [\"href\", \"title\", \"target\", \"rel\"]),\n img: mergeAttributes(base.attributes?.img as AttributeDefinition[] | undefined, [\"src\", \"alt\", \"title\"]),\n table: mergeAttributes(base.attributes?.table as AttributeDefinition[] | undefined, [\"align\", \"border\", \"cellpadding\", \"cellspacing\"]),\n th: mergeAttributes(base.attributes?.th as AttributeDefinition[] | undefined, [\"align\", \"colspan\", \"rowspan\"]),\n td: mergeAttributes(base.attributes?.td as AttributeDefinition[] | undefined, [\"align\", \"colspan\", \"rowspan\"]),\n tr: mergeAttributes(base.attributes?.tr as AttributeDefinition[] | undefined, [\"align\"]),\n } as Schema[\"attributes\"];\n\n base.protocols = {\n ...(base.protocols || {}),\n href: [\"http\", \"https\", \"mailto\", \"tel\", \"callto\"],\n src: [\"http\", \"https\", \"data\"],\n };\n\n return base;\n}\n\nfunction mergeAttributes(existing: AttributeDefinition[] | undefined, additions: string[]): AttributeDefinition[] {\n const next: AttributeDefinition[] = Array.isArray(existing) ? [...existing] : [];\n const existingStrings = new Set<string>();\n for (const entry of next) {\n if (typeof entry === \"string\") {\n existingStrings.add(entry);\n }\n }\n for (const attr of additions) {\n if (!existingStrings.has(attr)) {\n next.push(attr);\n existingStrings.add(attr);\n }\n }\n return next;\n}\n","import type { InlineNode, MixedContentSegment } from \"./types\";\nimport { sanitizeHtmlInWorker } from \"./worker-html-sanitizer\";\n\nexport function extractMixedContentSegments(\n raw: string,\n baseOffset: number | undefined,\n parseInline: (content: string) => InlineNode[],\n): MixedContentSegment[] {\n if (!raw) return [];\n const initial = splitByTagSegments(raw, baseOffset, parseInline);\n const expanded: MixedContentSegment[] = [];\n for (const segment of initial) {\n if (segment.kind === \"text\") {\n expanded.push(...splitTextSegmentByExpressions(segment, parseInline));\n } else {\n expanded.push(segment);\n }\n }\n return mergeAdjacentTextSegments(expanded, parseInline);\n}\n\nfunction splitByTagSegments(source: string, baseOffset: number | undefined, parseInline: (content: string) => InlineNode[]): MixedContentSegment[] {\n const segments: MixedContentSegment[] = [];\n const lowerSource = source.toLowerCase();\n const tagPattern = /<([A-Za-z][\\w:-]*)([^<>]*?)\\/?>/g;\n let cursor = 0;\n let match: RegExpExecArray | null = tagPattern.exec(source);\n const baseIsFinite = typeof baseOffset === \"number\" && Number.isFinite(baseOffset);\n\n while (match !== null) {\n const start = match.index;\n const tagName = match[1];\n const matchText = match[0];\n const isSelfClosing = matchText.endsWith(\"/>\") || isVoidHtmlTag(tagName);\n let end = tagPattern.lastIndex;\n\n if (!isSelfClosing && !isLikelyMdxComponent(tagName)) {\n const closingIndex = findClosingHtmlTag(lowerSource, tagName.toLowerCase(), end);\n if (closingIndex === -1) {\n // Tag not closed (common during streaming). Treat it as plain text and\n // continue scanning after the \"<\" so we don't get stuck on the same match.\n tagPattern.lastIndex = start + 1;\n match = tagPattern.exec(source);\n continue;\n }\n end = closingIndex;\n }\n\n if (start > cursor) {\n const absoluteFrom = baseIsFinite ? (baseOffset as number) + cursor : undefined;\n const absoluteTo = baseIsFinite ? (baseOffset as number) + start : undefined;\n pushTextSegment(segments, source.slice(cursor, start), absoluteFrom, absoluteTo, parseInline);\n }\n\n const rawSegment = source.slice(start, end);\n const kind: MixedContentSegment[\"kind\"] = isLikelyMdxComponent(tagName) ? \"mdx\" : \"html\";\n const segment: MixedContentSegment = {\n kind,\n value: rawSegment,\n range: createSegmentRange(baseOffset, start, end),\n };\n if (kind === \"html\") {\n segment.sanitized = sanitizeHtmlInWorker(rawSegment);\n } else {\n segment.status = \"pending\";\n }\n segments.push(segment);\n cursor = end;\n tagPattern.lastIndex = end;\n match = tagPattern.exec(source);\n }\n\n if (cursor < source.length) {\n const absoluteFrom = baseIsFinite ? (baseOffset as number) + cursor : undefined;\n const absoluteTo = baseIsFinite ? (baseOffset as number) + source.length : undefined;\n pushTextSegment(segments, source.slice(cursor), absoluteFrom, absoluteTo, parseInline);\n }\n\n return segments;\n}\n\nfunction splitTextSegmentByExpressions(segment: MixedContentSegment, parseInline: (content: string) => InlineNode[]): MixedContentSegment[] {\n if (segment.kind !== \"text\" || !segment.value) {\n return [segment];\n }\n const { value } = segment;\n if (isLikelyMathSegment(value)) {\n return [segment];\n }\n const hasRange = segment.range && typeof segment.range.from === \"number\" && typeof segment.range.to === \"number\";\n const rangeStart = hasRange ? segment.range?.from : undefined;\n const exprPattern = /\\{[^{}]+\\}/g;\n const results: MixedContentSegment[] = [];\n let cursor = 0;\n let match: RegExpExecArray | null = exprPattern.exec(value);\n\n while (match !== null) {\n const start = match.index;\n const end = exprPattern.lastIndex;\n if (start > cursor) {\n const textValue = value.slice(cursor, start);\n results.push({\n kind: \"text\",\n value: textValue,\n range: createSegmentRange(rangeStart, cursor, start),\n inline: parseInline(textValue),\n });\n }\n const expressionValue = match[0];\n results.push({\n kind: \"mdx\",\n value: expressionValue,\n range: createSegmentRange(rangeStart, start, end),\n status: \"pending\",\n });\n cursor = end;\n match = exprPattern.exec(value);\n }\n\n if (cursor < value.length) {\n const textValue = value.slice(cursor);\n results.push({\n kind: \"text\",\n value: textValue,\n range: createSegmentRange(rangeStart, cursor, value.length),\n inline: parseInline(textValue),\n });\n }\n\n return results.length > 0 ? results : [segment];\n}\n\nfunction isLikelyMathSegment(value: string): boolean {\n if (!value) return false;\n if (value.includes(\"$$\")) {\n return true;\n }\n if (/\\\\begin\\{[^}]+\\}/.test(value) || /\\\\end\\{[^}]+\\}/.test(value)) {\n return true;\n }\n if (/\\\\\\(|\\\\\\)|\\\\\\[|\\\\\\]/.test(value)) {\n return true;\n }\n if (/\\$[^$]*\\$/.test(value)) {\n return true;\n }\n if (/\\\\[a-zA-Z]+\\{/.test(value)) {\n return true;\n }\n return false;\n}\n\nfunction mergeAdjacentTextSegments(segments: MixedContentSegment[], parseInline: (content: string) => InlineNode[]): MixedContentSegment[] {\n if (segments.length === 0) return segments;\n const merged: MixedContentSegment[] = [];\n for (const segment of segments) {\n if (segment.kind === \"text\" && segment.value.length === 0) {\n continue;\n }\n const last = merged[merged.length - 1];\n if (segment.kind === \"text\" && last && last.kind === \"text\" && last.range && segment.range && last.range.to === segment.range.from) {\n last.value += segment.value;\n if (last.range && segment.range) {\n last.range.to = segment.range.to;\n }\n last.inline = parseInline(last.value);\n } else {\n merged.push(segment);\n }\n }\n return merged;\n}\n\nfunction pushTextSegment(\n target: MixedContentSegment[],\n value: string,\n from: number | undefined,\n to: number | undefined,\n parseInline: (content: string) => InlineNode[],\n): void {\n if (value.length === 0) return;\n target.push({\n kind: \"text\",\n value,\n range: createSegmentRange(from, 0, value.length, to),\n inline: parseInline(value),\n });\n}\n\nfunction createSegmentRange(base: number | undefined, relativeFrom: number, relativeTo: number, absoluteTo?: number): { from: number; to: number } | undefined {\n if (typeof base !== \"number\" || !Number.isFinite(base)) {\n return undefined;\n }\n const from = base + relativeFrom;\n const to = absoluteTo !== undefined ? absoluteTo : base + relativeTo;\n if (!Number.isFinite(from) || !Number.isFinite(to) || to < from) {\n return undefined;\n }\n return { from, to };\n}\n\nconst VOID_HTML_TAGS = new Set([\"br\", \"hr\", \"img\", \"meta\", \"input\", \"link\", \"source\", \"track\", \"area\", \"base\", \"col\", \"embed\"]);\n\nfunction isVoidHtmlTag(tagName: string): boolean {\n return VOID_HTML_TAGS.has(tagName.toLowerCase());\n}\n\nexport function isLikelyMdxComponent(tagName: string): boolean {\n const first = tagName.charAt(0);\n return first.toUpperCase() === first && first.toLowerCase() !== first;\n}\n\nexport function findClosingHtmlTag(lowerSource: string, lowerTagName: string, startIndex: number): number {\n let depth = 1;\n let searchIndex = startIndex;\n while (searchIndex < lowerSource.length) {\n const nextOpen = lowerSource.indexOf(`<${lowerTagName}`, searchIndex);\n const nextClose = lowerSource.indexOf(`</${lowerTagName}`, searchIndex);\n if (nextClose === -1) {\n return -1;\n }\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++;\n searchIndex = nextOpen + 1;\n continue;\n }\n const closeEnd = lowerSource.indexOf(\">\", nextClose);\n if (closeEnd === -1) {\n return -1;\n }\n depth--;\n const absoluteEnd = closeEnd + 1;\n if (depth === 0) {\n return absoluteEnd;\n }\n searchIndex = absoluteEnd;\n }\n return -1;\n}\n","// Utility functions for V2 Markdown Renderer\n\nimport { type Block, LANGUAGE_ALIASES, type ProtectedRange } from \"./types\";\n\n// Browser-compatible crypto import\nconst createHash = (_algorithm: string) => {\n let hash = 0;\n return {\n update(data: string) {\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data.charCodeAt(i)) & 0xffffffff;\n }\n return this;\n },\n digest(_encoding: string) {\n return Math.abs(hash).toString(16);\n },\n };\n};\n\n/**\n * Generate stable content hash for blocks\n */\nexport function generateBlockId(content: string, type: string): string {\n const hash = createHash(\"sha256\");\n hash.update(`${type}:${content}`);\n return hash.digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Normalize language names for syntax highlighting\n */\nexport function normalizeLang(raw?: string): string {\n const k = (raw || \"\").trim().toLowerCase();\n return LANGUAGE_ALIASES[k] ?? (k || \"text\");\n}\n\n/**\n * Apply tail splice (immutability & guards)\n */\nexport function applyUpdate(blocks: Block[], update: { start: number; tail: Block[] }): Block[] {\n // Guards\n if (update.start < 0 || update.start > blocks.length) return blocks;\n\n // Ensure finalized invariants\n for (let i = 0; i < update.start; i++) {\n if (!blocks[i].isFinalized) {\n throw new Error(\"Invariant violated: non-finalized before start\");\n }\n }\n\n // Splice tail immutably\n const next = blocks.slice(0, update.start).concat(update.tail);\n\n // Ensure only last is dirty (if any)\n for (let i = 0; i < next.length - 1; i++) {\n if (!next[i].isFinalized) throw new Error(\"Only tail may be dirty\");\n }\n\n return next;\n}\n\n/**\n * Generate stable React keys for blocks\n */\nexport function getBlockKey(block: Block): string {\n return `${block.id}:${block.isFinalized ? 1 : 0}`;\n}\n\n/**\n * Check if content contains MDX-like syntax\n */\nexport function detectMDX(content: string, options?: { protectedRanges?: ReadonlyArray<ProtectedRange>; baseOffset?: number }): boolean {\n const inlineCodeRanges = collectInlineCodeRanges(content);\n\n // Basic heuristic for MDX detection\n const componentPattern = /<([A-Z][\\w-]*)(\\s|\\/?>)/g;\n let componentMatch: RegExpExecArray | null = componentPattern.exec(content);\n while (componentMatch !== null) {\n const start = componentMatch.index;\n const end = start + componentMatch[0].length;\n if (!isWithinRanges(start, end, inlineCodeRanges)) {\n return true;\n }\n componentMatch = componentPattern.exec(content);\n }\n\n // Detect import/export statements (MDX/ESM)\n if (/(^|\\n)\\s*(import|export)\\s/.test(content)) {\n return true;\n }\n\n // Detect inline JSX expressions while ignoring TeX/LaTeX braces (`\\command{}`)\n const expressionPattern = /\\{[^{}]+\\}/g;\n const protectedRanges = options?.protectedRanges ?? [];\n const baseOffset = typeof options?.baseOffset === \"number\" ? options.baseOffset : 0;\n const protectedKinds = protectedRanges.length ? new Set<ProtectedRange[\"kind\"]>([\"math-inline\", \"math-display\", \"code-inline\", \"code-block\"]) : null;\n\n for (let match = expressionPattern.exec(content); match !== null; match = expressionPattern.exec(content)) {\n const index = match.index;\n const prev = index > 0 ? content[index - 1] : \"\";\n if (prev === \"\\\\\" || prev === \"$\" || prev === \"^\" || prev === \"_\") {\n continue;\n }\n const prefix = content.slice(Math.max(0, index - 8), index);\n if (/\\\\[a-zA-Z]+$/.test(prefix.trimEnd())) {\n continue;\n }\n const inner = match[0].slice(1, -1).trimStart();\n if (/^[\\s0-9+\\-*/(),.=\\\\^_]+$/.test(inner)) {\n continue;\n }\n if (inner.startsWith(\"\\\\\") || inner.startsWith(\"^\") || inner.startsWith(\"_\") || inner.startsWith(\"$\")) {\n continue;\n }\n const exprStart = index;\n const exprEnd = exprStart + match[0].length;\n if (isWithinRanges(exprStart, exprEnd, inlineCodeRanges)) {\n continue;\n }\n if (protectedKinds) {\n const absoluteStart = baseOffset + index;\n const absoluteEnd = absoluteStart + match[0].length;\n const covered = protectedRanges.some((range) => protectedKinds.has(range.kind) && range.from <= absoluteStart && range.to >= absoluteEnd);\n if (covered) {\n continue;\n }\n }\n return true;\n }\n\n return false;\n}\n\nfunction collectInlineCodeRanges(content: string): Array<{ from: number; to: number }> {\n if (!content) return [];\n const ranges: Array<{ from: number; to: number }> = [];\n const codeSpanRegex = /`(?:\\\\`|[^`])*?`/g;\n let codeMatch: RegExpExecArray | null = codeSpanRegex.exec(content);\n while (codeMatch !== null) {\n ranges.push({ from: codeMatch.index, to: codeMatch.index + codeMatch[0].length });\n codeMatch = codeSpanRegex.exec(content);\n }\n return ranges;\n}\n\nfunction isWithinRanges(start: number, end: number, ranges: Array<{ from: number; to: number }>): boolean {\n return ranges.some((range) => range.from <= start && range.to >= end);\n}\n\n/**\n * Parse code fence info (language and metadata)\n */\nexport function parseCodeFenceInfo(info: string): { lang: string; meta: Record<string, unknown> } {\n const parts = info.trim().split(/\\s+/);\n const lang = normalizeLang(parts[0]);\n\n const meta: Record<string, unknown> = {};\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i];\n if (part.includes(\"=\")) {\n const [key, value] = part.split(\"=\", 2);\n meta[key] = value;\n } else {\n meta[part] = true;\n }\n }\n\n return { lang, meta };\n}\n\n/**\n * Normalize blockquote text by removing a single leading \">\" (and optional whitespace) per line\n * while preserving internal blank lines that represent separate paragraphs.\n */\nexport function normalizeBlockquoteText(raw: string): string {\n if (!raw) return \"\";\n const lines = raw.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const normalized = lines.map((line) => line.replace(/^\\s*>?\\s?/, \"\"));\n // Trim leading/trailing empty lines but preserve internal spacing\n while (normalized.length > 0 && normalized[0].trim().length === 0) {\n normalized.shift();\n }\n while (normalized.length > 0 && normalized[normalized.length - 1].trim().length === 0) {\n normalized.pop();\n }\n return normalized.join(\"\\n\");\n}\n\n/**\n * Debounce function for performance optimization\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(func: T, delay: number): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func(...args), delay);\n };\n}\n\n/**\n * Performance measurement utility\n */\nexport class PerformanceTimer {\n private marks: Map<string, number> = new Map();\n\n mark(name: string): void {\n this.marks.set(name, performance.now());\n }\n\n measure(name: string): number | null {\n const start = this.marks.get(name);\n if (start === undefined) return null;\n return performance.now() - start;\n }\n\n reset(): void {\n this.marks.clear();\n }\n}\n\n/**\n * Memory-efficient string manipulation\n */\nexport function removeHeadingMarkers(input: string): string {\n return input\n .replace(/^(#{1,6})\\s+/, \"\")\n .replace(/\\s+={2,}\\s*$|\\s+-{2,}\\s*$/m, \"\")\n .trim();\n}\n\nexport class StringBuffer {\n private chunks: string[] = [];\n private length = 0;\n\n append(str: string): void {\n this.chunks.push(str);\n this.length += str.length;\n }\n\n toString(): string {\n const result = this.chunks.join(\"\");\n this.chunks = [result]; // Consolidate for future operations\n return result;\n }\n\n getLength(): number {\n return this.length;\n }\n\n clear(): void {\n this.chunks = [];\n this.length = 0;\n }\n}\n","// Security layer with sanitization and Trusted Types\n// Handles HTML sanitization for safe rendering\n\nimport createDOMPurify, { type Config as DOMPurifyConfig } from \"dompurify\";\n\ntype DOMPurifyInstance = {\n sanitize: (html: string, config: DOMPurifyConfig) => unknown;\n addHook?: (name: string, hook: (node: unknown) => unknown) => void;\n};\n\nlet domPurifyInstance: DOMPurifyInstance | null = null;\n\nfunction resolveDOMPurify(): DOMPurifyInstance {\n const maybeInstance = createDOMPurify as unknown as DOMPurifyInstance;\n if (maybeInstance && typeof maybeInstance.sanitize === \"function\") {\n return maybeInstance;\n }\n if (domPurifyInstance && typeof domPurifyInstance.sanitize === \"function\") {\n return domPurifyInstance;\n }\n if (typeof window === \"undefined\") {\n throw new Error(\"[markdown-v2] DOMPurify requires a DOM `window` to sanitize HTML. Provide a DOM (e.g. via jsdom) before calling sanitize helpers.\");\n }\n domPurifyInstance = (createDOMPurify as unknown as (win: Window) => DOMPurifyInstance)(window);\n return domPurifyInstance;\n}\n\n/**\n * Trusted Types policy for safe HTML rendering\n */\nlet trustedTypesPolicy: TrustedTypePolicy | undefined;\n\n/**\n * Initialize Trusted Types policy\n */\nexport function initializeTrustedTypesPolicy(): void {\n if (typeof window === \"undefined\" || trustedTypesPolicy) {\n return;\n }\n const trustedWindow = window as typeof window & { trustedTypes?: TrustedTypePolicyFactory };\n const factory = trustedWindow.trustedTypes;\n if (!factory || trustedTypesPolicy) {\n return;\n }\n trustedTypesPolicy = factory.createPolicy(\"markdown-renderer-v2\", {\n createHTML: (input: string) => {\n const out = resolveDOMPurify().sanitize(input, {\n ALLOWED_TAGS: [\n // Block elements\n \"div\",\n \"p\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"sub\",\n \"sup\",\n \"kbd\",\n \"ul\",\n \"ol\",\n \"li\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tr\",\n \"th\",\n \"td\",\n \"hr\",\n \"br\",\n\n // Inline elements\n \"span\",\n \"strong\",\n \"em\",\n \"a\",\n \"img\",\n\n // Code highlighting\n 'span[class^=\"token\"]',\n\n // Math rendering (KaTeX)\n 'span[class^=\"katex\"]',\n 'span[class^=\"mord\"]',\n 'span[class^=\"mopen\"]',\n 'span[class^=\"mclose\"]',\n 'span[class^=\"mop\"]',\n 'span[class^=\"mbin\"]',\n 'span[class^=\"mrel\"]',\n 'span[class^=\"mpunct\"]',\n 'span[class^=\"minner\"]',\n 'span[class^=\"mspace\"]',\n 'span[class^=\"sizing\"]',\n 'span[class^=\"reset-size\"]',\n \"div[class^='katex-block-wrapper']\",\n\n // Custom components\n \"div[data-component]\",\n \"span[data-component]\",\n ],\n ALLOWED_ATTR: [\n \"class\",\n \"id\",\n \"data-*\",\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"type\",\n \"value\",\n \"checked\",\n \"disabled\",\n \"style\", // Limited style for math rendering\n ],\n ALLOWED_URI_REGEXP: /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i,\n RETURN_DOM: false,\n RETURN_DOM_FRAGMENT: false,\n RETURN_TRUSTED_TYPE: false,\n });\n return typeof out === \"string\" ? out : String(out);\n },\n createScript: (input: string) => input,\n createScriptURL: (input: string) => input,\n });\n}\n\n/**\n * Create trusted HTML using DOMPurify and Trusted Types\n */\nexport function createTrustedHTML(html: string): TrustedHTML | string {\n // Initialize policy if not already done\n initializeTrustedTypesPolicy();\n\n if (trustedTypesPolicy) {\n return trustedTypesPolicy.createHTML(html);\n }\n\n // Fallback to DOMPurify without Trusted Types\n return resolveDOMPurify().sanitize(html, getSanitizationConfig()) as unknown as string | TrustedHTML;\n}\n\n/**\n * Sanitize HTML content for safe rendering\n */\nexport function sanitizeHTML(html: string): string {\n const out = resolveDOMPurify().sanitize(html, getSanitizationConfig());\n return typeof out === \"string\" ? out : String(out);\n}\n\n/**\n * Get DOMPurify configuration\n */\nfunction getSanitizationConfig(): DOMPurifyConfig {\n return {\n ALLOWED_TAGS: [\n // Standard HTML elements\n \"div\",\n \"span\",\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"del\",\n \"ins\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"sub\",\n \"sup\",\n \"kbd\",\n \"ul\",\n \"ol\",\n \"li\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"a\",\n \"img\",\n\n // Code highlighting (Shiki/Prism classes)\n \"span\",\n \"div\",\n\n // Math rendering (KaTeX)\n \"annotation\",\n \"semantics\",\n \"mtext\",\n \"mn\",\n \"mo\",\n \"mi\",\n \"mspace\",\n \"mrow\",\n \"mfrac\",\n \"msup\",\n \"msub\",\n \"msubsup\",\n \"munder\",\n \"mover\",\n \"munderover\",\n \"msqrt\",\n \"mroot\",\n \"mtable\",\n \"mtr\",\n \"mtd\",\n\n // Custom extension points\n \"section\",\n \"article\",\n \"aside\",\n \"nav\",\n \"header\",\n \"footer\",\n \"main\",\n ],\n\n ALLOWED_ATTR: [\n \"class\",\n \"id\",\n \"data-*\",\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"width\",\n \"height\",\n \"type\",\n \"value\",\n \"placeholder\",\n \"disabled\",\n \"readonly\",\n \"role\",\n \"aria-*\",\n \"style\", // Limited for math/highlighting\n \"target\",\n \"rel\",\n ],\n\n ALLOWED_URI_REGEXP: /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i,\n\n // Remove scripts and potentially dangerous content\n FORBID_TAGS: [\"script\", \"object\", \"embed\", \"form\", \"input\", \"button\"],\n FORBID_ATTR: [\"onerror\", \"onload\", \"onclick\", \"onmouseover\"],\n\n // Keep data attributes for component identification\n KEEP_CONTENT: true,\n\n // Return configuration\n RETURN_DOM: false,\n RETURN_DOM_FRAGMENT: false,\n RETURN_TRUSTED_TYPE: false,\n\n // Additional security\n SANITIZE_DOM: true,\n WHOLE_DOCUMENT: false,\n\n // Hook for custom processing\n SANITIZE_NAMED_PROPS: true,\n\n // Custom hooks\n CUSTOM_ELEMENT_HANDLING: {\n tagNameCheck: /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/,\n attributeNameCheck: /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/,\n allowCustomizedBuiltInElements: false,\n },\n };\n}\n\n/**\n * Sanitization policy for different content types\n */\nexport interface SanitizationPolicy {\n allowMath: boolean;\n allowSyntaxHighlighting: boolean;\n allowCustomComponents: boolean;\n allowInlineStyles: boolean;\n allowExternalLinks: boolean;\n customTags?: string[];\n customAttributes?: string[];\n}\n\n/**\n * Create custom sanitization config based on policy\n */\nexport function createSanitizationConfig(policy: SanitizationPolicy): DOMPurifyConfig {\n const baseConfig = getSanitizationConfig();\n\n // Extend allowed tags based on policy\n const allowedTags = [...(baseConfig.ALLOWED_TAGS || [])];\n const allowedAttr = [...(baseConfig.ALLOWED_ATTR || [])];\n\n if (!policy.allowMath) {\n // Remove math-related tags\n const mathTags = [\"annotation\", \"semantics\", \"mtext\", \"mn\", \"mo\", \"mi\", \"mspace\"];\n allowedTags.splice(0, allowedTags.length, ...allowedTags.filter((tag) => !mathTags.includes(tag)));\n }\n\n if (!policy.allowSyntaxHighlighting) {\n const classIndex = allowedAttr.indexOf(\"class\");\n if (classIndex > -1) {\n allowedAttr.splice(classIndex, 1);\n }\n }\n\n if (!policy.allowInlineStyles) {\n // Remove style attribute\n const styleIndex = allowedAttr.indexOf(\"style\");\n if (styleIndex > -1) {\n allowedAttr.splice(styleIndex, 1);\n }\n }\n\n if (!policy.allowExternalLinks) {\n // Restrict URI pattern to relative links only\n baseConfig.ALLOWED_URI_REGEXP = /^(?:[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i;\n }\n\n // Add custom tags and attributes\n if (policy.customTags) {\n allowedTags.push(...policy.customTags);\n }\n\n if (policy.customAttributes) {\n allowedAttr.push(...policy.customAttributes);\n }\n\n return {\n ...baseConfig,\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttr,\n };\n}\n\n/**\n * Sanitize code block HTML from syntax highlighters\n */\nexport function sanitizeCodeHTML(html: string): string {\n const out = resolveDOMPurify().sanitize(html, {\n ALLOWED_TAGS: [\"pre\", \"code\", \"span\", \"div\", \"br\"],\n ALLOWED_ATTR: [\"class\", \"data-*\", \"style\"],\n KEEP_CONTENT: true,\n RETURN_DOM: false,\n });\n return typeof out === \"string\" ? out : String(out);\n}\n\n/**\n * Sanitize math HTML from KaTeX\n */\nexport function sanitizeMathHTML(html: string): string {\n const out = resolveDOMPurify().sanitize(html, {\n ALLOWED_TAGS: [\n \"span\",\n \"div\",\n \"br\",\n // KaTeX specific tags\n \"annotation\",\n \"semantics\",\n \"mtext\",\n \"mn\",\n \"mo\",\n \"mi\",\n \"mspace\",\n \"mrow\",\n \"mfrac\",\n \"msup\",\n \"msub\",\n \"msubsup\",\n \"munder\",\n \"mover\",\n \"munderover\",\n \"msqrt\",\n \"mroot\",\n \"mtable\",\n \"mtr\",\n \"mtd\",\n ],\n ALLOWED_ATTR: [\"class\", \"style\", \"data-*\"],\n KEEP_CONTENT: true,\n RETURN_DOM: false,\n });\n return typeof out === \"string\" ? out : String(out);\n}\n\n/**\n * Validate and sanitize URLs\n */\nexport function sanitizeURL(url: string): string | null {\n // Basic URL validation and sanitization\n try {\n const parsed = new URL(url, window.location.origin);\n\n // Allow http, https, mailto, and relative URLs\n if (![\"http:\", \"https:\", \"mailto:\", \"tel:\"].includes(parsed.protocol)) {\n return null;\n }\n\n return parsed.toString();\n } catch {\n // If URL parsing fails, treat as relative\n if (url.startsWith(\"/\") || url.startsWith(\"./\") || url.startsWith(\"../\")) {\n return url;\n }\n return null;\n }\n}\n\n/**\n * Content Security Policy utilities\n */\nexport const CSP_HEADERS = {\n // Strict CSP for markdown rendering\n strict: [\n \"default-src 'self'\",\n \"script-src 'self'\",\n \"style-src 'self' 'unsafe-inline'\", // Required for KaTeX\n \"img-src 'self' data: https:\",\n \"connect-src 'self'\",\n \"font-src 'self' data:\",\n \"require-trusted-types-for 'script'\",\n \"trusted-types markdown-renderer-v2\",\n ].join(\"; \"),\n\n // Relaxed CSP for development\n development: [\n \"default-src 'self'\",\n \"script-src 'self' 'unsafe-eval'\",\n \"style-src 'self' 'unsafe-inline'\",\n \"img-src 'self' data: https:\",\n \"connect-src 'self' ws:\",\n \"font-src 'self' data:\",\n ].join(\"; \"),\n};\n\n/**\n * Initialize security features\n */\nexport function initializeSecurity(): void {\n // Initialize Trusted Types\n initializeTrustedTypesPolicy();\n\n // Set up DOMPurify hooks if needed\n try {\n const purifier = resolveDOMPurify();\n if (typeof purifier.addHook !== \"function\") {\n return;\n }\n\n purifier.addHook(\"beforeSanitizeElements\", (node: unknown) => node);\n purifier.addHook(\"afterSanitizeElements\", (node: unknown) => node);\n } catch {\n // ignore missing DOM environment\n }\n}\n","export interface BackpressureConfig {\n targetQueueDepth: number;\n maxQueueDepth: number;\n smoothingFactor: number;\n maxHeavyPatchBudget: number;\n minHeavyPatchBudget: number;\n lowCreditCutoff: number;\n}\n\nexport const DEFAULT_BACKPRESSURE_CONFIG: BackpressureConfig = {\n targetQueueDepth: 1.25,\n maxQueueDepth: 3,\n smoothingFactor: 0.7,\n maxHeavyPatchBudget: 4,\n minHeavyPatchBudget: 1,\n lowCreditCutoff: 0.5,\n};\n\nexport function calculateRawCredit(queueDepth: number, config: BackpressureConfig = DEFAULT_BACKPRESSURE_CONFIG): number {\n const depth = Number(queueDepth);\n if (!Number.isFinite(depth)) {\n return 1;\n }\n if (depth <= config.targetQueueDepth) {\n return 1;\n }\n if (depth >= config.maxQueueDepth) {\n return 0;\n }\n const range = Math.max(0.0001, config.maxQueueDepth - config.targetQueueDepth);\n const normalized = (depth - config.targetQueueDepth) / range;\n const credit = 1 - normalized;\n return clampCredit(credit);\n}\n\nexport function smoothCredit(previousCredit: number, rawCredit: number, smoothingFactor = DEFAULT_BACKPRESSURE_CONFIG.smoothingFactor): number {\n const prev = Number.isFinite(previousCredit) ? previousCredit : 1;\n const raw = Number.isFinite(rawCredit) ? rawCredit : prev;\n const factor = clamp01(smoothingFactor);\n if (factor <= 0) {\n return clampCredit(raw);\n }\n if (factor >= 1) {\n return clampCredit(raw);\n }\n const blended = prev + (raw - prev) * factor;\n return clampCredit(blended);\n}\n\nexport function calculateSmoothedCredit(queueDepth: number, previousCredit: number, config: BackpressureConfig = DEFAULT_BACKPRESSURE_CONFIG): number {\n const raw = calculateRawCredit(queueDepth, config);\n return smoothCredit(previousCredit, raw, config.smoothingFactor);\n}\n\nexport function computeHeavyPatchBudget(credit: number, config: BackpressureConfig = DEFAULT_BACKPRESSURE_CONFIG): number {\n if (!Number.isFinite(credit) || credit <= 0) {\n return 0;\n }\n if (credit <= config.lowCreditCutoff) {\n return 0;\n }\n const scaled = Math.floor(credit * config.maxHeavyPatchBudget);\n const budget = Math.max(config.minHeavyPatchBudget, scaled);\n return Math.min(config.maxHeavyPatchBudget, budget);\n}\n\nexport function clampCredit(value: number): number {\n if (!Number.isFinite(value)) return 1;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n}\n","import type { CoalescingMetrics, NodePath, NodeSnapshot, Patch, SetPropsBatchEntry } from \"../types\";\nexport type { CoalescingMetrics } from \"../types\";\n\nexport interface CoalesceConfig {\n enabled: boolean;\n maxCoalesceWindow: number; // Maximum patches to consider for coalescing (for performance)\n coalesceableOps: Set<Patch[\"op\"]>; // Operations that can be coalesced\n}\n\nexport const DEFAULT_COALESCE_CONFIG: CoalesceConfig = {\n enabled: true,\n maxCoalesceWindow: 50, // Look at up to 50 patches for coalescing opportunities\n coalesceableOps: new Set([\"appendLines\", \"insertChild\", \"setProps\"]),\n};\n\nconst MAX_BATCHED_SET_PROPS = 24;\nconst APPEND_MERGE_LIMIT = 10;\nconst INSERT_MERGE_LIMIT = 20;\nconst SET_PROPS_MERGE_LIMIT = 10;\nconst USE_LINEAR_COALESCING = typeof process === \"undefined\" ? true : process.env.V2_USE_LINEAR_COALESCING !== \"false\" && process.env.NODE_ENV !== \"test\";\n\nfunction cloneNodePath(path: NodePath): NodePath {\n return {\n blockId: path.blockId,\n nodeId: path.nodeId,\n indexPath: path.indexPath ? [...path.indexPath] : undefined,\n };\n}\n\nfunction nodePathKey(path: NodePath): string {\n const nodePart = path.nodeId ?? \"\";\n const indexPart = path.indexPath && path.indexPath.length > 0 ? `::${path.indexPath.join(\".\")}` : \"\";\n return `${path.blockId}::${nodePart}${indexPart}`;\n}\n\nfunction runCoalescer(patches: Patch[], config: CoalesceConfig = DEFAULT_COALESCE_CONFIG): Patch[] {\n if (USE_LINEAR_COALESCING) {\n return coalescePatchesLinear(patches, config);\n }\n return coalescePatchesQuadratic(patches, config);\n}\n\nexport function coalescePatches(patches: Patch[], config: CoalesceConfig = DEFAULT_COALESCE_CONFIG): Patch[] {\n return runCoalescer(patches, config);\n}\n\nexport function coalescePatchesWithMetrics(\n patches: Patch[],\n config: CoalesceConfig = DEFAULT_COALESCE_CONFIG,\n): { patches: Patch[]; metrics: CoalescingMetrics } {\n const start = typeof performance !== \"undefined\" && typeof performance.now === \"function\" ? performance.now() : Date.now();\n\n const output = runCoalescer(patches, config);\n const durationMs = (typeof performance !== \"undefined\" && typeof performance.now === \"function\" ? performance.now() : Date.now()) - start;\n\n const inputCounts = countOps(patches);\n const outputCounts = countOps(output);\n\n const metrics: CoalescingMetrics = {\n inputPatchCount: patches.length,\n outputPatchCount: output.length,\n coalescedCount: Math.max(0, patches.length - output.length),\n durationMs,\n appendLinesCoalesced: Math.max(0, (inputCounts.appendLines ?? 0) - (outputCounts.appendLines ?? 0)),\n setPropsCoalesced: Math.max(0, (inputCounts.setProps ?? 0) - (outputCounts.setProps ?? 0)),\n insertChildCoalesced: Math.max(0, (inputCounts.insertChild ?? 0) - (outputCounts.insertChild ?? 0)),\n };\n\n return { patches: output, metrics };\n}\n\nexport function coalescePatchesLinear(patches: Patch[], config: CoalesceConfig = DEFAULT_COALESCE_CONFIG): Patch[] {\n if (!config.enabled || patches.length === 0) {\n return patches;\n }\n\n const windowSize = Math.min(patches.length, config.maxCoalesceWindow);\n const window = patches.slice(0, windowSize);\n const rest = patches.slice(windowSize);\n\n const result: Patch[] = [];\n\n let i = 0;\n while (i < window.length) {\n const patch = window[i];\n if (!config.coalesceableOps.has(patch.op)) {\n result.push(patch);\n i++;\n continue;\n }\n\n if (patch.op === \"appendLines\") {\n const merged = mergeAppendLines(window, i);\n result.push(merged.patch);\n i = merged.nextIndex;\n continue;\n }\n\n if (patch.op === \"insertChild\") {\n const merged = collectInsertChildren(window, i);\n result.push(...merged.patches);\n i = merged.nextIndex;\n continue;\n }\n\n if (patch.op === \"setProps\") {\n const merged = collectSetProps(window, i);\n result.push(...merged.patches);\n i = merged.nextIndex;\n continue;\n }\n\n result.push(patch);\n i++;\n }\n\n if (result.length > 1) {\n const dedup: Patch[] = [];\n const seenSetProps = new Set<string>();\n for (let idx = result.length - 1; idx >= 0; idx--) {\n const current = result[idx];\n if (current.op === \"setProps\") {\n const key = `${current.at.blockId}::$${current.at.nodeId ?? \"\"}`;\n if (seenSetProps.has(key)) {\n continue;\n }\n seenSetProps.add(key);\n }\n dedup.push(current);\n }\n dedup.reverse();\n result.length = 0;\n result.push(...dedup);\n }\n\n return [...result, ...rest];\n}\n\nfunction mergeAppendLines(window: Patch[], startIndex: number): { patch: Patch; nextIndex: number } {\n const base = window[startIndex];\n if (!base || base.op !== \"appendLines\") {\n return { patch: base, nextIndex: startIndex + 1 };\n }\n\n const lines = [...(base.lines ?? [])];\n const highlight: Array<string | null> = Array.isArray(base.highlight) ? [...base.highlight] : [];\n const baseStart = base.startIndex;\n let expectedStart = baseStart + lines.length;\n let j = startIndex + 1;\n let mergedCount = 0;\n\n while (j < window.length && mergedCount < APPEND_MERGE_LIMIT) {\n const next = window[j];\n if (\n next.op === \"appendLines\" &&\n next.at.blockId === base.at.blockId &&\n next.at.nodeId === base.at.nodeId &&\n typeof next.startIndex === \"number\" &&\n next.startIndex === expectedStart\n ) {\n lines.push(...(next.lines ?? []));\n const nextHighlights = Array.isArray(next.highlight) ? next.highlight : [];\n const appendedCount = next.lines?.length ?? 0;\n if (nextHighlights.length > 0) {\n for (let idx = 0; idx < appendedCount; idx++) {\n const highlightValue = idx < nextHighlights.length ? (nextHighlights[idx] ?? null) : null;\n highlight.push(highlightValue);\n }\n } else {\n for (let idx = 0; idx < appendedCount; idx++) {\n highlight.push(null);\n }\n }\n expectedStart = baseStart + lines.length;\n mergedCount++;\n j++;\n continue;\n }\n break;\n }\n\n const combined: Patch = {\n ...base,\n lines,\n highlight: highlight.length > 0 ? highlight : undefined,\n };\n\n return { patch: combined, nextIndex: j };\n}\n\nfunction collectInsertChildren(window: Patch[], startIndex: number): { patches: Patch[]; nextIndex: number } {\n const base = window[startIndex];\n if (!base || base.op !== \"insertChild\") {\n return { patches: [base], nextIndex: startIndex + 1 };\n }\n const inserts: Array<{ index: number; node: NodeSnapshot }> = [];\n if (typeof base.index === \"number\") {\n inserts.push({ index: base.index, node: base.node });\n }\n let j = startIndex + 1;\n let mergedCount = 0;\n\n while (j < window.length && mergedCount < INSERT_MERGE_LIMIT) {\n const next = window[j];\n if (\n next.op === \"insertChild\" &&\n next.at.blockId === base.at.blockId &&\n next.at.nodeId === base.at.nodeId &&\n typeof next.index === \"number\" &&\n typeof base.index === \"number\" &&\n next.index === (base.index ?? 0) + inserts.length\n ) {\n inserts.push({ index: next.index, node: next.node });\n mergedCount++;\n j++;\n continue;\n }\n break;\n }\n\n if (inserts.length <= 1) {\n return { patches: [base], nextIndex: j };\n }\n\n const clones = inserts.map((entry) => ({\n ...base,\n index: entry.index,\n node: entry.node,\n })) as Patch[];\n\n return { patches: clones, nextIndex: j };\n}\n\nfunction collectSetProps(window: Patch[], startIndex: number): { patches: Patch[]; nextIndex: number } {\n const first = window[startIndex];\n if (!first || first.op !== \"setProps\") {\n return { patches: [first], nextIndex: startIndex + 1 };\n }\n const entries: SetPropsBatchEntry[] = [];\n let j = startIndex;\n\n while (j < window.length && entries.length < MAX_BATCHED_SET_PROPS) {\n const current = window[j];\n if (current.op !== \"setProps\") {\n break;\n }\n const mergedProps = { ...(current.props ?? {}) };\n let k = j + 1;\n let mergedCount = 0;\n\n while (k < window.length && mergedCount < SET_PROPS_MERGE_LIMIT) {\n const next = window[k];\n if (next.op === \"setProps\" && nodePathKey(next.at) === nodePathKey(current.at)) {\n Object.assign(mergedProps, next.props ?? {});\n mergedCount++;\n k++;\n } else {\n break;\n }\n }\n\n entries.push({\n at: cloneNodePath(current.at),\n props: mergedProps,\n });\n\n j = k;\n }\n\n if (entries.length === 0) {\n return { patches: [window[startIndex]], nextIndex: startIndex + 1 };\n }\n\n if (entries.length === 1) {\n const single = entries[0];\n const patch: Patch = {\n ...(first as Patch),\n op: \"setProps\",\n props: single.props,\n } as Patch;\n return { patches: [patch], nextIndex: j };\n }\n\n const batchPatch: Patch = {\n op: \"setPropsBatch\",\n entries,\n } as Patch;\n\n return { patches: [batchPatch], nextIndex: j };\n}\n\nfunction countOps(patches: Patch[]): Record<string, number> {\n const counts: Record<string, number> = Object.create(null);\n for (const patch of patches) {\n counts[patch.op] = (counts[patch.op] ?? 0) + 1;\n }\n return counts;\n}\n\n/**\n * Coalesce adjacent patches that target the same parent and can be batched together.\n * This reduces the number of DOM operations and React re-renders.\n *\n * Currently coalesces:\n * - Multiple `appendLines` for the same code block → single `appendLines` with combined lines\n * - Multiple `insertChild` for the same parent at consecutive indices → single batch insert\n * - Multiple `setProps` for the same node → single `setProps` with merged props\n */\nexport function coalescePatchesQuadratic(patches: Patch[], config: CoalesceConfig = DEFAULT_COALESCE_CONFIG): Patch[] {\n if (!config.enabled || patches.length === 0) {\n return patches;\n }\n\n // Limit the window for performance (coalescing is O(n²) worst case)\n const windowSize = Math.min(patches.length, config.maxCoalesceWindow);\n const window = patches.slice(0, windowSize);\n const rest = patches.slice(windowSize);\n\n const coalesced: Patch[] = [];\n let i = 0;\n\n while (i < window.length) {\n const current = window[i];\n if (!config.coalesceableOps.has(current.op)) {\n coalesced.push(current);\n i++;\n continue;\n }\n\n // Try to coalesce current patch with following patches\n let coalescedCount = 0;\n\n if (current.op === \"appendLines\") {\n // Coalesce multiple appendLines for the same block\n const lines: string[] = [...current.lines];\n const highlights: Array<string | null> = current.highlight ? [...current.highlight] : [];\n let j = i + 1;\n\n while (j < window.length && coalescedCount < 10) {\n const next = window[j];\n if (\n next.op === \"appendLines\" &&\n next.at.blockId === current.at.blockId &&\n next.at.nodeId === current.at.nodeId &&\n typeof next.startIndex === \"number\" &&\n typeof current.startIndex === \"number\" &&\n next.startIndex === (current.startIndex ?? 0) + lines.length\n ) {\n lines.push(...next.lines);\n if (next.highlight) {\n highlights.push(...next.highlight);\n } else {\n highlights.push(...new Array(next.lines.length).fill(null));\n }\n coalescedCount++;\n j++;\n } else {\n break;\n }\n }\n\n if (coalescedCount > 0) {\n coalesced.push({\n ...current,\n lines,\n highlight: highlights.length > 0 ? highlights : undefined,\n });\n i = j;\n continue;\n }\n } else if (current.op === \"insertChild\") {\n // Coalesce multiple insertChild for the same parent at consecutive indices\n const inserts: Array<{ index: number; node: typeof current.node }> = [{ index: current.index, node: current.node }];\n let j = i + 1;\n let lastIndex = current.index;\n\n while (j < window.length && coalescedCount < 20) {\n const next = window[j];\n if (next.op === \"insertChild\" && next.at.blockId === current.at.blockId && next.at.nodeId === current.at.nodeId && next.index === lastIndex + 1) {\n inserts.push({ index: next.index, node: next.node });\n lastIndex = next.index;\n coalescedCount++;\n j++;\n } else {\n break;\n }\n }\n\n // For now, keep individual inserts (batching would require a new patch op)\n // Future: could add `insertChildren` batch op\n if (coalescedCount === 0) {\n coalesced.push(current);\n i++;\n continue;\n }\n // Add all inserts individually for now (coalescing helped us skip some processing)\n coalesced.push(...inserts.map((ins) => ({ ...current, index: ins.index, node: ins.node })));\n i = j;\n continue;\n } else if (current.op === \"setProps\") {\n // Coalesce multiple setProps for the same node\n const mergedProps = { ...(current.props ?? {}) };\n let j = i + 1;\n\n while (j < window.length && coalescedCount < 10) {\n const next = window[j];\n if (next.op === \"setProps\" && next.at.blockId === current.at.blockId && next.at.nodeId === current.at.nodeId) {\n Object.assign(mergedProps, next.props ?? {});\n coalescedCount++;\n j++;\n } else {\n break;\n }\n }\n\n const batchEntries = [\n {\n at: cloneNodePath(current.at),\n props: mergedProps,\n },\n ];\n\n let k = j;\n while (k < window.length && batchEntries.length < MAX_BATCHED_SET_PROPS) {\n const candidate = window[k];\n if (candidate.op !== \"setProps\") {\n break;\n }\n\n const candidateMergedProps = { ...(candidate.props ?? {}) };\n let m = k + 1;\n let localMerged = 0;\n\n while (m < window.length && localMerged < 10) {\n const follow = window[m];\n if (follow.op === \"setProps\" && nodePathKey(follow.at) === nodePathKey(candidate.at)) {\n Object.assign(candidateMergedProps, follow.props ?? {});\n m++;\n localMerged++;\n } else {\n break;\n }\n }\n\n batchEntries.push({\n at: cloneNodePath(candidate.at),\n props: candidateMergedProps,\n });\n k = m;\n }\n\n if (batchEntries.length > 1) {\n coalesced.push({\n op: \"setPropsBatch\",\n entries: batchEntries,\n } as Patch);\n i = k;\n continue;\n }\n\n if (coalescedCount > 0) {\n coalesced.push({\n ...current,\n props: mergedProps,\n });\n i = j;\n continue;\n }\n\n coalesced.push({\n ...current,\n props: mergedProps,\n });\n i++;\n continue;\n }\n\n // No coalescing found, add current patch\n coalesced.push(current);\n i++;\n }\n\n // Deduplicate sequential setProps so only the latest per node survives within the window\n if (coalesced.length > 1) {\n const deduped: Patch[] = [];\n const seenSetProps = new Set<string>();\n for (let idx = coalesced.length - 1; idx >= 0; idx--) {\n const patch = coalesced[idx];\n if (patch.op === \"setProps\") {\n const key = `${patch.at.blockId}::$${patch.at.nodeId ?? \"\"}`;\n if (seenSetProps.has(key)) {\n continue;\n }\n seenSetProps.add(key);\n }\n deduped.push(patch);\n }\n deduped.reverse();\n coalesced.length = 0;\n coalesced.push(...deduped);\n }\n\n // Add remaining patches that weren't in the coalescing window\n return [...coalesced, ...rest];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACsIO,IAAM,mBAA2C;AAAA,EACtD,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA;AAEN;AAkCO,IAAM,gBAAgB;;;ACpL7B,sBAAmC;;;ACEnC,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,QAAQ,UAAU,IAAI;AACrC;AAEA,SAAS,YAAY,MAAuB;AAC1C,SAAO,OAAO,KAAK,KAAK,KAAK,CAAC;AAChC;AAEO,SAAS,eAAe,KAAgE;AAC7F,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,MAAM,IAAI,MAAM,IAAI,UAAU,MAAM;AAAA,EAC/C;AACA,QAAM,aAAa,kBAAkB,GAAG;AACxC,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,MAAM,YAAY,MAAM,IAAI,UAAU,MAAM;AAAA,EACvD;AAEA,QAAM,YAAY,MAAM,CAAC;AACzB,MAAI,CAAC,YAAY,SAAS,GAAG;AAC3B,WAAO,EAAE,MAAM,YAAY,MAAM,IAAI,UAAU,MAAM;AAAA,EACvD;AAEA,QAAM,OAAO,UAAU,MAAM,CAAC,EAAE,KAAK;AACrC,MAAI,WAAW,MAAM,SAAS;AAC9B,SAAO,WAAW,KAAK,MAAM,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG;AAC1D;AAAA,EACF;AACA,MAAI,WAAW,KAAK,YAAY,MAAM,QAAQ,CAAC,GAAG;AAChD,UAAMA,aAAY,MAAM,MAAM,GAAG,QAAQ;AACzC,WAAO,EAAE,MAAMA,WAAU,KAAK,IAAI,GAAG,MAAM,UAAU,KAAK;AAAA,EAC5D;AAIA,QAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,SAAO,EAAE,MAAM,UAAU,KAAK,IAAI,GAAG,MAAM,UAAU,KAAK;AAC5D;AAEA,SAAS,eAAiC;AACxC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,cAAc,YAAY;AAC3E,WAAO,IAAI,OAAO,UAAU;AAAA,EAC9B;AACA,MAAI,OAAO,cAAc,aAAa;AACpC,QAAI;AACF,aAAO,IAAI,UAAU;AAAA,IACvB,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,MAAc,gBAA2C;AAC/F,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,MAAM,KAAK,IAAI,GAAG,cAAc,CAAC,EAAE,KAAK,IAAI;AAAA,EACzD;AAEA,QAAM,SAAS,aAAa;AAC5B,MAAI,QAAQ;AACV,QAAI;AACF,YAAM,MAAM,OAAO,gBAAgB,QAAQ,IAAI,UAAU,WAAW;AACpE,YAAM,QAAQ,IAAI,iBAAiB,WAAW;AAC9C,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,QAA2B,CAAC;AAClC,mBAAW,QAAQ,OAAO;AACxB,gBAAM,KAAK,gBAAgB,UAAU,KAAK,YAAY,IAAI;AAAA,QAC5D;AACA,eAAO,0BAA0B,OAAO,cAAc;AAAA,MACxD;AAAA,IACF,SAAS,OAAO;AAAA,IAEhB;AAAA,EACF;AAEA,SAAO,8BAA8B,MAAM,cAAc;AAC3D;AAEA,SAAS,0BAA0B,OAA0B,gBAA2C;AACtG,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO,IAAI,MAAM,KAAK,IAAI,GAAG,cAAc,CAAC,EAAE,KAAK,IAAI;AAAA,EACzD;AACA,QAAM,SAAS,KAAK,IAAI,gBAAgB,MAAM,MAAM;AACpD,QAAM,SAA4B,IAAI,MAAM,MAAM,EAAE,KAAK,IAAI;AAC7D,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,WAAO,CAAC,IAAI,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,MAAc,gBAA2C;AAC9F,QAAM,YAAY;AAClB,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAgC,UAAU,KAAK,IAAI;AAEvD,SAAO,UAAU,MAAM;AACrB,UAAM,aAAa,KAAK,QAAQ,KAAK,MAAM,KAAK;AAChD,QAAI,eAAe,GAAI;AACvB,QAAI,SAAS,aAAa;AAC1B,QAAI,QAAQ;AACZ,QAAI,SAAS;AAEb,WAAO,SAAS,KAAK,UAAU,QAAQ,GAAG;AACxC,YAAM,eAAe,KAAK,QAAQ,KAAK,MAAM;AAC7C,UAAI,iBAAiB,IAAI;AACvB,kBAAU,KAAK,MAAM,MAAM;AAC3B,iBAAS,KAAK;AACd;AAAA,MACF;AACA,UAAI,eAAe,QAAQ;AACzB,kBAAU,KAAK,MAAM,QAAQ,YAAY;AAAA,MAC3C;AACA,eAAS;AACT,UAAI,KAAK,WAAW,WAAW,MAAM,GAAG;AACtC,iBAAS;AACT,kBAAU;AACV,YAAI,UAAU,EAAG;AACjB,kBAAU;AACV;AAAA,MACF;AACA,YAAM,SAAS,KAAK,QAAQ,KAAK,MAAM;AACvC,UAAI,WAAW,IAAI;AACjB,kBAAU,KAAK,MAAM,MAAM;AAC3B,iBAAS,KAAK;AACd;AAAA,MACF;AACA,YAAM,MAAM,KAAK,MAAM,QAAQ,SAAS,CAAC;AACzC,UAAI,YAAY,KAAK,GAAG,GAAG;AACzB,iBAAS;AAAA,MACX;AACA,gBAAU;AACV,eAAS,SAAS;AAAA,IACpB;AAEA,UAAM,KAAK,MAAM;AACjB,cAAU,YAAY;AACtB,YAAQ,UAAU,KAAK,IAAI;AAAA,EAC7B;AAEA,SAAO,0BAA0B,OAAO,cAAc;AACxD;AAEO,SAAS,mBAAmB,KAAqB;AACtD,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,aAAa,kBAAkB,GAAG;AACxC,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,MAAI,YAAY,OAAO;AACvB,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,QAAI,CAAC,MAAO;AACZ,gBAAY,KAAK,IAAI,WAAW,MAAM,CAAC,EAAE,MAAM;AAAA,EACjD;AACA,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,cAAc,GAAG;AAClD,WAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,CAAC,SAAU,KAAK,WAAW,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,MAAM,SAAS,IAAI,IAAK,EAAE,KAAK,IAAI;AAC/G;AAEO,SAAS,iBAAiB,KAAuB;AACtD,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,QAAM,aAAa,kBAAkB,GAAG;AACxC,QAAM,EAAE,MAAM,SAAS,IAAI,eAAe,UAAU;AACpD,MAAI,UAAU;AACZ,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AACA,MAAI,UAAU,KAAK,UAAU,GAAG;AAC9B,WAAO,mBAAmB,UAAU,EAAE,MAAM,IAAI;AAAA,EAClD;AACA,SAAO,WAAW,MAAM,IAAI;AAC9B;AAEO,SAAS,6BAA6B,MAG3C;AACA,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW,KAAK,MAAM,iBAAiB;AAC7C,QAAM,YAAY,KAAK,MAAM,kBAAkB;AAC/C,SAAO;AAAA,IACL,UAAU,WAAW,wBAAwB,uBAAuB,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI;AAAA,IAC1F,WAAW,YAAY,wBAAwB,uBAAuB,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI;AAAA,EAC/F;AACF;AAEA,SAAS,uBAAuB,UAA0C;AACxE,QAAM,QAAgC,CAAC;AACvC,QAAM,QAAQ;AACd,MAAI,QAAgC,MAAM,KAAK,QAAQ;AACvD,SAAO,UAAU,MAAM;AACrB,UAAM,CAAC,EAAE,MAAM,KAAK,IAAI;AACxB,UAAM,IAAI,IAAI;AACd,YAAQ,MAAM,KAAK,QAAQ;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAuD;AACtF,QAAM,UAAU,oBAAI,IAAI,CAAC,SAAS,SAAS,YAAY,CAAC;AACxD,QAAM,WAAmC,CAAC;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,QAAQ,IAAI,GAAG,KAAK,IAAI,WAAW,OAAO,GAAG;AAC/C,eAAS,GAAG,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;;;AC1LO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,UAA+B,CAAC,GAAG;AAJ/C,SAAQ,UAA0B,CAAC;AACnC,SAAQ,QAAQ,oBAAI,IAA0B;AAI5C,SAAK,kBAAkB,OAAO,SAAS,QAAQ,mBAAmB,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,QAAQ,mBAAmB,CAAC,IAAI;AAE5H,SAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAA4B;AACzC,SAAK,QAAQ,KAAK,MAAM;AAExB,SAAK,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAEnD,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,UAA8B,CAAC,GAAiB;AACrE,UAAM,cAAc,QAAQ,UAAU,SAAS,KAAK,kBAAkB;AAEtE,QAAI,aAAa;AACf,YAAM,SAAS,KAAK,MAAM,IAAI,OAAO;AACrC,UAAI,QAAQ;AAEV,aAAK,MAAM,OAAO,OAAO;AACzB,aAAK,MAAM,IAAI,SAAS,MAAM;AAC9B,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,aAAa,KAAK,eAAe,OAAO;AAG9C,QAAI,SAAS;AACb,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,WAAW,QAAQ;AACrB,iBAAS,OAAO,MAAM,MAAM;AAAA,MAC9B,WAAW,QAAQ,QAAQ;AAEzB,iBAAS,iBAAiB,QAAQ,MAA2B;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI,aAAa;AAEf,WAAK,MAAM,IAAI,SAAS,MAAM;AAC9B,aAAO,KAAK,MAAM,OAAO,KAAK,iBAAiB;AAC7C,cAAM,YAAY,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAC3C,YAAI,cAAc,OAAW;AAC7B,aAAK,MAAM,OAAO,SAAS;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,SAA+B;AAGpD,WAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,0BAA0B,MAAmB,SAA+B;AAGlF,WAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAA+B;AAErC,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,MAAM,CAAC;AAAA,MACf;AAAA,MACA,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC9C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW,EAAE,MAAM,gBAAgB,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE;AAAA,MACjE,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC9C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA;AAAA,MACJ,QAAQ,CAAC,WAAW,EAAE,MAAM,eAAe,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE;AAAA,MAChE,WAAW,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM;AAAA,IAC7C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC,EAAE;AAAA,MACnD,WAAW,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM;AAAA,IAC7C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,QACpB,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,MAC7C;AAAA,MACA,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC9C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW,EAAE,MAAM,gBAAgB,OAAO,MAAM,CAAC,EAAE;AAAA,MAC5D,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC9C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW;AAAA,QAClB,MAAM;AAAA,QACN,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,QACnB,KAAK,MAAM,CAAC;AAAA,MACd;AAAA,MACA,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC9C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW;AAAA,QAClB,MAAM;AAAA,QACN,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,MACzD;AAAA,MACA,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC9C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW;AAAA,QAClB,MAAM;AAAA,QACN,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,MAC7C;AAAA,MACA,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC9C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW;AAAA,QAClB,MAAM;AAAA,QACN,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,MAC7C;AAAA,MACA,WAAW,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM;AAAA,IAC7C,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW,EAAE,MAAM,YAAY,IAAI,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE;AAAA,MACjE,WAAW,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM,MAAM,KAAK,QAAQ,IAAI,MAAM;AAAA,IAC1E,CAAsB;AAGtB,SAAK,eAAe;AAAA,MAClB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ,CAAC,WAAW,EAAE,MAAM,WAAW,QAAQ,MAAM,CAAC,EAAE;AAAA,MACxD,WAAW,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM;AAAA,IAC7C,CAAsB;AAAA,EACxB;AACF;AAKO,SAAS,iBAAiB,OAAqB,QAAyC;AAC7F,QAAM,SAAuB,CAAC;AAC9B,QAAM,YAAY,OAAO,OAAO,cAAc,aAAa,OAAO,YAAY;AAE9E,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,QAAQ;AACxB,UAAI,aAAa,CAAC,UAAU,KAAK,IAAI,GAAG;AACtC,eAAO,KAAK,IAAI;AAChB;AAAA,MACF;AACA,YAAM,QAAQ,+BAA+B,KAAK,MAAM,OAAO,IAAI,OAAO,MAAM;AAChF,aAAO,KAAK,GAAG,KAAK;AAAA,IACtB,WAAW,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAE7D,aAAO,KAAK;AAAA,QACV,GAAG;AAAA,QACH,UAAU,iBAAiB,KAAK,UAAU,MAAM;AAAA,MAClD,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,eAAe,OAAqB,QAAuC;AACzF,QAAM,SAAuB,CAAC;AAE9B,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAwF,CAAC;AAE/F,WAAO,MAAM,MAAM;AAAA,MACjB,QAAQ,UAAU,aAAa;AAC7B,qBAAa,KAAK,EAAE,UAAU,YAAY,CAAC;AAAA,MAC7C;AAAA,IACF,CAAC;AAED,QAAI,aAAa,SAAS,GAAG;AAE3B,iBAAW,EAAE,YAAY,KAAK,cAAc;AAC1C,YAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,iBAAO,KAAK,GAAG,WAAW;AAAA,QAC5B,OAAO;AACL,iBAAO,KAAK,WAAW;AAAA,QACzB;AAAA,MACF;AAAA,IACF,OAAO;AAEL,UAAI,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD,eAAO,KAAK;AAAA,UACV,GAAG;AAAA,UACH,UAAU,eAAe,KAAK,UAAU,MAAM;AAAA,QAChD,CAAC;AAAA,MACH,OAAO;AACL,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,+BAA+B,MAAc,OAAe,QAA6E;AAChJ,QAAM,SAAuB,CAAC;AAC9B,MAAI,YAAY;AAChB,QAAM,YAAY;AAElB,MAAI;AACJ,UAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAE1C,QAAI,MAAM,QAAQ,WAAW;AAC3B,YAAM,aAAa,KAAK,MAAM,WAAW,MAAM,KAAK;AACpD,UAAI,YAAY;AACd,eAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,WAAW,CAAC;AAAA,MAChD;AAAA,IACF;AAGA,UAAM,YAAY,OAAO,KAAK;AAC9B,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,aAAO,KAAK,GAAG,SAAS;AAAA,IAC1B,OAAO;AACL,aAAO,KAAK,SAAS;AAAA,IACvB;AAEA,gBAAY,MAAM;AAGlB,QAAI,MAAM,UAAU,MAAM,WAAW;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AAGA,MAAI,YAAY,KAAK,QAAQ;AAC3B,UAAM,gBAAgB,KAAK,MAAM,SAAS;AAC1C,QAAI,eAAe;AACjB,aAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,cAAc,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AACT;;;AC1WA,kBAA6B;AAC7B,qBAAgC;AAChC,sBAAiC;AACjC,qBAAwB;AAExB,IAAM,EAAE,cAAc,IAAI;AAK1B,IAAM,mBAA2B,aAAa;AAE9C,IAAM,wBAAoB,wBAAQ,EAC/B,IAAgB,qBAAS,EAAE,UAAU,KAAK,CAAC,EAC3C,IAAmB,wBAAS,gBAAgB,EAC5C,IAAoB,uBAAO,EAC3B,OAAO;AAEH,SAAS,qBAAqB,MAAsB;AACzD,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,WAAO,kBAAkB,YAAY,IAAI,EAAE,SAAS;AAAA,EACtD,SAAS,OAAO;AACd,YAAQ,KAAK,oDAAoD,KAAK;AACtE,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAuB;AAC9B,QAAM,OAAO,KAAK,MAAM,KAAK,UAAU,aAAa,CAAC;AACrD,QAAM,SAAS,IAAI,IAAY,KAAK,YAAY,CAAC,CAAC;AAClD,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,OAAO,aAAa;AAC7B,WAAO,IAAI,GAAG;AAAA,EAChB;AACA,OAAK,WAAW,MAAM,KAAK,MAAM;AAEjC,OAAK,aAAa;AAAA,IAChB,GAAI,KAAK,cAAc,CAAC;AAAA,IACxB,KAAK,gBAAgB,KAAK,aAAa,GAAG,GAAwC,CAAC,aAAa,MAAM,SAAS,SAAS,UAAU,QAAQ,CAAC;AAAA,IAC3I,GAAG,gBAAgB,KAAK,YAAY,GAAwC,CAAC,QAAQ,SAAS,UAAU,KAAK,CAAC;AAAA,IAC9G,KAAK,gBAAgB,KAAK,YAAY,KAA0C,CAAC,OAAO,OAAO,OAAO,CAAC;AAAA,IACvG,OAAO,gBAAgB,KAAK,YAAY,OAA4C,CAAC,SAAS,UAAU,eAAe,aAAa,CAAC;AAAA,IACrI,IAAI,gBAAgB,KAAK,YAAY,IAAyC,CAAC,SAAS,WAAW,SAAS,CAAC;AAAA,IAC7G,IAAI,gBAAgB,KAAK,YAAY,IAAyC,CAAC,SAAS,WAAW,SAAS,CAAC;AAAA,IAC7G,IAAI,gBAAgB,KAAK,YAAY,IAAyC,CAAC,OAAO,CAAC;AAAA,EACzF;AAEA,OAAK,YAAY;AAAA,IACf,GAAI,KAAK,aAAa,CAAC;AAAA,IACvB,MAAM,CAAC,QAAQ,SAAS,UAAU,OAAO,QAAQ;AAAA,IACjD,KAAK,CAAC,QAAQ,SAAS,MAAM;AAAA,EAC/B;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAA6C,WAA4C;AAChH,QAAM,OAA8B,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC;AAC/E,QAAM,kBAAkB,oBAAI,IAAY;AACxC,aAAW,SAAS,MAAM;AACxB,QAAI,OAAO,UAAU,UAAU;AAC7B,sBAAgB,IAAI,KAAK;AAAA,IAC3B;AAAA,EACF;AACA,aAAW,QAAQ,WAAW;AAC5B,QAAI,CAAC,gBAAgB,IAAI,IAAI,GAAG;AAC9B,WAAK,KAAK,IAAI;AACd,sBAAgB,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;;;ACpIO,SAAS,4BACd,KACA,YACA,aACuB;AACvB,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,QAAM,UAAU,mBAAmB,KAAK,YAAY,WAAW;AAC/D,QAAM,WAAkC,CAAC;AACzC,aAAW,WAAW,SAAS;AAC7B,QAAI,QAAQ,SAAS,QAAQ;AAC3B,eAAS,KAAK,GAAG,8BAA8B,SAAS,WAAW,CAAC;AAAA,IACtE,OAAO;AACL,eAAS,KAAK,OAAO;AAAA,IACvB;AAAA,EACF;AACA,SAAO,0BAA0B,UAAU,WAAW;AACxD;AAEA,SAAS,mBAAmB,QAAgB,YAAgC,aAAuE;AACjJ,QAAM,WAAkC,CAAC;AACzC,QAAM,cAAc,OAAO,YAAY;AACvC,QAAM,aAAa;AACnB,MAAI,SAAS;AACb,MAAI,QAAgC,WAAW,KAAK,MAAM;AAC1D,QAAM,eAAe,OAAO,eAAe,YAAY,OAAO,SAAS,UAAU;AAEjF,SAAO,UAAU,MAAM;AACrB,UAAM,QAAQ,MAAM;AACpB,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,gBAAgB,UAAU,SAAS,IAAI,KAAK,cAAc,OAAO;AACvE,QAAI,MAAM,WAAW;AAErB,QAAI,CAAC,iBAAiB,CAAC,qBAAqB,OAAO,GAAG;AACpD,YAAM,eAAe,mBAAmB,aAAa,QAAQ,YAAY,GAAG,GAAG;AAC/E,UAAI,iBAAiB,IAAI;AAGvB,mBAAW,YAAY,QAAQ;AAC/B,gBAAQ,WAAW,KAAK,MAAM;AAC9B;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAEA,QAAI,QAAQ,QAAQ;AAClB,YAAM,eAAe,eAAgB,aAAwB,SAAS;AACtE,YAAM,aAAa,eAAgB,aAAwB,QAAQ;AACnE,sBAAgB,UAAU,OAAO,MAAM,QAAQ,KAAK,GAAG,cAAc,YAAY,WAAW;AAAA,IAC9F;AAEA,UAAM,aAAa,OAAO,MAAM,OAAO,GAAG;AAC1C,UAAM,OAAoC,qBAAqB,OAAO,IAAI,QAAQ;AAClF,UAAM,UAA+B;AAAA,MACnC;AAAA,MACA,OAAO;AAAA,MACP,OAAO,mBAAmB,YAAY,OAAO,GAAG;AAAA,IAClD;AACA,QAAI,SAAS,QAAQ;AACnB,cAAQ,YAAY,qBAAqB,UAAU;AAAA,IACrD,OAAO;AACL,cAAQ,SAAS;AAAA,IACnB;AACA,aAAS,KAAK,OAAO;AACrB,aAAS;AACT,eAAW,YAAY;AACvB,YAAQ,WAAW,KAAK,MAAM;AAAA,EAChC;AAEA,MAAI,SAAS,OAAO,QAAQ;AAC1B,UAAM,eAAe,eAAgB,aAAwB,SAAS;AACtE,UAAM,aAAa,eAAgB,aAAwB,OAAO,SAAS;AAC3E,oBAAgB,UAAU,OAAO,MAAM,MAAM,GAAG,cAAc,YAAY,WAAW;AAAA,EACvF;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,SAA8B,aAAuE;AAC1I,MAAI,QAAQ,SAAS,UAAU,CAAC,QAAQ,OAAO;AAC7C,WAAO,CAAC,OAAO;AAAA,EACjB;AACA,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,oBAAoB,KAAK,GAAG;AAC9B,WAAO,CAAC,OAAO;AAAA,EACjB;AACA,QAAM,WAAW,QAAQ,SAAS,OAAO,QAAQ,MAAM,SAAS,YAAY,OAAO,QAAQ,MAAM,OAAO;AACxG,QAAM,aAAa,WAAW,QAAQ,OAAO,OAAO;AACpD,QAAM,cAAc;AACpB,QAAM,UAAiC,CAAC;AACxC,MAAI,SAAS;AACb,MAAI,QAAgC,YAAY,KAAK,KAAK;AAE1D,SAAO,UAAU,MAAM;AACrB,UAAM,QAAQ,MAAM;AACpB,UAAM,MAAM,YAAY;AACxB,QAAI,QAAQ,QAAQ;AAClB,YAAM,YAAY,MAAM,MAAM,QAAQ,KAAK;AAC3C,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,mBAAmB,YAAY,QAAQ,KAAK;AAAA,QACnD,QAAQ,YAAY,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AACA,UAAM,kBAAkB,MAAM,CAAC;AAC/B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,mBAAmB,YAAY,OAAO,GAAG;AAAA,MAChD,QAAQ;AAAA,IACV,CAAC;AACD,aAAS;AACT,YAAQ,YAAY,KAAK,KAAK;AAAA,EAChC;AAEA,MAAI,SAAS,MAAM,QAAQ;AACzB,UAAM,YAAY,MAAM,MAAM,MAAM;AACpC,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,mBAAmB,YAAY,QAAQ,MAAM,MAAM;AAAA,MAC1D,QAAQ,YAAY,SAAS;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,SAAS,IAAI,UAAU,CAAC,OAAO;AAChD;AAEA,SAAS,oBAAoB,OAAwB;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,SAAS,IAAI,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,KAAK,KAAK,KAAK,iBAAiB,KAAK,KAAK,GAAG;AAClE,WAAO;AAAA,EACT;AACA,MAAI,sBAAsB,KAAK,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AACA,MAAI,YAAY,KAAK,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,KAAK,KAAK,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,UAAiC,aAAuE;AACzI,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAM,SAAgC,CAAC;AACvC,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,UAAU,QAAQ,MAAM,WAAW,GAAG;AACzD;AAAA,IACF;AACA,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,QAAI,QAAQ,SAAS,UAAU,QAAQ,KAAK,SAAS,UAAU,KAAK,SAAS,QAAQ,SAAS,KAAK,MAAM,OAAO,QAAQ,MAAM,MAAM;AAClI,WAAK,SAAS,QAAQ;AACtB,UAAI,KAAK,SAAS,QAAQ,OAAO;AAC/B,aAAK,MAAM,KAAK,QAAQ,MAAM;AAAA,MAChC;AACA,WAAK,SAAS,YAAY,KAAK,KAAK;AAAA,IACtC,OAAO;AACL,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBACP,QACA,OACA,MACA,IACA,aACM;AACN,MAAI,MAAM,WAAW,EAAG;AACxB,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN;AAAA,IACA,OAAO,mBAAmB,MAAM,GAAG,MAAM,QAAQ,EAAE;AAAA,IACnD,QAAQ,YAAY,KAAK;AAAA,EAC3B,CAAC;AACH;AAEA,SAAS,mBAAmB,MAA0B,cAAsB,YAAoB,YAA+D;AAC7J,MAAI,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,IAAI,GAAG;AACtD,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO;AACpB,QAAM,KAAK,eAAe,SAAY,aAAa,OAAO;AAC1D,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,KAAK,MAAM;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,GAAG;AACpB;AAEA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,MAAM,MAAM,OAAO,QAAQ,SAAS,QAAQ,UAAU,SAAS,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAE9H,SAAS,cAAc,SAA0B;AAC/C,SAAO,eAAe,IAAI,QAAQ,YAAY,CAAC;AACjD;AAEO,SAAS,qBAAqB,SAA0B;AAC7D,QAAM,QAAQ,QAAQ,OAAO,CAAC;AAC9B,SAAO,MAAM,YAAY,MAAM,SAAS,MAAM,YAAY,MAAM;AAClE;AAEO,SAAS,mBAAmB,aAAqB,cAAsB,YAA4B;AACxG,MAAI,QAAQ;AACZ,MAAI,cAAc;AAClB,SAAO,cAAc,YAAY,QAAQ;AACvC,UAAM,WAAW,YAAY,QAAQ,IAAI,YAAY,IAAI,WAAW;AACpE,UAAM,YAAY,YAAY,QAAQ,KAAK,YAAY,IAAI,WAAW;AACtE,QAAI,cAAc,IAAI;AACpB,aAAO;AAAA,IACT;AACA,QAAI,aAAa,MAAM,WAAW,WAAW;AAC3C;AACA,oBAAc,WAAW;AACzB;AAAA,IACF;AACA,UAAM,WAAW,YAAY,QAAQ,KAAK,SAAS;AACnD,QAAI,aAAa,IAAI;AACnB,aAAO;AAAA,IACT;AACA;AACA,UAAM,cAAc,WAAW;AAC/B,QAAI,UAAU,GAAG;AACf,aAAO;AAAA,IACT;AACA,kBAAc;AAAA,EAChB;AACA,SAAO;AACT;;;ACzOA,IAAM,aAAa,CAAC,eAAuB;AACzC,MAAI,OAAO;AACX,SAAO;AAAA,IACL,OAAO,MAAc;AACnB,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,gBAAS,QAAQ,KAAK,OAAO,KAAK,WAAW,CAAC,IAAK;AAAA,MACrD;AACA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,WAAmB;AACxB,aAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE;AAAA,IACnC;AAAA,EACF;AACF;AAKO,SAAS,gBAAgB,SAAiB,MAAsB;AACrE,QAAM,OAAO,WAAW,QAAQ;AAChC,OAAK,OAAO,GAAG,IAAI,IAAI,OAAO,EAAE;AAChC,SAAO,KAAK,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACvC;AAKO,SAAS,cAAc,KAAsB;AAClD,QAAM,KAAK,OAAO,IAAI,KAAK,EAAE,YAAY;AACzC,SAAO,iBAAiB,CAAC,MAAM,KAAK;AACtC;AAKO,SAAS,YAAY,QAAiB,QAAmD;AAE9F,MAAI,OAAO,QAAQ,KAAK,OAAO,QAAQ,OAAO,OAAQ,QAAO;AAG7D,WAAS,IAAI,GAAG,IAAI,OAAO,OAAO,KAAK;AACrC,QAAI,CAAC,OAAO,CAAC,EAAE,aAAa;AAC1B,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAAA,EACF;AAGA,QAAM,OAAO,OAAO,MAAM,GAAG,OAAO,KAAK,EAAE,OAAO,OAAO,IAAI;AAG7D,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,QAAI,CAAC,KAAK,CAAC,EAAE,YAAa,OAAM,IAAI,MAAM,wBAAwB;AAAA,EACpE;AAEA,SAAO;AACT;AAKO,SAAS,YAAY,OAAsB;AAChD,SAAO,GAAG,MAAM,EAAE,IAAI,MAAM,cAAc,IAAI,CAAC;AACjD;AAKO,SAAS,UAAU,SAAiB,SAA6F;AACtI,QAAM,mBAAmB,wBAAwB,OAAO;AAGxD,QAAM,mBAAmB;AACzB,MAAI,iBAAyC,iBAAiB,KAAK,OAAO;AAC1E,SAAO,mBAAmB,MAAM;AAC9B,UAAM,QAAQ,eAAe;AAC7B,UAAM,MAAM,QAAQ,eAAe,CAAC,EAAE;AACtC,QAAI,CAAC,eAAe,OAAO,KAAK,gBAAgB,GAAG;AACjD,aAAO;AAAA,IACT;AACA,qBAAiB,iBAAiB,KAAK,OAAO;AAAA,EAChD;AAGA,MAAI,6BAA6B,KAAK,OAAO,GAAG;AAC9C,WAAO;AAAA,EACT;AAGA,QAAM,oBAAoB;AAC1B,QAAM,kBAAkB,SAAS,mBAAmB,CAAC;AACrD,QAAM,aAAa,OAAO,SAAS,eAAe,WAAW,QAAQ,aAAa;AAClF,QAAM,iBAAiB,gBAAgB,SAAS,oBAAI,IAA4B,CAAC,eAAe,gBAAgB,eAAe,YAAY,CAAC,IAAI;AAEhJ,WAAS,QAAQ,kBAAkB,KAAK,OAAO,GAAG,UAAU,MAAM,QAAQ,kBAAkB,KAAK,OAAO,GAAG;AACzG,UAAM,QAAQ,MAAM;AACpB,UAAM,OAAO,QAAQ,IAAI,QAAQ,QAAQ,CAAC,IAAI;AAC9C,QAAI,SAAS,QAAQ,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AACjE;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,GAAG,KAAK;AAC1D,QAAI,eAAe,KAAK,OAAO,QAAQ,CAAC,GAAG;AACzC;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,EAAE,UAAU;AAC9C,QAAI,2BAA2B,KAAK,KAAK,GAAG;AAC1C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AACrG;AAAA,IACF;AACA,UAAM,YAAY;AAClB,UAAM,UAAU,YAAY,MAAM,CAAC,EAAE;AACrC,QAAI,eAAe,WAAW,SAAS,gBAAgB,GAAG;AACxD;AAAA,IACF;AACA,QAAI,gBAAgB;AAClB,YAAM,gBAAgB,aAAa;AACnC,YAAM,cAAc,gBAAgB,MAAM,CAAC,EAAE;AAC7C,YAAM,UAAU,gBAAgB,KAAK,CAAC,UAAU,eAAe,IAAI,MAAM,IAAI,KAAK,MAAM,QAAQ,iBAAiB,MAAM,MAAM,WAAW;AACxI,UAAI,SAAS;AACX;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,SAAsD;AACrF,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAM,SAA8C,CAAC;AACrD,QAAM,gBAAgB;AACtB,MAAI,YAAoC,cAAc,KAAK,OAAO;AAClE,SAAO,cAAc,MAAM;AACzB,WAAO,KAAK,EAAE,MAAM,UAAU,OAAO,IAAI,UAAU,QAAQ,UAAU,CAAC,EAAE,OAAO,CAAC;AAChF,gBAAY,cAAc,KAAK,OAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAe,KAAa,QAAsD;AACxG,SAAO,OAAO,KAAK,CAAC,UAAU,MAAM,QAAQ,SAAS,MAAM,MAAM,GAAG;AACtE;AAKO,SAAS,mBAAmB,MAA+D;AAChG,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,QAAM,OAAO,cAAc,MAAM,CAAC,CAAC;AAEnC,QAAM,OAAgC,CAAC;AACvC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,SAAS,GAAG,GAAG;AACtB,YAAM,CAAC,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC;AACtC,WAAK,GAAG,IAAI;AAAA,IACd,OAAO;AACL,WAAK,IAAI,IAAI;AAAA,IACf;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,KAAK;AACtB;AAMO,SAAS,wBAAwB,KAAqB;AAC3D,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,IAAI,QAAQ,SAAS,IAAI,EAAE,MAAM,IAAI;AACnD,QAAM,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,aAAa,EAAE,CAAC;AAEpE,SAAO,WAAW,SAAS,KAAK,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG;AACjE,eAAW,MAAM;AAAA,EACnB;AACA,SAAO,WAAW,SAAS,KAAK,WAAW,WAAW,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG;AACrF,eAAW,IAAI;AAAA,EACjB;AACA,SAAO,WAAW,KAAK,IAAI;AAC7B;AAKO,SAAS,SAAoD,MAAS,OAAiD;AAC5H,MAAI;AAEJ,SAAO,IAAI,SAAwB;AACjC,iBAAa,SAAS;AACtB,gBAAY,WAAW,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK;AAAA,EACnD;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACL,SAAQ,QAA6B,oBAAI,IAAI;AAAA;AAAA,EAE7C,KAAK,MAAoB;AACvB,SAAK,MAAM,IAAI,MAAM,YAAY,IAAI,CAAC;AAAA,EACxC;AAAA,EAEA,QAAQ,MAA6B;AACnC,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,QAAI,UAAU,OAAW,QAAO;AAChC,WAAO,YAAY,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;AAKO,SAAS,qBAAqB,OAAuB;AAC1D,SAAO,MACJ,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,8BAA8B,EAAE,EACxC,KAAK;AACV;AAEO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,SAAmB,CAAC;AAC5B,SAAQ,SAAS;AAAA;AAAA,EAEjB,OAAO,KAAmB;AACxB,SAAK,OAAO,KAAK,GAAG;AACpB,SAAK,UAAU,IAAI;AAAA,EACrB;AAAA,EAEA,WAAmB;AACjB,UAAM,SAAS,KAAK,OAAO,KAAK,EAAE;AAClC,SAAK,SAAS,CAAC,MAAM;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,CAAC;AACf,SAAK,SAAS;AAAA,EAChB;AACF;;;AL/OO,SAAS,WAAW,OAAqB;AAC9C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,MAAM;AAAA,MACT,QAAQ,MAAM,QAAQ,SAAS,iBAAiB,MAAM,QAAQ,MAAM,IAAI;AAAA,MACxE,iBAAiB,MAAM,QAAQ;AAAA,MAC/B,eAAe,MAAM,QAAQ;AAAA,MAC7B,gBAAgB,MAAM,QAAQ,iBAAiB,EAAE,GAAG,MAAM,QAAQ,eAAe,IAAI;AAAA,MACrF,mBAAmB,MAAM,QAAQ,oBAC7B;AAAA,QACE,GAAG,MAAM,QAAQ;AAAA,QACjB,cAAc,MAAM,QAAQ,MAAM,QAAQ,kBAAkB,YAAY,IAAI,CAAC,GAAG,MAAM,QAAQ,kBAAkB,YAAY,IAAI;AAAA,MAClI,IACA,MAAM,QAAQ,sBAAsB,OAClC,OACA;AAAA,MACN,MAAM,MAAM,QAAQ,OAAO,0BAA0B,MAAM,QAAQ,IAAI,IAAI;AAAA,MAC3E,OAAO,MAAM,QAAQ,QAAQ,EAAE,GAAG,MAAM,QAAQ,MAAM,IAAI;AAAA,IAC5D;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,GAAU,GAAmB;AACnE,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,MAAI,EAAE,gBAAgB,EAAE,YAAa,QAAO;AAC5C,MAAI,EAAE,QAAQ,QAAQ,EAAE,QAAQ,IAAK,QAAO;AAC5C,QAAM,QAAQ,EAAE,QAAQ,QAAQ;AAChC,QAAM,QAAQ,EAAE,QAAQ,QAAQ;AAChC,MAAI,CAAC,UAAU,OAAO,KAAK,EAAG,QAAO;AACrC,SAAO;AACT;AAEO,SAAS,oBAAoB,OAA4B;AAC9D,QAAM,OAAqB;AAAA,IACzB,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,OAAO;AAAA,MACL,OAAO,WAAW,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,MAAM,QAAQ,OAAO,0BAA0B,MAAM,QAAQ,IAAI,IAAI;AAAA,IAC3E,OAAO,MAAM,QAAQ,QAAQ,EAAE,GAAG,MAAM,QAAQ,MAAM,IAAI;AAAA,IAC1D,UAAU,CAAC;AAAA,EACb;AAEA,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,wBAAwB,OAAO,IAAI;AAAA,IAC5C,KAAK;AACH,aAAO,yBAAyB,OAAO,IAAI;AAAA,IAC7C,KAAK;AACH,aAAO,mBAAmB,OAAO,IAAI;AAAA,IACvC,KAAK;AACH,aAAO,oBAAoB,OAAO,IAAI;AAAA,IACxC,KAAK;AACH,aAAO,mBAAmB,OAAO,IAAI;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,mBAAmB,IAAI,aAAa;AAE1C,SAAS,mBAAmB,OAAc,UAAsC;AAC9E,QAAM,MAAM,MAAM,QAAQ,OAAO;AACjC,QAAM,aAAa,MAAM,QAAQ,OAAO,QAAQ;AAChD,QAAM,WAAW,gBAAAC,OAAS,MAAM,GAAG;AACnC,QAAM,WAAW,aAAa,SAAS,OAAO;AAC9C,MAAI,CAAC,UAAU;AACb,WAAO,qBAAqB,OAAO,QAAQ;AAAA,EAC7C;AAEA,QAAM,UAAU,SAAS,KAAK,SAAS,iBAAiB,QAAS,MAAM,QAAQ,MAA4C,OAAO;AAClI,WAAS,QAAQ,EAAE,GAAI,SAAS,SAAS,CAAC,GAAI,SAAS,OAAO,OAAU;AACxE,WAAS,WAAW,uBAAuB,OAAO,UAAU,SAAS,MAAM,IAAI,YAAY,GAAG;AAC9F,SAAO;AACT;AAEA,SAAS,aAAa,MAA0C;AAC9D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,KAAK,KAAK;AACvB,MAAI,SAAS,gBAAgB,SAAS,eAAe;AACnD,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,OAAO;AAC3B,MAAI,OAAO,WAAW,GAAG;AACvB,OAAG;AACD,YAAM,YAAY,OAAO,KAAK;AAC9B,UAAI,cAAc,gBAAgB,cAAc,eAAe;AAC7D,eAAO,OAAO;AAAA,MAChB;AAAA,IACF,SAAS,OAAO,YAAY;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAc,UAAe,SAAkB,UAAkB,YAAoB,KAA6B;AAChJ,QAAM,QAAwB,CAAC;AAC/B,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,QAAQ;AACZ,MAAI,OAAO,WAAW,GAAG;AACvB,OAAG;AACD,UAAI,OAAO,KAAK,SAAS,YAAY;AACnC,cAAM,SAAS,GAAG,QAAQ,UAAU,KAAK;AACzC,cAAM,KAAK,sBAAsB,OAAO,OAAO,MAAM,SAAS,OAAO,QAAQ,YAAY,GAAG,CAAC;AAC7F;AAAA,MACF;AAAA,IACF,SAAS,OAAO,YAAY;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,sBACP,OACA,cACA,SACA,OACA,IACA,YACA,KACc;AACd,QAAM,iBAAiC,CAAC;AACxC,QAAM,mBAAmC,CAAC;AAC1C,MAAI,cAA4B,CAAC;AACjC,MAAI,YAAY;AAChB,MAAI,mBAAmB;AACvB,MAAI,iBAAiB;AACrB,MAAI,eAAe;AACnB,MAAI,kBAAkB;AACtB,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,MAAI,SAAS;AACb,MAAI;AAEJ,QAAM,SAAS,aAAa,OAAO;AACnC,MAAI,OAAO,WAAW,GAAG;AACvB,OAAG;AACD,YAAM,OAAO,OAAO,KAAK;AACzB,UAAI,SAAS,YAAY;AACvB;AAAA,MACF;AACA,UAAI,SAAS,aAAa;AACxB,cAAM,eAAe,IAAI,MAAM,OAAO,MAAM,OAAO,EAAE;AACrD,cAAM,gBAAgB,yBAAyB,YAAY;AAC3D,cAAM,eAAe,cAAc;AACnC,YAAI,CAAC,kBAAkB;AACrB,wBAAc;AACd,sBAAY,uBAAuB,YAAY;AAC/C,cAAI,cAAc,SAAS,SAAS,GAAG;AACrC,0BAAc,SAAS,QAAQ,CAAC,SAAS,iBAAiB;AACxD,+BAAiB,KAAK,sBAAsB,IAAI,SAAS,cAAc,WAAW,CAAC;AAAA,YACrF,CAAC;AAAA,UACH;AACA,cAAI,cAAc,MAAM;AACtB,qBAAS;AACT,0BAAc,cAAc,KAAK;AAAA,UACnC;AACA,6BAAmB;AAAA,QACrB,OAAO;AACL,gBAAM,SAAS,GAAG,EAAE,eAAe,gBAAgB;AACnD,gBAAM,iBAAiB,cAAc;AACrC,yBAAe,KAAK;AAAA,YAClB,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,OAAO;AAAA,cACL,QAAQ,iBAAiB,YAAY;AAAA,cACrC,MAAM,uBAAuB,YAAY;AAAA,YAC3C;AAAA,YACA,OAAO,YAAY,aAAa,OAAO,MAAM,aAAa,OAAO,EAAE;AAAA,YACnE,UAAU,eAAe,IAAI,CAAC,SAAS,iBAAiB,sBAAsB,QAAQ,SAAS,cAAc,WAAW,CAAC;AAAA,UAC3H,CAAC;AAAA,QACH;AAAA,MACF,WAAW,SAAS,gBAAgB,SAAS,eAAe;AAC1D,cAAM,WAAW,GAAG,EAAE,UAAU,cAAc;AAC9C,cAAM,gBAAgB,SAAS;AAC/B,uBAAe,KAAK,sBAAsB,OAAO,OAAO,MAAM,eAAe,UAAU,YAAY,GAAG,CAAC;AAAA,MACzG,WAAW,SAAS,cAAc;AAChC,cAAM,UAAU,GAAG,EAAE,gBAAgB,iBAAiB;AACtD,uBAAe,KAAK,wBAAwB,OAAO,OAAO,MAAM,SAAS,YAAY,GAAG,CAAC;AAAA,MAC3F,WAAW,SAAS,gBAAgB,SAAS,gBAAgB;AAC3D,cAAM,SAAS,GAAG,EAAE,UAAU,WAAW;AACzC,cAAM,WAAW,SAAS;AAC1B,cAAM,WAAW,uBAAuB,OAAO,OAAO,MAAM,QAAQ,YAAY,KAAK,QAAQ;AAC7F,YAAI,UAAU;AACZ,yBAAe,KAAK,QAAQ;AAAA,QAC9B;AAAA,MACF,WAAW,SAAS,aAAa;AAC/B,cAAM,SAAS,GAAG,EAAE,UAAU,WAAW;AACzC,uBAAe,KAAK,kBAAkB,OAAO,OAAO,MAAM,QAAQ,YAAY,GAAG,CAAC;AAAA,MACpF,WAAW,SAAS,gBAAgB,SAAS,iBAAiB;AAC5D,cAAM,YAAY,GAAG,EAAE,aAAa,cAAc;AAClD,uBAAe,KAAK,qBAAqB,OAAO,OAAO,MAAM,WAAW,YAAY,GAAG,CAAC;AAAA,MAC1F;AAAA,IACF,SAAS,OAAO,YAAY;AAAA,EAC9B;AAEA,QAAM,eAA6B;AAAA,IACjC;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,iBAAiB,WAAW;AAAA,MACpC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,SAAS,QAAQ,WAAW,IAAI;AAAA,IAC3C;AAAA,IACA,OAAO,YAAY,aAAa,aAAa,MAAM,aAAa,aAAa,EAAE;AAAA,IAC/E,UAAU,CAAC,GAAG,kBAAkB,GAAG,cAAc;AAAA,EACnD;AAEA,SAAO;AACT;AAQA,SAAS,yBAAyB,KAAoC;AACpE,QAAM,aAAa,uBAAuB,GAAG;AAC7C,QAAM,EAAE,SAAS,KAAK,IAAI,gBAAgB,UAAU;AACpD,QAAM,SAAS,iBAAiB,MAAM,OAAO;AAC7C,QAAM,WAAW,4BAA4B,SAAS,QAAW,CAAC,UAAU,iBAAiB,MAAM,KAAK,CAAC;AACzG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAiE;AACxF,QAAM,YAAY,MAAM,MAAM,yBAAyB;AACvD,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,QAAM,SAAS,UAAU,CAAC;AAC1B,QAAM,UAAU,OAAO,YAAY,MAAM;AACzC,QAAM,YAAY,MAAM,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE;AACrE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,EAAE,QAAQ;AAAA,EAClB;AACF;AAEA,SAAS,wBAAwB,OAAc,WAAgB,IAAY,YAAoB,KAA2B;AACxH,QAAM,WAAW,IAAI,MAAM,UAAU,MAAM,UAAU,EAAE;AACvD,QAAM,aAAa,wBAAwB,QAAQ;AACnD,QAAM,SAAS,iBAAiB,MAAM,UAAU;AAChD,QAAM,WAAW,4BAA4B,YAAY,QAAW,CAAC,UAAU,iBAAiB,MAAM,KAAK,CAAC;AAE5G,QAAM,aAAoB;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ,iBAAiB,MAAM;AAAA,MAC/B,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,IACpD;AAAA,QACE,eAAe;AAAA,MACjB,IACA;AAAA,MACJ,OAAO,YAAY,aAAa,UAAU,MAAM,aAAa,UAAU,EAAE;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO,oBAAoB,UAAU;AACvC;AAEA,SAAS,uBAAuB,OAAc,UAAe,IAAY,YAAoB,KAAa,WAAyC;AACjJ,QAAM,UAAU,IAAI,MAAM,SAAS,MAAM,SAAS,EAAE;AACpD,QAAM,aAAa,qBAAqB,OAAO;AAC/C,QAAM,EAAE,MAAM,MAAM,YAAY,SAAS,IAAI,eAAe,UAAU;AACtE,QAAM,OAAO,WAAW,OAAOC,oBAAmB,UAAU;AAC5D,QAAM,EAAE,MAAM,KAAK,IAAI,mBAAmB,UAAU;AACpD,QAAM,YAAmB;AAAA,IACvB;AAAA,IACA,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM,EAAE,GAAG,MAAM,MAAM,QAAQ,QAAQ,MAAM,KAAK;AAAA,MAClD,OAAO,YAAY,aAAa,SAAS,MAAM,aAAa,SAAS,EAAE;AAAA,IACzE;AAAA,EACF;AACA,SAAO,oBAAoB,SAAS;AACtC;AAEA,SAAS,kBAAkB,OAAc,UAAe,IAAY,YAAoB,KAA2B;AACjH,QAAM,UAAU,qBAAqB,IAAI,MAAM,SAAS,MAAM,SAAS,EAAE,CAAC;AAC1E,QAAM,YAAmB;AAAA,IACvB;AAAA,IACA,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,KAAK;AAAA,MACL,eAAe;AAAA,MACf,MAAM;AAAA,MACN,OAAO,YAAY,aAAa,SAAS,MAAM,aAAa,SAAS,EAAE;AAAA,IACzE;AAAA,EACF;AACA,SAAO,oBAAoB,SAAS;AACtC;AAEA,SAAS,qBAAqB,OAAc,aAAkB,IAAY,YAAoB,KAA2B;AACvH,QAAM,aAAa,qBAAqB,IAAI,MAAM,YAAY,MAAM,YAAY,EAAE,CAAC;AACnF,QAAM,SAAS,iBAAiB,MAAMC,sBAAqB,UAAU,CAAC;AACtE,QAAM,eAAsB;AAAA,IAC1B;AAAA,IACA,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ,iBAAiB,MAAM;AAAA,MAC/B,OAAO,YAAY,aAAa,YAAY,MAAM,aAAa,YAAY,EAAE;AAAA,IAC/E;AAAA,EACF;AACA,SAAO,oBAAoB,YAAY;AACzC;AAEA,SAAS,sBAAsB,OAAc,UAAe,SAAkB,IAAY,YAAoB,KAA2B;AACvI,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,IACF;AAAA,IACA,OAAO,YAAY,aAAa,SAAS,MAAM,aAAa,SAAS,EAAE;AAAA,IACvE,UAAU,uBAAuB,OAAO,UAAU,SAAS,IAAI,YAAY,GAAG;AAAA,EAChF;AACF;AAEA,SAAS,wBAAwB,OAAc,UAAsC;AACnF,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,WAAW,MAAM,QAAQ,MAAM,aAAa,IAAK,MAAM,iBAAiB,CAAC,IAAK,CAAC;AACrF,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO;AAAA,EACT;AAEA,WAAS,WAAW,SAAS,IAAI,CAAC,SAAS,UAAU,sBAAsB,MAAM,IAAI,SAAS,OAAO,WAAW,CAAC;AACjH,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAc,UAAsC;AACpF,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,WAAW,MAAM,QAAQ,MAAM,aAAa,IAAK,MAAM,iBAAiB,CAAC,IAAK,CAAC;AACrF,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO;AAAA,EACT;AAEA,WAAS,WAAW,SAAS,IAAI,CAAC,SAAS,UAAU,sBAAsB,MAAM,IAAI,SAAS,OAAO,YAAY,CAAC;AAClH,SAAO;AACT;AAEA,SAAS,sBACP,UACA,SACA,OACA,YACc;AACd,QAAM,KAAK,GAAG,QAAQ,KAAK,UAAU,YAAY,KAAK;AACtD,QAAM,QAAQ,QAAQ,QAAQ,EAAE,GAAG,QAAQ,MAAM,IAAI;AACrD,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,MAAM,GAAG,UAAU;AAAA,QACnB,OAAO;AAAA,UACL,MAAM,QAAQ,aAAa,QAAQ;AAAA,UACnC,KAAK,QAAQ;AAAA,QACf;AAAA,QACA,MAAM,QAAQ,YAAY,EAAE,WAAW,KAAK,IAAI;AAAA,QAChD;AAAA,QACA,UAAU,CAAC;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,MAAM,GAAG,UAAU;AAAA,QACnB,OAAO;AAAA,UACL,KAAK,QAAQ;AAAA,UACb,QAAQ,QAAQ,UAAU;AAAA,UAC1B,OAAO,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACE,aAAO;AAAA,QACL;AAAA,QACA,MAAM,GAAG,UAAU;AAAA,QACnB,OAAO;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,QAAQ,QAAQ,SAAS,iBAAiB,QAAQ,MAAM,IAAI;AAAA,QAC9D;AAAA,QACA;AAAA,QACA,UAAU,CAAC;AAAA,MACb;AAAA,EACJ;AACF;AAEA,SAAS,qBAAqB,OAAc,UAAsC;AAChF,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,UAAU,QAAQ,MAAM,OAAO;AACrC,QAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAK,MAAM,QAA2B,CAAC;AAC9E,WAAS,QAAQ,EAAE,GAAI,SAAS,SAAS,CAAC,GAAI,SAAS,OAAO,OAAU;AACxE,WAAS,WAAW,MAAM,IAAI,CAAC,aAAa,WAAW;AAAA,IACrD,IAAI,GAAG,MAAM,EAAE,UAAU,KAAK;AAAA,IAC9B,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,iBAAiB,WAAW;AAAA,MACpC,MAAM,uBAAuB,WAAW;AAAA,IAC1C;AAAA,IACA,UAAU,CAAC;AAAA,EACb,EAAE;AACF,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,MAAI,YAAY,OAAO;AACvB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,UAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,SAAS;AACzC,gBAAY,KAAK,IAAI,WAAW,MAAM;AAAA,EACxC;AACA,MAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,MACJ,IAAI,CAAC,SAAU,KAAK,UAAU,YAAY,KAAK,MAAM,SAAS,IAAI,IAAK,EACvE,KAAK,IAAI,EACT,KAAK;AACV;AAEA,SAAS,qBAAqB,OAAuB;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,MAAI,YAAY,OAAO;AACvB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,UAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,SAAS;AACzC,gBAAY,KAAK,IAAI,WAAW,MAAM;AAAA,EACxC;AACA,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,cAAc,GAAG;AAClD,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,SAAO,MACJ,IAAI,CAAC,SAAU,KAAK,UAAU,YAAY,KAAK,MAAM,SAAS,IAAI,EAAG,EACrE,KAAK,IAAI,EACT,KAAK;AACV;AAWA,SAASC,oBAAmB,OAAuB;AACjD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,MAAI,YAAY,OAAO;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,KAAK,EAAE,WAAW,EAAG;AAC9B,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,UAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,SAAS;AACzC,gBAAY,KAAK,IAAI,WAAW,MAAM;AAAA,EACxC;AACA,MAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAC/B,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,SAAO,MACJ,IAAI,CAAC,SAAU,KAAK,UAAU,YAAY,KAAK,MAAM,SAAS,IAAI,EAAG,EACrE,KAAK,IAAI,EACT,QAAQ;AACb;AAEA,SAASC,sBAAqB,OAAuB;AACnD,SAAO,MACJ,QAAQ,cAAc,EAAE,EACxB,QAAQ,8BAA8B,EAAE,EACxC,KAAK;AACV;AAEA,SAAS,YAAY,MAAc,IAAsD;AACvF,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,KAAK,MAAM;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,GAAG;AACpB;AAEA,SAAS,oBAAoB,OAAc,UAAsC;AAC/E,QAAM,OAAO,MAAM,QAAQ;AAO3B,QAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,IAAK,MAAM,SAA4B,CAAC;AACjF,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,IAAK,MAAM,OAA4B,CAAC;AAC7E,QAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAK,MAAM,SAAS,CAAC,IAAK,CAAC;AAElE,QAAM,WAA2B,CAAC;AAElC,MAAI,OAAO,SAAS,GAAG;AACrB,aAAS,KAAK;AAAA,MACZ,IAAI,GAAG,MAAM,EAAE;AAAA,MACf,MAAM;AAAA,MACN,OAAO,EAAE,SAAS,OAAO,OAAO;AAAA,MAChC,UAAU,OAAO,IAAI,CAAC,YAAY,eAAe;AAAA,QAC/C,IAAI,GAAG,MAAM,EAAE,QAAQ,SAAS;AAAA,QAChC,MAAM;AAAA,QACN,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO,MAAM,SAAS,KAAK;AAAA,UAC3B,QAAQ,iBAAiB,UAAU;AAAA,UACnC,MAAM,uBAAuB,UAAU;AAAA,QACzC;AAAA,QACA,UAAU,CAAC;AAAA,MACb,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,KAAK,IAAI,CAAC,UAAU,cAAc;AAAA,IACrD,IAAI,GAAG,MAAM,EAAE,SAAS,QAAQ;AAAA,IAChC,MAAM;AAAA,IACN,OAAO,EAAE,OAAO,SAAS;AAAA,IACzB,UAAU,SAAS,IAAI,CAAC,YAAY,eAAe;AAAA,MACjD,IAAI,GAAG,MAAM,EAAE,QAAQ,QAAQ,IAAI,SAAS;AAAA,MAC5C,MAAM;AAAA,MACN,OAAO;AAAA,QACL;AAAA,QACA,OAAO;AAAA,QACP,OAAO,MAAM,SAAS,KAAK;AAAA,QAC3B,QAAQ,iBAAiB,UAAU;AAAA,QACnC,MAAM,uBAAuB,UAAU;AAAA,MACzC;AAAA,MACA,UAAU,CAAC;AAAA,IACb,EAAE;AAAA,EACJ,EAAE;AAEF,WAAS,KAAK;AAAA,IACZ,IAAI,GAAG,MAAM,EAAE;AAAA,IACf,MAAM;AAAA,IACN,OAAO,EAAE,MAAM,KAAK,OAAO;AAAA,IAC3B,UAAU;AAAA,EACZ,CAAC;AAED,WAAS,WAAW;AACpB,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAc,UAAsC;AAC9E,QAAM,SAAS,OAAO,MAAM,QAAQ,MAAM,SAAS,WAAY,MAAM,QAAQ,MAAM,OAAmB,MAAM,QAAQ,OAAO;AAC3H,QAAM,QAAQ,iBAAiB,MAAM;AACrC,QAAM,kBAAkB,MAAM,QAAQ,mBAAmB;AACzD,QAAM,mBAAmB,wBAAwB,iBAAiB,MAAM,MAAM;AAC9E,QAAM,EAAE,UAAU,UAAU,IAAI,6BAA6B,eAAe;AAC5E,QAAM,OAAO,OAAO,MAAM,QAAQ,MAAM,SAAS,WAAW,OAAO,MAAM,QAAQ,MAAM,IAAI,IAAI;AAC/F,WAAS,QAAQ;AAAA,IACf,GAAI,SAAS,SAAS,CAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,WAAW,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,IAC9C,IAAI,GAAG,MAAM,EAAE,UAAU,KAAK;AAAA,IAC9B,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,MAAM,iBAAiB,KAAK,KAAK;AAAA,IACnC;AAAA,IACA,UAAU,CAAC;AAAA,EACb,EAAE;AACF,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAmC;AAC3D,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,QAAI,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD,aAAO,EAAE,GAAG,MAAM,UAAU,iBAAiB,KAAK,QAAQ,EAAE;AAAA,IAC9D;AACA,WAAO,EAAE,GAAG,KAAK;AAAA,EACnB,CAAC;AACH;AAEO,SAAS,uBAAuB,OAA6B;AAClE,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,kBAAU,KAAK;AACf;AAAA,MACF,KAAK;AACH,kBAAU,KAAK;AACf;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,YAAI,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD,oBAAU,uBAAuB,KAAK,QAAQ;AAAA,QAChD,WAAW,UAAU,QAAQ,OAAO,KAAK,SAAS,UAAU;AAC1D,oBAAU,KAAK;AAAA,QACjB;AACA;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,KAAK,KAAK;AACzB;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,GAAY,GAAqB;AAClD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,MAAI,MAAM,QAAQ,MAAM,KAAM,QAAO,MAAM;AAC3C,MAAI,OAAO,MAAM,SAAU,QAAO;AAElC,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,QAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAY,EAAgB,OAAQ,QAAO;AACtE,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,UAAI,CAAC,UAAU,EAAE,CAAC,GAAI,EAAgB,CAAC,CAAC,EAAG,QAAO;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,KAAK,CAA4B;AACtD,QAAM,QAAQ,OAAO,KAAK,CAA4B;AACtD,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,aAAW,OAAO,OAAO;AACvB,QAAI,CAAC,UAAW,EAA8B,GAAG,GAAI,EAA8B,GAAG,CAAC,EAAG,QAAO;AAAA,EACnG;AACA,SAAO;AACT;AAIA,SAAS,0BAA6B,OAAa;AACjD,QAAM,cAAe,WAAuD;AAC5E,MAAI,OAAO,gBAAgB,YAAY;AACrC,QAAI;AACF,aAAO,YAAY,KAAK;AAAA,IAC1B,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAuBO,SAAS,sBAAsB,gBAAyB,CAAC,GAAqB;AACnF,QAAM,QAAQ,oBAAI,IAA0B;AAC5C,QAAM,OAAqB;AAAA,IACzB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU,CAAC;AAAA,IACX,OAAO,CAAC;AAAA,EACV;AACA,QAAM,IAAI,KAAK,IAAI,IAAI;AAEvB,QAAM,WAA6B;AAAA,IACjC;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,QAAQ,CAAC;AAAA,EACX;AAEA,aAAW,SAAS,eAAe;AACjC,UAAM,gBAAgB,oBAAoB,WAAW,KAAK,CAAC;AAC3D,qBAAiB,UAAU,MAAM,KAAK,SAAS,QAAQ,aAAa;AAAA,EACtE;AAEA,WAAS,SAAS,YAAY,QAAQ;AACtC,SAAO;AACT;AAEO,SAAS,gBAAgB,UAA4B,SAA2B;AACrF,MAAI,CAAC,YAAY,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG;AAChE,WAAO,UAAU,UAAU,CAAC;AAAA,EAC9B;AAEA,aAAW,SAAS,SAAS;AAC3B,YAAQ,MAAM,IAAI;AAAA,MAChB,KAAK,eAAe;AAClB,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,OAAQ;AACb,yBAAiB,UAAU,QAAQ,MAAM,OAAO,MAAM,IAAI;AAC1D;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,OAAQ;AACb,YAAI,MAAM,QAAQ,KAAK,MAAM,SAAS,OAAO,SAAS,OAAQ;AAC9D,cAAM,UAAU,OAAO,SAAS,OAAO,MAAM,OAAO,CAAC,EAAE,CAAC;AACxD,YAAI,SAAS;AACX,wBAAc,UAAU,OAAO;AAAA,QACjC;AACA;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,OAAQ;AACb,YAAI,MAAM,QAAQ,KAAK,MAAM,SAAS,OAAO,SAAS,OAAQ;AAC9D,cAAM,WAAW,OAAO,SAAS,MAAM,KAAK;AAC5C,YAAI,UAAU;AACZ,wBAAc,UAAU,QAAQ;AAAA,QAClC;AACA,yBAAiB,UAAU,QAAQ,MAAM,OAAO,MAAM,IAAI;AAC1D;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,OAAQ;AACb,yBAAiB,QAAQ,MAAM,KAAK;AACpC;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IAAK,MAAM,UAAmC,CAAC;AAC1F,mBAAW,SAAS,SAAS;AAC3B,cAAI,CAAC,OAAO,GAAI;AAChB,gBAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,cAAI,CAAC,OAAQ;AACb,2BAAiB,QAAQ,MAAM,KAAK;AAAA,QACtC;AACA;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,QAAQ,MAAO;AACpB,eAAO,QAAQ,WAAW,OAAO,KAAK;AACtC,eAAO,MAAM,cAAc;AAC3B;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,UAAU,OAAO,SAAS,WAAW,EAAG;AAC7C,cAAM,SAAS,OAAO,SAAS;AAC/B,cAAM,OAAO,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC;AAC5C,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,OAAO,SAAS,IAAI,CAAC;AAC9D,YAAI,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM;AAClC,YAAI,KAAK,MAAM;AACb,eAAK,KAAK,IAAI,GAAG,KAAK,KAAK;AAAA,QAC7B;AACA,cAAM,QAAQ,OAAO,SAAS,OAAO,MAAM,KAAK;AAChD,eAAO,SAAS,OAAO,IAAI,GAAG,GAAG,KAAK;AACtC;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,OAAQ;AACb,8BAAsB,UAAU,QAAQ,MAAM,YAAY,MAAM,SAAS,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC;AAClG;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,SAAS,kBAAkB,UAAU,MAAM,EAAE;AACnD,YAAI,CAAC,OAAQ;AACb,cAAM,QAAiC;AAAA,UACrC,MAAM,MAAM;AAAA,UACZ,QAAQ,MAAM;AAAA,UACd,MAAM,MAAM;AAAA,QACd;AACA,YAAI,MAAM,OAAO;AACf,gBAAM,QAAQ,MAAM;AAAA,QACtB;AACA,yBAAiB,QAAQ,KAAK;AAC9B;AAAA,MACF;AAAA,MACA;AACE;AAAA,IACJ;AAAA,EACF;AAEA,WAAS,SAAS,YAAY,QAAQ;AACtC,SAAO,SAAS;AAClB;AAEA,SAAS,YAAY,UAAqC;AACxD,QAAM,OAAO,SAAS,MAAM,IAAI,SAAS,MAAM;AAC/C,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAkB,CAAC;AACzB,aAAW,WAAW,KAAK,UAAU;AACnC,UAAM,QAAQ,SAAS,MAAM,IAAI,OAAO;AACxC,QAAI,OAAO,OAAO;AAChB,aAAO,KAAK,WAAW,MAAM,KAAK,CAAC;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAA4B,QAAsB,OAAe,cAAiD;AAC1I,MAAI,CAAC,OAAQ,QAAO;AACpB,gBAAc,UAAU,aAAa,EAAE;AACvC,QAAM,OAAO,sBAAsB,UAAU,cAAc,OAAO,EAAE;AACpE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,MAAM,OAAO,GAAG,OAAO,SAAS,MAAM;AACtD,SAAO,SAAS,OAAO,SAAS,GAAG,KAAK,EAAE;AAC1C,SAAO;AACT;AAEA,SAAS,sBAAsB,UAA4B,cAA4B,UAA8C;AACnI,MAAI,CAAC,gBAAgB,CAAC,aAAa,IAAI;AACrC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,EAAE,GAAI,aAAa,SAAS,CAAC,EAAG;AAC9C,MAAI;AACJ,MAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UAAU;AAClD,YAAQ,WAAW,MAAM,KAAc;AACvC,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,OAAqB;AAAA,IACzB,IAAI,aAAa;AAAA,IACjB,MAAM,aAAa;AAAA,IACnB;AAAA,IACA,UAAU,CAAC;AAAA,IACX;AAAA,IACA;AAAA,EACF;AAEA,WAAS,MAAM,IAAI,KAAK,IAAI,IAAI;AAEhC,QAAM,iBAAiB,MAAM,QAAQ,aAAa,QAAQ,IAAI,aAAa,WAAW,CAAC;AACvF,aAAW,SAAS,gBAAgB;AAClC,UAAM,QAAQ,sBAAsB,UAAU,OAAO,KAAK,EAAE;AAC5D,QAAI,OAAO;AACT,WAAK,SAAS,KAAK,MAAM,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,UAA4B,QAAgB;AACjE,QAAM,OAAO,SAAS,MAAM,IAAI,MAAM;AACtC,MAAI,CAAC,KAAM;AACX,aAAW,WAAW,CAAC,GAAG,KAAK,QAAQ,GAAG;AACxC,kBAAc,UAAU,OAAO;AAAA,EACjC;AACA,WAAS,MAAM,OAAO,KAAK,EAAE;AAC7B,MAAI,KAAK,UAAU;AACjB,UAAM,SAAS,SAAS,MAAM,IAAI,KAAK,QAAQ;AAC/C,QAAI,QAAQ;AACV,aAAO,WAAW,OAAO,SAAS,OAAO,CAAC,OAAO,OAAO,KAAK,EAAE;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,UAA4B,MAAqC;AAC1F,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,QAAQ;AACf,WAAO,SAAS,MAAM,IAAI,KAAK,MAAM,KAAK;AAAA,EAC5C;AACA,MAAI,KAAK,YAAY,eAAe;AAClC,WAAO,SAAS,MAAM,IAAI,SAAS,MAAM,KAAK;AAAA,EAChD;AACA,SAAO,SAAS,MAAM,IAAI,KAAK,OAAO,KAAK;AAC7C;AAEA,SAAS,kBAAkB,UAA4B,MAAqC;AAC1F,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,QAAQ;AACf,WAAO,SAAS,MAAM,IAAI,KAAK,MAAM,KAAK;AAAA,EAC5C;AACA,SAAO,SAAS,MAAM,IAAI,KAAK,OAAO,KAAK;AAC7C;AAEA,SAAS,iBAAiB,MAAoB,OAA4C;AACxF,MAAI,CAAC,QAAQ,CAAC,MAAO;AACrB,QAAM,OAAO,EAAE,GAAG,KAAK,MAAM;AAC7B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,QAAQ,WAAW,SAAS,OAAO,UAAU,UAAU;AACzD,WAAK,QAAQ,WAAW,KAAc;AACtC;AAAA,IACF;AACA,QAAI,UAAU,QAAW;AACvB,aAAO,KAAK,GAAG;AAAA,IACjB,OAAO;AACL,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AACA,OAAK,QAAQ;AACf;AAEA,SAAS,sBACP,UACA,QACA,YACA,OACA,YACA;AACA,MAAI,OAAO,SAAS,OAAQ;AAC5B,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,OAAO,SAAS,MAAM,CAAC;AAC/E,MAAI,eAAe;AACnB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,SAAS,GAAG,OAAO,EAAE,UAAU,YAAY;AACjD,kBAAc,UAAU,MAAM;AAC9B,UAAM,QAAsB;AAAA,MAC1B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM,MAAM,CAAC,KAAK;AAAA,QAClB,MAAM,WAAW,CAAC,KAAK;AAAA,MACzB;AAAA,IACF;AACA,aAAS,MAAM,IAAI,MAAM,IAAI,KAAK;AAClC,WAAO,SAAS,OAAO,cAAc,GAAG,MAAM,EAAE;AAChD;AAAA,EACF;AACF;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;;;AMl9BA,uBAAgE;AAOhE,IAAI,oBAA8C;AAElD,SAAS,mBAAsC;AAC7C,QAAM,gBAAgB,iBAAAC;AACtB,MAAI,iBAAiB,OAAO,cAAc,aAAa,YAAY;AACjE,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB,OAAO,kBAAkB,aAAa,YAAY;AACzE,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,IAAI,MAAM,mIAAmI;AAAA,EACrJ;AACA,0BAAqB,iBAAAA,SAAkE,MAAM;AAC7F,SAAO;AACT;AAKA,IAAI;AAKG,SAAS,+BAAqC;AACnD,MAAI,OAAO,WAAW,eAAe,oBAAoB;AACvD;AAAA,EACF;AACA,QAAM,gBAAgB;AACtB,QAAM,UAAU,cAAc;AAC9B,MAAI,CAAC,WAAW,oBAAoB;AAClC;AAAA,EACF;AACA,uBAAqB,QAAQ,aAAa,wBAAwB;AAAA,IAChE,YAAY,CAAC,UAAkB;AAC7B,YAAM,MAAM,iBAAiB,EAAE,SAAS,OAAO;AAAA,QAC7C,cAAc;AAAA;AAAA,UAEZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAGA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAGA;AAAA;AAAA,UAGA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAGA;AAAA,UACA;AAAA,QACF;AAAA,QACA,cAAc;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QACF;AAAA,QACA,oBAAoB;AAAA,QACpB,YAAY;AAAA,QACZ,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,MACvB,CAAC;AACD,aAAO,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AAAA,IACnD;AAAA,IACA,cAAc,CAAC,UAAkB;AAAA,IACjC,iBAAiB,CAAC,UAAkB;AAAA,EACtC,CAAC;AACH;AAKO,SAAS,kBAAkB,MAAoC;AAEpE,+BAA6B;AAE7B,MAAI,oBAAoB;AACtB,WAAO,mBAAmB,WAAW,IAAI;AAAA,EAC3C;AAGA,SAAO,iBAAiB,EAAE,SAAS,MAAM,sBAAsB,CAAC;AAClE;AAKO,SAAS,aAAa,MAAsB;AACjD,QAAM,MAAM,iBAAiB,EAAE,SAAS,MAAM,sBAAsB,CAAC;AACrE,SAAO,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AACnD;AAKA,SAAS,wBAAyC;AAChD,SAAO;AAAA,IACL,cAAc;AAAA;AAAA,MAEZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA,oBAAoB;AAAA;AAAA,IAGpB,aAAa,CAAC,UAAU,UAAU,SAAS,QAAQ,SAAS,QAAQ;AAAA,IACpE,aAAa,CAAC,WAAW,UAAU,WAAW,aAAa;AAAA;AAAA,IAG3D,cAAc;AAAA;AAAA,IAGd,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,qBAAqB;AAAA;AAAA,IAGrB,cAAc;AAAA,IACd,gBAAgB;AAAA;AAAA,IAGhB,sBAAsB;AAAA;AAAA,IAGtB,yBAAyB;AAAA,MACvB,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,gCAAgC;AAAA,IAClC;AAAA,EACF;AACF;AAkBO,SAAS,yBAAyB,QAA6C;AACpF,QAAM,aAAa,sBAAsB;AAGzC,QAAM,cAAc,CAAC,GAAI,WAAW,gBAAgB,CAAC,CAAE;AACvD,QAAM,cAAc,CAAC,GAAI,WAAW,gBAAgB,CAAC,CAAE;AAEvD,MAAI,CAAC,OAAO,WAAW;AAErB,UAAM,WAAW,CAAC,cAAc,aAAa,SAAS,MAAM,MAAM,MAAM,QAAQ;AAChF,gBAAY,OAAO,GAAG,YAAY,QAAQ,GAAG,YAAY,OAAO,CAAC,QAAQ,CAAC,SAAS,SAAS,GAAG,CAAC,CAAC;AAAA,EACnG;AAEA,MAAI,CAAC,OAAO,yBAAyB;AACnC,UAAM,aAAa,YAAY,QAAQ,OAAO;AAC9C,QAAI,aAAa,IAAI;AACnB,kBAAY,OAAO,YAAY,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,mBAAmB;AAE7B,UAAM,aAAa,YAAY,QAAQ,OAAO;AAC9C,QAAI,aAAa,IAAI;AACnB,kBAAY,OAAO,YAAY,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,oBAAoB;AAE9B,eAAW,qBAAqB;AAAA,EAClC;AAGA,MAAI,OAAO,YAAY;AACrB,gBAAY,KAAK,GAAG,OAAO,UAAU;AAAA,EACvC;AAEA,MAAI,OAAO,kBAAkB;AAC3B,gBAAY,KAAK,GAAG,OAAO,gBAAgB;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACF;AAKO,SAAS,iBAAiB,MAAsB;AACrD,QAAM,MAAM,iBAAiB,EAAE,SAAS,MAAM;AAAA,IAC5C,cAAc,CAAC,OAAO,QAAQ,QAAQ,OAAO,IAAI;AAAA,IACjD,cAAc,CAAC,SAAS,UAAU,OAAO;AAAA,IACzC,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AACD,SAAO,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AACnD;AAKO,SAAS,iBAAiB,MAAsB;AACrD,QAAM,MAAM,iBAAiB,EAAE,SAAS,MAAM;AAAA,IAC5C,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc,CAAC,SAAS,SAAS,QAAQ;AAAA,IACzC,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AACD,SAAO,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AACnD;AAKO,SAAS,YAAY,KAA4B;AAEtD,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AAGlD,QAAI,CAAC,CAAC,SAAS,UAAU,WAAW,MAAM,EAAE,SAAS,OAAO,QAAQ,GAAG;AACrE,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,SAAS;AAAA,EACzB,QAAQ;AAEN,QAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,KAAK,GAAG;AACxE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAKO,IAAM,cAAc;AAAA;AAAA,EAEzB,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA;AAAA,EAGX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAKO,SAAS,qBAA2B;AAEzC,+BAA6B;AAG7B,MAAI;AACF,UAAM,WAAW,iBAAiB;AAClC,QAAI,OAAO,SAAS,YAAY,YAAY;AAC1C;AAAA,IACF;AAEA,aAAS,QAAQ,0BAA0B,CAAC,SAAkB,IAAI;AAClE,aAAS,QAAQ,yBAAyB,CAAC,SAAkB,IAAI;AAAA,EACnE,QAAQ;AAAA,EAER;AACF;;;AC5cO,IAAM,8BAAkD;AAAA,EAC7D,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,iBAAiB;AACnB;AAEO,SAAS,mBAAmB,YAAoB,SAA6B,6BAAqC;AACvH,QAAM,QAAQ,OAAO,UAAU;AAC/B,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,kBAAkB;AACpC,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,eAAe;AACjC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,IAAI,MAAQ,OAAO,gBAAgB,OAAO,gBAAgB;AAC7E,QAAM,cAAc,QAAQ,OAAO,oBAAoB;AACvD,QAAM,SAAS,IAAI;AACnB,SAAO,YAAY,MAAM;AAC3B;AAEO,SAAS,aAAa,gBAAwB,WAAmB,kBAAkB,4BAA4B,iBAAyB;AAC7I,QAAM,OAAO,OAAO,SAAS,cAAc,IAAI,iBAAiB;AAChE,QAAM,MAAM,OAAO,SAAS,SAAS,IAAI,YAAY;AACrD,QAAM,SAAS,QAAQ,eAAe;AACtC,MAAI,UAAU,GAAG;AACf,WAAO,YAAY,GAAG;AAAA,EACxB;AACA,MAAI,UAAU,GAAG;AACf,WAAO,YAAY,GAAG;AAAA,EACxB;AACA,QAAM,UAAU,QAAQ,MAAM,QAAQ;AACtC,SAAO,YAAY,OAAO;AAC5B;AAEO,SAAS,wBAAwB,YAAoB,gBAAwB,SAA6B,6BAAqC;AACpJ,QAAM,MAAM,mBAAmB,YAAY,MAAM;AACjD,SAAO,aAAa,gBAAgB,KAAK,OAAO,eAAe;AACjE;AAEO,SAAS,wBAAwB,QAAgB,SAA6B,6BAAqC;AACxH,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,UAAU,OAAO,iBAAiB;AACpC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,MAAM,SAAS,OAAO,mBAAmB;AAC7D,QAAM,SAAS,KAAK,IAAI,OAAO,qBAAqB,MAAM;AAC1D,SAAO,KAAK,IAAI,OAAO,qBAAqB,MAAM;AACpD;AAEO,SAAS,YAAY,OAAuB;AACjD,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,EAAG,QAAO;AACvB,SAAO;AACT;AAEA,SAAS,QAAQ,OAAuB;AACtC,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,EAAG,QAAO;AACvB,SAAO;AACT;;;ACrEO,IAAM,0BAA0C;AAAA,EACrD,SAAS;AAAA,EACT,mBAAmB;AAAA;AAAA,EACnB,iBAAiB,oBAAI,IAAI,CAAC,eAAe,eAAe,UAAU,CAAC;AACrE;AAEA,IAAM,wBAAwB;AAC9B,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB,OAAO,YAAY,cAAc,OAAO,QAAQ,IAAI,6BAA6B,WAAW,QAAQ,IAAI,aAAa;AAEnJ,SAAS,cAAc,MAA0B;AAC/C,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK,YAAY,CAAC,GAAG,KAAK,SAAS,IAAI;AAAA,EACpD;AACF;AAEA,SAAS,YAAY,MAAwB;AAC3C,QAAM,WAAW,KAAK,UAAU;AAChC,QAAM,YAAY,KAAK,aAAa,KAAK,UAAU,SAAS,IAAI,KAAK,KAAK,UAAU,KAAK,GAAG,CAAC,KAAK;AAClG,SAAO,GAAG,KAAK,OAAO,KAAK,QAAQ,GAAG,SAAS;AACjD;AAEA,SAAS,aAAa,SAAkB,SAAyB,yBAAkC;AACjG,MAAI,uBAAuB;AACzB,WAAO,sBAAsB,SAAS,MAAM;AAAA,EAC9C;AACA,SAAO,yBAAyB,SAAS,MAAM;AACjD;AAEO,SAAS,gBAAgB,SAAkB,SAAyB,yBAAkC;AAC3G,SAAO,aAAa,SAAS,MAAM;AACrC;AAEO,SAAS,2BACd,SACA,SAAyB,yBACyB;AAClD,QAAM,QAAQ,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,aAAa,YAAY,IAAI,IAAI,KAAK,IAAI;AAEzH,QAAM,SAAS,aAAa,SAAS,MAAM;AAC3C,QAAM,cAAc,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,aAAa,YAAY,IAAI,IAAI,KAAK,IAAI,KAAK;AAEpI,QAAM,cAAc,SAAS,OAAO;AACpC,QAAM,eAAe,SAAS,MAAM;AAEpC,QAAM,UAA6B;AAAA,IACjC,iBAAiB,QAAQ;AAAA,IACzB,kBAAkB,OAAO;AAAA,IACzB,gBAAgB,KAAK,IAAI,GAAG,QAAQ,SAAS,OAAO,MAAM;AAAA,IAC1D;AAAA,IACA,sBAAsB,KAAK,IAAI,IAAI,YAAY,eAAe,MAAM,aAAa,eAAe,EAAE;AAAA,IAClG,mBAAmB,KAAK,IAAI,IAAI,YAAY,YAAY,MAAM,aAAa,YAAY,EAAE;AAAA,IACzF,sBAAsB,KAAK,IAAI,IAAI,YAAY,eAAe,MAAM,aAAa,eAAe,EAAE;AAAA,EACpG;AAEA,SAAO,EAAE,SAAS,QAAQ,QAAQ;AACpC;AAEO,SAAS,sBAAsB,SAAkB,SAAyB,yBAAkC;AACjH,MAAI,CAAC,OAAO,WAAW,QAAQ,WAAW,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,IAAI,QAAQ,QAAQ,OAAO,iBAAiB;AACpE,QAAMC,UAAS,QAAQ,MAAM,GAAG,UAAU;AAC1C,QAAM,OAAO,QAAQ,MAAM,UAAU;AAErC,QAAM,SAAkB,CAAC;AAEzB,MAAI,IAAI;AACR,SAAO,IAAIA,QAAO,QAAQ;AACxB,UAAM,QAAQA,QAAO,CAAC;AACtB,QAAI,CAAC,OAAO,gBAAgB,IAAI,MAAM,EAAE,GAAG;AACzC,aAAO,KAAK,KAAK;AACjB;AACA;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,eAAe;AAC9B,YAAM,SAAS,iBAAiBA,SAAQ,CAAC;AACzC,aAAO,KAAK,OAAO,KAAK;AACxB,UAAI,OAAO;AACX;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,eAAe;AAC9B,YAAM,SAAS,sBAAsBA,SAAQ,CAAC;AAC9C,aAAO,KAAK,GAAG,OAAO,OAAO;AAC7B,UAAI,OAAO;AACX;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,YAAY;AAC3B,YAAM,SAAS,gBAAgBA,SAAQ,CAAC;AACxC,aAAO,KAAK,GAAG,OAAO,OAAO;AAC7B,UAAI,OAAO;AACX;AAAA,IACF;AAEA,WAAO,KAAK,KAAK;AACjB;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,QAAiB,CAAC;AACxB,UAAM,eAAe,oBAAI,IAAY;AACrC,aAAS,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,OAAO;AACjD,YAAM,UAAU,OAAO,GAAG;AAC1B,UAAI,QAAQ,OAAO,YAAY;AAC7B,cAAM,MAAM,GAAG,QAAQ,GAAG,OAAO,MAAM,QAAQ,GAAG,UAAU,EAAE;AAC9D,YAAI,aAAa,IAAI,GAAG,GAAG;AACzB;AAAA,QACF;AACA,qBAAa,IAAI,GAAG;AAAA,MACtB;AACA,YAAM,KAAK,OAAO;AAAA,IACpB;AACA,UAAM,QAAQ;AACd,WAAO,SAAS;AAChB,WAAO,KAAK,GAAG,KAAK;AAAA,EACtB;AAEA,SAAO,CAAC,GAAG,QAAQ,GAAG,IAAI;AAC5B;AAEA,SAAS,iBAAiBA,SAAiB,YAAyD;AAClG,QAAM,OAAOA,QAAO,UAAU;AAC9B,MAAI,CAAC,QAAQ,KAAK,OAAO,eAAe;AACtC,WAAO,EAAE,OAAO,MAAM,WAAW,aAAa,EAAE;AAAA,EAClD;AAEA,QAAM,QAAQ,CAAC,GAAI,KAAK,SAAS,CAAC,CAAE;AACpC,QAAM,YAAkC,MAAM,QAAQ,KAAK,SAAS,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC;AAC/F,QAAM,YAAY,KAAK;AACvB,MAAI,gBAAgB,YAAY,MAAM;AACtC,MAAI,IAAI,aAAa;AACrB,MAAI,cAAc;AAElB,SAAO,IAAIA,QAAO,UAAU,cAAc,oBAAoB;AAC5D,UAAM,OAAOA,QAAO,CAAC;AACrB,QACE,KAAK,OAAO,iBACZ,KAAK,GAAG,YAAY,KAAK,GAAG,WAC5B,KAAK,GAAG,WAAW,KAAK,GAAG,UAC3B,OAAO,KAAK,eAAe,YAC3B,KAAK,eAAe,eACpB;AACA,YAAM,KAAK,GAAI,KAAK,SAAS,CAAC,CAAE;AAChC,YAAM,iBAAiB,MAAM,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC;AACzE,YAAM,gBAAgB,KAAK,OAAO,UAAU;AAC5C,UAAI,eAAe,SAAS,GAAG;AAC7B,iBAAS,MAAM,GAAG,MAAM,eAAe,OAAO;AAC5C,gBAAM,iBAAiB,MAAM,eAAe,SAAU,eAAe,GAAG,KAAK,OAAQ;AACrF,oBAAU,KAAK,cAAc;AAAA,QAC/B;AAAA,MACF,OAAO;AACL,iBAAS,MAAM,GAAG,MAAM,eAAe,OAAO;AAC5C,oBAAU,KAAK,IAAI;AAAA,QACrB;AAAA,MACF;AACA,sBAAgB,YAAY,MAAM;AAClC;AACA;AACA;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,WAAkB;AAAA,IACtB,GAAG;AAAA,IACH;AAAA,IACA,WAAW,UAAU,SAAS,IAAI,YAAY;AAAA,EAChD;AAEA,SAAO,EAAE,OAAO,UAAU,WAAW,EAAE;AACzC;AAEA,SAAS,sBAAsBA,SAAiB,YAA6D;AAC3G,QAAM,OAAOA,QAAO,UAAU;AAC9B,MAAI,CAAC,QAAQ,KAAK,OAAO,eAAe;AACtC,WAAO,EAAE,SAAS,CAAC,IAAI,GAAG,WAAW,aAAa,EAAE;AAAA,EACtD;AACA,QAAM,UAAwD,CAAC;AAC/D,MAAI,OAAO,KAAK,UAAU,UAAU;AAClC,YAAQ,KAAK,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;AAAA,EACrD;AACA,MAAI,IAAI,aAAa;AACrB,MAAI,cAAc;AAElB,SAAO,IAAIA,QAAO,UAAU,cAAc,oBAAoB;AAC5D,UAAM,OAAOA,QAAO,CAAC;AACrB,QACE,KAAK,OAAO,iBACZ,KAAK,GAAG,YAAY,KAAK,GAAG,WAC5B,KAAK,GAAG,WAAW,KAAK,GAAG,UAC3B,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,UAAU,YACtB,KAAK,WAAW,KAAK,SAAS,KAAK,QAAQ,QAC3C;AACA,cAAQ,KAAK,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;AACnD;AACA;AACA;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO,EAAE,SAAS,CAAC,IAAI,GAAG,WAAW,EAAE;AAAA,EACzC;AAEA,QAAM,SAAS,QAAQ,IAAI,CAAC,WAAW;AAAA,IACrC,GAAG;AAAA,IACH,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,EACd,EAAE;AAEF,SAAO,EAAE,SAAS,QAAQ,WAAW,EAAE;AACzC;AAEA,SAAS,gBAAgBA,SAAiB,YAA6D;AACrG,QAAM,QAAQA,QAAO,UAAU;AAC/B,MAAI,CAAC,SAAS,MAAM,OAAO,YAAY;AACrC,WAAO,EAAE,SAAS,CAAC,KAAK,GAAG,WAAW,aAAa,EAAE;AAAA,EACvD;AACA,QAAM,UAAgC,CAAC;AACvC,MAAI,IAAI;AAER,SAAO,IAAIA,QAAO,UAAU,QAAQ,SAAS,uBAAuB;AAClE,UAAM,UAAUA,QAAO,CAAC;AACxB,QAAI,QAAQ,OAAO,YAAY;AAC7B;AAAA,IACF;AACA,UAAM,cAAc,EAAE,GAAI,QAAQ,SAAS,CAAC,EAAG;AAC/C,QAAI,IAAI,IAAI;AACZ,QAAI,cAAc;AAElB,WAAO,IAAIA,QAAO,UAAU,cAAc,uBAAuB;AAC/D,YAAM,OAAOA,QAAO,CAAC;AACrB,UAAI,KAAK,OAAO,cAAc,YAAY,KAAK,EAAE,MAAM,YAAY,QAAQ,EAAE,GAAG;AAC9E,eAAO,OAAO,aAAa,KAAK,SAAS,CAAC,CAAC;AAC3C;AACA;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,IAAI,cAAc,QAAQ,EAAE;AAAA,MAC5B,OAAO;AAAA,IACT,CAAC;AAED,QAAI;AAAA,EACN;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,SAAS,CAACA,QAAO,UAAU,CAAC,GAAG,WAAW,aAAa,EAAE;AAAA,EACpE;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,QAAe;AAAA,MACnB,GAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO,OAAO;AAAA,IAChB;AACA,WAAO,EAAE,SAAS,CAAC,KAAK,GAAG,WAAW,EAAE;AAAA,EAC1C;AAEA,QAAM,aAAoB;AAAA,IACxB,IAAI;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,CAAC,UAAU,GAAG,WAAW,EAAE;AAC/C;AAEA,SAAS,SAAS,SAA0C;AAC1D,QAAM,SAAiC,uBAAO,OAAO,IAAI;AACzD,aAAW,SAAS,SAAS;AAC3B,WAAO,MAAM,EAAE,KAAK,OAAO,MAAM,EAAE,KAAK,KAAK;AAAA,EAC/C;AACA,SAAO;AACT;AAWO,SAAS,yBAAyB,SAAkB,SAAyB,yBAAkC;AACpH,MAAI,CAAC,OAAO,WAAW,QAAQ,WAAW,GAAG;AAC3C,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,KAAK,IAAI,QAAQ,QAAQ,OAAO,iBAAiB;AACpE,QAAMA,UAAS,QAAQ,MAAM,GAAG,UAAU;AAC1C,QAAM,OAAO,QAAQ,MAAM,UAAU;AAErC,QAAM,YAAqB,CAAC;AAC5B,MAAI,IAAI;AAER,SAAO,IAAIA,QAAO,QAAQ;AACxB,UAAM,UAAUA,QAAO,CAAC;AACxB,QAAI,CAAC,OAAO,gBAAgB,IAAI,QAAQ,EAAE,GAAG;AAC3C,gBAAU,KAAK,OAAO;AACtB;AACA;AAAA,IACF;AAGA,QAAI,iBAAiB;AAErB,QAAI,QAAQ,OAAO,eAAe;AAEhC,YAAM,QAAkB,CAAC,GAAG,QAAQ,KAAK;AACzC,YAAM,aAAmC,QAAQ,YAAY,CAAC,GAAG,QAAQ,SAAS,IAAI,CAAC;AACvF,UAAI,IAAI,IAAI;AAEZ,aAAO,IAAIA,QAAO,UAAU,iBAAiB,IAAI;AAC/C,cAAM,OAAOA,QAAO,CAAC;AACrB,YACE,KAAK,OAAO,iBACZ,KAAK,GAAG,YAAY,QAAQ,GAAG,WAC/B,KAAK,GAAG,WAAW,QAAQ,GAAG,UAC9B,OAAO,KAAK,eAAe,YAC3B,OAAO,QAAQ,eAAe,YAC9B,KAAK,gBAAgB,QAAQ,cAAc,KAAK,MAAM,QACtD;AACA,gBAAM,KAAK,GAAG,KAAK,KAAK;AACxB,cAAI,KAAK,WAAW;AAClB,uBAAW,KAAK,GAAG,KAAK,SAAS;AAAA,UACnC,OAAO;AACL,uBAAW,KAAK,GAAG,IAAI,MAAM,KAAK,MAAM,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,UAC5D;AACA;AACA;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AAEA,UAAI,iBAAiB,GAAG;AACtB,kBAAU,KAAK;AAAA,UACb,GAAG;AAAA,UACH;AAAA,UACA,WAAW,WAAW,SAAS,IAAI,aAAa;AAAA,QAClD,CAAC;AACD,YAAI;AACJ;AAAA,MACF;AAAA,IACF,WAAW,QAAQ,OAAO,eAAe;AAEvC,YAAM,UAA+D,CAAC,EAAE,OAAO,QAAQ,OAAO,MAAM,QAAQ,KAAK,CAAC;AAClH,UAAI,IAAI,IAAI;AACZ,UAAI,YAAY,QAAQ;AAExB,aAAO,IAAIA,QAAO,UAAU,iBAAiB,IAAI;AAC/C,cAAM,OAAOA,QAAO,CAAC;AACrB,YAAI,KAAK,OAAO,iBAAiB,KAAK,GAAG,YAAY,QAAQ,GAAG,WAAW,KAAK,GAAG,WAAW,QAAQ,GAAG,UAAU,KAAK,UAAU,YAAY,GAAG;AAC/I,kBAAQ,KAAK,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;AACnD,sBAAY,KAAK;AACjB;AACA;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AAIA,UAAI,mBAAmB,GAAG;AACxB,kBAAU,KAAK,OAAO;AACtB;AACA;AAAA,MACF;AAEA,gBAAU,KAAK,GAAG,QAAQ,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,OAAO,IAAI,OAAO,MAAM,IAAI,KAAK,EAAE,CAAC;AAC1F,UAAI;AACJ;AAAA,IACF,WAAW,QAAQ,OAAO,YAAY;AAEpC,YAAM,cAAc,EAAE,GAAI,QAAQ,SAAS,CAAC,EAAG;AAC/C,UAAI,IAAI,IAAI;AAEZ,aAAO,IAAIA,QAAO,UAAU,iBAAiB,IAAI;AAC/C,cAAM,OAAOA,QAAO,CAAC;AACrB,YAAI,KAAK,OAAO,cAAc,KAAK,GAAG,YAAY,QAAQ,GAAG,WAAW,KAAK,GAAG,WAAW,QAAQ,GAAG,QAAQ;AAC5G,iBAAO,OAAO,aAAa,KAAK,SAAS,CAAC,CAAC;AAC3C;AACA;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AAEA,YAAM,eAAe;AAAA,QACnB;AAAA,UACE,IAAI,cAAc,QAAQ,EAAE;AAAA,UAC5B,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,IAAI;AACR,aAAO,IAAIA,QAAO,UAAU,aAAa,SAAS,uBAAuB;AACvE,cAAM,YAAYA,QAAO,CAAC;AAC1B,YAAI,UAAU,OAAO,YAAY;AAC/B;AAAA,QACF;AAEA,cAAM,uBAAuB,EAAE,GAAI,UAAU,SAAS,CAAC,EAAG;AAC1D,YAAI,IAAI,IAAI;AACZ,YAAI,cAAc;AAElB,eAAO,IAAIA,QAAO,UAAU,cAAc,IAAI;AAC5C,gBAAM,SAASA,QAAO,CAAC;AACvB,cAAI,OAAO,OAAO,cAAc,YAAY,OAAO,EAAE,MAAM,YAAY,UAAU,EAAE,GAAG;AACpF,mBAAO,OAAO,sBAAsB,OAAO,SAAS,CAAC,CAAC;AACtD;AACA;AAAA,UACF,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAEA,qBAAa,KAAK;AAAA,UAChB,IAAI,cAAc,UAAU,EAAE;AAAA,UAC9B,OAAO;AAAA,QACT,CAAC;AACD,YAAI;AAAA,MACN;AAEA,UAAI,aAAa,SAAS,GAAG;AAC3B,kBAAU,KAAK;AAAA,UACb,IAAI;AAAA,UACJ,SAAS;AAAA,QACX,CAAU;AACV,YAAI;AACJ;AAAA,MACF;AAEA,UAAI,iBAAiB,GAAG;AACtB,kBAAU,KAAK;AAAA,UACb,GAAG;AAAA,UACH,OAAO;AAAA,QACT,CAAC;AACD,YAAI;AACJ;AAAA,MACF;AAEA,gBAAU,KAAK;AAAA,QACb,GAAG;AAAA,QACH,OAAO;AAAA,MACT,CAAC;AACD;AACA;AAAA,IACF;AAGA,cAAU,KAAK,OAAO;AACtB;AAAA,EACF;AAGA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,UAAmB,CAAC;AAC1B,UAAM,eAAe,oBAAI,IAAY;AACrC,aAAS,MAAM,UAAU,SAAS,GAAG,OAAO,GAAG,OAAO;AACpD,YAAM,QAAQ,UAAU,GAAG;AAC3B,UAAI,MAAM,OAAO,YAAY;AAC3B,cAAM,MAAM,GAAG,MAAM,GAAG,OAAO,MAAM,MAAM,GAAG,UAAU,EAAE;AAC1D,YAAI,aAAa,IAAI,GAAG,GAAG;AACzB;AAAA,QACF;AACA,qBAAa,IAAI,GAAG;AAAA,MACtB;AACA,cAAQ,KAAK,KAAK;AAAA,IACpB;AACA,YAAQ,QAAQ;AAChB,cAAU,SAAS;AACnB,cAAU,KAAK,GAAG,OAAO;AAAA,EAC3B;AAGA,SAAO,CAAC,GAAG,WAAW,GAAG,IAAI;AAC/B;","names":["codeLines","mdParser","dedentIndentedCode","removeHeadingMarkers","dedentIndentedCode","removeHeadingMarkers","createDOMPurify","window"]}
|