@sarchauhan/chat 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/widgets/index.ts","../src/widgets/read-file.tsx","../src/widgets/tool-frame.tsx","../src/widgets/patch.tsx","../src/widgets/compute.ts","../src/widgets/search.tsx","../src/widgets/question.tsx","../src/widgets/registry.tsx","../src/widgets/artifact.tsx","../src/widgets/responsive-detail.tsx","../src/widgets/subagent.tsx","../src/components/Message/message.content.tsx","../src/lib/message/segment.ts","../src/lib/message/user.ts","../src/lib/utils.ts","../src/motion/classes.ts","../src/motion/helpers.ts","../src/motion/text-swap.tsx","../src/components/Widget/widget.context.tsx","../src/ui/button.tsx","../src/components/Message/message.skeleton.tsx","../src/components/Widget/widget.renderer.tsx","../src/components/Widget/base.widget.tsx","../src/components/Message/message.markdown.tsx","../src/theme/theme.context.tsx","../src/components/Message/message.markdown.theme.ts","../src/components/Message/message.thinking.tsx","../src/components/Message/message.loading.tsx"],"sourcesContent":["export { ReadFileWidget } from \"./read-file\";\nexport { PatchWidget } from \"./patch\";\nexport { SearchWidget } from \"./search\";\nexport { QuestionWidget } from \"./question\";\nexport { prebuiltWidgets } from \"./registry\";\nexport {\n computeToolWidget,\n computeToolState,\n computeDiff,\n computeTextDiff,\n normalizeSearchResults,\n safeResultUrl,\n type DiffLine,\n} from \"./compute\";\nexport type {\n ReadFileWidgetProps,\n PatchWidgetProps,\n SearchWidgetProps,\n SearchResult,\n QuestionWidgetProps,\n QuestionOption,\n QuestionAnswer,\n ToolWidgetProps,\n WidgetState,\n} from \"./types\";\n\nexport { ArtifactWidget, ArtifactsWidget, safeArtifactUrl, formatArtifactSize } from \"./artifact\";\nexport type { ArtifactWidgetProps, ArtifactsWidgetProps } from \"./artifact\";\nexport { SubagentWidget } from \"./subagent\";\nexport type { SubagentWidgetProps } from \"./subagent\";\nexport { ResponsiveDetail } from \"./responsive-detail\";\nexport type { ResponsiveDetailProps } from \"./responsive-detail\";\nexport { createArtifactData, createSubagentData, parseArtifact, parseSubagent } from \"@sarchauhan/protocol\";\nexport type { AgentArtifact, AgentSubagent, AgentSubagentState } from \"@sarchauhan/protocol\";\n","\"use client\";\nimport { useState } from \"react\";\nimport { ToolFrame } from \"./tool-frame\";\nimport type { ReadFileWidgetProps } from \"./types\";\nexport function ReadFileWidget({\n path,\n content,\n startLine = 1,\n language,\n maxLines = 80,\n ...props\n}: ReadFileWidgetProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = content?.split(/\\r?\\n/) ?? [];\n const limit = Math.max(1, maxLines);\n const firstLine = Math.max(1, Math.floor(startLine));\n return (\n <ToolFrame\n {...props}\n label=\"Read file\"\n title={path}\n meta={lines.length ? `${lines.length} lines` : language}\n >\n {content === undefined ? (\n <p className=\"chat-widget-empty\">\n {props.state === \"running\"\n ? \"Reading file…\"\n : \"No file content supplied.\"}\n </p>\n ) : (\n <div\n className=\"chat-code-preview\"\n role=\"region\"\n aria-label={`Contents of ${path}`}\n tabIndex={0}\n >\n {(expanded ? lines : lines.slice(0, limit)).map((line, index) => (\n <div className=\"chat-code-line\" key={index}>\n <span className=\"chat-line-number\" aria-hidden=\"true\">\n {firstLine + index}\n </span>\n <code>{line || \" \"}</code>\n </div>\n ))}\n </div>\n )}\n {!expanded && lines.length > limit ? (\n <button\n className=\"chat-widget-more\"\n type=\"button\"\n onClick={() => setExpanded(true)}\n >\n Show {lines.length - limit} more lines\n </button>\n ) : null}\n </ToolFrame>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { ToolWidgetProps } from \"./types\";\nexport function ToolFrame({\n label,\n title,\n meta,\n state = \"complete\",\n error,\n className = \"\",\n children,\n}: ToolWidgetProps & {\n label: string;\n title: string;\n meta?: ReactNode;\n children: ReactNode;\n}) {\n const status = {\n running: \"Working\",\n complete: \"Done\",\n error: \"Failed\",\n denied: \"Denied\",\n approval: \"Needs approval\",\n }[state];\n return (\n <details\n className={`chat-prebuilt chat-tool-widget ${className}`}\n data-state={state}\n open={state !== \"complete\"}\n >\n <summary>\n <ChevronDown size={14} aria-hidden=\"true\" />\n <span className=\"chat-tool-widget-label\">{label}</span>\n <span className=\"chat-tool-widget-title\" title={title}>\n {title}\n </span>\n <span className=\"chat-tool-widget-meta\">{meta}</span>\n <span className=\"chat-tool-widget-status\" role=\"status\">\n {status}\n </span>\n </summary>\n <div className=\"chat-tool-widget-body\">\n {error ? (\n <p className=\"chat-widget-error\" role=\"alert\">\n {error}\n </p>\n ) : (\n children\n )}\n </div>\n </details>\n );\n}\n","\"use client\";\nimport { useMemo, useState } from \"react\";\nimport { computeDiff, computeTextDiff } from \"./compute\";\nimport { ToolFrame } from \"./tool-frame\";\nimport type { PatchWidgetProps } from \"./types\";\nexport function PatchWidget({\n path = \"File changes\",\n diff: rawDiff,\n before,\n after,\n maxLines = 100,\n ...props\n}: PatchWidgetProps) {\n const diff = useMemo(\n () =>\n rawDiff ??\n (before !== undefined && after !== undefined\n ? computeTextDiff(before, after, path)\n : \"\"),\n [rawDiff, before, after, path],\n );\n const [expanded, setExpanded] = useState(false);\n const { lines, additions, deletions } = useMemo(\n () => computeDiff(diff),\n [diff],\n );\n const limit = Math.max(1, maxLines);\n return (\n <ToolFrame\n {...props}\n label=\"Patch\"\n title={path}\n meta={\n <>\n <span className=\"chat-diff-add-count\">+{additions}</span>{\" \"}\n <span className=\"chat-diff-remove-count\">−{deletions}</span>\n </>\n }\n >\n {diff ? (\n <div\n className=\"chat-code-preview chat-diff\"\n role=\"region\"\n aria-label={`Diff for ${path}`}\n tabIndex={0}\n >\n {(expanded ? lines : lines.slice(0, limit)).map((line, index) => (\n <div className=\"chat-code-line\" data-kind={line.kind} key={index}>\n <span className=\"chat-line-number\" aria-hidden=\"true\">\n {line.oldLine}\n </span>\n <span className=\"chat-line-number\" aria-hidden=\"true\">\n {line.newLine}\n </span>\n <code>{line.text || \" \"}</code>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"chat-widget-empty\">No changes supplied.</p>\n )}\n {!expanded && lines.length > limit ? (\n <button\n className=\"chat-widget-more\"\n type=\"button\"\n onClick={() => setExpanded(true)}\n >\n Show full diff ({lines.length} lines)\n </button>\n ) : null}\n </ToolFrame>\n );\n}\n","import { parseArtifact } from \"@sarchauhan/protocol\";\nimport type { AgentToolPart, AgentWidgetPart } from \"@sarchauhan/protocol\";\nimport type { SearchResult, WidgetState } from \"./types\";\n\nconst record = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\nconst string = (...values: unknown[]) =>\n values.find((value): value is string => typeof value === \"string\");\nconst number = (...values: unknown[]) =>\n values.find(\n (value): value is number =>\n typeof value === \"number\" && Number.isFinite(value),\n );\nconst aliases: Record<string, string> = {\n read: \"read-file\",\n read_file: \"read-file\",\n readFile: \"read-file\",\n \"read-file\": \"read-file\",\n patch: \"patch\",\n apply_patch: \"patch\",\n edit_file: \"patch\",\n edit: \"patch\",\n search: \"search\",\n grep: \"search\",\n file_search: \"search\",\n web_search: \"search\",\n question: \"question\",\n ask_question: \"question\",\n};\nexport function computeToolState(part: AgentToolPart): WidgetState {\n if (part.state === \"output-error\") return \"error\";\n if (part.state === \"output-denied\") return \"denied\";\n if (part.state === \"approval-requested\") return \"approval\";\n return part.state === \"output-available\" && !part.preliminary\n ? \"complete\"\n : \"running\";\n}\nexport function normalizeSearchResults(value: unknown): SearchResult[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n const result = record(item);\n const path = string(result.path, result.file, result.url);\n if (!path) return [];\n return [\n {\n path,\n line: number(result.line, result.lineNumber),\n text: string(result.text, result.snippet, result.content),\n title: string(result.title),\n url: string(result.url),\n },\n ];\n });\n}\n/** Convert known tool payloads; unknown or incomplete formats retain the raw tool view. */\nexport function computeToolWidget(part: AgentToolPart): AgentWidgetPart | null {\n const name = aliases[part.toolName];\n if (!name) {\n // Explicit artifact envelopes work across harnesses without guessing filesystem paths.\n const output = record(part.output);\n if (part.state !== \"output-available\") return null;\n if (Array.isArray(output.artifacts)) {\n const artifacts = output.artifacts.flatMap((value) => {\n const artifact = parseArtifact(value); return artifact ? [artifact] : [];\n });\n return artifacts.length ? { type: \"widget\", name: \"artifacts\", id: part.toolCallId, props: { artifacts } } : null;\n }\n const artifact = parseArtifact(output.artifact);\n return artifact ? { type: \"widget\", name: \"artifact\", id: part.toolCallId, props: { artifact } } : null;\n }\n const input = record(part.input),\n output = record(part.output);\n const values = { ...input, ...output };\n const common = { state: computeToolState(part), error: part.errorText };\n let props: Record<string, unknown>;\n if (name === \"read-file\") {\n const path = string(\n values.path,\n values.file,\n values.filename,\n values.file_path,\n );\n if (!path) return null;\n props = {\n ...common,\n path,\n content: string(output.content, output.text, part.output),\n startLine: number(values.startLine, values.start_line, values.offset),\n language: string(values.language),\n };\n if (part.state === \"output-available\" && props.content === undefined)\n return null;\n } else if (name === \"patch\") {\n const before = string(values.before, values.old_string, values.oldText);\n const after = string(values.after, values.new_string, values.newText);\n const diff =\n string(\n output.diff,\n output.patch,\n input.diff,\n input.patch,\n part.input,\n part.output,\n ) ??\n (before !== undefined && after !== undefined\n ? computeTextDiff(\n before,\n after,\n string(values.path, values.file_path, \"file\"),\n )\n : undefined);\n if (\n diff === undefined ||\n (diff && !/^(@@|diff --git|--- |\\*\\*\\* Begin Patch)/m.test(diff))\n )\n return null;\n props = {\n ...common,\n path: string(values.path, values.file, values.file_path),\n diff,\n };\n } else if (name === \"search\") {\n const query = string(values.query, values.pattern, values.search);\n if (query === undefined) return null;\n const results =\n output.results ??\n output.matches ??\n (Array.isArray(part.output) ? part.output : undefined);\n if (part.state === \"output-available\" && !Array.isArray(results))\n return null;\n props = {\n ...common,\n query,\n results: normalizeSearchResults(results),\n total: number(output.total, output.totalCount),\n };\n } else {\n if (\n [\"output-error\", \"output-denied\", \"approval-requested\"].includes(\n part.state,\n )\n )\n return null;\n // The answer output is not a new question. Keep the original prompt and choices.\n const prompt = string(input.prompt, input.question);\n if (!prompt) return null;\n props = { ...input, prompt };\n }\n return {\n type: \"widget\",\n name,\n id: part.toolCallId,\n props,\n interactive: name === \"question\" && part.state === \"input-available\",\n };\n}\n\nexport type DiffLine = {\n kind: \"add\" | \"remove\" | \"context\" | \"header\";\n text: string;\n oldLine?: number;\n newLine?: number;\n};\n/** Parse unified diffs (including multiple files) without counting file headers as edits. */\nexport function computeDiff(diff: string) {\n let oldLine = 0,\n newLine = 0,\n inHunk = false,\n oldRemaining = 0,\n newRemaining = 0,\n additions = 0,\n deletions = 0;\n const lines: DiffLine[] = diff\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((text) => {\n const hunk = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/.exec(text);\n if (hunk) {\n oldLine = Number(hunk[1]);\n newLine = Number(hunk[3]);\n oldRemaining = Number(hunk[2] ?? 1);\n newRemaining = Number(hunk[4] ?? 1);\n inHunk = true;\n return { kind: \"header\", text };\n }\n if (oldRemaining === 0 && newRemaining === 0) inHunk = false;\n if (!inHunk && /^(diff --git|--- |\\+\\+\\+ |\\*\\*\\* )/.test(text)) {\n inHunk = false;\n return { kind: \"header\", text };\n }\n // apply_patch has unnumbered hunks; counts remain useful without invented line numbers.\n if (text.startsWith(\"@@\")) {\n inHunk = false;\n return { kind: \"header\", text };\n }\n if (text.startsWith(\"+\")) {\n additions++;\n if (inHunk) newRemaining--;\n return { kind: \"add\", text, newLine: inHunk ? newLine++ : undefined };\n }\n if (text.startsWith(\"-\")) {\n deletions++;\n if (inHunk) oldRemaining--;\n return {\n kind: \"remove\",\n text,\n oldLine: inHunk ? oldLine++ : undefined,\n };\n }\n if (inHunk && text.startsWith(\" \")) {\n oldRemaining--;\n newRemaining--;\n return {\n kind: \"context\",\n text,\n oldLine: oldLine++,\n newLine: newLine++,\n };\n }\n return { kind: \"header\", text };\n });\n return { lines, additions, deletions };\n}\nexport function safeResultUrl(url?: string): string | undefined {\n try {\n const parsed = new URL(url ?? \"\");\n return [\"https:\", \"http:\"].includes(parsed.protocol)\n ? parsed.href\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Compute a unified replacement hunk with three context lines. Common edges stay out of the diff. */\nexport function computeTextDiff(\n before: string,\n after: string,\n path = \"file\",\n): string {\n if (before === after) return \"\";\n const split = (text: string) =>\n text === \"\"\n ? []\n : text.replace(/\\r\\n/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\");\n const oldLines = split(before),\n newLines = split(after);\n let prefix = 0,\n suffix = 0;\n while (\n prefix < oldLines.length &&\n prefix < newLines.length &&\n oldLines[prefix] === newLines[prefix]\n )\n prefix++;\n while (\n suffix < oldLines.length - prefix &&\n suffix < newLines.length - prefix &&\n oldLines[oldLines.length - 1 - suffix] ===\n newLines[newLines.length - 1 - suffix]\n )\n suffix++;\n if (before.endsWith(\"\\n\") !== after.endsWith(\"\\n\")) suffix = 0;\n // If only the final newline changed, include the last line as a replacement.\n if (prefix === oldLines.length && prefix === newLines.length) {\n prefix = Math.max(0, prefix - 1);\n suffix = 0;\n }\n const start = Math.max(0, prefix - 3),\n tail = Math.min(3, suffix);\n const oldEnd = oldLines.length - suffix,\n newEnd = newLines.length - suffix;\n const oldCount = oldEnd + tail - start,\n newCount = newEnd + tail - start;\n const label = path.replace(/[\\r\\n]/g, \"\");\n const body = [\n ...oldLines.slice(start, prefix).map((line) => \" \" + line),\n ...oldLines\n .slice(prefix, oldEnd)\n .flatMap((line, index) => [\n \"-\" + line,\n ...(prefix + index === oldLines.length - 1 && !before.endsWith(\"\\n\")\n ? [\"\\\\"]\n : []),\n ]),\n ...newLines\n .slice(prefix, newEnd)\n .flatMap((line, index) => [\n \"+\" + line,\n ...(prefix + index === newLines.length - 1 && !after.endsWith(\"\\n\")\n ? [\"\\\\"]\n : []),\n ]),\n ...oldLines.slice(oldEnd, oldEnd + tail).map((line) => \" \" + line),\n ];\n return [\n `--- a/${label}`,\n `+++ b/${label}`,\n `@@ -${oldCount ? start + 1 : start},${oldCount} +${newCount ? start + 1 : start},${newCount} @@`,\n ...body,\n ].join(\"\\n\");\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { safeResultUrl } from \"./compute\";\nimport { ToolFrame } from \"./tool-frame\";\nimport type { SearchWidgetProps } from \"./types\";\nexport function SearchWidget({\n query,\n results = [],\n total,\n maxResults = 5,\n ...props\n}: SearchWidgetProps) {\n const [expanded, setExpanded] = useState(false);\n const limit = Math.max(1, maxResults);\n const count = Math.max(results.length, total ?? 0);\n return (\n <ToolFrame\n {...props}\n label=\"Search\"\n title={query}\n meta={`${count} ${count === 1 ? \"result\" : \"results\"}`}\n >\n {!results.length ? (\n <p className=\"chat-widget-empty\">\n {props.state === \"running\" ? \"Searching…\" : \"No results found.\"}\n </p>\n ) : (\n <ol className=\"chat-search-results\">\n {(expanded ? results : results.slice(0, limit)).map(\n (result, index) => {\n const href = safeResultUrl(result.url);\n const label = (\n <>\n {result.title || result.path}\n {result.line ? (\n <span className=\"chat-search-line\">:{result.line}</span>\n ) : null}\n </>\n );\n return (\n <li key={`${result.path}-${result.line}-${index}`}>\n {href ? (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n {label}\n </a>\n ) : (\n <div className=\"chat-search-path\">{label}</div>\n )}\n {result.text ? <p>{result.text}</p> : null}\n </li>\n );\n },\n )}\n </ol>\n )}\n {!expanded && results.length > limit ? (\n <button\n className=\"chat-widget-more\"\n type=\"button\"\n onClick={() => setExpanded(true)}\n >\n Show {results.length - limit} more results\n </button>\n ) : null}\n </ToolFrame>\n );\n}\n","\"use client\";\nimport { useId, useRef, useState } from \"react\";\nimport { ArrowUp, Check } from \"lucide-react\";\nimport type { QuestionWidgetProps } from \"./types\";\nexport function QuestionWidget({\n prompt,\n description,\n options = [],\n multiple = false,\n allowCustom = false,\n disabled = false,\n onSubmit,\n className = \"\",\n}: QuestionWidgetProps) {\n const id = useId();\n const [selected, setSelected] = useState<string[]>([]),\n [text, setText] = useState(\"\");\n const [status, setStatus] = useState<\"idle\" | \"sending\" | \"sent\">(\"idle\");\n const [error, setError] = useState<string>();\n const submitting = useRef(false);\n const choices = options.map((option) =>\n typeof option === \"string\" ? { label: option, value: option } : option,\n );\n const locked = disabled || status !== \"idle\" || !onSubmit;\n return (\n <form\n className={`chat-prebuilt chat-question ${className}`}\n aria-labelledby={`${id}-prompt`}\n onSubmit={async (event) => {\n event.preventDefault();\n if (locked || submitting.current || (!selected.length && !text.trim()))\n return;\n submitting.current = true;\n setStatus(\"sending\");\n setError(undefined);\n try {\n await onSubmit?.({\n values: selected,\n ...(text.trim() ? { text: text.trim() } : {}),\n });\n setStatus(\"sent\");\n } catch (cause) {\n setError(\n cause instanceof Error\n ? cause.message\n : \"Could not send your answer. Try again.\",\n );\n setStatus(\"idle\");\n } finally {\n submitting.current = false;\n }\n }}\n >\n <div className=\"chat-question-eyebrow\">Your input</div>\n <h3 id={`${id}-prompt`}>{prompt}</h3>\n {description ? (\n <p className=\"chat-question-description\">{description}</p>\n ) : null}\n <fieldset disabled={locked}>\n <legend className=\"chat-sr-only\">\n {multiple ? \"Select one or more options\" : \"Select an option\"}\n </legend>\n {choices.map((option, index) => (\n <label\n className=\"chat-question-option\"\n data-selected={selected.includes(option.value)}\n key={`${option.value}-${index}`}\n >\n <input\n type={multiple ? \"checkbox\" : \"radio\"}\n name={id}\n value={option.value}\n checked={selected.includes(option.value)}\n onChange={() =>\n setSelected((current) =>\n multiple\n ? current.includes(option.value)\n ? current.filter((value) => value !== option.value)\n : [...current, option.value]\n : [option.value],\n )\n }\n />\n <span>\n <span className=\"chat-question-option-title\">\n {option.label}\n {option.recommended ? <small>Recommended</small> : null}\n </span>\n {option.description ? (\n <span className=\"chat-question-option-description\">\n {option.description}\n </span>\n ) : null}\n </span>\n </label>\n ))}\n {allowCustom || !choices.length ? (\n <label className=\"chat-question-custom\">\n {choices.length ? \"Additional context\" : \"Your answer\"}\n <textarea\n rows={2}\n value={text}\n onChange={(event) => setText(event.target.value)}\n placeholder=\"Type your answer…\"\n />\n </label>\n ) : null}\n </fieldset>\n <footer>\n <span role=\"status\">\n {status === \"sent\"\n ? \"Answer sent\"\n : status === \"sending\"\n ? \"Sending…\"\n : multiple\n ? \"Choose one or more\"\n : choices.length ? \"Choose and confirm\" : \"Write and confirm\"}\n </span>\n <button\n type=\"submit\"\n disabled={locked || (!selected.length && !text.trim())}\n >\n {status === \"sent\" ? (\n <Check size={14} aria-hidden=\"true\" />\n ) : (\n <ArrowUp size={14} aria-hidden=\"true\" />\n )}\n {status === \"sent\" ? \"Submitted\" : \"Confirm\"}\n </button>\n </footer>\n {error ? (\n <p className=\"chat-widget-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </form>\n );\n}\n","\"use client\";\nimport type {\n ChatWidgetRegistry,\n WidgetComponentProps,\n} from \"../components/Widget/widget.context\";\nimport { parseArtifact, parseSubagent } from \"@sarchauhan/protocol\";\nimport { ArtifactWidget, ArtifactsWidget } from \"./artifact\";\nimport { SubagentWidget } from \"./subagent\";\nimport { normalizeSearchResults } from \"./compute\";\nimport { PatchWidget } from \"./patch\";\nimport { QuestionWidget } from \"./question\";\nimport { ReadFileWidget } from \"./read-file\";\nimport { SearchWidget } from \"./search\";\nimport type { QuestionOption, ToolWidgetProps } from \"./types\";\nconst str = (value: unknown, fallback = \"\") =>\n typeof value === \"string\" ? value : fallback;\nconst num = (value: unknown) =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\nconst common = (props: Record<string, unknown>): ToolWidgetProps => ({\n state:\n props.state === \"running\" ||\n props.state === \"error\" ||\n props.state === \"denied\" ||\n props.state === \"approval\"\n ? props.state\n : \"complete\",\n error: typeof props.error === \"string\" ? props.error : undefined,\n});\nfunction Read(props: WidgetComponentProps) {\n return (\n <ReadFileWidget\n {...common(props)}\n path={str(props.path, \"File\")}\n content={typeof props.content === \"string\" ? props.content : undefined}\n startLine={num(props.startLine)}\n language={str(props.language)}\n />\n );\n}\nfunction Patch(props: WidgetComponentProps) {\n return (\n <PatchWidget\n {...common(props)}\n path={str(props.path, \"File changes\")}\n diff={typeof props.diff === \"string\" ? props.diff : undefined}\n before={typeof props.before === \"string\" ? props.before : undefined}\n after={typeof props.after === \"string\" ? props.after : undefined}\n />\n );\n}\nfunction Search(props: WidgetComponentProps) {\n return (\n <SearchWidget\n {...common(props)}\n query={str(props.query)}\n results={normalizeSearchResults(props.results)}\n total={num(props.total)}\n />\n );\n}\nfunction Question(props: WidgetComponentProps) {\n const options: QuestionOption[] = Array.isArray(props.options)\n ? props.options.flatMap((item) => {\n if (typeof item === \"string\") return [{ label: item, value: item }];\n if (\n !item ||\n typeof item !== \"object\" ||\n typeof item.label !== \"string\" ||\n typeof item.value !== \"string\"\n )\n return [];\n return [\n {\n label: item.label,\n value: item.value,\n description: str(item.description),\n recommended: item.recommended === true,\n },\n ];\n })\n : [];\n return (\n <QuestionWidget\n prompt={str(props.prompt, \"Your answer\")}\n description={str(props.description)}\n options={options}\n multiple={props.multiple === true}\n allowCustom={props.allowCustom === true}\n disabled={!props.widget.interactive || props.widget.disabled}\n onSubmit={async (answer) => {\n const labels = answer.values.map(\n (value) =>\n options.find((option) => option.value === value)?.label ?? value,\n );\n await props.widget.respond(\n answer,\n [...labels, answer.text].filter(Boolean).join(\", \"),\n \"answer\",\n );\n }}\n />\n );\n}\nfunction Artifact(props: WidgetComponentProps) {\n const artifact = parseArtifact(props.artifact ?? props);\n return artifact ? <ArtifactWidget artifact={artifact} /> : <p className=\"chat-widget-empty\">File details are unavailable.</p>;\n}\nfunction Artifacts(props: WidgetComponentProps) {\n const artifacts = Array.isArray(props.artifacts) ? props.artifacts.flatMap((value) => {\n const artifact = parseArtifact(value); return artifact ? [artifact] : [];\n }) : [];\n return <ArtifactsWidget artifacts={artifacts} />;\n}\nfunction Subagent(props: WidgetComponentProps) {\n const subagent = parseSubagent(props.subagent ?? props);\n return subagent ? <SubagentWidget subagent={subagent} /> : <p className=\"chat-widget-empty\">Agent details are unavailable.</p>;\n}\n/** Defaults are always available; a host registry can override any name. */\nexport const prebuiltWidgets: ChatWidgetRegistry = {\n artifact: { name: \"artifact\", component: Artifact, shell: false },\n artifacts: { name: \"artifacts\", component: Artifacts, shell: false },\n subagent: { name: \"subagent\", component: Subagent, shell: false },\n \"read-file\": { name: \"read-file\", component: Read, shell: false },\n patch: { name: \"patch\", component: Patch, shell: false },\n search: { name: \"search\", component: Search, shell: false },\n question: { name: \"question\", component: Question, shell: false },\n};\n","\"use client\";\nimport { useState } from \"react\";\nimport { Download, FileText, Image as ImageIcon, ExternalLink } from \"lucide-react\";\nimport type { AgentArtifact } from \"@sarchauhan/protocol\";\nimport { ResponsiveDetail } from \"./responsive-detail\";\n\nexport type ArtifactWidgetProps = { artifact: AgentArtifact; className?: string };\nexport type ArtifactsWidgetProps = { artifacts: AgentArtifact[]; className?: string };\n/** Same-origin relative URLs, HTTP(S), blob URLs, and raster-image data URLs only. */\nexport function safeArtifactUrl(value?: string, image = false): string | undefined {\n if (!value || /[\\u0000-\\u0020\\u007f]/.test(value)) return undefined;\n if (/^blob:/i.test(value)) {\n try { new URL(value); return value; } catch { return undefined; }\n }\n if (image && /^data:image\\/(?:png|jpeg|gif|webp|avif);base64,[a-z0-9+/=]+$/i.test(value)) return value;\n try {\n const parsed = new URL(value, \"https://chat.invalid\");\n if (![\"https:\", \"http:\"].includes(parsed.protocol)) return undefined;\n return value;\n } catch { return undefined; }\n}\nexport function formatArtifactSize(bytes?: number): string | undefined {\n if (bytes === undefined || !Number.isFinite(bytes) || bytes < 0) return undefined;\n if (bytes < 1024) return bytes + \" B\";\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\n}\nexport function ArtifactWidget({ artifact, className = \"\" }: ArtifactWidgetProps) {\n const { filename, mediaType, content, sizeBytes, error } = artifact;\n const state = artifact.status ?? \"ready\";\n const image = mediaType.startsWith(\"image/\");\n const [failedUrl, setFailedUrl] = useState<string>();\n const previewUrl = image ? safeArtifactUrl(artifact.url, true) : undefined;\n const link = safeArtifactUrl(artifact.url, image);\n const ready = state === \"ready\";\n const preview = ready && ((previewUrl && failedUrl !== previewUrl) || content !== undefined);\n const Icon = image ? ImageIcon : FileText;\n const label = state === \"creating\" ? \"Creating…\" : state === \"error\" ? \"Could not create file\" : \"Created\";\n const metadata = [mediaType, formatArtifactSize(sizeBytes)].filter(Boolean).join(\" · \");\n return <section className={\"chat-prebuilt chat-artifact \" + className} aria-label={\"Artifact: \" + filename} data-state={state}>\n {ready && previewUrl && failedUrl !== previewUrl ? <div className=\"chat-artifact-thumbnail\">\n <img src={previewUrl} alt={filename} loading=\"lazy\" onError={() => setFailedUrl(previewUrl)} />\n </div> : null}\n <div className=\"chat-artifact-row\">\n <span className=\"chat-artifact-icon\"><Icon size={20} aria-hidden=\"true\" /></span>\n <div className=\"chat-artifact-heading\"><strong title={filename}>{filename}</strong><span>{metadata}</span></div>\n <span className=\"chat-artifact-state\" role=\"status\">{label}</span>\n </div>\n {state === \"error\" && error ? <p className=\"chat-widget-error\" role=\"alert\">{error}</p> : null}\n {ready && image && previewUrl && failedUrl === previewUrl ? <p className=\"chat-widget-empty\">Image preview unavailable.</p> : null}\n {ready && (preview || link) ? <footer className=\"chat-artifact-actions\">\n {preview ? <ResponsiveDetail title={filename} description={metadata} trigger={<button type=\"button\">Preview</button>}>\n {image && previewUrl && failedUrl !== previewUrl\n ? <img className=\"chat-artifact-full-image\" src={previewUrl} alt={filename} onError={() => setFailedUrl(previewUrl)} />\n : <pre className=\"chat-artifact-text\" tabIndex={0}>{content}</pre>}\n </ResponsiveDetail> : null}\n {link ? <>\n <a href={link} target=\"_blank\" rel=\"noreferrer\"><ExternalLink size={14} aria-hidden=\"true\" />Open</a>\n <a href={link} download={filename} target=\"_blank\" rel=\"noreferrer\"><Download size={14} aria-hidden=\"true\" />Download</a>\n </> : null}\n </footer> : null}\n </section>;\n}\nexport function ArtifactsWidget({ artifacts, className = \"\" }: ArtifactsWidgetProps) {\n return <div className={\"chat-artifacts \" + className}>{artifacts.map((artifact) => <ArtifactWidget key={artifact.id} artifact={artifact} />)}</div>;\n}\n","\"use client\";\nimport { useRef, useState, type CSSProperties, type ReactElement, type ReactNode } from \"react\";\nimport { Dialog } from \"radix-ui\";\nimport { X } from \"lucide-react\";\n\nexport type ResponsiveDetailProps = {\n title: string;\n description?: string;\n trigger: ReactElement;\n children: ReactNode;\n};\n/** One accessible dialog; CSS changes its presentation to a bottom sheet below 640px. */\nexport function ResponsiveDetail({ title, description = \"Details from this conversation\", trigger, children }: ResponsiveDetailProps) {\n const origin = useRef<HTMLDivElement>(null);\n const [presentation, setPresentation] = useState<{ theme: string; style: CSSProperties }>({ theme: \"light\", style: {} });\n return <div ref={origin} className=\"chat-detail-origin\">\n <Dialog.Root onOpenChange={(open) => {\n if (!open || !origin.current) return;\n const host = origin.current.closest(\".chat-root\") ?? origin.current;\n const computed = window.getComputedStyle(host);\n const tokens: Record<string, string> = {};\n for (let index = 0; index < computed.length; index++) {\n const name = computed.item(index);\n if (name.startsWith(\"--chat-\")) tokens[name] = computed.getPropertyValue(name);\n }\n const requested = host.getAttribute(\"data-theme\");\n const dark = requested === \"dark\" || (requested === \"system\" && window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches);\n setPresentation({ theme: dark ? \"dark\" : \"light\", style: tokens as CSSProperties });\n }}>\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n <Dialog.Portal>\n <Dialog.Overlay className=\"chat-detail-overlay\" />\n <Dialog.Content className=\"chat-root chat-detail-panel\" data-theme={presentation.theme} style={presentation.style}>\n <div className=\"chat-detail-handle\" aria-hidden=\"true\" />\n <header className=\"chat-detail-header\">\n <div><Dialog.Title className=\"chat-detail-title\">{title}</Dialog.Title>\n <Dialog.Description className=\"chat-detail-description\">{description}</Dialog.Description></div>\n <Dialog.Close className=\"chat-detail-close\" aria-label=\"Close details\"><X size={18} aria-hidden=\"true\" /></Dialog.Close>\n </header>\n <div className=\"chat-detail-body\">{children}</div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </div>;\n}\n","\"use client\";\nimport { createContext, useContext } from \"react\";\nimport { ArrowUpRight, CircleCheck, CircleX, LoaderCircle, Bot } from \"lucide-react\";\nimport type { AgentSubagent } from \"@sarchauhan/protocol\";\nimport { MessageContent } from \"../components/Message/message.content\";\nimport { ArtifactsWidget } from \"./artifact\";\nimport { ResponsiveDetail } from \"./responsive-detail\";\n\nexport type SubagentWidgetProps = { subagent: AgentSubagent; className?: string };\nconst Depth = createContext(0);\nconst labels = { queued: \"Queued\", running: \"Working\", completed: \"Completed\", failed: \"Failed\", cancelled: \"Cancelled\" };\n\nexport function SubagentWidget({ subagent, className = \"\" }: SubagentWidgetProps) {\n const depth = useContext(Depth);\n const { title, task, state, summary, progress, messages = [], artifacts = [], error } = subagent;\n const Icon = state === \"completed\" ? CircleCheck : state === \"failed\" ? CircleX : state === \"running\" ? LoaderCircle : Bot;\n const canInspect = depth < 3;\n const transcript = messages.filter((message) => message.role !== \"system\");\n return <section className={\"chat-prebuilt chat-subagent \" + className} data-state={state} aria-label={\"Subagent: \" + title}>\n <div className=\"chat-subagent-heading\"><span className=\"chat-subagent-icon\"><Icon size={18} aria-hidden=\"true\" /></span>\n <div><strong>{title}</strong><span className=\"chat-subagent-state\" role=\"status\">{labels[state]}</span></div>\n {canInspect ? <ResponsiveDetail title={title} description={task || \"Subagent activity in this conversation\"}\n trigger={<button className=\"chat-subagent-inspect\" type=\"button\" aria-label={\"View activity for \" + title}>View activity<ArrowUpRight size={14} aria-hidden=\"true\" /></button>}>\n <Depth.Provider value={depth + 1}>\n <div className=\"chat-subagent-overview\"><span className=\"chat-subagent-state\">{labels[state]}</span>\n {progress !== undefined ? <span>{Math.round(progress * 100)}%</span> : null}</div>\n {summary ? <p className=\"chat-subagent-summary\">{summary}</p> : null}\n {error ? <p className=\"chat-widget-error\" role=\"alert\">{error}</p> : null}\n {transcript.length ? <div className=\"chat-subagent-transcript\">{transcript.map((message) => <article className=\"chat-subagent-message\" key={message.id}>\n <div className=\"chat-subagent-role\">{message.role === \"user\" ? \"Task\" : title}</div>\n <MessageContent parts={message.parts} isUser={message.role === \"user\"} />\n </article>)}</div> : <p className=\"chat-widget-empty\">{state === \"queued\" ? \"Waiting to start.\" : state === \"running\" ? \"Activity will appear as the agent works.\" : \"No activity was recorded.\"}</p>}\n {artifacts.length ? <div className=\"chat-subagent-artifacts\"><h4>Created files</h4><ArtifactsWidget artifacts={artifacts} /></div> : null}\n </Depth.Provider>\n </ResponsiveDetail> : null}\n </div>\n {task ? <p className=\"chat-subagent-task\">{task}</p> : null}\n {summary ? <p className=\"chat-subagent-summary\">{summary}</p> : null}\n {state === \"running\" && progress !== undefined ? <progress className=\"chat-subagent-progress\" value={progress} max={1} aria-label={\"Progress for \" + title} /> : null}\n {state === \"failed\" && error ? <p className=\"chat-widget-error\" role=\"alert\">{error}</p> : null}\n </section>;\n}\n","\"use client\";\n\nimport {\n normalizeAgentParts,\n parseArtifact,\n parseSubagent,\n type AgentDataPart,\n type AgentFilePart,\n type AgentPart,\n type AgentReasoningPart,\n type AgentSourceDocumentPart,\n type AgentSourceUrlPart,\n type AgentToolPart,\n type AgentWidgetPart,\n type AgentWidgetProps,\n} from \"@sarchauhan/protocol\";\nimport { ChevronDown } from \"lucide-react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { splitThinkingSegments } from \"../../lib/message/segment\";\nimport { parseUserReferenceMessage } from \"../../lib/message/user\";\nimport { cn } from \"../../lib/utils\";\nimport {\n TextSwap,\n calibrateCheckPath,\n motion,\n triggerErrorShake,\n type IconSwapState,\n type SuccessCheckState,\n} from \"../../motion\";\nimport { ArtifactWidget } from \"../../widgets/artifact\";\nimport { computeToolWidget } from \"../../widgets/compute\";\nimport { prebuiltWidgets } from \"../../widgets/registry\";\nimport { useWidgets } from \"../Widget/widget.context\";\nimport { TextSkeleton } from \"./message.skeleton\";\nimport { WidgetRenderer } from \"../Widget/widget.renderer\";\nimport { MarkdownContent } from \"./message.markdown\";\nimport { ThinkingBlock } from \"./message.thinking\";\n\ntype MessageContentProps = {\n parts: Array<{ type: string; [key: string]: unknown }>;\n isUser?: boolean;\n};\n\nconst isPropsRecord = (value: unknown): value is AgentWidgetProps =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst formatJson = (value: unknown) => {\n if (typeof value === \"string\") {\n return value;\n }\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst toolDetail = (part: AgentToolPart) => {\n const source = part.output ?? part.input;\n\n if (!isPropsRecord(source)) {\n return null;\n }\n\n const value = source.path ?? source.file ?? source.filename ?? source.query ?? source.command ?? source.url;\n\n return typeof value === \"string\" && value.trim() ? value : null;\n};\n\nconst toolStateLabel = (state: AgentToolPart[\"state\"]) => {\n switch (state) {\n case \"input-streaming\":\n return \"Preparing\";\n case \"input-available\":\n return \"Ready\";\n case \"approval-requested\":\n return \"Needs approval\";\n case \"approval-responded\":\n return \"Approval sent\";\n case \"output-available\":\n return \"Done\";\n case \"output-error\":\n return \"Error\";\n case \"output-denied\":\n return \"Denied\";\n default:\n return state;\n }\n};\n\nconst ReasoningBlock = ({ part }: { part: AgentReasoningPart }) => {\n const isComplete = part.state !== \"streaming\";\n\n return (\n <ThinkingBlock isComplete={isComplete}>\n {!!part.text.trim() && (\n <div className=\"md-thinking-body\">\n <MarkdownContent>{part.text}</MarkdownContent>\n </div>\n )}\n </ThinkingBlock>\n );\n};\n\nconst ToolStatusIcon = ({\n isPending,\n isDone,\n}: {\n isPending: boolean;\n isDone: boolean;\n}) => {\n const pathRef = useRef<SVGPathElement>(null);\n const [sawPending, setSawPending] = useState(isPending);\n const iconState: IconSwapState = isPending ? \"a\" : \"b\";\n const playCheck = Boolean(sawPending && isDone);\n const checkState: SuccessCheckState = playCheck ? \"in\" : \"out\";\n\n if (isPending && !sawPending) {\n setSawPending(true);\n }\n\n useLayoutEffect(() => {\n if (pathRef.current) {\n calibrateCheckPath(pathRef.current);\n }\n }, [playCheck]);\n\n return (\n <span className=\"agent-tool-dot\" aria-hidden=\"true\">\n <span className={motion.iconSwap} data-state={iconState}>\n <span className={motion.icon} data-icon=\"a\">\n <span className=\"agent-tool-spinner\" />\n </span>\n <span className={motion.icon} data-icon=\"b\">\n {isDone ? (\n playCheck ? (\n <span className={motion.successCheck} data-state={checkState}>\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\">\n <path\n ref={pathRef}\n d=\"M2.5 6.5 5 9l4.5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n ) : (\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\">\n <path\n d=\"M2.5 6.5 5 9l4.5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n ) : (\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\">\n <path\n d=\"M3.2 3.2 8.8 8.8M8.8 3.2 3.2 8.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </span>\n </span>\n </span>\n );\n};\n\nconst ToolBlock = ({ part }: { part: AgentToolPart }) => {\n const wrapRef = useRef<HTMLDetailsElement>(null);\n const isPending =\n part.state === \"input-streaming\" ||\n part.state === \"input-available\" ||\n part.state === \"approval-requested\";\n const isError = part.state === \"output-error\" || part.state === \"output-denied\";\n const isDone = !isPending && !isError;\n const detail = toolDetail(part);\n\n useEffect(() => {\n if (!isError || !wrapRef.current) {\n return;\n }\n\n triggerErrorShake(wrapRef.current, { revert: false });\n }, [isError]);\n\n return (\n <details\n ref={wrapRef}\n className={cn(\n \"agent-tool\",\n motion.inputWrap,\n isPending ? \"agent-tool-pending\" : isError ? \"agent-tool-error\" : \"agent-tool-complete\",\n )}\n open={isPending || isError}\n >\n <summary className={cn(motion.input, isError && motion.isError)}>\n <ChevronDown className=\"agent-tool-chevron\" aria-hidden=\"true\" />\n <ToolStatusIcon isPending={isPending} isDone={isDone} />\n <span className=\"agent-tool-name\">{part.title ?? part.toolName}</span>\n {detail ? <span className=\"agent-tool-chip\">{detail}</span> : null}\n <TextSwap className=\"agent-tool-state\" text={toolStateLabel(part.state)} />\n </summary>\n <div className=\"agent-tool-body\">\n {part.input !== undefined && (\n <div className=\"agent-tool-section\">\n <div className=\"agent-tool-section-label\">Input</div>\n <pre className=\"agent-tool-code\">{formatJson(part.input)}</pre>\n </div>\n )}\n {part.output !== undefined && (\n <div className=\"agent-tool-section\">\n <div className=\"agent-tool-section-label\">Output</div>\n <pre className=\"agent-tool-code\">{formatJson(part.output)}</pre>\n </div>\n )}\n {part.errorText && (\n <div className=\"agent-tool-section\">\n <div className=\"agent-tool-section-label\">Error</div>\n <pre className=\"agent-tool-code agent-tool-error\">{part.errorText}</pre>\n </div>\n )}\n </div>\n </details>\n );\n};\n\nconst SourceUrlBlock = ({ part }: { part: AgentSourceUrlPart }) => (\n <a className=\"agent-source\" href={part.url} target=\"_blank\" rel=\"noreferrer\">\n <span className=\"agent-source-label\">Source</span>\n <span className=\"agent-source-title\">{part.title || part.url}</span>\n </a>\n);\n\nconst SourceDocumentBlock = ({ part }: { part: AgentSourceDocumentPart }) => (\n <div className=\"agent-source agent-source-document\">\n <span className=\"agent-source-label\">Document</span>\n <span className=\"agent-source-title\">{part.title}</span>\n {part.filename && <span className=\"agent-source-meta\">{part.filename}</span>}\n </div>\n);\n\nconst FileBlock = ({ part }: { part: AgentFilePart }) => (\n <ArtifactWidget artifact={{\n id: part.url, filename: part.filename || (part.mediaType.startsWith(\"image/\") ? \"Generated image\" : \"Generated file\"),\n mediaType: part.mediaType, url: part.url, status: \"ready\",\n }} />\n);\n\nconst AgentEventBlock = ({ part }: { part: AgentDataPart }) => (\n <details className=\"agent-tool agent-event\">\n <summary>\n <span className=\"agent-event-marker\" aria-hidden=\"true\" />\n <span className=\"agent-tool-name\">data.{part.name}</span>\n </summary>\n <div className=\"agent-tool-body\">\n <pre className=\"agent-tool-code\">{formatJson(part.data)}</pre>\n </div>\n </details>\n);\n\nconst TextWithLegacyThinking = ({ text, isUser }: { text: string; isUser: boolean }) => {\n const userReferenceMessage = isUser ? parseUserReferenceMessage(text) : null;\n const content = userReferenceMessage?.message ?? text;\n const segments = splitThinkingSegments(content);\n\n return (\n <>\n {userReferenceMessage && (\n <div className=\"chat-user-reference\">\n {userReferenceMessage.references.map((reference, index) => (\n <div\n key={`${index}-${reference.slice(0, 16)}`}\n className=\"chat-user-reference-item\"\n >\n <div className=\"chat-reference-label\">\n Reference {index + 1}\n </div>\n <div className=\"chat-reference-text\">{reference}</div>\n </div>\n ))}\n </div>\n )}\n {segments.map((segment, index) => {\n if (!segment.content.trim() && segment.type !== \"thinking\") {\n return null;\n }\n\n if (segment.type === \"thinking\" && !isUser) {\n const isComplete = segment.isComplete ?? true;\n\n return (\n <ThinkingBlock key={`thinking-${index}`} isComplete={isComplete}>\n {!!segment.content.trim() && (\n <div className=\"md-thinking-body\">\n <MarkdownContent>{segment.content}</MarkdownContent>\n </div>\n )}\n </ThinkingBlock>\n );\n }\n\n return <MarkdownContent key={`md-${index}`}>{segment.content}</MarkdownContent>;\n })}\n </>\n );\n};\n\nconst asWidgetFromTool = (part: AgentToolPart): AgentWidgetPart | null => {\n const source =\n part.state === \"output-available\" && part.output !== undefined\n ? part.output\n : part.input;\n\n if (!isPropsRecord(source)) {\n return null;\n }\n\n return {\n type: \"widget\",\n name: part.toolName,\n id: part.toolCallId,\n props: source,\n interactive: part.toolName === \"question\" || source.interactive === true,\n };\n};\n\nconst asWidgetFromData = (part: AgentDataPart): AgentWidgetPart => ({\n type: \"widget\",\n name: part.name,\n id: part.id,\n props: isPropsRecord(part.data) ? part.data : { value: part.data },\n interactive: isPropsRecord(part.data) ? part.data.interactive === true : false,\n});\n\nconst PartView = ({ part, index, isUser }: { part: AgentPart; index: number; isUser: boolean }) => {\n const { widgets } = useWidgets();\n\n if (part.type === \"widget\") {\n return isUser ? null : <WidgetRenderer key={`widget-${part.id || index}`} part={part} />;\n }\n\n if (part.type === \"tool\" && !isUser) {\n const entry = widgets[part.toolName];\n const isCustom = entry && entry !== prebuiltWidgets[part.toolName];\n const widgetPart = isCustom ? asWidgetFromTool(part) : computeToolWidget(part);\n if (widgetPart) {\n return (\n <WidgetRenderer\n key={`tool-widget-${part.toolCallId || index}`}\n part={widgetPart}\n pending={part.state === \"input-streaming\"}\n />\n );\n }\n }\n\n if (part.type === \"data\" && !isUser && widgets[part.name]) {\n // Malformed builtin snapshots retain the generic data view. Host overrides remain unrestricted.\n const builtin = widgets[part.name] === prebuiltWidgets[part.name];\n if (builtin && ((part.name === \"artifact\" && !parseArtifact(part.data)) ||\n (part.name === \"subagent\" && !parseSubagent(part.data)))) return <AgentEventBlock part={part} />;\n return (\n <WidgetRenderer\n key={`data-widget-${part.name}-${part.id || index}`}\n part={asWidgetFromData(part)}\n />\n );\n }\n\n switch (part.type) {\n case \"text\":\n if (!isUser && part.state === \"streaming\" && part.text.trim().length === 0) {\n return <TextSkeleton key={`text-${index}`} />;\n }\n return <TextWithLegacyThinking key={`text-${index}`} text={part.text} isUser={isUser} />;\n case \"reasoning\":\n return isUser ? null : <ReasoningBlock key={`reasoning-${index}`} part={part} />;\n case \"tool\":\n return isUser ? null : <ToolBlock key={`tool-${part.toolCallId || index}`} part={part} />;\n case \"source-url\":\n return <SourceUrlBlock key={`source-url-${part.sourceId || index}`} part={part} />;\n case \"source-document\":\n return <SourceDocumentBlock key={`source-doc-${part.sourceId || index}`} part={part} />;\n case \"file\":\n return <FileBlock key={`file-${index}`} part={part} />;\n case \"data\":\n if (part.name === \"usage\" || part.name === \"context\" || part.name === \"context-warning\") {\n return null;\n }\n return <AgentEventBlock key={`data-${part.name}-${part.id || index}`} part={part} />;\n case \"unknown\":\n return (\n <details key={`unknown-${index}`} className=\"agent-tool agent-event\">\n <summary>\n <span className=\"agent-event-marker\" aria-hidden=\"true\" />\n <span className=\"agent-tool-name\">{part.rawType}</span>\n </summary>\n <div className=\"agent-tool-body\">\n <pre className=\"agent-tool-code\">{formatJson(part.raw)}</pre>\n </div>\n </details>\n );\n default:\n return null;\n }\n};\n\nexport const MessageContent = ({ parts, isUser = false }: MessageContentProps) => {\n const agentParts = normalizeAgentParts(parts);\n\n return (\n <div\n className={cn(\n \"chat-message-content break-words\",\n isUser ? \"md-content-user\" : \"md-content-assistant\",\n )}\n >\n {agentParts.map((part, index) => (\n <PartView key={`${part.type}-${index}`} part={part} index={index} isUser={isUser} />\n ))}\n </div>\n );\n};\n","\nexport type ContentSegment = {\n type: \"markdown\" | \"thinking\";\n content: string;\n isComplete?: boolean;\n};\n\n/**\n * Split thinking segments of the AI message. \n * @param content \n * @returns \n */\nexport const splitThinkingSegments = (content: string): ContentSegment[] => {\n const segments: ContentSegment[] = [];\n let cursor = 0;\n\n while (cursor < content.length) {\n const openingIndex = content.indexOf(\"<thinking>\", cursor);\n\n if (openingIndex === -1) {\n segments.push({\n type: \"markdown\",\n content: content.slice(cursor),\n });\n break;\n }\n\n if (openingIndex > cursor) {\n segments.push({\n type: \"markdown\",\n content: content.slice(cursor, openingIndex),\n });\n }\n\n const thinkingStart = openingIndex + \"<thinking>\".length;\n const closingIndex = content.indexOf(\"</thinking>\", thinkingStart);\n\n if (closingIndex === -1) {\n segments.push({\n type: \"thinking\",\n content: content.slice(thinkingStart).trim(),\n isComplete: false,\n });\n break;\n }\n\n segments.push({\n type: \"thinking\",\n content: content.slice(thinkingStart, closingIndex).trim(),\n isComplete: true,\n });\n cursor = closingIndex + \"</thinking>\".length;\n }\n\n if (!segments.length) {\n return [{ type: \"markdown\", content }];\n }\n\n return segments;\n};\n","import type { ChatMessage } from \"../../types\";\n\nexport type UserReferenceMessage = {\n references: string[];\n message: string;\n};\n\nexport const REFERENCE_PREFIX = \"Use the following selected references as context:\\n\\n\";\nexport const USER_MESSAGE_MARKER = \"\\n\\nUser message:\\n\";\nconst REFERENCE_PATTERN = /<reference \\d+>\\n([\\s\\S]*?)\\n<\\/reference \\d+>/g;\n\nexport const getMessageTextContent = (message: ChatMessage) =>\n message.parts\n .filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n\nexport const parseUserReferenceMessage = (content: string): UserReferenceMessage | null => {\n if (!content.startsWith(REFERENCE_PREFIX)) {\n return null;\n }\n\n const markerIndex = content.indexOf(USER_MESSAGE_MARKER);\n\n if (markerIndex === -1) {\n return null;\n }\n\n const references = [...content.slice(REFERENCE_PREFIX.length, markerIndex).matchAll(REFERENCE_PATTERN)]\n .map((match) => match[1].trim())\n .filter(Boolean);\n\n return references.length\n ? { references, message: content.slice(markerIndex + USER_MESSAGE_MARKER.length) }\n : null;\n};\n\nexport const getUserDisplayText = (message: ChatMessage) => {\n const text = getMessageTextContent(message);\n return parseUserReferenceMessage(text)?.message ?? text;\n};\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Public motion class names and data-attribute hooks from the\n * transitions.dev recipes packaged with `@sarchauhan/chat`.\n *\n * Consumers should import these constants instead of hard-coding\n * `t-*` strings so class names stay autocomplete-safe and typechecked.\n */\n\nexport const motion = {\n textSwap: \"t-text-swap\",\n isExit: \"is-exit\",\n isEnterStart: \"is-enter-start\",\n iconSwap: \"t-icon-swap\",\n icon: \"t-icon\",\n successCheck: \"t-success-check\",\n dropdown: \"t-dropdown\",\n isOpen: \"is-open\",\n isClosing: \"is-closing\",\n inputWrap: \"t-input-wrap\",\n input: \"t-input\",\n errorMsg: \"t-error-msg\",\n isError: \"is-error\",\n isShaking: \"is-shaking\",\n} as const;\n\nexport type MotionClass = (typeof motion)[keyof typeof motion];\n\nexport const iconSwapStates = [\"a\", \"b\"] as const;\nexport type IconSwapState = (typeof iconSwapStates)[number];\n\nexport const successCheckStates = [\"out\", \"in\"] as const;\nexport type SuccessCheckState = (typeof successCheckStates)[number];\n\nexport const dropdownOrigins = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n] as const;\nexport type DropdownOrigin = (typeof dropdownOrigins)[number];\n\nexport const motionData = {\n state: \"data-state\",\n icon: \"data-icon\",\n origin: \"data-origin\",\n open: \"data-open\",\n} as const;\n\nexport type MotionDataAttr = (typeof motionData)[keyof typeof motionData];\n\nexport const textSwapPhases = [\"rest\", \"exit\", \"enter-start\"] as const;\nexport type TextSwapPhase = (typeof textSwapPhases)[number];\n\nexport const dropdownPhases = [\"rest\", \"open\", \"closing\"] as const;\nexport type DropdownPhase = (typeof dropdownPhases)[number];\n","import { motion } from \"./classes\";\n\nconst CHAT_ROOT = \".chat-root\";\n\nexport const prefersReducedMotion = () =>\n typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nexport const motionRoot = (node?: Element | null) =>\n node?.closest(CHAT_ROOT) ?? (typeof document !== \"undefined\" ? document.querySelector(CHAT_ROOT) : null);\n\nconst readRaw = (name: string, node?: Element | null) => {\n const root = motionRoot(node);\n if (!root) {\n return \"\";\n }\n\n return getComputedStyle(root).getPropertyValue(name);\n};\n\n/** Read a duration custom property (ms) from `.chat-root`, with a numeric fallback. */\nexport const readDurationMs = (name: string, fallback: number, node?: Element | null) => {\n const value = parseFloat(readRaw(name, node));\n return Number.isFinite(value) ? value : fallback;\n};\n\nconst revertTimers = new WeakMap<HTMLElement, number>();\nconst shakeTimers = new WeakMap<HTMLElement, number>();\n\nexport type SwapTextOptions = {\n onSwap?: () => void;\n};\n\n/**\n * Three-phase text swap from transitions.dev (04-text-states-swap):\n * exit → swap content → enter-start (no transition) → rest.\n */\nexport const swapText = (el: HTMLElement, next: string, options?: SwapTextOptions) => {\n if (prefersReducedMotion()) {\n el.textContent = next;\n options?.onSwap?.();\n return;\n }\n\n const dur = readDurationMs(\"--text-swap-dur\", 200, el);\n el.classList.add(motion.isExit);\n\n return window.setTimeout(() => {\n el.classList.remove(motion.isExit);\n el.classList.add(motion.isEnterStart);\n el.textContent = next;\n options?.onSwap?.();\n void el.offsetHeight;\n el.classList.remove(motion.isEnterStart);\n }, dur);\n};\n\nexport const openDropdown = (el: HTMLElement) => {\n el.classList.remove(motion.isClosing);\n el.classList.add(motion.isOpen);\n};\n\nexport const closeDropdown = (el: HTMLElement, onClosed?: () => void) => {\n el.classList.remove(motion.isOpen);\n el.classList.add(motion.isClosing);\n\n const closeMs = prefersReducedMotion() ? 0 : readDurationMs(\"--dropdown-close-dur\", 150, el);\n\n return window.setTimeout(() => {\n el.classList.remove(motion.isClosing);\n onClosed?.();\n }, closeMs);\n};\n\nexport type TriggerErrorShakeOptions = {\n /** Keep `.is-error` after the shake (persistent tool errors). Default: auto-revert. */\n revert?: boolean;\n};\n\n/**\n * Replay the error shake from a clean baseline (12-error-state-shake).\n * `.is-error` and `.is-shaking` stay orthogonal so the shake can restart\n * without flickering the error treatment.\n */\nexport const triggerErrorShake = (wrap: HTMLElement, options?: TriggerErrorShakeOptions) => {\n const input =\n wrap.matches(`.${motion.input}`)\n ? wrap\n : (wrap.querySelector<HTMLElement>(`.${motion.input}`) ?? wrap);\n\n wrap.classList.add(motion.isError);\n input.classList.add(motion.isError);\n\n input.classList.remove(motion.isShaking);\n void input.offsetWidth;\n input.classList.add(motion.isShaking);\n\n const existingShake = shakeTimers.get(input);\n if (existingShake) {\n window.clearTimeout(existingShake);\n }\n\n const shakeMs =\n readDurationMs(\"--shake-dur-a\", 80, wrap) * 2 + readDurationMs(\"--shake-dur-b\", 60, wrap) * 2;\n shakeTimers.set(\n input,\n window.setTimeout(() => {\n input.classList.remove(motion.isShaking);\n shakeTimers.delete(input);\n }, shakeMs + 20),\n );\n\n const existingRevert = revertTimers.get(wrap);\n if (existingRevert) {\n window.clearTimeout(existingRevert);\n revertTimers.delete(wrap);\n }\n\n if (options?.revert === false) {\n return;\n }\n\n const hold = readDurationMs(\"--revert-hold\", 3000, wrap);\n revertTimers.set(\n wrap,\n window.setTimeout(() => {\n revertTimers.delete(wrap);\n wrap.classList.remove(motion.isError);\n input.classList.remove(motion.isError);\n }, shakeMs + hold),\n );\n};\n\nexport const clearErrorShake = (wrap: HTMLElement) => {\n const input =\n wrap.matches(`.${motion.input}`)\n ? wrap\n : (wrap.querySelector<HTMLElement>(`.${motion.input}`) ?? wrap);\n\n const existingRevert = revertTimers.get(wrap);\n if (existingRevert) {\n window.clearTimeout(existingRevert);\n revertTimers.delete(wrap);\n }\n\n const existingShake = shakeTimers.get(input);\n if (existingShake) {\n window.clearTimeout(existingShake);\n shakeTimers.delete(input);\n }\n\n wrap.classList.remove(motion.isError);\n input.classList.remove(motion.isError, motion.isShaking);\n};\n\n/** Measure an SVG path and set stroke-dasharray for the success-check draw. */\nexport const calibrateCheckPath = (path: SVGPathElement) => {\n const len = Math.ceil(path.getTotalLength());\n path.style.strokeDasharray = String(len);\n path.style.strokeDashoffset = String(len);\n};\n","\"use client\";\n\nimport { useEffect, useRef, type HTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { motion } from \"./classes\";\nimport { prefersReducedMotion, readDurationMs } from \"./helpers\";\n\ntype TextSwapProps = {\n text: string;\n} & Omit<HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/**\n * Status-line text that swaps in place (transitions.dev text-states-swap).\n * React keeps the outgoing string painted until the exit phase finishes.\n */\nexport function TextSwap({ text, className, ...props }: TextSwapProps) {\n const ref = useRef<HTMLSpanElement>(null);\n const shownRef = useRef(text);\n\n useEffect(() => {\n const el = ref.current;\n if (!el || shownRef.current === text) {\n return;\n }\n\n if (prefersReducedMotion()) {\n shownRef.current = text;\n el.textContent = text;\n return;\n }\n\n const dur = readDurationMs(\"--text-swap-dur\", 200, el);\n el.classList.add(motion.isExit);\n\n const timer = window.setTimeout(() => {\n el.classList.remove(motion.isExit);\n el.classList.add(motion.isEnterStart);\n el.textContent = text;\n shownRef.current = text;\n void el.offsetHeight;\n el.classList.remove(motion.isEnterStart);\n }, dur);\n\n return () => window.clearTimeout(timer);\n }, [text]);\n\n return (\n <span ref={ref} className={cn(motion.textSwap, className)} {...props}>\n {shownRef.current}\n </span>\n );\n}\n","\"use client\";\n\nimport type { AgentWidgetPart, AgentWidgetProps } from \"@sarchauhan/protocol\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { prebuiltWidgets } from \"../../widgets/registry\";\nimport type { BaseWidgetProps } from \"./base.widget\";\n\nexport type WidgetResponse = {\n widgetId?: string;\n name: string;\n actionId?: string;\n value: unknown;\n label?: string;\n};\n\nexport type WidgetControls = {\n widgetId?: string;\n widgetName: string;\n interactive: boolean;\n disabled: boolean;\n respond: (value: unknown, label?: string, actionId?: string) => Promise<void>;\n respondWith: (response: Omit<WidgetResponse, \"widgetId\" | \"name\">) => Promise<void>;\n};\n\nexport type ChatWidgetProps<TProps extends AgentWidgetProps = AgentWidgetProps> = {\n id?: string;\n name: string;\n props: TProps;\n interactive?: boolean;\n disabled?: boolean;\n onRespond?: (response: WidgetResponse) => void | Promise<void>;\n};\n\nexport type ChatWidgetComponent<TProps extends AgentWidgetProps = AgentWidgetProps> = ComponentType<\n ChatWidgetProps<TProps>\n>;\n\nexport type WidgetComponentProps<TProps extends AgentWidgetProps = AgentWidgetProps> = TProps & {\n widget: WidgetControls;\n};\n\ntype WidgetValue<TProps extends AgentWidgetProps, TValue> =\n | TValue\n | ((props: TProps, controls: WidgetControls) => TValue);\n\nexport type ChatWidgetDefinition<TProps extends AgentWidgetProps = AgentWidgetProps> = {\n name: string;\n component: ComponentType<WidgetComponentProps<TProps>>;\n label?: WidgetValue<TProps, string>;\n title?: WidgetValue<TProps, ReactNode>;\n status?: WidgetValue<TProps, ReactNode>;\n meta?: WidgetValue<TProps, ReactNode>;\n className?: WidgetValue<TProps, string | undefined>;\n shell?: boolean;\n};\n\nexport type ChatWidgetEntry<TProps extends AgentWidgetProps = AgentWidgetProps> =\n | ChatWidgetComponent<TProps>\n | ChatWidgetDefinition<TProps>;\n\nexport type ChatWidgetRegistry = Record<string, ChatWidgetEntry>;\nexport type ChatWidgetInput = Array<ChatWidgetDefinition> | ChatWidgetRegistry;\n\nexport type DefineWidgetOptions<TProps extends AgentWidgetProps> = Pick<\n ChatWidgetDefinition<TProps>,\n \"label\" | \"title\" | \"status\" | \"meta\" | \"className\" | \"shell\"\n>;\n\nexport function defineWidget<TProps extends AgentWidgetProps>(\n name: string,\n component: ComponentType<WidgetComponentProps<TProps>>,\n options: DefineWidgetOptions<TProps> = {},\n): ChatWidgetDefinition<TProps> {\n return {\n name,\n component,\n shell: true,\n ...options,\n };\n}\n\nexport function createWidgetRegistry(widgets: ChatWidgetInput = {}): ChatWidgetRegistry {\n if (Array.isArray(widgets)) {\n return Object.fromEntries(widgets.map((widget) => [widget.name, widget]));\n }\n\n return widgets;\n}\n\nexport function readWidgetValue<TProps extends AgentWidgetProps, TValue>(\n value: WidgetValue<TProps, TValue> | undefined,\n props: TProps,\n controls: WidgetControls,\n): TValue | undefined {\n return typeof value === \"function\"\n ? (value as (props: TProps, controls: WidgetControls) => TValue)(props, controls)\n : value;\n}\n\nexport function getWidgetShellProps<TProps extends AgentWidgetProps>(\n definition: ChatWidgetDefinition<TProps>,\n props: TProps,\n controls: WidgetControls,\n): Omit<BaseWidgetProps, \"children\"> {\n const title = readWidgetValue(definition.title, props, controls);\n\n return {\n label:\n readWidgetValue(definition.label, props, controls) ??\n definition.name.replace(/[-_]/g, \" \"),\n title: title ?? definition.name,\n status: readWidgetValue(definition.status, props, controls),\n meta: readWidgetValue(definition.meta, props, controls),\n className: readWidgetValue(definition.className, props, controls),\n };\n}\n\nexport function isWidgetDefinition(\n entry: ChatWidgetEntry | null | undefined,\n): entry is ChatWidgetDefinition {\n return Boolean(entry && typeof entry === \"object\" && \"component\" in entry);\n}\n\ntype WidgetContextValue = {\n widgets: ChatWidgetRegistry;\n respondToWidget: (response: WidgetResponse) => Promise<void>;\n disabled: boolean;\n};\n\nconst WidgetContext = createContext<WidgetContextValue | null>(null);\n\ntype WidgetProviderProps = {\n widgets?: ChatWidgetInput;\n respondToWidget: (response: WidgetResponse) => Promise<void>;\n disabled?: boolean;\n children: ReactNode;\n};\n\nexport function WidgetProvider({\n widgets = {},\n respondToWidget,\n disabled = false,\n children,\n}: WidgetProviderProps) {\n const registry = useMemo(() => ({ ...prebuiltWidgets, ...createWidgetRegistry(widgets) }), [widgets]);\n const value = useMemo(\n () => ({\n widgets: registry,\n respondToWidget,\n disabled,\n }),\n [disabled, registry, respondToWidget],\n );\n\n return <WidgetContext.Provider value={value}>{children}</WidgetContext.Provider>;\n}\n\nexport function useWidgets() {\n const context = useContext(WidgetContext);\n\n if (!context) {\n return {\n widgets: prebuiltWidgets,\n respondToWidget: async () => undefined,\n disabled: true,\n };\n }\n\n return context;\n}\n\nexport function resolveWidgetPart(\n part: AgentWidgetPart,\n registry: ChatWidgetRegistry,\n): ChatWidgetEntry | null {\n return registry[part.name] ?? null;\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n skeleton = false,\n disabled,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n /** Muted, non-interactive button while its action is still loading. */\n skeleton?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n data-skeleton={skeleton ? \"true\" : undefined}\n aria-busy={skeleton ? true : undefined}\n disabled={skeleton || disabled}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\";\n\nimport { Button } from \"../../ui/button\";\n\nexport const TextSkeleton = () => (\n <div className=\"chat-text-skeleton\" role=\"status\" aria-label=\"Assistant is writing\">\n <span className=\"chat-skeleton-bar\" />\n <span className=\"chat-skeleton-bar\" />\n <span className=\"chat-skeleton-bar chat-skeleton-bar-short\" />\n </div>\n);\n\nexport const WidgetActionSkeleton = () => (\n <div className=\"chat-widget-action-skeleton\" aria-label=\"Widget actions are loading\">\n <Button skeleton size=\"sm\" variant=\"secondary\" type=\"button\" tabIndex={-1} aria-hidden=\"true\">\n Confirm\n </Button>\n <Button skeleton size=\"sm\" variant=\"outline\" type=\"button\" tabIndex={-1} aria-hidden=\"true\">\n Cancel\n </Button>\n </div>\n);\n","\"use client\";\n\nimport type { AgentWidgetPart } from \"@sarchauhan/protocol\";\nimport type { ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { WidgetActionSkeleton } from \"../Message/message.skeleton\";\nimport { BaseWidget } from \"./base.widget\";\nimport {\n getWidgetShellProps,\n isWidgetDefinition,\n resolveWidgetPart,\n useWidgets,\n type WidgetControls,\n} from \"./widget.context\";\n\nexport function WidgetRenderer({\n part,\n pending = false,\n}: {\n part: AgentWidgetPart;\n pending?: boolean;\n}) {\n const { widgets, respondToWidget, disabled } = useWidgets();\n const entry = resolveWidgetPart(part, widgets);\n const [submitted, setSubmitted] = useState(false);\n const responsePending = useRef(false);\n const widgetDisabled = disabled || submitted;\n\n const respond = async (value: unknown, label?: string, actionId?: string) => {\n if (!part.interactive || disabled || submitted || responsePending.current) {\n return;\n }\n\n responsePending.current = true;\n setSubmitted(true);\n try {\n await respondToWidget({\n widgetId: part.id,\n name: part.name,\n actionId,\n value,\n label,\n });\n } catch (error) {\n setSubmitted(false);\n throw error;\n } finally {\n responsePending.current = false;\n }\n };\n\n const controls: WidgetControls = {\n widgetId: part.id,\n widgetName: part.name,\n interactive: Boolean(part.interactive),\n disabled: widgetDisabled,\n respond,\n respondWith: async (response) => {\n await respond(response.value, response.label, response.actionId);\n },\n };\n\n const frame = (node: ReactNode) => (\n <div className=\"chat-widget\" data-pending={pending ? \"true\" : undefined}>\n {node}\n {pending ? <WidgetActionSkeleton /> : null}\n </div>\n );\n\n if (!entry) {\n return frame(\n <BaseWidget\n label=\"Unhandled widget\"\n title={part.name}\n status=\"Raw props\"\n className=\"chat-widget-missing\"\n >\n <pre className=\"agent-tool-code\">{JSON.stringify(part.props, null, 2)}</pre>\n </BaseWidget>,\n );\n }\n\n if (isWidgetDefinition(entry)) {\n const Component = entry.component;\n const content = <Component {...part.props} widget={controls} />;\n\n if (entry.shell === false) {\n return frame(content);\n }\n\n return frame(\n <BaseWidget {...getWidgetShellProps(entry, part.props, controls)}>{content}</BaseWidget>,\n );\n }\n\n const Component = entry;\n\n return frame(\n <Component\n id={part.id}\n name={part.name}\n props={part.props}\n interactive={part.interactive}\n disabled={widgetDisabled}\n onRespond={async (response) => {\n if (!part.interactive || disabled || submitted || responsePending.current) {\n return;\n }\n\n responsePending.current = true;\n setSubmitted(true);\n try {\n await respondToWidget(response);\n } catch (error) {\n setSubmitted(false);\n throw error;\n } finally {\n responsePending.current = false;\n }\n }}\n />,\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport type BaseWidgetProps = {\n label: string;\n title: ReactNode;\n status?: ReactNode;\n meta?: ReactNode;\n className?: string;\n children?: ReactNode;\n};\n\nexport function BaseWidget({\n label,\n title,\n status,\n meta,\n className,\n children,\n}: BaseWidgetProps) {\n return (\n <section className={cn(\"chat-widget-card\", className)} aria-label={label}>\n <header className=\"chat-widget-header\">\n <div className=\"chat-widget-heading\">\n {label ? (\n <div className=\"chat-widget-label-row\">\n <span className=\"chat-widget-status-dot\" aria-hidden=\"true\" />\n <span className=\"chat-widget-label\">{label}</span>\n </div>\n ) : null}\n <div className=\"chat-widget-title\">{title}</div>\n </div>\n {status ? <div className=\"chat-widget-status\">{status}</div> : null}\n </header>\n\n {children ? <div className=\"chat-widget-body\">{children}</div> : null}\n {meta ? <div className=\"chat-widget-meta\">{meta}</div> : null}\n </section>\n );\n}\n","\"use client\";\n\nimport { Children, isValidElement, type ComponentPropsWithoutRef } from \"react\";\nimport { CodeMarkdown, type SupportedLanguage } from \"@sarchauhan/code-markdown\";\nimport ReactMarkdown from \"react-markdown\";\nimport type { PluggableList } from \"unified\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useTheme } from \"../../theme/theme.context\";\nimport { chatCodeThemes } from \"./message.markdown.theme\";\n\nconst markdownPlugins: { remark: PluggableList; rehype: PluggableList } = {\n remark: [remarkGfm],\n rehype: [],\n};\n\nconst SUPPORTED_LANGUAGES: ReadonlySet<string> = new Set([\n \"c\",\n \"h\",\n \"cpp\",\n \"cxx\",\n \"cc\",\n \"hpp\",\n \"hxx\",\n \"go\",\n \"javascript\",\n \"js\",\n \"jsx\",\n \"mjs\",\n \"python\",\n \"py\",\n \"rust\",\n \"rs\",\n \"typescript\",\n \"ts\",\n \"tsx\",\n]);\n\nconst isSupportedLanguage = (value: string): value is SupportedLanguage =>\n SUPPORTED_LANGUAGES.has(value);\n\nconst getCodeLanguage = (className?: string): SupportedLanguage => {\n const match = className?.match(/language-([\\w-]+)/);\n const language = match?.[1]?.toLowerCase();\n return language && isSupportedLanguage(language) ? language : \"typescript\";\n};\n\nconst getTextContent = (value: unknown): string => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.map(getTextContent).join(\"\");\n }\n\n return \"\";\n};\n\nconst MarkdownCodeBlock = ({\n code,\n language,\n}: {\n code: string;\n language: SupportedLanguage;\n}) => {\n const { resolvedTheme } = useTheme();\n\n return (\n <CodeMarkdown\n className=\"chat-code-markdown\"\n language={language}\n theme={chatCodeThemes[resolvedTheme]}\n showCopyButton\n showLineNumbers\n showLanguage\n >\n {code}\n </CodeMarkdown>\n );\n};\n\nconst MarkdownPre = ({ className, children }: ComponentPropsWithoutRef<\"pre\">) => {\n const child = Children.toArray(children)[0];\n const code = isValidElement<{ className?: string; children?: unknown }>(child)\n ? getTextContent(child.props.children)\n : getTextContent(children);\n const codeClassName = isValidElement<{ className?: string }>(child)\n ? child.props.className\n : undefined;\n\n return (\n <div className={cn(\"my-5\", className)}>\n <MarkdownCodeBlock\n language={getCodeLanguage(codeClassName)}\n code={code.replace(/\\n$/, \"\")}\n />\n </div>\n );\n};\n\nconst markdownComponents = {\n a: ({ className, ...props }: ComponentPropsWithoutRef<\"a\">) => (\n <a\n className={cn(\n \"font-medium text-primary underline underline-offset-2 decoration-primary/30 decoration-1 hover:decoration-primary/70\",\n className,\n )}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n {...props}\n />\n ),\n p: ({ className, ...props }: ComponentPropsWithoutRef<\"p\">) => (\n <p\n className={cn(\"my-[0.85em] text-inherit chat-text-body first:mt-0 last:mb-0\", className)}\n style={{ fontSize: \"var(--chat-body-size)\", lineHeight: \"var(--chat-body-leading)\" }}\n {...props}\n />\n ),\n h1: ({ className, ...props }: ComponentPropsWithoutRef<\"h1\">) => (\n <h1\n className={cn(\"mt-8 mb-3 chat-text-heading-1\", className)}\n style={{\n fontSize: \"var(--chat-heading-1-size)\",\n lineHeight: \"var(--chat-heading-1-leading)\",\n fontWeight: \"var(--chat-heading-1-weight)\",\n letterSpacing: \"var(--chat-heading-1-tracking)\",\n }}\n {...props}\n />\n ),\n h2: ({ className, ...props }: ComponentPropsWithoutRef<\"h2\">) => (\n <h2\n className={cn(\"mt-8 mb-3\", className)}\n style={{\n fontSize: \"var(--chat-fs-18)\",\n lineHeight: \"var(--chat-leading-tight)\",\n fontWeight: \"var(--chat-weight-semibold)\",\n letterSpacing: \"var(--chat-tracking-tight)\",\n }}\n {...props}\n />\n ),\n h3: ({ className, ...props }: ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={cn(\"mt-6 mb-2\", className)}\n style={{\n fontSize: \"var(--chat-fs-16)\",\n lineHeight: \"var(--chat-leading-tight)\",\n fontWeight: \"var(--chat-weight-semibold)\",\n letterSpacing: \"var(--chat-tracking-tight)\",\n }}\n {...props}\n />\n ),\n h4: ({ className, ...props }: ComponentPropsWithoutRef<\"h4\">) => (\n <h4\n className={cn(\"mt-6 mb-2\", className)}\n style={{\n fontSize: \"var(--chat-fs-15)\",\n lineHeight: \"var(--chat-leading-tight)\",\n fontWeight: \"var(--chat-weight-semibold)\",\n letterSpacing: \"var(--chat-tracking-normal)\",\n }}\n {...props}\n />\n ),\n ul: ({ className, ...props }: ComponentPropsWithoutRef<\"ul\">) => (\n <ul\n className={cn(\"my-4 list-disc space-y-2 pl-6 chat-text-body\", className)}\n style={{ fontSize: \"var(--chat-body-size)\", lineHeight: \"var(--chat-body-leading)\" }}\n {...props}\n />\n ),\n ol: ({ className, ...props }: ComponentPropsWithoutRef<\"ol\">) => (\n <ol\n className={cn(\"my-4 list-decimal space-y-2 pl-6 chat-text-body\", className)}\n style={{ fontSize: \"var(--chat-body-size)\", lineHeight: \"var(--chat-body-leading)\" }}\n {...props}\n />\n ),\n li: ({ className, ...props }: ComponentPropsWithoutRef<\"li\">) => (\n <li\n className={cn(\"pl-1\", className)}\n style={{ lineHeight: \"var(--chat-leading-normal)\" }}\n {...props}\n />\n ),\n blockquote: ({ className, ...props }: ComponentPropsWithoutRef<\"blockquote\">) => (\n <blockquote className={cn(\"md-blockquote\", className)} {...props} />\n ),\n hr: ({ className, ...props }: ComponentPropsWithoutRef<\"hr\">) => (\n <hr className={cn(\"my-6 h-px border-0 bg-current opacity-10\", className)} {...props} />\n ),\n table: ({ className, ...props }: ComponentPropsWithoutRef<\"table\">) => (\n <div className=\"md-table-wrapper\">\n <table className={cn(\"md-table\", className)} {...props} />\n </div>\n ),\n thead: ({ className, ...props }: ComponentPropsWithoutRef<\"thead\">) => <thead {...props} />,\n tbody: ({ className, ...props }: ComponentPropsWithoutRef<\"tbody\">) => <tbody {...props} />,\n tr: ({ className, ...props }: ComponentPropsWithoutRef<\"tr\">) => <tr {...props} />,\n th: ({ className, ...props }: ComponentPropsWithoutRef<\"th\">) => <th {...props} />,\n td: ({ className, ...props }: ComponentPropsWithoutRef<\"td\">) => <td {...props} />,\n pre: MarkdownPre,\n // React Markdown v10 no longer consistently provides the legacy `inline`\n // prop. Fenced code is handled by the custom `pre` renderer above, so a\n // standalone `code` element should always be rendered as inline code.\n code: ({ className, children, ...props }: ComponentPropsWithoutRef<\"code\">) => (\n <code className={cn(\"md-inline-code\", className)} {...props}>\n {children}\n </code>\n ),\n};\n\ntype MarkdownContentProps = {\n children: string;\n className?: string;\n};\n\nexport const MarkdownContent = ({ children, className }: MarkdownContentProps) => (\n <div className={cn(\"md-content break-words text-inherit\", className)}>\n <ReactMarkdown\n remarkPlugins={markdownPlugins.remark}\n rehypePlugins={markdownPlugins.rehype}\n components={markdownComponents}\n >\n {children}\n </ReactMarkdown>\n </div>\n);\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n\nexport type ChatTheme = \"light\" | \"dark\" | \"system\";\n\ntype ThemeContextValue = {\n theme: ChatTheme;\n resolvedTheme: \"light\" | \"dark\";\n setTheme: (theme: ChatTheme) => void;\n toggleTheme: () => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nconst STORAGE_KEY = \"sarchauhan-chat-theme\";\n\nconst getSystemTheme = (): \"light\" | \"dark\" => {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return \"light\";\n }\n\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n};\n\nconst resolveTheme = (theme: ChatTheme): \"light\" | \"dark\" =>\n theme === \"system\" ? getSystemTheme() : theme;\n\ntype ThemeProviderProps = {\n children: ReactNode;\n defaultTheme?: ChatTheme;\n theme?: ChatTheme;\n onThemeChange?: (theme: ChatTheme) => void;\n storageKey?: string;\n};\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n theme: controlledTheme,\n onThemeChange,\n storageKey = STORAGE_KEY,\n}: ThemeProviderProps) {\n const [uncontrolledTheme, setUncontrolledTheme] =\n useState<ChatTheme>(defaultTheme);\n\n const theme = controlledTheme ?? uncontrolledTheme;\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\n theme === \"dark\" ? \"dark\" : \"light\",\n );\n\n useEffect(() => {\n if (controlledTheme !== undefined) {\n return;\n }\n\n const stored = window.localStorage.getItem(storageKey);\n if (stored === \"light\" || stored === \"dark\" || stored === \"system\") {\n setUncontrolledTheme(stored);\n }\n }, [controlledTheme, storageKey]);\n\n useEffect(() => {\n setResolvedTheme(resolveTheme(theme));\n\n if (theme !== \"system\" || typeof window === \"undefined\") {\n return;\n }\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => setResolvedTheme(getSystemTheme());\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, [theme]);\n\n const setTheme = useCallback(\n (next: ChatTheme) => {\n onThemeChange?.(next);\n\n if (controlledTheme === undefined) {\n setUncontrolledTheme(next);\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, next);\n }\n }\n },\n [controlledTheme, onThemeChange, storageKey],\n );\n\n const toggleTheme = useCallback(() => {\n const next = resolvedTheme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n }, [resolvedTheme, setTheme]);\n\n const value = useMemo(\n () => ({\n theme,\n resolvedTheme,\n setTheme,\n toggleTheme,\n }),\n [resolvedTheme, setTheme, theme, toggleTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n\n if (!context) {\n throw new Error(\"useTheme must be used inside ThemeProvider\");\n }\n\n return context;\n}\n","import type { CodeTheme } from \"@sarchauhan/code-markdown\";\n\nexport const chatCodeThemes: Record<\"light\" | \"dark\", CodeTheme> = {\n light: {\n name: \"chat-light\",\n shikiTheme: \"github-light\",\n colors: {\n background: \"#ffffff\",\n foreground: \"#0d0d0d\",\n comment: \"#6e6e80\",\n keyword: \"#9b174c\",\n string: \"#166534\",\n function: \"#1d4ed8\",\n variable: \"#0d0d0d\",\n number: \"#7c3aed\",\n operator: \"#9b174c\",\n punctuation: \"#6e6e80\",\n type: \"#0369a1\",\n tag: \"#166534\",\n attribute: \"#1d4ed8\",\n constant: \"#b45309\",\n surface: \"#f7f7f8\",\n overlay: \"#d8d8df\",\n subtext: \"#6e6e80\",\n },\n },\n dark: {\n name: \"chat-dark\",\n shikiTheme: \"github-dark\",\n colors: {\n background: \"#212121\",\n foreground: \"#ececec\",\n comment: \"#8f8f8f\",\n keyword: \"#ff7b72\",\n string: \"#a5d6a7\",\n function: \"#79c0ff\",\n variable: \"#ececec\",\n number: \"#d2a8ff\",\n operator: \"#ff7b72\",\n punctuation: \"#b4b4b4\",\n type: \"#79c0ff\",\n tag: \"#7ee787\",\n attribute: \"#79c0ff\",\n constant: \"#ffa657\",\n surface: \"#2f2f2f\",\n overlay: \"#454545\",\n subtext: \"#b4b4b4\",\n },\n },\n};\n","\"use client\";\n\nimport { ChevronDown, Sparkles } from \"lucide-react\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { TextSwap } from \"../../motion\";\nimport { formatElapsedWords, useElapsedTime } from \"./message.loading\";\n\ntype ThinkingBlockProps = {\n isComplete: boolean;\n elapsedMs?: number;\n children?: ReactNode;\n};\n\nexport const ThinkingBlock = ({ isComplete, elapsedMs, children }: ThinkingBlockProps) => {\n const [isOpen, setIsOpen] = useState(true);\n const measuredElapsed = useElapsedTime(!isComplete);\n const elapsed = elapsedMs ?? measuredElapsed;\n\n useEffect(() => {\n if (!isComplete) {\n setIsOpen(true);\n }\n }, [isComplete]);\n\n return (\n <details\n className={cn(\n \"md-thinking\",\n isComplete ? \"md-thinking-complete\" : \"md-thinking-pending\",\n )}\n open={isOpen}\n onToggle={(event) => setIsOpen(event.currentTarget.open)}\n >\n <summary>\n <Sparkles className=\"md-thinking-sparkle\" aria-hidden=\"true\" />\n <TextSwap\n className=\"md-thinking-label\"\n text={isComplete ? `Thought for ${formatElapsedWords(elapsed)}` : \"Thinking\"}\n />\n {isComplete && <ChevronDown className=\"md-thinking-chevron\" aria-hidden=\"true\" />}\n </summary>\n {children}\n </details>\n );\n};\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { TextSwap } from \"../../motion\";\n\nexport const useElapsedTime = (active: boolean) => {\n const startedAtRef = useRef(0);\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n if (!active) {\n return;\n }\n\n startedAtRef.current = Date.now();\n setElapsed(0);\n\n const timer = window.setInterval(() => {\n setElapsed(Date.now() - startedAtRef.current);\n }, 100);\n\n return () => window.clearInterval(timer);\n }, [active]);\n\n return elapsed;\n};\n\nexport const formatElapsed = (milliseconds: number, showTenths = false) => {\n const totalSeconds = Math.max(0, milliseconds / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds - minutes * 60;\n const formattedSeconds = showTenths ? seconds.toFixed(1) : String(Math.floor(seconds));\n\n return minutes > 0 ? `${minutes}m ${formattedSeconds}s` : `${formattedSeconds}s`;\n};\n\nexport const formatElapsedWords = (milliseconds: number) => {\n const seconds = Math.max(0, Math.floor(milliseconds / 1000));\n\n if (seconds < 60) {\n return `${seconds} ${seconds === 1 ? \"second\" : \"seconds\"}`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainder = seconds % 60;\n const minuteLabel = `${minutes} ${minutes === 1 ? \"minute\" : \"minutes\"}`;\n\n return remainder > 0\n ? `${minuteLabel} ${remainder} ${remainder === 1 ? \"second\" : \"seconds\"}`\n : minuteLabel;\n};\n\nconst PixelGrid = () => (\n <span className=\"chat-pixel-grid\" aria-hidden=\"true\">\n {Array.from({ length: 9 }, (_, index) => (\n <span key={index} />\n ))}\n </span>\n);\n\ntype LoadingStateProps = {\n label?: string;\n compact?: boolean;\n};\n\nexport const LoadingState = ({ label = \"Churning\", compact = false }: LoadingStateProps) => {\n const elapsed = useElapsedTime(true);\n\n return (\n <div className={`chat-loading${compact ? \" chat-loading-inline\" : \"\"}`} role=\"status\" aria-live=\"polite\">\n <PixelGrid />\n <TextSwap className=\"chat-loading-label\" text={label} />\n <span className=\"chat-loading-timer\" role=\"timer\">\n {formatElapsed(elapsed, true)}\n </span>\n <span className=\"chat-visually-hidden\">Loading conversation</span>\n </div>\n );\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;;;ACCA,mBAAyB;;;ACCzB,0BAA4B;AA6BtB;AA3BC,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAKG;AACD,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ,EAAE,KAAK;AACP,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,kCAAkC,SAAS;AAAA,MACtD,cAAY;AAAA,MACZ,MAAM,UAAU;AAAA,MAEhB;AAAA,qDAAC,aACC;AAAA,sDAAC,mCAAY,MAAM,IAAI,eAAY,QAAO;AAAA,UAC1C,4CAAC,UAAK,WAAU,0BAA0B,iBAAM;AAAA,UAChD,4CAAC,UAAK,WAAU,0BAAyB,OACtC,iBACH;AAAA,UACA,4CAAC,UAAK,WAAU,yBAAyB,gBAAK;AAAA,UAC9C,4CAAC,UAAK,WAAU,2BAA0B,MAAK,UAC5C,kBACH;AAAA,WACF;AAAA,QACA,4CAAC,SAAI,WAAU,yBACZ,kBACC,4CAAC,OAAE,WAAU,qBAAoB,MAAK,SACnC,iBACH,IAEA,UAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AD7BQ,IAAAA,sBAAA;AApBD,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACL,GAAwB;AAXxB;AAYE,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,SAAQ,wCAAS,MAAM,aAAf,YAA2B,CAAC;AAC1C,QAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ;AAClC,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,CAAC;AACnD,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,MAAM,SAAS,GAAG,MAAM,MAAM,WAAW;AAAA,MAE9C;AAAA,oBAAY,SACX,6CAAC,OAAE,WAAU,qBACV,gBAAM,UAAU,YACb,uBACA,6BACN,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAY,eAAe,IAAI;AAAA,YAC/B,UAAU;AAAA,YAER,sBAAW,QAAQ,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,UACrD,8CAAC,SAAI,WAAU,kBACb;AAAA,2DAAC,UAAK,WAAU,oBAAmB,eAAY,QAC5C,sBAAY,OACf;AAAA,cACA,6CAAC,UAAM,kBAAQ,KAAI;AAAA,iBAJgB,KAKrC,CACD;AAAA;AAAA,QACH;AAAA,QAED,CAAC,YAAY,MAAM,SAAS,QAC3B;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS,MAAM,YAAY,IAAI;AAAA,YAChC;AAAA;AAAA,cACO,MAAM,SAAS;AAAA,cAAM;AAAA;AAAA;AAAA,QAC7B,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AExDA,IAAAC,gBAAkC;;;ACDlC,sBAA8B;AAI9B,IAAM,SAAS,CAAC,UACd,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC9D,QACD,CAAC;AACP,IAAM,SAAS,IAAI,WACjB,OAAO,KAAK,CAAC,UAA2B,OAAO,UAAU,QAAQ;AACnE,IAAM,SAAS,IAAI,WACjB,OAAO;AAAA,EACL,CAAC,UACC,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AACtD;AACF,IAAM,UAAkC;AAAA,EACtC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,OAAO;AAAA,EACP,aAAa;AAAA,EACb,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,cAAc;AAChB;AACO,SAAS,iBAAiB,MAAkC;AACjE,MAAI,KAAK,UAAU,eAAgB,QAAO;AAC1C,MAAI,KAAK,UAAU,gBAAiB,QAAO;AAC3C,MAAI,KAAK,UAAU,qBAAsB,QAAO;AAChD,SAAO,KAAK,UAAU,sBAAsB,CAAC,KAAK,cAC9C,aACA;AACN;AACO,SAAS,uBAAuB,OAAgC;AACrE,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,UAAM,SAAS,OAAO,IAAI;AAC1B,UAAM,OAAO,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,GAAG;AACxD,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,MAAM,OAAO,OAAO,MAAM,OAAO,UAAU;AAAA,QAC3C,MAAM,OAAO,OAAO,MAAM,OAAO,SAAS,OAAO,OAAO;AAAA,QACxD,OAAO,OAAO,OAAO,KAAK;AAAA,QAC1B,KAAK,OAAO,OAAO,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kBAAkB,MAA6C;AAzD/E;AA0DE,QAAM,OAAO,QAAQ,KAAK,QAAQ;AAClC,MAAI,CAAC,MAAM;AAET,UAAMC,UAAS,OAAO,KAAK,MAAM;AACjC,QAAI,KAAK,UAAU,mBAAoB,QAAO;AAC9C,QAAI,MAAM,QAAQA,QAAO,SAAS,GAAG;AACnC,YAAM,YAAYA,QAAO,UAAU,QAAQ,CAAC,UAAU;AACpD,cAAMC,gBAAW,+BAAc,KAAK;AAAG,eAAOA,YAAW,CAACA,SAAQ,IAAI,CAAC;AAAA,MACzE,CAAC;AACD,aAAO,UAAU,SAAS,EAAE,MAAM,UAAU,MAAM,aAAa,IAAI,KAAK,YAAY,OAAO,EAAE,UAAU,EAAE,IAAI;AAAA,IAC/G;AACA,UAAM,eAAW,+BAAcD,QAAO,QAAQ;AAC9C,WAAO,WAAW,EAAE,MAAM,UAAU,MAAM,YAAY,IAAI,KAAK,YAAY,OAAO,EAAE,SAAS,EAAE,IAAI;AAAA,EACrG;AACA,QAAM,QAAQ,OAAO,KAAK,KAAK,GAC7B,SAAS,OAAO,KAAK,MAAM;AAC7B,QAAM,SAAS,EAAE,GAAG,OAAO,GAAG,OAAO;AACrC,QAAME,UAAS,EAAE,OAAO,iBAAiB,IAAI,GAAG,OAAO,KAAK,UAAU;AACtE,MAAI;AACJ,MAAI,SAAS,aAAa;AACxB,UAAM,OAAO;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,QAAI,CAAC,KAAM,QAAO;AAClB,YAAQ;AAAA,MACN,GAAGA;AAAA,MACH;AAAA,MACA,SAAS,OAAO,OAAO,SAAS,OAAO,MAAM,KAAK,MAAM;AAAA,MACxD,WAAW,OAAO,OAAO,WAAW,OAAO,YAAY,OAAO,MAAM;AAAA,MACpE,UAAU,OAAO,OAAO,QAAQ;AAAA,IAClC;AACA,QAAI,KAAK,UAAU,sBAAsB,MAAM,YAAY;AACzD,aAAO;AAAA,EACX,WAAW,SAAS,SAAS;AAC3B,UAAM,SAAS,OAAO,OAAO,QAAQ,OAAO,YAAY,OAAO,OAAO;AACtE,UAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO;AACpE,UAAM,QACJ;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,IACP,MAPA,YAQC,WAAW,UAAa,UAAU,SAC/B;AAAA,MACE;AAAA,MACA;AAAA,MACA,OAAO,OAAO,MAAM,OAAO,WAAW,MAAM;AAAA,IAC9C,IACA;AACN,QACE,SAAS,UACR,QAAQ,CAAC,4CAA4C,KAAK,IAAI;AAE/D,aAAO;AACT,YAAQ;AAAA,MACN,GAAGA;AAAA,MACH,MAAM,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,SAAS;AAAA,MACvD;AAAA,IACF;AAAA,EACF,WAAW,SAAS,UAAU;AAC5B,UAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,SAAS,OAAO,MAAM;AAChE,QAAI,UAAU,OAAW,QAAO;AAChC,UAAM,WACJ,kBAAO,YAAP,YACA,OAAO,YADP,YAEC,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,SAAS;AAC9C,QAAI,KAAK,UAAU,sBAAsB,CAAC,MAAM,QAAQ,OAAO;AAC7D,aAAO;AACT,YAAQ;AAAA,MACN,GAAGA;AAAA,MACH;AAAA,MACA,SAAS,uBAAuB,OAAO;AAAA,MACvC,OAAO,OAAO,OAAO,OAAO,OAAO,UAAU;AAAA,IAC/C;AAAA,EACF,OAAO;AACL,QACE,CAAC,gBAAgB,iBAAiB,oBAAoB,EAAE;AAAA,MACtD,KAAK;AAAA,IACP;AAEA,aAAO;AAET,UAAM,SAAS,OAAO,MAAM,QAAQ,MAAM,QAAQ;AAClD,QAAI,CAAC,OAAQ,QAAO;AACpB,YAAQ,EAAE,GAAG,OAAO,OAAO;AAAA,EAC7B;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,IAAI,KAAK;AAAA,IACT;AAAA,IACA,aAAa,SAAS,cAAc,KAAK,UAAU;AAAA,EACrD;AACF;AASO,SAAS,YAAY,MAAc;AACxC,MAAI,UAAU,GACZ,UAAU,GACV,SAAS,OACT,eAAe,GACf,eAAe,GACf,YAAY,GACZ,YAAY;AACd,QAAM,QAAoB,KACvB,QAAQ,SAAS,IAAI,EACrB,MAAM,IAAI,EACV,IAAI,CAAC,SAAS;AAjLnB;AAkLM,UAAM,OAAO,8CAA8C,KAAK,IAAI;AACpE,QAAI,MAAM;AACR,gBAAU,OAAO,KAAK,CAAC,CAAC;AACxB,gBAAU,OAAO,KAAK,CAAC,CAAC;AACxB,qBAAe,QAAO,UAAK,CAAC,MAAN,YAAW,CAAC;AAClC,qBAAe,QAAO,UAAK,CAAC,MAAN,YAAW,CAAC;AAClC,eAAS;AACT,aAAO,EAAE,MAAM,UAAU,KAAK;AAAA,IAChC;AACA,QAAI,iBAAiB,KAAK,iBAAiB,EAAG,UAAS;AACvD,QAAI,CAAC,UAAU,qCAAqC,KAAK,IAAI,GAAG;AAC9D,eAAS;AACT,aAAO,EAAE,MAAM,UAAU,KAAK;AAAA,IAChC;AAEA,QAAI,KAAK,WAAW,IAAI,GAAG;AACzB,eAAS;AACT,aAAO,EAAE,MAAM,UAAU,KAAK;AAAA,IAChC;AACA,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB;AACA,UAAI,OAAQ;AACZ,aAAO,EAAE,MAAM,OAAO,MAAM,SAAS,SAAS,YAAY,OAAU;AAAA,IACtE;AACA,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB;AACA,UAAI,OAAQ;AACZ,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,SAAS,SAAS,YAAY;AAAA,MAChC;AAAA,IACF;AACA,QAAI,UAAU,KAAK,WAAW,GAAG,GAAG;AAClC;AACA;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,EAAE,MAAM,UAAU,KAAK;AAAA,EAChC,CAAC;AACH,SAAO,EAAE,OAAO,WAAW,UAAU;AACvC;AACO,SAAS,cAAc,KAAkC;AAC9D,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,oBAAO,EAAE;AAChC,WAAO,CAAC,UAAU,OAAO,EAAE,SAAS,OAAO,QAAQ,IAC/C,OAAO,OACP;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,gBACd,QACA,OACA,OAAO,QACC;AACR,MAAI,WAAW,MAAO,QAAO;AAC7B,QAAM,QAAQ,CAAC,SACb,SAAS,KACL,CAAC,IACD,KAAK,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,IAAI;AAC/D,QAAM,WAAW,MAAM,MAAM,GAC3B,WAAW,MAAM,KAAK;AACxB,MAAI,SAAS,GACX,SAAS;AACX,SACE,SAAS,SAAS,UAClB,SAAS,SAAS,UAClB,SAAS,MAAM,MAAM,SAAS,MAAM;AAEpC;AACF,SACE,SAAS,SAAS,SAAS,UAC3B,SAAS,SAAS,SAAS,UAC3B,SAAS,SAAS,SAAS,IAAI,MAAM,MACnC,SAAS,SAAS,SAAS,IAAI,MAAM;AAEvC;AACF,MAAI,OAAO,SAAS,IAAI,MAAM,MAAM,SAAS,IAAI,EAAG,UAAS;AAE7D,MAAI,WAAW,SAAS,UAAU,WAAW,SAAS,QAAQ;AAC5D,aAAS,KAAK,IAAI,GAAG,SAAS,CAAC;AAC/B,aAAS;AAAA,EACX;AACA,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,CAAC,GAClC,OAAO,KAAK,IAAI,GAAG,MAAM;AAC3B,QAAM,SAAS,SAAS,SAAS,QAC/B,SAAS,SAAS,SAAS;AAC7B,QAAM,WAAW,SAAS,OAAO,OAC/B,WAAW,SAAS,OAAO;AAC7B,QAAM,QAAQ,KAAK,QAAQ,WAAW,EAAE;AACxC,QAAM,OAAO;AAAA,IACX,GAAG,SAAS,MAAM,OAAO,MAAM,EAAE,IAAI,CAAC,SAAS,MAAM,IAAI;AAAA,IACzD,GAAG,SACA,MAAM,QAAQ,MAAM,EACpB,QAAQ,CAAC,MAAM,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,GAAI,SAAS,UAAU,SAAS,SAAS,KAAK,CAAC,OAAO,SAAS,IAAI,IAC/D,CAAC,8BAA8B,IAC/B,CAAC;AAAA,IACP,CAAC;AAAA,IACH,GAAG,SACA,MAAM,QAAQ,MAAM,EACpB,QAAQ,CAAC,MAAM,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,GAAI,SAAS,UAAU,SAAS,SAAS,KAAK,CAAC,MAAM,SAAS,IAAI,IAC9D,CAAC,8BAA8B,IAC/B,CAAC;AAAA,IACP,CAAC;AAAA,IACH,GAAG,SAAS,MAAM,QAAQ,SAAS,IAAI,EAAE,IAAI,CAAC,SAAS,MAAM,IAAI;AAAA,EACnE;AACA,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,OAAO,WAAW,QAAQ,IAAI,KAAK,IAAI,QAAQ,KAAK,WAAW,QAAQ,IAAI,KAAK,IAAI,QAAQ;AAAA,IAC5F,GAAG;AAAA,EACL,EAAE,KAAK,IAAI;AACb;;;AD9QQ,IAAAC,sBAAA;AA5BD,SAAS,YAAY;AAAA,EAC1B,OAAO;AAAA,EACP,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACL,GAAqB;AACnB,QAAM,WAAO;AAAA,IACX,MACE,4BACC,WAAW,UAAa,UAAU,SAC/B,gBAAgB,QAAQ,OAAO,IAAI,IACnC;AAAA,IACN,CAAC,SAAS,QAAQ,OAAO,IAAI;AAAA,EAC/B;AACA,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAC9C,QAAM,EAAE,OAAO,WAAW,UAAU,QAAI;AAAA,IACtC,MAAM,YAAY,IAAI;AAAA,IACtB,CAAC,IAAI;AAAA,EACP;AACA,QAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ;AAClC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAM;AAAA,MACN,OAAO;AAAA,MACP,MACE,8EACE;AAAA,sDAAC,UAAK,WAAU,uBAAsB;AAAA;AAAA,UAAE;AAAA,WAAU;AAAA,QAAQ;AAAA,QAC1D,8CAAC,UAAK,WAAU,0BAAyB;AAAA;AAAA,UAAE;AAAA,WAAU;AAAA,SACvD;AAAA,MAGD;AAAA,eACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAY,YAAY,IAAI;AAAA,YAC5B,UAAU;AAAA,YAER,sBAAW,QAAQ,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,UACrD,8CAAC,SAAI,WAAU,kBAAiB,aAAW,KAAK,MAC9C;AAAA,2DAAC,UAAK,WAAU,oBAAmB,eAAY,QAC5C,eAAK,SACR;AAAA,cACA,6CAAC,UAAK,WAAU,oBAAmB,eAAY,QAC5C,eAAK,SACR;AAAA,cACA,6CAAC,UAAM,eAAK,QAAQ,KAAI;AAAA,iBAPiC,KAQ3D,CACD;AAAA;AAAA,QACH,IAEA,6CAAC,OAAE,WAAU,qBAAoB,kCAAoB;AAAA,QAEtD,CAAC,YAAY,MAAM,SAAS,QAC3B;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS,MAAM,YAAY,IAAI;AAAA,YAChC;AAAA;AAAA,cACkB,MAAM;AAAA,cAAO;AAAA;AAAA;AAAA,QAChC,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AEvEA,IAAAC,gBAAyB;AAsBjB,IAAAC,sBAAA;AAlBD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA,aAAa;AAAA,EACb,GAAG;AACL,GAAsB;AACpB,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAC9C,QAAM,QAAQ,KAAK,IAAI,GAAG,UAAU;AACpC,QAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,wBAAS,CAAC;AACjD,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,GAAG,KAAK,IAAI,UAAU,IAAI,WAAW,SAAS;AAAA,MAEnD;AAAA,SAAC,QAAQ,SACR,6CAAC,OAAE,WAAU,qBACV,gBAAM,UAAU,YAAY,oBAAe,qBAC9C,IAEA,6CAAC,QAAG,WAAU,uBACV,sBAAW,UAAU,QAAQ,MAAM,GAAG,KAAK,GAAG;AAAA,UAC9C,CAAC,QAAQ,UAAU;AACjB,kBAAM,OAAO,cAAc,OAAO,GAAG;AACrC,kBAAM,QACJ,8EACG;AAAA,qBAAO,SAAS,OAAO;AAAA,cACvB,OAAO,OACN,8CAAC,UAAK,WAAU,oBAAmB;AAAA;AAAA,gBAAE,OAAO;AAAA,iBAAK,IAC/C;AAAA,eACN;AAEF,mBACE,8CAAC,QACE;AAAA,qBACC,6CAAC,OAAE,MAAY,QAAO,UAAS,KAAI,cAChC,iBACH,IAEA,6CAAC,SAAI,WAAU,oBAAoB,iBAAM;AAAA,cAE1C,OAAO,OAAO,6CAAC,OAAG,iBAAO,MAAK,IAAO;AAAA,iBAR/B,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,KAAK,EAS/C;AAAA,UAEJ;AAAA,QACF,GACF;AAAA,QAED,CAAC,YAAY,QAAQ,SAAS,QAC7B;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS,MAAM,YAAY,IAAI;AAAA,YAChC;AAAA;AAAA,cACO,QAAQ,SAAS;AAAA,cAAM;AAAA;AAAA;AAAA,QAC/B,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;ACjEA,IAAAC,gBAAwC;AACxC,IAAAC,uBAA+B;AAmDzB,IAAAC,sBAAA;AAjDC,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AACd,GAAwB;AACtB,QAAM,SAAK,qBAAM;AACjB,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAmB,CAAC,CAAC,GACnD,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AAC/B,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAsC,MAAM;AACxE,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB;AAC3C,QAAM,iBAAa,sBAAO,KAAK;AAC/B,QAAM,UAAU,QAAQ;AAAA,IAAI,CAAC,WAC3B,OAAO,WAAW,WAAW,EAAE,OAAO,QAAQ,OAAO,OAAO,IAAI;AAAA,EAClE;AACA,QAAM,SAAS,YAAY,WAAW,UAAU,CAAC;AACjD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,+BAA+B,SAAS;AAAA,MACnD,mBAAiB,GAAG,EAAE;AAAA,MACtB,UAAU,OAAO,UAAU;AACzB,cAAM,eAAe;AACrB,YAAI,UAAU,WAAW,WAAY,CAAC,SAAS,UAAU,CAAC,KAAK,KAAK;AAClE;AACF,mBAAW,UAAU;AACrB,kBAAU,SAAS;AACnB,iBAAS,MAAS;AAClB,YAAI;AACF,iBAAM,qCAAW;AAAA,YACf,QAAQ;AAAA,YACR,GAAI,KAAK,KAAK,IAAI,EAAE,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,UAC7C;AACA,oBAAU,MAAM;AAAA,QAClB,SAAS,OAAO;AACd;AAAA,YACE,iBAAiB,QACb,MAAM,UACN;AAAA,UACN;AACA,oBAAU,MAAM;AAAA,QAClB,UAAE;AACA,qBAAW,UAAU;AAAA,QACvB;AAAA,MACF;AAAA,MAEA;AAAA,qDAAC,SAAI,WAAU,yBAAwB,wBAAU;AAAA,QACjD,6CAAC,QAAG,IAAI,GAAG,EAAE,WAAY,kBAAO;AAAA,QAC/B,cACC,6CAAC,OAAE,WAAU,6BAA6B,uBAAY,IACpD;AAAA,QACJ,8CAAC,cAAS,UAAU,QAClB;AAAA,uDAAC,YAAO,WAAU,gBACf,qBAAW,+BAA+B,oBAC7C;AAAA,UACC,QAAQ,IAAI,CAAC,QAAQ,UACpB;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,iBAAe,SAAS,SAAS,OAAO,KAAK;AAAA,cAG7C;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,WAAW,aAAa;AAAA,oBAC9B,MAAM;AAAA,oBACN,OAAO,OAAO;AAAA,oBACd,SAAS,SAAS,SAAS,OAAO,KAAK;AAAA,oBACvC,UAAU,MACR;AAAA,sBAAY,CAAC,YACX,WACI,QAAQ,SAAS,OAAO,KAAK,IAC3B,QAAQ,OAAO,CAAC,UAAU,UAAU,OAAO,KAAK,IAChD,CAAC,GAAG,SAAS,OAAO,KAAK,IAC3B,CAAC,OAAO,KAAK;AAAA,oBACnB;AAAA;AAAA,gBAEJ;AAAA,gBACA,8CAAC,UACC;AAAA,gEAAC,UAAK,WAAU,8BACb;AAAA,2BAAO;AAAA,oBACP,OAAO,cAAc,6CAAC,WAAM,yBAAW,IAAW;AAAA,qBACrD;AAAA,kBACC,OAAO,cACN,6CAAC,UAAK,WAAU,oCACb,iBAAO,aACV,IACE;AAAA,mBACN;AAAA;AAAA;AAAA,YA3BK,GAAG,OAAO,KAAK,IAAI,KAAK;AAAA,UA4B/B,CACD;AAAA,UACA,eAAe,CAAC,QAAQ,SACvB,8CAAC,WAAM,WAAU,wBACd;AAAA,oBAAQ,SAAS,uBAAuB;AAAA,YACzC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,UAAU,CAAC,UAAU,QAAQ,MAAM,OAAO,KAAK;AAAA,gBAC/C,aAAY;AAAA;AAAA,YACd;AAAA,aACF,IACE;AAAA,WACN;AAAA,QACA,8CAAC,YACC;AAAA,uDAAC,UAAK,MAAK,UACR,qBAAW,SACR,gBACA,WAAW,YACT,kBACA,WACE,uBACA,QAAQ,SAAS,uBAAuB,qBAClD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,UAAW,CAAC,SAAS,UAAU,CAAC,KAAK,KAAK;AAAA,cAEnD;AAAA,2BAAW,SACV,6CAAC,8BAAM,MAAM,IAAI,eAAY,QAAO,IAEpC,6CAAC,gCAAQ,MAAM,IAAI,eAAY,QAAO;AAAA,gBAEvC,WAAW,SAAS,cAAc;AAAA;AAAA;AAAA,UACrC;AAAA,WACF;AAAA,QACC,QACC,6CAAC,OAAE,WAAU,qBAAoB,MAAK,SACnC,iBACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;ACpIA,IAAAC,mBAA6C;;;ACJ7C,IAAAC,gBAAyB;AACzB,IAAAC,uBAAqE;;;ACDrE,IAAAC,gBAAwF;AACxF,sBAAuB;AACvB,IAAAC,uBAAkB;AA0BZ,IAAAC,sBAAA;AAjBC,SAAS,iBAAiB,EAAE,OAAO,cAAc,kCAAkC,SAAS,SAAS,GAA0B;AACpI,QAAM,aAAS,sBAAuB,IAAI;AAC1C,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAkD,EAAE,OAAO,SAAS,OAAO,CAAC,EAAE,CAAC;AACvH,SAAO,6CAAC,SAAI,KAAK,QAAQ,WAAU,sBACjC,wDAAC,uBAAO,MAAP,EAAY,cAAc,CAAC,SAAS;AAhBzC;AAiBM,QAAI,CAAC,QAAQ,CAAC,OAAO,QAAS;AAC9B,UAAM,QAAO,YAAO,QAAQ,QAAQ,YAAY,MAAnC,YAAwC,OAAO;AAC5D,UAAM,WAAW,OAAO,iBAAiB,IAAI;AAC7C,UAAM,SAAiC,CAAC;AACxC,aAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,YAAM,OAAO,SAAS,KAAK,KAAK;AAChC,UAAI,KAAK,WAAW,SAAS,EAAG,QAAO,IAAI,IAAI,SAAS,iBAAiB,IAAI;AAAA,IAC/E;AACA,UAAM,YAAY,KAAK,aAAa,YAAY;AAChD,UAAM,OAAO,cAAc,UAAW,cAAc,cAAY,YAAO,eAAP,gCAAoB,gCAAgC;AACpH,oBAAgB,EAAE,OAAO,OAAO,SAAS,SAAS,OAAO,OAAwB,CAAC;AAAA,EACpF,GACE;AAAA,iDAAC,uBAAO,SAAP,EAAe,SAAO,MAAE,mBAAQ;AAAA,IACjC,8CAAC,uBAAO,QAAP,EACC;AAAA,mDAAC,uBAAO,SAAP,EAAe,WAAU,uBAAsB;AAAA,MAChD,8CAAC,uBAAO,SAAP,EAAe,WAAU,+BAA8B,cAAY,aAAa,OAAO,OAAO,aAAa,OAC1G;AAAA,qDAAC,SAAI,WAAU,sBAAqB,eAAY,QAAO;AAAA,QACvD,8CAAC,YAAO,WAAU,sBAChB;AAAA,wDAAC,SAAI;AAAA,yDAAC,uBAAO,OAAP,EAAa,WAAU,qBAAqB,iBAAM;AAAA,YACtD,6CAAC,uBAAO,aAAP,EAAmB,WAAU,2BAA2B,uBAAY;AAAA,aAAqB;AAAA,UAC5F,6CAAC,uBAAO,OAAP,EAAa,WAAU,qBAAoB,cAAW,iBAAgB,uDAAC,0BAAE,MAAM,IAAI,eAAY,QAAO,GAAE;AAAA,WAC3G;AAAA,QACA,6CAAC,SAAI,WAAU,oBAAoB,UAAS;AAAA,SAC9C;AAAA,OACF;AAAA,KACF,GACF;AACF;;;ADHM,IAAAC,sBAAA;AAhCC,SAAS,gBAAgB,OAAgB,QAAQ,OAA2B;AACjF,MAAI,CAAC,SAAS,wBAAwB,KAAK,KAAK,EAAG,QAAO;AAC1D,MAAI,UAAU,KAAK,KAAK,GAAG;AACzB,QAAI;AAAE,UAAI,IAAI,KAAK;AAAG,aAAO;AAAA,IAAO,QAAQ;AAAE,aAAO;AAAA,IAAW;AAAA,EAClE;AACA,MAAI,SAAS,gEAAgE,KAAK,KAAK,EAAG,QAAO;AACjG,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,OAAO,sBAAsB;AACpD,QAAI,CAAC,CAAC,UAAU,OAAO,EAAE,SAAS,OAAO,QAAQ,EAAG,QAAO;AAC3D,WAAO;AAAA,EACT,QAAQ;AAAE,WAAO;AAAA,EAAW;AAC9B;AACO,SAAS,mBAAmB,OAAoC;AACrE,MAAI,UAAU,UAAa,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,QAAO;AACxE,MAAI,QAAQ,KAAM,QAAO,QAAQ;AACjC,MAAI,QAAQ,OAAO,KAAM,SAAQ,QAAQ,MAAM,QAAQ,CAAC,IAAI;AAC5D,UAAQ,SAAS,OAAO,OAAO,QAAQ,CAAC,IAAI;AAC9C;AACO,SAAS,eAAe,EAAE,UAAU,YAAY,GAAG,GAAwB;AA3BlF;AA4BE,QAAM,EAAE,UAAU,WAAW,SAAS,WAAW,MAAM,IAAI;AAC3D,QAAM,SAAQ,cAAS,WAAT,YAAmB;AACjC,QAAM,QAAQ,UAAU,WAAW,QAAQ;AAC3C,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAiB;AACnD,QAAM,aAAa,QAAQ,gBAAgB,SAAS,KAAK,IAAI,IAAI;AACjE,QAAM,OAAO,gBAAgB,SAAS,KAAK,KAAK;AAChD,QAAM,QAAQ,UAAU;AACxB,QAAM,UAAU,UAAW,cAAc,cAAc,cAAe,YAAY;AAClF,QAAM,OAAO,QAAQ,qBAAAC,QAAY;AACjC,QAAM,QAAQ,UAAU,aAAa,mBAAc,UAAU,UAAU,0BAA0B;AACjG,QAAM,WAAW,CAAC,WAAW,mBAAmB,SAAS,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AACtF,SAAO,8CAAC,aAAQ,WAAW,iCAAiC,WAAW,cAAY,eAAe,UAAU,cAAY,OACrH;AAAA,aAAS,cAAc,cAAc,aAAa,6CAAC,SAAI,WAAU,2BAChE,uDAAC,SAAI,KAAK,YAAY,KAAK,UAAU,SAAQ,QAAO,SAAS,MAAM,aAAa,UAAU,GAAG,GAC/F,IAAS;AAAA,IACT,8CAAC,SAAI,WAAU,qBACb;AAAA,mDAAC,UAAK,WAAU,sBAAqB,uDAAC,QAAK,MAAM,IAAI,eAAY,QAAO,GAAE;AAAA,MAC1E,8CAAC,SAAI,WAAU,yBAAwB;AAAA,qDAAC,YAAO,OAAO,UAAW,oBAAS;AAAA,QAAS,6CAAC,UAAM,oBAAS;AAAA,SAAO;AAAA,MAC1G,6CAAC,UAAK,WAAU,uBAAsB,MAAK,UAAU,iBAAM;AAAA,OAC7D;AAAA,IACC,UAAU,WAAW,QAAQ,6CAAC,OAAE,WAAU,qBAAoB,MAAK,SAAS,iBAAM,IAAO;AAAA,IACzF,SAAS,SAAS,cAAc,cAAc,aAAa,6CAAC,OAAE,WAAU,qBAAoB,wCAA0B,IAAO;AAAA,IAC7H,UAAU,WAAW,QAAQ,8CAAC,YAAO,WAAU,yBAC7C;AAAA,gBAAU,6CAAC,oBAAiB,OAAO,UAAU,aAAa,UAAU,SAAS,6CAAC,YAAO,MAAK,UAAS,qBAAO,GACxG,mBAAS,cAAc,cAAc,aAClC,6CAAC,SAAI,WAAU,4BAA2B,KAAK,YAAY,KAAK,UAAU,SAAS,MAAM,aAAa,UAAU,GAAG,IACnH,6CAAC,SAAI,WAAU,sBAAqB,UAAU,GAAI,mBAAQ,GAChE,IAAsB;AAAA,MACrB,OAAO,8EACN;AAAA,sDAAC,OAAE,MAAM,MAAM,QAAO,UAAS,KAAI,cAAa;AAAA,uDAAC,qCAAa,MAAM,IAAI,eAAY,QAAO;AAAA,UAAE;AAAA,WAAI;AAAA,QACjG,8CAAC,OAAE,MAAM,MAAM,UAAU,UAAU,QAAO,UAAS,KAAI,cAAa;AAAA,uDAAC,iCAAS,MAAM,IAAI,eAAY,QAAO;AAAA,UAAE;AAAA,WAAQ;AAAA,SACvH,IAAM;AAAA,OACR,IAAY;AAAA,KACd;AACF;AACO,SAAS,gBAAgB,EAAE,WAAW,YAAY,GAAG,GAAyB;AACnF,SAAO,6CAAC,SAAI,WAAW,oBAAoB,WAAY,oBAAU,IAAI,CAAC,aAAa,6CAAC,kBAAiC,YAAb,SAAS,EAAwB,CAAE,GAAE;AAC/I;;;AEhEA,IAAAC,iBAA0C;AAC1C,IAAAC,uBAAsE;;;ACAtE,IAAAC,mBAaO;AACP,IAAAC,uBAA4B;AAC5B,IAAAC,iBAA6D;;;ACLtD,IAAM,wBAAwB,CAAC,YAAsC;AAC1E,QAAM,WAA6B,CAAC;AACpC,MAAI,SAAS;AAEb,SAAO,SAAS,QAAQ,QAAQ;AAC9B,UAAM,eAAe,QAAQ,QAAQ,cAAc,MAAM;AAEzD,QAAI,iBAAiB,IAAI;AACvB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,QAAQ,MAAM,MAAM;AAAA,MAC/B,CAAC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,QAAQ;AACzB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,QAAQ,MAAM,QAAQ,YAAY;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB,eAAe,aAAa;AAClD,UAAM,eAAe,QAAQ,QAAQ,eAAe,aAAa;AAEjE,QAAI,iBAAiB,IAAI;AACvB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,QAAQ,MAAM,aAAa,EAAE,KAAK;AAAA,QAC3C,YAAY;AAAA,MACd,CAAC;AACD;AAAA,IACF;AAEA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,QAAQ,MAAM,eAAe,YAAY,EAAE,KAAK;AAAA,MACzD,YAAY;AAAA,IACd,CAAC;AACD,aAAS,eAAe,cAAc;AAAA,EACxC;AAEA,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO,CAAC,EAAE,MAAM,YAAY,QAAQ,CAAC;AAAA,EACvC;AAEA,SAAO;AACT;;;ACpDO,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AACnC,IAAM,oBAAoB;AAQnB,IAAM,4BAA4B,CAAC,YAAiD;AACzF,MAAI,CAAC,QAAQ,WAAW,gBAAgB,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,QAAQ,QAAQ,mBAAmB;AAEvD,MAAI,gBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,GAAG,QAAQ,MAAM,iBAAiB,QAAQ,WAAW,EAAE,SAAS,iBAAiB,CAAC,EACnG,IAAI,CAAC,UAAU,MAAM,CAAC,EAAE,KAAK,CAAC,EAC9B,OAAO,OAAO;AAEjB,SAAO,WAAW,SACd,EAAE,YAAY,SAAS,QAAQ,MAAM,cAAc,oBAAoB,MAAM,EAAE,IAC/E;AACN;;;ACnCA,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ACGO,IAAM,SAAS;AAAA,EACpB,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,UAAU;AAAA,EACV,MAAM;AAAA,EACN,cAAc;AAAA,EACd,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AACb;;;ACrBA,IAAM,YAAY;AAEX,IAAM,uBAAuB,MAClC,OAAO,WAAW,eAAe,OAAO,WAAW,kCAAkC,EAAE;AAElF,IAAM,aAAa,CAAC,SAAuB;AAPlD;AAQE,4CAAM,QAAQ,eAAd,YAA6B,OAAO,aAAa,cAAc,SAAS,cAAc,SAAS,IAAI;AAAA;AAErG,IAAM,UAAU,CAAC,MAAc,SAA0B;AACvD,QAAM,OAAO,WAAW,IAAI;AAC5B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,IAAI,EAAE,iBAAiB,IAAI;AACrD;AAGO,IAAM,iBAAiB,CAAC,MAAc,UAAkB,SAA0B;AACvF,QAAM,QAAQ,WAAW,QAAQ,MAAM,IAAI,CAAC;AAC5C,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEA,IAAM,eAAe,oBAAI,QAA6B;AACtD,IAAM,cAAc,oBAAI,QAA6B;AAyD9C,IAAM,oBAAoB,CAAC,MAAmB,YAAuC;AAnF5F;AAoFE,QAAM,QACJ,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,IAC3B,QACC,UAAK,cAA2B,IAAI,OAAO,KAAK,EAAE,MAAlD,YAAuD;AAE9D,OAAK,UAAU,IAAI,OAAO,OAAO;AACjC,QAAM,UAAU,IAAI,OAAO,OAAO;AAElC,QAAM,UAAU,OAAO,OAAO,SAAS;AACvC,OAAK,MAAM;AACX,QAAM,UAAU,IAAI,OAAO,SAAS;AAEpC,QAAM,gBAAgB,YAAY,IAAI,KAAK;AAC3C,MAAI,eAAe;AACjB,WAAO,aAAa,aAAa;AAAA,EACnC;AAEA,QAAM,UACJ,eAAe,iBAAiB,IAAI,IAAI,IAAI,IAAI,eAAe,iBAAiB,IAAI,IAAI,IAAI;AAC9F,cAAY;AAAA,IACV;AAAA,IACA,OAAO,WAAW,MAAM;AACtB,YAAM,UAAU,OAAO,OAAO,SAAS;AACvC,kBAAY,OAAO,KAAK;AAAA,IAC1B,GAAG,UAAU,EAAE;AAAA,EACjB;AAEA,QAAM,iBAAiB,aAAa,IAAI,IAAI;AAC5C,MAAI,gBAAgB;AAClB,WAAO,aAAa,cAAc;AAClC,iBAAa,OAAO,IAAI;AAAA,EAC1B;AAEA,OAAI,mCAAS,YAAW,OAAO;AAC7B;AAAA,EACF;AAEA,QAAM,OAAO,eAAe,iBAAiB,KAAM,IAAI;AACvD,eAAa;AAAA,IACX;AAAA,IACA,OAAO,WAAW,MAAM;AACtB,mBAAa,OAAO,IAAI;AACxB,WAAK,UAAU,OAAO,OAAO,OAAO;AACpC,YAAM,UAAU,OAAO,OAAO,OAAO;AAAA,IACvC,GAAG,UAAU,IAAI;AAAA,EACnB;AACF;AAyBO,IAAM,qBAAqB,CAAC,SAAyB;AAC1D,QAAM,MAAM,KAAK,KAAK,KAAK,eAAe,CAAC;AAC3C,OAAK,MAAM,kBAAkB,OAAO,GAAG;AACvC,OAAK,MAAM,mBAAmB,OAAO,GAAG;AAC1C;;;AC7JA,IAAAC,gBAAuD;AA6CnD,IAAAC,sBAAA;AAhCG,SAAS,SAAS,EAAE,MAAM,WAAW,GAAG,MAAM,GAAkB;AACrE,QAAM,UAAM,sBAAwB,IAAI;AACxC,QAAM,eAAW,sBAAO,IAAI;AAE5B,+BAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,MAAM,SAAS,YAAY,MAAM;AACpC;AAAA,IACF;AAEA,QAAI,qBAAqB,GAAG;AAC1B,eAAS,UAAU;AACnB,SAAG,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,MAAM,eAAe,mBAAmB,KAAK,EAAE;AACrD,OAAG,UAAU,IAAI,OAAO,MAAM;AAE9B,UAAM,QAAQ,OAAO,WAAW,MAAM;AACpC,SAAG,UAAU,OAAO,OAAO,MAAM;AACjC,SAAG,UAAU,IAAI,OAAO,YAAY;AACpC,SAAG,cAAc;AACjB,eAAS,UAAU;AACnB,WAAK,GAAG;AACR,SAAG,UAAU,OAAO,OAAO,YAAY;AAAA,IACzC,GAAG,GAAG;AAEN,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EACxC,GAAG,CAAC,IAAI,CAAC;AAET,SACE,6CAAC,UAAK,KAAU,WAAW,GAAG,OAAO,UAAU,SAAS,GAAI,GAAG,OAC5D,mBAAS,SACZ;AAEJ;;;AC/CA,IAAAC,gBAAmD;AAuJ1C,IAAAC,sBAAA;AAjEF,SAAS,gBACd,OACA,OACA,UACoB;AACpB,SAAO,OAAO,UAAU,aACnB,MAA8D,OAAO,QAAQ,IAC9E;AACN;AAEO,SAAS,oBACd,YACA,OACA,UACmC;AAxGrC;AAyGE,QAAM,QAAQ,gBAAgB,WAAW,OAAO,OAAO,QAAQ;AAE/D,SAAO;AAAA,IACL,QACE,qBAAgB,WAAW,OAAO,OAAO,QAAQ,MAAjD,YACA,WAAW,KAAK,QAAQ,SAAS,GAAG;AAAA,IACtC,OAAO,wBAAS,WAAW;AAAA,IAC3B,QAAQ,gBAAgB,WAAW,QAAQ,OAAO,QAAQ;AAAA,IAC1D,MAAM,gBAAgB,WAAW,MAAM,OAAO,QAAQ;AAAA,IACtD,WAAW,gBAAgB,WAAW,WAAW,OAAO,QAAQ;AAAA,EAClE;AACF;AAEO,SAAS,mBACd,OAC+B;AAC/B,SAAO,QAAQ,SAAS,OAAO,UAAU,YAAY,eAAe,KAAK;AAC3E;AAQA,IAAM,oBAAgB,6BAAyC,IAAI;AA4B5D,SAAS,aAAa;AAC3B,QAAM,cAAU,0BAAW,aAAa;AAExC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,iBAAiB,YAAY;AAAA,MAC7B,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBACd,MACA,UACwB;AA/K1B;AAgLE,UAAO,cAAS,KAAK,IAAI,MAAlB,YAAuB;AAChC;;;AChLA,sCAAuC;AACvC,IAAAC,mBAAqB;AAuDjB,IAAAC,uBAAA;AAnDJ,IAAM,qBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,OAAO;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAKK;AACH,QAAM,OAAO,UAAU,sBAAK,OAAO;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,iBAAe,WAAW,SAAS;AAAA,MACnC,aAAW,WAAW,OAAO;AAAA,MAC7B,UAAU,YAAY;AAAA,MACtB,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MACzD,GAAG;AAAA;AAAA,EACN;AAEJ;;;AC/DE,IAAAC,uBAAA;AADK,IAAM,eAAe,MAC1B,+CAAC,SAAI,WAAU,sBAAqB,MAAK,UAAS,cAAW,wBAC3D;AAAA,gDAAC,UAAK,WAAU,qBAAoB;AAAA,EACpC,8CAAC,UAAK,WAAU,qBAAoB;AAAA,EACpC,8CAAC,UAAK,WAAU,6CAA4C;AAAA,GAC9D;AAGK,IAAM,uBAAuB,MAClC,+CAAC,SAAI,WAAU,+BAA8B,cAAW,8BACtD;AAAA,gDAAC,UAAO,UAAQ,MAAC,MAAK,MAAK,SAAQ,aAAY,MAAK,UAAS,UAAU,IAAI,eAAY,QAAO,qBAE9F;AAAA,EACA,8CAAC,UAAO,UAAQ,MAAC,MAAK,MAAK,SAAQ,WAAU,MAAK,UAAS,UAAU,IAAI,eAAY,QAAO,oBAE5F;AAAA,GACF;;;AChBF,IAAAC,gBAAiC;;;ACuBrB,IAAAC,uBAAA;AAbL,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,SACE,+CAAC,aAAQ,WAAW,GAAG,oBAAoB,SAAS,GAAG,cAAY,OACjE;AAAA,mDAAC,YAAO,WAAU,sBAChB;AAAA,qDAAC,SAAI,WAAU,uBACZ;AAAA,gBACC,+CAAC,SAAI,WAAU,yBACb;AAAA,wDAAC,UAAK,WAAU,0BAAyB,eAAY,QAAO;AAAA,UAC5D,8CAAC,UAAK,WAAU,qBAAqB,iBAAM;AAAA,WAC7C,IACE;AAAA,QACJ,8CAAC,SAAI,WAAU,qBAAqB,iBAAM;AAAA,SAC5C;AAAA,MACC,SAAS,8CAAC,SAAI,WAAU,sBAAsB,kBAAO,IAAS;AAAA,OACjE;AAAA,IAEC,WAAW,8CAAC,SAAI,WAAU,oBAAoB,UAAS,IAAS;AAAA,IAChE,OAAO,8CAAC,SAAI,WAAU,oBAAoB,gBAAK,IAAS;AAAA,KAC3D;AAEJ;;;ADsBI,IAAAC,uBAAA;AAhDG,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,UAAU;AACZ,GAGG;AACD,QAAM,EAAE,SAAS,iBAAiB,SAAS,IAAI,WAAW;AAC1D,QAAM,QAAQ,kBAAkB,MAAM,OAAO;AAC7C,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,sBAAkB,sBAAO,KAAK;AACpC,QAAM,iBAAiB,YAAY;AAEnC,QAAM,UAAU,OAAO,OAAgB,OAAgB,aAAsB;AAC3E,QAAI,CAAC,KAAK,eAAe,YAAY,aAAa,gBAAgB,SAAS;AACzE;AAAA,IACF;AAEA,oBAAgB,UAAU;AAC1B,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,gBAAgB;AAAA,QACpB,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,mBAAa,KAAK;AAClB,YAAM;AAAA,IACR,UAAE;AACA,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,WAA2B;AAAA,IAC/B,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,IACjB,aAAa,QAAQ,KAAK,WAAW;AAAA,IACrC,UAAU;AAAA,IACV;AAAA,IACA,aAAa,OAAO,aAAa;AAC/B,YAAM,QAAQ,SAAS,OAAO,SAAS,OAAO,SAAS,QAAQ;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,SACb,+CAAC,SAAI,WAAU,eAAc,gBAAc,UAAU,SAAS,QAC3D;AAAA;AAAA,IACA,UAAU,8CAAC,wBAAqB,IAAK;AAAA,KACxC;AAGF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,KAAK;AAAA,UACZ,QAAO;AAAA,UACP,WAAU;AAAA,UAEV,wDAAC,SAAI,WAAU,mBAAmB,eAAK,UAAU,KAAK,OAAO,MAAM,CAAC,GAAE;AAAA;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mBAAmB,KAAK,GAAG;AAC7B,UAAMC,aAAY,MAAM;AACxB,UAAM,UAAU,8CAACA,YAAA,EAAW,GAAG,KAAK,OAAO,QAAQ,UAAU;AAE7D,QAAI,MAAM,UAAU,OAAO;AACzB,aAAO,MAAM,OAAO;AAAA,IACtB;AAEA,WAAO;AAAA,MACL,8CAAC,cAAY,GAAG,oBAAoB,OAAO,KAAK,OAAO,QAAQ,GAAI,mBAAQ;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,YAAY;AAElB,SAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,UAAU;AAAA,QACV,WAAW,OAAO,aAAa;AAC7B,cAAI,CAAC,KAAK,eAAe,YAAY,aAAa,gBAAgB,SAAS;AACzE;AAAA,UACF;AAEA,0BAAgB,UAAU;AAC1B,uBAAa,IAAI;AACjB,cAAI;AACF,kBAAM,gBAAgB,QAAQ;AAAA,UAChC,SAAS,OAAO;AACd,yBAAa,KAAK;AAClB,kBAAM;AAAA,UACR,UAAE;AACA,4BAAgB,UAAU;AAAA,UAC5B;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EACF;AACF;;;AExHA,IAAAC,iBAAwE;AACxE,2BAAqD;AACrD,4BAA0B;AAE1B,wBAAsB;;;ACJtB,IAAAC,iBAQO;AAsGE,IAAAC,uBAAA;AA3FT,IAAM,mBAAe,8BAAwC,IAAI;AA8F1D,SAAS,WAAW;AACzB,QAAM,cAAU,2BAAW,YAAY;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO;AACT;;;ACzHO,IAAM,iBAAsD;AAAA,EACjE,OAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,MAAM;AAAA,MACN,KAAK;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,MAAM;AAAA,MACN,KAAK;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;AFqBI,IAAAC,uBAAA;AA1DJ,IAAM,kBAAoE;AAAA,EACxE,QAAQ,CAAC,kBAAAC,OAAS;AAAA,EAClB,QAAQ,CAAC;AACX;AAEA,IAAM,sBAA2C,oBAAI,IAAI;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,sBAAsB,CAAC,UAC3B,oBAAoB,IAAI,KAAK;AAE/B,IAAM,kBAAkB,CAAC,cAA0C;AA1CnE;AA2CE,QAAM,QAAQ,uCAAW,MAAM;AAC/B,QAAM,YAAW,oCAAQ,OAAR,mBAAY;AAC7B,SAAO,YAAY,oBAAoB,QAAQ,IAAI,WAAW;AAChE;AAEA,IAAM,iBAAiB,CAAC,UAA2B;AACjD,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,cAAc,EAAE,KAAK,EAAE;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC;AAAA,EACzB;AAAA,EACA;AACF,MAGM;AACJ,QAAM,EAAE,cAAc,IAAI,SAAS;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA,OAAO,eAAe,aAAa;AAAA,MACnC,gBAAc;AAAA,MACd,iBAAe;AAAA,MACf,cAAY;AAAA,MAEX;AAAA;AAAA,EACH;AAEJ;AAEA,IAAM,cAAc,CAAC,EAAE,WAAW,SAAS,MAAuC;AAChF,QAAM,QAAQ,wBAAS,QAAQ,QAAQ,EAAE,CAAC;AAC1C,QAAM,WAAO,+BAA2D,KAAK,IACzE,eAAe,MAAM,MAAM,QAAQ,IACnC,eAAe,QAAQ;AAC3B,QAAM,oBAAgB,+BAAuC,KAAK,IAC9D,MAAM,MAAM,YACZ;AAEJ,SACE,8CAAC,SAAI,WAAW,GAAG,QAAQ,SAAS,GAClC;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,gBAAgB,aAAa;AAAA,MACvC,MAAM,KAAK,QAAQ,OAAO,EAAE;AAAA;AAAA,EAC9B,GACF;AAEJ;AAEA,IAAM,qBAAqB;AAAA,EACzB,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,MACxB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAO;AAAA,MACP,KAAI;AAAA,MACH,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,MACxB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,gEAAgE,SAAS;AAAA,MACvF,OAAO,EAAE,UAAU,yBAAyB,YAAY,2BAA2B;AAAA,MAClF,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACxD,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,gDAAgD,SAAS;AAAA,MACvE,OAAO,EAAE,UAAU,yBAAyB,YAAY,2BAA2B;AAAA,MAClF,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,mDAAmD,SAAS;AAAA,MAC1E,OAAO,EAAE,UAAU,yBAAyB,YAAY,2BAA2B;AAAA,MAClF,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,QAAQ,SAAS;AAAA,MAC/B,OAAO,EAAE,YAAY,6BAA6B;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAAA,EAEF,YAAY,CAAC,EAAE,WAAW,GAAG,MAAM,MACjC,8CAAC,gBAAW,WAAW,GAAG,iBAAiB,SAAS,GAAI,GAAG,OAAO;AAAA,EAEpE,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MACzB,8CAAC,QAAG,WAAW,GAAG,4CAA4C,SAAS,GAAI,GAAG,OAAO;AAAA,EAEvF,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,MAC5B,8CAAC,SAAI,WAAU,oBACb,wDAAC,WAAM,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAAO,GAC1D;AAAA,EAEF,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,MAAyC,8CAAC,WAAO,GAAG,OAAO;AAAA,EACzF,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,MAAyC,8CAAC,WAAO,GAAG,OAAO;AAAA,EACzF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MAAsC,8CAAC,QAAI,GAAG,OAAO;AAAA,EAChF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MAAsC,8CAAC,QAAI,GAAG,OAAO;AAAA,EAChF,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,MAAsC,8CAAC,QAAI,GAAG,OAAO;AAAA,EAChF,KAAK;AAAA;AAAA;AAAA;AAAA,EAIL,MAAM,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,MACrC,8CAAC,UAAK,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,OACnD,UACH;AAEJ;AAOO,IAAM,kBAAkB,CAAC,EAAE,UAAU,UAAU,MACpD,8CAAC,SAAI,WAAW,GAAG,uCAAuC,SAAS,GACjE;AAAA,EAAC,sBAAAC;AAAA,EAAA;AAAA,IACC,eAAe,gBAAgB;AAAA,IAC/B,eAAe,gBAAgB;AAAA,IAC/B,YAAY;AAAA,IAEX;AAAA;AACH,GACF;;;AGrOF,IAAAC,uBAAsC;AACtC,IAAAC,iBAAoD;;;ACDpD,IAAAC,iBAA4C;AAqDtC,IAAAC,uBAAA;AAlDC,IAAM,iBAAiB,CAAC,WAAoB;AACjD,QAAM,mBAAe,uBAAO,CAAC;AAC7B,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,CAAC;AAExC,gCAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,iBAAa,UAAU,KAAK,IAAI;AAChC,eAAW,CAAC;AAEZ,UAAM,QAAQ,OAAO,YAAY,MAAM;AACrC,iBAAW,KAAK,IAAI,IAAI,aAAa,OAAO;AAAA,IAC9C,GAAG,GAAG;AAEN,WAAO,MAAM,OAAO,cAAc,KAAK;AAAA,EACzC,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;AAWO,IAAM,qBAAqB,CAAC,iBAAyB;AAC1D,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,eAAe,GAAI,CAAC;AAE3D,MAAI,UAAU,IAAI;AAChB,WAAO,GAAG,OAAO,IAAI,YAAY,IAAI,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,YAAY,UAAU;AAC5B,QAAM,cAAc,GAAG,OAAO,IAAI,YAAY,IAAI,WAAW,SAAS;AAEtE,SAAO,YAAY,IACf,GAAG,WAAW,IAAI,SAAS,IAAI,cAAc,IAAI,WAAW,SAAS,KACrE;AACN;;;ADhBM,IAAAC,uBAAA;AApBC,IAAM,gBAAgB,CAAC,EAAE,YAAY,WAAW,SAAS,MAA0B;AACxF,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,IAAI;AACzC,QAAM,kBAAkB,eAAe,CAAC,UAAU;AAClD,QAAM,UAAU,gCAAa;AAE7B,gCAAU,MAAM;AACd,QAAI,CAAC,YAAY;AACf,gBAAU,IAAI;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,aAAa,yBAAyB;AAAA,MACxC;AAAA,MACA,MAAM;AAAA,MACN,UAAU,CAAC,UAAU,UAAU,MAAM,cAAc,IAAI;AAAA,MAEvD;AAAA,uDAAC,aACC;AAAA,wDAAC,iCAAS,WAAU,uBAAsB,eAAY,QAAO;AAAA,UAC7D;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM,aAAa,eAAe,mBAAmB,OAAO,CAAC,KAAK;AAAA;AAAA,UACpE;AAAA,UACC,cAAc,8CAAC,oCAAY,WAAU,uBAAsB,eAAY,QAAO;AAAA,WACjF;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;;;AfqDU,IAAAC,uBAAA;AAvDV,IAAM,gBAAgB,CAAC,UACrB,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAE9D,IAAM,aAAa,CAAC,UAAmB;AACrC,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,IAAM,aAAa,CAAC,SAAwB;AA1D5C;AA2DE,QAAM,UAAS,UAAK,WAAL,YAAe,KAAK;AAEnC,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,SAAQ,oCAAO,SAAP,YAAe,OAAO,SAAtB,YAA8B,OAAO,aAArC,YAAiD,OAAO,UAAxD,YAAiE,OAAO,YAAxE,YAAmF,OAAO;AAExG,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AAC7D;AAEA,IAAM,iBAAiB,CAAC,UAAkC;AACxD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,iBAAiB,CAAC,EAAE,KAAK,MAAoC;AACjE,QAAM,aAAa,KAAK,UAAU;AAElC,SACE,8CAAC,iBAAc,YACZ,WAAC,CAAC,KAAK,KAAK,KAAK,KAChB,8CAAC,SAAI,WAAU,oBACb,wDAAC,mBAAiB,eAAK,MAAK,GAC9B,GAEJ;AAEJ;AAEA,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AACF,MAGM;AACJ,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,SAAS;AACtD,QAAM,YAA2B,YAAY,MAAM;AACnD,QAAM,YAAY,QAAQ,cAAc,MAAM;AAC9C,QAAM,aAAgC,YAAY,OAAO;AAEzD,MAAI,aAAa,CAAC,YAAY;AAC5B,kBAAc,IAAI;AAAA,EACpB;AAEA,sCAAgB,MAAM;AACpB,QAAI,QAAQ,SAAS;AACnB,yBAAmB,QAAQ,OAAO;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,SACE,8CAAC,UAAK,WAAU,kBAAiB,eAAY,QAC3C,yDAAC,UAAK,WAAW,OAAO,UAAU,cAAY,WAC5C;AAAA,kDAAC,UAAK,WAAW,OAAO,MAAM,aAAU,KACtC,wDAAC,UAAK,WAAU,sBAAqB,GACvC;AAAA,IACA,8CAAC,UAAK,WAAW,OAAO,MAAM,aAAU,KACrC,mBACC,YACE,8CAAC,UAAK,WAAW,OAAO,cAAc,cAAY,YAChD,wDAAC,SAAI,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,MAAK,QACnD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB,GACF,GACF,IAEA,8CAAC,SAAI,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,MAAK,QACnD;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB,GACF,IAGF,8CAAC,SAAI,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,MAAK,QACnD;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB,GACF,GAEJ;AAAA,KACF,GACF;AAEJ;AAEA,IAAM,YAAY,CAAC,EAAE,KAAK,MAA+B;AAhLzD;AAiLE,QAAM,cAAU,uBAA2B,IAAI;AAC/C,QAAM,YACJ,KAAK,UAAU,qBACf,KAAK,UAAU,qBACf,KAAK,UAAU;AACjB,QAAM,UAAU,KAAK,UAAU,kBAAkB,KAAK,UAAU;AAChE,QAAM,SAAS,CAAC,aAAa,CAAC;AAC9B,QAAM,SAAS,WAAW,IAAI;AAE9B,gCAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,QAAQ,SAAS;AAChC;AAAA,IACF;AAEA,sBAAkB,QAAQ,SAAS,EAAE,QAAQ,MAAM,CAAC;AAAA,EACtD,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,OAAO;AAAA,QACP,YAAY,uBAAuB,UAAU,qBAAqB;AAAA,MACpE;AAAA,MACA,MAAM,aAAa;AAAA,MAEnB;AAAA,uDAAC,aAAQ,WAAW,GAAG,OAAO,OAAO,WAAW,OAAO,OAAO,GAC5D;AAAA,wDAAC,oCAAY,WAAU,sBAAqB,eAAY,QAAO;AAAA,UAC/D,8CAAC,kBAAe,WAAsB,QAAgB;AAAA,UACtD,8CAAC,UAAK,WAAU,mBAAmB,qBAAK,UAAL,YAAc,KAAK,UAAS;AAAA,UAC9D,SAAS,8CAAC,UAAK,WAAU,mBAAmB,kBAAO,IAAU;AAAA,UAC9D,8CAAC,YAAS,WAAU,oBAAmB,MAAM,eAAe,KAAK,KAAK,GAAG;AAAA,WAC3E;AAAA,QACA,+CAAC,SAAI,WAAU,mBACZ;AAAA,eAAK,UAAU,UACd,+CAAC,SAAI,WAAU,sBACb;AAAA,0DAAC,SAAI,WAAU,4BAA2B,mBAAK;AAAA,YAC/C,8CAAC,SAAI,WAAU,mBAAmB,qBAAW,KAAK,KAAK,GAAE;AAAA,aAC3D;AAAA,UAED,KAAK,WAAW,UACf,+CAAC,SAAI,WAAU,sBACb;AAAA,0DAAC,SAAI,WAAU,4BAA2B,oBAAM;AAAA,YAChD,8CAAC,SAAI,WAAU,mBAAmB,qBAAW,KAAK,MAAM,GAAE;AAAA,aAC5D;AAAA,UAED,KAAK,aACJ,+CAAC,SAAI,WAAU,sBACb;AAAA,0DAAC,SAAI,WAAU,4BAA2B,mBAAK;AAAA,YAC/C,8CAAC,SAAI,WAAU,oCAAoC,eAAK,WAAU;AAAA,aACpE;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,iBAAiB,CAAC,EAAE,KAAK,MAC7B,+CAAC,OAAE,WAAU,gBAAe,MAAM,KAAK,KAAK,QAAO,UAAS,KAAI,cAC9D;AAAA,gDAAC,UAAK,WAAU,sBAAqB,oBAAM;AAAA,EAC3C,8CAAC,UAAK,WAAU,sBAAsB,eAAK,SAAS,KAAK,KAAI;AAAA,GAC/D;AAGF,IAAM,sBAAsB,CAAC,EAAE,KAAK,MAClC,+CAAC,SAAI,WAAU,sCACb;AAAA,gDAAC,UAAK,WAAU,sBAAqB,sBAAQ;AAAA,EAC7C,8CAAC,UAAK,WAAU,sBAAsB,eAAK,OAAM;AAAA,EAChD,KAAK,YAAY,8CAAC,UAAK,WAAU,qBAAqB,eAAK,UAAS;AAAA,GACvE;AAGF,IAAM,YAAY,CAAC,EAAE,KAAK,MACxB,8CAAC,kBAAe,UAAU;AAAA,EACxB,IAAI,KAAK;AAAA,EAAK,UAAU,KAAK,aAAa,KAAK,UAAU,WAAW,QAAQ,IAAI,oBAAoB;AAAA,EACpG,WAAW,KAAK;AAAA,EAAW,KAAK,KAAK;AAAA,EAAK,QAAQ;AACpD,GAAG;AAGL,IAAM,kBAAkB,CAAC,EAAE,KAAK,MAC9B,+CAAC,aAAQ,WAAU,0BACjB;AAAA,iDAAC,aACC;AAAA,kDAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO;AAAA,IACxD,+CAAC,UAAK,WAAU,mBAAkB;AAAA;AAAA,MAAM,KAAK;AAAA,OAAK;AAAA,KACpD;AAAA,EACA,8CAAC,SAAI,WAAU,mBACb,wDAAC,SAAI,WAAU,mBAAmB,qBAAW,KAAK,IAAI,GAAE,GAC1D;AAAA,GACF;AAGF,IAAM,yBAAyB,CAAC,EAAE,MAAM,OAAO,MAAyC;AA7QxF;AA8QE,QAAM,uBAAuB,SAAS,0BAA0B,IAAI,IAAI;AACxE,QAAM,WAAU,kEAAsB,YAAtB,YAAiC;AACjD,QAAM,WAAW,sBAAsB,OAAO;AAE9C,SACE,gFACG;AAAA,4BACC,8CAAC,SAAI,WAAU,uBACZ,+BAAqB,WAAW,IAAI,CAAC,WAAW,UAC/C;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAEV;AAAA,yDAAC,SAAI,WAAU,wBAAuB;AAAA;AAAA,YACzB,QAAQ;AAAA,aACrB;AAAA,UACA,8CAAC,SAAI,WAAU,uBAAuB,qBAAU;AAAA;AAAA;AAAA,MAN3C,GAAG,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,CAAC;AAAA,IAOzC,CACD,GACH;AAAA,IAED,SAAS,IAAI,CAAC,SAAS,UAAU;AAnSxC,UAAAC;AAoSQ,UAAI,CAAC,QAAQ,QAAQ,KAAK,KAAK,QAAQ,SAAS,YAAY;AAC1D,eAAO;AAAA,MACT;AAEA,UAAI,QAAQ,SAAS,cAAc,CAAC,QAAQ;AAC1C,cAAM,cAAaA,MAAA,QAAQ,eAAR,OAAAA,MAAsB;AAEzC,eACE,8CAAC,iBAAwC,YACtC,WAAC,CAAC,QAAQ,QAAQ,KAAK,KACtB,8CAAC,SAAI,WAAU,oBACb,wDAAC,mBAAiB,kBAAQ,SAAQ,GACpC,KAJgB,YAAY,KAAK,EAMrC;AAAA,MAEJ;AAEA,aAAO,8CAAC,mBAAqC,kBAAQ,WAAxB,MAAM,KAAK,EAAqB;AAAA,IAC/D,CAAC;AAAA,KACH;AAEJ;AAEA,IAAM,mBAAmB,CAAC,SAAgD;AACxE,QAAM,SACJ,KAAK,UAAU,sBAAsB,KAAK,WAAW,SACjD,KAAK,SACL,KAAK;AAEX,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,OAAO;AAAA,IACP,aAAa,KAAK,aAAa,cAAc,OAAO,gBAAgB;AAAA,EACtE;AACF;AAEA,IAAM,mBAAmB,CAAC,UAA0C;AAAA,EAClE,MAAM;AAAA,EACN,MAAM,KAAK;AAAA,EACX,IAAI,KAAK;AAAA,EACT,OAAO,cAAc,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,OAAO,KAAK,KAAK;AAAA,EACjE,aAAa,cAAc,KAAK,IAAI,IAAI,KAAK,KAAK,gBAAgB,OAAO;AAC3E;AAEA,IAAM,WAAW,CAAC,EAAE,MAAM,OAAO,OAAO,MAA2D;AACjG,QAAM,EAAE,QAAQ,IAAI,WAAW;AAE/B,MAAI,KAAK,SAAS,UAAU;AAC1B,WAAO,SAAS,OAAO,8CAAC,kBAAkD,QAA9B,UAAU,KAAK,MAAM,KAAK,EAAgB;AAAA,EACxF;AAEA,MAAI,KAAK,SAAS,UAAU,CAAC,QAAQ;AACnC,UAAM,QAAQ,QAAQ,KAAK,QAAQ;AACnC,UAAM,WAAW,SAAS,UAAU,gBAAgB,KAAK,QAAQ;AACjE,UAAM,aAAa,WAAW,iBAAiB,IAAI,IAAI,kBAAkB,IAAI;AAC7E,QAAI,YAAY;AACd,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,SAAS,KAAK,UAAU;AAAA;AAAA,QAFnB,eAAe,KAAK,cAAc,KAAK;AAAA,MAG9C;AAAA,IAEJ;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,UAAU,CAAC,UAAU,QAAQ,KAAK,IAAI,GAAG;AAEzD,UAAM,UAAU,QAAQ,KAAK,IAAI,MAAM,gBAAgB,KAAK,IAAI;AAChE,QAAI,YAAa,KAAK,SAAS,cAAc,KAAC,gCAAc,KAAK,IAAI,KAChE,KAAK,SAAS,cAAc,KAAC,gCAAc,KAAK,IAAI,GAAK,QAAO,8CAAC,mBAAgB,MAAY;AAClG,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,iBAAiB,IAAI;AAAA;AAAA,MADtB,eAAe,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK;AAAA,IAEnD;AAAA,EAEJ;AAEA,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,UAAI,CAAC,UAAU,KAAK,UAAU,eAAe,KAAK,KAAK,KAAK,EAAE,WAAW,GAAG;AAC1E,eAAO,8CAAC,kBAAkB,QAAQ,KAAK,EAAI;AAAA,MAC7C;AACA,aAAO,8CAAC,0BAA6C,MAAM,KAAK,MAAM,UAAlC,QAAQ,KAAK,EAAqC;AAAA,IACxF,KAAK;AACH,aAAO,SAAS,OAAO,8CAAC,kBAA0C,QAAtB,aAAa,KAAK,EAAgB;AAAA,IAChF,KAAK;AACH,aAAO,SAAS,OAAO,8CAAC,aAAmD,QAApC,QAAQ,KAAK,cAAc,KAAK,EAAgB;AAAA,IACzF,KAAK;AACH,aAAO,8CAAC,kBAA4D,QAAxC,cAAc,KAAK,YAAY,KAAK,EAAgB;AAAA,IAClF,KAAK;AACH,aAAO,8CAAC,uBAAiE,QAAxC,cAAc,KAAK,YAAY,KAAK,EAAgB;AAAA,IACvF,KAAK;AACH,aAAO,8CAAC,aAAgC,QAAjB,QAAQ,KAAK,EAAgB;AAAA,IACtD,KAAK;AACH,UAAI,KAAK,SAAS,WAAW,KAAK,SAAS,aAAa,KAAK,SAAS,mBAAmB;AACvF,eAAO;AAAA,MACT;AACA,aAAO,8CAAC,mBAA8D,QAAzC,QAAQ,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,EAAgB;AAAA,IACpF,KAAK;AACH,aACE,+CAAC,aAAiC,WAAU,0BAC1C;AAAA,uDAAC,aACC;AAAA,wDAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO;AAAA,UACxD,8CAAC,UAAK,WAAU,mBAAmB,eAAK,SAAQ;AAAA,WAClD;AAAA,QACA,8CAAC,SAAI,WAAU,mBACb,wDAAC,SAAI,WAAU,mBAAmB,qBAAW,KAAK,GAAG,GAAE,GACzD;AAAA,WAPY,WAAW,KAAK,EAQ9B;AAAA,IAEJ;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,iBAAiB,CAAC,EAAE,OAAO,SAAS,MAAM,MAA2B;AAChF,QAAM,iBAAa,sCAAoB,KAAK;AAE5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SAAS,oBAAoB;AAAA,MAC/B;AAAA,MAEC,qBAAW,IAAI,CAAC,MAAM,UACrB,8CAAC,YAAuC,MAAY,OAAc,UAAnD,GAAG,KAAK,IAAI,IAAI,KAAK,EAA8C,CACnF;AAAA;AAAA,EACH;AAEJ;;;AD5ZgF,IAAAC,uBAAA;AAVhF,IAAM,YAAQ,8BAAc,CAAC;AAC7B,IAAM,SAAS,EAAE,QAAQ,UAAU,SAAS,WAAW,WAAW,aAAa,QAAQ,UAAU,WAAW,YAAY;AAEjH,SAAS,eAAe,EAAE,UAAU,YAAY,GAAG,GAAwB;AAChF,QAAM,YAAQ,2BAAW,KAAK;AAC9B,QAAM,EAAE,OAAO,MAAM,OAAO,SAAS,UAAU,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,MAAM,IAAI;AACxF,QAAM,OAAO,UAAU,cAAc,mCAAc,UAAU,WAAW,+BAAU,UAAU,YAAY,oCAAe;AACvH,QAAM,aAAa,QAAQ;AAC3B,QAAM,aAAa,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ;AACzE,SAAO,+CAAC,aAAQ,WAAW,iCAAiC,WAAW,cAAY,OAAO,cAAY,eAAe,OACnH;AAAA,mDAAC,SAAI,WAAU,yBAAwB;AAAA,oDAAC,UAAK,WAAU,sBAAqB,wDAAC,QAAK,MAAM,IAAI,eAAY,QAAO,GAAE;AAAA,MAC/G,+CAAC,SAAI;AAAA,sDAAC,YAAQ,iBAAM;AAAA,QAAS,8CAAC,UAAK,WAAU,uBAAsB,MAAK,UAAU,iBAAO,KAAK,GAAE;AAAA,SAAO;AAAA,MACtG,aAAa;AAAA,QAAC;AAAA;AAAA,UAAiB;AAAA,UAAc,aAAa,QAAQ;AAAA,UACjE,SAAS,+CAAC,YAAO,WAAU,yBAAwB,MAAK,UAAS,cAAY,uBAAuB,OAAO;AAAA;AAAA,YAAa,8CAAC,qCAAa,MAAM,IAAI,eAAY,QAAO;AAAA,aAAE;AAAA,UACrK,yDAAC,MAAM,UAAN,EAAe,OAAO,QAAQ,GAC7B;AAAA,2DAAC,SAAI,WAAU,0BAAyB;AAAA,4DAAC,UAAK,WAAU,uBAAuB,iBAAO,KAAK,GAAE;AAAA,cAC1F,aAAa,SAAY,+CAAC,UAAM;AAAA,qBAAK,MAAM,WAAW,GAAG;AAAA,gBAAE;AAAA,iBAAC,IAAU;AAAA,eAAK;AAAA,YAC7E,UAAU,8CAAC,OAAE,WAAU,yBAAyB,mBAAQ,IAAO;AAAA,YAC/D,QAAQ,8CAAC,OAAE,WAAU,qBAAoB,MAAK,SAAS,iBAAM,IAAO;AAAA,YACpE,WAAW,SAAS,8CAAC,SAAI,WAAU,4BAA4B,qBAAW,IAAI,CAAC,YAAY,+CAAC,aAAQ,WAAU,yBAC7G;AAAA,4DAAC,SAAI,WAAU,sBAAsB,kBAAQ,SAAS,SAAS,SAAS,OAAM;AAAA,cAC9E,8CAAC,kBAAe,OAAO,QAAQ,OAAO,QAAQ,QAAQ,SAAS,QAAQ;AAAA,iBAFmE,QAAQ,EAGpJ,CAAU,GAAE,IAAS,8CAAC,OAAE,WAAU,qBAAqB,oBAAU,WAAW,sBAAsB,UAAU,YAAY,6CAA6C,6BAA4B;AAAA,YAChM,UAAU,SAAS,+CAAC,SAAI,WAAU,2BAA0B;AAAA,4DAAC,QAAG,2BAAa;AAAA,cAAK,8CAAC,mBAAgB,WAAsB;AAAA,eAAE,IAAS;AAAA,aACvI;AAAA;AAAA,MACF,IAAsB;AAAA,OACxB;AAAA,IACC,OAAO,8CAAC,OAAE,WAAU,sBAAsB,gBAAK,IAAO;AAAA,IACtD,UAAU,8CAAC,OAAE,WAAU,yBAAyB,mBAAQ,IAAO;AAAA,IAC/D,UAAU,aAAa,aAAa,SAAY,8CAAC,cAAS,WAAU,0BAAyB,OAAO,UAAU,KAAK,GAAG,cAAY,kBAAkB,OAAO,IAAK;AAAA,IAChK,UAAU,YAAY,QAAQ,8CAAC,OAAE,WAAU,qBAAoB,MAAK,SAAS,iBAAM,IAAO;AAAA,KAC7F;AACF;;;AHXI,IAAAC,uBAAA;AAhBJ,IAAM,MAAM,CAAC,OAAgB,WAAW,OACtC,OAAO,UAAU,WAAW,QAAQ;AACtC,IAAM,MAAM,CAAC,UACX,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AAChE,IAAM,SAAS,CAAC,WAAqD;AAAA,EACnE,OACE,MAAM,UAAU,aAChB,MAAM,UAAU,WAChB,MAAM,UAAU,YAChB,MAAM,UAAU,aACZ,MAAM,QACN;AAAA,EACN,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AACzD;AACA,SAAS,KAAK,OAA6B;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG,OAAO,KAAK;AAAA,MAChB,MAAM,IAAI,MAAM,MAAM,MAAM;AAAA,MAC5B,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,MAC7D,WAAW,IAAI,MAAM,SAAS;AAAA,MAC9B,UAAU,IAAI,MAAM,QAAQ;AAAA;AAAA,EAC9B;AAEJ;AACA,SAAS,MAAM,OAA6B;AAC1C,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG,OAAO,KAAK;AAAA,MAChB,MAAM,IAAI,MAAM,MAAM,cAAc;AAAA,MACpC,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,MACpD,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,MAC1D,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA;AAAA,EACzD;AAEJ;AACA,SAAS,OAAO,OAA6B;AAC3C,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG,OAAO,KAAK;AAAA,MAChB,OAAO,IAAI,MAAM,KAAK;AAAA,MACtB,SAAS,uBAAuB,MAAM,OAAO;AAAA,MAC7C,OAAO,IAAI,MAAM,KAAK;AAAA;AAAA,EACxB;AAEJ;AACA,SAAS,SAAS,OAA6B;AAC7C,QAAM,UAA4B,MAAM,QAAQ,MAAM,OAAO,IACzD,MAAM,QAAQ,QAAQ,CAAC,SAAS;AAC9B,QAAI,OAAO,SAAS,SAAU,QAAO,CAAC,EAAE,OAAO,MAAM,OAAO,KAAK,CAAC;AAClE,QACE,CAAC,QACD,OAAO,SAAS,YAChB,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,UAAU;AAEtB,aAAO,CAAC;AACV,WAAO;AAAA,MACL;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,aAAa,IAAI,KAAK,WAAW;AAAA,QACjC,aAAa,KAAK,gBAAgB;AAAA,MACpC;AAAA,IACF;AAAA,EACF,CAAC,IACD,CAAC;AACL,SACE;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,IAAI,MAAM,QAAQ,aAAa;AAAA,MACvC,aAAa,IAAI,MAAM,WAAW;AAAA,MAClC;AAAA,MACA,UAAU,MAAM,aAAa;AAAA,MAC7B,aAAa,MAAM,gBAAgB;AAAA,MACnC,UAAU,CAAC,MAAM,OAAO,eAAe,MAAM,OAAO;AAAA,MACpD,UAAU,OAAO,WAAW;AAC1B,cAAMC,UAAS,OAAO,OAAO;AAAA,UAC3B,CAAC,UAAO;AA3FlB;AA4FY,uCAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,MAA/C,mBAAkD,UAAlD,YAA2D;AAAA;AAAA,QAC/D;AACA,cAAM,MAAM,OAAO;AAAA,UACjB;AAAA,UACA,CAAC,GAAGA,SAAQ,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AACA,SAAS,SAAS,OAA6B;AAvG/C;AAwGE,QAAM,eAAW,iCAAc,WAAM,aAAN,YAAkB,KAAK;AACtD,SAAO,WAAW,8CAAC,kBAAe,UAAoB,IAAK,8CAAC,OAAE,WAAU,qBAAoB,2CAA6B;AAC3H;AACA,SAAS,UAAU,OAA6B;AAC9C,QAAM,YAAY,MAAM,QAAQ,MAAM,SAAS,IAAI,MAAM,UAAU,QAAQ,CAAC,UAAU;AACpF,UAAM,eAAW,gCAAc,KAAK;AAAG,WAAO,WAAW,CAAC,QAAQ,IAAI,CAAC;AAAA,EACzE,CAAC,IAAI,CAAC;AACN,SAAO,8CAAC,mBAAgB,WAAsB;AAChD;AACA,SAAS,SAAS,OAA6B;AAjH/C;AAkHE,QAAM,eAAW,iCAAc,WAAM,aAAN,YAAkB,KAAK;AACtD,SAAO,WAAW,8CAAC,kBAAe,UAAoB,IAAK,8CAAC,OAAE,WAAU,qBAAoB,4CAA8B;AAC5H;AAEO,IAAM,kBAAsC;AAAA,EACjD,UAAU,EAAE,MAAM,YAAY,WAAW,UAAU,OAAO,MAAM;AAAA,EAChE,WAAW,EAAE,MAAM,aAAa,WAAW,WAAW,OAAO,MAAM;AAAA,EACnE,UAAU,EAAE,MAAM,YAAY,WAAW,UAAU,OAAO,MAAM;AAAA,EAChE,aAAa,EAAE,MAAM,aAAa,WAAW,MAAM,OAAO,MAAM;AAAA,EAChE,OAAO,EAAE,MAAM,SAAS,WAAW,OAAO,OAAO,MAAM;AAAA,EACvD,QAAQ,EAAE,MAAM,UAAU,WAAW,QAAQ,OAAO,MAAM;AAAA,EAC1D,UAAU,EAAE,MAAM,YAAY,WAAW,UAAU,OAAO,MAAM;AAClE;;;AP9FA,IAAAC,mBAAqF;","names":["import_jsx_runtime","import_react","output","artifact","common","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_protocol","import_react","import_lucide_react","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","ImageIcon","import_react","import_lucide_react","import_protocol","import_lucide_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_radix_ui","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","Component","import_react","import_react","import_jsx_runtime","import_jsx_runtime","remarkGfm","ReactMarkdown","import_lucide_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_a","import_jsx_runtime","import_jsx_runtime","labels","import_protocol"]}
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import {
3
+ ArtifactWidget,
4
+ ArtifactsWidget,
5
+ PatchWidget,
6
+ QuestionWidget,
7
+ ReadFileWidget,
8
+ ResponsiveDetail,
9
+ SearchWidget,
10
+ SubagentWidget,
11
+ computeDiff,
12
+ computeTextDiff,
13
+ computeToolState,
14
+ computeToolWidget,
15
+ createArtifactData,
16
+ createSubagentData,
17
+ formatArtifactSize,
18
+ normalizeSearchResults,
19
+ parseArtifact,
20
+ parseSubagent,
21
+ prebuiltWidgets,
22
+ safeArtifactUrl,
23
+ safeResultUrl
24
+ } from "./chunk-5SNRYULC.mjs";
25
+ export {
26
+ ArtifactWidget,
27
+ ArtifactsWidget,
28
+ PatchWidget,
29
+ QuestionWidget,
30
+ ReadFileWidget,
31
+ ResponsiveDetail,
32
+ SearchWidget,
33
+ SubagentWidget,
34
+ computeDiff,
35
+ computeTextDiff,
36
+ computeToolState,
37
+ computeToolWidget,
38
+ createArtifactData,
39
+ createSubagentData,
40
+ formatArtifactSize,
41
+ normalizeSearchResults,
42
+ parseArtifact,
43
+ parseSubagent,
44
+ prebuiltWidgets,
45
+ safeArtifactUrl,
46
+ safeResultUrl
47
+ };
48
+ //# sourceMappingURL=widgets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,78 @@
1
1
  {
2
2
  "name": "@sarchauhan/chat",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.0.1",
4
+ "private": false,
5
+ "description": "Embeddable React chat UI, streaming runtime, and prebuilt agent widgets.",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/Sarthakischauhan/chat-sdk.git",
10
+ "directory": "packages/chat"
11
+ },
12
+ "homepage": "https://github.com/Sarthakischauhan/chat-sdk/tree/main/packages/chat",
13
+ "bugs": {
14
+ "url": "https://github.com/Sarthakischauhan/chat-sdk/issues"
15
+ },
16
+ "keywords": [
17
+ "react",
18
+ "chat",
19
+ "chat-ui",
20
+ "ai",
21
+ "streaming",
22
+ "widgets"
23
+ ],
24
+ "main": "./dist/index.js",
25
+ "module": "./dist/index.mjs",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.mjs",
31
+ "require": "./dist/index.js"
32
+ },
33
+ "./styles.css": "./dist/styles.css",
34
+ "./widgets": {
35
+ "types": "./dist/widgets.d.ts",
36
+ "import": "./dist/widgets.mjs",
37
+ "require": "./dist/widgets.js"
38
+ }
39
+ },
40
+ "files": [
41
+ "dist"
42
+ ],
43
+ "scripts": {
44
+ "build": "tsup",
45
+ "typecheck": "tsc --noEmit",
46
+ "prepack": "npm run build"
47
+ },
48
+ "peerDependencies": {
49
+ "react": ">=18",
50
+ "react-dom": ">=18"
51
+ },
52
+ "dependencies": {
53
+ "@fontsource/geist-mono": "^5.2.6",
54
+ "@fontsource/geist-sans": "^5.2.6",
55
+ "@sarchauhan/adapter": "0.0.1",
56
+ "@sarchauhan/code-markdown": "^0.0.3",
57
+ "@sarchauhan/protocol": "0.0.1",
58
+ "class-variance-authority": "^0.7.1",
59
+ "clsx": "^2.1.1",
60
+ "lucide-react": "^1.11.0",
61
+ "radix-ui": "^1.4.3",
62
+ "react-markdown": "^10.1.0",
63
+ "rehype-highlight": "^7.0.2",
64
+ "remark-gfm": "^4.0.1",
65
+ "tailwind-merge": "^3.4.1"
66
+ },
67
+ "devDependencies": {
68
+ "@testing-library/react": "^16.3.3",
69
+ "@types/react": "^19",
70
+ "@types/react-dom": "^19",
71
+ "jsdom": "^30.1.1",
72
+ "tsup": "^8.5.0",
73
+ "typescript": "^5"
74
+ },
75
+ "sideEffects": [
76
+ "**/*.css"
77
+ ]
78
+ }