@superbuilders/incept-renderer 0.1.5 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/html/sanitize.ts","../src/html/serialize.ts","../src/components/shared/html-content.tsx","../src/components/feedback-message.tsx","../src/ui/choice-indicator.tsx","../src/ui/label.tsx","../src/ui/field.tsx","../src/ui/radio-group.tsx","../src/components/interactions/choice-interaction.tsx","../src/components/interactions/gap-match-interaction.tsx","../src/shared/shuffle.ts","../src/ui/select.tsx","../src/components/interactions/inline-interaction.tsx","../src/components/interactions/match-interaction.tsx","../src/components/interactions/order-interaction.tsx","../src/components/interactions/text-entry-interaction.tsx","../src/components/qti-renderer.tsx","../src/evaluator.ts","../src/schema.ts","../src/parser.ts"],"names":["React","jsx","cva","RadioGroupPrimitive2","React2","submitted","jsxs","SafeInlineHTML","React4","React5","toQtiResponse","fromQtiResponse","sourceTokenVariants","useDraggable","useDroppable","DndContext","closestCenter","DragOverlay","React6","useSensors","useSensor","PointerSensor","React7","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport const PALETTES = [\"default\", \"betta\", \"cardinal\", \"bee\", \"owl\", \"macaw\"] as const\nexport type Palette = (typeof PALETTES)[number]\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","/**\n * Configuration for HTML sanitization.\n * Defines allowed tags and attributes for safe rendering.\n */\ninterface SanitizeConfig {\n\tallowedTags: Set<string>\n\tallowedAttributes: Record<string, Set<string>>\n\tallowDataAttributes: boolean\n\tallowMathML: boolean\n}\n\n/**\n * Default configuration for QTI content sanitization.\n * Allows common HTML tags and MathML for mathematical expressions.\n */\nconst DEFAULT_CONFIG: SanitizeConfig = {\n\t// HTML content tags\n\tallowedTags: new Set([\n\t\t// Text content\n\t\t\"p\",\n\t\t\"span\",\n\t\t\"div\",\n\t\t\"br\",\n\t\t\"hr\",\n\t\t// Formatting\n\t\t\"b\",\n\t\t\"i\",\n\t\t\"u\",\n\t\t\"strong\",\n\t\t\"em\",\n\t\t\"mark\",\n\t\t\"small\",\n\t\t\"sub\",\n\t\t\"sup\",\n\t\t\"code\",\n\t\t\"pre\",\n\t\t\"kbd\",\n\t\t// Lists\n\t\t\"ul\",\n\t\t\"ol\",\n\t\t\"li\",\n\t\t\"dl\",\n\t\t\"dt\",\n\t\t\"dd\",\n\t\t// Tables\n\t\t\"table\",\n\t\t\"thead\",\n\t\t\"tbody\",\n\t\t\"tfoot\",\n\t\t\"tr\",\n\t\t\"th\",\n\t\t\"td\",\n\t\t\"caption\",\n\t\t\"colgroup\",\n\t\t\"col\",\n\t\t// Media\n\t\t\"img\",\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t// Semantic\n\t\t\"article\",\n\t\t\"section\",\n\t\t\"nav\",\n\t\t\"aside\",\n\t\t\"header\",\n\t\t\"footer\",\n\t\t\"main\",\n\t\t\"figure\",\n\t\t\"figcaption\",\n\t\t\"blockquote\",\n\t\t\"cite\",\n\t\t// Links\n\t\t\"a\",\n\t\t// Forms (for future interactive elements)\n\t\t\"label\",\n\t\t\"button\"\n\t]),\n\n\tallowedAttributes: {\n\t\t// Global attributes\n\t\t\"*\": new Set([\"class\", \"id\", \"lang\", \"dir\", \"title\", \"style\"]),\n\t\t// Specific attributes\n\t\timg: new Set([\"src\", \"alt\", \"width\", \"height\", \"style\"]),\n\t\ta: new Set([\"href\", \"target\", \"rel\"]),\n\t\taudio: new Set([\"src\", \"controls\", \"loop\", \"muted\"]),\n\t\tvideo: new Set([\"src\", \"controls\", \"loop\", \"muted\", \"width\", \"height\", \"poster\"]),\n\t\tsource: new Set([\"src\", \"type\"]),\n\t\ttrack: new Set([\"src\", \"kind\", \"srclang\", \"label\"])\n\t},\n\n\tallowDataAttributes: false,\n\tallowMathML: true\n}\n\n/**\n * MathML elements that are allowed for mathematical expressions.\n * Based on MathML 3.0 specification.\n */\nconst MATHML_TAGS = new Set([\n\t// Root\n\t\"math\",\n\t// Token elements\n\t\"mi\",\n\t\"mn\",\n\t\"mo\",\n\t\"mtext\",\n\t\"mspace\",\n\t\"ms\",\n\t// Layout\n\t\"mrow\",\n\t\"mfrac\",\n\t\"msqrt\",\n\t\"mroot\",\n\t\"mstyle\",\n\t\"merror\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mfenced\",\n\t\"menclose\",\n\t// Scripts and limits\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"munder\",\n\t\"mover\",\n\t\"munderover\",\n\t\"mmultiscripts\",\n\t\"mprescripts\",\n\t\"none\",\n\t// Tables\n\t\"mtable\",\n\t\"mtr\",\n\t\"mtd\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t// Elementary math\n\t\"mstack\",\n\t\"mlongdiv\",\n\t\"msgroup\",\n\t\"msrow\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msline\",\n\t// Semantic\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\"\n])\n\n/**\n * MathML attributes that are allowed.\n */\nconst _MATHML_ATTRIBUTES = new Set([\n\t// Global MathML attributes\n\t\"id\",\n\t\"class\",\n\t\"style\",\n\t\"href\",\n\t\"mathcolor\",\n\t\"mathbackground\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"dir\",\n\t// Display\n\t\"display\",\n\t\"displaystyle\",\n\t\"scriptlevel\",\n\t// Spacing\n\t\"width\",\n\t\"height\",\n\t\"depth\",\n\t\"lspace\",\n\t\"rspace\",\n\t\"voffset\",\n\t// Fractions\n\t\"linethickness\",\n\t\"numalign\",\n\t\"denomalign\",\n\t\"bevelled\",\n\t// Roots\n\t\"index\",\n\t// Tables\n\t\"align\",\n\t\"rowalign\",\n\t\"columnalign\",\n\t\"groupalign\",\n\t\"alignmentscope\",\n\t\"columnwidth\",\n\t\"rowspacing\",\n\t\"columnspacing\",\n\t\"rowlines\",\n\t\"columnlines\",\n\t\"frame\",\n\t// Fences\n\t\"open\",\n\t\"close\",\n\t\"separators\",\n\t// Operators\n\t\"form\",\n\t\"fence\",\n\t\"separator\",\n\t\"stretchy\",\n\t\"symmetric\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"largeop\",\n\t\"movablelimits\",\n\t\"accent\",\n\t// Semantic\n\t\"encoding\",\n\t\"definitionURL\"\n])\n\n/**\n * Sanitizes HTML content to prevent XSS attacks.\n * Preserves MathML for mathematical expressions.\n */\nexport function sanitizeHtml(html: string, config: Partial<SanitizeConfig> = {}): string {\n\tconst cfg = { ...DEFAULT_CONFIG, ...config }\n\n\t// Basic XSS prevention patterns\n\tconst dangerousPatterns = [\n\t\t/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\t\t/javascript:/gi,\n\t\t/on\\w+\\s*=/gi, // Event handlers\n\t\t/<iframe\\b/gi,\n\t\t/<embed\\b/gi,\n\t\t/<object\\b/gi,\n\t\t/data:text\\/html/gi\n\t]\n\n\tlet sanitized = html\n\tfor (const pattern of dangerousPatterns) {\n\t\tsanitized = sanitized.replace(pattern, \"\")\n\t}\n\n\t// Parse and rebuild with allowed tags/attributes\n\tconst cleaned = cleanHtml(sanitized, cfg)\n\n\treturn cleaned\n}\n\n/**\n * Performs deep cleaning of HTML by parsing and rebuilding with only allowed elements.\n * Note: This is a simplified regex-based implementation for Node.js environments.\n * In production with browser support, consider using DOMPurify.\n */\nfunction cleanHtml(html: string, config: SanitizeConfig): string {\n\t// For Node.js environment, we use a regex-based approach\n\t// This is less robust than DOM-based cleaning but works in all environments\n\n\tlet cleaned = html\n\n\t// Remove all tags that aren't in the allowlist\n\tconst tagPattern = /<\\/?([a-zA-Z][a-zA-Z0-9-]*)([^>]*)>/g\n\tcleaned = cleaned.replace(tagPattern, (match, tagName, _attrs) => {\n\t\tconst tag = tagName.toLowerCase()\n\t\tconst isMathML = tag === \"math\" || cleaned.includes(\"<math\")\n\n\t\tif (isMathML && config.allowMathML && MATHML_TAGS.has(tag)) {\n\t\t\treturn match // Keep MathML tags\n\t\t}\n\t\tif (config.allowedTags.has(tag)) {\n\t\t\t// Clean attributes for allowed tags\n\t\t\treturn cleanAttributesString(match, tag, config)\n\t\t}\n\n\t\treturn \"\" // Remove disallowed tags\n\t})\n\n\treturn cleaned\n}\n\n/**\n * Cleans attributes from an HTML tag string.\n */\nfunction cleanAttributesString(tagString: string, tagName: string, config: SanitizeConfig): string {\n\tconst attrPattern = /\\s+([a-zA-Z][a-zA-Z0-9-:]*)(?:=\"([^\"]*)\"|'([^']*)'|=([^\\s>]+)|(?=\\s|>))/g\n\n\tlet cleanedTag = `<${tagString.startsWith(\"</\") ? \"/\" : \"\"}${tagName}`\n\n\tlet match = attrPattern.exec(tagString)\n\twhile (match !== null) {\n\t\tconst attrName = (match[1] || \"\").toLowerCase()\n\t\tconst attrValue = match[2] || match[3] || match[4] || \"\"\n\n\t\t// Check if attribute is allowed\n\t\tconst globalAttrs = config.allowedAttributes[\"*\"] || new Set()\n\t\tconst tagAttrs = config.allowedAttributes[tagName] || new Set()\n\n\t\tlet isAllowed = globalAttrs.has(attrName) || tagAttrs.has(attrName)\n\n\t\t// For <img>, strip size/style attributes to prevent stretched images\n\t\tif (tagName === \"img\" && (attrName === \"width\" || attrName === \"height\" || attrName === \"style\")) {\n\t\t\tisAllowed = false\n\t\t}\n\n\t\t// Check data attributes\n\t\tif (!isAllowed && config.allowDataAttributes && attrName.startsWith(\"data-\")) {\n\t\t\tisAllowed = true\n\t\t}\n\n\t\t// Check for dangerous values\n\t\tif (isAllowed && !isDangerousAttributeValue(attrName, attrValue)) {\n\t\t\tcleanedTag += ` ${attrName}=\"${attrValue.replace(/\"/g, \"&quot;\")}\"`\n\t\t}\n\n\t\tmatch = attrPattern.exec(tagString)\n\t}\n\n\tcleanedTag += \">\"\n\treturn cleanedTag\n}\n\n/**\n * Checks if an attribute value contains potentially dangerous content.\n */\nfunction isDangerousAttributeValue(name: string, value: string): boolean {\n\tconst valueLower = value.toLowerCase().trim()\n\n\t// Check for javascript: protocol\n\tif (name === \"href\" || name === \"src\") {\n\t\tif (valueLower.startsWith(\"javascript:\") || valueLower.startsWith(\"data:text/html\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Check for event handlers in values (some old XSS techniques)\n\tif (valueLower.includes(\"javascript:\") || valueLower.includes(\"onerror=\")) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n/**\n * Sanitizes HTML for safe display, with automatic MathML detection.\n */\nexport function sanitizeForDisplay(html: string): string {\n\t// Auto-detect if content has MathML\n\tconst hasMathML = html.toLowerCase().includes(\"<math\")\n\n\treturn sanitizeHtml(html, {\n\t\tallowMathML: hasMathML,\n\t\tallowDataAttributes: true\n\t})\n}\n","import type { NormalizedNode } from \"../parser\"\n\n/**\n * Serializes an array of nodes (useful for contentBlocks).\n */\nexport function serializeNodes(nodes: Array<NormalizedNode | string>): string {\n\treturn nodes\n\t\t.map((node) => {\n\t\t\tif (typeof node === \"string\") {\n\t\t\t\treturn escapeHtml(node)\n\t\t\t}\n\t\t\treturn serializeNode(node)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes the inner content of a node (its children) to an HTML string.\n * Preserves MathML and other XML content verbatim.\n */\nexport function serializeInner(node: NormalizedNode): string {\n\treturn node.children\n\t\t.map((child: NormalizedNode | string) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\treturn serializeNode(child)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes a complete node including its tag and attributes.\n * Critical for preserving MathML structure exactly as authored.\n */\nexport function serializeNode(node: NormalizedNode): string {\n\t// Self-closing tags\n\tconst selfClosing = [\"br\", \"hr\", \"img\", \"input\", \"meta\", \"link\"]\n\tconst tagName = stripQtiPrefix(node.tagName)\n\n\t// Preserve MathML elements verbatim without QTI processing\n\tif (tagName === \"math\" || isMathMLElement(tagName)) {\n\t\treturn serializeVerbatim(node)\n\t}\n\n\tconst attrs = serializeAttributes(node.attrs)\n\tconst attrString = attrs ? ` ${attrs}` : \"\"\n\n\tif (selfClosing.includes(tagName) && node.children.length === 0) {\n\t\treturn `<${tagName}${attrString} />`\n\t}\n\n\tconst inner = serializeInner(node)\n\treturn `<${tagName}${attrString}>${inner}</${tagName}>`\n}\n\n/**\n * Detects whether content contains MathML elements.\n * Used to determine appropriate rendering and sanitization strategies.\n */\nexport function detectContentType(html: string): \"mathml\" | \"html\" {\n\t// Quick heuristic: check for common MathML elements\n\tconst mathmlIndicators = [\"<math\", \"<mrow\", \"<msup\", \"<msub\", \"<mfrac\", \"<msqrt\", \"<mi>\", \"<mo>\", \"<mn>\", \"<mtext\"]\n\n\tconst normalized = html.toLowerCase()\n\tfor (const indicator of mathmlIndicators) {\n\t\tif (normalized.includes(indicator)) {\n\t\t\treturn \"mathml\"\n\t\t}\n\t}\n\n\treturn \"html\"\n}\n\n/**\n * Strips QTI namespace prefixes from tag names.\n * Converts \"qti-choice-interaction\" to \"div\" or similar HTML equivalent.\n * Preserves MathML and standard HTML tags unchanged.\n */\nfunction stripQtiPrefix(tagName: string): string {\n\t// Map QTI elements to semantic HTML equivalents\n\tconst qtiToHtml: Record<string, string> = {\n\t\t\"qti-item-body\": \"div\",\n\t\t\"qti-choice-interaction\": \"div\",\n\t\t\"qti-simple-choice\": \"div\",\n\t\t\"qti-feedback-block\": \"div\",\n\t\t\"qti-content-body\": \"div\",\n\t\t\"qti-prompt\": \"div\",\n\t\t\"qti-value\": \"span\",\n\t\t\"qti-variable\": \"span\",\n\t\t\"qti-correct-response\": \"div\"\n\t}\n\n\tif (qtiToHtml[tagName]) {\n\t\treturn qtiToHtml[tagName]\n\t}\n\n\t// Strip \"qti-\" prefix for unknown QTI elements\n\tif (tagName.startsWith(\"qti-\")) {\n\t\treturn tagName.slice(4)\n\t}\n\n\t// Preserve MathML and HTML tags as-is\n\treturn tagName\n}\n\n/**\n * Serializes node attributes to an HTML attribute string.\n * Filters out QTI-specific attributes that shouldn't appear in rendered HTML.\n */\nfunction serializeAttributes(attrs: Record<string, unknown>): string {\n\t// Attributes to exclude from HTML output\n\tconst excludeAttrs = [\n\t\t\"identifier\",\n\t\t\"response-identifier\",\n\t\t\"shuffle\",\n\t\t\"max-choices\",\n\t\t\"min-choices\",\n\t\t\"cardinality\",\n\t\t\"base-type\",\n\t\t\"outcome-identifier\",\n\t\t\"show-hide\",\n\t\t\"time-dependent\",\n\t\t\"adaptive\",\n\t\t\"xml-lang\"\n\t]\n\n\tconst parts: string[] = []\n\n\tfor (const [key, value] of Object.entries(attrs)) {\n\t\tif (excludeAttrs.includes(key)) continue\n\t\tif (value == null) continue\n\n\t\t// Convert kebab-case QTI attrs to camelCase where appropriate\n\t\tconst htmlKey = key === \"xml:lang\" ? \"lang\" : key\n\t\tconst escapedValue = escapeHtml(String(value))\n\t\tparts.push(`${htmlKey}=\"${escapedValue}\"`)\n\t}\n\n\treturn parts.join(\" \")\n}\n\n/**\n * Escapes HTML special characters to prevent XSS.\n * Used for text content, not for preserving markup.\n */\nfunction escapeHtml(text: string): string {\n\tconst escapeMap: Record<string, string> = {\n\t\t\"&\": \"&amp;\",\n\t\t\"<\": \"&lt;\",\n\t\t\">\": \"&gt;\",\n\t\t'\"': \"&quot;\",\n\t\t\"'\": \"&#39;\"\n\t}\n\n\treturn text.replace(/[&<>\"']/g, (char) => escapeMap[char] || char)\n}\n\n/**\n * Checks if a tag name is a MathML element.\n */\nfunction isMathMLElement(tagName: string): boolean {\n\tconst mathMLTags = [\n\t\t\"mi\",\n\t\t\"mn\",\n\t\t\"mo\",\n\t\t\"mtext\",\n\t\t\"mspace\",\n\t\t\"ms\",\n\t\t\"mrow\",\n\t\t\"mfrac\",\n\t\t\"msqrt\",\n\t\t\"mroot\",\n\t\t\"mstyle\",\n\t\t\"msub\",\n\t\t\"msup\",\n\t\t\"msubsup\",\n\t\t\"munder\",\n\t\t\"mover\",\n\t\t\"munderover\",\n\t\t\"mtable\",\n\t\t\"mtr\",\n\t\t\"mtd\"\n\t]\n\treturn mathMLTags.includes(tagName)\n}\n\n/**\n * Serializes MathML nodes verbatim to preserve exact structure.\n * Does not apply QTI transformations or attribute filtering.\n */\nfunction serializeVerbatim(node: NormalizedNode): string {\n\tconst attrs = Object.entries(node.attrs)\n\t\t.map(([key, value]) => {\n\t\t\tif (value == null) return \"\"\n\t\t\treturn ` ${key}=\"${String(value).replace(/\"/g, \"&quot;\")}\"`\n\t\t})\n\t\t.join(\"\")\n\n\tif (node.children.length === 0) {\n\t\treturn `<${node.tagName}${attrs} />`\n\t}\n\n\tconst inner = node.children\n\t\t.map((child) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\t// Recursively serialize MathML children verbatim\n\t\t\treturn serializeVerbatim(child)\n\t\t})\n\t\t.join(\"\")\n\n\treturn `<${node.tagName}${attrs}>${inner}</${node.tagName}>`\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayGap, DisplayInlineEmbed, DisplayTextEmbed } from \"../../shared/types\"\n\n/**\n * Renders HTML content with proper MathML support\n * Uses innerHTML assignment to preserve MathML structure\n */\nexport function HTMLContent({\n\thtml,\n\tclassName,\n\tinlineEmbeds,\n\ttextEmbeds,\n\tgapEmbeds,\n\trenderInline,\n\trenderTextEntry,\n\trenderGap\n}: {\n\thtml: string\n\tclassName?: string\n\tinlineEmbeds?: Record<string, DisplayInlineEmbed>\n\ttextEmbeds?: Record<string, DisplayTextEmbed>\n\tgapEmbeds?: Record<string, DisplayGap>\n\trenderInline?: (embed: DisplayInlineEmbed) => React.ReactElement\n\trenderTextEntry?: (embed: DisplayTextEmbed) => React.ReactElement\n\trenderGap?: (gap: DisplayGap) => React.ReactElement\n}) {\n\t// Create a ref to handle MathML fallback if needed\n\tconst containerRef = React.useRef<HTMLDivElement>(null)\n\tconst [targets, setTargets] = React.useState<Record<string, Element>>({})\n\n\t// Sanitize incoming HTML to strip unsafe and layout-breaking attributes\n\tconst safeHtml = React.useMemo(() => sanitizeForDisplay(html), [html])\n\n\t// Apply sanitized HTML to the container whenever it changes, and find targets\n\tReact.useEffect(() => {\n\t\tconst el = containerRef.current\n\t\tif (!el) return\n\t\tel.innerHTML = safeHtml\n\n\t\tconst newTargets: Record<string, Element> = {}\n\n\t\t// Find inline dropdown placeholders\n\t\tif (inlineEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-inline]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst responseId = node.getAttribute(\"data-qti-inline\")\n\t\t\t\tif (responseId && inlineEmbeds[responseId]) {\n\t\t\t\t\tnewTargets[responseId] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find text entry placeholders\n\t\tif (textEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-text-entry]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst responseId = node.getAttribute(\"data-qti-text-entry\")\n\t\t\t\tif (responseId && textEmbeds[responseId]) {\n\t\t\t\t\tnewTargets[responseId] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find gap placeholders (for gap match interactions)\n\t\tif (gapEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-gap]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst gapId = node.getAttribute(\"data-qti-gap\")\n\t\t\t\tif (gapId && gapEmbeds[gapId]) {\n\t\t\t\t\tnewTargets[`gap-${gapId}`] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetTargets(newTargets)\n\t}, [safeHtml, inlineEmbeds, textEmbeds, gapEmbeds]) // Re-scan if structure changes\n\n\t// Render portals declaratively based on targets\n\t// This ensures React reconciles them properly even if renderTextEntry changes identity\n\tconst portals = React.useMemo(() => {\n\t\tconst items: React.ReactNode[] = []\n\n\t\tif (inlineEmbeds && renderInline) {\n\t\t\tfor (const [id, embed] of Object.entries(inlineEmbeds)) {\n\t\t\t\tconst target = targets[id]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderInline(embed), target, id))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (textEmbeds && renderTextEntry) {\n\t\t\tfor (const [id, embed] of Object.entries(textEmbeds)) {\n\t\t\t\tconst target = targets[id]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderTextEntry(embed), target, id))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (gapEmbeds && renderGap) {\n\t\t\tfor (const [id, gap] of Object.entries(gapEmbeds)) {\n\t\t\t\tconst target = targets[`gap-${id}`]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderGap(gap), target, `gap-${id}`))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn items\n\t}, [targets, inlineEmbeds, textEmbeds, gapEmbeds, renderInline, renderTextEntry, renderGap])\n\n\tReact.useEffect(() => {\n\t\t// Check if MathML is supported\n\t\tconst checkMathMLSupport = () => {\n\t\t\tconst mml = document.createElement(\"math\")\n\t\t\tmml.innerHTML = \"<mspace/>\"\n\t\t\tconst firstChild = mml.firstChild\n\t\t\treturn firstChild instanceof Element && firstChild.namespaceURI === \"http://www.w3.org/1998/Math/MathML\"\n\t\t}\n\n\t\t// If MathML is not supported, we could add fallback logic here\n\t\tif (!checkMathMLSupport() && containerRef.current?.querySelector(\"math\")) {\n\t\t\t// Intentionally quiet: sanitized HTML is still rendered\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"qti-html-content text-foreground text-lg font-medium leading-relaxed\",\n\t\t\t\t\t// Ensure images never stretch or overflow\n\t\t\t\t\t\"[&_img]:max-w-full [&_img]:h-auto [&_img]:w-auto [&_img]:object-contain [&_img]:block [&_img]:mx-auto\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{portals}\n\t\t</>\n\t)\n}\n\nexport default HTMLContent\n","\"use client\"\n\nimport { HTMLContent } from \"./shared/html-content\"\n\nexport function FeedbackMessage({\n\tresponseId,\n\tshowFeedback,\n\tperResponseFeedback\n}: {\n\tresponseId: string\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n\tif (!showFeedback) return null\n\tconst entry = perResponseFeedback?.[responseId]\n\tconst messageHtml = entry?.messageHtml\n\tif (!messageHtml) return null\n\tconst isCorrect = entry?.isCorrect === true\n\treturn (\n\t\t<div className=\"qti-feedback mt-3 p-6\" data-correct={isCorrect}>\n\t\t\t<HTMLContent html={messageHtml} />\n\t\t</div>\n\t)\n}\n\nexport default FeedbackMessage\n","\"use client\"\n\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst choiceIndicatorVariants = cva(\n\t[\n\t\t\"cursor-pointer shrink-0 rounded-xs size-6 text-xs font-extrabold flex items-center justify-center outline-none\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"data-[state=unchecked]:bg-background data-[state=unchecked]:border-2 data-[state=unchecked]:border-input data-[state=unchecked]:text-muted-foreground\",\n\t\t\"data-[state=checked]:border-2 data-[state=checked]:border-[var(--choice-complement)] data-[state=checked]:text-[var(--choice-foreground)]\",\n\t\t\"data-[filled=true]:data-[state=checked]:bg-[var(--choice-complement)]\",\n\t\t\"data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)] dark:data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)]\",\n\t\t\"focus-visible:ring-[var(--choice-complement)] focus-visible:ring-[3px]\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--choice-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--choice-complement:var(--color-muted-foreground)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\"[--choice-foreground:var(--color-betta)]\", \"[--choice-complement:var(--color-butterfly)]\"],\n\t\t\t\tcardinal: [\"[--choice-foreground:var(--color-cardinal)]\", \"[--choice-complement:var(--color-fire-ant)]\"],\n\t\t\t\tbee: [\"[--choice-foreground:var(--color-bee)]\", \"[--choice-complement:var(--color-lion)]\"],\n\t\t\t\towl: [\"[--choice-foreground:var(--color-owl)]\", \"[--choice-complement:var(--color-tree-frog)]\"],\n\t\t\t\tmacaw: [\"[--choice-foreground:var(--color-macaw)]\", \"[--choice-complement:var(--color-whale)]\"]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\ninterface ChoiceIndicatorProps extends VariantProps<typeof choiceIndicatorVariants> {\n\tletter?: string\n\ttype?: \"radio\" | \"checkbox\"\n\tshowLetter?: boolean\n\tclassName?: string\n\tid?: string\n\tvalue?: string\n\tchecked?: boolean\n\tonCheckedChange?: (checked: boolean) => void\n\tdisabled?: boolean\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n}\n\nfunction ChoiceIndicator({\n\tclassName,\n\tpalette = \"default\",\n\tletter,\n\ttype = \"radio\",\n\tshowLetter = true,\n\t...props\n}: ChoiceIndicatorProps) {\n\tconst baseClassName = cn(choiceIndicatorVariants({ palette }), className)\n\n\tif (type === \"checkbox\") {\n\t\tconst checkboxProps = props as React.ComponentProps<typeof CheckboxPrimitive.Root>\n\t\treturn (\n\t\t\t<CheckboxPrimitive.Root\n\t\t\t\tdata-slot=\"choice-indicator\"\n\t\t\t\tdata-palette={palette}\n\t\t\t\tdata-filled={!showLetter}\n\t\t\t\tclassName={baseClassName}\n\t\t\t\t{...checkboxProps}\n\t\t\t>\n\t\t\t\t{showLetter && <span className=\"data-[state=unchecked]:block data-[state=checked]:hidden\">{letter}</span>}\n\t\t\t</CheckboxPrimitive.Root>\n\t\t)\n\t}\n\n\tconst radioProps = props as React.ComponentProps<typeof RadioGroupPrimitive.Item>\n\treturn (\n\t\t<RadioGroupPrimitive.Item\n\t\t\tdata-slot=\"choice-indicator\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={baseClassName}\n\t\t\t{...radioProps}\n\t\t>\n\t\t\t{letter}\n\t\t</RadioGroupPrimitive.Item>\n\t)\n}\n\nexport { ChoiceIndicator, choiceIndicatorVariants }\n","\"use client\"\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n\treturn (\n\t\t<LabelPrimitive.Root\n\t\t\tdata-slot=\"label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport { Label }\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { useMemo } from \"react\"\n\nimport { cn, type Palette } from \"../lib/utils\"\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n\treturn (\n\t\t<fieldset\n\t\t\tdata-slot=\"field-set\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-6\",\n\t\t\t\t\"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldLegend({\n\tclassName,\n\tvariant = \"legend\",\n\t...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n\treturn (\n\t\t<legend\n\t\t\tdata-slot=\"field-legend\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\"mb-3 font-medium\", \"data-[variant=legend]:text-base\", \"data-[variant=label]:text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-group\"\n\t\t\tclassName={cn(\n\t\t\t\t\"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nconst fieldVariants = cva(\"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\", {\n\tvariants: {\n\t\torientation: {\n\t\t\tvertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n\t\t\thorizontal: [\n\t\t\t\t\"flex-row items-center\",\n\t\t\t\t\"[&>[data-slot=field-label]]:flex-auto\",\n\t\t\t\t\"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\"\n\t\t\t],\n\t\t\tresponsive: [\n\t\t\t\t\"flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto\",\n\t\t\t\t\"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n\t\t\t\t\"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\"\n\t\t\t]\n\t\t}\n\t},\n\tdefaultVariants: {\n\t\torientation: \"vertical\"\n\t}\n})\n\nfunction Field({\n\tclassName,\n\torientation = \"vertical\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\tdata-slot=\"field\"\n\t\t\tdata-orientation={orientation}\n\t\t\tclassName={cn(fieldVariants({ orientation }), className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-content\"\n\t\t\tclassName={cn(\"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldLabel({\n\tclassName,\n\tpalette = \"default\",\n\t...props\n}: React.ComponentProps<typeof Label> & {\n\tpalette?: Palette\n}) {\n\treturn (\n\t\t<Label\n\t\t\tdata-slot=\"field-label\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/field-label peer/field-label flex w-fit gap-2 leading-snug cursor-pointer\",\n\t\t\t\t\"group-data-[disabled=true]/field:opacity-50\",\n\t\t\t\t\"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-xs has-[>[data-slot=field]]:p-4\",\n\t\t\t\t\"has-[>[data-slot=field]]:border-2 has-[>[data-slot=field]]:shadow-[0_2px_0_var(--field-complement)]\",\n\t\t\t\t\"has-[>[data-slot=field]]:hover:brightness-90 dark:has-[>[data-slot=field]]:hover:brightness-75\",\n\t\t\t\t\"has-[>[data-slot=field]]:active:shadow-none has-[>[data-slot=field]]:active:translate-y-[2px]\",\n\t\t\t\t\"[--field-background:var(--color-background)]\",\n\t\t\t\t\"[--field-complement:var(--color-accent)]\",\n\t\t\t\t\"has-[>[data-slot=field]]:bg-[var(--field-background)] has-[>[data-slot=field]]:border-accent has-[>[data-slot=field]]:text-foreground\",\n\t\t\t\t\"has-[>[data-slot=field]]:has-data-[state=checked]:bg-[var(--field-foreground)]/10 has-[>[data-slot=field]]:has-data-[state=checked]:border-[var(--field-complement)] has-[>[data-slot=field]]:has-data-[state=checked]:text-[var(--field-foreground)]\",\n\t\t\t\t\"has-data-[state=checked]:[--field-complement:var(--field-shadow)]\",\n\t\t\t\t\"data-[palette=default]:[--field-foreground:var(--color-foreground)] data-[palette=default]:[--field-shadow:var(--color-muted-foreground)]\",\n\t\t\t\t\"data-[palette=betta]:[--field-foreground:var(--color-betta)] data-[palette=betta]:[--field-shadow:var(--color-butterfly)]\",\n\t\t\t\t\"data-[palette=cardinal]:[--field-foreground:var(--color-cardinal)] data-[palette=cardinal]:[--field-shadow:var(--color-fire-ant)]\",\n\t\t\t\t\"data-[palette=bee]:[--field-foreground:var(--color-bee)] data-[palette=bee]:[--field-shadow:var(--color-lion)]\",\n\t\t\t\t\"data-[palette=owl]:[--field-foreground:var(--color-owl)] data-[palette=owl]:[--field-shadow:var(--color-tree-frog)]\",\n\t\t\t\t\"data-[palette=macaw]:[--field-foreground:var(--color-macaw)] data-[palette=macaw]:[--field-shadow:var(--color-whale)]\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"field-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance\",\n\t\t\t\t\"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n\t\t\t\t\"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldSeparator({\n\tchildren,\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-separator\"\n\t\t\tdata-content={!!children}\n\t\t\tclassName={cn(\"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Separator className=\"absolute inset-0 top-1/2\" />\n\t\t\t{children && (\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n\t\t\t\t\tdata-slot=\"field-separator-content\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nfunction FieldError({\n\tclassName,\n\tchildren,\n\terrors,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\terrors?: Array<{ message?: string } | undefined>\n}) {\n\tconst content = useMemo(() => {\n\t\tif (children) {\n\t\t\treturn children\n\t\t}\n\n\t\tif (!errors?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()]\n\n\t\tif (uniqueErrors?.length == 1) {\n\t\t\treturn uniqueErrors[0]?.message\n\t\t}\n\n\t\treturn (\n\t\t\t<ul className=\"ml-4 flex list-disc flex-col gap-1\">\n\t\t\t\t{uniqueErrors.map((error, index) => error?.message && <li key={index}>{error.message}</li>)}\n\t\t\t</ul>\n\t\t)\n\t}, [children, errors])\n\n\tif (!content) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tdata-slot=\"field-error\"\n\t\t\tclassName={cn(\"text-destructive text-sm font-normal\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{content}\n\t\t</div>\n\t)\n}\n\nexport {\n\tField,\n\tFieldLabel,\n\tFieldDescription,\n\tFieldError,\n\tFieldGroup,\n\tFieldLegend,\n\tFieldSeparator,\n\tFieldSet,\n\tFieldContent,\n\tFieldTitle\n}\n","\"use client\"\n\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { CircleIcon } from \"lucide-react\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst radioGroupItemVariants = cva(\n\t[\n\t\t\"cursor-pointer\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t\"text-[var(--radio-group-item-foreground)] bg-[var(--radio-group-item-background)] dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border outline-none\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"data-[state=unchecked]:border-input\",\n\t\t\"data-[state=checked]:border-[var(--radio-group-item-complement)]\",\n\t\t\"focus-visible:ring-[var(--radio-group-item-foreground)] focus-visible:ring-[3px]\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-foreground)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\nfunction RadioGroup({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n\treturn <RadioGroupPrimitive.Root data-slot=\"radio-group\" className={cn(\"grid gap-3\", className)} {...props} />\n}\n\nfunction RadioGroupItem({\n\tclassName,\n\tpalette = \"default\",\n\t...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item> & VariantProps<typeof radioGroupItemVariants>) {\n\treturn (\n\t\t<RadioGroupPrimitive.Item\n\t\t\tdata-slot=\"radio-group-item\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(radioGroupItemVariants({ palette, className }))}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RadioGroupPrimitive.Indicator\n\t\t\t\tdata-slot=\"radio-group-indicator\"\n\t\t\t\tclassName=\"relative flex items-center justify-center\"\n\t\t\t>\n\t\t\t\t<CircleIcon className=\"fill-[var(--radio-group-item-foreground)] absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n\t\t\t</RadioGroupPrimitive.Indicator>\n\t\t</RadioGroupPrimitive.Item>\n\t)\n}\n\nexport { RadioGroup, RadioGroupItem, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { ChoiceInteraction } from \"../../schema\"\nimport { ChoiceIndicator } from \"../../ui/choice-indicator\"\nimport { Field, FieldContent, FieldGroup, FieldLabel, FieldSet, FieldTitle } from \"../../ui/field\"\nimport { RadioGroup } from \"../../ui/radio-group\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChoiceInteractionRendererProps {\n\t/** The choice interaction to render */\n\tinteraction: ChoiceInteraction\n\t/** Current user response for this interaction */\n\tresponse?: string | string[]\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string | string[]) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness (single-select) used for selected coloring */\n\tisCorrect?: boolean\n\t/** Per-selection correctness (multi-select) for secure highlighting */\n\tselectedChoicesCorrectness?: Array<{ id: string; isCorrect: boolean }>\n}\n\n// ============================================================================\n// Choice Interaction Renderer\n// ============================================================================\n\n/**\n * Renders a choice interaction (single or multiple choice)\n */\nexport function ChoiceInteractionRenderer({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect,\n\tselectedChoicesCorrectness\n}: ChoiceInteractionRendererProps) {\n\tconst isMultiple = interaction.maxChoices > 1\n\tconst selectedValues = React.useMemo(() => {\n\t\tif (!response) return []\n\t\treturn Array.isArray(response) ? response : [response]\n\t}, [response])\n\n\t// Detect if all choices are image-only (contains <img> and no text once tags are stripped)\n\tconst isImagesOnly = React.useMemo(() => {\n\t\tconst hasImg = (html: string) => html.toLowerCase().includes(\"<img\")\n\t\tconst stripped = (html: string) => html.replace(/<[^>]*>/g, \"\").trim()\n\t\treturn (\n\t\t\tinteraction.choices.length > 0 &&\n\t\t\tinteraction.choices.every((c) => hasImg(c.contentHtml) && stripped(c.contentHtml) === \"\")\n\t\t)\n\t}, [interaction.choices])\n\n\tconst choiceCount = interaction.choices.length\n\n\t// Grid layout for image-only sets\n\tconst gridClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"space-y-2\"\n\t\tswitch (choiceCount) {\n\t\t\tcase 4:\n\t\t\t\treturn \"grid grid-cols-2 gap-4\"\n\t\t\tcase 3:\n\t\t\t\treturn \"grid grid-cols-3 gap-4\"\n\t\t\tcase 2:\n\t\t\t\treturn \"max-w-3xl mx-auto grid grid-cols-2 gap-6\"\n\t\t\tdefault:\n\t\t\t\treturn \"grid grid-cols-2 md:grid-cols-3 gap-4\"\n\t\t}\n\t}, [isImagesOnly, choiceCount])\n\n\t// Image sizing/centering helpers applied to the content wrapper\n\tconst imageCardClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"\"\n\t\treturn choiceCount === 2\n\t\t\t? \"justify-center text-center [&_img]:max-h-52 md:[&_img]:max-h-60 ![&_img]:w-auto ![&_img]:h-auto ![&_img]:max-w-full ![&_img]:block [&_img]:mx-auto min-h-[220px] px-8 py-8\"\n\t\t\t: \"justify-center text-center [&_img]:max-h-40 md:[&_img]:max-h-48 ![&_img]:w-auto ![&_img]:h-auto ![&_img]:max-w-full ![&_img]:block [&_img]:mx-auto min-h-[180px]\"\n\t}, [isImagesOnly, choiceCount])\n\n\tconst handleSingleChoice = (value: string) => {\n\t\tif (!disabled && onAnswerSelect) {\n\t\t\tonAnswerSelect(value)\n\t\t}\n\t}\n\n\t// Removed unused handler in favor of inline onCheckedChange logic\n\n\t// Render prompt if present\n\tconst promptElement = interaction.promptHtml ? <HTMLContent html={interaction.promptHtml} className=\"mb-4\" /> : null\n\n\t// Single choice (radio) with Field UI\n\tif (!isMultiple) {\n\t\tconst submitted = hasSubmitted === true\n\t\treturn (\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t{promptElement}\n\t\t\t\t<RadioGroup\n\t\t\t\t\tvalue={selectedValues[0] || \"\"}\n\t\t\t\t\tonValueChange={(value) => handleSingleChoice(value)}\n\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t>\n\t\t\t\t\t<FieldGroup>\n\t\t\t\t\t\t<FieldSet>\n\t\t\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t\t\t{interaction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tinteraction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isSelected && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isSelected && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</FieldSet>\n\t\t\t\t\t</FieldGroup>\n\t\t\t\t</RadioGroup>\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// Multi-select (checkbox) with Field UI\n\tconst submitted = hasSubmitted === true\n\tconst atMax = selectedValues.length >= interaction.maxChoices\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{promptElement}\n\t\t\t<FieldGroup>\n\t\t\t\t<FieldSet>\n\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t{interaction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tinteraction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={submitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t)}\n\t\t\t\t</FieldSet>\n\t\t\t</FieldGroup>\n\t\t</div>\n\t)\n}\n\nexport default ChoiceInteractionRenderer\n","\"use client\"\n\nimport { closestCenter, DndContext, type DragEndEvent, DragOverlay, useDraggable, useDroppable } from \"@dnd-kit/core\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayGap, DisplayGapMatchInteraction, DisplayGapText } from \"../../shared/types\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\n/**\n * Renders pre-sanitized HTML content inline.\n * Content is sanitized server-side before being sent to the client.\n */\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<gapId, sourceId> */\ntype GapMatchState = Record<string, string>\n\n/** Convert internal state to QTI response format: [\"sourceId gapId\", ...] */\nfunction toQtiResponse(state: GapMatchState): string[] {\n\treturn Object.entries(state).map(([gapId, sourceId]) => `${sourceId} ${gapId}`)\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): GapMatchState {\n\tconst state: GapMatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst gapId = parts[1]\n\t\tif (sourceId && gapId) {\n\t\t\tstate[gapId] = sourceId\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Palette Variants\n// ============================================================================\n\nconst gapSlotVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"min-w-[4rem] min-h-[1.75rem] px-2 mx-1 my-1\",\n\t\t\"border rounded-xs align-middle\",\n\t\t\"transition-all duration-150\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-muted-foreground/30 bg-muted/20\",\n\t\t\t\thover: \"border-macaw bg-macaw/10\",\n\t\t\t\tfilled: \"border-macaw bg-macaw/10\",\n\t\t\t\tcorrect: \"border-owl bg-owl/15\",\n\t\t\t\tincorrect: \"border-cardinal bg-cardinal/15\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tselected: \"bg-macaw/15 border-macaw shadow-[0_2px_0_var(--color-whale)] ring-2 ring-macaw/30\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Source Token\n// ============================================================================\n\ninterface SourceTokenProps {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisSelected: boolean\n\tonClick: () => void\n\tremainingUses: number\n}\n\nfunction SourceToken({ id, contentHtml, disabled, isSelected, onClick, remainingUses }: SourceTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `source-${id}`,\n\t\tdata: { type: \"source\", sourceId: id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\t// Don't apply transform here - the DragOverlay handles the visual that follows the cursor.\n\t// The original element stays in place and fades out when dragging.\n\n\tconst getState = (): \"idle\" | \"selected\" | \"dragging\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isDragging) return \"dragging\"\n\t\tif (isSelected) return \"selected\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<button\n\t\t\tref={setNodeRef}\n\t\t\ttype=\"button\"\n\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\tclassName={cn(sourceTokenVariants({ state: getState() }), \"active:cursor-grabbing\")}\n\t\t\tdisabled={disabled}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-1 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Gap Slot\n// ============================================================================\n\ninterface GapSlotProps {\n\tgapId: string\n\tfilledWith: DisplayGapText | undefined\n\tonClear: () => void\n\tonClick: () => void\n\tdisabled: boolean\n\tisCorrect?: boolean\n\thasSubmitted: boolean\n}\n\nfunction GapSlot({ gapId, filledWith, onClear, onClick, disabled, isCorrect, hasSubmitted }: GapSlotProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `gap-${gapId}`,\n\t\tdata: { type: \"gap\", gapId },\n\t\tdisabled\n\t})\n\n\tconst getState = (): VariantProps<typeof gapSlotVariants>[\"state\"] => {\n\t\tif (hasSubmitted && filledWith) {\n\t\t\treturn isCorrect ? \"correct\" : \"incorrect\"\n\t\t}\n\t\tif (isOver) return \"hover\"\n\t\tif (filledWith) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\treturn (\n\t\t<span ref={setNodeRef} className={cn(gapSlotVariants({ state: getState() }))}>\n\t\t\t{filledWith ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClear}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center gap-1\",\n\t\t\t\t\t\t!disabled && \"hover:text-cardinal cursor-pointer\",\n\t\t\t\t\t\tdisabled && \"cursor-default\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<SafeInlineHTML html={filledWith.contentHtml} />\n\t\t\t\t\t{!disabled && <span className=\"text-xs opacity-60\">×</span>}\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"w-full h-full min-h-[1.5em] flex items-center justify-center\",\n\t\t\t\t\t\t!disabled && \"cursor-pointer hover:bg-macaw/5\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"opacity-30\">___</span>\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n\n// ============================================================================\n// Main Gap Match Interaction Component\n// ============================================================================\n\nexport interface GapMatchInteractionProps {\n\tinteraction: DisplayGapMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\t/** Per-gap correctness: Record<gapId, isCorrect> */\n\tgapCorrectness?: Record<string, boolean>\n}\n\nexport function GapMatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tgapCorrectness\n}: GapMatchInteractionProps) {\n\t// Convert QTI response to internal state\n\tconst currentPairs = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track selected source token for click-to-place\n\tconst [selectedSourceId, setSelectedSourceId] = React.useState<string | null>(null)\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(\n\t\t() => interaction.gapTexts.find((gt) => gt.id === activeDragId),\n\t\t[activeDragId, interaction.gapTexts]\n\t)\n\n\t// Calculate remaining uses for each source token\n\tconst getRemainingUses = (sourceId: string): number => {\n\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\t\tif (!source) return 0\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\tconst usedCount = Object.values(currentPairs).filter((id) => id === sourceId).length\n\t\treturn source.matchMax - usedCount\n\t}\n\n\t// Handle source token click (select for click-to-place)\n\tconst handleSourceClick = (sourceId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tsetSelectedSourceId((prev) => (prev === sourceId ? null : sourceId))\n\t}\n\n\t// Handle gap click (place selected token)\n\tconst handleGapClick = (gapId: string) => {\n\t\tif (disabled || hasSubmitted || !selectedSourceId) return\n\n\t\t// Check if source still has remaining uses\n\t\tif (getRemainingUses(selectedSourceId) <= 0) {\n\t\t\tsetSelectedSourceId(null)\n\t\t\treturn\n\t\t}\n\n\t\t// Place the selected token in the gap\n\t\tconst newPairs = { ...currentPairs, [gapId]: selectedSourceId }\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\tsetSelectedSourceId(null)\n\t}\n\n\t// Handle clearing a gap\n\tconst handleClearGap = (gapId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tconst newPairs = { ...currentPairs }\n\t\tdelete newPairs[gapId]\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t}\n\n\t// Handle drag end (drop source on gap)\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst sourceData = active.data.current\n\t\tconst targetData = over.data.current\n\n\t\tif (sourceData?.type === \"source\" && targetData?.type === \"gap\") {\n\t\t\tconst sourceId = sourceData.sourceId\n\t\t\tconst gapId = targetData.gapId\n\n\t\t\tif (typeof sourceId === \"string\" && typeof gapId === \"string\") {\n\t\t\t\t// Check remaining uses\n\t\t\t\tif (getRemainingUses(sourceId) <= 0) return\n\n\t\t\t\tconst newPairs = { ...currentPairs, [gapId]: sourceId }\n\t\t\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build gap embeds for HTMLContent\n\tconst gapEmbeds = React.useMemo(() => {\n\t\tconst embeds: Record<string, DisplayGap> = {}\n\t\tfor (const gap of interaction.gaps) {\n\t\t\tembeds[gap.id] = gap\n\t\t}\n\t\treturn embeds\n\t}, [interaction.gaps])\n\n\treturn (\n\t\t<DndContext\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tconst id = e.active.id\n\t\t\t\tconst sourceId = typeof id === \"string\" ? id.replace(\"source-\", \"\") : null\n\t\t\t\tsetActiveDragId(sourceId)\n\t\t\t\tsetSelectedSourceId(null) // Clear selection when dragging\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Source Pool */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\t\t\"flex flex-wrap gap-2 min-h-[3.5rem]\",\n\t\t\t\t\t\tdisabled || hasSubmitted ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{interaction.gapTexts.map((source) => (\n\t\t\t\t\t\t<SourceToken\n\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\tid={source.id}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tisSelected={selectedSourceId === source.id}\n\t\t\t\t\t\t\tonClick={() => handleSourceClick(source.id)}\n\t\t\t\t\t\t\tremainingUses={getRemainingUses(source.id)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t\t{interaction.gapTexts.every((s) => getRemainingUses(s.id) <= 0)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Hint for click-to-place */}\n\t\t\t\t{selectedSourceId && !disabled && !hasSubmitted && (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground animate-pulse\">Click a gap to place the selected token</p>\n\t\t\t\t)}\n\n\t\t\t\t{/* Content with Gap Slots */}\n\t\t\t\t<div className=\"leading-relaxed text-lg\">\n\t\t\t\t\t<HTMLContent\n\t\t\t\t\t\thtml={interaction.contentHtml}\n\t\t\t\t\t\tgapEmbeds={gapEmbeds}\n\t\t\t\t\t\trenderGap={(gap) => {\n\t\t\t\t\t\t\tconst sourceId = currentPairs[gap.id]\n\t\t\t\t\t\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GapSlot\n\t\t\t\t\t\t\t\t\tgapId={gap.id}\n\t\t\t\t\t\t\t\t\tfilledWith={source}\n\t\t\t\t\t\t\t\t\tonClear={() => handleClearGap(gap.id)}\n\t\t\t\t\t\t\t\t\tonClick={() => handleGapClick(gap.id)}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\t\t\tisCorrect={gapCorrectness?.[gap.id]}\n\t\t\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay - dropAnimation={null} prevents the slow settling lag */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"selected\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default GapMatchInteraction\n","// Deterministic shuffle using a string seed\n\nfunction xmur3(str: string): () => number {\n\tlet h = 1779033703 ^ str.length\n\tfor (let i = 0; i < str.length; i++) {\n\t\th = Math.imul(h ^ str.charCodeAt(i), 3432918353)\n\t\th = (h << 13) | (h >>> 19)\n\t}\n\treturn () => {\n\t\th = Math.imul(h ^ (h >>> 16), 2246822507)\n\t\th = Math.imul(h ^ (h >>> 13), 3266489909)\n\t\tconst shifted = h >>> 16\n\t\th = h ^ shifted\n\t\treturn h >>> 0\n\t}\n}\n\nfunction mulberry32(seed: number): () => number {\n\tlet state = seed\n\treturn () => {\n\t\tstate = state + 0x6d2b79f5\n\t\tlet t = state\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1)\n\t\tt = t ^ (t + Math.imul(t ^ (t >>> 7), t | 61))\n\t\treturn ((t ^ (t >>> 14)) >>> 0) / 4294967296\n\t}\n}\n\nexport function shuffleWithSeed<T>(items: T[], seed: string): T[] {\n\tconst out = items.slice()\n\tconst seedFn = xmur3(seed)\n\tconst rng = mulberry32(seedFn())\n\tfor (let i = out.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng() * (i + 1))\n\t\tconst vi = out[i]\n\t\tconst vj = out[j]\n\t\tif (vi === undefined || vj === undefined) continue\n\t\tout[i] = vj\n\t\tout[j] = vi\n\t}\n\treturn out\n}\n","\"use client\"\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst selectTriggerVariants = cva(\n\t[\n\t\t\"cursor-pointer\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t\"border-[var(--select-complement)] text-[var(--select-foreground)] bg-[var(--select-background)] inline-flex items-center justify-between gap-2 align-baseline rounded-xs px-3 py-2 text-sm whitespace-nowrap outline-none\",\n\t\t\"data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2\",\n\t\t\"[&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-accent)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t},\n\t\t\toutline: {\n\t\t\t\ttrue: [\"border-2 shadow-[0_2px_0_var(--select-complement)]\"],\n\t\t\t\tfalse: [\"border-none shadow-[0_3px_0_var(--select-complement)]\"]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\",\n\t\t\toutline: false\n\t\t}\n\t}\n)\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n\treturn <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n\treturn <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n\treturn (\n\t\t<SelectPrimitive.Value\n\t\t\tdata-slot=\"select-value\"\n\t\t\tclassName={cn(\"text-[var(--select-foreground)]\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectTrigger({\n\tclassName,\n\tsize = \"default\",\n\tpalette = \"default\",\n\tchildren,\n\toutline = true,\n\tstyle,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> &\n\tVariantProps<typeof selectTriggerVariants> & {\n\t\tsize?: \"sm\" | \"default\"\n\t}) {\n\treturn (\n\t\t<SelectPrimitive.Trigger\n\t\t\tdata-slot=\"select-trigger\"\n\t\t\tdata-size={size}\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(selectTriggerVariants({ palette, outline, className }))}\n\t\t\tstyle={{ color: \"var(--select-foreground)\", ...style }}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<SelectPrimitive.Icon asChild>\n\t\t\t\t<ChevronDownIcon className=\"size-4 opacity-50\" />\n\t\t\t</SelectPrimitive.Icon>\n\t\t</SelectPrimitive.Trigger>\n\t)\n}\n\nfunction SelectContent({\n\tclassName,\n\tchildren,\n\tposition = \"popper\",\n\talign = \"center\",\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n\treturn (\n\t\t<SelectPrimitive.Portal>\n\t\t\t<SelectPrimitive.Content\n\t\t\t\tdata-slot=\"select-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xs border border-accent shadow-[0_2px_0_var(--color-accent)]\",\n\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tposition={position}\n\t\t\t\talign={align}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<SelectScrollUpButton />\n\t\t\t\t<SelectPrimitive.Viewport\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-1\",\n\t\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\t\"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</SelectPrimitive.Viewport>\n\t\t\t\t<SelectScrollDownButton />\n\t\t\t</SelectPrimitive.Content>\n\t\t</SelectPrimitive.Portal>\n\t)\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n\treturn (\n\t\t<SelectPrimitive.Label\n\t\t\tdata-slot=\"select-label\"\n\t\t\tclassName={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n\treturn (\n\t\t<SelectPrimitive.Item\n\t\t\tdata-slot=\"select-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-pointer items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<SelectPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</SelectPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n\t\t</SelectPrimitive.Item>\n\t)\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n\treturn (\n\t\t<SelectPrimitive.Separator\n\t\t\tdata-slot=\"select-separator\"\n\t\t\tclassName={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollUpButton\n\t\t\tdata-slot=\"select-scroll-up-button\"\n\t\t\tclassName={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronUpIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollUpButton>\n\t)\n}\n\nfunction SelectScrollDownButton({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollDownButton\n\t\t\tdata-slot=\"select-scroll-down-button\"\n\t\t\tclassName={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronDownIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollDownButton>\n\t)\n}\n\nexport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectLabel,\n\tSelectScrollDownButton,\n\tSelectScrollUpButton,\n\tSelectSeparator,\n\tSelectTrigger,\n\tSelectValue\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport { shuffleWithSeed } from \"../../shared/shuffle\"\nimport type { DisplayInlineEmbed } from \"../../shared/types\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface InlineInteractionProps {\n\t/** Inline interaction payload to render */\n\tembed: DisplayInlineEmbed\n\t/** Current user response (single-select) */\n\tresponse?: string\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness for the selected value (single-select) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Safe HTML Renderer (inline variant)\n// ============================================================================\n\n/**\n * Renders sanitized HTML inline. Uses a ref to set innerHTML after sanitization.\n * This avoids React's dangerouslySetInnerHTML prop while maintaining security.\n */\nfunction SafeInlineHTML({ html, className, style }: { html: string; className?: string; style?: React.CSSProperties }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = sanitizeForDisplay(html)\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} style={style} />\n}\n\n// ============================================================================\n// Inline Interaction Renderer\n// ============================================================================\n\n/**\n * Renders an inline choice interaction as a compact Select control.\n * Mirrors the UX and color rules used by the selects demo and block choice renderer.\n */\nexport function InlineInteraction({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineInteractionProps) {\n\tconst hasValue = typeof response === \"string\" && response.length > 0\n\tconst neutralTriggerClass = hasValue ? \"\" : \"border-border shadow-[0_3px_0_var(--color-border)] focus-visible:ring-0\"\n\n\t// Deterministic shuffle for consistent ordering\n\tconst items = React.useMemo(() => {\n\t\treturn embed.shuffle ? shuffleWithSeed(embed.choices, embed.responseId) : embed.choices\n\t}, [embed])\n\n\t// Feedback-driven palette and invalid state\n\tconst feedbackPalette: typeof palette = hasSubmitted && hasValue ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\tconst ariaInvalid = hasSubmitted && hasValue && isCorrect === false ? true : undefined\n\n\t// Selected label HTML for the trigger (mirror menu label, but we control styling here)\n\tconst selectedLabelHtml = React.useMemo(() => {\n\t\tif (!hasValue) return \"\"\n\t\tconst found = items.find((c) => c.id === response)\n\t\treturn found?.contentHtml ?? \"\"\n\t}, [hasValue, items, response])\n\n\treturn (\n\t\t<Select\n\t\t\tvalue={hasValue ? response : \"\"}\n\t\t\tonValueChange={(value) => {\n\t\t\t\tif (!disabled && onAnswerSelect) onAnswerSelect(value)\n\t\t\t}}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t>\n\t\t\t<SelectTrigger\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclassName={neutralTriggerClass}\n\t\t\t\tpalette={hasValue ? feedbackPalette : \"default\"}\n\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t>\n\t\t\t\t<SelectValue placeholder=\"Select...\">\n\t\t\t\t\t{hasValue ? (\n\t\t\t\t\t\t<SafeInlineHTML\n\t\t\t\t\t\t\thtml={selectedLabelHtml}\n\t\t\t\t\t\t\tclassName=\"text-[var(--select-foreground)]\"\n\t\t\t\t\t\t\tstyle={{ color: \"var(--select-foreground)\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</SelectValue>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent position=\"item-aligned\">\n\t\t\t\t{items.map((c) => (\n\t\t\t\t\t<SelectItem key={c.id} value={c.id}>\n\t\t\t\t\t\t<SafeInlineHTML html={c.contentHtml} />\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t)\n}\n\nexport default InlineInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\tPointerSensor,\n\tuseDraggable,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport { cva } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayAssociableChoice, DisplayMatchInteraction } from \"../../shared/types\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<targetId, sourceId[]> */\ntype MatchState = Record<string, string[]>\n\n/** Create pair key for QTI response */\nfunction createPairKey(sourceId: string, targetId: string): string {\n\treturn `${sourceId} ${targetId}`\n}\n\n/** Convert internal state to QTI response format: [\"sourceId targetId\", ...] */\nfunction toQtiResponse(state: MatchState): string[] {\n\tconst pairs: string[] = []\n\tfor (const [targetId, sourceIds] of Object.entries(state)) {\n\t\tfor (const sourceId of sourceIds) {\n\t\t\tpairs.push(createPairKey(sourceId, targetId))\n\t\t}\n\t}\n\treturn pairs\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): MatchState {\n\tconst state: MatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst targetId = parts[1]\n\t\tif (sourceId && targetId) {\n\t\t\tif (!state[targetId]) {\n\t\t\t\tstate[targetId] = []\n\t\t\t}\n\t\t\tstate[targetId].push(sourceId)\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst targetBoxVariants = cva(\n\t[\"flex flex-col gap-2 p-3 min-h-[8rem] min-w-[10rem]\", \"border-2 rounded-xs\", \"transition-all duration-150\"],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-border border-dashed bg-muted/10\",\n\t\t\t\thover: \"border-macaw border-solid bg-macaw/10 shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tfilled: \"border-macaw border-solid bg-macaw/5 shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tdisabled: \"opacity-60 bg-muted/30 border-dashed\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tplaced: \"bg-macaw/10 border-macaw shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tcorrect: \"bg-owl/15 border-owl shadow-[0_2px_0_var(--color-tree-frog)]\",\n\t\t\t\tincorrect: \"bg-cardinal/15 border-cardinal shadow-[0_2px_0_var(--color-fire-ant)]\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Placed Token (can be moved between containers)\n// ============================================================================\n\ninterface PlacedTokenProps {\n\tinstanceId: string\n\tsourceId: string\n\tfromTargetId: string\n\tfromIndex: number\n\tcontentHtml: string\n\tdisabled: boolean\n\tstate: \"placed\" | \"correct\" | \"incorrect\" | \"disabled\"\n\tonRemove: () => void\n}\n\nfunction PlacedToken({\n\tinstanceId,\n\tsourceId,\n\tfromTargetId,\n\tfromIndex,\n\tcontentHtml,\n\tdisabled,\n\tstate,\n\tonRemove\n}: PlacedTokenProps) {\n\tconst canInteract = !disabled && state !== \"correct\" && state !== \"incorrect\"\n\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: instanceId,\n\t\tdata: { type: \"placed\", sourceId, fromTargetId, fromIndex },\n\t\tdisabled: !canInteract\n\t})\n\n\tconst tokenState = isDragging ? \"dragging\" : state\n\n\t// Don't use disabled={} on button - it blocks drag events\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tref={setNodeRef}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tonClick={canInteract ? onRemove : undefined}\n\t\t\taria-disabled={!canInteract}\n\t\t\tclassName={cn(\n\t\t\t\tsourceTokenVariants({ state: tokenState }),\n\t\t\t\tcanInteract && \"cursor-grab hover:bg-muted/50 group\",\n\t\t\t\t!canInteract && \"cursor-default pointer-events-none\"\n\t\t\t)}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{canInteract && <span className=\"text-xs opacity-40 group-hover:opacity-100 ml-1 transition-opacity\">×</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Target Box\n// ============================================================================\n\ninterface TargetBoxProps {\n\ttarget: DisplayAssociableChoice\n\tplacedSources: Array<{ instanceId: string; source: DisplayAssociableChoice; index: number }>\n\tdisabled: boolean\n\tonRemoveSource: (instanceId: string) => void\n\tpairCorrectness?: Record<string, boolean>\n\thasSubmitted: boolean\n}\n\nfunction TargetBox({ target, placedSources, disabled, onRemoveSource, pairCorrectness, hasSubmitted }: TargetBoxProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `target-${target.id}`,\n\t\tdata: { type: \"target\", targetId: target.id },\n\t\tdisabled\n\t})\n\n\tconst hasSources = placedSources.length > 0\n\n\tconst getState = (): \"empty\" | \"hover\" | \"filled\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isOver) return \"hover\"\n\t\tif (hasSources) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\tconst getTokenState = (sourceId: string): \"placed\" | \"correct\" | \"incorrect\" | \"disabled\" => {\n\t\tif (hasSubmitted) {\n\t\t\tconst pairKey = createPairKey(sourceId, target.id)\n\t\t\tconst isCorrect = pairCorrectness?.[pairKey]\n\t\t\tif (isCorrect === true) return \"correct\"\n\t\t\tif (isCorrect === false) return \"incorrect\"\n\t\t}\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"placed\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(targetBoxVariants({ state: getState() }))}>\n\t\t\t{/* Target Label - Inside at top */}\n\t\t\t<div className=\"text-sm font-semibold text-center pb-2 border-b border-border/50 mb-2\">\n\t\t\t\t<SafeInlineHTML html={target.contentHtml} />\n\t\t\t</div>\n\n\t\t\t{/* Placed tokens or placeholder */}\n\t\t\t{placedSources.length === 0 ? (\n\t\t\t\t<div className=\"flex-1 flex items-center justify-center text-muted-foreground/50 text-sm\">Drop here</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t{placedSources.map(({ instanceId, source, index }) => (\n\t\t\t\t\t\t<PlacedToken\n\t\t\t\t\t\t\tkey={instanceId}\n\t\t\t\t\t\t\tinstanceId={instanceId}\n\t\t\t\t\t\t\tsourceId={source.id}\n\t\t\t\t\t\t\tfromTargetId={target.id}\n\t\t\t\t\t\t\tfromIndex={index}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tstate={getTokenState(source.id)}\n\t\t\t\t\t\t\tonRemove={() => onRemoveSource(instanceId)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Source Pool Token\n// ============================================================================\n\ninterface SourcePoolTokenProps {\n\tsource: DisplayAssociableChoice\n\tremainingUses: number\n\tdisabled: boolean\n}\n\nfunction SourcePoolToken({ source, remainingUses, disabled }: SourcePoolTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `pool-${source.id}`,\n\t\tdata: { type: \"source\", sourceId: source.id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\tconst getState = (): \"idle\" | \"dragging\" | \"disabled\" => {\n\t\tif (isDragging) return \"dragging\"\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(sourceTokenVariants({ state: getState() }))} {...attributes} {...listeners}>\n\t\t\t<SafeInlineHTML html={source.contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-2 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Droppable Source Pool (for returning tokens)\n// ============================================================================\n\ninterface DroppablePoolProps {\n\tdisabled: boolean\n\tchildren: React.ReactNode\n}\n\nfunction DroppablePool({ disabled, children }: DroppablePoolProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: \"source-pool\",\n\t\tdata: { type: \"pool\" },\n\t\tdisabled\n\t})\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\"flex flex-wrap justify-center gap-3 min-h-[4rem]\",\n\t\t\t\t\"transition-all duration-150\",\n\t\t\t\tdisabled ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\",\n\t\t\t\tisOver && !disabled && \"border-macaw bg-macaw/10\"\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Main Match Interaction Component\n// ============================================================================\n\nexport interface MatchInteractionProps {\n\tinteraction: DisplayMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tpairCorrectness?: Record<string, boolean>\n}\n\nexport function MatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tpairCorrectness\n}: MatchInteractionProps) {\n\t// Sensors: require 5px movement before drag starts (allows clicks to work)\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: {\n\t\t\t\tdistance: 5\n\t\t\t}\n\t\t})\n\t)\n\n\t// Convert QTI response to internal state\n\tconst currentState = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(() => {\n\t\tif (!activeDragId) return null\n\t\t// Check if it's from pool or already placed\n\t\tconst sourceId = activeDragId.startsWith(\"pool-\") ? activeDragId.replace(\"pool-\", \"\") : activeDragId.split(\"-\")[0] // instanceId format: \"sourceId-targetId-index\"\n\t\treturn interaction.sourceChoices.find((s) => s.id === sourceId)\n\t}, [activeDragId, interaction.sourceChoices])\n\n\t// Count how many times each source is used\n\tconst getSourceUsageCount = (sourceId: string): number => {\n\t\tlet count = 0\n\t\tfor (const sources of Object.values(currentState)) {\n\t\t\tcount += sources.filter((id) => id === sourceId).length\n\t\t}\n\t\treturn count\n\t}\n\n\t// Get remaining uses for a source\n\tconst getRemainingUses = (source: DisplayAssociableChoice): number => {\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\treturn source.matchMax - getSourceUsageCount(source.id)\n\t}\n\n\t// Check if target can accept more\n\tconst canTargetAcceptMore = (target: DisplayAssociableChoice): boolean => {\n\t\tconst placed = currentState[target.id]?.length ?? 0\n\t\tif (target.matchMax === 0) return true // Unlimited\n\t\treturn placed < target.matchMax\n\t}\n\n\t// Handle drag end\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst activeData = active.data.current\n\t\tconst overData = over.data.current\n\n\t\t// Case 1: Dropping on the pool (return to bank)\n\t\tif (overData?.type === \"pool\" && activeData?.type === \"placed\") {\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// Remove from target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Must be dropping on a target for remaining cases\n\t\tif (overData?.type !== \"target\") return\n\t\tconst toTargetId = overData.targetId\n\t\tif (typeof toTargetId !== \"string\") return\n\n\t\tconst toTarget = interaction.targetChoices.find((t) => t.id === toTargetId)\n\t\tif (!toTarget) return\n\n\t\t// Case 2: Dragging from pool to target\n\t\tif (activeData?.type === \"source\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tif (typeof sourceId !== \"string\") return\n\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\tif (!source) return\n\n\t\t\t// Check if we can add\n\t\t\tif (getRemainingUses(source) <= 0) return\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Add to state\n\t\t\tconst newState = { ...currentState }\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Case 3: Dragging from one target to another\n\t\tif (activeData?.type === \"placed\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof sourceId !== \"string\" || typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// If dropping on the same target, do nothing\n\t\t\tif (fromTargetId === toTargetId) return\n\n\t\t\t// Check if the destination can accept more\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Remove from old target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to new target\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t}\n\t}\n\n\t// Handle removing a source from a target\n\tconst handleRemoveSource = (targetId: string, index: number) => {\n\t\tif (disabled || hasSubmitted) return\n\n\t\tconst newState = { ...currentState }\n\t\tconst sources = newState[targetId]\n\t\tif (sources) {\n\t\t\tnewState[targetId] = sources.filter((_, i) => i !== index)\n\t\t\tif (newState[targetId].length === 0) {\n\t\t\t\tdelete newState[targetId]\n\t\t\t}\n\t\t}\n\n\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t}\n\n\t// Build placed sources for each target with instance IDs\n\tconst getPlacedSources = (targetId: string) => {\n\t\tconst sourceIds = currentState[targetId] ?? []\n\t\treturn sourceIds.map((sourceId, index) => {\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\treturn {\n\t\t\t\tinstanceId: `${sourceId}-${targetId}-${index}`,\n\t\t\t\tsource: source ?? { id: sourceId, contentHtml: sourceId, matchMax: 1 },\n\t\t\t\tindex\n\t\t\t}\n\t\t})\n\t}\n\n\treturn (\n\t\t<DndContext\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tsetActiveDragId(String(e.active.id))\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Prompt */}\n\t\t\t\t{interaction.promptHtml && (\n\t\t\t\t\t<div className=\"text-center mb-4\">\n\t\t\t\t\t\t<SafeInlineHTML html={interaction.promptHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Source Pool (Bank) - Now on top, droppable to return tokens */}\n\t\t\t\t{!hasSubmitted && (\n\t\t\t\t\t<DroppablePool disabled={disabled}>\n\t\t\t\t\t\t{interaction.sourceChoices.map((source) => (\n\t\t\t\t\t\t\t<SourcePoolToken\n\t\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\t\tsource={source}\n\t\t\t\t\t\t\t\tremainingUses={getRemainingUses(source)}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{interaction.sourceChoices.every((s) => getRemainingUses(s) <= 0) && (\n\t\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">All items placed</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</DroppablePool>\n\t\t\t\t)}\n\n\t\t\t\t{/* Target Boxes (Drop zones) - Now below */}\n\t\t\t\t<div className=\"flex flex-wrap justify-center gap-4\">\n\t\t\t\t\t{interaction.targetChoices.map((target) => (\n\t\t\t\t\t\t<TargetBox\n\t\t\t\t\t\t\tkey={target.id}\n\t\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\t\tplacedSources={getPlacedSources(target.id)}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tonRemoveSource={(instanceId) => {\n\t\t\t\t\t\t\t\tconst index = getPlacedSources(target.id).findIndex((p) => p.instanceId === instanceId)\n\t\t\t\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\t\t\t\thandleRemoveSource(target.id, index)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tpairCorrectness={pairCorrectness}\n\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"idle\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default MatchInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\ttype DragStartEvent,\n\ttype DropAnimation,\n\tdefaultDropAnimationSideEffects,\n\tKeyboardSensor,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport {\n\tarrayMove,\n\thorizontalListSortingStrategy,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tuseSortable,\n\tverticalListSortingStrategy\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayChoice, DisplayOrderInteraction } from \"../../shared/types\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// --- Drag Handle Icon ---\nfunction DragHandleIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"12\"\n\t\t\theight=\"12\"\n\t\t\tviewBox=\"0 0 15 15\"\n\t\t\tfill=\"none\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tclassName={className}\n\t\t\taria-hidden=\"true\"\n\t\t\trole=\"img\"\n\t\t>\n\t\t\t<title>Drag handle</title>\n\t\t\t<path\n\t\t\t\td=\"M5.5 3C5.5 3.27614 5.27614 3.5 5 3.5C4.72386 3.5 4.5 3.27614 4.5 3C4.5 2.72386 4.72386 2.5 5 2.5C5.27614 2.5 5.5 2.72386 5.5 3ZM5.5 7.5C5.5 7.77614 5.27614 8 5 8C4.72386 8 4.5 7.77614 4.5 7.5C4.5 7.22386 4.72386 7 5 7C5.27614 7 5.5 7.22386 5.5 7.5ZM5.5 12C5.5 12.2761 5.27614 12.5 5 12.5C4.72386 12.5 4.5 12.2761 4.5 12C4.5 11.7239 4.72386 11.5 5 11.5C5.27614 11.5 5.5 11.7239 5.5 12ZM9.5 3C9.5 3.27614 9.27614 3.5 9 3.5C8.72386 3.5 8.5 3.27614 8.5 3C8.5 2.72386 8.72386 2.5 9 2.5C9.27614 2.5 9.5 2.72386 9.5 3ZM9.5 7.5C9.5 7.77614 9.27614 8 9 8C8.72386 8 8.5 7.77614 8.5 7.5C8.5 7.22386 8.72386 7 9 7C9.27614 7 9.5 7.22386 9.5 7.5ZM9.5 12C9.5 12.2761 9.27614 12.5 9 12.5C8.72386 12.5 8.5 12.2761 8.5 12C8.5 11.7239 8.72386 11.5 9 11.5C9.27614 11.5 9.5 11.7239 9.5 12Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\n// --- Sortable Item ---\nfunction SortableItem({\n\tid,\n\tcontentHtml,\n\tdisabled,\n\tisHorizontal\n}: {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisHorizontal: boolean\n}) {\n\tconst { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled })\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : 1,\n\t\tzIndex: isDragging ? 50 : (\"auto\" as const)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border rounded-lg shadow-sm touch-none select-none\",\n\t\t\t\t// Styling differs based on orientation\n\t\t\t\tisHorizontal\n\t\t\t\t\t? \"px-4 py-2 min-w-[100px] flex items-center justify-center text-center\"\n\t\t\t\t\t: \"p-4 w-full flex items-center gap-3\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"cursor-default opacity-90 bg-muted/50\"\n\t\t\t\t\t: \"cursor-grab active:cursor-grabbing hover:border-macaw/50 hover:shadow-md\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-muted-foreground shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Drag Overlay Item ---\nfunction DragOverlayItem({ contentHtml, isHorizontal }: { contentHtml: string; isHorizontal: boolean }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border-2 border-macaw rounded-lg shadow-xl cursor-grabbing z-50\",\n\t\t\t\tisHorizontal ? \"px-4 py-2 min-w-[100px] flex items-center justify-center\" : \"p-4 w-full flex items-center gap-3\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-macaw shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Main Component ---\nexport interface OrderInteractionProps {\n\tinteraction: DisplayOrderInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tisCorrect?: boolean\n}\n\nexport function OrderInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled,\n\thasSubmitted,\n\tisCorrect\n}: OrderInteractionProps) {\n\t// Use response if available (user state), otherwise fallback to initial shuffled order\n\tconst items = React.useMemo(() => {\n\t\tif (response && response.length > 0) {\n\t\t\t// Re-order the choices array based on the response ID list\n\t\t\tconst mapped: DisplayChoice[] = []\n\t\t\tfor (const id of response) {\n\t\t\t\tconst found = interaction.choices.find((c) => c.id === id)\n\t\t\t\tif (found) mapped.push(found)\n\t\t\t}\n\t\t\treturn mapped\n\t\t}\n\t\treturn interaction.choices\n\t}, [response, interaction.choices])\n\n\t// Local state for active drag item (for overlay)\n\tconst [activeId, setActiveId] = React.useState<string | null>(null)\n\tconst activeItem = React.useMemo(() => items.find((i) => i.id === activeId), [activeId, items])\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates\n\t\t})\n\t)\n\n\tconst handleDragStart = (event: DragStartEvent) => {\n\t\tconst id = event.active.id\n\t\tsetActiveId(typeof id === \"string\" ? id : String(id))\n\t}\n\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event\n\t\tsetActiveId(null)\n\n\t\tif (over && active.id !== over.id) {\n\t\t\tconst oldIndex = items.findIndex((item) => item.id === active.id)\n\t\t\tconst newIndex = items.findIndex((item) => item.id === over.id)\n\n\t\t\tconst newOrder = arrayMove(items, oldIndex, newIndex)\n\n\t\t\t// Notify parent\n\t\t\tonAnswerSelect?.(newOrder.map((item) => item.id))\n\t\t}\n\t}\n\n\tconst isHorizontal = interaction.orientation === \"horizontal\"\n\tconst strategy = isHorizontal ? horizontalListSortingStrategy : verticalListSortingStrategy\n\n\t// Smooth drop animation configuration\n\tconst dropAnimation: DropAnimation = {\n\t\tsideEffects: defaultDropAnimationSideEffects({\n\t\t\tstyles: { active: { opacity: \"0.4\" } }\n\t\t})\n\t}\n\n\t// Feedback container styles\n\tconst getContainerStyles = () => {\n\t\tif (!hasSubmitted) {\n\t\t\treturn \"bg-muted/30 border-transparent\"\n\t\t}\n\t\tif (isCorrect) {\n\t\t\treturn \"bg-owl/10 border-owl\"\n\t\t}\n\t\treturn \"bg-cardinal/10 border-cardinal\"\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{interaction.promptHtml && <HTMLContent html={interaction.promptHtml} />}\n\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tcollisionDetection={closestCenter}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t>\n\t\t\t\t<SortableContext items={items.map((i) => i.id)} strategy={strategy} disabled={disabled || hasSubmitted}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"rounded-xl p-4 transition-colors border-2\",\n\t\t\t\t\t\t\tisHorizontal ? \"flex flex-wrap gap-3\" : \"flex flex-col gap-2\",\n\t\t\t\t\t\t\tgetContainerStyles()\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t\t<SortableItem\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\t\t\tcontentHtml={item.contentHtml}\n\t\t\t\t\t\t\t\tdisabled={!!(disabled || hasSubmitted)}\n\t\t\t\t\t\t\t\tisHorizontal={isHorizontal}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\n\t\t\t\t{/* Portal Overlay for smooth visual while dragging */}\n\t\t\t\t<DragOverlay dropAnimation={dropAnimation}>\n\t\t\t\t\t{activeItem ? <DragOverlayItem contentHtml={activeItem.contentHtml} isHorizontal={isHorizontal} /> : null}\n\t\t\t\t</DragOverlay>\n\t\t\t</DndContext>\n\t\t</div>\n\t)\n}\n\nexport default OrderInteraction\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayTextEmbed, DisplayTextInteraction } from \"../../shared/types\"\n\n// ============================================================================\n// Palette Variants (mirrors SelectTrigger pattern)\n// ============================================================================\n\nconst textEntryVariants = cva(\n\t[\n\t\t// Base styles matching Select trigger\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs text-sm font-semibold\",\n\t\t\"bg-[var(--text-entry-background)] text-[var(--text-entry-foreground)]\",\n\t\t\"border border-[var(--text-entry-complement)]\", // border = 1px width, border-[...] = color\n\t\t\"shadow-[0_3px_0_var(--text-entry-complement)]\",\n\t\t\"transition-all duration-150\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t// Placeholder and focus (no ring - matches Select component)\n\t\t\"placeholder:text-muted-foreground/60\",\n\t\t\"focus:outline-none\",\n\t\t// Disabled state\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t// Invalid state\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-accent)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--cardinal)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--owl)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\nexport type TextEntryPalette = NonNullable<VariantProps<typeof textEntryVariants>[\"palette\"]>\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TextEntryInteractionProps {\n\t/** Text interaction payload (block-level) */\n\tinteraction: DisplayTextInteraction\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and show feedback */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness for the entered value (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\nexport interface InlineTextEntryProps {\n\t/** Text entry embed payload (inline within rich stimulus) */\n\tembed: DisplayTextEmbed\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Block-level Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders a block-level text entry interaction.\n * Used when text entry is a standalone interaction block (rare).\n */\nexport function TextEntryInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: TextEntryInteractionProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length with sensible defaults\n\t// Add 4ch buffer to account for px-2 padding (approx 2ch) and borders\n\tconst charWidth = interaction.expectedLength ?? 10\n\tconst inputWidth = `${Math.max(charWidth, 3) + 4}ch`\n\n\treturn (\n\t\t<div className=\"my-4 inline-block\">\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\tplaceholder={interaction.placeholder ?? \"...\"}\n\t\t\t\tpattern={interaction.patternMask}\n\t\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }))}\n\t\t\t\tstyle={{ width: inputWidth, minWidth: \"8ch\" }}\n\t\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Inline Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders an inline text entry interaction (embedded within rich stimulus).\n * Matches the compact styling of InlineInteraction (Select) for consistency.\n */\nexport function InlineTextEntry({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineTextEntryProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length - keep it tight for inline use\n\t// Add 3ch buffer to account for px-2 padding and visual balance\n\tconst charWidth = embed.expectedLength ?? 4\n\tconst inputWidth = `${Math.max(charWidth, 2) + 3}ch`\n\n\treturn (\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tvalue={value}\n\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\tplaceholder=\"...\"\n\t\t\tpattern={embed.patternMask}\n\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }), \"align-baseline\")}\n\t\t\tstyle={{ width: inputWidth, minWidth: \"6ch\" }}\n\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t/>\n\t)\n}\n\nexport default TextEntryInteraction\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport type { ChoiceInteraction } from \"../schema\"\nimport type {\n\tDisplayBlock,\n\tDisplayChoiceInteraction,\n\tDisplayGapMatchInteraction,\n\tDisplayItem,\n\tDisplayMatchInteraction,\n\tDisplayOrderInteraction\n} from \"../shared/types\"\nimport { FeedbackMessage } from \"./feedback-message\"\nimport { ChoiceInteractionRenderer } from \"./interactions/choice-interaction\"\nimport { GapMatchInteraction } from \"./interactions/gap-match-interaction\"\nimport { InlineInteraction } from \"./interactions/inline-interaction\"\nimport { MatchInteraction } from \"./interactions/match-interaction\"\nimport { OrderInteraction } from \"./interactions/order-interaction\"\nimport { InlineTextEntry, TextEntryInteraction } from \"./interactions/text-entry-interaction\"\nimport { HTMLContent } from \"./shared/html-content\"\n\n// ============================================================================\n// Order Interaction Block (with auto-initialization)\n// ============================================================================\n\n/**\n * Wrapper for OrderInteraction that initializes the response with the displayed\n * order on mount. This ensures that if the user submits without interacting,\n * the current visible order is submitted (not an empty response).\n */\nfunction OrderInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback\n}: {\n\tinteraction: DisplayOrderInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\tconst hasInitialized = React.useRef(false)\n\n\t// Initialize response with displayed order on mount (if not already set)\n\tReact.useEffect(() => {\n\t\t// Only initialize once, and only if there's no existing response\n\t\tif (hasInitialized.current) return\n\t\tif (response) return\n\t\tif (interaction.choices.length === 0) return\n\t\tif (!onAnswerSelect) return\n\n\t\thasInitialized.current = true\n\t\tconst initialOrder = interaction.choices.map((c) => c.id)\n\t\tonAnswerSelect(interaction.responseId, initialOrder)\n\t}, [response, interaction.choices, interaction.responseId, onAnswerSelect])\n\n\t// Safe casting for array response\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\") {\n\t\tresponseArray = [response]\n\t}\n\n\tconst feedback = perResponseFeedback?.[interaction.responseId]\n\n\treturn (\n\t\t<>\n\t\t\t<OrderInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Gap Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for GapMatchInteraction that computes per-gap correctness\n * and handles the directedPair response format.\n */\nfunction GapMatchInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback,\n\tselectedChoicesByResponse\n}: {\n\tinteraction: DisplayGapMatchInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\n\t// Ensure response is array\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\" && response) {\n\t\tresponseArray = [response]\n\t}\n\n\t// Compute per-gap correctness from selectedChoicesByResponse\n\t// Each entry in selectedChoicesByResponse has id = \"sourceId gapId\" format\n\tconst gapCorrectness = React.useMemo(() => {\n\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\tif (!entries || !showFeedback) return undefined\n\n\t\tconst result: Record<string, boolean> = {}\n\t\tfor (const entry of entries) {\n\t\t\t// Parse \"sourceId gapId\" to extract gapId\n\t\t\tconst parts = entry.id.split(\" \")\n\t\t\tconst gapId = parts[1]\n\t\t\tif (gapId) {\n\t\t\t\tresult[gapId] = entry.isCorrect\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n\treturn (\n\t\t<>\n\t\t\t<GapMatchInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tgapCorrectness={gapCorrectness}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for MatchInteraction that computes per-pair correctness\n * and handles the directedPair response format.\n */\nfunction MatchInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback,\n\tselectedChoicesByResponse\n}: {\n\tinteraction: DisplayMatchInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\n\t// Ensure response is array\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\" && response) {\n\t\tresponseArray = [response]\n\t}\n\n\t// Compute per-pair correctness from selectedChoicesByResponse\n\t// Each entry in selectedChoicesByResponse has id = \"sourceId targetId\" format\n\tconst pairCorrectness = React.useMemo(() => {\n\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\tif (!entries || !showFeedback) return undefined\n\n\t\tconst result: Record<string, boolean> = {}\n\t\tfor (const entry of entries) {\n\t\t\t// The id is already \"sourceId targetId\" format\n\t\t\tresult[entry.id] = entry.isCorrect\n\t\t}\n\t\treturn result\n\t}, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n\treturn (\n\t\t<>\n\t\t\t<MatchInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tpairCorrectness={pairCorrectness}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Theme options for the QTI renderer */\nexport type QTITheme = \"duolingo\" | \"neobrutalist\" | (string & {})\n\n/** Feedback result for a single response */\nexport interface ResponseFeedback {\n\tisCorrect: boolean\n\tmessageHtml?: string\n}\n\n/** Correctness info for selected choices */\nexport interface ChoiceCorrectness {\n\tid: string\n\tisCorrect: boolean\n}\n\n/**\n * Props for the QTIRenderer component.\n *\n * This is a **controlled, display-only component**. It renders the question\n * and captures user input, but does NOT include submit buttons or flow logic.\n * The consuming app is responsible for:\n * - Providing responses state\n * - Handling submission\n * - Providing feedback after validation\n * - Rendering buttons (Check, Try Again, Continue, etc.)\n */\nexport interface QTIRendererProps {\n\t/**\n\t * The display-safe item to render.\n\t * Use `buildDisplayModel()` to create this from a parsed AssessmentItem.\n\t */\n\titem: DisplayItem\n\n\t/**\n\t * Current user responses, keyed by response identifier.\n\t * This is a controlled component - you must manage this state.\n\t * @example { \"RESPONSE\": \"A\" } or { \"RESPONSE\": [\"A\", \"C\"] }\n\t */\n\tresponses: Record<string, string | string[]>\n\n\t/**\n\t * Callback fired when user selects/changes an answer.\n\t * Update your responses state in this callback.\n\t */\n\tonResponseChange: (responseId: string, value: string | string[]) => void\n\n\t/**\n\t * Theme to apply. Defaults to \"duolingo\".\n\t * Available themes: \"duolingo\", \"neobrutalist\", or any custom theme\n\t * defined via `[data-qti-theme=\"your-theme\"]` CSS.\n\t */\n\ttheme?: QTITheme\n\n\t/**\n\t * Whether to show feedback states (correct/incorrect styling).\n\t * Set to true after validation to display results.\n\t */\n\tshowFeedback?: boolean\n\n\t/**\n\t * Whether to disable all interactions.\n\t * Typically set to true when showFeedback is true.\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Per-choice correctness for highlighting selected answers.\n\t * Keyed by response identifier.\n\t */\n\tchoiceCorrectness?: Record<string, ChoiceCorrectness[]>\n\n\t/**\n\t * Per-response feedback messages to display.\n\t * Keyed by response identifier.\n\t */\n\tresponseFeedback?: Record<string, ResponseFeedback>\n\n\t/**\n\t * Overall feedback to display at the end of the question.\n\t */\n\toverallFeedback?: ResponseFeedback\n\n\t/**\n\t * Additional CSS class for the container.\n\t */\n\tclassName?: string\n}\n\nexport interface ContentBlockRendererProps {\n\t/** The content block to render */\n\tblock: DisplayBlock\n\t/** Current user responses */\n\tresponses?: Record<string, string | string[]>\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\t/** Whether to show feedback */\n\tshowFeedback?: boolean\n\t/** Whether to disable interactions */\n\tdisabled?: boolean\n\t/** Selected-only correctness mapping for this render pass */\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n\t/** Optional per-response feedback messages from server */\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\n/**\n * Renders a single content block (stimulus or interaction)\n */\nexport function ContentBlockRenderer({\n\tblock,\n\tresponses,\n\tonAnswerSelect,\n\tshowFeedback,\n\tdisabled,\n\tselectedChoicesByResponse,\n\tperResponseFeedback\n}: ContentBlockRendererProps) {\n\tif (block.type === \"stimulus\") {\n\t\treturn <HTMLContent html={block.html} className=\"mb-6\" />\n\t}\n\tif (block.type === \"richStimulus\") {\n\t\t// Collect all response IDs for feedback (inline choice + text entry)\n\t\tconst allResponseIds = [\n\t\t\t...Object.values(block.inlineEmbeds).map((e) => e.responseId),\n\t\t\t...Object.values(block.textEmbeds).map((e) => e.responseId)\n\t\t]\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<HTMLContent\n\t\t\t\t\thtml={block.html}\n\t\t\t\t\tclassName=\"mb-6\"\n\t\t\t\t\tinlineEmbeds={block.inlineEmbeds}\n\t\t\t\t\ttextEmbeds={block.textEmbeds}\n\t\t\t\t\trenderInline={(embed) => {\n\t\t\t\t\t\tconst currentValue = (() => {\n\t\t\t\t\t\t\tconst v = responses?.[embed.responseId]\n\t\t\t\t\t\t\treturn typeof v === \"string\" ? v : \"\"\n\t\t\t\t\t\t})()\n\t\t\t\t\t\t// Compute correctness of selected value if available\n\t\t\t\t\t\tconst perSelectionEntries = selectedChoicesByResponse?.[embed.responseId]\n\t\t\t\t\t\tconst selectedIsCorrect =\n\t\t\t\t\t\t\tperSelectionEntries && currentValue\n\t\t\t\t\t\t\t\t? perSelectionEntries.find((e) => e.id === currentValue)?.isCorrect\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<InlineInteraction\n\t\t\t\t\t\t\t\tembed={embed}\n\t\t\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\t\t\tonAnswerSelect={(v) => {\n\t\t\t\t\t\t\t\t\tif (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdisabled={disabled || showFeedback}\n\t\t\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\t\t\tisCorrect={selectedIsCorrect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t\trenderTextEntry={(embed) => {\n\t\t\t\t\t\tconst currentValue = (() => {\n\t\t\t\t\t\t\tconst v = responses?.[embed.responseId]\n\t\t\t\t\t\t\treturn typeof v === \"string\" ? v : \"\"\n\t\t\t\t\t\t})()\n\t\t\t\t\t\t// Text entry correctness from perResponseFeedback\n\t\t\t\t\t\tconst feedback = perResponseFeedback?.[embed.responseId]\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<InlineTextEntry\n\t\t\t\t\t\t\t\tkey={embed.responseId}\n\t\t\t\t\t\t\t\tembed={embed}\n\t\t\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\t\t\tonAnswerSelect={(v) => {\n\t\t\t\t\t\t\t\t\tif (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdisabled={disabled || showFeedback}\n\t\t\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t{allResponseIds.map((responseId) => (\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tkey={`fb-${responseId}`}\n\t\t\t\t\t\tresponseId={responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</>\n\t\t)\n\t}\n\n\tif (block.type === \"interaction\" && block.interaction) {\n\t\tconst interaction = block.interaction\n\n\t\t// Handle text entry interactions\n\t\tif (interaction.type === \"text\") {\n\t\t\tconst response = responses?.[interaction.responseId]\n\t\t\tconst currentValue = typeof response === \"string\" ? response : \"\"\n\t\t\tconst feedback = perResponseFeedback?.[interaction.responseId]\n\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<TextEntryInteraction\n\t\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\tonAnswerSelect={(value) => {\n\t\t\t\t\t\t\tif (onAnswerSelect) {\n\t\t\t\t\t\t\t\tonAnswerSelect(interaction.responseId, value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t\t\t/>\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)\n\t\t}\n\n\t\t// Handle choice interactions\n\t\tif (interaction.type === \"choice\") {\n\t\t\tconst response = responses?.[interaction.responseId]\n\n\t\t\t// Derive single-select correctness from selectedChoicesByResponse\n\t\t\tlet selected: string[] = []\n\t\t\tif (Array.isArray(response)) {\n\t\t\t\tselected = response\n\t\t\t} else if (typeof response === \"string\") {\n\t\t\t\tselected = [response]\n\t\t\t}\n\t\t\tconst perSelectionEntries = selectedChoicesByResponse?.[interaction.responseId]\n\t\t\tconst perSelectionTable = perSelectionEntries\n\t\t\t\t? new Map(perSelectionEntries.map((e) => [e.id, e.isCorrect]))\n\t\t\t\t: undefined\n\t\t\tlet singleIsCorrect: boolean | undefined\n\t\t\tif (interaction.cardinality === \"single\" && selected.length === 1 && perSelectionTable) {\n\t\t\t\tconst firstCandidate = selected[0]\n\t\t\t\tif (typeof firstCandidate === \"string\") {\n\t\t\t\t\tsingleIsCorrect = perSelectionTable.get(firstCandidate) === true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst toChoiceInteraction = (d: DisplayChoiceInteraction): ChoiceInteraction => {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"choiceInteraction\",\n\t\t\t\t\tresponseIdentifier: d.responseId,\n\t\t\t\t\tshuffle: false,\n\t\t\t\t\tminChoices: d.minChoices,\n\t\t\t\t\tmaxChoices: d.maxChoices,\n\t\t\t\t\tpromptHtml: d.promptHtml,\n\t\t\t\t\tchoices: d.choices.map((c) => ({\n\t\t\t\t\t\tidentifier: c.id,\n\t\t\t\t\t\tcontentHtml: c.contentHtml,\n\t\t\t\t\t\tinlineFeedbackHtml: c.inlineFeedbackHtml\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<ChoiceInteractionRenderer\n\t\t\t\t\t\tinteraction={toChoiceInteraction(interaction)}\n\t\t\t\t\t\tresponse={response}\n\t\t\t\t\t\tonAnswerSelect={(value) => {\n\t\t\t\t\t\t\tif (onAnswerSelect) {\n\t\t\t\t\t\t\t\tonAnswerSelect(interaction.responseId, value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\tisCorrect={singleIsCorrect}\n\t\t\t\t\t\tselectedChoicesCorrectness={(() => {\n\t\t\t\t\t\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\t\t\t\t\t\tif (!entries) return undefined\n\t\t\t\t\t\t\tconst table = new Map(entries.map((e) => [e.id, e.isCorrect]))\n\t\t\t\t\t\t\treturn selected.map((id) => ({ id, isCorrect: table.get(id) === true }))\n\t\t\t\t\t\t})()}\n\t\t\t\t\t/>\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)\n\t\t}\n\n\t\t// Handle order interactions (drag-and-drop sorting)\n\t\tif (interaction.type === \"order\") {\n\t\t\treturn (\n\t\t\t\t<OrderInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\t// Handle gap match interactions (fill-in-the-blank with drag/click)\n\t\tif (interaction.type === \"gapMatch\") {\n\t\t\treturn (\n\t\t\t\t<GapMatchInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\tselectedChoicesByResponse={selectedChoicesByResponse}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\t// Handle match interactions (matrix association)\n\t\tif (interaction.type === \"match\") {\n\t\t\treturn (\n\t\t\t\t<MatchInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\tselectedChoicesByResponse={selectedChoicesByResponse}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t}\n\n\t// Unknown block type\n\treturn null\n}\n\n// ============================================================================\n// Main QTI Renderer\n// ============================================================================\n\n/**\n * A controlled, display-only component for rendering QTI assessment items.\n *\n * **This component does NOT include buttons or submission logic.**\n * The consuming app is responsible for:\n * - Managing `responses` state\n * - Rendering Check/Submit/Try Again buttons\n * - Calling validation APIs\n * - Providing feedback data after validation\n *\n * @example\n * ```tsx\n * const [responses, setResponses] = useState({})\n * const [feedback, setFeedback] = useState(null)\n *\n * <QTIRenderer\n * item={displayItem}\n * responses={responses}\n * onResponseChange={(id, value) => setResponses(prev => ({ ...prev, [id]: value }))}\n * theme=\"neobrutalist\"\n * showFeedback={!!feedback}\n * responseFeedback={feedback?.perResponse}\n * overallFeedback={feedback?.overall}\n * disabled={!!feedback}\n * />\n *\n * <button onClick={handleCheck}>Check Answer</button>\n * ```\n */\nexport function QTIRenderer({\n\titem,\n\tresponses,\n\tonResponseChange,\n\ttheme = \"duolingo\",\n\tshowFeedback = false,\n\tdisabled = false,\n\tchoiceCorrectness,\n\tresponseFeedback,\n\toverallFeedback,\n\tclassName\n}: QTIRendererProps) {\n\t// Determine theme attribute value (empty string for default/duolingo)\n\tconst themeAttr = theme === \"duolingo\" ? undefined : theme\n\n\treturn (\n\t\t<div className={cn(\"qti-container\", className)} data-qti-theme={themeAttr}>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{item.contentBlocks.map((block, index) => (\n\t\t\t\t\t<ContentBlockRenderer\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\tresponses={responses}\n\t\t\t\t\t\tonAnswerSelect={onResponseChange}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tselectedChoicesByResponse={choiceCorrectness}\n\t\t\t\t\t\tperResponseFeedback={responseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t{/* Overall feedback shown at the end */}\n\t\t\t{showFeedback && overallFeedback?.messageHtml && (\n\t\t\t\t<div className=\"qti-feedback mt-6 p-6\" data-correct={overallFeedback.isCorrect}>\n\t\t\t\t\t<HTMLContent html={overallFeedback.messageHtml} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nexport default QTIRenderer\n","import * as logger from \"@superbuilders/slog\"\nimport type { AnyCondition, AssessmentItem, BaseRule, ResponseRule } from \"./schema\"\n\n/**\n * Normalizes a string for comparison (trimming and optional case-insensitivity)\n */\nfunction normalizeString(str: string, caseSensitive: boolean): string {\n\tconst s = (str ?? \"\").trim()\n\treturn caseSensitive ? s : s.toLowerCase()\n}\n\n/**\n * Evaluates a condition from the response processing rules against the user's responses.\n */\nfunction checkCondition(\n\tcondition: AnyCondition,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): boolean {\n\t// 1. Recursive Logic (AND / OR / NOT)\n\tif (condition.type === \"and\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst allTrue = results.every((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking AND condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tallTrue\n\t\t})\n\t\treturn allTrue\n\t}\n\n\tif (condition.type === \"or\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst anyTrue = results.some((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking OR condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tanyTrue\n\t\t})\n\t\treturn anyTrue\n\t}\n\n\tif (condition.type === \"not\") {\n\t\tconst result = checkCondition(condition.condition, item, responses, responseResults)\n\t\tlogger.debug(\"qti evaluator: checking NOT condition\", { result, negated: !result })\n\t\treturn !result\n\t}\n\n\t// 2. Standard Match (correctness check)\n\tif (condition.type === \"match\") {\n\t\tconst result = responseResults[condition.variable]\n\t\tlogger.debug(\"qti evaluator: checking match condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\tisCorrect: result,\n\t\t\tmatches: result === true\n\t\t})\n\t\treturn result === true\n\t}\n\n\t// 3. Match Specific Value (hardcoded value check)\n\tif (condition.type === \"matchValue\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking matchValue condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttargetValue: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 4. String Match (text entry with case sensitivity)\n\tif (condition.type === \"stringMatch\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tconst val = Array.isArray(userResponse) ? userResponse[0] : userResponse\n\t\tif (!val) return false\n\n\t\tconst u = normalizeString(String(val), condition.caseSensitive)\n\t\tconst t = normalizeString(condition.value, condition.caseSensitive)\n\t\tconst matches = u === t\n\t\tlogger.debug(\"qti evaluator: checking stringMatch\", {\n\t\t\tvariable: condition.variable,\n\t\t\tcaseSensitive: condition.caseSensitive,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 5. Member (set logic for multi-select checkboxes)\n\tif (condition.type === \"member\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking member\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttarget: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 6. Map Response (scoring logic with epsilon comparison)\n\tif (condition.type === \"equalMapResponse\") {\n\t\tconst responseId = condition.variable\n\t\tconst userResponse = responses[responseId]\n\t\tconst responseDecl = item.responseDeclarations.find((rd) => rd.identifier === responseId)\n\n\t\tif (!userResponse || !responseDecl?.mapping) return false\n\n\t\tconst userValues = Array.isArray(userResponse) ? userResponse : [userResponse]\n\t\tconst valueMap = new Map(responseDecl.mapping.entries.map((e) => [e.key, e.value]))\n\n\t\tlet sum = 0\n\t\tfor (const val of userValues) {\n\t\t\tsum += valueMap.get(val) ?? responseDecl.mapping.defaultValue\n\t\t}\n\n\t\t// Float comparison safety (epsilon check)\n\t\tconst target = Number(condition.value)\n\t\tconst diff = Math.abs(sum - target)\n\t\tconst matches = diff < 0.0001\n\n\t\tlogger.debug(\"qti evaluator: checking equalMapResponse\", {\n\t\t\tresponseId,\n\t\t\tuserValues,\n\t\t\tsum,\n\t\t\ttarget: condition.value,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\treturn false\n}\n\n/**\n * Traverses a single response rule recursively to find matching feedback identifiers\n */\nfunction evaluateRule(\n\trule: ResponseRule,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst feedbackIds: string[] = []\n\n\t// Case 1: Direct Action (unconditional)\n\tif (rule.type === \"action\") {\n\t\tconst action = rule.action\n\t\tif (\n\t\t\taction.type === \"setOutcomeValue\" &&\n\t\t\t(action.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\taction.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\taction.identifier === \"FEEDBACK\")\n\t\t) {\n\t\t\tlogger.debug(\"qti evaluator: executing action\", { id: action.identifier, value: action.value })\n\t\t\tfeedbackIds.push(action.value)\n\t\t}\n\t\treturn feedbackIds\n\t}\n\n\t// Case 2: Condition Block (if/elseif/else)\n\tif (rule.type === \"condition\") {\n\t\t// Iterate through branches and stop at the first match\n\t\tfor (const branch of rule.branches) {\n\t\t\tconst isMatch = branch.condition ? checkCondition(branch.condition, item, responses, responseResults) : true // Else branch (undefined condition) always matches if reached\n\n\t\t\tlogger.debug(\"qti evaluator: evaluating branch\", {\n\t\t\t\thasCondition: !!branch.condition,\n\t\t\t\tisMatch\n\t\t\t})\n\n\t\t\tif (isMatch) {\n\t\t\t\t// Execute actions in this branch\n\t\t\t\tconst feedbackActions = branch.actions.filter(\n\t\t\t\t\t(r: BaseRule) =>\n\t\t\t\t\t\tr.type === \"setOutcomeValue\" &&\n\t\t\t\t\t\t(r.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK\")\n\t\t\t\t)\n\t\t\t\tfor (const action of feedbackActions) {\n\t\t\t\t\tfeedbackIds.push(action.value)\n\t\t\t\t}\n\n\t\t\t\t// Execute nested rules recursively\n\t\t\t\tif (branch.nestedRules) {\n\t\t\t\t\tfor (const nested of branch.nestedRules) {\n\t\t\t\t\t\tconst nestedIds = evaluateRule(nested, item, responses, responseResults)\n\t\t\t\t\t\tfeedbackIds.push(...nestedIds)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CRITICAL: Stop after the first matching branch!\n\t\t\t\t// This prevents 'else' from executing if 'if' matched.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn feedbackIds\n}\n\n/**\n * Traverses the response processing rules to find all matching feedback identifiers.\n */\nexport function evaluateFeedbackIdentifiers(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst processing = item.responseProcessing\n\tif (!processing) {\n\t\tlogger.debug(\"qti evaluator: no response processing found\")\n\t\treturn []\n\t}\n\n\tlogger.debug(\"qti evaluator: starting evaluation\", {\n\t\tnumRules: processing.rules.length,\n\t\tresponseResults\n\t})\n\n\tconst allFeedbackIds: string[] = []\n\n\tfor (const rule of processing.rules) {\n\t\tconst ids = evaluateRule(rule, item, responses, responseResults)\n\t\tallFeedbackIds.push(...ids)\n\t}\n\n\tlogger.debug(\"qti evaluator: selected feedback identifiers\", { feedbackIds: allFeedbackIds })\n\treturn allFeedbackIds\n}\n\n/**\n * Legacy function for backwards compatibility - returns the first matching feedback identifier.\n * @deprecated Use evaluateFeedbackIdentifiers for full feedback support\n */\nexport function evaluateFeedbackIdentifier(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string | undefined {\n\tconst ids = evaluateFeedbackIdentifiers(item, responses, responseResults)\n\treturn ids[0]\n}\n","import { z } from \"zod\"\n\n// Basic enums derived from the XML\nexport const QtiCardinalitySchema = z.enum([\"single\", \"multiple\", \"ordered\"]) // seen: single, multiple, ordered\nexport const QtiBaseTypeSchema = z.enum([\"identifier\", \"string\", \"float\", \"integer\", \"boolean\", \"directedPair\", \"pair\"]) // seen: identifier, float, directedPair\n\n// SimpleChoice: <qti-simple-choice identifier=\"A\"> ... inner XHTML/MathML ... </qti-simple-choice>\nexport const SimpleChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(), // Allows \"\" for empty or image-only content\n\tinlineFeedbackHtml: z.string().optional() // Optional per-choice feedback (qti-feedback-inline)\n})\nexport type SimpleChoice = z.infer<typeof SimpleChoiceSchema>\n\n// InlineChoice: <qti-inline-choice identifier=\"ID\"> ... inner XHTML/MathML ... </qti-inline-choice>\nexport const InlineChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string()\n})\nexport type InlineChoice = z.infer<typeof InlineChoiceSchema>\n\n// ChoiceInteraction: <qti-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" min-choices=\"1\" max-choices=\"1\"> ...\nexport const ChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(1),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\n\n// Extensible discriminated union for interactions\nexport const ChoiceInteractionSchema = ChoiceInteractionCoreSchema.extend({ type: z.literal(\"choiceInteraction\") })\nexport type ChoiceInteraction = z.infer<typeof ChoiceInteractionSchema>\n\n// InlineChoiceInteraction: <qti-inline-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const InlineChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tchoices: z.array(InlineChoiceSchema).min(1)\n})\nexport const InlineChoiceInteractionSchema = InlineChoiceInteractionCoreSchema.extend({\n\ttype: z.literal(\"inlineChoiceInteraction\")\n})\nexport type InlineChoiceInteraction = z.infer<typeof InlineChoiceInteractionSchema>\n\n// TextEntryInteraction: <qti-text-entry-interaction response-identifier=\"RESPONSE\" expected-length=\"15\" ...> ...\nexport const TextEntryInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\texpectedLength: z.number().int().min(0).optional(),\n\tplaceholderText: z.string().optional(),\n\tpatternMask: z.string().optional()\n})\nexport const TextEntryInteractionSchema = TextEntryInteractionCoreSchema.extend({\n\ttype: z.literal(\"textEntryInteraction\")\n})\nexport type TextEntryInteraction = z.infer<typeof TextEntryInteractionSchema>\n\n// OrderInteraction: <qti-order-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" orientation=\"vertical\"> ...\nexport const OrderInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(0).optional(), // 0 or undefined usually means \"all\"\n\torientation: z.enum([\"vertical\", \"horizontal\"]),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\nexport const OrderInteractionSchema = OrderInteractionCoreSchema.extend({\n\ttype: z.literal(\"orderInteraction\")\n})\nexport type OrderInteraction = z.infer<typeof OrderInteractionSchema>\n\n// GapText: <qti-gap-text identifier=\"A\" match-max=\"1\"> ... content ... </qti-gap-text>\nexport const GapTextSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(),\n\tmatchMax: z.number().int().min(0) // 0 = unlimited\n})\nexport type GapText = z.infer<typeof GapTextSchema>\n\n// Gap: <qti-gap identifier=\"G1\" /> - the drop target placeholder\nexport const GapSchema = z.object({\n\tidentifier: z.string().min(1)\n})\nexport type Gap = z.infer<typeof GapSchema>\n\n// GapMatchInteraction: <qti-gap-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const GapMatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tgapTexts: z.array(GapTextSchema).min(1), // Draggable source tokens\n\tgaps: z.array(GapSchema).min(1), // Drop target placeholders\n\tcontentHtml: z.string() // HTML content with gap placeholders\n})\nexport const GapMatchInteractionSchema = GapMatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"gapMatchInteraction\")\n})\nexport type GapMatchInteraction = z.infer<typeof GapMatchInteractionSchema>\n\n// AssociableChoice: <qti-simple-associable-choice identifier=\"A\" match-max=\"1\"> ... </qti-simple-associable-choice>\nexport const AssociableChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tmatchMax: z.number().int().min(0), // 0 = unlimited uses\n\tcontentHtml: z.string()\n})\nexport type AssociableChoice = z.infer<typeof AssociableChoiceSchema>\n\n// MatchInteraction: <qti-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" max-associations=\"4\"> ...\nexport const MatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tmaxAssociations: z.number().int().min(0), // 0 = unlimited total associations\n\tsourceChoices: z.array(AssociableChoiceSchema).min(1), // First <qti-simple-match-set>\n\ttargetChoices: z.array(AssociableChoiceSchema).min(1), // Second <qti-simple-match-set>\n\tpromptHtml: z.string()\n})\nexport const MatchInteractionSchema = MatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"matchInteraction\")\n})\nexport type MatchInteraction = z.infer<typeof MatchInteractionSchema>\n\nexport const AnyInteractionSchema = z.discriminatedUnion(\"type\", [\n\tChoiceInteractionSchema,\n\tInlineChoiceInteractionSchema,\n\tTextEntryInteractionSchema,\n\tOrderInteractionSchema,\n\tGapMatchInteractionSchema,\n\tMatchInteractionSchema\n])\nexport type AnyInteraction = z.infer<typeof AnyInteractionSchema>\n\n// CorrectResponse inside ResponseDeclaration\nexport const CorrectResponseSchema = z.object({\n\tvalues: z.array(z.string().min(1)).min(1)\n})\nexport type CorrectResponse = z.infer<typeof CorrectResponseSchema>\n\n// ResponseDeclaration\nexport const ResponseDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tcorrectResponse: CorrectResponseSchema,\n\t// Optional response mapping for map-response processing (used for summed feedback/score)\n\tmapping: z\n\t\t.object({\n\t\t\tdefaultValue: z.number().default(0),\n\t\t\tlowerBound: z.number().optional(),\n\t\t\tupperBound: z.number().optional(),\n\t\t\tentries: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tkey: z.string().min(1),\n\t\t\t\t\tvalue: z.number()\n\t\t\t\t})\n\t\t\t)\n\t\t})\n\t\t.optional()\n})\nexport type ResponseDeclaration = z.infer<typeof ResponseDeclarationSchema>\n\n// OutcomeDeclaration\nexport const OutcomeDefaultValueSchema = z.object({\n\tvalue: z.string()\n})\nexport type OutcomeDefaultValue = z.infer<typeof OutcomeDefaultValueSchema>\n\nexport const OutcomeDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tdefaultValue: OutcomeDefaultValueSchema.optional()\n})\nexport type OutcomeDeclaration = z.infer<typeof OutcomeDeclarationSchema>\n\n// Feedback blocks\nexport const FeedbackBlockSchema = z.object({\n\toutcomeIdentifier: z.string().min(1),\n\tidentifier: z.string().min(1),\n\tshowHide: z.enum([\"show\", \"hide\"]).default(\"show\"),\n\tcontentHtml: z.string()\n})\nexport type FeedbackBlock = z.infer<typeof FeedbackBlockSchema>\n\n// ItemBody as typed content blocks + feedback blocks\nconst StimulusBlockSchema = z.object({\n\ttype: z.literal(\"stimulus\"),\n\thtml: z.string()\n})\n\n// RichStimulus: HTML with inline embeds map keyed by responseIdentifier\nexport const RichStimulusBlockSchema = z.object({\n\ttype: z.literal(\"richStimulus\"),\n\thtml: z.string(),\n\tinlineEmbeds: z.record(z.string(), InlineChoiceInteractionSchema),\n\ttextEmbeds: z.record(z.string(), TextEntryInteractionSchema)\n})\nexport type RichStimulusBlock = z.infer<typeof RichStimulusBlockSchema>\n\nconst InteractionBlockSchema = z.object({\n\ttype: z.literal(\"interaction\"),\n\tinteraction: AnyInteractionSchema\n})\n\nexport const ItemBodySchema = z.object({\n\tcontentBlocks: z.array(z.union([StimulusBlockSchema, RichStimulusBlockSchema, InteractionBlockSchema])).min(1),\n\tfeedbackBlocks: z.array(FeedbackBlockSchema)\n})\nexport type ItemBody = z.infer<typeof ItemBodySchema>\n\n// Response processing: Define schemas for the Response Processing AST\nconst BaseRuleSchema = z.object({\n\ttype: z.literal(\"setOutcomeValue\"),\n\tidentifier: z.string(),\n\tvalue: z.string()\n})\nexport type BaseRule = z.infer<typeof BaseRuleSchema>\n\nconst MatchConditionSchema = z.object({\n\ttype: z.literal(\"match\"),\n\tvariable: z.string(),\n\tcorrect: z.literal(true) // Match against correct response\n})\nexport type MatchCondition = z.infer<typeof MatchConditionSchema>\n\n// NEW: Schema for matching against a specific value (e.g., <qti-match> with <qti-base-value>)\nconst MatchValueConditionSchema = z.object({\n\ttype: z.literal(\"matchValue\"),\n\tvariable: z.string(), // The response identifier from <qti-variable>\n\tvalue: z.string() // The target value from <qti-base-value>\n})\nexport type MatchValueCondition = z.infer<typeof MatchValueConditionSchema>\n\n// Schema for string matching (text entry with case sensitivity)\nconst StringMatchConditionSchema = z.object({\n\ttype: z.literal(\"stringMatch\"),\n\tvariable: z.string(),\n\tvalue: z.string(),\n\tcaseSensitive: z.boolean()\n})\nexport type StringMatchCondition = z.infer<typeof StringMatchConditionSchema>\n\n// Schema for member checking (multi-select subset logic)\nconst MemberConditionSchema = z.object({\n\ttype: z.literal(\"member\"),\n\tvariable: z.string(),\n\tvalue: z.string()\n})\nexport type MemberCondition = z.infer<typeof MemberConditionSchema>\n\n// Schema for the map-response-equal condition\nconst EqualMapResponseConditionSchema = z.object({\n\ttype: z.literal(\"equalMapResponse\"),\n\tvariable: z.string(), // The response identifier from <qti-map-response>\n\tvalue: z.string() // The target sum value from <qti-base-value>\n})\nexport type EqualMapResponseCondition = z.infer<typeof EqualMapResponseConditionSchema>\n\n// Define types first for recursive schemas\nexport type AndCondition = {\n\ttype: \"and\"\n\tconditions: AnyCondition[]\n}\n\nexport type OrCondition = {\n\ttype: \"or\"\n\tconditions: AnyCondition[]\n}\n\nexport type NotCondition = {\n\ttype: \"not\"\n\tcondition: AnyCondition\n}\n\nexport type AnyCondition =\n\t| MatchCondition\n\t| MatchValueCondition\n\t| StringMatchCondition\n\t| MemberCondition\n\t| AndCondition\n\t| OrCondition\n\t| NotCondition\n\t| EqualMapResponseCondition\n\n// Then define schemas using the types\nconst AndConditionSchema: z.ZodType<AndCondition> = z.object({\n\ttype: z.literal(\"and\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst OrConditionSchema: z.ZodType<OrCondition> = z.object({\n\ttype: z.literal(\"or\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst NotConditionSchema: z.ZodType<NotCondition> = z.object({\n\ttype: z.literal(\"not\"),\n\tcondition: z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema)\n})\n\n// Union of all condition types\nconst AnyConditionSchema: z.ZodType<AnyCondition> = z.union([\n\tMatchConditionSchema,\n\tMatchValueConditionSchema,\n\tStringMatchConditionSchema,\n\tMemberConditionSchema,\n\tz.lazy((): z.ZodType<AndCondition> => AndConditionSchema),\n\tz.lazy((): z.ZodType<OrCondition> => OrConditionSchema),\n\tz.lazy((): z.ZodType<NotCondition> => NotConditionSchema),\n\tEqualMapResponseConditionSchema\n])\n\n// --- NEW STRUCTURE FOR PROCESSING RULES ---\n\n// A single branch (if, else-if, else)\nexport type ConditionBranch = {\n\tcondition?: AnyCondition // undefined for 'else'\n\tactions: BaseRule[]\n\tnestedRules?: ResponseRule[] // Recursive: nested rules inside a branch\n}\n\n// Zod schema for a branch\nexport const ConditionBranchSchema: z.ZodType<ConditionBranch> = z.object({\n\tcondition: AnyConditionSchema.optional(),\n\tactions: z.array(BaseRuleSchema),\n\tnestedRules: z.array(z.lazy((): z.ZodType<ResponseRule> => ResponseRuleSchema)).optional()\n})\n\n// The main ResponseRule type (either a condition block or a direct action)\nexport type ResponseRule = { type: \"condition\"; branches: ConditionBranch[] } | { type: \"action\"; action: BaseRule }\n\n// Zod schema for ResponseRule\nexport const ResponseRuleSchema: z.ZodType<ResponseRule> = z.union([\n\tz.object({\n\t\ttype: z.literal(\"condition\"),\n\t\tbranches: z.array(ConditionBranchSchema)\n\t}),\n\tz.object({\n\t\ttype: z.literal(\"action\"),\n\t\taction: BaseRuleSchema\n\t})\n])\n\n// Response processing: scoring\nexport const ScoringRuleSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tcorrectScore: z.number(),\n\tincorrectScore: z.number()\n})\nexport type ScoringRule = z.infer<typeof ScoringRuleSchema>\n\n// UPDATED: The primary ResponseProcessingSchema now uses the AST directly\nexport const ResponseProcessingSchema = z.object({\n\trules: z.array(ResponseRuleSchema),\n\tscoring: ScoringRuleSchema\n})\nexport type ResponseProcessing = z.infer<typeof ResponseProcessingSchema>\n\n// Root assessment item, extensible for any interaction type\nexport const AssessmentItemSchema = z.object({\n\tidentifier: z.string().min(1),\n\ttitle: z.string().min(1),\n\ttimeDependent: z.boolean(),\n\txmlLang: z.string().min(1),\n\n\tresponseDeclarations: z.array(ResponseDeclarationSchema).min(1),\n\toutcomeDeclarations: z.array(OutcomeDeclarationSchema).min(1),\n\n\titemBody: ItemBodySchema,\n\tresponseProcessing: ResponseProcessingSchema\n})\nexport type AssessmentItem = z.infer<typeof AssessmentItemSchema>\n","import * as errors from \"@superbuilders/errors\"\nimport { XMLBuilder, XMLParser } from \"fast-xml-parser\"\nimport { serializeInner, serializeNode, serializeNodes } from \"./html\"\nimport {\n\ttype AnyCondition,\n\ttype AssessmentItem,\n\tAssessmentItemSchema,\n\ttype BaseRule,\n\ttype ConditionBranch,\n\tQtiBaseTypeSchema,\n\tQtiCardinalitySchema,\n\ttype ResponseProcessing,\n\ttype ResponseRule,\n\ttype ScoringRule\n} from \"./schema\"\n\n// Clean, recursive representation of an XML node\nexport interface NormalizedNode {\n\ttagName: string\n\tattrs: Record<string, unknown>\n\tchildren: Array<NormalizedNode | string>\n}\n\n// --- Core XML & Node Utilities ---\n\nfunction createXmlParser(): XMLParser {\n\treturn new XMLParser({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tallowBooleanAttributes: true,\n\t\tparseAttributeValue: true,\n\t\tparseTagValue: false, // CRITICAL: Preserve \"000\" as string, not convert to number 0\n\t\ttrimValues: false,\n\t\tpreserveOrder: true\n\t})\n}\n\nfunction _createXmlBuilder(): XMLBuilder {\n\treturn new XMLBuilder({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tsuppressEmptyNode: true, // cleaner output for empty tags\n\t\tformat: false\n\t})\n}\n\nfunction coerceString(value: unknown): string {\n\tif (value == null) return \"\"\n\treturn String(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction normalizeNode(rawNode: unknown): NormalizedNode | string {\n\tif (rawNode == null) return \"\"\n\tif (!isRecord(rawNode)) return coerceString(rawNode)\n\n\tconst textContent = rawNode[\"#text\"]\n\tif (textContent != null) {\n\t\treturn coerceString(textContent)\n\t}\n\n\tconst tagName = Object.keys(rawNode).find((k) => k !== \":@\")\n\tif (!tagName) return \"\"\n\n\tconst attrsValue = rawNode[\":@\"]\n\tconst attrs = isRecord(attrsValue) ? attrsValue : {}\n\tconst rawChildren = Array.isArray(rawNode[tagName]) ? rawNode[tagName] : [rawNode[tagName]]\n\n\treturn {\n\t\ttagName,\n\t\tattrs,\n\t\tchildren: rawChildren.map(normalizeNode).filter((n) => n !== \"\")\n\t}\n}\n\nfunction nodeToXml(node: NormalizedNode | string): string {\n\t// Use our HTML serializer for better MathML preservation\n\tif (typeof node === \"string\") return node\n\treturn serializeNode(node)\n}\n\nfunction getInnerHtml(node: NormalizedNode): string {\n\t// Use our HTML serializer for inner content\n\treturn serializeInner(node)\n}\n\nfunction findChild(node: NormalizedNode, tagName: string): NormalizedNode | undefined {\n\tconst child = node.children.find((c) => typeof c !== \"string\" && c.tagName === tagName)\n\treturn typeof child === \"string\" ? undefined : child\n}\n\nfunction findChildren(node: NormalizedNode, tagName: string): NormalizedNode[] {\n\treturn node.children.filter((c): c is NormalizedNode => typeof c !== \"string\" && c.tagName === tagName)\n}\n\nfunction getTextContent(node: NormalizedNode | undefined): string {\n\tif (!node) return \"\"\n\tconst firstChild = node.children[0]\n\tif (typeof firstChild === \"string\") return firstChild.trim()\n\treturn \"\"\n}\n\nfunction findInteractionNodes(node: NormalizedNode, out: NormalizedNode[] = []): NormalizedNode[] {\n\tif (node.tagName.includes(\"-interaction\")) {\n\t\tout.push(node)\n\t}\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tfindInteractionNodes(child, out)\n\t\t}\n\t}\n\treturn out\n}\n\nfunction escapeAttr(value: string): string {\n\treturn value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\")\n}\n\nfunction attrsToString(attrs: Record<string, unknown>): string {\n\tconst parts: string[] = []\n\tfor (const [key, val] of Object.entries(attrs)) {\n\t\tconst str = coerceString(val)\n\t\tif (str === \"\") continue\n\t\tparts.push(`${key}=\"${escapeAttr(str)}\"`)\n\t}\n\treturn parts.length ? ` ${parts.join(\" \")}` : \"\"\n}\n\nfunction serializeWithInlinePlaceholders(\n\tnode: NormalizedNode | string,\n\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>,\n\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n): string {\n\tif (typeof node === \"string\") return node\n\tif (node.tagName === \"qti-inline-choice-interaction\") {\n\t\tconst interaction = extractInlineChoiceInteraction(node)\n\t\tinlineEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-inline=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tif (node.tagName === \"qti-text-entry-interaction\") {\n\t\tconst interaction = extractTextEntryInteraction(node)\n\t\ttextEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-text-entry=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tconst open = `<${node.tagName}${attrsToString(node.attrs)}>`\n\tconst childrenHtml = node.children.map((c) => serializeWithInlinePlaceholders(c, inlineEmbeds, textEmbeds)).join(\"\")\n\tconst close = `</${node.tagName}>`\n\treturn `${open}${childrenHtml}${close}`\n}\n\n// --- QTI Structure Extractors ---\n\nfunction extractChoiceInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Extract optional inline feedback\n\t\tconst inlineFeedbackNode = findChild(choice, \"qti-feedback-inline\")\n\t\tconst inlineFeedbackHtml = inlineFeedbackNode ? getInnerHtml(inlineFeedbackNode) : undefined\n\n\t\t// Build content HTML excluding inline feedback nodes\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\tinlineFeedbackHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"choiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 1),\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractInlineChoiceInteraction(node: NormalizedNode) {\n\tconst choiceNodes = findChildren(node, \"qti-inline-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\tconst contentHtml = serializeInner(choice)\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"inlineChoiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tchoices\n\t}\n}\n\nfunction extractTextEntryInteraction(node: NormalizedNode) {\n\tconst expectedLengthAttr = node.attrs[\"expected-length\"]\n\tconst expectedLength = expectedLengthAttr ? Number(expectedLengthAttr) : undefined\n\n\treturn {\n\t\ttype: \"textEntryInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\texpectedLength: expectedLength !== undefined && !Number.isNaN(expectedLength) ? expectedLength : undefined,\n\t\tplaceholderText: coerceString(node.attrs[\"placeholder-text\"]) || undefined,\n\t\tpatternMask: coerceString(node.attrs[\"pattern-mask\"]) || undefined\n\t}\n}\n\nfunction extractOrderInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Filter out inline feedback nodes from content\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\t// Order interaction rarely displays inline feedback per-item\n\t\t\tinlineFeedbackHtml: undefined\n\t\t}\n\t})\n\n\t// Detect orientation (attribute OR class)\n\tlet orientation: \"vertical\" | \"horizontal\" = \"vertical\"\n\tconst attrOrientation = coerceString(node.attrs.orientation)\n\tconst classAttr = coerceString(node.attrs.class)\n\n\tif (attrOrientation === \"horizontal\" || classAttr.includes(\"qti-orientation-horizontal\")) {\n\t\torientation = \"horizontal\"\n\t}\n\n\treturn {\n\t\ttype: \"orderInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 0) || undefined,\n\t\torientation,\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractGapMatchInteraction(node: NormalizedNode) {\n\t// Extract gap texts (draggable tokens)\n\tconst gapTextNodes = findChildren(node, \"qti-gap-text\")\n\tconst gapTexts = gapTextNodes.map((gt) => ({\n\t\tidentifier: coerceString(gt.attrs.identifier),\n\t\tcontentHtml: serializeInner(gt),\n\t\tmatchMax: Number(gt.attrs[\"match-max\"] ?? 0) // 0 = unlimited\n\t}))\n\n\t// Find all gaps in the content and build content HTML with placeholders\n\tconst gaps: Array<{ identifier: string }> = []\n\n\t// Serialize content with gap placeholders\n\tfunction serializeWithGapPlaceholders(child: NormalizedNode | string): string {\n\t\tif (typeof child === \"string\") return child\n\t\tif (child.tagName === \"qti-gap\") {\n\t\t\tconst gapId = coerceString(child.attrs.identifier)\n\t\t\tgaps.push({ identifier: gapId })\n\t\t\treturn `<span data-qti-gap=\"${gapId}\"></span>`\n\t\t}\n\t\t// Skip gap-text nodes in content serialization (they're in the source pool)\n\t\tif (child.tagName === \"qti-gap-text\") {\n\t\t\treturn \"\"\n\t\t}\n\t\tconst open = `<${child.tagName}${attrsToString(child.attrs)}>`\n\t\tconst childrenHtml = child.children.map((c) => serializeWithGapPlaceholders(c)).join(\"\")\n\t\tconst close = `</${child.tagName}>`\n\t\treturn `${open}${childrenHtml}${close}`\n\t}\n\n\t// Build content HTML from children (excluding gap-text nodes which are sources)\n\tconst contentHtml = node.children\n\t\t.filter((c) => typeof c === \"string\" || c.tagName !== \"qti-gap-text\")\n\t\t.map((c) => serializeWithGapPlaceholders(c))\n\t\t.join(\"\")\n\n\treturn {\n\t\ttype: \"gapMatchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tgapTexts,\n\t\tgaps,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractMatchInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\t// QTI has two <qti-simple-match-set> nodes\n\tconst matchSets = findChildren(node, \"qti-simple-match-set\")\n\n\tconst extractChoices = (setNode: NormalizedNode) => {\n\t\tconst choiceNodes = findChildren(setNode, \"qti-simple-associable-choice\")\n\t\treturn choiceNodes.map((c) => ({\n\t\t\tidentifier: coerceString(c.attrs.identifier),\n\t\t\tmatchMax: Number(c.attrs[\"match-max\"]) || 1,\n\t\t\tcontentHtml: serializeInner(c)\n\t\t}))\n\t}\n\n\t// First set = Sources, Second set = Targets (QTI convention)\n\tconst firstSet = matchSets[0]\n\tconst secondSet = matchSets[1]\n\tconst sourceChoices = firstSet ? extractChoices(firstSet) : []\n\tconst targetChoices = secondSet ? extractChoices(secondSet) : []\n\n\treturn {\n\t\ttype: \"matchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: node.attrs.shuffle === \"true\",\n\t\tmaxAssociations: Number(node.attrs[\"max-associations\"]) || 0,\n\t\tsourceChoices,\n\t\ttargetChoices,\n\t\tpromptHtml\n\t}\n}\n\nfunction extractFeedbackBlock(node: NormalizedNode) {\n\tconst contentBodyNode = findChild(node, \"qti-content-body\")\n\tconst contentHtml = contentBodyNode ? getInnerHtml(contentBodyNode) : \"\"\n\tconst showHide: \"hide\" | \"show\" = coerceString(node.attrs[\"show-hide\"]) === \"hide\" ? \"hide\" : \"show\"\n\n\treturn {\n\t\toutcomeIdentifier: coerceString(node.attrs[\"outcome-identifier\"]),\n\t\tidentifier: coerceString(node.attrs.identifier),\n\t\tshowHide,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractResponseDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-response-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst correctResponseNode = findChild(node, \"qti-correct-response\")\n\t\tconst valueNodes = correctResponseNode ? findChildren(correctResponseNode, \"qti-value\") : []\n\t\tconst values = valueNodes.map(getTextContent)\n\n\t\t// Optional mapping for map-response processing\n\t\tconst mappingNode = findChild(node, \"qti-mapping\")\n\t\tlet mapping:\n\t\t\t| {\n\t\t\t\t\tdefaultValue: number\n\t\t\t\t\tlowerBound?: number\n\t\t\t\t\tupperBound?: number\n\t\t\t\t\tentries: Array<{ key: string; value: number }>\n\t\t\t }\n\t\t\t| undefined\n\t\tif (mappingNode) {\n\t\t\tconst defaultValueRaw = coerceString(mappingNode.attrs[\"default-value\"])\n\t\t\tconst lowerBoundRaw = coerceString(mappingNode.attrs[\"lower-bound\"])\n\t\t\tconst upperBoundRaw = coerceString(mappingNode.attrs[\"upper-bound\"])\n\t\t\tconst entryNodes = findChildren(mappingNode, \"qti-map-entry\")\n\t\t\tconst entries = entryNodes.map((en) => {\n\t\t\t\treturn {\n\t\t\t\t\tkey: coerceString(en.attrs[\"map-key\"]),\n\t\t\t\t\tvalue: Number(coerceString(en.attrs[\"mapped-value\"]) || 0)\n\t\t\t\t}\n\t\t\t})\n\t\t\tmapping = {\n\t\t\t\tdefaultValue: Number(defaultValueRaw || 0),\n\t\t\t\tlowerBound: lowerBoundRaw !== \"\" ? Number(lowerBoundRaw) : undefined,\n\t\t\t\tupperBound: upperBoundRaw !== \"\" ? Number(upperBoundRaw) : undefined,\n\t\t\t\tentries\n\t\t\t}\n\t\t}\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in response declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in response declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tcorrectResponse: { values },\n\t\t\tmapping\n\t\t}\n\t})\n}\n\nfunction extractOutcomeDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-outcome-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst defaultValueNode = findChild(node, \"qti-default-value\")\n\t\tconst valueNode = defaultValueNode ? findChild(defaultValueNode, \"qti-value\") : undefined\n\t\tconst defaultValue = valueNode ? { value: getTextContent(valueNode) } : undefined\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in outcome declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in outcome declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tdefaultValue\n\t\t}\n\t})\n}\n\nfunction parseCondition(node: NormalizedNode): AnyCondition | null {\n\t// A. Logical Operators\n\tif (node.tagName === \"qti-and\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"and\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-or\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"or\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-not\") {\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) return { type: \"not\", condition: parsed }\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// B. Variable Extraction (Common logic for comparators)\n\tconst variableNode = findChild(node, \"qti-variable\")\n\tconst baseValueNode = findChild(node, \"qti-base-value\")\n\n\tconst identifier = variableNode ? coerceString(variableNode.attrs.identifier) : undefined\n\tconst value = baseValueNode ? getTextContent(baseValueNode) : undefined\n\n\t// C. Comparators\n\tif (node.tagName === \"qti-match\") {\n\t\t// Match against correct response\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t\t// Match against a specific value\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"matchValue\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// String Match (text entry with case sensitivity)\n\tif (node.tagName === \"qti-string-match\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn {\n\t\t\t\ttype: \"stringMatch\",\n\t\t\t\tvariable: identifier,\n\t\t\t\tvalue,\n\t\t\t\t// QTI spec: case-sensitive defaults to true\n\t\t\t\tcaseSensitive: node.attrs[\"case-sensitive\"] !== \"false\"\n\t\t\t}\n\t\t}\n\t}\n\n\t// Member (set logic for multi-select)\n\tif (node.tagName === \"qti-member\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"member\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// Equal: supports both map-response comparisons and correct response matching\n\tif (node.tagName === \"qti-equal\") {\n\t\t// Pattern 1: Equal with map-response (for summed scores)\n\t\tconst mapResponseNode = findChild(node, \"qti-map-response\")\n\t\tconst equalBaseValueNode = findChild(node, \"qti-base-value\")\n\t\tif (mapResponseNode && equalBaseValueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"equalMapResponse\",\n\t\t\t\tvariable: coerceString(mapResponseNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(equalBaseValueNode)\n\t\t\t}\n\t\t}\n\t\t// Pattern 2: Equal with qti-correct (compare to correct response, like qti-match)\n\t\t// Used by text entry: <qti-equal><qti-variable/><qti-correct/></qti-equal>\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Parse actions (setOutcomeValue) from a branch node\nfunction parseActions(node: NormalizedNode): BaseRule[] {\n\tconst rules: BaseRule[] = []\n\tconst setNodes = findChildren(node, \"qti-set-outcome-value\")\n\tfor (const setNode of setNodes) {\n\t\tconst valueNode = findChild(setNode, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\trules.push({\n\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\tidentifier: coerceString(setNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t})\n\t\t}\n\t}\n\treturn rules\n}\n\n// RECURSIVE: Parse a processing rule (Condition Block OR Direct Action)\nfunction parseResponseRule(node: NormalizedNode): ResponseRule | null {\n\t// Case 1: Direct Action (e.g. <qti-set-outcome-value>)\n\tif (node.tagName === \"qti-set-outcome-value\") {\n\t\tconst valueNode = findChild(node, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"action\",\n\t\t\t\taction: {\n\t\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// Case 2: Response Condition (if/else block)\n\tif (node.tagName === \"qti-response-condition\") {\n\t\tconst branches: ConditionBranch[] = []\n\n\t\t// 1. IF\n\t\tconst ifNode = findChild(node, \"qti-response-if\")\n\t\tif (ifNode) {\n\t\t\tconst condition = findConditionInBranch(ifNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(ifNode),\n\t\t\t\t\tnestedRules: findNestedRules(ifNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 2. ELSE-IFs\n\t\tconst elseIfNodes = findChildren(node, \"qti-response-else-if\")\n\t\tfor (const elseIfNode of elseIfNodes) {\n\t\t\tconst condition = findConditionInBranch(elseIfNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(elseIfNode),\n\t\t\t\t\tnestedRules: findNestedRules(elseIfNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 3. ELSE\n\t\tconst elseNode = findChild(node, \"qti-response-else\")\n\t\tif (elseNode) {\n\t\t\tbranches.push({\n\t\t\t\tcondition: undefined, // Else has no condition\n\t\t\t\tactions: parseActions(elseNode),\n\t\t\t\tnestedRules: findNestedRules(elseNode)\n\t\t\t})\n\t\t}\n\n\t\tif (branches.length > 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"condition\",\n\t\t\t\tbranches\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Helper to find the condition node inside a response-if/else-if block\nfunction findConditionInBranch(node: NormalizedNode): AnyCondition | null {\n\tconst conditionTagNames = [\"qti-match\", \"qti-and\", \"qti-or\", \"qti-not\", \"qti-equal\", \"qti-string-match\", \"qti-member\"]\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\" && conditionTagNames.includes(child.tagName)) {\n\t\t\treturn parseCondition(child)\n\t\t}\n\t}\n\treturn null\n}\n\n// Helper to find nested CONDITION BLOCKS inside a branch\n// Note: We only look for qti-response-condition, NOT qti-set-outcome-value\n// because actions are already captured by parseActions() in the branch's `actions` array\nfunction findNestedRules(node: NormalizedNode): ResponseRule[] {\n\tconst nested: ResponseRule[] = []\n\tfor (const child of node.children) {\n\t\t// Only parse nested response-condition blocks, not standalone actions\n\t\tif (typeof child !== \"string\" && child.tagName === \"qti-response-condition\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) nested.push(rule)\n\t\t}\n\t}\n\treturn nested\n}\n\n// Main processing extractor\nfunction extractResponseProcessing(rootChildren: NormalizedNode[]): ResponseProcessing {\n\tconst processingNode = rootChildren.find((n) => n.tagName === \"qti-response-processing\")\n\tif (!processingNode) {\n\t\treturn { rules: [], scoring: { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 } }\n\t}\n\n\tconst rules: ResponseRule[] = []\n\tfor (const child of processingNode.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) rules.push(rule)\n\t\t}\n\t}\n\n\t// Legacy scoring extraction (unchanged logic for compatibility)\n\tlet scoring: ScoringRule = { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 }\n\tconst conditionNodes = findChildren(processingNode, \"qti-response-condition\")\n\tfor (const conditionNode of conditionNodes) {\n\t\tconst responseIfNode = findChild(conditionNode, \"qti-response-if\")\n\t\tconst responseElseNode = findChild(conditionNode, \"qti-response-else\")\n\n\t\tif (responseIfNode && responseElseNode) {\n\t\t\tconst andNode = findChild(responseIfNode, \"qti-and\")\n\t\t\tif (andNode) {\n\t\t\t\tconst matchNode = findChild(andNode, \"qti-match\")\n\t\t\t\tconst variableNode = matchNode ? findChild(matchNode, \"qti-variable\") : undefined\n\t\t\t\tif (variableNode) {\n\t\t\t\t\tconst ifSetOutcomeNode = findChild(responseIfNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst elseSetOutcomeNode = findChild(responseElseNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst correctValueNode = ifSetOutcomeNode ? findChild(ifSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tconst incorrectValueNode = elseSetOutcomeNode ? findChild(elseSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tscoring = {\n\t\t\t\t\t\tresponseIdentifier: coerceString(variableNode.attrs.identifier),\n\t\t\t\t\t\tcorrectScore: Number(getTextContent(correctValueNode) || 1),\n\t\t\t\t\t\tincorrectScore: Number(getTextContent(incorrectValueNode) || 0)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { rules, scoring }\n}\n\n// --- Main Parser Export ---\n\nexport function parseAssessmentItemXml(xml: string): AssessmentItem {\n\t// Validate input\n\tif (!xml || typeof xml !== \"string\") {\n\t\tthrow errors.new(\"xml input must be a non-empty string\")\n\t}\n\n\tconst parser = createXmlParser()\n\tconst parseResult = errors.trySync(() => {\n\t\t// Parse with preserveOrder flag as second parameter\n\t\treturn parser.parse(xml, true)\n\t})\n\n\tif (parseResult.error) {\n\t\tthrow errors.wrap(parseResult.error, \"xml parse\")\n\t}\n\n\tconst raw = parseResult.data\n\tif (!Array.isArray(raw)) {\n\t\tthrow errors.new(\"expected xml parser to output an array for preserveOrder\")\n\t}\n\n\tconst normalizedTree = raw.map(normalizeNode).filter((n): n is NormalizedNode => typeof n !== \"string\")\n\n\tconst rootNode = normalizedTree.find((n) => n.tagName.endsWith(\"assessment-item\"))\n\tif (!rootNode) {\n\t\tthrow errors.new(\"qti assessment item not found in xml document\")\n\t}\n\n\tconst rootChildren = rootNode.children.filter((c): c is NormalizedNode => typeof c !== \"string\")\n\tconst itemBodyNode = rootChildren.find((n) => n.tagName === \"qti-item-body\")\n\n\ttype InteractionUnion =\n\t\t| ReturnType<typeof extractChoiceInteraction>\n\t\t| ReturnType<typeof extractInlineChoiceInteraction>\n\t\t| ReturnType<typeof extractTextEntryInteraction>\n\t\t| ReturnType<typeof extractOrderInteraction>\n\t\t| ReturnType<typeof extractGapMatchInteraction>\n\t\t| ReturnType<typeof extractMatchInteraction>\n\ttype ContentBlock =\n\t\t| { type: \"stimulus\"; html: string }\n\t\t| {\n\t\t\t\ttype: \"richStimulus\"\n\t\t\t\thtml: string\n\t\t\t\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>\n\t\t\t\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n\t\t }\n\t\t| { type: \"interaction\"; interaction: InteractionUnion }\n\ttype FeedbackBlock = { outcomeIdentifier: string; identifier: string; showHide: \"hide\" | \"show\"; contentHtml: string }\n\n\tconst contentBlocks: ContentBlock[] = []\n\tconst feedbackBlocks: FeedbackBlock[] = []\n\n\tif (itemBodyNode) {\n\t\tfor (const child of itemBodyNode.children) {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\tif (child.trim()) contentBlocks.push({ type: \"stimulus\" as const, html: child })\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Collect all interaction nodes within this subtree\n\t\t\tif (child.tagName === \"qti-feedback-block\") {\n\t\t\t\tfeedbackBlocks.push(extractFeedbackBlock(child))\n\t\t\t} else {\n\t\t\t\tconst interactionNodes = findInteractionNodes(child)\n\t\t\t\tconst hasInline = interactionNodes.some(\n\t\t\t\t\t(n) => n.tagName === \"qti-inline-choice-interaction\" || n.tagName === \"qti-text-entry-interaction\"\n\t\t\t\t)\n\t\t\t\tif (hasInline) {\n\t\t\t\t\tconst inlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>> = {}\n\t\t\t\t\tconst textEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>> = {}\n\t\t\t\t\tconst html = serializeWithInlinePlaceholders(child, inlineEmbeds, textEmbeds)\n\t\t\t\t\tcontentBlocks.push({ type: \"richStimulus\" as const, html, inlineEmbeds, textEmbeds })\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (interactionNodes.length > 0) {\n\t\t\t\t\tfor (const inode of interactionNodes) {\n\t\t\t\t\t\tif (inode.tagName === \"qti-choice-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractChoiceInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-text-entry-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractTextEntryInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-order-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractOrderInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-gap-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractGapMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Unknown interaction subtype: serialize as stimulus fallback\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(inode) })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(child) })\n\t\t\t}\n\t\t}\n\t}\n\n\tlet normalizedItem = {\n\t\tidentifier: coerceString(rootNode.attrs.identifier),\n\t\ttitle: coerceString(rootNode.attrs.title),\n\t\ttimeDependent: Boolean(rootNode.attrs[\"time-dependent\"]),\n\t\txmlLang: coerceString(rootNode.attrs[\"xml:lang\"]) || coerceString(rootNode.attrs[\"xml-lang\"]) || \"en\",\n\t\tresponseDeclarations: extractResponseDeclarations(rootChildren),\n\t\toutcomeDeclarations: extractOutcomeDeclarations(rootChildren),\n\t\titemBody: { contentBlocks, feedbackBlocks },\n\t\tresponseProcessing: extractResponseProcessing(rootChildren)\n\t}\n\n\t// Fallback: if scoring.responseIdentifier is empty, derive from first response declaration\n\tif (\n\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier === \"\" &&\n\t\tnormalizedItem.responseDeclarations.length > 0\n\t) {\n\t\tconst firstDecl = normalizedItem.responseDeclarations[0]\n\t\tif (firstDecl) {\n\t\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier = firstDecl.identifier\n\t\t}\n\t}\n\n\tconst validation = AssessmentItemSchema.safeParse(normalizedItem)\n\tif (!validation.success) {\n\t\t// Format validation errors for better debugging\n\t\tconst errorDetails = validation.error.issues.map((err) => `${err.path.join(\".\")}: ${err.message}`).join(\"; \")\n\t\tthrow errors.new(`qti item validation: ${errorDetails}`)\n\t}\n\n\treturn validation.data\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/html/sanitize.ts","../src/html/serialize.ts","../src/components/shared/html-content.tsx","../src/components/feedback-message.tsx","../src/ui/choice-indicator.tsx","../src/ui/label.tsx","../src/ui/field.tsx","../src/ui/radio-group.tsx","../src/components/interactions/choice-interaction.tsx","../src/components/interactions/gap-match-interaction.tsx","../src/shared/shuffle.ts","../src/ui/select.tsx","../src/components/interactions/inline-interaction.tsx","../src/components/interactions/match-interaction.tsx","../src/components/interactions/order-interaction.tsx","../src/components/interactions/text-entry-interaction.tsx","../src/components/qti-renderer.tsx","../src/evaluator.ts","../src/schema.ts","../src/parser.ts"],"names":["React","jsx","cva","RadioGroupPrimitive2","React2","submitted","jsxs","SafeInlineHTML","React4","React5","toQtiResponse","fromQtiResponse","sourceTokenVariants","useDraggable","useDroppable","DndContext","closestCenter","DragOverlay","React6","useSensors","useSensor","PointerSensor","React7","Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAMO,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC5B;;;ACOA,IAAM,cAAA,GAAiC;AAAA;AAAA,EAEtC,WAAA,sBAAiB,GAAA,CAAI;AAAA;AAAA,IAEpB,GAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA;AAAA,IAEA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA;AAAA,IAEA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA;AAAA,IAEA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA;AAAA,IAEA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA;AAAA,IAEA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA;AAAA,IAEA,GAAA;AAAA;AAAA,IAEA,OAAA;AAAA,IACA;AAAA,GACA,CAAA;AAAA,EAED,iBAAA,EAAmB;AAAA;AAAA,IAElB,GAAA,kBAAK,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,MAAM,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA;AAAA,IAE7D,GAAA,sBAAS,GAAA,CAAI,CAAC,OAAO,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IACvD,mBAAG,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA;AAAA,IACpC,KAAA,sBAAW,GAAA,CAAI,CAAC,OAAO,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IACnD,KAAA,kBAAO,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAChF,wBAAQ,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IAC/B,KAAA,sBAAW,GAAA,CAAI,CAAC,OAAO,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC;AAAA,GACnD;AAAA,EAEA,mBAAA,EAAqB,KAAA;AAAA,EACrB,WAAA,EAAa;AACd,CAAA;AAMA,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA;AAAA,EAE3B,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAC,CAAA;AAsEM,SAAS,YAAA,CAAa,IAAA,EAAc,MAAA,GAAkC,EAAC,EAAW;AACxF,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAG3C,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACzB,qDAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,IAAI,SAAA,GAAY,IAAA;AAChB,EAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACxC,IAAA,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA;AAExC,EAAA,OAAO,OAAA;AACR;AAOA,SAAS,SAAA,CAAU,MAAc,MAAA,EAAgC;AAIhE,EAAA,IAAI,OAAA,GAAU,IAAA;AAGd,EAAA,MAAM,UAAA,GAAa,sCAAA;AACnB,EAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,UAAA,EAAY,CAAC,KAAA,EAAO,SAAS,MAAA,KAAW;AACjE,IAAA,MAAM,GAAA,GAAM,QAAQ,WAAA,EAAY;AAChC,IAAA,MAAM,QAAA,GAAW,GAAA,KAAQ,MAAA,IAAU,OAAA,CAAQ,SAAS,OAAO,CAAA;AAE3D,IAAA,IAAI,YAAY,MAAA,CAAO,WAAA,IAAe,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3D,MAAA,OAAO,KAAA;AAAA,IACR;AACA,IAAA,IAAI,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AAEhC,MAAA,OAAO,qBAAA,CAAsB,KAAA,EAAO,GAAA,EAAK,MAAM,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,EAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACR;AAKA,SAAS,qBAAA,CAAsB,SAAA,EAAmB,OAAA,EAAiB,MAAA,EAAgC;AAClG,EAAA,MAAM,WAAA,GAAc,0EAAA;AAEpB,EAAA,IAAI,UAAA,GAAa,IAAI,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,OAAO,CAAA,CAAA;AAEpE,EAAA,IAAI,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AACtC,EAAA,OAAO,UAAU,IAAA,EAAM;AACtB,IAAA,MAAM,QAAA,GAAA,CAAY,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,WAAA,EAAY;AAC9C,IAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAGtD,IAAA,MAAM,cAAc,MAAA,CAAO,iBAAA,CAAkB,GAAG,CAAA,wBAAS,GAAA,EAAI;AAC7D,IAAA,MAAM,WAAW,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA,wBAAS,GAAA,EAAI;AAE9D,IAAA,IAAI,YAAY,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,IAAK,QAAA,CAAS,IAAI,QAAQ,CAAA;AAGlE,IAAA,IAAI,YAAY,KAAA,KAAU,QAAA,KAAa,WAAW,QAAA,KAAa,QAAA,IAAY,aAAa,OAAA,CAAA,EAAU;AACjG,MAAA,SAAA,GAAY,KAAA;AAAA,IACb;AAGA,IAAA,IAAI,CAAC,SAAA,IAAa,MAAA,CAAO,uBAAuB,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7E,MAAA,SAAA,GAAY,IAAA;AAAA,IACb;AAGA,IAAA,IAAI,SAAA,IAAa,CAAC,yBAAA,CAA0B,QAAA,EAAU,SAAS,CAAA,EAAG;AACjE,MAAA,UAAA,IAAc,IAAI,QAAQ,CAAA,EAAA,EAAK,UAAU,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IACjE;AAEA,IAAA,KAAA,GAAQ,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,EACnC;AAEA,EAAA,UAAA,IAAc,GAAA;AACd,EAAA,OAAO,UAAA;AACR;AAKA,SAAS,yBAAA,CAA0B,MAAc,KAAA,EAAwB;AACxE,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAG5C,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,KAAA,EAAO;AACtC,IAAA,IAAI,WAAW,UAAA,CAAW,aAAa,KAAK,UAAA,CAAW,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACpF,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,EACD;AAGA,EAAA,IAAI,WAAW,QAAA,CAAS,aAAa,KAAK,UAAA,CAAW,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1E,IAAA,OAAO,IAAA;AAAA,EACR;AAEA,EAAA,OAAO,KAAA;AACR;AAKO,SAAS,mBAAmB,IAAA,EAAsB;AAExD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,EAAY,CAAE,SAAS,OAAO,CAAA;AAErD,EAAA,OAAO,aAAa,IAAA,EAAM;AAAA,IACzB,WAAA,EAAa,SAAA;AAAA,IACb,mBAAA,EAAqB;AAAA,GACrB,CAAA;AACF;;;ACvVO,SAAS,eAAe,KAAA,EAA+C;AAC7E,EAAA,OAAO,KAAA,CACL,GAAA,CAAI,CAAC,IAAA,KAAS;AACd,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC7B,MAAA,OAAO,WAAW,IAAI,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC1B,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV;AAMO,SAAS,eAAe,IAAA,EAA8B;AAC5D,EAAA,OAAO,IAAA,CAAK,QAAA,CACV,GAAA,CAAI,CAAC,KAAA,KAAmC;AACxC,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC3B,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV;AAMO,SAAS,cAAc,IAAA,EAA8B;AAE3D,EAAA,MAAM,cAAc,CAAC,IAAA,EAAM,MAAM,KAAA,EAAO,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAG3C,EAAA,IAAI,OAAA,KAAY,MAAA,IAAU,eAAA,CAAgB,OAAO,CAAA,EAAG;AACnD,IAAA,OAAO,kBAAkB,IAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAA;AAEzC,EAAA,IAAI,YAAY,QAAA,CAAS,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChE,IAAA,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,EAAG,UAAU,CAAA,GAAA,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,EAAA,OAAO,IAAI,OAAO,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,KAAK,KAAK,OAAO,CAAA,CAAA,CAAA;AACrD;AAMO,SAAS,kBAAkB,IAAA,EAAiC;AAElE,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAElH,EAAA,MAAM,UAAA,GAAa,KAAK,WAAA,EAAY;AACpC,EAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACzC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AACnC,MAAA,OAAO,QAAA;AAAA,IACR;AAAA,EACD;AAEA,EAAA,OAAO,MAAA;AACR;AAOA,SAAS,eAAe,OAAA,EAAyB;AAEhD,EAAA,MAAM,SAAA,GAAoC;AAAA,IACzC,eAAA,EAAiB,KAAA;AAAA,IACjB,wBAAA,EAA0B,KAAA;AAAA,IAC1B,mBAAA,EAAqB,KAAA;AAAA,IACrB,oBAAA,EAAsB,KAAA;AAAA,IACtB,kBAAA,EAAoB,KAAA;AAAA,IACpB,YAAA,EAAc,KAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA,IACb,cAAA,EAAgB,MAAA;AAAA,IAChB,sBAAA,EAAwB;AAAA,GACzB;AAEA,EAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACvB,IAAA,OAAO,UAAU,OAAO,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG;AAC/B,IAAA,OAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,EACvB;AAGA,EAAA,OAAO,OAAA;AACR;AAMA,SAAS,oBAAoB,KAAA,EAAwC;AAEpE,EAAA,MAAM,YAAA,GAAe;AAAA,IACpB,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjD,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAChC,IAAA,IAAI,SAAS,IAAA,EAAM;AAGnB,IAAA,MAAM,OAAA,GAAU,GAAA,KAAQ,UAAA,GAAa,MAAA,GAAS,GAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACtB;AAWA,SAAS,WAAW,IAAA,EAAsB;AAGzC,EAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,MAAM,CAAA;AACvD;AAKA,SAAS,gBAAgB,OAAA,EAA0B;AAClD,EAAA,MAAM,UAAA,GAAa;AAAA,IAClB,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD;AACA,EAAA,OAAO,UAAA,CAAW,SAAS,OAAO,CAAA;AACnC;AAMA,SAAS,kBAAkB,IAAA,EAA8B;AACxD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CACrC,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACtB,IAAA,IAAI,KAAA,IAAS,MAAM,OAAO,EAAA;AAC1B,IAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,EACzD,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAET,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC/B,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CACjB,GAAA,CAAI,CAAC,KAAA,KAAU;AACf,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,kBAAkB,KAAK,CAAA;AAAA,EAC/B,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAET,EAAA,OAAO,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAC1D;ACzMO,SAAS,WAAA,CAAY;AAAA,EAC3B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA;AACD,CAAA,EASG;AAEF,EAAA,MAAM,YAAA,GAAqBA,cAAuB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAkC,EAAE,CAAA;AAGxE,EAAA,MAAM,QAAA,GAAiBA,eAAQ,MAAM,kBAAA,CAAmB,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGrE,EAAMA,iBAAU,MAAM;AACrB,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,EAAA,CAAG,SAAA,GAAY,QAAA;AAEf,IAAA,MAAM,aAAsC,EAAC;AAG7C,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,gBAAA,CAAiB,mBAAmB,CAAA;AACrD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,iBAAiB,CAAA;AACtD,QAAA,IAAI,UAAA,IAAc,YAAA,CAAa,UAAU,CAAA,EAAG;AAC3C,UAAA,UAAA,CAAW,UAAU,CAAA,GAAI,IAAA;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AAGA,IAAA,IAAI,UAAA,EAAY;AACf,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,gBAAA,CAAiB,uBAAuB,CAAA;AACzD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,qBAAqB,CAAA;AAC1D,QAAA,IAAI,UAAA,IAAc,UAAA,CAAW,UAAU,CAAA,EAAG;AACzC,UAAA,UAAA,CAAW,UAAU,CAAA,GAAI,IAAA;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AAGA,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,gBAAA,CAAiB,gBAAgB,CAAA;AAClD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,cAAc,CAAA;AAC9C,QAAA,IAAI,KAAA,IAAS,SAAA,CAAU,KAAK,CAAA,EAAG;AAC9B,UAAA,UAAA,CAAW,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA;AAAA,QAC9B;AAAA,MACD;AAAA,IACD;AAEA,IAAA,UAAA,CAAW,UAAU,CAAA;AAAA,EACtB,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,UAAA,EAAY,SAAS,CAAC,CAAA;AAIlD,EAAA,MAAM,OAAA,GAAgBA,eAAQ,MAAM;AACnC,IAAA,MAAM,QAA2B,EAAC;AAElC,IAAA,IAAI,gBAAgB,YAAA,EAAc;AACjC,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACvD,QAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,QAAA,IAAI,MAAA,EAAQ;AACX,UAAA,KAAA,CAAM,KAAK,YAAA,CAAa,YAAA,CAAa,KAAK,CAAA,EAAG,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,QACzD;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAI,cAAc,eAAA,EAAiB;AAClC,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,QAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,QAAA,IAAI,MAAA,EAAQ;AACX,UAAA,KAAA,CAAM,KAAK,YAAA,CAAa,eAAA,CAAgB,KAAK,CAAA,EAAG,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,QAC5D;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAI,aAAa,SAAA,EAAW;AAC3B,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAA;AAClC,QAAA,IAAI,MAAA,EAAQ;AACX,UAAA,KAAA,CAAM,IAAA,CAAK,aAAa,SAAA,CAAU,GAAG,GAAG,MAAA,EAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAC,CAAA;AAAA,QAC7D;AAAA,MACD;AAAA,IACD;AAEA,IAAA,OAAO,KAAA;AAAA,EACR,CAAA,EAAG,CAAC,OAAA,EAAS,YAAA,EAAc,YAAY,SAAA,EAAW,YAAA,EAAc,eAAA,EAAiB,SAAS,CAAC,CAAA;AAE3F,EAAMA,iBAAU,MAAM;AAErB,IAAA,MAAM,qBAAqB,MAAM;AAChC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,MAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,MAAA,MAAM,aAAa,GAAA,CAAI,UAAA;AACvB,MAAA,OAAO,UAAA,YAAsB,OAAA,IAAW,UAAA,CAAW,YAAA,KAAiB,oCAAA;AAAA,IACrE,CAAA;AAGA,IAAA,IAAI,CAAC,kBAAA,EAAmB,IAAK,aAAa,OAAA,EAAS,aAAA,CAAc,MAAM,CAAA,EAAG;AAE1E,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACC,IAAA,CAAA,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACA,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACV,sEAAA;AAAA;AAAA,UAEA,uGAAA;AAAA,UACA;AAAA;AACD;AAAA,KACD;AAAA,IACC;AAAA,GAAA,EACF,CAAA;AAEF;AC9IO,SAAS,eAAA,CAAgB;AAAA,EAC/B,UAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAA,EAIG;AACF,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,sBAAsB,UAAU,CAAA;AAC9C,EAAA,MAAM,cAAc,KAAA,EAAO,WAAA;AAC3B,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,IAAA;AACvC,EAAA,uBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,cAAA,EAAc,SAAA,EACpD,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,EAAa,CAAA,EACjC,CAAA;AAEF;ACdA,IAAM,uBAAA,GAA0B,GAAA;AAAA,EAC/B;AAAA,IACC,gHAAA;AAAA,IACA,iDAAA;AAAA,IACA,uJAAA;AAAA,IACA,2IAAA;AAAA,IACA,uEAAA;AAAA,IACA,0KAAA;AAAA,IACA,wEAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,+CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO,CAAC,0CAAA,EAA4C,8CAA8C,CAAA;AAAA,QAClG,QAAA,EAAU,CAAC,6CAAA,EAA+C,6CAA6C,CAAA;AAAA,QACvG,GAAA,EAAK,CAAC,wCAAA,EAA0C,yCAAyC,CAAA;AAAA,QACzF,GAAA,EAAK,CAAC,wCAAA,EAA0C,8CAA8C,CAAA;AAAA,QAC9F,KAAA,EAAO,CAAC,0CAAA,EAA4C,0CAA0C;AAAA;AAC/F,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS;AAAA;AACV;AAEF,CAAA;AAeA,SAAS,eAAA,CAAgB;AAAA,EACxB,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,MAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,UAAA,GAAa,IAAA;AAAA,EACb,GAAG;AACJ,CAAA,EAAyB;AACxB,EAAA,MAAM,gBAAgB,EAAA,CAAG,uBAAA,CAAwB,EAAE,OAAA,EAAS,GAAG,SAAS,CAAA;AAExE,EAAA,IAAI,SAAS,UAAA,EAAY;AACxB,IAAA,MAAM,aAAA,GAAgB,KAAA;AACtB,IAAA,uBACCA,GAAAA;AAAA,MAAmB,iBAAA,CAAA,IAAA;AAAA,MAAlB;AAAA,QACA,WAAA,EAAU,kBAAA;AAAA,QACV,cAAA,EAAc,OAAA;AAAA,QACd,eAAa,CAAC,UAAA;AAAA,QACd,SAAA,EAAW,aAAA;AAAA,QACV,GAAG,aAAA;AAAA,QAEH,wCAAcA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAA4D,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA,KACnG;AAAA,EAEF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA;AACnB,EAAA,uBACCA,GAAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACA,WAAA,EAAU,kBAAA;AAAA,MACV,cAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,aAAA;AAAA,MACV,GAAG,UAAA;AAAA,MAEH,QAAA,EAAA;AAAA;AAAA,GACF;AAEF;AClFA,SAAS,KAAA,CAAM,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqD;AACzF,EAAA,uBACCA,GAAAA;AAAA,IAAgB,cAAA,CAAA,IAAA;AAAA,IAAf;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,qNAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;ACTA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqC;AAC5E,EAAA,uBACCA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,qBAAA;AAAA,QACA,8EAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAiBA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,wIAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,IAAM,aAAA,GAAgBC,IAAI,oEAAA,EAAsE;AAAA,EAC/F,QAAA,EAAU;AAAA,IACT,WAAA,EAAa;AAAA,MACZ,QAAA,EAAU,CAAC,2CAA2C,CAAA;AAAA,MACtD,UAAA,EAAY;AAAA,QACX,uBAAA;AAAA,QACA,uCAAA;AAAA,QACA;AAAA,OACD;AAAA,MACA,UAAA,EAAY;AAAA,QACX,8HAAA;AAAA,QACA,uDAAA;AAAA,QACA;AAAA;AACD;AACD,GACD;AAAA,EACA,eAAA,EAAiB;AAAA,IAChB,WAAA,EAAa;AAAA;AAEf,CAAC,CAAA;AAED,SAAS,KAAA,CAAM;AAAA,EACd,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,GAAG;AACJ,CAAA,EAAqE;AACpE,EAAA,uBACCD,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAU,OAAA;AAAA,MACV,kBAAA,EAAkB,WAAA;AAAA,MAClB,WAAW,EAAA,CAAG,aAAA,CAAc,EAAE,WAAA,EAAa,GAAG,SAAS,CAAA;AAAA,MACtD,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+DAAA,EAAiE,SAAS,CAAA;AAAA,MACvF,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,UAAA,CAAW;AAAA,EACnB,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,GAAG;AACJ,CAAA,EAEG;AACF,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,cAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACV,iFAAA;AAAA,QACA,6CAAA;AAAA,QACA,oIAAA;AAAA,QACA,qGAAA;AAAA,QACA,gGAAA;AAAA,QACA,+FAAA;AAAA,QACA,8CAAA;AAAA,QACA,0CAAA;AAAA,QACA,uIAAA;AAAA,QACA,uPAAA;AAAA,QACA,mEAAA;AAAA,QACA,2IAAA;AAAA,QACA,2HAAA;AAAA,QACA,mIAAA;AAAA,QACA,gHAAA;AAAA,QACA,qHAAA;AAAA,QACA,uHAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,4GAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;ACxI+BC,GAAAA;AAAA,EAC9B;AAAA,IACC,gBAAA;AAAA,IACA,8CAAA;AAAA,IACA,mKAAA;AAAA,IACA,iDAAA;AAAA,IACA,qCAAA;AAAA,IACA,kEAAA;AAAA,IACA,kFAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,qDAAA;AAAA,UACA,yDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,qDAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,QAAA,EAAU;AAAA,UACT,qDAAA;AAAA,UACA,uDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,qDAAA;AAAA,UACA,kDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,qDAAA;AAAA,UACA,kDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,qDAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA;AACD;AACD,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS;AAAA;AACV;AAEF;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAA0D;AACnG,EAAA,uBAAOD,GAAAA,CAAqBE,mBAAA,CAAA,IAAA,EAApB,EAAyB,WAAA,EAAU,aAAA,EAAc,SAAA,EAAW,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAC7G;ACvBO,SAAS,yBAAA,CAA0B;AAAA,EACzC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV,SAAA;AAAA,EACA;AACD,CAAA,EAAmC;AAClC,EAAA,MAAM,UAAA,GAAa,YAAY,UAAA,GAAa,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAuBC,eAAQ,MAAM;AAC1C,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,OAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,YAAA,GAAqBA,eAAQ,MAAM;AACxC,IAAA,MAAM,SAAS,CAAC,IAAA,KAAiB,KAAK,WAAA,EAAY,CAAE,SAAS,MAAM,CAAA;AACnE,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB,IAAA,CAAK,QAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AACrE,IAAA,OACC,YAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,IAC7B,WAAA,CAAY,QAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,WAAW,CAAA,IAAK,SAAS,CAAA,CAAE,WAAW,MAAM,EAAE,CAAA;AAAA,EAE1F,CAAA,EAAG,CAAC,WAAA,CAAY,OAAO,CAAC,CAAA;AAExB,EAAA,MAAM,WAAA,GAAc,YAAY,OAAA,CAAQ,MAAA;AAGxC,EAAA,MAAM,SAAA,GAAkBA,eAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,cAAc,OAAO,WAAA;AAC1B,IAAA,QAAQ,WAAA;AAAa,MACpB,KAAK,CAAA;AACJ,QAAA,OAAO,kBAAA;AAAA,MACR,KAAK,CAAA;AACJ,QAAA,OAAO,kBAAA;AAAA,MACR,KAAK,CAAA;AACJ,QAAA,OAAO,kBAAA;AAAA,MACR;AACC,QAAA,OAAO,qBAAA;AAAA;AACT,EACD,CAAA,EAAG,CAAC,YAAA,EAAc,WAAW,CAAC,CAAA;AAG9B,EAAA,MAAM,cAAA,GAAuBA,eAAQ,MAAM;AAC1C,IAAA,IAAI,CAAC,cAAc,OAAO,EAAA;AAC1B,IAAA,OAAO,WAAA,KAAgB,IAAI,qCAAA,GAAwC,gBAAA;AAAA,EACpE,CAAA,EAAG,CAAC,YAAA,EAAc,WAAW,CAAC,CAAA;AAE9B,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAkB;AAC7C,IAAA,IAAI,CAAC,YAAY,cAAA,EAAgB;AAChC,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACrB;AAAA,EACD,CAAA;AAKA,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,UAAA,mBAAaH,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,CAAY,UAAA,EAAY,SAAA,EAAU,MAAA,EAAO,CAAA,GAAK,IAAA;AAGhH,EAAA,IAAI,CAAC,UAAA,EAAY;AAChB,IAAA,MAAMI,aAAY,YAAA,KAAiB,IAAA;AACnC,IAAA,uBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,sBACDL,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACA,KAAA,EAAO,cAAA,CAAe,CAAC,CAAA,IAAK,EAAA;AAAA,UAC5B,aAAA,EAAe,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAK,CAAA;AAAA,UAClD,UAAU,QAAA,IAAYI,UAAAA;AAAA,UAEtB,0BAAAJ,GAAAA,CAAC,UAAA,EAAA,EACA,QAAA,kBAAAA,GAAAA,CAAC,YACC,QAAA,EAAA,YAAA,mBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,SAAA,EACd,QAAA,EAAA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU;AAC3C,YAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC5D,YAAA,MAAM,aAAA,GAAgBI,UAAAA,IAAa,UAAA,GAAc,SAAA,GAAY,QAAQ,UAAA,GAAc,OAAA;AACnF,YAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,YAAA,uBACCJ,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAYD,UAAAA,EAC1D,QAAA,EAAA;AAAA,8BAAAJ,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACA,OAAO,MAAA,CAAO,UAAA;AAAA,kBACd,EAAA,EAAI,KAAA;AAAA,kBACJ,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,EAAA,GAAK,KAAK,CAAA;AAAA,kBACtC,OAAA,EAAS,aAAA;AAAA,kBACT,UAAU,QAAA,IAAYI;AAAA;AAAA,eACvB;AAAA,8BACAJ,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,EAAA,CAAG,cAAc,CAAA,EACzC,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EACA,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,MAAA,CAAO,WAAA,EAAa,GACxC,CAAA,EACD;AAAA,aAAA,EACD,CAAA,EAAA,EAdgB,OAAO,UAexB,CAAA;AAAA,UAEF,CAAC,GACF,CAAA,GAEA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU;AAC1C,YAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC5D,YAAA,MAAM,aAAA,GAAgBI,UAAAA,IAAa,UAAA,GAAc,SAAA,GAAY,QAAQ,UAAA,GAAc,OAAA;AACnF,YAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,YAAA,uBACCJ,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAYD,UAAAA,EAC1D,QAAA,EAAA;AAAA,8BAAAJ,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACA,OAAO,MAAA,CAAO,UAAA;AAAA,kBACd,EAAA,EAAI,KAAA;AAAA,kBACJ,oBACCI,UAAAA,IAAa,UAAA,IAAc,OAAO,kBAAA,GAAqB,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA,GAAQ,MAAA;AAAA,kBAExE,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,EAAA,GAAK,KAAK,CAAA;AAAA,kBACtC,OAAA,EAAS,aAAA;AAAA,kBACT,UAAU,QAAA,IAAYA;AAAA;AAAA,eACvB;AAAA,8BACAC,KAAC,YAAA,EAAA,EACA,QAAA,EAAA;AAAA,gCAAAL,GAAAA,CAAC,cACA,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EACxC,CAAA;AAAA,gBACCI,UAAAA,IAAa,UAAA,IAAc,MAAA,CAAO,kBAAA,mBAClCJ,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACA,EAAA,EAAI,GAAG,KAAK,CAAA,GAAA,CAAA;AAAA,oBACZ,WAAA,EAAU,QAAA;AAAA,oBACV,SAAA,EAAW,EAAA;AAAA,sBACV,oDAAA;AAAA,sBACA,YAAY,YAAA,GAAe;AAAA,qBAC5B;AAAA,oBAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,OAAO,kBAAA,EAAoB;AAAA;AAAA,iBAC/C,GACG;AAAA,eAAA,EACL;AAAA,aAAA,EACD,CAAA,EAAA,EA7BgB,OAAO,UA8BxB,CAAA;AAAA,UAEF,CAAC,GAEH,CAAA,EACD;AAAA;AAAA;AACD,KAAA,EACD,CAAA;AAAA,EAEF;AAGA,EAAA,MAAM,YAAY,YAAA,KAAiB,IAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,IAAU,WAAA,CAAY,UAAA;AACnD,EAAA,uBACCK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,IAAA,aAAA;AAAA,oBACDL,GAAAA,CAAC,UAAA,EAAA,EACA,QAAA,kBAAAA,GAAAA,CAAC,YACC,QAAA,EAAA,YAAA,mBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,SAAA,EACd,QAAA,EAAA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,MAAA,KAAW;AAC5C,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC3D,MAAA,MAAM,YAAA,GAAe,4BAA4B,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,UAAU,CAAA,EAAG,SAAA;AAC1F,MAAA,MAAM,eAAA,GAAkB,YAAA,KAAiB,SAAA,GAAa,SAAA,IAAa,KAAA,GAAS,KAAA,CAAA;AAC5E,MAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,SAAA,GAAa,eAAA,GAAkB,QAAQ,UAAA,GAAc,OAAA;AACxF,MAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,MAAA,uBACCA,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAY,SAAA,EAC1D,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,UAAA;AAAA,YACL,EAAA,EAAI,KAAA;AAAA,YACJ,UAAA,EAAY,KAAA;AAAA,YACZ,OAAA,EAAS,aAAA;AAAA,YACT,OAAA,EAAS,SAAA;AAAA,YACT,eAAA,EAAiB,CAAC,OAAA,KAAY;AAC7B,cAAA,IAAI,QAAA,IAAY,SAAA,IAAa,CAAC,cAAA,EAAgB;AAE9C,cAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,CAAC,SAAA,IAAa,KAAA,EAAO;AAC7C,cAAA,MAAM,IAAA,GACL,OAAA,KAAY,IAAA,GACT,CAAC,GAAG,cAAA,EAAgB,MAAA,CAAO,UAAU,CAAA,GACrC,eAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,UAAU,CAAA;AACxD,cAAA,cAAA,CAAe,IAAI,CAAA;AAAA,YACpB,CAAA;AAAA,YACA,QAAA,EAAU,QAAA,IAAY,SAAA,IAAc,CAAC,SAAA,IAAa,KAAA;AAAA,YAClD,oBACC,SAAA,IAAa,SAAA,IAAa,OAAO,kBAAA,GAAqB,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA,GAAQ;AAAA;AAAA,SAExE;AAAA,wBACAK,IAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,EAAA,CAAG,cAAc,CAAA,EACzC,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,cACA,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EACxC,CAAA;AAAA,UACC,SAAA,IAAa,SAAA,IAAa,MAAA,CAAO,kBAAA,mBACjCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,EAAA,EAAI,GAAG,KAAK,CAAA,GAAA,CAAA;AAAA,cACZ,WAAA,EAAU,QAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACV,oDAAA;AAAA,gBACA,kBAAkB,YAAA,GAAe;AAAA,eAClC;AAAA,cAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,OAAO,kBAAA,EAAoB;AAAA;AAAA,WAC/C,GACG;AAAA,SAAA,EACL;AAAA,OAAA,EACD,CAAA,EAAA,EAxCgB,OAAO,UAyCxB,CAAA;AAAA,IAEF,CAAC,GACF,CAAA,GAEA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,MAAA,KAAW;AAC3C,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC3D,MAAA,MAAM,YAAA,GAAe,4BAA4B,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,UAAU,CAAA,EAAG,SAAA;AAC1F,MAAA,MAAM,eAAA,GAAkB,YAAA,KAAiB,SAAA,GAAa,SAAA,IAAa,KAAA,GAAS,KAAA,CAAA;AAC5E,MAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,SAAA,GAAa,eAAA,GAAkB,QAAQ,UAAA,GAAc,OAAA;AACxF,MAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,MAAA,uBACCA,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAY,SAAA,EAC1D,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,UAAA;AAAA,YACL,EAAA,EAAI,KAAA;AAAA,YACJ,UAAA,EAAY,KAAA;AAAA,YACZ,OAAA,EAAS,aAAA;AAAA,YACT,OAAA,EAAS,SAAA;AAAA,YACT,eAAA,EAAiB,CAAC,OAAA,KAAY;AAC7B,cAAA,IAAI,QAAA,IAAY,SAAA,IAAa,CAAC,cAAA,EAAgB;AAE9C,cAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,CAAC,SAAA,IAAa,KAAA,EAAO;AAC7C,cAAA,MAAM,IAAA,GACL,OAAA,KAAY,IAAA,GACT,CAAC,GAAG,cAAA,EAAgB,MAAA,CAAO,UAAU,CAAA,GACrC,eAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,UAAU,CAAA;AACxD,cAAA,cAAA,CAAe,IAAI,CAAA;AAAA,YACpB,CAAA;AAAA,YACA,QAAA,EAAU,QAAA,IAAY,SAAA,IAAc,CAAC,SAAA,IAAa,KAAA;AAAA,YAClD,oBAAkB,SAAA,IAAa,SAAA,IAAa,OAAO,kBAAA,GAAqB,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA,GAAQ;AAAA;AAAA,SACzF;AAAA,wBACAK,KAAC,YAAA,EAAA,EACA,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,cACA,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EACxC,CAAA;AAAA,UACC,SAAA,IAAa,SAAA,IAAa,MAAA,CAAO,kBAAA,mBACjCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,EAAA,EAAI,GAAG,KAAK,CAAA,GAAA,CAAA;AAAA,cACZ,WAAA,EAAU,QAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACV,oDAAA;AAAA,gBACA,kBAAkB,YAAA,GAAe;AAAA,eAClC;AAAA,cAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,OAAO,kBAAA,EAAoB;AAAA;AAAA,WAC/C,GACG;AAAA,SAAA,EACL;AAAA,OAAA,EACD,CAAA,EAAA,EAtCgB,OAAO,UAuCxB,CAAA;AAAA,IAEF,CAAC,GAEH,CAAA,EACD;AAAA,GAAA,EACD,CAAA;AAEF;AC9RA,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,SAAA,EAAU,EAAyC;AAClF,EAAA,MAAM,GAAA,GAAY,cAAwB,IAAI,CAAA;AAE9C,EAAM,uBAAgB,MAAM;AAC3B,IAAA,IAAI,IAAI,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,QAAQ,SAAA,GAAY,IAAA;AAAA,IACzB;AAAA,EACD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAsB,CAAA;AAC9C;AAUA,SAAS,cAAc,KAAA,EAAgC;AACtD,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,KAAA,EAAO,QAAQ,CAAA,KAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAC/E;AAGA,SAAS,gBAAgB,QAAA,EAAmC;AAC3D,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,IAAA,IAAI,YAAY,KAAA,EAAO;AACtB,MAAA,KAAA,CAAM,KAAK,CAAA,GAAI,QAAA;AAAA,IAChB;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAMA,IAAM,eAAA,GAAkBC,GAAAA;AAAA,EACvB;AAAA,IACC,yCAAA;AAAA,IACA,6CAAA;AAAA,IACA,gCAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,KAAA,EAAO,wCAAA;AAAA,QACP,KAAA,EAAO,0BAAA;AAAA,QACP,MAAA,EAAQ,0BAAA;AAAA,QACR,OAAA,EAAS,sBAAA;AAAA,QACT,SAAA,EAAW;AAAA;AACZ,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAEA,IAAM,mBAAA,GAAsBA,GAAAA;AAAA,EAC3B;AAAA,IACC,yCAAA;AAAA,IACA,8BAAA;AAAA,IACA,uBAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,2IAAA;AAAA,QACN,QAAA,EAAU,mFAAA;AAAA,QACV,QAAA,EAAU,4BAAA;AAAA,QACV,QAAA,EAAU;AAAA;AACX,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAeA,SAAS,WAAA,CAAY,EAAE,EAAA,EAAI,WAAA,EAAa,UAAU,UAAA,EAAY,OAAA,EAAS,eAAc,EAAqB;AACzG,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAe,YAAA,CAAa;AAAA,IACtE,EAAA,EAAI,UAAU,EAAE,CAAA,CAAA;AAAA,IAChB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,EAAA,EAAG;AAAA,IACrC,QAAA,EAAU,YAAY,aAAA,IAAiB;AAAA,GACvC,CAAA;AAED,EAAA,IAAI,aAAA,IAAiB,GAAG,OAAO,IAAA;AAK/B,EAAA,MAAM,WAAW,MAAqD;AACrE,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,OAAO,MAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCI,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,SAAA,EAAW,GAAG,mBAAA,CAAoB,EAAE,OAAO,QAAA,EAAS,EAAG,CAAA,EAAG,wBAAwB,CAAA;AAAA,MAClF,QAAA;AAAA,MACC,GAAG,UAAA;AAAA,MACH,GAAG,SAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,QAClC,gBAAgB,CAAA,oBAAKK,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EAAqC,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,UAAE;AAAA,SAAA,EAAc;AAAA;AAAA;AAAA,GAC5F;AAEF;AAgBA,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,SAAS,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,YAAA,EAAa,EAAiB;AAC1G,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,YAAA,CAAa;AAAA,IAC3C,EAAA,EAAI,OAAO,KAAK,CAAA,CAAA;AAAA,IAChB,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,IAC3B;AAAA,GACA,CAAA;AAED,EAAA,MAAM,WAAW,MAAqD;AACrE,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC/B,MAAA,OAAO,YAAY,SAAA,GAAY,WAAA;AAAA,IAChC;AACA,IAAA,IAAI,QAAQ,OAAO,OAAA;AACnB,IAAA,IAAI,YAAY,OAAO,QAAA;AACvB,IAAA,OAAO,OAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCL,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAK,UAAA,EAAY,WAAW,EAAA,CAAG,eAAA,CAAgB,EAAE,KAAA,EAAO,UAAS,EAAG,CAAC,CAAA,EACzE,uCACAK,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,QAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,yBAAA;AAAA,QACA,CAAC,QAAA,IAAY,oCAAA;AAAA,QACb,QAAA,IAAY;AAAA,OACb;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,UAAA,CAAW,WAAA,EAAa,CAAA;AAAA,QAC7C,CAAC,QAAA,oBAAYA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAqB,QAAA,EAAA,MAAA,EAAC;AAAA;AAAA;AAAA,sBAGrDA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,QAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,8DAAA;AAAA,QACA,CAAC,QAAA,IAAY;AAAA,OACd;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAa,QAAA,EAAA,KAAA,EAAG;AAAA;AAAA,GACjC,EAEF,CAAA;AAEF;AAgBO,SAAS,mBAAA,CAAoB;AAAA,EACnC,WAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf;AACD,CAAA,EAA6B;AAE5B,EAAA,MAAM,YAAA,GAAqB,eAAQ,MAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAG9E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAGlF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAqB,MAAA,CAAA,OAAA;AAAA,IAC1B,MAAM,YAAY,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,YAAY,CAAA;AAAA,IAC9D,CAAC,YAAA,EAAc,WAAA,CAAY,QAAQ;AAAA,GACpC;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAA6B;AACtD,IAAA,MAAM,MAAA,GAAS,YAAY,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,QAAQ,CAAA;AACnE,IAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,EAAG,OAAO,GAAA;AAClC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,OAAO,CAAC,EAAA,KAAO,EAAA,KAAO,QAAQ,CAAA,CAAE,MAAA;AAC9E,IAAA,OAAO,OAAO,QAAA,GAAW,SAAA;AAAA,EAC1B,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAAqB;AAC/C,IAAA,IAAI,YAAY,YAAA,EAAc;AAC9B,IAAA,mBAAA,CAAoB,CAAC,IAAA,KAAU,IAAA,KAAS,QAAA,GAAW,OAAO,QAAS,CAAA;AAAA,EACpE,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,QAAA,IAAY,YAAA,IAAgB,CAAC,gBAAA,EAAkB;AAGnD,IAAA,IAAI,gBAAA,CAAiB,gBAAgB,CAAA,IAAK,CAAA,EAAG;AAC5C,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA;AAAA,IACD;AAGA,IAAA,MAAM,WAAW,EAAE,GAAG,cAAc,CAAC,KAAK,GAAG,gBAAA,EAAiB;AAC9D,IAAA,cAAA,GAAiB,aAAA,CAAc,QAAQ,CAAC,CAAA;AACxC,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,EACzB,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,YAAY,YAAA,EAAc;AAC9B,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,IAAA,OAAO,SAAS,KAAK,CAAA;AACrB,IAAA,cAAA,GAAiB,aAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,EACzC,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC9C,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,OAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,CAAK,OAAA;AAE7B,IAAA,IAAI,UAAA,EAAY,IAAA,KAAS,QAAA,IAAY,UAAA,EAAY,SAAS,KAAA,EAAO;AAChE,MAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA;AAEzB,MAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AAE9D,QAAA,IAAI,gBAAA,CAAiB,QAAQ,CAAA,IAAK,CAAA,EAAG;AAErC,QAAA,MAAM,WAAW,EAAE,GAAG,cAAc,CAAC,KAAK,GAAG,QAAA,EAAS;AACtD,QAAA,cAAA,GAAiB,aAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,MACzC;AAAA,IACD;AAAA,EACD,CAAA;AAGA,EAAA,MAAM,SAAA,GAAkB,eAAQ,MAAM;AACrC,IAAA,MAAM,SAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,GAAA,IAAO,YAAY,IAAA,EAAM;AACnC,MAAA,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA;AAAA,IAClB;AACA,IAAA,OAAO,MAAA;AAAA,EACR,CAAA,EAAG,CAAC,WAAA,CAAY,IAAI,CAAC,CAAA;AAErB,EAAA,uBACCK,IAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACA,kBAAA,EAAoB,aAAA;AAAA,MACpB,WAAA,EAAa,CAAC,CAAA,KAAM;AACnB,QAAA,MAAM,EAAA,GAAK,EAAE,MAAA,CAAO,EAAA;AACpB,QAAA,MAAM,QAAA,GAAW,OAAO,EAAA,KAAO,QAAA,GAAW,GAAG,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,GAAI,IAAA;AACtE,QAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,QAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEd,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACV,uCAAA;AAAA,gBACA,qCAAA;AAAA,gBACA,QAAA,IAAY,eAAe,0BAAA,GAA6B;AAAA,eACzD;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,WAAA,CAAY,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,qBAC1BL,GAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBAEA,IAAI,MAAA,CAAO,EAAA;AAAA,oBACX,aAAa,MAAA,CAAO,WAAA;AAAA,oBACpB,UAAU,QAAA,IAAY,YAAA;AAAA,oBACtB,UAAA,EAAY,qBAAqB,MAAA,CAAO,EAAA;AAAA,oBACxC,OAAA,EAAS,MAAM,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAA;AAAA,oBAC1C,aAAA,EAAe,gBAAA,CAAiB,MAAA,CAAO,EAAE;AAAA,mBAAA;AAAA,kBANpC,MAAA,CAAO;AAAA,iBAQb,CAAA;AAAA,gBACA,WAAA,CAAY,SAAS,KAAA,CAAM,CAAC,MAAM,gBAAA,CAAiB,CAAA,CAAE,EAAE,CAAA,IAAK,CAAC;AAAA;AAAA;AAAA,WAC/D;AAAA,UAGC,gBAAA,IAAoB,CAAC,QAAA,IAAY,CAAC,YAAA,oBAClCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,yCAAA,EAAuC,CAAA;AAAA,0BAInGA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BACd,QAAA,kBAAAA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACA,MAAM,WAAA,CAAY,WAAA;AAAA,cAClB,SAAA;AAAA,cACA,SAAA,EAAW,CAAC,GAAA,KAAQ;AACnB,gBAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AACpC,gBAAA,MAAM,MAAA,GAAS,YAAY,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,QAAQ,CAAA;AAEnE,gBAAA,uBACCA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACA,OAAO,GAAA,CAAI,EAAA;AAAA,oBACX,UAAA,EAAY,MAAA;AAAA,oBACZ,OAAA,EAAS,MAAM,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAAA,oBACpC,OAAA,EAAS,MAAM,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAAA,oBACpC,UAAU,QAAA,IAAY,YAAA;AAAA,oBACtB,SAAA,EAAW,cAAA,GAAiB,GAAA,CAAI,EAAE,CAAA;AAAA,oBAClC;AAAA;AAAA,iBACD;AAAA,cAEF;AAAA;AAAA,WACD,EACD;AAAA,SAAA,EACD,CAAA;AAAA,wBAGAA,GAAAA,CAAC,WAAA,EAAA,EAAY,aAAA,EAAe,IAAA,EAC1B,QAAA,EAAA,YAAA,mBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,mBAAA,CAAoB,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,EAAG,2BAA2B,CAAA,EACzF,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,YAAA,CAAa,WAAA,EAAa,CAAA,EACjD,CAAA,GACG,IAAA,EACL;AAAA;AAAA;AAAA,GACD;AAEF;;;AC1YA,SAAS,MAAM,GAAA,EAA2B;AACzC,EAAA,IAAI,CAAA,GAAI,aAAa,GAAA,CAAI,MAAA;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAI,IAAI,UAAA,CAAW,CAAC,GAAG,UAAU,CAAA;AAC/C,IAAA,CAAA,GAAK,CAAA,IAAK,KAAO,CAAA,KAAM,EAAA;AAAA,EACxB;AACA,EAAA,OAAO,MAAM;AACZ,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,IAAK,UAAU,CAAA;AACxC,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,IAAK,UAAU,CAAA;AACxC,IAAA,MAAM,UAAU,CAAA,KAAM,EAAA;AACtB,IAAA,CAAA,GAAI,CAAA,GAAI,OAAA;AACR,IAAA,OAAO,CAAA,KAAM,CAAA;AAAA,EACd,CAAA;AACD;AAEA,SAAS,WAAW,IAAA,EAA4B;AAC/C,EAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,EAAA,OAAO,MAAM;AACZ,IAAA,KAAA,GAAQ,KAAA,GAAQ,UAAA;AAChB,IAAA,IAAI,CAAA,GAAI,KAAA;AACR,IAAA,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,EAAA,EAAK,IAAI,CAAC,CAAA;AACnC,IAAA,CAAA,GAAI,CAAA,GAAK,IAAI,IAAA,CAAK,IAAA,CAAK,IAAK,CAAA,KAAM,CAAA,EAAI,IAAI,EAAE,CAAA;AAC5C,IAAA,OAAA,CAAA,CAAS,CAAA,GAAK,CAAA,KAAM,EAAA,MAAS,CAAA,IAAK,UAAA;AAAA,EACnC,CAAA;AACD;AAEO,SAAS,eAAA,CAAmB,OAAY,IAAA,EAAmB;AACjE,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,EAAM;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,IAAI,CAAA;AACzB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAA,EAAQ,CAAA;AAC/B,EAAA,KAAA,IAAS,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI,IAAK,IAAI,CAAA,CAAE,CAAA;AACpC,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AAC1C,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AACT,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AAAA,EACV;AACA,EAAA,OAAO,GAAA;AACR;AChCA,IAAM,qBAAA,GAAwBC,GAAAA;AAAA,EAC7B;AAAA,IACC,gBAAA;AAAA,IACA,8CAAA;AAAA,IACA,2NAAA;AAAA,IACA,sOAAA;AAAA,IACA,uIAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,+CAAA;AAAA,UACA,+CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,+CAAA;AAAA,UACA,0CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,QAAA,EAAU;AAAA,UACT,+CAAA;AAAA,UACA,6CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,+CAAA;AAAA,UACA,wCAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,+CAAA;AAAA,UACA,wCAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,+CAAA;AAAA,UACA,0CAAA;AAAA,UACA;AAAA;AACD,OACD;AAAA,MACA,OAAA,EAAS;AAAA,QACR,IAAA,EAAM,CAAC,oDAAoD,CAAA;AAAA,QAC3D,KAAA,EAAO,CAAC,uDAAuD;AAAA;AAChE,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACV;AAEF,CAAA;AAEA,SAAS,MAAA,CAAO,EAAE,GAAG,KAAA,EAAM,EAAsD;AAChF,EAAA,uBAAOD,GAAAA,CAAiB,eAAA,CAAA,IAAA,EAAhB,EAAqB,WAAA,EAAU,QAAA,EAAU,GAAG,KAAA,EAAO,CAAA;AAC5D;AAMA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAuD;AACjG,EAAA,uBACCA,GAAAA;AAAA,IAAiB,eAAA,CAAA,KAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,iCAAA,EAAmC,SAAS,CAAA;AAAA,MACzD,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,aAAA,CAAc;AAAA,EACtB,SAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,QAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,KAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAGI;AACH,EAAA,uBACCK,IAAAA;AAAA,IAAiB,eAAA,CAAA,OAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,cAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,GAAG,qBAAA,CAAsB,EAAE,SAAS,OAAA,EAAS,SAAA,EAAW,CAAC,CAAA;AAAA,MACpE,KAAA,EAAO,EAAE,KAAA,EAAO,0BAAA,EAA4B,GAAG,KAAA,EAAM;AAAA,MACpD,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDL,GAAAA,CAAiB,eAAA,CAAA,IAAA,EAAhB,EAAqB,OAAA,EAAO,IAAA,EAC5B,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,mBAAA,EAAoB,CAAA,EAChD;AAAA;AAAA;AAAA,GACD;AAEF;AAEA,SAAS,aAAA,CAAc;AAAA,EACtB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,QAAA;AAAA,EACX,KAAA,GAAQ,QAAA;AAAA,EACR,GAAG;AACJ,CAAA,EAAyD;AACxD,EAAA,uBACCA,GAAAA,CAAiB,eAAA,CAAA,MAAA,EAAhB,EACA,QAAA,kBAAAK,IAAAA;AAAA,IAAiB,eAAA,CAAA,OAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,wlBAAA;AAAA,QACA,aAAa,QAAA,IACZ,iIAAA;AAAA,QACD;AAAA,OACD;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAL,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,wBACtBA,GAAAA;AAAA,UAAiB,eAAA,CAAA,QAAA;AAAA,UAAhB;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACV,KAAA;AAAA,cACA,aAAa,QAAA,IACZ;AAAA,aACF;AAAA,YAEC;AAAA;AAAA,SACF;AAAA,wBACAA,IAAC,sBAAA,EAAA,EAAuB;AAAA;AAAA;AAAA,GACzB,EACD,CAAA;AAEF;AAYA,SAAS,WAAW,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,OAAM,EAAsD;AACzG,EAAA,uBACCK,IAAAA;AAAA,IAAiB,eAAA,CAAA,IAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,2aAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAAA,EACf,0BAAAA,GAAAA,CAAiB,eAAA,CAAA,aAAA,EAAhB,EACA,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,GAC/B,CAAA,EACD,CAAA;AAAA,wBACAA,GAAAA,CAAiB,eAAA,CAAA,QAAA,EAAhB,EAA0B,QAAA,EAAS;AAAA;AAAA;AAAA,GACrC;AAEF;AAYA,SAAS,oBAAA,CAAqB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgE;AACnH,EAAA,uBACCA,GAAAA;AAAA,IAAiB,eAAA,CAAA,cAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,yBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,MAC9E,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,GACnC;AAEF;AAEA,SAAS,sBAAA,CAAuB;AAAA,EAC/B,SAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAAkE;AACjE,EAAA,uBACCA,GAAAA;AAAA,IAAiB,eAAA,CAAA,gBAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,2BAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,MAC9E,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,GACrC;AAEF;ACjLA,SAASM,eAAAA,CAAe,EAAE,IAAA,EAAM,SAAA,EAAW,OAAM,EAAsE;AACtH,EAAA,MAAM,GAAA,GAAYC,cAAwB,IAAI,CAAA;AAE9C,EAAMA,iBAAU,MAAM;AACrB,IAAA,IAAI,IAAI,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,GAAY,kBAAA,CAAmB,IAAI,CAAA;AAAA,IAChD;AAAA,EACD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBAAOP,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,WAAsB,KAAA,EAAc,CAAA;AAC5D;AAUO,SAAS,iBAAA,CAAkB;AAAA,EACjC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACD,CAAA,EAA2B;AAC1B,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,KAAa,QAAA,IAAY,SAAS,MAAA,GAAS,CAAA;AACnE,EAAA,MAAM,mBAAA,GAAsB,WAAW,EAAA,GAAK,yEAAA;AAG5C,EAAA,MAAM,KAAA,GAAcO,eAAQ,MAAM;AACjC,IAAA,OAAO,KAAA,CAAM,UAAU,eAAA,CAAgB,KAAA,CAAM,SAAS,KAAA,CAAM,UAAU,IAAI,KAAA,CAAM,OAAA;AAAA,EACjF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,eAAA,GAAkC,YAAA,IAAgB,QAAA,GAAY,SAAA,GAAY,QAAQ,UAAA,GAAc,OAAA;AACtG,EAAA,MAAM,WAAA,GAAc,YAAA,IAAgB,QAAA,IAAY,SAAA,KAAc,QAAQ,IAAA,GAAO,MAAA;AAG7E,EAAA,MAAM,iBAAA,GAA0BA,eAAQ,MAAM;AAC7C,IAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjD,IAAA,OAAO,OAAO,WAAA,IAAe,EAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE9B,EAAA,uBACCF,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACA,KAAA,EAAO,WAAW,QAAA,GAAW,EAAA;AAAA,MAC7B,aAAA,EAAe,CAAC,KAAA,KAAU;AACzB,QAAA,IAAI,CAAC,QAAA,IAAY,cAAA,EAAgB,cAAA,CAAe,KAAK,CAAA;AAAA,MACtD,CAAA;AAAA,MACA,UAAU,QAAA,IAAY,YAAA;AAAA,MAEtB,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,IAAA;AAAA,YACL,SAAA,EAAW,mBAAA;AAAA,YACX,OAAA,EAAS,WAAW,eAAA,GAAkB,SAAA;AAAA,YACtC,cAAA,EAAc,WAAA;AAAA,YAEd,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAA,EAAY,WAAA,EACvB,qCACAA,GAAAA;AAAA,cAACM,eAAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAM,iBAAA;AAAA,gBACN,SAAA,EAAU,iCAAA;AAAA,gBACV,KAAA,EAAO,EAAE,KAAA,EAAO,0BAAA;AAA2B;AAAA,gBAEzC,IAAA,EACL;AAAA;AAAA,SACD;AAAA,wBACAN,GAAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,cAAA,EACtB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACXA,GAAAA,CAAC,UAAA,EAAA,EAAsB,KAAA,EAAO,EAAE,EAAA,EAC/B,QAAA,kBAAAA,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,CAAA,CAAE,WAAA,EAAa,CAAA,EAAA,EADrB,CAAA,CAAE,EAEnB,CACA,CAAA,EACF;AAAA;AAAA;AAAA,GACD;AAEF;AChGA,SAASA,eAAAA,CAAe,EAAE,IAAA,EAAM,SAAA,EAAU,EAAyC;AAClF,EAAA,MAAM,GAAA,GAAYE,cAAwB,IAAI,CAAA;AAE9C,EAAMA,uBAAgB,MAAM;AAC3B,IAAA,IAAI,IAAI,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,QAAQ,SAAA,GAAY,IAAA;AAAA,IACzB;AAAA,EACD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBAAOR,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAsB,CAAA;AAC9C;AAUA,SAAS,aAAA,CAAc,UAAkB,QAAA,EAA0B;AAClE,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC/B;AAGA,SAASS,eAAc,KAAA,EAA6B;AACnD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1D,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAC7C;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAGA,SAASC,iBAAgB,QAAA,EAAgC;AACxD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,IAAI,YAAY,QAAA,EAAU;AACzB,MAAA,IAAI,CAAC,KAAA,CAAM,QAAQ,CAAA,EAAG;AACrB,QAAA,KAAA,CAAM,QAAQ,IAAI,EAAC;AAAA,MACpB;AACA,MAAA,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAMA,IAAM,iBAAA,GAAoBT,GAAAA;AAAA,EACzB,CAAC,oDAAA,EAAsD,qBAAA,EAAuB,6BAA6B,CAAA;AAAA,EAC3G;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,KAAA,EAAO,yCAAA;AAAA,QACP,KAAA,EAAO,2EAAA;AAAA,QACP,MAAA,EAAQ,0EAAA;AAAA,QACR,QAAA,EAAU;AAAA;AACX,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAEA,IAAMU,oBAAAA,GAAsBV,GAAAA;AAAA,EAC3B;AAAA,IACC,yCAAA;AAAA,IACA,8BAAA;AAAA,IACA,uBAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,2IAAA;AAAA,QACN,QAAA,EAAU,4BAAA;AAAA,QACV,MAAA,EAAQ,8DAAA;AAAA,QACR,OAAA,EAAS,8DAAA;AAAA,QACT,SAAA,EAAW,uEAAA;AAAA,QACX,QAAA,EAAU;AAAA;AACX,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAiBA,SAAS,WAAA,CAAY;AAAA,EACpB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACD,CAAA,EAAqB;AACpB,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,IAAY,KAAA,KAAU,aAAa,KAAA,KAAU,WAAA;AAElE,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAeW,YAAAA,CAAa;AAAA,IACtE,EAAA,EAAI,UAAA;AAAA,IACJ,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,cAAc,SAAA,EAAU;AAAA,IAC1D,UAAU,CAAC;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,aAAa,UAAA,GAAa,KAAA;AAG7C,EAAA,uBACCP,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,GAAA,EAAK,UAAA;AAAA,MACJ,GAAG,UAAA;AAAA,MACH,GAAG,SAAA;AAAA,MACJ,OAAA,EAAS,cAAc,QAAA,GAAW,MAAA;AAAA,MAClC,iBAAe,CAAC,WAAA;AAAA,MAChB,SAAA,EAAW,EAAA;AAAA,QACVM,oBAAAA,CAAoB,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,QACzC,WAAA,IAAe,qCAAA;AAAA,QACf,CAAC,WAAA,IAAe;AAAA,OACjB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAX,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,QAClC,+BAAeN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sEAAqE,QAAA,EAAA,MAAA,EAAC;AAAA;AAAA;AAAA,GACvG;AAEF;AAeA,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,aAAA,EAAe,UAAU,cAAA,EAAgB,eAAA,EAAiB,cAAa,EAAmB;AACtH,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAIa,YAAAA,CAAa;AAAA,IAC3C,EAAA,EAAI,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,IACvB,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,OAAO,EAAA,EAAG;AAAA,IAC5C;AAAA,GACA,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,cAAc,MAAA,GAAS,CAAA;AAE1C,EAAA,MAAM,WAAW,MAAiD;AACjE,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,IAAI,QAAQ,OAAO,OAAA;AACnB,IAAA,IAAI,YAAY,OAAO,QAAA;AACvB,IAAA,OAAO,OAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,KAAsE;AAC5F,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,QAAA,EAAU,MAAA,CAAO,EAAE,CAAA;AACjD,MAAA,MAAM,SAAA,GAAY,kBAAkB,OAAO,CAAA;AAC3C,MAAA,IAAI,SAAA,KAAc,MAAM,OAAO,SAAA;AAC/B,MAAA,IAAI,SAAA,KAAc,OAAO,OAAO,WAAA;AAAA,IACjC;AACA,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,OAAO,QAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCR,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAY,SAAA,EAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG,CAAC,CAAA,EAE3E,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACd,QAAA,kBAAAA,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,MAAA,CAAO,WAAA,EAAa,CAAA,EAC3C,CAAA;AAAA,IAGC,aAAA,CAAc,WAAW,CAAA,mBACzBN,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EAA2E,QAAA,EAAA,WAAA,EAAS,CAAA,mBAEnGA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,EAAE,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAM,qBAC/CA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEA,UAAA;AAAA,QACA,UAAU,MAAA,CAAO,EAAA;AAAA,QACjB,cAAc,MAAA,CAAO,EAAA;AAAA,QACrB,SAAA,EAAW,KAAA;AAAA,QACX,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,UAAU,QAAA,IAAY,YAAA;AAAA,QACtB,KAAA,EAAO,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA;AAAA,QAC9B,QAAA,EAAU,MAAM,cAAA,CAAe,UAAU;AAAA,OAAA;AAAA,MARpC;AAAA,KAUN,CAAA,EACF;AAAA,GAAA,EAEF,CAAA;AAEF;AAYA,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAQ,aAAA,EAAe,UAAS,EAAyB;AACnF,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAeY,YAAAA,CAAa;AAAA,IACtE,EAAA,EAAI,CAAA,KAAA,EAAQ,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,IACrB,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,OAAO,EAAA,EAAG;AAAA,IAC5C,QAAA,EAAU,YAAY,aAAA,IAAiB;AAAA,GACvC,CAAA;AAED,EAAA,IAAI,aAAA,IAAiB,GAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,WAAW,MAAwC;AACxD,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCP,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,UAAA,EAAY,SAAA,EAAW,GAAGM,oBAAAA,CAAoB,EAAE,KAAA,EAAO,QAAA,IAAY,CAAC,GAAI,GAAG,UAAA,EAAa,GAAG,SAAA,EACpG,QAAA,EAAA;AAAA,oBAAAX,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,OAAO,WAAA,EAAa,CAAA;AAAA,IACzC,gBAAgB,CAAA,oBAAKD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EAAqC,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,MAAE;AAAA,KAAA,EAAc;AAAA,GAAA,EAC5F,CAAA;AAEF;AAWA,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,QAAA,EAAS,EAAuB;AAClE,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAIQ,YAAAA,CAAa;AAAA,IAC3C,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IACrB;AAAA,GACA,CAAA;AAED,EAAA,uBACCb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACV,uCAAA;AAAA,QACA,kDAAA;AAAA,QACA,6BAAA;AAAA,QACA,WAAW,0BAAA,GAA6B,wCAAA;AAAA,QACxC,MAAA,IAAU,CAAC,QAAA,IAAY;AAAA,OACxB;AAAA,MAEC;AAAA;AAAA,GACF;AAEF;AAeO,SAAS,gBAAA,CAAiB;AAAA,EAChC,WAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf;AACD,CAAA,EAA0B;AAEzB,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACf,UAAU,aAAA,EAAe;AAAA,MACxB,oBAAA,EAAsB;AAAA,QACrB,QAAA,EAAU;AAAA;AACX,KACA;AAAA,GACF;AAGA,EAAA,MAAM,YAAA,GAAqBQ,eAAQ,MAAME,gBAAAA,CAAgB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAG9E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAUF,gBAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAqBA,eAAQ,MAAM;AACxC,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,OAAO,IAAI,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,YAAA,CAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACjH,IAAA,OAAO,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,YAAA,EAAc,WAAA,CAAY,aAAa,CAAC,CAAA;AAG5C,EAAA,MAAM,mBAAA,GAAsB,CAAC,QAAA,KAA6B;AACzD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,EAAG;AAClD,MAAA,KAAA,IAAS,QAAQ,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,QAAQ,CAAA,CAAE,MAAA;AAAA,IAClD;AACA,IAAA,OAAO,KAAA;AAAA,EACR,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAA4C;AACrE,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,EAAG,OAAO,GAAA;AAClC,IAAA,OAAO,MAAA,CAAO,QAAA,GAAW,mBAAA,CAAoB,MAAA,CAAO,EAAE,CAAA;AAAA,EACvD,CAAA;AAGA,EAAA,MAAM,mBAAA,GAAsB,CAAC,MAAA,KAA6C;AACzE,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,EAAE,GAAG,MAAA,IAAU,CAAA;AAClD,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,EAAG,OAAO,IAAA;AAClC,IAAA,OAAO,SAAS,MAAA,CAAO,QAAA;AAAA,EACxB,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC9C,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,OAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,OAAA;AAG3B,IAAA,IAAI,QAAA,EAAU,IAAA,KAAS,MAAA,IAAU,UAAA,EAAY,SAAS,QAAA,EAAU;AAC/D,MAAA,MAAM,eAAe,UAAA,CAAW,YAAA;AAChC,MAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAE7B,MAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,OAAO,cAAc,QAAA,EAAU;AAGvE,MAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,MAAA,MAAM,UAAA,GAAa,SAAS,YAAY,CAAA;AACxC,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,QAAA,CAAS,YAAY,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,SAAS,CAAA;AACpE,QAAA,IAAI,QAAA,CAAS,YAAY,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACxC,UAAA,OAAO,SAAS,YAAY,CAAA;AAAA,QAC7B;AAAA,MACD;AAEA,MAAA,cAAA,GAAiBC,cAAAA,CAAc,QAAQ,CAAC,CAAA;AACxC,MAAA;AAAA,IACD;AAGA,IAAA,IAAI,QAAA,EAAU,SAAS,QAAA,EAAU;AACjC,IAAA,MAAM,aAAa,QAAA,CAAS,QAAA;AAC5B,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAEpC,IAAA,MAAM,QAAA,GAAW,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,UAAU,CAAA;AAC1E,IAAA,IAAI,CAAC,QAAA,EAAU;AAGf,IAAA,IAAI,UAAA,EAAY,SAAS,QAAA,EAAU;AAClC,MAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,MAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAElC,MAAA,MAAM,MAAA,GAAS,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACtE,MAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,MAAA,IAAI,gBAAA,CAAiB,MAAM,CAAA,IAAK,CAAA,EAAG;AACnC,MAAA,IAAI,CAAC,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AAGpC,MAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,MAAA,IAAI,CAAC,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,UAAU,IAAI,EAAC;AAAA,MACzB;AACA,MAAA,QAAA,CAAS,UAAU,CAAA,GAAI,CAAC,GAAG,QAAA,CAAS,UAAU,GAAG,QAAQ,CAAA;AAEzD,MAAA,cAAA,GAAiBA,cAAAA,CAAc,QAAQ,CAAC,CAAA;AACxC,MAAA;AAAA,IACD;AAGA,IAAA,IAAI,UAAA,EAAY,SAAS,QAAA,EAAU;AAClC,MAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,MAAA,MAAM,eAAe,UAAA,CAAW,YAAA;AAChC,MAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAE7B,MAAA,IAAI,OAAO,aAAa,QAAA,IAAY,OAAO,iBAAiB,QAAA,IAAY,OAAO,cAAc,QAAA,EAAU;AAGvG,MAAA,IAAI,iBAAiB,UAAA,EAAY;AAGjC,MAAA,IAAI,CAAC,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AAGpC,MAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,MAAA,MAAM,UAAA,GAAa,SAAS,YAAY,CAAA;AACxC,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,QAAA,CAAS,YAAY,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,SAAS,CAAA;AACpE,QAAA,IAAI,QAAA,CAAS,YAAY,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACxC,UAAA,OAAO,SAAS,YAAY,CAAA;AAAA,QAC7B;AAAA,MACD;AAGA,MAAA,IAAI,CAAC,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,UAAU,IAAI,EAAC;AAAA,MACzB;AACA,MAAA,QAAA,CAAS,UAAU,CAAA,GAAI,CAAC,GAAG,QAAA,CAAS,UAAU,GAAG,QAAQ,CAAA;AAEzD,MAAA,cAAA,GAAiBA,cAAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,IACzC;AAAA,EACD,CAAA;AAGA,EAAA,MAAM,kBAAA,GAAqB,CAAC,QAAA,EAAkB,KAAA,KAAkB;AAC/D,IAAA,IAAI,YAAY,YAAA,EAAc;AAE9B,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,IAAA,MAAM,OAAA,GAAU,SAAS,QAAQ,CAAA;AACjC,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,QAAQ,IAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,KAAK,CAAA;AACzD,MAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACpC,QAAA,OAAO,SAAS,QAAQ,CAAA;AAAA,MACzB;AAAA,IACD;AAEA,IAAA,cAAA,GAAiBA,cAAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,EACzC,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAqB;AAC9C,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAQ,CAAA,IAAK,EAAC;AAC7C,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,KAAU;AACzC,MAAA,MAAM,MAAA,GAAS,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACtE,MAAA,OAAO;AAAA,QACN,YAAY,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,KAAK,CAAA,CAAA;AAAA,QAC5C,MAAA,EAAQ,UAAU,EAAE,EAAA,EAAI,UAAU,WAAA,EAAa,QAAA,EAAU,UAAU,CAAA,EAAE;AAAA,QACrE;AAAA,OACD;AAAA,IACD,CAAC,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,uBACCJ,IAAAA;AAAA,IAACS,UAAAA;AAAA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,kBAAA,EAAoBC,aAAAA;AAAA,MACpB,WAAA,EAAa,CAAC,CAAA,KAAM;AACnB,QAAA,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,MACpC,CAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,UAAA,WAAA,CAAY,UAAA,oBACZL,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACd,QAAA,kBAAAA,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,WAAA,CAAY,YAAY,CAAA,EAC/C,CAAA;AAAA,UAIA,CAAC,YAAA,oBACDD,IAAAA,CAAC,iBAAc,QAAA,EACb,QAAA,EAAA;AAAA,YAAA,WAAA,CAAY,aAAA,CAAc,GAAA,CAAI,CAAC,MAAA,qBAC/BL,GAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBAEA,MAAA;AAAA,gBACA,aAAA,EAAe,iBAAiB,MAAM,CAAA;AAAA,gBACtC;AAAA,eAAA;AAAA,cAHK,MAAA,CAAO;AAAA,aAKb,CAAA;AAAA,YACA,WAAA,CAAY,aAAA,CAAc,KAAA,CAAM,CAAC,MAAM,gBAAA,CAAiB,CAAC,CAAA,IAAK,CAAC,qBAC/DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAgC,QAAA,EAAA,kBAAA,EAAgB;AAAA,WAAA,EAEjE,CAAA;AAAA,0BAIDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,sBAAY,aAAA,CAAc,GAAA,CAAI,CAAC,MAAA,qBAC/BA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cAEA,MAAA;AAAA,cACA,aAAA,EAAe,gBAAA,CAAiB,MAAA,CAAO,EAAE,CAAA;AAAA,cACzC,UAAU,QAAA,IAAY,YAAA;AAAA,cACtB,cAAA,EAAgB,CAAC,UAAA,KAAe;AAC/B,gBAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,MAAA,CAAO,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,KAAe,UAAU,CAAA;AACtF,gBAAA,IAAI,UAAU,EAAA,EAAI;AACjB,kBAAA,kBAAA,CAAmB,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,gBACpC;AAAA,cACD,CAAA;AAAA,cACA,eAAA;AAAA,cACA;AAAA,aAAA;AAAA,YAXK,MAAA,CAAO;AAAA,WAab,CAAA,EACF;AAAA,SAAA,EACD,CAAA;AAAA,wBAGAA,GAAAA,CAACgB,WAAAA,EAAA,EAAY,aAAA,EAAe,IAAA,EAC1B,QAAA,EAAA,YAAA,mBACAhB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAGW,oBAAAA,CAAoB,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,2BAA2B,CAAA,EACrF,QAAA,kBAAAX,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,YAAA,CAAa,WAAA,EAAa,CAAA,EACjD,IACG,IAAA,EACL;AAAA;AAAA;AAAA,GACD;AAEF;ACvhBA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAA2B;AAC9D,EAAA,uBACCD,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACN,SAAA;AAAA,MACA,aAAA,EAAY,MAAA;AAAA,MACZ,IAAA,EAAK,KAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,WAAM,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBAClBA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACA,CAAA,EAAE,kwBAAA;AAAA,YACF,IAAA,EAAK,cAAA;AAAA,YACL,QAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAS;AAAA;AAAA;AACV;AAAA;AAAA,GACD;AAEF;AAGA,SAAS,YAAA,CAAa;AAAA,EACrB,EAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACD,CAAA,EAKG;AACF,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,EAAW,GAAI,WAAA,CAAY,EAAE,EAAA,EAAI,QAAA,EAAU,CAAA;AAE7G,EAAA,MAAM,KAAA,GAAQ;AAAA,IACb,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,IAC3C,UAAA;AAAA,IACA,OAAA,EAAS,aAAa,GAAA,GAAM,CAAA;AAAA,IAC5B,MAAA,EAAQ,aAAa,EAAA,GAAM;AAAA,GAC5B;AAEA,EAAA,uBACCK,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,KAAA;AAAA,MACC,GAAG,UAAA;AAAA,MACH,GAAG,SAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACV,kEAAA;AAAA;AAAA,QAEA,eACG,sEAAA,GACA,oCAAA;AAAA,QACH,WACG,uCAAA,GACA;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAC,YAAA,oBACDL,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA,EACjB,CAAA;AAAA,wBAEDA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,EAAa;AAAA;AAAA;AAAA,GACjC;AAEF;AAGA,SAAS,eAAA,CAAgB,EAAE,WAAA,EAAa,YAAA,EAAa,EAAmD;AACvG,EAAA,uBACCK,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,+EAAA;AAAA,QACA,eAAe,0DAAA,GAA6D;AAAA,OAC7E;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAC,YAAA,oBACDL,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA,EACjB,CAAA;AAAA,wBAEDA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,EAAa;AAAA;AAAA;AAAA,GACjC;AAEF;AAYO,SAAS,gBAAA,CAAiB;AAAA,EAChC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAA,EAA0B;AAEzB,EAAA,MAAM,KAAA,GAAciB,eAAQ,MAAM;AACjC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAEpC,MAAA,MAAM,SAA0B,EAAC;AACjC,MAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AAC1B,QAAA,MAAM,KAAA,GAAQ,YAAY,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACzD,QAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,MAAA;AAAA,IACR;AACA,IAAA,OAAO,WAAA,CAAY,OAAA;AAAA,EACpB,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,CAAY,OAAO,CAAC,CAAA;AAGlC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,UAAA,GAAmBA,MAAA,CAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA,EAAG,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAE9F,EAAA,MAAM,OAAA,GAAUC,UAAAA;AAAA,IACfC,UAAUC,aAAa,CAAA;AAAA,IACvBD,UAAU,cAAA,EAAgB;AAAA,MACzB,gBAAA,EAAkB;AAAA,KAClB;AAAA,GACF;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAA0B;AAClD,IAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,EAAA;AACxB,IAAA,WAAA,CAAY,OAAO,EAAA,KAAO,QAAA,GAAW,EAAA,GAAK,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC9C,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,WAAA,CAAY,IAAI,CAAA;AAEhB,IAAA,IAAI,IAAA,IAAQ,MAAA,CAAO,EAAA,KAAO,IAAA,CAAK,EAAA,EAAI;AAClC,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,OAAO,EAAE,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,KAAK,EAAE,CAAA;AAE9D,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA;AAGpD,MAAA,cAAA,GAAiB,SAAS,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACjD;AAAA,EACD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,WAAA,KAAgB,YAAA;AACjD,EAAA,MAAM,QAAA,GAAW,eAAe,6BAAA,GAAgC,2BAAA;AAGhE,EAAA,MAAM,aAAA,GAA+B;AAAA,IACpC,aAAa,+BAAA,CAAgC;AAAA,MAC5C,QAAQ,EAAE,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAM;AAAE,KACrC;AAAA,GACF;AAGA,EAAA,MAAM,qBAAqB,MAAM;AAChC,IAAA,IAAI,CAAC,YAAA,EAAc;AAClB,MAAA,OAAO,gCAAA;AAAA,IACR;AACA,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,OAAO,sBAAA;AAAA,IACR;AACA,IAAA,OAAO,gCAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCd,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,IAAA,WAAA,CAAY,8BAAcL,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,YAAY,UAAA,EAAY,CAAA;AAAA,oBAEtEK,IAAAA;AAAA,MAACS,UAAAA;AAAA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,kBAAA,EAAoBC,aAAAA;AAAA,QACpB,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,aAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAAf,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAG,QAAA,EAAoB,QAAA,EAAU,QAAA,IAAY,cACzF,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACV,2CAAA;AAAA,gBACA,eAAe,sBAAA,GAAyB,qBAAA;AAAA,gBACxC,kBAAA;AAAmB,eACpB;AAAA,cAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACXA,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBAEA,IAAI,IAAA,CAAK,EAAA;AAAA,kBACT,aAAa,IAAA,CAAK,WAAA;AAAA,kBAClB,QAAA,EAAU,CAAC,EAAE,QAAA,IAAY,YAAA,CAAA;AAAA,kBACzB;AAAA,iBAAA;AAAA,gBAJK,IAAA,CAAK;AAAA,eAMX;AAAA;AAAA,WACF,EACD,CAAA;AAAA,0BAGAA,GAAAA,CAACgB,WAAAA,EAAA,EAAY,eACX,QAAA,EAAA,UAAA,mBAAahB,GAAAA,CAAC,eAAA,EAAA,EAAgB,WAAA,EAAa,UAAA,CAAW,WAAA,EAAa,YAAA,EAA4B,IAAK,IAAA,EACtG;AAAA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;ACvOA,IAAM,iBAAA,GAAoBC,GAAAA;AAAA,EACzB;AAAA;AAAA,IAEC,yCAAA;AAAA,IACA,2CAAA;AAAA,IACA,uEAAA;AAAA,IACA,8CAAA;AAAA;AAAA,IACA,+CAAA;AAAA,IACA,6BAAA;AAAA,IACA,8CAAA;AAAA;AAAA,IAEA,sCAAA;AAAA,IACA,oBAAA;AAAA;AAAA,IAEA,iDAAA;AAAA;AAAA,IAEA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,mDAAA;AAAA,UACA,mDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,mDAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,QAAA,EAAU;AAAA,UACT,qDAAA;AAAA,UACA,iDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,mDAAA;AAAA,UACA,4CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,gDAAA;AAAA,UACA,4CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,mDAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA;AACD;AACD,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS;AAAA;AACV;AAEF,CAAA;AAkDO,SAAS,oBAAA,CAAqB;AAAA,EACpC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACD,CAAA,EAA8B;AAC7B,EAAA,MAAM,QAAQ,QAAA,IAAY,EAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAOhC,EAAA,MAAM,mBAAmB,MAAwB;AAChD,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC7B,MAAA,OAAO,YAAY,KAAA,GAAQ,UAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,OAAO,OAAA;AAAA,IACR;AACA,IAAA,OAAO,SAAA;AAAA,EACR,CAAA;AACA,EAAA,MAAM,gBAAgB,gBAAA,EAAiB;AAIvC,EAAA,MAAM,SAAA,GAAY,YAAY,cAAA,IAAkB,EAAA;AAChD,EAAA,MAAM,aAAa,CAAA,EAAG,IAAA,CAAK,IAAI,SAAA,EAAW,CAAC,IAAI,CAAC,CAAA,EAAA,CAAA;AAEhD,EAAA,uBACCD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACd,QAAA,kBAAAA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,MAAA;AAAA,MACL,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,cAAA,GAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MAChD,UAAU,QAAA,IAAY,YAAA;AAAA,MACtB,WAAA,EAAa,YAAY,WAAA,IAAe,KAAA;AAAA,MACxC,SAAS,WAAA,CAAY,WAAA;AAAA,MACrB,WAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,OAAA,EAAS,aAAA,EAAe,CAAC,CAAA;AAAA,MAC3D,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,KAAA,EAAM;AAAA,MAC5C,cAAA,EAAc,YAAA,IAAgB,QAAA,IAAY,SAAA,KAAc,QAAQ,IAAA,GAAO;AAAA;AAAA,GACxE,EACD,CAAA;AAEF;AAUO,SAAS,eAAA,CAAgB;AAAA,EAC/B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACD,CAAA,EAAyB;AACxB,EAAA,MAAM,QAAQ,QAAA,IAAY,EAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAOhC,EAAA,MAAM,mBAAmB,MAAwB;AAChD,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC7B,MAAA,OAAO,YAAY,KAAA,GAAQ,UAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,OAAO,OAAA;AAAA,IACR;AACA,IAAA,OAAO,SAAA;AAAA,EACR,CAAA;AACA,EAAA,MAAM,gBAAgB,gBAAA,EAAiB;AAIvC,EAAA,MAAM,SAAA,GAAY,MAAM,cAAA,IAAkB,CAAA;AAC1C,EAAA,MAAM,aAAa,CAAA,EAAG,IAAA,CAAK,IAAI,SAAA,EAAW,CAAC,IAAI,CAAC,CAAA,EAAA,CAAA;AAEhD,EAAA,uBACCA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,MAAA;AAAA,MACL,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,cAAA,GAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MAChD,UAAU,QAAA,IAAY,YAAA;AAAA,MACtB,WAAA,EAAY,KAAA;AAAA,MACZ,SAAS,KAAA,CAAM,WAAA;AAAA,MACf,SAAA,EAAW,GAAG,iBAAA,CAAkB,EAAE,SAAS,aAAA,EAAe,GAAG,gBAAgB,CAAA;AAAA,MAC7E,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,KAAA,EAAM;AAAA,MAC5C,cAAA,EAAc,YAAA,IAAgB,QAAA,IAAY,SAAA,KAAc,QAAQ,IAAA,GAAO;AAAA;AAAA,GACxE;AAEF;AC9LA,SAAS,qBAAA,CAAsB;AAAA,EAC9B,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAA,EAOG;AACF,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AACnD,EAAA,MAAM,cAAA,GAAuBqB,cAAO,KAAK,CAAA;AAGzC,EAAMA,iBAAU,MAAM;AAErB,IAAA,IAAI,eAAe,OAAA,EAAS;AAC5B,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,IAAA,MAAM,eAAe,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACxD,IAAA,cAAA,CAAe,WAAA,CAAY,YAAY,YAAY,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,CAAY,SAAS,WAAA,CAAY,UAAA,EAAY,cAAc,CAAC,CAAA;AAG1E,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,aAAA,GAAgB,QAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACxC,IAAA,aAAA,GAAgB,CAAC,QAAQ,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,QAAA,GAAW,mBAAA,GAAsB,WAAA,CAAY,UAAU,CAAA;AAE7D,EAAA,uBACChB,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAtB,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,gBAAgB,CAAC,GAAA,KAAQ,cAAA,GAAiB,WAAA,CAAY,YAAY,GAAG,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,YAAA,EAAc,YAAA;AAAA,QACd,WAAW,QAAA,EAAU;AAAA;AAAA,KACtB;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACA,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,YAAA;AAAA,QACA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;AAUA,SAAS,wBAAA,CAAyB;AAAA,EACjC,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACD,CAAA,EAQG;AACF,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AAGnD,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,aAAA,GAAgB,QAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,EAAU;AACpD,IAAA,aAAA,GAAgB,CAAC,QAAQ,CAAA;AAAA,EAC1B;AAIA,EAAA,MAAM,cAAA,GAAuBqB,eAAQ,MAAM;AAC1C,IAAA,MAAM,OAAA,GAAU,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAClE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAA,EAAc,OAAO,MAAA;AAEtC,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAE5B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,MAAA,IAAI,KAAA,EAAO;AACV,QAAA,MAAA,CAAO,KAAK,IAAI,KAAA,CAAM,SAAA;AAAA,MACvB;AAAA,IACD;AACA,IAAA,OAAO,MAAA;AAAA,EACR,GAAG,CAAC,yBAAA,EAA2B,WAAA,CAAY,UAAA,EAAY,YAAY,CAAC,CAAA;AAEpE,EAAA,uBACChB,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAtB,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,gBAAgB,CAAC,GAAA,KAAQ,cAAA,GAAiB,WAAA,CAAY,YAAY,GAAG,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,YAAA,EAAc,YAAA;AAAA,QACd;AAAA;AAAA,KACD;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACA,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,YAAA;AAAA,QACA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;AAUA,SAAS,qBAAA,CAAsB;AAAA,EAC9B,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACD,CAAA,EAQG;AACF,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AAGnD,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,aAAA,GAAgB,QAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,EAAU;AACpD,IAAA,aAAA,GAAgB,CAAC,QAAQ,CAAA;AAAA,EAC1B;AAIA,EAAA,MAAM,eAAA,GAAwBqB,eAAQ,MAAM;AAC3C,IAAA,MAAM,OAAA,GAAU,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAClE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAA,EAAc,OAAO,MAAA;AAEtC,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAE5B,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA,CAAM,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,MAAA;AAAA,EACR,GAAG,CAAC,yBAAA,EAA2B,WAAA,CAAY,UAAA,EAAY,YAAY,CAAC,CAAA;AAEpE,EAAA,uBACChB,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAtB,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,gBAAgB,CAAC,GAAA,KAAQ,cAAA,GAAiB,WAAA,CAAY,YAAY,GAAG,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,YAAA,EAAc,YAAA;AAAA,QACd;AAAA;AAAA,KACD;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACA,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,YAAA;AAAA,QACA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;AAsHO,SAAS,oBAAA,CAAqB;AAAA,EACpC,KAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACD,CAAA,EAA8B;AAC7B,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC9B,IAAA,uBAAOA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,KAAA,CAAM,IAAA,EAAM,WAAU,MAAA,EAAO,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AAElC,IAAA,MAAM,cAAA,GAAiB;AAAA,MACtB,GAAG,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,YAAY,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAAA,MAC5D,GAAG,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,UAAU,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU;AAAA,KAC3D;AAEA,IAAA,uBACCK,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAtB,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACA,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,SAAA,EAAU,MAAA;AAAA,UACV,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,YAAA,EAAc,CAAC,KAAA,KAAU;AACxB,YAAA,MAAM,gBAAgB,MAAM;AAC3B,cAAA,MAAM,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,UAAU,CAAA;AACtC,cAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,EAAA;AAAA,YACpC,CAAA,GAAG;AAEH,YAAA,MAAM,mBAAA,GAAsB,yBAAA,GAA4B,KAAA,CAAM,UAAU,CAAA;AACxE,YAAA,MAAM,iBAAA,GACL,mBAAA,IAAuB,YAAA,GACpB,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,YAAY,CAAA,EAAG,SAAA,GACxD,MAAA;AACJ,YAAA,uBACCA,GAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACA,KAAA;AAAA,gBACA,QAAA,EAAU,YAAA;AAAA,gBACV,cAAA,EAAgB,CAAC,CAAA,KAAM;AACtB,kBAAA,IAAI,cAAA,EAAgB,cAAA,CAAe,KAAA,CAAM,UAAA,EAAY,CAAC,CAAA;AAAA,gBACvD,CAAA;AAAA,gBACA,UAAU,QAAA,IAAY,YAAA;AAAA,gBACtB,YAAA,EAAc,YAAA;AAAA,gBACd,SAAA,EAAW;AAAA;AAAA,aACZ;AAAA,UAEF,CAAA;AAAA,UACA,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC3B,YAAA,MAAM,gBAAgB,MAAM;AAC3B,cAAA,MAAM,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,UAAU,CAAA;AACtC,cAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,EAAA;AAAA,YACpC,CAAA,GAAG;AAEH,YAAA,MAAM,QAAA,GAAW,mBAAA,GAAsB,KAAA,CAAM,UAAU,CAAA;AACvD,YAAA,uBACCA,GAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBAEA,KAAA;AAAA,gBACA,QAAA,EAAU,YAAA;AAAA,gBACV,cAAA,EAAgB,CAAC,CAAA,KAAM;AACtB,kBAAA,IAAI,cAAA,EAAgB,cAAA,CAAe,KAAA,CAAM,UAAA,EAAY,CAAC,CAAA;AAAA,gBACvD,CAAA;AAAA,gBACA,UAAU,QAAA,IAAY,YAAA;AAAA,gBACtB,YAAA,EAAc,YAAA;AAAA,gBACd,WAAW,QAAA,EAAU;AAAA,eAAA;AAAA,cARhB,KAAA,CAAM;AAAA,aASZ;AAAA,UAEF;AAAA;AAAA,OACD;AAAA,MACC,cAAA,CAAe,GAAA,CAAI,CAAC,UAAA,qBACpBA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UAEA,UAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SAAA;AAAA,QAHK,MAAM,UAAU,CAAA;AAAA,OAKtB;AAAA,KAAA,EACF,CAAA;AAAA,EAEF;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,WAAA,EAAa;AACtD,IAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAG1B,IAAA,IAAI,WAAA,CAAY,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AACnD,MAAA,MAAM,YAAA,GAAe,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,EAAA;AAC/D,MAAA,MAAM,QAAA,GAAW,mBAAA,GAAsB,WAAA,CAAY,UAAU,CAAA;AAE7D,MAAA,uBACCK,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAtB,GAAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACA,WAAA;AAAA,YACA,QAAA,EAAU,YAAA;AAAA,YACV,cAAA,EAAgB,CAAC,KAAA,KAAU;AAC1B,cAAA,IAAI,cAAA,EAAgB;AACnB,gBAAA,cAAA,CAAe,WAAA,CAAY,YAAY,KAAK,CAAA;AAAA,cAC7C;AAAA,YACD,CAAA;AAAA,YACA,QAAA;AAAA,YACA,YAAA,EAAc,YAAA;AAAA,YACd,WAAW,QAAA,EAAU;AAAA;AAAA,SACtB;AAAA,wBACAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,YAAY,WAAA,CAAY,UAAA;AAAA,YACxB,YAAA;AAAA,YACA;AAAA;AAAA;AACD,OAAA,EACD,CAAA;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,QAAA,EAAU;AAClC,MAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AAGnD,MAAA,IAAI,WAAqB,EAAC;AAC1B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,QAAA,QAAA,GAAW,QAAA;AAAA,MACZ,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACxC,QAAA,QAAA,GAAW,CAAC,QAAQ,CAAA;AAAA,MACrB;AACA,MAAA,MAAM,mBAAA,GAAsB,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAC9E,MAAA,MAAM,iBAAA,GAAoB,mBAAA,GACvB,IAAI,GAAA,CAAI,oBAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,EAAA,EAAI,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA,GAC3D,MAAA;AACH,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,YAAY,WAAA,KAAgB,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,KAAK,iBAAA,EAAmB;AACvF,QAAA,MAAM,cAAA,GAAiB,SAAS,CAAC,CAAA;AACjC,QAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACvC,UAAA,eAAA,GAAkB,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAA,KAAM,IAAA;AAAA,QAC7D;AAAA,MACD;AAEA,MAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAmD;AAC/E,QAAA,OAAO;AAAA,UACN,IAAA,EAAM,mBAAA;AAAA,UACN,oBAAoB,CAAA,CAAE,UAAA;AAAA,UACtB,OAAA,EAAS,KAAA;AAAA,UACT,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAC9B,YAAY,CAAA,CAAE,EAAA;AAAA,YACd,aAAa,CAAA,CAAE,WAAA;AAAA,YACf,oBAAoB,CAAA,CAAE;AAAA,WACvB,CAAE;AAAA,SACH;AAAA,MACD,CAAA;AAEA,MAAA,uBACCK,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAtB,GAAAA;AAAA,UAAC,yBAAA;AAAA,UAAA;AAAA,YACA,WAAA,EAAa,oBAAoB,WAAW,CAAA;AAAA,YAC5C,QAAA;AAAA,YACA,cAAA,EAAgB,CAAC,KAAA,KAAU;AAC1B,cAAA,IAAI,cAAA,EAAgB;AACnB,gBAAA,cAAA,CAAe,WAAA,CAAY,YAAY,KAAK,CAAA;AAAA,cAC7C;AAAA,YACD,CAAA;AAAA,YACA,QAAA;AAAA,YACA,YAAA,EAAc,YAAA;AAAA,YACd,SAAA,EAAW,eAAA;AAAA,YACX,6BAA6B,MAAM;AAClC,cAAA,MAAM,OAAA,GAAU,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAClE,cAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,cAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA;AAC7D,cAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,KAAM,IAAA,EAAK,CAAE,CAAA;AAAA,YACxE,CAAA;AAAG;AAAA,SACJ;AAAA,wBACAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,YAAY,WAAA,CAAY,UAAA;AAAA,YACxB,YAAA;AAAA,YACA;AAAA;AAAA;AACD,OAAA,EACD,CAAA;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,OAAA,EAAS;AACjC,MAAA,uBACCA,GAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA;AAAA,OACD;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,UAAA,EAAY;AACpC,MAAA,uBACCA,GAAAA;AAAA,QAAC,wBAAA;AAAA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,mBAAA;AAAA,UACA;AAAA;AAAA,OACD;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,OAAA,EAAS;AACjC,MAAA,uBACCA,GAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,mBAAA;AAAA,UACA;AAAA;AAAA,OACD;AAAA,IAEF;AAAA,EACD;AAGA,EAAA,OAAO,IAAA;AACR;AAmCO,SAAS,WAAA,CAAY;AAAA,EAC3B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA,GAAQ,UAAA;AAAA,EACR,YAAA,GAAe,KAAA;AAAA,EACf,QAAA,GAAW,KAAA;AAAA,EACX,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACD,CAAA,EAAqB;AAEpB,EAAA,MAAM,SAAA,GAAY,KAAA,KAAU,UAAA,GAAa,MAAA,GAAY,KAAA;AAErD,EAAA,uBACCK,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,SAAS,CAAA,EAAG,gBAAA,EAAgB,SAAA,EAC/D,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA,IAAA,CAAK,cAAc,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAC/BA,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QAEA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA,EAAgB,gBAAA;AAAA,QAChB,YAAA;AAAA,QACA,QAAA;AAAA,QACA,yBAAA,EAA2B,iBAAA;AAAA,QAC3B,mBAAA,EAAqB;AAAA,OAAA;AAAA,MAPhB;AAAA,KASN,CAAA,EACF,CAAA;AAAA,IAGC,gBAAgB,eAAA,EAAiB,WAAA,oBACjCA,GAAAA,CAAC,SAAI,SAAA,EAAU,uBAAA,EAAwB,cAAA,EAAc,eAAA,CAAgB,WACpE,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,eAAA,CAAgB,aAAa,CAAA,EACjD;AAAA,GAAA,EAEF,CAAA;AAEF;ACvoBA,SAAS,eAAA,CAAgB,KAAa,aAAA,EAAgC;AACrE,EAAA,MAAM,CAAA,GAAA,CAAK,GAAA,IAAO,EAAA,EAAI,IAAA,EAAK;AAC3B,EAAA,OAAO,aAAA,GAAgB,CAAA,GAAI,CAAA,CAAE,WAAA,EAAY;AAC1C;AAKA,SAAS,cAAA,CACR,SAAA,EACA,IAAA,EACA,SAAA,EACA,eAAA,EACU;AAEV,EAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAC7B,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAoB,cAAA,CAAe,CAAA,EAAG,IAAA,EAAM,SAAA,EAAW,eAAe,CAAC,CAAA;AACjH,IAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAe,MAAM,IAAI,CAAA;AACxD,IAAO,aAAM,uCAAA,EAAyC;AAAA,MACrD,aAAA,EAAe,UAAU,UAAA,CAAW,MAAA;AAAA,MACpC,OAAA;AAAA,MACA;AAAA,KACA,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACR;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,IAAA,EAAM;AAC5B,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAoB,cAAA,CAAe,CAAA,EAAG,IAAA,EAAM,SAAA,EAAW,eAAe,CAAC,CAAA;AACjH,IAAA,MAAM,UAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAe,MAAM,IAAI,CAAA;AACvD,IAAO,aAAM,sCAAA,EAAwC;AAAA,MACpD,aAAA,EAAe,UAAU,UAAA,CAAW,MAAA;AAAA,MACpC,OAAA;AAAA,MACA;AAAA,KACA,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACR;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAC7B,IAAA,MAAM,SAAS,cAAA,CAAe,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,WAAW,eAAe,CAAA;AACnF,IAAO,aAAM,uCAAA,EAAyC,EAAE,QAAQ,OAAA,EAAS,CAAC,QAAQ,CAAA;AAClF,IAAA,OAAO,CAAC,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,OAAA,EAAS;AAC/B,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,SAAA,CAAU,QAAQ,CAAA;AACjD,IAAO,aAAM,yCAAA,EAA2C;AAAA,MACvD,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,SAAA,EAAW,MAAA;AAAA,MACX,SAAS,MAAA,KAAW;AAAA,KACpB,CAAA;AACD,IAAA,OAAO,MAAA,KAAW,IAAA;AAAA,EACnB;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,YAAA,EAAc;AACpC,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,SAAA,CAAU,QAAQ,CAAA;AACjD,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAChC,MAAA,UAAA,GAAa,YAAA;AAAA,IACd,WAAW,YAAA,EAAc;AACxB,MAAA,UAAA,GAAa,CAAC,YAAY,CAAA;AAAA,IAC3B,CAAA,MAAO;AACN,MAAA,UAAA,GAAa,EAAC;AAAA,IACf;AACA,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA;AACnD,IAAO,aAAM,8CAAA,EAAgD;AAAA,MAC5D,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,aAAa,SAAA,CAAU,KAAA;AAAA,MACvB,UAAA;AAAA,MACA;AAAA,KACA,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACR;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACrC,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,SAAA,CAAU,QAAQ,CAAA;AACjD,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,YAAA,CAAa,CAAC,CAAA,GAAI,YAAA;AAC5D,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AAEjB,IAAA,MAAM,IAAI,eAAA,CAAgB,MAAA,CAAO,GAAG,CAAA,EAAG,UAAU,aAAa,CAAA;AAC9D,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,SAAA,CAAU,KAAA,EAAO,UAAU,aAAa,CAAA;AAClE,IAAA,MAAM,UAAU,CAAA,KAAM,CAAA;AACtB,IAAO,aAAM,qCAAA,EAAuC;AAAA,MACnD,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,eAAe,SAAA,CAAU,aAAA;AAAA,MACzB;AAAA,KACA,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACR;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAChC,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,SAAA,CAAU,QAAQ,CAAA;AACjD,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAChC,MAAA,UAAA,GAAa,YAAA;AAAA,IACd,WAAW,YAAA,EAAc;AACxB,MAAA,UAAA,GAAa,CAAC,YAAY,CAAA;AAAA,IAC3B,CAAA,MAAO;AACN,MAAA,UAAA,GAAa,EAAC;AAAA,IACf;AACA,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA;AACnD,IAAO,aAAM,gCAAA,EAAkC;AAAA,MAC9C,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,QAAQ,SAAA,CAAU,KAAA;AAAA,MAClB,UAAA;AAAA,MACA;AAAA,KACA,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACR;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,kBAAA,EAAoB;AAC1C,IAAA,MAAM,aAAa,SAAA,CAAU,QAAA;AAC7B,IAAA,MAAM,YAAA,GAAe,UAAU,UAAU,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,KAAK,oBAAA,CAAqB,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,eAAe,UAAU,CAAA;AAExF,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,YAAA,EAAc,SAAS,OAAO,KAAA;AAEpD,IAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,YAAA,GAAe,CAAC,YAAY,CAAA;AAC7E,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,YAAA,CAAa,QAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAElF,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC7B,MAAA,GAAA,IAAO,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,IAAK,aAAa,OAAA,CAAQ,YAAA;AAAA,IAClD;AAGA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,MAAM,CAAA;AAClC,IAAA,MAAM,UAAU,IAAA,GAAO,IAAA;AAEvB,IAAO,aAAM,0CAAA,EAA4C;AAAA,MACxD,UAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAQ,SAAA,CAAU,KAAA;AAAA,MAClB;AAAA,KACA,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACR;AAEA,EAAA,OAAO,KAAA;AACR;AAKA,SAAS,YAAA,CACR,IAAA,EACA,IAAA,EACA,SAAA,EACA,eAAA,EACW;AACX,EAAA,MAAM,cAAwB,EAAC;AAG/B,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC3B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IACC,MAAA,CAAO,IAAA,KAAS,iBAAA,KACf,MAAA,CAAO,UAAA,KAAe,mBAAA,IACtB,MAAA,CAAO,UAAA,KAAe,oBAAA,IACtB,MAAA,CAAO,UAAA,KAAe,UAAA,CAAA,EACtB;AACD,MAAO,MAAA,CAAA,KAAA,CAAM,mCAAmC,EAAE,EAAA,EAAI,OAAO,UAAA,EAAY,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AAC9F,MAAA,WAAA,CAAY,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,WAAA;AAAA,EACR;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAE9B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,QAAA,EAAU;AACnC,MAAA,MAAM,OAAA,GAAU,OAAO,SAAA,GAAY,cAAA,CAAe,OAAO,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,eAAe,CAAA,GAAI,IAAA;AAExG,MAAO,aAAM,kCAAA,EAAoC;AAAA,QAChD,YAAA,EAAc,CAAC,CAAC,MAAA,CAAO,SAAA;AAAA,QACvB;AAAA,OACA,CAAA;AAED,MAAA,IAAI,OAAA,EAAS;AAEZ,QAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,CAAQ,MAAA;AAAA,UACtC,CAAC,CAAA,KACA,CAAA,CAAE,IAAA,KAAS,iBAAA,KACV,CAAA,CAAE,UAAA,KAAe,mBAAA,IACjB,CAAA,CAAE,UAAA,KAAe,oBAAA,IACjB,CAAA,CAAE,UAAA,KAAe,UAAA;AAAA,SACpB;AACA,QAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACrC,UAAA,WAAA,CAAY,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,QAC9B;AAGA,QAAA,IAAI,OAAO,WAAA,EAAa;AACvB,UAAA,KAAA,MAAW,MAAA,IAAU,OAAO,WAAA,EAAa;AACxC,YAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,WAAW,eAAe,CAAA;AACvE,YAAA,WAAA,CAAY,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,UAC9B;AAAA,QACD;AAIA,QAAA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,EAAA,OAAO,WAAA;AACR;AAKO,SAAS,2BAAA,CACf,IAAA,EACA,SAAA,EACA,eAAA,EACW;AACX,EAAA,MAAM,aAAa,IAAA,CAAK,kBAAA;AACxB,EAAA,IAAI,CAAC,UAAA,EAAY;AAChB,IAAO,aAAM,6CAA6C,CAAA;AAC1D,IAAA,OAAO,EAAC;AAAA,EACT;AAEA,EAAO,aAAM,oCAAA,EAAsC;AAAA,IAClD,QAAA,EAAU,WAAW,KAAA,CAAM,MAAA;AAAA,IAC3B;AAAA,GACA,CAAA;AAED,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAW,KAAA,EAAO;AACpC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,EAAM,IAAA,EAAM,WAAW,eAAe,CAAA;AAC/D,IAAA,cAAA,CAAe,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,EAC3B;AAEA,EAAO,MAAA,CAAA,KAAA,CAAM,8CAAA,EAAgD,EAAE,WAAA,EAAa,gBAAgB,CAAA;AAC5F,EAAA,OAAO,cAAA;AACR;ACtPO,IAAM,uBAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAA,EAAY,SAAS,CAAC,CAAA;AACrE,IAAM,iBAAA,GAAoB,CAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,cAAA,EAAgB,MAAM,CAAC,CAAA;AAGhH,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAC1C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA;AAAA,EACtB,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACzC,CAAC,CAAA;AAIM,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAC1C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,WAAA,EAAa,EAAE,MAAA;AAChB,CAAC,CAAA;AAIM,IAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EACnD,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,YAAY,CAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EAClC,YAAY,CAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EAClC,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,EACrB,SAAS,CAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,IAAI,CAAC;AAC3C,CAAC,CAAA;AAGM,IAAM,uBAAA,GAA0B,4BAA4B,MAAA,CAAO,EAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,mBAAmB,CAAA,EAAG,CAAA;AAI3G,IAAM,iCAAA,GAAoC,EAAE,MAAA,CAAO;AAAA,EACzD,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,SAAS,CAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,IAAI,CAAC;AAC3C,CAAC,CAAA;AACM,IAAM,6BAAA,GAAgC,kCAAkC,MAAA,CAAO;AAAA,EACrF,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,yBAAyB;AAC1C,CAAC,CAAA;AAIM,IAAM,8BAAA,GAAiC,EAAE,MAAA,CAAO;AAAA,EACtD,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,cAAA,EAAgB,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,eAAA,EAAiB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACrC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACzB,CAAC,CAAA;AACM,IAAM,0BAAA,GAA6B,+BAA+B,MAAA,CAAO;AAAA,EAC/E,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,sBAAsB;AACvC,CAAC,CAAA;AAIM,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EAClD,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,YAAY,CAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EAClC,UAAA,EAAY,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7C,aAAa,CAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA;AAAA,EAC9C,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,EACrB,SAAS,CAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,IAAI,CAAC;AAC3C,CAAC,CAAA;AACM,IAAM,sBAAA,GAAyB,2BAA2B,MAAA,CAAO;AAAA,EACvE,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,kBAAkB;AACnC,CAAC,CAAA;AAIM,IAAM,aAAA,GAAgB,EAAE,MAAA,CAAO;AAAA,EACrC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,UAAU,CAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC;AAAA;AACjC,CAAC,CAAA;AAIM,IAAM,SAAA,GAAY,EAAE,MAAA,CAAO;AAAA,EACjC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AAC7B,CAAC,CAAA;AAIM,IAAM,6BAAA,GAAgC,EAAE,MAAA,CAAO;AAAA,EACrD,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,UAAU,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA,EACtC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA,EAC9B,WAAA,EAAa,EAAE,MAAA;AAAO;AACvB,CAAC,CAAA;AACM,IAAM,yBAAA,GAA4B,8BAA8B,MAAA,CAAO;AAAA,EAC7E,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,qBAAqB;AACtC,CAAC,CAAA;AAIM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC9C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,UAAU,CAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA,EAChC,WAAA,EAAa,EAAE,MAAA;AAChB,CAAC,CAAA;AAIM,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EAClD,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,iBAAiB,CAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA,EACvC,eAAe,CAAA,CAAE,KAAA,CAAM,sBAAsB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA,EACpD,eAAe,CAAA,CAAE,KAAA,CAAM,sBAAsB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA,EACpD,UAAA,EAAY,EAAE,MAAA;AACf,CAAC,CAAA;AACM,IAAM,sBAAA,GAAyB,2BAA2B,MAAA,CAAO;AAAA,EACvE,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,kBAAkB;AACnC,CAAC,CAAA;AAGM,IAAM,oBAAA,GAAuB,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EAChE,uBAAA;AAAA,EACA,6BAAA;AAAA,EACA,0BAAA;AAAA,EACA,sBAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACD,CAAC,CAAA;AAIM,IAAM,qBAAA,GAAwB,EAAE,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC;AACzC,CAAC,CAAA;AAIM,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EACjD,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,WAAA,EAAa,oBAAA;AAAA,EACb,QAAA,EAAU,iBAAA;AAAA,EACV,eAAA,EAAiB,qBAAA;AAAA;AAAA,EAEjB,OAAA,EAAS,EACP,MAAA,CAAO;AAAA,IACP,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,CAAC,CAAA;AAAA,IAClC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAChC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAChC,SAAS,CAAA,CAAE,KAAA;AAAA,MACV,EAAE,MAAA,CAAO;AAAA,QACR,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,QACrB,KAAA,EAAO,EAAE,MAAA;AAAO,OAChB;AAAA;AACF,GACA,EACA,QAAA;AACH,CAAC,CAAA;AAIM,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EACjD,KAAA,EAAO,EAAE,MAAA;AACV,CAAC,CAAA;AAGM,IAAM,wBAAA,GAA2B,EAAE,MAAA,CAAO;AAAA,EAChD,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,WAAA,EAAa,oBAAA;AAAA,EACb,QAAA,EAAU,iBAAA;AAAA,EACV,YAAA,EAAc,0BAA0B,QAAA;AACzC,CAAC,CAAA;AAIM,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC3C,iBAAA,EAAmB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACnC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,QAAA,EAAU,EAAE,IAAA,CAAK,CAAC,QAAQ,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACjD,WAAA,EAAa,EAAE,MAAA;AAChB,CAAC,CAAA;AAID,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,IAAA,EAAM,EAAE,MAAA;AACT,CAAC,CAAA;AAGM,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,EAC9B,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,cAAc,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,6BAA6B,CAAA;AAAA,EAChE,YAAY,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,0BAA0B;AAC5D,CAAC,CAAA;AAGD,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,aAAa,CAAA;AAAA,EAC7B,WAAA,EAAa;AACd,CAAC,CAAA;AAEM,IAAM,cAAA,GAAiB,EAAE,MAAA,CAAO;AAAA,EACtC,aAAA,EAAe,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,KAAA,CAAM,CAAC,mBAAA,EAAqB,uBAAA,EAAyB,sBAAsB,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC7G,cAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,mBAAmB;AAC5C,CAAC,CAAA;AAID,IAAM,cAAA,GAAiB,EAAE,MAAA,CAAO;AAAA,EAC/B,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,iBAAiB,CAAA;AAAA,EACjC,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,EACrB,KAAA,EAAO,EAAE,MAAA;AACV,CAAC,CAAA;AAGD,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EACvB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,IAAI;AAAA;AACxB,CAAC,CAAA;AAID,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,YAAY,CAAA;AAAA,EAC5B,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA;AAAA,EACnB,KAAA,EAAO,EAAE,MAAA;AAAO;AACjB,CAAC,CAAA;AAID,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EAC3C,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,aAAa,CAAA;AAAA,EAC7B,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,aAAA,EAAe,EAAE,OAAA;AAClB,CAAC,CAAA;AAID,IAAM,qBAAA,GAAwB,EAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,KAAA,EAAO,EAAE,MAAA;AACV,CAAC,CAAA;AAID,IAAM,+BAAA,GAAkC,EAAE,MAAA,CAAO;AAAA,EAChD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,kBAAkB,CAAA;AAAA,EAClC,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA;AAAA,EACnB,KAAA,EAAO,EAAE,MAAA;AAAO;AACjB,CAAC,CAAA;AA8BD,IAAM,kBAAA,GAA8C,EAAE,MAAA,CAAO;AAAA,EAC5D,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACrB,YAAY,CAAA,CAAE,KAAA,CAAM,EAAE,IAAA,CAAK,MAA+B,kBAAkB,CAAC;AAC9E,CAAC,CAAA;AAED,IAAM,iBAAA,GAA4C,EAAE,MAAA,CAAO;AAAA,EAC1D,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACpB,YAAY,CAAA,CAAE,KAAA,CAAM,EAAE,IAAA,CAAK,MAA+B,kBAAkB,CAAC;AAC9E,CAAC,CAAA;AAED,IAAM,kBAAA,GAA8C,EAAE,MAAA,CAAO;AAAA,EAC5D,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACrB,SAAA,EAAW,CAAA,CAAE,IAAA,CAAK,MAA+B,kBAAkB;AACpE,CAAC,CAAA;AAGD,IAAM,kBAAA,GAA8C,EAAE,KAAA,CAAM;AAAA,EAC3D,oBAAA;AAAA,EACA,yBAAA;AAAA,EACA,0BAAA;AAAA,EACA,qBAAA;AAAA,EACA,CAAA,CAAE,IAAA,CAAK,MAA+B,kBAAkB,CAAA;AAAA,EACxD,CAAA,CAAE,IAAA,CAAK,MAA8B,iBAAiB,CAAA;AAAA,EACtD,CAAA,CAAE,IAAA,CAAK,MAA+B,kBAAkB,CAAA;AAAA,EACxD;AACD,CAAC,CAAA;AAYM,IAAM,qBAAA,GAAoD,EAAE,MAAA,CAAO;AAAA,EACzE,SAAA,EAAW,mBAAmB,QAAA,EAAS;AAAA,EACvC,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,cAAc,CAAA;AAAA,EAC/B,WAAA,EAAa,EAAE,KAAA,CAAM,CAAA,CAAE,KAAK,MAA+B,kBAAkB,CAAC,CAAA,CAAE,QAAA;AACjF,CAAC,CAAA;AAMM,IAAM,kBAAA,GAA8C,EAAE,KAAA,CAAM;AAAA,EAClE,EAAE,MAAA,CAAO;AAAA,IACR,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,IAC3B,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,qBAAqB;AAAA,GACvC,CAAA;AAAA,EACD,EAAE,MAAA,CAAO;AAAA,IACR,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACxB,MAAA,EAAQ;AAAA,GACR;AACF,CAAC,CAAA;AAGM,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACzC,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,EACvB,cAAA,EAAgB,EAAE,MAAA;AACnB,CAAC,CAAA;AAIM,IAAM,wBAAA,GAA2B,EAAE,MAAA,CAAO;AAAA,EAChD,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA;AAAA,EACjC,OAAA,EAAS;AACV,CAAC,CAAA;AAIM,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EAC5C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,aAAA,EAAe,EAAE,OAAA,EAAQ;AAAA,EACzB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAEzB,sBAAsB,CAAA,CAAE,KAAA,CAAM,yBAAyB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC9D,qBAAqB,CAAA,CAAE,KAAA,CAAM,wBAAwB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAE5D,QAAA,EAAU,cAAA;AAAA,EACV,kBAAA,EAAoB;AACrB,CAAC;;;ACzVD,SAAS,eAAA,GAA6B;AACrC,EAAA,OAAO,IAAI,SAAA,CAAU;AAAA,IACpB,gBAAA,EAAkB,KAAA;AAAA,IAClB,mBAAA,EAAqB,EAAA;AAAA,IACrB,sBAAA,EAAwB,IAAA;AAAA,IACxB,mBAAA,EAAqB,IAAA;AAAA,IACrB,aAAA,EAAe,KAAA;AAAA;AAAA,IACf,UAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACf,CAAA;AACF;AAWA,SAAS,aAAa,KAAA,EAAwB;AAC7C,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,EAAA;AAC1B,EAAA,OAAO,OAAO,KAAK,CAAA;AACpB;AAEA,SAAS,SAAS,KAAA,EAAkD;AACnE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAC/C;AAEA,SAAS,cAAc,OAAA,EAA2C;AACjE,EAAA,IAAI,OAAA,IAAW,MAAM,OAAO,EAAA;AAC5B,EAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,aAAa,OAAO,CAAA;AAEnD,EAAA,MAAM,WAAA,GAAc,QAAQ,OAAO,CAAA;AACnC,EAAA,IAAI,eAAe,IAAA,EAAM;AACxB,IAAA,OAAO,aAAa,WAAW,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,OAAO,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA;AAC3D,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AAErB,EAAA,MAAM,UAAA,GAAa,QAAQ,IAAI,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAU,CAAA,GAAI,aAAa,EAAC;AACnD,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAA,GAAI,CAAC,OAAA,CAAQ,OAAO,CAAC,CAAA;AAE1F,EAAA,OAAO;AAAA,IACN,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,EAAU,YAAY,GAAA,CAAI,aAAa,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE;AAAA,GAChE;AACD;AAEA,SAAS,UAAU,IAAA,EAAuC;AAEzD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,OAAO,cAAc,IAAI,CAAA;AAC1B;AAEA,SAAS,aAAa,IAAA,EAA8B;AAEnD,EAAA,OAAO,eAAe,IAAI,CAAA;AAC3B;AAEA,SAAS,SAAA,CAAU,MAAsB,OAAA,EAA6C;AACrF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA;AACtF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,GAAY,KAAA;AAChD;AAEA,SAAS,YAAA,CAAa,MAAsB,OAAA,EAAmC;AAC9E,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAA2B,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA;AACvG;AAEA,SAAS,eAAe,IAAA,EAA0C;AACjE,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAClC,EAAA,IAAI,OAAO,UAAA,KAAe,QAAA,EAAU,OAAO,WAAW,IAAA,EAAK;AAC3D,EAAA,OAAO,EAAA;AACR;AAEA,SAAS,oBAAA,CAAqB,IAAA,EAAsB,GAAA,GAAwB,EAAC,EAAqB;AACjG,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAAG;AAC1C,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACd;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AAClC,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,MAAA,oBAAA,CAAqB,OAAO,GAAG,CAAA;AAAA,IAChC;AAAA,EACD;AACA,EAAA,OAAO,GAAA;AACR;AAEA,SAAS,WAAW,KAAA,EAAuB;AAC1C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CAAE,QAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,MAAM,CAAA;AACvG;AAEA,SAAS,cAAc,KAAA,EAAwC;AAC9D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,GAAG,KAAK,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AAC/C;AAEA,SAAS,+BAAA,CACR,IAAA,EACA,YAAA,EACA,UAAA,EACS;AACT,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,IAAA,CAAK,YAAY,+BAAA,EAAiC;AACrD,IAAA,MAAM,WAAA,GAAc,+BAA+B,IAAI,CAAA;AACvD,IAAA,YAAA,CAAa,WAAA,CAAY,kBAAkB,CAAA,GAAI,WAAA;AAC/C,IAAA,OAAO,CAAA,uBAAA,EAA0B,YAAY,kBAAkB,CAAA,SAAA,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,IAAA,CAAK,YAAY,4BAAA,EAA8B;AAClD,IAAA,MAAM,WAAA,GAAc,4BAA4B,IAAI,CAAA;AACpD,IAAA,UAAA,CAAW,WAAA,CAAY,kBAAkB,CAAA,GAAI,WAAA;AAC7C,IAAA,OAAO,CAAA,2BAAA,EAA8B,YAAY,kBAAkB,CAAA,SAAA,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,GAAG,aAAA,CAAc,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AACzD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,+BAAA,CAAgC,CAAA,EAAG,YAAA,EAAc,UAAU,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACnH,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAC/B,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,YAAY,GAAG,KAAK,CAAA,CAAA;AACtC;AAIA,SAAS,yBAAyB,IAAA,EAAsB;AACvD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,EAAM,YAAY,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,UAAA,GAAa,YAAA,CAAa,UAAU,CAAA,GAAI,EAAA;AAE3D,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,EAAM,mBAAmB,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,KAAW;AAE3C,IAAA,MAAM,kBAAA,GAAqB,SAAA,CAAU,MAAA,EAAQ,qBAAqB,CAAA;AAClE,IAAA,MAAM,kBAAA,GAAqB,kBAAA,GAAqB,YAAA,CAAa,kBAAkB,CAAA,GAAI,MAAA;AAGnF,IAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,CAAS,MAAA;AAAA,MACvC,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,KAAM,QAAA,IAAY,EAAE,OAAA,KAAY,qBAAA;AAAA,KACjD;AACA,IAAA,MAAM,WAAA,GAAc,eAAe,eAAe,CAAA;AAElD,IAAA,OAAO;AAAA,MACN,UAAA,EAAY,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,MAChD,WAAA;AAAA,MACA;AAAA,KACD;AAAA,EACD,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,mBAAA;AAAA,IACN,kBAAA,EAAoB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAAA,IAClE,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,IACnC,YAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAa,KAAK,CAAC,CAAA;AAAA,IACjD,YAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAa,KAAK,CAAC,CAAA;AAAA,IACjD,UAAA;AAAA,IACA;AAAA,GACD;AACD;AAEA,SAAS,+BAA+B,IAAA,EAAsB;AAC7D,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,EAAM,mBAAmB,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,KAAW;AAC3C,IAAA,MAAM,WAAA,GAAc,eAAe,MAAM,CAAA;AACzC,IAAA,OAAO;AAAA,MACN,UAAA,EAAY,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,MAChD;AAAA,KACD;AAAA,EACD,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,yBAAA;AAAA,IACN,kBAAA,EAAoB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAAA,IAClE,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,IACnC;AAAA,GACD;AACD;AAEA,SAAS,4BAA4B,IAAA,EAAsB;AAC1D,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA;AACvD,EAAA,MAAM,cAAA,GAAiB,kBAAA,GAAqB,MAAA,CAAO,kBAAkB,CAAA,GAAI,MAAA;AAEzE,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,sBAAA;AAAA,IACN,kBAAA,EAAoB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAAA,IAClE,cAAA,EAAgB,mBAAmB,MAAA,IAAa,CAAC,OAAO,KAAA,CAAM,cAAc,IAAI,cAAA,GAAiB,MAAA;AAAA,IACjG,iBAAiB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAC,CAAA,IAAK,MAAA;AAAA,IACjE,aAAa,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,cAAc,CAAC,CAAA,IAAK;AAAA,GAC1D;AACD;AAEA,SAAS,wBAAwB,IAAA,EAAsB;AACtD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,EAAM,YAAY,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,UAAA,GAAa,YAAA,CAAa,UAAU,CAAA,GAAI,EAAA;AAE3D,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,EAAM,mBAAmB,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,KAAW;AAE3C,IAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,CAAS,MAAA;AAAA,MACvC,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,KAAM,QAAA,IAAY,EAAE,OAAA,KAAY,qBAAA;AAAA,KACjD;AACA,IAAA,MAAM,WAAA,GAAc,eAAe,eAAe,CAAA;AAElD,IAAA,OAAO;AAAA,MACN,UAAA,EAAY,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,MAChD,WAAA;AAAA;AAAA,MAEA,kBAAA,EAAoB;AAAA,KACrB;AAAA,EACD,CAAC,CAAA;AAGD,EAAA,IAAI,WAAA,GAAyC,UAAA;AAC7C,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAE/C,EAAA,IAAI,eAAA,KAAoB,YAAA,IAAgB,SAAA,CAAU,QAAA,CAAS,4BAA4B,CAAA,EAAG;AACzF,IAAA,WAAA,GAAc,YAAA;AAAA,EACf;AAEA,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,kBAAA;AAAA,IACN,kBAAA,EAAoB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAAA,IAClE,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,IACnC,YAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAa,KAAK,CAAC,CAAA;AAAA,IACjD,YAAY,MAAA,CAAO,IAAA,CAAK,MAAM,aAAa,CAAA,IAAK,CAAC,CAAA,IAAK,MAAA;AAAA,IACtD,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD;AACD;AAEA,SAAS,2BAA2B,IAAA,EAAsB;AAEzD,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,IAAA,EAAM,cAAc,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,IAC1C,UAAA,EAAY,YAAA,CAAa,EAAA,CAAG,KAAA,CAAM,UAAU,CAAA;AAAA,IAC5C,WAAA,EAAa,eAAe,EAAE,CAAA;AAAA,IAC9B,UAAU,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,WAAW,KAAK,CAAC;AAAA;AAAA,GAC5C,CAAE,CAAA;AAGF,EAAA,MAAM,OAAsC,EAAC;AAG7C,EAAA,SAAS,6BAA6B,KAAA,EAAwC;AAC7E,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,IAAA,IAAI,KAAA,CAAM,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA;AACjD,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,UAAA,EAAY,KAAA,EAAO,CAAA;AAC/B,MAAA,OAAO,uBAAuB,KAAK,CAAA,SAAA,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,KAAA,CAAM,YAAY,cAAA,EAAgB;AACrC,MAAA,OAAO,EAAA;AAAA,IACR;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAM,OAAO,GAAG,aAAA,CAAc,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,CAAA;AAC3D,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,4BAAA,CAA6B,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACvF,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA,CAAA;AAChC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,YAAY,GAAG,KAAK,CAAA,CAAA;AAAA,EACtC;AAGA,EAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CACvB,MAAA,CAAO,CAAC,CAAA,KAAM,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,YAAY,cAAc,CAAA,CACnE,IAAI,CAAC,CAAA,KAAM,6BAA6B,CAAC,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAA;AAET,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,qBAAA;AAAA,IACN,kBAAA,EAAoB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAAA,IAClE,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,IACnC,QAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACD;AACD;AAEA,SAAS,wBAAwB,IAAA,EAAsB;AACtD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,EAAM,YAAY,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,UAAA,GAAa,YAAA,CAAa,UAAU,CAAA,GAAI,EAAA;AAG3D,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,EAAM,sBAAsB,CAAA;AAE3D,EAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,KAA4B;AACnD,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,EAAS,8BAA8B,CAAA;AACxE,IAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC9B,UAAA,EAAY,YAAA,CAAa,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA;AAAA,MAC3C,UAAU,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,WAAW,CAAC,CAAA,IAAK,CAAA;AAAA,MAC1C,WAAA,EAAa,eAAe,CAAC;AAAA,KAC9B,CAAE,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,UAAU,CAAC,CAAA;AAC7B,EAAA,MAAM,aAAA,GAAgB,QAAA,GAAW,cAAA,CAAe,QAAQ,IAAI,EAAC;AAC7D,EAAA,MAAM,aAAA,GAAgB,SAAA,GAAY,cAAA,CAAe,SAAS,IAAI,EAAC;AAE/D,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,kBAAA;AAAA,IACN,kBAAA,EAAoB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAAA,IAClE,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAA,KAAY,MAAA;AAAA,IAChC,iBAAiB,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAC,CAAA,IAAK,CAAA;AAAA,IAC3D,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD;AACD;AAEA,SAAS,qBAAqB,IAAA,EAAsB;AACnD,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,IAAA,EAAM,kBAAkB,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,eAAA,GAAkB,YAAA,CAAa,eAAe,CAAA,GAAI,EAAA;AACtE,EAAA,MAAM,QAAA,GAA4B,aAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA,KAAM,SAAS,MAAA,GAAS,MAAA;AAE9F,EAAA,OAAO;AAAA,IACN,iBAAA,EAAmB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAC,CAAA;AAAA,IAChE,UAAA,EAAY,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,IAC9C,QAAA;AAAA,IACA;AAAA,GACD;AACD;AAEA,SAAS,4BAA4B,YAAA,EAAgC;AACpE,EAAA,MAAM,YAAY,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,0BAA0B,CAAA;AAErF,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AAC9B,IAAA,MAAM,mBAAA,GAAsB,SAAA,CAAU,IAAA,EAAM,sBAAsB,CAAA;AAClE,IAAA,MAAM,aAAa,mBAAA,GAAsB,YAAA,CAAa,mBAAA,EAAqB,WAAW,IAAI,EAAC;AAC3F,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AAG5C,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,EAAM,aAAa,CAAA;AACjD,IAAA,IAAI,OAAA;AAQJ,IAAA,IAAI,WAAA,EAAa;AAChB,MAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,WAAA,CAAY,KAAA,CAAM,eAAe,CAAC,CAAA;AACvE,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,WAAA,CAAY,KAAA,CAAM,aAAa,CAAC,CAAA;AACnE,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,WAAA,CAAY,KAAA,CAAM,aAAa,CAAC,CAAA;AACnE,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,WAAA,EAAa,eAAe,CAAA;AAC5D,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO;AACtC,QAAA,OAAO;AAAA,UACN,GAAA,EAAK,YAAA,CAAa,EAAA,CAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,UACrC,KAAA,EAAO,OAAO,YAAA,CAAa,EAAA,CAAG,MAAM,cAAc,CAAC,KAAK,CAAC;AAAA,SAC1D;AAAA,MACD,CAAC,CAAA;AACD,MAAA,OAAA,GAAU;AAAA,QACT,YAAA,EAAc,MAAA,CAAO,eAAA,IAAmB,CAAC,CAAA;AAAA,QACzC,UAAA,EAAY,aAAA,KAAkB,EAAA,GAAK,MAAA,CAAO,aAAa,CAAA,GAAI,MAAA;AAAA,QAC3D,UAAA,EAAY,aAAA,KAAkB,EAAA,GAAK,MAAA,CAAO,aAAa,CAAA,GAAI,MAAA;AAAA,QAC3D;AAAA,OACD;AAAA,IACD;AAEA,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAC1D,IAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,SAAA,CAAU,cAAc,CAAA;AACvE,IAAA,IAAI,CAAC,kBAAkB,OAAA,EAAS;AAC/B,MAAA,MAAa,MAAA,CAAA,GAAA,CAAI,CAAA,qBAAA,EAAwB,cAAc,CAAA,yBAAA,CAA2B,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AACxD,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,SAAA,CAAU,WAAW,CAAA;AAC9D,IAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC5B,MAAA,MAAa,MAAA,CAAA,GAAA,CAAI,CAAA,mBAAA,EAAsB,WAAW,CAAA,yBAAA,CAA2B,CAAA;AAAA,IAC9E;AAEA,IAAA,OAAO;AAAA,MACN,UAAA,EAAY,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MAC9C,aAAa,iBAAA,CAAkB,IAAA;AAAA,MAC/B,UAAU,cAAA,CAAe,IAAA;AAAA,MACzB,eAAA,EAAiB,EAAE,MAAA,EAAO;AAAA,MAC1B;AAAA,KACD;AAAA,EACD,CAAC,CAAA;AACF;AAEA,SAAS,2BAA2B,YAAA,EAAgC;AACnE,EAAA,MAAM,YAAY,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,yBAAyB,CAAA;AAEpF,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AAC9B,IAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,IAAA,EAAM,mBAAmB,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,gBAAA,GAAmB,SAAA,CAAU,gBAAA,EAAkB,WAAW,CAAA,GAAI,MAAA;AAChF,IAAA,MAAM,eAAe,SAAA,GAAY,EAAE,OAAO,cAAA,CAAe,SAAS,GAAE,GAAI,MAAA;AAExE,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAC1D,IAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,SAAA,CAAU,cAAc,CAAA;AACvE,IAAA,IAAI,CAAC,kBAAkB,OAAA,EAAS;AAC/B,MAAA,MAAa,MAAA,CAAA,GAAA,CAAI,CAAA,qBAAA,EAAwB,cAAc,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AACxD,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,SAAA,CAAU,WAAW,CAAA;AAC9D,IAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC5B,MAAA,MAAa,MAAA,CAAA,GAAA,CAAI,CAAA,mBAAA,EAAsB,WAAW,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC7E;AAEA,IAAA,OAAO;AAAA,MACN,UAAA,EAAY,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MAC9C,aAAa,iBAAA,CAAkB,IAAA;AAAA,MAC/B,UAAU,cAAA,CAAe,IAAA;AAAA,MACzB;AAAA,KACD;AAAA,EACD,CAAC,CAAA;AACF;AAEA,SAAS,eAAe,IAAA,EAA2C;AAElE,EAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC/B,IAAA,MAAM,aAA6B,EAAC;AACpC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AAClC,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,QAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,QAAA,IAAI,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,MACnC;AAAA,IACD;AACA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACpC,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAW;AAAA,EAClC;AAEA,EAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC9B,IAAA,MAAM,aAA6B,EAAC;AACpC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AAClC,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,QAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,QAAA,IAAI,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,MACnC;AAAA,IACD;AACA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACpC,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EACjC;AAEA,EAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC/B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AAClC,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,QAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,QAAA,IAAI,QAAQ,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,WAAW,MAAA,EAAO;AAAA,MACrD;AAAA,IACD;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAGA,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,IAAA,EAAM,cAAc,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,IAAA,EAAM,gBAAgB,CAAA;AAEtD,EAAA,MAAM,aAAa,YAAA,GAAe,YAAA,CAAa,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA,GAAI,MAAA;AAChF,EAAA,MAAM,KAAA,GAAQ,aAAA,GAAgB,cAAA,CAAe,aAAa,CAAA,GAAI,MAAA;AAG9D,EAAA,IAAI,IAAA,CAAK,YAAY,WAAA,EAAa;AAEjC,IAAA,IAAI,SAAA,CAAU,IAAA,EAAM,aAAa,CAAA,IAAK,UAAA,EAAY;AACjD,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,SAAS,IAAA,EAAc;AAAA,IACtE;AAEA,IAAA,IAAI,UAAA,IAAc,UAAU,MAAA,EAAW;AACtC,MAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,YAAY,KAAA,EAAM;AAAA,IAC1D;AAAA,EACD;AAGA,EAAA,IAAI,IAAA,CAAK,YAAY,kBAAA,EAAoB;AACxC,IAAA,IAAI,UAAA,IAAc,UAAU,MAAA,EAAW;AACtC,MAAA,OAAO;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,KAAA;AAAA;AAAA,QAEA,aAAA,EAAe,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,KAAM;AAAA,OACjD;AAAA,IACD;AAAA,EACD;AAGA,EAAA,IAAI,IAAA,CAAK,YAAY,YAAA,EAAc;AAClC,IAAA,IAAI,UAAA,IAAc,UAAU,MAAA,EAAW;AACtC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,YAAY,KAAA,EAAM;AAAA,IACtD;AAAA,EACD;AAGA,EAAA,IAAI,IAAA,CAAK,YAAY,WAAA,EAAa;AAEjC,IAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,IAAA,EAAM,kBAAkB,CAAA;AAC1D,IAAA,MAAM,kBAAA,GAAqB,SAAA,CAAU,IAAA,EAAM,gBAAgB,CAAA;AAC3D,IAAA,IAAI,mBAAmB,kBAAA,EAAoB;AAC1C,MAAA,OAAO;AAAA,QACN,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU,YAAA,CAAa,eAAA,CAAgB,KAAA,CAAM,UAAU,CAAA;AAAA,QACvD,KAAA,EAAO,eAAe,kBAAkB;AAAA,OACzC;AAAA,IACD;AAGA,IAAA,IAAI,SAAA,CAAU,IAAA,EAAM,aAAa,CAAA,IAAK,UAAA,EAAY;AACjD,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,SAAS,IAAA,EAAc;AAAA,IACtE;AAAA,EACD;AAEA,EAAA,OAAO,IAAA;AACR;AAGA,SAAS,aAAa,IAAA,EAAkC;AACvD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,EAAM,uBAAuB,CAAA;AAC3D,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC/B,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,OAAA,EAAS,gBAAgB,CAAA;AACrD,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,iBAAA;AAAA,QACN,UAAA,EAAY,YAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,QACjD,KAAA,EAAO,eAAe,SAAS;AAAA,OAC/B,CAAA;AAAA,IACF;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAGA,SAAS,kBAAkB,IAAA,EAA2C;AAErE,EAAA,IAAI,IAAA,CAAK,YAAY,uBAAA,EAAyB;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,EAAM,gBAAgB,CAAA;AAClD,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,OAAO;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACP,IAAA,EAAM,iBAAA;AAAA,UACN,UAAA,EAAY,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,UAC9C,KAAA,EAAO,eAAe,SAAS;AAAA;AAChC,OACD;AAAA,IACD;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAGA,EAAA,IAAI,IAAA,CAAK,YAAY,wBAAA,EAA0B;AAC9C,IAAA,MAAM,WAA8B,EAAC;AAGrC,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,EAAM,iBAAiB,CAAA;AAChD,IAAA,IAAI,MAAA,EAAQ;AACX,MAAA,MAAM,SAAA,GAAY,sBAAsB,MAAM,CAAA;AAC9C,MAAA,IAAI,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACb,SAAA;AAAA,UACA,OAAA,EAAS,aAAa,MAAM,CAAA;AAAA,UAC5B,WAAA,EAAa,gBAAgB,MAAM;AAAA,SACnC,CAAA;AAAA,MACF;AAAA,IACD;AAGA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,EAAM,sBAAsB,CAAA;AAC7D,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACrC,MAAA,MAAM,SAAA,GAAY,sBAAsB,UAAU,CAAA;AAClD,MAAA,IAAI,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACb,SAAA;AAAA,UACA,OAAA,EAAS,aAAa,UAAU,CAAA;AAAA,UAChC,WAAA,EAAa,gBAAgB,UAAU;AAAA,SACvC,CAAA;AAAA,MACF;AAAA,IACD;AAGA,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,mBAAmB,CAAA;AACpD,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACb,SAAA,EAAW,MAAA;AAAA;AAAA,QACX,OAAA,EAAS,aAAa,QAAQ,CAAA;AAAA,QAC9B,WAAA,EAAa,gBAAgB,QAAQ;AAAA,OACrC,CAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,MAAA,OAAO;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN;AAAA,OACD;AAAA,IACD;AAAA,EACD;AAEA,EAAA,OAAO,IAAA;AACR;AAGA,SAAS,sBAAsB,IAAA,EAA2C;AACzE,EAAA,MAAM,iBAAA,GAAoB,CAAC,WAAA,EAAa,SAAA,EAAW,UAAU,SAAA,EAAW,WAAA,EAAa,oBAAoB,YAAY,CAAA;AACrH,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AAClC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,kBAAkB,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,EAAG;AAC3E,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC5B;AAAA,EACD;AACA,EAAA,OAAO,IAAA;AACR;AAKA,SAAS,gBAAgB,IAAA,EAAsC;AAC9D,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AAElC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,YAAY,wBAAA,EAA0B;AAC5E,MAAA,MAAM,IAAA,GAAO,kBAAkB,KAAK,CAAA;AACpC,MAAA,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IAC3B;AAAA,EACD;AACA,EAAA,OAAO,MAAA;AACR;AAGA,SAAS,0BAA0B,YAAA,EAAoD;AACtF,EAAA,MAAM,iBAAiB,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,yBAAyB,CAAA;AACvF,EAAA,IAAI,CAAC,cAAA,EAAgB;AACpB,IAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,OAAA,EAAS,EAAE,kBAAA,EAAoB,EAAA,EAAI,YAAA,EAAc,CAAA,EAAG,cAAA,EAAgB,CAAA,EAAE,EAAE;AAAA,EAC7F;AAEA,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,KAAA,IAAS,eAAe,QAAA,EAAU;AAC5C,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAA,GAAO,kBAAkB,KAAK,CAAA;AACpC,MAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1B;AAAA,EACD;AAGA,EAAA,IAAI,UAAuB,EAAE,kBAAA,EAAoB,IAAI,YAAA,EAAc,CAAA,EAAG,gBAAgB,CAAA,EAAE;AACxF,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,cAAA,EAAgB,wBAAwB,CAAA;AAC5E,EAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC3C,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,aAAA,EAAe,iBAAiB,CAAA;AACjE,IAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,aAAA,EAAe,mBAAmB,CAAA;AAErE,IAAA,IAAI,kBAAkB,gBAAA,EAAkB;AACvC,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,cAAA,EAAgB,SAAS,CAAA;AACnD,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,MAAM,SAAA,GAAY,SAAA,CAAU,OAAA,EAAS,WAAW,CAAA;AAChD,QAAA,MAAM,YAAA,GAAe,SAAA,GAAY,SAAA,CAAU,SAAA,EAAW,cAAc,CAAA,GAAI,MAAA;AACxE,QAAA,IAAI,YAAA,EAAc;AACjB,UAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,cAAA,EAAgB,uBAAuB,CAAA;AAC1E,UAAA,MAAM,kBAAA,GAAqB,SAAA,CAAU,gBAAA,EAAkB,uBAAuB,CAAA;AAC9E,UAAA,MAAM,gBAAA,GAAmB,gBAAA,GAAmB,SAAA,CAAU,gBAAA,EAAkB,gBAAgB,CAAA,GAAI,MAAA;AAC5F,UAAA,MAAM,kBAAA,GAAqB,kBAAA,GAAqB,SAAA,CAAU,kBAAA,EAAoB,gBAAgB,CAAA,GAAI,MAAA;AAClG,UAAA,OAAA,GAAU;AAAA,YACT,kBAAA,EAAoB,YAAA,CAAa,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA;AAAA,YAC9D,YAAA,EAAc,MAAA,CAAO,cAAA,CAAe,gBAAgB,KAAK,CAAC,CAAA;AAAA,YAC1D,cAAA,EAAgB,MAAA,CAAO,cAAA,CAAe,kBAAkB,KAAK,CAAC;AAAA,WAC/D;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AACzB;AAIO,SAAS,uBAAuB,GAAA,EAA6B;AAEnE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACpC,IAAA,MAAa,WAAI,sCAAsC,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,WAAA,GAAqB,eAAQ,MAAM;AAExC,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AAAA,EAC9B,CAAC,CAAA;AAED,EAAA,IAAI,YAAY,KAAA,EAAO;AACtB,IAAA,MAAa,MAAA,CAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,WAAW,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,MAAM,WAAA,CAAY,IAAA;AACxB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxB,IAAA,MAAa,WAAI,0DAA0D,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,CAAE,OAAO,CAAC,CAAA,KAA2B,OAAO,CAAA,KAAM,QAAQ,CAAA;AAEtG,EAAA,MAAM,QAAA,GAAW,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAC,CAAA;AACjF,EAAA,IAAI,CAAC,QAAA,EAAU;AACd,IAAA,MAAa,WAAI,+CAA+C,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,YAAA,GAAe,SAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAA2B,OAAO,MAAM,QAAQ,CAAA;AAC/F,EAAA,MAAM,eAAe,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,eAAe,CAAA;AAoB3E,EAAA,MAAM,gBAAgC,EAAC;AACvC,EAAA,MAAM,iBAAkC,EAAC;AAEzC,EAAA,IAAI,YAAA,EAAc;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,aAAa,QAAA,EAAU;AAC1C,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,QAAA,IAAI,KAAA,CAAM,IAAA,EAAK,EAAG,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAqB,IAAA,EAAM,KAAA,EAAO,CAAA;AAC/E,QAAA;AAAA,MACD;AAEA,MAAA,IAAI,KAAA,CAAM,YAAY,oBAAA,EAAsB;AAC3C,QAAA,cAAA,CAAe,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAC,CAAA;AAAA,MAChD,CAAA,MAAO;AACN,QAAA,MAAM,gBAAA,GAAmB,qBAAqB,KAAK,CAAA;AACnD,QAAA,MAAM,YAAY,gBAAA,CAAiB,IAAA;AAAA,UAClC,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,+BAAA,IAAmC,EAAE,OAAA,KAAY;AAAA,SACvE;AACA,QAAA,IAAI,SAAA,EAAW;AACd,UAAA,MAAM,eAAkF,EAAC;AACzF,UAAA,MAAM,aAA6E,EAAC;AACpF,UAAA,MAAM,IAAA,GAAO,+BAAA,CAAgC,KAAA,EAAO,YAAA,EAAc,UAAU,CAAA;AAC5E,UAAA,aAAA,CAAc,KAAK,EAAE,IAAA,EAAM,gBAAyB,IAAA,EAAM,YAAA,EAAc,YAAY,CAAA;AACpF,UAAA;AAAA,QACD;AACA,QAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAChC,UAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACrC,YAAA,IAAI,KAAA,CAAM,YAAY,wBAAA,EAA0B;AAC/C,cAAA,MAAM,WAAA,GAAc,yBAAyB,KAAK,CAAA;AAClD,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAwB,aAAa,CAAA;AAAA,YACjE,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,KAAY,4BAAA,EAA8B;AAC1D,cAAA,MAAM,WAAA,GAAc,4BAA4B,KAAK,CAAA;AACrD,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAwB,aAAa,CAAA;AAAA,YACjE,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,KAAY,uBAAA,EAAyB;AACrD,cAAA,MAAM,WAAA,GAAc,wBAAwB,KAAK,CAAA;AACjD,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAwB,aAAa,CAAA;AAAA,YACjE,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,KAAY,2BAAA,EAA6B;AACzD,cAAA,MAAM,WAAA,GAAc,2BAA2B,KAAK,CAAA;AACpD,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAwB,aAAa,CAAA;AAAA,YACjE,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,KAAY,uBAAA,EAAyB;AACrD,cAAA,MAAM,WAAA,GAAc,wBAAwB,KAAK,CAAA;AACjD,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAwB,aAAa,CAAA;AAAA,YACjE,CAAA,MAAO;AAEN,cAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAqB,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,YACzE;AAAA,UACD;AACA,UAAA;AAAA,QACD;AACA,QAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAqB,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,MACzE;AAAA,IACD;AAAA,EACD;AAEA,EAAA,IAAI,cAAA,GAAiB;AAAA,IACpB,UAAA,EAAY,YAAA,CAAa,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA;AAAA,IAClD,KAAA,EAAO,YAAA,CAAa,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAAA,IACxC,aAAA,EAAe,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,IACvD,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,KAAA,CAAM,UAAU,CAAC,CAAA,IAAK,YAAA,CAAa,QAAA,CAAS,KAAA,CAAM,UAAU,CAAC,CAAA,IAAK,IAAA;AAAA,IACjG,oBAAA,EAAsB,4BAA4B,YAAY,CAAA;AAAA,IAC9D,mBAAA,EAAqB,2BAA2B,YAAY,CAAA;AAAA,IAC5D,QAAA,EAAU,EAAE,aAAA,EAAe,cAAA,EAAe;AAAA,IAC1C,kBAAA,EAAoB,0BAA0B,YAAY;AAAA,GAC3D;AAGA,EAAA,IACC,cAAA,CAAe,mBAAmB,OAAA,CAAQ,kBAAA,KAAuB,MACjE,cAAA,CAAe,oBAAA,CAAqB,SAAS,CAAA,EAC5C;AACD,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,oBAAA,CAAqB,CAAC,CAAA;AACvD,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,cAAA,CAAe,kBAAA,CAAmB,OAAA,CAAQ,kBAAA,GAAqB,SAAA,CAAU,UAAA;AAAA,IAC1E;AAAA,EACD;AAEA,EAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,SAAA,CAAU,cAAc,CAAA;AAChE,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAExB,IAAA,MAAM,eAAe,UAAA,CAAW,KAAA,CAAM,OAAO,GAAA,CAAI,CAAC,QAAQ,CAAA,EAAG,GAAA,CAAI,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC5G,IAAA,MAAa,MAAA,CAAA,GAAA,CAAI,CAAA,qBAAA,EAAwB,YAAY,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,UAAA,CAAW,IAAA;AACnB","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport const PALETTES = [\"default\", \"betta\", \"cardinal\", \"bee\", \"owl\", \"macaw\"] as const\nexport type Palette = (typeof PALETTES)[number]\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","/**\n * Configuration for HTML sanitization.\n * Defines allowed tags and attributes for safe rendering.\n */\ninterface SanitizeConfig {\n\tallowedTags: Set<string>\n\tallowedAttributes: Record<string, Set<string>>\n\tallowDataAttributes: boolean\n\tallowMathML: boolean\n}\n\n/**\n * Default configuration for QTI content sanitization.\n * Allows common HTML tags and MathML for mathematical expressions.\n */\nconst DEFAULT_CONFIG: SanitizeConfig = {\n\t// HTML content tags\n\tallowedTags: new Set([\n\t\t// Text content\n\t\t\"p\",\n\t\t\"span\",\n\t\t\"div\",\n\t\t\"br\",\n\t\t\"hr\",\n\t\t// Formatting\n\t\t\"b\",\n\t\t\"i\",\n\t\t\"u\",\n\t\t\"strong\",\n\t\t\"em\",\n\t\t\"mark\",\n\t\t\"small\",\n\t\t\"sub\",\n\t\t\"sup\",\n\t\t\"code\",\n\t\t\"pre\",\n\t\t\"kbd\",\n\t\t// Lists\n\t\t\"ul\",\n\t\t\"ol\",\n\t\t\"li\",\n\t\t\"dl\",\n\t\t\"dt\",\n\t\t\"dd\",\n\t\t// Tables\n\t\t\"table\",\n\t\t\"thead\",\n\t\t\"tbody\",\n\t\t\"tfoot\",\n\t\t\"tr\",\n\t\t\"th\",\n\t\t\"td\",\n\t\t\"caption\",\n\t\t\"colgroup\",\n\t\t\"col\",\n\t\t// Media\n\t\t\"img\",\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t// Semantic\n\t\t\"article\",\n\t\t\"section\",\n\t\t\"nav\",\n\t\t\"aside\",\n\t\t\"header\",\n\t\t\"footer\",\n\t\t\"main\",\n\t\t\"figure\",\n\t\t\"figcaption\",\n\t\t\"blockquote\",\n\t\t\"cite\",\n\t\t// Links\n\t\t\"a\",\n\t\t// Forms (for future interactive elements)\n\t\t\"label\",\n\t\t\"button\"\n\t]),\n\n\tallowedAttributes: {\n\t\t// Global attributes\n\t\t\"*\": new Set([\"class\", \"id\", \"lang\", \"dir\", \"title\", \"style\"]),\n\t\t// Specific attributes\n\t\timg: new Set([\"src\", \"alt\", \"width\", \"height\", \"style\"]),\n\t\ta: new Set([\"href\", \"target\", \"rel\"]),\n\t\taudio: new Set([\"src\", \"controls\", \"loop\", \"muted\"]),\n\t\tvideo: new Set([\"src\", \"controls\", \"loop\", \"muted\", \"width\", \"height\", \"poster\"]),\n\t\tsource: new Set([\"src\", \"type\"]),\n\t\ttrack: new Set([\"src\", \"kind\", \"srclang\", \"label\"])\n\t},\n\n\tallowDataAttributes: false,\n\tallowMathML: true\n}\n\n/**\n * MathML elements that are allowed for mathematical expressions.\n * Based on MathML 3.0 specification.\n */\nconst MATHML_TAGS = new Set([\n\t// Root\n\t\"math\",\n\t// Token elements\n\t\"mi\",\n\t\"mn\",\n\t\"mo\",\n\t\"mtext\",\n\t\"mspace\",\n\t\"ms\",\n\t// Layout\n\t\"mrow\",\n\t\"mfrac\",\n\t\"msqrt\",\n\t\"mroot\",\n\t\"mstyle\",\n\t\"merror\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mfenced\",\n\t\"menclose\",\n\t// Scripts and limits\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"munder\",\n\t\"mover\",\n\t\"munderover\",\n\t\"mmultiscripts\",\n\t\"mprescripts\",\n\t\"none\",\n\t// Tables\n\t\"mtable\",\n\t\"mtr\",\n\t\"mtd\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t// Elementary math\n\t\"mstack\",\n\t\"mlongdiv\",\n\t\"msgroup\",\n\t\"msrow\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msline\",\n\t// Semantic\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\"\n])\n\n/**\n * MathML attributes that are allowed.\n */\nconst _MATHML_ATTRIBUTES = new Set([\n\t// Global MathML attributes\n\t\"id\",\n\t\"class\",\n\t\"style\",\n\t\"href\",\n\t\"mathcolor\",\n\t\"mathbackground\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"dir\",\n\t// Display\n\t\"display\",\n\t\"displaystyle\",\n\t\"scriptlevel\",\n\t// Spacing\n\t\"width\",\n\t\"height\",\n\t\"depth\",\n\t\"lspace\",\n\t\"rspace\",\n\t\"voffset\",\n\t// Fractions\n\t\"linethickness\",\n\t\"numalign\",\n\t\"denomalign\",\n\t\"bevelled\",\n\t// Roots\n\t\"index\",\n\t// Tables\n\t\"align\",\n\t\"rowalign\",\n\t\"columnalign\",\n\t\"groupalign\",\n\t\"alignmentscope\",\n\t\"columnwidth\",\n\t\"rowspacing\",\n\t\"columnspacing\",\n\t\"rowlines\",\n\t\"columnlines\",\n\t\"frame\",\n\t// Fences\n\t\"open\",\n\t\"close\",\n\t\"separators\",\n\t// Operators\n\t\"form\",\n\t\"fence\",\n\t\"separator\",\n\t\"stretchy\",\n\t\"symmetric\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"largeop\",\n\t\"movablelimits\",\n\t\"accent\",\n\t// Semantic\n\t\"encoding\",\n\t\"definitionURL\"\n])\n\n/**\n * Sanitizes HTML content to prevent XSS attacks.\n * Preserves MathML for mathematical expressions.\n */\nexport function sanitizeHtml(html: string, config: Partial<SanitizeConfig> = {}): string {\n\tconst cfg = { ...DEFAULT_CONFIG, ...config }\n\n\t// Basic XSS prevention patterns\n\tconst dangerousPatterns = [\n\t\t/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\t\t/javascript:/gi,\n\t\t/on\\w+\\s*=/gi, // Event handlers\n\t\t/<iframe\\b/gi,\n\t\t/<embed\\b/gi,\n\t\t/<object\\b/gi,\n\t\t/data:text\\/html/gi\n\t]\n\n\tlet sanitized = html\n\tfor (const pattern of dangerousPatterns) {\n\t\tsanitized = sanitized.replace(pattern, \"\")\n\t}\n\n\t// Parse and rebuild with allowed tags/attributes\n\tconst cleaned = cleanHtml(sanitized, cfg)\n\n\treturn cleaned\n}\n\n/**\n * Performs deep cleaning of HTML by parsing and rebuilding with only allowed elements.\n * Note: This is a simplified regex-based implementation for Node.js environments.\n * In production with browser support, consider using DOMPurify.\n */\nfunction cleanHtml(html: string, config: SanitizeConfig): string {\n\t// For Node.js environment, we use a regex-based approach\n\t// This is less robust than DOM-based cleaning but works in all environments\n\n\tlet cleaned = html\n\n\t// Remove all tags that aren't in the allowlist\n\tconst tagPattern = /<\\/?([a-zA-Z][a-zA-Z0-9-]*)([^>]*)>/g\n\tcleaned = cleaned.replace(tagPattern, (match, tagName, _attrs) => {\n\t\tconst tag = tagName.toLowerCase()\n\t\tconst isMathML = tag === \"math\" || cleaned.includes(\"<math\")\n\n\t\tif (isMathML && config.allowMathML && MATHML_TAGS.has(tag)) {\n\t\t\treturn match // Keep MathML tags\n\t\t}\n\t\tif (config.allowedTags.has(tag)) {\n\t\t\t// Clean attributes for allowed tags\n\t\t\treturn cleanAttributesString(match, tag, config)\n\t\t}\n\n\t\treturn \"\" // Remove disallowed tags\n\t})\n\n\treturn cleaned\n}\n\n/**\n * Cleans attributes from an HTML tag string.\n */\nfunction cleanAttributesString(tagString: string, tagName: string, config: SanitizeConfig): string {\n\tconst attrPattern = /\\s+([a-zA-Z][a-zA-Z0-9-:]*)(?:=\"([^\"]*)\"|'([^']*)'|=([^\\s>]+)|(?=\\s|>))/g\n\n\tlet cleanedTag = `<${tagString.startsWith(\"</\") ? \"/\" : \"\"}${tagName}`\n\n\tlet match = attrPattern.exec(tagString)\n\twhile (match !== null) {\n\t\tconst attrName = (match[1] || \"\").toLowerCase()\n\t\tconst attrValue = match[2] || match[3] || match[4] || \"\"\n\n\t\t// Check if attribute is allowed\n\t\tconst globalAttrs = config.allowedAttributes[\"*\"] || new Set()\n\t\tconst tagAttrs = config.allowedAttributes[tagName] || new Set()\n\n\t\tlet isAllowed = globalAttrs.has(attrName) || tagAttrs.has(attrName)\n\n\t\t// For <img>, strip size/style attributes to prevent stretched images\n\t\tif (tagName === \"img\" && (attrName === \"width\" || attrName === \"height\" || attrName === \"style\")) {\n\t\t\tisAllowed = false\n\t\t}\n\n\t\t// Check data attributes\n\t\tif (!isAllowed && config.allowDataAttributes && attrName.startsWith(\"data-\")) {\n\t\t\tisAllowed = true\n\t\t}\n\n\t\t// Check for dangerous values\n\t\tif (isAllowed && !isDangerousAttributeValue(attrName, attrValue)) {\n\t\t\tcleanedTag += ` ${attrName}=\"${attrValue.replace(/\"/g, \"&quot;\")}\"`\n\t\t}\n\n\t\tmatch = attrPattern.exec(tagString)\n\t}\n\n\tcleanedTag += \">\"\n\treturn cleanedTag\n}\n\n/**\n * Checks if an attribute value contains potentially dangerous content.\n */\nfunction isDangerousAttributeValue(name: string, value: string): boolean {\n\tconst valueLower = value.toLowerCase().trim()\n\n\t// Check for javascript: protocol\n\tif (name === \"href\" || name === \"src\") {\n\t\tif (valueLower.startsWith(\"javascript:\") || valueLower.startsWith(\"data:text/html\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Check for event handlers in values (some old XSS techniques)\n\tif (valueLower.includes(\"javascript:\") || valueLower.includes(\"onerror=\")) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n/**\n * Sanitizes HTML for safe display, with automatic MathML detection.\n */\nexport function sanitizeForDisplay(html: string): string {\n\t// Auto-detect if content has MathML\n\tconst hasMathML = html.toLowerCase().includes(\"<math\")\n\n\treturn sanitizeHtml(html, {\n\t\tallowMathML: hasMathML,\n\t\tallowDataAttributes: true\n\t})\n}\n","import type { NormalizedNode } from \"../parser\"\n\n/**\n * Serializes an array of nodes (useful for contentBlocks).\n */\nexport function serializeNodes(nodes: Array<NormalizedNode | string>): string {\n\treturn nodes\n\t\t.map((node) => {\n\t\t\tif (typeof node === \"string\") {\n\t\t\t\treturn escapeHtml(node)\n\t\t\t}\n\t\t\treturn serializeNode(node)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes the inner content of a node (its children) to an HTML string.\n * Preserves MathML and other XML content verbatim.\n */\nexport function serializeInner(node: NormalizedNode): string {\n\treturn node.children\n\t\t.map((child: NormalizedNode | string) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\treturn serializeNode(child)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes a complete node including its tag and attributes.\n * Critical for preserving MathML structure exactly as authored.\n */\nexport function serializeNode(node: NormalizedNode): string {\n\t// Self-closing tags\n\tconst selfClosing = [\"br\", \"hr\", \"img\", \"input\", \"meta\", \"link\"]\n\tconst tagName = stripQtiPrefix(node.tagName)\n\n\t// Preserve MathML elements verbatim without QTI processing\n\tif (tagName === \"math\" || isMathMLElement(tagName)) {\n\t\treturn serializeVerbatim(node)\n\t}\n\n\tconst attrs = serializeAttributes(node.attrs)\n\tconst attrString = attrs ? ` ${attrs}` : \"\"\n\n\tif (selfClosing.includes(tagName) && node.children.length === 0) {\n\t\treturn `<${tagName}${attrString} />`\n\t}\n\n\tconst inner = serializeInner(node)\n\treturn `<${tagName}${attrString}>${inner}</${tagName}>`\n}\n\n/**\n * Detects whether content contains MathML elements.\n * Used to determine appropriate rendering and sanitization strategies.\n */\nexport function detectContentType(html: string): \"mathml\" | \"html\" {\n\t// Quick heuristic: check for common MathML elements\n\tconst mathmlIndicators = [\"<math\", \"<mrow\", \"<msup\", \"<msub\", \"<mfrac\", \"<msqrt\", \"<mi>\", \"<mo>\", \"<mn>\", \"<mtext\"]\n\n\tconst normalized = html.toLowerCase()\n\tfor (const indicator of mathmlIndicators) {\n\t\tif (normalized.includes(indicator)) {\n\t\t\treturn \"mathml\"\n\t\t}\n\t}\n\n\treturn \"html\"\n}\n\n/**\n * Strips QTI namespace prefixes from tag names.\n * Converts \"qti-choice-interaction\" to \"div\" or similar HTML equivalent.\n * Preserves MathML and standard HTML tags unchanged.\n */\nfunction stripQtiPrefix(tagName: string): string {\n\t// Map QTI elements to semantic HTML equivalents\n\tconst qtiToHtml: Record<string, string> = {\n\t\t\"qti-item-body\": \"div\",\n\t\t\"qti-choice-interaction\": \"div\",\n\t\t\"qti-simple-choice\": \"div\",\n\t\t\"qti-feedback-block\": \"div\",\n\t\t\"qti-content-body\": \"div\",\n\t\t\"qti-prompt\": \"div\",\n\t\t\"qti-value\": \"span\",\n\t\t\"qti-variable\": \"span\",\n\t\t\"qti-correct-response\": \"div\"\n\t}\n\n\tif (qtiToHtml[tagName]) {\n\t\treturn qtiToHtml[tagName]\n\t}\n\n\t// Strip \"qti-\" prefix for unknown QTI elements\n\tif (tagName.startsWith(\"qti-\")) {\n\t\treturn tagName.slice(4)\n\t}\n\n\t// Preserve MathML and HTML tags as-is\n\treturn tagName\n}\n\n/**\n * Serializes node attributes to an HTML attribute string.\n * Filters out QTI-specific attributes that shouldn't appear in rendered HTML.\n */\nfunction serializeAttributes(attrs: Record<string, unknown>): string {\n\t// Attributes to exclude from HTML output\n\tconst excludeAttrs = [\n\t\t\"identifier\",\n\t\t\"response-identifier\",\n\t\t\"shuffle\",\n\t\t\"max-choices\",\n\t\t\"min-choices\",\n\t\t\"cardinality\",\n\t\t\"base-type\",\n\t\t\"outcome-identifier\",\n\t\t\"show-hide\",\n\t\t\"time-dependent\",\n\t\t\"adaptive\",\n\t\t\"xml-lang\"\n\t]\n\n\tconst parts: string[] = []\n\n\tfor (const [key, value] of Object.entries(attrs)) {\n\t\tif (excludeAttrs.includes(key)) continue\n\t\tif (value == null) continue\n\n\t\t// Convert kebab-case QTI attrs to camelCase where appropriate\n\t\tconst htmlKey = key === \"xml:lang\" ? \"lang\" : key\n\t\tconst escapedValue = escapeHtml(String(value))\n\t\tparts.push(`${htmlKey}=\"${escapedValue}\"`)\n\t}\n\n\treturn parts.join(\" \")\n}\n\n/**\n * Escapes HTML special characters to prevent XSS.\n * Used for text content, not for preserving markup.\n * \n * NOTE: We only escape < and > to prevent tag injection.\n * We preserve & because:\n * 1. The content goes through sanitizeHtml before display\n * 2. Entity references like &#xA0; must be preserved for proper rendering\n */\nfunction escapeHtml(text: string): string {\n\t// Only escape angle brackets to prevent tag injection\n\t// Preserve & for entity references (&#xA0;, &nbsp;, etc.)\n\treturn text.replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\")\n}\n\n/**\n * Checks if a tag name is a MathML element.\n */\nfunction isMathMLElement(tagName: string): boolean {\n\tconst mathMLTags = [\n\t\t\"mi\",\n\t\t\"mn\",\n\t\t\"mo\",\n\t\t\"mtext\",\n\t\t\"mspace\",\n\t\t\"ms\",\n\t\t\"mrow\",\n\t\t\"mfrac\",\n\t\t\"msqrt\",\n\t\t\"mroot\",\n\t\t\"mstyle\",\n\t\t\"msub\",\n\t\t\"msup\",\n\t\t\"msubsup\",\n\t\t\"munder\",\n\t\t\"mover\",\n\t\t\"munderover\",\n\t\t\"mtable\",\n\t\t\"mtr\",\n\t\t\"mtd\"\n\t]\n\treturn mathMLTags.includes(tagName)\n}\n\n/**\n * Serializes MathML nodes verbatim to preserve exact structure.\n * Does not apply QTI transformations or attribute filtering.\n */\nfunction serializeVerbatim(node: NormalizedNode): string {\n\tconst attrs = Object.entries(node.attrs)\n\t\t.map(([key, value]) => {\n\t\t\tif (value == null) return \"\"\n\t\t\treturn ` ${key}=\"${String(value).replace(/\"/g, \"&quot;\")}\"`\n\t\t})\n\t\t.join(\"\")\n\n\tif (node.children.length === 0) {\n\t\treturn `<${node.tagName}${attrs} />`\n\t}\n\n\tconst inner = node.children\n\t\t.map((child) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\t// Recursively serialize MathML children verbatim\n\t\t\treturn serializeVerbatim(child)\n\t\t})\n\t\t.join(\"\")\n\n\treturn `<${node.tagName}${attrs}>${inner}</${node.tagName}>`\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayGap, DisplayInlineEmbed, DisplayTextEmbed } from \"../../shared/types\"\n\n/**\n * Renders HTML content with proper MathML support\n * Uses innerHTML assignment to preserve MathML structure\n */\nexport function HTMLContent({\n\thtml,\n\tclassName,\n\tinlineEmbeds,\n\ttextEmbeds,\n\tgapEmbeds,\n\trenderInline,\n\trenderTextEntry,\n\trenderGap\n}: {\n\thtml: string\n\tclassName?: string\n\tinlineEmbeds?: Record<string, DisplayInlineEmbed>\n\ttextEmbeds?: Record<string, DisplayTextEmbed>\n\tgapEmbeds?: Record<string, DisplayGap>\n\trenderInline?: (embed: DisplayInlineEmbed) => React.ReactElement\n\trenderTextEntry?: (embed: DisplayTextEmbed) => React.ReactElement\n\trenderGap?: (gap: DisplayGap) => React.ReactElement\n}) {\n\t// Create a ref to handle MathML fallback if needed\n\tconst containerRef = React.useRef<HTMLDivElement>(null)\n\tconst [targets, setTargets] = React.useState<Record<string, Element>>({})\n\n\t// Sanitize incoming HTML to strip unsafe and layout-breaking attributes\n\tconst safeHtml = React.useMemo(() => sanitizeForDisplay(html), [html])\n\n\t// Apply sanitized HTML to the container whenever it changes, and find targets\n\tReact.useEffect(() => {\n\t\tconst el = containerRef.current\n\t\tif (!el) return\n\t\tel.innerHTML = safeHtml\n\n\t\tconst newTargets: Record<string, Element> = {}\n\n\t\t// Find inline dropdown placeholders\n\t\tif (inlineEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-inline]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst responseId = node.getAttribute(\"data-qti-inline\")\n\t\t\t\tif (responseId && inlineEmbeds[responseId]) {\n\t\t\t\t\tnewTargets[responseId] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find text entry placeholders\n\t\tif (textEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-text-entry]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst responseId = node.getAttribute(\"data-qti-text-entry\")\n\t\t\t\tif (responseId && textEmbeds[responseId]) {\n\t\t\t\t\tnewTargets[responseId] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find gap placeholders (for gap match interactions)\n\t\tif (gapEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-gap]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst gapId = node.getAttribute(\"data-qti-gap\")\n\t\t\t\tif (gapId && gapEmbeds[gapId]) {\n\t\t\t\t\tnewTargets[`gap-${gapId}`] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetTargets(newTargets)\n\t}, [safeHtml, inlineEmbeds, textEmbeds, gapEmbeds]) // Re-scan if structure changes\n\n\t// Render portals declaratively based on targets\n\t// This ensures React reconciles them properly even if renderTextEntry changes identity\n\tconst portals = React.useMemo(() => {\n\t\tconst items: React.ReactNode[] = []\n\n\t\tif (inlineEmbeds && renderInline) {\n\t\t\tfor (const [id, embed] of Object.entries(inlineEmbeds)) {\n\t\t\t\tconst target = targets[id]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderInline(embed), target, id))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (textEmbeds && renderTextEntry) {\n\t\t\tfor (const [id, embed] of Object.entries(textEmbeds)) {\n\t\t\t\tconst target = targets[id]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderTextEntry(embed), target, id))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (gapEmbeds && renderGap) {\n\t\t\tfor (const [id, gap] of Object.entries(gapEmbeds)) {\n\t\t\t\tconst target = targets[`gap-${id}`]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderGap(gap), target, `gap-${id}`))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn items\n\t}, [targets, inlineEmbeds, textEmbeds, gapEmbeds, renderInline, renderTextEntry, renderGap])\n\n\tReact.useEffect(() => {\n\t\t// Check if MathML is supported\n\t\tconst checkMathMLSupport = () => {\n\t\t\tconst mml = document.createElement(\"math\")\n\t\t\tmml.innerHTML = \"<mspace/>\"\n\t\t\tconst firstChild = mml.firstChild\n\t\t\treturn firstChild instanceof Element && firstChild.namespaceURI === \"http://www.w3.org/1998/Math/MathML\"\n\t\t}\n\n\t\t// If MathML is not supported, we could add fallback logic here\n\t\tif (!checkMathMLSupport() && containerRef.current?.querySelector(\"math\")) {\n\t\t\t// Intentionally quiet: sanitized HTML is still rendered\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"qti-html-content text-foreground text-lg font-medium leading-relaxed\",\n\t\t\t\t\t// Ensure images never stretch or overflow\n\t\t\t\t\t\"[&_img]:max-w-full [&_img]:h-auto [&_img]:w-auto [&_img]:object-contain [&_img]:block [&_img]:mx-auto\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{portals}\n\t\t</>\n\t)\n}\n\nexport default HTMLContent\n","\"use client\"\n\nimport { HTMLContent } from \"./shared/html-content\"\n\nexport function FeedbackMessage({\n\tresponseId,\n\tshowFeedback,\n\tperResponseFeedback\n}: {\n\tresponseId: string\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n\tif (!showFeedback) return null\n\tconst entry = perResponseFeedback?.[responseId]\n\tconst messageHtml = entry?.messageHtml\n\tif (!messageHtml) return null\n\tconst isCorrect = entry?.isCorrect === true\n\treturn (\n\t\t<div className=\"qti-feedback mt-3 p-6\" data-correct={isCorrect}>\n\t\t\t<HTMLContent html={messageHtml} />\n\t\t</div>\n\t)\n}\n\nexport default FeedbackMessage\n","\"use client\"\n\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst choiceIndicatorVariants = cva(\n\t[\n\t\t\"cursor-pointer shrink-0 rounded-xs size-6 text-xs font-extrabold flex items-center justify-center outline-none\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"data-[state=unchecked]:bg-background data-[state=unchecked]:border-2 data-[state=unchecked]:border-input data-[state=unchecked]:text-muted-foreground\",\n\t\t\"data-[state=checked]:border-2 data-[state=checked]:border-[var(--choice-complement)] data-[state=checked]:text-[var(--choice-foreground)]\",\n\t\t\"data-[filled=true]:data-[state=checked]:bg-[var(--choice-complement)]\",\n\t\t\"data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)] dark:data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)]\",\n\t\t\"focus-visible:ring-[var(--choice-complement)] focus-visible:ring-[3px]\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--choice-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--choice-complement:var(--color-muted-foreground)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\"[--choice-foreground:var(--color-betta)]\", \"[--choice-complement:var(--color-butterfly)]\"],\n\t\t\t\tcardinal: [\"[--choice-foreground:var(--color-cardinal)]\", \"[--choice-complement:var(--color-fire-ant)]\"],\n\t\t\t\tbee: [\"[--choice-foreground:var(--color-bee)]\", \"[--choice-complement:var(--color-lion)]\"],\n\t\t\t\towl: [\"[--choice-foreground:var(--color-owl)]\", \"[--choice-complement:var(--color-tree-frog)]\"],\n\t\t\t\tmacaw: [\"[--choice-foreground:var(--color-macaw)]\", \"[--choice-complement:var(--color-whale)]\"]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\ninterface ChoiceIndicatorProps extends VariantProps<typeof choiceIndicatorVariants> {\n\tletter?: string\n\ttype?: \"radio\" | \"checkbox\"\n\tshowLetter?: boolean\n\tclassName?: string\n\tid?: string\n\tvalue?: string\n\tchecked?: boolean\n\tonCheckedChange?: (checked: boolean) => void\n\tdisabled?: boolean\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n}\n\nfunction ChoiceIndicator({\n\tclassName,\n\tpalette = \"default\",\n\tletter,\n\ttype = \"radio\",\n\tshowLetter = true,\n\t...props\n}: ChoiceIndicatorProps) {\n\tconst baseClassName = cn(choiceIndicatorVariants({ palette }), className)\n\n\tif (type === \"checkbox\") {\n\t\tconst checkboxProps = props as React.ComponentProps<typeof CheckboxPrimitive.Root>\n\t\treturn (\n\t\t\t<CheckboxPrimitive.Root\n\t\t\t\tdata-slot=\"choice-indicator\"\n\t\t\t\tdata-palette={palette}\n\t\t\t\tdata-filled={!showLetter}\n\t\t\t\tclassName={baseClassName}\n\t\t\t\t{...checkboxProps}\n\t\t\t>\n\t\t\t\t{showLetter && <span className=\"data-[state=unchecked]:block data-[state=checked]:hidden\">{letter}</span>}\n\t\t\t</CheckboxPrimitive.Root>\n\t\t)\n\t}\n\n\tconst radioProps = props as React.ComponentProps<typeof RadioGroupPrimitive.Item>\n\treturn (\n\t\t<RadioGroupPrimitive.Item\n\t\t\tdata-slot=\"choice-indicator\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={baseClassName}\n\t\t\t{...radioProps}\n\t\t>\n\t\t\t{letter}\n\t\t</RadioGroupPrimitive.Item>\n\t)\n}\n\nexport { ChoiceIndicator, choiceIndicatorVariants }\n","\"use client\"\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n\treturn (\n\t\t<LabelPrimitive.Root\n\t\t\tdata-slot=\"label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport { Label }\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { useMemo } from \"react\"\n\nimport { cn, type Palette } from \"../lib/utils\"\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n\treturn (\n\t\t<fieldset\n\t\t\tdata-slot=\"field-set\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-6\",\n\t\t\t\t\"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldLegend({\n\tclassName,\n\tvariant = \"legend\",\n\t...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n\treturn (\n\t\t<legend\n\t\t\tdata-slot=\"field-legend\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\"mb-3 font-medium\", \"data-[variant=legend]:text-base\", \"data-[variant=label]:text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-group\"\n\t\t\tclassName={cn(\n\t\t\t\t\"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nconst fieldVariants = cva(\"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\", {\n\tvariants: {\n\t\torientation: {\n\t\t\tvertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n\t\t\thorizontal: [\n\t\t\t\t\"flex-row items-center\",\n\t\t\t\t\"[&>[data-slot=field-label]]:flex-auto\",\n\t\t\t\t\"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\"\n\t\t\t],\n\t\t\tresponsive: [\n\t\t\t\t\"flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto\",\n\t\t\t\t\"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n\t\t\t\t\"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\"\n\t\t\t]\n\t\t}\n\t},\n\tdefaultVariants: {\n\t\torientation: \"vertical\"\n\t}\n})\n\nfunction Field({\n\tclassName,\n\torientation = \"vertical\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\tdata-slot=\"field\"\n\t\t\tdata-orientation={orientation}\n\t\t\tclassName={cn(fieldVariants({ orientation }), className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-content\"\n\t\t\tclassName={cn(\"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldLabel({\n\tclassName,\n\tpalette = \"default\",\n\t...props\n}: React.ComponentProps<typeof Label> & {\n\tpalette?: Palette\n}) {\n\treturn (\n\t\t<Label\n\t\t\tdata-slot=\"field-label\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/field-label peer/field-label flex w-fit gap-2 leading-snug cursor-pointer\",\n\t\t\t\t\"group-data-[disabled=true]/field:opacity-50\",\n\t\t\t\t\"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-xs has-[>[data-slot=field]]:p-4\",\n\t\t\t\t\"has-[>[data-slot=field]]:border-2 has-[>[data-slot=field]]:shadow-[0_2px_0_var(--field-complement)]\",\n\t\t\t\t\"has-[>[data-slot=field]]:hover:brightness-90 dark:has-[>[data-slot=field]]:hover:brightness-75\",\n\t\t\t\t\"has-[>[data-slot=field]]:active:shadow-none has-[>[data-slot=field]]:active:translate-y-[2px]\",\n\t\t\t\t\"[--field-background:var(--color-background)]\",\n\t\t\t\t\"[--field-complement:var(--color-accent)]\",\n\t\t\t\t\"has-[>[data-slot=field]]:bg-[var(--field-background)] has-[>[data-slot=field]]:border-accent has-[>[data-slot=field]]:text-foreground\",\n\t\t\t\t\"has-[>[data-slot=field]]:has-data-[state=checked]:bg-[var(--field-foreground)]/10 has-[>[data-slot=field]]:has-data-[state=checked]:border-[var(--field-complement)] has-[>[data-slot=field]]:has-data-[state=checked]:text-[var(--field-foreground)]\",\n\t\t\t\t\"has-data-[state=checked]:[--field-complement:var(--field-shadow)]\",\n\t\t\t\t\"data-[palette=default]:[--field-foreground:var(--color-foreground)] data-[palette=default]:[--field-shadow:var(--color-muted-foreground)]\",\n\t\t\t\t\"data-[palette=betta]:[--field-foreground:var(--color-betta)] data-[palette=betta]:[--field-shadow:var(--color-butterfly)]\",\n\t\t\t\t\"data-[palette=cardinal]:[--field-foreground:var(--color-cardinal)] data-[palette=cardinal]:[--field-shadow:var(--color-fire-ant)]\",\n\t\t\t\t\"data-[palette=bee]:[--field-foreground:var(--color-bee)] data-[palette=bee]:[--field-shadow:var(--color-lion)]\",\n\t\t\t\t\"data-[palette=owl]:[--field-foreground:var(--color-owl)] data-[palette=owl]:[--field-shadow:var(--color-tree-frog)]\",\n\t\t\t\t\"data-[palette=macaw]:[--field-foreground:var(--color-macaw)] data-[palette=macaw]:[--field-shadow:var(--color-whale)]\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"field-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance\",\n\t\t\t\t\"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n\t\t\t\t\"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldSeparator({\n\tchildren,\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-separator\"\n\t\t\tdata-content={!!children}\n\t\t\tclassName={cn(\"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Separator className=\"absolute inset-0 top-1/2\" />\n\t\t\t{children && (\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n\t\t\t\t\tdata-slot=\"field-separator-content\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nfunction FieldError({\n\tclassName,\n\tchildren,\n\terrors,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\terrors?: Array<{ message?: string } | undefined>\n}) {\n\tconst content = useMemo(() => {\n\t\tif (children) {\n\t\t\treturn children\n\t\t}\n\n\t\tif (!errors?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()]\n\n\t\tif (uniqueErrors?.length == 1) {\n\t\t\treturn uniqueErrors[0]?.message\n\t\t}\n\n\t\treturn (\n\t\t\t<ul className=\"ml-4 flex list-disc flex-col gap-1\">\n\t\t\t\t{uniqueErrors.map((error, index) => error?.message && <li key={index}>{error.message}</li>)}\n\t\t\t</ul>\n\t\t)\n\t}, [children, errors])\n\n\tif (!content) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tdata-slot=\"field-error\"\n\t\t\tclassName={cn(\"text-destructive text-sm font-normal\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{content}\n\t\t</div>\n\t)\n}\n\nexport {\n\tField,\n\tFieldLabel,\n\tFieldDescription,\n\tFieldError,\n\tFieldGroup,\n\tFieldLegend,\n\tFieldSeparator,\n\tFieldSet,\n\tFieldContent,\n\tFieldTitle\n}\n","\"use client\"\n\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { CircleIcon } from \"lucide-react\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst radioGroupItemVariants = cva(\n\t[\n\t\t\"cursor-pointer\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t\"text-[var(--radio-group-item-foreground)] bg-[var(--radio-group-item-background)] dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border outline-none\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"data-[state=unchecked]:border-input\",\n\t\t\"data-[state=checked]:border-[var(--radio-group-item-complement)]\",\n\t\t\"focus-visible:ring-[var(--radio-group-item-foreground)] focus-visible:ring-[3px]\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-foreground)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\nfunction RadioGroup({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n\treturn <RadioGroupPrimitive.Root data-slot=\"radio-group\" className={cn(\"grid gap-3\", className)} {...props} />\n}\n\nfunction RadioGroupItem({\n\tclassName,\n\tpalette = \"default\",\n\t...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item> & VariantProps<typeof radioGroupItemVariants>) {\n\treturn (\n\t\t<RadioGroupPrimitive.Item\n\t\t\tdata-slot=\"radio-group-item\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(radioGroupItemVariants({ palette, className }))}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RadioGroupPrimitive.Indicator\n\t\t\t\tdata-slot=\"radio-group-indicator\"\n\t\t\t\tclassName=\"relative flex items-center justify-center\"\n\t\t\t>\n\t\t\t\t<CircleIcon className=\"fill-[var(--radio-group-item-foreground)] absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n\t\t\t</RadioGroupPrimitive.Indicator>\n\t\t</RadioGroupPrimitive.Item>\n\t)\n}\n\nexport { RadioGroup, RadioGroupItem, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { ChoiceInteraction } from \"../../schema\"\nimport { ChoiceIndicator } from \"../../ui/choice-indicator\"\nimport { Field, FieldContent, FieldGroup, FieldLabel, FieldSet, FieldTitle } from \"../../ui/field\"\nimport { RadioGroup } from \"../../ui/radio-group\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChoiceInteractionRendererProps {\n\t/** The choice interaction to render */\n\tinteraction: ChoiceInteraction\n\t/** Current user response for this interaction */\n\tresponse?: string | string[]\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string | string[]) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness (single-select) used for selected coloring */\n\tisCorrect?: boolean\n\t/** Per-selection correctness (multi-select) for secure highlighting */\n\tselectedChoicesCorrectness?: Array<{ id: string; isCorrect: boolean }>\n}\n\n// ============================================================================\n// Choice Interaction Renderer\n// ============================================================================\n\n/**\n * Renders a choice interaction (single or multiple choice)\n */\nexport function ChoiceInteractionRenderer({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect,\n\tselectedChoicesCorrectness\n}: ChoiceInteractionRendererProps) {\n\tconst isMultiple = interaction.maxChoices > 1\n\tconst selectedValues = React.useMemo(() => {\n\t\tif (!response) return []\n\t\treturn Array.isArray(response) ? response : [response]\n\t}, [response])\n\n\t// Detect if all choices are image-only (contains <img> and no text once tags are stripped)\n\tconst isImagesOnly = React.useMemo(() => {\n\t\tconst hasImg = (html: string) => html.toLowerCase().includes(\"<img\")\n\t\tconst stripped = (html: string) => html.replace(/<[^>]*>/g, \"\").trim()\n\t\treturn (\n\t\t\tinteraction.choices.length > 0 &&\n\t\t\tinteraction.choices.every((c) => hasImg(c.contentHtml) && stripped(c.contentHtml) === \"\")\n\t\t)\n\t}, [interaction.choices])\n\n\tconst choiceCount = interaction.choices.length\n\n\t// Grid layout for image-only sets (using CSS classes from themes.css)\n\tconst gridClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"space-y-2\"\n\t\tswitch (choiceCount) {\n\t\t\tcase 4:\n\t\t\t\treturn \"qti-image-grid-4\"\n\t\t\tcase 3:\n\t\t\t\treturn \"qti-image-grid-3\"\n\t\t\tcase 2:\n\t\t\t\treturn \"qti-image-grid-2\"\n\t\t\tdefault:\n\t\t\t\treturn \"qti-image-grid-many\"\n\t\t}\n\t}, [isImagesOnly, choiceCount])\n\n\t// Image sizing/centering helpers applied to the content wrapper\n\tconst imageCardClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"\"\n\t\treturn choiceCount === 2 ? \"qti-image-card qti-image-card-large\" : \"qti-image-card\"\n\t}, [isImagesOnly, choiceCount])\n\n\tconst handleSingleChoice = (value: string) => {\n\t\tif (!disabled && onAnswerSelect) {\n\t\t\tonAnswerSelect(value)\n\t\t}\n\t}\n\n\t// Removed unused handler in favor of inline onCheckedChange logic\n\n\t// Render prompt if present\n\tconst promptElement = interaction.promptHtml ? <HTMLContent html={interaction.promptHtml} className=\"mb-4\" /> : null\n\n\t// Single choice (radio) with Field UI\n\tif (!isMultiple) {\n\t\tconst submitted = hasSubmitted === true\n\t\treturn (\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t{promptElement}\n\t\t\t\t<RadioGroup\n\t\t\t\t\tvalue={selectedValues[0] || \"\"}\n\t\t\t\t\tonValueChange={(value) => handleSingleChoice(value)}\n\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t>\n\t\t\t\t\t<FieldGroup>\n\t\t\t\t\t\t<FieldSet>\n\t\t\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t\t\t{interaction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tinteraction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isSelected && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isSelected && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</FieldSet>\n\t\t\t\t\t</FieldGroup>\n\t\t\t\t</RadioGroup>\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// Multi-select (checkbox) with Field UI\n\tconst submitted = hasSubmitted === true\n\tconst atMax = selectedValues.length >= interaction.maxChoices\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{promptElement}\n\t\t\t<FieldGroup>\n\t\t\t\t<FieldSet>\n\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t{interaction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tinteraction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={submitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t)}\n\t\t\t\t</FieldSet>\n\t\t\t</FieldGroup>\n\t\t</div>\n\t)\n}\n\nexport default ChoiceInteractionRenderer\n","\"use client\"\n\nimport { closestCenter, DndContext, type DragEndEvent, DragOverlay, useDraggable, useDroppable } from \"@dnd-kit/core\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayGap, DisplayGapMatchInteraction, DisplayGapText } from \"../../shared/types\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\n/**\n * Renders pre-sanitized HTML content inline.\n * Content is sanitized server-side before being sent to the client.\n */\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<gapId, sourceId> */\ntype GapMatchState = Record<string, string>\n\n/** Convert internal state to QTI response format: [\"sourceId gapId\", ...] */\nfunction toQtiResponse(state: GapMatchState): string[] {\n\treturn Object.entries(state).map(([gapId, sourceId]) => `${sourceId} ${gapId}`)\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): GapMatchState {\n\tconst state: GapMatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst gapId = parts[1]\n\t\tif (sourceId && gapId) {\n\t\t\tstate[gapId] = sourceId\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Palette Variants\n// ============================================================================\n\nconst gapSlotVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"min-w-[4rem] min-h-[1.75rem] px-2 mx-1 my-1\",\n\t\t\"border rounded-xs align-middle\",\n\t\t\"transition-all duration-150\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-muted-foreground/30 bg-muted/20\",\n\t\t\t\thover: \"border-macaw bg-macaw/10\",\n\t\t\t\tfilled: \"border-macaw bg-macaw/10\",\n\t\t\t\tcorrect: \"border-owl bg-owl/15\",\n\t\t\t\tincorrect: \"border-cardinal bg-cardinal/15\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tselected: \"bg-macaw/15 border-macaw shadow-[0_2px_0_var(--color-whale)] ring-2 ring-macaw/30\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Source Token\n// ============================================================================\n\ninterface SourceTokenProps {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisSelected: boolean\n\tonClick: () => void\n\tremainingUses: number\n}\n\nfunction SourceToken({ id, contentHtml, disabled, isSelected, onClick, remainingUses }: SourceTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `source-${id}`,\n\t\tdata: { type: \"source\", sourceId: id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\t// Don't apply transform here - the DragOverlay handles the visual that follows the cursor.\n\t// The original element stays in place and fades out when dragging.\n\n\tconst getState = (): \"idle\" | \"selected\" | \"dragging\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isDragging) return \"dragging\"\n\t\tif (isSelected) return \"selected\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<button\n\t\t\tref={setNodeRef}\n\t\t\ttype=\"button\"\n\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\tclassName={cn(sourceTokenVariants({ state: getState() }), \"active:cursor-grabbing\")}\n\t\t\tdisabled={disabled}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-1 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Gap Slot\n// ============================================================================\n\ninterface GapSlotProps {\n\tgapId: string\n\tfilledWith: DisplayGapText | undefined\n\tonClear: () => void\n\tonClick: () => void\n\tdisabled: boolean\n\tisCorrect?: boolean\n\thasSubmitted: boolean\n}\n\nfunction GapSlot({ gapId, filledWith, onClear, onClick, disabled, isCorrect, hasSubmitted }: GapSlotProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `gap-${gapId}`,\n\t\tdata: { type: \"gap\", gapId },\n\t\tdisabled\n\t})\n\n\tconst getState = (): VariantProps<typeof gapSlotVariants>[\"state\"] => {\n\t\tif (hasSubmitted && filledWith) {\n\t\t\treturn isCorrect ? \"correct\" : \"incorrect\"\n\t\t}\n\t\tif (isOver) return \"hover\"\n\t\tif (filledWith) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\treturn (\n\t\t<span ref={setNodeRef} className={cn(gapSlotVariants({ state: getState() }))}>\n\t\t\t{filledWith ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClear}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center gap-1\",\n\t\t\t\t\t\t!disabled && \"hover:text-cardinal cursor-pointer\",\n\t\t\t\t\t\tdisabled && \"cursor-default\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<SafeInlineHTML html={filledWith.contentHtml} />\n\t\t\t\t\t{!disabled && <span className=\"text-xs opacity-60\">×</span>}\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"w-full h-full min-h-[1.5em] flex items-center justify-center\",\n\t\t\t\t\t\t!disabled && \"cursor-pointer hover:bg-macaw/5\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"opacity-30\">___</span>\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n\n// ============================================================================\n// Main Gap Match Interaction Component\n// ============================================================================\n\nexport interface GapMatchInteractionProps {\n\tinteraction: DisplayGapMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\t/** Per-gap correctness: Record<gapId, isCorrect> */\n\tgapCorrectness?: Record<string, boolean>\n}\n\nexport function GapMatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tgapCorrectness\n}: GapMatchInteractionProps) {\n\t// Convert QTI response to internal state\n\tconst currentPairs = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track selected source token for click-to-place\n\tconst [selectedSourceId, setSelectedSourceId] = React.useState<string | null>(null)\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(\n\t\t() => interaction.gapTexts.find((gt) => gt.id === activeDragId),\n\t\t[activeDragId, interaction.gapTexts]\n\t)\n\n\t// Calculate remaining uses for each source token\n\tconst getRemainingUses = (sourceId: string): number => {\n\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\t\tif (!source) return 0\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\tconst usedCount = Object.values(currentPairs).filter((id) => id === sourceId).length\n\t\treturn source.matchMax - usedCount\n\t}\n\n\t// Handle source token click (select for click-to-place)\n\tconst handleSourceClick = (sourceId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tsetSelectedSourceId((prev) => (prev === sourceId ? null : sourceId))\n\t}\n\n\t// Handle gap click (place selected token)\n\tconst handleGapClick = (gapId: string) => {\n\t\tif (disabled || hasSubmitted || !selectedSourceId) return\n\n\t\t// Check if source still has remaining uses\n\t\tif (getRemainingUses(selectedSourceId) <= 0) {\n\t\t\tsetSelectedSourceId(null)\n\t\t\treturn\n\t\t}\n\n\t\t// Place the selected token in the gap\n\t\tconst newPairs = { ...currentPairs, [gapId]: selectedSourceId }\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\tsetSelectedSourceId(null)\n\t}\n\n\t// Handle clearing a gap\n\tconst handleClearGap = (gapId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tconst newPairs = { ...currentPairs }\n\t\tdelete newPairs[gapId]\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t}\n\n\t// Handle drag end (drop source on gap)\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst sourceData = active.data.current\n\t\tconst targetData = over.data.current\n\n\t\tif (sourceData?.type === \"source\" && targetData?.type === \"gap\") {\n\t\t\tconst sourceId = sourceData.sourceId\n\t\t\tconst gapId = targetData.gapId\n\n\t\t\tif (typeof sourceId === \"string\" && typeof gapId === \"string\") {\n\t\t\t\t// Check remaining uses\n\t\t\t\tif (getRemainingUses(sourceId) <= 0) return\n\n\t\t\t\tconst newPairs = { ...currentPairs, [gapId]: sourceId }\n\t\t\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build gap embeds for HTMLContent\n\tconst gapEmbeds = React.useMemo(() => {\n\t\tconst embeds: Record<string, DisplayGap> = {}\n\t\tfor (const gap of interaction.gaps) {\n\t\t\tembeds[gap.id] = gap\n\t\t}\n\t\treturn embeds\n\t}, [interaction.gaps])\n\n\treturn (\n\t\t<DndContext\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tconst id = e.active.id\n\t\t\t\tconst sourceId = typeof id === \"string\" ? id.replace(\"source-\", \"\") : null\n\t\t\t\tsetActiveDragId(sourceId)\n\t\t\t\tsetSelectedSourceId(null) // Clear selection when dragging\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Source Pool */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\t\t\"flex flex-wrap gap-2 min-h-[3.5rem]\",\n\t\t\t\t\t\tdisabled || hasSubmitted ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{interaction.gapTexts.map((source) => (\n\t\t\t\t\t\t<SourceToken\n\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\tid={source.id}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tisSelected={selectedSourceId === source.id}\n\t\t\t\t\t\t\tonClick={() => handleSourceClick(source.id)}\n\t\t\t\t\t\t\tremainingUses={getRemainingUses(source.id)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t\t{interaction.gapTexts.every((s) => getRemainingUses(s.id) <= 0)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Hint for click-to-place */}\n\t\t\t\t{selectedSourceId && !disabled && !hasSubmitted && (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground animate-pulse\">Click a gap to place the selected token</p>\n\t\t\t\t)}\n\n\t\t\t\t{/* Content with Gap Slots */}\n\t\t\t\t<div className=\"leading-relaxed text-lg\">\n\t\t\t\t\t<HTMLContent\n\t\t\t\t\t\thtml={interaction.contentHtml}\n\t\t\t\t\t\tgapEmbeds={gapEmbeds}\n\t\t\t\t\t\trenderGap={(gap) => {\n\t\t\t\t\t\t\tconst sourceId = currentPairs[gap.id]\n\t\t\t\t\t\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GapSlot\n\t\t\t\t\t\t\t\t\tgapId={gap.id}\n\t\t\t\t\t\t\t\t\tfilledWith={source}\n\t\t\t\t\t\t\t\t\tonClear={() => handleClearGap(gap.id)}\n\t\t\t\t\t\t\t\t\tonClick={() => handleGapClick(gap.id)}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\t\t\tisCorrect={gapCorrectness?.[gap.id]}\n\t\t\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay - dropAnimation={null} prevents the slow settling lag */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"selected\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default GapMatchInteraction\n","// Deterministic shuffle using a string seed\n\nfunction xmur3(str: string): () => number {\n\tlet h = 1779033703 ^ str.length\n\tfor (let i = 0; i < str.length; i++) {\n\t\th = Math.imul(h ^ str.charCodeAt(i), 3432918353)\n\t\th = (h << 13) | (h >>> 19)\n\t}\n\treturn () => {\n\t\th = Math.imul(h ^ (h >>> 16), 2246822507)\n\t\th = Math.imul(h ^ (h >>> 13), 3266489909)\n\t\tconst shifted = h >>> 16\n\t\th = h ^ shifted\n\t\treturn h >>> 0\n\t}\n}\n\nfunction mulberry32(seed: number): () => number {\n\tlet state = seed\n\treturn () => {\n\t\tstate = state + 0x6d2b79f5\n\t\tlet t = state\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1)\n\t\tt = t ^ (t + Math.imul(t ^ (t >>> 7), t | 61))\n\t\treturn ((t ^ (t >>> 14)) >>> 0) / 4294967296\n\t}\n}\n\nexport function shuffleWithSeed<T>(items: T[], seed: string): T[] {\n\tconst out = items.slice()\n\tconst seedFn = xmur3(seed)\n\tconst rng = mulberry32(seedFn())\n\tfor (let i = out.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng() * (i + 1))\n\t\tconst vi = out[i]\n\t\tconst vj = out[j]\n\t\tif (vi === undefined || vj === undefined) continue\n\t\tout[i] = vj\n\t\tout[j] = vi\n\t}\n\treturn out\n}\n","\"use client\"\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst selectTriggerVariants = cva(\n\t[\n\t\t\"cursor-pointer\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t\"border-[var(--select-complement)] text-[var(--select-foreground)] bg-[var(--select-background)] inline-flex items-center justify-between gap-2 align-baseline rounded-xs px-3 py-2 text-sm whitespace-nowrap outline-none\",\n\t\t\"data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2\",\n\t\t\"[&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-accent)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t},\n\t\t\toutline: {\n\t\t\t\ttrue: [\"border-2 shadow-[0_2px_0_var(--select-complement)]\"],\n\t\t\t\tfalse: [\"border-none shadow-[0_3px_0_var(--select-complement)]\"]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\",\n\t\t\toutline: false\n\t\t}\n\t}\n)\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n\treturn <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n\treturn <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n\treturn (\n\t\t<SelectPrimitive.Value\n\t\t\tdata-slot=\"select-value\"\n\t\t\tclassName={cn(\"text-[var(--select-foreground)]\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectTrigger({\n\tclassName,\n\tsize = \"default\",\n\tpalette = \"default\",\n\tchildren,\n\toutline = true,\n\tstyle,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> &\n\tVariantProps<typeof selectTriggerVariants> & {\n\t\tsize?: \"sm\" | \"default\"\n\t}) {\n\treturn (\n\t\t<SelectPrimitive.Trigger\n\t\t\tdata-slot=\"select-trigger\"\n\t\t\tdata-size={size}\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(selectTriggerVariants({ palette, outline, className }))}\n\t\t\tstyle={{ color: \"var(--select-foreground)\", ...style }}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<SelectPrimitive.Icon asChild>\n\t\t\t\t<ChevronDownIcon className=\"size-4 opacity-50\" />\n\t\t\t</SelectPrimitive.Icon>\n\t\t</SelectPrimitive.Trigger>\n\t)\n}\n\nfunction SelectContent({\n\tclassName,\n\tchildren,\n\tposition = \"popper\",\n\talign = \"center\",\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n\treturn (\n\t\t<SelectPrimitive.Portal>\n\t\t\t<SelectPrimitive.Content\n\t\t\t\tdata-slot=\"select-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xs border border-accent shadow-[0_2px_0_var(--color-accent)]\",\n\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tposition={position}\n\t\t\t\talign={align}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<SelectScrollUpButton />\n\t\t\t\t<SelectPrimitive.Viewport\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-1\",\n\t\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\t\"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</SelectPrimitive.Viewport>\n\t\t\t\t<SelectScrollDownButton />\n\t\t\t</SelectPrimitive.Content>\n\t\t</SelectPrimitive.Portal>\n\t)\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n\treturn (\n\t\t<SelectPrimitive.Label\n\t\t\tdata-slot=\"select-label\"\n\t\t\tclassName={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n\treturn (\n\t\t<SelectPrimitive.Item\n\t\t\tdata-slot=\"select-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-pointer items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<SelectPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</SelectPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n\t\t</SelectPrimitive.Item>\n\t)\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n\treturn (\n\t\t<SelectPrimitive.Separator\n\t\t\tdata-slot=\"select-separator\"\n\t\t\tclassName={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollUpButton\n\t\t\tdata-slot=\"select-scroll-up-button\"\n\t\t\tclassName={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronUpIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollUpButton>\n\t)\n}\n\nfunction SelectScrollDownButton({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollDownButton\n\t\t\tdata-slot=\"select-scroll-down-button\"\n\t\t\tclassName={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronDownIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollDownButton>\n\t)\n}\n\nexport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectLabel,\n\tSelectScrollDownButton,\n\tSelectScrollUpButton,\n\tSelectSeparator,\n\tSelectTrigger,\n\tSelectValue\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport { shuffleWithSeed } from \"../../shared/shuffle\"\nimport type { DisplayInlineEmbed } from \"../../shared/types\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface InlineInteractionProps {\n\t/** Inline interaction payload to render */\n\tembed: DisplayInlineEmbed\n\t/** Current user response (single-select) */\n\tresponse?: string\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness for the selected value (single-select) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Safe HTML Renderer (inline variant)\n// ============================================================================\n\n/**\n * Renders sanitized HTML inline. Uses a ref to set innerHTML after sanitization.\n * This avoids React's dangerouslySetInnerHTML prop while maintaining security.\n */\nfunction SafeInlineHTML({ html, className, style }: { html: string; className?: string; style?: React.CSSProperties }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = sanitizeForDisplay(html)\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} style={style} />\n}\n\n// ============================================================================\n// Inline Interaction Renderer\n// ============================================================================\n\n/**\n * Renders an inline choice interaction as a compact Select control.\n * Mirrors the UX and color rules used by the selects demo and block choice renderer.\n */\nexport function InlineInteraction({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineInteractionProps) {\n\tconst hasValue = typeof response === \"string\" && response.length > 0\n\tconst neutralTriggerClass = hasValue ? \"\" : \"border-border shadow-[0_3px_0_var(--color-border)] focus-visible:ring-0\"\n\n\t// Deterministic shuffle for consistent ordering\n\tconst items = React.useMemo(() => {\n\t\treturn embed.shuffle ? shuffleWithSeed(embed.choices, embed.responseId) : embed.choices\n\t}, [embed])\n\n\t// Feedback-driven palette and invalid state\n\tconst feedbackPalette: typeof palette = hasSubmitted && hasValue ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\tconst ariaInvalid = hasSubmitted && hasValue && isCorrect === false ? true : undefined\n\n\t// Selected label HTML for the trigger (mirror menu label, but we control styling here)\n\tconst selectedLabelHtml = React.useMemo(() => {\n\t\tif (!hasValue) return \"\"\n\t\tconst found = items.find((c) => c.id === response)\n\t\treturn found?.contentHtml ?? \"\"\n\t}, [hasValue, items, response])\n\n\treturn (\n\t\t<Select\n\t\t\tvalue={hasValue ? response : \"\"}\n\t\t\tonValueChange={(value) => {\n\t\t\t\tif (!disabled && onAnswerSelect) onAnswerSelect(value)\n\t\t\t}}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t>\n\t\t\t<SelectTrigger\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclassName={neutralTriggerClass}\n\t\t\t\tpalette={hasValue ? feedbackPalette : \"default\"}\n\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t>\n\t\t\t\t<SelectValue placeholder=\"Select...\">\n\t\t\t\t\t{hasValue ? (\n\t\t\t\t\t\t<SafeInlineHTML\n\t\t\t\t\t\t\thtml={selectedLabelHtml}\n\t\t\t\t\t\t\tclassName=\"text-[var(--select-foreground)]\"\n\t\t\t\t\t\t\tstyle={{ color: \"var(--select-foreground)\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</SelectValue>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent position=\"item-aligned\">\n\t\t\t\t{items.map((c) => (\n\t\t\t\t\t<SelectItem key={c.id} value={c.id}>\n\t\t\t\t\t\t<SafeInlineHTML html={c.contentHtml} />\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t)\n}\n\nexport default InlineInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\tPointerSensor,\n\tuseDraggable,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport { cva } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayAssociableChoice, DisplayMatchInteraction } from \"../../shared/types\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<targetId, sourceId[]> */\ntype MatchState = Record<string, string[]>\n\n/** Create pair key for QTI response */\nfunction createPairKey(sourceId: string, targetId: string): string {\n\treturn `${sourceId} ${targetId}`\n}\n\n/** Convert internal state to QTI response format: [\"sourceId targetId\", ...] */\nfunction toQtiResponse(state: MatchState): string[] {\n\tconst pairs: string[] = []\n\tfor (const [targetId, sourceIds] of Object.entries(state)) {\n\t\tfor (const sourceId of sourceIds) {\n\t\t\tpairs.push(createPairKey(sourceId, targetId))\n\t\t}\n\t}\n\treturn pairs\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): MatchState {\n\tconst state: MatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst targetId = parts[1]\n\t\tif (sourceId && targetId) {\n\t\t\tif (!state[targetId]) {\n\t\t\t\tstate[targetId] = []\n\t\t\t}\n\t\t\tstate[targetId].push(sourceId)\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst targetBoxVariants = cva(\n\t[\"flex flex-col gap-2 p-3 min-h-[8rem] min-w-[10rem]\", \"border-2 rounded-xs\", \"transition-all duration-150\"],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-border border-dashed bg-muted/10\",\n\t\t\t\thover: \"border-macaw border-solid bg-macaw/10 shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tfilled: \"border-macaw border-solid bg-macaw/5 shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tdisabled: \"opacity-60 bg-muted/30 border-dashed\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tplaced: \"bg-macaw/10 border-macaw shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tcorrect: \"bg-owl/15 border-owl shadow-[0_2px_0_var(--color-tree-frog)]\",\n\t\t\t\tincorrect: \"bg-cardinal/15 border-cardinal shadow-[0_2px_0_var(--color-fire-ant)]\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Placed Token (can be moved between containers)\n// ============================================================================\n\ninterface PlacedTokenProps {\n\tinstanceId: string\n\tsourceId: string\n\tfromTargetId: string\n\tfromIndex: number\n\tcontentHtml: string\n\tdisabled: boolean\n\tstate: \"placed\" | \"correct\" | \"incorrect\" | \"disabled\"\n\tonRemove: () => void\n}\n\nfunction PlacedToken({\n\tinstanceId,\n\tsourceId,\n\tfromTargetId,\n\tfromIndex,\n\tcontentHtml,\n\tdisabled,\n\tstate,\n\tonRemove\n}: PlacedTokenProps) {\n\tconst canInteract = !disabled && state !== \"correct\" && state !== \"incorrect\"\n\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: instanceId,\n\t\tdata: { type: \"placed\", sourceId, fromTargetId, fromIndex },\n\t\tdisabled: !canInteract\n\t})\n\n\tconst tokenState = isDragging ? \"dragging\" : state\n\n\t// Don't use disabled={} on button - it blocks drag events\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tref={setNodeRef}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tonClick={canInteract ? onRemove : undefined}\n\t\t\taria-disabled={!canInteract}\n\t\t\tclassName={cn(\n\t\t\t\tsourceTokenVariants({ state: tokenState }),\n\t\t\t\tcanInteract && \"cursor-grab hover:bg-muted/50 group\",\n\t\t\t\t!canInteract && \"cursor-default pointer-events-none\"\n\t\t\t)}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{canInteract && <span className=\"text-xs opacity-40 group-hover:opacity-100 ml-1 transition-opacity\">×</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Target Box\n// ============================================================================\n\ninterface TargetBoxProps {\n\ttarget: DisplayAssociableChoice\n\tplacedSources: Array<{ instanceId: string; source: DisplayAssociableChoice; index: number }>\n\tdisabled: boolean\n\tonRemoveSource: (instanceId: string) => void\n\tpairCorrectness?: Record<string, boolean>\n\thasSubmitted: boolean\n}\n\nfunction TargetBox({ target, placedSources, disabled, onRemoveSource, pairCorrectness, hasSubmitted }: TargetBoxProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `target-${target.id}`,\n\t\tdata: { type: \"target\", targetId: target.id },\n\t\tdisabled\n\t})\n\n\tconst hasSources = placedSources.length > 0\n\n\tconst getState = (): \"empty\" | \"hover\" | \"filled\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isOver) return \"hover\"\n\t\tif (hasSources) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\tconst getTokenState = (sourceId: string): \"placed\" | \"correct\" | \"incorrect\" | \"disabled\" => {\n\t\tif (hasSubmitted) {\n\t\t\tconst pairKey = createPairKey(sourceId, target.id)\n\t\t\tconst isCorrect = pairCorrectness?.[pairKey]\n\t\t\tif (isCorrect === true) return \"correct\"\n\t\t\tif (isCorrect === false) return \"incorrect\"\n\t\t}\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"placed\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(targetBoxVariants({ state: getState() }))}>\n\t\t\t{/* Target Label - Inside at top */}\n\t\t\t<div className=\"text-sm font-semibold text-center pb-2 border-b border-border/50 mb-2\">\n\t\t\t\t<SafeInlineHTML html={target.contentHtml} />\n\t\t\t</div>\n\n\t\t\t{/* Placed tokens or placeholder */}\n\t\t\t{placedSources.length === 0 ? (\n\t\t\t\t<div className=\"flex-1 flex items-center justify-center text-muted-foreground/50 text-sm\">Drop here</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t{placedSources.map(({ instanceId, source, index }) => (\n\t\t\t\t\t\t<PlacedToken\n\t\t\t\t\t\t\tkey={instanceId}\n\t\t\t\t\t\t\tinstanceId={instanceId}\n\t\t\t\t\t\t\tsourceId={source.id}\n\t\t\t\t\t\t\tfromTargetId={target.id}\n\t\t\t\t\t\t\tfromIndex={index}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tstate={getTokenState(source.id)}\n\t\t\t\t\t\t\tonRemove={() => onRemoveSource(instanceId)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Source Pool Token\n// ============================================================================\n\ninterface SourcePoolTokenProps {\n\tsource: DisplayAssociableChoice\n\tremainingUses: number\n\tdisabled: boolean\n}\n\nfunction SourcePoolToken({ source, remainingUses, disabled }: SourcePoolTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `pool-${source.id}`,\n\t\tdata: { type: \"source\", sourceId: source.id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\tconst getState = (): \"idle\" | \"dragging\" | \"disabled\" => {\n\t\tif (isDragging) return \"dragging\"\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(sourceTokenVariants({ state: getState() }))} {...attributes} {...listeners}>\n\t\t\t<SafeInlineHTML html={source.contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-2 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Droppable Source Pool (for returning tokens)\n// ============================================================================\n\ninterface DroppablePoolProps {\n\tdisabled: boolean\n\tchildren: React.ReactNode\n}\n\nfunction DroppablePool({ disabled, children }: DroppablePoolProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: \"source-pool\",\n\t\tdata: { type: \"pool\" },\n\t\tdisabled\n\t})\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\"flex flex-wrap justify-center gap-3 min-h-[4rem]\",\n\t\t\t\t\"transition-all duration-150\",\n\t\t\t\tdisabled ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\",\n\t\t\t\tisOver && !disabled && \"border-macaw bg-macaw/10\"\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Main Match Interaction Component\n// ============================================================================\n\nexport interface MatchInteractionProps {\n\tinteraction: DisplayMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tpairCorrectness?: Record<string, boolean>\n}\n\nexport function MatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tpairCorrectness\n}: MatchInteractionProps) {\n\t// Sensors: require 5px movement before drag starts (allows clicks to work)\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: {\n\t\t\t\tdistance: 5\n\t\t\t}\n\t\t})\n\t)\n\n\t// Convert QTI response to internal state\n\tconst currentState = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(() => {\n\t\tif (!activeDragId) return null\n\t\t// Check if it's from pool or already placed\n\t\tconst sourceId = activeDragId.startsWith(\"pool-\") ? activeDragId.replace(\"pool-\", \"\") : activeDragId.split(\"-\")[0] // instanceId format: \"sourceId-targetId-index\"\n\t\treturn interaction.sourceChoices.find((s) => s.id === sourceId)\n\t}, [activeDragId, interaction.sourceChoices])\n\n\t// Count how many times each source is used\n\tconst getSourceUsageCount = (sourceId: string): number => {\n\t\tlet count = 0\n\t\tfor (const sources of Object.values(currentState)) {\n\t\t\tcount += sources.filter((id) => id === sourceId).length\n\t\t}\n\t\treturn count\n\t}\n\n\t// Get remaining uses for a source\n\tconst getRemainingUses = (source: DisplayAssociableChoice): number => {\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\treturn source.matchMax - getSourceUsageCount(source.id)\n\t}\n\n\t// Check if target can accept more\n\tconst canTargetAcceptMore = (target: DisplayAssociableChoice): boolean => {\n\t\tconst placed = currentState[target.id]?.length ?? 0\n\t\tif (target.matchMax === 0) return true // Unlimited\n\t\treturn placed < target.matchMax\n\t}\n\n\t// Handle drag end\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst activeData = active.data.current\n\t\tconst overData = over.data.current\n\n\t\t// Case 1: Dropping on the pool (return to bank)\n\t\tif (overData?.type === \"pool\" && activeData?.type === \"placed\") {\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// Remove from target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Must be dropping on a target for remaining cases\n\t\tif (overData?.type !== \"target\") return\n\t\tconst toTargetId = overData.targetId\n\t\tif (typeof toTargetId !== \"string\") return\n\n\t\tconst toTarget = interaction.targetChoices.find((t) => t.id === toTargetId)\n\t\tif (!toTarget) return\n\n\t\t// Case 2: Dragging from pool to target\n\t\tif (activeData?.type === \"source\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tif (typeof sourceId !== \"string\") return\n\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\tif (!source) return\n\n\t\t\t// Check if we can add\n\t\t\tif (getRemainingUses(source) <= 0) return\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Add to state\n\t\t\tconst newState = { ...currentState }\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Case 3: Dragging from one target to another\n\t\tif (activeData?.type === \"placed\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof sourceId !== \"string\" || typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// If dropping on the same target, do nothing\n\t\t\tif (fromTargetId === toTargetId) return\n\n\t\t\t// Check if the destination can accept more\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Remove from old target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to new target\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t}\n\t}\n\n\t// Handle removing a source from a target\n\tconst handleRemoveSource = (targetId: string, index: number) => {\n\t\tif (disabled || hasSubmitted) return\n\n\t\tconst newState = { ...currentState }\n\t\tconst sources = newState[targetId]\n\t\tif (sources) {\n\t\t\tnewState[targetId] = sources.filter((_, i) => i !== index)\n\t\t\tif (newState[targetId].length === 0) {\n\t\t\t\tdelete newState[targetId]\n\t\t\t}\n\t\t}\n\n\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t}\n\n\t// Build placed sources for each target with instance IDs\n\tconst getPlacedSources = (targetId: string) => {\n\t\tconst sourceIds = currentState[targetId] ?? []\n\t\treturn sourceIds.map((sourceId, index) => {\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\treturn {\n\t\t\t\tinstanceId: `${sourceId}-${targetId}-${index}`,\n\t\t\t\tsource: source ?? { id: sourceId, contentHtml: sourceId, matchMax: 1 },\n\t\t\t\tindex\n\t\t\t}\n\t\t})\n\t}\n\n\treturn (\n\t\t<DndContext\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tsetActiveDragId(String(e.active.id))\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Prompt */}\n\t\t\t\t{interaction.promptHtml && (\n\t\t\t\t\t<div className=\"text-center mb-4\">\n\t\t\t\t\t\t<SafeInlineHTML html={interaction.promptHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Source Pool (Bank) - Now on top, droppable to return tokens */}\n\t\t\t\t{!hasSubmitted && (\n\t\t\t\t\t<DroppablePool disabled={disabled}>\n\t\t\t\t\t\t{interaction.sourceChoices.map((source) => (\n\t\t\t\t\t\t\t<SourcePoolToken\n\t\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\t\tsource={source}\n\t\t\t\t\t\t\t\tremainingUses={getRemainingUses(source)}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{interaction.sourceChoices.every((s) => getRemainingUses(s) <= 0) && (\n\t\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">All items placed</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</DroppablePool>\n\t\t\t\t)}\n\n\t\t\t\t{/* Target Boxes (Drop zones) - Now below */}\n\t\t\t\t<div className=\"flex flex-wrap justify-center gap-4\">\n\t\t\t\t\t{interaction.targetChoices.map((target) => (\n\t\t\t\t\t\t<TargetBox\n\t\t\t\t\t\t\tkey={target.id}\n\t\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\t\tplacedSources={getPlacedSources(target.id)}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tonRemoveSource={(instanceId) => {\n\t\t\t\t\t\t\t\tconst index = getPlacedSources(target.id).findIndex((p) => p.instanceId === instanceId)\n\t\t\t\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\t\t\t\thandleRemoveSource(target.id, index)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tpairCorrectness={pairCorrectness}\n\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"idle\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default MatchInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\ttype DragStartEvent,\n\ttype DropAnimation,\n\tdefaultDropAnimationSideEffects,\n\tKeyboardSensor,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport {\n\tarrayMove,\n\thorizontalListSortingStrategy,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tuseSortable,\n\tverticalListSortingStrategy\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayChoice, DisplayOrderInteraction } from \"../../shared/types\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// --- Drag Handle Icon ---\nfunction DragHandleIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"12\"\n\t\t\theight=\"12\"\n\t\t\tviewBox=\"0 0 15 15\"\n\t\t\tfill=\"none\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tclassName={className}\n\t\t\taria-hidden=\"true\"\n\t\t\trole=\"img\"\n\t\t>\n\t\t\t<title>Drag handle</title>\n\t\t\t<path\n\t\t\t\td=\"M5.5 3C5.5 3.27614 5.27614 3.5 5 3.5C4.72386 3.5 4.5 3.27614 4.5 3C4.5 2.72386 4.72386 2.5 5 2.5C5.27614 2.5 5.5 2.72386 5.5 3ZM5.5 7.5C5.5 7.77614 5.27614 8 5 8C4.72386 8 4.5 7.77614 4.5 7.5C4.5 7.22386 4.72386 7 5 7C5.27614 7 5.5 7.22386 5.5 7.5ZM5.5 12C5.5 12.2761 5.27614 12.5 5 12.5C4.72386 12.5 4.5 12.2761 4.5 12C4.5 11.7239 4.72386 11.5 5 11.5C5.27614 11.5 5.5 11.7239 5.5 12ZM9.5 3C9.5 3.27614 9.27614 3.5 9 3.5C8.72386 3.5 8.5 3.27614 8.5 3C8.5 2.72386 8.72386 2.5 9 2.5C9.27614 2.5 9.5 2.72386 9.5 3ZM9.5 7.5C9.5 7.77614 9.27614 8 9 8C8.72386 8 8.5 7.77614 8.5 7.5C8.5 7.22386 8.72386 7 9 7C9.27614 7 9.5 7.22386 9.5 7.5ZM9.5 12C9.5 12.2761 9.27614 12.5 9 12.5C8.72386 12.5 8.5 12.2761 8.5 12C8.5 11.7239 8.72386 11.5 9 11.5C9.27614 11.5 9.5 11.7239 9.5 12Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\n// --- Sortable Item ---\nfunction SortableItem({\n\tid,\n\tcontentHtml,\n\tdisabled,\n\tisHorizontal\n}: {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisHorizontal: boolean\n}) {\n\tconst { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled })\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : 1,\n\t\tzIndex: isDragging ? 50 : (\"auto\" as const)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border rounded-lg shadow-sm touch-none select-none\",\n\t\t\t\t// Styling differs based on orientation\n\t\t\t\tisHorizontal\n\t\t\t\t\t? \"px-4 py-2 min-w-[100px] flex items-center justify-center text-center\"\n\t\t\t\t\t: \"p-4 w-full flex items-center gap-3\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"cursor-default opacity-90 bg-muted/50\"\n\t\t\t\t\t: \"cursor-grab active:cursor-grabbing hover:border-macaw/50 hover:shadow-md\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-muted-foreground shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Drag Overlay Item ---\nfunction DragOverlayItem({ contentHtml, isHorizontal }: { contentHtml: string; isHorizontal: boolean }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border-2 border-macaw rounded-lg shadow-xl cursor-grabbing z-50\",\n\t\t\t\tisHorizontal ? \"px-4 py-2 min-w-[100px] flex items-center justify-center\" : \"p-4 w-full flex items-center gap-3\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-macaw shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Main Component ---\nexport interface OrderInteractionProps {\n\tinteraction: DisplayOrderInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tisCorrect?: boolean\n}\n\nexport function OrderInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled,\n\thasSubmitted,\n\tisCorrect\n}: OrderInteractionProps) {\n\t// Use response if available (user state), otherwise fallback to initial shuffled order\n\tconst items = React.useMemo(() => {\n\t\tif (response && response.length > 0) {\n\t\t\t// Re-order the choices array based on the response ID list\n\t\t\tconst mapped: DisplayChoice[] = []\n\t\t\tfor (const id of response) {\n\t\t\t\tconst found = interaction.choices.find((c) => c.id === id)\n\t\t\t\tif (found) mapped.push(found)\n\t\t\t}\n\t\t\treturn mapped\n\t\t}\n\t\treturn interaction.choices\n\t}, [response, interaction.choices])\n\n\t// Local state for active drag item (for overlay)\n\tconst [activeId, setActiveId] = React.useState<string | null>(null)\n\tconst activeItem = React.useMemo(() => items.find((i) => i.id === activeId), [activeId, items])\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates\n\t\t})\n\t)\n\n\tconst handleDragStart = (event: DragStartEvent) => {\n\t\tconst id = event.active.id\n\t\tsetActiveId(typeof id === \"string\" ? id : String(id))\n\t}\n\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event\n\t\tsetActiveId(null)\n\n\t\tif (over && active.id !== over.id) {\n\t\t\tconst oldIndex = items.findIndex((item) => item.id === active.id)\n\t\t\tconst newIndex = items.findIndex((item) => item.id === over.id)\n\n\t\t\tconst newOrder = arrayMove(items, oldIndex, newIndex)\n\n\t\t\t// Notify parent\n\t\t\tonAnswerSelect?.(newOrder.map((item) => item.id))\n\t\t}\n\t}\n\n\tconst isHorizontal = interaction.orientation === \"horizontal\"\n\tconst strategy = isHorizontal ? horizontalListSortingStrategy : verticalListSortingStrategy\n\n\t// Smooth drop animation configuration\n\tconst dropAnimation: DropAnimation = {\n\t\tsideEffects: defaultDropAnimationSideEffects({\n\t\t\tstyles: { active: { opacity: \"0.4\" } }\n\t\t})\n\t}\n\n\t// Feedback container styles\n\tconst getContainerStyles = () => {\n\t\tif (!hasSubmitted) {\n\t\t\treturn \"bg-muted/30 border-transparent\"\n\t\t}\n\t\tif (isCorrect) {\n\t\t\treturn \"bg-owl/10 border-owl\"\n\t\t}\n\t\treturn \"bg-cardinal/10 border-cardinal\"\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{interaction.promptHtml && <HTMLContent html={interaction.promptHtml} />}\n\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tcollisionDetection={closestCenter}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t>\n\t\t\t\t<SortableContext items={items.map((i) => i.id)} strategy={strategy} disabled={disabled || hasSubmitted}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"rounded-xl p-4 transition-colors border-2\",\n\t\t\t\t\t\t\tisHorizontal ? \"flex flex-wrap gap-3\" : \"flex flex-col gap-2\",\n\t\t\t\t\t\t\tgetContainerStyles()\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t\t<SortableItem\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\t\t\tcontentHtml={item.contentHtml}\n\t\t\t\t\t\t\t\tdisabled={!!(disabled || hasSubmitted)}\n\t\t\t\t\t\t\t\tisHorizontal={isHorizontal}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\n\t\t\t\t{/* Portal Overlay for smooth visual while dragging */}\n\t\t\t\t<DragOverlay dropAnimation={dropAnimation}>\n\t\t\t\t\t{activeItem ? <DragOverlayItem contentHtml={activeItem.contentHtml} isHorizontal={isHorizontal} /> : null}\n\t\t\t\t</DragOverlay>\n\t\t\t</DndContext>\n\t\t</div>\n\t)\n}\n\nexport default OrderInteraction\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayTextEmbed, DisplayTextInteraction } from \"../../shared/types\"\n\n// ============================================================================\n// Palette Variants (mirrors SelectTrigger pattern)\n// ============================================================================\n\nconst textEntryVariants = cva(\n\t[\n\t\t// Base styles matching Select trigger\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs text-sm font-semibold\",\n\t\t\"bg-[var(--text-entry-background)] text-[var(--text-entry-foreground)]\",\n\t\t\"border border-[var(--text-entry-complement)]\", // border = 1px width, border-[...] = color\n\t\t\"shadow-[0_3px_0_var(--text-entry-complement)]\",\n\t\t\"transition-all duration-150\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t// Placeholder and focus (no ring - matches Select component)\n\t\t\"placeholder:text-muted-foreground/60\",\n\t\t\"focus:outline-none\",\n\t\t// Disabled state\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t// Invalid state\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-accent)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--cardinal)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--owl)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\nexport type TextEntryPalette = NonNullable<VariantProps<typeof textEntryVariants>[\"palette\"]>\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TextEntryInteractionProps {\n\t/** Text interaction payload (block-level) */\n\tinteraction: DisplayTextInteraction\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and show feedback */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness for the entered value (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\nexport interface InlineTextEntryProps {\n\t/** Text entry embed payload (inline within rich stimulus) */\n\tembed: DisplayTextEmbed\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Block-level Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders a block-level text entry interaction.\n * Used when text entry is a standalone interaction block (rare).\n */\nexport function TextEntryInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: TextEntryInteractionProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length with sensible defaults\n\t// Add 4ch buffer to account for px-2 padding (approx 2ch) and borders\n\tconst charWidth = interaction.expectedLength ?? 10\n\tconst inputWidth = `${Math.max(charWidth, 3) + 4}ch`\n\n\treturn (\n\t\t<div className=\"my-4 inline-block\">\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\tplaceholder={interaction.placeholder ?? \"...\"}\n\t\t\t\tpattern={interaction.patternMask}\n\t\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }))}\n\t\t\t\tstyle={{ width: inputWidth, minWidth: \"8ch\" }}\n\t\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Inline Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders an inline text entry interaction (embedded within rich stimulus).\n * Matches the compact styling of InlineInteraction (Select) for consistency.\n */\nexport function InlineTextEntry({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineTextEntryProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length - keep it tight for inline use\n\t// Add 3ch buffer to account for px-2 padding and visual balance\n\tconst charWidth = embed.expectedLength ?? 4\n\tconst inputWidth = `${Math.max(charWidth, 2) + 3}ch`\n\n\treturn (\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tvalue={value}\n\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\tplaceholder=\"...\"\n\t\t\tpattern={embed.patternMask}\n\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }), \"align-baseline\")}\n\t\t\tstyle={{ width: inputWidth, minWidth: \"6ch\" }}\n\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t/>\n\t)\n}\n\nexport default TextEntryInteraction\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport type { ChoiceInteraction } from \"../schema\"\nimport type {\n\tDisplayBlock,\n\tDisplayChoiceInteraction,\n\tDisplayGapMatchInteraction,\n\tDisplayItem,\n\tDisplayMatchInteraction,\n\tDisplayOrderInteraction\n} from \"../shared/types\"\nimport { FeedbackMessage } from \"./feedback-message\"\nimport { ChoiceInteractionRenderer } from \"./interactions/choice-interaction\"\nimport { GapMatchInteraction } from \"./interactions/gap-match-interaction\"\nimport { InlineInteraction } from \"./interactions/inline-interaction\"\nimport { MatchInteraction } from \"./interactions/match-interaction\"\nimport { OrderInteraction } from \"./interactions/order-interaction\"\nimport { InlineTextEntry, TextEntryInteraction } from \"./interactions/text-entry-interaction\"\nimport { HTMLContent } from \"./shared/html-content\"\n\n// ============================================================================\n// Order Interaction Block (with auto-initialization)\n// ============================================================================\n\n/**\n * Wrapper for OrderInteraction that initializes the response with the displayed\n * order on mount. This ensures that if the user submits without interacting,\n * the current visible order is submitted (not an empty response).\n */\nfunction OrderInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback\n}: {\n\tinteraction: DisplayOrderInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\tconst hasInitialized = React.useRef(false)\n\n\t// Initialize response with displayed order on mount (if not already set)\n\tReact.useEffect(() => {\n\t\t// Only initialize once, and only if there's no existing response\n\t\tif (hasInitialized.current) return\n\t\tif (response) return\n\t\tif (interaction.choices.length === 0) return\n\t\tif (!onAnswerSelect) return\n\n\t\thasInitialized.current = true\n\t\tconst initialOrder = interaction.choices.map((c) => c.id)\n\t\tonAnswerSelect(interaction.responseId, initialOrder)\n\t}, [response, interaction.choices, interaction.responseId, onAnswerSelect])\n\n\t// Safe casting for array response\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\") {\n\t\tresponseArray = [response]\n\t}\n\n\tconst feedback = perResponseFeedback?.[interaction.responseId]\n\n\treturn (\n\t\t<>\n\t\t\t<OrderInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Gap Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for GapMatchInteraction that computes per-gap correctness\n * and handles the directedPair response format.\n */\nfunction GapMatchInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback,\n\tselectedChoicesByResponse\n}: {\n\tinteraction: DisplayGapMatchInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\n\t// Ensure response is array\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\" && response) {\n\t\tresponseArray = [response]\n\t}\n\n\t// Compute per-gap correctness from selectedChoicesByResponse\n\t// Each entry in selectedChoicesByResponse has id = \"sourceId gapId\" format\n\tconst gapCorrectness = React.useMemo(() => {\n\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\tif (!entries || !showFeedback) return undefined\n\n\t\tconst result: Record<string, boolean> = {}\n\t\tfor (const entry of entries) {\n\t\t\t// Parse \"sourceId gapId\" to extract gapId\n\t\t\tconst parts = entry.id.split(\" \")\n\t\t\tconst gapId = parts[1]\n\t\t\tif (gapId) {\n\t\t\t\tresult[gapId] = entry.isCorrect\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n\treturn (\n\t\t<>\n\t\t\t<GapMatchInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tgapCorrectness={gapCorrectness}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for MatchInteraction that computes per-pair correctness\n * and handles the directedPair response format.\n */\nfunction MatchInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback,\n\tselectedChoicesByResponse\n}: {\n\tinteraction: DisplayMatchInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\n\t// Ensure response is array\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\" && response) {\n\t\tresponseArray = [response]\n\t}\n\n\t// Compute per-pair correctness from selectedChoicesByResponse\n\t// Each entry in selectedChoicesByResponse has id = \"sourceId targetId\" format\n\tconst pairCorrectness = React.useMemo(() => {\n\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\tif (!entries || !showFeedback) return undefined\n\n\t\tconst result: Record<string, boolean> = {}\n\t\tfor (const entry of entries) {\n\t\t\t// The id is already \"sourceId targetId\" format\n\t\t\tresult[entry.id] = entry.isCorrect\n\t\t}\n\t\treturn result\n\t}, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n\treturn (\n\t\t<>\n\t\t\t<MatchInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tpairCorrectness={pairCorrectness}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Theme options for the QTI renderer */\nexport type QTITheme = \"duolingo\" | \"neobrutalist\" | (string & {})\n\n/** Feedback result for a single response */\nexport interface ResponseFeedback {\n\tisCorrect: boolean\n\tmessageHtml?: string\n}\n\n/** Correctness info for selected choices */\nexport interface ChoiceCorrectness {\n\tid: string\n\tisCorrect: boolean\n}\n\n/**\n * Props for the QTIRenderer component.\n *\n * This is a **controlled, display-only component**. It renders the question\n * and captures user input, but does NOT include submit buttons or flow logic.\n * The consuming app is responsible for:\n * - Providing responses state\n * - Handling submission\n * - Providing feedback after validation\n * - Rendering buttons (Check, Try Again, Continue, etc.)\n */\nexport interface QTIRendererProps {\n\t/**\n\t * The display-safe item to render.\n\t * Use `buildDisplayModel()` to create this from a parsed AssessmentItem.\n\t */\n\titem: DisplayItem\n\n\t/**\n\t * Current user responses, keyed by response identifier.\n\t * This is a controlled component - you must manage this state.\n\t * @example { \"RESPONSE\": \"A\" } or { \"RESPONSE\": [\"A\", \"C\"] }\n\t */\n\tresponses: Record<string, string | string[]>\n\n\t/**\n\t * Callback fired when user selects/changes an answer.\n\t * Update your responses state in this callback.\n\t */\n\tonResponseChange: (responseId: string, value: string | string[]) => void\n\n\t/**\n\t * Theme to apply. Defaults to \"duolingo\".\n\t * Available themes: \"duolingo\", \"neobrutalist\", or any custom theme\n\t * defined via `[data-qti-theme=\"your-theme\"]` CSS.\n\t */\n\ttheme?: QTITheme\n\n\t/**\n\t * Whether to show feedback states (correct/incorrect styling).\n\t * Set to true after validation to display results.\n\t */\n\tshowFeedback?: boolean\n\n\t/**\n\t * Whether to disable all interactions.\n\t * Typically set to true when showFeedback is true.\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Per-choice correctness for highlighting selected answers.\n\t * Keyed by response identifier.\n\t */\n\tchoiceCorrectness?: Record<string, ChoiceCorrectness[]>\n\n\t/**\n\t * Per-response feedback messages to display.\n\t * Keyed by response identifier.\n\t */\n\tresponseFeedback?: Record<string, ResponseFeedback>\n\n\t/**\n\t * Overall feedback to display at the end of the question.\n\t */\n\toverallFeedback?: ResponseFeedback\n\n\t/**\n\t * Additional CSS class for the container.\n\t */\n\tclassName?: string\n}\n\nexport interface ContentBlockRendererProps {\n\t/** The content block to render */\n\tblock: DisplayBlock\n\t/** Current user responses */\n\tresponses?: Record<string, string | string[]>\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\t/** Whether to show feedback */\n\tshowFeedback?: boolean\n\t/** Whether to disable interactions */\n\tdisabled?: boolean\n\t/** Selected-only correctness mapping for this render pass */\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n\t/** Optional per-response feedback messages from server */\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\n/**\n * Renders a single content block (stimulus or interaction)\n */\nexport function ContentBlockRenderer({\n\tblock,\n\tresponses,\n\tonAnswerSelect,\n\tshowFeedback,\n\tdisabled,\n\tselectedChoicesByResponse,\n\tperResponseFeedback\n}: ContentBlockRendererProps) {\n\tif (block.type === \"stimulus\") {\n\t\treturn <HTMLContent html={block.html} className=\"mb-6\" />\n\t}\n\tif (block.type === \"richStimulus\") {\n\t\t// Collect all response IDs for feedback (inline choice + text entry)\n\t\tconst allResponseIds = [\n\t\t\t...Object.values(block.inlineEmbeds).map((e) => e.responseId),\n\t\t\t...Object.values(block.textEmbeds).map((e) => e.responseId)\n\t\t]\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<HTMLContent\n\t\t\t\t\thtml={block.html}\n\t\t\t\t\tclassName=\"mb-6\"\n\t\t\t\t\tinlineEmbeds={block.inlineEmbeds}\n\t\t\t\t\ttextEmbeds={block.textEmbeds}\n\t\t\t\t\trenderInline={(embed) => {\n\t\t\t\t\t\tconst currentValue = (() => {\n\t\t\t\t\t\t\tconst v = responses?.[embed.responseId]\n\t\t\t\t\t\t\treturn typeof v === \"string\" ? v : \"\"\n\t\t\t\t\t\t})()\n\t\t\t\t\t\t// Compute correctness of selected value if available\n\t\t\t\t\t\tconst perSelectionEntries = selectedChoicesByResponse?.[embed.responseId]\n\t\t\t\t\t\tconst selectedIsCorrect =\n\t\t\t\t\t\t\tperSelectionEntries && currentValue\n\t\t\t\t\t\t\t\t? perSelectionEntries.find((e) => e.id === currentValue)?.isCorrect\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<InlineInteraction\n\t\t\t\t\t\t\t\tembed={embed}\n\t\t\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\t\t\tonAnswerSelect={(v) => {\n\t\t\t\t\t\t\t\t\tif (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdisabled={disabled || showFeedback}\n\t\t\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\t\t\tisCorrect={selectedIsCorrect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t\trenderTextEntry={(embed) => {\n\t\t\t\t\t\tconst currentValue = (() => {\n\t\t\t\t\t\t\tconst v = responses?.[embed.responseId]\n\t\t\t\t\t\t\treturn typeof v === \"string\" ? v : \"\"\n\t\t\t\t\t\t})()\n\t\t\t\t\t\t// Text entry correctness from perResponseFeedback\n\t\t\t\t\t\tconst feedback = perResponseFeedback?.[embed.responseId]\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<InlineTextEntry\n\t\t\t\t\t\t\t\tkey={embed.responseId}\n\t\t\t\t\t\t\t\tembed={embed}\n\t\t\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\t\t\tonAnswerSelect={(v) => {\n\t\t\t\t\t\t\t\t\tif (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdisabled={disabled || showFeedback}\n\t\t\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t{allResponseIds.map((responseId) => (\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tkey={`fb-${responseId}`}\n\t\t\t\t\t\tresponseId={responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</>\n\t\t)\n\t}\n\n\tif (block.type === \"interaction\" && block.interaction) {\n\t\tconst interaction = block.interaction\n\n\t\t// Handle text entry interactions\n\t\tif (interaction.type === \"text\") {\n\t\t\tconst response = responses?.[interaction.responseId]\n\t\t\tconst currentValue = typeof response === \"string\" ? response : \"\"\n\t\t\tconst feedback = perResponseFeedback?.[interaction.responseId]\n\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<TextEntryInteraction\n\t\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\tonAnswerSelect={(value) => {\n\t\t\t\t\t\t\tif (onAnswerSelect) {\n\t\t\t\t\t\t\t\tonAnswerSelect(interaction.responseId, value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t\t\t/>\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)\n\t\t}\n\n\t\t// Handle choice interactions\n\t\tif (interaction.type === \"choice\") {\n\t\t\tconst response = responses?.[interaction.responseId]\n\n\t\t\t// Derive single-select correctness from selectedChoicesByResponse\n\t\t\tlet selected: string[] = []\n\t\t\tif (Array.isArray(response)) {\n\t\t\t\tselected = response\n\t\t\t} else if (typeof response === \"string\") {\n\t\t\t\tselected = [response]\n\t\t\t}\n\t\t\tconst perSelectionEntries = selectedChoicesByResponse?.[interaction.responseId]\n\t\t\tconst perSelectionTable = perSelectionEntries\n\t\t\t\t? new Map(perSelectionEntries.map((e) => [e.id, e.isCorrect]))\n\t\t\t\t: undefined\n\t\t\tlet singleIsCorrect: boolean | undefined\n\t\t\tif (interaction.cardinality === \"single\" && selected.length === 1 && perSelectionTable) {\n\t\t\t\tconst firstCandidate = selected[0]\n\t\t\t\tif (typeof firstCandidate === \"string\") {\n\t\t\t\t\tsingleIsCorrect = perSelectionTable.get(firstCandidate) === true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst toChoiceInteraction = (d: DisplayChoiceInteraction): ChoiceInteraction => {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"choiceInteraction\",\n\t\t\t\t\tresponseIdentifier: d.responseId,\n\t\t\t\t\tshuffle: false,\n\t\t\t\t\tminChoices: d.minChoices,\n\t\t\t\t\tmaxChoices: d.maxChoices,\n\t\t\t\t\tpromptHtml: d.promptHtml,\n\t\t\t\t\tchoices: d.choices.map((c) => ({\n\t\t\t\t\t\tidentifier: c.id,\n\t\t\t\t\t\tcontentHtml: c.contentHtml,\n\t\t\t\t\t\tinlineFeedbackHtml: c.inlineFeedbackHtml\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<ChoiceInteractionRenderer\n\t\t\t\t\t\tinteraction={toChoiceInteraction(interaction)}\n\t\t\t\t\t\tresponse={response}\n\t\t\t\t\t\tonAnswerSelect={(value) => {\n\t\t\t\t\t\t\tif (onAnswerSelect) {\n\t\t\t\t\t\t\t\tonAnswerSelect(interaction.responseId, value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\tisCorrect={singleIsCorrect}\n\t\t\t\t\t\tselectedChoicesCorrectness={(() => {\n\t\t\t\t\t\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\t\t\t\t\t\tif (!entries) return undefined\n\t\t\t\t\t\t\tconst table = new Map(entries.map((e) => [e.id, e.isCorrect]))\n\t\t\t\t\t\t\treturn selected.map((id) => ({ id, isCorrect: table.get(id) === true }))\n\t\t\t\t\t\t})()}\n\t\t\t\t\t/>\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)\n\t\t}\n\n\t\t// Handle order interactions (drag-and-drop sorting)\n\t\tif (interaction.type === \"order\") {\n\t\t\treturn (\n\t\t\t\t<OrderInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\t// Handle gap match interactions (fill-in-the-blank with drag/click)\n\t\tif (interaction.type === \"gapMatch\") {\n\t\t\treturn (\n\t\t\t\t<GapMatchInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\tselectedChoicesByResponse={selectedChoicesByResponse}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\t// Handle match interactions (matrix association)\n\t\tif (interaction.type === \"match\") {\n\t\t\treturn (\n\t\t\t\t<MatchInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\tselectedChoicesByResponse={selectedChoicesByResponse}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t}\n\n\t// Unknown block type\n\treturn null\n}\n\n// ============================================================================\n// Main QTI Renderer\n// ============================================================================\n\n/**\n * A controlled, display-only component for rendering QTI assessment items.\n *\n * **This component does NOT include buttons or submission logic.**\n * The consuming app is responsible for:\n * - Managing `responses` state\n * - Rendering Check/Submit/Try Again buttons\n * - Calling validation APIs\n * - Providing feedback data after validation\n *\n * @example\n * ```tsx\n * const [responses, setResponses] = useState({})\n * const [feedback, setFeedback] = useState(null)\n *\n * <QTIRenderer\n * item={displayItem}\n * responses={responses}\n * onResponseChange={(id, value) => setResponses(prev => ({ ...prev, [id]: value }))}\n * theme=\"neobrutalist\"\n * showFeedback={!!feedback}\n * responseFeedback={feedback?.perResponse}\n * overallFeedback={feedback?.overall}\n * disabled={!!feedback}\n * />\n *\n * <button onClick={handleCheck}>Check Answer</button>\n * ```\n */\nexport function QTIRenderer({\n\titem,\n\tresponses,\n\tonResponseChange,\n\ttheme = \"duolingo\",\n\tshowFeedback = false,\n\tdisabled = false,\n\tchoiceCorrectness,\n\tresponseFeedback,\n\toverallFeedback,\n\tclassName\n}: QTIRendererProps) {\n\t// Determine theme attribute value (empty string for default/duolingo)\n\tconst themeAttr = theme === \"duolingo\" ? undefined : theme\n\n\treturn (\n\t\t<div className={cn(\"qti-container\", className)} data-qti-theme={themeAttr}>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{item.contentBlocks.map((block, index) => (\n\t\t\t\t\t<ContentBlockRenderer\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\tresponses={responses}\n\t\t\t\t\t\tonAnswerSelect={onResponseChange}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tselectedChoicesByResponse={choiceCorrectness}\n\t\t\t\t\t\tperResponseFeedback={responseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t{/* Overall feedback shown at the end */}\n\t\t\t{showFeedback && overallFeedback?.messageHtml && (\n\t\t\t\t<div className=\"qti-feedback mt-6 p-6\" data-correct={overallFeedback.isCorrect}>\n\t\t\t\t\t<HTMLContent html={overallFeedback.messageHtml} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nexport default QTIRenderer\n","import * as logger from \"@superbuilders/slog\"\nimport type { AnyCondition, AssessmentItem, BaseRule, ResponseRule } from \"./schema\"\n\n/**\n * Normalizes a string for comparison (trimming and optional case-insensitivity)\n */\nfunction normalizeString(str: string, caseSensitive: boolean): string {\n\tconst s = (str ?? \"\").trim()\n\treturn caseSensitive ? s : s.toLowerCase()\n}\n\n/**\n * Evaluates a condition from the response processing rules against the user's responses.\n */\nfunction checkCondition(\n\tcondition: AnyCondition,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): boolean {\n\t// 1. Recursive Logic (AND / OR / NOT)\n\tif (condition.type === \"and\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst allTrue = results.every((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking AND condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tallTrue\n\t\t})\n\t\treturn allTrue\n\t}\n\n\tif (condition.type === \"or\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst anyTrue = results.some((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking OR condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tanyTrue\n\t\t})\n\t\treturn anyTrue\n\t}\n\n\tif (condition.type === \"not\") {\n\t\tconst result = checkCondition(condition.condition, item, responses, responseResults)\n\t\tlogger.debug(\"qti evaluator: checking NOT condition\", { result, negated: !result })\n\t\treturn !result\n\t}\n\n\t// 2. Standard Match (correctness check)\n\tif (condition.type === \"match\") {\n\t\tconst result = responseResults[condition.variable]\n\t\tlogger.debug(\"qti evaluator: checking match condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\tisCorrect: result,\n\t\t\tmatches: result === true\n\t\t})\n\t\treturn result === true\n\t}\n\n\t// 3. Match Specific Value (hardcoded value check)\n\tif (condition.type === \"matchValue\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking matchValue condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttargetValue: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 4. String Match (text entry with case sensitivity)\n\tif (condition.type === \"stringMatch\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tconst val = Array.isArray(userResponse) ? userResponse[0] : userResponse\n\t\tif (!val) return false\n\n\t\tconst u = normalizeString(String(val), condition.caseSensitive)\n\t\tconst t = normalizeString(condition.value, condition.caseSensitive)\n\t\tconst matches = u === t\n\t\tlogger.debug(\"qti evaluator: checking stringMatch\", {\n\t\t\tvariable: condition.variable,\n\t\t\tcaseSensitive: condition.caseSensitive,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 5. Member (set logic for multi-select checkboxes)\n\tif (condition.type === \"member\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking member\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttarget: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 6. Map Response (scoring logic with epsilon comparison)\n\tif (condition.type === \"equalMapResponse\") {\n\t\tconst responseId = condition.variable\n\t\tconst userResponse = responses[responseId]\n\t\tconst responseDecl = item.responseDeclarations.find((rd) => rd.identifier === responseId)\n\n\t\tif (!userResponse || !responseDecl?.mapping) return false\n\n\t\tconst userValues = Array.isArray(userResponse) ? userResponse : [userResponse]\n\t\tconst valueMap = new Map(responseDecl.mapping.entries.map((e) => [e.key, e.value]))\n\n\t\tlet sum = 0\n\t\tfor (const val of userValues) {\n\t\t\tsum += valueMap.get(val) ?? responseDecl.mapping.defaultValue\n\t\t}\n\n\t\t// Float comparison safety (epsilon check)\n\t\tconst target = Number(condition.value)\n\t\tconst diff = Math.abs(sum - target)\n\t\tconst matches = diff < 0.0001\n\n\t\tlogger.debug(\"qti evaluator: checking equalMapResponse\", {\n\t\t\tresponseId,\n\t\t\tuserValues,\n\t\t\tsum,\n\t\t\ttarget: condition.value,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\treturn false\n}\n\n/**\n * Traverses a single response rule recursively to find matching feedback identifiers\n */\nfunction evaluateRule(\n\trule: ResponseRule,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst feedbackIds: string[] = []\n\n\t// Case 1: Direct Action (unconditional)\n\tif (rule.type === \"action\") {\n\t\tconst action = rule.action\n\t\tif (\n\t\t\taction.type === \"setOutcomeValue\" &&\n\t\t\t(action.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\taction.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\taction.identifier === \"FEEDBACK\")\n\t\t) {\n\t\t\tlogger.debug(\"qti evaluator: executing action\", { id: action.identifier, value: action.value })\n\t\t\tfeedbackIds.push(action.value)\n\t\t}\n\t\treturn feedbackIds\n\t}\n\n\t// Case 2: Condition Block (if/elseif/else)\n\tif (rule.type === \"condition\") {\n\t\t// Iterate through branches and stop at the first match\n\t\tfor (const branch of rule.branches) {\n\t\t\tconst isMatch = branch.condition ? checkCondition(branch.condition, item, responses, responseResults) : true // Else branch (undefined condition) always matches if reached\n\n\t\t\tlogger.debug(\"qti evaluator: evaluating branch\", {\n\t\t\t\thasCondition: !!branch.condition,\n\t\t\t\tisMatch\n\t\t\t})\n\n\t\t\tif (isMatch) {\n\t\t\t\t// Execute actions in this branch\n\t\t\t\tconst feedbackActions = branch.actions.filter(\n\t\t\t\t\t(r: BaseRule) =>\n\t\t\t\t\t\tr.type === \"setOutcomeValue\" &&\n\t\t\t\t\t\t(r.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK\")\n\t\t\t\t)\n\t\t\t\tfor (const action of feedbackActions) {\n\t\t\t\t\tfeedbackIds.push(action.value)\n\t\t\t\t}\n\n\t\t\t\t// Execute nested rules recursively\n\t\t\t\tif (branch.nestedRules) {\n\t\t\t\t\tfor (const nested of branch.nestedRules) {\n\t\t\t\t\t\tconst nestedIds = evaluateRule(nested, item, responses, responseResults)\n\t\t\t\t\t\tfeedbackIds.push(...nestedIds)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CRITICAL: Stop after the first matching branch!\n\t\t\t\t// This prevents 'else' from executing if 'if' matched.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn feedbackIds\n}\n\n/**\n * Traverses the response processing rules to find all matching feedback identifiers.\n */\nexport function evaluateFeedbackIdentifiers(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst processing = item.responseProcessing\n\tif (!processing) {\n\t\tlogger.debug(\"qti evaluator: no response processing found\")\n\t\treturn []\n\t}\n\n\tlogger.debug(\"qti evaluator: starting evaluation\", {\n\t\tnumRules: processing.rules.length,\n\t\tresponseResults\n\t})\n\n\tconst allFeedbackIds: string[] = []\n\n\tfor (const rule of processing.rules) {\n\t\tconst ids = evaluateRule(rule, item, responses, responseResults)\n\t\tallFeedbackIds.push(...ids)\n\t}\n\n\tlogger.debug(\"qti evaluator: selected feedback identifiers\", { feedbackIds: allFeedbackIds })\n\treturn allFeedbackIds\n}\n\n/**\n * Legacy function for backwards compatibility - returns the first matching feedback identifier.\n * @deprecated Use evaluateFeedbackIdentifiers for full feedback support\n */\nexport function evaluateFeedbackIdentifier(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string | undefined {\n\tconst ids = evaluateFeedbackIdentifiers(item, responses, responseResults)\n\treturn ids[0]\n}\n","import { z } from \"zod\"\n\n// Basic enums derived from the XML\nexport const QtiCardinalitySchema = z.enum([\"single\", \"multiple\", \"ordered\"]) // seen: single, multiple, ordered\nexport const QtiBaseTypeSchema = z.enum([\"identifier\", \"string\", \"float\", \"integer\", \"boolean\", \"directedPair\", \"pair\"]) // seen: identifier, float, directedPair\n\n// SimpleChoice: <qti-simple-choice identifier=\"A\"> ... inner XHTML/MathML ... </qti-simple-choice>\nexport const SimpleChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(), // Allows \"\" for empty or image-only content\n\tinlineFeedbackHtml: z.string().optional() // Optional per-choice feedback (qti-feedback-inline)\n})\nexport type SimpleChoice = z.infer<typeof SimpleChoiceSchema>\n\n// InlineChoice: <qti-inline-choice identifier=\"ID\"> ... inner XHTML/MathML ... </qti-inline-choice>\nexport const InlineChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string()\n})\nexport type InlineChoice = z.infer<typeof InlineChoiceSchema>\n\n// ChoiceInteraction: <qti-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" min-choices=\"1\" max-choices=\"1\"> ...\nexport const ChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(1),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\n\n// Extensible discriminated union for interactions\nexport const ChoiceInteractionSchema = ChoiceInteractionCoreSchema.extend({ type: z.literal(\"choiceInteraction\") })\nexport type ChoiceInteraction = z.infer<typeof ChoiceInteractionSchema>\n\n// InlineChoiceInteraction: <qti-inline-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const InlineChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tchoices: z.array(InlineChoiceSchema).min(1)\n})\nexport const InlineChoiceInteractionSchema = InlineChoiceInteractionCoreSchema.extend({\n\ttype: z.literal(\"inlineChoiceInteraction\")\n})\nexport type InlineChoiceInteraction = z.infer<typeof InlineChoiceInteractionSchema>\n\n// TextEntryInteraction: <qti-text-entry-interaction response-identifier=\"RESPONSE\" expected-length=\"15\" ...> ...\nexport const TextEntryInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\texpectedLength: z.number().int().min(0).optional(),\n\tplaceholderText: z.string().optional(),\n\tpatternMask: z.string().optional()\n})\nexport const TextEntryInteractionSchema = TextEntryInteractionCoreSchema.extend({\n\ttype: z.literal(\"textEntryInteraction\")\n})\nexport type TextEntryInteraction = z.infer<typeof TextEntryInteractionSchema>\n\n// OrderInteraction: <qti-order-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" orientation=\"vertical\"> ...\nexport const OrderInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(0).optional(), // 0 or undefined usually means \"all\"\n\torientation: z.enum([\"vertical\", \"horizontal\"]),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\nexport const OrderInteractionSchema = OrderInteractionCoreSchema.extend({\n\ttype: z.literal(\"orderInteraction\")\n})\nexport type OrderInteraction = z.infer<typeof OrderInteractionSchema>\n\n// GapText: <qti-gap-text identifier=\"A\" match-max=\"1\"> ... content ... </qti-gap-text>\nexport const GapTextSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(),\n\tmatchMax: z.number().int().min(0) // 0 = unlimited\n})\nexport type GapText = z.infer<typeof GapTextSchema>\n\n// Gap: <qti-gap identifier=\"G1\" /> - the drop target placeholder\nexport const GapSchema = z.object({\n\tidentifier: z.string().min(1)\n})\nexport type Gap = z.infer<typeof GapSchema>\n\n// GapMatchInteraction: <qti-gap-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const GapMatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tgapTexts: z.array(GapTextSchema).min(1), // Draggable source tokens\n\tgaps: z.array(GapSchema).min(1), // Drop target placeholders\n\tcontentHtml: z.string() // HTML content with gap placeholders\n})\nexport const GapMatchInteractionSchema = GapMatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"gapMatchInteraction\")\n})\nexport type GapMatchInteraction = z.infer<typeof GapMatchInteractionSchema>\n\n// AssociableChoice: <qti-simple-associable-choice identifier=\"A\" match-max=\"1\"> ... </qti-simple-associable-choice>\nexport const AssociableChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tmatchMax: z.number().int().min(0), // 0 = unlimited uses\n\tcontentHtml: z.string()\n})\nexport type AssociableChoice = z.infer<typeof AssociableChoiceSchema>\n\n// MatchInteraction: <qti-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" max-associations=\"4\"> ...\nexport const MatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tmaxAssociations: z.number().int().min(0), // 0 = unlimited total associations\n\tsourceChoices: z.array(AssociableChoiceSchema).min(1), // First <qti-simple-match-set>\n\ttargetChoices: z.array(AssociableChoiceSchema).min(1), // Second <qti-simple-match-set>\n\tpromptHtml: z.string()\n})\nexport const MatchInteractionSchema = MatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"matchInteraction\")\n})\nexport type MatchInteraction = z.infer<typeof MatchInteractionSchema>\n\nexport const AnyInteractionSchema = z.discriminatedUnion(\"type\", [\n\tChoiceInteractionSchema,\n\tInlineChoiceInteractionSchema,\n\tTextEntryInteractionSchema,\n\tOrderInteractionSchema,\n\tGapMatchInteractionSchema,\n\tMatchInteractionSchema\n])\nexport type AnyInteraction = z.infer<typeof AnyInteractionSchema>\n\n// CorrectResponse inside ResponseDeclaration\nexport const CorrectResponseSchema = z.object({\n\tvalues: z.array(z.string().min(1)).min(1)\n})\nexport type CorrectResponse = z.infer<typeof CorrectResponseSchema>\n\n// ResponseDeclaration\nexport const ResponseDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tcorrectResponse: CorrectResponseSchema,\n\t// Optional response mapping for map-response processing (used for summed feedback/score)\n\tmapping: z\n\t\t.object({\n\t\t\tdefaultValue: z.number().default(0),\n\t\t\tlowerBound: z.number().optional(),\n\t\t\tupperBound: z.number().optional(),\n\t\t\tentries: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tkey: z.string().min(1),\n\t\t\t\t\tvalue: z.number()\n\t\t\t\t})\n\t\t\t)\n\t\t})\n\t\t.optional()\n})\nexport type ResponseDeclaration = z.infer<typeof ResponseDeclarationSchema>\n\n// OutcomeDeclaration\nexport const OutcomeDefaultValueSchema = z.object({\n\tvalue: z.string()\n})\nexport type OutcomeDefaultValue = z.infer<typeof OutcomeDefaultValueSchema>\n\nexport const OutcomeDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tdefaultValue: OutcomeDefaultValueSchema.optional()\n})\nexport type OutcomeDeclaration = z.infer<typeof OutcomeDeclarationSchema>\n\n// Feedback blocks\nexport const FeedbackBlockSchema = z.object({\n\toutcomeIdentifier: z.string().min(1),\n\tidentifier: z.string().min(1),\n\tshowHide: z.enum([\"show\", \"hide\"]).default(\"show\"),\n\tcontentHtml: z.string()\n})\nexport type FeedbackBlock = z.infer<typeof FeedbackBlockSchema>\n\n// ItemBody as typed content blocks + feedback blocks\nconst StimulusBlockSchema = z.object({\n\ttype: z.literal(\"stimulus\"),\n\thtml: z.string()\n})\n\n// RichStimulus: HTML with inline embeds map keyed by responseIdentifier\nexport const RichStimulusBlockSchema = z.object({\n\ttype: z.literal(\"richStimulus\"),\n\thtml: z.string(),\n\tinlineEmbeds: z.record(z.string(), InlineChoiceInteractionSchema),\n\ttextEmbeds: z.record(z.string(), TextEntryInteractionSchema)\n})\nexport type RichStimulusBlock = z.infer<typeof RichStimulusBlockSchema>\n\nconst InteractionBlockSchema = z.object({\n\ttype: z.literal(\"interaction\"),\n\tinteraction: AnyInteractionSchema\n})\n\nexport const ItemBodySchema = z.object({\n\tcontentBlocks: z.array(z.union([StimulusBlockSchema, RichStimulusBlockSchema, InteractionBlockSchema])).min(1),\n\tfeedbackBlocks: z.array(FeedbackBlockSchema)\n})\nexport type ItemBody = z.infer<typeof ItemBodySchema>\n\n// Response processing: Define schemas for the Response Processing AST\nconst BaseRuleSchema = z.object({\n\ttype: z.literal(\"setOutcomeValue\"),\n\tidentifier: z.string(),\n\tvalue: z.string()\n})\nexport type BaseRule = z.infer<typeof BaseRuleSchema>\n\nconst MatchConditionSchema = z.object({\n\ttype: z.literal(\"match\"),\n\tvariable: z.string(),\n\tcorrect: z.literal(true) // Match against correct response\n})\nexport type MatchCondition = z.infer<typeof MatchConditionSchema>\n\n// NEW: Schema for matching against a specific value (e.g., <qti-match> with <qti-base-value>)\nconst MatchValueConditionSchema = z.object({\n\ttype: z.literal(\"matchValue\"),\n\tvariable: z.string(), // The response identifier from <qti-variable>\n\tvalue: z.string() // The target value from <qti-base-value>\n})\nexport type MatchValueCondition = z.infer<typeof MatchValueConditionSchema>\n\n// Schema for string matching (text entry with case sensitivity)\nconst StringMatchConditionSchema = z.object({\n\ttype: z.literal(\"stringMatch\"),\n\tvariable: z.string(),\n\tvalue: z.string(),\n\tcaseSensitive: z.boolean()\n})\nexport type StringMatchCondition = z.infer<typeof StringMatchConditionSchema>\n\n// Schema for member checking (multi-select subset logic)\nconst MemberConditionSchema = z.object({\n\ttype: z.literal(\"member\"),\n\tvariable: z.string(),\n\tvalue: z.string()\n})\nexport type MemberCondition = z.infer<typeof MemberConditionSchema>\n\n// Schema for the map-response-equal condition\nconst EqualMapResponseConditionSchema = z.object({\n\ttype: z.literal(\"equalMapResponse\"),\n\tvariable: z.string(), // The response identifier from <qti-map-response>\n\tvalue: z.string() // The target sum value from <qti-base-value>\n})\nexport type EqualMapResponseCondition = z.infer<typeof EqualMapResponseConditionSchema>\n\n// Define types first for recursive schemas\nexport type AndCondition = {\n\ttype: \"and\"\n\tconditions: AnyCondition[]\n}\n\nexport type OrCondition = {\n\ttype: \"or\"\n\tconditions: AnyCondition[]\n}\n\nexport type NotCondition = {\n\ttype: \"not\"\n\tcondition: AnyCondition\n}\n\nexport type AnyCondition =\n\t| MatchCondition\n\t| MatchValueCondition\n\t| StringMatchCondition\n\t| MemberCondition\n\t| AndCondition\n\t| OrCondition\n\t| NotCondition\n\t| EqualMapResponseCondition\n\n// Then define schemas using the types\nconst AndConditionSchema: z.ZodType<AndCondition> = z.object({\n\ttype: z.literal(\"and\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst OrConditionSchema: z.ZodType<OrCondition> = z.object({\n\ttype: z.literal(\"or\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst NotConditionSchema: z.ZodType<NotCondition> = z.object({\n\ttype: z.literal(\"not\"),\n\tcondition: z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema)\n})\n\n// Union of all condition types\nconst AnyConditionSchema: z.ZodType<AnyCondition> = z.union([\n\tMatchConditionSchema,\n\tMatchValueConditionSchema,\n\tStringMatchConditionSchema,\n\tMemberConditionSchema,\n\tz.lazy((): z.ZodType<AndCondition> => AndConditionSchema),\n\tz.lazy((): z.ZodType<OrCondition> => OrConditionSchema),\n\tz.lazy((): z.ZodType<NotCondition> => NotConditionSchema),\n\tEqualMapResponseConditionSchema\n])\n\n// --- NEW STRUCTURE FOR PROCESSING RULES ---\n\n// A single branch (if, else-if, else)\nexport type ConditionBranch = {\n\tcondition?: AnyCondition // undefined for 'else'\n\tactions: BaseRule[]\n\tnestedRules?: ResponseRule[] // Recursive: nested rules inside a branch\n}\n\n// Zod schema for a branch\nexport const ConditionBranchSchema: z.ZodType<ConditionBranch> = z.object({\n\tcondition: AnyConditionSchema.optional(),\n\tactions: z.array(BaseRuleSchema),\n\tnestedRules: z.array(z.lazy((): z.ZodType<ResponseRule> => ResponseRuleSchema)).optional()\n})\n\n// The main ResponseRule type (either a condition block or a direct action)\nexport type ResponseRule = { type: \"condition\"; branches: ConditionBranch[] } | { type: \"action\"; action: BaseRule }\n\n// Zod schema for ResponseRule\nexport const ResponseRuleSchema: z.ZodType<ResponseRule> = z.union([\n\tz.object({\n\t\ttype: z.literal(\"condition\"),\n\t\tbranches: z.array(ConditionBranchSchema)\n\t}),\n\tz.object({\n\t\ttype: z.literal(\"action\"),\n\t\taction: BaseRuleSchema\n\t})\n])\n\n// Response processing: scoring\nexport const ScoringRuleSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tcorrectScore: z.number(),\n\tincorrectScore: z.number()\n})\nexport type ScoringRule = z.infer<typeof ScoringRuleSchema>\n\n// UPDATED: The primary ResponseProcessingSchema now uses the AST directly\nexport const ResponseProcessingSchema = z.object({\n\trules: z.array(ResponseRuleSchema),\n\tscoring: ScoringRuleSchema\n})\nexport type ResponseProcessing = z.infer<typeof ResponseProcessingSchema>\n\n// Root assessment item, extensible for any interaction type\nexport const AssessmentItemSchema = z.object({\n\tidentifier: z.string().min(1),\n\ttitle: z.string().min(1),\n\ttimeDependent: z.boolean(),\n\txmlLang: z.string().min(1),\n\n\tresponseDeclarations: z.array(ResponseDeclarationSchema).min(1),\n\toutcomeDeclarations: z.array(OutcomeDeclarationSchema).min(1),\n\n\titemBody: ItemBodySchema,\n\tresponseProcessing: ResponseProcessingSchema\n})\nexport type AssessmentItem = z.infer<typeof AssessmentItemSchema>\n","import * as errors from \"@superbuilders/errors\"\nimport { XMLBuilder, XMLParser } from \"fast-xml-parser\"\nimport { serializeInner, serializeNode, serializeNodes } from \"./html\"\nimport {\n\ttype AnyCondition,\n\ttype AssessmentItem,\n\tAssessmentItemSchema,\n\ttype BaseRule,\n\ttype ConditionBranch,\n\tQtiBaseTypeSchema,\n\tQtiCardinalitySchema,\n\ttype ResponseProcessing,\n\ttype ResponseRule,\n\ttype ScoringRule\n} from \"./schema\"\n\n// Clean, recursive representation of an XML node\nexport interface NormalizedNode {\n\ttagName: string\n\tattrs: Record<string, unknown>\n\tchildren: Array<NormalizedNode | string>\n}\n\n// --- Core XML & Node Utilities ---\n\nfunction createXmlParser(): XMLParser {\n\treturn new XMLParser({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tallowBooleanAttributes: true,\n\t\tparseAttributeValue: true,\n\t\tparseTagValue: false, // CRITICAL: Preserve \"000\" as string, not convert to number 0\n\t\ttrimValues: false,\n\t\tpreserveOrder: true\n\t})\n}\n\nfunction _createXmlBuilder(): XMLBuilder {\n\treturn new XMLBuilder({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tsuppressEmptyNode: true, // cleaner output for empty tags\n\t\tformat: false\n\t})\n}\n\nfunction coerceString(value: unknown): string {\n\tif (value == null) return \"\"\n\treturn String(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction normalizeNode(rawNode: unknown): NormalizedNode | string {\n\tif (rawNode == null) return \"\"\n\tif (!isRecord(rawNode)) return coerceString(rawNode)\n\n\tconst textContent = rawNode[\"#text\"]\n\tif (textContent != null) {\n\t\treturn coerceString(textContent)\n\t}\n\n\tconst tagName = Object.keys(rawNode).find((k) => k !== \":@\")\n\tif (!tagName) return \"\"\n\n\tconst attrsValue = rawNode[\":@\"]\n\tconst attrs = isRecord(attrsValue) ? attrsValue : {}\n\tconst rawChildren = Array.isArray(rawNode[tagName]) ? rawNode[tagName] : [rawNode[tagName]]\n\n\treturn {\n\t\ttagName,\n\t\tattrs,\n\t\tchildren: rawChildren.map(normalizeNode).filter((n) => n !== \"\")\n\t}\n}\n\nfunction nodeToXml(node: NormalizedNode | string): string {\n\t// Use our HTML serializer for better MathML preservation\n\tif (typeof node === \"string\") return node\n\treturn serializeNode(node)\n}\n\nfunction getInnerHtml(node: NormalizedNode): string {\n\t// Use our HTML serializer for inner content\n\treturn serializeInner(node)\n}\n\nfunction findChild(node: NormalizedNode, tagName: string): NormalizedNode | undefined {\n\tconst child = node.children.find((c) => typeof c !== \"string\" && c.tagName === tagName)\n\treturn typeof child === \"string\" ? undefined : child\n}\n\nfunction findChildren(node: NormalizedNode, tagName: string): NormalizedNode[] {\n\treturn node.children.filter((c): c is NormalizedNode => typeof c !== \"string\" && c.tagName === tagName)\n}\n\nfunction getTextContent(node: NormalizedNode | undefined): string {\n\tif (!node) return \"\"\n\tconst firstChild = node.children[0]\n\tif (typeof firstChild === \"string\") return firstChild.trim()\n\treturn \"\"\n}\n\nfunction findInteractionNodes(node: NormalizedNode, out: NormalizedNode[] = []): NormalizedNode[] {\n\tif (node.tagName.includes(\"-interaction\")) {\n\t\tout.push(node)\n\t}\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tfindInteractionNodes(child, out)\n\t\t}\n\t}\n\treturn out\n}\n\nfunction escapeAttr(value: string): string {\n\treturn value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\")\n}\n\nfunction attrsToString(attrs: Record<string, unknown>): string {\n\tconst parts: string[] = []\n\tfor (const [key, val] of Object.entries(attrs)) {\n\t\tconst str = coerceString(val)\n\t\tif (str === \"\") continue\n\t\tparts.push(`${key}=\"${escapeAttr(str)}\"`)\n\t}\n\treturn parts.length ? ` ${parts.join(\" \")}` : \"\"\n}\n\nfunction serializeWithInlinePlaceholders(\n\tnode: NormalizedNode | string,\n\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>,\n\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n): string {\n\tif (typeof node === \"string\") return node\n\tif (node.tagName === \"qti-inline-choice-interaction\") {\n\t\tconst interaction = extractInlineChoiceInteraction(node)\n\t\tinlineEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-inline=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tif (node.tagName === \"qti-text-entry-interaction\") {\n\t\tconst interaction = extractTextEntryInteraction(node)\n\t\ttextEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-text-entry=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tconst open = `<${node.tagName}${attrsToString(node.attrs)}>`\n\tconst childrenHtml = node.children.map((c) => serializeWithInlinePlaceholders(c, inlineEmbeds, textEmbeds)).join(\"\")\n\tconst close = `</${node.tagName}>`\n\treturn `${open}${childrenHtml}${close}`\n}\n\n// --- QTI Structure Extractors ---\n\nfunction extractChoiceInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Extract optional inline feedback\n\t\tconst inlineFeedbackNode = findChild(choice, \"qti-feedback-inline\")\n\t\tconst inlineFeedbackHtml = inlineFeedbackNode ? getInnerHtml(inlineFeedbackNode) : undefined\n\n\t\t// Build content HTML excluding inline feedback nodes\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\tinlineFeedbackHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"choiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 1),\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractInlineChoiceInteraction(node: NormalizedNode) {\n\tconst choiceNodes = findChildren(node, \"qti-inline-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\tconst contentHtml = serializeInner(choice)\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"inlineChoiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tchoices\n\t}\n}\n\nfunction extractTextEntryInteraction(node: NormalizedNode) {\n\tconst expectedLengthAttr = node.attrs[\"expected-length\"]\n\tconst expectedLength = expectedLengthAttr ? Number(expectedLengthAttr) : undefined\n\n\treturn {\n\t\ttype: \"textEntryInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\texpectedLength: expectedLength !== undefined && !Number.isNaN(expectedLength) ? expectedLength : undefined,\n\t\tplaceholderText: coerceString(node.attrs[\"placeholder-text\"]) || undefined,\n\t\tpatternMask: coerceString(node.attrs[\"pattern-mask\"]) || undefined\n\t}\n}\n\nfunction extractOrderInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Filter out inline feedback nodes from content\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\t// Order interaction rarely displays inline feedback per-item\n\t\t\tinlineFeedbackHtml: undefined\n\t\t}\n\t})\n\n\t// Detect orientation (attribute OR class)\n\tlet orientation: \"vertical\" | \"horizontal\" = \"vertical\"\n\tconst attrOrientation = coerceString(node.attrs.orientation)\n\tconst classAttr = coerceString(node.attrs.class)\n\n\tif (attrOrientation === \"horizontal\" || classAttr.includes(\"qti-orientation-horizontal\")) {\n\t\torientation = \"horizontal\"\n\t}\n\n\treturn {\n\t\ttype: \"orderInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 0) || undefined,\n\t\torientation,\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractGapMatchInteraction(node: NormalizedNode) {\n\t// Extract gap texts (draggable tokens)\n\tconst gapTextNodes = findChildren(node, \"qti-gap-text\")\n\tconst gapTexts = gapTextNodes.map((gt) => ({\n\t\tidentifier: coerceString(gt.attrs.identifier),\n\t\tcontentHtml: serializeInner(gt),\n\t\tmatchMax: Number(gt.attrs[\"match-max\"] ?? 0) // 0 = unlimited\n\t}))\n\n\t// Find all gaps in the content and build content HTML with placeholders\n\tconst gaps: Array<{ identifier: string }> = []\n\n\t// Serialize content with gap placeholders\n\tfunction serializeWithGapPlaceholders(child: NormalizedNode | string): string {\n\t\tif (typeof child === \"string\") return child\n\t\tif (child.tagName === \"qti-gap\") {\n\t\t\tconst gapId = coerceString(child.attrs.identifier)\n\t\t\tgaps.push({ identifier: gapId })\n\t\t\treturn `<span data-qti-gap=\"${gapId}\"></span>`\n\t\t}\n\t\t// Skip gap-text nodes in content serialization (they're in the source pool)\n\t\tif (child.tagName === \"qti-gap-text\") {\n\t\t\treturn \"\"\n\t\t}\n\t\tconst open = `<${child.tagName}${attrsToString(child.attrs)}>`\n\t\tconst childrenHtml = child.children.map((c) => serializeWithGapPlaceholders(c)).join(\"\")\n\t\tconst close = `</${child.tagName}>`\n\t\treturn `${open}${childrenHtml}${close}`\n\t}\n\n\t// Build content HTML from children (excluding gap-text nodes which are sources)\n\tconst contentHtml = node.children\n\t\t.filter((c) => typeof c === \"string\" || c.tagName !== \"qti-gap-text\")\n\t\t.map((c) => serializeWithGapPlaceholders(c))\n\t\t.join(\"\")\n\n\treturn {\n\t\ttype: \"gapMatchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tgapTexts,\n\t\tgaps,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractMatchInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\t// QTI has two <qti-simple-match-set> nodes\n\tconst matchSets = findChildren(node, \"qti-simple-match-set\")\n\n\tconst extractChoices = (setNode: NormalizedNode) => {\n\t\tconst choiceNodes = findChildren(setNode, \"qti-simple-associable-choice\")\n\t\treturn choiceNodes.map((c) => ({\n\t\t\tidentifier: coerceString(c.attrs.identifier),\n\t\t\tmatchMax: Number(c.attrs[\"match-max\"]) || 1,\n\t\t\tcontentHtml: serializeInner(c)\n\t\t}))\n\t}\n\n\t// First set = Sources, Second set = Targets (QTI convention)\n\tconst firstSet = matchSets[0]\n\tconst secondSet = matchSets[1]\n\tconst sourceChoices = firstSet ? extractChoices(firstSet) : []\n\tconst targetChoices = secondSet ? extractChoices(secondSet) : []\n\n\treturn {\n\t\ttype: \"matchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: node.attrs.shuffle === \"true\",\n\t\tmaxAssociations: Number(node.attrs[\"max-associations\"]) || 0,\n\t\tsourceChoices,\n\t\ttargetChoices,\n\t\tpromptHtml\n\t}\n}\n\nfunction extractFeedbackBlock(node: NormalizedNode) {\n\tconst contentBodyNode = findChild(node, \"qti-content-body\")\n\tconst contentHtml = contentBodyNode ? getInnerHtml(contentBodyNode) : \"\"\n\tconst showHide: \"hide\" | \"show\" = coerceString(node.attrs[\"show-hide\"]) === \"hide\" ? \"hide\" : \"show\"\n\n\treturn {\n\t\toutcomeIdentifier: coerceString(node.attrs[\"outcome-identifier\"]),\n\t\tidentifier: coerceString(node.attrs.identifier),\n\t\tshowHide,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractResponseDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-response-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst correctResponseNode = findChild(node, \"qti-correct-response\")\n\t\tconst valueNodes = correctResponseNode ? findChildren(correctResponseNode, \"qti-value\") : []\n\t\tconst values = valueNodes.map(getTextContent)\n\n\t\t// Optional mapping for map-response processing\n\t\tconst mappingNode = findChild(node, \"qti-mapping\")\n\t\tlet mapping:\n\t\t\t| {\n\t\t\t\t\tdefaultValue: number\n\t\t\t\t\tlowerBound?: number\n\t\t\t\t\tupperBound?: number\n\t\t\t\t\tentries: Array<{ key: string; value: number }>\n\t\t\t }\n\t\t\t| undefined\n\t\tif (mappingNode) {\n\t\t\tconst defaultValueRaw = coerceString(mappingNode.attrs[\"default-value\"])\n\t\t\tconst lowerBoundRaw = coerceString(mappingNode.attrs[\"lower-bound\"])\n\t\t\tconst upperBoundRaw = coerceString(mappingNode.attrs[\"upper-bound\"])\n\t\t\tconst entryNodes = findChildren(mappingNode, \"qti-map-entry\")\n\t\t\tconst entries = entryNodes.map((en) => {\n\t\t\t\treturn {\n\t\t\t\t\tkey: coerceString(en.attrs[\"map-key\"]),\n\t\t\t\t\tvalue: Number(coerceString(en.attrs[\"mapped-value\"]) || 0)\n\t\t\t\t}\n\t\t\t})\n\t\t\tmapping = {\n\t\t\t\tdefaultValue: Number(defaultValueRaw || 0),\n\t\t\t\tlowerBound: lowerBoundRaw !== \"\" ? Number(lowerBoundRaw) : undefined,\n\t\t\t\tupperBound: upperBoundRaw !== \"\" ? Number(upperBoundRaw) : undefined,\n\t\t\t\tentries\n\t\t\t}\n\t\t}\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in response declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in response declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tcorrectResponse: { values },\n\t\t\tmapping\n\t\t}\n\t})\n}\n\nfunction extractOutcomeDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-outcome-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst defaultValueNode = findChild(node, \"qti-default-value\")\n\t\tconst valueNode = defaultValueNode ? findChild(defaultValueNode, \"qti-value\") : undefined\n\t\tconst defaultValue = valueNode ? { value: getTextContent(valueNode) } : undefined\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in outcome declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in outcome declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tdefaultValue\n\t\t}\n\t})\n}\n\nfunction parseCondition(node: NormalizedNode): AnyCondition | null {\n\t// A. Logical Operators\n\tif (node.tagName === \"qti-and\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"and\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-or\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"or\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-not\") {\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) return { type: \"not\", condition: parsed }\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// B. Variable Extraction (Common logic for comparators)\n\tconst variableNode = findChild(node, \"qti-variable\")\n\tconst baseValueNode = findChild(node, \"qti-base-value\")\n\n\tconst identifier = variableNode ? coerceString(variableNode.attrs.identifier) : undefined\n\tconst value = baseValueNode ? getTextContent(baseValueNode) : undefined\n\n\t// C. Comparators\n\tif (node.tagName === \"qti-match\") {\n\t\t// Match against correct response\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t\t// Match against a specific value\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"matchValue\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// String Match (text entry with case sensitivity)\n\tif (node.tagName === \"qti-string-match\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn {\n\t\t\t\ttype: \"stringMatch\",\n\t\t\t\tvariable: identifier,\n\t\t\t\tvalue,\n\t\t\t\t// QTI spec: case-sensitive defaults to true\n\t\t\t\tcaseSensitive: node.attrs[\"case-sensitive\"] !== \"false\"\n\t\t\t}\n\t\t}\n\t}\n\n\t// Member (set logic for multi-select)\n\tif (node.tagName === \"qti-member\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"member\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// Equal: supports both map-response comparisons and correct response matching\n\tif (node.tagName === \"qti-equal\") {\n\t\t// Pattern 1: Equal with map-response (for summed scores)\n\t\tconst mapResponseNode = findChild(node, \"qti-map-response\")\n\t\tconst equalBaseValueNode = findChild(node, \"qti-base-value\")\n\t\tif (mapResponseNode && equalBaseValueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"equalMapResponse\",\n\t\t\t\tvariable: coerceString(mapResponseNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(equalBaseValueNode)\n\t\t\t}\n\t\t}\n\t\t// Pattern 2: Equal with qti-correct (compare to correct response, like qti-match)\n\t\t// Used by text entry: <qti-equal><qti-variable/><qti-correct/></qti-equal>\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Parse actions (setOutcomeValue) from a branch node\nfunction parseActions(node: NormalizedNode): BaseRule[] {\n\tconst rules: BaseRule[] = []\n\tconst setNodes = findChildren(node, \"qti-set-outcome-value\")\n\tfor (const setNode of setNodes) {\n\t\tconst valueNode = findChild(setNode, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\trules.push({\n\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\tidentifier: coerceString(setNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t})\n\t\t}\n\t}\n\treturn rules\n}\n\n// RECURSIVE: Parse a processing rule (Condition Block OR Direct Action)\nfunction parseResponseRule(node: NormalizedNode): ResponseRule | null {\n\t// Case 1: Direct Action (e.g. <qti-set-outcome-value>)\n\tif (node.tagName === \"qti-set-outcome-value\") {\n\t\tconst valueNode = findChild(node, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"action\",\n\t\t\t\taction: {\n\t\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// Case 2: Response Condition (if/else block)\n\tif (node.tagName === \"qti-response-condition\") {\n\t\tconst branches: ConditionBranch[] = []\n\n\t\t// 1. IF\n\t\tconst ifNode = findChild(node, \"qti-response-if\")\n\t\tif (ifNode) {\n\t\t\tconst condition = findConditionInBranch(ifNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(ifNode),\n\t\t\t\t\tnestedRules: findNestedRules(ifNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 2. ELSE-IFs\n\t\tconst elseIfNodes = findChildren(node, \"qti-response-else-if\")\n\t\tfor (const elseIfNode of elseIfNodes) {\n\t\t\tconst condition = findConditionInBranch(elseIfNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(elseIfNode),\n\t\t\t\t\tnestedRules: findNestedRules(elseIfNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 3. ELSE\n\t\tconst elseNode = findChild(node, \"qti-response-else\")\n\t\tif (elseNode) {\n\t\t\tbranches.push({\n\t\t\t\tcondition: undefined, // Else has no condition\n\t\t\t\tactions: parseActions(elseNode),\n\t\t\t\tnestedRules: findNestedRules(elseNode)\n\t\t\t})\n\t\t}\n\n\t\tif (branches.length > 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"condition\",\n\t\t\t\tbranches\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Helper to find the condition node inside a response-if/else-if block\nfunction findConditionInBranch(node: NormalizedNode): AnyCondition | null {\n\tconst conditionTagNames = [\"qti-match\", \"qti-and\", \"qti-or\", \"qti-not\", \"qti-equal\", \"qti-string-match\", \"qti-member\"]\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\" && conditionTagNames.includes(child.tagName)) {\n\t\t\treturn parseCondition(child)\n\t\t}\n\t}\n\treturn null\n}\n\n// Helper to find nested CONDITION BLOCKS inside a branch\n// Note: We only look for qti-response-condition, NOT qti-set-outcome-value\n// because actions are already captured by parseActions() in the branch's `actions` array\nfunction findNestedRules(node: NormalizedNode): ResponseRule[] {\n\tconst nested: ResponseRule[] = []\n\tfor (const child of node.children) {\n\t\t// Only parse nested response-condition blocks, not standalone actions\n\t\tif (typeof child !== \"string\" && child.tagName === \"qti-response-condition\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) nested.push(rule)\n\t\t}\n\t}\n\treturn nested\n}\n\n// Main processing extractor\nfunction extractResponseProcessing(rootChildren: NormalizedNode[]): ResponseProcessing {\n\tconst processingNode = rootChildren.find((n) => n.tagName === \"qti-response-processing\")\n\tif (!processingNode) {\n\t\treturn { rules: [], scoring: { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 } }\n\t}\n\n\tconst rules: ResponseRule[] = []\n\tfor (const child of processingNode.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) rules.push(rule)\n\t\t}\n\t}\n\n\t// Legacy scoring extraction (unchanged logic for compatibility)\n\tlet scoring: ScoringRule = { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 }\n\tconst conditionNodes = findChildren(processingNode, \"qti-response-condition\")\n\tfor (const conditionNode of conditionNodes) {\n\t\tconst responseIfNode = findChild(conditionNode, \"qti-response-if\")\n\t\tconst responseElseNode = findChild(conditionNode, \"qti-response-else\")\n\n\t\tif (responseIfNode && responseElseNode) {\n\t\t\tconst andNode = findChild(responseIfNode, \"qti-and\")\n\t\t\tif (andNode) {\n\t\t\t\tconst matchNode = findChild(andNode, \"qti-match\")\n\t\t\t\tconst variableNode = matchNode ? findChild(matchNode, \"qti-variable\") : undefined\n\t\t\t\tif (variableNode) {\n\t\t\t\t\tconst ifSetOutcomeNode = findChild(responseIfNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst elseSetOutcomeNode = findChild(responseElseNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst correctValueNode = ifSetOutcomeNode ? findChild(ifSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tconst incorrectValueNode = elseSetOutcomeNode ? findChild(elseSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tscoring = {\n\t\t\t\t\t\tresponseIdentifier: coerceString(variableNode.attrs.identifier),\n\t\t\t\t\t\tcorrectScore: Number(getTextContent(correctValueNode) || 1),\n\t\t\t\t\t\tincorrectScore: Number(getTextContent(incorrectValueNode) || 0)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { rules, scoring }\n}\n\n// --- Main Parser Export ---\n\nexport function parseAssessmentItemXml(xml: string): AssessmentItem {\n\t// Validate input\n\tif (!xml || typeof xml !== \"string\") {\n\t\tthrow errors.new(\"xml input must be a non-empty string\")\n\t}\n\n\tconst parser = createXmlParser()\n\tconst parseResult = errors.trySync(() => {\n\t\t// Parse with preserveOrder flag as second parameter\n\t\treturn parser.parse(xml, true)\n\t})\n\n\tif (parseResult.error) {\n\t\tthrow errors.wrap(parseResult.error, \"xml parse\")\n\t}\n\n\tconst raw = parseResult.data\n\tif (!Array.isArray(raw)) {\n\t\tthrow errors.new(\"expected xml parser to output an array for preserveOrder\")\n\t}\n\n\tconst normalizedTree = raw.map(normalizeNode).filter((n): n is NormalizedNode => typeof n !== \"string\")\n\n\tconst rootNode = normalizedTree.find((n) => n.tagName.endsWith(\"assessment-item\"))\n\tif (!rootNode) {\n\t\tthrow errors.new(\"qti assessment item not found in xml document\")\n\t}\n\n\tconst rootChildren = rootNode.children.filter((c): c is NormalizedNode => typeof c !== \"string\")\n\tconst itemBodyNode = rootChildren.find((n) => n.tagName === \"qti-item-body\")\n\n\ttype InteractionUnion =\n\t\t| ReturnType<typeof extractChoiceInteraction>\n\t\t| ReturnType<typeof extractInlineChoiceInteraction>\n\t\t| ReturnType<typeof extractTextEntryInteraction>\n\t\t| ReturnType<typeof extractOrderInteraction>\n\t\t| ReturnType<typeof extractGapMatchInteraction>\n\t\t| ReturnType<typeof extractMatchInteraction>\n\ttype ContentBlock =\n\t\t| { type: \"stimulus\"; html: string }\n\t\t| {\n\t\t\t\ttype: \"richStimulus\"\n\t\t\t\thtml: string\n\t\t\t\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>\n\t\t\t\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n\t\t }\n\t\t| { type: \"interaction\"; interaction: InteractionUnion }\n\ttype FeedbackBlock = { outcomeIdentifier: string; identifier: string; showHide: \"hide\" | \"show\"; contentHtml: string }\n\n\tconst contentBlocks: ContentBlock[] = []\n\tconst feedbackBlocks: FeedbackBlock[] = []\n\n\tif (itemBodyNode) {\n\t\tfor (const child of itemBodyNode.children) {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\tif (child.trim()) contentBlocks.push({ type: \"stimulus\" as const, html: child })\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Collect all interaction nodes within this subtree\n\t\t\tif (child.tagName === \"qti-feedback-block\") {\n\t\t\t\tfeedbackBlocks.push(extractFeedbackBlock(child))\n\t\t\t} else {\n\t\t\t\tconst interactionNodes = findInteractionNodes(child)\n\t\t\t\tconst hasInline = interactionNodes.some(\n\t\t\t\t\t(n) => n.tagName === \"qti-inline-choice-interaction\" || n.tagName === \"qti-text-entry-interaction\"\n\t\t\t\t)\n\t\t\t\tif (hasInline) {\n\t\t\t\t\tconst inlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>> = {}\n\t\t\t\t\tconst textEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>> = {}\n\t\t\t\t\tconst html = serializeWithInlinePlaceholders(child, inlineEmbeds, textEmbeds)\n\t\t\t\t\tcontentBlocks.push({ type: \"richStimulus\" as const, html, inlineEmbeds, textEmbeds })\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (interactionNodes.length > 0) {\n\t\t\t\t\tfor (const inode of interactionNodes) {\n\t\t\t\t\t\tif (inode.tagName === \"qti-choice-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractChoiceInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-text-entry-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractTextEntryInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-order-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractOrderInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-gap-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractGapMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Unknown interaction subtype: serialize as stimulus fallback\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(inode) })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(child) })\n\t\t\t}\n\t\t}\n\t}\n\n\tlet normalizedItem = {\n\t\tidentifier: coerceString(rootNode.attrs.identifier),\n\t\ttitle: coerceString(rootNode.attrs.title),\n\t\ttimeDependent: Boolean(rootNode.attrs[\"time-dependent\"]),\n\t\txmlLang: coerceString(rootNode.attrs[\"xml:lang\"]) || coerceString(rootNode.attrs[\"xml-lang\"]) || \"en\",\n\t\tresponseDeclarations: extractResponseDeclarations(rootChildren),\n\t\toutcomeDeclarations: extractOutcomeDeclarations(rootChildren),\n\t\titemBody: { contentBlocks, feedbackBlocks },\n\t\tresponseProcessing: extractResponseProcessing(rootChildren)\n\t}\n\n\t// Fallback: if scoring.responseIdentifier is empty, derive from first response declaration\n\tif (\n\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier === \"\" &&\n\t\tnormalizedItem.responseDeclarations.length > 0\n\t) {\n\t\tconst firstDecl = normalizedItem.responseDeclarations[0]\n\t\tif (firstDecl) {\n\t\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier = firstDecl.identifier\n\t\t}\n\t}\n\n\tconst validation = AssessmentItemSchema.safeParse(normalizedItem)\n\tif (!validation.success) {\n\t\t// Format validation errors for better debugging\n\t\tconst errorDetails = validation.error.issues.map((err) => `${err.path.join(\".\")}: ${err.message}`).join(\"; \")\n\t\tthrow errors.new(`qti item validation: ${errorDetails}`)\n\t}\n\n\treturn validation.data\n}\n"]}