@ai-sdk-tool/rxml 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/errors/types.ts","../src/schema/base-coercion.ts","../src/schema/coercion.ts","../src/core/types.ts","../src/utils/helpers.ts","../src/schema/extraction.ts","../src/core/tokenizer.ts","../src/core/parser.ts","../src/core/stream.ts","../src/builders/stringify.ts"],"sourcesContent":["// Core functionality\nexport {\n filter,\n parse,\n parseNode,\n parseWithoutSchema,\n simplify,\n} from \"./core/parser\";\nexport {\n createXMLStream,\n findElementByIdStream,\n findElementsByClassStream,\n parseFromStream,\n processXMLStream,\n XMLTransformStream,\n} from \"./core/stream\";\nexport { XMLTokenizer } from \"./core/tokenizer\";\n\n// Schema integration\nexport {\n coerceDomBySchema,\n domToObject,\n getPropertySchema,\n getStringTypedProperties,\n processArrayContent,\n processIndexedTuple,\n} from \"./schema/coercion\";\nexport {\n countTagOccurrences,\n extractRawInner,\n findFirstTopLevelRange,\n} from \"./schema/extraction\";\n\n// Builders\nexport {\n stringify,\n stringifyNode,\n stringifyNodes,\n toContentString,\n} from \"./builders/stringify\";\n\n// Types\nexport type { ParseOptions, RXMLNode, StringifyOptions } from \"./core/types\";\n\n// Errors\nexport {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n RXMLStreamError,\n RXMLStringifyError,\n} from \"./errors/types\";\n\n// Compatibility\nexport interface Options {\n textNodeName?: string;\n throwOnDuplicateStringTags?: boolean;\n onError?: (message: string, context?: Record<string, unknown>) => void;\n}\n","/**\n * Error classes for robust-xml parser\n */\n\nexport class RXMLParseError extends Error {\n constructor(\n message: string,\n public cause?: unknown,\n public line?: number,\n public column?: number\n ) {\n super(message);\n this.name = \"RXMLParseError\";\n }\n}\n\nexport class RXMLDuplicateStringTagError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RXMLDuplicateStringTagError\";\n }\n}\n\nexport class RXMLCoercionError extends Error {\n constructor(\n message: string,\n public cause?: unknown\n ) {\n super(message);\n this.name = \"RXMLCoercionError\";\n }\n}\n\nexport class RXMLStringifyError extends Error {\n constructor(\n message: string,\n public cause?: unknown\n ) {\n super(message);\n this.name = \"RXMLStringifyError\";\n }\n}\n\nexport class RXMLStreamError extends Error {\n constructor(\n message: string,\n public cause?: unknown\n ) {\n super(message);\n this.name = \"RXMLStreamError\";\n }\n}\n","export function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") return schema;\n const s = schema as Record<string, unknown>;\n if (s.jsonSchema && typeof s.jsonSchema === \"object\") {\n return unwrapJsonSchema(s.jsonSchema);\n }\n return schema;\n}\n\nexport function getSchemaType(schema: unknown): string | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") return undefined;\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") return t;\n if (Array.isArray(t)) {\n const preferred = [\n \"object\",\n \"array\",\n \"boolean\",\n \"number\",\n \"integer\",\n \"string\",\n ];\n for (const p of preferred) if (t.includes(p)) return p;\n }\n const s = unwrapped as Record<string, unknown>;\n if (s && typeof s === \"object\" && (s.properties || s.additionalProperties)) {\n return \"object\";\n }\n if (\n s &&\n typeof s === \"object\" &&\n (s.items || (s as Record<string, unknown>).prefixItems)\n ) {\n return \"array\";\n }\n return undefined;\n}\n\nexport function coerceBySchema(value: unknown, schema?: unknown): unknown {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n if (typeof value === \"string\") {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n\n // Fallback: try parsing JSON-like strings when no schema info\n if (\n (s.startsWith(\"{\") && s.endsWith(\"}\")) ||\n (s.startsWith(\"[\") && s.endsWith(\"]\"))\n ) {\n try {\n const parsed = JSON.parse(s);\n // Recursively apply coercion to the parsed value without schema\n return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n }\n\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"object\") {\n try {\n // Better normalization for JSON strings with newlines and indentation\n let normalized = s.replace(/'/g, '\"');\n // Handle empty object cases\n normalized = normalized.replace(/^\\{\\s*\\}$/s, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\"\n ? v\n : coerceBySchema(v, propSchema);\n }\n return out;\n }\n } catch {\n // fallthrough\n }\n }\n if (schemaType === \"array\") {\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n } catch {\n const csv = s.includes(\"\\n\") ? s.split(/\\n+/) : s.split(/,\\s*/);\n const trimmed = csv.map(x => x.trim()).filter(x => x.length > 0);\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && trimmed.length === prefixItems.length) {\n return trimmed.map((x, i) => coerceBySchema(x, prefixItems[i]));\n }\n return trimmed.map(x => coerceBySchema(x, itemsSchema));\n }\n }\n }\n\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n const out: Record<string, unknown> = {};\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\" ? v : coerceBySchema(v, propSchema);\n }\n return out;\n }\n\n if (schemaType === \"array\") {\n const u = unwrapped as Record<string, unknown>;\n const itemsSchema = u.items as unknown;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n\n if (Array.isArray(value)) {\n if (prefixItems && value.length === prefixItems.length) {\n return value.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return value.map(v => coerceBySchema(v, itemsSchema));\n }\n\n if (value && typeof value === \"object\") {\n const maybe = value as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(maybe, \"item\")) {\n const items = (maybe as Record<string, unknown>).item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n\n // Special handling for objects with array-like field names that might represent arrays\n // This commonly happens when models output <multiples><number>3</number><number>5</number></multiples>\n // which gets parsed as { \"number\": [\"3\", \"5\"] }\n const keys = Object.keys(maybe);\n\n // Check for single field that contains an array (common XML pattern)\n if (keys.length === 1) {\n const singleKey = keys[0];\n const singleValue = maybe[singleKey];\n if (Array.isArray(singleValue)) {\n const coercedArray = singleValue.map(v =>\n coerceBySchema(v, itemsSchema)\n );\n return coercedArray;\n }\n }\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every(k => /^\\d+$/.test(k))) {\n const arr = keys\n .sort((a, b) => Number(a) - Number(b))\n .map(k => (maybe as Record<string, unknown>)[k]);\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n }\n }\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (schemaType === \"number\" || schemaType === \"integer\") {\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n }\n }\n\n return value;\n}\n","/**\n * Schema-aware type coercion for robust-xml\n * Integrates with the existing coercion system but adds XML-specific handling\n */\n\nimport type { RXMLNode } from \"../core/types\";\nimport { RXMLCoercionError } from \"../errors/types\";\nimport {\n coerceBySchema as baseCoerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"./base-coercion\";\n\n/**\n * Get property schema from a parent schema\n */\nexport function getPropertySchema(toolSchema: unknown, key: string): unknown {\n const unwrapped = unwrapJsonSchema(toolSchema);\n if (!unwrapped || typeof unwrapped !== \"object\") return undefined;\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && Object.prototype.hasOwnProperty.call(props, key)) {\n return (props as Record<string, unknown>)[key];\n }\n return undefined;\n}\n\n/**\n * Convert TXML-style DOM to flat object structure for schema coercion\n */\nexport function domToObject(\n nodes: (RXMLNode | string)[],\n schema: unknown,\n textNodeName = \"#text\"\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n // Top-level text content - usually from DOCTYPE, comments, etc.\n continue;\n }\n\n const { tagName, children, attributes } = node;\n\n // Handle the node content\n let value: unknown;\n\n if (children.length === 0) {\n // Empty element\n value = \"\";\n } else if (children.length === 1 && typeof children[0] === \"string\") {\n // Simple text content\n value = children[0];\n } else {\n // Complex content - convert children to object/array\n value = processComplexContent(\n children,\n getPropertySchema(schema, tagName),\n textNodeName\n );\n }\n\n // Add attributes if present\n if (Object.keys(attributes).length > 0) {\n if (typeof value === \"string\") {\n // For string values with attributes, create an object with text content and prefixed attributes\n const result: Record<string, unknown> = { [textNodeName]: value };\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n result[`@_${attrName}`] = attrValue;\n }\n value = result;\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n // For object values, add attributes with @_ prefix\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n (value as Record<string, unknown>)[`@_${attrName}`] = attrValue;\n }\n }\n }\n\n // Handle multiple elements with same tag name\n if (result[tagName]) {\n if (!Array.isArray(result[tagName])) {\n result[tagName] = [result[tagName]];\n }\n (result[tagName] as unknown[]).push(value);\n } else {\n result[tagName] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Process complex content (mixed text and elements)\n */\nfunction processComplexContent(\n children: (RXMLNode | string)[],\n schema: unknown,\n textNodeName: string\n): unknown {\n const textContent: string[] = [];\n const elements: Record<string, unknown> = {};\n\n for (const child of children) {\n if (typeof child === \"string\") {\n textContent.push(child);\n } else {\n // Process the entire child node, not just its children\n let childValue: unknown;\n\n if (child.children.length === 0) {\n // Empty element\n childValue = \"\";\n } else if (\n child.children.length === 1 &&\n typeof child.children[0] === \"string\"\n ) {\n // Simple text content\n childValue = child.children[0];\n } else {\n // Complex content - convert children to object/array\n childValue = processComplexContent(\n child.children,\n getPropertySchema(schema, child.tagName),\n textNodeName\n );\n }\n\n // Add attributes if present\n if (Object.keys(child.attributes).length > 0) {\n if (typeof childValue === \"string\") {\n // For string values with attributes, create an object with text content and prefixed attributes\n const result: Record<string, unknown> = {\n [textNodeName]: childValue,\n };\n for (const [attrName, attrValue] of Object.entries(\n child.attributes\n )) {\n result[`@_${attrName}`] = attrValue;\n }\n childValue = result;\n } else if (\n childValue &&\n typeof childValue === \"object\" &&\n !Array.isArray(childValue)\n ) {\n // For object values, add attributes with @_ prefix\n for (const [attrName, attrValue] of Object.entries(\n child.attributes\n )) {\n (childValue as Record<string, unknown>)[`@_${attrName}`] =\n attrValue;\n }\n }\n }\n\n if (elements[child.tagName]) {\n if (!Array.isArray(elements[child.tagName])) {\n elements[child.tagName] = [elements[child.tagName]];\n }\n (elements[child.tagName] as unknown[]).push(childValue);\n } else {\n elements[child.tagName] = childValue;\n }\n }\n }\n\n // If we have both text and elements, create a mixed content object\n if (textContent.length > 0 && Object.keys(elements).length > 0) {\n return {\n [textNodeName]: textContent.join(\"\").trim(),\n ...elements,\n };\n }\n\n // If only text content\n if (textContent.length > 0 && Object.keys(elements).length === 0) {\n return textContent.join(\"\").trim();\n }\n\n // If only elements\n if (Object.keys(elements).length > 0) {\n return elements;\n }\n\n // Empty content\n return \"\";\n}\n\n/**\n * Coerce DOM object using schema information\n */\nexport function coerceDomBySchema(\n domObject: Record<string, unknown>,\n schema: unknown\n): Record<string, unknown> {\n try {\n return baseCoerceBySchema(domObject, schema) as Record<string, unknown>;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce DOM object by schema\", error);\n }\n}\n\n/**\n * Extract string-typed property names from schema\n */\nexport function getStringTypedProperties(schema: unknown): Set<string> {\n const set = new Set<string>();\n const unwrapped = unwrapJsonSchema(schema);\n\n if (unwrapped && typeof unwrapped === \"object\") {\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n\n if (props && typeof props === \"object\") {\n for (const key of Object.keys(props)) {\n const propSchema = (props as Record<string, unknown>)[key];\n const propType = getSchemaType(propSchema);\n if (propType === \"string\") {\n set.add(key);\n }\n }\n }\n }\n\n return set;\n}\n\n/**\n * Process array-like structures from XML\n */\nexport function processArrayContent(\n value: unknown,\n schema: unknown,\n textNodeName: string\n): unknown {\n if (!Array.isArray(value)) return value;\n\n const schemaType = getSchemaType(schema);\n\n if (schemaType === \"string\") {\n // For string arrays, extract text content and take first item for duplicates\n return value.map(item => {\n if (typeof item === \"string\") return item.trim();\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : String(textVal);\n }\n return String(item);\n });\n }\n\n // For other types, process each item\n return value.map(item => {\n if (typeof item === \"string\") return item.trim();\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return item;\n });\n}\n\n/**\n * Handle indexed tuple structures (elements with numeric keys)\n */\nexport function processIndexedTuple(\n obj: Record<string, unknown>,\n textNodeName: string\n): unknown[] {\n const keys = Object.keys(obj);\n const indices = keys.map(k => parseInt(k, 10)).sort((a, b) => a - b);\n const isValidTuple =\n indices[0] === 0 && indices.every((val, idx) => val === idx);\n\n if (!isValidTuple) return [obj];\n\n const sortedKeys = keys.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\n return sortedKeys.map(key => {\n const item = obj[key];\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n}\n","/**\n * Core types for the robust-xml parser\n * Based on TXML structure but enhanced for schema-aware parsing\n */\n\nexport type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\n/**\n * Represents a parsed XML node in the DOM tree\n */\nexport interface RXMLNode {\n tagName: string;\n attributes: Record<string, string | null>;\n children: (RXMLNode | string)[];\n}\n\n/**\n * Options for XML parsing\n */\nexport interface ParseOptions {\n /** Position to start parsing from (for streaming) */\n pos?: number;\n /** Array of tag names that don't have children and don't need to be closed */\n noChildNodes?: string[];\n /** Whether to set position information in result */\n setPos?: boolean;\n /** Keep comments in the parsed result */\n keepComments?: boolean;\n /** Keep whitespace like spaces, tabs and line breaks as string content */\n keepWhitespace?: boolean;\n /** Name of the text node property (default: \"#text\") */\n textNodeName?: string;\n /** Whether to throw on duplicate string tags */\n throwOnDuplicateStringTags?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /** Whether to parse a single node instead of children */\n parseNode?: boolean;\n /** Filter function for nodes */\n filter?: (\n node: RXMLNode,\n index: number,\n depth: number,\n path: string\n ) => boolean;\n /** Simplify the result structure */\n simplify?: boolean;\n}\n\n/**\n * Options for XML stringification\n */\nexport interface StringifyOptions {\n /** Whether to format the output with indentation */\n format?: boolean;\n /** Whether to suppress empty nodes */\n suppressEmptyNode?: boolean;\n /**\n * Whether to use minimal escaping per XML 1.0:\n * - In character data: escape '&' and '<' (and '>' only in ']]>' sequence)\n * - In attribute values: escape '&', '<', and only the wrapping quote\n * Defaults to false (conservative escaping of &, <, >, \", ')\n */\n minimalEscaping?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /**\n * When true, serialize boolean-like attributes (value === null)\n * as name=\"name\" to follow strict XML attribute rules.\n * When false (default), serialize as a convenience flag without value\n * (e.g., <item checked>), for compatibility with existing outputs.\n */\n strictBooleanAttributes?: boolean;\n}\n\n/**\n * Result of parsing with position information\n */\nexport interface ParseResult {\n result: (RXMLNode | string)[];\n pos: number;\n}\n\n/**\n * Character code constants for efficient parsing\n */\nexport const CharCodes = {\n OPEN_BRACKET: \"<\".charCodeAt(0),\n CLOSE_BRACKET: \">\".charCodeAt(0),\n MINUS: \"-\".charCodeAt(0),\n SLASH: \"/\".charCodeAt(0),\n EXCLAMATION: \"!\".charCodeAt(0),\n QUESTION: \"?\".charCodeAt(0),\n SINGLE_QUOTE: \"'\".charCodeAt(0),\n DOUBLE_QUOTE: '\"'.charCodeAt(0),\n OPEN_CORNER_BRACKET: \"[\".charCodeAt(0),\n CLOSE_CORNER_BRACKET: \"]\".charCodeAt(0),\n SPACE: \" \".charCodeAt(0),\n TAB: \"\\t\".charCodeAt(0),\n NEWLINE: \"\\n\".charCodeAt(0),\n CARRIAGE_RETURN: \"\\r\".charCodeAt(0),\n} as const;\n\n/**\n * Default self-closing HTML tags\n */\nexport const DEFAULT_NO_CHILD_NODES = [\n \"img\",\n \"br\",\n \"input\",\n \"meta\",\n \"link\",\n \"hr\",\n \"area\",\n \"base\",\n \"col\",\n \"embed\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n] as const;\n\n/**\n * Name spacer characters for tag name parsing\n */\nexport const NAME_SPACER = \"\\r\\n\\t>/= \";\n","/**\n * Utility functions for XML parsing\n */\n\nimport { CharCodes, NAME_SPACER } from \"../core/types\";\n\n/**\n * Check if a character is a valid XML name start character\n */\nexport function isNameStartChar(ch: string): boolean {\n return /[A-Za-z_:]/.test(ch);\n}\n\n/**\n * Check if a character is a valid XML name character\n */\nexport function isNameChar(ch: string): boolean {\n return /[A-Za-z0-9_.:-]/.test(ch);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(charCode: number): boolean {\n return (\n charCode === CharCodes.SPACE ||\n charCode === CharCodes.TAB ||\n charCode === CharCodes.NEWLINE ||\n charCode === CharCodes.CARRIAGE_RETURN\n );\n}\n\n/**\n * Skip over quoted string content in XML\n */\nexport function skipQuoted(s: string, i: number): number {\n const quote = s[i];\n i++;\n while (i < s.length) {\n const ch = s[i];\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === quote) return i + 1;\n i++;\n }\n return i;\n}\n\n/**\n * Parse a tag name from the current position\n */\nexport function parseName(\n s: string,\n pos: number\n): { name: string; newPos: number } {\n const start = pos;\n while (NAME_SPACER.indexOf(s[pos]) === -1 && s[pos]) {\n pos++;\n }\n return { name: s.slice(start, pos), newPos: pos };\n}\n\n/**\n * Parse a quoted string value\n */\nexport function parseString(\n s: string,\n pos: number\n): { value: string; newPos: number } {\n const startChar = s[pos];\n const startPos = pos + 1;\n const endPos = s.indexOf(startChar, startPos);\n if (endPos === -1) {\n // Unclosed string - find the next > to continue parsing\n const tagEnd = s.indexOf(\">\", startPos);\n if (tagEnd !== -1) {\n return { value: s.slice(startPos, tagEnd), newPos: tagEnd };\n }\n // If no > found, return what we have\n return { value: s.slice(startPos), newPos: s.length };\n }\n return { value: s.slice(startPos, endPos), newPos: endPos + 1 };\n}\n\n/**\n * Find elements by attribute value (used for getElementById, etc.)\n */\nexport function findElementsByAttr(\n xmlString: string,\n attrName: string,\n attrValue: string\n): number[] {\n const regex = new RegExp(`\\\\s${attrName}\\\\s*=['\"\"]${attrValue}['\"\"]`);\n const positions: number[] = [];\n let searchPos = 0;\n\n while (true) {\n const match = regex.exec(xmlString.slice(searchPos));\n if (!match) break;\n\n const pos = xmlString.lastIndexOf(\"<\", searchPos + match.index);\n if (pos !== -1) {\n positions.push(pos);\n }\n searchPos += match.index + match[0].length;\n }\n\n return positions;\n}\n\n/**\n * Calculate line and column from position in string\n */\nexport function getLineColumn(\n s: string,\n pos: number\n): { line: number; column: number } {\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < pos && i < s.length; i++) {\n if (s[i] === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Escape XML special characters used in element content and attribute values.\n *\n * References (W3C XML 1.0, Fifth Edition):\n * - 2.4 Character Data and Markup: '<' and '&' MUST NOT appear literally in content;\n * they MUST be escaped. '>' MUST be escaped in the sequence ']]>' and MAY be\n * escaped otherwise. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/\n * - 3.1 Start-Tags, End-Tags, and Empty-Element Tags (AttValue [10]): attribute\n * values are quoted with ' or \", and the matching quote MUST be escaped inside.\n * - 4.6 Predefined Entities: amp, lt, gt, apos, quot MUST be recognized by all\n * XML processors. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent\n *\n * We conservatively escape &, <, >, \", ' using the predefined entities.\n */\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\n/**\n * Minimal escaping for character data per XML 1.0 §2.4.\n * - Escape '&' and '<' always\n * - Escape only the ']]>' sequence by turning '>' into '&gt;' in that context\n */\nexport function escapeXmlMinimalText(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/]]>/g, \"]]&gt;\");\n}\n\n/**\n * Minimal escaping for attribute values per XML 1.0 §3.1 (AttValue [10]).\n * - Escape '&' and '<' always\n * - Escape only the wrapper quote among ' or \"\n */\nexport function escapeXmlMinimalAttr(\n value: string,\n wrapper: '\"' | \"'\" = '\"'\n): string {\n let escaped = value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\");\n if (wrapper === '\"') {\n escaped = escaped.replace(/\"/g, \"&quot;\");\n } else {\n escaped = escaped.replace(/'/g, \"&apos;\");\n }\n return escaped;\n}\n\n/**\n * Unescape XML entities\n */\nexport function unescapeXml(text: string): string {\n return text\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, \"&\");\n}\n","/**\n * Raw content extraction utilities for string-typed properties\n * This replaces the string-based extraction with DOM-based extraction\n */\n\nimport type { RXMLNode } from \"../core/types\";\nimport {\n isNameChar,\n isNameStartChar,\n parseName,\n skipQuoted,\n} from \"../utils/helpers\";\n\n/**\n * Extract raw inner content from XML string for a specific tag\n * This is used for string-typed properties to preserve exact content\n */\nexport function extractRawInner(\n xmlContent: string,\n tagName: string\n): string | undefined {\n const len = xmlContent.length;\n const target = tagName;\n let bestStart = -1;\n let bestEnd = -1;\n let bestDepth = Number.POSITIVE_INFINITY;\n\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) return undefined;\n i = lt + 1;\n if (i >= len) return undefined;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n depth = Math.max(0, depth - 1);\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\n let isSelfClosing = false;\n\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k++;\n break;\n }\n k++;\n }\n\n const tagEnd = k;\n if (name === target) {\n const contentStart =\n xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n if (depth < bestDepth) {\n bestStart = contentStart;\n bestEnd = contentStart;\n bestDepth = depth;\n }\n } else {\n let pos = contentStart;\n let sameDepth = 1;\n\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1) break;\n const nx = nextLt + 1;\n if (nx >= len) break;\n\n const h = xmlContent[nx];\n if (h === \"!\") {\n if (xmlContent.startsWith(\"!--\", nx + 1)) {\n const close = xmlContent.indexOf(\"-->\", nx + 4);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", nx + 1)) {\n const close = xmlContent.indexOf(\"]]>\", nx + 9);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else if (h === \"?\") {\n const close = xmlContent.indexOf(\"?>\", nx + 1);\n pos = close === -1 ? len : close + 2;\n continue;\n } else if (h === \"/\") {\n let t = nx + 1;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const endName = xmlContent.slice(nx + 1, t);\n const gt2 = xmlContent.indexOf(\">\", t);\n if (endName === target) {\n sameDepth--;\n if (sameDepth === 0) {\n if (depth < bestDepth) {\n bestStart = contentStart;\n bestEnd = nextLt;\n bestDepth = depth;\n }\n break;\n }\n }\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else {\n let t = nx;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n let u = t;\n let isSelfClosingNested = false;\n while (u < len) {\n const cu = xmlContent[u];\n if (cu === '\"' || cu === \"'\") {\n u = skipQuoted(xmlContent, u);\n continue;\n }\n if (cu === \">\") break;\n if (cu === \"/\" && xmlContent[u + 1] === \">\") {\n isSelfClosingNested = true;\n u++;\n break;\n }\n u++;\n }\n const startName = xmlContent.slice(nx, t);\n if (startName === target && !isSelfClosingNested) {\n sameDepth++;\n }\n pos = xmlContent[u] === \">\" ? u + 1 : u + 1;\n continue;\n }\n }\n }\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n continue;\n }\n }\n\n if (bestStart !== -1) {\n return xmlContent.slice(bestStart, bestEnd);\n }\n return undefined;\n}\n\n/**\n * Find the first top-level range for a tag\n */\nexport function findFirstTopLevelRange(\n xmlContent: string,\n tagName: string\n): { start: number; end: number } | undefined {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) return undefined;\n i = lt + 1;\n if (i >= len) return undefined;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n depth = Math.max(0, depth - 1);\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\n let isSelfClosing = false;\n\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k++;\n break;\n }\n k++;\n }\n\n const tagEnd = k;\n if (depth === 0 && name === target) {\n const contentStart =\n xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n if (isSelfClosing) return { start: contentStart, end: contentStart };\n\n let pos = contentStart;\n let sameDepth = 1;\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1) break;\n const nx = nextLt + 1;\n if (nx >= len) break;\n\n const h = xmlContent[nx];\n if (h === \"!\") {\n if (xmlContent.startsWith(\"!--\", nx + 1)) {\n const close = xmlContent.indexOf(\"-->\", nx + 4);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", nx + 1)) {\n const close = xmlContent.indexOf(\"]]>\", nx + 9);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else if (h === \"?\") {\n const close = xmlContent.indexOf(\"?>\", nx + 1);\n pos = close === -1 ? len : close + 2;\n continue;\n } else if (h === \"/\") {\n let t = nx + 1;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const endName = xmlContent.slice(nx + 1, t);\n const gt2 = xmlContent.indexOf(\">\", t);\n if (endName === target) {\n sameDepth--;\n if (sameDepth === 0) {\n return { start: contentStart, end: nextLt };\n }\n }\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else {\n let t = nx;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const startName = xmlContent.slice(nx, t);\n let u = t;\n let isSelfClosingNested = false;\n while (u < len) {\n const cu = xmlContent[u];\n if (cu === '\"' || cu === \"'\") {\n u = skipQuoted(xmlContent, u);\n continue;\n }\n if (cu === \">\") break;\n if (cu === \"/\" && xmlContent[u + 1] === \">\") {\n isSelfClosingNested = true;\n u++;\n break;\n }\n u++;\n }\n // Track nested opening tags with the same name so we only end when\n // the matching top-level closing tag is reached\n if (startName === target && !isSelfClosingNested) {\n sameDepth++;\n }\n pos = xmlContent[u] === \">\" ? u + 1 : u + 1;\n continue;\n }\n }\n return undefined;\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n continue;\n }\n }\n return undefined;\n}\n\n/**\n * Count tag occurrences, excluding specified ranges\n */\nexport function countTagOccurrences(\n xmlContent: string,\n tagName: string,\n excludeRanges?: Array<{ start: number; end: number }>,\n shouldSkipFirst: boolean = true\n): number {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let count = 0;\n let skipFirstLocal = shouldSkipFirst;\n const isExcluded = (pos: number): boolean => {\n if (!excludeRanges || excludeRanges.length === 0) return false;\n for (const r of excludeRanges) {\n if (pos >= r.start && pos < r.end) return true;\n }\n return false;\n };\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) break;\n i = lt + 1;\n if (i >= len) break;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k++;\n break;\n }\n k++;\n }\n if (name === target && !isExcluded(lt)) {\n if (skipFirstLocal) {\n skipFirstLocal = false;\n } else {\n count++;\n }\n }\n i = k + 1;\n continue;\n }\n }\n\n return count;\n}\n\n/**\n * Find all top-level ranges for a tag (for handling duplicates)\n */\nexport function findAllTopLevelRanges(\n xmlContent: string,\n tagName: string\n): Array<{ start: number; end: number }> {\n const ranges: Array<{ start: number; end: number }> = [];\n const len = xmlContent.length;\n const target = tagName;\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) break;\n i = lt + 1;\n if (i >= len) break;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n // Closing tag\n i++;\n const { name, newPos } = parseName(xmlContent, i);\n if (name === target) depth--;\n i = xmlContent.indexOf(\">\", newPos);\n if (i === -1) break;\n i++;\n continue;\n }\n\n // Opening tag\n const { name, newPos } = parseName(xmlContent, i);\n i = newPos;\n\n // Skip attributes\n let k = i;\n while (k < len && xmlContent[k] !== \">\") {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k++;\n break;\n }\n k++;\n }\n\n if (name === target && depth === 0) {\n // Found a top-level occurrence\n const tagStart = lt;\n const isSelfClosing =\n xmlContent[k] === \"/\" || xmlContent.startsWith(\"/>\", k);\n\n if (isSelfClosing) {\n ranges.push({\n start: tagStart,\n end: k + (xmlContent[k] === \"/\" ? 2 : 1),\n });\n } else {\n // Find the closing tag\n depth++;\n let closeDepth = 1;\n let j = k + 1;\n\n while (j < len && closeDepth > 0) {\n const nextLt = xmlContent.indexOf(\"<\", j);\n if (nextLt === -1) break;\n\n if (xmlContent[nextLt + 1] === \"/\") {\n const { name: closeName } = parseName(xmlContent, nextLt + 2);\n if (closeName === target) closeDepth--;\n } else if (\n xmlContent[nextLt + 1] !== \"!\" &&\n xmlContent[nextLt + 1] !== \"?\"\n ) {\n const { name: openName } = parseName(xmlContent, nextLt + 1);\n if (openName === target) closeDepth++;\n }\n\n j = xmlContent.indexOf(\">\", nextLt + 1);\n if (j === -1) break;\n j++;\n }\n\n if (closeDepth === 0) {\n ranges.push({ start: tagStart, end: j });\n }\n depth--;\n }\n }\n\n i = k + 1;\n }\n\n return ranges;\n}\n\n/**\n * Extract raw content from DOM node\n */\nexport function extractRawFromNode(node: RXMLNode): string {\n if (node.children.length === 0) return \"\";\n if (node.children.length === 1 && typeof node.children[0] === \"string\") {\n return node.children[0];\n }\n\n // For complex content, concatenate all text nodes\n let result = \"\";\n for (const child of node.children) {\n if (typeof child === \"string\") {\n result += child;\n } else {\n result += extractRawFromNode(child);\n }\n }\n return result;\n}\n","/**\n * XML Tokenizer based on TXML's character-by-character parsing approach\n * with enhanced error tolerance and schema awareness\n */\n\nimport { RXMLParseError } from \"../errors/types\";\nimport { getLineColumn, parseName, parseString } from \"../utils/helpers\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\nimport { CharCodes, DEFAULT_NO_CHILD_NODES } from \"./types\";\n\nexport class XMLTokenizer {\n private pos = 0;\n private readonly xmlString: string;\n private readonly options: ParseOptions;\n\n constructor(xmlString: string, options: ParseOptions = {}) {\n this.xmlString = xmlString;\n this.options = {\n keepComments: false,\n keepWhitespace: false,\n noChildNodes: DEFAULT_NO_CHILD_NODES.slice(),\n textNodeName: \"#text\",\n throwOnDuplicateStringTags: true,\n ...options,\n };\n this.pos = options.pos || 0;\n }\n\n /**\n * Parse XML children recursively\n */\n public parseChildren(tagName?: string): (RXMLNode | string)[] {\n const children: (RXMLNode | string)[] = [];\n let consumedToEnd = false;\n\n while (this.xmlString[this.pos]) {\n if (this.xmlString.charCodeAt(this.pos) === CharCodes.OPEN_BRACKET) {\n if (this.xmlString.charCodeAt(this.pos + 1) === CharCodes.SLASH) {\n // Closing tag\n const closeStart = this.pos + 2;\n this.pos = this.xmlString.indexOf(\">\", this.pos);\n\n const closeTag = this.xmlString.substring(closeStart, this.pos);\n if (tagName && closeTag.trim() !== tagName) {\n // Mismatched closing tag - throw error with context\n const { line, column } = getLineColumn(this.xmlString, this.pos);\n throw new RXMLParseError(\n `Unexpected close tag at line ${line}, column ${column}. Expected </${tagName}>, found </${closeTag}>`,\n undefined,\n line,\n column\n );\n }\n\n if (this.pos !== -1) this.pos += 1;\n return children;\n } else if (\n this.xmlString.charCodeAt(this.pos + 1) === CharCodes.EXCLAMATION\n ) {\n // Comment, CDATA, or DOCTYPE\n const prevPos = this.pos;\n this.handleSpecialContent(children);\n // Check if handleSpecialContent consumed everything to the end\n if (\n this.pos >= this.xmlString.length &&\n prevPos < this.xmlString.length\n ) {\n consumedToEnd = true;\n }\n } else {\n // Regular element\n const node = this.parseNode();\n children.push(node);\n\n // Handle processing instructions differently\n if (node.tagName[0] === \"?\") {\n children.push(...node.children);\n node.children = [];\n }\n }\n } else {\n // Text content\n const text = this.parseText();\n if (this.options.keepWhitespace) {\n if (text.length > 0) {\n children.push(text);\n }\n } else {\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n children.push(trimmed);\n }\n }\n this.pos++;\n }\n }\n\n // Check for unclosed tags - if we've reached the end and still have a tagName, it's unclosed\n // But don't throw if special content (like unclosed CDATA) consumed everything to the end\n if (tagName && this.pos >= this.xmlString.length && !consumedToEnd) {\n const { line, column } = getLineColumn(this.xmlString, this.pos - 1);\n throw new RXMLParseError(\n `Unclosed tag at line ${line}, column ${column}. Expected closing tag </${tagName}>`,\n undefined,\n line,\n column\n );\n }\n\n return children;\n }\n\n /**\n * Parse a single XML node\n */\n public parseNode(): RXMLNode {\n this.pos++; // Skip opening <\n\n const { name: tagName, newPos } = parseName(this.xmlString, this.pos);\n this.pos = newPos;\n\n const attributes: Record<string, string | null> = {};\n let children: (RXMLNode | string)[] = [];\n\n // Parse attributes\n while (\n this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET &&\n this.xmlString[this.pos]\n ) {\n const c = this.xmlString.charCodeAt(this.pos);\n\n // Skip whitespace\n if (\n c === CharCodes.SPACE ||\n c === CharCodes.TAB ||\n c === CharCodes.NEWLINE ||\n c === CharCodes.CARRIAGE_RETURN\n ) {\n this.pos++;\n continue;\n }\n\n if ((c > 64 && c < 91) || (c > 96 && c < 123)) {\n // Attribute name\n const { name: attrName, newPos: nameEnd } = parseName(\n this.xmlString,\n this.pos\n );\n this.pos = nameEnd;\n\n // Skip whitespace before =\n while (\n this.pos < this.xmlString.length &&\n (this.xmlString.charCodeAt(this.pos) === CharCodes.SPACE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.TAB ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.NEWLINE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.CARRIAGE_RETURN)\n ) {\n this.pos++;\n }\n\n let value: string | null = null;\n if (\n this.pos < this.xmlString.length &&\n this.xmlString[this.pos] === \"=\"\n ) {\n this.pos++; // Skip =\n\n // Skip whitespace after =\n while (\n this.pos < this.xmlString.length &&\n (this.xmlString.charCodeAt(this.pos) === CharCodes.SPACE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.TAB ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.NEWLINE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.CARRIAGE_RETURN)\n ) {\n this.pos++;\n }\n\n const code = this.xmlString.charCodeAt(this.pos);\n if (\n code === CharCodes.SINGLE_QUOTE ||\n code === CharCodes.DOUBLE_QUOTE\n ) {\n const { value: parsedValue, newPos: valueEnd } = parseString(\n this.xmlString,\n this.pos\n );\n value = parsedValue;\n this.pos = valueEnd;\n }\n }\n\n attributes[attrName] = value;\n } else {\n // Unknown character, skip it\n this.pos++;\n }\n }\n\n // Check for self-closing tag or processing instruction\n const isSelfClosing =\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.SLASH ||\n (tagName[0] === \"?\" &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.QUESTION);\n\n if (!isSelfClosing) {\n if (tagName === \"script\") {\n // Special handling for script tags\n const start = this.pos + 1;\n this.pos = this.xmlString.indexOf(\"</script>\", this.pos);\n if (this.pos === -1) {\n // Unclosed script tag - extract content to end\n children = [this.xmlString.slice(start)];\n this.pos = this.xmlString.length;\n } else {\n children = [this.xmlString.slice(start, this.pos)];\n this.pos += 9;\n }\n } else if (tagName === \"style\") {\n // Special handling for style tags\n const start = this.pos + 1;\n this.pos = this.xmlString.indexOf(\"</style>\", this.pos);\n if (this.pos === -1) {\n // Unclosed style tag - extract content to end\n children = [this.xmlString.slice(start)];\n this.pos = this.xmlString.length;\n } else {\n children = [this.xmlString.slice(start, this.pos)];\n this.pos += 8;\n }\n } else if (this.options.noChildNodes?.indexOf(tagName) === -1) {\n // Parse children for non-self-closing tags\n this.pos++;\n children = this.parseChildren(tagName);\n } else {\n // Tag is in noChildNodes - handle based on whether it's a default HTML self-closing tag\n this.pos++;\n if ((DEFAULT_NO_CHILD_NODES as readonly string[]).includes(tagName)) {\n // HTML self-closing tags don't have closing tags\n // Position is already correct\n } else {\n // Custom noChildNodes tags might have closing tags to skip\n const closingTag = `</${tagName}>`;\n const closingPos = this.xmlString.indexOf(closingTag, this.pos);\n if (closingPos !== -1) {\n this.pos = closingPos + closingTag.length;\n }\n // If no closing tag found, leave position as is\n }\n }\n } else {\n this.pos++;\n }\n\n return { tagName, attributes, children };\n }\n\n /**\n * Parse text content until next tag\n */\n private parseText(): string {\n const start = this.pos;\n this.pos = this.xmlString.indexOf(\"<\", this.pos) - 1;\n if (this.pos === -2) {\n this.pos = this.xmlString.length;\n }\n return this.xmlString.slice(start, this.pos + 1);\n }\n\n /**\n * Handle comments, CDATA, and DOCTYPE declarations\n */\n private handleSpecialContent(children: (RXMLNode | string)[]): void {\n if (this.xmlString.charCodeAt(this.pos + 2) === CharCodes.MINUS) {\n // Comment\n this.handleComment(children);\n } else if (\n this.xmlString.charCodeAt(this.pos + 2) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.charCodeAt(this.pos + 8) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.substr(this.pos + 3, 5).toLowerCase() === \"cdata\"\n ) {\n // CDATA\n this.handleCData(children);\n } else {\n // DOCTYPE or other declaration\n this.handleDoctype(children);\n }\n }\n\n /**\n * Handle XML comments\n */\n private handleComment(children: (RXMLNode | string)[]): void {\n const startCommentPos = this.pos;\n\n // Find comment end\n while (\n this.pos !== -1 &&\n !(\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_BRACKET &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.MINUS &&\n this.xmlString.charCodeAt(this.pos - 2) === CharCodes.MINUS\n )\n ) {\n this.pos = this.xmlString.indexOf(\">\", this.pos + 1);\n }\n\n if (this.pos === -1) {\n this.pos = this.xmlString.length;\n }\n\n if (this.options.keepComments) {\n children.push(this.xmlString.substring(startCommentPos, this.pos + 1));\n }\n\n this.pos++;\n }\n\n /**\n * Handle CDATA sections\n */\n private handleCData(children: (RXMLNode | string)[]): void {\n const cdataEndIndex = this.xmlString.indexOf(\"]]>\", this.pos);\n if (cdataEndIndex === -1) {\n // Unclosed CDATA - consume everything to the end\n children.push(this.xmlString.substr(this.pos + 9));\n this.pos = this.xmlString.length;\n } else {\n children.push(this.xmlString.substring(this.pos + 9, cdataEndIndex));\n this.pos = cdataEndIndex + 3;\n }\n }\n\n /**\n * Handle DOCTYPE declarations\n */\n private handleDoctype(children: (RXMLNode | string)[]): void {\n const startDoctype = this.pos + 1;\n this.pos += 2;\n let encapsulated = false;\n\n while (\n (this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET ||\n encapsulated) &&\n this.xmlString[this.pos]\n ) {\n if (\n this.xmlString.charCodeAt(this.pos) === CharCodes.OPEN_CORNER_BRACKET\n ) {\n encapsulated = true;\n } else if (\n encapsulated &&\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_CORNER_BRACKET\n ) {\n encapsulated = false;\n }\n this.pos++;\n }\n\n children.push(this.xmlString.substring(startDoctype, this.pos));\n this.pos++;\n }\n\n /**\n * Get current position\n */\n public getPosition(): number {\n return this.pos;\n }\n\n /**\n * Set position\n */\n public setPosition(pos: number): void {\n this.pos = pos;\n }\n}\n","/**\n * Main XML parser that integrates tokenization, schema awareness, and error tolerance\n * This replaces the fast-xml-parser dependency with a TXML-based implementation\n */\n\nimport {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n} from \"../errors/types\";\nimport { getSchemaType, unwrapJsonSchema } from \"../schema/base-coercion\";\nimport {\n coerceDomBySchema,\n domToObject,\n getPropertySchema,\n getStringTypedProperties,\n processArrayContent,\n processIndexedTuple,\n} from \"../schema/coercion\";\nimport {\n countTagOccurrences,\n extractRawInner,\n findFirstTopLevelRange,\n} from \"../schema/extraction\";\nimport { XMLTokenizer } from \"./tokenizer\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\n\n/**\n * Parse XML with schema-aware type coercion\n */\nexport function parse(\n xmlInner: string,\n schema: unknown,\n options: ParseOptions = {}\n): Record<string, unknown> {\n const textNodeName = options.textNodeName ?? \"#text\";\n const throwDup = options.throwOnDuplicateStringTags ?? true;\n\n // If xmlInner looks like a full XML document (single root element), extract its inner content\n // But only if the schema doesn't expect that root element. Use a parser-style scan for robustness.\n let actualXmlInner = xmlInner.trim();\n if (actualXmlInner.startsWith(\"<\") && actualXmlInner.endsWith(\">\")) {\n const s = actualXmlInner;\n let i = 0;\n let rootStart = -1;\n let rootName = \"\";\n\n while (i < s.length) {\n const lt = s.indexOf(\"<\", i);\n if (lt === -1) break;\n const next = s[lt + 1];\n if (next === \"?\") {\n const end = s.indexOf(\"?>\", lt + 2);\n i = end === -1 ? s.length : end + 2;\n continue;\n }\n if (next === \"!\") {\n if (s.startsWith(\"!--\", lt + 2)) {\n const end = s.indexOf(\"-->\", lt + 5);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n if (s.startsWith(\"![CDATA[\", lt + 2)) {\n const end = s.indexOf(\"]]>\", lt + 9);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n const end = s.indexOf(\">\", lt + 2);\n i = end === -1 ? s.length : end + 1;\n continue;\n }\n if (next === \"/\") {\n // unexpected close before open; treat as not-a-root document\n break;\n }\n // Found a start tag; parse name until whitespace, '/', or '>'\n let j = lt + 1;\n while (\n j < s.length &&\n s[j] !== \" \" &&\n s[j] !== \"\\n\" &&\n s[j] !== \"\\r\" &&\n s[j] !== \"\\t\" &&\n s[j] !== \"/\" &&\n s[j] !== \">\"\n ) {\n j++;\n }\n rootStart = lt;\n rootName = s.slice(lt + 1, j);\n break;\n }\n\n if (rootStart === 0 && rootName) {\n const range = findFirstTopLevelRange(s, rootName);\n if (range) {\n // Compute full closing tag end index allowing whitespace before '>'\n let fullEnd = range.end + `</${rootName}>`.length;\n const closeHead = s.indexOf(`</${rootName}`, range.end);\n if (closeHead === range.end) {\n let p = closeHead + 2 + rootName.length;\n while (p < s.length && /\\s/.test(s[p])) p++;\n if (s[p] === \">\") fullEnd = p + 1;\n }\n\n if (fullEnd === s.length) {\n // Check if the schema expects this root tag\n const unwrapped = unwrapJsonSchema(schema);\n const schemaProps =\n unwrapped && typeof unwrapped === \"object\"\n ? ((unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined)\n : undefined;\n\n if (\n schemaProps &&\n !Object.prototype.hasOwnProperty.call(schemaProps, rootName)\n ) {\n actualXmlInner = s.slice(range.start, range.end);\n }\n }\n }\n }\n }\n\n // Identify string-typed properties for special handling\n const stringTypedProps = getStringTypedProperties(schema);\n\n // First, check for duplicates before doing any placeholder replacement\n const duplicateKeys = new Set<string>();\n for (const key of stringTypedProps) {\n const excludeRanges: Array<{ start: number; end: number }> = [];\n for (const other of stringTypedProps) {\n if (other === key) continue;\n const range = findFirstTopLevelRange(actualXmlInner, other);\n if (range) excludeRanges.push(range);\n }\n\n const occurrences = countTagOccurrences(\n actualXmlInner,\n key,\n excludeRanges,\n true\n );\n\n if (occurrences > 0 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${key}> detected`\n );\n }\n if (occurrences > 0 && !throwDup) {\n duplicateKeys.add(key);\n if (options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${key}> detected; using first occurrence.`,\n { tag: key, occurrences }\n );\n }\n }\n }\n\n // Replace inner content of string-typed tags with placeholders to avoid\n // XML parsing errors from constructs like <!DOCTYPE ...> within element bodies\n let xmlInnerForParsing = actualXmlInner;\n const originalContentMap = new Map<string, string>();\n try {\n const ranges: Array<{ start: number; end: number; key: string }> = [];\n\n for (const key of stringTypedProps) {\n // Find the range for placeholder replacement\n const r = findFirstTopLevelRange(actualXmlInner, key);\n if (r && r.end > r.start) ranges.push({ ...r, key });\n }\n\n if (ranges.length > 0) {\n // Keep only outermost ranges by removing any range fully contained within a previously kept range.\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n const filtered: Array<{ start: number; end: number; key: string }> = [];\n for (const r of sorted) {\n const last = filtered[filtered.length - 1];\n if (last && r.start >= last.start && r.end <= last.end) {\n // Nested inside the last kept range; skip this inner range\n continue;\n }\n filtered.push(r);\n }\n\n if (filtered.length > 0) {\n filtered.sort((a, b) => a.start - b.start);\n let rebuilt = \"\";\n let cursor = 0;\n for (const r of filtered) {\n if (cursor < r.start)\n rebuilt += actualXmlInner.slice(cursor, r.start);\n const placeholder = `__RXML_PLACEHOLDER_${r.key}__`;\n const originalContent = actualXmlInner.slice(r.start, r.end);\n originalContentMap.set(placeholder, originalContent);\n rebuilt += placeholder;\n cursor = r.end;\n }\n if (cursor < actualXmlInner.length)\n rebuilt += actualXmlInner.slice(cursor);\n xmlInnerForParsing = rebuilt;\n }\n }\n } catch (error) {\n // Non-fatal: fall back to original XML; allow caller to handle via onError\n if (options.onError) {\n options.onError(\n \"RXML: Failed to replace string placeholders, falling back to original XML.\",\n { error }\n );\n }\n xmlInnerForParsing = actualXmlInner;\n }\n\n // Parse XML using our TXML-based tokenizer\n let parsedNodes: (RXMLNode | string)[];\n try {\n const wrappedXml = `<root>${xmlInnerForParsing}</root>`;\n const tokenizer = new XMLTokenizer(wrappedXml, {\n ...options,\n textNodeName,\n });\n const rootNode = tokenizer.parseNode();\n\n // Extract content from root wrapper\n parsedNodes = rootNode.children;\n } catch (cause) {\n throw new RXMLParseError(\"Failed to parse XML\", cause);\n }\n\n // Convert DOM to flat object structure\n const parsedArgs = domToObject(parsedNodes, schema, textNodeName);\n const args: Record<string, unknown> = {};\n\n // Process each property with schema-aware handling\n for (const k of Object.keys(parsedArgs || {})) {\n const v = parsedArgs[k];\n let val: unknown = v;\n const propSchema = getPropertySchema(schema, k);\n const propType = getSchemaType(propSchema);\n\n // Handle duplicates when throwOnDuplicateStringTags is false\n if (propType === \"string\" && duplicateKeys.has(k) && Array.isArray(v)) {\n // For duplicates, use the first occurrence\n const firstValue = v[0];\n if (\n typeof firstValue === \"string\" &&\n firstValue.startsWith(\"__RXML_PLACEHOLDER_\")\n ) {\n // Restore from placeholder\n const originalContent = originalContentMap.get(firstValue);\n if (originalContent !== undefined) {\n args[k] = originalContent;\n continue;\n }\n } else {\n args[k] = firstValue;\n continue;\n }\n }\n\n if (propType === \"string\" && !Array.isArray(v)) {\n // First, check if this is a placeholder value and restore original content\n const placeholderUsed =\n (typeof v === \"string\" && v.startsWith(\"__RXML_PLACEHOLDER_\")) ||\n (v &&\n typeof v === \"object\" &&\n Object.prototype.hasOwnProperty.call(v, textNodeName) &&\n typeof (v as Record<string, unknown>)[textNodeName] === \"string\" &&\n ((v as Record<string, unknown>)[textNodeName] as string).startsWith(\n \"__RXML_PLACEHOLDER_\"\n ));\n\n if (placeholderUsed) {\n // Extract the original content from the placeholder map\n let placeholderKey: string;\n if (typeof v === \"string\") {\n placeholderKey = v;\n } else {\n placeholderKey = (v as Record<string, unknown>)[\n textNodeName\n ] as string;\n }\n\n // Find the original content from the ranges that were replaced\n const originalContent = originalContentMap.get(placeholderKey);\n\n if (originalContent !== undefined) {\n // originalContent is already the inner content from findFirstTopLevelRange\n args[k] = originalContent;\n continue;\n }\n }\n\n // Try to extract raw content (duplicates already handled earlier)\n const raw = extractRawInner(actualXmlInner, k);\n if (typeof raw === \"string\") {\n args[k] = raw;\n continue;\n }\n }\n\n // Extract text content from wrapped objects\n if (\n v &&\n typeof v === \"object\" &&\n Object.prototype.hasOwnProperty.call(v, textNodeName)\n ) {\n val = (v as Record<string, unknown>)[textNodeName];\n }\n\n // Handle array content\n if (Array.isArray(v)) {\n if (propType === \"string\") {\n const mapped = v.map(item => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, textNodeName)\n ) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal : String(textVal);\n }\n return typeof item === \"string\" ? item : String(item);\n });\n\n if (mapped.length > 1 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${k}> detected`\n );\n }\n if (mapped.length > 1 && !throwDup && options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${k}> detected; using first occurrence.`,\n { tag: k, occurrences: mapped.length }\n );\n }\n\n args[k] = mapped[0] ?? \"\";\n continue;\n } else {\n val = processArrayContent(v, propSchema, textNodeName);\n }\n } else if (\n v &&\n typeof v === \"object\" &&\n !Object.prototype.hasOwnProperty.call(v, textNodeName)\n ) {\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle <item> wrapper pattern\n if (keys.length === 1 && keys[0] === \"item\") {\n const itemValue = obj.item;\n if (Array.isArray(itemValue)) {\n val = itemValue.map(item => {\n let currentVal: unknown = item;\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, textNodeName)\n ) {\n currentVal = (item as Record<string, unknown>)[textNodeName];\n }\n const trimmed =\n typeof currentVal === \"string\" ? currentVal.trim() : currentVal;\n\n // Auto-convert numeric strings\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) return num;\n }\n return trimmed;\n });\n } else {\n const trimmed =\n typeof itemValue === \"string\" ? itemValue.trim() : itemValue;\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n val = Number.isFinite(num) ? num : trimmed;\n } else {\n val = trimmed;\n }\n }\n } else {\n // Check for indexed tuple pattern (numeric keys)\n let isIndexedTuple = false;\n if (keys.length > 0 && keys.every(key => /^\\d+$/.test(key))) {\n const indices = keys.map(k => parseInt(k, 10)).sort((a, b) => a - b);\n isIndexedTuple =\n indices[0] === 0 && indices.every((val, idx) => val === idx);\n }\n\n if (isIndexedTuple) {\n val = processIndexedTuple(obj, textNodeName);\n } else {\n val = v;\n }\n }\n }\n\n args[k] = typeof val === \"string\" ? val.trim() : val;\n }\n\n // Ensure missing string-typed properties are populated from original XML\n for (const key of stringTypedProps) {\n if (!Object.prototype.hasOwnProperty.call(args, key)) {\n const raw = extractRawInner(actualXmlInner, key);\n if (typeof raw === \"string\") {\n args[key] = raw;\n }\n }\n }\n\n // Auto-unwrap single root element if schema doesn't expect it (before coercion)\n let dataToCoerce = args;\n const keys = Object.keys(args);\n if (keys.length === 1) {\n const rootKey = keys[0];\n const rootValue = args[rootKey];\n\n // Check if schema expects the root key\n const unwrapped = unwrapJsonSchema(schema);\n if (unwrapped && typeof unwrapped === \"object\") {\n const schemaProps = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n if (\n schemaProps &&\n !Object.prototype.hasOwnProperty.call(schemaProps, rootKey)\n ) {\n // Schema doesn't expect the root key, so unwrap it before coercion\n dataToCoerce = rootValue as Record<string, unknown>;\n }\n }\n }\n\n // Apply schema-based coercion\n try {\n const coerced = coerceDomBySchema(dataToCoerce, schema);\n return coerced;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce by schema\", error);\n }\n}\n\n/**\n * Parse XML without schema (similar to TXML's parse function)\n */\nexport function parseWithoutSchema(\n xmlString: string,\n options: ParseOptions = {}\n): (RXMLNode | string)[] {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseChildren();\n } catch (error) {\n // Check if this is a specific type of error that should be re-thrown\n if (error instanceof RXMLParseError) {\n const isSimple = xmlString.split(\"<\").length < 6;\n\n // Re-throw errors for clearly invalid XML structures in simple cases\n // 1. Mismatched tags (like <item>content</wrong>)\n // 2. Unclosed tags at end of input (like <root><item>text)\n if (\n (error.message.includes(\"Unexpected close tag\") && isSimple) ||\n (error.message.includes(\"Unclosed tag\") && isSimple)\n ) {\n // Preserve the original error message and line/column information\n throw new RXMLParseError(\n error.message,\n error.cause,\n error.line,\n error.column\n );\n }\n }\n\n // For other types of malformed XML, try to be more tolerant and return partial results\n // This matches the expected behavior of being \"robust\" with malformed XML\n if (options.onError) {\n options.onError(\"Failed to parse XML without schema\", { error });\n }\n\n // Try to extract any valid XML elements that we can parse\n try {\n const partialResults: (RXMLNode | string)[] = [];\n\n // Look for complete XML elements in the string\n const xmlPattern = /<([a-zA-Z_][\\w.-]*)[^>]*>.*?<\\/\\1>/gs;\n let match;\n\n while ((match = xmlPattern.exec(xmlString)) !== null) {\n try {\n const elementXml = match[0];\n const tokenizer = new XMLTokenizer(elementXml, options);\n const parsed = tokenizer.parseChildren();\n partialResults.push(...parsed);\n } catch {\n // Skip this element if it can't be parsed\n continue;\n }\n }\n\n // If we found some valid elements, return them\n if (partialResults.length > 0) {\n return partialResults;\n }\n } catch {\n // Fallback failed too\n }\n\n // Last resort: return the input as text content\n return [xmlString.trim()];\n }\n}\n\n/**\n * Parse a single XML node\n */\nexport function parseNode(\n xmlString: string,\n options: ParseOptions = {}\n): RXMLNode {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseNode();\n } catch (error) {\n throw new RXMLParseError(\"Failed to parse XML node\", error);\n }\n}\n\n/**\n * Simplify parsed XML structure (similar to TXML's simplify)\n */\nexport function simplify(children: (RXMLNode | string)[]): unknown {\n if (!children.length) {\n return \"\";\n }\n\n if (children.length === 1 && typeof children[0] === \"string\") {\n return children[0];\n }\n\n const out: Record<string, unknown> = {};\n\n // Map each object\n children.forEach(child => {\n if (typeof child !== \"object\") {\n return;\n }\n\n if (!out[child.tagName]) {\n out[child.tagName] = [];\n }\n\n const kids = simplify(child.children);\n let nodeValue: unknown = kids;\n\n // Add attributes if present\n if (Object.keys(child.attributes).length) {\n if (typeof kids === \"string\") {\n nodeValue = kids;\n // For string content with attributes, we need to preserve both\n if (kids !== \"\") {\n nodeValue = { _attributes: child.attributes, value: kids };\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n } else if (typeof kids === \"object\" && kids !== null) {\n (kids as Record<string, unknown>)._attributes = child.attributes;\n nodeValue = kids;\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n }\n\n (out[child.tagName] as unknown[]).push(nodeValue);\n });\n\n // Flatten single-item arrays\n for (const key in out) {\n const value = out[key];\n if (Array.isArray(value) && value.length === 1) {\n out[key] = value[0];\n }\n }\n\n return out;\n}\n\n/**\n * Filter XML nodes (similar to TXML's filter)\n */\nexport function filter(\n children: (RXMLNode | string)[],\n filterFn: (\n node: RXMLNode,\n index: number,\n depth: number,\n path: string\n ) => boolean,\n depth = 0,\n path = \"\"\n): RXMLNode[] {\n const out: RXMLNode[] = [];\n\n children.forEach((child, i) => {\n if (typeof child === \"object\" && filterFn(child, i, depth, path)) {\n out.push(child);\n }\n if (typeof child === \"object\" && child.children) {\n const kids = filter(\n child.children,\n filterFn,\n depth + 1,\n (path ? path + \".\" : \"\") + i + \".\" + child.tagName\n );\n out.push(...kids);\n }\n });\n\n return out;\n}\n","/**\n * Streaming XML parser based on TXML's transformStream approach\n * Provides memory-efficient parsing for large XML documents\n */\n\nimport { Readable, Transform, type TransformCallback } from \"stream\";\n\nimport { RXMLStreamError } from \"../errors/types\";\nimport { XMLTokenizer } from \"./tokenizer\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\n\n/**\n * Transform stream for parsing XML\n */\nexport class XMLTransformStream extends Transform {\n private buffer = \"\";\n private position: number;\n private readonly parseOptions: ParseOptions;\n private emittedCount = 0;\n private sawTagChar = false;\n\n constructor(offset?: number | string, parseOptions: ParseOptions = {}) {\n super({ readableObjectMode: true });\n\n if (typeof offset === \"string\") {\n this.position = offset.length;\n } else {\n this.position = offset || 0;\n }\n\n this.parseOptions = {\n keepComments: false,\n keepWhitespace: false,\n ...parseOptions,\n };\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ): void {\n try {\n const incoming = chunk.toString();\n if (incoming.includes(\"<\")) this.sawTagChar = true;\n this.buffer += incoming;\n this.processBuffer();\n callback();\n } catch (error) {\n callback(new RXMLStreamError(\"Transform error\", error));\n }\n }\n\n _flush(callback: TransformCallback): void {\n try {\n // Process any remaining buffer content\n if (this.buffer.length > 0) {\n this.processBuffer(true);\n }\n // If we saw XML-like input but emitted nothing, surface a meaningful error\n if (this.sawTagChar && this.emittedCount === 0) {\n throw new RXMLStreamError(\n \"Flush error\",\n new Error(\"No XML elements could be parsed from stream\")\n );\n }\n callback();\n } catch (error) {\n callback(new RXMLStreamError(\"Flush error\", error));\n }\n }\n\n private processBuffer(isFlush = false): void {\n // Try to find and emit complete XML elements in the buffer\n while (this.buffer.length > 0) {\n // Find first '<'\n const openBracket = this.buffer.indexOf(\"<\");\n if (openBracket === -1) {\n // No tags at all\n if (isFlush) this.buffer = \"\";\n break;\n }\n\n // Trim leading non-XML text\n if (openBracket > 0) {\n this.buffer = this.buffer.slice(openBracket);\n }\n\n // Skip processing instructions, comments, CDATA\n if (\n this.buffer.startsWith(\"<?\") ||\n this.buffer.startsWith(\"<!--\") ||\n this.buffer.startsWith(\"<![CDATA[\")\n ) {\n const endMarkers: Record<string, string> = {\n \"<?\": \"?>\",\n \"<!--\": \"-->\",\n \"<![CDATA[\": \"]]>\",\n };\n let endMarker = \"\";\n for (const [start, end] of Object.entries(endMarkers)) {\n if (this.buffer.startsWith(start)) {\n endMarker = end;\n break;\n }\n }\n const endPos = endMarker ? this.buffer.indexOf(endMarker) : -1;\n if (endPos === -1) {\n if (!isFlush) break;\n // On flush, drop the incomplete special node\n this.buffer = \"\";\n break;\n }\n // Keep comment text as string node when requested\n if (this.parseOptions.keepComments && this.buffer.startsWith(\"<!--\")) {\n this.push(this.buffer.slice(0, endPos + endMarker.length));\n }\n this.buffer = this.buffer.slice(endPos + endMarker.length);\n continue;\n }\n\n // Skip stray closing tags\n if (this.buffer.startsWith(\"</\")) {\n const closeEnd = this.buffer.indexOf(\">\");\n if (closeEnd === -1) {\n if (!isFlush) break;\n this.buffer = \"\";\n break;\n }\n this.buffer = this.buffer.slice(closeEnd + 1);\n continue;\n }\n\n // Identify opening tag end and tag name (only proceed when we have the closing '>')\n const openTagEnd = this.buffer.indexOf(\">\");\n if (openTagEnd === -1) {\n if (!isFlush) break;\n // Incomplete open tag at flush; drop it\n this.buffer = \"\";\n break;\n }\n const openTagContent = this.buffer.slice(1, openTagEnd);\n const nameMatch = openTagContent.match(/^([a-zA-Z_][\\w.-]*)/);\n if (!nameMatch) {\n // Not a valid tag start, drop one char and continue\n this.buffer = this.buffer.slice(1);\n continue;\n }\n const tagName = nameMatch[1];\n\n // Handle self-closing immediately\n const isSelfClosing = this.buffer[openTagEnd - 1] === \"/\";\n if (isSelfClosing) {\n const elementEnd = openTagEnd + 1;\n const elementXml = this.buffer.slice(0, elementEnd);\n try {\n const tokenizer = new XMLTokenizer(elementXml, this.parseOptions);\n const node = tokenizer.parseNode();\n this.emitElementAndChildren(node);\n this.buffer = this.buffer.slice(elementEnd);\n continue;\n } catch {\n // Skip this malformed self-closing element\n this.buffer = this.buffer.slice(1);\n continue;\n }\n }\n\n // Find matching closing tag with depth handling\n const closingTag = `</${tagName}>`;\n let depth = 1;\n let searchStart = openTagEnd + 1;\n let elementEnd = -1;\n while (searchStart < this.buffer.length) {\n // Ensure the next opening match is an actual tag name boundary\n let nextOpen = this.buffer.indexOf(`<${tagName}`, searchStart);\n while (nextOpen !== -1) {\n const after = this.buffer[nextOpen + tagName.length + 1];\n if (after === undefined || after === \">\" || /\\s/.test(after)) break;\n nextOpen = this.buffer.indexOf(`<${tagName}`, nextOpen + 1);\n }\n\n // Find the next closing tag start (position of '<')\n const nextCloseStart = this.buffer.indexOf(`</${tagName}`, searchStart);\n if (nextCloseStart === -1) break;\n\n if (nextOpen !== -1 && nextOpen < nextCloseStart) {\n depth++;\n searchStart = nextOpen + 1;\n } else {\n depth--;\n // Advance past the actual closing tag allowing optional whitespace before '>'\n let p = nextCloseStart + 2 + tagName.length; // after </tagName\n while (p < this.buffer.length && /\\s/.test(this.buffer[p])) p++;\n if (this.buffer[p] !== \">\") break; // malformed/incomplete closing tag\n const closeAdvance = p + 1;\n searchStart = closeAdvance;\n if (depth === 0) {\n elementEnd = searchStart;\n break;\n }\n }\n }\n\n if (elementEnd === -1) {\n if (!isFlush) break;\n // At flush with incomplete element; drop leading '<' to prevent infinite loop\n this.buffer = this.buffer.slice(1);\n continue;\n }\n\n // We have a complete element; parse and emit\n const elementXml = this.buffer.slice(0, elementEnd);\n try {\n const tokenizer = new XMLTokenizer(elementXml, this.parseOptions);\n const node = tokenizer.parseNode();\n this.emitElementAndChildren(node);\n this.buffer = this.buffer.slice(elementEnd);\n } catch (e) {\n // Malformed complete element; surface as stream error\n this.emit(\"error\", new RXMLStreamError(\"Parse error\", e as Error));\n return;\n }\n }\n }\n\n /**\n * Emit an element and recursively emit its children as separate events\n */\n private emitElementAndChildren(node: RXMLNode | string): void {\n if (typeof node === \"string\") {\n // Emit comment nodes if requested\n if (this.parseOptions.keepComments && node.includes(\"<!--\")) {\n this.push(node);\n this.emittedCount++;\n }\n return;\n }\n\n // Emit the element itself\n this.push(node);\n this.emittedCount++;\n\n // Recursively emit children\n for (const child of node.children) {\n this.emitElementAndChildren(child);\n }\n }\n}\n\n/**\n * Create a transform stream for parsing XML\n */\nexport function createXMLStream(\n offset?: number | string,\n parseOptions?: ParseOptions\n): XMLTransformStream {\n return new XMLTransformStream(offset, parseOptions);\n}\n\n/**\n * Parse XML from a readable stream\n */\nexport async function parseFromStream(\n stream: Readable,\n offset?: number | string,\n parseOptions?: ParseOptions\n): Promise<(RXMLNode | string)[]> {\n return new Promise((resolve, reject) => {\n const results: (RXMLNode | string)[] = [];\n const transformStream = createXMLStream(offset, parseOptions);\n\n // Propagate source stream errors\n const onSourceError = (err: Error) => {\n transformStream.destroy(err);\n };\n stream.on(\"error\", onSourceError);\n\n transformStream.on(\"data\", (element: RXMLNode | string) => {\n results.push(element);\n });\n\n transformStream.on(\"end\", () => {\n stream.off(\"error\", onSourceError);\n resolve(results);\n });\n\n transformStream.on(\"error\", (error: Error) => {\n stream.off(\"error\", onSourceError);\n reject(new RXMLStreamError(\"Stream parsing failed\", error));\n });\n\n stream.pipe(transformStream);\n });\n}\n\n/**\n * Process XML stream with async iterator support\n */\nexport async function* processXMLStream(\n stream: Readable,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode | string, void, unknown> {\n const transformStream = createXMLStream(offset, parseOptions);\n\n let ended = false;\n let error: Error | null = null;\n const queue: (RXMLNode | string)[] = [];\n let resolveNext: ((value: IteratorResult<RXMLNode | string>) => void) | null =\n null;\n\n // Ensure source stream errors are propagated and terminate iteration\n const onSourceError = (err: Error) => {\n error = err;\n transformStream.destroy(err);\n };\n stream.on(\"error\", onSourceError);\n\n transformStream.on(\"data\", (element: RXMLNode | string) => {\n if (resolveNext) {\n resolveNext({ value: element, done: false });\n resolveNext = null;\n } else {\n queue.push(element);\n }\n });\n\n transformStream.on(\"end\", () => {\n ended = true;\n if (resolveNext) {\n resolveNext({ value: undefined, done: true });\n resolveNext = null;\n }\n stream.off(\"error\", onSourceError);\n });\n\n transformStream.on(\"error\", (err: Error) => {\n error = err;\n if (resolveNext) {\n resolveNext({ value: undefined, done: true });\n resolveNext = null;\n }\n stream.off(\"error\", onSourceError);\n });\n\n stream.pipe(transformStream);\n\n while (true) {\n if (error) {\n throw new RXMLStreamError(\"Stream processing error\", error);\n }\n\n if (queue.length > 0) {\n yield queue.shift()!;\n continue;\n }\n\n if (ended) {\n break;\n }\n\n // Wait for next element\n const result = await new Promise<IteratorResult<RXMLNode | string>>(\n resolve => {\n resolveNext = resolve;\n }\n );\n\n if (result.done) {\n if (error) {\n throw new RXMLStreamError(\"Stream processing error\", error);\n }\n break;\n }\n\n yield result.value;\n }\n}\n\n/**\n * Find elements by ID in streaming fashion\n */\nexport async function* findElementByIdStream(\n stream: Readable,\n id: string,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode, void, unknown> {\n for await (const element of processXMLStream(stream, offset, parseOptions)) {\n if (typeof element === \"object\" && element.attributes.id === id) {\n yield element;\n }\n }\n}\n\n/**\n * Find elements by class name in streaming fashion\n */\nexport async function* findElementsByClassStream(\n stream: Readable,\n className: string,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode, void, unknown> {\n const classRegex = new RegExp(`\\\\b${className}\\\\b`);\n\n for await (const element of processXMLStream(stream, offset, parseOptions)) {\n if (\n typeof element === \"object\" &&\n element.attributes.class &&\n classRegex.test(element.attributes.class)\n ) {\n yield element;\n }\n }\n}\n","/**\n * XML stringification based on TXML's stringify approach\n * Replaces the fast-xml-parser XMLBuilder with a native implementation\n */\n\nimport type { RXMLNode, StringifyOptions } from \"../core/types\";\nimport { RXMLStringifyError } from \"../errors/types\";\nimport {\n escapeXml,\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n} from \"../utils/helpers\";\n\n/**\n * Stringify an object to XML\n */\nexport function stringify(\n rootTag: string,\n obj: unknown,\n options: StringifyOptions = {}\n): string {\n try {\n const format = options.format ?? true;\n const minimalEscaping = options.minimalEscaping ?? false;\n const suppressEmptyNode = options.suppressEmptyNode ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n let result = \"\";\n\n if (format) {\n result += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n }\n\n result += stringifyValue(\n rootTag,\n obj,\n 0,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n\n return result;\n } catch (error) {\n throw new RXMLStringifyError(\"Failed to stringify XML\", error);\n }\n}\n\n/**\n * Stringify a value to XML format\n */\nfunction stringifyValue(\n tagName: string,\n value: unknown,\n depth: number,\n format: boolean,\n suppressEmptyNode: boolean,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n\n if (value === null || value === undefined) {\n if (suppressEmptyNode) return \"\";\n return `${indent}<${tagName}/>${newline}`;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n const content = minimalEscaping\n ? escapeXmlMinimalText(String(value))\n : escapeXml(String(value));\n if (content === \"\" && suppressEmptyNode) return \"\";\n return `${indent}<${tagName}>${content}</${tagName}>${newline}`;\n }\n\n if (Array.isArray(value)) {\n let result = \"\";\n for (const item of value) {\n result += stringifyValue(\n tagName,\n item,\n depth,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n return result;\n }\n\n if (typeof value === \"object\") {\n return stringifyObject(\n tagName,\n value as Record<string, unknown>,\n depth,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n\n // Fallback for other types\n const content = minimalEscaping\n ? escapeXmlMinimalText(String(value))\n : escapeXml(String(value));\n if (content === \"\" && suppressEmptyNode) return \"\";\n return `${indent}<${tagName}>${content}</${tagName}>${newline}`;\n}\n\n/**\n * Stringify an object to XML\n */\nfunction stringifyObject(\n tagName: string,\n obj: Record<string, unknown>,\n depth: number,\n format: boolean,\n suppressEmptyNode: boolean,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const childIndent = format ? \" \".repeat(depth + 1) : \"\";\n\n // Extract attributes (properties starting with @)\n const attributes: Record<string, unknown> = {};\n const elements: Record<string, unknown> = {};\n let textContent: string | undefined;\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(\"@\")) {\n attributes[key.substring(1)] = value;\n } else if (key === \"#text\" || key === \"_text\") {\n textContent = String(value);\n } else if (key === \"_attributes\") {\n if (typeof value === \"object\" && value !== null) {\n Object.assign(attributes, value as Record<string, unknown>);\n }\n } else {\n elements[key] = value;\n }\n }\n\n // Build opening tag with attributes\n let openTag = `<${tagName}`;\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (attrValue === null) {\n if (strictBooleanAttributes) {\n openTag += ` ${attrName}=\"${attrName}\"`;\n } else {\n openTag += ` ${attrName}`;\n }\n } else {\n const valueStr = String(attrValue);\n // Attribute quoting strategy per XML 1.0:\n // - 3.1 (AttValue [10]): attribute values MUST be quoted with ' or \".\n // If the same quote appears in the value, it MUST be escaped (via\n // predefined entities per 4.6). We choose the quote that minimizes\n // escaping: prefer \" unless value contains \", otherwise use '.\n // See: https://www.w3.org/TR/2008/REC-xml-20081126/\n if (valueStr.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, '\"')\n : escapeXml(valueStr);\n openTag += ` ${attrName}=\"${escaped}\"`;\n } else {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, \"'\")\n : escapeXml(valueStr);\n openTag += ` ${attrName}='${escaped}'`;\n }\n }\n }\n\n // Check if we have any content\n const hasElements = Object.keys(elements).length > 0;\n const hasTextContent = textContent !== undefined && textContent !== \"\";\n\n if (!hasElements && !hasTextContent) {\n if (suppressEmptyNode) return \"\";\n return `${indent}${openTag}/>${newline}`;\n }\n\n openTag += \">\";\n\n // Handle text-only content\n if (!hasElements && hasTextContent && textContent) {\n // 2.4 Character Data and Markup: '<' and '&' MUST be escaped in content.\n // Minimal vs conservative controlled by option.\n const content = minimalEscaping\n ? escapeXmlMinimalText(textContent)\n : escapeXml(textContent);\n return `${indent}${openTag}${content}</${tagName}>${newline}`;\n }\n\n // Handle complex content\n let result = `${indent}${openTag}`;\n\n if (hasTextContent && textContent) {\n // See spec notes above (2.4, 4.6) for escaping rationale.\n const content = minimalEscaping\n ? escapeXmlMinimalText(textContent)\n : escapeXml(textContent);\n if (format) result += `${newline}${childIndent}${content}`;\n else result += content;\n }\n\n if (hasElements) {\n if (format) result += newline;\n\n for (const [elementName, elementValue] of Object.entries(elements)) {\n result += stringifyValue(\n elementName,\n elementValue,\n depth + 1,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n\n if (format) result += indent;\n }\n\n result += `</${tagName}>${newline}`;\n\n return result;\n}\n\n/**\n * Stringify parsed XML nodes back to XML string\n */\nexport function stringifyNodes(\n nodes: (RXMLNode | string)[],\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += node;\n } else {\n result += stringifyNode(node, 0, format, options);\n }\n }\n\n return result;\n}\n\n/**\n * Stringify a single XML node\n */\nexport function stringifyNode(\n node: RXMLNode,\n depth = 0,\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const minimalEscaping = options.minimalEscaping ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n let result = `${indent}<${node.tagName}`;\n\n // Add attributes\n for (const [attrName, attrValue] of Object.entries(node.attributes)) {\n if (attrValue === null) {\n if (strictBooleanAttributes) {\n result += ` ${attrName}=\"${attrName}\"`;\n } else {\n result += ` ${attrName}`;\n }\n } else if (attrValue.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, '\"')\n : escapeXml(attrValue);\n result += ` ${attrName}=\"${escaped}\"`;\n } else {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, \"'\")\n : escapeXml(attrValue);\n result += ` ${attrName}='${escaped}'`;\n }\n }\n\n // Handle processing instructions\n if (node.tagName[0] === \"?\") {\n result += \"?>\";\n return result + newline;\n }\n\n // Handle self-closing tags\n if (node.children.length === 0) {\n result += \"/>\";\n return result + newline;\n }\n\n result += \">\";\n\n // Handle children\n let hasElementChildren = false;\n for (const child of node.children) {\n if (typeof child === \"string\") {\n result += minimalEscaping\n ? escapeXmlMinimalText(child)\n : escapeXml(child);\n } else {\n if (!hasElementChildren && format) {\n result += newline;\n hasElementChildren = true;\n }\n result += stringifyNode(child, depth + 1, format, options);\n }\n }\n\n if (hasElementChildren && format) {\n result += indent;\n }\n\n result += `</${node.tagName}>`;\n\n if (format) {\n result += newline;\n }\n\n return result;\n}\n\n/**\n * Convert content to a string representation (similar to TXML's toContentString)\n */\nexport function toContentString(nodes: (RXMLNode | string)[]): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += \" \" + node;\n } else {\n result += \" \" + toContentString(node.children);\n }\n result = result.trim();\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACO,OACA,MACA,QACP;AACA,UAAM,OAAO;AAJN;AACA;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,8BAAN,cAA0C,MAAM;AAAA,EACrD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YACE,SACO,OACP;AACA,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YACE,SACO,OACP;AACA,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,SACO,OACP;AACA,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EACd;AACF;;;ACnDO,SAAS,iBAAiB,QAA0B;AACzD,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,IAAI;AACV,MAAI,EAAE,cAAc,OAAO,EAAE,eAAe,UAAU;AACpD,WAAO,iBAAiB,EAAE,UAAU;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,cAAc,QAAqC;AACjE,QAAM,YAAY,iBAAiB,MAAM;AACzC,MAAI,CAAC,aAAa,OAAO,cAAc,SAAU,QAAO;AACxD,QAAM,IAAc,UAAsC;AAC1D,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,KAAK,UAAW,KAAI,EAAE,SAAS,CAAC,EAAG,QAAO;AAAA,EACvD;AACA,QAAM,IAAI;AACV,MAAI,KAAK,OAAO,MAAM,aAAa,EAAE,cAAc,EAAE,uBAAuB;AAC1E,WAAO;AAAA,EACT;AACA,MACE,KACA,OAAO,MAAM,aACZ,EAAE,SAAU,EAA8B,cAC3C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAAgB,QAA2B;AACxE,QAAM,YAAY,iBAAiB,MAAM;AACzC,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,MAAM,KAAK;AACrB,YAAM,QAAQ,EAAE,YAAY;AAC5B,UAAI,UAAU,OAAQ,QAAO;AAC7B,UAAI,UAAU,QAAS,QAAO;AAC9B,UAAI,qCAAqC,KAAK,CAAC,GAAG;AAChD,cAAM,MAAM,OAAO,CAAC;AACpB,YAAI,OAAO,SAAS,GAAG,EAAG,QAAO;AAAA,MACnC;AAGA,UACG,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,KACnC,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GACpC;AACA,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,CAAC;AAE3B,iBAAO,eAAe,QAAQ,MAAS;AAAA,QACzC,SAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,cAAc,SAAS;AAE1C,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,KAAK;AACrB,QAAI,eAAe,UAAU;AAC3B,UAAI;AAEF,YAAI,aAAa,EAAE,QAAQ,MAAM,GAAG;AAEpC,qBAAa,WAAW,QAAQ,cAAc,IAAI;AAElD,cAAM,MAAM,KAAK,MAAM,UAAU;AACjC,YAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACzD,gBAAM,QAAS,UAAsC;AAGrD,gBAAM,MAA+B,CAAC;AACtC,qBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACnE,kBAAM,aAAa,QAAS,MAAM,CAAC,IAAgB;AACnD,gBAAI,CAAC,IACH,OAAO,eAAe,YAClB,IACA,eAAe,GAAG,UAAU;AAAA,UACpC;AACA,iBAAO;AAAA,QACT;AAAA,MACF,SAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI,eAAe,SAAS;AAC1B,UAAI;AACF,cAAM,aAAa,EAAE,QAAQ,MAAM,GAAG;AACtC,cAAM,MAAM,KAAK,MAAM,UAAU;AACjC,YAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,gBAAM,IAAI;AACV,gBAAM,cAAc,MAAM;AAAA,YACvB,EAA8B;AAAA,UACjC,IACM,EAA8B,cAChC;AACJ,gBAAM,cAAc,EAAE;AACtB,cAAI,eAAe,IAAI,WAAW,YAAY,QAAQ;AACpD,mBAAO,IAAI,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,UAC5D;AACA,iBAAO,IAAI,IAAI,OAAK,eAAe,GAAG,WAAW,CAAC;AAAA,QACpD;AAAA,MACF,SAAQ;AACN,cAAM,MAAM,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,MAAM,MAAM;AAC9D,cAAM,UAAU,IAAI,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAC/D,cAAM,IAAI;AACV,cAAM,cAAc,MAAM;AAAA,UACvB,EAA8B;AAAA,QACjC,IACM,EAA8B,cAChC;AACJ,cAAM,cAAc,EAAE;AACtB,YAAI,eAAe,QAAQ,WAAW,YAAY,QAAQ;AACxD,iBAAO,QAAQ,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,QAChE;AACA,eAAO,QAAQ,IAAI,OAAK,eAAe,GAAG,WAAW,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEA,MACE,eAAe,YACf,SACA,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,GACpB;AACA,UAAM,MAA+B,CAAC;AACtC,UAAM,QAAS,UAAsC;AAGrD,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAgC,GAAG;AACrE,YAAM,aAAa,QAAS,MAAM,CAAC,IAAgB;AACnD,UAAI,CAAC,IACH,OAAO,eAAe,YAAY,IAAI,eAAe,GAAG,UAAU;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,SAAS;AAC1B,UAAM,IAAI;AACV,UAAM,cAAc,EAAE;AACtB,UAAM,cAAc,MAAM;AAAA,MACvB,EAA8B;AAAA,IACjC,IACM,EAA8B,cAChC;AAEJ,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAI,eAAe,MAAM,WAAW,YAAY,QAAQ;AACtD,eAAO,MAAM,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,MAC9D;AACA,aAAO,MAAM,IAAI,OAAK,eAAe,GAAG,WAAW,CAAC;AAAA,IACtD;AAEA,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,QAAQ;AACd,UAAI,OAAO,UAAU,eAAe,KAAK,OAAO,MAAM,GAAG;AACvD,cAAM,QAAS,MAAkC;AACjD,cAAM,MAAM,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACjD,YAAI,eAAe,IAAI,WAAW,YAAY,QAAQ;AACpD,iBAAO,IAAI,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,QAC5D;AACA,eAAO,IAAI,IAAI,OAAK,eAAe,GAAG,WAAW,CAAC;AAAA,MACpD;AAKA,YAAM,OAAO,OAAO,KAAK,KAAK;AAG9B,UAAI,KAAK,WAAW,GAAG;AACrB,cAAM,YAAY,KAAK,CAAC;AACxB,cAAM,cAAc,MAAM,SAAS;AACnC,YAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,gBAAM,eAAe,YAAY;AAAA,YAAI,OACnC,eAAe,GAAG,WAAW;AAAA,UAC/B;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,KAAK,KAAK,MAAM,OAAK,QAAQ,KAAK,CAAC,CAAC,GAAG;AACvD,cAAM,MAAM,KACT,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,EACpC,IAAI,OAAM,MAAkC,CAAC,CAAC;AACjD,YAAI,eAAe,IAAI,WAAW,YAAY,QAAQ;AACpD,iBAAO,IAAI,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,QAC5D;AACA,eAAO,IAAI,IAAI,OAAK,eAAe,GAAG,WAAW,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,QACE,SAAS,QACT,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,UAAI,eAAe,YAAY,SAAS,GAAG;AACzC,eAAO,CAAC,eAAe,OAAO,YAAY,CAAC,CAAC,CAAC;AAAA,MAC/C;AACA,aAAO,CAAC,eAAe,OAAO,WAAW,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,KAAK;AACrB,QAAI,eAAe,WAAW;AAC5B,YAAM,QAAQ,EAAE,YAAY;AAC5B,UAAI,UAAU,OAAQ,QAAO;AAC7B,UAAI,UAAU,QAAS,QAAO;AAAA,IAChC;AACA,QAAI,eAAe,YAAY,eAAe,WAAW;AACvD,UAAI,qCAAqC,KAAK,CAAC,GAAG;AAChD,cAAM,MAAM,OAAO,CAAC;AACpB,YAAI,OAAO,SAAS,GAAG,EAAG,QAAO;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC9NO,SAAS,kBAAkB,YAAqB,KAAsB;AAC3E,QAAM,YAAY,iBAAiB,UAAU;AAC7C,MAAI,CAAC,aAAa,OAAO,cAAc,SAAU,QAAO;AACxD,QAAM,IAAI;AACV,QAAM,QAAQ,EAAE;AAChB,MAAI,SAAS,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAAG;AAC7D,WAAQ,MAAkC,GAAG;AAAA,EAC/C;AACA,SAAO;AACT;AAKO,SAAS,YACd,OACA,QACA,eAAe,SACU;AACzB,QAAM,SAAkC,CAAC;AAEzC,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,UAAU;AAE5B;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,UAAU,WAAW,IAAI;AAG1C,QAAI;AAEJ,QAAI,SAAS,WAAW,GAAG;AAEzB,cAAQ;AAAA,IACV,WAAW,SAAS,WAAW,KAAK,OAAO,SAAS,CAAC,MAAM,UAAU;AAEnE,cAAQ,SAAS,CAAC;AAAA,IACpB,OAAO;AAEL,cAAQ;AAAA,QACN;AAAA,QACA,kBAAkB,QAAQ,OAAO;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,UAAI,OAAO,UAAU,UAAU;AAE7B,cAAMA,UAAkC,EAAE,CAAC,YAAY,GAAG,MAAM;AAChE,mBAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,UAAAA,QAAO,KAAK,QAAQ,EAAE,IAAI;AAAA,QAC5B;AACA,gBAAQA;AAAA,MACV,WAAW,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAEtE,mBAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,UAAC,MAAkC,KAAK,QAAQ,EAAE,IAAI;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,GAAG;AACnB,UAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,CAAC,GAAG;AACnC,eAAO,OAAO,IAAI,CAAC,OAAO,OAAO,CAAC;AAAA,MACpC;AACA,MAAC,OAAO,OAAO,EAAgB,KAAK,KAAK;AAAA,IAC3C,OAAO;AACL,aAAO,OAAO,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,sBACP,UACA,QACA,cACS;AACT,QAAM,cAAwB,CAAC;AAC/B,QAAM,WAAoC,CAAC;AAE3C,aAAW,SAAS,UAAU;AAC5B,QAAI,OAAO,UAAU,UAAU;AAC7B,kBAAY,KAAK,KAAK;AAAA,IACxB,OAAO;AAEL,UAAI;AAEJ,UAAI,MAAM,SAAS,WAAW,GAAG;AAE/B,qBAAa;AAAA,MACf,WACE,MAAM,SAAS,WAAW,KAC1B,OAAO,MAAM,SAAS,CAAC,MAAM,UAC7B;AAEA,qBAAa,MAAM,SAAS,CAAC;AAAA,MAC/B,OAAO;AAEL,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,kBAAkB,QAAQ,MAAM,OAAO;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,KAAK,MAAM,UAAU,EAAE,SAAS,GAAG;AAC5C,YAAI,OAAO,eAAe,UAAU;AAElC,gBAAM,SAAkC;AAAA,YACtC,CAAC,YAAY,GAAG;AAAA,UAClB;AACA,qBAAW,CAAC,UAAU,SAAS,KAAK,OAAO;AAAA,YACzC,MAAM;AAAA,UACR,GAAG;AACD,mBAAO,KAAK,QAAQ,EAAE,IAAI;AAAA,UAC5B;AACA,uBAAa;AAAA,QACf,WACE,cACA,OAAO,eAAe,YACtB,CAAC,MAAM,QAAQ,UAAU,GACzB;AAEA,qBAAW,CAAC,UAAU,SAAS,KAAK,OAAO;AAAA,YACzC,MAAM;AAAA,UACR,GAAG;AACD,YAAC,WAAuC,KAAK,QAAQ,EAAE,IACrD;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,MAAM,OAAO,GAAG;AAC3B,YAAI,CAAC,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC,GAAG;AAC3C,mBAAS,MAAM,OAAO,IAAI,CAAC,SAAS,MAAM,OAAO,CAAC;AAAA,QACpD;AACA,QAAC,SAAS,MAAM,OAAO,EAAgB,KAAK,UAAU;AAAA,MACxD,OAAO;AACL,iBAAS,MAAM,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY,SAAS,KAAK,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAC9D,WAAO;AAAA,MACL,CAAC,YAAY,GAAG,YAAY,KAAK,EAAE,EAAE,KAAK;AAAA,MAC1C,GAAG;AAAA,IACL;AAAA,EACF;AAGA,MAAI,YAAY,SAAS,KAAK,OAAO,KAAK,QAAQ,EAAE,WAAW,GAAG;AAChE,WAAO,YAAY,KAAK,EAAE,EAAE,KAAK;AAAA,EACnC;AAGA,MAAI,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AACpC,WAAO;AAAA,EACT;AAGA,SAAO;AACT;AAKO,SAAS,kBACd,WACA,QACyB;AACzB,MAAI;AACF,WAAO,eAAmB,WAAW,MAAM;AAAA,EAC7C,SAAS,OAAO;AACd,UAAM,IAAI,kBAAkB,yCAAyC,KAAK;AAAA,EAC5E;AACF;AAKO,SAAS,yBAAyB,QAA8B;AACrE,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,YAAY,iBAAiB,MAAM;AAEzC,MAAI,aAAa,OAAO,cAAc,UAAU;AAC9C,UAAM,IAAI;AACV,UAAM,QAAQ,EAAE;AAEhB,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,iBAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,cAAM,aAAc,MAAkC,GAAG;AACzD,cAAM,WAAW,cAAc,UAAU;AACzC,YAAI,aAAa,UAAU;AACzB,cAAI,IAAI,GAAG;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,oBACd,OACA,QACA,cACS;AACT,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAElC,QAAM,aAAa,cAAc,MAAM;AAEvC,MAAI,eAAe,UAAU;AAE3B,WAAO,MAAM,IAAI,UAAQ;AACvB,UAAI,OAAO,SAAS,SAAU,QAAO,KAAK,KAAK;AAC/C,UAAI,QAAQ,OAAO,SAAS,YAAY,gBAAgB,MAAM;AAC5D,cAAM,UAAW,KAAiC,YAAY;AAC9D,eAAO,OAAO,YAAY,WAAW,QAAQ,KAAK,IAAI,OAAO,OAAO;AAAA,MACtE;AACA,aAAO,OAAO,IAAI;AAAA,IACpB,CAAC;AAAA,EACH;AAGA,SAAO,MAAM,IAAI,UAAQ;AACvB,QAAI,OAAO,SAAS,SAAU,QAAO,KAAK,KAAK;AAC/C,QAAI,QAAQ,OAAO,SAAS,YAAY,gBAAgB,MAAM;AAC5D,YAAM,UAAW,KAAiC,YAAY;AAC9D,aAAO,OAAO,YAAY,WAAW,QAAQ,KAAK,IAAI;AAAA,IACxD;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAKO,SAAS,oBACd,KACA,cACW;AACX,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,QAAM,UAAU,KAAK,IAAI,OAAK,SAAS,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACnE,QAAM,eACJ,QAAQ,CAAC,MAAM,KAAK,QAAQ,MAAM,CAAC,KAAK,QAAQ,QAAQ,GAAG;AAE7D,MAAI,CAAC,aAAc,QAAO,CAAC,GAAG;AAE9B,QAAM,aAAa,KAAK,KAAK,CAAC,GAAG,MAAM,SAAS,GAAG,EAAE,IAAI,SAAS,GAAG,EAAE,CAAC;AACxE,SAAO,WAAW,IAAI,SAAO;AAC3B,UAAM,OAAO,IAAI,GAAG;AACpB,QAAI,QAAQ,OAAO,SAAS,YAAY,gBAAgB,MAAM;AAC5D,YAAM,UAAW,KAAiC,YAAY;AAC9D,aAAO,OAAO,YAAY,WAAW,QAAQ,KAAK,IAAI;AAAA,IACxD;AACA,WAAO,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI;AAAA,EAClD,CAAC;AACH;;;ACvMO,IAAM,YAAY;AAAA,EACvB,cAAc,IAAI,WAAW,CAAC;AAAA,EAC9B,eAAe,IAAI,WAAW,CAAC;AAAA,EAC/B,OAAO,IAAI,WAAW,CAAC;AAAA,EACvB,OAAO,IAAI,WAAW,CAAC;AAAA,EACvB,aAAa,IAAI,WAAW,CAAC;AAAA,EAC7B,UAAU,IAAI,WAAW,CAAC;AAAA,EAC1B,cAAc,IAAI,WAAW,CAAC;AAAA,EAC9B,cAAc,IAAI,WAAW,CAAC;AAAA,EAC9B,qBAAqB,IAAI,WAAW,CAAC;AAAA,EACrC,sBAAsB,IAAI,WAAW,CAAC;AAAA,EACtC,OAAO,IAAI,WAAW,CAAC;AAAA,EACvB,KAAK,IAAK,WAAW,CAAC;AAAA,EACtB,SAAS,KAAK,WAAW,CAAC;AAAA,EAC1B,iBAAiB,KAAK,WAAW,CAAC;AACpC;AAKO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,cAAc;;;ACxHpB,SAAS,gBAAgB,IAAqB;AACnD,SAAO,aAAa,KAAK,EAAE;AAC7B;AAKO,SAAS,WAAW,IAAqB;AAC9C,SAAO,kBAAkB,KAAK,EAAE;AAClC;AAiBO,SAAS,WAAW,GAAW,GAAmB;AACvD,QAAM,QAAQ,EAAE,CAAC;AACjB;AACA,SAAO,IAAI,EAAE,QAAQ;AACnB,UAAM,KAAK,EAAE,CAAC;AACd,QAAI,OAAO,MAAM;AACf,WAAK;AACL;AAAA,IACF;AACA,QAAI,OAAO,MAAO,QAAO,IAAI;AAC7B;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,UACd,GACA,KACkC;AAClC,QAAM,QAAQ;AACd,SAAO,YAAY,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,EAAE,GAAG,GAAG;AACnD;AAAA,EACF;AACA,SAAO,EAAE,MAAM,EAAE,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI;AAClD;AAKO,SAAS,YACd,GACA,KACmC;AACnC,QAAM,YAAY,EAAE,GAAG;AACvB,QAAM,WAAW,MAAM;AACvB,QAAM,SAAS,EAAE,QAAQ,WAAW,QAAQ;AAC5C,MAAI,WAAW,IAAI;AAEjB,UAAM,SAAS,EAAE,QAAQ,KAAK,QAAQ;AACtC,QAAI,WAAW,IAAI;AACjB,aAAO,EAAE,OAAO,EAAE,MAAM,UAAU,MAAM,GAAG,QAAQ,OAAO;AAAA,IAC5D;AAEA,WAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO;AAAA,EACtD;AACA,SAAO,EAAE,OAAO,EAAE,MAAM,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE;AAChE;AA+BO,SAAS,cACd,GACA,KACkC;AAClC,MAAI,OAAO;AACX,MAAI,SAAS;AAEb,WAAS,IAAI,GAAG,IAAI,OAAO,IAAI,EAAE,QAAQ,KAAK;AAC5C,QAAI,EAAE,CAAC,MAAM,MAAM;AACjB;AACA,eAAS;AAAA,IACX,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;AAgBO,SAAS,UAAU,MAAsB;AAC9C,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAOO,SAAS,qBAAqB,MAAsB;AACzD,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,QAAQ,QAAQ;AAC7B;AAOO,SAAS,qBACd,OACA,UAAqB,KACb;AACR,MAAI,UAAU,MAAM,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM;AAC/D,MAAI,YAAY,KAAK;AACnB,cAAU,QAAQ,QAAQ,MAAM,QAAQ;AAAA,EAC1C,OAAO;AACL,cAAU,QAAQ,QAAQ,MAAM,QAAQ;AAAA,EAC1C;AACA,SAAO;AACT;;;ACxKO,SAAS,gBACd,YACA,SACoB;AACpB,QAAM,MAAM,WAAW;AACvB,QAAM,SAAS;AACf,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI,YAAY,OAAO;AAEvB,MAAI,IAAI;AACR,MAAI,QAAQ;AAEZ,SAAO,IAAI,KAAK;AACd,UAAM,KAAK,WAAW,QAAQ,KAAK,CAAC;AACpC,QAAI,OAAO,GAAI,QAAO;AACtB,QAAI,KAAK;AACT,QAAI,KAAK,IAAK,QAAO;AAErB,UAAM,KAAK,WAAW,CAAC;AACvB,QAAI,OAAO,KAAK;AACd,UAAI,WAAW,WAAW,OAAO,IAAI,CAAC,GAAG;AACvC,cAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AAC7C,YAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,MACF;AACA,UAAI,WAAW,WAAW,YAAY,IAAI,CAAC,GAAG;AAC5C,cAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AAC7C,YAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,MACF;AACA,YAAM,KAAK,WAAW,QAAQ,KAAK,IAAI,CAAC;AACxC,UAAI,OAAO,KAAK,MAAM,KAAK;AAC3B;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,YAAM,QAAQ,WAAW,QAAQ,MAAM,IAAI,CAAC;AAC5C,UAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,YAAM,KAAK,WAAW,QAAQ,KAAK,IAAI,CAAC;AACxC,UAAI,OAAO,KAAK,MAAM,KAAK;AAC3B,cAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC7B;AAAA,IACF,OAAO;AACL,UAAI,IAAI;AACR,UAAI,IAAI,OAAO,gBAAgB,WAAW,CAAC,CAAC,GAAG;AAC7C;AACA,eAAO,IAAI,OAAO,WAAW,WAAW,CAAC,CAAC,EAAG;AAAA,MAC/C;AACA,YAAM,OAAO,WAAW,MAAM,GAAG,CAAC;AAClC,UAAI,IAAI;AACR,UAAI,gBAAgB;AAEpB,aAAO,IAAI,KAAK;AACd,cAAM,IAAI,WAAW,CAAC;AACtB,YAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,cAAI,WAAW,YAAY,CAAC;AAC5B;AAAA,QACF;AACA,YAAI,MAAM,IAAK;AACf,YAAI,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC1C,0BAAgB;AAChB;AACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,SAAS;AACf,UAAI,SAAS,QAAQ;AACnB,cAAM,eACJ,WAAW,MAAM,MAAM,MAAM,SAAS,IAAI,SAAS;AAErD,YAAI,eAAe;AACjB,cAAI,QAAQ,WAAW;AACrB,wBAAY;AACZ,sBAAU;AACV,wBAAY;AAAA,UACd;AAAA,QACF,OAAO;AACL,cAAI,MAAM;AACV,cAAI,YAAY;AAEhB,iBAAO,MAAM,KAAK;AAChB,kBAAM,SAAS,WAAW,QAAQ,KAAK,GAAG;AAC1C,gBAAI,WAAW,GAAI;AACnB,kBAAM,KAAK,SAAS;AACpB,gBAAI,MAAM,IAAK;AAEf,kBAAM,IAAI,WAAW,EAAE;AACvB,gBAAI,MAAM,KAAK;AACb,kBAAI,WAAW,WAAW,OAAO,KAAK,CAAC,GAAG;AACxC,sBAAM,QAAQ,WAAW,QAAQ,OAAO,KAAK,CAAC;AAC9C,sBAAM,UAAU,KAAK,MAAM,QAAQ;AACnC;AAAA,cACF;AACA,kBAAI,WAAW,WAAW,YAAY,KAAK,CAAC,GAAG;AAC7C,sBAAM,QAAQ,WAAW,QAAQ,OAAO,KAAK,CAAC;AAC9C,sBAAM,UAAU,KAAK,MAAM,QAAQ;AACnC;AAAA,cACF;AACA,oBAAM,MAAM,WAAW,QAAQ,KAAK,KAAK,CAAC;AAC1C,oBAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B;AAAA,YACF,WAAW,MAAM,KAAK;AACpB,oBAAM,QAAQ,WAAW,QAAQ,MAAM,KAAK,CAAC;AAC7C,oBAAM,UAAU,KAAK,MAAM,QAAQ;AACnC;AAAA,YACF,WAAW,MAAM,KAAK;AACpB,kBAAI,IAAI,KAAK;AACb,kBAAI,IAAI,OAAO,gBAAgB,WAAW,CAAC,CAAC,GAAG;AAC7C;AACA,uBAAO,IAAI,OAAO,WAAW,WAAW,CAAC,CAAC,EAAG;AAAA,cAC/C;AACA,oBAAM,UAAU,WAAW,MAAM,KAAK,GAAG,CAAC;AAC1C,oBAAM,MAAM,WAAW,QAAQ,KAAK,CAAC;AACrC,kBAAI,YAAY,QAAQ;AACtB;AACA,oBAAI,cAAc,GAAG;AACnB,sBAAI,QAAQ,WAAW;AACrB,gCAAY;AACZ,8BAAU;AACV,gCAAY;AAAA,kBACd;AACA;AAAA,gBACF;AAAA,cACF;AACA,oBAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B;AAAA,YACF,OAAO;AACL,kBAAI,IAAI;AACR,kBAAI,IAAI,OAAO,gBAAgB,WAAW,CAAC,CAAC,GAAG;AAC7C;AACA,uBAAO,IAAI,OAAO,WAAW,WAAW,CAAC,CAAC,EAAG;AAAA,cAC/C;AACA,kBAAI,IAAI;AACR,kBAAI,sBAAsB;AAC1B,qBAAO,IAAI,KAAK;AACd,sBAAM,KAAK,WAAW,CAAC;AACvB,oBAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,sBAAI,WAAW,YAAY,CAAC;AAC5B;AAAA,gBACF;AACA,oBAAI,OAAO,IAAK;AAChB,oBAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,wCAAsB;AACtB;AACA;AAAA,gBACF;AACA;AAAA,cACF;AACA,oBAAM,YAAY,WAAW,MAAM,IAAI,CAAC;AACxC,kBAAI,cAAc,UAAU,CAAC,qBAAqB;AAChD;AAAA,cACF;AACA,oBAAM,WAAW,CAAC,MAAM,MAAM,IAAI,IAAI,IAAI;AAC1C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAW,MAAM,MAAM,MAAM,SAAS,IAAI,SAAS;AACvD,eAAS,gBAAgB,IAAI;AAC7B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,IAAI;AACpB,WAAO,WAAW,MAAM,WAAW,OAAO;AAAA,EAC5C;AACA,SAAO;AACT;AAKO,SAAS,uBACd,YACA,SAC4C;AAC5C,QAAM,MAAM,WAAW;AACvB,QAAM,SAAS;AAEf,MAAI,IAAI;AACR,MAAI,QAAQ;AAEZ,SAAO,IAAI,KAAK;AACd,UAAM,KAAK,WAAW,QAAQ,KAAK,CAAC;AACpC,QAAI,OAAO,GAAI,QAAO;AACtB,QAAI,KAAK;AACT,QAAI,KAAK,IAAK,QAAO;AAErB,UAAM,KAAK,WAAW,CAAC;AACvB,QAAI,OAAO,KAAK;AACd,UAAI,WAAW,WAAW,OAAO,IAAI,CAAC,GAAG;AACvC,cAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AAC7C,YAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,MACF;AACA,UAAI,WAAW,WAAW,YAAY,IAAI,CAAC,GAAG;AAC5C,cAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AAC7C,YAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,MACF;AACA,YAAM,KAAK,WAAW,QAAQ,KAAK,IAAI,CAAC;AACxC,UAAI,OAAO,KAAK,MAAM,KAAK;AAC3B;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,YAAM,QAAQ,WAAW,QAAQ,MAAM,IAAI,CAAC;AAC5C,UAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,YAAM,KAAK,WAAW,QAAQ,KAAK,IAAI,CAAC;AACxC,UAAI,OAAO,KAAK,MAAM,KAAK;AAC3B,cAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC7B;AAAA,IACF,OAAO;AACL,UAAI,IAAI;AACR,UAAI,IAAI,OAAO,gBAAgB,WAAW,CAAC,CAAC,GAAG;AAC7C;AACA,eAAO,IAAI,OAAO,WAAW,WAAW,CAAC,CAAC,EAAG;AAAA,MAC/C;AACA,YAAM,OAAO,WAAW,MAAM,GAAG,CAAC;AAClC,UAAI,IAAI;AACR,UAAI,gBAAgB;AAEpB,aAAO,IAAI,KAAK;AACd,cAAM,IAAI,WAAW,CAAC;AACtB,YAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,cAAI,WAAW,YAAY,CAAC;AAC5B;AAAA,QACF;AACA,YAAI,MAAM,IAAK;AACf,YAAI,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC1C,0BAAgB;AAChB;AACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,SAAS;AACf,UAAI,UAAU,KAAK,SAAS,QAAQ;AAClC,cAAM,eACJ,WAAW,MAAM,MAAM,MAAM,SAAS,IAAI,SAAS;AACrD,YAAI,cAAe,QAAO,EAAE,OAAO,cAAc,KAAK,aAAa;AAEnE,YAAI,MAAM;AACV,YAAI,YAAY;AAChB,eAAO,MAAM,KAAK;AAChB,gBAAM,SAAS,WAAW,QAAQ,KAAK,GAAG;AAC1C,cAAI,WAAW,GAAI;AACnB,gBAAM,KAAK,SAAS;AACpB,cAAI,MAAM,IAAK;AAEf,gBAAM,IAAI,WAAW,EAAE;AACvB,cAAI,MAAM,KAAK;AACb,gBAAI,WAAW,WAAW,OAAO,KAAK,CAAC,GAAG;AACxC,oBAAM,QAAQ,WAAW,QAAQ,OAAO,KAAK,CAAC;AAC9C,oBAAM,UAAU,KAAK,MAAM,QAAQ;AACnC;AAAA,YACF;AACA,gBAAI,WAAW,WAAW,YAAY,KAAK,CAAC,GAAG;AAC7C,oBAAM,QAAQ,WAAW,QAAQ,OAAO,KAAK,CAAC;AAC9C,oBAAM,UAAU,KAAK,MAAM,QAAQ;AACnC;AAAA,YACF;AACA,kBAAM,MAAM,WAAW,QAAQ,KAAK,KAAK,CAAC;AAC1C,kBAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B;AAAA,UACF,WAAW,MAAM,KAAK;AACpB,kBAAM,QAAQ,WAAW,QAAQ,MAAM,KAAK,CAAC;AAC7C,kBAAM,UAAU,KAAK,MAAM,QAAQ;AACnC;AAAA,UACF,WAAW,MAAM,KAAK;AACpB,gBAAI,IAAI,KAAK;AACb,gBAAI,IAAI,OAAO,gBAAgB,WAAW,CAAC,CAAC,GAAG;AAC7C;AACA,qBAAO,IAAI,OAAO,WAAW,WAAW,CAAC,CAAC,EAAG;AAAA,YAC/C;AACA,kBAAM,UAAU,WAAW,MAAM,KAAK,GAAG,CAAC;AAC1C,kBAAM,MAAM,WAAW,QAAQ,KAAK,CAAC;AACrC,gBAAI,YAAY,QAAQ;AACtB;AACA,kBAAI,cAAc,GAAG;AACnB,uBAAO,EAAE,OAAO,cAAc,KAAK,OAAO;AAAA,cAC5C;AAAA,YACF;AACA,kBAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B;AAAA,UACF,OAAO;AACL,gBAAI,IAAI;AACR,gBAAI,IAAI,OAAO,gBAAgB,WAAW,CAAC,CAAC,GAAG;AAC7C;AACA,qBAAO,IAAI,OAAO,WAAW,WAAW,CAAC,CAAC,EAAG;AAAA,YAC/C;AACA,kBAAM,YAAY,WAAW,MAAM,IAAI,CAAC;AACxC,gBAAI,IAAI;AACR,gBAAI,sBAAsB;AAC1B,mBAAO,IAAI,KAAK;AACd,oBAAM,KAAK,WAAW,CAAC;AACvB,kBAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,oBAAI,WAAW,YAAY,CAAC;AAC5B;AAAA,cACF;AACA,kBAAI,OAAO,IAAK;AAChB,kBAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,sCAAsB;AACtB;AACA;AAAA,cACF;AACA;AAAA,YACF;AAGA,gBAAI,cAAc,UAAU,CAAC,qBAAqB;AAChD;AAAA,YACF;AACA,kBAAM,WAAW,CAAC,MAAM,MAAM,IAAI,IAAI,IAAI;AAC1C;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AACA,UAAI,WAAW,MAAM,MAAM,MAAM,SAAS,IAAI,SAAS;AACvD,eAAS,gBAAgB,IAAI;AAC7B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,oBACd,YACA,SACA,eACA,kBAA2B,MACnB;AACR,QAAM,MAAM,WAAW;AACvB,QAAM,SAAS;AAEf,MAAI,IAAI;AACR,MAAI,QAAQ;AACZ,MAAI,iBAAiB;AACrB,QAAM,aAAa,CAAC,QAAyB;AAC3C,QAAI,CAAC,iBAAiB,cAAc,WAAW,EAAG,QAAO;AACzD,eAAW,KAAK,eAAe;AAC7B,UAAI,OAAO,EAAE,SAAS,MAAM,EAAE,IAAK,QAAO;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK;AACd,UAAM,KAAK,WAAW,QAAQ,KAAK,CAAC;AACpC,QAAI,OAAO,GAAI;AACf,QAAI,KAAK;AACT,QAAI,KAAK,IAAK;AAEd,UAAM,KAAK,WAAW,CAAC;AACvB,QAAI,OAAO,KAAK;AACd,UAAI,WAAW,WAAW,OAAO,IAAI,CAAC,GAAG;AACvC,cAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AAC7C,YAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,MACF;AACA,UAAI,WAAW,WAAW,YAAY,IAAI,CAAC,GAAG;AAC5C,cAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,CAAC;AAC7C,YAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,MACF;AACA,YAAM,KAAK,WAAW,QAAQ,KAAK,IAAI,CAAC;AACxC,UAAI,OAAO,KAAK,MAAM,KAAK;AAC3B;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,YAAM,QAAQ,WAAW,QAAQ,MAAM,IAAI,CAAC;AAC5C,UAAI,UAAU,KAAK,MAAM,QAAQ;AACjC;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,YAAM,KAAK,WAAW,QAAQ,KAAK,IAAI,CAAC;AACxC,UAAI,OAAO,KAAK,MAAM,KAAK;AAC3B;AAAA,IACF,OAAO;AACL,UAAI,IAAI;AACR,UAAI,IAAI,OAAO,gBAAgB,WAAW,CAAC,CAAC,GAAG;AAC7C;AACA,eAAO,IAAI,OAAO,WAAW,WAAW,CAAC,CAAC,EAAG;AAAA,MAC/C;AACA,YAAM,OAAO,WAAW,MAAM,GAAG,CAAC;AAClC,UAAI,IAAI;AACR,aAAO,IAAI,KAAK;AACd,cAAM,IAAI,WAAW,CAAC;AACtB,YAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,cAAI,WAAW,YAAY,CAAC;AAC5B;AAAA,QACF;AACA,YAAI,MAAM,IAAK;AACf,YAAI,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC1C;AACA;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,SAAS,UAAU,CAAC,WAAW,EAAE,GAAG;AACtC,YAAI,gBAAgB;AAClB,2BAAiB;AAAA,QACnB,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,IAAI;AACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACzaO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,WAAmB,UAAwB,CAAC,GAAG;AAJ3D,SAAQ,MAAM;AAKZ,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,cAAc,uBAAuB,MAAM;AAAA,MAC3C,cAAc;AAAA,MACd,4BAA4B;AAAA,MAC5B,GAAG;AAAA,IACL;AACA,SAAK,MAAM,QAAQ,OAAO;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,SAAyC;AAC5D,UAAM,WAAkC,CAAC;AACzC,QAAI,gBAAgB;AAEpB,WAAO,KAAK,UAAU,KAAK,GAAG,GAAG;AAC/B,UAAI,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,cAAc;AAClE,YAAI,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO;AAE/D,gBAAM,aAAa,KAAK,MAAM;AAC9B,eAAK,MAAM,KAAK,UAAU,QAAQ,KAAK,KAAK,GAAG;AAE/C,gBAAM,WAAW,KAAK,UAAU,UAAU,YAAY,KAAK,GAAG;AAC9D,cAAI,WAAW,SAAS,KAAK,MAAM,SAAS;AAE1C,kBAAM,EAAE,MAAM,OAAO,IAAI,cAAc,KAAK,WAAW,KAAK,GAAG;AAC/D,kBAAM,IAAI;AAAA,cACR,gCAAgC,IAAI,YAAY,MAAM,gBAAgB,OAAO,cAAc,QAAQ;AAAA,cACnG;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAEA,cAAI,KAAK,QAAQ,GAAI,MAAK,OAAO;AACjC,iBAAO;AAAA,QACT,WACE,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU,aACtD;AAEA,gBAAM,UAAU,KAAK;AACrB,eAAK,qBAAqB,QAAQ;AAElC,cACE,KAAK,OAAO,KAAK,UAAU,UAC3B,UAAU,KAAK,UAAU,QACzB;AACA,4BAAgB;AAAA,UAClB;AAAA,QACF,OAAO;AAEL,gBAAM,OAAO,KAAK,UAAU;AAC5B,mBAAS,KAAK,IAAI;AAGlB,cAAI,KAAK,QAAQ,CAAC,MAAM,KAAK;AAC3B,qBAAS,KAAK,GAAG,KAAK,QAAQ;AAC9B,iBAAK,WAAW,CAAC;AAAA,UACnB;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,OAAO,KAAK,UAAU;AAC5B,YAAI,KAAK,QAAQ,gBAAgB;AAC/B,cAAI,KAAK,SAAS,GAAG;AACnB,qBAAS,KAAK,IAAI;AAAA,UACpB;AAAA,QACF,OAAO;AACL,gBAAM,UAAU,KAAK,KAAK;AAC1B,cAAI,QAAQ,SAAS,GAAG;AACtB,qBAAS,KAAK,OAAO;AAAA,UACvB;AAAA,QACF;AACA,aAAK;AAAA,MACP;AAAA,IACF;AAIA,QAAI,WAAW,KAAK,OAAO,KAAK,UAAU,UAAU,CAAC,eAAe;AAClE,YAAM,EAAE,MAAM,OAAO,IAAI,cAAc,KAAK,WAAW,KAAK,MAAM,CAAC;AACnE,YAAM,IAAI;AAAA,QACR,wBAAwB,IAAI,YAAY,MAAM,4BAA4B,OAAO;AAAA,QACjF;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,YAAsB;AAnH/B;AAoHI,SAAK;AAEL,UAAM,EAAE,MAAM,SAAS,OAAO,IAAI,UAAU,KAAK,WAAW,KAAK,GAAG;AACpE,SAAK,MAAM;AAEX,UAAM,aAA4C,CAAC;AACnD,QAAI,WAAkC,CAAC;AAGvC,WACE,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,iBAClD,KAAK,UAAU,KAAK,GAAG,GACvB;AACA,YAAM,IAAI,KAAK,UAAU,WAAW,KAAK,GAAG;AAG5C,UACE,MAAM,UAAU,SAChB,MAAM,UAAU,OAChB,MAAM,UAAU,WAChB,MAAM,UAAU,iBAChB;AACA,aAAK;AACL;AAAA,MACF;AAEA,UAAK,IAAI,MAAM,IAAI,MAAQ,IAAI,MAAM,IAAI,KAAM;AAE7C,cAAM,EAAE,MAAM,UAAU,QAAQ,QAAQ,IAAI;AAAA,UAC1C,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AACA,aAAK,MAAM;AAGX,eACE,KAAK,MAAM,KAAK,UAAU,WACzB,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,SACjD,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,OAClD,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,WAClD,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,kBACpD;AACA,eAAK;AAAA,QACP;AAEA,YAAI,QAAuB;AAC3B,YACE,KAAK,MAAM,KAAK,UAAU,UAC1B,KAAK,UAAU,KAAK,GAAG,MAAM,KAC7B;AACA,eAAK;AAGL,iBACE,KAAK,MAAM,KAAK,UAAU,WACzB,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,SACjD,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,OAClD,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,WAClD,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,kBACpD;AACA,iBAAK;AAAA,UACP;AAEA,gBAAM,OAAO,KAAK,UAAU,WAAW,KAAK,GAAG;AAC/C,cACE,SAAS,UAAU,gBACnB,SAAS,UAAU,cACnB;AACA,kBAAM,EAAE,OAAO,aAAa,QAAQ,SAAS,IAAI;AAAA,cAC/C,KAAK;AAAA,cACL,KAAK;AAAA,YACP;AACA,oBAAQ;AACR,iBAAK,MAAM;AAAA,UACb;AAAA,QACF;AAEA,mBAAW,QAAQ,IAAI;AAAA,MACzB,OAAO;AAEL,aAAK;AAAA,MACP;AAAA,IACF;AAGA,UAAM,gBACJ,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU,SACrD,QAAQ,CAAC,MAAM,OACd,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU;AAE1D,QAAI,CAAC,eAAe;AAClB,UAAI,YAAY,UAAU;AAExB,cAAM,QAAQ,KAAK,MAAM;AACzB,aAAK,MAAM,KAAK,UAAU,QAAQ,aAAa,KAAK,GAAG;AACvD,YAAI,KAAK,QAAQ,IAAI;AAEnB,qBAAW,CAAC,KAAK,UAAU,MAAM,KAAK,CAAC;AACvC,eAAK,MAAM,KAAK,UAAU;AAAA,QAC5B,OAAO;AACL,qBAAW,CAAC,KAAK,UAAU,MAAM,OAAO,KAAK,GAAG,CAAC;AACjD,eAAK,OAAO;AAAA,QACd;AAAA,MACF,WAAW,YAAY,SAAS;AAE9B,cAAM,QAAQ,KAAK,MAAM;AACzB,aAAK,MAAM,KAAK,UAAU,QAAQ,YAAY,KAAK,GAAG;AACtD,YAAI,KAAK,QAAQ,IAAI;AAEnB,qBAAW,CAAC,KAAK,UAAU,MAAM,KAAK,CAAC;AACvC,eAAK,MAAM,KAAK,UAAU;AAAA,QAC5B,OAAO;AACL,qBAAW,CAAC,KAAK,UAAU,MAAM,OAAO,KAAK,GAAG,CAAC;AACjD,eAAK,OAAO;AAAA,QACd;AAAA,MACF,aAAW,UAAK,QAAQ,iBAAb,mBAA2B,QAAQ,cAAa,IAAI;AAE7D,aAAK;AACL,mBAAW,KAAK,cAAc,OAAO;AAAA,MACvC,OAAO;AAEL,aAAK;AACL,YAAK,uBAA6C,SAAS,OAAO,GAAG;AAAA,QAGrE,OAAO;AAEL,gBAAM,aAAa,KAAK,OAAO;AAC/B,gBAAM,aAAa,KAAK,UAAU,QAAQ,YAAY,KAAK,GAAG;AAC9D,cAAI,eAAe,IAAI;AACrB,iBAAK,MAAM,aAAa,WAAW;AAAA,UACrC;AAAA,QAEF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO,EAAE,SAAS,YAAY,SAAS;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAoB;AAC1B,UAAM,QAAQ,KAAK;AACnB,SAAK,MAAM,KAAK,UAAU,QAAQ,KAAK,KAAK,GAAG,IAAI;AACnD,QAAI,KAAK,QAAQ,IAAI;AACnB,WAAK,MAAM,KAAK,UAAU;AAAA,IAC5B;AACA,WAAO,KAAK,UAAU,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,UAAuC;AAClE,QAAI,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO;AAE/D,WAAK,cAAc,QAAQ;AAAA,IAC7B,WACE,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MACpC,UAAU,uBACZ,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MACpC,UAAU,uBACZ,KAAK,UAAU,OAAO,KAAK,MAAM,GAAG,CAAC,EAAE,YAAY,MAAM,SACzD;AAEA,WAAK,YAAY,QAAQ;AAAA,IAC3B,OAAO;AAEL,WAAK,cAAc,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,UAAuC;AAC3D,UAAM,kBAAkB,KAAK;AAG7B,WACE,KAAK,QAAQ,MACb,EACE,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,iBAClD,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU,SACtD,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU,QAExD;AACA,WAAK,MAAM,KAAK,UAAU,QAAQ,KAAK,KAAK,MAAM,CAAC;AAAA,IACrD;AAEA,QAAI,KAAK,QAAQ,IAAI;AACnB,WAAK,MAAM,KAAK,UAAU;AAAA,IAC5B;AAEA,QAAI,KAAK,QAAQ,cAAc;AAC7B,eAAS,KAAK,KAAK,UAAU,UAAU,iBAAiB,KAAK,MAAM,CAAC,CAAC;AAAA,IACvE;AAEA,SAAK;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,UAAuC;AACzD,UAAM,gBAAgB,KAAK,UAAU,QAAQ,OAAO,KAAK,GAAG;AAC5D,QAAI,kBAAkB,IAAI;AAExB,eAAS,KAAK,KAAK,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC;AACjD,WAAK,MAAM,KAAK,UAAU;AAAA,IAC5B,OAAO;AACL,eAAS,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,GAAG,aAAa,CAAC;AACnE,WAAK,MAAM,gBAAgB;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,UAAuC;AAC3D,UAAM,eAAe,KAAK,MAAM;AAChC,SAAK,OAAO;AACZ,QAAI,eAAe;AAEnB,YACG,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,iBACjD,iBACF,KAAK,UAAU,KAAK,GAAG,GACvB;AACA,UACE,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,qBAClD;AACA,uBAAe;AAAA,MACjB,WACE,gBACA,KAAK,UAAU,WAAW,KAAK,GAAG,MAAM,UAAU,sBAClD;AACA,uBAAe;AAAA,MACjB;AACA,WAAK;AAAA,IACP;AAEA,aAAS,KAAK,KAAK,UAAU,UAAU,cAAc,KAAK,GAAG,CAAC;AAC9D,SAAK;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKO,cAAsB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,KAAmB;AACpC,SAAK,MAAM;AAAA,EACb;AACF;;;AC7VO,SAAS,MACd,UACA,QACA,UAAwB,CAAC,GACA;AAlC3B;AAmCE,QAAM,gBAAe,aAAQ,iBAAR,YAAwB;AAC7C,QAAM,YAAW,aAAQ,+BAAR,YAAsC;AAIvD,MAAI,iBAAiB,SAAS,KAAK;AACnC,MAAI,eAAe,WAAW,GAAG,KAAK,eAAe,SAAS,GAAG,GAAG;AAClE,UAAM,IAAI;AACV,QAAI,IAAI;AACR,QAAI,YAAY;AAChB,QAAI,WAAW;AAEf,WAAO,IAAI,EAAE,QAAQ;AACnB,YAAM,KAAK,EAAE,QAAQ,KAAK,CAAC;AAC3B,UAAI,OAAO,GAAI;AACf,YAAM,OAAO,EAAE,KAAK,CAAC;AACrB,UAAI,SAAS,KAAK;AAChB,cAAM,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC;AAClC,YAAI,QAAQ,KAAK,EAAE,SAAS,MAAM;AAClC;AAAA,MACF;AACA,UAAI,SAAS,KAAK;AAChB,YAAI,EAAE,WAAW,OAAO,KAAK,CAAC,GAAG;AAC/B,gBAAMC,OAAM,EAAE,QAAQ,OAAO,KAAK,CAAC;AACnC,cAAIA,SAAQ,KAAK,EAAE,SAASA,OAAM;AAClC;AAAA,QACF;AACA,YAAI,EAAE,WAAW,YAAY,KAAK,CAAC,GAAG;AACpC,gBAAMA,OAAM,EAAE,QAAQ,OAAO,KAAK,CAAC;AACnC,cAAIA,SAAQ,KAAK,EAAE,SAASA,OAAM;AAClC;AAAA,QACF;AACA,cAAM,MAAM,EAAE,QAAQ,KAAK,KAAK,CAAC;AACjC,YAAI,QAAQ,KAAK,EAAE,SAAS,MAAM;AAClC;AAAA,MACF;AACA,UAAI,SAAS,KAAK;AAEhB;AAAA,MACF;AAEA,UAAI,IAAI,KAAK;AACb,aACE,IAAI,EAAE,UACN,EAAE,CAAC,MAAM,OACT,EAAE,CAAC,MAAM,QACT,EAAE,CAAC,MAAM,QACT,EAAE,CAAC,MAAM,OACT,EAAE,CAAC,MAAM,OACT,EAAE,CAAC,MAAM,KACT;AACA;AAAA,MACF;AACA,kBAAY;AACZ,iBAAW,EAAE,MAAM,KAAK,GAAG,CAAC;AAC5B;AAAA,IACF;AAEA,QAAI,cAAc,KAAK,UAAU;AAC/B,YAAM,QAAQ,uBAAuB,GAAG,QAAQ;AAChD,UAAI,OAAO;AAET,YAAI,UAAU,MAAM,MAAM,KAAK,QAAQ,IAAI;AAC3C,cAAM,YAAY,EAAE,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG;AACtD,YAAI,cAAc,MAAM,KAAK;AAC3B,cAAI,IAAI,YAAY,IAAI,SAAS;AACjC,iBAAO,IAAI,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC,CAAC,EAAG;AACxC,cAAI,EAAE,CAAC,MAAM,IAAK,WAAU,IAAI;AAAA,QAClC;AAEA,YAAI,YAAY,EAAE,QAAQ;AAExB,gBAAM,YAAY,iBAAiB,MAAM;AACzC,gBAAM,cACJ,aAAa,OAAO,cAAc,WAC5B,UAAsC,aAGxC;AAEN,cACE,eACA,CAAC,OAAO,UAAU,eAAe,KAAK,aAAa,QAAQ,GAC3D;AACA,6BAAiB,EAAE,MAAM,MAAM,OAAO,MAAM,GAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB,yBAAyB,MAAM;AAGxD,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,OAAO,kBAAkB;AAClC,UAAM,gBAAuD,CAAC;AAC9D,eAAW,SAAS,kBAAkB;AACpC,UAAI,UAAU,IAAK;AACnB,YAAM,QAAQ,uBAAuB,gBAAgB,KAAK;AAC1D,UAAI,MAAO,eAAc,KAAK,KAAK;AAAA,IACrC;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,cAAc,KAAK,UAAU;AAC/B,YAAM,IAAI;AAAA,QACR,8BAA8B,GAAG;AAAA,MACnC;AAAA,IACF;AACA,QAAI,cAAc,KAAK,CAAC,UAAU;AAChC,oBAAc,IAAI,GAAG;AACrB,UAAI,QAAQ,SAAS;AACnB,gBAAQ;AAAA,UACN,oCAAoC,GAAG;AAAA,UACvC,EAAE,KAAK,KAAK,YAAY;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,MAAI,qBAAqB;AACzB,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,MAAI;AACF,UAAM,SAA6D,CAAC;AAEpE,eAAW,OAAO,kBAAkB;AAElC,YAAM,IAAI,uBAAuB,gBAAgB,GAAG;AACpD,UAAI,KAAK,EAAE,MAAM,EAAE,MAAO,QAAO,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;AAAA,IACrD;AAEA,QAAI,OAAO,SAAS,GAAG;AAErB,YAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC3D,YAAM,WAA+D,CAAC;AACtE,iBAAW,KAAK,QAAQ;AACtB,cAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,YAAI,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,OAAO,KAAK,KAAK;AAEtD;AAAA,QACF;AACA,iBAAS,KAAK,CAAC;AAAA,MACjB;AAEA,UAAI,SAAS,SAAS,GAAG;AACvB,iBAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACzC,YAAI,UAAU;AACd,YAAI,SAAS;AACb,mBAAW,KAAK,UAAU;AACxB,cAAI,SAAS,EAAE;AACb,uBAAW,eAAe,MAAM,QAAQ,EAAE,KAAK;AACjD,gBAAM,cAAc,sBAAsB,EAAE,GAAG;AAC/C,gBAAM,kBAAkB,eAAe,MAAM,EAAE,OAAO,EAAE,GAAG;AAC3D,6BAAmB,IAAI,aAAa,eAAe;AACnD,qBAAW;AACX,mBAAS,EAAE;AAAA,QACb;AACA,YAAI,SAAS,eAAe;AAC1B,qBAAW,eAAe,MAAM,MAAM;AACxC,6BAAqB;AAAA,MACvB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAEd,QAAI,QAAQ,SAAS;AACnB,cAAQ;AAAA,QACN;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AACA,yBAAqB;AAAA,EACvB;AAGA,MAAI;AACJ,MAAI;AACF,UAAM,aAAa,SAAS,kBAAkB;AAC9C,UAAM,YAAY,IAAI,aAAa,YAAY;AAAA,MAC7C,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,WAAW,UAAU,UAAU;AAGrC,kBAAc,SAAS;AAAA,EACzB,SAAS,OAAO;AACd,UAAM,IAAI,eAAe,uBAAuB,KAAK;AAAA,EACvD;AAGA,QAAM,aAAa,YAAY,aAAa,QAAQ,YAAY;AAChE,QAAM,OAAgC,CAAC;AAGvC,aAAW,KAAK,OAAO,KAAK,cAAc,CAAC,CAAC,GAAG;AAC7C,UAAM,IAAI,WAAW,CAAC;AACtB,QAAI,MAAe;AACnB,UAAM,aAAa,kBAAkB,QAAQ,CAAC;AAC9C,UAAM,WAAW,cAAc,UAAU;AAGzC,QAAI,aAAa,YAAY,cAAc,IAAI,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;AAErE,YAAM,aAAa,EAAE,CAAC;AACtB,UACE,OAAO,eAAe,YACtB,WAAW,WAAW,qBAAqB,GAC3C;AAEA,cAAM,kBAAkB,mBAAmB,IAAI,UAAU;AACzD,YAAI,oBAAoB,QAAW;AACjC,eAAK,CAAC,IAAI;AACV;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK,CAAC,IAAI;AACV;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,YAAY,CAAC,MAAM,QAAQ,CAAC,GAAG;AAE9C,YAAM,kBACH,OAAO,MAAM,YAAY,EAAE,WAAW,qBAAqB,KAC3D,KACC,OAAO,MAAM,YACb,OAAO,UAAU,eAAe,KAAK,GAAG,YAAY,KACpD,OAAQ,EAA8B,YAAY,MAAM,YACtD,EAA8B,YAAY,EAAa;AAAA,QACvD;AAAA,MACF;AAEJ,UAAI,iBAAiB;AAEnB,YAAI;AACJ,YAAI,OAAO,MAAM,UAAU;AACzB,2BAAiB;AAAA,QACnB,OAAO;AACL,2BAAkB,EAChB,YACF;AAAA,QACF;AAGA,cAAM,kBAAkB,mBAAmB,IAAI,cAAc;AAE7D,YAAI,oBAAoB,QAAW;AAEjC,eAAK,CAAC,IAAI;AACV;AAAA,QACF;AAAA,MACF;AAGA,YAAM,MAAM,gBAAgB,gBAAgB,CAAC;AAC7C,UAAI,OAAO,QAAQ,UAAU;AAC3B,aAAK,CAAC,IAAI;AACV;AAAA,MACF;AAAA,IACF;AAGA,QACE,KACA,OAAO,MAAM,YACb,OAAO,UAAU,eAAe,KAAK,GAAG,YAAY,GACpD;AACA,YAAO,EAA8B,YAAY;AAAA,IACnD;AAGA,QAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,UAAI,aAAa,UAAU;AACzB,cAAM,SAAS,EAAE,IAAI,UAAQ;AAC3B,cACE,QACA,OAAO,SAAS,YAChB,OAAO,UAAU,eAAe,KAAK,MAAM,YAAY,GACvD;AACA,kBAAM,UAAW,KAAiC,YAAY;AAC9D,mBAAO,OAAO,YAAY,WAAW,UAAU,OAAO,OAAO;AAAA,UAC/D;AACA,iBAAO,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AAAA,QACtD,CAAC;AAED,YAAI,OAAO,SAAS,KAAK,UAAU;AACjC,gBAAM,IAAI;AAAA,YACR,8BAA8B,CAAC;AAAA,UACjC;AAAA,QACF;AACA,YAAI,OAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS;AACrD,kBAAQ;AAAA,YACN,oCAAoC,CAAC;AAAA,YACrC,EAAE,KAAK,GAAG,aAAa,OAAO,OAAO;AAAA,UACvC;AAAA,QACF;AAEA,aAAK,CAAC,KAAI,YAAO,CAAC,MAAR,YAAa;AACvB;AAAA,MACF,OAAO;AACL,cAAM,oBAAoB,GAAG,YAAY,YAAY;AAAA,MACvD;AAAA,IACF,WACE,KACA,OAAO,MAAM,YACb,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,YAAY,GACrD;AACA,YAAM,MAAM;AACZ,YAAMC,QAAO,OAAO,KAAK,GAAG;AAG5B,UAAIA,MAAK,WAAW,KAAKA,MAAK,CAAC,MAAM,QAAQ;AAC3C,cAAM,YAAY,IAAI;AACtB,YAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,gBAAM,UAAU,IAAI,UAAQ;AAC1B,gBAAI,aAAsB;AAC1B,gBACE,QACA,OAAO,SAAS,YAChB,OAAO,UAAU,eAAe,KAAK,MAAM,YAAY,GACvD;AACA,2BAAc,KAAiC,YAAY;AAAA,YAC7D;AACA,kBAAM,UACJ,OAAO,eAAe,WAAW,WAAW,KAAK,IAAI;AAGvD,gBACE,OAAO,YAAY,YACnB,qCAAqC,KAAK,OAAO,GACjD;AACA,oBAAM,MAAM,OAAO,OAAO;AAC1B,kBAAI,OAAO,SAAS,GAAG,EAAG,QAAO;AAAA,YACnC;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,UACJ,OAAO,cAAc,WAAW,UAAU,KAAK,IAAI;AACrD,cACE,OAAO,YAAY,YACnB,qCAAqC,KAAK,OAAO,GACjD;AACA,kBAAM,MAAM,OAAO,OAAO;AAC1B,kBAAM,OAAO,SAAS,GAAG,IAAI,MAAM;AAAA,UACrC,OAAO;AACL,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF,OAAO;AAEL,YAAI,iBAAiB;AACrB,YAAIA,MAAK,SAAS,KAAKA,MAAK,MAAM,SAAO,QAAQ,KAAK,GAAG,CAAC,GAAG;AAC3D,gBAAM,UAAUA,MAAK,IAAI,CAAAC,OAAK,SAASA,IAAG,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACnE,2BACE,QAAQ,CAAC,MAAM,KAAK,QAAQ,MAAM,CAACC,MAAK,QAAQA,SAAQ,GAAG;AAAA,QAC/D;AAEA,YAAI,gBAAgB;AAClB,gBAAM,oBAAoB,KAAK,YAAY;AAAA,QAC7C,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,CAAC,IAAI,OAAO,QAAQ,WAAW,IAAI,KAAK,IAAI;AAAA,EACnD;AAGA,aAAW,OAAO,kBAAkB;AAClC,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG,GAAG;AACpD,YAAM,MAAM,gBAAgB,gBAAgB,GAAG;AAC/C,UAAI,OAAO,QAAQ,UAAU;AAC3B,aAAK,GAAG,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe;AACnB,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,YAAY,KAAK,OAAO;AAG9B,UAAM,YAAY,iBAAiB,MAAM;AACzC,QAAI,aAAa,OAAO,cAAc,UAAU;AAC9C,YAAM,cAAe,UAAsC;AAG3D,UACE,eACA,CAAC,OAAO,UAAU,eAAe,KAAK,aAAa,OAAO,GAC1D;AAEA,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,UAAU,kBAAkB,cAAc,MAAM;AACtD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,kBAAkB,8BAA8B,KAAK;AAAA,EACjE;AACF;AAKO,SAAS,mBACd,WACA,UAAwB,CAAC,GACF;AACvB,MAAI;AACF,UAAM,YAAY,IAAI,aAAa,WAAW,OAAO;AACrD,WAAO,UAAU,cAAc;AAAA,EACjC,SAAS,OAAO;AAEd,QAAI,iBAAiB,gBAAgB;AACnC,YAAM,WAAW,UAAU,MAAM,GAAG,EAAE,SAAS;AAK/C,UACG,MAAM,QAAQ,SAAS,sBAAsB,KAAK,YAClD,MAAM,QAAQ,SAAS,cAAc,KAAK,UAC3C;AAEA,cAAM,IAAI;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAIA,QAAI,QAAQ,SAAS;AACnB,cAAQ,QAAQ,sCAAsC,EAAE,MAAM,CAAC;AAAA,IACjE;AAGA,QAAI;AACF,YAAM,iBAAwC,CAAC;AAG/C,YAAM,aAAa;AACnB,UAAI;AAEJ,cAAQ,QAAQ,WAAW,KAAK,SAAS,OAAO,MAAM;AACpD,YAAI;AACF,gBAAM,aAAa,MAAM,CAAC;AAC1B,gBAAM,YAAY,IAAI,aAAa,YAAY,OAAO;AACtD,gBAAM,SAAS,UAAU,cAAc;AACvC,yBAAe,KAAK,GAAG,MAAM;AAAA,QAC/B,SAAQ;AAEN;AAAA,QACF;AAAA,MACF;AAGA,UAAI,eAAe,SAAS,GAAG;AAC7B,eAAO;AAAA,MACT;AAAA,IACF,SAAQ;AAAA,IAER;AAGA,WAAO,CAAC,UAAU,KAAK,CAAC;AAAA,EAC1B;AACF;AAKO,SAAS,UACd,WACA,UAAwB,CAAC,GACf;AACV,MAAI;AACF,UAAM,YAAY,IAAI,aAAa,WAAW,OAAO;AACrD,WAAO,UAAU,UAAU;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,IAAI,eAAe,4BAA4B,KAAK;AAAA,EAC5D;AACF;AAKO,SAAS,SAAS,UAA0C;AACjE,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,KAAK,OAAO,SAAS,CAAC,MAAM,UAAU;AAC5D,WAAO,SAAS,CAAC;AAAA,EACnB;AAEA,QAAM,MAA+B,CAAC;AAGtC,WAAS,QAAQ,WAAS;AACxB,QAAI,OAAO,UAAU,UAAU;AAC7B;AAAA,IACF;AAEA,QAAI,CAAC,IAAI,MAAM,OAAO,GAAG;AACvB,UAAI,MAAM,OAAO,IAAI,CAAC;AAAA,IACxB;AAEA,UAAM,OAAO,SAAS,MAAM,QAAQ;AACpC,QAAI,YAAqB;AAGzB,QAAI,OAAO,KAAK,MAAM,UAAU,EAAE,QAAQ;AACxC,UAAI,OAAO,SAAS,UAAU;AAC5B,oBAAY;AAEZ,YAAI,SAAS,IAAI;AACf,sBAAY,EAAE,aAAa,MAAM,YAAY,OAAO,KAAK;AAAA,QAC3D,OAAO;AACL,sBAAY,EAAE,aAAa,MAAM,WAAW;AAAA,QAC9C;AAAA,MACF,WAAW,OAAO,SAAS,YAAY,SAAS,MAAM;AACpD,QAAC,KAAiC,cAAc,MAAM;AACtD,oBAAY;AAAA,MACd,OAAO;AACL,oBAAY,EAAE,aAAa,MAAM,WAAW;AAAA,MAC9C;AAAA,IACF;AAEA,IAAC,IAAI,MAAM,OAAO,EAAgB,KAAK,SAAS;AAAA,EAClD,CAAC;AAGD,aAAW,OAAO,KAAK;AACrB,UAAM,QAAQ,IAAI,GAAG;AACrB,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC9C,UAAI,GAAG,IAAI,MAAM,CAAC;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,OACd,UACA,UAMA,QAAQ,GACR,OAAO,IACK;AACZ,QAAM,MAAkB,CAAC;AAEzB,WAAS,QAAQ,CAAC,OAAO,MAAM;AAC7B,QAAI,OAAO,UAAU,YAAY,SAAS,OAAO,GAAG,OAAO,IAAI,GAAG;AAChE,UAAI,KAAK,KAAK;AAAA,IAChB;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,UAAU;AAC/C,YAAM,OAAO;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,SACP,OAAO,OAAO,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,MAC7C;AACA,UAAI,KAAK,GAAG,IAAI;AAAA,IAClB;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACnnBA,oBAA4D;AASrD,IAAM,qBAAN,cAAiC,wBAAU;AAAA,EAOhD,YAAY,QAA0B,eAA6B,CAAC,GAAG;AACrE,UAAM,EAAE,oBAAoB,KAAK,CAAC;AAPpC,SAAQ,SAAS;AAGjB,SAAQ,eAAe;AACvB,SAAQ,aAAa;AAKnB,QAAI,OAAO,WAAW,UAAU;AAC9B,WAAK,WAAW,OAAO;AAAA,IACzB,OAAO;AACL,WAAK,WAAW,UAAU;AAAA,IAC5B;AAEA,SAAK,eAAe;AAAA,MAClB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,WACE,OACA,UACA,UACM;AACN,QAAI;AACF,YAAM,WAAW,MAAM,SAAS;AAChC,UAAI,SAAS,SAAS,GAAG,EAAG,MAAK,aAAa;AAC9C,WAAK,UAAU;AACf,WAAK,cAAc;AACnB,eAAS;AAAA,IACX,SAAS,OAAO;AACd,eAAS,IAAI,gBAAgB,mBAAmB,KAAK,CAAC;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,OAAO,UAAmC;AACxC,QAAI;AAEF,UAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,aAAK,cAAc,IAAI;AAAA,MACzB;AAEA,UAAI,KAAK,cAAc,KAAK,iBAAiB,GAAG;AAC9C,cAAM,IAAI;AAAA,UACR;AAAA,UACA,IAAI,MAAM,6CAA6C;AAAA,QACzD;AAAA,MACF;AACA,eAAS;AAAA,IACX,SAAS,OAAO;AACd,eAAS,IAAI,gBAAgB,eAAe,KAAK,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,cAAc,UAAU,OAAa;AAE3C,WAAO,KAAK,OAAO,SAAS,GAAG;AAE7B,YAAM,cAAc,KAAK,OAAO,QAAQ,GAAG;AAC3C,UAAI,gBAAgB,IAAI;AAEtB,YAAI,QAAS,MAAK,SAAS;AAC3B;AAAA,MACF;AAGA,UAAI,cAAc,GAAG;AACnB,aAAK,SAAS,KAAK,OAAO,MAAM,WAAW;AAAA,MAC7C;AAGA,UACE,KAAK,OAAO,WAAW,IAAI,KAC3B,KAAK,OAAO,WAAW,MAAM,KAC7B,KAAK,OAAO,WAAW,WAAW,GAClC;AACA,cAAM,aAAqC;AAAA,UACzC,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,aAAa;AAAA,QACf;AACA,YAAI,YAAY;AAChB,mBAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,cAAI,KAAK,OAAO,WAAW,KAAK,GAAG;AACjC,wBAAY;AACZ;AAAA,UACF;AAAA,QACF;AACA,cAAM,SAAS,YAAY,KAAK,OAAO,QAAQ,SAAS,IAAI;AAC5D,YAAI,WAAW,IAAI;AACjB,cAAI,CAAC,QAAS;AAEd,eAAK,SAAS;AACd;AAAA,QACF;AAEA,YAAI,KAAK,aAAa,gBAAgB,KAAK,OAAO,WAAW,MAAM,GAAG;AACpE,eAAK,KAAK,KAAK,OAAO,MAAM,GAAG,SAAS,UAAU,MAAM,CAAC;AAAA,QAC3D;AACA,aAAK,SAAS,KAAK,OAAO,MAAM,SAAS,UAAU,MAAM;AACzD;AAAA,MACF;AAGA,UAAI,KAAK,OAAO,WAAW,IAAI,GAAG;AAChC,cAAM,WAAW,KAAK,OAAO,QAAQ,GAAG;AACxC,YAAI,aAAa,IAAI;AACnB,cAAI,CAAC,QAAS;AACd,eAAK,SAAS;AACd;AAAA,QACF;AACA,aAAK,SAAS,KAAK,OAAO,MAAM,WAAW,CAAC;AAC5C;AAAA,MACF;AAGA,YAAM,aAAa,KAAK,OAAO,QAAQ,GAAG;AAC1C,UAAI,eAAe,IAAI;AACrB,YAAI,CAAC,QAAS;AAEd,aAAK,SAAS;AACd;AAAA,MACF;AACA,YAAM,iBAAiB,KAAK,OAAO,MAAM,GAAG,UAAU;AACtD,YAAM,YAAY,eAAe,MAAM,qBAAqB;AAC5D,UAAI,CAAC,WAAW;AAEd,aAAK,SAAS,KAAK,OAAO,MAAM,CAAC;AACjC;AAAA,MACF;AACA,YAAM,UAAU,UAAU,CAAC;AAG3B,YAAM,gBAAgB,KAAK,OAAO,aAAa,CAAC,MAAM;AACtD,UAAI,eAAe;AACjB,cAAMC,cAAa,aAAa;AAChC,cAAMC,cAAa,KAAK,OAAO,MAAM,GAAGD,WAAU;AAClD,YAAI;AACF,gBAAM,YAAY,IAAI,aAAaC,aAAY,KAAK,YAAY;AAChE,gBAAM,OAAO,UAAU,UAAU;AACjC,eAAK,uBAAuB,IAAI;AAChC,eAAK,SAAS,KAAK,OAAO,MAAMD,WAAU;AAC1C;AAAA,QACF,SAAQ;AAEN,eAAK,SAAS,KAAK,OAAO,MAAM,CAAC;AACjC;AAAA,QACF;AAAA,MACF;AAGA,YAAM,aAAa,KAAK,OAAO;AAC/B,UAAI,QAAQ;AACZ,UAAI,cAAc,aAAa;AAC/B,UAAI,aAAa;AACjB,aAAO,cAAc,KAAK,OAAO,QAAQ;AAEvC,YAAI,WAAW,KAAK,OAAO,QAAQ,IAAI,OAAO,IAAI,WAAW;AAC7D,eAAO,aAAa,IAAI;AACtB,gBAAM,QAAQ,KAAK,OAAO,WAAW,QAAQ,SAAS,CAAC;AACvD,cAAI,UAAU,UAAa,UAAU,OAAO,KAAK,KAAK,KAAK,EAAG;AAC9D,qBAAW,KAAK,OAAO,QAAQ,IAAI,OAAO,IAAI,WAAW,CAAC;AAAA,QAC5D;AAGA,cAAM,iBAAiB,KAAK,OAAO,QAAQ,KAAK,OAAO,IAAI,WAAW;AACtE,YAAI,mBAAmB,GAAI;AAE3B,YAAI,aAAa,MAAM,WAAW,gBAAgB;AAChD;AACA,wBAAc,WAAW;AAAA,QAC3B,OAAO;AACL;AAEA,cAAI,IAAI,iBAAiB,IAAI,QAAQ;AACrC,iBAAO,IAAI,KAAK,OAAO,UAAU,KAAK,KAAK,KAAK,OAAO,CAAC,CAAC,EAAG;AAC5D,cAAI,KAAK,OAAO,CAAC,MAAM,IAAK;AAC5B,gBAAM,eAAe,IAAI;AACzB,wBAAc;AACd,cAAI,UAAU,GAAG;AACf,yBAAa;AACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,eAAe,IAAI;AACrB,YAAI,CAAC,QAAS;AAEd,aAAK,SAAS,KAAK,OAAO,MAAM,CAAC;AACjC;AAAA,MACF;AAGA,YAAM,aAAa,KAAK,OAAO,MAAM,GAAG,UAAU;AAClD,UAAI;AACF,cAAM,YAAY,IAAI,aAAa,YAAY,KAAK,YAAY;AAChE,cAAM,OAAO,UAAU,UAAU;AACjC,aAAK,uBAAuB,IAAI;AAChC,aAAK,SAAS,KAAK,OAAO,MAAM,UAAU;AAAA,MAC5C,SAAS,GAAG;AAEV,aAAK,KAAK,SAAS,IAAI,gBAAgB,eAAe,CAAU,CAAC;AACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,MAA+B;AAC5D,QAAI,OAAO,SAAS,UAAU;AAE5B,UAAI,KAAK,aAAa,gBAAgB,KAAK,SAAS,MAAM,GAAG;AAC3D,aAAK,KAAK,IAAI;AACd,aAAK;AAAA,MACP;AACA;AAAA,IACF;AAGA,SAAK,KAAK,IAAI;AACd,SAAK;AAGL,eAAW,SAAS,KAAK,UAAU;AACjC,WAAK,uBAAuB,KAAK;AAAA,IACnC;AAAA,EACF;AACF;AAKO,SAAS,gBACd,QACA,cACoB;AACpB,SAAO,IAAI,mBAAmB,QAAQ,YAAY;AACpD;AAKA,eAAsB,gBACpB,QACA,QACA,cACgC;AAChC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,UAAiC,CAAC;AACxC,UAAM,kBAAkB,gBAAgB,QAAQ,YAAY;AAG5D,UAAM,gBAAgB,CAAC,QAAe;AACpC,sBAAgB,QAAQ,GAAG;AAAA,IAC7B;AACA,WAAO,GAAG,SAAS,aAAa;AAEhC,oBAAgB,GAAG,QAAQ,CAAC,YAA+B;AACzD,cAAQ,KAAK,OAAO;AAAA,IACtB,CAAC;AAED,oBAAgB,GAAG,OAAO,MAAM;AAC9B,aAAO,IAAI,SAAS,aAAa;AACjC,cAAQ,OAAO;AAAA,IACjB,CAAC;AAED,oBAAgB,GAAG,SAAS,CAAC,UAAiB;AAC5C,aAAO,IAAI,SAAS,aAAa;AACjC,aAAO,IAAI,gBAAgB,yBAAyB,KAAK,CAAC;AAAA,IAC5D,CAAC;AAED,WAAO,KAAK,eAAe;AAAA,EAC7B,CAAC;AACH;AAKA,gBAAuB,iBACrB,QACA,QACA,cACkD;AAClD,QAAM,kBAAkB,gBAAgB,QAAQ,YAAY;AAE5D,MAAI,QAAQ;AACZ,MAAI,QAAsB;AAC1B,QAAM,QAA+B,CAAC;AACtC,MAAI,cACF;AAGF,QAAM,gBAAgB,CAAC,QAAe;AACpC,YAAQ;AACR,oBAAgB,QAAQ,GAAG;AAAA,EAC7B;AACA,SAAO,GAAG,SAAS,aAAa;AAEhC,kBAAgB,GAAG,QAAQ,CAAC,YAA+B;AACzD,QAAI,aAAa;AACf,kBAAY,EAAE,OAAO,SAAS,MAAM,MAAM,CAAC;AAC3C,oBAAc;AAAA,IAChB,OAAO;AACL,YAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF,CAAC;AAED,kBAAgB,GAAG,OAAO,MAAM;AAC9B,YAAQ;AACR,QAAI,aAAa;AACf,kBAAY,EAAE,OAAO,QAAW,MAAM,KAAK,CAAC;AAC5C,oBAAc;AAAA,IAChB;AACA,WAAO,IAAI,SAAS,aAAa;AAAA,EACnC,CAAC;AAED,kBAAgB,GAAG,SAAS,CAAC,QAAe;AAC1C,YAAQ;AACR,QAAI,aAAa;AACf,kBAAY,EAAE,OAAO,QAAW,MAAM,KAAK,CAAC;AAC5C,oBAAc;AAAA,IAChB;AACA,WAAO,IAAI,SAAS,aAAa;AAAA,EACnC,CAAC;AAED,SAAO,KAAK,eAAe;AAE3B,SAAO,MAAM;AACX,QAAI,OAAO;AACT,YAAM,IAAI,gBAAgB,2BAA2B,KAAK;AAAA,IAC5D;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,MAAM,MAAM;AAClB;AAAA,IACF;AAEA,QAAI,OAAO;AACT;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,IAAI;AAAA,MACvB,aAAW;AACT,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,OAAO,MAAM;AACf,UAAI,OAAO;AACT,cAAM,IAAI,gBAAgB,2BAA2B,KAAK;AAAA,MAC5D;AACA;AAAA,IACF;AAEA,UAAM,OAAO;AAAA,EACf;AACF;AAKA,gBAAuB,sBACrB,QACA,IACA,QACA,cACyC;AACzC,mBAAiB,WAAW,iBAAiB,QAAQ,QAAQ,YAAY,GAAG;AAC1E,QAAI,OAAO,YAAY,YAAY,QAAQ,WAAW,OAAO,IAAI;AAC/D,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAKA,gBAAuB,0BACrB,QACA,WACA,QACA,cACyC;AACzC,QAAM,aAAa,IAAI,OAAO,MAAM,SAAS,KAAK;AAElD,mBAAiB,WAAW,iBAAiB,QAAQ,QAAQ,YAAY,GAAG;AAC1E,QACE,OAAO,YAAY,YACnB,QAAQ,WAAW,SACnB,WAAW,KAAK,QAAQ,WAAW,KAAK,GACxC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AChZO,SAAS,UACd,SACA,KACA,UAA4B,CAAC,GACrB;AApBV;AAqBE,MAAI;AACF,UAAM,UAAS,aAAQ,WAAR,YAAkB;AACjC,UAAM,mBAAkB,aAAQ,oBAAR,YAA2B;AACnD,UAAM,qBAAoB,aAAQ,sBAAR,YAA6B;AACvD,UAAM,2BAA0B,aAAQ,4BAAR,YAAmC;AAEnE,QAAI,SAAS;AAEb,QAAI,QAAQ;AACV,gBAAU;AAAA,IACZ;AAEA,cAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,mBAAmB,2BAA2B,KAAK;AAAA,EAC/D;AACF;AAKA,SAAS,eACP,SACA,OACA,OACA,QACA,mBACA,iBACA,yBACQ;AACR,QAAM,SAAS,SAAS,KAAK,OAAO,KAAK,IAAI;AAC7C,QAAM,UAAU,SAAS,OAAO;AAEhC,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,QAAI,kBAAmB,QAAO;AAC9B,WAAO,GAAG,MAAM,IAAI,OAAO,KAAK,OAAO;AAAA,EACzC;AAEA,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,UAAME,WAAU,kBACZ,qBAAqB,OAAO,KAAK,CAAC,IAClC,UAAU,OAAO,KAAK,CAAC;AAC3B,QAAIA,aAAY,MAAM,kBAAmB,QAAO;AAChD,WAAO,GAAG,MAAM,IAAI,OAAO,IAAIA,QAAO,KAAK,OAAO,IAAI,OAAO;AAAA,EAC/D;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,SAAS;AACb,eAAW,QAAQ,OAAO;AACxB,gBAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,kBACZ,qBAAqB,OAAO,KAAK,CAAC,IAClC,UAAU,OAAO,KAAK,CAAC;AAC3B,MAAI,YAAY,MAAM,kBAAmB,QAAO;AAChD,SAAO,GAAG,MAAM,IAAI,OAAO,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO;AAC/D;AAKA,SAAS,gBACP,SACA,KACA,OACA,QACA,mBACA,iBACA,yBACQ;AACR,QAAM,SAAS,SAAS,KAAK,OAAO,KAAK,IAAI;AAC7C,QAAM,UAAU,SAAS,OAAO;AAChC,QAAM,cAAc,SAAS,KAAK,OAAO,QAAQ,CAAC,IAAI;AAGtD,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAoC,CAAC;AAC3C,MAAI;AAEJ,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,IAAI,WAAW,GAAG,GAAG;AACvB,iBAAW,IAAI,UAAU,CAAC,CAAC,IAAI;AAAA,IACjC,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAC7C,oBAAc,OAAO,KAAK;AAAA,IAC5B,WAAW,QAAQ,eAAe;AAChC,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,eAAO,OAAO,YAAY,KAAgC;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,eAAS,GAAG,IAAI;AAAA,IAClB;AAAA,EACF;AAGA,MAAI,UAAU,IAAI,OAAO;AACzB,aAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,QAAI,cAAc,MAAM;AACtB,UAAI,yBAAyB;AAC3B,mBAAW,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACtC,OAAO;AACL,mBAAW,IAAI,QAAQ;AAAA,MACzB;AAAA,IACF,OAAO;AACL,YAAM,WAAW,OAAO,SAAS;AAOjC,UAAI,SAAS,QAAQ,GAAG,MAAM,IAAI;AAChC,cAAM,UAAU,kBACZ,qBAAqB,UAAU,GAAG,IAClC,UAAU,QAAQ;AACtB,mBAAW,IAAI,QAAQ,KAAK,OAAO;AAAA,MACrC,OAAO;AACL,cAAM,UAAU,kBACZ,qBAAqB,UAAU,GAAG,IAClC,UAAU,QAAQ;AACtB,mBAAW,IAAI,QAAQ,KAAK,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc,OAAO,KAAK,QAAQ,EAAE,SAAS;AACnD,QAAM,iBAAiB,gBAAgB,UAAa,gBAAgB;AAEpE,MAAI,CAAC,eAAe,CAAC,gBAAgB;AACnC,QAAI,kBAAmB,QAAO;AAC9B,WAAO,GAAG,MAAM,GAAG,OAAO,KAAK,OAAO;AAAA,EACxC;AAEA,aAAW;AAGX,MAAI,CAAC,eAAe,kBAAkB,aAAa;AAGjD,UAAM,UAAU,kBACZ,qBAAqB,WAAW,IAChC,UAAU,WAAW;AACzB,WAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,KAAK,OAAO,IAAI,OAAO;AAAA,EAC7D;AAGA,MAAI,SAAS,GAAG,MAAM,GAAG,OAAO;AAEhC,MAAI,kBAAkB,aAAa;AAEjC,UAAM,UAAU,kBACZ,qBAAqB,WAAW,IAChC,UAAU,WAAW;AACzB,QAAI,OAAQ,WAAU,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO;AAAA,QACnD,WAAU;AAAA,EACjB;AAEA,MAAI,aAAa;AACf,QAAI,OAAQ,WAAU;AAEtB,eAAW,CAAC,aAAa,YAAY,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClE,gBAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAQ,WAAU;AAAA,EACxB;AAEA,YAAU,KAAK,OAAO,IAAI,OAAO;AAEjC,SAAO;AACT;AAKO,SAAS,eACd,OACA,SAAS,MACT,UAGI,CAAC,GACG;AACR,MAAI,SAAS;AAEb,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,UAAU;AAC5B,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU,cAAc,MAAM,GAAG,QAAQ,OAAO;AAAA,IAClD;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,cACd,MACA,QAAQ,GACR,SAAS,MACT,UAGI,CAAC,GACG;AAlRV;AAmRE,QAAM,SAAS,SAAS,KAAK,OAAO,KAAK,IAAI;AAC7C,QAAM,UAAU,SAAS,OAAO;AAChC,QAAM,mBAAkB,aAAQ,oBAAR,YAA2B;AACnD,QAAM,2BAA0B,aAAQ,4BAAR,YAAmC;AAEnE,MAAI,SAAS,GAAG,MAAM,IAAI,KAAK,OAAO;AAGtC,aAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AACnE,QAAI,cAAc,MAAM;AACtB,UAAI,yBAAyB;AAC3B,kBAAU,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACrC,OAAO;AACL,kBAAU,IAAI,QAAQ;AAAA,MACxB;AAAA,IACF,WAAW,UAAU,QAAQ,GAAG,MAAM,IAAI;AACxC,YAAM,UAAU,kBACZ,qBAAqB,WAAW,GAAG,IACnC,UAAU,SAAS;AACvB,gBAAU,IAAI,QAAQ,KAAK,OAAO;AAAA,IACpC,OAAO;AACL,YAAM,UAAU,kBACZ,qBAAqB,WAAW,GAAG,IACnC,UAAU,SAAS;AACvB,gBAAU,IAAI,QAAQ,KAAK,OAAO;AAAA,IACpC;AAAA,EACF;AAGA,MAAI,KAAK,QAAQ,CAAC,MAAM,KAAK;AAC3B,cAAU;AACV,WAAO,SAAS;AAAA,EAClB;AAGA,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,cAAU;AACV,WAAO,SAAS;AAAA,EAClB;AAEA,YAAU;AAGV,MAAI,qBAAqB;AACzB,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,OAAO,UAAU,UAAU;AAC7B,gBAAU,kBACN,qBAAqB,KAAK,IAC1B,UAAU,KAAK;AAAA,IACrB,OAAO;AACL,UAAI,CAAC,sBAAsB,QAAQ;AACjC,kBAAU;AACV,6BAAqB;AAAA,MACvB;AACA,gBAAU,cAAc,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,sBAAsB,QAAQ;AAChC,cAAU;AAAA,EACZ;AAEA,YAAU,KAAK,KAAK,OAAO;AAE3B,MAAI,QAAQ;AACV,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,OAAsC;AACpE,MAAI,SAAS;AAEb,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,UAAU;AAC5B,gBAAU,MAAM;AAAA,IAClB,OAAO;AACL,gBAAU,MAAM,gBAAgB,KAAK,QAAQ;AAAA,IAC/C;AACA,aAAS,OAAO,KAAK;AAAA,EACvB;AAEA,SAAO;AACT;","names":["result","end","keys","k","val","elementEnd","elementXml","content"]}