@devmm/puredocs-excel 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +220 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +104 -1
- package/dist/index.d.ts +104 -1
- package/dist/index.js +220 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/io/xml-parser.ts","../src/io/zip-reader.ts","../src/io/zip-writer.ts","../src/io/xml-builder.ts","../src/io/ooxml-templates.ts","../src/io/drawing-part.ts","../src/model/shared-string-manager.ts","../src/style/excel-color.ts","../src/style/excel-font.ts","../src/style/excel-fill.ts","../src/style/excel-border.ts","../src/style/excel-alignment.ts","../src/style/excel-number-format.ts","../src/style/cell-style.ts","../src/style/style-manager.ts","../src/model/cell-reference.ts","../src/model/oa-date.ts","../src/model/cell.ts","../src/model/range.ts","../src/model/worksheet.ts","../src/model/workbook.ts"],"names":["unzipSync","zipSync","xml","ExcelUnderline","ExcelVerticalAlignRun","ExcelPatternType","ExcelBorderStyle","ExcelHorizontalAlignment","ExcelVerticalAlignment","ExcelReadingOrder","code","_sharedStrings","_styles","escXml"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Cross-platform XML parser.\n *\n * Uses the browser DOMParser when available; otherwise (Node.js, Deno, Bun without a\n * DOM global) it uses a built-in char-scanning parser. The built-in parser handles the\n * subset of XML that OOXML produces: nested/self-closing elements, attributes, text,\n * CDATA sections, processing instructions and comments, plus standard entity decoding.\n * It is deliberately not a general-purpose XML parser.\n */\n\nexport type XmlElement = {\n readonly tagName: string;\n readonly attributes: Readonly<Record<string, string>>;\n readonly children: XmlElement[];\n readonly textContent: string;\n};\n\n// ── DOMParser-based implementation (browser / Node 18+) ──────────────────────\n\nfunction domElementToXml(el: Element): XmlElement {\n const attributes: Record<string, string> = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i]!;\n attributes[attr.name] = attr.value;\n }\n\n const children: XmlElement[] = [];\n for (let i = 0; i < el.children.length; i++) {\n children.push(domElementToXml(el.children[i]!));\n }\n\n return {\n tagName: el.tagName,\n attributes,\n children,\n textContent: el.textContent ?? '',\n };\n}\n\nfunction parseDom(xmlString: string): XmlElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xmlString, 'application/xml');\n\n const parseError = doc.querySelector('parsererror');\n if (parseError) {\n throw new Error(`XML parse error: ${parseError.textContent}`);\n }\n\n if (!doc.documentElement) {\n throw new Error('XML parse error: no document element.');\n }\n\n return domElementToXml(doc.documentElement);\n}\n\n// ── Minimal hand-rolled parser for basic OOXML attribute extraction ───────────\n\n/**\n * Minimal regex-based XML parser.\n * Handles simple well-formed OOXML documents — NOT a general-purpose parser.\n * Used as fallback when DOMParser is not available.\n */\nfunction parseMinimal(xmlString: string): XmlElement {\n const stack: XmlElement[] = [];\n let pos = 0;\n let root: XmlElement | undefined;\n\n const peek = () => xmlString[pos] ?? '';\n const consume = (n = 1) => { pos += n; };\n\n function skipUntil(ch: string) {\n while (pos < xmlString.length && xmlString[pos] !== ch) pos++;\n }\n\n function parseAttributes(raw: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const re = /(\\S+?)\\s*=\\s*[\"']([^\"']*)[\"']/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n attrs[m[1]!] = m[2]!.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/g, \"'\").replace(/&/g, '&');\n }\n return attrs;\n }\n\n while (pos < xmlString.length) {\n if (xmlString[pos] === '<') {\n pos++;\n\n if (xmlString[pos] === '?') { skipUntil('>'); pos++; continue; } // PI\n if (xmlString[pos] === '!') {\n // CDATA section: copy contents verbatim into the current element's text.\n if (xmlString.startsWith('![CDATA[', pos)) {\n const cdataStart = pos + '![CDATA['.length;\n const cdataEnd = xmlString.indexOf(']]>', cdataStart);\n const end = cdataEnd === -1 ? xmlString.length : cdataEnd;\n const cdata = xmlString.slice(cdataStart, end);\n if (stack.length > 0) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += cdata;\n }\n pos = cdataEnd === -1 ? xmlString.length : cdataEnd + 3;\n continue;\n }\n skipUntil('>'); pos++; continue; // comment / doctype\n }\n\n const isClose = xmlString[pos] === '/';\n if (isClose) pos++;\n\n // Read tag content until >\n const tagStart = pos;\n skipUntil('>');\n const tagContent = xmlString.slice(tagStart, pos).trim();\n pos++;\n\n const isSelfClose = tagContent.endsWith('/');\n const raw = isSelfClose ? tagContent.slice(0, -1).trim() : tagContent;\n\n const spaceIdx = raw.search(/\\s/);\n const tagName = spaceIdx === -1 ? raw : raw.slice(0, spaceIdx);\n const attrRaw = spaceIdx === -1 ? '' : raw.slice(spaceIdx);\n const attributes = parseAttributes(attrRaw);\n\n if (isClose) {\n stack.pop();\n } else {\n const el: XmlElement = { tagName, attributes, children: [], textContent: '' };\n if (stack.length > 0) {\n (stack[stack.length - 1]!.children as XmlElement[]).push(el);\n } else {\n root = el;\n }\n if (!isSelfClose) stack.push(el);\n }\n } else {\n // Text content\n const textStart = pos;\n skipUntil('<');\n const text = xmlString.slice(textStart, pos)\n .replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/g, \"'\").replace(/&/g, '&');\n if (stack.length > 0 && text.trim()) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += text;\n }\n }\n }\n\n if (!root) throw new Error('XML parse error: empty document.');\n return root;\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Parses an XML string into a simple XmlElement tree.\n */\nexport function parseXml(xmlString: string): XmlElement {\n if (typeof DOMParser !== 'undefined') {\n return parseDom(xmlString);\n }\n return parseMinimal(xmlString);\n}\n\n/**\n * Decodes a Uint8Array to a UTF-8 string.\n */\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder('utf-8').decode(bytes);\n }\n // Node.js Buffer fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(bytes).toString('utf-8');\n}\n\n/**\n * Encodes a string to UTF-8 bytes.\n */\nexport function encodeUtf8(str: string): Uint8Array {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8');\n}\n\n/**\n * Queries all descendant elements matching a local tag name.\n * Handles namespace-prefixed tags (e.g. \"a:t\" matches tagName ending in \":t\" or equal to \"t\").\n */\nexport function getElementsByTagName(root: XmlElement, localName: string): XmlElement[] {\n const results: XmlElement[] = [];\n const lname = localName.toLowerCase();\n\n function walk(el: XmlElement) {\n const tag = el.tagName.toLowerCase();\n // Match \"tagname\" or \"prefix:tagname\"\n if (tag === lname || tag.endsWith(`:${lname}`)) {\n results.push(el);\n }\n for (const child of el.children) walk(child);\n }\n\n walk(root);\n return results;\n}\n\n/**\n * Gets a named attribute value, handling namespace prefixes.\n * Tries exact match first, then suffix match (e.g. \"r:id\" → looks for \"r:id\" or \"id\").\n */\nexport function getAttr(el: XmlElement, name: string): string | undefined {\n if (name in el.attributes) return el.attributes[name];\n // Try without prefix\n const local = name.includes(':') ? name.split(':').pop()! : name;\n // Try any key that ends with the local name\n for (const [key, val] of Object.entries(el.attributes)) {\n if (key === local || key.endsWith(`:${local}`)) return val;\n }\n return undefined;\n}\n","/**\n * ZIP reader for .xlsx files (which are ZIP archives).\n * Uses fflate for decompression — MIT licensed, ~9KB gzip.\n *\n * Port concept from TVE.PureDocs.Excel — the C# version uses System.IO.Compression.\n */\nimport { unzipSync } from 'fflate';\nimport { decodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the contents of an unzipped xlsx file.\n * Keys are file paths within the archive (e.g. \"xl/workbook.xml\").\n * Values are raw UTF-8 bytes.\n */\nexport type ZipEntries = Map<string, Uint8Array>;\n\n/**\n * Unzips an xlsx file buffer into a map of path → bytes.\n *\n * @param buffer - ArrayBuffer or Uint8Array of the xlsx file\n * @returns Map of file paths to their raw bytes\n */\nexport function unzipXlsx(buffer: ArrayBuffer | Uint8Array): ZipEntries {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n\n let raw: Record<string, Uint8Array>;\n try {\n raw = unzipSync(bytes);\n } catch (err) {\n throw new Error(\n `Failed to unzip xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const entries = new Map<string, Uint8Array>();\n for (const [path, data] of Object.entries(raw)) {\n // Normalise path separators (Windows ZIP files sometimes use backslash)\n entries.set(path.replace(/\\\\/g, '/'), data);\n }\n\n return entries;\n}\n\n/**\n * Reads and decodes a UTF-8 text entry from a zip archive.\n * Returns undefined if the entry does not exist.\n */\nexport function readXmlEntry(entries: ZipEntries, path: string): string | undefined {\n const bytes = entries.get(path);\n if (!bytes) return undefined;\n return decodeUtf8(bytes);\n}\n\n/**\n * Reads and decodes a UTF-8 text entry, throwing if missing.\n */\nexport function requireXmlEntry(entries: ZipEntries, path: string): string {\n const text = readXmlEntry(entries, path);\n if (text === undefined) {\n throw new Error(`Required xlsx entry not found: \"${path}\".`);\n }\n return text;\n}\n\n/**\n * Returns all entry paths that match the given prefix.\n * Useful for listing worksheets: prefix = \"xl/worksheets/\".\n */\nexport function listEntries(entries: ZipEntries, prefix: string): string[] {\n const results: string[] = [];\n for (const key of entries.keys()) {\n if (key.startsWith(prefix)) results.push(key);\n }\n return results.sort();\n}\n","/**\n * ZIP writer for producing .xlsx files.\n * Uses fflate for compression — MIT licensed.\n */\nimport { zipSync, type Zippable } from 'fflate';\nimport { encodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the file entries to be zipped.\n * Keys are paths within the archive, values are either bytes or a UTF-8 string.\n */\nexport type ZipInput = Map<string, Uint8Array | string>;\n\n/**\n * Zips a collection of file entries into an xlsx-compatible buffer.\n *\n * @param entries - Map of path → content (string auto-encoded to UTF-8)\n * @returns Uint8Array of the resulting ZIP file\n */\nexport function zipXlsx(entries: ZipInput): Uint8Array {\n const zippable: Zippable = {};\n\n for (const [path, content] of entries) {\n const bytes = typeof content === 'string' ? encodeUtf8(content) : content;\n zippable[path] = [bytes, { level: 6 }];\n }\n\n try {\n return zipSync(zippable);\n } catch (err) {\n throw new Error(\n `Failed to create xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Helper to add or update a UTF-8 text entry.\n */\nexport function setXmlEntry(entries: ZipInput, path: string, xml: string): void {\n entries.set(path, xml);\n}\n\n/**\n * Helper to add or update a binary entry.\n */\nexport function setBinaryEntry(entries: ZipInput, path: string, bytes: Uint8Array): void {\n entries.set(path, bytes);\n}\n","/**\n * Lightweight XML builder for OOXML document parts.\n * Produces well-formed XML strings without external dependencies.\n */\n\n/** Escapes special XML characters in an attribute value or text content. */\nexport function escapeXml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Serialises a key-value map to XML attribute string. */\nfunction attrsToString(attrs: Record<string, string | number | boolean | undefined>): string {\n let result = '';\n for (const [key, val] of Object.entries(attrs)) {\n if (val === undefined || val === null) continue;\n result += ` ${key}=\"${escapeXml(String(val))}\"`;\n }\n return result;\n}\n\nexport type XmlAttrs = Record<string, string | number | boolean | undefined>;\n\nexport class XmlBuilder {\n private readonly parts: string[] = [];\n\n /** Appends the XML declaration header. */\n xmlDeclaration(): this {\n this.parts.push('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n return this;\n }\n\n /** Opens a tag with optional attributes. */\n open(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>`);\n return this;\n }\n\n /** Closes a tag. */\n close(tag: string): this {\n this.parts.push(`</${tag}>`);\n return this;\n }\n\n /** Writes a self-closing tag. */\n self(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})} />`);\n return this;\n }\n\n /** Writes a tag with text content. */\n text(tag: string, content: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>${escapeXml(content)}</${tag}>`);\n return this;\n }\n\n /** Writes raw (pre-escaped) XML — use with caution. */\n raw(xml: string): this {\n this.parts.push(xml);\n return this;\n }\n\n /** Returns the complete XML string. */\n toString(): string {\n return this.parts.join('');\n }\n\n /** Returns UTF-8 encoded bytes. */\n toBytes(): Uint8Array {\n const str = this.toString();\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // Node.js fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8') as Uint8Array;\n }\n}\n\n/** Convenience factory. */\nexport function xml(): XmlBuilder {\n return new XmlBuilder();\n}\n\n// ── Common OOXML namespace declarations ───────────────────────────────────────\n\nexport const NS = {\n // SpreadsheetML\n spreadsheetml: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n // Relationships\n relationships: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n relationshipsPackage: 'http://schemas.openxmlformats.org/package/2006/relationships',\n // Drawing\n drawingml: 'http://schemas.openxmlformats.org/drawingml/2006/main',\n spreadsheetDrawing: 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',\n // Content types\n contentTypes: 'http://schemas.openxmlformats.org/package/2006/content-types',\n // Core properties\n coreProperties: 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties',\n} as const;\n\nexport const REL_TYPES = {\n officeDocument: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',\n worksheet: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',\n sharedStrings: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',\n styles: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',\n chart: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',\n drawing: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',\n hyperlink: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',\n} as const;\n\nexport const CONTENT_TYPES = {\n workbook: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',\n worksheet: 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',\n sharedStrings: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',\n styles: 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',\n drawing: 'application/vnd.openxmlformats-officedocument.drawing+xml',\n chart: 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml',\n relationships: 'application/vnd.openxmlformats-package.relationships+xml',\n coreProperties: 'application/vnd.openxmlformats-package.core-properties+xml',\n} as const;\n","/**\n * Default OOXML file templates for creating a new empty workbook.\n *\n * An .xlsx file is a ZIP containing XML parts. The minimal set required is:\n * [Content_Types].xml\n * _rels/.rels\n * xl/workbook.xml\n * xl/_rels/workbook.xml.rels\n * xl/styles.xml\n * xl/sharedStrings.xml\n *\n * Port of TVE.PureDocs.Excel.Workbook.InitializeWorkbook() and CreateDefaultStylesheet().\n */\nimport { CONTENT_TYPES, REL_TYPES } from './xml-builder.js';\n\n// ── [Content_Types].xml ──────────────────────────────────────────────────────\n\nexport function buildContentTypes(\n sheetCount: number,\n extraOverrides: ReadonlyArray<{ partName: string; contentType: string }> = [],\n): string {\n const overrides = Array.from({ length: sheetCount }, (_, i) =>\n ` <Override PartName=\"/xl/worksheets/sheet${i + 1}.xml\" ContentType=\"${CONTENT_TYPES.worksheet}\"/>`,\n );\n\n for (const { partName, contentType } of extraOverrides) {\n overrides.push(` <Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>`);\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"${'http://schemas.openxmlformats.org/package/2006/content-types'}\">\n <Default Extension=\"rels\" ContentType=\"${CONTENT_TYPES.relationships}\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n <Override PartName=\"/xl/workbook.xml\" ContentType=\"${CONTENT_TYPES.workbook}\"/>\n <Override PartName=\"/xl/styles.xml\" ContentType=\"${CONTENT_TYPES.styles}\"/>\n <Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"${CONTENT_TYPES.sharedStrings}\"/>\n${overrides.join('\\n')}\n</Types>`;\n}\n\n// ── _rels/.rels ──────────────────────────────────────────────────────────────\n\nexport const ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"${REL_TYPES.officeDocument}\" Target=\"xl/workbook.xml\"/>\n</Relationships>`;\n\n// ── xl/_rels/workbook.xml.rels ───────────────────────────────────────────────\n\nexport function buildWorkbookRels(sheetCount: number): string {\n const sheetRels = Array.from(\n { length: sheetCount },\n (_, i) =>\n ` <Relationship Id=\"rId${i + 1}\" Type=\"${REL_TYPES.worksheet}\" Target=\"worksheets/sheet${i + 1}.xml\"/>`,\n ).join('\\n');\n\n const stylesId = sheetCount + 1;\n const sharedId = sheetCount + 2;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n${sheetRels}\n <Relationship Id=\"rId${stylesId}\" Type=\"${REL_TYPES.styles}\" Target=\"styles.xml\"/>\n <Relationship Id=\"rId${sharedId}\" Type=\"${REL_TYPES.sharedStrings}\" Target=\"sharedStrings.xml\"/>\n</Relationships>`;\n}\n\n// ── xl/workbook.xml ──────────────────────────────────────────────────────────\n\nexport interface SheetMeta {\n name: string;\n sheetId: number;\n relationshipId: string;\n state?: 'visible' | 'hidden' | 'veryHidden';\n}\n\nexport function buildWorkbookXml(sheets: SheetMeta[]): string {\n const sheetElems = sheets\n .map(({ name, sheetId, relationshipId, state }) => {\n const stateAttr = state && state !== 'visible' ? ` state=\"${state}\"` : '';\n return ` <sheet name=\"${escapeAttr(name)}\" sheetId=\"${sheetId}\" r:id=\"${relationshipId}\"${stateAttr}/>`;\n })\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <fileVersion appName=\"xl\" lastEdited=\"7\" lowestEdited=\"7\" rupBuild=\"22228\"/>\n <workbookPr defaultThemeVersion=\"124226\"/>\n <bookViews>\n <workbookView xWindow=\"240\" yWindow=\"105\" windowWidth=\"14805\" windowHeight=\"8010\"/>\n </bookViews>\n <sheets>\n${sheetElems}\n </sheets>\n <calcPr calcId=\"191028\" fullCalcOnLoad=\"1\"/>\n</workbook>`;\n}\n\n// ── xl/sharedStrings.xml ─────────────────────────────────────────────────────\n\nexport function buildSharedStringsXml(strings: string[]): string {\n const items = strings\n .map(s => ` <si><t ${s.startsWith(' ') || s.endsWith(' ') ? 'xml:space=\"preserve\"' : ''}>${escapeContent(s)}</t></si>`)\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${strings.length}\" uniqueCount=\"${strings.length}\">\n${items}\n</sst>`;\n}\n\n// ── xl/styles.xml ────────────────────────────────────────────────────────────\n\n/**\n * Default stylesheet — mirrors Workbook.CreateDefaultStylesheet() in C#.\n * Contains exactly:\n * - 1 default font (Calibri 11pt)\n * - 2 required fills (none + gray125)\n * - 1 default border (all empty)\n * - 1 default cell format (format 0, all indices 0)\n */\nexport const DEFAULT_STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n <fonts count=\"1\">\n <font>\n <sz val=\"11\"/>\n <color theme=\"1\"/>\n <name val=\"Calibri\"/>\n </font>\n </fonts>\n <fills count=\"2\">\n <fill><patternFill patternType=\"none\"/></fill>\n <fill><patternFill patternType=\"gray125\"/></fill>\n </fills>\n <borders count=\"1\">\n <border>\n <left/><right/><top/><bottom/><diagonal/>\n </border>\n </borders>\n <cellStyleXfs count=\"1\">\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\n </cellStyleXfs>\n <cellXfs count=\"1\">\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\n </cellXfs>\n</styleSheet>`;\n\n// ── xl/worksheets/sheet1.xml ─────────────────────────────────────────────────\n\nexport const EMPTY_WORKSHEET_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <sheetData/>\n</worksheet>`;\n\n// ── helpers ───────────────────────────────────────────────────────────────────\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction escapeContent(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n","/**\n * Generic drawing extension point.\n *\n * The core library knows nothing about charts, images or any specific drawing\n * type. It only knows how to place an opaque \"drawing provider\" into the package:\n * a provider yields one anchor fragment (positioned inside `<xdr:wsDr>`) plus one\n * dependent part (e.g. a chart part) that the anchor references by relationship.\n *\n * This lets satellite packages such as `@devmm/puredocs-excel-charts` inject valid\n * OOXML parts during `Workbook.saveAsBuffer()` without the core depending on them,\n * and without reaching into core internals.\n */\nimport { NS } from './xml-builder.js';\n\n/** A part that a drawing anchor references (e.g. `xl/charts/chart1.xml`). */\nexport interface DrawingDependentPart {\n /** Package-relative path, no leading slash — e.g. `xl/charts/chart1.xml`. */\n readonly path: string;\n /** Full XML content of the part. */\n readonly content: string;\n /** Content type for the `[Content_Types].xml` Override entry. */\n readonly contentType: string;\n /** Relationship type used by the drawing → part relationship. */\n readonly relType: string;\n}\n\n/**\n * Contributes one anchored object (chart, image, …) to a worksheet's drawing.\n * Implemented by satellite packages; consumed by the core save pipeline.\n */\nexport interface DrawingProvider {\n /**\n * Builds the `<xdr:*Anchor>` fragment placed inside `<xdr:wsDr>`.\n * @param relationshipId the id (e.g. `\"rId1\"`) the anchor must reference for\n * its embedded dependent part.\n */\n buildAnchorXml(relationshipId: string): string;\n\n /**\n * Builds the dependent part this drawing references.\n * @param partIndex a workbook-unique 1-based index for building a unique path\n * (e.g. `xl/charts/chart{partIndex}.xml`).\n */\n buildPart(partIndex: number): DrawingDependentPart;\n}\n\n/** Relationship id used by a worksheet to reference its single drawing part. */\nexport const WORKSHEET_DRAWING_REL_ID = 'rId1';\n\n/** Wraps anchor fragments into a complete `xl/drawings/drawingN.xml` part. */\nexport function buildDrawingXml(anchorsXml: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<xdr:wsDr xmlns:xdr=\"${NS.spreadsheetDrawing}\" xmlns:a=\"${NS.drawingml}\">${anchorsXml}</xdr:wsDr>`;\n}\n\n/** Builds a generic `.rels` part from a list of `<Relationship .../>` strings. */\nexport function buildRelsXml(relationships: readonly string[]): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n${relationships.join('\\n')}\n</Relationships>`;\n}\n","/**\n * Manages the shared string table for efficient string storage in xlsx files.\n * Excel stores repeated strings in a shared table and references them by index,\n * dramatically reducing file size for repeated values.\n *\n * Port of TVE.PureDocs.Excel.SharedStringManager (C#)\n *\n * Key differences:\n * - Uses Map instead of Dictionary (same O(1) performance)\n * - No threading concerns (JS single-threaded)\n * - Parses/serialises XML directly instead of using OpenXml SDK\n */\nimport { parseXml, getElementsByTagName } from '../io/xml-parser.js';\n\nexport class SharedStringManager {\n /** Forward map: string value → index */\n readonly #stringToIndex = new Map<string, number>();\n /** Reverse map: index → string value */\n readonly #indexToString: string[] = [];\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /** Total number of unique strings. */\n get count(): number {\n return this.#indexToString.length;\n }\n\n /**\n * Adds a string to the table (if not already present) and returns its index.\n * O(1) average case.\n */\n addOrGet(value: string): number {\n const existing = this.#stringToIndex.get(value);\n if (existing !== undefined) return existing;\n\n const idx = this.#indexToString.length;\n this.#indexToString.push(value);\n this.#stringToIndex.set(value, idx);\n return idx;\n }\n\n /**\n * Returns the string at the given index.\n * Throws if index is out of range.\n */\n getString(index: number): string {\n const s = this.#indexToString[index];\n if (s === undefined) {\n throw new RangeError(\n `Shared string index ${index} out of range [0, ${this.#indexToString.length - 1}].`,\n );\n }\n return s;\n }\n\n /**\n * Returns the string at index, or undefined if not found.\n * Safe alternative to getString().\n */\n tryGetString(index: number): string | undefined {\n return this.#indexToString[index];\n }\n\n /** Returns true if the string is already in the table. */\n has(value: string): boolean {\n return this.#stringToIndex.has(value);\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /**\n * Builds the xl/sharedStrings.xml string.\n */\n buildXml(): string {\n const count = this.#indexToString.length;\n const items = this.#indexToString\n .map(s => {\n const preserveSpace = s.startsWith(' ') || s.endsWith(' ') ? ' xml:space=\"preserve\"' : '';\n return `<si><t${preserveSpace}>${escContent(s)}</t></si>`;\n })\n .join('');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${count}\" uniqueCount=\"${count}\">\n${items}\n</sst>`;\n }\n\n /**\n * Parses an existing xl/sharedStrings.xml and loads strings into the table.\n */\n loadFromXml(xml: string): void {\n this.#stringToIndex.clear();\n this.#indexToString.length = 0;\n\n const root = parseXml(xml);\n // Each <si> element contains one or more <t> elements (rich text uses multiple <r><t>)\n for (const si of getElementsByTagName(root, 'si')) {\n // Concatenate all <t> text nodes within the <si>\n const tNodes = getElementsByTagName(si, 't');\n const text = tNodes.map(t => t.textContent).join('');\n this.addOrGet(text);\n }\n }\n}\n\nfunction escContent(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n","/**\n * Represents a color for use in Excel styling (fonts, fills, borders).\n * Supports hex, RGB, ARGB, theme, and indexed colors.\n *\n * Port of TVE.PureDocs.Excel.ExcelColor (C#)\n *\n * Key differences from C#:\n * - Constructor is private; use static factory methods\n * - Predefined colors use camelCase (ExcelColor.red vs ExcelColor.Red)\n * - toXmlAttrs() replaces ToOpenXmlColor() — returns plain object for XML serialisation\n */\n\nexport interface ColorXmlAttrs {\n rgb?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n}\n\nexport class ExcelColor {\n /** ARGB hex string e.g. \"FFFF0000\" for opaque red. */\n readonly hex: string | undefined;\n /** Theme color index. */\n readonly theme: number | undefined;\n /** Theme tint (-1.0 to 1.0). */\n readonly tint: number | undefined;\n /** Indexed color value. */\n readonly indexed: number | undefined;\n\n private constructor(opts: {\n hex?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n }) {\n this.hex = opts.hex;\n this.theme = opts.theme;\n this.tint = opts.tint;\n this.indexed = opts.indexed;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a color from a hex string.\n * Accepts \"#RGB\", \"#RRGGBB\", \"RRGGBB\", or \"AARRGGBB\" formats.\n */\n static fromHex(hex: string): ExcelColor {\n if (!hex) throw new Error('Hex color cannot be empty.');\n\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n // Expand shorthand #RGB → FFRRGGBB\n h = `FF${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}`;\n } else if (h.length === 6) {\n h = `FF${h}`;\n } else if (h.length !== 8) {\n throw new Error(\n `Invalid hex color \"${hex}\". Expected 3, 6, or 8 hex characters (with optional # prefix).`,\n );\n }\n\n const upper = h.toUpperCase();\n if (!/^[0-9A-F]{8}$/.test(upper)) {\n throw new Error(`Invalid hex color \"${hex}\": contains non-hex characters.`);\n }\n\n return new ExcelColor({ hex: upper });\n }\n\n /** Creates a color from RGB values (0–255). Alpha is set to 255 (opaque). */\n static fromRgb(red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `FF${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a color from ARGB values (0–255). */\n static fromArgb(alpha: number, red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `${byteHex(alpha)}${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a theme color with optional tint value (-1.0 to 1.0). */\n static fromTheme(themeIndex: number, tint = 0): ExcelColor {\n return new ExcelColor({\n theme: themeIndex,\n tint: tint !== 0 ? tint : undefined,\n });\n }\n\n /** Creates an indexed color. */\n static fromIndexed(index: number): ExcelColor {\n return new ExcelColor({ indexed: index });\n }\n\n // ── Predefined colors (camelCase, per TypeScript convention) ─────────────\n\n static readonly black = ExcelColor.fromHex('FF000000');\n static readonly white = ExcelColor.fromHex('FFFFFFFF');\n static readonly red = ExcelColor.fromHex('FFFF0000');\n static readonly green = ExcelColor.fromHex('FF00FF00');\n static readonly blue = ExcelColor.fromHex('FF0000FF');\n static readonly yellow = ExcelColor.fromHex('FFFFFF00');\n static readonly magenta = ExcelColor.fromHex('FFFF00FF');\n static readonly cyan = ExcelColor.fromHex('FF00FFFF');\n static readonly orange = ExcelColor.fromHex('FFFF8C00');\n static readonly purple = ExcelColor.fromHex('FF800080');\n static readonly darkRed = ExcelColor.fromHex('FF8B0000');\n static readonly darkGreen = ExcelColor.fromHex('FF006400');\n static readonly darkBlue = ExcelColor.fromHex('FF00008B');\n static readonly lightGray = ExcelColor.fromHex('FFD3D3D3');\n static readonly darkGray = ExcelColor.fromHex('FFA9A9A9');\n static readonly gray = ExcelColor.fromHex('FF808080');\n static readonly lightBlue = ExcelColor.fromHex('FFADD8E6');\n static readonly lightGreen = ExcelColor.fromHex('FF90EE90');\n static readonly lightYellow = ExcelColor.fromHex('FFFFFFED');\n static readonly lightPink = ExcelColor.fromHex('FFFFB6C1');\n static readonly transparent = ExcelColor.fromArgb(0, 0, 0, 0);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n /** Returns XML attribute key-value pairs for embedding in OOXML elements. */\n toXmlAttrs(): ColorXmlAttrs {\n if (this.hex !== undefined) return { rgb: this.hex };\n if (this.theme !== undefined) {\n const attrs: ColorXmlAttrs = { theme: this.theme };\n if (this.tint !== undefined) attrs.tint = this.tint;\n return attrs;\n }\n if (this.indexed !== undefined) return { indexed: this.indexed };\n return {};\n }\n\n /** Builds an XML color element string for use inside other elements. */\n toXmlElement(tagName: string): string {\n const attrs = this.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb !== undefined) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n return `<${tagName} ${parts.join(' ')}/>`;\n }\n\n /** Parses a color from OOXML XML attributes. Returns undefined if no color data. */\n static fromXmlAttrs(attrs: Record<string, string | undefined>): ExcelColor | undefined {\n const rgb = attrs['rgb'];\n if (rgb) return ExcelColor.fromHex(rgb);\n\n const themeStr = attrs['theme'];\n if (themeStr !== undefined) {\n const tintStr = attrs['tint'];\n return ExcelColor.fromTheme(parseInt(themeStr, 10), tintStr ? parseFloat(tintStr) : 0);\n }\n\n const indexedStr = attrs['indexed'];\n if (indexedStr !== undefined) return ExcelColor.fromIndexed(parseInt(indexedStr, 10));\n\n return undefined;\n }\n\n toString(): string {\n if (this.hex !== undefined) return `#${this.hex}`;\n if (this.theme !== undefined) return `Theme(${this.theme}${this.tint ? `,${this.tint}` : ''})`;\n if (this.indexed !== undefined) return `Indexed(${this.indexed})`;\n return 'None';\n }\n}\n\nfunction byteHex(n: number): string {\n return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0').toUpperCase();\n}\n","/**\n * Font configuration for cell styling.\n * Port of TVE.PureDocs.Excel.ExcelFont (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelUnderline {\n None = 'none',\n Single = 'single',\n Double = 'double',\n SingleAccounting = 'singleAccounting',\n DoubleAccounting = 'doubleAccounting',\n}\n\nexport enum ExcelVerticalAlignRun {\n Baseline = 'baseline',\n Superscript = 'superscript',\n Subscript = 'subscript',\n}\n\nexport interface ExcelFontOptions {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n}\n\nexport class ExcelFont {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n\n constructor(opts: ExcelFontOptions = {}) {\n Object.assign(this, opts);\n }\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const parts: string[] = [];\n\n if (this.bold) parts.push('<b/>');\n if (this.italic) parts.push('<i/>');\n if (this.strikethrough) parts.push('<strike/>');\n\n if (this.underline && this.underline !== ExcelUnderline.None) {\n parts.push(`<u val=\"${this.underline}\"/>`);\n }\n\n if (this.verticalAlign && this.verticalAlign !== ExcelVerticalAlignRun.Baseline) {\n parts.push(`<vertAlign val=\"${this.verticalAlign}\"/>`);\n }\n\n parts.push(`<sz val=\"${this.size ?? 11}\"/>`);\n\n if (this.color) {\n parts.push(this.color.toXmlElement('color'));\n } else {\n parts.push('<color theme=\"1\"/>');\n }\n\n parts.push(`<name val=\"${this.name ?? 'Calibri'}\"/>`);\n\n return `<font>${parts.join('')}</font>`;\n }\n\n /** Parses font from parsed XML child elements. */\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; textContent: string }>): ExcelFont {\n const font = new ExcelFont();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, ''); // strip namespace prefix\n switch (tag) {\n case 'b': font.bold = true; break;\n case 'i': font.italic = true; break;\n case 'strike': font.strikethrough = true; break;\n case 'sz': font.size = parseFloat(el.attributes['val'] ?? '11'); break;\n case 'name': font.name = el.attributes['val']; break;\n case 'u': {\n const val = el.attributes['val'] ?? 'single';\n font.underline = (Object.values(ExcelUnderline) as string[]).includes(val)\n ? (val as ExcelUnderline)\n : ExcelUnderline.Single;\n break;\n }\n case 'vertAlign': {\n const val = el.attributes['val'] ?? 'baseline';\n font.verticalAlign = (Object.values(ExcelVerticalAlignRun) as string[]).includes(val)\n ? (val as ExcelVerticalAlignRun)\n : ExcelVerticalAlignRun.Baseline;\n break;\n }\n case 'color':\n font.color = ExcelColor.fromXmlAttrs(el.attributes);\n break;\n }\n }\n\n return font;\n }\n\n /** Builds a canonical cache key for deduplication in StyleManager. */\n cacheKey(): string {\n return [\n `n:${this.name ?? 'Calibri'}`,\n `s:${this.size ?? 11}`,\n `b:${this.bold ?? false}`,\n `i:${this.italic ?? false}`,\n `u:${this.underline ?? ExcelUnderline.None}`,\n `st:${this.strikethrough ?? false}`,\n `va:${this.verticalAlign ?? ExcelVerticalAlignRun.Baseline}`,\n `c:${this.color?.toString() ?? 'null'}`,\n ].join('|');\n }\n\n clone(): ExcelFont {\n return new ExcelFont({\n name: this.name,\n size: this.size,\n bold: this.bold,\n italic: this.italic,\n underline: this.underline,\n strikethrough: this.strikethrough,\n color: this.color,\n verticalAlign: this.verticalAlign,\n });\n }\n}\n","/**\n * Cell fill (background) configuration.\n * Port of TVE.PureDocs.Excel.ExcelFill (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelPatternType {\n None = 'none',\n Solid = 'solid',\n DarkGray = 'darkGray',\n MediumGray = 'mediumGray',\n LightGray = 'lightGray',\n Gray125 = 'gray125',\n Gray0625 = 'gray0625',\n DarkHorizontal = 'darkHorizontal',\n DarkVertical = 'darkVertical',\n DarkDown = 'darkDown',\n DarkUp = 'darkUp',\n DarkGrid = 'darkGrid',\n DarkTrellis = 'darkTrellis',\n LightHorizontal = 'lightHorizontal',\n LightVertical = 'lightVertical',\n LightDown = 'lightDown',\n LightUp = 'lightUp',\n LightGrid = 'lightGrid',\n LightTrellis = 'lightTrellis',\n}\n\nexport class ExcelFill {\n patternType: ExcelPatternType;\n /** Foreground/pattern color — for solid fills this IS the background color. */\n foregroundColor?: ExcelColor;\n /** Background color for pattern fills. */\n backgroundColor?: ExcelColor;\n\n constructor(\n patternType: ExcelPatternType = ExcelPatternType.None,\n foregroundColor?: ExcelColor,\n backgroundColor?: ExcelColor,\n ) {\n this.patternType = patternType;\n this.foregroundColor = foregroundColor;\n this.backgroundColor = backgroundColor;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a solid fill with the given color.\n * Excel requires the magic indexed(64) background color for solid fills.\n */\n static solid(color: ExcelColor): ExcelFill {\n return new ExcelFill(\n ExcelPatternType.Solid,\n color,\n ExcelColor.fromIndexed(64), // required by Excel spec\n );\n }\n\n /** Creates a pattern fill. */\n static pattern(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): ExcelFill {\n return new ExcelFill(pattern, foreground, background);\n }\n\n /** No fill (default). */\n static readonly none = new ExcelFill(ExcelPatternType.None);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n let inner = `<patternFill patternType=\"${this.patternType}\">`;\n\n if (this.foregroundColor) {\n const attrs = this.foregroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<fgColor ${parts.join(' ')}/>`;\n }\n\n if (this.backgroundColor) {\n const attrs = this.backgroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<bgColor ${parts.join(' ')}/>`;\n }\n\n inner += '</patternFill>';\n return `<fill>${inner}</fill>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>): ExcelFill {\n const fill = new ExcelFill();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n if (tag === 'patternFill') {\n const pt = el.attributes['patternType'];\n if (pt && (Object.values(ExcelPatternType) as string[]).includes(pt)) {\n fill.patternType = pt as ExcelPatternType;\n }\n\n for (const child of el.children) {\n const ctag = child.tagName.replace(/^.*:/, '');\n const color = ExcelColor.fromXmlAttrs(child.attributes);\n if (ctag === 'fgColor' && color) fill.foregroundColor = color;\n if (ctag === 'bgColor' && color) fill.backgroundColor = color;\n }\n }\n }\n\n return fill;\n }\n\n cacheKey(): string {\n return [\n `p:${this.patternType}`,\n `fg:${this.foregroundColor?.toString() ?? 'null'}`,\n `bg:${this.backgroundColor?.toString() ?? 'null'}`,\n ].join('|');\n }\n}\n","/**\n * Border configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelBorder and ExcelBorderEdge (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelBorderStyle {\n None = 'none',\n Thin = 'thin',\n Medium = 'medium',\n Thick = 'thick',\n Dashed = 'dashed',\n Dotted = 'dotted',\n Double = 'double',\n Hair = 'hair',\n MediumDashed = 'mediumDashed',\n DashDot = 'dashDot',\n MediumDashDot = 'mediumDashDot',\n DashDotDot = 'dashDotDot',\n MediumDashDotDot = 'mediumDashDotDot',\n SlantDashDot = 'slantDashDot',\n}\n\nexport class ExcelBorderEdge {\n style: ExcelBorderStyle;\n color?: ExcelColor;\n\n constructor(style: ExcelBorderStyle = ExcelBorderStyle.None, color?: ExcelColor) {\n this.style = style;\n this.color = color;\n }\n\n toXml(tag: string): string {\n if (this.style === ExcelBorderStyle.None) return `<${tag}/>`;\n\n let inner = '';\n if (this.color) inner = this.color.toXmlElement('color');\n\n return `<${tag} style=\"${this.style}\">${inner}</${tag}>`;\n }\n\n static fromXmlElement(el: { attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }): ExcelBorderEdge {\n const styleStr = el.attributes['style'] ?? 'none';\n const style = (Object.values(ExcelBorderStyle) as string[]).includes(styleStr)\n ? (styleStr as ExcelBorderStyle)\n : ExcelBorderStyle.None;\n\n let color: ExcelColor | undefined;\n for (const child of el.children) {\n const tag = child.tagName.replace(/^.*:/, '');\n if (tag === 'color') {\n color = ExcelColor.fromXmlAttrs(child.attributes) ?? undefined;\n }\n }\n\n return new ExcelBorderEdge(style, color);\n }\n\n cacheKey(): string {\n return `${this.style}:${this.color?.toString() ?? 'null'}`;\n }\n}\n\nexport class ExcelBorder {\n left: ExcelBorderEdge;\n right: ExcelBorderEdge;\n top: ExcelBorderEdge;\n bottom: ExcelBorderEdge;\n diagonal: ExcelBorderEdge;\n diagonalDown: boolean;\n diagonalUp: boolean;\n\n constructor() {\n this.left = new ExcelBorderEdge();\n this.right = new ExcelBorderEdge();\n this.top = new ExcelBorderEdge();\n this.bottom = new ExcelBorderEdge();\n this.diagonal = new ExcelBorderEdge();\n this.diagonalDown = false;\n this.diagonalUp = false;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Sets all four sides to the same style and color. */\n static box(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n const edge = new ExcelBorderEdge(style, color);\n b.left = new ExcelBorderEdge(style, color);\n b.right = new ExcelBorderEdge(style, color);\n b.top = new ExcelBorderEdge(style, color);\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static bottomOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static topOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.top = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static leftOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.left = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static rightOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.right = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static readonly none = new ExcelBorder();\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const dd = this.diagonalDown ? ' diagonalDown=\"1\"' : '';\n const du = this.diagonalUp ? ' diagonalUp=\"1\"' : '';\n return `<border${dd}${du}>${this.left.toXml('left')}${this.right.toXml('right')}${this.top.toXml('top')}${this.bottom.toXml('bottom')}${this.diagonal.toXml('diagonal')}</border>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>, borderAttrs: Record<string, string>): ExcelBorder {\n const b = new ExcelBorder();\n b.diagonalDown = borderAttrs['diagonalDown'] === '1';\n b.diagonalUp = borderAttrs['diagonalUp'] === '1';\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n const edge = ExcelBorderEdge.fromXmlElement(el);\n switch (tag) {\n case 'left': b.left = edge; break;\n case 'right': b.right = edge; break;\n case 'top': b.top = edge; break;\n case 'bottom': b.bottom = edge; break;\n case 'diagonal': b.diagonal = edge; break;\n }\n }\n\n return b;\n }\n\n cacheKey(): string {\n return [\n `l:${this.left.cacheKey()}`,\n `r:${this.right.cacheKey()}`,\n `t:${this.top.cacheKey()}`,\n `b:${this.bottom.cacheKey()}`,\n `d:${this.diagonal.cacheKey()}`,\n `dd:${this.diagonalDown}`,\n `du:${this.diagonalUp}`,\n ].join('|');\n }\n}\n","/**\n * Text alignment configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelAlignment (C#)\n */\n\nexport enum ExcelHorizontalAlignment {\n General = 'general',\n Left = 'left',\n Center = 'center',\n Right = 'right',\n Fill = 'fill',\n Justify = 'justify',\n CenterContinuous = 'centerContinuous',\n Distributed = 'distributed',\n}\n\nexport enum ExcelVerticalAlignment {\n Top = 'top',\n Center = 'center',\n Bottom = 'bottom',\n Justify = 'justify',\n Distributed = 'distributed',\n}\n\nexport enum ExcelReadingOrder {\n ContextDependent = 0,\n LeftToRight = 1,\n RightToLeft = 2,\n}\n\nexport class ExcelAlignment {\n horizontal?: ExcelHorizontalAlignment;\n vertical?: ExcelVerticalAlignment;\n wrapText?: boolean;\n shrinkToFit?: boolean;\n textRotation?: number;\n indent?: number;\n readingOrder?: ExcelReadingOrder;\n\n toXml(): string {\n const parts: string[] = [];\n if (this.horizontal) parts.push(`horizontal=\"${this.horizontal}\"`);\n if (this.vertical) parts.push(`vertical=\"${this.vertical}\"`);\n if (this.wrapText) parts.push('wrapText=\"1\"');\n if (this.shrinkToFit) parts.push('shrinkToFit=\"1\"');\n if (this.textRotation !== undefined) parts.push(`textRotation=\"${this.textRotation}\"`);\n if (this.indent !== undefined) parts.push(`indent=\"${this.indent}\"`);\n if (this.readingOrder !== undefined) parts.push(`readingOrder=\"${this.readingOrder}\"`);\n\n if (parts.length === 0) return '';\n return `<alignment ${parts.join(' ')}/>`;\n }\n\n static fromXmlAttrs(attrs: Record<string, string>): ExcelAlignment {\n const a = new ExcelAlignment();\n const h = attrs['horizontal'];\n const v = attrs['vertical'];\n\n if (h && (Object.values(ExcelHorizontalAlignment) as string[]).includes(h)) {\n a.horizontal = h as ExcelHorizontalAlignment;\n }\n if (v && (Object.values(ExcelVerticalAlignment) as string[]).includes(v)) {\n a.vertical = v as ExcelVerticalAlignment;\n }\n if (attrs['wrapText'] === '1' || attrs['wrapText'] === 'true') a.wrapText = true;\n if (attrs['shrinkToFit'] === '1' || attrs['shrinkToFit'] === 'true') a.shrinkToFit = true;\n if (attrs['textRotation'] !== undefined) a.textRotation = parseInt(attrs['textRotation']!, 10);\n if (attrs['indent'] !== undefined) a.indent = parseInt(attrs['indent']!, 10);\n if (attrs['readingOrder'] !== undefined) a.readingOrder = parseInt(attrs['readingOrder']!, 10) as ExcelReadingOrder;\n return a;\n }\n\n cacheKey(): string {\n return [\n `h:${this.horizontal ?? ''}`,\n `v:${this.vertical ?? ''}`,\n `w:${this.wrapText ?? false}`,\n `s:${this.shrinkToFit ?? false}`,\n `r:${this.textRotation ?? 0}`,\n `i:${this.indent ?? 0}`,\n `ro:${this.readingOrder ?? 0}`,\n ].join('|');\n }\n}\n","/**\n * Number format for cell display.\n * Port of TVE.PureDocs.Excel.ExcelNumberFormat (C#)\n *\n * Built-in format IDs (per OOXML spec §18.8.30):\n * 0 = General\n * 1 = 0\n * 2 = 0.00\n * 3 = #,##0\n * 4 = #,##0.00\n * 9 = 0%\n * 10 = 0.00%\n * 11 = 0.00E+00\n * 14 = mm-dd-yy (date)\n * …\n * 49 = @ (text)\n * Custom formats start at ID 164.\n */\n\nconst BUILT_IN_FORMAT_CODES: Record<number, string> = {\n 0: 'General', 1: '0', 2: '0.00', 3: '#,##0', 4: '#,##0.00',\n 5: '$#,##0_);($#,##0)', 6: '$#,##0_);[Red]($#,##0)',\n 7: '$#,##0.00_);($#,##0.00)', 8: '$#,##0.00_);[Red]($#,##0.00)',\n 9: '0%', 10: '0.00%', 11: '0.00E+00', 12: '# ?/?', 13: '# ??/??',\n 14: 'mm-dd-yy', 15: 'd-mmm-yy', 16: 'd-mmm', 17: 'mmm-yy',\n 18: 'h:mm AM/PM', 19: 'h:mm:ss AM/PM', 20: 'h:mm', 21: 'h:mm:ss',\n 22: 'm/d/yy h:mm',\n 37: '#,##0 ;(#,##0)', 38: '#,##0 ;[Red](#,##0)',\n 39: '#,##0.00;(#,##0.00)', 40: '#,##0.00;[Red](#,##0.00)',\n 45: 'mm:ss', 46: '[h]:mm:ss', 47: 'mmss.0', 48: '##0.0E+0', 49: '@',\n};\n\nconst CODE_TO_BUILT_IN_ID: Map<string, number> = new Map(\n Object.entries(BUILT_IN_FORMAT_CODES).map(([id, code]) => [code, Number(id)]),\n);\n\nexport class ExcelNumberFormat {\n readonly formatCode: string;\n readonly formatId: number;\n\n private constructor(formatCode: string, formatId: number) {\n this.formatCode = formatCode;\n this.formatId = formatId;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Creates a number format from a custom format code string. */\n static custom(formatCode: string): ExcelNumberFormat {\n if (!formatCode) throw new Error('Format code cannot be empty.');\n\n // Check if it maps to a built-in format\n const builtInId = CODE_TO_BUILT_IN_ID.get(formatCode);\n if (builtInId !== undefined) {\n return new ExcelNumberFormat(formatCode, builtInId);\n }\n\n // Custom formats get ID assigned by StyleManager (starts at 164)\n return new ExcelNumberFormat(formatCode, 0);\n }\n\n /** Creates from format ID and optional custom formats map. */\n static fromFormatId(\n formatId: number,\n customFormats?: Map<number, string>,\n ): ExcelNumberFormat {\n // Check custom formats first\n if (customFormats && formatId >= 164) {\n const code = customFormats.get(formatId);\n if (code) return new ExcelNumberFormat(code, formatId);\n }\n\n // Built-in\n const code = BUILT_IN_FORMAT_CODES[formatId] ?? 'General';\n return new ExcelNumberFormat(code, formatId);\n }\n\n // ── Predefined formats (camelCase, per TypeScript convention) ─────────────\n\n static readonly general = new ExcelNumberFormat('General', 0);\n static readonly integer = new ExcelNumberFormat('0', 1);\n static readonly decimal2 = new ExcelNumberFormat('0.00', 2);\n static readonly thousandsSeparator = new ExcelNumberFormat('#,##0', 3);\n static readonly thousandsDecimal2 = new ExcelNumberFormat('#,##0.00', 4);\n static readonly percentage = new ExcelNumberFormat('0%', 9);\n static readonly percentageDecimal2 = new ExcelNumberFormat('0.00%', 10);\n static readonly scientific = new ExcelNumberFormat('0.00E+00', 11);\n static readonly fraction = new ExcelNumberFormat('# ?/?', 12);\n static readonly fractionTwoDigits = new ExcelNumberFormat('# ??/??', 13);\n static readonly shortDate = new ExcelNumberFormat('mm-dd-yy', 14);\n static readonly longDate = new ExcelNumberFormat('d-mmm-yy', 15);\n static readonly dayMonth = new ExcelNumberFormat('d-mmm', 16);\n static readonly monthYear = new ExcelNumberFormat('mmm-yy', 17);\n static readonly time12h = new ExcelNumberFormat('h:mm AM/PM', 18);\n static readonly time12hSeconds = new ExcelNumberFormat('h:mm:ss AM/PM', 19);\n static readonly time24h = new ExcelNumberFormat('h:mm', 20);\n static readonly time24hSeconds = new ExcelNumberFormat('h:mm:ss', 21);\n static readonly dateTime = new ExcelNumberFormat('m/d/yy h:mm', 22);\n static readonly accounting = new ExcelNumberFormat('#,##0 ;(#,##0)', 37);\n static readonly accountingRed = new ExcelNumberFormat('#,##0 ;[Red](#,##0)', 38);\n static readonly accountingDecimal2 = new ExcelNumberFormat('#,##0.00;(#,##0.00)', 39);\n static readonly text = new ExcelNumberFormat('@', 49);\n static readonly currency = ExcelNumberFormat.custom('$#,##0.00');\n static readonly currencyNoDecimal = ExcelNumberFormat.custom('$#,##0');\n static readonly isoDate = ExcelNumberFormat.custom('yyyy-mm-dd');\n static readonly isoDateTime = ExcelNumberFormat.custom('yyyy-mm-dd hh:mm:ss');\n static readonly phoneNumber = ExcelNumberFormat.custom('[<=9999999]###-####;(###) ###-####');\n static readonly zipCode = ExcelNumberFormat.custom('00000');\n\n /** Returns true if this format code represents a date/time value. */\n isDateFormat(): boolean {\n const id = this.formatId;\n if ((id >= 14 && id <= 22) || (id >= 45 && id <= 47)) return true;\n\n const lower = this.formatCode.toLowerCase();\n // Check for date patterns — avoid false positive on mm:ss (time only)\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.startsWith('mm:') && !lower.startsWith('[')) ||\n (lower.includes('h') && !lower.startsWith('[h]'))\n );\n }\n\n toString(): string {\n return this.formatCode;\n }\n}\n","/**\n * Complete cell style configuration with fluent builder API.\n * Port of TVE.PureDocs.Excel.CellStyle (C#)\n *\n * Key difference from C#: method names are camelCase (setBold vs SetBold).\n */\nimport { ExcelFont, ExcelUnderline, ExcelVerticalAlignRun } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder, ExcelBorderStyle, ExcelBorderEdge } from './excel-border.js';\nimport { ExcelAlignment, ExcelHorizontalAlignment, ExcelVerticalAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\n\nexport class CellStyle {\n font?: ExcelFont;\n fill?: ExcelFill;\n border?: ExcelBorder;\n alignment?: ExcelAlignment;\n numberFormat?: ExcelNumberFormat;\n isLocked?: boolean;\n isHidden?: boolean;\n\n // ── Font fluent API ────────────────────────────────────────────────────────\n\n setFontName(name: string): this {\n this.#ensureFont().name = name;\n return this;\n }\n\n setFontSize(size: number): this {\n this.#ensureFont().size = size;\n return this;\n }\n\n setBold(bold = true): this {\n this.#ensureFont().bold = bold;\n return this;\n }\n\n setItalic(italic = true): this {\n this.#ensureFont().italic = italic;\n return this;\n }\n\n setUnderline(underline: ExcelUnderline = ExcelUnderline.Single): this {\n this.#ensureFont().underline = underline;\n return this;\n }\n\n setStrikethrough(strikethrough = true): this {\n this.#ensureFont().strikethrough = strikethrough;\n return this;\n }\n\n setFontColor(color: ExcelColor): this;\n setFontColor(hex: string): this;\n setFontColor(colorOrHex: ExcelColor | string): this {\n this.#ensureFont().color =\n typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n return this;\n }\n\n setVerticalAlign(align: ExcelVerticalAlignRun): this {\n this.#ensureFont().verticalAlign = align;\n return this;\n }\n\n // ── Fill fluent API ────────────────────────────────────────────────────────\n\n setBackgroundColor(color: ExcelColor): this;\n setBackgroundColor(hex: string): this;\n setBackgroundColor(colorOrHex: ExcelColor | string): this {\n const color = typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n this.fill = ExcelFill.solid(color);\n return this;\n }\n\n setPatternFill(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): this {\n this.fill = ExcelFill.pattern(pattern, foreground, background);\n return this;\n }\n\n // ── Border fluent API ──────────────────────────────────────────────────────\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.border = ExcelBorder.box(style, color);\n return this;\n }\n\n setBorder(border: ExcelBorder): this {\n this.border = border;\n return this;\n }\n\n setLeftBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().left = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setRightBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().right = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setTopBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().top = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setBottomBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().bottom = new ExcelBorderEdge(style, color);\n return this;\n }\n\n // ── Alignment fluent API ───────────────────────────────────────────────────\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#ensureAlignment().horizontal = alignment;\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#ensureAlignment().vertical = alignment;\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#ensureAlignment().wrapText = wrap;\n return this;\n }\n\n setShrinkToFit(shrink = true): this {\n this.#ensureAlignment().shrinkToFit = shrink;\n return this;\n }\n\n setTextRotation(degrees: number): this {\n this.#ensureAlignment().textRotation = degrees;\n return this;\n }\n\n setIndent(indent: number): this {\n this.#ensureAlignment().indent = indent;\n return this;\n }\n\n // ── Number format fluent API ───────────────────────────────────────────────\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.numberFormat =\n typeof formatOrCode === 'string'\n ? ExcelNumberFormat.custom(formatOrCode)\n : formatOrCode;\n return this;\n }\n\n // ── Protection fluent API ──────────────────────────────────────────────────\n\n setLocked(locked = true): this {\n this.isLocked = locked;\n return this;\n }\n\n setFormulaHidden(hidden = true): this {\n this.isHidden = hidden;\n return this;\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /** Creates a deep copy of this style. */\n clone(): CellStyle {\n const s = new CellStyle();\n if (this.font) s.font = this.font.clone();\n s.fill = this.fill; // ExcelFill is effectively immutable via factory methods\n s.border = this.border;\n s.alignment = this.alignment\n ? Object.assign(new ExcelAlignment(), this.alignment)\n : undefined;\n s.numberFormat = this.numberFormat;\n s.isLocked = this.isLocked;\n s.isHidden = this.isHidden;\n return s;\n }\n\n #ensureFont(): ExcelFont {\n if (!this.font) this.font = new ExcelFont();\n return this.font;\n }\n\n #ensureBorder(): ExcelBorder {\n if (!this.border) this.border = new ExcelBorder();\n return this.border;\n }\n\n #ensureAlignment(): ExcelAlignment {\n if (!this.alignment) this.alignment = new ExcelAlignment();\n return this.alignment;\n }\n}\n","/**\n * Manages the workbook stylesheet — fonts, fills, borders, number formats, cell formats.\n * Handles deduplication and index management.\n *\n * Port of TVE.PureDocs.Excel.StyleManager (C#)\n *\n * Key differences:\n * - Works with parsed XmlElement trees instead of OpenXml SDK objects\n * - Serialises directly to XML strings\n * - No lazy save — isDirty flag still used, caller must call buildStylesXml()\n */\nimport { CellStyle } from './cell-style.js';\nimport { ExcelFont } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder } from './excel-border.js';\nimport { ExcelAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\n\ninterface FontEntry { font: ExcelFont; key: string; }\ninterface FillEntry { fill: ExcelFill; key: string; }\ninterface BorderEntry{ border: ExcelBorder; key: string; }\ninterface NumFmtEntry{ code: string; id: number; }\n\ninterface CellFormat {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n applyFont: boolean;\n applyFill: boolean;\n applyBorder: boolean;\n applyNumFmt: boolean;\n alignment?: ExcelAlignment;\n applyAlign: boolean;\n isLocked?: boolean;\n isHidden?: boolean;\n applyProt: boolean;\n}\n\nexport class StyleManager {\n // Index arrays — position = index\n private fonts: FontEntry[] = [];\n private fills: FillEntry[] = [];\n private borders: BorderEntry[] = [];\n private numFmts: NumFmtEntry[] = [];\n private cellXfs: CellFormat[] = [];\n\n // Dedup caches: key → index\n private fontCache: Map<string, number> = new Map();\n private fillCache: Map<string, number> = new Map();\n private borderCache: Map<string, number> = new Map();\n private numFmtCache: Map<string, number> = new Map(); // code → id\n private cellXfCache: Map<string, number> = new Map();\n\n private nextCustomNumFmtId = 164;\n isDirty = false;\n\n constructor() {\n this.#initDefaults();\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Returns the cellXf index for the given CellStyle.\n * Creates new font/fill/border entries as needed (with deduplication).\n */\n getOrCreateCellFormatIndex(style: CellStyle): number {\n const fontId = style.font ? this.#getOrCreateFont(style.font) : 0;\n const fillId = style.fill ? this.#getOrCreateFill(style.fill) : 0;\n const borderId = style.border ? this.#getOrCreateBorder(style.border): 0;\n const numFmtId = style.numberFormat\n ? this.#getOrCreateNumFmt(style.numberFormat)\n : 0;\n\n const cf: CellFormat = {\n fontId, fillId, borderId, numFmtId,\n applyFont: style.font != null,\n applyFill: style.fill != null,\n applyBorder: style.border != null,\n applyNumFmt: style.numberFormat != null,\n alignment: style.alignment,\n applyAlign: style.alignment != null,\n isLocked: style.isLocked,\n isHidden: style.isHidden,\n applyProt: style.isLocked != null || style.isHidden != null,\n };\n\n const key = this.#cellFormatKey(cf);\n const existing = this.cellXfCache.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n /**\n * Reconstructs a CellStyle from a cellXf index.\n * Used by Cell.style getter.\n */\n getCellStyle(styleIndex: number): CellStyle {\n const cf = this.cellXfs[styleIndex];\n if (!cf) return new CellStyle();\n\n const s = new CellStyle();\n\n const fontEntry = this.fonts[cf.fontId];\n if (fontEntry && cf.applyFont) s.font = fontEntry.font;\n\n const fillEntry = this.fills[cf.fillId];\n if (fillEntry && cf.applyFill) s.fill = fillEntry.fill;\n\n const borderEntry = this.borders[cf.borderId];\n if (borderEntry && cf.applyBorder) s.border = borderEntry.border;\n\n if (cf.applyNumFmt) {\n const customMap = new Map(\n this.numFmts.map(n => [n.id, n.code] as [number, string]),\n );\n s.numberFormat = ExcelNumberFormat.fromFormatId(cf.numFmtId, customMap);\n }\n\n if (cf.alignment && cf.applyAlign) s.alignment = cf.alignment;\n if (cf.applyProt) {\n s.isLocked = cf.isLocked;\n s.isHidden = cf.isHidden;\n }\n\n return s;\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** Builds the complete xl/styles.xml string. */\n buildStylesXml(): string {\n const numFmtsXml = this.numFmts.length > 0\n ? `<numFmts count=\"${this.numFmts.length}\">${this.numFmts.map(n => `<numFmt numFmtId=\"${n.id}\" formatCode=\"${escAttr(n.code)}\"/>`).join('')}</numFmts>`\n : '';\n\n const fontsXml = `<fonts count=\"${this.fonts.length}\">${this.fonts.map(f => f.font.toXml()).join('')}</fonts>`;\n\n const fillsXml = `<fills count=\"${this.fills.length}\">${this.fills.map(f => f.fill.toXml()).join('')}</fills>`;\n\n const bordersXml = `<borders count=\"${this.borders.length}\">${this.borders.map(b => b.border.toXml()).join('')}</borders>`;\n\n const cellXfsXml = `<cellXfs count=\"${this.cellXfs.length}\">${this.cellXfs.map(cf => this.#cfToXml(cf)).join('')}</cellXfs>`;\n\n this.isDirty = false;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsXml}${fontsXml}${fillsXml}${bordersXml}\n<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>\n${cellXfsXml}\n</styleSheet>`;\n }\n\n /** Loads an existing styles.xml, rebuilding all caches. */\n loadFromXml(stylesXml: string): void {\n this.fonts = [];\n this.fills = [];\n this.borders = [];\n this.numFmts = [];\n this.cellXfs = [];\n this.fontCache.clear();\n this.fillCache.clear();\n this.borderCache.clear();\n this.numFmtCache.clear();\n this.cellXfCache.clear();\n this.nextCustomNumFmtId = 164;\n\n const root = parseXml(stylesXml);\n\n // numFmts\n for (const el of getElementsByTagName(root, 'numFmt')) {\n const id = parseInt(getAttr(el, 'numFmtId') ?? '0', 10);\n const code = getAttr(el, 'formatCode') ?? '';\n this.numFmts.push({ id, code });\n this.numFmtCache.set(code, id);\n if (id >= this.nextCustomNumFmtId) this.nextCustomNumFmtId = id + 1;\n }\n\n // fonts\n for (const el of getElementsByTagName(root, 'fonts')) {\n for (const fontEl of el.children) {\n const font = ExcelFont.fromXmlChildren(fontEl.children as Parameters<typeof ExcelFont.fromXmlChildren>[0]);\n const key = font.cacheKey();\n this.fonts.push({ font, key });\n this.fontCache.set(key, this.fonts.length - 1);\n }\n }\n\n // fills\n for (const el of getElementsByTagName(root, 'fills')) {\n for (const fillEl of el.children) {\n const fill = ExcelFill.fromXmlChildren(fillEl.children as Parameters<typeof ExcelFill.fromXmlChildren>[0]);\n const key = fill.cacheKey();\n this.fills.push({ fill, key });\n this.fillCache.set(key, this.fills.length - 1);\n }\n }\n\n // borders\n for (const el of getElementsByTagName(root, 'borders')) {\n for (const borderEl of el.children) {\n const border = ExcelBorder.fromXmlChildren(\n borderEl.children as Parameters<typeof ExcelBorder.fromXmlChildren>[0],\n borderEl.attributes,\n );\n const key = border.cacheKey();\n this.borders.push({ border, key });\n this.borderCache.set(key, this.borders.length - 1);\n }\n }\n\n // cellXfs (main cell formats)\n for (const el of getElementsByTagName(root, 'cellXfs')) {\n for (const xfEl of el.children) {\n const cf: CellFormat = {\n fontId: parseInt(getAttr(xfEl, 'fontId') ?? '0', 10),\n fillId: parseInt(getAttr(xfEl, 'fillId') ?? '0', 10),\n borderId: parseInt(getAttr(xfEl, 'borderId') ?? '0', 10),\n numFmtId: parseInt(getAttr(xfEl, 'numFmtId') ?? '0', 10),\n applyFont: getAttr(xfEl, 'applyFont') === '1',\n applyFill: getAttr(xfEl, 'applyFill') === '1',\n applyBorder: getAttr(xfEl, 'applyBorder') === '1',\n applyNumFmt: getAttr(xfEl, 'applyNumberFormat') === '1',\n applyAlign: getAttr(xfEl, 'applyAlignment') === '1',\n applyProt: getAttr(xfEl, 'applyProtection') === '1',\n };\n\n // alignment child\n const alignEl = xfEl.children.find(c => c.tagName.replace(/^.*:/, '') === 'alignment');\n if (alignEl) cf.alignment = ExcelAlignment.fromXmlAttrs(alignEl.attributes);\n\n const key = this.#cellFormatKey(cf);\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, this.cellXfs.length - 1);\n }\n }\n\n // Ensure defaults exist\n if (this.fonts.length === 0) this.#initDefaults();\n if (this.cellXfs.length === 0) this.#initDefaults();\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n #initDefaults(): void {\n // Default font — Calibri 11pt\n const defaultFont = new ExcelFont({ name: 'Calibri', size: 11 });\n const fontKey = defaultFont.cacheKey();\n this.fonts = [{ font: defaultFont, key: fontKey }];\n this.fontCache.set(fontKey, 0);\n\n // Required fills: none + gray125\n const noneFill = new ExcelFill(ExcelPatternType.None);\n const grayFill = new ExcelFill(ExcelPatternType.Gray125);\n this.fills = [\n { fill: noneFill, key: noneFill.cacheKey() },\n { fill: grayFill, key: grayFill.cacheKey() },\n ];\n this.fillCache.set(noneFill.cacheKey(), 0);\n this.fillCache.set(grayFill.cacheKey(), 1);\n\n // Default border — all empty\n const defaultBorder = new ExcelBorder();\n const borderKey = defaultBorder.cacheKey();\n this.borders = [{ border: defaultBorder, key: borderKey }];\n this.borderCache.set(borderKey, 0);\n\n // Default cell format\n const defaultCf: CellFormat = {\n fontId: 0, fillId: 0, borderId: 0, numFmtId: 0,\n applyFont: false, applyFill: false, applyBorder: false,\n applyNumFmt: false, applyAlign: false, applyProt: false,\n };\n const cfKey = this.#cellFormatKey(defaultCf);\n this.cellXfs = [defaultCf];\n this.cellXfCache.set(cfKey, 0);\n }\n\n #getOrCreateFont(font: ExcelFont): number {\n const key = font.cacheKey();\n const existing = this.fontCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fonts.length;\n this.fonts.push({ font, key });\n this.fontCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateFill(fill: ExcelFill): number {\n const key = fill.cacheKey();\n const existing = this.fillCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fills.length;\n this.fills.push({ fill, key });\n this.fillCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateBorder(border: ExcelBorder): number {\n const key = border.cacheKey();\n const existing = this.borderCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.borders.length;\n this.borders.push({ border, key });\n this.borderCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateNumFmt(fmt: ExcelNumberFormat): number {\n // Built-in formats (ID < 164) don't need to be stored\n if (fmt.formatId > 0 && fmt.formatId < 164) return fmt.formatId;\n if (fmt.formatCode === 'General') return 0;\n\n const existing = this.numFmtCache.get(fmt.formatCode);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.numFmts.push({ id, code: fmt.formatCode });\n this.numFmtCache.set(fmt.formatCode, id);\n this.isDirty = true;\n return id;\n }\n\n #cellFormatKey(cf: CellFormat): string {\n return [\n cf.fontId, cf.fillId, cf.borderId, cf.numFmtId,\n cf.applyFont, cf.applyFill, cf.applyBorder, cf.applyNumFmt,\n cf.applyAlign, cf.applyProt,\n cf.alignment?.cacheKey() ?? '',\n cf.isLocked ?? '',\n cf.isHidden ?? '',\n ].join('|');\n }\n\n #cfToXml(cf: CellFormat): string {\n const attrs = [\n `numFmtId=\"${cf.numFmtId}\"`,\n `fontId=\"${cf.fontId}\"`,\n `fillId=\"${cf.fillId}\"`,\n `borderId=\"${cf.borderId}\"`,\n `xfId=\"0\"`,\n cf.applyFont ? 'applyFont=\"1\"' : '',\n cf.applyFill ? 'applyFill=\"1\"' : '',\n cf.applyBorder ? 'applyBorder=\"1\"' : '',\n cf.applyNumFmt ? 'applyNumberFormat=\"1\"' : '',\n cf.applyAlign ? 'applyAlignment=\"1\"' : '',\n cf.applyProt ? 'applyProtection=\"1\"' : '',\n ].filter(Boolean).join(' ');\n\n const alignXml = cf.alignment?.toXml() ?? '';\n const protXml = cf.applyProt\n ? `<protection${cf.isLocked !== undefined ? ` locked=\"${cf.isLocked ? '1' : '0'}\"` : ''}${cf.isHidden !== undefined ? ` hidden=\"${cf.isHidden ? '1' : '0'}\"` : ''}/>`\n : '';\n\n const inner = alignXml + protXml;\n return inner ? `<xf ${attrs}>${inner}</xf>` : `<xf ${attrs}/>`;\n }\n}\n\nfunction escAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n","/**\n * Utility for converting between cell references (e.g. \"A1\") and\n * 1-based row/column indices.\n *\n * Port of TVE.PureDocs.Excel.CellReference (C#)\n */\n\nexport interface ParsedCellRef {\n readonly row: number;\n readonly column: number;\n}\n\n/**\n * Parses a cell reference string into 1-based row and column indices.\n *\n * @example\n * parseCellRef(\"A1\") // { row: 1, column: 1 }\n * parseCellRef(\"B10\") // { row: 10, column: 2 }\n * parseCellRef(\"AA1\") // { row: 1, column: 27 }\n * parseCellRef(\"$B$2\") // { row: 2, column: 2 } — $ stripped\n */\nexport function parseCellRef(cellReference: string): ParsedCellRef {\n if (!cellReference) {\n throw new Error('Cell reference cannot be null or empty.');\n }\n\n // Strip absolute reference markers\n const ref = cellReference.replace(/\\$/g, '').toUpperCase();\n\n let i = 0;\n let column = 0;\n\n // Parse column letters\n while (i < ref.length && ref.charCodeAt(i) >= 65 && ref.charCodeAt(i) <= 90) {\n column = column * 26 + (ref.charCodeAt(i) - 64); // 'A' = 65, so A-64 = 1\n i++;\n }\n\n if (column === 0) {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no column letters found.`);\n }\n\n // Parse row digits\n const rowStr = ref.slice(i);\n const row = parseInt(rowStr, 10);\n\n if (isNaN(row) || row < 1 || rowStr === '') {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no valid row number found.`);\n }\n\n return { row, column };\n}\n\n/**\n * Converts 1-based row and column indices to a cell reference string.\n *\n * @example\n * cellRefFromRowCol(1, 1) // \"A1\"\n * cellRefFromRowCol(10, 2) // \"B10\"\n * cellRefFromRowCol(1, 27) // \"AA1\"\n */\nexport function cellRefFromRowCol(row: number, column: number): string {\n if (row < 1) throw new RangeError(`Row must be >= 1, got ${row}.`);\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n return `${columnLetter(column)}${row}`;\n}\n\n/**\n * Converts a 1-based column index to its letter representation.\n *\n * @example\n * columnLetter(1) // \"A\"\n * columnLetter(26) // \"Z\"\n * columnLetter(27) // \"AA\"\n */\nexport function columnLetter(column: number): string {\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n let result = '';\n let col = column;\n\n while (col > 0) {\n const remainder = (col - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n col = Math.floor((col - remainder) / 26);\n }\n\n return result;\n}\n\n/**\n * Converts a column letter string to a 1-based column number.\n *\n * @example\n * columnNumber(\"A\") // 1\n * columnNumber(\"Z\") // 26\n * columnNumber(\"AA\") // 27\n */\nexport function columnNumber(letters: string): number {\n if (!letters) throw new Error('Column letter cannot be empty.');\n\n const upper = letters.toUpperCase();\n let col = 0;\n\n for (let i = 0; i < upper.length; i++) {\n const code = upper.charCodeAt(i);\n if (code < 65 || code > 90) {\n throw new Error(`Invalid column letter: \"${letters}\".`);\n }\n col = col * 26 + (code - 64);\n }\n\n return col;\n}\n\n/**\n * Parses a range reference string like \"A1:B10\" into start/end coordinates.\n */\nexport function parseRangeRef(rangeReference: string): {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n} {\n const parts = rangeReference.split(':');\n if (parts.length !== 2) {\n throw new Error(`Invalid range reference: \"${rangeReference}\" — expected \"A1:B10\" format.`);\n }\n\n const start = parseCellRef(parts[0]!);\n const end = parseCellRef(parts[1]!);\n\n if (start.row > end.row || start.column > end.column) {\n throw new Error(\n `Invalid range reference: \"${rangeReference}\" — start must be top-left of end.`,\n );\n }\n\n return {\n startRow: start.row,\n startColumn: start.column,\n endRow: end.row,\n endColumn: end.column,\n };\n}\n","/**\n * OLE Automation Date (OADate) helpers.\n *\n * Excel stores dates as floating-point numbers where:\n * - The integer part = number of days since Dec 30, 1899 (OADate epoch)\n * - The fractional part = time of day (0.5 = noon)\n *\n * Note: Excel has a known bug treating 1900 as a leap year (day 60 = Feb 29 1900),\n * which never existed. This implementation matches Excel's behaviour exactly.\n */\n\n// OADate epoch: Dec 30, 1899 00:00:00 UTC\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\n/**\n * Converts a JavaScript Date to an Excel OADate serial number.\n *\n * @example\n * toOADate(new Date(1900, 0, 1)) // 1\n * toOADate(new Date(2025, 0, 1)) // 45658\n */\nexport function toOADate(date: Date): number {\n const utcMs = Date.UTC(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n return (utcMs - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\n/**\n * Converts an Excel OADate serial number to a JavaScript Date.\n *\n * @example\n * fromOADate(1) // Jan 1, 1900\n * fromOADate(45658) // Jan 1, 2025\n */\nexport function fromOADate(oaDate: number): Date {\n const ms = OA_EPOCH_MS + oaDate * MS_PER_DAY;\n const d = new Date(ms);\n // Return local date (strip UTC offset)\n return new Date(\n d.getUTCFullYear(),\n d.getUTCMonth(),\n d.getUTCDate(),\n d.getUTCHours(),\n d.getUTCMinutes(),\n d.getUTCSeconds(),\n d.getUTCMilliseconds(),\n );\n}\n\n/**\n * Built-in date format IDs per OOXML spec (§18.8.30).\n * IDs 14–22 and 45–47 are date/time formats.\n */\nconst DATE_FORMAT_IDS = new Set([14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47]);\n\n/**\n * Returns true if the given number format ID represents a date/time value.\n */\nexport function isDateFormatId(formatId: number): boolean {\n return DATE_FORMAT_IDS.has(formatId);\n}\n\n/**\n * Returns true if the format code string contains date/time patterns.\n */\nexport function isDateFormatCode(formatCode: string): boolean {\n const lower = formatCode.toLowerCase();\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.includes('mm:')) || // m = month unless part of mm:ss\n lower.includes('h') ||\n lower.includes('am') ||\n lower.includes('pm')\n );\n}\n","/**\n * Represents a single cell in a worksheet.\n * Port of TVE.PureDocs.Excel.Cell (C#)\n *\n * Key differences from C#:\n * - All method names are camelCase\n * - No OpenXml SDK dependency — works with plain XML strings\n * - DateTime uses JavaScript Date\n */\nimport { SharedStringManager } from './shared-string-manager.js';\nimport { StyleManager } from '../style/style-manager.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport { parseCellRef } from './cell-reference.js';\nimport { toOADate, fromOADate, isDateFormatId, isDateFormatCode } from './oa-date.js';\n\n/** Possible raw types stored in a cell. */\nexport type CellValue = string | number | boolean | Date | null;\n\n/** Internal cell data representation (mirrors what OOXML stores). */\nexport interface CellData {\n reference: string; // e.g. \"A1\"\n /** 's' = sharedString, 'n' = number, 'b' = boolean, 'str' = inlineStr */\n dataType?: 's' | 'n' | 'b' | 'str';\n rawValue?: string; // raw text from <v>\n formula?: string; // formula text (without leading =)\n styleIndex: number; // index into cellXfs\n}\n\nexport class Cell {\n readonly #data: CellData;\n readonly #sharedStrings: SharedStringManager;\n readonly #styles: StyleManager;\n\n /** @internal */\n constructor(data: CellData, sharedStrings: SharedStringManager, styles: StyleManager) {\n this.#data = data;\n this.#sharedStrings = sharedStrings;\n this.#styles = styles;\n }\n\n // ── Identity ───────────────────────────────────────────────────────────────\n\n /** Cell reference string e.g. \"A1\". */\n get reference(): string { return this.#data.reference; }\n\n /** 1-based row index. */\n get row(): number { return parseCellRef(this.#data.reference).row; }\n\n /** 1-based column index. */\n get column(): number { return parseCellRef(this.#data.reference).column; }\n\n // ── Value API ──────────────────────────────────────────────────────────────\n\n /** Sets a string value. */\n setValue(value: string): this;\n /** Sets a numeric value. */\n setValue(value: number): this;\n /** Sets a boolean value. */\n setValue(value: boolean): this;\n /** Sets a Date value (stored as OADate number). */\n setValue(value: Date): this;\n /** Clears the cell value (sets to null). */\n setValue(value: null): this;\n setValue(value: CellValue): this {\n this.#data.formula = undefined;\n\n if (value === null || value === undefined) {\n this.#data.dataType = undefined;\n this.#data.rawValue = undefined;\n return this;\n }\n\n if (typeof value === 'string') {\n const idx = this.#sharedStrings.addOrGet(value);\n this.#data.dataType = 's';\n this.#data.rawValue = String(idx);\n return this;\n }\n\n if (typeof value === 'boolean') {\n this.#data.dataType = 'b';\n this.#data.rawValue = value ? '1' : '0';\n return this;\n }\n\n if (value instanceof Date) {\n this.#data.dataType = 'n';\n this.#data.rawValue = String(toOADate(value));\n // Apply short date format if no format already set\n if (this.#data.styleIndex === 0) {\n const style = new CellStyle();\n style.setNumberFormat(ExcelNumberFormat.shortDate);\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(style);\n }\n return this;\n }\n\n // number\n this.#data.dataType = 'n';\n this.#data.rawValue = String(value);\n return this;\n }\n\n /**\n * Gets the typed cell value.\n * Returns string | number | boolean | Date | null.\n * Date detection is based on the cell's number format.\n */\n getValue(): CellValue {\n if (this.#data.rawValue === undefined || this.#data.rawValue === '') return null;\n\n switch (this.#data.dataType) {\n case 's': {\n const idx = parseInt(this.#data.rawValue, 10);\n return this.#sharedStrings.tryGetString(idx) ?? this.#data.rawValue;\n }\n case 'b':\n return this.#data.rawValue === '1';\n case 'str':\n return this.#data.rawValue;\n default: {\n // Number or untyped — try to parse as a number\n const num = parseFloat(this.#data.rawValue);\n if (isNaN(num)) return this.#data.rawValue;\n\n // Check if this cell has a date format\n if (this.#isDateStyle()) {\n try { return fromOADate(num); } catch { return num; }\n }\n return num;\n }\n }\n }\n\n /**\n * Returns the display text of the cell value (always a string).\n */\n getText(): string {\n const val = this.getValue();\n if (val === null) return '';\n if (val instanceof Date) return val.toLocaleDateString();\n return String(val);\n }\n\n // ── Formula API ────────────────────────────────────────────────────────────\n\n /**\n * Sets a formula. The leading '=' is optional.\n * Clears any cached value.\n */\n setFormula(formula: string): this {\n if (!formula) throw new Error('Formula cannot be empty.');\n this.#data.formula = formula.startsWith('=') ? formula.slice(1) : formula;\n this.#data.rawValue = undefined; // cached value cleared; will be set after recalc\n this.#data.dataType = undefined;\n return this;\n }\n\n /** Returns the formula text (without leading '='), or null if no formula. */\n getFormula(): string | null {\n return this.#data.formula ?? null;\n }\n\n /** True if this cell contains a formula. */\n get hasFormula(): boolean {\n return this.#data.formula !== undefined && this.#data.formula !== '';\n }\n\n // ── Style API ──────────────────────────────────────────────────────────────\n\n /** Gets the current CellStyle. Returns a new CellStyle if no style is set. */\n get style(): CellStyle {\n return this.#styles.getCellStyle(this.#data.styleIndex);\n }\n\n /** Replaces the entire cell style. */\n set style(value: CellStyle) {\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(value);\n }\n\n /**\n * Applies style changes via a callback on the current style.\n * Returns this for chaining.\n *\n * @example\n * cell.applyStyle(s => s.setBold(true).setFontColor(ExcelColor.red))\n */\n applyStyle(action: (style: CellStyle) => void): this {\n const s = this.#styles.getCellStyle(this.#data.styleIndex).clone();\n action(s);\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(s);\n return this;\n }\n\n // Convenience style shortcuts (mirror Cell.cs methods)\n\n setBold(bold = true): this { return this.applyStyle(s => s.setBold(bold)); }\n setItalic(italic = true): this { return this.applyStyle(s => s.setItalic(italic)); }\n setFontSize(size: number): this { return this.applyStyle(s => s.setFontSize(size)); }\n setFontColor(color: ExcelColor | string): this { return this.applyStyle(s => s.setFontColor(color as ExcelColor)); }\n setFontName(name: string): this { return this.applyStyle(s => s.setFontName(name)); }\n setBackgroundColor(color: ExcelColor | string): this{ return this.applyStyle(s => s.setBackgroundColor(color as ExcelColor)); }\n setWrapText(wrap = true): this { return this.applyStyle(s => s.setWrapText(wrap)); }\n setHorizontalAlignment(a: ExcelHorizontalAlignment): this { return this.applyStyle(s => s.setHorizontalAlignment(a)); }\n setVerticalAlignment(a: ExcelVerticalAlignment): this { return this.applyStyle(s => s.setVerticalAlignment(a)); }\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this { return this.applyStyle(s => s.setAllBorders(style, color)); }\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n return this.applyStyle(s => s.setNumberFormat(formatOrCode as ExcelNumberFormat));\n }\n\n // ── Clear ──────────────────────────────────────────────────────────────────\n\n /** Clears the cell value and formula, preserving style. */\n clear(): void {\n this.#data.rawValue = undefined;\n this.#data.dataType = undefined;\n this.#data.formula = undefined;\n }\n\n /** Clears the cell value, formula, AND style. */\n clearAll(): void {\n this.clear();\n this.#data.styleIndex = 0;\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** @internal Builds the <c> XML element string for this cell. */\n toXml(): string {\n const ref = this.#data.reference;\n const style = this.#data.styleIndex > 0 ? ` s=\"${this.#data.styleIndex}\"` : '';\n const type = this.#data.dataType ? ` t=\"${this.#data.dataType}\"` : '';\n\n const formulaXml = this.#data.formula\n ? `<f>${escXml(this.#data.formula)}</f>`\n : '';\n\n const valueXml =\n this.#data.rawValue !== undefined && this.#data.rawValue !== ''\n ? `<v>${escXml(this.#data.rawValue)}</v>`\n : '';\n\n if (!formulaXml && !valueXml && this.#data.styleIndex === 0) return '';\n\n return `<c r=\"${ref}\"${style}${type}>${formulaXml}${valueXml}</c>`;\n }\n\n /** @internal Parses a <c> XML element into CellData. */\n static fromXmlElement(\n el: { attributes: Record<string, string>; children: Array<{ tagName: string; textContent: string }> },\n ref: string,\n ): CellData {\n const dataType = (el.attributes['t'] ?? undefined) as CellData['dataType'];\n const styleIndex = parseInt(el.attributes['s'] ?? '0', 10);\n\n let rawValue: string | undefined;\n let formula: string | undefined;\n\n for (const child of el.children) {\n const tag = child.tagName.replace(/^.*:/, '');\n if (tag === 'v') rawValue = child.textContent;\n if (tag === 'f') formula = child.textContent;\n }\n\n return { reference: ref, dataType, rawValue, formula, styleIndex };\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n #isDateStyle(): boolean {\n const style = this.#styles.getCellStyle(this.#data.styleIndex);\n if (!style.numberFormat) return false;\n if (isDateFormatId(style.numberFormat.formatId)) return true;\n return isDateFormatCode(style.numberFormat.formatCode);\n }\n}\n\nfunction escXml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n","/**\n * Represents a rectangular range of cells for bulk operations.\n * Port of TVE.PureDocs.Excel.Range (C#)\n */\nimport type { Worksheet } from './worksheet.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport { parseRangeRef, cellRefFromRowCol } from './cell-reference.js';\nimport type { CellValue } from './cell.js';\n\nexport class Range {\n readonly #sheet: Worksheet;\n readonly #startRow: number;\n readonly #startColumn: number;\n readonly #endRow: number;\n readonly #endColumn: number;\n readonly #address: string;\n\n constructor(sheet: Worksheet, rangeReference: string) {\n this.#sheet = sheet;\n this.#address = rangeReference.toUpperCase();\n const { startRow, startColumn, endRow, endColumn } = parseRangeRef(rangeReference);\n this.#startRow = startRow;\n this.#startColumn = startColumn;\n this.#endRow = endRow;\n this.#endColumn = endColumn;\n }\n\n /** The range address e.g. \"A1:B10\". */\n get address(): string { return this.#address; }\n\n /** Number of rows in the range. */\n get rowCount(): number { return this.#endRow - this.#startRow + 1; }\n\n /** Number of columns in the range. */\n get columnCount(): number { return this.#endColumn - this.#startColumn + 1; }\n\n // ── Value bulk operations ──────────────────────────────────────────────────\n\n /**\n * Sets values from a 2D array.\n * Values that exceed the range boundary are silently ignored.\n */\n setValues(values: CellValue[][]): void {\n for (let r = 0; r < values.length && this.#startRow + r <= this.#endRow; r++) {\n const rowValues = values[r]!;\n for (let c = 0; c < rowValues.length && this.#startColumn + c <= this.#endColumn; c++) {\n const cell = this.#sheet.getCell(this.#startRow + r, this.#startColumn + c);\n const val = rowValues[c]!;\n cell.setValue(val as never);\n }\n }\n }\n\n /**\n * Gets all cell values as a 2D array (row-major order).\n */\n getValues(): CellValue[][] {\n const result: CellValue[][] = [];\n for (let r = 0; r < this.rowCount; r++) {\n const row: CellValue[] = [];\n for (let c = 0; c < this.columnCount; c++) {\n const cell = this.#sheet.tryGetCell(this.#startRow + r, this.#startColumn + c);\n row.push(cell ? cell.getValue() : null);\n }\n result.push(row);\n }\n return result;\n }\n\n /** Clears all cells in the range (values only, preserves style). */\n clear(): void {\n this.#forEach(cell => cell.clear());\n }\n\n /** Auto-fits all columns in the range. */\n autoFit(): void {\n for (let col = this.#startColumn; col <= this.#endColumn; col++) {\n this.#sheet.autoFitColumn(col);\n }\n }\n\n // ── Style bulk operations ──────────────────────────────────────────────────\n\n /** Applies a CellStyle to all cells in the range. Returns this for chaining. */\n setStyle(style: CellStyle): this {\n this.#forEach(cell => { cell.style = style; });\n return this;\n }\n\n /**\n * Applies style changes to all cells in the range.\n * @example range.applyStyle(s => s.setBold(true).setBackgroundColor(ExcelColor.lightGray))\n */\n applyStyle(action: (style: CellStyle) => void): this {\n this.#forEach(cell => cell.applyStyle(action));\n return this;\n }\n\n setBold(bold = true): this {\n this.#forEach(cell => cell.setBold(bold));\n return this;\n }\n\n setFontSize(size: number): this {\n this.#forEach(cell => cell.setFontSize(size));\n return this;\n }\n\n setFontColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setFontColor(color as ExcelColor));\n return this;\n }\n\n setFontName(name: string): this {\n this.#forEach(cell => cell.setFontName(name));\n return this;\n }\n\n setBackgroundColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setBackgroundColor(color as ExcelColor));\n return this;\n }\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#forEach(cell => cell.setAllBorders(style, color));\n return this;\n }\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#forEach(cell => cell.setHorizontalAlignment(alignment));\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#forEach(cell => cell.setVerticalAlignment(alignment));\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#forEach(cell => cell.setWrapText(wrap));\n return this;\n }\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.#forEach(cell => cell.setNumberFormat(formatOrCode as ExcelNumberFormat));\n return this;\n }\n\n // ── Private helper ─────────────────────────────────────────────────────────\n\n #forEach(action: (cell: ReturnType<Worksheet['getCell']>) => void): void {\n for (let r = this.#startRow; r <= this.#endRow; r++) {\n for (let c = this.#startColumn; c <= this.#endColumn; c++) {\n action(this.#sheet.getCell(r, c));\n }\n }\n }\n}\n","/**\n * Represents a worksheet in an Excel workbook.\n * Port of TVE.PureDocs.Excel.Worksheet (C#)\n *\n * Key differences from C#:\n * - All public methods camelCase\n * - XML parsed/serialised directly — no OpenXml SDK\n * - No CalcChain yet (added later via @devmm/puredocs-excel-formula)\n */\nimport { Cell, CellData } from './cell.js';\nimport { SharedStringManager } from './shared-string-manager.js';\nimport { StyleManager } from '../style/style-manager.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport { parseCellRef, cellRefFromRowCol, parseRangeRef } from './cell-reference.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\nimport { WORKSHEET_DRAWING_REL_ID, type DrawingProvider } from '../io/drawing-part.js';\nimport { Range } from './range.js';\n\n// Internal row representation\ninterface RowData {\n rowIndex: number;\n height?: number;\n customHeight?: boolean;\n cells: Map<string, CellData>; // ref → CellData\n}\n\n// Internal column definition\ninterface ColDef {\n min: number;\n max: number;\n width: number;\n customWidth: boolean;\n hidden?: boolean;\n}\n\n// Merge cell reference\ninterface MergeCell {\n ref: string; // e.g. \"A1:B2\"\n}\n\n// Freeze pane settings\ninterface PaneSettings {\n row: number; // rows to freeze\n column: number; // columns to freeze\n}\n\n// Auto filter\ninterface AutoFilter {\n ref: string;\n}\n\n// Data validation\ninterface DataValidation {\n sqref: string;\n formula: string;\n}\n\nexport type SheetVisibility = 'visible' | 'hidden' | 'veryHidden';\n\nexport class Worksheet {\n readonly #sharedStrings: SharedStringManager;\n readonly #styles: StyleManager;\n\n #name: string;\n #rows: Map<number, RowData> = new Map();\n #cols: ColDef[] = [];\n #mergeCells: MergeCell[] = [];\n #pane?: PaneSettings;\n #autoFilter?: AutoFilter;\n #dataValidations: DataValidation[] = [];\n #visibility: SheetVisibility = 'visible';\n #drawings: DrawingProvider[] = [];\n\n /** @internal */\n constructor(name: string, sharedStrings: SharedStringManager, styles: StyleManager) {\n this.#name = name;\n this.#sharedStrings = sharedStrings;\n this.#styles = styles;\n }\n\n // ── Identity ───────────────────────────────────────────────────────────────\n\n get name(): string { return this.#name; }\n set name(value: string) {\n if (!value) throw new Error('Worksheet name cannot be empty.');\n this.#name = value;\n }\n\n // ── Cell access ────────────────────────────────────────────────────────────\n\n /**\n * Gets (or creates) a cell by reference string (e.g. \"A1\") or 1-based row/col.\n * Creates the row/cell if it doesn't exist.\n */\n getCell(reference: string): Cell;\n getCell(row: number, column: number): Cell;\n getCell(refOrRow: string | number, column?: number): Cell {\n const ref = typeof refOrRow === 'string'\n ? refOrRow.replace(/\\$/g, '').toUpperCase()\n : cellRefFromRowCol(refOrRow, column!);\n\n const { row } = parseCellRef(ref);\n const rowData = this.#getOrCreateRow(row);\n let cellData = rowData.cells.get(ref);\n if (!cellData) {\n cellData = { reference: ref, styleIndex: 0 };\n rowData.cells.set(ref, cellData);\n }\n return new Cell(cellData, this.#sharedStrings, this.#styles);\n }\n\n /**\n * Returns a Cell if it exists, or null if the row/cell has not been created.\n * Does NOT create a new cell (read-only access).\n */\n tryGetCell(reference: string): Cell | null;\n tryGetCell(row: number, column: number): Cell | null;\n tryGetCell(refOrRow: string | number, column?: number): Cell | null {\n const ref = typeof refOrRow === 'string'\n ? refOrRow.replace(/\\$/g, '').toUpperCase()\n : cellRefFromRowCol(refOrRow, column!);\n\n const { row } = parseCellRef(ref);\n const rowData = this.#rows.get(row);\n if (!rowData) return null;\n const cellData = rowData.cells.get(ref);\n if (!cellData) return null;\n return new Cell(cellData, this.#sharedStrings, this.#styles);\n }\n\n /** Shorthand indexer — sheet.cell(\"A1\") or sheet.cell(1, 1). */\n cell(reference: string): Cell;\n cell(row: number, column: number): Cell;\n cell(refOrRow: string | number, column?: number): Cell {\n return typeof refOrRow === 'string'\n ? this.getCell(refOrRow)\n : this.getCell(refOrRow, column!);\n }\n\n /** Gets a Range object for bulk operations. */\n getRange(rangeReference: string): Range {\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\n return new Range(this, rangeReference);\n }\n\n /** Gets the raw value of a cell (for formula evaluation). */\n getCellValue(reference: string): unknown {\n return this.tryGetCell(reference)?.getValue() ?? null;\n }\n\n /**\n * Returns the 1-based extent of populated cells (largest row and column that\n * contain data). Returns zeros for an empty sheet. Useful for snapshotting a\n * sheet into a dense 2D array.\n */\n get usedBounds(): { rowCount: number; columnCount: number } {\n let rowCount = 0;\n let columnCount = 0;\n for (const row of this.#rows.values()) {\n if (row.cells.size === 0) continue;\n if (row.rowIndex > rowCount) rowCount = row.rowIndex;\n for (const ref of row.cells.keys()) {\n const col = parseCellRef(ref).column;\n if (col > columnCount) columnCount = col;\n }\n }\n return { rowCount, columnCount };\n }\n\n // ── Layout ─────────────────────────────────────────────────────────────────\n\n /** Sets the width of a column (1-based index). */\n setColumnWidth(columnIndex: number, width: number): void {\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\n if (width <= 0) throw new RangeError('Width must be > 0.');\n\n // Remove existing definition for this column\n this.#cols = this.#cols.filter(c => !(c.min <= columnIndex && c.max >= columnIndex));\n this.#cols.push({ min: columnIndex, max: columnIndex, width, customWidth: true });\n this.#cols.sort((a, b) => a.min - b.min);\n }\n\n /** Auto-fits column width based on content (approximate). */\n autoFitColumn(columnIndex: number): void {\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\n\n let maxLen = 8; // minimum\n for (const row of this.#rows.values()) {\n const ref = cellRefFromRowCol(row.rowIndex, columnIndex);\n const cellData = row.cells.get(ref);\n if (cellData) {\n const cell = new Cell(cellData, this.#sharedStrings, this.#styles);\n const textLen = cell.getText().length;\n if (textLen > maxLen) maxLen = textLen;\n }\n }\n // Approximate: character width * 1.2 + 2 padding, capped at 255\n this.setColumnWidth(columnIndex, Math.min(maxLen * 1.2 + 2, 255));\n }\n\n /** Sets the height of a row (1-based index). */\n setRowHeight(rowIndex: number, height: number): void {\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\n if (height <= 0) throw new RangeError('Height must be > 0.');\n const row = this.#getOrCreateRow(rowIndex);\n row.height = height;\n row.customHeight = true;\n }\n\n /** Merges cells in the given range (e.g. \"A1:B2\"). */\n mergeCells(rangeReference: string): void {\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\n this.#mergeCells.push({ ref: rangeReference });\n }\n\n /** Removes a merge for the given range reference. */\n unmergeCells(rangeReference: string): void {\n this.#mergeCells = this.#mergeCells.filter(m => m.ref !== rangeReference);\n }\n\n /**\n * Freezes rows and/or columns.\n * @param row Number of rows to freeze (0 = none)\n * @param column Number of columns to freeze (0 = none)\n */\n freezePanes(row: number, column: number): void {\n if (row < 0) throw new RangeError('Row must be >= 0.');\n if (column < 0) throw new RangeError('Column must be >= 0.');\n this.#pane = (row === 0 && column === 0) ? undefined : { row, column };\n }\n\n /** Sets auto-filter on the given range. */\n setAutoFilter(rangeReference: string): void {\n this.#autoFilter = { ref: rangeReference };\n }\n\n /**\n * Adds a dropdown data validation to a cell range.\n * @param cellRange Range to apply (e.g. \"F2:F1000\")\n * @param listFormula Formula for the dropdown list (e.g. \"'Sheet2'!$A$1:$A$10\")\n */\n addDropdownValidation(cellRange: string, listFormula: string): void {\n this.#dataValidations.push({ sqref: cellRange, formula: listFormula });\n }\n\n /** Sets the visibility state of this worksheet. */\n setVisibility(state: SheetVisibility): void {\n this.#visibility = state;\n }\n\n get visibility(): SheetVisibility { return this.#visibility; }\n\n // ── Drawings (charts, images …) ──────────────────────────────────────────────\n\n /**\n * Attaches a drawing provider (e.g. a chart) to this worksheet.\n * Satellite packages such as `@devmm/puredocs-excel-charts` call this; the core\n * save pipeline turns registered providers into valid OOXML drawing/chart parts.\n */\n addDrawingProvider(provider: DrawingProvider): void {\n this.#drawings.push(provider);\n }\n\n /** True when this worksheet has at least one drawing to serialise. */\n get hasDrawings(): boolean { return this.#drawings.length > 0; }\n\n /** @internal — drawing providers, consumed by the save pipeline. */\n get drawingProviders(): readonly DrawingProvider[] { return this.#drawings; }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** Builds the xl/worksheets/sheetN.xml string. */\n buildXml(): string {\n const colsXml = this.#buildColsXml();\n const sheetDataXml = this.#buildSheetDataXml();\n const mergeXml = this.#buildMergeCellsXml();\n const filterXml = this.#autoFilter ? `<autoFilter ref=\"${this.#autoFilter.ref}\"/>` : '';\n const validXml = this.#buildDataValidationsXml();\n const sheetViewXml = this.#buildSheetViewXml();\n // <drawing> must be the last child of <worksheet> per the CT_Worksheet schema.\n const drawingXml = this.hasDrawings ? `<drawing r:id=\"${WORKSHEET_DRAWING_REL_ID}\"/>` : '';\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <sheetViews>${sheetViewXml}</sheetViews>\n${colsXml}${sheetDataXml}${filterXml}${mergeXml}${validXml}${drawingXml}\n</worksheet>`;\n }\n\n /** Parses xl/worksheets/sheetN.xml and loads cells into memory. */\n loadFromXml(xml: string): void {\n this.#rows.clear();\n this.#cols = [];\n this.#mergeCells = [];\n this.#pane = undefined;\n this.#autoFilter = undefined;\n this.#dataValidations = [];\n\n const root = parseXml(xml);\n\n // Columns\n for (const colEl of getElementsByTagName(root, 'col')) {\n this.#cols.push({\n min: parseInt(getAttr(colEl, 'min') ?? '1', 10),\n max: parseInt(getAttr(colEl, 'max') ?? '1', 10),\n width: parseFloat(getAttr(colEl, 'width') ?? '8'),\n customWidth: getAttr(colEl, 'customWidth') === '1',\n hidden: getAttr(colEl, 'hidden') === '1',\n });\n }\n\n // Sheet data (rows and cells)\n for (const rowEl of getElementsByTagName(root, 'row')) {\n const rowIndex = parseInt(getAttr(rowEl, 'r') ?? '0', 10);\n if (rowIndex < 1) continue;\n\n const rowData: RowData = { rowIndex, cells: new Map() };\n\n const ht = getAttr(rowEl, 'ht');\n if (ht) { rowData.height = parseFloat(ht); rowData.customHeight = true; }\n\n for (const cellEl of rowEl.children) {\n const tag = cellEl.tagName.replace(/^.*:/, '');\n if (tag !== 'c') continue;\n const ref = getAttr(cellEl, 'r');\n if (!ref) continue;\n const cellData = Cell.fromXmlElement(\n { attributes: cellEl.attributes, children: cellEl.children as Parameters<typeof Cell.fromXmlElement>[0]['children'] },\n ref.toUpperCase(),\n );\n rowData.cells.set(ref.toUpperCase(), cellData);\n }\n\n this.#rows.set(rowIndex, rowData);\n }\n\n // Merge cells\n for (const mcEl of getElementsByTagName(root, 'mergeCell')) {\n const ref = getAttr(mcEl, 'ref');\n if (ref) this.#mergeCells.push({ ref });\n }\n\n // Auto filter\n const afEls = getElementsByTagName(root, 'autoFilter');\n if (afEls.length > 0) {\n const ref = getAttr(afEls[0]!, 'ref');\n if (ref) this.#autoFilter = { ref };\n }\n\n // Freeze pane\n for (const paneEl of getElementsByTagName(root, 'pane')) {\n const state = getAttr(paneEl, 'state');\n if (state === 'frozen' || state === 'frozenSplit') {\n this.#pane = {\n row: parseInt(getAttr(paneEl, 'ySplit') ?? '0', 10),\n column: parseInt(getAttr(paneEl, 'xSplit') ?? '0', 10),\n };\n }\n }\n\n // Data validations\n for (const dvEl of getElementsByTagName(root, 'dataValidation')) {\n const sqref = getAttr(dvEl, 'sqref') ?? '';\n const f1Els = getElementsByTagName(dvEl, 'formula1');\n const formula = f1Els[0]?.textContent ?? '';\n if (sqref && formula) this.#dataValidations.push({ sqref, formula });\n }\n }\n\n // ── Private XML builders ───────────────────────────────────────────────────\n\n #buildColsXml(): string {\n if (this.#cols.length === 0) return '';\n const inner = this.#cols\n .map(c => {\n const hidden = c.hidden ? ' hidden=\"1\"' : '';\n return `<col min=\"${c.min}\" max=\"${c.max}\" width=\"${c.width.toFixed(2)}\" customWidth=\"${c.customWidth ? 1 : 0}\"${hidden}/>`;\n })\n .join('');\n return `<cols>${inner}</cols>`;\n }\n\n #buildSheetDataXml(): string {\n const sortedRows = [...this.#rows.values()].sort((a, b) => a.rowIndex - b.rowIndex);\n if (sortedRows.length === 0) return '<sheetData/>';\n\n const rowsXml = sortedRows.map(row => {\n const ht = row.height !== undefined && row.customHeight\n ? ` ht=\"${row.height}\" customHeight=\"1\"`\n : '';\n\n const sortedCells = [...row.cells.values()].sort((a, b) => {\n const ra = parseCellRef(a.reference);\n const rb = parseCellRef(b.reference);\n return ra.column - rb.column;\n });\n\n const cellsXml = sortedCells\n .map(cd => new Cell(cd, this.#sharedStrings, this.#styles).toXml())\n .filter(Boolean)\n .join('');\n\n if (!cellsXml && !ht) return '';\n return `<row r=\"${row.rowIndex}\"${ht}>${cellsXml}</row>`;\n }).filter(Boolean).join('');\n\n return `<sheetData>${rowsXml}</sheetData>`;\n }\n\n #buildMergeCellsXml(): string {\n if (this.#mergeCells.length === 0) return '';\n const inner = this.#mergeCells.map(m => `<mergeCell ref=\"${m.ref}\"/>`).join('');\n return `<mergeCells count=\"${this.#mergeCells.length}\">${inner}</mergeCells>`;\n }\n\n #buildDataValidationsXml(): string {\n if (this.#dataValidations.length === 0) return '';\n const inner = this.#dataValidations\n .map(dv =>\n `<dataValidation type=\"list\" allowBlank=\"1\" showInputMessage=\"1\" showErrorMessage=\"1\" sqref=\"${dv.sqref}\"><formula1>${escXml(dv.formula)}</formula1></dataValidation>`,\n )\n .join('');\n return `<dataValidations count=\"${this.#dataValidations.length}\">${inner}</dataValidations>`;\n }\n\n #buildSheetViewXml(): string {\n if (!this.#pane) return '<sheetView workbookViewId=\"0\"/>';\n\n const { row, column } = this.#pane;\n const topLeftRow = row > 0 ? row + 1 : 1;\n const topLeftCol = column > 0 ? column + 1 : 1;\n const topLeft = cellRefFromRowCol(topLeftRow, topLeftCol);\n\n const activePane = row > 0 && column > 0 ? 'bottomRight'\n : row > 0 ? 'bottomLeft' : 'topRight';\n\n const xSplit = column > 0 ? ` xSplit=\"${column}\"` : '';\n const ySplit = row > 0 ? ` ySplit=\"${row}\"` : '';\n\n return `<sheetView workbookViewId=\"0\"><pane${xSplit}${ySplit} topLeftCell=\"${topLeft}\" activePane=\"${activePane}\" state=\"frozen\"/></sheetView>`;\n }\n\n #getOrCreateRow(rowIndex: number): RowData {\n let row = this.#rows.get(rowIndex);\n if (!row) {\n row = { rowIndex, cells: new Map() };\n this.#rows.set(rowIndex, row);\n }\n return row;\n }\n}\n\nfunction escXml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n","/**\n * Main entry point for the @devmm/puredocs-excel library.\n * Port of TVE.PureDocs.Excel.Workbook (C#)\n *\n * Key differences from C#:\n * - All factory methods are async (file I/O)\n * - saveAsBuffer() returns Uint8Array instead of MemoryStream\n * - saveToFile() is Node.js only\n * - No IDisposable — call close() or use Symbol.dispose\n * - WorksheetCollection replaced by a simple managed array\n */\nimport { unzipXlsx, readXmlEntry, requireXmlEntry } from '../io/zip-reader.js';\nimport { zipXlsx, type ZipInput } from '../io/zip-writer.js';\nimport {\n buildContentTypes,\n ROOT_RELS,\n buildWorkbookRels,\n buildWorkbookXml,\n buildSharedStringsXml,\n DEFAULT_STYLES_XML,\n EMPTY_WORKSHEET_XML,\n type SheetMeta,\n} from '../io/ooxml-templates.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\nimport { REL_TYPES, CONTENT_TYPES } from '../io/xml-builder.js';\nimport {\n buildDrawingXml,\n buildRelsXml,\n WORKSHEET_DRAWING_REL_ID,\n} from '../io/drawing-part.js';\nimport { SharedStringManager } from './shared-string-manager.js';\nimport { StyleManager } from '../style/style-manager.js';\nimport { Worksheet } from './worksheet.js';\n\ninterface SheetEntry {\n worksheet: Worksheet;\n sheetId: number;\n relId: string; // e.g. \"rId1\"\n}\n\nexport class Workbook {\n readonly #sharedStrings: SharedStringManager;\n readonly #styles: StyleManager;\n readonly #sheets: SheetEntry[] = [];\n #closed = false;\n\n private constructor(\n sharedStrings: SharedStringManager,\n styles: StyleManager,\n ) {\n this.#sharedStrings = sharedStrings;\n this.#styles = styles;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a new empty workbook.\n * Mirrors Workbook.Create() in C#.\n */\n static create(): Workbook {\n const ss = new SharedStringManager();\n const sm = new StyleManager();\n return new Workbook(ss, sm);\n }\n\n /**\n * Opens an existing workbook from a binary buffer (ArrayBuffer or Uint8Array).\n * Works in both browser and Node.js.\n * Mirrors Workbook.Open(stream) in C#.\n */\n static fromBuffer(buffer: ArrayBuffer | Uint8Array): Workbook {\n const entries = unzipXlsx(buffer);\n const ss = new SharedStringManager();\n const sm = new StyleManager();\n const wb = new Workbook(ss, sm);\n\n // Load shared strings\n const ssXml = readXmlEntry(entries, 'xl/sharedStrings.xml');\n if (ssXml) ss.loadFromXml(ssXml);\n\n // Load styles\n const stylesXml = readXmlEntry(entries, 'xl/styles.xml');\n if (stylesXml) sm.loadFromXml(stylesXml);\n\n // Parse workbook.xml to get sheet names and relationship IDs\n const wbXml = requireXmlEntry(entries, 'xl/workbook.xml');\n const wbRoot = parseXml(wbXml);\n\n for (const sheetEl of getElementsByTagName(wbRoot, 'sheet')) {\n const name = getAttr(sheetEl, 'name') ?? 'Sheet';\n const sheetId = parseInt(getAttr(sheetEl, 'sheetId') ?? '1', 10);\n const relId = getAttr(sheetEl, 'r:id') ?? getAttr(sheetEl, 'id') ?? `rId${sheetId}`;\n const state = getAttr(sheetEl, 'state') as Worksheet['visibility'] | undefined;\n\n // Find worksheet XML path from workbook rels\n const relXml = readXmlEntry(entries, 'xl/_rels/workbook.xml.rels') ?? '';\n const wsPath = resolveWorksheetPath(relXml, relId);\n const wsXml = wsPath ? (readXmlEntry(entries, wsPath) ?? EMPTY_WORKSHEET_XML) : EMPTY_WORKSHEET_XML;\n\n const ws = new Worksheet(name, ss, sm);\n if (state) ws.setVisibility(state);\n ws.loadFromXml(wsXml);\n\n wb.#sheets.push({ worksheet: ws, sheetId, relId });\n }\n\n return wb;\n }\n\n /**\n * Opens an existing workbook from a file path (Node.js only).\n * Mirrors Workbook.Open(filePath) in C#.\n */\n static async fromFile(filePath: string): Promise<Workbook> {\n // Dynamic import so the library doesn't break in browser environments\n const fs = await import('node:fs/promises');\n const buffer = await fs.readFile(filePath);\n return Workbook.fromBuffer(buffer);\n }\n\n // ── Worksheet management ───────────────────────────────────────────────────\n\n /**\n * Collection of worksheets (read-only array view).\n * Access by index: workbook.worksheets[0]\n * Access by name: workbook.worksheets.find(s => s.name === 'Sheet1')\n */\n get worksheets(): readonly Worksheet[] {\n return this.#sheets.map(e => e.worksheet);\n }\n\n /**\n * Adds a new worksheet with the given name and returns it.\n * Mirrors workbook.AddWorksheet(name) in C#.\n */\n addWorksheet(name: string): Worksheet {\n this.#assertOpen();\n if (!name) throw new Error('Worksheet name cannot be empty.');\n if (this.#sheets.some(e => e.worksheet.name === name)) {\n throw new Error(`Worksheet \"${name}\" already exists.`);\n }\n\n const sheetId = this.#sheets.length + 1;\n const relId = `rId${sheetId}`;\n const ws = new Worksheet(name, this.#sharedStrings, this.#styles);\n this.#sheets.push({ worksheet: ws, sheetId, relId });\n return ws;\n }\n\n /**\n * Returns a worksheet by name. Throws if not found.\n */\n getWorksheet(name: string): Worksheet {\n const entry = this.#sheets.find(e => e.worksheet.name === name);\n if (!entry) throw new Error(`Worksheet \"${name}\" not found.`);\n return entry.worksheet;\n }\n\n // ── Serialisation ──────────────────────────────────────────────────────────\n\n /**\n * Serialises the workbook to a Uint8Array (xlsx binary).\n * Mirrors workbook.SaveAs(stream) in C#.\n * Works in browser and Node.js.\n */\n saveAsBuffer(): Uint8Array {\n this.#assertOpen();\n const entries = this.#buildZipEntries();\n return zipXlsx(entries);\n }\n\n /**\n * Saves the workbook to a file (Node.js only).\n * Mirrors workbook.SaveAs(filePath) in C#.\n */\n async saveToFile(filePath: string): Promise<void> {\n this.#assertOpen();\n const buffer = this.saveAsBuffer();\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(filePath, buffer);\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────────────\n\n /** Releases resources. The workbook should not be used after this call. */\n close(): void { this.#closed = true; }\n\n /** Symbol.dispose support for `using` keyword (TypeScript 5.2+). */\n [Symbol.dispose](): void { this.close(); }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n #assertOpen(): void {\n if (this.#closed) throw new Error('Workbook has been closed.');\n }\n\n #buildZipEntries(): ZipInput {\n const entries = new Map<string, string>();\n\n const sheetCount = this.#sheets.length;\n\n // _rels/.rels\n entries.set('_rels/.rels', ROOT_RELS);\n\n // Build sheet metadata for workbook.xml\n const sheetMetas: SheetMeta[] = this.#sheets.map(e => ({\n name: e.worksheet.name,\n sheetId: e.sheetId,\n relationshipId: e.relId,\n state: e.worksheet.visibility !== 'visible' ? e.worksheet.visibility : undefined,\n }));\n\n // xl/workbook.xml\n entries.set('xl/workbook.xml', buildWorkbookXml(sheetMetas));\n\n // xl/_rels/workbook.xml.rels\n entries.set('xl/_rels/workbook.xml.rels', buildWorkbookRels(sheetCount));\n\n // xl/styles.xml\n entries.set('xl/styles.xml', this.#styles.buildStylesXml());\n\n // xl/sharedStrings.xml\n entries.set('xl/sharedStrings.xml', this.#sharedStrings.buildXml());\n\n // xl/worksheets/sheetN.xml\n for (let i = 0; i < this.#sheets.length; i++) {\n entries.set(`xl/worksheets/sheet${i + 1}.xml`, this.#sheets[i]!.worksheet.buildXml());\n }\n\n // Drawings & their dependent parts (charts, images …).\n // Each worksheet with providers gets ONE drawing part aggregating all anchors;\n // every provider contributes one dependent part referenced from the drawing rels.\n const extraOverrides: Array<{ partName: string; contentType: string }> = [];\n let drawingCounter = 0;\n let partCounter = 0;\n\n for (let i = 0; i < this.#sheets.length; i++) {\n const ws = this.#sheets[i]!.worksheet;\n if (!ws.hasDrawings) continue;\n\n drawingCounter++;\n const drawingPath = `xl/drawings/drawing${drawingCounter}.xml`;\n const anchors: string[] = [];\n const drawingRels: string[] = [];\n\n ws.drawingProviders.forEach((provider, idx) => {\n const relId = `rId${idx + 1}`;\n anchors.push(provider.buildAnchorXml(relId));\n\n partCounter++;\n const part = provider.buildPart(partCounter);\n entries.set(part.path, part.content);\n extraOverrides.push({ partName: `/${part.path}`, contentType: part.contentType });\n\n // Rel target is relative to xl/drawings/ (all parts live under xl/).\n const target = `../${part.path.slice('xl/'.length)}`;\n drawingRels.push(\n ` <Relationship Id=\"${relId}\" Type=\"${part.relType}\" Target=\"${target}\"/>`,\n );\n });\n\n // xl/drawings/drawingN.xml + its rels\n entries.set(drawingPath, buildDrawingXml(anchors.join('')));\n entries.set(`xl/drawings/_rels/drawing${drawingCounter}.xml.rels`, buildRelsXml(drawingRels));\n extraOverrides.push({ partName: `/${drawingPath}`, contentType: CONTENT_TYPES.drawing });\n\n // xl/worksheets/_rels/sheetN.xml.rels → the drawing part\n entries.set(\n `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\n buildRelsXml([\n ` <Relationship Id=\"${WORKSHEET_DRAWING_REL_ID}\" Type=\"${REL_TYPES.drawing}\" Target=\"../drawings/drawing${drawingCounter}.xml\"/>`,\n ]),\n );\n }\n\n // [Content_Types].xml — written last so drawing/chart overrides are included.\n entries.set('[Content_Types].xml', buildContentTypes(sheetCount, extraOverrides));\n\n return entries;\n }\n}\n\n/**\n * Resolves the worksheet file path from workbook.xml.rels by relationship ID.\n * Returns path relative to xl/ e.g. \"xl/worksheets/sheet1.xml\".\n */\nfunction resolveWorksheetPath(relsXml: string, relId: string): string | undefined {\n if (!relsXml) return undefined;\n try {\n const root = parseXml(relsXml);\n for (const el of getElementsByTagName(root, 'Relationship')) {\n if (getAttr(el, 'Id') === relId) {\n const target = getAttr(el, 'Target') ?? '';\n // Target is relative to xl/, so \"worksheets/sheet1.xml\" → \"xl/worksheets/sheet1.xml\"\n return target.startsWith('xl/') ? target : `xl/${target}`;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/io/xml-parser.ts","../src/io/zip-reader.ts","../src/io/zip-writer.ts","../src/io/xml-builder.ts","../src/io/ooxml-templates.ts","../src/io/drawing-part.ts","../src/model/shared-string-manager.ts","../src/style/excel-color.ts","../src/style/excel-font.ts","../src/style/excel-fill.ts","../src/style/excel-border.ts","../src/style/excel-alignment.ts","../src/style/excel-number-format.ts","../src/style/cell-style.ts","../src/style/style-manager.ts","../src/model/cell-reference.ts","../src/model/oa-date.ts","../src/model/cell.ts","../src/model/range.ts","../src/model/worksheet.ts","../src/model/defined-name.ts","../src/model/workbook.ts"],"names":["unzipSync","zipSync","xml","ExcelUnderline","ExcelVerticalAlignRun","ExcelPatternType","ExcelBorderStyle","ExcelHorizontalAlignment","ExcelVerticalAlignment","ExcelReadingOrder","code","_sharedStrings","_styles","escXml"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAS,gBAAgB,EAAA,EAAyB;AAChD,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AAC5B,IAAA,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC3C,IAAA,QAAA,CAAS,KAAK,eAAA,CAAgB,EAAA,CAAG,QAAA,CAAS,CAAC,CAAE,CAAC,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,UAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,EAAa,GAAG,WAAA,IAAe;AAAA,GACjC;AACF;AAEA,SAAS,SAAS,SAAA,EAA+B;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,SAAA,EAAW,iBAAiB,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,aAAA,CAAc,aAAa,CAAA;AAClD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,UAAA,CAAW,WAAW,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,CAAC,IAAI,eAAA,EAAiB;AACxB,IAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,eAAA,CAAgB,IAAI,eAAe,CAAA;AAC5C;AASA,SAAS,aAAa,SAAA,EAA+B;AACnD,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,IAAA;AAKJ,EAAA,SAAS,UAAU,EAAA,EAAY;AAC7B,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU,GAAG,MAAM,EAAA,EAAI,GAAA,EAAA;AAAA,EAC1D;AAEA,EAAA,SAAS,gBAAgB,GAAA,EAAqC;AAC5D,IAAA,MAAM,QAAgC,EAAC;AACvC,IAAA,MAAM,EAAA,GAAK,gCAAA;AACX,IAAA,IAAI,CAAA;AACJ,IAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,GAAG,OAAO,IAAA,EAAM;AAClC,MAAA,KAAA,CAAM,CAAA,CAAE,CAAC,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA;AAAA,IACxI;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAA,GAAM,UAAU,MAAA,EAAQ;AAC7B,IAAA,IAAI,SAAA,CAAU,GAAG,CAAA,KAAM,GAAA,EAAK;AAC1B,MAAA,GAAA,EAAA;AAEA,MAAA,IAAI,SAAA,CAAU,GAAG,CAAA,KAAM,GAAA,EAAK;AAAE,QAAA,SAAA,CAAU,GAAG,CAAA;AAAG,QAAA,GAAA,EAAA;AAAO,QAAA;AAAA,MAAU;AAC/D,MAAA,IAAI,SAAA,CAAU,GAAG,CAAA,KAAM,GAAA,EAAK;AAE1B,QAAA,IAAI,SAAA,CAAU,UAAA,CAAW,UAAA,EAAY,GAAG,CAAA,EAAG;AACzC,UAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,MAAA;AACpC,UAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA;AACpD,UAAA,MAAM,GAAA,GAAM,QAAA,KAAa,EAAA,GAAK,SAAA,CAAU,MAAA,GAAS,QAAA;AACjD,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,UAAA,EAAY,GAAG,CAAA;AAC7C,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,YAAC,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,EAA+B,WAAA,IAAe,KAAA;AAAA,UACvE;AACA,UAAA,GAAA,GAAM,QAAA,KAAa,EAAA,GAAK,SAAA,CAAU,MAAA,GAAS,QAAA,GAAW,CAAA;AACtD,UAAA;AAAA,QACF;AACA,QAAA,SAAA,CAAU,GAAG,CAAA;AAAG,QAAA,GAAA,EAAA;AAAO,QAAA;AAAA,MACzB;AAEA,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAG,CAAA,KAAM,GAAA;AACnC,MAAA,IAAI,OAAA,EAAS,GAAA,EAAA;AAGb,MAAA,MAAM,QAAA,GAAW,GAAA;AACjB,MAAA,SAAA,CAAU,GAAG,CAAA;AACb,MAAA,MAAM,aAAa,SAAA,CAAU,KAAA,CAAM,QAAA,EAAU,GAAG,EAAE,IAAA,EAAK;AACvD,MAAA,GAAA,EAAA;AAEA,MAAA,MAAM,WAAA,GAAc,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA;AAC3C,MAAA,MAAM,GAAA,GAAM,cAAc,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,MAAK,GAAI,UAAA;AAE3D,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAChC,MAAA,MAAM,UAAU,QAAA,KAAa,EAAA,GAAK,MAAM,GAAA,CAAI,KAAA,CAAM,GAAG,QAAQ,CAAA;AAC7D,MAAA,MAAM,UAAU,QAAA,KAAa,EAAA,GAAK,EAAA,GAAK,GAAA,CAAI,MAAM,QAAQ,CAAA;AACzD,MAAA,MAAM,UAAA,GAAa,gBAAgB,OAAO,CAAA;AAE1C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,CAAM,GAAA,EAAI;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,MAAM,EAAA,GAAiB,EAAE,OAAA,EAAS,UAAA,EAAY,UAAU,EAAC,EAAG,aAAa,EAAA,EAAG;AAC5E,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,UAAC,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,QAAA,CAA0B,KAAK,EAAE,CAAA;AAAA,QAC7D,CAAA,MAAO;AACL,UAAA,IAAA,GAAO,EAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAC,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAAA,MACjC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,SAAA,GAAY,GAAA;AAClB,MAAA,SAAA,CAAU,GAAG,CAAA;AACb,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,SAAA,EAAW,GAAG,EACxC,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CAAE,OAAA,CAAQ,WAAW,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA;AACpH,MAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAK,EAAG;AACnC,QAAC,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,EAA+B,WAAA,IAAe,IAAA;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAC7D,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,SAAS,SAAA,EAA+B;AACtD,EAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,IAAA,OAAO,SAAS,SAAS,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,aAAa,SAAS,CAAA;AAC/B;AAKO,SAAS,WAAW,KAAA,EAA2B;AACpD,EAAA,IAAI,OAAO,gBAAgB,WAAA,EAAa;AACtC,IAAA,OAAO,IAAI,WAAA,CAAY,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAC9C;AAGA,EAAA,OAAQ,MAAA,CAAe,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,OAAO,CAAA;AACrD;AAKO,SAAS,WAAW,GAAA,EAAyB;AAClD,EAAA,IAAI,OAAO,gBAAgB,WAAA,EAAa;AACtC,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,GAAG,CAAA;AAAA,EACrC;AAEA,EAAA,OAAQ,MAAA,CAAe,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAC1C;AAMO,SAAS,oBAAA,CAAqB,MAAkB,SAAA,EAAiC;AACtF,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,KAAA,GAAQ,UAAU,WAAA,EAAY;AAEpC,EAAA,SAAS,KAAK,EAAA,EAAgB;AAC5B,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AAEnC,IAAA,IAAI,QAAQ,KAAA,IAAS,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,EAAG;AAC9C,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,IACjB;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,EAAA,CAAG,QAAA,EAAU,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAA,CAAK,IAAI,CAAA;AACT,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,OAAA,CAAQ,IAAgB,IAAA,EAAkC;AACxE,EAAA,IAAI,QAAQ,EAAA,CAAG,UAAA,EAAY,OAAO,EAAA,CAAG,WAAW,IAAI,CAAA;AAEpD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,GAAK,IAAA;AAE5D,EAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,EAAA,CAAG,UAAU,CAAA,EAAG;AACtD,IAAA,IAAI,GAAA,KAAQ,SAAS,GAAA,CAAI,QAAA,CAAS,IAAI,KAAK,CAAA,CAAE,GAAG,OAAO,GAAA;AAAA,EACzD;AACA,EAAA,OAAO,MAAA;AACT;;;ACpMO,SAAS,UAAU,MAAA,EAA8C;AACtE,EAAA,MAAM,QAAQ,MAAA,YAAkB,UAAA,GAAa,MAAA,GAAS,IAAI,WAAW,MAAM,CAAA;AAE3E,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAMA,iBAAU,KAAK,CAAA;AAAA,EACvB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,yBAAyB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAC3E;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAwB;AAC5C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAE9C,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,GAAG,IAAI,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,YAAA,CAAa,SAAqB,IAAA,EAAkC;AAClF,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAKO,SAAS,eAAA,CAAgB,SAAqB,IAAA,EAAsB;AACzE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AACvC,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,WAAA,CAAY,SAAqB,MAAA,EAA0B;AACzE,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAChC,IAAA,IAAI,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,QAAQ,IAAA,EAAK;AACtB;ACvDO,SAAS,QAAQ,OAAA,EAA+B;AACrD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,OAAA,EAAS;AACrC,IAAA,MAAM,QAAQ,OAAO,OAAA,KAAY,QAAA,GAAW,UAAA,CAAW,OAAO,CAAA,GAAI,OAAA;AAClE,IAAA,QAAA,CAAS,IAAI,CAAA,GAAI,CAAC,OAAO,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI;AACF,IAAA,OAAOC,eAAQ,QAAQ,CAAA;AAAA,EACzB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,0BAA0B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAC5E;AAAA,EACF;AACF;AAKO,SAAS,WAAA,CAAY,OAAA,EAAmB,IAAA,EAAcC,IAAAA,EAAmB;AAC9E,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAMA,IAAG,CAAA;AACvB;AAKO,SAAS,cAAA,CAAe,OAAA,EAAmB,IAAA,EAAc,KAAA,EAAyB;AACvF,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,KAAK,CAAA;AACzB;;;AC1CO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;AAGA,SAAS,cAAc,KAAA,EAAsE;AAC3F,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9C,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM;AACvC,IAAA,MAAA,IAAU,IAAI,GAAG,CAAA,EAAA,EAAK,UAAU,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,MAAA;AACT;AAIO,IAAM,aAAN,MAAiB;AAAA,EAAjB,WAAA,GAAA;AACL,IAAA,IAAA,CAAiB,QAAkB,EAAC;AAAA,EAAA;AAAA;AAAA,EAGpC,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,yDAAyD,CAAA;AACzE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,CAAK,KAAa,KAAA,EAAwB;AACxC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,GAAG,CAAA,EAAG,cAAc,KAAA,IAAS,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,GAAA,EAAmB;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,CAAK,KAAa,KAAA,EAAwB;AACxC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,GAAG,CAAA,EAAG,cAAc,KAAA,IAAS,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,CAAK,GAAA,EAAa,OAAA,EAAiB,KAAA,EAAwB;AACzD,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,CAAA,CAAA,EAAI,GAAG,CAAA,EAAG,cAAc,KAAA,IAAS,EAAE,CAAC,IAAI,SAAA,CAAU,OAAO,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AACrF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAIA,IAAAA,EAAmB;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAKA,IAAG,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,OAAA,GAAsB;AACpB,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,IAAI,OAAO,gBAAgB,WAAA,EAAa;AACtC,MAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,GAAG,CAAA;AAAA,IACrC;AAGA,IAAA,OAAQ,MAAA,CAAe,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAAA,EAC1C;AACF;AAGO,SAAS,GAAA,GAAkB;AAChC,EAAA,OAAO,IAAI,UAAA,EAAW;AACxB;AAIO,IAAM,EAAA,GAAK;AAAA;AAAA,EAEhB,aAAA,EAAe,2DAAA;AAAA;AAAA,EAEf,aAAA,EAAe,qEAAA;AAAA,EACf,oBAAA,EAAsB,8DAAA;AAAA;AAAA,EAEtB,SAAA,EAAW,uDAAA;AAAA,EACX,kBAAA,EAAoB,qEAAA;AAAA;AAAA,EAEpB,YAAA,EAAc,8DAAA;AAAA;AAAA,EAEd,cAAA,EAAgB;AAClB;AAEO,IAAM,SAAA,GAAY;AAAA,EACvB,cAAA,EAAgB,oFAAA;AAAA,EAChB,SAAA,EAAW,+EAAA;AAAA,EACX,aAAA,EAAe,mFAAA;AAAA,EACf,MAAA,EAAQ,4EAAA;AAAA,EACR,KAAA,EAAO,2EAAA;AAAA,EACP,OAAA,EAAS,6EAAA;AAAA,EACT,SAAA,EAAW;AACb;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,QAAA,EAAU,4EAAA;AAAA,EACV,SAAA,EAAW,2EAAA;AAAA,EACX,aAAA,EAAe,+EAAA;AAAA,EACf,MAAA,EAAQ,wEAAA;AAAA,EACR,OAAA,EAAS,2DAAA;AAAA,EACT,KAAA,EAAO,mEAAA;AAAA,EACP,aAAA,EAAe,0DAAA;AAAA,EACf,cAAA,EAAgB;AAClB;;;AC3GO,SAAS,iBAAA,CACd,UAAA,EACA,cAAA,GAA2E,EAAC,EACpE;AACR,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,UAAA,EAAW;AAAA,IAAG,CAAC,GAAG,CAAA,KACvD,CAAA,0CAAA,EAA6C,IAAI,CAAC,CAAA,mBAAA,EAAsB,cAAc,SAAS,CAAA,GAAA;AAAA,GACjG;AAEA,EAAA,KAAA,MAAW,EAAE,QAAA,EAAU,WAAA,EAAY,IAAK,cAAA,EAAgB;AACtD,IAAA,SAAA,CAAU,IAAA,CAAK,CAAA,sBAAA,EAAyB,QAAQ,CAAA,eAAA,EAAkB,WAAW,CAAA,GAAA,CAAK,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,CAAA;AAAA,cAAA,EACO,8DAA8D,CAAA;AAAA,yCAAA,EACnC,cAAc,aAAa,CAAA;AAAA;AAAA,qDAAA,EAEf,cAAc,QAAQ,CAAA;AAAA,mDAAA,EACxB,cAAc,MAAM,CAAA;AAAA,0DAAA,EACb,cAAc,aAAa,CAAA;AAAA,EACrF,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA,QAAA,CAAA;AAEtB;AAIO,IAAM,SAAA,GAAY,CAAA;AAAA;AAAA,gCAAA,EAES,UAAU,cAAc,CAAA;AAAA,gBAAA,CAAA;AAKnD,SAAS,kBAAkB,UAAA,EAA4B;AAC5D,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,IACtB,EAAE,QAAQ,UAAA,EAAW;AAAA,IACrB,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,uBAAA,EAA0B,CAAA,GAAI,CAAC,CAAA,QAAA,EAAW,SAAA,CAAU,SAAS,CAAA,0BAAA,EAA6B,CAAA,GAAI,CAAC,CAAA,OAAA;AAAA,GACnG,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,WAAW,UAAA,GAAa,CAAA;AAC9B,EAAA,MAAM,WAAW,UAAA,GAAa,CAAA;AAE9B,EAAA,OAAO,CAAA;AAAA;AAAA,EAEP,SAAS;AAAA,uBAAA,EACc,QAAQ,CAAA,QAAA,EAAW,SAAA,CAAU,MAAM,CAAA;AAAA,uBAAA,EACnC,QAAQ,CAAA,QAAA,EAAW,SAAA,CAAU,aAAa,CAAA;AAAA,gBAAA,CAAA;AAEnE;AAsBO,SAAS,gBAAA,CACd,MAAA,EACA,YAAA,GAA+C,EAAC,EACxC;AACR,EAAA,MAAM,UAAA,GAAa,OAChB,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAM,KAAM;AACjD,IAAA,MAAM,YAAY,KAAA,IAAS,KAAA,KAAU,SAAA,GAAY,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AACvE,IAAA,OAAO,CAAA,iBAAA,EAAoB,WAAW,IAAI,CAAC,cAAc,OAAO,CAAA,QAAA,EAAW,cAAc,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,CAAA;AAAA,EACxG,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAA,GAAQ,aACX,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,cAAa,KAAM;AACzC,MAAA,MAAM,KAAA,GAAQ,YAAA,KAAiB,MAAA,GAAY,CAAA,eAAA,EAAkB,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/E,MAAA,OAAO,CAAA,uBAAA,EAA0B,WAAW,IAAI,CAAC,IAAI,KAAK,CAAA,CAAA,EAAI,aAAA,CAAc,QAAQ,CAAC,CAAA,cAAA,CAAA;AAAA,IACvF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,iBAAA,GAAoB;AAAA;AAAA,EAAuB,KAAK;AAAA,iBAAA,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASP,UAAU;AAAA,WAAA,EACC,iBAAiB;AAAA;AAAA,WAAA,CAAA;AAG9B;AAqDO,IAAM,mBAAA,GAAsB,CAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAQnC,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,QAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACpG;AAEA,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC5E;;;AC9IO,IAAM,wBAAA,GAA2B;AAGjC,SAAS,gBAAgB,UAAA,EAA4B;AAC1D,EAAA,OAAO,CAAA;AAAA,qBAAA,EACc,GAAG,kBAAkB,CAAA,WAAA,EAAc,EAAA,CAAG,SAAS,KAAK,UAAU,CAAA,WAAA,CAAA;AACrF;AAGO,SAAS,aAAa,aAAA,EAA0C;AACrE,EAAA,OAAO,CAAA;AAAA;AAAA,EAEP,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC;AAAA,gBAAA,CAAA;AAE1B;;;AC7DA,IAAA,cAAA,EAAA,cAAA;AAcO,IAAM,sBAAN,MAA0B;AAAA,EAA1B,WAAA,GAAA;AAEL;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,cAAA,sBAAqB,GAAA,EAAoB,CAAA;AAElD;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,gBAA2B,EAAC,CAAA;AAAA,EAAA;AAAA;AAAA;AAAA,EAKrC,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAO,mBAAK,cAAA,CAAA,CAAe,MAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,KAAA,EAAuB;AAC9B,IAAA,MAAM,QAAA,GAAW,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAC9C,IAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AAEnC,IAAA,MAAM,GAAA,GAAM,mBAAK,cAAA,CAAA,CAAe,MAAA;AAChC,IAAA,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAe,KAAK,KAAK,CAAA;AAC9B,IAAA,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAe,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAA,EAAuB;AAC/B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAe,KAAK,CAAA;AACnC,IAAA,IAAI,MAAM,MAAA,EAAW;AACnB,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,uBAAuB,KAAK,CAAA,kBAAA,EAAqB,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAe,SAAS,CAAC,CAAA,EAAA;AAAA,OACjF;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,KAAA,EAAmC;AAC9C,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,gBAAe,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,KAAA,EAAwB;AAC1B,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAAmB;AACjB,IAAA,MAAM,KAAA,GAAQ,mBAAK,cAAA,CAAA,CAAe,MAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAChB,GAAA,CAAI,CAAA,CAAA,KAAK;AACR,MAAA,MAAM,aAAA,GAAgB,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,GAAI,uBAAA,GAA0B,EAAA;AACvF,MAAA,OAAO,CAAA,MAAA,EAAS,aAAa,CAAA,CAAA,EAAI,UAAA,CAAW,CAAC,CAAC,CAAA,SAAA,CAAA;AAAA,IAChD,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,IAAA,OAAO,CAAA;AAAA,8EAAA,EACqE,KAAK,kBAAkB,KAAK,CAAA;AAAA,EAC1G,KAAK;AAAA,MAAA,CAAA;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA,EAKA,YAAYA,IAAAA,EAAmB;AAC7B,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAe,KAAA,EAAM;AAC1B,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAe,MAAA,GAAS,CAAA;AAE7B,IAAA,MAAM,IAAA,GAAO,SAASA,IAAG,CAAA;AAEzB,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,IAAA,EAAM,IAAI,CAAA,EAAG;AAEjD,MAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,EAAA,EAAI,GAAG,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,WAAW,CAAA,CAAE,KAAK,EAAE,CAAA;AACnD,MAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAA;AAxFW,cAAA,GAAA,IAAA,OAAA,EAAA;AAEA,cAAA,GAAA,IAAA,OAAA,EAAA;AAwFX,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AACzB;;;AC5FO,IAAM,WAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EAUd,YAAY,IAAA,EAKjB;AACD,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAChB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,QAAQ,GAAA,EAAyB;AACtC,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAEtD,IAAA,IAAI,CAAA,GAAI,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAE7C,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAElB,MAAA,CAAA,GAAI,CAAA,EAAA,EAAK,EAAE,CAAC,CAAC,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACzB,MAAA,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AAAA,IACZ,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,sBAAsB,GAAG,CAAA,+DAAA;AAAA,OAC3B;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,EAAE,WAAA,EAAY;AAC5B,IAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,GAAG,CAAA,+BAAA,CAAiC,CAAA;AAAA,IAC5E;AAEA,IAAA,OAAO,IAAI,WAAA,CAAW,EAAE,GAAA,EAAK,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,OAAO,OAAA,CAAQ,GAAA,EAAa,KAAA,EAAe,IAAA,EAA0B;AACnE,IAAA,OAAO,IAAI,WAAA,CAAW;AAAA,MACpB,GAAA,EAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,KACxD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,QAAA,CAAS,KAAA,EAAe,GAAA,EAAa,OAAe,IAAA,EAA0B;AACnF,IAAA,OAAO,IAAI,WAAA,CAAW;AAAA,MACpB,KAAK,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAC,GAAG,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG,QAAQ,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,SAAA,CAAU,UAAA,EAAoB,IAAA,GAAO,CAAA,EAAe;AACzD,IAAA,OAAO,IAAI,WAAA,CAAW;AAAA,MACpB,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,IAAA,KAAS,CAAA,GAAI,IAAA,GAAO;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,YAAY,KAAA,EAA2B;AAC5C,IAAA,OAAO,IAAI,WAAA,CAAW,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA,EA6BA,UAAA,GAA4B;AAC1B,IAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,SAAkB,EAAE,GAAA,EAAK,KAAK,GAAA,EAAI;AACnD,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,MAAM,KAAA,GAAuB,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACjD,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAC/C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,OAAA,KAAY,MAAA,SAAkB,EAAE,OAAA,EAAS,KAAK,OAAA,EAAQ;AAC/D,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA,EAGA,aAAa,OAAA,EAAyB;AACpC,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,EAAW;AAC9B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAClE,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAC/D,IAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA;AACxE,IAAA,OAAO,IAAI,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,OAAO,aAAa,KAAA,EAAmE;AACrF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAK,CAAA;AACvB,IAAA,IAAI,GAAA,EAAK,OAAO,WAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,MAAM,OAAO,CAAA;AAC9B,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAM,OAAA,GAAU,MAAM,MAAM,CAAA;AAC5B,MAAA,OAAO,WAAA,CAAW,SAAA,CAAU,QAAA,CAAS,QAAA,EAAU,EAAE,GAAG,OAAA,GAAU,UAAA,CAAW,OAAO,CAAA,GAAI,CAAC,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,SAAS,CAAA;AAClC,IAAA,IAAI,UAAA,KAAe,QAAW,OAAO,WAAA,CAAW,YAAY,QAAA,CAAS,UAAA,EAAY,EAAE,CAAC,CAAA;AAEpF,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,EAAW,OAAO,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,CAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,OAAO,SAAS,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,KAAK,EAAE,CAAA,CAAA,CAAA;AAC3F,IAAA,IAAI,KAAK,OAAA,KAAY,MAAA,EAAW,OAAO,CAAA,QAAA,EAAW,KAAK,OAAO,CAAA,CAAA,CAAA;AAC9D,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAAA;AAvJa,WAAA,CAiFK,KAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAjFhD,WAAA,CAkFK,KAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAlFhD,WAAA,CAmFK,GAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAnFhD,WAAA,CAoFK,KAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AApFhD,WAAA,CAqFK,IAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AArFhD,WAAA,CAsFK,MAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAtFhD,WAAA,CAuFK,OAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAvFhD,WAAA,CAwFK,IAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAxFhD,WAAA,CAyFK,MAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAzFhD,WAAA,CA0FK,MAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AA1FhD,WAAA,CA2FK,OAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AA3FhD,WAAA,CA4FK,SAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AA5FhD,WAAA,CA6FK,QAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AA7FhD,WAAA,CA8FK,SAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AA9FhD,WAAA,CA+FK,QAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AA/FhD,WAAA,CAgGK,IAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAhGhD,WAAA,CAiGK,SAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAjGhD,WAAA,CAkGK,UAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAlGhD,WAAA,CAmGK,WAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAnGhD,WAAA,CAoGK,SAAA,GAAc,WAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AApGhD,WAAA,CAqGK,cAAc,WAAA,CAAW,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AArGvD,IAAM,UAAA,GAAN;AAyJP,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,EAAE,WAAA,EAAY;AAC7F;;;ACxKO,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,kBAAA;AALT,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAQL,IAAK,qBAAA,qBAAAC,sBAAAA,KAAL;AACL,EAAAA,uBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,uBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,uBAAA,WAAA,CAAA,GAAY,WAAA;AAHF,EAAA,OAAAA,sBAAAA;AAAA,CAAA,EAAA,qBAAA,IAAA,EAAA;AAiBL,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EAUrB,WAAA,CAAY,IAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EAC1B;AAAA;AAAA,EAIA,KAAA,GAAgB;AACd,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI,IAAA,CAAK,IAAA,EAAe,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,IAAI,IAAA,CAAK,MAAA,EAAe,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,IAAI,IAAA,CAAK,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAE9C,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA,KAAc,MAAA,aAAqB;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,SAAS,CAAA,GAAA,CAAK,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,KAAkB,UAAA,iBAAgC;AAC/E,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAA,CAAK,aAAa,CAAA,GAAA,CAAK,CAAA;AAAA,IACvD;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,GAAA,CAAK,CAAA;AAE3C,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,IACjC;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,IAAA,IAAQ,SAAS,CAAA,GAAA,CAAK,CAAA;AAEpD,IAAA,OAAO,CAAA,MAAA,EAAS,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,OAAO,gBAAgB,QAAA,EAA0G;AAC/H,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,EAAU;AAE3B,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACzC,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,GAAA;AAAW,UAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAM,UAAA;AAAA,QAClC,KAAK,GAAA;AAAW,UAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAM,UAAA;AAAA,QACpC,KAAK,QAAA;AAAW,UAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAM,UAAA;AAAA,QAC3C,KAAK,IAAA;AAAW,UAAA,IAAA,CAAK,OAAO,UAAA,CAAW,EAAA,CAAG,UAAA,CAAW,KAAK,KAAK,IAAI,CAAA;AAAG,UAAA;AAAA,QACtE,KAAK,MAAA;AAAW,UAAA,IAAA,CAAK,IAAA,GAAO,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA;AAAG,UAAA;AAAA,QAClD,KAAK,GAAA,EAAK;AACR,UAAA,MAAM,GAAA,GAAM,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,QAAA;AACpC,UAAA,IAAA,CAAK,SAAA,GAAa,OAAO,MAAA,CAAO,cAAc,EAAe,QAAA,CAAS,GAAG,IACpE,GAAA,GACD,QAAA;AACJ,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,MAAM,GAAA,GAAM,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,UAAA;AACpC,UAAA,IAAA,CAAK,aAAA,GAAiB,OAAO,MAAA,CAAO,qBAAqB,EAAe,QAAA,CAAS,GAAG,IAC/E,GAAA,GACD,UAAA;AACJ,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA;AACH,UAAA,IAAA,CAAK,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,EAAA,CAAG,UAAU,CAAA;AAClD,UAAA;AAAA;AACJ,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAA,GAAmB;AACjB,IAAA,OAAO;AAAA,MACL,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,IAAQ,SAAS,CAAA,CAAA;AAAA,MAC3B,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,CAAA;AAAA,MACpB,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,IAAQ,KAAK,CAAA,CAAA;AAAA,MACvB,CAAA,EAAA,EAAK,IAAA,CAAK,MAAA,IAAU,KAAK,CAAA,CAAA;AAAA,MACzB,CAAA,EAAA,EAAK,IAAA,CAAK,SAAA,IAAa,MAAA,YAAmB,CAAA;AAAA,MAC1C,CAAA,GAAA,EAAM,IAAA,CAAK,aAAA,IAAiB,KAAK,CAAA,CAAA;AAAA,MACjC,CAAA,GAAA,EAAM,IAAA,CAAK,aAAA,IAAiB,UAAA,gBAA8B,CAAA;AAAA,MAC1D,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,EAAO,QAAA,MAAc,MAAM,CAAA;AAAA,KACvC,CAAE,KAAK,GAAG,CAAA;AAAA,EACZ;AAAA,EAEA,KAAA,GAAmB;AACjB,IAAA,OAAO,IAAI,UAAA,CAAU;AAAA,MACnB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,eAAe,IAAA,CAAK;AAAA,KACrB,CAAA;AAAA,EACH;AACF;;;AClIO,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,MAAA,CAAA,GAAmB,MAAA;AACnB,EAAAA,kBAAA,OAAA,CAAA,GAAmB,OAAA;AACnB,EAAAA,kBAAA,UAAA,CAAA,GAAmB,UAAA;AACnB,EAAAA,kBAAA,YAAA,CAAA,GAAmB,YAAA;AACnB,EAAAA,kBAAA,WAAA,CAAA,GAAmB,WAAA;AACnB,EAAAA,kBAAA,SAAA,CAAA,GAAmB,SAAA;AACnB,EAAAA,kBAAA,UAAA,CAAA,GAAmB,UAAA;AACnB,EAAAA,kBAAA,gBAAA,CAAA,GAAmB,gBAAA;AACnB,EAAAA,kBAAA,cAAA,CAAA,GAAmB,cAAA;AACnB,EAAAA,kBAAA,UAAA,CAAA,GAAmB,UAAA;AACnB,EAAAA,kBAAA,QAAA,CAAA,GAAmB,QAAA;AACnB,EAAAA,kBAAA,UAAA,CAAA,GAAmB,UAAA;AACnB,EAAAA,kBAAA,aAAA,CAAA,GAAmB,aAAA;AACnB,EAAAA,kBAAA,iBAAA,CAAA,GAAmB,iBAAA;AACnB,EAAAA,kBAAA,eAAA,CAAA,GAAmB,eAAA;AACnB,EAAAA,kBAAA,WAAA,CAAA,GAAmB,WAAA;AACnB,EAAAA,kBAAA,SAAA,CAAA,GAAmB,SAAA;AACnB,EAAAA,kBAAA,WAAA,CAAA,GAAmB,WAAA;AACnB,EAAAA,kBAAA,cAAA,CAAA,GAAmB,cAAA;AAnBT,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAsBL,IAAM,UAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EAOrB,WAAA,CACE,WAAA,GAAgC,MAAA,aAChC,eAAA,EACA,eAAA,EACA;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAM,KAAA,EAA8B;AACzC,IAAA,OAAO,IAAI,UAAA;AAAA,MACT,OAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,CAAW,YAAY,EAAE;AAAA;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,OAAA,CACL,OAAA,EACA,UAAA,EACA,UAAA,EACW;AACX,IAAA,OAAO,IAAI,UAAA,CAAU,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA;AAAA,EACtD;AAAA;AAAA,EAOA,KAAA,GAAgB;AACd,IAAA,IAAI,KAAA,GAAQ,CAAA,0BAAA,EAA6B,IAAA,CAAK,WAAW,CAAA,EAAA,CAAA;AAEzD,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAW;AAC9C,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,MAAM,GAAA,EAAS,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA;AAClD,MAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAClE,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAY,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAChE,MAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA;AACxE,MAAA,KAAA,IAAS,CAAA,SAAA,EAAY,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAW;AAC9C,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,MAAM,GAAA,EAAS,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA;AAClD,MAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAClE,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAY,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAChE,MAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA;AACxE,MAAA,KAAA,IAAS,CAAA,SAAA,EAAY,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACtC;AAEA,IAAA,KAAA,IAAS,gBAAA;AACT,IAAA,OAAO,SAAS,KAAK,CAAA,OAAA,CAAA;AAAA,EACvB;AAAA,EAEA,OAAO,gBAAgB,QAAA,EAA+J;AACpL,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,EAAU;AAE3B,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACzC,MAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,UAAA,CAAW,aAAa,CAAA;AACtC,QAAA,IAAI,MAAO,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA,CAAe,QAAA,CAAS,EAAE,CAAA,EAAG;AACpE,UAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AAAA,QACrB;AAEA,QAAA,KAAA,MAAW,KAAA,IAAS,GAAG,QAAA,EAAU;AAC/B,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC7C,UAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA;AACtD,UAAA,IAAI,IAAA,KAAS,SAAA,IAAa,KAAA,EAAO,IAAA,CAAK,eAAA,GAAkB,KAAA;AACxD,UAAA,IAAI,IAAA,KAAS,SAAA,IAAa,KAAA,EAAO,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO;AAAA,MACL,CAAA,EAAA,EAAK,KAAK,WAAW,CAAA,CAAA;AAAA,MACrB,CAAA,GAAA,EAAM,IAAA,CAAK,eAAA,EAAiB,QAAA,MAAc,MAAM,CAAA,CAAA;AAAA,MAChD,CAAA,GAAA,EAAM,IAAA,CAAK,eAAA,EAAiB,QAAA,MAAc,MAAM,CAAA;AAAA,KAClD,CAAE,KAAK,GAAG,CAAA;AAAA,EACZ;AACF,CAAA;AAAA;AAtGa,UAAA,CAyCK,IAAA,GAAO,IAAI,UAAA,CAAU,MAAA,YAAqB;AAzCrD,IAAM,SAAA,GAAN;;;ACtBA,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,MAAA,CAAA,GAAkB,MAAA;AAClB,EAAAA,kBAAA,MAAA,CAAA,GAAkB,MAAA;AAClB,EAAAA,kBAAA,QAAA,CAAA,GAAkB,QAAA;AAClB,EAAAA,kBAAA,OAAA,CAAA,GAAkB,OAAA;AAClB,EAAAA,kBAAA,QAAA,CAAA,GAAkB,QAAA;AAClB,EAAAA,kBAAA,QAAA,CAAA,GAAkB,QAAA;AAClB,EAAAA,kBAAA,QAAA,CAAA,GAAkB,QAAA;AAClB,EAAAA,kBAAA,MAAA,CAAA,GAAkB,MAAA;AAClB,EAAAA,kBAAA,cAAA,CAAA,GAAkB,cAAA;AAClB,EAAAA,kBAAA,SAAA,CAAA,GAAkB,SAAA;AAClB,EAAAA,kBAAA,eAAA,CAAA,GAAkB,eAAA;AAClB,EAAAA,kBAAA,YAAA,CAAA,GAAkB,YAAA;AAClB,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,kBAAA,cAAA,CAAA,GAAkB,cAAA;AAdR,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAiBL,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAI3B,WAAA,CAAY,KAAA,GAA0B,MAAA,aAAuB,KAAA,EAAoB;AAC/E,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,MAAM,GAAA,EAAqB;AACzB,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,aAAuB,OAAO,IAAI,GAAG,CAAA,EAAA,CAAA;AAExD,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,IAAI,KAAK,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,aAAa,OAAO,CAAA;AAEvD,IAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,KAAK,KAAK,GAAG,CAAA,CAAA,CAAA;AAAA,EACvD;AAAA,EAEA,OAAO,eAAe,EAAA,EAAuI;AAC3J,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,UAAA,CAAW,OAAO,CAAA,IAAK,MAAA;AAC3C,IAAA,MAAM,KAAA,GAAS,OAAO,MAAA,CAAO,gBAAgB,EAAe,QAAA,CAAS,QAAQ,IACxE,QAAA,GACD,MAAA;AAEJ,IAAA,IAAI,KAAA;AACJ,IAAA,KAAA,MAAW,KAAA,IAAS,GAAG,QAAA,EAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA,IAAK,MAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,gBAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,KAAA,EAAO,QAAA,MAAc,MAAM,CAAA,CAAA;AAAA,EAC1D;AACF;AAEO,IAAM,YAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EASvB,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,GAAW,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAA,CAAK,KAAA,GAAW,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAA,CAAK,GAAA,GAAW,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAA,CAAK,MAAA,GAAW,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,UAAA,GAAe,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA,EAKA,OAAO,GAAA,CAAI,KAAA,EAAyB,KAAA,EAAiC;AACnE,IAAA,MAAM,CAAA,GAAI,IAAI,YAAA,EAAY;AAE1B,IAAA,CAAA,CAAE,IAAA,GAAS,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC3C,IAAA,CAAA,CAAE,KAAA,GAAS,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC3C,IAAA,CAAA,CAAE,GAAA,GAAS,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC3C,IAAA,CAAA,CAAE,MAAA,GAAS,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC3C,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,OAAO,UAAA,CAAW,KAAA,EAAyB,KAAA,EAAiC;AAC1E,IAAA,MAAM,CAAA,GAAI,IAAI,YAAA,EAAY;AAC1B,IAAA,CAAA,CAAE,MAAA,GAAS,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC3C,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,OAAO,OAAA,CAAQ,KAAA,EAAyB,KAAA,EAAiC;AACvE,IAAA,MAAM,CAAA,GAAI,IAAI,YAAA,EAAY;AAC1B,IAAA,CAAA,CAAE,GAAA,GAAM,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AACxC,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAA,CAAS,KAAA,EAAyB,KAAA,EAAiC;AACxE,IAAA,MAAM,CAAA,GAAI,IAAI,YAAA,EAAY;AAC1B,IAAA,CAAA,CAAE,IAAA,GAAO,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AACzC,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,OAAO,SAAA,CAAU,KAAA,EAAyB,KAAA,EAAiC;AACzE,IAAA,MAAM,CAAA,GAAI,IAAI,YAAA,EAAY;AAC1B,IAAA,CAAA,CAAE,KAAA,GAAQ,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC1C,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA,EAMA,KAAA,GAAgB;AACd,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,YAAA,GAAe,mBAAA,GAAsB,EAAA;AACrD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,GAAe,iBAAA,GAAsB,EAAA;AACrD,IAAA,OAAO,CAAA,OAAA,EAAU,EAAE,CAAA,EAAG,EAAE,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAM,OAAO,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,UAAU,CAAC,CAAA,SAAA,CAAA;AAAA,EACzK;AAAA,EAEA,OAAO,eAAA,CAAgB,QAAA,EAAoJ,WAAA,EAAkD;AAC3N,IAAA,MAAM,CAAA,GAAI,IAAI,YAAA,EAAY;AAC1B,IAAA,CAAA,CAAE,YAAA,GAAe,WAAA,CAAY,cAAc,CAAA,KAAM,GAAA;AACjD,IAAA,CAAA,CAAE,UAAA,GAAe,WAAA,CAAY,YAAY,CAAA,KAAQ,GAAA;AAEjD,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACzC,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,cAAA,CAAe,EAAE,CAAA;AAC9C,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,MAAA;AAAY,UAAA,CAAA,CAAE,IAAA,GAAW,IAAA;AAAM,UAAA;AAAA,QACpC,KAAK,OAAA;AAAY,UAAA,CAAA,CAAE,KAAA,GAAW,IAAA;AAAM,UAAA;AAAA,QACpC,KAAK,KAAA;AAAY,UAAA,CAAA,CAAE,GAAA,GAAW,IAAA;AAAM,UAAA;AAAA,QACpC,KAAK,QAAA;AAAY,UAAA,CAAA,CAAE,MAAA,GAAW,IAAA;AAAM,UAAA;AAAA,QACpC,KAAK,UAAA;AAAY,UAAA,CAAA,CAAE,QAAA,GAAW,IAAA;AAAM,UAAA;AAAA;AACtC,IACF;AAEA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO;AAAA,MACL,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA,CAAA;AAAA,MACzB,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,CAAA,CAAA;AAAA,MAC1B,CAAA,EAAA,EAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAA,CAAA;AAAA,MACxB,CAAA,EAAA,EAAK,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,MAC3B,CAAA,EAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,CAAA,CAAA;AAAA,MAC7B,CAAA,GAAA,EAAM,KAAK,YAAY,CAAA,CAAA;AAAA,MACvB,CAAA,GAAA,EAAM,KAAK,UAAU,CAAA;AAAA,KACvB,CAAE,KAAK,GAAG,CAAA;AAAA,EACZ;AACF,CAAA;AAjGa,YAAA,CAwDK,IAAA,GAAO,IAAI,YAAA,EAAY;AAxDlC,IAAM,WAAA,GAAN;;;AC1DA,IAAK,wBAAA,qBAAAC,yBAAAA,KAAL;AACL,EAAAA,0BAAA,SAAA,CAAA,GAAmB,SAAA;AACnB,EAAAA,0BAAA,MAAA,CAAA,GAAmB,MAAA;AACnB,EAAAA,0BAAA,QAAA,CAAA,GAAmB,QAAA;AACnB,EAAAA,0BAAA,OAAA,CAAA,GAAmB,OAAA;AACnB,EAAAA,0BAAA,MAAA,CAAA,GAAmB,MAAA;AACnB,EAAAA,0BAAA,SAAA,CAAA,GAAmB,SAAA;AACnB,EAAAA,0BAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,0BAAA,aAAA,CAAA,GAAmB,aAAA;AART,EAAA,OAAAA,yBAAAA;AAAA,CAAA,EAAA,wBAAA,IAAA,EAAA;AAWL,IAAK,sBAAA,qBAAAC,uBAAAA,KAAL;AACL,EAAAA,wBAAA,KAAA,CAAA,GAAc,KAAA;AACd,EAAAA,wBAAA,QAAA,CAAA,GAAc,QAAA;AACd,EAAAA,wBAAA,QAAA,CAAA,GAAc,QAAA;AACd,EAAAA,wBAAA,SAAA,CAAA,GAAc,SAAA;AACd,EAAAA,wBAAA,aAAA,CAAA,GAAc,aAAA;AALJ,EAAA,OAAAA,uBAAAA;AAAA,CAAA,EAAA,sBAAA,IAAA,EAAA;AAQL,IAAK,iBAAA,qBAAAC,kBAAAA,KAAL;AACL,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,sBAAmB,CAAA,CAAA,GAAnB,kBAAA;AACA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,iBAAmB,CAAA,CAAA,GAAnB,aAAA;AACA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,iBAAmB,CAAA,CAAA,GAAnB,aAAA;AAHU,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAML,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EAS1B,KAAA,GAAgB;AACd,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,KAAK,UAAA,EAAe,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AACpE,IAAA,IAAI,KAAK,QAAA,EAAe,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,QAAQ,CAAA,CAAA,CAAG,CAAA;AAChE,IAAA,IAAI,IAAA,CAAK,QAAA,EAAe,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,WAAA,EAAe,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA;AACpD,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,YAAY,CAAA,CAAA,CAAG,CAAA;AACrF,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AACzE,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,YAAY,CAAA,CAAA,CAAG,CAAA;AAErF,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,IAAA,OAAO,CAAA,WAAA,EAAc,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,EACtC;AAAA,EAEA,OAAO,aAAa,KAAA,EAA+C;AACjE,IAAA,MAAM,CAAA,GAAI,IAAI,eAAA,EAAe;AAC7B,IAAA,MAAM,CAAA,GAAI,MAAM,YAAY,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,MAAM,UAAU,CAAA;AAE1B,IAAA,IAAI,KAAM,MAAA,CAAO,MAAA,CAAO,wBAAwB,CAAA,CAAe,QAAA,CAAS,CAAC,CAAA,EAAG;AAC1E,MAAA,CAAA,CAAE,UAAA,GAAa,CAAA;AAAA,IACjB;AACA,IAAA,IAAI,KAAM,MAAA,CAAO,MAAA,CAAO,sBAAsB,CAAA,CAAe,QAAA,CAAS,CAAC,CAAA,EAAG;AACxE,MAAA,CAAA,CAAE,QAAA,GAAW,CAAA;AAAA,IACf;AACA,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,KAAM,GAAA,IAAO,MAAM,UAAU,CAAA,KAAM,MAAA,EAAQ,CAAA,CAAE,QAAA,GAAW,IAAA;AAC5E,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,KAAM,GAAA,IAAO,MAAM,aAAa,CAAA,KAAM,MAAA,EAAQ,CAAA,CAAE,WAAA,GAAc,IAAA;AACrF,IAAA,IAAI,KAAA,CAAM,cAAc,CAAA,KAAM,MAAA,EAAW,CAAA,CAAE,eAAe,QAAA,CAAS,KAAA,CAAM,cAAc,CAAA,EAAI,EAAE,CAAA;AAC7F,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,KAAM,MAAA,EAAW,CAAA,CAAE,SAAS,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,EAAI,EAAE,CAAA;AAC3E,IAAA,IAAI,KAAA,CAAM,cAAc,CAAA,KAAM,MAAA,EAAW,CAAA,CAAE,eAAe,QAAA,CAAS,KAAA,CAAM,cAAc,CAAA,EAAI,EAAE,CAAA;AAC7F,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO;AAAA,MACL,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA,CAAA;AAAA,MAC1B,CAAA,EAAA,EAAK,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA,CAAA;AAAA,MACxB,CAAA,EAAA,EAAK,IAAA,CAAK,QAAA,IAAY,KAAK,CAAA,CAAA;AAAA,MAC3B,CAAA,EAAA,EAAK,IAAA,CAAK,WAAA,IAAe,KAAK,CAAA,CAAA;AAAA,MAC9B,CAAA,EAAA,EAAK,IAAA,CAAK,YAAA,IAAgB,CAAC,CAAA,CAAA;AAAA,MAC3B,CAAA,EAAA,EAAK,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA,CAAA;AAAA,MACrB,CAAA,GAAA,EAAM,IAAA,CAAK,YAAA,IAAgB,CAAC,CAAA;AAAA,KAC9B,CAAE,KAAK,GAAG,CAAA;AAAA,EACZ;AACF;;;AChEA,IAAM,qBAAA,GAAgD;AAAA,EACpD,CAAA,EAAG,SAAA;AAAA,EAAW,CAAA,EAAG,GAAA;AAAA,EAAK,CAAA,EAAG,MAAA;AAAA,EAAQ,CAAA,EAAG,OAAA;AAAA,EAAS,CAAA,EAAG,UAAA;AAAA,EAChD,CAAA,EAAG,mBAAA;AAAA,EAAqB,CAAA,EAAG,wBAAA;AAAA,EAC3B,CAAA,EAAG,yBAAA;AAAA,EAA2B,CAAA,EAAG,8BAAA;AAAA,EACjC,CAAA,EAAG,IAAA;AAAA,EAAM,EAAA,EAAI,OAAA;AAAA,EAAS,EAAA,EAAI,UAAA;AAAA,EAAY,EAAA,EAAI,OAAA;AAAA,EAAS,EAAA,EAAI,SAAA;AAAA,EACvD,EAAA,EAAI,UAAA;AAAA,EAAY,EAAA,EAAI,UAAA;AAAA,EAAY,EAAA,EAAI,OAAA;AAAA,EAAS,EAAA,EAAI,QAAA;AAAA,EACjD,EAAA,EAAI,YAAA;AAAA,EAAc,EAAA,EAAI,eAAA;AAAA,EAAiB,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,SAAA;AAAA,EACvD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,gBAAA;AAAA,EAAkB,EAAA,EAAI,qBAAA;AAAA,EAC1B,EAAA,EAAI,qBAAA;AAAA,EAAuB,EAAA,EAAI,0BAAA;AAAA,EAC/B,EAAA,EAAI,OAAA;AAAA,EAAS,EAAA,EAAI,WAAA;AAAA,EAAa,EAAA,EAAI,QAAA;AAAA,EAAU,EAAA,EAAI,UAAA;AAAA,EAAY,EAAA,EAAI;AAClE,CAAA;AAEA,IAAM,sBAA2C,IAAI,GAAA;AAAA,EACnD,MAAA,CAAO,OAAA,CAAQ,qBAAqB,CAAA,CAAE,IAAI,CAAC,CAAC,EAAA,EAAI,IAAI,MAAM,CAAC,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAC;AAC9E,CAAA;AAEO,IAAM,kBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EAIrB,WAAA,CAAY,YAAoB,QAAA,EAAkB;AACxD,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,UAAA,EAAuC;AACnD,IAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAG/D,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,GAAA,CAAI,UAAU,CAAA;AACpD,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,OAAO,IAAI,kBAAA,CAAkB,UAAA,EAAY,SAAS,CAAA;AAAA,IACpD;AAGA,IAAA,OAAO,IAAI,kBAAA,CAAkB,UAAA,EAAY,CAAC,CAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,OAAO,YAAA,CACL,QAAA,EACA,aAAA,EACmB;AAEnB,IAAA,IAAI,aAAA,IAAiB,YAAY,GAAA,EAAK;AACpC,MAAA,MAAMC,KAAAA,GAAO,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACvC,MAAA,IAAIA,KAAAA,EAAM,OAAO,IAAI,kBAAA,CAAkBA,OAAM,QAAQ,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,QAAQ,CAAA,IAAK,SAAA;AAChD,IAAA,OAAO,IAAI,kBAAA,CAAkB,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA,EAmCA,YAAA,GAAwB;AACtB,IAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,IAAA,IAAK,EAAA,IAAM,MAAM,EAAA,IAAM,EAAA,IAAQ,MAAM,EAAA,IAAM,EAAA,IAAM,IAAK,OAAO,IAAA;AAE7D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,WAAA,EAAY;AAE1C,IAAA,OACE,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAClB,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IACjB,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IACxE,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,EAEnD;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AACF,CAAA;AAAA;AA3Fa,kBAAA,CA2CK,OAAA,GAAqB,IAAI,kBAAA,CAAkB,SAAA,EAAW,CAAC,CAAA;AA3C5D,kBAAA,CA4CK,OAAA,GAAqB,IAAI,kBAAA,CAAkB,GAAA,EAAK,CAAC,CAAA;AA5CtD,kBAAA,CA6CK,QAAA,GAAqB,IAAI,kBAAA,CAAkB,MAAA,EAAQ,CAAC,CAAA;AA7CzD,kBAAA,CA8CK,kBAAA,GAAqB,IAAI,kBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AA9C1D,kBAAA,CA+CK,iBAAA,GAAqB,IAAI,kBAAA,CAAkB,UAAA,EAAY,CAAC,CAAA;AA/C7D,kBAAA,CAgDK,UAAA,GAAqB,IAAI,kBAAA,CAAkB,IAAA,EAAM,CAAC,CAAA;AAhDvD,kBAAA,CAiDK,kBAAA,GAAqB,IAAI,kBAAA,CAAkB,OAAA,EAAS,EAAE,CAAA;AAjD3D,kBAAA,CAkDK,UAAA,GAAqB,IAAI,kBAAA,CAAkB,UAAA,EAAY,EAAE,CAAA;AAlD9D,kBAAA,CAmDK,QAAA,GAAqB,IAAI,kBAAA,CAAkB,OAAA,EAAS,EAAE,CAAA;AAnD3D,kBAAA,CAoDK,iBAAA,GAAqB,IAAI,kBAAA,CAAkB,SAAA,EAAW,EAAE,CAAA;AApD7D,kBAAA,CAqDK,SAAA,GAAqB,IAAI,kBAAA,CAAkB,UAAA,EAAY,EAAE,CAAA;AArD9D,kBAAA,CAsDK,QAAA,GAAqB,IAAI,kBAAA,CAAkB,UAAA,EAAY,EAAE,CAAA;AAtD9D,kBAAA,CAuDK,QAAA,GAAqB,IAAI,kBAAA,CAAkB,OAAA,EAAS,EAAE,CAAA;AAvD3D,kBAAA,CAwDK,SAAA,GAAqB,IAAI,kBAAA,CAAkB,QAAA,EAAU,EAAE,CAAA;AAxD5D,kBAAA,CAyDK,OAAA,GAAqB,IAAI,kBAAA,CAAkB,YAAA,EAAc,EAAE,CAAA;AAzDhE,kBAAA,CA0DK,cAAA,GAAqB,IAAI,kBAAA,CAAkB,eAAA,EAAiB,EAAE,CAAA;AA1DnE,kBAAA,CA2DK,OAAA,GAAqB,IAAI,kBAAA,CAAkB,MAAA,EAAQ,EAAE,CAAA;AA3D1D,kBAAA,CA4DK,cAAA,GAAqB,IAAI,kBAAA,CAAkB,SAAA,EAAW,EAAE,CAAA;AA5D7D,kBAAA,CA6DK,QAAA,GAAqB,IAAI,kBAAA,CAAkB,aAAA,EAAe,EAAE,CAAA;AA7DjE,kBAAA,CA8DK,UAAA,GAAqB,IAAI,kBAAA,CAAkB,gBAAA,EAAkB,EAAE,CAAA;AA9DpE,kBAAA,CA+DK,aAAA,GAAqB,IAAI,kBAAA,CAAkB,qBAAA,EAAuB,EAAE,CAAA;AA/DzE,kBAAA,CAgEK,kBAAA,GAAqB,IAAI,kBAAA,CAAkB,qBAAA,EAAuB,EAAE,CAAA;AAhEzE,kBAAA,CAiEK,IAAA,GAAqB,IAAI,kBAAA,CAAkB,GAAA,EAAK,EAAE,CAAA;AAjEvD,kBAAA,CAkEK,QAAA,GAAqB,kBAAA,CAAkB,MAAA,CAAO,WAAW,CAAA;AAlE9D,kBAAA,CAmEK,iBAAA,GAAqB,kBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AAnE3D,kBAAA,CAoEK,OAAA,GAAqB,kBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA;AApE/D,kBAAA,CAqEK,WAAA,GAAqB,kBAAA,CAAkB,MAAA,CAAO,qBAAqB,CAAA;AArExE,kBAAA,CAsEK,WAAA,GAAqB,kBAAA,CAAkB,MAAA,CAAO,oCAAoC,CAAA;AAtEvF,kBAAA,CAuEK,OAAA,GAAqB,kBAAA,CAAkB,MAAA,CAAO,OAAO,CAAA;AAvEhE,IAAM,iBAAA,GAAN;;;ACpCP,IAAA,oBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA;AAaO,IAAM,UAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EAAhB,WAAA,GAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AAAA,EAAA;AAAA;AAAA,EAWL,YAAY,IAAA,EAAoB;AAC9B,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,IAAA,GAAO,IAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,IAAA,EAAoB;AAC9B,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,IAAA,GAAO,IAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,OAAO,IAAA,EAAY;AACzB,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,IAAA,GAAO,IAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,SAAS,IAAA,EAAY;AAC7B,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,MAAA,GAAS,MAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,SAAA,GAAA,QAAA,eAAyD;AACpE,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,SAAA,GAAY,SAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAA,CAAiB,gBAAgB,IAAA,EAAY;AAC3C,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,aAAA,GAAgB,aAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAIA,aAAa,UAAA,EAAuC;AAClD,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,KAAA,GACjB,OAAO,eAAe,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,iBAAiB,KAAA,EAAoC;AACnD,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,aAAA,CAAA,CAAL,WAAmB,aAAA,GAAgB,KAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAMA,mBAAmB,UAAA,EAAuC;AACxD,IAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,WAAW,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA;AAChF,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CACE,OAAA,EACA,UAAA,EACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,YAAY,UAAU,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,aAAA,CAAc,OAAyB,KAAA,EAA0B;AAC/D,IAAA,IAAA,CAAK,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAA2B;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,OAAyB,KAAA,EAA0B;AAC/D,IAAA,eAAA,CAAA,IAAA,EAAK,uCAAL,IAAA,CAAA,IAAA,CAAA,CAAqB,IAAA,GAAO,IAAI,eAAA,CAAgB,OAAO,KAAK,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,OAAyB,KAAA,EAA0B;AAChE,IAAA,eAAA,CAAA,IAAA,EAAK,uCAAL,IAAA,CAAA,IAAA,CAAA,CAAqB,KAAA,GAAQ,IAAI,eAAA,CAAgB,OAAO,KAAK,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,OAAyB,KAAA,EAA0B;AAC9D,IAAA,eAAA,CAAA,IAAA,EAAK,uCAAL,IAAA,CAAA,IAAA,CAAA,CAAqB,GAAA,GAAM,IAAI,eAAA,CAAgB,OAAO,KAAK,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,eAAA,CAAgB,OAAyB,KAAA,EAA0B;AACjE,IAAA,eAAA,CAAA,IAAA,EAAK,uCAAL,IAAA,CAAA,IAAA,CAAA,CAAqB,MAAA,GAAS,IAAI,eAAA,CAAgB,OAAO,KAAK,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,uBAAuB,SAAA,EAA2C;AAChE,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,kBAAA,CAAA,CAAL,WAAwB,UAAA,GAAa,SAAA;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,qBAAqB,SAAA,EAAyC;AAC5D,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,kBAAA,CAAA,CAAL,WAAwB,QAAA,GAAW,SAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAY,OAAO,IAAA,EAAY;AAC7B,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,kBAAA,CAAA,CAAL,WAAwB,QAAA,GAAW,IAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,SAAS,IAAA,EAAY;AAClC,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,kBAAA,CAAA,CAAL,WAAwB,WAAA,GAAc,MAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAgB,OAAA,EAAuB;AACrC,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,kBAAA,CAAA,CAAL,WAAwB,YAAA,GAAe,OAAA;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,kBAAA,CAAA,CAAL,WAAwB,MAAA,GAAS,MAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAMA,gBAAgB,YAAA,EAAgD;AAC9D,IAAA,IAAA,CAAK,eACH,OAAO,YAAA,KAAiB,WACpB,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA,GACrC,YAAA;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,SAAA,CAAU,SAAS,IAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAA,CAAiB,SAAS,IAAA,EAAY;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,KAAA,GAAmB;AACjB,IAAA,MAAM,CAAA,GAAI,IAAI,UAAA,EAAU;AACxB,IAAA,IAAI,KAAK,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,IAAA,CAAK,KAAK,KAAA,EAAM;AACxC,IAAA,CAAA,CAAE,OAAO,IAAA,CAAK,IAAA;AACd,IAAA,CAAA,CAAE,SAAS,IAAA,CAAK,MAAA;AAChB,IAAA,CAAA,CAAE,SAAA,GAAY,IAAA,CAAK,SAAA,GACf,MAAA,CAAO,MAAA,CAAO,IAAI,cAAA,EAAe,EAAG,IAAA,CAAK,SAAS,CAAA,GAClD,MAAA;AACJ,IAAA,CAAA,CAAE,eAAe,IAAA,CAAK,YAAA;AACtB,IAAA,CAAA,CAAE,WAAW,IAAA,CAAK,QAAA;AAClB,IAAA,CAAA,CAAE,WAAW,IAAA,CAAK,QAAA;AAClB,IAAA,OAAO,CAAA;AAAA,EACT;AAgBF,CAAA;AAhMO,oBAAA,GAAA,IAAA,OAAA,EAAA;AAkLL,aAAA,GAAW,WAAc;AACvB,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,IAAI,SAAA,EAAU;AAC1C,EAAA,OAAO,IAAA,CAAK,IAAA;AACd,CAAA;AAEA,eAAA,GAAa,WAAgB;AAC3B,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,IAAI,WAAA,EAAY;AAChD,EAAA,OAAO,IAAA,CAAK,MAAA;AACd,CAAA;AAEA,kBAAA,GAAgB,WAAmB;AACjC,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,IAAI,cAAA,EAAe;AACzD,EAAA,OAAO,IAAA,CAAK,SAAA;AACd,CAAA;AA/LK,IAAM,SAAA,GAAN;;;ACbP,IAAA,uBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,UAAA;AAyCO,IAAM,eAAN,MAAmB;AAAA,EAkBxB,WAAA,GAAc;AAlBT,IAAA,YAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAEL;AAAA,IAAA,IAAA,CAAQ,QAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,QAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,UAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,UAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,UAA0B,EAAC;AAGnC;AAAA,IAAA,IAAA,CAAQ,SAAA,uBAAwC,GAAA,EAAI;AACpD,IAAA,IAAA,CAAQ,SAAA,uBAAwC,GAAA,EAAI;AACpD,IAAA,IAAA,CAAQ,WAAA,uBAAwC,GAAA,EAAI;AACpD,IAAA,IAAA,CAAQ,WAAA,uBAAwC,GAAA,EAAI;AACpD;AAAA,IAAA,IAAA,CAAQ,WAAA,uBAAwC,GAAA,EAAI;AAEpD,IAAA,IAAA,CAAQ,kBAAA,GAAqB,GAAA;AAC7B,IAAA,IAAA,CAAA,OAAA,GAAU,KAAA;AAGR,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,2BAA2B,KAAA,EAA0B;AACnD,IAAA,MAAM,SAAW,KAAA,CAAM,IAAA,GAAS,sBAAK,uBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAsB,MAAM,IAAA,CAAA,GAAU,CAAA;AACtE,IAAA,MAAM,SAAW,KAAA,CAAM,IAAA,GAAS,sBAAK,uBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAsB,MAAM,IAAA,CAAA,GAAU,CAAA;AACtE,IAAA,MAAM,WAAW,KAAA,CAAM,MAAA,GAAS,sBAAK,uBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAwB,MAAM,MAAA,CAAA,GAAS,CAAA;AACvE,IAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,sBAAK,uBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAwB,MAAM,YAAA,CAAA,GAC9B,CAAA;AAEJ,IAAA,MAAM,EAAA,GAAiB;AAAA,MACrB,MAAA;AAAA,MAAQ,MAAA;AAAA,MAAQ,QAAA;AAAA,MAAU,QAAA;AAAA,MAC1B,SAAA,EAAa,MAAM,IAAA,IAAU,IAAA;AAAA,MAC7B,SAAA,EAAa,MAAM,IAAA,IAAU,IAAA;AAAA,MAC7B,WAAA,EAAa,MAAM,MAAA,IAAU,IAAA;AAAA,MAC7B,WAAA,EAAa,MAAM,YAAA,IAAgB,IAAA;AAAA,MACnC,WAAa,KAAA,CAAM,SAAA;AAAA,MACnB,UAAA,EAAa,MAAM,SAAA,IAAa,IAAA;AAAA,MAChC,UAAa,KAAA,CAAM,QAAA;AAAA,MACnB,UAAa,KAAA,CAAM,QAAA;AAAA,MACnB,SAAA,EAAa,KAAA,CAAM,QAAA,IAAY,IAAA,IAAQ,MAAM,QAAA,IAAY;AAAA,KAC3D;AAEA,IAAA,MAAM,GAAA,GAAM,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,gBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAoB,EAAA,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACzC,IAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AAEnC,IAAA,MAAM,GAAA,GAAM,KAAK,OAAA,CAAQ,MAAA;AACzB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,EAAE,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,UAAA,EAA+B;AAC1C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAClC,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,IAAI,SAAA,EAAU;AAE9B,IAAA,MAAM,CAAA,GAAI,IAAI,SAAA,EAAU;AAExB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA;AACtC,IAAA,IAAI,SAAA,IAAa,EAAA,CAAG,SAAA,EAAW,CAAA,CAAE,OAAO,SAAA,CAAU,IAAA;AAElD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA;AACtC,IAAA,IAAI,SAAA,IAAa,EAAA,CAAG,SAAA,EAAW,CAAA,CAAE,OAAO,SAAA,CAAU,IAAA;AAElD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,QAAQ,CAAA;AAC5C,IAAA,IAAI,WAAA,IAAe,EAAA,CAAG,WAAA,EAAa,CAAA,CAAE,SAAS,WAAA,CAAY,MAAA;AAE1D,IAAA,IAAI,GAAG,WAAA,EAAa;AAClB,MAAA,MAAM,YAAY,IAAI,GAAA;AAAA,QACpB,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,IAAI,CAAqB;AAAA,OAC1D;AACA,MAAA,CAAA,CAAE,YAAA,GAAe,iBAAA,CAAkB,YAAA,CAAa,EAAA,CAAG,UAAU,SAAS,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,GAAG,SAAA,IAAa,EAAA,CAAG,UAAA,EAAY,CAAA,CAAE,YAAY,EAAA,CAAG,SAAA;AACpD,IAAA,IAAI,GAAG,SAAA,EAAW;AAChB,MAAA,CAAA,CAAE,WAAW,EAAA,CAAG,QAAA;AAChB,MAAA,CAAA,CAAE,WAAW,EAAA,CAAG,QAAA;AAAA,IAClB;AAEA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,GACrC,CAAA,gBAAA,EAAmB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,kBAAA,EAAqB,CAAA,CAAE,EAAE,CAAA,cAAA,EAAiB,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,UAAA,CAAA,GACzI,EAAA;AAEJ,IAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAA,CAAM,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA;AAEpG,IAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAA,CAAM,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA;AAEpG,IAAA,MAAM,aAAa,CAAA,gBAAA,EAAmB,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,MAAA,CAAO,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,UAAA,CAAA;AAE9G,IAAA,MAAM,aAAa,CAAA,gBAAA,EAAmB,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,KAAM,sBAAK,uBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,UAAA,CAAA;AAEhH,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,IAAA,OAAO,CAAA;AAAA;AAAA,EAET,UAAU,CAAA,EAAG,QAAQ,CAAA,EAAG,QAAQ,GAAG,UAAU;AAAA;AAAA,EAE7C,UAAU;AAAA,aAAA,CAAA;AAAA,EAEV;AAAA;AAAA,EAGA,YAAY,SAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,QAAW,EAAC;AACjB,IAAA,IAAA,CAAK,QAAW,EAAC;AACjB,IAAA,IAAA,CAAK,UAAW,EAAC;AACjB,IAAA,IAAA,CAAK,UAAW,EAAC;AACjB,IAAA,IAAA,CAAK,UAAW,EAAC;AACjB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,kBAAA,GAAqB,GAAA;AAE1B,IAAA,MAAM,IAAA,GAAO,SAAS,SAAS,CAAA;AAG/B,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,IAAA,EAAM,QAAQ,CAAA,EAAG;AACrD,MAAA,MAAM,KAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AACxD,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,EAAA,EAAI,YAAY,CAAA,IAAK,EAAA;AAC1C,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,MAAM,CAAA;AAC9B,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAC7B,MAAA,IAAI,EAAA,IAAM,IAAA,CAAK,kBAAA,EAAoB,IAAA,CAAK,qBAAqB,EAAA,GAAK,CAAA;AAAA,IACpE;AAGA,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,IAAA,EAAM,OAAO,CAAA,EAAG;AACpD,MAAA,KAAA,MAAW,MAAA,IAAU,GAAG,QAAA,EAAU;AAChC,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,eAAA,CAAgB,MAAA,CAAO,QAA2D,CAAA;AACzG,QAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,QAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAK,CAAA;AAC7B,QAAA,IAAA,CAAK,UAAU,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,IAAA,EAAM,OAAO,CAAA,EAAG;AACpD,MAAA,KAAA,MAAW,MAAA,IAAU,GAAG,QAAA,EAAU;AAChC,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,eAAA,CAAgB,MAAA,CAAO,QAA2D,CAAA;AACzG,QAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,QAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAK,CAAA;AAC7B,QAAA,IAAA,CAAK,UAAU,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,IAAA,EAAM,SAAS,CAAA,EAAG;AACtD,MAAA,KAAA,MAAW,QAAA,IAAY,GAAG,QAAA,EAAU;AAClC,QAAA,MAAM,SAAS,WAAA,CAAY,eAAA;AAAA,UACzB,QAAA,CAAS,QAAA;AAAA,UACT,QAAA,CAAS;AAAA,SACX;AACA,QAAA,MAAM,GAAA,GAAM,OAAO,QAAA,EAAS;AAC5B,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAK,CAAA;AACjC,QAAA,IAAA,CAAK,YAAY,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,MACnD;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,IAAA,EAAM,SAAS,CAAA,EAAG;AACtD,MAAA,KAAA,MAAW,IAAA,IAAQ,GAAG,QAAA,EAAU;AAC9B,QAAA,MAAM,EAAA,GAAiB;AAAA,UACrB,QAAW,QAAA,CAAS,OAAA,CAAQ,MAAM,QAAQ,CAAA,IAAQ,KAAK,EAAE,CAAA;AAAA,UACzD,QAAW,QAAA,CAAS,OAAA,CAAQ,MAAM,QAAQ,CAAA,IAAQ,KAAK,EAAE,CAAA;AAAA,UACzD,UAAW,QAAA,CAAS,OAAA,CAAQ,MAAM,UAAU,CAAA,IAAM,KAAK,EAAE,CAAA;AAAA,UACzD,UAAW,QAAA,CAAS,OAAA,CAAQ,MAAM,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,UACxD,SAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAA,KAAQ,GAAA;AAAA,UAC9C,SAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAA,KAAQ,GAAA;AAAA,UAC9C,WAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,aAAa,CAAA,KAAM,GAAA;AAAA,UAC9C,WAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,mBAAmB,CAAA,KAAM,GAAA;AAAA,UACpD,UAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,gBAAgB,CAAA,KAAM,GAAA;AAAA,UACjD,SAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,iBAAiB,CAAA,KAAM;AAAA,SACpD;AAGA,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,KAAM,WAAW,CAAA;AACrF,QAAA,IAAI,SAAS,EAAA,CAAG,SAAA,GAAY,cAAA,CAAe,YAAA,CAAa,QAAQ,UAAU,CAAA;AAE1E,QAAA,MAAM,GAAA,GAAM,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,gBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAoB,EAAA,CAAA;AAChC,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,EAAE,CAAA;AACpB,QAAA,IAAA,CAAK,YAAY,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,MACnD;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,wBAAU,uBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,wBAAQ,uBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAAA,EACjC;AAwHF;AAxUO,uBAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AAoNL,eAAA,GAAa,WAAS;AAEpB,EAAA,MAAM,WAAA,GAAc,IAAI,SAAA,CAAU,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,IAAI,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,YAAY,QAAA,EAAS;AACrC,EAAA,IAAA,CAAK,QAAQ,CAAC,EAAE,MAAM,WAAA,EAAa,GAAA,EAAK,SAAS,CAAA;AACjD,EAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA;AAG7B,EAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAA,MAAA,YAA+B;AACpD,EAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAA,SAAA,eAAkC;AACvD,EAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,IACX,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,QAAA,CAAS,UAAS,EAAE;AAAA,IAC3C,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,QAAA,CAAS,UAAS;AAAE,GAC7C;AACA,EAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,QAAA,IAAY,CAAC,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,QAAA,IAAY,CAAC,CAAA;AAGzC,EAAA,MAAM,aAAA,GAAgB,IAAI,WAAA,EAAY;AACtC,EAAA,MAAM,SAAA,GAAY,cAAc,QAAA,EAAS;AACzC,EAAA,IAAA,CAAK,UAAU,CAAC,EAAE,QAAQ,aAAA,EAAe,GAAA,EAAK,WAAW,CAAA;AACzD,EAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,CAAC,CAAA;AAGjC,EAAA,MAAM,SAAA,GAAwB;AAAA,IAC5B,MAAA,EAAQ,CAAA;AAAA,IAAG,MAAA,EAAQ,CAAA;AAAA,IAAG,QAAA,EAAU,CAAA;AAAA,IAAG,QAAA,EAAU,CAAA;AAAA,IAC7C,SAAA,EAAW,KAAA;AAAA,IAAO,SAAA,EAAW,KAAA;AAAA,IAAO,WAAA,EAAa,KAAA;AAAA,IACjD,WAAA,EAAa,KAAA;AAAA,IAAO,UAAA,EAAY,KAAA;AAAA,IAAO,SAAA,EAAW;AAAA,GACpD;AACA,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,gBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAoB,SAAA,CAAA;AAClC,EAAA,IAAA,CAAK,OAAA,GAAU,CAAC,SAAS,CAAA;AACzB,EAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA;AAC/B,CAAA;AAEA,kBAAA,GAAgB,SAAC,IAAA,EAAyB;AACxC,EAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACvC,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,MAAA;AACvB,EAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAK,CAAA;AAC7B,EAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAC3B,EAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,EAAA,OAAO,GAAA;AACT,CAAA;AAEA,kBAAA,GAAgB,SAAC,IAAA,EAAyB;AACxC,EAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACvC,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,MAAA;AACvB,EAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAK,CAAA;AAC7B,EAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAC3B,EAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,EAAA,OAAO,GAAA;AACT,CAAA;AAEA,oBAAA,GAAkB,SAAC,MAAA,EAA6B;AAC9C,EAAA,MAAM,GAAA,GAAM,OAAO,QAAA,EAAS;AAC5B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACzC,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,MAAM,GAAA,GAAM,KAAK,OAAA,CAAQ,MAAA;AACzB,EAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAK,CAAA;AACjC,EAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAC7B,EAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,EAAA,OAAO,GAAA;AACT,CAAA;AAEA,oBAAA,GAAkB,SAAC,GAAA,EAAgC;AAEjD,EAAA,IAAI,IAAI,QAAA,GAAW,CAAA,IAAK,IAAI,QAAA,GAAW,GAAA,SAAY,GAAA,CAAI,QAAA;AACvD,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,SAAA,EAAW,OAAO,CAAA;AAEzC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,UAAU,CAAA;AACpD,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AAEnC,EAAA,MAAM,KAAK,IAAA,CAAK,kBAAA,EAAA;AAChB,EAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,EAAE,IAAI,IAAA,EAAM,GAAA,CAAI,YAAY,CAAA;AAC9C,EAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AACvC,EAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,EAAA,OAAO,EAAA;AACT,CAAA;AAEA,gBAAA,GAAc,SAAC,EAAA,EAAwB;AACrC,EAAA,OAAO;AAAA,IACL,EAAA,CAAG,MAAA;AAAA,IAAQ,EAAA,CAAG,MAAA;AAAA,IAAQ,EAAA,CAAG,QAAA;AAAA,IAAU,EAAA,CAAG,QAAA;AAAA,IACtC,EAAA,CAAG,SAAA;AAAA,IAAW,EAAA,CAAG,SAAA;AAAA,IAAW,EAAA,CAAG,WAAA;AAAA,IAAa,EAAA,CAAG,WAAA;AAAA,IAC/C,EAAA,CAAG,UAAA;AAAA,IAAY,EAAA,CAAG,SAAA;AAAA,IAClB,EAAA,CAAG,SAAA,EAAW,QAAA,EAAS,IAAK,EAAA;AAAA,IAC5B,GAAG,QAAA,IAAY,EAAA;AAAA,IACf,GAAG,QAAA,IAAY;AAAA,GACjB,CAAE,KAAK,GAAG,CAAA;AACZ,CAAA;AAEA,UAAA,GAAQ,SAAC,EAAA,EAAwB;AAC/B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,UAAA,EAAa,GAAG,QAAQ,CAAA,CAAA,CAAA;AAAA,IACxB,CAAA,QAAA,EAAW,GAAG,MAAM,CAAA,CAAA,CAAA;AAAA,IACpB,CAAA,QAAA,EAAW,GAAG,MAAM,CAAA,CAAA,CAAA;AAAA,IACpB,CAAA,UAAA,EAAa,GAAG,QAAQ,CAAA,CAAA,CAAA;AAAA,IACxB,CAAA,QAAA,CAAA;AAAA,IACA,EAAA,CAAG,YAAc,eAAA,GAA6B,EAAA;AAAA,IAC9C,EAAA,CAAG,YAAc,eAAA,GAA6B,EAAA;AAAA,IAC9C,EAAA,CAAG,cAAc,iBAAA,GAA6B,EAAA;AAAA,IAC9C,EAAA,CAAG,cAAc,uBAAA,GAA6B,EAAA;AAAA,IAC9C,EAAA,CAAG,aAAc,oBAAA,GAA6B,EAAA;AAAA,IAC9C,EAAA,CAAG,YAAc,qBAAA,GAA6B;AAAA,GAChD,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE1B,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,SAAA,EAAW,KAAA,EAAM,IAAK,EAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,SAAA,GACf,CAAA,WAAA,EAAc,EAAA,CAAG,aAAa,MAAA,GAAY,CAAA,SAAA,EAAY,EAAA,CAAG,QAAA,GAAW,GAAA,GAAM,GAAG,MAAM,EAAE,CAAA,EAAG,EAAA,CAAG,QAAA,KAAa,MAAA,GAAY,CAAA,SAAA,EAAY,EAAA,CAAG,QAAA,GAAW,GAAA,GAAM,GAAG,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAA,CAAA,GAC/J,EAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,OAAA;AACzB,EAAA,OAAO,QAAQ,CAAA,IAAA,EAAO,KAAK,IAAI,KAAK,CAAA,KAAA,CAAA,GAAU,OAAO,KAAK,CAAA,EAAA,CAAA;AAC5D,CAAA;AAGF,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,QAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACpG;;;AChWO,SAAS,aAAa,aAAA,EAAsC;AACjE,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,MAAM,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAEzD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,MAAA,GAAS,CAAA;AAGb,EAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,IAAK,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,IAAK,EAAA,EAAI;AAC3E,IAAA,MAAA,GAAS,MAAA,GAAS,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,GAAI,EAAA,CAAA;AAC5C,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,aAAa,CAAA,iCAAA,CAA8B,CAAA;AAAA,EACzF;AAGA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAE/B,EAAA,IAAI,MAAM,GAAG,CAAA,IAAK,GAAA,GAAM,CAAA,IAAK,WAAW,EAAA,EAAI;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,aAAa,CAAA,mCAAA,CAAgC,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AACvB;AAUO,SAAS,iBAAA,CAAkB,KAAa,MAAA,EAAwB;AACrE,EAAA,IAAI,MAAM,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAA,CAAG,CAAA;AACjE,EAAA,IAAI,SAAS,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAA,CAAG,CAAA;AAE1E,EAAA,OAAO,CAAA,EAAG,YAAA,CAAa,MAAM,CAAC,GAAG,GAAG,CAAA,CAAA;AACtC;AAUO,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,IAAI,SAAS,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAA,CAAG,CAAA;AAE1E,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,GAAA,GAAM,MAAA;AAEV,EAAA,OAAO,MAAM,CAAA,EAAG;AACd,IAAA,MAAM,SAAA,GAAA,CAAa,MAAM,CAAA,IAAK,EAAA;AAC9B,IAAA,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,EAAA,GAAK,SAAS,CAAA,GAAI,MAAA;AAC/C,IAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAA,CAAO,GAAA,GAAM,SAAA,IAAa,EAAE,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAE9D,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,GAAO,EAAA,IAAM,IAAA,GAAO,EAAA,EAAI;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,IACxD;AACA,IAAA,GAAA,GAAM,GAAA,GAAM,MAAM,IAAA,GAAO,EAAA,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,cAAc,cAAA,EAK5B;AACA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,cAAc,CAAA,kCAAA,CAA+B,CAAA;AAAA,EAC5F;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,CAAC,CAAE,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,CAAM,CAAC,CAAE,CAAA;AAElC,EAAA,IAAI,MAAM,GAAA,GAAM,GAAA,CAAI,OAAO,KAAA,CAAM,MAAA,GAAS,IAAI,MAAA,EAAQ;AACpD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,6BAA6B,cAAc,CAAA,uCAAA;AAAA,KAC7C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAU,KAAA,CAAM,GAAA;AAAA,IAChB,aAAa,KAAA,CAAM,MAAA;AAAA,IACnB,QAAQ,GAAA,CAAI,GAAA;AAAA,IACZ,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;;;ACrIA,IAAM,WAAA,GAAc,KAAK,GAAA,CAAI,IAAA,EAAM,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACrD,IAAM,UAAA,GAAa,KAAA;AASZ,SAAS,SAAS,IAAA,EAAoB;AAC3C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,IACjB,KAAK,WAAA,EAAY;AAAA,IACjB,KAAK,QAAA,EAAS;AAAA,IACd,KAAK,OAAA,EAAQ;AAAA,IACb,KAAK,QAAA,EAAS;AAAA,IACd,KAAK,UAAA,EAAW;AAAA,IAChB,KAAK,UAAA,EAAW;AAAA,IAChB,KAAK,eAAA;AAAgB,GACvB;AACA,EAAA,OAAA,CAAQ,QAAQ,WAAA,IAAe,UAAA;AACjC;AASO,SAAS,WAAW,MAAA,EAAsB;AAC/C,EAAA,MAAM,EAAA,GAAK,cAAc,MAAA,GAAS,UAAA;AAClC,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,CAAA;AAErB,EAAA,OAAO,IAAI,IAAA;AAAA,IACT,EAAE,cAAA,EAAe;AAAA,IACjB,EAAE,WAAA,EAAY;AAAA,IACd,EAAE,UAAA,EAAW;AAAA,IACb,EAAE,WAAA,EAAY;AAAA,IACd,EAAE,aAAA,EAAc;AAAA,IAChB,EAAE,aAAA,EAAc;AAAA,IAChB,EAAE,kBAAA;AAAmB,GACvB;AACF;AAMA,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AAKzE,SAAS,eAAe,QAAA,EAA2B;AACxD,EAAA,OAAO,eAAA,CAAgB,IAAI,QAAQ,CAAA;AACrC;AAKO,SAAS,iBAAiB,UAAA,EAA6B;AAC5D,EAAA,MAAM,KAAA,GAAQ,WAAW,WAAA,EAAY;AACrC,EAAA,OACE,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAClB,MAAM,QAAA,CAAS,GAAG,CAAA,IACjB,KAAA,CAAM,SAAS,GAAG,CAAA,IAAK,CAAC,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,EAC7C,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAClB,KAAA,CAAM,SAAS,IAAI,CAAA,IACnB,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAEvB;;;ACnFA,IAAA,KAAA,EAAA,cAAA,EAAA,OAAA,EAAA,eAAA,EAAA,cAAA;AAkCO,IAAM,OAAN,MAAW;AAAA;AAAA,EAMhB,WAAA,CAAY,IAAA,EAAgB,aAAA,EAAoC,MAAA,EAAsB;AANjF,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,cAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAIP,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ,IAAA,CAAA;AACb,IAAA,YAAA,CAAA,IAAA,EAAK,cAAA,EAAiB,aAAA,CAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,MAAA,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAoB;AAAE,IAAA,OAAO,mBAAK,KAAA,CAAA,CAAM,SAAA;AAAA,EAAW;AAAA;AAAA,EAGvD,IAAI,GAAA,GAAc;AAAE,IAAA,OAAO,YAAA,CAAa,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,SAAS,CAAA,CAAE,GAAA;AAAA,EAAK;AAAA;AAAA,EAGnE,IAAI,MAAA,GAAiB;AAAE,IAAA,OAAO,YAAA,CAAa,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,SAAS,CAAA,CAAE,MAAA;AAAA,EAAQ;AAAA,EAczE,SAAS,KAAA,EAAwB;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,OAAA,GAAU,MAAA;AAErB,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAe,QAAA,CAAS,KAAK,CAAA;AAC9C,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,GAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,GAAW,MAAA,CAAO,GAAG,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,GAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,GAAW,KAAA,GAAQ,GAAA,GAAM,GAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,GAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AAE5C,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,UAAA,KAAe,CAAA,EAAG;AAC/B,QAAA,MAAM,KAAA,GAAQ,IAAI,SAAA,EAAU;AAC5B,QAAA,KAAA,CAAM,eAAA,CAAgB,kBAAkB,SAAS,CAAA;AACjD,QAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,UAAA,GAAa,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,2BAA2B,KAAK,CAAA;AAAA,MACvE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,GAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAAsB;AACpB,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,KAAa,MAAA,IAAa,mBAAK,KAAA,CAAA,CAAM,QAAA,KAAa,IAAI,OAAO,IAAA;AAE5E,IAAA,QAAQ,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA;AAAU,MAC3B,KAAK,GAAA,EAAK;AACR,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,UAAU,EAAE,CAAA;AAC5C,QAAA,OAAO,mBAAK,cAAA,CAAA,CAAe,YAAA,CAAa,GAAG,CAAA,IAAK,mBAAK,KAAA,CAAA,CAAM,QAAA;AAAA,MAC7D;AAAA,MACA,KAAK,GAAA;AACH,QAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,KAAa,GAAA;AAAA,MACjC,KAAK,KAAA;AACH,QAAA,OAAO,mBAAK,KAAA,CAAA,CAAM,QAAA;AAAA,MACpB,SAAS;AAEP,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAQ,CAAA;AAC1C,QAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,mBAAK,KAAA,CAAA,CAAM,QAAA;AAGlC,QAAA,IAAI,eAAA,CAAA,IAAA,EAAK,iCAAL,IAAA,CAAA,IAAA,CAAA,EAAqB;AACvB,UAAA,IAAI;AAAE,YAAA,OAAO,WAAW,GAAG,CAAA;AAAA,UAAG,CAAA,CAAA,MAAQ;AAAE,YAAA,OAAO,GAAA;AAAA,UAAK;AAAA,QACtD;AACA,QAAA,OAAO,GAAA;AAAA,MACT;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAkB;AAChB,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,EAAA;AACzB,IAAA,IAAI,GAAA,YAAe,IAAA,EAAM,OAAO,GAAA,CAAI,kBAAA,EAAmB;AACvD,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,OAAA,EAAuB;AAChC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,0BAA0B,CAAA;AACxD,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,UAAW,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AACnE,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,QAAA,EAA+B;AACzC,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,WAAW,QAAA,IAAY,MAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,WAAA,GAA6B;AAC3B,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,IAAY,IAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iBAAiB,KAAA,EAAwB;AACvC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,KAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,KAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,GAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,GAAW,KAAA,GAAQ,GAAA,GAAM,GAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,GAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,GAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,UAAA,GAA4B;AAC1B,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAM,OAAA,IAAW,IAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,mBAAK,KAAA,CAAA,CAAM,OAAA,KAAY,MAAA,IAAa,YAAA,CAAA,IAAA,EAAK,OAAM,OAAA,KAAY,EAAA;AAAA,EACpE;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAAmB;AACrB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,YAAA,CAAa,YAAA,CAAA,IAAA,EAAK,OAAM,UAAU,CAAA;AAAA,EACxD;AAAA;AAAA,EAGA,IAAI,MAAM,KAAA,EAAkB;AAC1B,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,UAAA,GAAa,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,2BAA2B,KAAK,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,MAAA,EAA0C;AACnD,IAAA,MAAM,CAAA,GAAI,mBAAK,OAAA,CAAA,CAAQ,YAAA,CAAa,mBAAK,KAAA,CAAA,CAAM,UAAU,EAAE,KAAA,EAAM;AACjE,IAAA,MAAA,CAAO,CAAC,CAAA;AACR,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,UAAA,GAAa,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,2BAA2B,CAAC,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,OAAA,CAAQ,OAAO,IAAA,EAAqC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,EAAG;AAAA,EACpG,SAAA,CAAU,SAAS,IAAA,EAAiC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAAG;AAAA,EACxG,YAAY,IAAA,EAAwC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EAAG;AAAA,EACxG,aAAa,KAAA,EAAuC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,YAAA,CAAa,KAAmB,CAAC,CAAA;AAAA,EAAG;AAAA,EACxH,YAAY,IAAA,EAAwC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EAAG;AAAA,EACxG,mBAAmB,KAAA,EAAiC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,kBAAA,CAAmB,KAAmB,CAAC,CAAA;AAAA,EAAG;AAAA,EAC9H,WAAA,CAAY,OAAO,IAAA,EAAiC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EAAG;AAAA,EACxG,uBAAuB,CAAA,EAAmC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,sBAAA,CAAuB,CAAC,CAAC,CAAA;AAAA,EAAG;AAAA,EACtH,qBAAqB,CAAA,EAAoC;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,oBAAA,CAAqB,CAAC,CAAC,CAAA;AAAA,EAAG;AAAA,EACnH,aAAA,CAAc,OAAyB,KAAA,EAA0B;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,EAAE,aAAA,CAAc,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,EAAG;AAAA,EAI/H,gBAAgB,YAAA,EAAgD;AAC9D,IAAA,OAAO,KAAK,UAAA,CAAW,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,CAAgB,YAAiC,CAAC,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,OAAA,GAAW,MAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GAAW,MAAA;AAAA,EACxB;AAAA;AAAA,EAGA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,UAAA,GAAa,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgB;AACd,IAAA,MAAM,GAAA,GAAQ,mBAAK,KAAA,CAAA,CAAM,SAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,mBAAK,KAAA,CAAA,CAAM,UAAA,GAAa,IAAI,CAAA,IAAA,EAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,UAAU,CAAA,CAAA,CAAA,GAAM,EAAA;AAC5E,IAAA,MAAM,IAAA,GAAQ,mBAAK,KAAA,CAAA,CAAM,QAAA,GAAW,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAEpE,IAAA,MAAM,UAAA,GAAa,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,OAAA,GACzB,YAAA,CAAA,IAAA,EAAK,OAAM,QAAA,GACR,CAAA,kBAAA,EAAqB,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAQ,CAAA,iBAAA,EAAoB,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,OAAO,CAAC,CAAA,IAAA,CAAA,GACtF,CAAA,GAAA,EAAM,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,OAAO,CAAC,CAAA,IAAA,CAAA,GACpC,EAAA;AAEJ,IAAA,MAAM,QAAA,GACJ,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,KAAa,UAAa,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAA,KAAa,EAAA,GACzD,MAAM,MAAA,CAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,QAAQ,CAAC,CAAA,IAAA,CAAA,GACjC,EAAA;AAEN,IAAA,IAAI,CAAC,cAAc,CAAC,QAAA,IAAY,mBAAK,KAAA,CAAA,CAAM,UAAA,KAAe,GAAG,OAAO,EAAA;AAEpE,IAAA,OAAO,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,OAAO,cAAA,CACL,EAAA,EAIA,GAAA,EACU;AACV,IAAA,MAAM,QAAA,GAAY,EAAA,CAAG,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA;AACxC,IAAA,MAAM,aAAa,QAAA,CAAS,EAAA,CAAG,WAAW,GAAG,CAAA,IAAK,KAAK,EAAE,CAAA;AAEzD,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,KAAA,MAAW,KAAA,IAAS,GAAG,QAAA,EAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,MAAA,IAAI,GAAA,KAAQ,GAAA,EAAK,QAAA,GAAW,KAAA,CAAM,WAAA;AAClC,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAA,GAAU,KAAA,CAAM,WAAA;AAEhB,QAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,CAAW,GAAG,MAAM,OAAA,IAAW,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,EAAG;AACpF,UAAA,QAAA,GAAW,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,GAAA,EAAK,UAAU,QAAA,EAAU,OAAA,EAAS,UAAU,UAAA,EAAW;AAAA,EAC7E;AAUF;AA1TW,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,cAAA,GAAA,IAAA,OAAA,EAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA;AAHJ,eAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AAqTL,cAAA,GAAY,WAAY;AACtB,EAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,YAAA,CAAa,YAAA,CAAA,IAAA,EAAK,OAAM,UAAU,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,CAAM,YAAA,EAAc,OAAO,KAAA;AAChC,EAAA,IAAI,cAAA,CAAe,KAAA,CAAM,YAAA,CAAa,QAAQ,GAAG,OAAO,IAAA;AACxD,EAAA,OAAO,gBAAA,CAAiB,KAAA,CAAM,YAAA,CAAa,UAAU,CAAA;AACvD,CAAA;AAGF,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC5E;;;ACjWA,IAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,UAAA;AAaO,IAAM,QAAN,MAAY;AAAA,EAQjB,WAAA,CAAY,OAAkB,cAAA,EAAwB;AARjD,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AAGP,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,EAAS,KAAA,CAAA;AACd,IAAA,YAAA,CAAA,IAAA,EAAK,QAAA,EAAW,eAAe,WAAA,EAAY,CAAA;AAC3C,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,QAAQ,SAAA,EAAU,GAAI,cAAc,cAAc,CAAA;AACjF,IAAA,YAAA,CAAA,IAAA,EAAK,SAAA,EAAe,QAAA,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,YAAA,EAAe,WAAA,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAe,MAAA,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,UAAA,EAAe,SAAA,CAAA;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA;AAAA,EAAU;AAAA;AAAA,EAG9C,IAAI,QAAA,GAAmB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,GAAU,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,GAAY,CAAA;AAAA,EAAG;AAAA;AAAA,EAGnE,IAAI,WAAA,GAAsB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,GAAa,YAAA,CAAA,IAAA,EAAK,YAAA,CAAA,GAAe,CAAA;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5E,UAAU,MAAA,EAA6B;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,IAAU,mBAAK,SAAA,CAAA,GAAY,CAAA,IAAK,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,EAAS,CAAA,EAAA,EAAK;AAC5E,MAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,IAAU,mBAAK,YAAA,CAAA,GAAe,CAAA,IAAK,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,EAAY,CAAA,EAAA,EAAK;AACrF,QAAA,MAAM,IAAA,GAAO,mBAAK,MAAA,CAAA,CAAO,OAAA,CAAQ,mBAAK,SAAA,CAAA,GAAY,CAAA,EAAG,YAAA,CAAA,IAAA,EAAK,YAAA,CAAA,GAAe,CAAC,CAAA;AAC1E,QAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,QAAA,IAAA,CAAK,SAAS,GAAY,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA2B;AACzB,IAAA,MAAM,SAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,UAAU,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,MAAmB,EAAC;AAC1B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,aAAa,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,IAAA,GAAO,mBAAK,MAAA,CAAA,CAAO,UAAA,CAAW,mBAAK,SAAA,CAAA,GAAY,CAAA,EAAG,YAAA,CAAA,IAAA,EAAK,YAAA,CAAA,GAAe,CAAC,CAAA;AAC7E,QAAA,GAAA,CAAI,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,QAAA,KAAa,IAAI,CAAA;AAAA,MACxC;AACA,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,KAAA,IAAS,MAAM,YAAA,CAAA,IAAA,EAAK,YAAA,CAAA,EAAc,GAAA,IAAO,YAAA,CAAA,IAAA,EAAK,aAAY,GAAA,EAAA,EAAO;AAC/D,MAAA,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAc,GAAG,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,SAAS,KAAA,EAAwB;AAC/B,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,WAAc,CAAA,IAAA,KAAQ;AAAE,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IAAO,CAAA,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAAA,EAA0C;AACnD,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,MAAM,CAAA,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,OAAO,IAAA,EAAY;AACzB,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,QAAQ,IAAI,CAAA,CAAA;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,IAAA,EAAoB;AAC9B,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,YAAY,IAAI,CAAA,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,KAAA,EAAkC;AAC7C,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,aAAa,KAAmB,CAAA,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,IAAA,EAAoB;AAC9B,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,YAAY,IAAI,CAAA,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,mBAAmB,KAAA,EAAkC;AACnD,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,mBAAmB,KAAmB,CAAA,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,OAAyB,KAAA,EAA0B;AAC/D,IAAA,eAAA,CAAA,IAAA,EAAK,8BAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA,CAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,uBAAuB,SAAA,EAA2C;AAChE,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,uBAAuB,SAAS,CAAA,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,qBAAqB,SAAA,EAAyC;AAC5D,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,qBAAqB,SAAS,CAAA,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAY,OAAO,IAAA,EAAY;AAC7B,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,YAAY,IAAI,CAAA,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAIA,gBAAgB,YAAA,EAAgD;AAC9D,IAAA,eAAA,CAAA,IAAA,EAAK,gBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,YAAiC,CAAA,CAAA;AAC5E,IAAA,OAAO,IAAA;AAAA,EACT;AAWF;AArJW,MAAA,GAAA,IAAA,OAAA,EAAA;AACA,SAAA,GAAA,IAAA,OAAA,EAAA;AACA,YAAA,GAAA,IAAA,OAAA,EAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;AACA,QAAA,GAAA,IAAA,OAAA,EAAA;AANJ,gBAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AA+IL,UAAA,GAAQ,SAAC,MAAA,EAAgE;AACvE,EAAA,KAAA,IAAS,IAAI,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,EAAW,CAAA,IAAK,YAAA,CAAA,IAAA,EAAK,UAAS,CAAA,EAAA,EAAK;AACnD,IAAA,KAAA,IAAS,IAAI,YAAA,CAAA,IAAA,EAAK,YAAA,CAAA,EAAc,CAAA,IAAK,YAAA,CAAA,IAAA,EAAK,aAAY,CAAA,EAAA,EAAK;AACzD,MAAA,MAAA,CAAO,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AACF,CAAA;;;AClKF,IAAAC,iBAAAC,QAAAA,EAAA,KAAA,EAAA,KAAA,EAAA,KAAA,EAAA,WAAA,EAAA,KAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,0BAAA,EAAA,oBAAA,EAAA,iBAAA;AAgEO,IAAM,YAAN,MAAgB;AAAA;AAAA,EAerB,WAAA,CAAY,IAAA,EAAc,aAAA,EAAoC,MAAA,EAAsB;AAf/E,IAAA,YAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAASD,eAAAA,CAAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAASC,QAAAA,CAAAA;AAET,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,sBAAkC,GAAA,EAAI,CAAA;AACtC,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,EAAkB,EAAC,CAAA;AACnB,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAA2B,EAAC,CAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAqC,EAAC,CAAA;AACtC,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAA+B,SAAA,CAAA;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAA,SAAA,EAA+B,EAAC,CAAA;AAI9B,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ,IAAA,CAAA;AACb,IAAA,YAAA,CAAA,IAAA,EAAKD,eAAAA,EAAiB,aAAA,CAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAKC,QAAAA,EAAU,MAAA,CAAA;AAAA,EACjB;AAAA;AAAA,EAIA,IAAI,IAAA,GAAe;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA;AAAA,EAAO;AAAA,EACxC,IAAI,KAAK,KAAA,EAAe;AACtB,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAC7D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ,KAAA,CAAA;AAAA,EACf;AAAA,EAUA,OAAA,CAAQ,UAA2B,MAAA,EAAuB;AACxD,IAAA,MAAM,GAAA,GAAM,OAAO,QAAA,KAAa,QAAA,GAC5B,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,WAAA,EAAY,GACxC,iBAAA,CAAkB,UAAU,MAAO,CAAA;AAEvC,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,YAAA,CAAa,GAAG,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,iBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAqB,GAAA,CAAA;AACrC,IAAA,IAAI,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,QAAA,GAAW,EAAE,SAAA,EAAW,GAAA,EAAK,UAAA,EAAY,CAAA,EAAE;AAC3C,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,IAAI,IAAA,CAAK,QAAA,EAAU,YAAA,CAAA,IAAA,EAAKD,eAAAA,CAAAA,EAAgB,mBAAKC,QAAAA,CAAO,CAAA;AAAA,EAC7D;AAAA,EAQA,UAAA,CAAW,UAA2B,MAAA,EAA8B;AAClE,IAAA,MAAM,GAAA,GAAM,OAAO,QAAA,KAAa,QAAA,GAC5B,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,WAAA,EAAY,GACxC,iBAAA,CAAkB,UAAU,MAAO,CAAA;AAEvC,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,YAAA,CAAa,GAAG,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,OAAO,IAAI,IAAA,CAAK,QAAA,EAAU,YAAA,CAAA,IAAA,EAAKD,eAAAA,CAAAA,EAAgB,mBAAKC,QAAAA,CAAO,CAAA;AAAA,EAC7D;AAAA,EAKA,IAAA,CAAK,UAA2B,MAAA,EAAuB;AACrD,IAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GACvB,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,GACrB,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,MAAO,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,SAAS,cAAA,EAA+B;AACtC,IAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,kCAAkC,CAAA;AACvE,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,EAAM,cAAc,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,aAAa,SAAA,EAA4B;AACvC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,UAAS,IAAK,IAAA;AAAA,EACnD;AAAA;AAAA,EAGA,eAAe,SAAA,EAAkC;AAC/C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,YAAW,IAAK,IAAA;AAAA,EACrD;AAAA;AAAA,EAGA,cAAc,SAAA,EAAkC;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,aAAY,IAAK,IAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAA,GAAwD;AAC1D,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,GAAA,IAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,MAAA,EAAO,EAAG;AACrC,MAAA,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,KAAS,CAAA,EAAG;AAC1B,MAAA,IAAI,GAAA,CAAI,QAAA,GAAW,QAAA,EAAU,QAAA,GAAW,GAAA,CAAI,QAAA;AAC5C,MAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,KAAA,CAAM,IAAA,EAAK,EAAG;AAClC,QAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAG,CAAA,CAAE,MAAA;AAC9B,QAAA,IAAI,GAAA,GAAM,aAAa,WAAA,GAAc,GAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AAAA,EACjC;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,aAAqB,KAAA,EAAqB;AACvD,IAAA,IAAI,WAAA,GAAc,CAAA,EAAG,MAAM,IAAI,WAAW,4BAA4B,CAAA;AACtE,IAAA,IAAI,KAAA,IAAS,CAAA,EAAG,MAAM,IAAI,WAAW,oBAAoB,CAAA;AAGzD,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,CAAA,CAAE,GAAA,IAAO,WAAA,IAAe,CAAA,CAAE,GAAA,IAAO,WAAA,CAAY,CAAA,CAAA;AACnF,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,WAAA,EAAa,KAAK,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,CAAA;AAChF,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,cAAc,WAAA,EAA2B;AACvC,IAAA,IAAI,WAAA,GAAc,CAAA,EAAG,MAAM,IAAI,WAAW,4BAA4B,CAAA;AAEtE,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,GAAA,IAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,MAAA,EAAO,EAAG;AACrC,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,GAAA,CAAI,QAAA,EAAU,WAAW,CAAA;AACvD,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAClC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,OAAO,IAAI,IAAA,CAAK,UAAU,YAAA,CAAA,IAAA,EAAKD,eAAAA,CAAAA,EAAgB,mBAAKC,QAAAA,CAAO,CAAA;AACjE,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,MAAA;AAC/B,QAAA,IAAI,OAAA,GAAU,QAAQ,MAAA,GAAS,OAAA;AAAA,MACjC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,aAAa,IAAA,CAAK,GAAA,CAAI,SAAS,GAAA,GAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,YAAA,CAAa,UAAkB,MAAA,EAAsB;AACnD,IAAA,IAAI,QAAA,GAAW,CAAA,EAAG,MAAM,IAAI,WAAW,yBAAyB,CAAA;AAChE,IAAA,IAAI,MAAA,IAAU,CAAA,EAAG,MAAM,IAAI,WAAW,qBAAqB,CAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,iBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAqB,QAAA,CAAA;AACjC,IAAA,GAAA,CAAI,MAAA,GAAS,MAAA;AACb,IAAA,GAAA,CAAI,YAAA,GAAe,IAAA;AAAA,EACrB;AAAA;AAAA,EAGA,YAAA,CAAa,QAAA,EAAkB,MAAA,GAAS,IAAA,EAAY;AAClD,IAAA,IAAI,QAAA,GAAW,CAAA,EAAG,MAAM,IAAI,WAAW,yBAAyB,CAAA;AAChE,IAAA,eAAA,CAAA,IAAA,EAAK,oBAAA,EAAA,iBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAqB,QAAA,CAAA,CAAU,MAAA,GAAS,MAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,YAAY,QAAA,EAA2B;AACrC,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,MAAA,KAAW,IAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,WAAW,cAAA,EAA8B;AACvC,IAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,kCAAkC,CAAA;AACvE,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,IAAA,CAAK,EAAE,GAAA,EAAK,gBAAgB,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,aAAa,cAAA,EAA8B;AACzC,IAAA,YAAA,CAAA,IAAA,EAAK,aAAc,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,cAAc,CAAA,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,CAAY,KAAa,MAAA,EAAsB;AAC7C,IAAA,IAAI,GAAA,GAAM,CAAA,EAAM,MAAM,IAAI,WAAW,mBAAmB,CAAA;AACxD,IAAA,IAAI,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,WAAW,sBAAsB,CAAA;AAC3D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAS,QAAQ,CAAA,IAAK,MAAA,KAAW,IAAK,MAAA,GAAY,EAAE,KAAK,MAAA,EAAO,CAAA;AAAA,EACvE;AAAA;AAAA,EAGA,cAAc,cAAA,EAA8B;AAC1C,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,EAAc,EAAE,GAAA,EAAK,cAAA,EAAe,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAA,CAAsB,WAAmB,WAAA,EAA2B;AAClE,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAiB,IAAA,CAAK,EAAE,OAAO,SAAA,EAAW,OAAA,EAAS,aAAa,CAAA;AAAA,EACvE;AAAA;AAAA,EAGA,cAAc,KAAA,EAA8B;AAC1C,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,EAAc,KAAA,CAAA;AAAA,EACrB;AAAA,EAEA,IAAI,UAAA,GAA8B;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA;AAAA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7D,mBAAmB,QAAA,EAAiC;AAClD,IAAA,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,IAAI,WAAA,GAAuB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,WAAU,MAAA,GAAS,CAAA;AAAA,EAAG;AAAA;AAAA,EAG/D,IAAI,gBAAA,GAA+C;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA;AAAA,EAAW;AAAA;AAAA;AAAA,EAK5E,QAAA,GAAmB;AACjB,IAAA,MAAM,OAAA,GAAU,sBAAK,oBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAChB,IAAA,MAAM,YAAA,GAAe,sBAAK,oBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACrB,IAAA,MAAM,QAAA,GAAW,sBAAK,oBAAA,EAAA,qBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACjB,IAAA,MAAM,YAAY,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,GAAc,oBAAoB,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAG,CAAA,GAAA,CAAA,GAAQ,EAAA;AACrF,IAAA,MAAM,QAAA,GAAW,sBAAK,oBAAA,EAAA,0BAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACjB,IAAA,MAAM,YAAA,GAAe,sBAAK,oBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAErB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,GAAc,CAAA,eAAA,EAAkB,wBAAwB,CAAA,GAAA,CAAA,GAAQ,EAAA;AAExF,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA,cAAA,EAGK,YAAY,CAAA;AAAA,EAC1B,OAAO,CAAA,EAAG,YAAY,CAAA,EAAG,SAAS,GAAG,QAAQ,CAAA,EAAG,QAAQ,CAAA,EAAG,UAAU;AAAA,YAAA,CAAA;AAAA,EAErE;AAAA;AAAA,EAGA,YAAYV,IAAAA,EAAmB;AAC7B,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,KAAA,EAAM;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,EAAC,CAAA;AACd,IAAA,YAAA,CAAA,IAAA,EAAK,aAAc,EAAC,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ,MAAA,CAAA;AACb,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,EAAc,MAAA,CAAA;AACnB,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAmB,EAAC,CAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,SAASA,IAAG,CAAA;AAGzB,IAAA,KAAA,MAAW,KAAA,IAAS,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA,EAAG;AACrD,MAAA,YAAA,CAAA,IAAA,EAAK,OAAM,IAAA,CAAK;AAAA,QACd,KAAK,QAAA,CAAS,OAAA,CAAQ,OAAO,KAAK,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,QAC9C,KAAK,QAAA,CAAS,OAAA,CAAQ,OAAO,KAAK,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,QAC9C,OAAO,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,OAAO,KAAK,GAAG,CAAA;AAAA,QAChD,WAAA,EAAa,OAAA,CAAQ,KAAA,EAAO,aAAa,CAAA,KAAM,GAAA;AAAA,QAC/C,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA,KAAM;AAAA,OACtC,CAAA;AAAA,IACH;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA,EAAG;AACrD,MAAA,MAAM,WAAW,QAAA,CAAS,OAAA,CAAQ,OAAO,GAAG,CAAA,IAAK,KAAK,EAAE,CAAA;AACxD,MAAA,IAAI,WAAW,CAAA,EAAG;AAElB,MAAA,MAAM,UAAmB,EAAE,QAAA,EAAU,KAAA,kBAAO,IAAI,KAAI,EAAE;AAEtD,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAC9B,MAAA,IAAI,EAAA,EAAI;AAAE,QAAA,OAAA,CAAQ,MAAA,GAAS,WAAW,EAAE,CAAA;AAAG,QAAA,OAAA,CAAQ,YAAA,GAAe,IAAA;AAAA,MAAM;AACxE,MAAA,IAAI,QAAQ,KAAA,EAAO,QAAQ,CAAA,KAAM,GAAA,UAAa,MAAA,GAAS,IAAA;AAEvD,MAAA,KAAA,MAAW,MAAA,IAAU,MAAM,QAAA,EAAU;AACnC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC7C,QAAA,IAAI,QAAQ,GAAA,EAAK;AACjB,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAC/B,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,WAAW,IAAA,CAAK,cAAA;AAAA,UACpB,EAAE,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,QAAA,EAAU,OAAO,QAAA,EAAkE;AAAA,UACpH,IAAI,WAAA;AAAY,SAClB;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,WAAA,IAAe,QAAQ,CAAA;AAAA,MAC/C;AAEA,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAAA,IAClC;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,oBAAA,CAAqB,IAAA,EAAM,WAAW,CAAA,EAAG;AAC1D,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAC/B,MAAA,IAAI,KAAK,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,IAAA,CAAK,EAAE,KAAK,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,IAAA,EAAM,YAAY,CAAA;AACrD,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,KAAK,CAAA;AACpC,MAAA,IAAI,GAAA,EAAK,YAAA,CAAA,IAAA,EAAK,WAAA,EAAc,EAAE,GAAA,EAAI,CAAA;AAAA,IACpC;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,oBAAA,CAAqB,IAAA,EAAM,MAAM,CAAA,EAAG;AACvD,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AACrC,MAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,aAAA,EAAe;AACjD,QAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ;AAAA,UACX,KAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,QAAQ,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,UACrD,QAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,QAAQ,CAAA,IAAK,KAAK,EAAE;AAAA,SACvD,CAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,oBAAA,CAAqB,IAAA,EAAM,gBAAgB,CAAA,EAAG;AAC/D,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,IAAK,EAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,IAAA,EAAM,UAAU,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,EAAG,WAAA,IAAe,EAAA;AACzC,MAAA,IAAI,KAAA,IAAS,SAAS,YAAA,CAAA,IAAA,EAAK,gBAAA,CAAA,CAAiB,KAAK,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,IACrE;AAAA,EACF;AAoFF;AA9ZWS,eAAAA,GAAA,IAAA,OAAA,EAAA;AACAC,QAAAA,GAAA,IAAA,OAAA,EAAA;AAET,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AACA,SAAA,GAAA,IAAA,OAAA,EAAA;AAZK,oBAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AA+UL,eAAA,GAAa,WAAW;AACtB,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAChB,GAAA,CAAI,CAAA,CAAA,KAAK;AACR,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,aAAA,GAAgB,EAAA;AAC1C,IAAA,OAAO,aAAa,CAAA,CAAE,GAAG,UAAU,CAAA,CAAE,GAAG,YAAY,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,eAAA,EAAkB,CAAA,CAAE,cAAc,CAAA,GAAI,CAAC,IAAI,MAAM,CAAA,EAAA,CAAA;AAAA,EACzH,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,SAAS,KAAK,CAAA,OAAA,CAAA;AACvB,CAAA;AAEA,oBAAA,GAAkB,WAAW;AAC3B,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,YAAA,CAAA,IAAA,EAAK,OAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAClF,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,cAAA;AAEpC,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAA,GAAA,KAAO;AACpC,IAAA,MAAM,EAAA,GAAK,IAAI,MAAA,KAAW,MAAA,IAAa,IAAI,YAAA,GACvC,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,kBAAA,CAAA,GAClB,EAAA;AACJ,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,GAAS,aAAA,GAAgB,EAAA;AAE5C,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACzD,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,SAAS,CAAA;AACnC,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,SAAS,CAAA;AACnC,MAAA,OAAO,EAAA,CAAG,SAAS,EAAA,CAAG,MAAA;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,MAAM,WAAW,WAAA,CACd,GAAA,CAAI,QAAM,IAAI,IAAA,CAAK,IAAI,YAAA,CAAA,IAAA,EAAKD,eAAAA,CAAAA,EAAgB,mBAAKC,QAAAA,CAAO,CAAA,CAAE,OAAO,CAAA,CACjE,OAAO,OAAO,CAAA,CACd,KAAK,EAAE,CAAA;AAEV,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,EAAA,IAAM,CAAC,QAAQ,OAAO,EAAA;AACxC,IAAA,OAAO,CAAA,QAAA,EAAW,IAAI,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,EAAG,MAAM,IAAI,QAAQ,CAAA,MAAA,CAAA;AAAA,EAC3D,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AAE1B,EAAA,OAAO,cAAc,OAAO,CAAA,YAAA,CAAA;AAC9B,CAAA;AAEA,qBAAA,GAAmB,WAAW;AAC5B,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,gBAAA,EAAmB,CAAA,CAAE,GAAG,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAC9E,EAAA,OAAO,CAAA,mBAAA,EAAsB,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,MAAM,KAAK,KAAK,CAAA,aAAA,CAAA;AAChE,CAAA;AAEA,0BAAA,GAAwB,WAAW;AACjC,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,gBAAA,CAAA,CAAiB,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,mBAAK,gBAAA,CAAA,CAChB,GAAA;AAAA,IAAI,CAAA,EAAA,KACH,+FAA+F,EAAA,CAAG,KAAK,eAAeC,OAAAA,CAAO,EAAA,CAAG,OAAO,CAAC,CAAA,4BAAA;AAAA,GAC1I,CACC,KAAK,EAAE,CAAA;AACV,EAAA,OAAO,CAAA,wBAAA,EAA2B,YAAA,CAAA,IAAA,EAAK,gBAAA,CAAA,CAAiB,MAAM,KAAK,KAAK,CAAA,kBAAA,CAAA;AAC1E,CAAA;AAEA,oBAAA,GAAkB,WAAW;AAC3B,EAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,EAAO,OAAO,iCAAA;AAExB,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,UAAA,EAAY,UAAU,CAAA;AAExD,EAAA,MAAM,UAAA,GAAa,MAAM,CAAA,IAAK,MAAA,GAAS,IAAI,aAAA,GACvC,GAAA,GAAM,IAAI,YAAA,GAAe,UAAA;AAE7B,EAAA,MAAM,MAAA,GAAS,MAAA,GAAS,CAAA,GAAI,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AACpD,EAAA,MAAM,MAAA,GAAS,GAAA,GAAM,CAAA,GAAO,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAA,GAAS,EAAA;AAEpD,EAAA,OAAO,sCAAsC,MAAM,CAAA,EAAG,MAAM,CAAA,cAAA,EAAiB,OAAO,iBAAiB,UAAU,CAAA,8BAAA,CAAA;AACjH,CAAA;AAEA,iBAAA,GAAe,SAAC,QAAA,EAA2B;AACzC,EAAA,IAAI,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACjC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,GAAM,EAAE,QAAA,EAAU,KAAA,kBAAO,IAAI,KAAI,EAAE;AACnC,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,GAAA,CAAI,QAAA,EAAU,GAAG,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT,CAAA;AAGF,SAASA,QAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC5E;;;ACneA,IAAA,MAAA,EAAA,6BAAA,EAAA,UAAA;AA+BO,IAAM,qBAAN,MAAyB;AAAA,EAAzB,WAAA,GAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,6BAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAS,QAAwB,EAAC,CAAA;AAAA,EAAA;AAAA;AAAA,EAGlC,IAAI,GAAA,GAA8B;AAChC,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA;AAAA,EACd;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,mBAAK,MAAA,CAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CAAO,IAAA,EAAc,QAAA,EAAkB,KAAA,EAAsB;AAC3D,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,wCAAwC,CAAA;AACvE,IAAA,MAAM,OAAA,GAAU,SAAS,UAAA,CAAW,GAAG,IAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GAAI,QAAA;AAE/D,IAAA,MAAM,GAAA,GAAM,eAAA,CAAA,IAAA,EAAK,6BAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,IAAA,EAAM,KAAA,CAAA;AAChC,IAAA,MAAM,KAAA,GAAqB,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,KAAA,EAAM;AAC5D,IAAA,IAAI,GAAA,IAAO,CAAA,EAAG,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,SAC5B,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,MAAA,CAAO,MAAc,KAAA,EAAyB;AAC5C,IAAA,MAAM,GAAA,GAAM,eAAA,CAAA,IAAA,EAAK,6BAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAc,IAAA,EAAM,KAAA,CAAA;AAChC,IAAA,IAAI,GAAA,GAAM,GAAG,OAAO,KAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,MAAc,SAAA,EAAwC;AAC5D,IAAA,MAAM,GAAA,GAAM,KAAK,WAAA,EAAY;AAC7B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAA,GAAQ,mBAAK,MAAA,CAAA,CAAO,IAAA;AAAA,QACxB,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,GAAA,IAAO,CAAA,CAAE,KAAA,EAAO,WAAA,EAAY,KAAM,SAAA,CAAU,WAAA;AAAY,OACxF;AACA,MAAA,IAAI,KAAA,SAAc,KAAA,CAAM,QAAA;AAAA,IAC1B;AACA,IAAA,MAAM,MAAA,GAAS,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,GAAA,IAAO,CAAA,CAAE,KAAA,KAAU,MAAS,CAAA;AAC1F,IAAA,OAAO,MAAA,EAAQ,QAAA;AAAA,EACjB;AASF;AA3DW,MAAA,GAAA,IAAA,OAAA,EAAA;AADJ,6BAAA,GAAA,IAAA,OAAA,EAAA;AAqDL,UAAA,GAAQ,SAAC,MAAc,KAAA,EAAwB;AAC7C,EAAA,MAAM,GAAA,GAAM,KAAK,WAAA,EAAY;AAC7B,EAAA,MAAM,QAAA,GAAW,OAAO,WAAA,EAAY;AACpC,EAAA,OAAO,mBAAK,MAAA,CAAA,CAAO,SAAA;AAAA,IACjB,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,WAAA,OAAkB,GAAA,IAAQ,CAAA,CAAE,KAAA,EAAO,WAAA,EAAY,KAAO;AAAA,GACpE;AACF,CAAA;;;AC1FF,IAAAF,iBAAAC,QAAAA,EAAA,OAAA,EAAA,aAAA,EAAA,OAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,kBAAA;AA0CO,IAAM,SAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EAOZ,WAAA,CACN,eACA,MAAA,EACA;AAVG,IAAA,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAASD,eAAAA,CAAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAASC,QAAAA,CAAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,SAAwB,EAAC,CAAA;AAClC,IAAA,YAAA,CAAA,IAAA,EAAS,aAAA,EAAgB,IAAI,kBAAA,EAAmB,CAAA;AAChD,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,EAAU,KAAA,CAAA;AAMR,IAAA,YAAA,CAAA,IAAA,EAAKD,eAAAA,EAAiB,aAAA,CAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAKC,QAAAA,EAAU,MAAA,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAA,GAAmB;AACxB,IAAA,MAAM,EAAA,GAAK,IAAI,mBAAA,EAAoB;AACnC,IAAA,MAAM,EAAA,GAAK,IAAI,YAAA,EAAa;AAC5B,IAAA,OAAO,IAAI,SAAA,CAAS,EAAA,EAAI,EAAE,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,MAAA,EAA4C;AAC5D,IAAA,MAAM,OAAA,GAAU,UAAU,MAAM,CAAA;AAChC,IAAA,MAAM,EAAA,GAAK,IAAI,mBAAA,EAAoB;AACnC,IAAA,MAAM,EAAA,GAAK,IAAI,YAAA,EAAa;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAS,EAAA,EAAI,EAAE,CAAA;AAG9B,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,EAAS,sBAAsB,CAAA;AAC1D,IAAA,IAAI,KAAA,EAAO,EAAA,CAAG,WAAA,CAAY,KAAK,CAAA;AAG/B,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,OAAA,EAAS,eAAe,CAAA;AACvD,IAAA,IAAI,SAAA,EAAW,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA;AAGvC,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,EAAS,iBAAiB,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,SAAS,KAAK,CAAA;AAE7B,IAAA,KAAA,MAAW,OAAA,IAAW,oBAAA,CAAqB,MAAA,EAAQ,OAAO,CAAA,EAAG;AAC3D,MAAA,MAAM,IAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,MAAM,CAAA,IAAK,OAAA;AAC5C,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA,CAAQ,SAAS,SAAS,CAAA,IAAK,KAAK,EAAE,CAAA;AAC/D,MAAA,MAAM,KAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,MAAM,CAAA,IAAK,QAAQ,OAAA,EAAS,IAAI,CAAA,IAAK,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AACnF,MAAA,MAAM,KAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAGxC,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,EAAS,4BAA4B,CAAA,IAAK,EAAA;AACtE,MAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAA;AACjD,MAAA,MAAM,QAAS,MAAA,GAAU,YAAA,CAAa,OAAA,EAAS,MAAM,KAAK,mBAAA,GAAuB,mBAAA;AAEjF,MAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,EAAM,IAAI,EAAE,CAAA;AACrC,MAAA,IAAI,KAAA,EAAO,EAAA,CAAG,aAAA,CAAc,KAAK,CAAA;AACjC,MAAA,EAAA,CAAG,YAAY,KAAK,CAAA;AAEpB,MAAA,YAAA,CAAA,EAAA,EAAG,SAAQ,IAAA,CAAK,EAAE,WAAW,EAAA,EAAI,OAAA,EAAS,OAAO,CAAA;AAAA,IACnD;AAIA,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,MAAA,EAAQ,aAAa,CAAA,EAAG;AAC5D,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,EAAA,EAAI,MAAM,CAAA;AAC/B,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,WAAA,CAAY,IAAA,EAAK;AACrC,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,EAAA,EAAI,cAAc,CAAA;AAC/C,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,YAAA,EAAc,EAAE,CAAA;AACrC,QAAA,KAAA,GAAQ,YAAA,CAAA,EAAA,EAAG,OAAA,CAAA,CAAQ,GAAG,CAAA,EAAG,SAAA,CAAU,IAAA;AAAA,MACrC;AACA,MAAA,YAAA,CAAA,EAAA,EAAG,aAAA,CAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,KAAK,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,SAAS,QAAA,EAAqC;AAEzD,IAAA,MAAM,EAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AACzC,IAAA,OAAO,SAAA,CAAS,WAAW,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,UAAA,GAAmC;AACrC,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,IAAA,EAAyB;AACpC,IAAA,eAAA,CAAA,IAAA,EAAK,mBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAC5D,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,SAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,CAAU,IAAA,KAAS,IAAI,CAAA,EAAG;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,OAAA,GAAU,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,MAAA,GAAS,CAAA;AACtC,IAAA,MAAM,KAAA,GAAU,MAAM,OAAO,CAAA,CAAA;AAC7B,IAAA,MAAM,KAAK,IAAI,SAAA,CAAU,MAAM,YAAA,CAAA,IAAA,EAAKD,eAAAA,CAAAA,EAAgB,mBAAKC,QAAAA,CAAO,CAAA;AAChE,IAAA,YAAA,CAAA,IAAA,EAAK,SAAQ,IAAA,CAAK,EAAE,WAAW,EAAA,EAAI,OAAA,EAAS,OAAO,CAAA;AACnD,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAyB;AACpC,IAAA,MAAM,KAAA,GAAQ,mBAAK,OAAA,CAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,SAAA,CAAU,SAAS,IAAI,CAAA;AAC9D,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAI,CAAA,YAAA,CAAc,CAAA;AAC5D,IAAA,OAAO,KAAA,CAAM,SAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,UAAA,CAAW,IAAA,EAAc,QAAA,EAAkB,OAAA,EAAoC;AAC7E,IAAA,eAAA,CAAA,IAAA,EAAK,mBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,MAAM,QAAQ,OAAA,EAAS,KAAA;AACvB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,CAAC,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,KAAK,CAAA,EAAG;AAC9E,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,wBAAA,EAA2B,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,IACxF;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,KAAK,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAA,CAAe,MAAc,SAAA,EAAwC;AACnE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,OAAA,CAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,UAAA,CAAW,MAAc,KAAA,EAAyB;AAChD,IAAA,eAAA,CAAA,IAAA,EAAK,mBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,IAAI,YAAA,GAAuC;AACzC,IAAA,OAAO,mBAAK,aAAA,CAAA,CAAc,GAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAA,GAA2B;AACzB,IAAA,eAAA,CAAA,IAAA,EAAK,mBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,sBAAK,mBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAChB,IAAA,OAAO,QAAQ,OAAO,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,QAAA,EAAiC;AAChD,IAAA,eAAA,CAAA,IAAA,EAAK,mBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,YAAA,EAAa;AACjC,IAAA,MAAM,EAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAW,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACjC,IAAA,MAAM,GAAG,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,IAAA,MAAM,EAAA,CAAG,SAAA,CAAU,QAAA,EAAU,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AAAE,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,IAAA,CAAA;AAAA,EAAM;AAAA;AAAA,EAGrC,CAAC,MAAA,CAAO,OAAO,CAAA,GAAU;AAAE,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EAAG;AAuG3C,CAAA;AAzTWD,eAAAA,GAAA,IAAA,OAAA,EAAA;AACAC,QAAAA,GAAA,IAAA,OAAA,EAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;AACT,OAAA,GAAA,IAAA,OAAA,EAAA;AALK,mBAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AAuNL,aAAA,GAAW,WAAS;AAClB,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,EAAS,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAC/D,CAAA;AAEA,kBAAA,GAAgB,WAAa;AAC3B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AAExC,EAAA,MAAM,UAAA,GAAa,mBAAK,OAAA,CAAA,CAAQ,MAAA;AAGhC,EAAA,OAAA,CAAQ,GAAA,CAAI,eAAe,SAAS,CAAA;AAGpC,EAAA,MAAM,UAAA,GAA0B,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,IACrD,IAAA,EAAM,EAAE,SAAA,CAAU,IAAA;AAAA,IAClB,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,gBAAgB,CAAA,CAAE,KAAA;AAAA,IAClB,OAAO,CAAA,CAAE,SAAA,CAAU,eAAe,SAAA,GAAY,CAAA,CAAE,UAAU,UAAA,GAAa;AAAA,GACzE,CAAE,CAAA;AAIF,EAAA,MAAM,gBAAA,GAAsC,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,GAAA,CAAI,IAAI,CAAA,EAAA,KAAM;AAC3E,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,EAAA,CAAG,UAAU,MAAA,EAAW;AAC1B,MAAA,MAAM,GAAA,GAAM,mBAAK,OAAA,CAAA,CAAQ,SAAA,CAAU,OAAK,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,EAAA,CAAG,KAAK,CAAA;AACrE,MAAA,IAAI,GAAA,IAAO,GAAG,YAAA,GAAe,GAAA;AAAA,IAC/B;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,EAAA,CAAG,MAAM,QAAA,EAAU,EAAA,CAAG,UAAU,YAAA,EAAa;AAAA,EAC9D,CAAC,CAAA;AAGD,EAAA,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB,gBAAA,CAAiB,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAG7E,EAAA,OAAA,CAAQ,GAAA,CAAI,4BAAA,EAA8B,iBAAA,CAAkB,UAAU,CAAC,CAAA;AAGvE,EAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,YAAA,CAAA,IAAA,EAAKA,QAAAA,CAAAA,CAAQ,gBAAgB,CAAA;AAG1D,EAAA,OAAA,CAAQ,GAAA,CAAI,sBAAA,EAAwB,YAAA,CAAA,IAAA,EAAKD,eAAAA,CAAAA,CAAe,UAAU,CAAA;AAGlE,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,CAAA,GAAI,CAAC,CAAA,IAAA,CAAA,EAAQ,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,CAAC,CAAA,CAAG,SAAA,CAAU,QAAA,EAAU,CAAA;AAAA,EACtF;AAKA,EAAA,MAAM,iBAAmE,EAAC;AAC1E,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,CAAC,CAAA,CAAG,SAAA;AAC5B,IAAA,IAAI,CAAC,GAAG,WAAA,EAAa;AAErB,IAAA,cAAA,EAAA;AACA,IAAA,MAAM,WAAA,GAAc,sBAAsB,cAAc,CAAA,IAAA,CAAA;AACxD,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,EAAA,CAAG,gBAAA,CAAiB,OAAA,CAAQ,CAAC,QAAA,EAAU,GAAA,KAAQ;AAC7C,MAAA,MAAM,KAAA,GAAQ,CAAA,GAAA,EAAM,GAAA,GAAM,CAAC,CAAA,CAAA;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,KAAK,CAAC,CAAA;AAE3C,MAAA,WAAA,EAAA;AACA,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,SAAA,CAAU,WAAW,CAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AACnC,MAAA,cAAA,CAAe,IAAA,CAAK,EAAE,QAAA,EAAU,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,CAAA;AAGhF,MAAA,MAAM,SAAS,CAAA,GAAA,EAAM,IAAA,CAAK,KAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AAClD,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,uBAAuB,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,aAAa,MAAM,CAAA,GAAA;AAAA,OACxE;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,OAAA,CAAQ,IAAI,WAAA,EAAa,eAAA,CAAgB,QAAQ,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,CAAA,yBAAA,EAA4B,cAAc,CAAA,SAAA,CAAA,EAAa,YAAA,CAAa,WAAW,CAAC,CAAA;AAC5F,IAAA,cAAA,CAAe,IAAA,CAAK,EAAE,QAAA,EAAU,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,WAAA,EAAa,aAAA,CAAc,OAAA,EAAS,CAAA;AAGvF,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,yBAAA,EAA4B,IAAI,CAAC,CAAA,SAAA,CAAA;AAAA,MACjC,YAAA,CAAa;AAAA,QACX,uBAAuB,wBAAwB,CAAA,QAAA,EAAW,SAAA,CAAU,OAAO,gCAAgC,cAAc,CAAA,OAAA;AAAA,OAC1H;AAAA,KACH;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAI,qBAAA,EAAuB,iBAAA,CAAkB,UAAA,EAAY,cAAc,CAAC,CAAA;AAEhF,EAAA,OAAO,OAAA;AACT,CAAA;AAzTK,IAAM,QAAA,GAAN;AAgUP,SAAS,oBAAA,CAAqB,SAAiB,KAAA,EAAmC;AAChF,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,SAAS,OAAO,CAAA;AAC7B,IAAA,KAAA,MAAW,EAAA,IAAM,oBAAA,CAAqB,IAAA,EAAM,cAAc,CAAA,EAAG;AAC3D,MAAA,IAAI,OAAA,CAAQ,EAAA,EAAI,IAAI,CAAA,KAAM,KAAA,EAAO;AAC/B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,EAAA,EAAI,QAAQ,CAAA,IAAK,EAAA;AAExC,QAAA,OAAO,OAAO,UAAA,CAAW,KAAK,CAAA,GAAI,MAAA,GAAS,MAAM,MAAM,CAAA,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["/**\n * Cross-platform XML parser.\n *\n * Uses the browser DOMParser when available; otherwise (Node.js, Deno, Bun without a\n * DOM global) it uses a built-in char-scanning parser. The built-in parser handles the\n * subset of XML that OOXML produces: nested/self-closing elements, attributes, text,\n * CDATA sections, processing instructions and comments, plus standard entity decoding.\n * It is deliberately not a general-purpose XML parser.\n */\n\nexport type XmlElement = {\n readonly tagName: string;\n readonly attributes: Readonly<Record<string, string>>;\n readonly children: XmlElement[];\n readonly textContent: string;\n};\n\n// ── DOMParser-based implementation (browser / Node 18+) ──────────────────────\n\nfunction domElementToXml(el: Element): XmlElement {\n const attributes: Record<string, string> = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i]!;\n attributes[attr.name] = attr.value;\n }\n\n const children: XmlElement[] = [];\n for (let i = 0; i < el.children.length; i++) {\n children.push(domElementToXml(el.children[i]!));\n }\n\n return {\n tagName: el.tagName,\n attributes,\n children,\n textContent: el.textContent ?? '',\n };\n}\n\nfunction parseDom(xmlString: string): XmlElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xmlString, 'application/xml');\n\n const parseError = doc.querySelector('parsererror');\n if (parseError) {\n throw new Error(`XML parse error: ${parseError.textContent}`);\n }\n\n if (!doc.documentElement) {\n throw new Error('XML parse error: no document element.');\n }\n\n return domElementToXml(doc.documentElement);\n}\n\n// ── Minimal hand-rolled parser for basic OOXML attribute extraction ───────────\n\n/**\n * Minimal regex-based XML parser.\n * Handles simple well-formed OOXML documents — NOT a general-purpose parser.\n * Used as fallback when DOMParser is not available.\n */\nfunction parseMinimal(xmlString: string): XmlElement {\n const stack: XmlElement[] = [];\n let pos = 0;\n let root: XmlElement | undefined;\n\n const peek = () => xmlString[pos] ?? '';\n const consume = (n = 1) => { pos += n; };\n\n function skipUntil(ch: string) {\n while (pos < xmlString.length && xmlString[pos] !== ch) pos++;\n }\n\n function parseAttributes(raw: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const re = /(\\S+?)\\s*=\\s*[\"']([^\"']*)[\"']/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n attrs[m[1]!] = m[2]!.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/g, \"'\").replace(/&/g, '&');\n }\n return attrs;\n }\n\n while (pos < xmlString.length) {\n if (xmlString[pos] === '<') {\n pos++;\n\n if (xmlString[pos] === '?') { skipUntil('>'); pos++; continue; } // PI\n if (xmlString[pos] === '!') {\n // CDATA section: copy contents verbatim into the current element's text.\n if (xmlString.startsWith('![CDATA[', pos)) {\n const cdataStart = pos + '![CDATA['.length;\n const cdataEnd = xmlString.indexOf(']]>', cdataStart);\n const end = cdataEnd === -1 ? xmlString.length : cdataEnd;\n const cdata = xmlString.slice(cdataStart, end);\n if (stack.length > 0) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += cdata;\n }\n pos = cdataEnd === -1 ? xmlString.length : cdataEnd + 3;\n continue;\n }\n skipUntil('>'); pos++; continue; // comment / doctype\n }\n\n const isClose = xmlString[pos] === '/';\n if (isClose) pos++;\n\n // Read tag content until >\n const tagStart = pos;\n skipUntil('>');\n const tagContent = xmlString.slice(tagStart, pos).trim();\n pos++;\n\n const isSelfClose = tagContent.endsWith('/');\n const raw = isSelfClose ? tagContent.slice(0, -1).trim() : tagContent;\n\n const spaceIdx = raw.search(/\\s/);\n const tagName = spaceIdx === -1 ? raw : raw.slice(0, spaceIdx);\n const attrRaw = spaceIdx === -1 ? '' : raw.slice(spaceIdx);\n const attributes = parseAttributes(attrRaw);\n\n if (isClose) {\n stack.pop();\n } else {\n const el: XmlElement = { tagName, attributes, children: [], textContent: '' };\n if (stack.length > 0) {\n (stack[stack.length - 1]!.children as XmlElement[]).push(el);\n } else {\n root = el;\n }\n if (!isSelfClose) stack.push(el);\n }\n } else {\n // Text content\n const textStart = pos;\n skipUntil('<');\n const text = xmlString.slice(textStart, pos)\n .replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/g, \"'\").replace(/&/g, '&');\n if (stack.length > 0 && text.trim()) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += text;\n }\n }\n }\n\n if (!root) throw new Error('XML parse error: empty document.');\n return root;\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Parses an XML string into a simple XmlElement tree.\n */\nexport function parseXml(xmlString: string): XmlElement {\n if (typeof DOMParser !== 'undefined') {\n return parseDom(xmlString);\n }\n return parseMinimal(xmlString);\n}\n\n/**\n * Decodes a Uint8Array to a UTF-8 string.\n */\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder('utf-8').decode(bytes);\n }\n // Node.js Buffer fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(bytes).toString('utf-8');\n}\n\n/**\n * Encodes a string to UTF-8 bytes.\n */\nexport function encodeUtf8(str: string): Uint8Array {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8');\n}\n\n/**\n * Queries all descendant elements matching a local tag name.\n * Handles namespace-prefixed tags (e.g. \"a:t\" matches tagName ending in \":t\" or equal to \"t\").\n */\nexport function getElementsByTagName(root: XmlElement, localName: string): XmlElement[] {\n const results: XmlElement[] = [];\n const lname = localName.toLowerCase();\n\n function walk(el: XmlElement) {\n const tag = el.tagName.toLowerCase();\n // Match \"tagname\" or \"prefix:tagname\"\n if (tag === lname || tag.endsWith(`:${lname}`)) {\n results.push(el);\n }\n for (const child of el.children) walk(child);\n }\n\n walk(root);\n return results;\n}\n\n/**\n * Gets a named attribute value, handling namespace prefixes.\n * Tries exact match first, then suffix match (e.g. \"r:id\" → looks for \"r:id\" or \"id\").\n */\nexport function getAttr(el: XmlElement, name: string): string | undefined {\n if (name in el.attributes) return el.attributes[name];\n // Try without prefix\n const local = name.includes(':') ? name.split(':').pop()! : name;\n // Try any key that ends with the local name\n for (const [key, val] of Object.entries(el.attributes)) {\n if (key === local || key.endsWith(`:${local}`)) return val;\n }\n return undefined;\n}\n","/**\n * ZIP reader for .xlsx files (which are ZIP archives).\n * Uses fflate for decompression — MIT licensed, ~9KB gzip.\n *\n * Port concept from TVE.PureDocs.Excel — the C# version uses System.IO.Compression.\n */\nimport { unzipSync } from 'fflate';\nimport { decodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the contents of an unzipped xlsx file.\n * Keys are file paths within the archive (e.g. \"xl/workbook.xml\").\n * Values are raw UTF-8 bytes.\n */\nexport type ZipEntries = Map<string, Uint8Array>;\n\n/**\n * Unzips an xlsx file buffer into a map of path → bytes.\n *\n * @param buffer - ArrayBuffer or Uint8Array of the xlsx file\n * @returns Map of file paths to their raw bytes\n */\nexport function unzipXlsx(buffer: ArrayBuffer | Uint8Array): ZipEntries {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n\n let raw: Record<string, Uint8Array>;\n try {\n raw = unzipSync(bytes);\n } catch (err) {\n throw new Error(\n `Failed to unzip xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const entries = new Map<string, Uint8Array>();\n for (const [path, data] of Object.entries(raw)) {\n // Normalise path separators (Windows ZIP files sometimes use backslash)\n entries.set(path.replace(/\\\\/g, '/'), data);\n }\n\n return entries;\n}\n\n/**\n * Reads and decodes a UTF-8 text entry from a zip archive.\n * Returns undefined if the entry does not exist.\n */\nexport function readXmlEntry(entries: ZipEntries, path: string): string | undefined {\n const bytes = entries.get(path);\n if (!bytes) return undefined;\n return decodeUtf8(bytes);\n}\n\n/**\n * Reads and decodes a UTF-8 text entry, throwing if missing.\n */\nexport function requireXmlEntry(entries: ZipEntries, path: string): string {\n const text = readXmlEntry(entries, path);\n if (text === undefined) {\n throw new Error(`Required xlsx entry not found: \"${path}\".`);\n }\n return text;\n}\n\n/**\n * Returns all entry paths that match the given prefix.\n * Useful for listing worksheets: prefix = \"xl/worksheets/\".\n */\nexport function listEntries(entries: ZipEntries, prefix: string): string[] {\n const results: string[] = [];\n for (const key of entries.keys()) {\n if (key.startsWith(prefix)) results.push(key);\n }\n return results.sort();\n}\n","/**\n * ZIP writer for producing .xlsx files.\n * Uses fflate for compression — MIT licensed.\n */\nimport { zipSync, type Zippable } from 'fflate';\nimport { encodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the file entries to be zipped.\n * Keys are paths within the archive, values are either bytes or a UTF-8 string.\n */\nexport type ZipInput = Map<string, Uint8Array | string>;\n\n/**\n * Zips a collection of file entries into an xlsx-compatible buffer.\n *\n * @param entries - Map of path → content (string auto-encoded to UTF-8)\n * @returns Uint8Array of the resulting ZIP file\n */\nexport function zipXlsx(entries: ZipInput): Uint8Array {\n const zippable: Zippable = {};\n\n for (const [path, content] of entries) {\n const bytes = typeof content === 'string' ? encodeUtf8(content) : content;\n zippable[path] = [bytes, { level: 6 }];\n }\n\n try {\n return zipSync(zippable);\n } catch (err) {\n throw new Error(\n `Failed to create xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Helper to add or update a UTF-8 text entry.\n */\nexport function setXmlEntry(entries: ZipInput, path: string, xml: string): void {\n entries.set(path, xml);\n}\n\n/**\n * Helper to add or update a binary entry.\n */\nexport function setBinaryEntry(entries: ZipInput, path: string, bytes: Uint8Array): void {\n entries.set(path, bytes);\n}\n","/**\n * Lightweight XML builder for OOXML document parts.\n * Produces well-formed XML strings without external dependencies.\n */\n\n/** Escapes special XML characters in an attribute value or text content. */\nexport function escapeXml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Serialises a key-value map to XML attribute string. */\nfunction attrsToString(attrs: Record<string, string | number | boolean | undefined>): string {\n let result = '';\n for (const [key, val] of Object.entries(attrs)) {\n if (val === undefined || val === null) continue;\n result += ` ${key}=\"${escapeXml(String(val))}\"`;\n }\n return result;\n}\n\nexport type XmlAttrs = Record<string, string | number | boolean | undefined>;\n\nexport class XmlBuilder {\n private readonly parts: string[] = [];\n\n /** Appends the XML declaration header. */\n xmlDeclaration(): this {\n this.parts.push('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n return this;\n }\n\n /** Opens a tag with optional attributes. */\n open(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>`);\n return this;\n }\n\n /** Closes a tag. */\n close(tag: string): this {\n this.parts.push(`</${tag}>`);\n return this;\n }\n\n /** Writes a self-closing tag. */\n self(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})} />`);\n return this;\n }\n\n /** Writes a tag with text content. */\n text(tag: string, content: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>${escapeXml(content)}</${tag}>`);\n return this;\n }\n\n /** Writes raw (pre-escaped) XML — use with caution. */\n raw(xml: string): this {\n this.parts.push(xml);\n return this;\n }\n\n /** Returns the complete XML string. */\n toString(): string {\n return this.parts.join('');\n }\n\n /** Returns UTF-8 encoded bytes. */\n toBytes(): Uint8Array {\n const str = this.toString();\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // Node.js fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8') as Uint8Array;\n }\n}\n\n/** Convenience factory. */\nexport function xml(): XmlBuilder {\n return new XmlBuilder();\n}\n\n// ── Common OOXML namespace declarations ───────────────────────────────────────\n\nexport const NS = {\n // SpreadsheetML\n spreadsheetml: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n // Relationships\n relationships: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n relationshipsPackage: 'http://schemas.openxmlformats.org/package/2006/relationships',\n // Drawing\n drawingml: 'http://schemas.openxmlformats.org/drawingml/2006/main',\n spreadsheetDrawing: 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',\n // Content types\n contentTypes: 'http://schemas.openxmlformats.org/package/2006/content-types',\n // Core properties\n coreProperties: 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties',\n} as const;\n\nexport const REL_TYPES = {\n officeDocument: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',\n worksheet: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',\n sharedStrings: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',\n styles: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',\n chart: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',\n drawing: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',\n hyperlink: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',\n} as const;\n\nexport const CONTENT_TYPES = {\n workbook: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',\n worksheet: 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',\n sharedStrings: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',\n styles: 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',\n drawing: 'application/vnd.openxmlformats-officedocument.drawing+xml',\n chart: 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml',\n relationships: 'application/vnd.openxmlformats-package.relationships+xml',\n coreProperties: 'application/vnd.openxmlformats-package.core-properties+xml',\n} as const;\n","/**\r\n * Default OOXML file templates for creating a new empty workbook.\r\n *\r\n * An .xlsx file is a ZIP containing XML parts. The minimal set required is:\r\n * [Content_Types].xml\r\n * _rels/.rels\r\n * xl/workbook.xml\r\n * xl/_rels/workbook.xml.rels\r\n * xl/styles.xml\r\n * xl/sharedStrings.xml\r\n *\r\n * Port of TVE.PureDocs.Excel.Workbook.InitializeWorkbook() and CreateDefaultStylesheet().\r\n */\r\nimport { CONTENT_TYPES, REL_TYPES } from './xml-builder.js';\r\n\r\n// ── [Content_Types].xml ──────────────────────────────────────────────────────\r\n\r\nexport function buildContentTypes(\r\n sheetCount: number,\r\n extraOverrides: ReadonlyArray<{ partName: string; contentType: string }> = [],\r\n): string {\r\n const overrides = Array.from({ length: sheetCount }, (_, i) =>\r\n ` <Override PartName=\"/xl/worksheets/sheet${i + 1}.xml\" ContentType=\"${CONTENT_TYPES.worksheet}\"/>`,\r\n );\r\n\r\n for (const { partName, contentType } of extraOverrides) {\r\n overrides.push(` <Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>`);\r\n }\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"${'http://schemas.openxmlformats.org/package/2006/content-types'}\">\r\n <Default Extension=\"rels\" ContentType=\"${CONTENT_TYPES.relationships}\"/>\r\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\r\n <Override PartName=\"/xl/workbook.xml\" ContentType=\"${CONTENT_TYPES.workbook}\"/>\r\n <Override PartName=\"/xl/styles.xml\" ContentType=\"${CONTENT_TYPES.styles}\"/>\r\n <Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"${CONTENT_TYPES.sharedStrings}\"/>\r\n${overrides.join('\\n')}\r\n</Types>`;\r\n}\r\n\r\n// ── _rels/.rels ──────────────────────────────────────────────────────────────\r\n\r\nexport const ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"${REL_TYPES.officeDocument}\" Target=\"xl/workbook.xml\"/>\r\n</Relationships>`;\r\n\r\n// ── xl/_rels/workbook.xml.rels ───────────────────────────────────────────────\r\n\r\nexport function buildWorkbookRels(sheetCount: number): string {\r\n const sheetRels = Array.from(\r\n { length: sheetCount },\r\n (_, i) =>\r\n ` <Relationship Id=\"rId${i + 1}\" Type=\"${REL_TYPES.worksheet}\" Target=\"worksheets/sheet${i + 1}.xml\"/>`,\r\n ).join('\\n');\r\n\r\n const stylesId = sheetCount + 1;\r\n const sharedId = sheetCount + 2;\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n${sheetRels}\r\n <Relationship Id=\"rId${stylesId}\" Type=\"${REL_TYPES.styles}\" Target=\"styles.xml\"/>\r\n <Relationship Id=\"rId${sharedId}\" Type=\"${REL_TYPES.sharedStrings}\" Target=\"sharedStrings.xml\"/>\r\n</Relationships>`;\r\n}\r\n\r\n// ── xl/workbook.xml ──────────────────────────────────────────────────────────\r\n\r\nexport interface SheetMeta {\r\n name: string;\r\n sheetId: number;\r\n relationshipId: string;\r\n state?: 'visible' | 'hidden' | 'veryHidden';\r\n}\r\n\r\n/**\r\n * A defined name (named range) as serialised in workbook.xml.\r\n * `localSheetId` is the 0-based worksheet index for sheet-scoped names, or\r\n * undefined for workbook-global names.\r\n */\r\nexport interface DefinedNameMeta {\r\n name: string;\r\n refersTo: string; // without leading '='\r\n localSheetId?: number;\r\n}\r\n\r\nexport function buildWorkbookXml(\r\n sheets: SheetMeta[],\r\n definedNames: ReadonlyArray<DefinedNameMeta> = [],\r\n): string {\r\n const sheetElems = sheets\r\n .map(({ name, sheetId, relationshipId, state }) => {\r\n const stateAttr = state && state !== 'visible' ? ` state=\"${state}\"` : '';\r\n return ` <sheet name=\"${escapeAttr(name)}\" sheetId=\"${sheetId}\" r:id=\"${relationshipId}\"${stateAttr}/>`;\r\n })\r\n .join('\\n');\r\n\r\n let definedNamesBlock = '';\r\n if (definedNames.length > 0) {\r\n const items = definedNames\r\n .map(({ name, refersTo, localSheetId }) => {\r\n const local = localSheetId !== undefined ? ` localSheetId=\"${localSheetId}\"` : '';\r\n return ` <definedName name=\"${escapeAttr(name)}\"${local}>${escapeContent(refersTo)}</definedName>`;\r\n })\r\n .join('\\n');\r\n definedNamesBlock = `\\n <definedNames>\\n${items}\\n </definedNames>`;\r\n }\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <fileVersion appName=\"xl\" lastEdited=\"7\" lowestEdited=\"7\" rupBuild=\"22228\"/>\r\n <workbookPr defaultThemeVersion=\"124226\"/>\r\n <bookViews>\r\n <workbookView xWindow=\"240\" yWindow=\"105\" windowWidth=\"14805\" windowHeight=\"8010\"/>\r\n </bookViews>\r\n <sheets>\r\n${sheetElems}\r\n </sheets>${definedNamesBlock}\r\n <calcPr calcId=\"191028\" fullCalcOnLoad=\"1\"/>\r\n</workbook>`;\r\n}\r\n\r\n// ── xl/sharedStrings.xml ─────────────────────────────────────────────────────\r\n\r\nexport function buildSharedStringsXml(strings: string[]): string {\r\n const items = strings\r\n .map(s => ` <si><t ${s.startsWith(' ') || s.endsWith(' ') ? 'xml:space=\"preserve\"' : ''}>${escapeContent(s)}</t></si>`)\r\n .join('\\n');\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${strings.length}\" uniqueCount=\"${strings.length}\">\r\n${items}\r\n</sst>`;\r\n}\r\n\r\n// ── xl/styles.xml ────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Default stylesheet — mirrors Workbook.CreateDefaultStylesheet() in C#.\r\n * Contains exactly:\r\n * - 1 default font (Calibri 11pt)\r\n * - 2 required fills (none + gray125)\r\n * - 1 default border (all empty)\r\n * - 1 default cell format (format 0, all indices 0)\r\n */\r\nexport const DEFAULT_STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\r\n <fonts count=\"1\">\r\n <font>\r\n <sz val=\"11\"/>\r\n <color theme=\"1\"/>\r\n <name val=\"Calibri\"/>\r\n </font>\r\n </fonts>\r\n <fills count=\"2\">\r\n <fill><patternFill patternType=\"none\"/></fill>\r\n <fill><patternFill patternType=\"gray125\"/></fill>\r\n </fills>\r\n <borders count=\"1\">\r\n <border>\r\n <left/><right/><top/><bottom/><diagonal/>\r\n </border>\r\n </borders>\r\n <cellStyleXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\r\n </cellStyleXfs>\r\n <cellXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\r\n </cellXfs>\r\n</styleSheet>`;\r\n\r\n// ── xl/worksheets/sheet1.xml ─────────────────────────────────────────────────\r\n\r\nexport const EMPTY_WORKSHEET_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetData/>\r\n</worksheet>`;\r\n\r\n// ── helpers ───────────────────────────────────────────────────────────────────\r\n\r\nfunction escapeAttr(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\r\n}\r\n\r\nfunction escapeContent(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\r\n}\r\n","/**\n * Generic drawing extension point.\n *\n * The core library knows nothing about charts, images or any specific drawing\n * type. It only knows how to place an opaque \"drawing provider\" into the package:\n * a provider yields one anchor fragment (positioned inside `<xdr:wsDr>`) plus one\n * dependent part (e.g. a chart part) that the anchor references by relationship.\n *\n * This lets satellite packages such as `@devmm/puredocs-excel-charts` inject valid\n * OOXML parts during `Workbook.saveAsBuffer()` without the core depending on them,\n * and without reaching into core internals.\n */\nimport { NS } from './xml-builder.js';\n\n/** A part that a drawing anchor references (e.g. `xl/charts/chart1.xml`). */\nexport interface DrawingDependentPart {\n /** Package-relative path, no leading slash — e.g. `xl/charts/chart1.xml`. */\n readonly path: string;\n /** Full XML content of the part. */\n readonly content: string;\n /** Content type for the `[Content_Types].xml` Override entry. */\n readonly contentType: string;\n /** Relationship type used by the drawing → part relationship. */\n readonly relType: string;\n}\n\n/**\n * Contributes one anchored object (chart, image, …) to a worksheet's drawing.\n * Implemented by satellite packages; consumed by the core save pipeline.\n */\nexport interface DrawingProvider {\n /**\n * Builds the `<xdr:*Anchor>` fragment placed inside `<xdr:wsDr>`.\n * @param relationshipId the id (e.g. `\"rId1\"`) the anchor must reference for\n * its embedded dependent part.\n */\n buildAnchorXml(relationshipId: string): string;\n\n /**\n * Builds the dependent part this drawing references.\n * @param partIndex a workbook-unique 1-based index for building a unique path\n * (e.g. `xl/charts/chart{partIndex}.xml`).\n */\n buildPart(partIndex: number): DrawingDependentPart;\n}\n\n/** Relationship id used by a worksheet to reference its single drawing part. */\nexport const WORKSHEET_DRAWING_REL_ID = 'rId1';\n\n/** Wraps anchor fragments into a complete `xl/drawings/drawingN.xml` part. */\nexport function buildDrawingXml(anchorsXml: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<xdr:wsDr xmlns:xdr=\"${NS.spreadsheetDrawing}\" xmlns:a=\"${NS.drawingml}\">${anchorsXml}</xdr:wsDr>`;\n}\n\n/** Builds a generic `.rels` part from a list of `<Relationship .../>` strings. */\nexport function buildRelsXml(relationships: readonly string[]): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n${relationships.join('\\n')}\n</Relationships>`;\n}\n","/**\n * Manages the shared string table for efficient string storage in xlsx files.\n * Excel stores repeated strings in a shared table and references them by index,\n * dramatically reducing file size for repeated values.\n *\n * Port of TVE.PureDocs.Excel.SharedStringManager (C#)\n *\n * Key differences:\n * - Uses Map instead of Dictionary (same O(1) performance)\n * - No threading concerns (JS single-threaded)\n * - Parses/serialises XML directly instead of using OpenXml SDK\n */\nimport { parseXml, getElementsByTagName } from '../io/xml-parser.js';\n\nexport class SharedStringManager {\n /** Forward map: string value → index */\n readonly #stringToIndex = new Map<string, number>();\n /** Reverse map: index → string value */\n readonly #indexToString: string[] = [];\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /** Total number of unique strings. */\n get count(): number {\n return this.#indexToString.length;\n }\n\n /**\n * Adds a string to the table (if not already present) and returns its index.\n * O(1) average case.\n */\n addOrGet(value: string): number {\n const existing = this.#stringToIndex.get(value);\n if (existing !== undefined) return existing;\n\n const idx = this.#indexToString.length;\n this.#indexToString.push(value);\n this.#stringToIndex.set(value, idx);\n return idx;\n }\n\n /**\n * Returns the string at the given index.\n * Throws if index is out of range.\n */\n getString(index: number): string {\n const s = this.#indexToString[index];\n if (s === undefined) {\n throw new RangeError(\n `Shared string index ${index} out of range [0, ${this.#indexToString.length - 1}].`,\n );\n }\n return s;\n }\n\n /**\n * Returns the string at index, or undefined if not found.\n * Safe alternative to getString().\n */\n tryGetString(index: number): string | undefined {\n return this.#indexToString[index];\n }\n\n /** Returns true if the string is already in the table. */\n has(value: string): boolean {\n return this.#stringToIndex.has(value);\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /**\n * Builds the xl/sharedStrings.xml string.\n */\n buildXml(): string {\n const count = this.#indexToString.length;\n const items = this.#indexToString\n .map(s => {\n const preserveSpace = s.startsWith(' ') || s.endsWith(' ') ? ' xml:space=\"preserve\"' : '';\n return `<si><t${preserveSpace}>${escContent(s)}</t></si>`;\n })\n .join('');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${count}\" uniqueCount=\"${count}\">\n${items}\n</sst>`;\n }\n\n /**\n * Parses an existing xl/sharedStrings.xml and loads strings into the table.\n */\n loadFromXml(xml: string): void {\n this.#stringToIndex.clear();\n this.#indexToString.length = 0;\n\n const root = parseXml(xml);\n // Each <si> element contains one or more <t> elements (rich text uses multiple <r><t>)\n for (const si of getElementsByTagName(root, 'si')) {\n // Concatenate all <t> text nodes within the <si>\n const tNodes = getElementsByTagName(si, 't');\n const text = tNodes.map(t => t.textContent).join('');\n this.addOrGet(text);\n }\n }\n}\n\nfunction escContent(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n","/**\n * Represents a color for use in Excel styling (fonts, fills, borders).\n * Supports hex, RGB, ARGB, theme, and indexed colors.\n *\n * Port of TVE.PureDocs.Excel.ExcelColor (C#)\n *\n * Key differences from C#:\n * - Constructor is private; use static factory methods\n * - Predefined colors use camelCase (ExcelColor.red vs ExcelColor.Red)\n * - toXmlAttrs() replaces ToOpenXmlColor() — returns plain object for XML serialisation\n */\n\nexport interface ColorXmlAttrs {\n rgb?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n}\n\nexport class ExcelColor {\n /** ARGB hex string e.g. \"FFFF0000\" for opaque red. */\n readonly hex: string | undefined;\n /** Theme color index. */\n readonly theme: number | undefined;\n /** Theme tint (-1.0 to 1.0). */\n readonly tint: number | undefined;\n /** Indexed color value. */\n readonly indexed: number | undefined;\n\n private constructor(opts: {\n hex?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n }) {\n this.hex = opts.hex;\n this.theme = opts.theme;\n this.tint = opts.tint;\n this.indexed = opts.indexed;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a color from a hex string.\n * Accepts \"#RGB\", \"#RRGGBB\", \"RRGGBB\", or \"AARRGGBB\" formats.\n */\n static fromHex(hex: string): ExcelColor {\n if (!hex) throw new Error('Hex color cannot be empty.');\n\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n // Expand shorthand #RGB → FFRRGGBB\n h = `FF${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}`;\n } else if (h.length === 6) {\n h = `FF${h}`;\n } else if (h.length !== 8) {\n throw new Error(\n `Invalid hex color \"${hex}\". Expected 3, 6, or 8 hex characters (with optional # prefix).`,\n );\n }\n\n const upper = h.toUpperCase();\n if (!/^[0-9A-F]{8}$/.test(upper)) {\n throw new Error(`Invalid hex color \"${hex}\": contains non-hex characters.`);\n }\n\n return new ExcelColor({ hex: upper });\n }\n\n /** Creates a color from RGB values (0–255). Alpha is set to 255 (opaque). */\n static fromRgb(red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `FF${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a color from ARGB values (0–255). */\n static fromArgb(alpha: number, red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `${byteHex(alpha)}${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a theme color with optional tint value (-1.0 to 1.0). */\n static fromTheme(themeIndex: number, tint = 0): ExcelColor {\n return new ExcelColor({\n theme: themeIndex,\n tint: tint !== 0 ? tint : undefined,\n });\n }\n\n /** Creates an indexed color. */\n static fromIndexed(index: number): ExcelColor {\n return new ExcelColor({ indexed: index });\n }\n\n // ── Predefined colors (camelCase, per TypeScript convention) ─────────────\n\n static readonly black = ExcelColor.fromHex('FF000000');\n static readonly white = ExcelColor.fromHex('FFFFFFFF');\n static readonly red = ExcelColor.fromHex('FFFF0000');\n static readonly green = ExcelColor.fromHex('FF00FF00');\n static readonly blue = ExcelColor.fromHex('FF0000FF');\n static readonly yellow = ExcelColor.fromHex('FFFFFF00');\n static readonly magenta = ExcelColor.fromHex('FFFF00FF');\n static readonly cyan = ExcelColor.fromHex('FF00FFFF');\n static readonly orange = ExcelColor.fromHex('FFFF8C00');\n static readonly purple = ExcelColor.fromHex('FF800080');\n static readonly darkRed = ExcelColor.fromHex('FF8B0000');\n static readonly darkGreen = ExcelColor.fromHex('FF006400');\n static readonly darkBlue = ExcelColor.fromHex('FF00008B');\n static readonly lightGray = ExcelColor.fromHex('FFD3D3D3');\n static readonly darkGray = ExcelColor.fromHex('FFA9A9A9');\n static readonly gray = ExcelColor.fromHex('FF808080');\n static readonly lightBlue = ExcelColor.fromHex('FFADD8E6');\n static readonly lightGreen = ExcelColor.fromHex('FF90EE90');\n static readonly lightYellow = ExcelColor.fromHex('FFFFFFED');\n static readonly lightPink = ExcelColor.fromHex('FFFFB6C1');\n static readonly transparent = ExcelColor.fromArgb(0, 0, 0, 0);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n /** Returns XML attribute key-value pairs for embedding in OOXML elements. */\n toXmlAttrs(): ColorXmlAttrs {\n if (this.hex !== undefined) return { rgb: this.hex };\n if (this.theme !== undefined) {\n const attrs: ColorXmlAttrs = { theme: this.theme };\n if (this.tint !== undefined) attrs.tint = this.tint;\n return attrs;\n }\n if (this.indexed !== undefined) return { indexed: this.indexed };\n return {};\n }\n\n /** Builds an XML color element string for use inside other elements. */\n toXmlElement(tagName: string): string {\n const attrs = this.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb !== undefined) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n return `<${tagName} ${parts.join(' ')}/>`;\n }\n\n /** Parses a color from OOXML XML attributes. Returns undefined if no color data. */\n static fromXmlAttrs(attrs: Record<string, string | undefined>): ExcelColor | undefined {\n const rgb = attrs['rgb'];\n if (rgb) return ExcelColor.fromHex(rgb);\n\n const themeStr = attrs['theme'];\n if (themeStr !== undefined) {\n const tintStr = attrs['tint'];\n return ExcelColor.fromTheme(parseInt(themeStr, 10), tintStr ? parseFloat(tintStr) : 0);\n }\n\n const indexedStr = attrs['indexed'];\n if (indexedStr !== undefined) return ExcelColor.fromIndexed(parseInt(indexedStr, 10));\n\n return undefined;\n }\n\n toString(): string {\n if (this.hex !== undefined) return `#${this.hex}`;\n if (this.theme !== undefined) return `Theme(${this.theme}${this.tint ? `,${this.tint}` : ''})`;\n if (this.indexed !== undefined) return `Indexed(${this.indexed})`;\n return 'None';\n }\n}\n\nfunction byteHex(n: number): string {\n return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0').toUpperCase();\n}\n","/**\n * Font configuration for cell styling.\n * Port of TVE.PureDocs.Excel.ExcelFont (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelUnderline {\n None = 'none',\n Single = 'single',\n Double = 'double',\n SingleAccounting = 'singleAccounting',\n DoubleAccounting = 'doubleAccounting',\n}\n\nexport enum ExcelVerticalAlignRun {\n Baseline = 'baseline',\n Superscript = 'superscript',\n Subscript = 'subscript',\n}\n\nexport interface ExcelFontOptions {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n}\n\nexport class ExcelFont {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n\n constructor(opts: ExcelFontOptions = {}) {\n Object.assign(this, opts);\n }\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const parts: string[] = [];\n\n if (this.bold) parts.push('<b/>');\n if (this.italic) parts.push('<i/>');\n if (this.strikethrough) parts.push('<strike/>');\n\n if (this.underline && this.underline !== ExcelUnderline.None) {\n parts.push(`<u val=\"${this.underline}\"/>`);\n }\n\n if (this.verticalAlign && this.verticalAlign !== ExcelVerticalAlignRun.Baseline) {\n parts.push(`<vertAlign val=\"${this.verticalAlign}\"/>`);\n }\n\n parts.push(`<sz val=\"${this.size ?? 11}\"/>`);\n\n if (this.color) {\n parts.push(this.color.toXmlElement('color'));\n } else {\n parts.push('<color theme=\"1\"/>');\n }\n\n parts.push(`<name val=\"${this.name ?? 'Calibri'}\"/>`);\n\n return `<font>${parts.join('')}</font>`;\n }\n\n /** Parses font from parsed XML child elements. */\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; textContent: string }>): ExcelFont {\n const font = new ExcelFont();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, ''); // strip namespace prefix\n switch (tag) {\n case 'b': font.bold = true; break;\n case 'i': font.italic = true; break;\n case 'strike': font.strikethrough = true; break;\n case 'sz': font.size = parseFloat(el.attributes['val'] ?? '11'); break;\n case 'name': font.name = el.attributes['val']; break;\n case 'u': {\n const val = el.attributes['val'] ?? 'single';\n font.underline = (Object.values(ExcelUnderline) as string[]).includes(val)\n ? (val as ExcelUnderline)\n : ExcelUnderline.Single;\n break;\n }\n case 'vertAlign': {\n const val = el.attributes['val'] ?? 'baseline';\n font.verticalAlign = (Object.values(ExcelVerticalAlignRun) as string[]).includes(val)\n ? (val as ExcelVerticalAlignRun)\n : ExcelVerticalAlignRun.Baseline;\n break;\n }\n case 'color':\n font.color = ExcelColor.fromXmlAttrs(el.attributes);\n break;\n }\n }\n\n return font;\n }\n\n /** Builds a canonical cache key for deduplication in StyleManager. */\n cacheKey(): string {\n return [\n `n:${this.name ?? 'Calibri'}`,\n `s:${this.size ?? 11}`,\n `b:${this.bold ?? false}`,\n `i:${this.italic ?? false}`,\n `u:${this.underline ?? ExcelUnderline.None}`,\n `st:${this.strikethrough ?? false}`,\n `va:${this.verticalAlign ?? ExcelVerticalAlignRun.Baseline}`,\n `c:${this.color?.toString() ?? 'null'}`,\n ].join('|');\n }\n\n clone(): ExcelFont {\n return new ExcelFont({\n name: this.name,\n size: this.size,\n bold: this.bold,\n italic: this.italic,\n underline: this.underline,\n strikethrough: this.strikethrough,\n color: this.color,\n verticalAlign: this.verticalAlign,\n });\n }\n}\n","/**\n * Cell fill (background) configuration.\n * Port of TVE.PureDocs.Excel.ExcelFill (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelPatternType {\n None = 'none',\n Solid = 'solid',\n DarkGray = 'darkGray',\n MediumGray = 'mediumGray',\n LightGray = 'lightGray',\n Gray125 = 'gray125',\n Gray0625 = 'gray0625',\n DarkHorizontal = 'darkHorizontal',\n DarkVertical = 'darkVertical',\n DarkDown = 'darkDown',\n DarkUp = 'darkUp',\n DarkGrid = 'darkGrid',\n DarkTrellis = 'darkTrellis',\n LightHorizontal = 'lightHorizontal',\n LightVertical = 'lightVertical',\n LightDown = 'lightDown',\n LightUp = 'lightUp',\n LightGrid = 'lightGrid',\n LightTrellis = 'lightTrellis',\n}\n\nexport class ExcelFill {\n patternType: ExcelPatternType;\n /** Foreground/pattern color — for solid fills this IS the background color. */\n foregroundColor?: ExcelColor;\n /** Background color for pattern fills. */\n backgroundColor?: ExcelColor;\n\n constructor(\n patternType: ExcelPatternType = ExcelPatternType.None,\n foregroundColor?: ExcelColor,\n backgroundColor?: ExcelColor,\n ) {\n this.patternType = patternType;\n this.foregroundColor = foregroundColor;\n this.backgroundColor = backgroundColor;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a solid fill with the given color.\n * Excel requires the magic indexed(64) background color for solid fills.\n */\n static solid(color: ExcelColor): ExcelFill {\n return new ExcelFill(\n ExcelPatternType.Solid,\n color,\n ExcelColor.fromIndexed(64), // required by Excel spec\n );\n }\n\n /** Creates a pattern fill. */\n static pattern(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): ExcelFill {\n return new ExcelFill(pattern, foreground, background);\n }\n\n /** No fill (default). */\n static readonly none = new ExcelFill(ExcelPatternType.None);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n let inner = `<patternFill patternType=\"${this.patternType}\">`;\n\n if (this.foregroundColor) {\n const attrs = this.foregroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<fgColor ${parts.join(' ')}/>`;\n }\n\n if (this.backgroundColor) {\n const attrs = this.backgroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<bgColor ${parts.join(' ')}/>`;\n }\n\n inner += '</patternFill>';\n return `<fill>${inner}</fill>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>): ExcelFill {\n const fill = new ExcelFill();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n if (tag === 'patternFill') {\n const pt = el.attributes['patternType'];\n if (pt && (Object.values(ExcelPatternType) as string[]).includes(pt)) {\n fill.patternType = pt as ExcelPatternType;\n }\n\n for (const child of el.children) {\n const ctag = child.tagName.replace(/^.*:/, '');\n const color = ExcelColor.fromXmlAttrs(child.attributes);\n if (ctag === 'fgColor' && color) fill.foregroundColor = color;\n if (ctag === 'bgColor' && color) fill.backgroundColor = color;\n }\n }\n }\n\n return fill;\n }\n\n cacheKey(): string {\n return [\n `p:${this.patternType}`,\n `fg:${this.foregroundColor?.toString() ?? 'null'}`,\n `bg:${this.backgroundColor?.toString() ?? 'null'}`,\n ].join('|');\n }\n}\n","/**\n * Border configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelBorder and ExcelBorderEdge (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelBorderStyle {\n None = 'none',\n Thin = 'thin',\n Medium = 'medium',\n Thick = 'thick',\n Dashed = 'dashed',\n Dotted = 'dotted',\n Double = 'double',\n Hair = 'hair',\n MediumDashed = 'mediumDashed',\n DashDot = 'dashDot',\n MediumDashDot = 'mediumDashDot',\n DashDotDot = 'dashDotDot',\n MediumDashDotDot = 'mediumDashDotDot',\n SlantDashDot = 'slantDashDot',\n}\n\nexport class ExcelBorderEdge {\n style: ExcelBorderStyle;\n color?: ExcelColor;\n\n constructor(style: ExcelBorderStyle = ExcelBorderStyle.None, color?: ExcelColor) {\n this.style = style;\n this.color = color;\n }\n\n toXml(tag: string): string {\n if (this.style === ExcelBorderStyle.None) return `<${tag}/>`;\n\n let inner = '';\n if (this.color) inner = this.color.toXmlElement('color');\n\n return `<${tag} style=\"${this.style}\">${inner}</${tag}>`;\n }\n\n static fromXmlElement(el: { attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }): ExcelBorderEdge {\n const styleStr = el.attributes['style'] ?? 'none';\n const style = (Object.values(ExcelBorderStyle) as string[]).includes(styleStr)\n ? (styleStr as ExcelBorderStyle)\n : ExcelBorderStyle.None;\n\n let color: ExcelColor | undefined;\n for (const child of el.children) {\n const tag = child.tagName.replace(/^.*:/, '');\n if (tag === 'color') {\n color = ExcelColor.fromXmlAttrs(child.attributes) ?? undefined;\n }\n }\n\n return new ExcelBorderEdge(style, color);\n }\n\n cacheKey(): string {\n return `${this.style}:${this.color?.toString() ?? 'null'}`;\n }\n}\n\nexport class ExcelBorder {\n left: ExcelBorderEdge;\n right: ExcelBorderEdge;\n top: ExcelBorderEdge;\n bottom: ExcelBorderEdge;\n diagonal: ExcelBorderEdge;\n diagonalDown: boolean;\n diagonalUp: boolean;\n\n constructor() {\n this.left = new ExcelBorderEdge();\n this.right = new ExcelBorderEdge();\n this.top = new ExcelBorderEdge();\n this.bottom = new ExcelBorderEdge();\n this.diagonal = new ExcelBorderEdge();\n this.diagonalDown = false;\n this.diagonalUp = false;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Sets all four sides to the same style and color. */\n static box(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n const edge = new ExcelBorderEdge(style, color);\n b.left = new ExcelBorderEdge(style, color);\n b.right = new ExcelBorderEdge(style, color);\n b.top = new ExcelBorderEdge(style, color);\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static bottomOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static topOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.top = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static leftOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.left = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static rightOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.right = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static readonly none = new ExcelBorder();\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const dd = this.diagonalDown ? ' diagonalDown=\"1\"' : '';\n const du = this.diagonalUp ? ' diagonalUp=\"1\"' : '';\n return `<border${dd}${du}>${this.left.toXml('left')}${this.right.toXml('right')}${this.top.toXml('top')}${this.bottom.toXml('bottom')}${this.diagonal.toXml('diagonal')}</border>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>, borderAttrs: Record<string, string>): ExcelBorder {\n const b = new ExcelBorder();\n b.diagonalDown = borderAttrs['diagonalDown'] === '1';\n b.diagonalUp = borderAttrs['diagonalUp'] === '1';\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n const edge = ExcelBorderEdge.fromXmlElement(el);\n switch (tag) {\n case 'left': b.left = edge; break;\n case 'right': b.right = edge; break;\n case 'top': b.top = edge; break;\n case 'bottom': b.bottom = edge; break;\n case 'diagonal': b.diagonal = edge; break;\n }\n }\n\n return b;\n }\n\n cacheKey(): string {\n return [\n `l:${this.left.cacheKey()}`,\n `r:${this.right.cacheKey()}`,\n `t:${this.top.cacheKey()}`,\n `b:${this.bottom.cacheKey()}`,\n `d:${this.diagonal.cacheKey()}`,\n `dd:${this.diagonalDown}`,\n `du:${this.diagonalUp}`,\n ].join('|');\n }\n}\n","/**\n * Text alignment configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelAlignment (C#)\n */\n\nexport enum ExcelHorizontalAlignment {\n General = 'general',\n Left = 'left',\n Center = 'center',\n Right = 'right',\n Fill = 'fill',\n Justify = 'justify',\n CenterContinuous = 'centerContinuous',\n Distributed = 'distributed',\n}\n\nexport enum ExcelVerticalAlignment {\n Top = 'top',\n Center = 'center',\n Bottom = 'bottom',\n Justify = 'justify',\n Distributed = 'distributed',\n}\n\nexport enum ExcelReadingOrder {\n ContextDependent = 0,\n LeftToRight = 1,\n RightToLeft = 2,\n}\n\nexport class ExcelAlignment {\n horizontal?: ExcelHorizontalAlignment;\n vertical?: ExcelVerticalAlignment;\n wrapText?: boolean;\n shrinkToFit?: boolean;\n textRotation?: number;\n indent?: number;\n readingOrder?: ExcelReadingOrder;\n\n toXml(): string {\n const parts: string[] = [];\n if (this.horizontal) parts.push(`horizontal=\"${this.horizontal}\"`);\n if (this.vertical) parts.push(`vertical=\"${this.vertical}\"`);\n if (this.wrapText) parts.push('wrapText=\"1\"');\n if (this.shrinkToFit) parts.push('shrinkToFit=\"1\"');\n if (this.textRotation !== undefined) parts.push(`textRotation=\"${this.textRotation}\"`);\n if (this.indent !== undefined) parts.push(`indent=\"${this.indent}\"`);\n if (this.readingOrder !== undefined) parts.push(`readingOrder=\"${this.readingOrder}\"`);\n\n if (parts.length === 0) return '';\n return `<alignment ${parts.join(' ')}/>`;\n }\n\n static fromXmlAttrs(attrs: Record<string, string>): ExcelAlignment {\n const a = new ExcelAlignment();\n const h = attrs['horizontal'];\n const v = attrs['vertical'];\n\n if (h && (Object.values(ExcelHorizontalAlignment) as string[]).includes(h)) {\n a.horizontal = h as ExcelHorizontalAlignment;\n }\n if (v && (Object.values(ExcelVerticalAlignment) as string[]).includes(v)) {\n a.vertical = v as ExcelVerticalAlignment;\n }\n if (attrs['wrapText'] === '1' || attrs['wrapText'] === 'true') a.wrapText = true;\n if (attrs['shrinkToFit'] === '1' || attrs['shrinkToFit'] === 'true') a.shrinkToFit = true;\n if (attrs['textRotation'] !== undefined) a.textRotation = parseInt(attrs['textRotation']!, 10);\n if (attrs['indent'] !== undefined) a.indent = parseInt(attrs['indent']!, 10);\n if (attrs['readingOrder'] !== undefined) a.readingOrder = parseInt(attrs['readingOrder']!, 10) as ExcelReadingOrder;\n return a;\n }\n\n cacheKey(): string {\n return [\n `h:${this.horizontal ?? ''}`,\n `v:${this.vertical ?? ''}`,\n `w:${this.wrapText ?? false}`,\n `s:${this.shrinkToFit ?? false}`,\n `r:${this.textRotation ?? 0}`,\n `i:${this.indent ?? 0}`,\n `ro:${this.readingOrder ?? 0}`,\n ].join('|');\n }\n}\n","/**\n * Number format for cell display.\n * Port of TVE.PureDocs.Excel.ExcelNumberFormat (C#)\n *\n * Built-in format IDs (per OOXML spec §18.8.30):\n * 0 = General\n * 1 = 0\n * 2 = 0.00\n * 3 = #,##0\n * 4 = #,##0.00\n * 9 = 0%\n * 10 = 0.00%\n * 11 = 0.00E+00\n * 14 = mm-dd-yy (date)\n * …\n * 49 = @ (text)\n * Custom formats start at ID 164.\n */\n\nconst BUILT_IN_FORMAT_CODES: Record<number, string> = {\n 0: 'General', 1: '0', 2: '0.00', 3: '#,##0', 4: '#,##0.00',\n 5: '$#,##0_);($#,##0)', 6: '$#,##0_);[Red]($#,##0)',\n 7: '$#,##0.00_);($#,##0.00)', 8: '$#,##0.00_);[Red]($#,##0.00)',\n 9: '0%', 10: '0.00%', 11: '0.00E+00', 12: '# ?/?', 13: '# ??/??',\n 14: 'mm-dd-yy', 15: 'd-mmm-yy', 16: 'd-mmm', 17: 'mmm-yy',\n 18: 'h:mm AM/PM', 19: 'h:mm:ss AM/PM', 20: 'h:mm', 21: 'h:mm:ss',\n 22: 'm/d/yy h:mm',\n 37: '#,##0 ;(#,##0)', 38: '#,##0 ;[Red](#,##0)',\n 39: '#,##0.00;(#,##0.00)', 40: '#,##0.00;[Red](#,##0.00)',\n 45: 'mm:ss', 46: '[h]:mm:ss', 47: 'mmss.0', 48: '##0.0E+0', 49: '@',\n};\n\nconst CODE_TO_BUILT_IN_ID: Map<string, number> = new Map(\n Object.entries(BUILT_IN_FORMAT_CODES).map(([id, code]) => [code, Number(id)]),\n);\n\nexport class ExcelNumberFormat {\n readonly formatCode: string;\n readonly formatId: number;\n\n private constructor(formatCode: string, formatId: number) {\n this.formatCode = formatCode;\n this.formatId = formatId;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Creates a number format from a custom format code string. */\n static custom(formatCode: string): ExcelNumberFormat {\n if (!formatCode) throw new Error('Format code cannot be empty.');\n\n // Check if it maps to a built-in format\n const builtInId = CODE_TO_BUILT_IN_ID.get(formatCode);\n if (builtInId !== undefined) {\n return new ExcelNumberFormat(formatCode, builtInId);\n }\n\n // Custom formats get ID assigned by StyleManager (starts at 164)\n return new ExcelNumberFormat(formatCode, 0);\n }\n\n /** Creates from format ID and optional custom formats map. */\n static fromFormatId(\n formatId: number,\n customFormats?: Map<number, string>,\n ): ExcelNumberFormat {\n // Check custom formats first\n if (customFormats && formatId >= 164) {\n const code = customFormats.get(formatId);\n if (code) return new ExcelNumberFormat(code, formatId);\n }\n\n // Built-in\n const code = BUILT_IN_FORMAT_CODES[formatId] ?? 'General';\n return new ExcelNumberFormat(code, formatId);\n }\n\n // ── Predefined formats (camelCase, per TypeScript convention) ─────────────\n\n static readonly general = new ExcelNumberFormat('General', 0);\n static readonly integer = new ExcelNumberFormat('0', 1);\n static readonly decimal2 = new ExcelNumberFormat('0.00', 2);\n static readonly thousandsSeparator = new ExcelNumberFormat('#,##0', 3);\n static readonly thousandsDecimal2 = new ExcelNumberFormat('#,##0.00', 4);\n static readonly percentage = new ExcelNumberFormat('0%', 9);\n static readonly percentageDecimal2 = new ExcelNumberFormat('0.00%', 10);\n static readonly scientific = new ExcelNumberFormat('0.00E+00', 11);\n static readonly fraction = new ExcelNumberFormat('# ?/?', 12);\n static readonly fractionTwoDigits = new ExcelNumberFormat('# ??/??', 13);\n static readonly shortDate = new ExcelNumberFormat('mm-dd-yy', 14);\n static readonly longDate = new ExcelNumberFormat('d-mmm-yy', 15);\n static readonly dayMonth = new ExcelNumberFormat('d-mmm', 16);\n static readonly monthYear = new ExcelNumberFormat('mmm-yy', 17);\n static readonly time12h = new ExcelNumberFormat('h:mm AM/PM', 18);\n static readonly time12hSeconds = new ExcelNumberFormat('h:mm:ss AM/PM', 19);\n static readonly time24h = new ExcelNumberFormat('h:mm', 20);\n static readonly time24hSeconds = new ExcelNumberFormat('h:mm:ss', 21);\n static readonly dateTime = new ExcelNumberFormat('m/d/yy h:mm', 22);\n static readonly accounting = new ExcelNumberFormat('#,##0 ;(#,##0)', 37);\n static readonly accountingRed = new ExcelNumberFormat('#,##0 ;[Red](#,##0)', 38);\n static readonly accountingDecimal2 = new ExcelNumberFormat('#,##0.00;(#,##0.00)', 39);\n static readonly text = new ExcelNumberFormat('@', 49);\n static readonly currency = ExcelNumberFormat.custom('$#,##0.00');\n static readonly currencyNoDecimal = ExcelNumberFormat.custom('$#,##0');\n static readonly isoDate = ExcelNumberFormat.custom('yyyy-mm-dd');\n static readonly isoDateTime = ExcelNumberFormat.custom('yyyy-mm-dd hh:mm:ss');\n static readonly phoneNumber = ExcelNumberFormat.custom('[<=9999999]###-####;(###) ###-####');\n static readonly zipCode = ExcelNumberFormat.custom('00000');\n\n /** Returns true if this format code represents a date/time value. */\n isDateFormat(): boolean {\n const id = this.formatId;\n if ((id >= 14 && id <= 22) || (id >= 45 && id <= 47)) return true;\n\n const lower = this.formatCode.toLowerCase();\n // Check for date patterns — avoid false positive on mm:ss (time only)\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.startsWith('mm:') && !lower.startsWith('[')) ||\n (lower.includes('h') && !lower.startsWith('[h]'))\n );\n }\n\n toString(): string {\n return this.formatCode;\n }\n}\n","/**\n * Complete cell style configuration with fluent builder API.\n * Port of TVE.PureDocs.Excel.CellStyle (C#)\n *\n * Key difference from C#: method names are camelCase (setBold vs SetBold).\n */\nimport { ExcelFont, ExcelUnderline, ExcelVerticalAlignRun } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder, ExcelBorderStyle, ExcelBorderEdge } from './excel-border.js';\nimport { ExcelAlignment, ExcelHorizontalAlignment, ExcelVerticalAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\n\nexport class CellStyle {\n font?: ExcelFont;\n fill?: ExcelFill;\n border?: ExcelBorder;\n alignment?: ExcelAlignment;\n numberFormat?: ExcelNumberFormat;\n isLocked?: boolean;\n isHidden?: boolean;\n\n // ── Font fluent API ────────────────────────────────────────────────────────\n\n setFontName(name: string): this {\n this.#ensureFont().name = name;\n return this;\n }\n\n setFontSize(size: number): this {\n this.#ensureFont().size = size;\n return this;\n }\n\n setBold(bold = true): this {\n this.#ensureFont().bold = bold;\n return this;\n }\n\n setItalic(italic = true): this {\n this.#ensureFont().italic = italic;\n return this;\n }\n\n setUnderline(underline: ExcelUnderline = ExcelUnderline.Single): this {\n this.#ensureFont().underline = underline;\n return this;\n }\n\n setStrikethrough(strikethrough = true): this {\n this.#ensureFont().strikethrough = strikethrough;\n return this;\n }\n\n setFontColor(color: ExcelColor): this;\n setFontColor(hex: string): this;\n setFontColor(colorOrHex: ExcelColor | string): this {\n this.#ensureFont().color =\n typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n return this;\n }\n\n setVerticalAlign(align: ExcelVerticalAlignRun): this {\n this.#ensureFont().verticalAlign = align;\n return this;\n }\n\n // ── Fill fluent API ────────────────────────────────────────────────────────\n\n setBackgroundColor(color: ExcelColor): this;\n setBackgroundColor(hex: string): this;\n setBackgroundColor(colorOrHex: ExcelColor | string): this {\n const color = typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n this.fill = ExcelFill.solid(color);\n return this;\n }\n\n setPatternFill(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): this {\n this.fill = ExcelFill.pattern(pattern, foreground, background);\n return this;\n }\n\n // ── Border fluent API ──────────────────────────────────────────────────────\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.border = ExcelBorder.box(style, color);\n return this;\n }\n\n setBorder(border: ExcelBorder): this {\n this.border = border;\n return this;\n }\n\n setLeftBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().left = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setRightBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().right = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setTopBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().top = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setBottomBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().bottom = new ExcelBorderEdge(style, color);\n return this;\n }\n\n // ── Alignment fluent API ───────────────────────────────────────────────────\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#ensureAlignment().horizontal = alignment;\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#ensureAlignment().vertical = alignment;\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#ensureAlignment().wrapText = wrap;\n return this;\n }\n\n setShrinkToFit(shrink = true): this {\n this.#ensureAlignment().shrinkToFit = shrink;\n return this;\n }\n\n setTextRotation(degrees: number): this {\n this.#ensureAlignment().textRotation = degrees;\n return this;\n }\n\n setIndent(indent: number): this {\n this.#ensureAlignment().indent = indent;\n return this;\n }\n\n // ── Number format fluent API ───────────────────────────────────────────────\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.numberFormat =\n typeof formatOrCode === 'string'\n ? ExcelNumberFormat.custom(formatOrCode)\n : formatOrCode;\n return this;\n }\n\n // ── Protection fluent API ──────────────────────────────────────────────────\n\n setLocked(locked = true): this {\n this.isLocked = locked;\n return this;\n }\n\n setFormulaHidden(hidden = true): this {\n this.isHidden = hidden;\n return this;\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /** Creates a deep copy of this style. */\n clone(): CellStyle {\n const s = new CellStyle();\n if (this.font) s.font = this.font.clone();\n s.fill = this.fill; // ExcelFill is effectively immutable via factory methods\n s.border = this.border;\n s.alignment = this.alignment\n ? Object.assign(new ExcelAlignment(), this.alignment)\n : undefined;\n s.numberFormat = this.numberFormat;\n s.isLocked = this.isLocked;\n s.isHidden = this.isHidden;\n return s;\n }\n\n #ensureFont(): ExcelFont {\n if (!this.font) this.font = new ExcelFont();\n return this.font;\n }\n\n #ensureBorder(): ExcelBorder {\n if (!this.border) this.border = new ExcelBorder();\n return this.border;\n }\n\n #ensureAlignment(): ExcelAlignment {\n if (!this.alignment) this.alignment = new ExcelAlignment();\n return this.alignment;\n }\n}\n","/**\n * Manages the workbook stylesheet — fonts, fills, borders, number formats, cell formats.\n * Handles deduplication and index management.\n *\n * Port of TVE.PureDocs.Excel.StyleManager (C#)\n *\n * Key differences:\n * - Works with parsed XmlElement trees instead of OpenXml SDK objects\n * - Serialises directly to XML strings\n * - No lazy save — isDirty flag still used, caller must call buildStylesXml()\n */\nimport { CellStyle } from './cell-style.js';\nimport { ExcelFont } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder } from './excel-border.js';\nimport { ExcelAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\n\ninterface FontEntry { font: ExcelFont; key: string; }\ninterface FillEntry { fill: ExcelFill; key: string; }\ninterface BorderEntry{ border: ExcelBorder; key: string; }\ninterface NumFmtEntry{ code: string; id: number; }\n\ninterface CellFormat {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n applyFont: boolean;\n applyFill: boolean;\n applyBorder: boolean;\n applyNumFmt: boolean;\n alignment?: ExcelAlignment;\n applyAlign: boolean;\n isLocked?: boolean;\n isHidden?: boolean;\n applyProt: boolean;\n}\n\nexport class StyleManager {\n // Index arrays — position = index\n private fonts: FontEntry[] = [];\n private fills: FillEntry[] = [];\n private borders: BorderEntry[] = [];\n private numFmts: NumFmtEntry[] = [];\n private cellXfs: CellFormat[] = [];\n\n // Dedup caches: key → index\n private fontCache: Map<string, number> = new Map();\n private fillCache: Map<string, number> = new Map();\n private borderCache: Map<string, number> = new Map();\n private numFmtCache: Map<string, number> = new Map(); // code → id\n private cellXfCache: Map<string, number> = new Map();\n\n private nextCustomNumFmtId = 164;\n isDirty = false;\n\n constructor() {\n this.#initDefaults();\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Returns the cellXf index for the given CellStyle.\n * Creates new font/fill/border entries as needed (with deduplication).\n */\n getOrCreateCellFormatIndex(style: CellStyle): number {\n const fontId = style.font ? this.#getOrCreateFont(style.font) : 0;\n const fillId = style.fill ? this.#getOrCreateFill(style.fill) : 0;\n const borderId = style.border ? this.#getOrCreateBorder(style.border): 0;\n const numFmtId = style.numberFormat\n ? this.#getOrCreateNumFmt(style.numberFormat)\n : 0;\n\n const cf: CellFormat = {\n fontId, fillId, borderId, numFmtId,\n applyFont: style.font != null,\n applyFill: style.fill != null,\n applyBorder: style.border != null,\n applyNumFmt: style.numberFormat != null,\n alignment: style.alignment,\n applyAlign: style.alignment != null,\n isLocked: style.isLocked,\n isHidden: style.isHidden,\n applyProt: style.isLocked != null || style.isHidden != null,\n };\n\n const key = this.#cellFormatKey(cf);\n const existing = this.cellXfCache.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n /**\n * Reconstructs a CellStyle from a cellXf index.\n * Used by Cell.style getter.\n */\n getCellStyle(styleIndex: number): CellStyle {\n const cf = this.cellXfs[styleIndex];\n if (!cf) return new CellStyle();\n\n const s = new CellStyle();\n\n const fontEntry = this.fonts[cf.fontId];\n if (fontEntry && cf.applyFont) s.font = fontEntry.font;\n\n const fillEntry = this.fills[cf.fillId];\n if (fillEntry && cf.applyFill) s.fill = fillEntry.fill;\n\n const borderEntry = this.borders[cf.borderId];\n if (borderEntry && cf.applyBorder) s.border = borderEntry.border;\n\n if (cf.applyNumFmt) {\n const customMap = new Map(\n this.numFmts.map(n => [n.id, n.code] as [number, string]),\n );\n s.numberFormat = ExcelNumberFormat.fromFormatId(cf.numFmtId, customMap);\n }\n\n if (cf.alignment && cf.applyAlign) s.alignment = cf.alignment;\n if (cf.applyProt) {\n s.isLocked = cf.isLocked;\n s.isHidden = cf.isHidden;\n }\n\n return s;\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** Builds the complete xl/styles.xml string. */\n buildStylesXml(): string {\n const numFmtsXml = this.numFmts.length > 0\n ? `<numFmts count=\"${this.numFmts.length}\">${this.numFmts.map(n => `<numFmt numFmtId=\"${n.id}\" formatCode=\"${escAttr(n.code)}\"/>`).join('')}</numFmts>`\n : '';\n\n const fontsXml = `<fonts count=\"${this.fonts.length}\">${this.fonts.map(f => f.font.toXml()).join('')}</fonts>`;\n\n const fillsXml = `<fills count=\"${this.fills.length}\">${this.fills.map(f => f.fill.toXml()).join('')}</fills>`;\n\n const bordersXml = `<borders count=\"${this.borders.length}\">${this.borders.map(b => b.border.toXml()).join('')}</borders>`;\n\n const cellXfsXml = `<cellXfs count=\"${this.cellXfs.length}\">${this.cellXfs.map(cf => this.#cfToXml(cf)).join('')}</cellXfs>`;\n\n this.isDirty = false;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsXml}${fontsXml}${fillsXml}${bordersXml}\n<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>\n${cellXfsXml}\n</styleSheet>`;\n }\n\n /** Loads an existing styles.xml, rebuilding all caches. */\n loadFromXml(stylesXml: string): void {\n this.fonts = [];\n this.fills = [];\n this.borders = [];\n this.numFmts = [];\n this.cellXfs = [];\n this.fontCache.clear();\n this.fillCache.clear();\n this.borderCache.clear();\n this.numFmtCache.clear();\n this.cellXfCache.clear();\n this.nextCustomNumFmtId = 164;\n\n const root = parseXml(stylesXml);\n\n // numFmts\n for (const el of getElementsByTagName(root, 'numFmt')) {\n const id = parseInt(getAttr(el, 'numFmtId') ?? '0', 10);\n const code = getAttr(el, 'formatCode') ?? '';\n this.numFmts.push({ id, code });\n this.numFmtCache.set(code, id);\n if (id >= this.nextCustomNumFmtId) this.nextCustomNumFmtId = id + 1;\n }\n\n // fonts\n for (const el of getElementsByTagName(root, 'fonts')) {\n for (const fontEl of el.children) {\n const font = ExcelFont.fromXmlChildren(fontEl.children as Parameters<typeof ExcelFont.fromXmlChildren>[0]);\n const key = font.cacheKey();\n this.fonts.push({ font, key });\n this.fontCache.set(key, this.fonts.length - 1);\n }\n }\n\n // fills\n for (const el of getElementsByTagName(root, 'fills')) {\n for (const fillEl of el.children) {\n const fill = ExcelFill.fromXmlChildren(fillEl.children as Parameters<typeof ExcelFill.fromXmlChildren>[0]);\n const key = fill.cacheKey();\n this.fills.push({ fill, key });\n this.fillCache.set(key, this.fills.length - 1);\n }\n }\n\n // borders\n for (const el of getElementsByTagName(root, 'borders')) {\n for (const borderEl of el.children) {\n const border = ExcelBorder.fromXmlChildren(\n borderEl.children as Parameters<typeof ExcelBorder.fromXmlChildren>[0],\n borderEl.attributes,\n );\n const key = border.cacheKey();\n this.borders.push({ border, key });\n this.borderCache.set(key, this.borders.length - 1);\n }\n }\n\n // cellXfs (main cell formats)\n for (const el of getElementsByTagName(root, 'cellXfs')) {\n for (const xfEl of el.children) {\n const cf: CellFormat = {\n fontId: parseInt(getAttr(xfEl, 'fontId') ?? '0', 10),\n fillId: parseInt(getAttr(xfEl, 'fillId') ?? '0', 10),\n borderId: parseInt(getAttr(xfEl, 'borderId') ?? '0', 10),\n numFmtId: parseInt(getAttr(xfEl, 'numFmtId') ?? '0', 10),\n applyFont: getAttr(xfEl, 'applyFont') === '1',\n applyFill: getAttr(xfEl, 'applyFill') === '1',\n applyBorder: getAttr(xfEl, 'applyBorder') === '1',\n applyNumFmt: getAttr(xfEl, 'applyNumberFormat') === '1',\n applyAlign: getAttr(xfEl, 'applyAlignment') === '1',\n applyProt: getAttr(xfEl, 'applyProtection') === '1',\n };\n\n // alignment child\n const alignEl = xfEl.children.find(c => c.tagName.replace(/^.*:/, '') === 'alignment');\n if (alignEl) cf.alignment = ExcelAlignment.fromXmlAttrs(alignEl.attributes);\n\n const key = this.#cellFormatKey(cf);\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, this.cellXfs.length - 1);\n }\n }\n\n // Ensure defaults exist\n if (this.fonts.length === 0) this.#initDefaults();\n if (this.cellXfs.length === 0) this.#initDefaults();\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n #initDefaults(): void {\n // Default font — Calibri 11pt\n const defaultFont = new ExcelFont({ name: 'Calibri', size: 11 });\n const fontKey = defaultFont.cacheKey();\n this.fonts = [{ font: defaultFont, key: fontKey }];\n this.fontCache.set(fontKey, 0);\n\n // Required fills: none + gray125\n const noneFill = new ExcelFill(ExcelPatternType.None);\n const grayFill = new ExcelFill(ExcelPatternType.Gray125);\n this.fills = [\n { fill: noneFill, key: noneFill.cacheKey() },\n { fill: grayFill, key: grayFill.cacheKey() },\n ];\n this.fillCache.set(noneFill.cacheKey(), 0);\n this.fillCache.set(grayFill.cacheKey(), 1);\n\n // Default border — all empty\n const defaultBorder = new ExcelBorder();\n const borderKey = defaultBorder.cacheKey();\n this.borders = [{ border: defaultBorder, key: borderKey }];\n this.borderCache.set(borderKey, 0);\n\n // Default cell format\n const defaultCf: CellFormat = {\n fontId: 0, fillId: 0, borderId: 0, numFmtId: 0,\n applyFont: false, applyFill: false, applyBorder: false,\n applyNumFmt: false, applyAlign: false, applyProt: false,\n };\n const cfKey = this.#cellFormatKey(defaultCf);\n this.cellXfs = [defaultCf];\n this.cellXfCache.set(cfKey, 0);\n }\n\n #getOrCreateFont(font: ExcelFont): number {\n const key = font.cacheKey();\n const existing = this.fontCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fonts.length;\n this.fonts.push({ font, key });\n this.fontCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateFill(fill: ExcelFill): number {\n const key = fill.cacheKey();\n const existing = this.fillCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fills.length;\n this.fills.push({ fill, key });\n this.fillCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateBorder(border: ExcelBorder): number {\n const key = border.cacheKey();\n const existing = this.borderCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.borders.length;\n this.borders.push({ border, key });\n this.borderCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateNumFmt(fmt: ExcelNumberFormat): number {\n // Built-in formats (ID < 164) don't need to be stored\n if (fmt.formatId > 0 && fmt.formatId < 164) return fmt.formatId;\n if (fmt.formatCode === 'General') return 0;\n\n const existing = this.numFmtCache.get(fmt.formatCode);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.numFmts.push({ id, code: fmt.formatCode });\n this.numFmtCache.set(fmt.formatCode, id);\n this.isDirty = true;\n return id;\n }\n\n #cellFormatKey(cf: CellFormat): string {\n return [\n cf.fontId, cf.fillId, cf.borderId, cf.numFmtId,\n cf.applyFont, cf.applyFill, cf.applyBorder, cf.applyNumFmt,\n cf.applyAlign, cf.applyProt,\n cf.alignment?.cacheKey() ?? '',\n cf.isLocked ?? '',\n cf.isHidden ?? '',\n ].join('|');\n }\n\n #cfToXml(cf: CellFormat): string {\n const attrs = [\n `numFmtId=\"${cf.numFmtId}\"`,\n `fontId=\"${cf.fontId}\"`,\n `fillId=\"${cf.fillId}\"`,\n `borderId=\"${cf.borderId}\"`,\n `xfId=\"0\"`,\n cf.applyFont ? 'applyFont=\"1\"' : '',\n cf.applyFill ? 'applyFill=\"1\"' : '',\n cf.applyBorder ? 'applyBorder=\"1\"' : '',\n cf.applyNumFmt ? 'applyNumberFormat=\"1\"' : '',\n cf.applyAlign ? 'applyAlignment=\"1\"' : '',\n cf.applyProt ? 'applyProtection=\"1\"' : '',\n ].filter(Boolean).join(' ');\n\n const alignXml = cf.alignment?.toXml() ?? '';\n const protXml = cf.applyProt\n ? `<protection${cf.isLocked !== undefined ? ` locked=\"${cf.isLocked ? '1' : '0'}\"` : ''}${cf.isHidden !== undefined ? ` hidden=\"${cf.isHidden ? '1' : '0'}\"` : ''}/>`\n : '';\n\n const inner = alignXml + protXml;\n return inner ? `<xf ${attrs}>${inner}</xf>` : `<xf ${attrs}/>`;\n }\n}\n\nfunction escAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n","/**\n * Utility for converting between cell references (e.g. \"A1\") and\n * 1-based row/column indices.\n *\n * Port of TVE.PureDocs.Excel.CellReference (C#)\n */\n\nexport interface ParsedCellRef {\n readonly row: number;\n readonly column: number;\n}\n\n/**\n * Parses a cell reference string into 1-based row and column indices.\n *\n * @example\n * parseCellRef(\"A1\") // { row: 1, column: 1 }\n * parseCellRef(\"B10\") // { row: 10, column: 2 }\n * parseCellRef(\"AA1\") // { row: 1, column: 27 }\n * parseCellRef(\"$B$2\") // { row: 2, column: 2 } — $ stripped\n */\nexport function parseCellRef(cellReference: string): ParsedCellRef {\n if (!cellReference) {\n throw new Error('Cell reference cannot be null or empty.');\n }\n\n // Strip absolute reference markers\n const ref = cellReference.replace(/\\$/g, '').toUpperCase();\n\n let i = 0;\n let column = 0;\n\n // Parse column letters\n while (i < ref.length && ref.charCodeAt(i) >= 65 && ref.charCodeAt(i) <= 90) {\n column = column * 26 + (ref.charCodeAt(i) - 64); // 'A' = 65, so A-64 = 1\n i++;\n }\n\n if (column === 0) {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no column letters found.`);\n }\n\n // Parse row digits\n const rowStr = ref.slice(i);\n const row = parseInt(rowStr, 10);\n\n if (isNaN(row) || row < 1 || rowStr === '') {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no valid row number found.`);\n }\n\n return { row, column };\n}\n\n/**\n * Converts 1-based row and column indices to a cell reference string.\n *\n * @example\n * cellRefFromRowCol(1, 1) // \"A1\"\n * cellRefFromRowCol(10, 2) // \"B10\"\n * cellRefFromRowCol(1, 27) // \"AA1\"\n */\nexport function cellRefFromRowCol(row: number, column: number): string {\n if (row < 1) throw new RangeError(`Row must be >= 1, got ${row}.`);\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n return `${columnLetter(column)}${row}`;\n}\n\n/**\n * Converts a 1-based column index to its letter representation.\n *\n * @example\n * columnLetter(1) // \"A\"\n * columnLetter(26) // \"Z\"\n * columnLetter(27) // \"AA\"\n */\nexport function columnLetter(column: number): string {\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n let result = '';\n let col = column;\n\n while (col > 0) {\n const remainder = (col - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n col = Math.floor((col - remainder) / 26);\n }\n\n return result;\n}\n\n/**\n * Converts a column letter string to a 1-based column number.\n *\n * @example\n * columnNumber(\"A\") // 1\n * columnNumber(\"Z\") // 26\n * columnNumber(\"AA\") // 27\n */\nexport function columnNumber(letters: string): number {\n if (!letters) throw new Error('Column letter cannot be empty.');\n\n const upper = letters.toUpperCase();\n let col = 0;\n\n for (let i = 0; i < upper.length; i++) {\n const code = upper.charCodeAt(i);\n if (code < 65 || code > 90) {\n throw new Error(`Invalid column letter: \"${letters}\".`);\n }\n col = col * 26 + (code - 64);\n }\n\n return col;\n}\n\n/**\n * Parses a range reference string like \"A1:B10\" into start/end coordinates.\n */\nexport function parseRangeRef(rangeReference: string): {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n} {\n const parts = rangeReference.split(':');\n if (parts.length !== 2) {\n throw new Error(`Invalid range reference: \"${rangeReference}\" — expected \"A1:B10\" format.`);\n }\n\n const start = parseCellRef(parts[0]!);\n const end = parseCellRef(parts[1]!);\n\n if (start.row > end.row || start.column > end.column) {\n throw new Error(\n `Invalid range reference: \"${rangeReference}\" — start must be top-left of end.`,\n );\n }\n\n return {\n startRow: start.row,\n startColumn: start.column,\n endRow: end.row,\n endColumn: end.column,\n };\n}\n","/**\n * OLE Automation Date (OADate) helpers.\n *\n * Excel stores dates as floating-point numbers where:\n * - The integer part = number of days since Dec 30, 1899 (OADate epoch)\n * - The fractional part = time of day (0.5 = noon)\n *\n * Note: Excel has a known bug treating 1900 as a leap year (day 60 = Feb 29 1900),\n * which never existed. This implementation matches Excel's behaviour exactly.\n */\n\n// OADate epoch: Dec 30, 1899 00:00:00 UTC\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\n/**\n * Converts a JavaScript Date to an Excel OADate serial number.\n *\n * @example\n * toOADate(new Date(1900, 0, 1)) // 1\n * toOADate(new Date(2025, 0, 1)) // 45658\n */\nexport function toOADate(date: Date): number {\n const utcMs = Date.UTC(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n return (utcMs - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\n/**\n * Converts an Excel OADate serial number to a JavaScript Date.\n *\n * @example\n * fromOADate(1) // Jan 1, 1900\n * fromOADate(45658) // Jan 1, 2025\n */\nexport function fromOADate(oaDate: number): Date {\n const ms = OA_EPOCH_MS + oaDate * MS_PER_DAY;\n const d = new Date(ms);\n // Return local date (strip UTC offset)\n return new Date(\n d.getUTCFullYear(),\n d.getUTCMonth(),\n d.getUTCDate(),\n d.getUTCHours(),\n d.getUTCMinutes(),\n d.getUTCSeconds(),\n d.getUTCMilliseconds(),\n );\n}\n\n/**\n * Built-in date format IDs per OOXML spec (§18.8.30).\n * IDs 14–22 and 45–47 are date/time formats.\n */\nconst DATE_FORMAT_IDS = new Set([14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47]);\n\n/**\n * Returns true if the given number format ID represents a date/time value.\n */\nexport function isDateFormatId(formatId: number): boolean {\n return DATE_FORMAT_IDS.has(formatId);\n}\n\n/**\n * Returns true if the format code string contains date/time patterns.\n */\nexport function isDateFormatCode(formatCode: string): boolean {\n const lower = formatCode.toLowerCase();\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.includes('mm:')) || // m = month unless part of mm:ss\n lower.includes('h') ||\n lower.includes('am') ||\n lower.includes('pm')\n );\n}\n","/**\r\n * Represents a single cell in a worksheet.\r\n * Port of TVE.PureDocs.Excel.Cell (C#)\r\n *\r\n * Key differences from C#:\r\n * - All method names are camelCase\r\n * - No OpenXml SDK dependency — works with plain XML strings\r\n * - DateTime uses JavaScript Date\r\n */\r\nimport { SharedStringManager } from './shared-string-manager.js';\r\nimport { StyleManager } from '../style/style-manager.js';\r\nimport { CellStyle } from '../style/cell-style.js';\r\nimport { ExcelColor } from '../style/excel-color.js';\r\nimport { ExcelBorderStyle } from '../style/excel-border.js';\r\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\r\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\r\nimport { parseCellRef } from './cell-reference.js';\r\nimport { toOADate, fromOADate, isDateFormatId, isDateFormatCode } from './oa-date.js';\r\n\r\n/** Possible raw types stored in a cell. */\r\nexport type CellValue = string | number | boolean | Date | null;\r\n\r\n/** Internal cell data representation (mirrors what OOXML stores). */\r\nexport interface CellData {\r\n reference: string; // e.g. \"A1\"\r\n /** 's' = sharedString, 'n' = number, 'b' = boolean, 'str' = inlineStr */\r\n dataType?: 's' | 'n' | 'b' | 'str';\r\n rawValue?: string; // raw text from <v>\r\n formula?: string; // formula text (without leading =)\r\n /** Spill range for a dynamic-array formula anchor, e.g. \"A1:A3\". */\r\n arrayRef?: string;\r\n styleIndex: number; // index into cellXfs\r\n}\r\n\r\nexport class Cell {\r\n readonly #data: CellData;\r\n readonly #sharedStrings: SharedStringManager;\r\n readonly #styles: StyleManager;\r\n\r\n /** @internal */\r\n constructor(data: CellData, sharedStrings: SharedStringManager, styles: StyleManager) {\r\n this.#data = data;\r\n this.#sharedStrings = sharedStrings;\r\n this.#styles = styles;\r\n }\r\n\r\n // ── Identity ───────────────────────────────────────────────────────────────\r\n\r\n /** Cell reference string e.g. \"A1\". */\r\n get reference(): string { return this.#data.reference; }\r\n\r\n /** 1-based row index. */\r\n get row(): number { return parseCellRef(this.#data.reference).row; }\r\n\r\n /** 1-based column index. */\r\n get column(): number { return parseCellRef(this.#data.reference).column; }\r\n\r\n // ── Value API ──────────────────────────────────────────────────────────────\r\n\r\n /** Sets a string value. */\r\n setValue(value: string): this;\r\n /** Sets a numeric value. */\r\n setValue(value: number): this;\r\n /** Sets a boolean value. */\r\n setValue(value: boolean): this;\r\n /** Sets a Date value (stored as OADate number). */\r\n setValue(value: Date): this;\r\n /** Clears the cell value (sets to null). */\r\n setValue(value: null): this;\r\n setValue(value: CellValue): this {\r\n this.#data.formula = undefined;\r\n\r\n if (value === null || value === undefined) {\r\n this.#data.dataType = undefined;\r\n this.#data.rawValue = undefined;\r\n return this;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const idx = this.#sharedStrings.addOrGet(value);\r\n this.#data.dataType = 's';\r\n this.#data.rawValue = String(idx);\r\n return this;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n this.#data.dataType = 'b';\r\n this.#data.rawValue = value ? '1' : '0';\r\n return this;\r\n }\r\n\r\n if (value instanceof Date) {\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(toOADate(value));\r\n // Apply short date format if no format already set\r\n if (this.#data.styleIndex === 0) {\r\n const style = new CellStyle();\r\n style.setNumberFormat(ExcelNumberFormat.shortDate);\r\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(style);\r\n }\r\n return this;\r\n }\r\n\r\n // number\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the typed cell value.\r\n * Returns string | number | boolean | Date | null.\r\n * Date detection is based on the cell's number format.\r\n */\r\n getValue(): CellValue {\r\n if (this.#data.rawValue === undefined || this.#data.rawValue === '') return null;\r\n\r\n switch (this.#data.dataType) {\r\n case 's': {\r\n const idx = parseInt(this.#data.rawValue, 10);\r\n return this.#sharedStrings.tryGetString(idx) ?? this.#data.rawValue;\r\n }\r\n case 'b':\r\n return this.#data.rawValue === '1';\r\n case 'str':\r\n return this.#data.rawValue;\r\n default: {\r\n // Number or untyped — try to parse as a number\r\n const num = parseFloat(this.#data.rawValue);\r\n if (isNaN(num)) return this.#data.rawValue;\r\n\r\n // Check if this cell has a date format\r\n if (this.#isDateStyle()) {\r\n try { return fromOADate(num); } catch { return num; }\r\n }\r\n return num;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns the display text of the cell value (always a string).\r\n */\r\n getText(): string {\r\n const val = this.getValue();\r\n if (val === null) return '';\r\n if (val instanceof Date) return val.toLocaleDateString();\r\n return String(val);\r\n }\r\n\r\n // ── Formula API ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Sets a formula. The leading '=' is optional.\r\n * Clears any cached value.\r\n */\r\n setFormula(formula: string): this {\r\n if (!formula) throw new Error('Formula cannot be empty.');\r\n this.#data.formula = formula.startsWith('=') ? formula.slice(1) : formula;\r\n this.#data.rawValue = undefined; // cached value cleared; will be set after recalc\r\n this.#data.dataType = undefined;\r\n this.#data.arrayRef = undefined; // scalar unless marked as a dynamic array\r\n return this;\r\n }\r\n\r\n /**\r\n * Marks (or unmarks) this cell as a dynamic-array formula anchor. `spillRef`\r\n * is the block the array spills over (e.g. \"A1:C2\"); pass null to revert to a\r\n * plain scalar formula. Serialises as `<f t=\"array\" ref=\"…\">`.\r\n */\r\n setArrayRef(spillRef: string | null): this {\r\n this.#data.arrayRef = spillRef ?? undefined;\r\n return this;\r\n }\r\n\r\n /** The dynamic-array spill range, or null if this is not an array anchor. */\r\n getArrayRef(): string | null {\r\n return this.#data.arrayRef ?? null;\r\n }\r\n\r\n /**\r\n * Sets the cached/computed result of this cell WITHOUT touching its formula.\r\n *\r\n * This is what a recalculation engine calls after evaluating the formula: it\r\n * stores the value that XLSX serialises into `<v>` alongside the `<f>`. Unlike\r\n * setValue(), it does NOT clear the formula, and strings are stored inline\r\n * (t=\"str\") the way Excel stores calculated string results — they are not\r\n * added to the shared-string table.\r\n */\r\n setComputedValue(value: CellValue): this {\r\n if (value === null || value === undefined) {\r\n this.#data.dataType = undefined;\r\n this.#data.rawValue = undefined;\r\n return this;\r\n }\r\n if (typeof value === 'string') {\r\n this.#data.dataType = 'str';\r\n this.#data.rawValue = value;\r\n return this;\r\n }\r\n if (typeof value === 'boolean') {\r\n this.#data.dataType = 'b';\r\n this.#data.rawValue = value ? '1' : '0';\r\n return this;\r\n }\r\n if (value instanceof Date) {\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(toOADate(value));\r\n return this;\r\n }\r\n // number\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(value);\r\n return this;\r\n }\r\n\r\n /** Returns the formula text (without leading '='), or null if no formula. */\r\n getFormula(): string | null {\r\n return this.#data.formula ?? null;\r\n }\r\n\r\n /** True if this cell contains a formula. */\r\n get hasFormula(): boolean {\r\n return this.#data.formula !== undefined && this.#data.formula !== '';\r\n }\r\n\r\n // ── Style API ──────────────────────────────────────────────────────────────\r\n\r\n /** Gets the current CellStyle. Returns a new CellStyle if no style is set. */\r\n get style(): CellStyle {\r\n return this.#styles.getCellStyle(this.#data.styleIndex);\r\n }\r\n\r\n /** Replaces the entire cell style. */\r\n set style(value: CellStyle) {\r\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(value);\r\n }\r\n\r\n /**\r\n * Applies style changes via a callback on the current style.\r\n * Returns this for chaining.\r\n *\r\n * @example\r\n * cell.applyStyle(s => s.setBold(true).setFontColor(ExcelColor.red))\r\n */\r\n applyStyle(action: (style: CellStyle) => void): this {\r\n const s = this.#styles.getCellStyle(this.#data.styleIndex).clone();\r\n action(s);\r\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(s);\r\n return this;\r\n }\r\n\r\n // Convenience style shortcuts (mirror Cell.cs methods)\r\n\r\n setBold(bold = true): this { return this.applyStyle(s => s.setBold(bold)); }\r\n setItalic(italic = true): this { return this.applyStyle(s => s.setItalic(italic)); }\r\n setFontSize(size: number): this { return this.applyStyle(s => s.setFontSize(size)); }\r\n setFontColor(color: ExcelColor | string): this { return this.applyStyle(s => s.setFontColor(color as ExcelColor)); }\r\n setFontName(name: string): this { return this.applyStyle(s => s.setFontName(name)); }\r\n setBackgroundColor(color: ExcelColor | string): this{ return this.applyStyle(s => s.setBackgroundColor(color as ExcelColor)); }\r\n setWrapText(wrap = true): this { return this.applyStyle(s => s.setWrapText(wrap)); }\r\n setHorizontalAlignment(a: ExcelHorizontalAlignment): this { return this.applyStyle(s => s.setHorizontalAlignment(a)); }\r\n setVerticalAlignment(a: ExcelVerticalAlignment): this { return this.applyStyle(s => s.setVerticalAlignment(a)); }\r\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this { return this.applyStyle(s => s.setAllBorders(style, color)); }\r\n\r\n setNumberFormat(format: ExcelNumberFormat): this;\r\n setNumberFormat(formatCode: string): this;\r\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\r\n return this.applyStyle(s => s.setNumberFormat(formatOrCode as ExcelNumberFormat));\r\n }\r\n\r\n // ── Clear ──────────────────────────────────────────────────────────────────\r\n\r\n /** Clears the cell value and formula, preserving style. */\r\n clear(): void {\r\n this.#data.rawValue = undefined;\r\n this.#data.dataType = undefined;\r\n this.#data.formula = undefined;\r\n this.#data.arrayRef = undefined;\r\n }\r\n\r\n /** Clears the cell value, formula, AND style. */\r\n clearAll(): void {\r\n this.clear();\r\n this.#data.styleIndex = 0;\r\n }\r\n\r\n // ── XML serialisation ──────────────────────────────────────────────────────\r\n\r\n /** @internal Builds the <c> XML element string for this cell. */\r\n toXml(): string {\r\n const ref = this.#data.reference;\r\n const style = this.#data.styleIndex > 0 ? ` s=\"${this.#data.styleIndex}\"` : '';\r\n const type = this.#data.dataType ? ` t=\"${this.#data.dataType}\"` : '';\r\n\r\n const formulaXml = this.#data.formula\r\n ? (this.#data.arrayRef\r\n ? `<f t=\"array\" ref=\"${this.#data.arrayRef}\" aca=\"1\" ca=\"1\">${escXml(this.#data.formula)}</f>`\r\n : `<f>${escXml(this.#data.formula)}</f>`)\r\n : '';\r\n\r\n const valueXml =\r\n this.#data.rawValue !== undefined && this.#data.rawValue !== ''\r\n ? `<v>${escXml(this.#data.rawValue)}</v>`\r\n : '';\r\n\r\n if (!formulaXml && !valueXml && this.#data.styleIndex === 0) return '';\r\n\r\n return `<c r=\"${ref}\"${style}${type}>${formulaXml}${valueXml}</c>`;\r\n }\r\n\r\n /** @internal Parses a <c> XML element into CellData. */\r\n static fromXmlElement(\r\n el: {\r\n attributes: Record<string, string>;\r\n children: Array<{ tagName: string; textContent: string; attributes?: Record<string, string> }>;\r\n },\r\n ref: string,\r\n ): CellData {\r\n const dataType = (el.attributes['t'] ?? undefined) as CellData['dataType'];\r\n const styleIndex = parseInt(el.attributes['s'] ?? '0', 10);\r\n\r\n let rawValue: string | undefined;\r\n let formula: string | undefined;\r\n let arrayRef: string | undefined;\r\n\r\n for (const child of el.children) {\r\n const tag = child.tagName.replace(/^.*:/, '');\r\n if (tag === 'v') rawValue = child.textContent;\r\n if (tag === 'f') {\r\n formula = child.textContent;\r\n // Dynamic-array formula anchor: <f t=\"array\" ref=\"A1:C2\">\r\n if (child.attributes && child.attributes['t'] === 'array' && child.attributes['ref']) {\r\n arrayRef = child.attributes['ref'];\r\n }\r\n }\r\n }\r\n\r\n return { reference: ref, dataType, rawValue, formula, arrayRef, styleIndex };\r\n }\r\n\r\n // ── Private helpers ────────────────────────────────────────────────────────\r\n\r\n #isDateStyle(): boolean {\r\n const style = this.#styles.getCellStyle(this.#data.styleIndex);\r\n if (!style.numberFormat) return false;\r\n if (isDateFormatId(style.numberFormat.formatId)) return true;\r\n return isDateFormatCode(style.numberFormat.formatCode);\r\n }\r\n}\r\n\r\nfunction escXml(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\r\n}\r\n","/**\n * Represents a rectangular range of cells for bulk operations.\n * Port of TVE.PureDocs.Excel.Range (C#)\n */\nimport type { Worksheet } from './worksheet.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport { parseRangeRef, cellRefFromRowCol } from './cell-reference.js';\nimport type { CellValue } from './cell.js';\n\nexport class Range {\n readonly #sheet: Worksheet;\n readonly #startRow: number;\n readonly #startColumn: number;\n readonly #endRow: number;\n readonly #endColumn: number;\n readonly #address: string;\n\n constructor(sheet: Worksheet, rangeReference: string) {\n this.#sheet = sheet;\n this.#address = rangeReference.toUpperCase();\n const { startRow, startColumn, endRow, endColumn } = parseRangeRef(rangeReference);\n this.#startRow = startRow;\n this.#startColumn = startColumn;\n this.#endRow = endRow;\n this.#endColumn = endColumn;\n }\n\n /** The range address e.g. \"A1:B10\". */\n get address(): string { return this.#address; }\n\n /** Number of rows in the range. */\n get rowCount(): number { return this.#endRow - this.#startRow + 1; }\n\n /** Number of columns in the range. */\n get columnCount(): number { return this.#endColumn - this.#startColumn + 1; }\n\n // ── Value bulk operations ──────────────────────────────────────────────────\n\n /**\n * Sets values from a 2D array.\n * Values that exceed the range boundary are silently ignored.\n */\n setValues(values: CellValue[][]): void {\n for (let r = 0; r < values.length && this.#startRow + r <= this.#endRow; r++) {\n const rowValues = values[r]!;\n for (let c = 0; c < rowValues.length && this.#startColumn + c <= this.#endColumn; c++) {\n const cell = this.#sheet.getCell(this.#startRow + r, this.#startColumn + c);\n const val = rowValues[c]!;\n cell.setValue(val as never);\n }\n }\n }\n\n /**\n * Gets all cell values as a 2D array (row-major order).\n */\n getValues(): CellValue[][] {\n const result: CellValue[][] = [];\n for (let r = 0; r < this.rowCount; r++) {\n const row: CellValue[] = [];\n for (let c = 0; c < this.columnCount; c++) {\n const cell = this.#sheet.tryGetCell(this.#startRow + r, this.#startColumn + c);\n row.push(cell ? cell.getValue() : null);\n }\n result.push(row);\n }\n return result;\n }\n\n /** Clears all cells in the range (values only, preserves style). */\n clear(): void {\n this.#forEach(cell => cell.clear());\n }\n\n /** Auto-fits all columns in the range. */\n autoFit(): void {\n for (let col = this.#startColumn; col <= this.#endColumn; col++) {\n this.#sheet.autoFitColumn(col);\n }\n }\n\n // ── Style bulk operations ──────────────────────────────────────────────────\n\n /** Applies a CellStyle to all cells in the range. Returns this for chaining. */\n setStyle(style: CellStyle): this {\n this.#forEach(cell => { cell.style = style; });\n return this;\n }\n\n /**\n * Applies style changes to all cells in the range.\n * @example range.applyStyle(s => s.setBold(true).setBackgroundColor(ExcelColor.lightGray))\n */\n applyStyle(action: (style: CellStyle) => void): this {\n this.#forEach(cell => cell.applyStyle(action));\n return this;\n }\n\n setBold(bold = true): this {\n this.#forEach(cell => cell.setBold(bold));\n return this;\n }\n\n setFontSize(size: number): this {\n this.#forEach(cell => cell.setFontSize(size));\n return this;\n }\n\n setFontColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setFontColor(color as ExcelColor));\n return this;\n }\n\n setFontName(name: string): this {\n this.#forEach(cell => cell.setFontName(name));\n return this;\n }\n\n setBackgroundColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setBackgroundColor(color as ExcelColor));\n return this;\n }\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#forEach(cell => cell.setAllBorders(style, color));\n return this;\n }\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#forEach(cell => cell.setHorizontalAlignment(alignment));\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#forEach(cell => cell.setVerticalAlignment(alignment));\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#forEach(cell => cell.setWrapText(wrap));\n return this;\n }\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.#forEach(cell => cell.setNumberFormat(formatOrCode as ExcelNumberFormat));\n return this;\n }\n\n // ── Private helper ─────────────────────────────────────────────────────────\n\n #forEach(action: (cell: ReturnType<Worksheet['getCell']>) => void): void {\n for (let r = this.#startRow; r <= this.#endRow; r++) {\n for (let c = this.#startColumn; c <= this.#endColumn; c++) {\n action(this.#sheet.getCell(r, c));\n }\n }\n }\n}\n","/**\r\n * Represents a worksheet in an Excel workbook.\r\n * Port of TVE.PureDocs.Excel.Worksheet (C#)\r\n *\r\n * Key differences from C#:\r\n * - All public methods camelCase\r\n * - XML parsed/serialised directly — no OpenXml SDK\r\n * - No CalcChain yet (added later via @devmm/puredocs-excel-formula)\r\n */\r\nimport { Cell, CellData } from './cell.js';\r\nimport { SharedStringManager } from './shared-string-manager.js';\r\nimport { StyleManager } from '../style/style-manager.js';\r\nimport { CellStyle } from '../style/cell-style.js';\r\nimport { ExcelColor } from '../style/excel-color.js';\r\nimport { ExcelBorderStyle } from '../style/excel-border.js';\r\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\r\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\r\nimport { parseCellRef, cellRefFromRowCol, parseRangeRef } from './cell-reference.js';\r\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\r\nimport { WORKSHEET_DRAWING_REL_ID, type DrawingProvider } from '../io/drawing-part.js';\r\nimport { Range } from './range.js';\r\n\r\n// Internal row representation\r\ninterface RowData {\r\n rowIndex: number;\r\n height?: number;\r\n customHeight?: boolean;\r\n hidden?: boolean;\r\n cells: Map<string, CellData>; // ref → CellData\r\n}\r\n\r\n// Internal column definition\r\ninterface ColDef {\r\n min: number;\r\n max: number;\r\n width: number;\r\n customWidth: boolean;\r\n hidden?: boolean;\r\n}\r\n\r\n// Merge cell reference\r\ninterface MergeCell {\r\n ref: string; // e.g. \"A1:B2\"\r\n}\r\n\r\n// Freeze pane settings\r\ninterface PaneSettings {\r\n row: number; // rows to freeze\r\n column: number; // columns to freeze\r\n}\r\n\r\n// Auto filter\r\ninterface AutoFilter {\r\n ref: string;\r\n}\r\n\r\n// Data validation\r\ninterface DataValidation {\r\n sqref: string;\r\n formula: string;\r\n}\r\n\r\nexport type SheetVisibility = 'visible' | 'hidden' | 'veryHidden';\r\n\r\nexport class Worksheet {\r\n readonly #sharedStrings: SharedStringManager;\r\n readonly #styles: StyleManager;\r\n\r\n #name: string;\r\n #rows: Map<number, RowData> = new Map();\r\n #cols: ColDef[] = [];\r\n #mergeCells: MergeCell[] = [];\r\n #pane?: PaneSettings;\r\n #autoFilter?: AutoFilter;\r\n #dataValidations: DataValidation[] = [];\r\n #visibility: SheetVisibility = 'visible';\r\n #drawings: DrawingProvider[] = [];\r\n\r\n /** @internal */\r\n constructor(name: string, sharedStrings: SharedStringManager, styles: StyleManager) {\r\n this.#name = name;\r\n this.#sharedStrings = sharedStrings;\r\n this.#styles = styles;\r\n }\r\n\r\n // ── Identity ───────────────────────────────────────────────────────────────\r\n\r\n get name(): string { return this.#name; }\r\n set name(value: string) {\r\n if (!value) throw new Error('Worksheet name cannot be empty.');\r\n this.#name = value;\r\n }\r\n\r\n // ── Cell access ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Gets (or creates) a cell by reference string (e.g. \"A1\") or 1-based row/col.\r\n * Creates the row/cell if it doesn't exist.\r\n */\r\n getCell(reference: string): Cell;\r\n getCell(row: number, column: number): Cell;\r\n getCell(refOrRow: string | number, column?: number): Cell {\r\n const ref = typeof refOrRow === 'string'\r\n ? refOrRow.replace(/\\$/g, '').toUpperCase()\r\n : cellRefFromRowCol(refOrRow, column!);\r\n\r\n const { row } = parseCellRef(ref);\r\n const rowData = this.#getOrCreateRow(row);\r\n let cellData = rowData.cells.get(ref);\r\n if (!cellData) {\r\n cellData = { reference: ref, styleIndex: 0 };\r\n rowData.cells.set(ref, cellData);\r\n }\r\n return new Cell(cellData, this.#sharedStrings, this.#styles);\r\n }\r\n\r\n /**\r\n * Returns a Cell if it exists, or null if the row/cell has not been created.\r\n * Does NOT create a new cell (read-only access).\r\n */\r\n tryGetCell(reference: string): Cell | null;\r\n tryGetCell(row: number, column: number): Cell | null;\r\n tryGetCell(refOrRow: string | number, column?: number): Cell | null {\r\n const ref = typeof refOrRow === 'string'\r\n ? refOrRow.replace(/\\$/g, '').toUpperCase()\r\n : cellRefFromRowCol(refOrRow, column!);\r\n\r\n const { row } = parseCellRef(ref);\r\n const rowData = this.#rows.get(row);\r\n if (!rowData) return null;\r\n const cellData = rowData.cells.get(ref);\r\n if (!cellData) return null;\r\n return new Cell(cellData, this.#sharedStrings, this.#styles);\r\n }\r\n\r\n /** Shorthand indexer — sheet.cell(\"A1\") or sheet.cell(1, 1). */\r\n cell(reference: string): Cell;\r\n cell(row: number, column: number): Cell;\r\n cell(refOrRow: string | number, column?: number): Cell {\r\n return typeof refOrRow === 'string'\r\n ? this.getCell(refOrRow)\r\n : this.getCell(refOrRow, column!);\r\n }\r\n\r\n /** Gets a Range object for bulk operations. */\r\n getRange(rangeReference: string): Range {\r\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\r\n return new Range(this, rangeReference);\r\n }\r\n\r\n /** Gets the raw value of a cell (for formula evaluation). */\r\n getCellValue(reference: string): unknown {\r\n return this.tryGetCell(reference)?.getValue() ?? null;\r\n }\r\n\r\n /** Formula text (without leading '=') of a cell, or null if it has none. */\r\n getCellFormula(reference: string): string | null {\r\n return this.tryGetCell(reference)?.getFormula() ?? null;\r\n }\r\n\r\n /** Spill range (e.g. \"A1:A3\") of a dynamic-array anchor, or null. Supports A1#. */\r\n getSpillRange(reference: string): string | null {\r\n return this.tryGetCell(reference)?.getArrayRef() ?? null;\r\n }\r\n\r\n /**\r\n * Returns the 1-based extent of populated cells (largest row and column that\r\n * contain data). Returns zeros for an empty sheet. Useful for snapshotting a\r\n * sheet into a dense 2D array.\r\n */\r\n get usedBounds(): { rowCount: number; columnCount: number } {\r\n let rowCount = 0;\r\n let columnCount = 0;\r\n for (const row of this.#rows.values()) {\r\n if (row.cells.size === 0) continue;\r\n if (row.rowIndex > rowCount) rowCount = row.rowIndex;\r\n for (const ref of row.cells.keys()) {\r\n const col = parseCellRef(ref).column;\r\n if (col > columnCount) columnCount = col;\r\n }\r\n }\r\n return { rowCount, columnCount };\r\n }\r\n\r\n // ── Layout ─────────────────────────────────────────────────────────────────\r\n\r\n /** Sets the width of a column (1-based index). */\r\n setColumnWidth(columnIndex: number, width: number): void {\r\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\r\n if (width <= 0) throw new RangeError('Width must be > 0.');\r\n\r\n // Remove existing definition for this column\r\n this.#cols = this.#cols.filter(c => !(c.min <= columnIndex && c.max >= columnIndex));\r\n this.#cols.push({ min: columnIndex, max: columnIndex, width, customWidth: true });\r\n this.#cols.sort((a, b) => a.min - b.min);\r\n }\r\n\r\n /** Auto-fits column width based on content (approximate). */\r\n autoFitColumn(columnIndex: number): void {\r\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\r\n\r\n let maxLen = 8; // minimum\r\n for (const row of this.#rows.values()) {\r\n const ref = cellRefFromRowCol(row.rowIndex, columnIndex);\r\n const cellData = row.cells.get(ref);\r\n if (cellData) {\r\n const cell = new Cell(cellData, this.#sharedStrings, this.#styles);\r\n const textLen = cell.getText().length;\r\n if (textLen > maxLen) maxLen = textLen;\r\n }\r\n }\r\n // Approximate: character width * 1.2 + 2 padding, capped at 255\r\n this.setColumnWidth(columnIndex, Math.min(maxLen * 1.2 + 2, 255));\r\n }\r\n\r\n /** Sets the height of a row (1-based index). */\r\n setRowHeight(rowIndex: number, height: number): void {\r\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\r\n if (height <= 0) throw new RangeError('Height must be > 0.');\r\n const row = this.#getOrCreateRow(rowIndex);\r\n row.height = height;\r\n row.customHeight = true;\r\n }\r\n\r\n /** Shows or hides a row (1-based index). Hidden rows affect SUBTOTAL(101-111). */\r\n setRowHidden(rowIndex: number, hidden = true): void {\r\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\r\n this.#getOrCreateRow(rowIndex).hidden = hidden;\r\n }\r\n\r\n /** True if the given 1-based row is hidden. */\r\n isRowHidden(rowIndex: number): boolean {\r\n return this.#rows.get(rowIndex)?.hidden === true;\r\n }\r\n\r\n /** Merges cells in the given range (e.g. \"A1:B2\"). */\r\n mergeCells(rangeReference: string): void {\r\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\r\n this.#mergeCells.push({ ref: rangeReference });\r\n }\r\n\r\n /** Removes a merge for the given range reference. */\r\n unmergeCells(rangeReference: string): void {\r\n this.#mergeCells = this.#mergeCells.filter(m => m.ref !== rangeReference);\r\n }\r\n\r\n /**\r\n * Freezes rows and/or columns.\r\n * @param row Number of rows to freeze (0 = none)\r\n * @param column Number of columns to freeze (0 = none)\r\n */\r\n freezePanes(row: number, column: number): void {\r\n if (row < 0) throw new RangeError('Row must be >= 0.');\r\n if (column < 0) throw new RangeError('Column must be >= 0.');\r\n this.#pane = (row === 0 && column === 0) ? undefined : { row, column };\r\n }\r\n\r\n /** Sets auto-filter on the given range. */\r\n setAutoFilter(rangeReference: string): void {\r\n this.#autoFilter = { ref: rangeReference };\r\n }\r\n\r\n /**\r\n * Adds a dropdown data validation to a cell range.\r\n * @param cellRange Range to apply (e.g. \"F2:F1000\")\r\n * @param listFormula Formula for the dropdown list (e.g. \"'Sheet2'!$A$1:$A$10\")\r\n */\r\n addDropdownValidation(cellRange: string, listFormula: string): void {\r\n this.#dataValidations.push({ sqref: cellRange, formula: listFormula });\r\n }\r\n\r\n /** Sets the visibility state of this worksheet. */\r\n setVisibility(state: SheetVisibility): void {\r\n this.#visibility = state;\r\n }\r\n\r\n get visibility(): SheetVisibility { return this.#visibility; }\r\n\r\n // ── Drawings (charts, images …) ──────────────────────────────────────────────\r\n\r\n /**\r\n * Attaches a drawing provider (e.g. a chart) to this worksheet.\r\n * Satellite packages such as `@devmm/puredocs-excel-charts` call this; the core\r\n * save pipeline turns registered providers into valid OOXML drawing/chart parts.\r\n */\r\n addDrawingProvider(provider: DrawingProvider): void {\r\n this.#drawings.push(provider);\r\n }\r\n\r\n /** True when this worksheet has at least one drawing to serialise. */\r\n get hasDrawings(): boolean { return this.#drawings.length > 0; }\r\n\r\n /** @internal — drawing providers, consumed by the save pipeline. */\r\n get drawingProviders(): readonly DrawingProvider[] { return this.#drawings; }\r\n\r\n // ── XML serialisation ──────────────────────────────────────────────────────\r\n\r\n /** Builds the xl/worksheets/sheetN.xml string. */\r\n buildXml(): string {\r\n const colsXml = this.#buildColsXml();\r\n const sheetDataXml = this.#buildSheetDataXml();\r\n const mergeXml = this.#buildMergeCellsXml();\r\n const filterXml = this.#autoFilter ? `<autoFilter ref=\"${this.#autoFilter.ref}\"/>` : '';\r\n const validXml = this.#buildDataValidationsXml();\r\n const sheetViewXml = this.#buildSheetViewXml();\r\n // <drawing> must be the last child of <worksheet> per the CT_Worksheet schema.\r\n const drawingXml = this.hasDrawings ? `<drawing r:id=\"${WORKSHEET_DRAWING_REL_ID}\"/>` : '';\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetViews>${sheetViewXml}</sheetViews>\r\n${colsXml}${sheetDataXml}${filterXml}${mergeXml}${validXml}${drawingXml}\r\n</worksheet>`;\r\n }\r\n\r\n /** Parses xl/worksheets/sheetN.xml and loads cells into memory. */\r\n loadFromXml(xml: string): void {\r\n this.#rows.clear();\r\n this.#cols = [];\r\n this.#mergeCells = [];\r\n this.#pane = undefined;\r\n this.#autoFilter = undefined;\r\n this.#dataValidations = [];\r\n\r\n const root = parseXml(xml);\r\n\r\n // Columns\r\n for (const colEl of getElementsByTagName(root, 'col')) {\r\n this.#cols.push({\r\n min: parseInt(getAttr(colEl, 'min') ?? '1', 10),\r\n max: parseInt(getAttr(colEl, 'max') ?? '1', 10),\r\n width: parseFloat(getAttr(colEl, 'width') ?? '8'),\r\n customWidth: getAttr(colEl, 'customWidth') === '1',\r\n hidden: getAttr(colEl, 'hidden') === '1',\r\n });\r\n }\r\n\r\n // Sheet data (rows and cells)\r\n for (const rowEl of getElementsByTagName(root, 'row')) {\r\n const rowIndex = parseInt(getAttr(rowEl, 'r') ?? '0', 10);\r\n if (rowIndex < 1) continue;\r\n\r\n const rowData: RowData = { rowIndex, cells: new Map() };\r\n\r\n const ht = getAttr(rowEl, 'ht');\r\n if (ht) { rowData.height = parseFloat(ht); rowData.customHeight = true; }\r\n if (getAttr(rowEl, 'hidden') === '1') rowData.hidden = true;\r\n\r\n for (const cellEl of rowEl.children) {\r\n const tag = cellEl.tagName.replace(/^.*:/, '');\r\n if (tag !== 'c') continue;\r\n const ref = getAttr(cellEl, 'r');\r\n if (!ref) continue;\r\n const cellData = Cell.fromXmlElement(\r\n { attributes: cellEl.attributes, children: cellEl.children as Parameters<typeof Cell.fromXmlElement>[0]['children'] },\r\n ref.toUpperCase(),\r\n );\r\n rowData.cells.set(ref.toUpperCase(), cellData);\r\n }\r\n\r\n this.#rows.set(rowIndex, rowData);\r\n }\r\n\r\n // Merge cells\r\n for (const mcEl of getElementsByTagName(root, 'mergeCell')) {\r\n const ref = getAttr(mcEl, 'ref');\r\n if (ref) this.#mergeCells.push({ ref });\r\n }\r\n\r\n // Auto filter\r\n const afEls = getElementsByTagName(root, 'autoFilter');\r\n if (afEls.length > 0) {\r\n const ref = getAttr(afEls[0]!, 'ref');\r\n if (ref) this.#autoFilter = { ref };\r\n }\r\n\r\n // Freeze pane\r\n for (const paneEl of getElementsByTagName(root, 'pane')) {\r\n const state = getAttr(paneEl, 'state');\r\n if (state === 'frozen' || state === 'frozenSplit') {\r\n this.#pane = {\r\n row: parseInt(getAttr(paneEl, 'ySplit') ?? '0', 10),\r\n column: parseInt(getAttr(paneEl, 'xSplit') ?? '0', 10),\r\n };\r\n }\r\n }\r\n\r\n // Data validations\r\n for (const dvEl of getElementsByTagName(root, 'dataValidation')) {\r\n const sqref = getAttr(dvEl, 'sqref') ?? '';\r\n const f1Els = getElementsByTagName(dvEl, 'formula1');\r\n const formula = f1Els[0]?.textContent ?? '';\r\n if (sqref && formula) this.#dataValidations.push({ sqref, formula });\r\n }\r\n }\r\n\r\n // ── Private XML builders ───────────────────────────────────────────────────\r\n\r\n #buildColsXml(): string {\r\n if (this.#cols.length === 0) return '';\r\n const inner = this.#cols\r\n .map(c => {\r\n const hidden = c.hidden ? ' hidden=\"1\"' : '';\r\n return `<col min=\"${c.min}\" max=\"${c.max}\" width=\"${c.width.toFixed(2)}\" customWidth=\"${c.customWidth ? 1 : 0}\"${hidden}/>`;\r\n })\r\n .join('');\r\n return `<cols>${inner}</cols>`;\r\n }\r\n\r\n #buildSheetDataXml(): string {\r\n const sortedRows = [...this.#rows.values()].sort((a, b) => a.rowIndex - b.rowIndex);\r\n if (sortedRows.length === 0) return '<sheetData/>';\r\n\r\n const rowsXml = sortedRows.map(row => {\r\n const ht = row.height !== undefined && row.customHeight\r\n ? ` ht=\"${row.height}\" customHeight=\"1\"`\r\n : '';\r\n const hidden = row.hidden ? ' hidden=\"1\"' : '';\r\n\r\n const sortedCells = [...row.cells.values()].sort((a, b) => {\r\n const ra = parseCellRef(a.reference);\r\n const rb = parseCellRef(b.reference);\r\n return ra.column - rb.column;\r\n });\r\n\r\n const cellsXml = sortedCells\r\n .map(cd => new Cell(cd, this.#sharedStrings, this.#styles).toXml())\r\n .filter(Boolean)\r\n .join('');\r\n\r\n if (!cellsXml && !ht && !hidden) return '';\r\n return `<row r=\"${row.rowIndex}\"${ht}${hidden}>${cellsXml}</row>`;\r\n }).filter(Boolean).join('');\r\n\r\n return `<sheetData>${rowsXml}</sheetData>`;\r\n }\r\n\r\n #buildMergeCellsXml(): string {\r\n if (this.#mergeCells.length === 0) return '';\r\n const inner = this.#mergeCells.map(m => `<mergeCell ref=\"${m.ref}\"/>`).join('');\r\n return `<mergeCells count=\"${this.#mergeCells.length}\">${inner}</mergeCells>`;\r\n }\r\n\r\n #buildDataValidationsXml(): string {\r\n if (this.#dataValidations.length === 0) return '';\r\n const inner = this.#dataValidations\r\n .map(dv =>\r\n `<dataValidation type=\"list\" allowBlank=\"1\" showInputMessage=\"1\" showErrorMessage=\"1\" sqref=\"${dv.sqref}\"><formula1>${escXml(dv.formula)}</formula1></dataValidation>`,\r\n )\r\n .join('');\r\n return `<dataValidations count=\"${this.#dataValidations.length}\">${inner}</dataValidations>`;\r\n }\r\n\r\n #buildSheetViewXml(): string {\r\n if (!this.#pane) return '<sheetView workbookViewId=\"0\"/>';\r\n\r\n const { row, column } = this.#pane;\r\n const topLeftRow = row > 0 ? row + 1 : 1;\r\n const topLeftCol = column > 0 ? column + 1 : 1;\r\n const topLeft = cellRefFromRowCol(topLeftRow, topLeftCol);\r\n\r\n const activePane = row > 0 && column > 0 ? 'bottomRight'\r\n : row > 0 ? 'bottomLeft' : 'topRight';\r\n\r\n const xSplit = column > 0 ? ` xSplit=\"${column}\"` : '';\r\n const ySplit = row > 0 ? ` ySplit=\"${row}\"` : '';\r\n\r\n return `<sheetView workbookViewId=\"0\"><pane${xSplit}${ySplit} topLeftCell=\"${topLeft}\" activePane=\"${activePane}\" state=\"frozen\"/></sheetView>`;\r\n }\r\n\r\n #getOrCreateRow(rowIndex: number): RowData {\r\n let row = this.#rows.get(rowIndex);\r\n if (!row) {\r\n row = { rowIndex, cells: new Map() };\r\n this.#rows.set(rowIndex, row);\r\n }\r\n return row;\r\n }\r\n}\r\n\r\nfunction escXml(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\r\n}\r\n","/**\r\n * Defined names (named ranges) for a workbook.\r\n *\r\n * A defined name maps an identifier (e.g. \"TaxRate\", \"SalesData\") to a\r\n * refers-to expression (e.g. \"Sheet1!$A$1\", \"Sheet1!$A$1:$B$10\", \"0.2*100\").\r\n * Names may be workbook-global or scoped to a single worksheet.\r\n *\r\n * This module only models and stores the data (and serialises it to OOXML).\r\n * Resolution/evaluation of the refers-to expression is the responsibility of\r\n * the formula engine (@devmm/puredocs-excel-formula), which reads names through\r\n * Workbook.getDefinedName().\r\n */\r\n\r\n/** A single defined name. */\r\nexport interface DefinedName {\r\n /** The name identifier. Case-insensitive when resolved. */\r\n readonly name: string;\r\n /** The refers-to expression, WITHOUT a leading '='. */\r\n readonly refersTo: string;\r\n /**\r\n * Worksheet name this name is scoped to, or undefined for a workbook-global\r\n * name. Excel resolves a sheet-scoped name ahead of a global name of the\r\n * same identifier when a formula on that sheet references it.\r\n */\r\n readonly scope?: string;\r\n}\r\n\r\n/**\r\n * In-memory store for a workbook's defined names, with Excel scoping semantics.\r\n * Kept separate from Workbook so the storage rules live in one place.\r\n */\r\nexport class DefinedNameManager {\r\n readonly #names: DefinedName[] = [];\r\n\r\n /** All defined names, in insertion order. */\r\n get all(): readonly DefinedName[] {\r\n return this.#names;\r\n }\r\n\r\n get size(): number {\r\n return this.#names.length;\r\n }\r\n\r\n /**\r\n * Adds or replaces a defined name. A name is uniquely identified by the pair\r\n * (identifier, scope): the same identifier may exist once globally and once\r\n * per worksheet. The leading '=' of refersTo is stripped.\r\n */\r\n define(name: string, refersTo: string, scope?: string): void {\r\n if (!name) throw new Error('Defined name cannot be empty.');\r\n if (!refersTo) throw new Error('Defined name refersTo cannot be empty.');\r\n const cleaned = refersTo.startsWith('=') ? refersTo.slice(1) : refersTo;\r\n\r\n const idx = this.#indexOf(name, scope);\r\n const entry: DefinedName = { name, refersTo: cleaned, scope };\r\n if (idx >= 0) this.#names[idx] = entry;\r\n else this.#names.push(entry);\r\n }\r\n\r\n /** Removes a defined name by identifier and scope. Returns true if removed. */\r\n remove(name: string, scope?: string): boolean {\r\n const idx = this.#indexOf(name, scope);\r\n if (idx < 0) return false;\r\n this.#names.splice(idx, 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Resolves a name to its refers-to expression following Excel scoping:\r\n * a name scoped to `sheetName` takes precedence over the workbook-global\r\n * name of the same identifier. Returns undefined if no name matches.\r\n */\r\n resolve(name: string, sheetName?: string): string | undefined {\r\n const key = name.toUpperCase();\r\n if (sheetName) {\r\n const local = this.#names.find(\r\n n => n.name.toUpperCase() === key && n.scope?.toUpperCase() === sheetName.toUpperCase(),\r\n );\r\n if (local) return local.refersTo;\r\n }\r\n const global = this.#names.find(n => n.name.toUpperCase() === key && n.scope === undefined);\r\n return global?.refersTo;\r\n }\r\n\r\n #indexOf(name: string, scope?: string): number {\r\n const key = name.toUpperCase();\r\n const scopeKey = scope?.toUpperCase();\r\n return this.#names.findIndex(\r\n n => n.name.toUpperCase() === key && (n.scope?.toUpperCase()) === scopeKey,\r\n );\r\n }\r\n}\r\n","/**\r\n * Main entry point for the @devmm/puredocs-excel library.\r\n * Port of TVE.PureDocs.Excel.Workbook (C#)\r\n *\r\n * Key differences from C#:\r\n * - All factory methods are async (file I/O)\r\n * - saveAsBuffer() returns Uint8Array instead of MemoryStream\r\n * - saveToFile() is Node.js only\r\n * - No IDisposable — call close() or use Symbol.dispose\r\n * - WorksheetCollection replaced by a simple managed array\r\n */\r\nimport { unzipXlsx, readXmlEntry, requireXmlEntry } from '../io/zip-reader.js';\r\nimport { zipXlsx, type ZipInput } from '../io/zip-writer.js';\r\nimport {\r\n buildContentTypes,\r\n ROOT_RELS,\r\n buildWorkbookRels,\r\n buildWorkbookXml,\r\n buildSharedStringsXml,\r\n DEFAULT_STYLES_XML,\r\n EMPTY_WORKSHEET_XML,\r\n type SheetMeta,\r\n type DefinedNameMeta,\r\n} from '../io/ooxml-templates.js';\r\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\r\nimport { REL_TYPES, CONTENT_TYPES } from '../io/xml-builder.js';\r\nimport {\r\n buildDrawingXml,\r\n buildRelsXml,\r\n WORKSHEET_DRAWING_REL_ID,\r\n} from '../io/drawing-part.js';\r\nimport { SharedStringManager } from './shared-string-manager.js';\r\nimport { StyleManager } from '../style/style-manager.js';\r\nimport { Worksheet } from './worksheet.js';\r\nimport { DefinedNameManager, type DefinedName } from './defined-name.js';\r\n\r\ninterface SheetEntry {\r\n worksheet: Worksheet;\r\n sheetId: number;\r\n relId: string; // e.g. \"rId1\"\r\n}\r\n\r\nexport class Workbook {\r\n readonly #sharedStrings: SharedStringManager;\r\n readonly #styles: StyleManager;\r\n readonly #sheets: SheetEntry[] = [];\r\n readonly #definedNames = new DefinedNameManager();\r\n #closed = false;\r\n\r\n private constructor(\r\n sharedStrings: SharedStringManager,\r\n styles: StyleManager,\r\n ) {\r\n this.#sharedStrings = sharedStrings;\r\n this.#styles = styles;\r\n }\r\n\r\n // ── Factory methods ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Creates a new empty workbook.\r\n * Mirrors Workbook.Create() in C#.\r\n */\r\n static create(): Workbook {\r\n const ss = new SharedStringManager();\r\n const sm = new StyleManager();\r\n return new Workbook(ss, sm);\r\n }\r\n\r\n /**\r\n * Opens an existing workbook from a binary buffer (ArrayBuffer or Uint8Array).\r\n * Works in both browser and Node.js.\r\n * Mirrors Workbook.Open(stream) in C#.\r\n */\r\n static fromBuffer(buffer: ArrayBuffer | Uint8Array): Workbook {\r\n const entries = unzipXlsx(buffer);\r\n const ss = new SharedStringManager();\r\n const sm = new StyleManager();\r\n const wb = new Workbook(ss, sm);\r\n\r\n // Load shared strings\r\n const ssXml = readXmlEntry(entries, 'xl/sharedStrings.xml');\r\n if (ssXml) ss.loadFromXml(ssXml);\r\n\r\n // Load styles\r\n const stylesXml = readXmlEntry(entries, 'xl/styles.xml');\r\n if (stylesXml) sm.loadFromXml(stylesXml);\r\n\r\n // Parse workbook.xml to get sheet names and relationship IDs\r\n const wbXml = requireXmlEntry(entries, 'xl/workbook.xml');\r\n const wbRoot = parseXml(wbXml);\r\n\r\n for (const sheetEl of getElementsByTagName(wbRoot, 'sheet')) {\r\n const name = getAttr(sheetEl, 'name') ?? 'Sheet';\r\n const sheetId = parseInt(getAttr(sheetEl, 'sheetId') ?? '1', 10);\r\n const relId = getAttr(sheetEl, 'r:id') ?? getAttr(sheetEl, 'id') ?? `rId${sheetId}`;\r\n const state = getAttr(sheetEl, 'state') as Worksheet['visibility'] | undefined;\r\n\r\n // Find worksheet XML path from workbook rels\r\n const relXml = readXmlEntry(entries, 'xl/_rels/workbook.xml.rels') ?? '';\r\n const wsPath = resolveWorksheetPath(relXml, relId);\r\n const wsXml = wsPath ? (readXmlEntry(entries, wsPath) ?? EMPTY_WORKSHEET_XML) : EMPTY_WORKSHEET_XML;\r\n\r\n const ws = new Worksheet(name, ss, sm);\r\n if (state) ws.setVisibility(state);\r\n ws.loadFromXml(wsXml);\r\n\r\n wb.#sheets.push({ worksheet: ws, sheetId, relId });\r\n }\r\n\r\n // Defined names (named ranges). Parsed after sheets so localSheetId can be\r\n // mapped to a worksheet name by document-order index.\r\n for (const dn of getElementsByTagName(wbRoot, 'definedName')) {\r\n const name = getAttr(dn, 'name');\r\n if (!name) continue;\r\n const refersTo = dn.textContent.trim();\r\n if (!refersTo) continue;\r\n const localSheetId = getAttr(dn, 'localSheetId');\r\n let scope: string | undefined;\r\n if (localSheetId !== undefined) {\r\n const idx = parseInt(localSheetId, 10);\r\n scope = wb.#sheets[idx]?.worksheet.name;\r\n }\r\n wb.#definedNames.define(name, refersTo, scope);\r\n }\r\n\r\n return wb;\r\n }\r\n\r\n /**\r\n * Opens an existing workbook from a file path (Node.js only).\r\n * Mirrors Workbook.Open(filePath) in C#.\r\n */\r\n static async fromFile(filePath: string): Promise<Workbook> {\r\n // Dynamic import so the library doesn't break in browser environments\r\n const fs = await import('node:fs/promises');\r\n const buffer = await fs.readFile(filePath);\r\n return Workbook.fromBuffer(buffer);\r\n }\r\n\r\n // ── Worksheet management ───────────────────────────────────────────────────\r\n\r\n /**\r\n * Collection of worksheets (read-only array view).\r\n * Access by index: workbook.worksheets[0]\r\n * Access by name: workbook.worksheets.find(s => s.name === 'Sheet1')\r\n */\r\n get worksheets(): readonly Worksheet[] {\r\n return this.#sheets.map(e => e.worksheet);\r\n }\r\n\r\n /**\r\n * Adds a new worksheet with the given name and returns it.\r\n * Mirrors workbook.AddWorksheet(name) in C#.\r\n */\r\n addWorksheet(name: string): Worksheet {\r\n this.#assertOpen();\r\n if (!name) throw new Error('Worksheet name cannot be empty.');\r\n if (this.#sheets.some(e => e.worksheet.name === name)) {\r\n throw new Error(`Worksheet \"${name}\" already exists.`);\r\n }\r\n\r\n const sheetId = this.#sheets.length + 1;\r\n const relId = `rId${sheetId}`;\r\n const ws = new Worksheet(name, this.#sharedStrings, this.#styles);\r\n this.#sheets.push({ worksheet: ws, sheetId, relId });\r\n return ws;\r\n }\r\n\r\n /**\r\n * Returns a worksheet by name. Throws if not found.\r\n */\r\n getWorksheet(name: string): Worksheet {\r\n const entry = this.#sheets.find(e => e.worksheet.name === name);\r\n if (!entry) throw new Error(`Worksheet \"${name}\" not found.`);\r\n return entry.worksheet;\r\n }\r\n\r\n // ── Defined names (named ranges) ─────────────────────────────────────────────\r\n\r\n /**\r\n * Defines (or replaces) a named range.\r\n *\r\n * @param name The name identifier (case-insensitive when resolved).\r\n * @param refersTo The refers-to expression, e.g. \"Sheet1!$A$1:$B$10\". A\r\n * leading '=' is optional and stripped.\r\n * @param options `scope` restricts the name to a single worksheet; omit for\r\n * a workbook-global name.\r\n */\r\n defineName(name: string, refersTo: string, options?: { scope?: string }): void {\r\n this.#assertOpen();\r\n const scope = options?.scope;\r\n if (scope !== undefined && !this.#sheets.some(e => e.worksheet.name === scope)) {\r\n throw new Error(`Cannot scope defined name \"${name}\" to unknown worksheet \"${scope}\".`);\r\n }\r\n this.#definedNames.define(name, refersTo, scope);\r\n }\r\n\r\n /**\r\n * Resolves a defined name to its refers-to expression (without leading '=').\r\n * Follows Excel scoping: a name scoped to `sheetName` wins over the global\r\n * name of the same identifier. Returns undefined if no name matches.\r\n *\r\n * This is the seam the formula engine calls to resolve NamedRangeNode.\r\n */\r\n getDefinedName(name: string, sheetName?: string): string | undefined {\r\n return this.#definedNames.resolve(name, sheetName);\r\n }\r\n\r\n /** Removes a defined name. Returns true if a matching name was removed. */\r\n removeName(name: string, scope?: string): boolean {\r\n this.#assertOpen();\r\n return this.#definedNames.remove(name, scope);\r\n }\r\n\r\n /** All defined names in the workbook, in insertion order. */\r\n get definedNames(): readonly DefinedName[] {\r\n return this.#definedNames.all;\r\n }\r\n\r\n // ── Serialisation ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Serialises the workbook to a Uint8Array (xlsx binary).\r\n * Mirrors workbook.SaveAs(stream) in C#.\r\n * Works in browser and Node.js.\r\n */\r\n saveAsBuffer(): Uint8Array {\r\n this.#assertOpen();\r\n const entries = this.#buildZipEntries();\r\n return zipXlsx(entries);\r\n }\r\n\r\n /**\r\n * Saves the workbook to a file (Node.js only).\r\n * Mirrors workbook.SaveAs(filePath) in C#.\r\n */\r\n async saveToFile(filePath: string): Promise<void> {\r\n this.#assertOpen();\r\n const buffer = this.saveAsBuffer();\r\n const fs = await import('node:fs/promises');\r\n const path = await import('node:path');\r\n const dir = path.dirname(filePath);\r\n await fs.mkdir(dir, { recursive: true });\r\n await fs.writeFile(filePath, buffer);\r\n }\r\n\r\n // ── Lifecycle ──────────────────────────────────────────────────────────────\r\n\r\n /** Releases resources. The workbook should not be used after this call. */\r\n close(): void { this.#closed = true; }\r\n\r\n /** Symbol.dispose support for `using` keyword (TypeScript 5.2+). */\r\n [Symbol.dispose](): void { this.close(); }\r\n\r\n // ── Private helpers ────────────────────────────────────────────────────────\r\n\r\n #assertOpen(): void {\r\n if (this.#closed) throw new Error('Workbook has been closed.');\r\n }\r\n\r\n #buildZipEntries(): ZipInput {\r\n const entries = new Map<string, string>();\r\n\r\n const sheetCount = this.#sheets.length;\r\n\r\n // _rels/.rels\r\n entries.set('_rels/.rels', ROOT_RELS);\r\n\r\n // Build sheet metadata for workbook.xml\r\n const sheetMetas: SheetMeta[] = this.#sheets.map(e => ({\r\n name: e.worksheet.name,\r\n sheetId: e.sheetId,\r\n relationshipId: e.relId,\r\n state: e.worksheet.visibility !== 'visible' ? e.worksheet.visibility : undefined,\r\n }));\r\n\r\n // Defined names → workbook.xml <definedNames>. Map sheet-scope name to its\r\n // 0-based document-order index (localSheetId).\r\n const definedNameMetas: DefinedNameMeta[] = this.#definedNames.all.map(dn => {\r\n let localSheetId: number | undefined;\r\n if (dn.scope !== undefined) {\r\n const idx = this.#sheets.findIndex(e => e.worksheet.name === dn.scope);\r\n if (idx >= 0) localSheetId = idx;\r\n }\r\n return { name: dn.name, refersTo: dn.refersTo, localSheetId };\r\n });\r\n\r\n // xl/workbook.xml\r\n entries.set('xl/workbook.xml', buildWorkbookXml(sheetMetas, definedNameMetas));\r\n\r\n // xl/_rels/workbook.xml.rels\r\n entries.set('xl/_rels/workbook.xml.rels', buildWorkbookRels(sheetCount));\r\n\r\n // xl/styles.xml\r\n entries.set('xl/styles.xml', this.#styles.buildStylesXml());\r\n\r\n // xl/sharedStrings.xml\r\n entries.set('xl/sharedStrings.xml', this.#sharedStrings.buildXml());\r\n\r\n // xl/worksheets/sheetN.xml\r\n for (let i = 0; i < this.#sheets.length; i++) {\r\n entries.set(`xl/worksheets/sheet${i + 1}.xml`, this.#sheets[i]!.worksheet.buildXml());\r\n }\r\n\r\n // Drawings & their dependent parts (charts, images …).\r\n // Each worksheet with providers gets ONE drawing part aggregating all anchors;\r\n // every provider contributes one dependent part referenced from the drawing rels.\r\n const extraOverrides: Array<{ partName: string; contentType: string }> = [];\r\n let drawingCounter = 0;\r\n let partCounter = 0;\r\n\r\n for (let i = 0; i < this.#sheets.length; i++) {\r\n const ws = this.#sheets[i]!.worksheet;\r\n if (!ws.hasDrawings) continue;\r\n\r\n drawingCounter++;\r\n const drawingPath = `xl/drawings/drawing${drawingCounter}.xml`;\r\n const anchors: string[] = [];\r\n const drawingRels: string[] = [];\r\n\r\n ws.drawingProviders.forEach((provider, idx) => {\r\n const relId = `rId${idx + 1}`;\r\n anchors.push(provider.buildAnchorXml(relId));\r\n\r\n partCounter++;\r\n const part = provider.buildPart(partCounter);\r\n entries.set(part.path, part.content);\r\n extraOverrides.push({ partName: `/${part.path}`, contentType: part.contentType });\r\n\r\n // Rel target is relative to xl/drawings/ (all parts live under xl/).\r\n const target = `../${part.path.slice('xl/'.length)}`;\r\n drawingRels.push(\r\n ` <Relationship Id=\"${relId}\" Type=\"${part.relType}\" Target=\"${target}\"/>`,\r\n );\r\n });\r\n\r\n // xl/drawings/drawingN.xml + its rels\r\n entries.set(drawingPath, buildDrawingXml(anchors.join('')));\r\n entries.set(`xl/drawings/_rels/drawing${drawingCounter}.xml.rels`, buildRelsXml(drawingRels));\r\n extraOverrides.push({ partName: `/${drawingPath}`, contentType: CONTENT_TYPES.drawing });\r\n\r\n // xl/worksheets/_rels/sheetN.xml.rels → the drawing part\r\n entries.set(\r\n `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\r\n buildRelsXml([\r\n ` <Relationship Id=\"${WORKSHEET_DRAWING_REL_ID}\" Type=\"${REL_TYPES.drawing}\" Target=\"../drawings/drawing${drawingCounter}.xml\"/>`,\r\n ]),\r\n );\r\n }\r\n\r\n // [Content_Types].xml — written last so drawing/chart overrides are included.\r\n entries.set('[Content_Types].xml', buildContentTypes(sheetCount, extraOverrides));\r\n\r\n return entries;\r\n }\r\n}\r\n\r\n/**\r\n * Resolves the worksheet file path from workbook.xml.rels by relationship ID.\r\n * Returns path relative to xl/ e.g. \"xl/worksheets/sheet1.xml\".\r\n */\r\nfunction resolveWorksheetPath(relsXml: string, relId: string): string | undefined {\r\n if (!relsXml) return undefined;\r\n try {\r\n const root = parseXml(relsXml);\r\n for (const el of getElementsByTagName(root, 'Relationship')) {\r\n if (getAttr(el, 'Id') === relId) {\r\n const target = getAttr(el, 'Target') ?? '';\r\n // Target is relative to xl/, so \"worksheets/sheet1.xml\" → \"xl/worksheets/sheet1.xml\"\r\n return target.startsWith('xl/') ? target : `xl/${target}`;\r\n }\r\n }\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n return undefined;\r\n}\r\n"]}
|