@justybase/spreadsheet-tasks 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/BigBuffer.ts","../../src/ExcelReaderAbstract.ts","../../src/BiffReaderWriter.ts","../../src/XlsbReader.ts","../../src/XlsxReader.ts","../../src/xmlUtils.ts","../../src/ReaderFactory.ts","../../src/XlsbWriter.ts","../../src/Formats.ts","../../src/writerHelpers.ts","../../src/StreamingSheetState.ts","../../src/XlsxWriter.ts","../../src/XlsxUpdater.ts","../../src/XlsbUpdater.ts","../../src/biff12Utils.ts"],"sourcesContent":["import { Buffer } from 'buffer';\n\nexport class BigBuffer {\n private chunkSize: number;\n private chunks: Buffer[];\n private currentBuffer: Buffer;\n private cursor: number;\n\n constructor(chunkSize: number = 65536) {\n this.chunkSize = chunkSize;\n this.chunks = [];\n this.currentBuffer = Buffer.alloc(chunkSize);\n this.cursor = 0;\n }\n\n ensureCapacity(size: number): void {\n if (this.cursor + size > this.chunkSize) {\n this._flush();\n }\n }\n\n private _ensureCapacity(size: number): void {\n this.ensureCapacity(size);\n }\n\n private _flush(): void {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n }\n\n write(buffer: Buffer): void {\n let len = buffer.length;\n let offset = 0;\n\n while (len > 0) {\n let available = this.chunkSize - this.cursor;\n if (available === 0) {\n this._flush();\n available = this.chunkSize;\n }\n\n const toWrite = Math.min(len, available);\n buffer.copy(this.currentBuffer, this.cursor, offset, offset + toWrite);\n\n this.cursor += toWrite;\n offset += toWrite;\n len -= toWrite;\n }\n }\n\n writeByte(val: number): void {\n this._ensureCapacity(1);\n this.currentBuffer[this.cursor] = val;\n this.cursor++;\n }\n\n writeUnsafeByte(val: number): void {\n this.currentBuffer[this.cursor++] = val;\n }\n\n writeInt32LE(val: number): void {\n this._ensureCapacity(4);\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeUnsafeInt32LE(val: number): void {\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeDoubleLE(val: number): void {\n this._ensureCapacity(8);\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeUnsafeDoubleLE(val: number): void {\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeString(str: string): void {\n const byteLength = Buffer.byteLength(str, 'utf8');\n\n if (this.cursor + byteLength <= this.chunkSize) {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n return;\n }\n\n this._flush();\n\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf8'));\n } else {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n }\n }\n\n writeUtf16LE(str: string): void {\n const byteLength = str.length * 2;\n\n if (this.cursor + byteLength <= this.chunkSize) {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n return;\n }\n\n this._flush();\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf16le'));\n } else {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n }\n }\n\n getChunks(): Buffer[] {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n return this.chunks;\n }\n\n reset(): void {\n this.chunks = [];\n this.cursor = 0;\n }\n}\n\nexport default BigBuffer;\n","import { CellValue } from './Formats';\n\n/**\n * Shared reader surface for XLSB and XLSX.\n * Always use `await reader.read()` — both formats are async in v2+.\n */\nexport abstract class ExcelReaderAbstract {\n fieldCount: number = 0;\n rowCount: number = 0;\n actualSheetName: string = '';\n resultsCount: number = 0;\n\n protected _oaEpoch: number;\n\n constructor() {\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n /** Open a workbook file. */\n abstract open(path: string, readSharedStrings?: boolean, updateMode?: boolean): Promise<void>;\n\n async close(): Promise<void> {\n // cleanup if needed\n }\n\n /**\n * Advance to the next row.\n * @returns true if a row is available; false at EOF\n */\n abstract read(): Promise<boolean>;\n\n /** Worksheet names in workbook order. */\n abstract getSheetNames(): string[];\n\n /** Cell value for column index `i` of the current row (0-based). */\n abstract getValue(i: number): CellValue;\n\n dispose(): void {\n // cleanup\n }\n\n getDateTimeFromOaDate(oaDate: number): Date {\n const ms = oaDate * 86400000 + this._oaEpoch;\n return new Date(ms);\n }\n}\n\nexport default ExcelReaderAbstract;\n","export class BiffReaderWriter {\n private buffer: Buffer;\n private pos: number;\n private length: number;\n\n _isSheet: boolean = false;\n _workbookId: number = 0;\n _recId: string | null = null;\n _workbookName: string | null = null;\n\n private _inCellXf: boolean = false;\n private _inNumberFormat: boolean = false;\n private _numberFormatIndex: number = 0;\n private _format: number = 0;\n private _formatString: string | null = null;\n\n _sharedStringValue: string | null = null;\n _sharedStringUniqueCount: number = 0;\n\n _cellType: number = 0;\n _intValue: number = 0;\n _doubleVal: number = 0.0;\n _boolValue: boolean = false;\n _stringValue: string | null = null;\n _columnNum: number = -1;\n _xfIndex: number = 0;\n _readCell: boolean = false;\n _rowIndex: number = -1;\n\n // Start of the current record data (excluding ID and Length)\n private _recordStart: number = 0;\n\n _xfIndexToNumFmtId: number[] = [];\n _customNumFmts: Set<number> = new Set();\n\n constructor(buffer: Buffer) {\n if (!Buffer.isBuffer(buffer)) {\n throw new Error(\"BiffReaderWriter expects a Buffer\");\n }\n this.buffer = buffer;\n this.pos = 0;\n this.length = buffer.length;\n }\n\n private _tryReadVariableValue(): number | null {\n if (this.pos >= this.length) return null;\n\n const b1 = this.buffer[this.pos++];\n let value = (b1 & 0x7F) >>> 0;\n\n if ((b1 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b2 = this.buffer[this.pos++];\n value = (((b2 & 0x7F) << 7) | value) >>> 0;\n\n if ((b2 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b3 = this.buffer[this.pos++];\n value = (((b3 & 0x7F) << 14) | value) >>> 0;\n\n if ((b3 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b4 = this.buffer[this.pos++];\n value = (((b4 & 0x7F) << 21) | value) >>> 0;\n\n return value;\n }\n\n private _getDWord(offset: number): number {\n return this.buffer.readUInt32LE(this._recordStart + offset);\n }\n\n private _getInt32(offset: number): number {\n return this.buffer.readInt32LE(this._recordStart + offset);\n }\n\n private _getWord(offset: number): number {\n return this.buffer.readUInt16LE(this._recordStart + offset);\n }\n\n private _getByte(offset: number): number {\n return this.buffer[this._recordStart + offset];\n }\n\n private _getDouble(offset: number): number {\n return this.buffer.readDoubleLE(this._recordStart + offset);\n }\n\n private _getString(offset: number, length: number): string {\n const start = this._recordStart + offset;\n const end = start + (length * 2);\n if (end > this.buffer.length) return \"\";\n return this.buffer.toString('utf16le', start, end);\n }\n\n private _getNullableString(offsetRef: { val: number }): string | null {\n const length = this._getDWord(offsetRef.val);\n offsetRef.val += 4;\n\n if (length === 0xFFFFFFFF) return null;\n\n const str = this._getString(offsetRef.val, length);\n offsetRef.val += (length * 2);\n return str;\n }\n\n readWorkbook(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._isSheet = false;\n\n if (recordId === 0x9C) {\n this._workbookId = this._getDWord(4);\n\n const offsetRef = { val: 8 };\n this._recId = this._getNullableString(offsetRef);\n\n const nameLength = this._getDWord(offsetRef.val);\n this._workbookName = this._getString(offsetRef.val + 4, nameLength);\n this._isSheet = true;\n }\n\n return true;\n }\n\n readSharedStrings(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._sharedStringValue = null;\n\n if (recordId === 0x13) {\n const length = this._getDWord(1);\n this._sharedStringValue = this._getString(5, length);\n }\n else if (recordId === 159) {\n this._sharedStringUniqueCount = this._getDWord(4);\n }\n\n return true;\n }\n\n readStyles(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n const _cellXfStart = 0x269;\n const _cellXfEnd = 0x26a;\n const _numberFormatStart = 0x267;\n const _numberFormatEnd = 0x268;\n const _xf = 0x2f;\n const _numberFormat = 0x2c;\n\n switch (recordId) {\n case _cellXfStart:\n this._inCellXf = true;\n break;\n case _cellXfEnd:\n this._inCellXf = false;\n break;\n case _numberFormatStart:\n this._inNumberFormat = true;\n break;\n case _numberFormatEnd:\n this._inNumberFormat = false;\n break;\n\n case _xf:\n if (this._inCellXf) {\n this._numberFormatIndex = this._getWord(2);\n this._xfIndexToNumFmtId.push(this._numberFormatIndex);\n }\n break;\n\n case _numberFormat:\n if (this._inNumberFormat) {\n this._format = this._getWord(0);\n const length = this._getDWord(2);\n this._formatString = this._getString(6, length);\n\n const code = this._formatString.toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n this._customNumFmts.add(this._format);\n }\n }\n break;\n }\n\n return true;\n }\n\n private _getRkNumber(offset: number): number {\n const flags = this._getByte(offset);\n let result = 0;\n\n if ((flags & 0x02) !== 0) {\n const intVal = this._getInt32(offset);\n result = intVal >> 2;\n } else {\n const raw = this._getInt32(offset);\n const highBits = (raw & 0xFFFFFFFC);\n\n // Need to construct a double from high bits.\n // Since we can't easily write to a reused buffer without risk,\n // we'll just alloc 8 bytes here. It's rare for RK to be double.\n // Alternatively, we could reuse a small buffer if we cared enough.\n const dBuf = Buffer.allocUnsafe(8);\n dBuf.writeInt32LE(0, 0);\n dBuf.writeInt32LE(highBits, 4);\n\n result = dBuf.readDoubleLE(0);\n }\n\n if ((flags & 0x01) !== 0) {\n result /= 100;\n }\n\n return result;\n }\n\n readWorksheet(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._readCell = false;\n this._columnNum = -1;\n\n const _row = 0x00;\n const _blank = 0x01;\n const _number = 0x02;\n const _boolError = 0x03;\n const _bool = 0x04;\n const _float = 0x05;\n const _string = 0x06;\n const _sharedString = 0x07;\n const _formulaString = 0x08;\n const _formulaNumber = 0x09;\n const _formulaBool = 0x0a;\n const _formulaError = 0x0b;\n\n switch (recordId) {\n case _row:\n this._rowIndex = this._getInt32(0);\n break;\n\n case _blank:\n case _boolError:\n case _formulaError:\n this._readCell = true;\n this._cellType = 0;\n break;\n\n case _number:\n this._doubleVal = this._getRkNumber(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _bool:\n case _formulaBool:\n this._boolValue = (this._getByte(8) === 1);\n this._readCell = true;\n this._cellType = 4;\n break;\n\n case _formulaNumber:\n case _float:\n this._doubleVal = this._getDouble(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _string:\n case _formulaString:\n {\n const length = this._getDWord(8);\n this._stringValue = this._getString(12, length);\n this._readCell = true;\n this._cellType = 5;\n break;\n }\n\n case _sharedString:\n this._intValue = this._getDWord(8);\n this._readCell = true;\n this._cellType = 2;\n break;\n }\n\n if (this._readCell) {\n this._columnNum = this._getDWord(0);\n this._xfIndex = this._getDWord(4) & 0xffffff;\n }\n\n return true;\n }\n}\n\nexport default BiffReaderWriter;\n","import AdmZip from 'adm-zip';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { BiffReaderWriter } from './BiffReaderWriter';\nimport { CellValue } from './Formats';\n\ninterface SheetInfo {\n name: string;\n rId: string;\n path: string | null;\n}\n\nexport class XlsbReader extends ExcelReaderAbstract {\n private zip: AdmZip | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n\n private _currentSheetIndex: number = -1;\n private _reader: BiffReaderWriter | null = null;\n private _currentRow: CellValue[] = [];\n private _pendingRowIndex: number = -1;\n private _eof: boolean = false;\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> | null = null;\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n this.zip = new AdmZip(path);\n\n const wbEntry = this.zip.getEntry('xl/workbook.bin');\n if (wbEntry) {\n const buf = wbEntry.getData();\n const reader = new BiffReaderWriter(buf);\n while (reader.readWorkbook()) {\n if (reader._isSheet) {\n const name = reader._workbookName!;\n const rId = reader._recId!;\n this.sheetNames.push(name);\n this.sheets.push({ name, rId, path: null });\n }\n }\n }\n\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.bin.rels');\n if (relsEntry) {\n const xml = relsEntry.getData().toString('utf8');\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n const rIdToTarget: Record<string, string> = {};\n while ((match = relRegex.exec(xml)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n\n for (const sheet of this.sheets) {\n let target = rIdToTarget[sheet.rId];\n if (target) {\n if (target.startsWith('/')) target = target.substring(1);\n if (!target.startsWith('xl/')) target = 'xl/' + target;\n sheet.path = target;\n }\n }\n }\n\n if (readSharedStrings) {\n const ssPath = 'xl/sharedStrings.bin';\n if (this.zip.getEntry(ssPath)) {\n this._readSharedStrings(ssPath);\n }\n }\n\n const stylesPath = 'xl/styles.bin';\n if (this.zip.getEntry(stylesPath)) {\n this._readStyles(stylesPath);\n }\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n }\n\n private _readSharedStrings(path: string): void {\n const entry = this.zip!.getEntry(path);\n if (!entry) return;\n const reader = new BiffReaderWriter(entry.getData());\n\n while (reader.readSharedStrings()) {\n if (reader._sharedStringValue !== null) {\n this.sharedStrings.push(reader._sharedStringValue);\n }\n }\n }\n\n private _readStyles(path: string): void {\n const entry = this.zip!.getEntry(path);\n if (!entry) return;\n\n const reader = new BiffReaderWriter(entry.getData());\n while (reader.readStyles()) {\n // just consume\n }\n\n this.xfIdToNumFmtId = reader._xfIndexToNumFmtId;\n this.customDateFormats = reader._customNumFmts;\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n if (!this._initSheet(0)) return false;\n }\n\n if (this._eof) return false;\n\n this._currentRow = [];\n\n while (true) {\n const hasRecord = this._reader!.readWorksheet();\n if (!hasRecord) {\n this._eof = true;\n return true;\n }\n\n if (this._reader!._rowIndex !== -1 && this._reader!._rowIndex !== this._pendingRowIndex) {\n this._pendingRowIndex = this._reader!._rowIndex;\n return true;\n }\n\n if (this._reader!._readCell) {\n const col = this._reader!._columnNum;\n let val: CellValue = null;\n switch (this._reader!._cellType) {\n case 2:\n val = this.sharedStrings[this._reader!._intValue];\n break;\n case 3: {\n val = this._reader!._doubleVal;\n\n const xfIndex = this._reader!._xfIndex;\n let numFmtId = 0;\n if (this.xfIdToNumFmtId && xfIndex < this.xfIdToNumFmtId.length) {\n numFmtId = this.xfIdToNumFmtId[xfIndex];\n }\n\n const isDate = (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n (this.customDateFormats && this.customDateFormats.has(numFmtId));\n\n if (isDate) {\n try {\n val = this.getDateTimeFromOaDate(val as number);\n } catch {\n // ignore date conversion errors\n }\n }\n break;\n }\n case 4:\n val = this._reader!._boolValue;\n break;\n case 5:\n val = this._reader!._stringValue;\n break;\n default:\n val = null;\n }\n\n this._currentRow[col] = val;\n if (col >= this.fieldCount) this.fieldCount = col + 1;\n }\n }\n }\n\n private _initSheet(index: number): boolean {\n if (index >= this.sheets.length) return false;\n const sheet = this.sheets[index];\n const entry = this.zip!.getEntry(sheet.path!);\n if (!entry) return false;\n\n this._reader = new BiffReaderWriter(entry.getData());\n this._eof = false;\n this._pendingRowIndex = -1;\n\n while (this._reader.readWorksheet()) {\n if (this._reader._rowIndex !== -1) {\n this._pendingRowIndex = this._reader._rowIndex;\n return true;\n }\n }\n\n this._eof = true;\n return false;\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsbReader;\n","import yauzl, { ZipFile, Entry } from 'yauzl';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { CellValue } from './Formats';\nimport { unescapeXml, columnLetterToIndex, parseSharedStringsXml } from './xmlUtils';\n\ninterface SheetInfo {\n name: string;\n sheetId: string;\n rId: string;\n path: string;\n}\n\nexport class XlsxReader extends ExcelReaderAbstract {\n private zipfile: ZipFile | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n private entries: Map<string, Entry> = new Map();\n\n private _currentSheetIndex: number = -1;\n private _sheetXml: string | null = null;\n private _xmlPos: number = 0;\n\n private _currentRow: CellValue[] = [];\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> = new Set();\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n return new Promise((resolve, reject) => {\n yauzl.open(path, { lazyEntries: true, autoClose: false }, async (err, zipfile) => {\n if (err) return reject(err);\n this.zipfile = zipfile;\n\n this.entries = new Map();\n\n zipfile.on('entry', (entry: Entry) => {\n this.entries.set(entry.fileName, entry);\n zipfile.readEntry();\n });\n\n zipfile.on('end', async () => {\n try {\n const wbRelsContent = await this._readZipEntryContent('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (wbRelsContent) {\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n while ((match = relRegex.exec(wbRelsContent)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n }\n\n const wbContent = await this._readZipEntryContent('xl/workbook.xml');\n if (wbContent) {\n const sheetRegex = /<sheet[^>]*name=\"([^\"]*)\"[^>]*sheetId=\"([^\"]*)\"[^>]*r:id=\"([^\"]*)\"/g;\n let match;\n while ((match = sheetRegex.exec(wbContent)) !== null) {\n const name = unescapeXml(match[1]);\n const sheetId = match[2];\n const rId = match[3];\n\n const target = rIdToTarget[rId];\n let fullPath = target;\n if (!fullPath.startsWith('xl/')) {\n fullPath = 'xl/' + fullPath;\n }\n\n this.sheetNames.push(name);\n this.sheets.push({ name, sheetId, rId, path: fullPath });\n }\n }\n\n if (readSharedStrings) {\n const ssContent = await this._readZipEntryContent('xl/sharedStrings.xml');\n if (ssContent) {\n this._parseSharedStrings(ssContent);\n }\n }\n\n const stylesContent = await this._readZipEntryContent('xl/styles.xml');\n if (stylesContent) {\n this._parseStyles(stylesContent);\n }\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n\n zipfile.readEntry();\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.zipfile) {\n this.zipfile.close();\n }\n }\n\n private async _readZipEntryContent(path: string): Promise<string | null> {\n const entry = this.entries.get(path);\n if (!entry) return null;\n\n return new Promise((resolve, reject) => {\n this.zipfile!.openReadStream(entry, (err, readStream) => {\n if (err) return reject(err);\n\n const chunks: Buffer[] = [];\n readStream!.on('data', (chunk: Buffer) => chunks.push(chunk));\n readStream!.on('end', () => {\n resolve(Buffer.concat(chunks).toString('utf8'));\n });\n readStream!.on('error', reject);\n });\n });\n }\n\n private _parseSharedStrings(xml: string): void {\n this.sharedStrings = parseSharedStringsXml(xml);\n }\n\n private _parseStyles(xml: string): void {\n const numFmtRegex = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let match;\n this.customDateFormats = new Set();\n\n while ((match = numFmtRegex.exec(xml)) !== null) {\n const id = parseInt(match[1]);\n const code = match[2];\n if (code.toLowerCase().includes('yy') || code.toLowerCase().includes('mm') || code.toLowerCase().includes('dd') || code.toLowerCase().includes('h:mm')) {\n this.customDateFormats.add(id);\n }\n }\n\n this.xfIdToNumFmtId = [];\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart !== -1) {\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd !== -1) {\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n const xfRegex = /<xf\\s+[^>]*numFmtId=\"(\\d+)\"/g;\n while ((match = xfRegex.exec(cellXfsContent)) !== null) {\n const numFmtId = parseInt(match[1]);\n this.xfIdToNumFmtId.push(numFmtId);\n }\n }\n }\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n await this._initSheet(this._currentSheetIndex);\n }\n\n if (this._readNextRow()) {\n return true;\n } else {\n return false;\n }\n }\n\n private async _initSheet(index: number): Promise<void> {\n if (index >= this.sheets.length) return;\n const sheet = this.sheets[index];\n this.actualSheetName = sheet.name;\n\n this._sheetXml = await this._readZipEntryContent(sheet.path);\n\n if (!this._sheetXml) {\n this._sheetXml = \"\";\n }\n\n this._xmlPos = 0;\n const sd = this._sheetXml.indexOf('<sheetData>');\n if (sd !== -1) this._xmlPos = sd + 11;\n }\n\n private _readNextRow(): boolean {\n if (!this._sheetXml) return false;\n\n const rowStart = this._sheetXml.indexOf('<row', this._xmlPos);\n if (rowStart === -1) return false;\n\n const rowEnd = this._sheetXml.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n\n this._xmlPos = rowEnd + 6;\n this._parseRowByIndex(rowStart, rowEnd);\n return true;\n }\n\n private _parseRowByIndex(rowStart: number, rowEnd: number): void {\n this._currentRow = [];\n const xml = this._sheetXml!;\n\n let pos = xml.indexOf('>', rowStart) + 1;\n\n while (pos < rowEnd) {\n const cStart = xml.indexOf('<c', pos);\n if (cStart === -1 || cStart >= rowEnd) break;\n\n const nextTagClose = xml.indexOf('>', cStart);\n\n let colIndex = -1;\n let type = 'n';\n let styleIndex = 0;\n\n let currentIdx = cStart + 2;\n while (currentIdx < nextTagClose) {\n while (xml.charCodeAt(currentIdx) <= 32 && currentIdx < nextTagClose) currentIdx++;\n if (currentIdx >= nextTagClose) break;\n\n const keyStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 61 && currentIdx < nextTagClose) currentIdx++;\n const key = xml.substring(keyStart, currentIdx);\n\n currentIdx++;\n\n if (xml.charCodeAt(currentIdx) === 34) {\n currentIdx++;\n const valStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 34 && currentIdx < nextTagClose) currentIdx++;\n const val = xml.substring(valStart, currentIdx);\n currentIdx++;\n\n if (key === 'r') {\n let letterLen = 0;\n while (letterLen < val.length && val.charCodeAt(letterLen) >= 65) letterLen++;\n colIndex = columnLetterToIndex(val.substring(0, letterLen));\n } else if (key === 't') {\n type = val;\n } else if (key === 's') {\n styleIndex = parseInt(val, 10);\n }\n }\n }\n\n let val: string | null = null;\n if (xml.charCodeAt(nextTagClose - 1) === 47) {\n pos = nextTagClose + 1;\n } else {\n const cEnd = xml.indexOf('</c>', nextTagClose);\n const cellContentEnd = (cEnd !== -1 && cEnd < rowEnd) ? cEnd : rowEnd;\n\n const vStart = xml.indexOf('<v>', nextTagClose);\n if (vStart !== -1 && vStart < cellContentEnd) {\n const vInnerStart = vStart + 3;\n const vEnd = xml.indexOf('</v>', vInnerStart);\n if (vEnd !== -1 && vEnd < cellContentEnd) {\n val = xml.substring(vInnerStart, vEnd);\n }\n } else {\n if (type === 'inlineStr') {\n const tStart = xml.indexOf('<t', nextTagClose);\n if (tStart !== -1 && tStart < cellContentEnd) {\n const tContentStart = xml.indexOf('>', tStart) + 1;\n const tEnd = xml.indexOf('</t>', tContentStart);\n if (tEnd !== -1 && tEnd < cellContentEnd) {\n val = xml.substring(tContentStart, tEnd);\n }\n }\n }\n }\n pos = cellContentEnd + 4;\n }\n\n let finalVal: any = null;\n if (val !== null) {\n if (type === 's') {\n const idx = parseInt(val, 10);\n finalVal = this.sharedStrings[idx];\n } else if (type === 'b') {\n finalVal = (val === '1' || val === 'true');\n } else if (type === 'inlineStr') {\n finalVal = unescapeXml(val);\n } else if (type === 'n' || type === '') {\n finalVal = parseFloat(val);\n\n if (styleIndex > 0 && this.xfIdToNumFmtId) {\n let numFmtId = 0;\n if (styleIndex < this.xfIdToNumFmtId.length) {\n numFmtId = this.xfIdToNumFmtId[styleIndex];\n }\n\n const isDate = (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n (this.customDateFormats && this.customDateFormats.has(numFmtId));\n\n if (isDate) {\n try {\n finalVal = this.getDateTimeFromOaDate(finalVal);\n } catch {\n // ignore date conversion errors\n }\n }\n }\n }\n }\n\n if (colIndex !== -1) {\n this._currentRow[colIndex] = finalVal;\n if (colIndex >= this.fieldCount) this.fieldCount = colIndex + 1;\n }\n }\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsxReader;\n","/**\n * Shared low-level XML helpers used by readers and the XlsxUpdater.\n */\n\n/** True when the string contains XML-invalid control characters (tab/CR/LF are allowed). */\nfunction hasInvalidControlChars(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) {\n return true;\n }\n }\n return false;\n}\n\n/** Remove XML-invalid control characters (tab/CR/LF and normal ranges are kept). */\nfunction stripInvalidControlChars(str: string): string {\n let out = '';\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c === 0x09 || c === 0x0a || c === 0x0d || (c >= 0x20 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfffd)) {\n out += str[i];\n }\n }\n return out;\n}\n\n/** Escape text content for use inside an XML element body. */\nexport function escapeXmlText(str: string): string {\n if (!/&|<|>|\"|'/.test(str) && !hasInvalidControlChars(str)) {\n return str;\n }\n let out = str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n if (hasInvalidControlChars(out)) {\n out = stripInvalidControlChars(out);\n }\n return out;\n}\n\n/** Unescape the five predefined XML entities. */\nexport function unescapeXml(str: string): string {\n if (!str || str.indexOf('&') === -1) return str;\n return str.replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n}\n\n/** 0-based column index -> \"A\", \"B\", ..., \"AA\", \"AB\", ... (bijective base-26). */\nexport function columnIndexToLetter(colIndex: number): string {\n let n = colIndex + 1;\n let result = '';\n while (n > 0) {\n const rem = (n - 1) % 26;\n result = String.fromCharCode(65 + rem) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/** \"A\", \"AB\", ... -> 0-based column index. */\nexport function columnLetterToIndex(letter: string): number {\n let column = 0;\n const length = letter.length;\n for (let i = 0; i < length; i++) {\n column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);\n }\n return column - 1;\n}\n\n/**\n * Remove trailing rows that contain no non-empty cells (padding rows sometimes\n * produced by SQL exports). This keeps the written range aligned with the\n * actual data, so pivot tables do not pick up \"(blank)\" items from empty rows.\n */\nexport function trimTrailingEmptyRows<T>(rows: T[][]): T[][] {\n let end = rows.length;\n while (end > 0 && rows[end - 1].every(v => v === null || v === undefined)) {\n end--;\n }\n return end === rows.length ? rows : rows.slice(0, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.xml into the list of string values.\n * Handles plain `<si><t>…</t></si>` entries as well as rich-text `<si><r><t>…</t></r></si>` runs.\n */\nexport function parseSharedStringsXml(xml: string): string[] {\n const result: string[] = [];\n let pos = 0;\n while (true) {\n const siStart = xml.indexOf('<si>', pos);\n if (siStart === -1) break;\n\n const siEnd = xml.indexOf('</si>', siStart);\n if (siEnd === -1) break;\n\n const content = xml.substring(siStart, siEnd);\n let val = '';\n let tPos = 0;\n while (true) {\n const tStart = content.indexOf('<t', tPos);\n if (tStart === -1) break;\n const tagEnd = content.indexOf('>', tStart);\n const tEnd = content.indexOf('</t>', tagEnd);\n if (tEnd === -1) break;\n\n val += content.substring(tagEnd + 1, tEnd);\n tPos = tEnd + 4;\n }\n\n result.push(unescapeXml(val));\n pos = siEnd + 5;\n }\n return result;\n}\n","import * as path from 'path';\nimport { XlsxReader } from './XlsxReader';\nimport { XlsbReader } from './XlsbReader';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\n\n/**\n * Create an XLSB or XLSX reader based on the file extension.\n */\nexport class ReaderFactory {\n /**\n * @param filePath Path ending in `.xlsb` or `.xlsx`\n * @throws if the extension is unsupported\n */\n static create(filePath: string): ExcelReaderAbstract {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.xlsx') {\n return new XlsxReader();\n } else if (ext === '.xlsb') {\n return new XlsbReader();\n } else {\n throw new Error(`Unsupported extension: ${ext}`);\n }\n }\n}\n\nexport default ReaderFactory;\n","import * as fs from 'fs';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport { CellValue, unwrapCell, getFormat } from './Formats';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n defaultColWidth,\n} from './writerHelpers';\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n filterHeaderRange: string | null;\n filterData?: {\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n };\n}\n\n/**\n * High-performance XLSB (Excel Binary Workbook) writer.\n * Prefer this format for large datasets — typically faster and smaller than XLSX.\n */\nexport class XlsbWriter {\n private output: fs.WriteStream;\n private archive: ReturnType<typeof archiver>;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstDic: Map<string, number> = new Map();\n private sstCntUnique: number = 0;\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n private _nextFmtId: number = 167;\n private _nextXfIdx: number = 4;\n private _stFmtRecords: Map<string, { numfmtId: number; xfIndex: number }> = new Map();\n\n /** Worksheet binary template (BrtBeginSheet … dimension / views / cols placeholders). */\n private _sheet1Bytes: Buffer;\n private _workbookBinStart: Buffer;\n private _workbookBinMiddle: Buffer;\n private _workbookBinEnd: Buffer;\n /** Default styles.bin template; extended when custom number formats are registered. */\n private _stylesBin: Buffer;\n private _binaryIndexBin: Buffer;\n private _rRkIntegerLowerLimit: number;\n private _rRkIntegerUpperLimit: number;\n private _autoFilterStartBytes: Buffer;\n private _autoFilterEndBytes: Buffer;\n private _stickHeaderA1bytes: Buffer;\n /** Excel 2016+ autofilter compatibility stubs. */\n private _magicFilterExcel2016Fix0: Buffer;\n private _magicFilterExcel2016Fix1: Buffer;\n private _magicFilterExcel2016Fix2: Buffer;\n\n private readonly stream = new StreamingSheetState();\n\n\n /**\n * @param filePath Destination `.xlsb` path on disk.\n */\n constructor(filePath: string) {\n this.output = fs.createWriteStream(filePath);\n this.archive = archiver('zip');\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n this._sheet1Bytes = Buffer.from([\n 0x81, 0x01, 0x00, 0x93, 0x01, 0x17, 0xCB, 0x04,\n 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n 0xFF, 0x00, 0x00, 0x00, 0x00, 0x94, 0x01, 0x10,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x85, 0x01, 0x00, 0x89, 0x01, 0x1E, 0xDC, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x98, 0x01, 0x24, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x8A, 0x01, 0x00, 0x86, 0x01,\n 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E, 0x00,\n 0x80, 0x95, 0x08, 0x02, 0x05, 0x00, 0x26, 0x00,\n 0xE5, 0x03, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x08,\n 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x91,\n 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E,\n 0x00, 0x80, 0x80, 0x08, 0x02, 0x05, 0x00, 0x26,\n 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00,\n 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x92, 0x01, 0x00, 0x97, 0x04, 0x42,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00,\n 0xDD, 0x03, 0x02, 0x10, 0x00, 0xDC, 0x03, 0x30,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80,\n 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x26, 0x00, 0x82, 0x01, 0x00\n ]);\n\n this._workbookBinStart = Buffer.from([\n 0x83, 0x01, 0x00, 0x80, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x78, 0x00, 0x6C, 0x00, 0x01, 0x00, 0x00, 0x00,\n 0x37, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x33, 0x00, 0x32, 0x00, 0x36, 0x00, 0x99, 0x01, 0x0C, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x25, 0x06, 0x01, 0x00, 0x03, 0x0F, 0x00, 0x80, 0x97, 0x10, 0x34, 0x18, 0x00, 0x00, 0x00, 0x43, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x73, 0x00, 0x71, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x5C, 0x00,\n 0x54, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x69, 0x00, 0x73, 0x00, 0x75, 0x00, 0x58, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x26, 0x00,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x81, 0x18, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x31, 0x00, 0x33, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x63, 0x00,\n 0x72, 0x00, 0x3A, 0x00, 0x31, 0x00, 0x5F, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x36, 0x00, 0x35, 0x00, 0x30, 0x00, 0x38, 0x00, 0x44, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x46, 0x00, 0x38, 0x00,\n 0x37, 0x00, 0x2D, 0x00, 0x34, 0x00, 0x37, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x38, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x34, 0x00, 0x41, 0x00, 0x34, 0x00, 0x30, 0x00,\n 0x31, 0x00, 0x31, 0x00, 0x33, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x7D, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x87, 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x10, 0x00, 0x80, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x9E, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x16, 0x00, 0x00, 0xB4, 0x69, 0x00, 0x00, 0xE8, 0x26, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x78, 0x88, 0x01, 0x00,\n 0x8F, 0x01, 0x00\n ]);\n\n this._workbookBinMiddle = Buffer.from([0x90, 0x01, 0x00]);\n\n this._workbookBinEnd = Buffer.from([\n 0x9D, 0x01, 0x1A, 0x35, 0xEA, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0xFC, 0xA9, 0xF1, 0xD2, 0x4D, 0x62, 0x50, 0x3F, 0x01,\n 0x00, 0x00, 0x00, 0x6A, 0x00, 0x9B, 0x01, 0x01, 0x00, 0x23, 0x04, 0x03, 0x0F, 0x00, 0x00, 0xAB, 0x10, 0x01, 0x01, 0x24, 0x00, 0x84, 0x01, 0x00\n ]);\n\n this._stylesBin = Buffer.from([\n 0x96, 0x02, 0x00, 0xE7, 0x04, 0x04, 0x02,\n 0x00, 0x00, 0x00, 0x2C, 0x2C, 0xA4, 0x00, 0x13,\n 0x00, 0x00, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79,\n 0x00, 0x79, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x6D,\n 0x00, 0x6D, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x64,\n 0x00, 0x64, 0x00, 0x5C, 0x00, 0x20, 0x00, 0x68,\n 0x00, 0x68, 0x00, 0x3A, 0x00, 0x6D, 0x00, 0x6D,\n 0x00, 0x2C, 0x1E, 0xA6, 0x00, 0x0C, 0x00, 0x00,\n 0x00, 0x79, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79,\n 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x6D,\n 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x64,\n 0x00, 0xE8, 0x04, 0x00, 0xE3, 0x04, 0x04, 0x01,\n 0x00, 0x00, 0x00,\n 0x2B, 0x27, 0xDC, 0x00, 0x00, 0x00, 0x90, 0x01,\n 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x07,\n 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x62, 0x00, 0x72, 0x00, 0x69,\n 0x00,\n 0x2B, 0x27, 0xDC, 0x00, 0x01, 0x00, 0xBC, 0x02,\n 0x00, 0x00, 0x00, 0x02, 0xEE, 0x00, 0x07, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x07,\n 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x62, 0x00, 0x72, 0x00, 0x69,\n 0x00,\n 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E, 0x00, 0x80, 0x81, 0x08, 0x00, 0x26, 0x00, 0xE4, 0x04, 0x00, 0xDB, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00,\n 0x2D, 0x44, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x41, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x2D, 0x44, 0x11, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x41, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0xDC, 0x04, 0x00, 0xE5, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x04, 0x00, 0xF2,\n 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x2F, 0x10, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\n 0x00, 0xF3, 0x04, 0x00, 0xE9, 0x04, 0x04,\n 0x04,\n 0x00, 0x00, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\n 0xEA, 0x04, 0x00, 0xEB, 0x04, 0x04, 0x01, 0x00,\n 0x00, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x11, 0x00, 0x80, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4E,\n 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6E, 0x00, 0x79, 0x00, 0xEC, 0x04, 0x00, 0xF9, 0x03, 0x04, 0x00, 0x00,\n 0x00, 0x00, 0xFA, 0x03, 0x00, 0xFC, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C,\n 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x75, 0x00,\n 0x6D, 0x00, 0x32, 0x00, 0x11, 0x00, 0x00, 0x00, 0x50, 0x00, 0x69, 0x00, 0x76, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79,\n 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0x36, 0x00, 0xFD, 0x03, 0x00, 0x23,\n 0x04, 0x02, 0x0E, 0x00, 0x00, 0xEB, 0x08, 0x00, 0xF6, 0x08, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x53, 0x00, 0x6C, 0x00,\n 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x67,\n 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0xF7, 0x08, 0x00, 0xEC, 0x08, 0x00, 0x24, 0x00, 0x23, 0x04, 0x03, 0x0F, 0x00, 0x00, 0xB0, 0x10,\n 0x00, 0xB2, 0x10, 0x32, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00,\n 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0xB3, 0x10, 0x00, 0xB1, 0x10, 0x00, 0x24, 0x00, 0x97, 0x02, 0x00\n ]);\n\n this._binaryIndexBin = Buffer.from([\n 0x2A, 0x18, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95,\n 0x02, 0x00\n ]);\n\n this._rRkIntegerLowerLimit = -1 << 29;\n this._rRkIntegerUpperLimit = (1 << 29) - 1;\n\n this._autoFilterStartBytes = Buffer.from([0xA1, 0x01, 0x10]);\n this._autoFilterEndBytes = Buffer.from([0xA2, 0x01, 0x00]);\n\n this._stickHeaderA1bytes = Buffer.from([\n 0x97, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xF0, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03\n ]);\n\n this._magicFilterExcel2016Fix0 = Buffer.from([0xE1, 0x02, 0x00, 0xE5, 0x02, 0x00, 0xEA, 0x02]);\n this._magicFilterExcel2016Fix1 = Buffer.from([\n 0x27, 0x46, 0x21, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x5F,\n 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x61,\n 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x0F, 0x00, 0x00,\n 0x00, 0x3B, 0xFF, 0x00\n ]);\n this._magicFilterExcel2016Fix2 = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF]);\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n private _registerFormat(fmtString: string): number {\n if (this._stFmtRecords.has(fmtString)) {\n return this._stFmtRecords.get(fmtString)!.xfIndex;\n }\n const numfmtId = this._nextFmtId++;\n const xfIndex = this._nextXfIdx++;\n this._stFmtRecords.set(fmtString, { numfmtId, xfIndex });\n return xfIndex;\n }\n\n private static _buildBrtRecord(type: number, data: Buffer): Buffer {\n const header = XlsbWriter._encodeVlq(type);\n header.push(...XlsbWriter._encodeVlq(data.length));\n return Buffer.concat([Buffer.from(header), data]);\n }\n\n private static _encodeVlq(value: number): number[] {\n const result: number[] = [];\n while (value >= 0x80) {\n result.push((value & 0x7F) | 0x80);\n value >>>= 7;\n }\n result.push(value & 0x7F);\n return result;\n }\n\n private static _buildStFmtRecord(ifmt: number, fmtString: string): Buffer {\n const cch = fmtString.length;\n const remaining = 2 + 4 + cch * 2;\n const data = Buffer.alloc(2 + remaining);\n data[0] = 0x2C;\n data[1] = remaining;\n data.writeUInt16LE(ifmt, 2);\n data.writeUInt32LE(cch, 4);\n data.write(fmtString, 8, cch * 2, 'utf16le');\n return data;\n }\n\n private static _buildXfRecord(fontId: number, ifmt: number, flags: number, byte6Extra: number = 0): Buffer {\n const data = Buffer.alloc(18);\n data[0] = 0x2F;\n data[1] = 16;\n data.writeUInt16LE(fontId, 2);\n data.writeUInt16LE(ifmt, 4);\n data[6] = byte6Extra;\n data[14] = 0x10;\n data[15] = 0x10;\n data.writeUInt16LE(flags, 16);\n return data;\n }\n\n private _buildStylesBin(): Buffer {\n if (this._stFmtRecords.size === 0) {\n return this._stylesBin;\n }\n const base = this._stylesBin;\n\n // Find BrtEndFonts (0xE8, 0x04, 0x00)\n let fontEndOff = -1;\n for (let i = 3; i < base.length - 3; i++) {\n if (base[i] === 0xE8 && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n fontEndOff = i;\n break;\n }\n }\n\n // Find BrtBeginCellXFs (0xE9, 0x04)\n let xfBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xE9 && base[i + 1] === 0x04) {\n xfBeginOff = i;\n break;\n }\n }\n\n // Find BrtEndCellXFs (0xEA, 0x04, 0x00)\n let xfEndOff = -1;\n for (let i = xfBeginOff; i < base.length - 3; i++) {\n if (base[i] === 0xEA && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n xfEndOff = i;\n break;\n }\n }\n\n // Find BrtBeginFills (0xE3, 0x04) — start after BrtEndFonts\n let fillBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xE3 && base[i + 1] === 0x04) {\n fillBeginOff = i;\n break;\n }\n }\n\n const totalFmt = 2 + this._stFmtRecords.size;\n const totalXf = 4 + this._stFmtRecords.size;\n\n const parts: Buffer[] = [];\n\n // 1. BrtBeginStyleSheet\n parts.push(base.subarray(0, 3));\n\n // 2. NEW BrtFmt: VLQ(0x0267) + VLQ(4) + count(2 LE) + pad(2)\n const fmtHeader = Buffer.alloc(4);\n fmtHeader.writeUInt16LE(totalFmt, 0);\n parts.push(XlsbWriter._buildBrtRecord(0x0267, fmtHeader));\n\n // 3. BrtNumFmt records: 2 base + custom (ALWAYS add base formats)\n parts.push(XlsbWriter._buildStFmtRecord(164, 'yyyy\\\\-mm\\\\-dd\\\\ hh:mm'));\n parts.push(XlsbWriter._buildStFmtRecord(166, 'yyyy\\\\-mm\\\\-dd'));\n for (const [fmtString, st] of this._stFmtRecords) {\n parts.push(XlsbWriter._buildStFmtRecord(st.numfmtId, fmtString));\n }\n\n // 4. BrtEndFonts\n parts.push(XlsbWriter._buildBrtRecord(0x0268, Buffer.alloc(0)));\n\n // 5. Copy fills+borders+BrtFont+cellStyleXFs from template\n parts.push(base.subarray(fillBeginOff, xfBeginOff));\n\n // 7. NEW BrtBeginCellXFs\n const xfHeader = Buffer.alloc(4);\n xfHeader.writeUInt16LE(totalXf, 0);\n parts.push(XlsbWriter._buildBrtRecord(0x0269, xfHeader));\n\n // 8. Base XF records\n parts.push(XlsbWriter._buildXfRecord(0, 0, 0x0000));\n parts.push(XlsbWriter._buildXfRecord(0, 164, 0x0001));\n parts.push(XlsbWriter._buildXfRecord(0, 166, 0x0001));\n parts.push(XlsbWriter._buildXfRecord(1, 0, 0x0000, 1));\n\n // 9. Custom XF records\n const sortedXf = [...this._stFmtRecords.entries()].sort((a, b) => a[1].xfIndex - b[1].xfIndex);\n for (const [, st] of sortedXf) {\n parts.push(XlsbWriter._buildXfRecord(0, st.numfmtId, 0x0001));\n }\n\n // 10. BrtEndCellXFs\n parts.push(XlsbWriter._buildBrtRecord(0x026A, Buffer.alloc(0)));\n\n // 11. Copy remaining template\n parts.push(base.subarray(xfEndOff + 3));\n\n return Buffer.concat(parts);\n }\n\n /**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n * @param sheetName Display name (sanitized to Excel rules)\n * @param hidden Whether the sheet is hidden in Excel\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n this.sheetCount++;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/sheet${this.sheetCount}.bin`,\n hidden: hidden,\n nameInArchive: `sheet${this.sheetCount}.bin`,\n sheetId: this.sheetCount,\n filterHeaderRange: null\n });\n }\n\n /**\n * Start a new sheet in streaming mode. Call writeRow() for each row, then endSheet() when done.\n * @param sheetName Name of the sheet\n * @param columnCount Number of columns in the sheet\n * @param headers Optional header row\n * @param options Optional settings (hidden, doAutofilter)\n */\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: { hidden?: boolean; doAutofilter?: boolean; sampleRows?: unknown[][] } = {}\n ): void {\n const { hidden = false, doAutofilter = true, sampleRows } = options;\n\n // Add sheet metadata\n this.addSheet(sheetName, hidden);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n const bigBuf = this.stream.buffer!;\n\n if (headers) {\n applyHeaderWidths(this.stream.colWidths, headers, columnCount);\n }\n if (sampleRows) {\n updateColWidthsFromRows(this.stream.colWidths, sampleRows);\n }\n\n // Write sheet header\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n sheetHeader.writeInt32LE(this.stream.startCol, 40);\n sheetHeader.writeInt32LE(this.stream.endCol, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n // Write sticky header if headers are present\n if (headers) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n // Write column definitions\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n\n for (let i = this.stream.startCol; i < this.stream.endCol; i++) {\n bigBuf.writeByte(0);\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(this.stream.colWidths[i], true);\n bigBuf.writeByte(0);\n bigBuf.writeByte(Math.max(0, Math.min(255, width)));\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(2);\n }\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n // Write header row if provided\n if (headers) {\n this.createRowHeader(bigBuf, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(bigBuf, headers[c], c, true);\n }\n this.stream.rowNum++;\n }\n }\n\n /**\n * Write a single row in streaming mode. Must be called between startSheet() and endSheet().\n * @param row Array of cell values\n */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n\n // Write row header\n this.createRowHeader(bigBuf, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n\n // Write each cell\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const styleNum = fmtString !== null ? this._registerFormat(fmtString) : 0;\n\n if (typeof val === 'number') {\n if (Number.isInteger(val)) {\n if (val >= this._rRkIntegerLowerLimit && val <= this._rRkIntegerUpperLimit) {\n this.writeRkNumberInteger(bigBuf, val, c, styleNum);\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else if (typeof val === 'bigint') {\n this.writeString(bigBuf, val.toString(), c);\n } else if (typeof val === 'boolean') {\n this.writeBool(bigBuf, val, c);\n } else if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n this.writeDouble(bigBuf, oaDate, c, fmtString !== null ? styleNum : 1);\n } else if (val !== null && val !== undefined) {\n this.writeString(bigBuf, val.toString(), c, false, fmtString !== null ? styleNum : undefined);\n }\n }\n\n this.stream.rowNum++;\n }\n\n /**\n * Finalize the current streaming sheet and add it to the archive.\n * Must be called after startSheet() and writeRow() calls.\n */\n endSheet(): void {\n const bigBuf = this.stream.assertStreaming();\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n\n // Write sheet footer sections\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n // Write autofilter if enabled\n if (this.stream.doAutofilter) {\n this._autofilterIsOn = true;\n const endRow = this.stream.rowNum;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(this.stream.startCol, 0);\n colBuf.writeInt32LE(this.stream.endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n // Store filter data for later\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: endRow - 1,\n startColumn: this.stream.startCol,\n endColumn: this.stream.endCol - 1\n };\n }\n\n bigBuf.write(sheetHeader.subarray(290));\n\n // Add to archive\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n\n // Reset streaming state\n this.stream.end();\n }\n\n\n /**\n * Write an entire sheet in one call (batch mode).\n * @param rows Data rows (`CellValue` cells; null/undefined = blank)\n * @param headers Optional header row (bold + frozen + autofilter when enabled)\n * @param doAutofilter Enable autofilter when headers are present (default true)\n */\n writeSheet(rows: CellValue[][], headers: string[] | null = null, doAutofilter: boolean = true): void {\n const bigBuf = new BigBuffer();\n let columnCount = 0;\n\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n const colWidths = initColWidths(columnCount);\n\n if (headers) {\n applyHeaderWidths(colWidths, headers, columnCount);\n }\n updateColWidthsFromRows(colWidths, rows);\n\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n const startCol = 0;\n const endCol = columnCount;\n\n sheetHeader.writeInt32LE(startCol, 40);\n sheetHeader.writeInt32LE(endCol, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n if (headers) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n\n for (let i = startCol; i < endCol; i++) {\n bigBuf.writeByte(0);\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(colWidths[i], true);\n bigBuf.writeByte(0);\n bigBuf.writeByte(Math.max(0, Math.min(255, width)));\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(2);\n }\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n let rowNum = 0;\n\n if (headers) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(bigBuf, headers[c], c, true);\n }\n rowNum++;\n }\n\n for (let r = 0; r < rows.length; r++) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const styleNum = fmtString !== null ? this._registerFormat(fmtString) : 0;\n\n if (typeof val === 'number') {\n if (Number.isInteger(val)) {\n if (val >= this._rRkIntegerLowerLimit && val <= this._rRkIntegerUpperLimit) {\n this.writeRkNumberInteger(bigBuf, val, c, styleNum);\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else if (typeof val === 'bigint') {\n this.writeString(bigBuf, val.toString(), c);\n } else if (typeof val === 'boolean') {\n this.writeBool(bigBuf, val, c);\n } else if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n this.writeDouble(bigBuf, oaDate, c, fmtString !== null ? styleNum : 1);\n } else if (val !== null && val !== undefined) {\n this.writeString(bigBuf, val.toString(), c, false, fmtString !== null ? styleNum : undefined);\n }\n }\n rowNum++;\n }\n\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n if (doAutofilter && headers) {\n this._autofilterIsOn = true;\n const endRow = rows.length + 1;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(startCol, 0);\n colBuf.writeInt32LE(endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: rows.length,\n startColumn: startCol,\n endColumn: endCol - 1\n };\n }\n\n bigBuf.write(sheetHeader.subarray(290));\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: this.sheetList[this.sheetCount - 1].pathInArchive });\n }\n\n\n\n createRowHeader(bigBuf: BigBuffer, rowNumber: number, startCol: number, endCol: number): void {\n bigBuf.ensureCapacity(27);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(25);\n bigBuf.writeUnsafeInt32LE(rowNumber);\n bigBuf.writeUnsafeInt32LE(0);\n bigBuf.writeUnsafeByte(44);\n bigBuf.writeUnsafeByte(1);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(1);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeInt32LE(startCol);\n bigBuf.writeUnsafeInt32LE(endCol);\n }\n\n writeRkNumberInteger(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n bigBuf.ensureCapacity(14);\n bigBuf.writeUnsafeByte(2);\n bigBuf.writeUnsafeByte(12);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n const rkVal = (val << 2) | 2;\n bigBuf.writeUnsafeInt32LE(rkVal);\n }\n\n writeDouble(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n bigBuf.ensureCapacity(18);\n bigBuf.writeUnsafeByte(5);\n bigBuf.writeUnsafeByte(16);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeDoubleLE(val);\n }\n\n writeBool(bigBuf: BigBuffer, val: boolean, colNum: number): void {\n bigBuf.ensureCapacity(13);\n bigBuf.writeUnsafeByte(0x04);\n bigBuf.writeUnsafeByte(9);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeInt32LE(0);\n bigBuf.writeUnsafeByte(val ? 1 : 0);\n }\n\n writeDateTime(bigBuf: BigBuffer, date: Date, colNum: number): void {\n // Use UTC time to avoid timezone conversion issues\n const oaDate = (date.getTime() - this._oaEpoch) / 86400000;\n this.writeDouble(bigBuf, oaDate, colNum, 1);\n }\n\n private _getDateWidth(_date: Date): number {\n return 19; // \"YYYY-MM-DD HH:MM:SS\" ≈ 19 chars\n }\n\n writeString(bigBuf: BigBuffer, val: string, colNum: number, bolded: boolean = false, styleOverride?: number): void {\n let index: number;\n if (this.sstDic.has(val)) {\n index = this.sstDic.get(val)!;\n } else {\n index = this.sstCntUnique;\n this.sstDic.set(val, index);\n this.sstCntUnique++;\n }\n this.sstCntAll++;\n\n const styleNum = styleOverride !== undefined ? styleOverride : (bolded ? 3 : 0);\n bigBuf.ensureCapacity(17);\n bigBuf.writeUnsafeByte(7);\n bigBuf.writeUnsafeByte(12);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeInt32LE(index);\n }\n\n private saveSst(): void {\n const bigBuf = new BigBuffer();\n\n bigBuf.writeByte(159);\n bigBuf.writeByte(1);\n bigBuf.writeByte(8);\n\n bigBuf.writeInt32LE(this.sstCntUnique);\n bigBuf.writeInt32LE(this.sstCntAll);\n\n for (const [txt] of this.sstDic) {\n const txtLen = txt.length;\n\n bigBuf.writeByte(19);\n\n const recLen = 5 + 2 * txtLen;\n\n if (recLen >= 128) {\n bigBuf.writeByte(128 + (recLen % 128));\n const tmp = recLen >> 7;\n if (tmp >= 256) {\n bigBuf.writeByte(128 + (tmp % 128));\n } else {\n bigBuf.writeByte(tmp);\n }\n bigBuf.writeByte(recLen >> 14);\n if ((recLen >> 14) > 0) {\n bigBuf.writeByte(0);\n }\n } else {\n bigBuf.writeByte(recLen & 0xFF);\n bigBuf.writeByte((recLen >> 8) & 0xFF);\n }\n\n bigBuf.writeInt32LE(txtLen);\n bigBuf.writeUtf16LE(txt);\n }\n\n bigBuf.writeByte(160);\n bigBuf.writeByte(1);\n bigBuf.writeByte(0);\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: 'xl/sharedStrings.bin' });\n }\n\n private _writeFilterDefinedName(wbBuffers: Buffer[], sheet: SheetInfo, sheetNum: number): void {\n const filterData = sheet.filterData!;\n const sheetIndex = sheet.sheetId - 1;\n\n const fix1 = Buffer.alloc(this._magicFilterExcel2016Fix1.length);\n this._magicFilterExcel2016Fix1.copy(fix1);\n\n const lastIdx = this._magicFilterExcel2016Fix1.length - 2;\n\n fix1[7] = sheetIndex;\n fix1[lastIdx] = sheetNum;\n\n wbBuffers.push(fix1);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(filterData.startRow, 0);\n rowBuf.writeInt32LE(filterData.endRow, 4);\n wbBuffers.push(rowBuf);\n\n const colBuf = Buffer.alloc(4);\n colBuf.writeInt16LE(filterData.startColumn, 0);\n colBuf.writeInt16LE(filterData.endColumn, 2);\n wbBuffers.push(colBuf);\n\n wbBuffers.push(this._magicFilterExcel2016Fix2);\n }\n\n /**\n * Finalize the ZIP package and close the output stream.\n * Must be awaited before the file is fully written.\n */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.saveSst();\n\n this.archive.append(this._buildStylesBin(), { name: 'xl/styles.bin' });\n\n const wbBuffers: Buffer[] = [];\n wbBuffers.push(this._workbookBinStart);\n\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n\n const recLen = 4 + 12 + sheet.name.length * 2 + rId.length * 2;\n const buf = Buffer.alloc(3 + recLen);\n buf[0] = 156; buf[1] = 1; buf[2] = recLen;\n let pos = 3;\n\n buf.writeInt32LE(sheet.hidden ? 1 : 0, pos); pos += 4;\n buf.writeInt32LE(sheet.sheetId, pos); pos += 4;\n\n buf.writeInt32LE(rId.length, pos); pos += 4;\n for (let i = 0; i < rId.length; i++) {\n const c = rId.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n\n buf.writeInt32LE(sheet.name.length, pos); pos += 4;\n for (let i = 0; i < sheet.name.length; i++) {\n const c = sheet.name.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n wbBuffers.push(buf);\n }\n\n wbBuffers.push(this._workbookBinMiddle);\n\n if (this._autofilterIsOn) {\n const filteredSheets = this.sheetList.filter(s => s.filterData);\n const cnt = filteredSheets.length;\n\n if (cnt > 0) {\n wbBuffers.push(this._magicFilterExcel2016Fix0);\n\n const firstByte = cnt <= 20\n ? 0x10 + (cnt - 1) * 0x0C\n : 0x80 + (cnt - 21) * 0x0C;\n const countBuf = cnt <= 10\n ? Buffer.from([firstByte, cnt, 0x00, 0x00, 0x00])\n : Buffer.from([firstByte, Math.floor((cnt - 1) / 10), cnt, 0x00, 0x00, 0x00]);\n wbBuffers.push(countBuf);\n\n for (let nm = 0; nm < cnt; nm++) {\n const sheetIndex = filteredSheets[nm].sheetId - 1;\n const idxBuf = Buffer.alloc(12);\n idxBuf.writeInt32LE(0, 0);\n idxBuf[4] = sheetIndex;\n idxBuf[8] = sheetIndex;\n wbBuffers.push(idxBuf);\n }\n\n wbBuffers.push(Buffer.from([0xE2, 0x02, 0x00]));\n\n for (let sheetNum = 0; sheetNum < cnt; sheetNum++) {\n const sheet = filteredSheets[sheetNum];\n this._writeFilterDefinedName(wbBuffers, sheet, sheetNum);\n }\n }\n }\n\n wbBuffers.push(this._workbookBinEnd);\n\n this.archive.append(Buffer.concat(wbBuffers), { name: 'xl/workbook.bin' });\n\n for (const sheet of this.sheetList) {\n this.archive.append(this._binaryIndexBin, { name: `xl/worksheets/binaryIndex${sheet.sheetId}.bin` });\n }\n\n let contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n<Default Extension=\"bin\" ContentType=\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\"/>\n<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>`;\n for (const sheet of this.sheetList) {\n contentTypes += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.ms-excel.worksheet\"/>`;\n contentTypes += `<Override PartName=\"/xl/worksheets/binaryIndex${sheet.sheetId}.bin\" ContentType=\"application/vnd.ms-excel.binIndexWs\"/>`;\n }\n contentTypes += `<Override PartName=\"/xl/styles.bin\" ContentType=\"application/vnd.ms-excel.styles\"/>\n<Override PartName=\"/xl/sharedStrings.bin\" ContentType=\"application/vnd.ms-excel.sharedStrings\"/>\n</Types>`;\n this.archive.append(contentTypes, { name: '[Content_Types].xml' });\n\n let wbRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n wbRels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n wbRels += `<Relationship Id=\"rId${this.sheetList.length + 2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.bin\"/>\n<Relationship Id=\"rId${this.sheetList.length + 3}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.bin\"/>\n</Relationships>`;\n this.archive.append(wbRels, { name: 'xl/_rels/workbook.bin.rels' });\n\n const globalRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.bin\"/>\n</Relationships>`;\n this.archive.append(globalRels, { name: '_rels/.rels' });\n\n for (const sheet of this.sheetList) {\n const wsRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.microsoft.com/office/2006/relationships/xlBinaryIndex\" Target=\"binaryIndex${sheet.sheetId}.bin\"/>\n</Relationships>`;\n this.archive.append(wsRels, { name: `xl/worksheets/_rels/${sheet.nameInArchive}.rels` });\n }\n\n this.output.on('close', () => resolve());\n this.archive.on('error', (err: any) => reject(err));\n this.archive.finalize();\n } catch (err) {\n reject(err);\n }\n });\n }\n}\n\nexport default XlsbWriter;\n","export type PrimitiveCellValue = string | number | boolean | Date | bigint | null | undefined;\n\nexport interface FormattedCell {\n value: PrimitiveCellValue;\n format: string;\n}\n\nexport type CellValue = PrimitiveCellValue | FormattedCell;\n\n/** Built-in Excel number-format strings for {@link FormattedCell}. */\nexport const F = {\n THOUSANDS_SEP: '#,##0',\n CURRENCY_PLN: '#,##0.00 \"z\\u0142\"',\n CURRENCY_EUR: '#,##0.00 \\u20AC',\n PERCENTAGE: '0%',\n SCIENTIFIC: '0.00E+00',\n TWO_DECIMALS: '#,##0.00',\n TEXT: '@',\n LEADING_ZEROS: '000000000',\n\n DATE_SHORT: 'dd.mm.yyyy',\n DATE_LONG: 'd mmmm yyyy',\n DATE_DAY_MONTH_YEAR: 'dd-mm-yyyy',\n DATE_ISO: 'yyyy-mm-dd',\n DATE_MONTH_YEAR: 'mmmm yyyy',\n DATE_WEEKDAY: 'dddd, d mmmm yyyy',\n DATE_DAY_MONTH: 'd mmmm',\n DATE_YEAR_ONLY: 'yyyy',\n\n DATETIME_SHORT: 'dd.mm.yyyy hh:mm',\n DATETIME_LONG: 'd mmmm yyyy hh:mm:ss',\n TIME_HH_MM: 'hh:mm',\n TIME_HH_MM_SS: 'hh:mm:ss',\n TIME_12H: 'h:mm AM/PM',\n DATETIME_24H: 'dd.mm.yyyy hh:mm:ss',\n DATETIME_ISO: 'yyyy-mm-dd\"T\"hh:mm:ss',\n TIME_MS: 'hh:mm:ss.000',\n};\n\nexport function isFormattedCell(val: unknown): val is FormattedCell {\n return val !== null && val !== undefined && typeof val === 'object' && 'format' in val && typeof (val as FormattedCell).format === 'string';\n}\n\nexport function unwrapCell(val: CellValue): PrimitiveCellValue {\n if (isFormattedCell(val)) {\n return val.value;\n }\n return val;\n}\n\nexport function getFormat(val: CellValue): string | null {\n if (isFormattedCell(val)) {\n return val.format;\n }\n return null;\n}\n","import { isFormattedCell } from './Formats';\n\n/** Excel sheet name characters that must be replaced. */\nexport const INVALID_SHEET_NAME_CHARS = /[\\\\/*?[\\]:]/g;\n\n/**\n * Sanitize an Excel sheet name (invalid chars, max 31 chars, non-empty).\n * @param sheetCount Current sheet count before adding this sheet (used for defaults).\n */\nexport function sanitizeSheetName(name: string, sheetCount: number): string {\n if (!name || typeof name !== 'string') {\n return `Sheet${sheetCount + 1}`;\n }\n\n let sanitized = name.replace(INVALID_SHEET_NAME_CHARS, '_');\n\n if (sanitized.length > 31) {\n sanitized = sanitized.substring(0, 31);\n }\n\n if (sanitized.trim().length === 0) {\n sanitized = `Sheet${sheetCount + 1}`;\n }\n\n return sanitized;\n}\n\n/** Create column-width scratch array filled with -1 (unknown). */\nexport function initColWidths(columnCount: number): number[] {\n return new Array(columnCount).fill(-1.0);\n}\n\n/** Apply autofit widths from header labels. */\nexport function applyHeaderWidths(colWidths: number[], headers: string[], columnCount: number): void {\n for (let i = 0; i < columnCount; i++) {\n const len = headers[i] ? headers[i].length + 1 : 0;\n let width = 1.25 * len + 2;\n if (width > 80) width = 80;\n if (colWidths[i] < width) colWidths[i] = width;\n }\n}\n\n/**\n * Sample up to `sampleLimit` rows and expand column widths (autofit).\n * Skips null/undefined cells; Dates use a fixed display length of 20.\n */\nexport function updateColWidthsFromRows(\n colWidths: number[],\n rows: unknown[][],\n sampleLimit: number = 100\n): void {\n for (let r = 0; r < Math.min(rows.length, sampleLimit); r++) {\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n const val = isFormattedCell(raw) ? raw.value : raw;\n const len = val instanceof Date ? 20 : String(val).length + 1;\n let width = 1.25 * len + 2;\n if (width > 80) width = 80;\n if (colWidths[c] < width) colWidths[c] = width;\n }\n }\n}\n\n/**\n * Resolve a stored autofit width to the value written into the file.\n * XLSB uses floored integers; XLSX keeps the float.\n */\nexport function defaultColWidth(width: number, floor: boolean = false): number {\n if (width > 0) {\n return floor ? Math.floor(width) : width;\n }\n return 10;\n}\n","import { BigBuffer } from './BigBuffer';\nimport { initColWidths } from './writerHelpers';\n\n/**\n * Shared streaming-sheet session state for Node writers.\n * Holds buffer, row cursor, column range, autofilter flag, and autofit widths.\n */\nexport class StreamingSheetState {\n isStreaming: boolean = false;\n rowNum: number = 0;\n startCol: number = 0;\n endCol: number = 0;\n doAutofilter: boolean = false;\n colWidths: number[] = [];\n buffer: BigBuffer | null = null;\n\n /**\n * Begin a streaming sheet session.\n * @throws if already streaming\n */\n begin(columnCount: number, doAutofilter: boolean, buffer: BigBuffer): void {\n if (this.isStreaming) {\n throw new Error('Already in streaming mode. Call endSheet() first.');\n }\n\n this.isStreaming = true;\n this.buffer = buffer;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = columnCount;\n this.doAutofilter = doAutofilter;\n this.colWidths = initColWidths(columnCount);\n }\n\n /** Assert streaming mode and return the active buffer. */\n assertStreaming(): BigBuffer {\n if (!this.isStreaming || !this.buffer) {\n throw new Error('Not in streaming mode. Call startSheet() first.');\n }\n return this.buffer;\n }\n\n /** Reset after endSheet(). */\n end(): void {\n this.isStreaming = false;\n this.buffer = null;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.doAutofilter = false;\n this.colWidths = [];\n }\n}\n","import * as fs from 'fs';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport { CellValue, unwrapCell, getFormat } from './Formats';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n defaultColWidth,\n} from './writerHelpers';\n\nconst COLUMN_LETTERS = (() => {\n const letters: string[] = [];\n for (let i = 65; i < 91; i++) {\n letters.push(String.fromCharCode(i));\n }\n const temp: string[] = [];\n for (const p of letters) {\n for (let i = 65; i < 91; i++) {\n temp.push(p + String.fromCharCode(i));\n }\n }\n letters.push(...temp);\n return letters;\n})();\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n rId: string;\n filterHeaderRange: string | null;\n}\n\n/**\n * XLSX (Office Open XML) writer with streaming ZIP output.\n */\nexport class XlsxWriter {\n private output: fs.WriteStream;\n private archive: archiver.Archiver;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstArray: string[] = [];\n private sstMap: Map<string, number> = new Map();\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n\n // Format registry\n private _formatRegistry: Map<string, number> = new Map();\n private _formatXfMap: Map<string, number> = new Map();\n private _nextNumfmtId: number = 165;\n private _nextXfIndex: number = 4;\n\n private readonly stream = new StreamingSheetState();\n private currentColLetters: string[] = [];\n\n /**\n * @param filePath Destination `.xlsx` path on disk.\n */\n constructor(filePath: string) {\n this.output = fs.createWriteStream(filePath);\n this.archive = archiver('zip');\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n private _getColumnLetter(colIndex: number): string {\n return colIndex < COLUMN_LETTERS.length ? COLUMN_LETTERS[colIndex] : 'A';\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n private _escapeSheetNameForXml(name: string): string {\n return name\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n }\n\n private _formatSheetNameForFormula(name: string): string {\n if (/[\\s\\-+=()!@#$%^&]/.test(name) || /^[0-9]/.test(name)) {\n const escaped = name.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n return name;\n }\n\n /**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n\n this.sheetCount++;\n const rId = `rId${this.sheetCount}`;\n const sheetFileName = `sheet${this.sheetCount}.xml`;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/${sheetFileName}`,\n hidden: hidden,\n nameInArchive: sheetFileName,\n sheetId: this.sheetCount,\n rId: rId,\n filterHeaderRange: null\n });\n }\n\n private _needsEscape(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c === 38 || c === 60 || c === 62 || c === 34 || c === 39 ||\n (c >= 0 && c <= 8) || c === 11 || c === 12 || (c >= 14 && c <= 31)) {\n return true;\n }\n }\n return false;\n }\n\n private _escape(str: string): string {\n if (typeof str !== 'string') return str;\n if (!this._needsEscape(str)) return str;\n\n return str.replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g, '');\n }\n\n /**\n * Start streaming a sheet. Call `writeRow` for each row, then `endSheet`.\n */\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: { hidden?: boolean; doAutofilter?: boolean; sampleRows?: unknown[][] } = {}\n ): void {\n const { hidden = false, doAutofilter = true, sampleRows } = options;\n\n this.addSheet(sheetName, hidden);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n const bigBuf = this.stream.buffer!;\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n this.currentColLetters = colLetters;\n\n if (headers) {\n applyHeaderWidths(this.stream.colWidths, headers, columnCount);\n }\n if (sampleRows) {\n updateColWidthsFromRows(this.stream.colWidths, sampleRows);\n }\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString('<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">');\n\n // Dimension - just A1 since we don't know row count in advance\n bigBuf.writeString('<dimension ref=\"A1\"/>');\n\n const isFirstSheet = this.sheetCount === 1;\n if (headers) {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n } else {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n }\n\n bigBuf.writeString('<cols>');\n for (let i = 0; i < columnCount; i++) {\n const width = defaultColWidth(this.stream.colWidths[i]);\n bigBuf.writeString(`<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" bestFit=\"1\" customWidth=\"1\" />`);\n }\n bigBuf.writeString('</cols><sheetData>');\n\n if (headers) {\n this.stream.rowNum++;\n bigBuf.writeString(`<row r=\"${this.stream.rowNum}\">`);\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(bigBuf, headers[c], colLetters[c], this.stream.rowNum, 3);\n }\n bigBuf.writeString('</row>');\n }\n }\n\n /** Write one data row in streaming mode. */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n\n this.stream.rowNum++;\n bigBuf.writeString(`<row r=\"${this.stream.rowNum}\">`);\n\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const xfIdx = fmtString !== null ? this._registerFormat(fmtString) : -1;\n const styleAttr = xfIdx >= 0 ? ` s=\"${xfIdx}\"` : '';\n\n const colRef = this.currentColLetters[c];\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n bigBuf.writeString(`<c r=\"${colRef}${this.stream.rowNum}\"${styleAttr}><v>${val}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (typeof val === 'bigint') {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n } else if (typeof val === 'boolean') {\n bigBuf.writeString(`<c r=\"${colRef}${this.stream.rowNum}\" t=\"b\"${styleAttr}><v>${val ? 1 : 0}</v></c>`);\n } else if (val instanceof Date) {\n const oaDate = this._toOADate(val);\n if (Number.isFinite(oaDate)) {\n const finalStyle = xfIdx >= 0 ? xfIdx : 1;\n bigBuf.writeString(`<c r=\"${colRef}${this.stream.rowNum}\" s=\"${finalStyle}\"><v>${oaDate}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (val !== null && val !== undefined) {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n }\n bigBuf.writeString('</row>');\n }\n\n /** Finish the current streaming sheet and append it to the archive. */\n endSheet(): void {\n const bigBuf = this.stream.assertStreaming();\n bigBuf.writeString('</sheetData>');\n\n if (this.stream.doAutofilter && this.stream.endCol > 0) {\n this._autofilterIsOn = true;\n const filterRef = `A1:${this.currentColLetters[this.stream.endCol - 1]}${this.stream.rowNum}`;\n bigBuf.writeString(`<autoFilter ref=\"${filterRef}\"/>`);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n const formulaSheetName = this._formatSheetNameForFormula(sheet.name);\n sheet.filterHeaderRange = `${formulaSheetName}!$A$1:$${this.currentColLetters[this.stream.endCol - 1]}$${this.stream.rowNum}`;\n }\n\n bigBuf.writeString('</worksheet>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n\n this.stream.end();\n this.currentColLetters = [];\n }\n\n /**\n * Write an entire sheet in one call (batch mode).\n */\n writeSheet(rows: CellValue[][], headers: string[] | null = null, doAutofilter: boolean = true): void {\n const bigBuf = new BigBuffer();\n\n let columnCount = 0;\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n const colWidths = initColWidths(columnCount);\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n\n if (headers) {\n applyHeaderWidths(colWidths, headers, columnCount);\n }\n updateColWidthsFromRows(colWidths, rows);\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString('<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">');\n\n const totalRows = rows.length + (headers ? 1 : 0);\n if (totalRows > 0 && columnCount > 0) {\n bigBuf.writeString(`<dimension ref=\"A1:${colLetters[columnCount - 1]}${totalRows}\"/>`);\n } else {\n bigBuf.writeString('<dimension ref=\"A1\"/>');\n }\n\n const isFirstSheet = this.sheetCount === 1;\n if (headers) {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n } else {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n }\n\n bigBuf.writeString('<cols>');\n for (let i = 0; i < columnCount; i++) {\n const width = defaultColWidth(colWidths[i]);\n bigBuf.writeString(`<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" bestFit=\"1\" customWidth=\"1\" />`);\n }\n bigBuf.writeString('</cols><sheetData>');\n\n let rowNum = 0;\n\n if (headers) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(bigBuf, headers[c], colLetters[c], rowNum, 3);\n }\n bigBuf.writeString('</row>');\n }\n\n for (let r = 0; r < rows.length; r++) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const xfIdx = fmtString !== null ? this._registerFormat(fmtString) : -1;\n const styleAttr = xfIdx >= 0 ? ` s=\"${xfIdx}\"` : '';\n\n const colRef = colLetters[c];\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\"${styleAttr}><v>${val}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (typeof val === 'bigint') {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n } else if (typeof val === 'boolean') {\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\" t=\"b\"${styleAttr}><v>${val ? 1 : 0}</v></c>`);\n } else if (val instanceof Date) {\n const oaDate = this._toOADate(val);\n if (Number.isFinite(oaDate)) {\n const finalStyle = xfIdx >= 0 ? xfIdx : 1;\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\" s=\"${finalStyle}\"><v>${oaDate}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (val !== null && val !== undefined) {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n }\n bigBuf.writeString('</row>');\n }\n\n bigBuf.writeString('</sheetData>');\n\n if (doAutofilter && headers && columnCount > 0) {\n this._autofilterIsOn = true;\n const filterRef = `A1:${colLetters[columnCount - 1]}${totalRows}`;\n bigBuf.writeString(`<autoFilter ref=\"${filterRef}\"/>`);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n const formulaSheetName = this._formatSheetNameForFormula(sheet.name);\n sheet.filterHeaderRange = `${formulaSheetName}!$A$1:$${colLetters[columnCount - 1]}$${totalRows}`;\n }\n\n bigBuf.writeString('</worksheet>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n }\n\n private _writeStringCell(bigBuf: BigBuffer, val: string, colRef: string, rowNum: number, styleOverride?: number): void {\n let index = this.sstMap.get(val);\n if (index === undefined) {\n index = this.sstArray.length;\n this.sstArray.push(val);\n this.sstMap.set(val, index);\n }\n this.sstCntAll++;\n const styleAttr = styleOverride !== undefined ? ` s=\"${styleOverride}\"` : '';\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\" t=\"s\"${styleAttr}><v>${index}</v></c>`);\n }\n\n private _registerFormat(fmtString: string): number {\n if (this._formatXfMap.has(fmtString)) {\n return this._formatXfMap.get(fmtString)!;\n }\n const numfmtId = this._nextNumfmtId++;\n this._formatRegistry.set(fmtString, numfmtId);\n const xfIndex = this._nextXfIndex++;\n this._formatXfMap.set(fmtString, xfIndex);\n return xfIndex;\n }\n\n private _toOADate(date: Date): number {\n // Use UTC time to avoid timezone conversion issues\n return (date.getTime() - this._oaEpoch) / 86400000;\n }\n\n private _getDateWidth(_date: Date): number {\n return 19; // \"YYYY-MM-DD HH:MM:SS\" ≈ 19 chars\n }\n\n /** Finalize the ZIP package and close the output stream. */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this._writeSharedStrings();\n this._writeStyles();\n this._writeWorkbook();\n this._writeContentTypes();\n this._writeRels();\n\n this.output.on('close', () => {\n resolve();\n });\n\n this.archive.on('error', (err: any) => {\n reject(err);\n });\n\n this.archive.finalize();\n } catch (err) {\n reject(err);\n }\n });\n }\n\n private _writeSharedStrings(): void {\n const bigBuf = new BigBuffer();\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString(`<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${this.sstCntAll}\" uniqueCount=\"${this.sstArray.length}\">`);\n\n for (let i = 0; i < this.sstArray.length; i++) {\n const txt = this.sstArray[i];\n const cleanTxt = this._escape(txt);\n if (cleanTxt.length > 0 && (cleanTxt[0] === ' ' || cleanTxt[cleanTxt.length - 1] === ' ' || /[\\t\\n\\r]/.test(cleanTxt))) {\n bigBuf.writeString(`<si><t xml:space=\"preserve\">${cleanTxt}</t></si>`);\n } else {\n bigBuf.writeString(`<si><t>${cleanTxt}</t></si>`);\n }\n }\n\n bigBuf.writeString('</sst>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: 'xl/sharedStrings.xml' });\n }\n\n private _writeStyles(): void {\n let numFmts = '';\n let numFmtCount = 0;\n\n const xfEntries: string[] = [];\n xfEntries.push('<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>');\n xfEntries.push('<xf numFmtId=\"14\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>');\n xfEntries.push('<xf numFmtId=\"22\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>');\n xfEntries.push('<xf numFmtId=\"0\" fontId=\"1\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"/>');\n\n for (const [fmtString, numfmtId] of this._formatRegistry) {\n const escapedFmt = fmtString\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n numFmts += `<numFmt numFmtId=\"${numfmtId}\" formatCode=\"${escapedFmt}\"/>`;\n numFmtCount++;\n }\n\n const sortedFormats = [...this._formatXfMap.entries()].sort((a, b) => a[1] - b[1]);\n for (const [fmtString] of sortedFormats) {\n const numfmtId = this._formatRegistry.get(fmtString)!;\n xfEntries.push(`<xf numFmtId=\"${numfmtId}\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>`);\n }\n\n const totalXf = xfEntries.length;\n const numFmtsSection = numFmtCount > 0 ? `<numFmts count=\"${numFmtCount}\">${numFmts}</numFmts>` : '';\n\n const styles = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsSection}\n<fonts count=\"2\">\n<font><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font>\n<font><b/><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></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><left/><right/><top/><bottom/><diagonal/></border>\n</borders>\n<cellStyleXfs count=\"1\">\n<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\n</cellStyleXfs>\n<cellXfs count=\"${totalXf}\">\n${xfEntries.join('\\n')}\n</cellXfs>\n<cellStyles count=\"1\">\n<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>\n</cellStyles>\n<dxfs count=\"0\"/>\n<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>\n</styleSheet>`;\n this.archive.append(styles, { name: 'xl/styles.xml' });\n }\n\n private _writeWorkbook(): void {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n<fileVersion appName=\"xl\" lastEdited=\"4\" lowestEdited=\"4\" rupBuild=\"4505\"/>\n<workbookPr defaultThemeVersion=\"124226\"/>\n<bookViews><workbookView xWindow=\"240\" yWindow=\"15\" windowWidth=\"16095\" windowHeight=\"9660\"/></bookViews>\n<sheets>`;\n\n for (const sheet of this.sheetList) {\n const state = sheet.hidden ? ' state=\"hidden\"' : '';\n const escapedName = this._escapeSheetNameForXml(sheet.name);\n xml += `<sheet name=\"${escapedName}\" sheetId=\"${sheet.sheetId}\"${state} r:id=\"${sheet.rId}\"/>`;\n }\n\n xml += `</sheets>`;\n\n if (this._autofilterIsOn) {\n xml += '<definedNames>';\n for (const sheet of this.sheetList) {\n if (sheet.filterHeaderRange) {\n const localSheetId = sheet.sheetId - 1;\n const escapedRange = this._escape(sheet.filterHeaderRange);\n xml += `<definedName name=\"_xlnm._FilterDatabase\" localSheetId=\"${localSheetId}\" hidden=\"1\">${escapedRange}</definedName>`;\n }\n }\n xml += '</definedNames>';\n }\n\n xml += '<calcPr calcId=\"124519\" fullCalcOnLoad=\"1\"/>';\n xml += `</workbook>`;\n this.archive.append(xml, { name: 'xl/workbook.xml' });\n }\n\n private _writeContentTypes(): void {\n let xml = `<?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=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>\n<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\n<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\n<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>`;\n\n for (const sheet of this.sheetList) {\n xml += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n }\n\n xml += `</Types>`;\n this.archive.append(xml, { name: '[Content_Types].xml' });\n }\n\n private _writeRels(): void {\n const globalRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\n</Relationships>`;\n this.archive.append(globalRels, { name: '_rels/.rels' });\n\n let wbRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n\n for (const sheet of this.sheetList) {\n wbRels += `<Relationship Id=\"${sheet.rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n\n let nextId = this.sheetList.length + 1;\n wbRels += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n wbRels += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/>`;\n\n wbRels += `</Relationships>`;\n this.archive.append(wbRels, { name: 'xl/_rels/workbook.xml.rels' });\n }\n}\n\nexport default XlsxWriter;\n","import * as fs from 'fs';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport {\n escapeXmlText,\n columnIndexToLetter,\n columnLetterToIndex,\n parseSharedStringsXml,\n trimTrailingEmptyRows,\n} from './xmlUtils';\n\n/**\n * Options for {@link XlsxUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use style 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\ninterface PivotCacheDef {\n path: string;\n xml: string;\n}\n\n/**\n * Update the data of a worksheet inside an existing XLSX file without rebuilding\n * the workbook. Everything outside the target sheet's cell data — pivot tables\n * and their caches, other sheets, styles, themes, defined names — is preserved\n * byte-for-byte. This makes it possible to refresh a data sheet that other\n * Excel features (pivot tables, charts, formulas) are wired to.\n *\n * ```ts\n * const updater = new XlsxUpdater('report.xlsx');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsx'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsxUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefs: PivotCacheDef[] = [];\n private pivotTableDefPaths: string[] = [];\n\n private sharedStringsXml: string | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsOriginalLength: number = 0;\n private sharedStringsCount: number = 0;\n private stringIndexMap: Map<string, number> = new Map();\n\n private readonly _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsx` file.\n */\n constructor(path: string) {\n this.sourcePath = path;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(path)) {\n throw new Error(`XlsxUpdater: file not found: ${path}`);\n }\n\n this.zip = new AdmZip(path);\n\n if (this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsxUpdater: XLSB files are not supported yet. Convert the workbook to XLSX first.'\n );\n }\n if (!this.zip.getEntry('xl/workbook.xml')) {\n throw new Error('XlsxUpdater: not a valid XLSX workbook (xl/workbook.xml missing).');\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsxUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsxUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetXml = entry.getData().toString('utf8');\n this._ensureSharedStringsLoaded();\n\n let colStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateStyle: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectExistingStyles(sheetXml);\n colStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateStyle = this._findDateStyleIndex();\n }\n\n const lastCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0) - 1;\n const totalRows = rows.length + (headers ? 1 : 0);\n\n const newSheetData = this._buildSheetData(rows, headers, colStyles, headerStyles, dateStyle);\n const newXml = this._patchSheetXml(sheetXml, newSheetData, totalRows, lastCol);\n this.zip.updateFile(sheetPath, Buffer.from(newXml, 'utf8'));\n\n if (this.sharedStringsXml !== null) {\n this._commitSharedStrings();\n }\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n this._updatePivotCaches(sheetName, dimRef, rows.length);\n this._addRefreshOnLoadToPivotTables();\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n fs.writeFileSync(target, this.zip.toBuffer());\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n return this.zip.toBuffer();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n while ((match = relRegex.exec(rels)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.xml');\n const wbXml = wbEntry ? wbEntry.getData().toString('utf8') : '';\n const sheetRe = /<sheet\\b[^>]*>/g;\n let match;\n while ((match = sheetRe.exec(wbXml)) !== null) {\n const tag = match[0];\n const nameMatch = /name=\"([^\"]*)\"/.exec(tag);\n const rIdMatch = /r:id=\"([^\"]*)\"/.exec(tag);\n if (!nameMatch || !rIdMatch) continue;\n const name = nameMatch[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n const target = rIdToTarget[rIdMatch[1]] ?? '';\n let fullPath = target;\n if (fullPath.startsWith('/')) {\n fullPath = fullPath.substring(1);\n } else if (!fullPath.startsWith('xl/')) {\n fullPath = 'xl/' + fullPath;\n }\n if (fullPath) {\n this.sheetNameToPath.set(name, fullPath);\n }\n }\n\n for (const entry of this.zip.getEntries()) {\n const name = entry.entryName;\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.xml$/.test(name)) {\n this.pivotCacheDefs.push({ path: name, xml: entry.getData().toString('utf8') });\n } else if (/^xl\\/pivotTables\\/pivotTable\\d*\\.xml$/.test(name)) {\n this.pivotTableDefPaths.push(name);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsXml !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.xml');\n if (!entry) {\n this.sharedStringsXml = null;\n return;\n }\n this.sharedStringsXml = entry.getData().toString('utf8');\n this.sharedStringsValues = parseSharedStringsXml(this.sharedStringsXml);\n\n const countMatch = /<sst\\b[^>]*>/.exec(this.sharedStringsXml);\n const countAttr = countMatch ? /count=\"(\\d+)\"/.exec(countMatch[0]) : null;\n this.sharedStringsCount = countAttr ? parseInt(countAttr[1], 10) : 0;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this.sharedStringsOriginalLength = this.sharedStringsValues.length;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsXml === null || this.sharedStringsValues.length === this.sharedStringsOriginalLength) {\n return;\n }\n\n let xml = this.sharedStringsXml;\n\n const sstStart = xml.indexOf('<sst');\n const sstTagEnd = xml.indexOf('>', sstStart);\n if (sstStart !== -1 && sstTagEnd !== -1) {\n const tag = xml.substring(sstStart, sstTagEnd + 1);\n const newTag = tag\n .replace(/count=\"\\d+\"/, `count=\"${this.sharedStringsCount}\"`)\n .replace(/uniqueCount=\"\\d+\"/, `uniqueCount=\"${this.sharedStringsValues.length}\"`);\n xml = xml.substring(0, sstStart) + newTag + xml.substring(sstTagEnd + 1);\n }\n\n const sstEnd = xml.lastIndexOf('</sst>');\n if (sstEnd === -1) {\n return;\n }\n\n let appended = '';\n for (let i = this.sharedStringsOriginalLength; i < this.sharedStringsValues.length; i++) {\n const txt = this.sharedStringsValues[i];\n const clean = escapeXmlText(txt);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n appended += preserve\n ? `<si><t xml:space=\"preserve\">${clean}</t></si>`\n : `<si><t>${clean}</t></si>`;\n }\n\n xml = xml.substring(0, sstEnd) + appended + xml.substring(sstEnd);\n this.zip.updateFile('xl/sharedStrings.xml', Buffer.from(xml, 'utf8'));\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectExistingStyles(sheetXml: string): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const sdStart = sheetXml.indexOf('<sheetData>');\n if (sdStart === -1) return { dataStyles: new Map(), headerStyles };\n const sdEnd = sheetXml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) return { dataStyles: new Map(), headerStyles };\n\n const region = sheetXml.substring(sdStart, sdEnd);\n const cellRe = /<c\\b[^>]*>/g;\n let m;\n while ((m = cellRe.exec(region)) !== null) {\n const tag = m[0];\n const rMatch = /r=\"([A-Z]+)(\\d+)\"/.exec(tag);\n if (!rMatch) continue;\n const col = columnLetterToIndex(rMatch[1]);\n const row = parseInt(rMatch[2], 10);\n const sMatch = /s=\"(\\d+)\"/.exec(tag);\n if (!sMatch) continue;\n const s = parseInt(sMatch[1], 10);\n if (s <= 0) continue;\n\n if (row === 1) {\n if (!headerStyles.has(col)) headerStyles.set(col, s);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(s, (colCounts.get(s) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [s, count] of colCounts) {\n if (count > bestCount) {\n best = s;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateStyleIndex(): number | null {\n const entry = this.zip.getEntry('xl/styles.xml');\n if (!entry) return null;\n const xml = entry.getData().toString('utf8');\n\n const customDateFormats = new Set<number>();\n const numFmtRe = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let m;\n while ((m = numFmtRe.exec(xml)) !== null) {\n const id = parseInt(m[1], 10);\n const code = m[2].toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n customDateFormats.add(id);\n }\n }\n\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart === -1) return null;\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd === -1) return null;\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n\n const xfRe = /<xf\\b[^>]*>/g;\n let index = 0;\n while ((m = xfRe.exec(cellXfsContent)) !== null) {\n const nfMatch = /numFmtId=\"(\\d+)\"/.exec(m[0]);\n const nfId = nfMatch ? parseInt(nfMatch[1], 10) : 0;\n const isDate = (nfId >= 14 && nfId <= 22) ||\n (nfId >= 45 && nfId <= 47) ||\n customDateFormats.has(nfId);\n if (isDate) return index;\n index++;\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Cell / row serialization\n // ------------------------------------------------------------------\n\n private _buildSheetData(\n rows: CellValue[][],\n headers: string[] | undefined,\n colStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n let out = '';\n let rowNum = 0;\n\n if (headers) {\n rowNum = 1;\n out += '<row r=\"1\">';\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n out += this._stringCell(headers[c], c, rowNum, style);\n }\n out += '</row>';\n }\n\n for (const row of rows) {\n rowNum++;\n out += `<row r=\"${rowNum}\">`;\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n out += this._valueCell(raw, c, rowNum, colStyles, dateStyle);\n }\n out += '</row>';\n }\n return out;\n }\n\n private _valueCell(\n raw: CellValue,\n col: number,\n rowNum: number,\n colStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n const colRef = columnIndexToLetter(col);\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = colStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n return `<c r=\"${colRef}${rowNum}\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'bigint') {\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'boolean') {\n return `<c r=\"${colRef}${rowNum}\" t=\"b\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val ? 1 : 0}</v></c>`;\n }\n if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateStyle !== null ? dateStyle : 0);\n return `<c r=\"${colRef}${rowNum}\"${style > 0 ? ` s=\"${style}\"` : ''}><v>${oaDate}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (val !== null && val !== undefined) {\n return this._stringCell(String(val), col, rowNum, colStyle);\n }\n return '';\n }\n\n private _stringCell(text: string, col: number, rowNum: number, style: number): string {\n const colRef = columnIndexToLetter(col);\n const styleAttr = style > 0 ? ` s=\"${style}\"` : '';\n\n if (this.sharedStringsXml === null) {\n const clean = escapeXmlText(text);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n const tAttr = preserve ? ' xml:space=\"preserve\"' : '';\n return `<c r=\"${colRef}${rowNum}\" t=\"inlineStr\"${styleAttr}><is><t${tAttr}>${clean}</t></is></c>`;\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n }\n this.sharedStringsCount++;\n return `<c r=\"${colRef}${rowNum}\" t=\"s\"${styleAttr}><v>${index}</v></c>`;\n }\n\n // ------------------------------------------------------------------\n // Worksheet XML patching\n // ------------------------------------------------------------------\n\n private _patchSheetXml(sheetXml: string, newSheetData: string, totalRows: number, lastCol: number): string {\n let xml = sheetXml;\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n\n // Update the dimension element, or insert one if missing.\n const dimRe = /<dimension\\b[^>]*>/;\n const dimMatch = dimRe.exec(xml);\n if (dimMatch) {\n xml = xml.substring(0, dimMatch.index) +\n dimMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(dimMatch.index + dimMatch[0].length);\n } else {\n const rootRe = /<worksheet\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n const insertAt = rootMatch.index + rootMatch[0].length;\n xml = xml.substring(0, insertAt) + `<dimension ref=\"${dimRef}\"/>` + xml.substring(insertAt);\n }\n }\n\n // Replace the entire sheetData element content.\n const sdOpen = '<sheetData>';\n const sdStart = xml.indexOf(sdOpen);\n if (sdStart === -1) {\n const selfClosing = /<sheetData\\s*\\/\\s*>/;\n const scMatch = selfClosing.exec(xml);\n if (scMatch) {\n xml = xml.substring(0, scMatch.index) +\n '<sheetData>' + newSheetData + '</sheetData>' +\n xml.substring(scMatch.index + scMatch[0].length);\n return xml;\n }\n throw new Error('XlsxUpdater: <sheetData> element not found in worksheet XML.');\n }\n const sdEnd = xml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) {\n throw new Error('XlsxUpdater: <sheetData> element not closed in worksheet XML.');\n }\n xml = xml.substring(0, sdStart + sdOpen.length) + newSheetData + xml.substring(sdEnd);\n\n // Keep the autoFilter range in sync with the new data bounds.\n const afRe = /<autoFilter\\b[^>]*>/;\n const afMatch = afRe.exec(xml);\n if (afMatch && totalRows > 0 && lastCol >= 0 && afMatch[0].includes('ref=')) {\n xml = xml.substring(0, afMatch.index) +\n afMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(afMatch.index + afMatch[0].length);\n }\n\n return xml;\n }\n\n // ------------------------------------------------------------------\n // Pivot table integration\n // ------------------------------------------------------------------\n\n private _updatePivotCaches(sheetName: string, dimRef: string, recordCount: number): void {\n for (const cache of this.pivotCacheDefs) {\n const wsRe = /<worksheetSource\\b[^>]*>/;\n const wsMatch = wsRe.exec(cache.xml);\n if (!wsMatch) continue;\n const wsTag = wsMatch[0];\n const sheetAttr = /sheet=\"([^\"]*)\"/.exec(wsTag);\n if (!sheetAttr || sheetAttr[1] !== sheetName) continue;\n\n let xml = cache.xml;\n xml = xml.substring(0, wsMatch.index) +\n wsTag.replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(wsMatch.index + wsTag.length);\n\n const rootRe = /<pivotCacheDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n let rootTag = rootMatch[0];\n if (/recordCount=\"\\d+\"/.test(rootTag)) {\n rootTag = rootTag.replace(/recordCount=\"\\d+\"/, `recordCount=\"${recordCount}\"`);\n } else if (!/\\/>$/.test(rootTag)) {\n rootTag = rootTag.replace(/>$/, ` recordCount=\"${recordCount}\">`);\n }\n xml = xml.substring(0, rootMatch.index) + rootTag + xml.substring(rootMatch.index + rootMatch[0].length);\n }\n\n this.zip.updateFile(cache.path, Buffer.from(xml, 'utf8'));\n }\n }\n\n private _addRefreshOnLoadToPivotTables(): void {\n for (const path of this.pivotTableDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n let xml = entry.getData().toString('utf8');\n\n const rootRe = /<pivotTableDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (!rootMatch || rootMatch[0].includes('refreshOnLoad')) continue;\n\n const newTag = rootMatch[0].replace(/(\\/?>)$/, ' refreshOnLoad=\"1\"$1');\n xml = xml.substring(0, rootMatch.index) + newTag + xml.substring(rootMatch.index + rootMatch[0].length);\n this.zip.updateFile(path, Buffer.from(xml, 'utf8'));\n }\n }\n}\n\nexport default XlsxUpdater;\n","import * as fs from 'fs';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport {\n readRecord,\n buildRecord,\n readUtf16,\n parseSharedStringsBin,\n Biff12Record,\n} from './biff12Utils';\nimport { trimTrailingEmptyRows } from './xmlUtils';\n\n/**\n * Options for {@link XlsbUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style (xf) of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use xf 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\n/** Worksheet cell records (BrtCellBlank … BrtFmlaError). */\nconst CELL_RECORDS = new Set<number>([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b]);\n\nconst RK_INT_LOWER = -1 << 29;\nconst RK_INT_UPPER = (1 << 29) - 1;\n\n/**\n * Update the data of a worksheet inside an existing XLSB file without rebuilding\n * the workbook. Everything outside the target sheet's rows — pivot tables and\n * their caches, other sheets, styles, column widths, views — is preserved.\n * This makes it possible to refresh a data sheet that pivot tables are wired to.\n *\n * ```ts\n * const updater = new XlsbUpdater('report.xlsb');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsb'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsbUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefPaths: string[] = [];\n\n private sharedStringsBuf: Buffer | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsTotal: number = 0;\n private sharedStringsUnique: number = 0;\n private sharedStringsEndSst: number = 0;\n private stringIndexMap: Map<string, number> = new Map();\n\n private readonly _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsb` file.\n */\n constructor(path: string) {\n this.sourcePath = path;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(path)) {\n throw new Error(`XlsbUpdater: file not found: ${path}`);\n }\n\n this.zip = new AdmZip(path);\n\n if (!this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsbUpdater: not an XLSB workbook (xl/workbook.bin missing). Convert the file to XLSB first.'\n );\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsbUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsbUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetBuf = entry.getData();\n this._ensureSharedStringsLoaded();\n\n let dataStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateXf: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectStyles(sheetBuf);\n dataStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateXf = this._findDateXf();\n }\n\n const lastCol = Math.max(0, Math.max(\n rows.reduce((m, r) => Math.max(m, r.length), 0),\n headers?.length ?? 0\n ) - 1);\n\n const newRows = this._buildRows(rows, headers, dataStyles, headerStyles, dateXf);\n const { rowsStart, rowsEnd, autoFilterRanges } = this._findRowsRegion(sheetBuf);\n\n const newSheet = Buffer.alloc(sheetBuf.length - (rowsEnd - rowsStart) + newRows.length);\n sheetBuf.copy(newSheet, 0, 0, rowsStart);\n newRows.copy(newSheet, rowsStart);\n sheetBuf.copy(newSheet, rowsStart + newRows.length, rowsEnd);\n\n const lastRowIdx = rows.length + (headers ? 1 : 0) - 1;\n const delta = newRows.length - (rowsEnd - rowsStart);\n for (const af of autoFilterRanges) {\n const newAf = af + delta;\n newSheet.writeInt32LE(lastCol, newAf + 12);\n newSheet.writeInt32LE(lastRowIdx, newAf + 4);\n }\n\n // Keep the sheet dimension record (0x98) in sync with the new data. Excel uses\n // its rwLast/colLast fields to read the full row range; stale values make the\n // last written row invisible (and drop it from pivot refreshes).\n this._patchDimension(newSheet, lastRowIdx, lastCol);\n\n this.zip.updateFile(sheetPath, newSheet);\n\n if (this.sharedStringsBuf !== null && this._appendCount > 0) {\n this._commitSharedStrings();\n }\n\n const rwLast = Math.max(0, rows.length + (headers ? 1 : 0) - 1);\n const colLast = lastCol;\n this._patchPivotCaches(sheetName, rwLast, colLast);\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n fs.writeFileSync(target, this.zip.toBuffer());\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n return this.zip.toBuffer();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.bin.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n while ((match = relRegex.exec(rels)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.bin');\n if (wbEntry) {\n const wbBuf = wbEntry.getData();\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(wbBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id !== 0x009c || rec.len < 8) continue;\n\n // BrtBundleSh: hidden(4) + sheetId(4) + rId(string) + name(string)\n let o = rec.dataStart + 8;\n const rIdLen = wbBuf.readUInt32LE(o);\n o += 4;\n const rId = readUtf16(wbBuf, o, rIdLen);\n o += rIdLen * 2;\n const nameLen = wbBuf.readUInt32LE(o);\n o += 4;\n const name = readUtf16(wbBuf, o, nameLen);\n\n let target = rIdToTarget[rId] ?? '';\n if (target.startsWith('/')) target = target.substring(1);\n else if (!target.startsWith('xl/')) target = 'xl/' + target;\n if (target) {\n this.sheetNameToPath.set(name, target);\n }\n }\n }\n\n for (const e of this.zip.getEntries()) {\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.bin$/.test(e.entryName)) {\n this.pivotCacheDefPaths.push(e.entryName);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _appendCount: number = 0;\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsBuf !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.bin');\n if (!entry) {\n this.sharedStringsBuf = null;\n return;\n }\n this.sharedStringsBuf = entry.getData();\n const parsed = parseSharedStringsBin(this.sharedStringsBuf);\n this.sharedStringsValues = parsed.values;\n this.sharedStringsTotal = parsed.total;\n this.sharedStringsUnique = parsed.unique;\n this.sharedStringsEndSst = parsed.endSstOffset;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this._appendCount = 0;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsBuf === null || this._appendCount === 0) return;\n\n const originalValuesLength = this.sharedStringsValues.length - this._appendCount;\n\n let newItems = Buffer.alloc(0);\n for (let i = originalValuesLength; i < this.sharedStringsValues.length; i++) {\n const text = this.sharedStringsValues[i];\n const payload = Buffer.alloc(1 + 4 + text.length * 2);\n payload[0] = 0x00;\n payload.writeUInt32LE(text.length, 1);\n payload.write(text, 5, text.length * 2, 'utf16le');\n newItems = Buffer.concat([newItems, buildRecord(0x0013, payload)]);\n }\n\n const out = Buffer.alloc(this.sharedStringsBuf.length + newItems.length);\n this.sharedStringsBuf.copy(out, 0, 0, this.sharedStringsEndSst);\n newItems.copy(out, this.sharedStringsEndSst);\n this.sharedStringsBuf.copy(out, this.sharedStringsEndSst + newItems.length, this.sharedStringsEndSst);\n\n // Patch cstTotal / cstUnique inside BrtBeginSst.\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(out, pos, rec)) {\n if (rec.id === 0x009f) {\n out.writeUInt32LE(this.sharedStringsTotal, rec.dataStart);\n out.writeUInt32LE(this.sharedStringsUnique, rec.dataStart + 4);\n break;\n }\n pos = rec.dataEnd;\n }\n\n this.zip.updateFile('xl/sharedStrings.bin', out);\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectStyles(sheetBuf: Buffer): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let row = -1;\n while (readRecord(sheetBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x00) {\n row = sheetBuf.readInt32LE(rec.dataStart);\n continue;\n }\n if (!CELL_RECORDS.has(rec.id) || rec.len < 8) continue;\n const col = sheetBuf.readUInt32LE(rec.dataStart);\n const xf = sheetBuf.readUInt32LE(rec.dataStart + 4) & 0xffffff;\n if (xf <= 0) continue;\n\n if (row === 0) {\n if (!headerStyles.has(col)) headerStyles.set(col, xf);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(xf, (colCounts.get(xf) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [xf, count] of colCounts) {\n if (count > bestCount) {\n best = xf;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateXf(): number | null {\n const entry = this.zip.getEntry('xl/styles.bin');\n if (!entry) return null;\n const stylesBuf = entry.getData();\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let inCellXfs = false;\n let xfIndex = 0;\n while (readRecord(stylesBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x0269) {\n inCellXfs = true;\n xfIndex = 0;\n continue;\n }\n if (rec.id === 0x026a) {\n inCellXfs = false;\n continue;\n }\n if (inCellXfs && rec.id === 0x002f && rec.len >= 4) {\n const numFmtId = stylesBuf.readUInt16LE(rec.dataStart + 2);\n const isDate =\n (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47);\n if (isDate) return xfIndex;\n xfIndex++;\n }\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Row / cell serialization\n // ------------------------------------------------------------------\n\n private _buildRows(\n rows: CellValue[][],\n headers: string[] | undefined,\n dataStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const chunks: Buffer[] = [];\n const maxCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0, 0);\n const colLast = Math.max(0, maxCol - 1);\n\n const pushRow = (rowNum: number, cellBytes: Buffer[]): void => {\n // BrtRowHeader (0x00, len 25): rw(4) + zero(4) + flags(9) + colFirst(4) + colLast(4)\n const header = Buffer.alloc(27);\n header[0] = 0x00;\n header[1] = 25;\n header.writeInt32LE(rowNum, 2);\n header[10] = 0x2c;\n header[11] = 0x01;\n header[15] = 0x01;\n header.writeInt32LE(0, 19);\n header.writeInt32LE(colLast, 23);\n chunks.push(header);\n\n for (const cell of cellBytes) {\n chunks.push(cell);\n }\n };\n\n if (headers) {\n const cells: Buffer[] = [];\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n cells.push(this._stringCellBytes(c, style, headers[c]));\n }\n pushRow(0, cells);\n }\n\n let rowNum = headers ? 1 : 0;\n for (const row of rows) {\n const cells: Buffer[] = [];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n cells.push(this._valueCellBytes(raw, c, dataStyles, dateXf));\n }\n pushRow(rowNum, cells);\n rowNum++;\n }\n\n return Buffer.concat(chunks);\n }\n\n private _valueCellBytes(\n raw: CellValue,\n col: number,\n dataStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = dataStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val) && Number.isInteger(val) && val >= RK_INT_LOWER && val <= RK_INT_UPPER) {\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeInt32LE((val << 2) | 2, 8);\n return buildRecord(0x0002, payload);\n }\n if (Number.isFinite(val)) {\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeDoubleLE(val, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'bigint') {\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'boolean') {\n const payload = Buffer.alloc(9);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload[8] = val ? 1 : 0;\n return buildRecord(0x0004, payload);\n }\n if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateXf !== null ? dateXf : 0);\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeDoubleLE(oaDate, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (val !== null && val !== undefined) {\n return this._stringCellBytes(col, colStyle, String(val));\n }\n return this._stringCellBytes(col, colStyle, '');\n }\n\n private _stringCellBytes(col: number, style: number, text: string): Buffer {\n if (this.sharedStringsBuf === null) {\n // Inline string (BrtCellSt): col(4) + xf(4) + cch(4) + utf16.\n const payload = Buffer.alloc(12 + text.length * 2);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(text.length, 8);\n payload.write(text, 12, text.length * 2, 'utf16le');\n return buildRecord(0x0006, payload);\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n this.sharedStringsUnique++;\n this._appendCount++;\n }\n this.sharedStringsTotal++;\n\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(index, 8);\n return buildRecord(0x0007, payload);\n }\n\n // ------------------------------------------------------------------\n // Rows region detection\n // ------------------------------------------------------------------\n\n private _findRowsRegion(\n sheetBuf: Buffer\n ): { rowsStart: number; rowsEnd: number; autoFilterRanges: number[] } {\n const autoFilterRanges: number[] = [];\n let rowsStart = -1;\n let lastCellEnd = -1;\n let lastW25 = -1;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x00) {\n if (rowsStart === -1) rowsStart = rec.headerStart;\n } else if (rec.id >= 0x01 && rec.id <= 0x0b) {\n lastCellEnd = rec.dataEnd;\n } else if (rec.id === 0x25 && rec.len === 6) {\n lastW25 = rec.headerStart;\n } else if (rec.id === 0x00a1 && rec.len >= 16) {\n autoFilterRanges.push(rec.dataStart);\n }\n pos = rec.dataEnd;\n }\n\n if (rowsStart === -1) {\n // Empty sheet: insert before the trailing wrapper (last 0x25) or at the end.\n const insertAt = lastW25 >= 0 ? lastW25 : sheetBuf.length;\n return { rowsStart: insertAt, rowsEnd: insertAt, autoFilterRanges };\n }\n\n // Replace only the row records. The row-block terminator records that Excel\n // writes after the last row (0x92/0x217/0x1dd/0x1dc) must be preserved,\n // otherwise Excel drops the last written row.\n const rowsEnd = lastCellEnd >= 0 ? lastCellEnd : (lastW25 >= 0 ? lastW25 : sheetBuf.length);\n\n return { rowsStart, rowsEnd, autoFilterRanges };\n }\n\n /**\n * Keep the sheet dimension record (0x98) in sync with the new data.\n * Excel uses its rwLast (payload offset 24) and colLast (payload offset 32)\n * fields to read the full row range; stale values make the last written row\n * invisible to Excel (and drop it from pivot refreshes).\n */\n private _patchDimension(sheetBuf: Buffer, lastRowIdx: number, lastCol: number): void {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x0098 && rec.len >= 36) {\n sheetBuf.writeInt32LE(lastRowIdx, rec.dataStart + 24);\n sheetBuf.writeInt32LE(lastCol, rec.dataStart + 32);\n return;\n }\n pos = rec.dataEnd;\n }\n }\n\n // ------------------------------------------------------------------\n // Pivot cache integration\n // ------------------------------------------------------------------\n\n private _patchPivotCaches(sheetName: string, rwLast: number, colLast: number): void {\n for (const path of this.pivotCacheDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n const buf = Buffer.from(entry.getData());\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let patched = false;\n let refreshXfPatched = false;\n\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n\n if (rec.id === 0x00b3 && rec.len >= 4 && !refreshXfPatched) {\n // BrtBeginPivotCacheDefinition flags: bit 0x04 of payload offset 3 = refreshOnLoad.\n if (rec.dataStart + 4 <= buf.length) {\n const v = buf[rec.dataStart + 3];\n if ((v & 0x04) === 0) {\n buf[rec.dataStart + 3] = v | 0x04;\n patched = true;\n }\n }\n refreshXfPatched = true;\n }\n\n if (rec.id === 0x00bb && rec.len >= 23) {\n // BrtPivotCacheSource: [3] + cch(4) + name(utf16) + rwFirst(4) rwLast(4) colFirst(4) colLast(4)\n const cch = buf.readUInt32LE(rec.dataStart + 3);\n const nameStart = rec.dataStart + 7;\n const refStart = nameStart + cch * 2;\n const name = readUtf16(buf, nameStart, cch);\n if (name === sheetName && refStart + 16 <= buf.length) {\n buf.writeInt32LE(rwLast, refStart + 4);\n buf.writeInt32LE(colLast, refStart + 12);\n patched = true;\n }\n }\n }\n\n if (patched) {\n this.zip.updateFile(path, buf);\n }\n }\n }\n}\n\nexport default XlsbUpdater;\n","/**\n * Low-level BIFF12 (XLSB) record helpers shared by readers and the XlsbUpdater.\n *\n * A BIFF12 record is: VLQ(id) + VLQ(length) + payload[length].\n */\n\n/** Decode a 7-bit VLQ integer at `pos`. Returns the value and the next byte offset. */\nexport function readVlq(buf: Buffer, pos: number): { value: number; nextPos: number } {\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n byte = buf[pos++];\n value |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n return { value, nextPos: pos };\n}\n\n/** Number of bytes needed to VLQ-encode `value`. */\nexport function vlqLength(value: number): number {\n let n = 1;\n while (value >= 0x80) {\n n++;\n value >>>= 7;\n }\n return n;\n}\n\n/** Encode `value` as a 7-bit VLQ byte array. */\nexport function vlqBytes(value: number): number[] {\n const out: number[] = [];\n while (value >= 0x80) {\n out.push((value & 0x7f) | 0x80);\n value >>>= 7;\n }\n out.push(value & 0x7f);\n return out;\n}\n\n/** A single BIFF12 record view (byte offsets into the source buffer). */\nexport interface Biff12Record {\n /** Byte offset of the record header (id + length). */\n headerStart: number;\n /** Byte offset just past the header — the payload starts here. */\n dataStart: number;\n /** Byte offset just past the payload. */\n dataEnd: number;\n id: number;\n len: number;\n}\n\n/**\n * Fill `rec` with the record starting at `pos`. Returns false when the buffer\n * is exhausted or the record would run past the end.\n */\nexport function readRecord(buf: Buffer, pos: number, rec: Biff12Record): boolean {\n const idRes = readVlq(buf, pos);\n if (idRes.nextPos > buf.length) return false;\n const lenRes = readVlq(buf, idRes.nextPos);\n if (lenRes.nextPos + lenRes.value > buf.length) return false;\n\n rec.headerStart = pos;\n rec.dataStart = lenRes.nextPos;\n rec.dataEnd = lenRes.nextPos + lenRes.value;\n rec.id = idRes.value;\n rec.len = lenRes.value;\n return true;\n}\n\n/** Build a BIFF12 record from an id and payload buffer. */\nexport function buildRecord(id: number, payload: Buffer): Buffer {\n const idBytes = vlqBytes(id);\n const lenBytes = vlqBytes(payload.length);\n const header = Buffer.alloc(idBytes.length + lenBytes.length);\n idBytes.forEach((b, i) => (header[i] = b));\n lenBytes.forEach((b, i) => (header[idBytes.length + i] = b));\n return Buffer.concat([header, payload]);\n}\n\n/** Read a UTF-16LE string of `charCount` characters starting at `start`. */\nexport function readUtf16(buf: Buffer, start: number, charCount: number): string {\n const end = start + charCount * 2;\n if (end > buf.length) return '';\n return buf.toString('utf16le', start, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.bin.\n * Returns the string values in order, the SST counters, and the byte offset of\n * the BrtEndSst record where new items must be inserted.\n */\nexport function parseSharedStringsBin(buf: Buffer): {\n values: string[];\n total: number;\n unique: number;\n endSstOffset: number;\n} {\n const values: string[] = [];\n let total = 0;\n let unique = 0;\n let endSstOffset = buf.length;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x009f) {\n total = buf.readUInt32LE(rec.dataStart);\n unique = buf.readUInt32LE(rec.dataStart + 4);\n } else if (rec.id === 0x0013) {\n const cch = buf.readUInt32LE(rec.dataStart + 1);\n values.push(readUtf16(buf, rec.dataStart + 5, cch));\n } else if (rec.id === 0x00a0) {\n endSstOffset = rec.headerStart;\n }\n }\n return { values, total, unique, endSstOffset };\n}\n"],"mappings":"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AA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MACN;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAC9C,CAAC;AAED,SAAK,oBAAoB,OAAO,KAAK;AAAA,MACjC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpC;AAAA,MAAM;AAAA,MAAM;AAAA,IAChB,CAAC;AAED,SAAK,qBAAqB,OAAO,KAAK,CAAC,KAAM,GAAM,CAAI,CAAC;AAExD,SAAK,kBAAkB,OAAO,KAAK;AAAA,MAC/B;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1I;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAC9I,CAAC;AAED,SAAK,aAAa,OAAO,KAAK;AAAA,MAC1B;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MACZ;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpC;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MACZ;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAChH,CAAC;AAED,SAAK,kBAAkB,OAAO,KAAK;AAAA,MAC/B;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC5J;AAAA,MAAM;AAAA,IACV,CAAC;AAED,SAAK,wBAAwB,MAAM;AACnC,SAAK,yBAAyB,KAAK,MAAM;AAEzC,SAAK,wBAAwB,OAAO,KAAK,CAAC,KAAM,GAAM,EAAI,CAAC;AAC3D,SAAK,sBAAsB,OAAO,KAAK,CAAC,KAAM,GAAM,CAAI,CAAC;AAEzD,SAAK,sBAAsB,OAAO,KAAK;AAAA,MACnC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAC9C,CAAC;AAED,SAAK,4BAA4B,OAAO,KAAK,CAAC,KAAM,GAAM,GAAM,KAAM,GAAM,GAAM,KAAM,CAAI,CAAC;AAC7F,SAAK,4BAA4B,OAAO,KAAK;AAAA,MACzC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1F;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1F;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1F;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IACtB,CAAC;AACD,SAAK,4BAA4B,OAAO,KAAK,CAAC,GAAM,GAAM,GAAM,GAAM,KAAM,KAAM,KAAM,GAAI,CAAC;AAAA,EACjG;AAAA;AAAA,EAGQ,mBAAmB,MAAsB;AAC7C,WAAO,kBAAkB,MAAM,KAAK,UAAU;AAAA,EAClD;AAAA,EAEQ,gBAAgB,WAA2B;AAC/C,QAAI,KAAK,cAAc,IAAI,SAAS,GAAG;AACnC,aAAO,KAAK,cAAc,IAAI,SAAS,EAAG;AAAA,IAC9C;AACA,UAAM,WAAW,KAAK;AACtB,UAAM,UAAU,KAAK;AACrB,SAAK,cAAc,IAAI,WAAW,EAAE,UAAU,QAAQ,CAAC;AACvD,WAAO;AAAA,EACX;AAAA,EAEA,OAAe,gBAAgB,MAAc,MAAsB;AAC/D,UAAM,SAAS,YAAW,WAAW,IAAI;AACzC,WAAO,KAAK,GAAG,YAAW,WAAW,KAAK,MAAM,CAAC;AACjD,WAAO,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,OAAe,WAAW,OAAyB;AAC/C,UAAM,SAAmB,CAAC;AAC1B,WAAO,SAAS,KAAM;AAClB,aAAO,KAAM,QAAQ,MAAQ,GAAI;AACjC,iBAAW;AAAA,IACf;AACA,WAAO,KAAK,QAAQ,GAAI;AACxB,WAAO;AAAA,EACX;AAAA,EAEA,OAAe,kBAAkB,MAAc,WAA2B;AACtE,UAAM,MAAM,UAAU;AACtB,UAAM,YAAY,IAAI,IAAI,MAAM;AAChC,UAAM,OAAO,OAAO,MAAM,IAAI,SAAS;AACvC,SAAK,CAAC,IAAI;AACV,SAAK,CAAC,IAAI;AACV,SAAK,cAAc,MAAM,CAAC;AAC1B,SAAK,cAAc,KAAK,CAAC;AACzB,SAAK,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS;AAC3C,WAAO;AAAA,EACX;AAAA,EAEA,OAAe,eAAe,QAAgB,MAAc,OAAe,aAAqB,GAAW;AACvG,UAAM,OAAO,OAAO,MAAM,EAAE;AAC5B,SAAK,CAAC,IAAI;AACV,SAAK,CAAC,IAAI;AACV,SAAK,cAAc,QAAQ,CAAC;AAC5B,SAAK,cAAc,MAAM,CAAC;AAC1B,SAAK,CAAC,IAAI;AACV,SAAK,EAAE,IAAI;AACX,SAAK,EAAE,IAAI;AACX,SAAK,cAAc,OAAO,EAAE;AAC5B,WAAO;AAAA,EACX;AAAA,EAEQ,kBAA0B;AAC9B,QAAI,KAAK,cAAc,SAAS,GAAG;AAC/B,aAAO,KAAK;AAAA,IAChB;AACA,UAAM,OAAO,KAAK;AAGlB,QAAI,aAAa;AACjB,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACtC,UAAI,KAAK,CAAC,MAAM,OAAQ,KAAK,IAAI,CAAC,MAAM,KAAQ,KAAK,IAAI,CAAC,MAAM,GAAM;AAClE,qBAAa;AACb;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,aAAa;AACjB,aAAS,IAAI,aAAa,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACnD,UAAI,KAAK,CAAC,MAAM,OAAQ,KAAK,IAAI,CAAC,MAAM,GAAM;AAC1C,qBAAa;AACb;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,WAAW;AACf,aAAS,IAAI,YAAY,IAAI,KAAK,SAAS,GAAG,KAAK;AAC/C,UAAI,KAAK,CAAC,MAAM,OAAQ,KAAK,IAAI,CAAC,MAAM,KAAQ,KAAK,IAAI,CAAC,MAAM,GAAM;AAClE,mBAAW;AACX;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,eAAe;AACnB,aAAS,IAAI,aAAa,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACnD,UAAI,KAAK,CAAC,MAAM,OAAQ,KAAK,IAAI,CAAC,MAAM,GAAM;AAC1C,uBAAe;AACf;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,WAAW,IAAI,KAAK,cAAc;AACxC,UAAM,UAAU,IAAI,KAAK,cAAc;AAEvC,UAAM,QAAkB,CAAC;AAGzB,UAAM,KAAK,KAAK,SAAS,GAAG,CAAC,CAAC;AAG9B,UAAM,YAAY,OAAO,MAAM,CAAC;AAChC,cAAU,cAAc,UAAU,CAAC;AACnC,UAAM,KAAK,YAAW,gBAAgB,KAAQ,SAAS,CAAC;AAGxD,UAAM,KAAK,YAAW,kBAAkB,KAAK,wBAAwB,CAAC;AACtE,UAAM,KAAK,YAAW,kBAAkB,KAAK,gBAAgB,CAAC;AAC9D,eAAW,CAAC,WAAW,EAAE,KAAK,KAAK,eAAe;AAC9C,YAAM,KAAK,YAAW,kBAAkB,GAAG,UAAU,SAAS,CAAC;AAAA,IACnE;AAGA,UAAM,KAAK,YAAW,gBAAgB,KAAQ,OAAO,MAAM,CAAC,CAAC,CAAC;AAG9D,UAAM,KAAK,KAAK,SAAS,cAAc,UAAU,CAAC;AAGlD,UAAM,WAAW,OAAO,MAAM,CAAC;AAC/B,aAAS,cAAc,SAAS,CAAC;AACjC,UAAM,KAAK,YAAW,gBAAgB,KAAQ,QAAQ,CAAC;AAGvD,UAAM,KAAK,YAAW,eAAe,GAAG,GAAG,CAAM,CAAC;AAClD,UAAM,KAAK,YAAW,eAAe,GAAG,KAAK,CAAM,CAAC;AACpD,UAAM,KAAK,YAAW,eAAe,GAAG,KAAK,CAAM,CAAC;AACpD,UAAM,KAAK,YAAW,eAAe,GAAG,GAAG,GAAQ,CAAC,CAAC;AAGrD,UAAM,WAAW,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;AAC7F,eAAW,CAAC,EAAE,EAAE,KAAK,UAAU;AAC3B,YAAM,KAAK,YAAW,eAAe,GAAG,GAAG,UAAU,CAAM,CAAC;AAAA,IAChE;AAGA,UAAM,KAAK,YAAW,gBAAgB,KAAQ,OAAO,MAAM,CAAC,CAAC,CAAC;AAG9D,UAAM,KAAK,KAAK,SAAS,WAAW,CAAC,CAAC;AAEtC,WAAO,OAAO,OAAO,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,WAAmB,SAAkB,OAAa;AACvD,UAAM,gBAAgB,kBAAkB,WAAW,KAAK,UAAU;AAClE,SAAK;AACL,SAAK,UAAU,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,eAAe,sBAAsB,KAAK,UAAU;AAAA,MACpD;AAAA,MACA,eAAe,QAAQ,KAAK,UAAU;AAAA,MACtC,SAAS,KAAK;AAAA,MACd,mBAAmB;AAAA,IACvB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WACI,WACA,aACA,SACA,UAAkF,CAAC,GAC/E;AACJ,UAAM,EAAE,SAAS,OAAO,eAAe,MAAM,WAAW,IAAI;AAG5D,SAAK,SAAS,WAAW,MAAM;AAE/B,SAAK,OAAO,MAAM,aAAa,gBAAgB,YAAY,QAAW,IAAI,UAAU,CAAC;AACrF,UAAM,SAAS,KAAK,OAAO;AAE3B,QAAI,SAAS;AACT,wBAAkB,KAAK,OAAO,WAAW,SAAS,WAAW;AAAA,IACjE;AACA,QAAI,YAAY;AACZ,8BAAwB,KAAK,OAAO,WAAW,UAAU;AAAA,IAC7D;AAGA,UAAM,cAAc,OAAO,KAAK,KAAK,YAAY;AACjD,gBAAY,aAAa,KAAK,OAAO,UAAU,EAAE;AACjD,gBAAY,aAAa,KAAK,OAAO,QAAQ,EAAE;AAE/C,QAAI,KAAK,eAAe,GAAG;AACvB,kBAAY,EAAE,IAAI;AAAA,IACtB;AAEA,WAAO,MAAM,YAAY,SAAS,GAAG,EAAE,CAAC;AAGxC,QAAI,SAAS;AACT,aAAO,MAAM,KAAK,mBAAmB;AAAA,IACzC;AAEA,WAAO,MAAM,YAAY,SAAS,IAAI,GAAG,CAAC;AAG1C,WAAO,UAAU,GAAG;AACpB,WAAO,UAAU,CAAC;AAElB,aAAS,IAAI,KAAK,OAAO,UAAU,IAAI,KAAK,OAAO,QAAQ,KAAK;AAC5D,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,EAAE;AACnB,aAAO,UAAU,EAAE;AAEnB,aAAO,aAAa,CAAC;AACrB,aAAO,aAAa,CAAC;AAErB,YAAM,QAAQ,gBAAgB,KAAK,OAAO,UAAU,CAAC,GAAG,IAAI;AAC5D,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC;AAClD,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAElB,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAElB,aAAO,UAAU,CAAC;AAAA,IACtB;AAEA,WAAO,UAAU,CAAC;AAClB,WAAO,UAAU,GAAG;AACpB,WAAO,UAAU,CAAC;AAClB,WAAO,UAAU,CAAC;AAElB,WAAO,MAAM,YAAY,SAAS,KAAK,GAAG,CAAC;AAC3C,WAAO,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAGjC,QAAI,SAAS;AACT,WAAK,gBAAgB,QAAQ,KAAK,OAAO,QAAQ,KAAK,OAAO,UAAU,KAAK,OAAO,MAAM;AACzF,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,aAAK,YAAY,QAAQ,QAAQ,CAAC,GAAG,GAAG,IAAI;AAAA,MAChD;AACA,WAAK,OAAO;AAAA,IAChB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,KAAwB;AAC7B,UAAM,SAAS,KAAK,OAAO,gBAAgB;AAE3C,QAAI,IAAI,WAAW,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU;AAC1D,YAAM,IAAI;AAAA,QACN,iCAAiC,KAAK,OAAO,SAAS,KAAK,OAAO,QAAQ,iBAAiB,IAAI,MAAM;AAAA,MACzG;AAAA,IACJ;AAGA,SAAK,gBAAgB,QAAQ,KAAK,OAAO,QAAQ,KAAK,OAAO,UAAU,KAAK,OAAO,MAAM;AAGzF,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,QAAQ,QAAQ,QAAQ,OAAW;AAEvC,YAAM,YAAY,UAAU,GAAG;AAC/B,YAAM,MAAM,cAAc,OAAO,WAAW,GAAG,IAAI;AACnD,YAAM,WAAW,cAAc,OAAO,KAAK,gBAAgB,SAAS,IAAI;AAExE,UAAI,OAAO,QAAQ,UAAU;AACzB,YAAI,OAAO,UAAU,GAAG,GAAG;AACvB,cAAI,OAAO,KAAK,yBAAyB,OAAO,KAAK,uBAAuB;AACxE,iBAAK,qBAAqB,QAAQ,KAAK,GAAG,QAAQ;AAAA,UACtD,OAAO;AACH,iBAAK,YAAY,QAAQ,KAAK,GAAG,QAAQ;AAAA,UAC7C;AAAA,QACJ,OAAO;AACH,eAAK,YAAY,QAAQ,KAAK,GAAG,QAAQ;AAAA,QAC7C;AAAA,MACJ,WAAW,OAAO,QAAQ,UAAU;AAChC,aAAK,YAAY,QAAQ,IAAI,SAAS,GAAG,CAAC;AAAA,MAC9C,WAAW,OAAO,QAAQ,WAAW;AACjC,aAAK,UAAU,QAAQ,KAAK,CAAC;AAAA,MACjC,WAAW,eAAe,MAAM;AAC5B,cAAM,UAAU,IAAI,QAAQ,IAAI,KAAK,YAAY;AACjD,aAAK,YAAY,QAAQ,QAAQ,GAAG,cAAc,OAAO,WAAW,CAAC;AAAA,MACzE,WAAW,QAAQ,QAAQ,QAAQ,QAAW;AAC1C,aAAK,YAAY,QAAQ,IAAI,SAAS,GAAG,GAAG,OAAO,cAAc,OAAO,WAAW,MAAS;AAAA,MAChG;AAAA,IACJ;AAEA,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAiB;AACb,UAAM,SAAS,KAAK,OAAO,gBAAgB;AAC3C,UAAM,cAAc,OAAO,KAAK,KAAK,YAAY;AAGjD,WAAO,MAAM,YAAY,SAAS,KAAK,GAAG,CAAC;AAG3C,QAAI,KAAK,OAAO,cAAc;AAC1B,WAAK,kBAAkB;AACvB,YAAM,SAAS,KAAK,OAAO;AAE3B,aAAO,MAAM,KAAK,qBAAqB;AAEvC,YAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,aAAO,aAAa,GAAG,CAAC;AACxB,aAAO,aAAa,SAAS,GAAG,CAAC;AACjC,aAAO,MAAM,MAAM;AAEnB,YAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,aAAO,aAAa,KAAK,OAAO,UAAU,CAAC;AAC3C,aAAO,aAAa,KAAK,OAAO,SAAS,GAAG,CAAC;AAC7C,aAAO,MAAM,MAAM;AAEnB,aAAO,MAAM,KAAK,mBAAmB;AAGrC,YAAM,QAAQ,KAAK,UAAU,KAAK,aAAa,CAAC;AAChD,YAAM,aAAa;AAAA,QACf,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,aAAa,KAAK,OAAO;AAAA,QACzB,WAAW,KAAK,OAAO,SAAS;AAAA,MACpC;AAAA,IACJ;AAEA,WAAO,MAAM,YAAY,SAAS,GAAG,CAAC;AAGtC,SAAK,QAAQ,OAAO,SAAS,KAAK,OAAO,UAAU,CAAC,GAAG;AAAA,MACnD,MAAM,KAAK,UAAU,KAAK,aAAa,CAAC,EAAE;AAAA,IAC9C,CAAC;AAGD,SAAK,OAAO,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,MAAqB,UAA2B,MAAM,eAAwB,MAAY;AACjG,UAAM,SAAS,IAAI,UAAU;AAC7B,QAAI,cAAc;AAElB,QAAI,KAAK,SAAS,GAAG;AACjB,oBAAc,KAAK,CAAC,EAAE;AAAA,IAC1B,WAAW,SAAS;AAChB,oBAAc,QAAQ;AAAA,IAC1B;AAEA,UAAM,YAAY,cAAc,WAAW;AAE3C,QAAI,SAAS;AACT,wBAAkB,WAAW,SAAS,WAAW;AAAA,IACrD;AACA,4BAAwB,WAAW,IAAI;AAEvC,UAAM,cAAc,OAAO,KAAK,KAAK,YAAY;AACjD,UAAM,WAAW;AACjB,UAAM,SAAS;AAEf,gBAAY,aAAa,UAAU,EAAE;AACrC,gBAAY,aAAa,QAAQ,EAAE;AAEnC,QAAI,KAAK,eAAe,GAAG;AACvB,kBAAY,EAAE,IAAI;AAAA,IACtB;AAEA,WAAO,MAAM,YAAY,SAAS,GAAG,EAAE,CAAC;AAExC,QAAI,SAAS;AACT,aAAO,MAAM,KAAK,mBAAmB;AAAA,IACzC;AAEA,WAAO,MAAM,YAAY,SAAS,IAAI,GAAG,CAAC;AAE1C,WAAO,UAAU,GAAG;AACpB,WAAO,UAAU,CAAC;AAElB,aAAS,IAAI,UAAU,IAAI,QAAQ,KAAK;AACpC,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,EAAE;AACnB,aAAO,UAAU,EAAE;AAEnB,aAAO,aAAa,CAAC;AACrB,aAAO,aAAa,CAAC;AAErB,YAAM,QAAQ,gBAAgB,UAAU,CAAC,GAAG,IAAI;AAChD,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC;AAClD,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAElB,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAClB,aAAO,UAAU,CAAC;AAElB,aAAO,UAAU,CAAC;AAAA,IACtB;AAEA,WAAO,UAAU,CAAC;AAClB,WAAO,UAAU,GAAG;AACpB,WAAO,UAAU,CAAC;AAClB,WAAO,UAAU,CAAC;AAElB,WAAO,MAAM,YAAY,SAAS,KAAK,GAAG,CAAC;AAC3C,WAAO,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjC,QAAI,SAAS;AAEb,QAAI,SAAS;AACT,WAAK,gBAAgB,QAAQ,QAAQ,UAAU,MAAM;AACrD,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,aAAK,YAAY,QAAQ,QAAQ,CAAC,GAAG,GAAG,IAAI;AAAA,MAChD;AACA;AAAA,IACJ;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,WAAK,gBAAgB,QAAQ,QAAQ,UAAU,MAAM;AACrD,YAAM,MAAM,KAAK,CAAC;AAClB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,cAAM,MAAM,IAAI,CAAC;AACjB,YAAI,QAAQ,QAAQ,QAAQ,OAAW;AAEvC,cAAM,YAAY,UAAU,GAAG;AAC/B,cAAM,MAAM,cAAc,OAAO,WAAW,GAAG,IAAI;AACnD,cAAM,WAAW,cAAc,OAAO,KAAK,gBAAgB,SAAS,IAAI;AAExE,YAAI,OAAO,QAAQ,UAAU;AACzB,cAAI,OAAO,UAAU,GAAG,GAAG;AACvB,gBAAI,OAAO,KAAK,yBAAyB,OAAO,KAAK,uBAAuB;AACxE,mBAAK,qBAAqB,QAAQ,KAAK,GAAG,QAAQ;AAAA,YACtD,OAAO;AACH,mBAAK,YAAY,QAAQ,KAAK,GAAG,QAAQ;AAAA,YAC7C;AAAA,UACJ,OAAO;AACH,iBAAK,YAAY,QAAQ,KAAK,GAAG,QAAQ;AAAA,UAC7C;AAAA,QACJ,WAAW,OAAO,QAAQ,UAAU;AAChC,eAAK,YAAY,QAAQ,IAAI,SAAS,GAAG,CAAC;AAAA,QAC9C,WAAW,OAAO,QAAQ,WAAW;AACjC,eAAK,UAAU,QAAQ,KAAK,CAAC;AAAA,QACjC,WAAW,eAAe,MAAM;AAC5B,gBAAM,UAAU,IAAI,QAAQ,IAAI,KAAK,YAAY;AACjD,eAAK,YAAY,QAAQ,QAAQ,GAAG,cAAc,OAAO,WAAW,CAAC;AAAA,QACzE,WAAW,QAAQ,QAAQ,QAAQ,QAAW;AAC1C,eAAK,YAAY,QAAQ,IAAI,SAAS,GAAG,GAAG,OAAO,cAAc,OAAO,WAAW,MAAS;AAAA,QAChG;AAAA,MACJ;AACA;AAAA,IACJ;AAEA,WAAO,MAAM,YAAY,SAAS,KAAK,GAAG,CAAC;AAE3C,QAAI,gBAAgB,SAAS;AACzB,WAAK,kBAAkB;AACvB,YAAM,SAAS,KAAK,SAAS;AAE7B,aAAO,MAAM,KAAK,qBAAqB;AAEvC,YAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,aAAO,aAAa,GAAG,CAAC;AACxB,aAAO,aAAa,SAAS,GAAG,CAAC;AACjC,aAAO,MAAM,MAAM;AAEnB,YAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,aAAO,aAAa,UAAU,CAAC;AAC/B,aAAO,aAAa,SAAS,GAAG,CAAC;AACjC,aAAO,MAAM,MAAM;AAEnB,aAAO,MAAM,KAAK,mBAAmB;AAErC,YAAM,QAAQ,KAAK,UAAU,KAAK,aAAa,CAAC;AAChD,YAAM,aAAa;AAAA,QACf,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,QACb,aAAa;AAAA,QACb,WAAW,SAAS;AAAA,MACxB;AAAA,IACJ;AAEA,WAAO,MAAM,YAAY,SAAS,GAAG,CAAC;AAEtC,SAAK,QAAQ,OAAO,SAAS,KAAK,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,KAAK,aAAa,CAAC,EAAE,cAAc,CAAC;AAAA,EACtH;AAAA,EAIA,gBAAgB,QAAmB,WAAmB,UAAkB,QAAsB;AAC1F,WAAO,eAAe,EAAE;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,EAAE;AACzB,WAAO,mBAAmB,SAAS;AACnC,WAAO,mBAAmB,CAAC;AAC3B,WAAO,gBAAgB,EAAE;AACzB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,mBAAmB,QAAQ;AAClC,WAAO,mBAAmB,MAAM;AAAA,EACpC;AAAA,EAEA,qBAAqB,QAAmB,KAAa,QAAgB,WAAmB,GAAS;AAC7F,WAAO,eAAe,EAAE;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,EAAE;AACzB,WAAO,mBAAmB,MAAM;AAChC,WAAO,gBAAgB,QAAQ;AAC/B,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,UAAM,QAAS,OAAO,IAAK;AAC3B,WAAO,mBAAmB,KAAK;AAAA,EACnC;AAAA,EAEA,YAAY,QAAmB,KAAa,QAAgB,WAAmB,GAAS;AACpF,WAAO,eAAe,EAAE;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,EAAE;AACzB,WAAO,mBAAmB,MAAM;AAChC,WAAO,gBAAgB,QAAQ;AAC/B,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,oBAAoB,GAAG;AAAA,EAClC;AAAA,EAEA,UAAU,QAAmB,KAAc,QAAsB;AAC7D,WAAO,eAAe,EAAE;AACxB,WAAO,gBAAgB,CAAI;AAC3B,WAAO,gBAAgB,CAAC;AACxB,WAAO,mBAAmB,MAAM;AAChC,WAAO,mBAAmB,CAAC;AAC3B,WAAO,gBAAgB,MAAM,IAAI,CAAC;AAAA,EACtC;AAAA,EAEA,cAAc,QAAmB,MAAY,QAAsB;AAE/D,UAAM,UAAU,KAAK,QAAQ,IAAI,KAAK,YAAY;AAClD,SAAK,YAAY,QAAQ,QAAQ,QAAQ,CAAC;AAAA,EAC9C;AAAA,EAEQ,cAAc,OAAqB;AACvC,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,QAAmB,KAAa,QAAgB,SAAkB,OAAO,eAA8B;AAC/G,QAAI;AACJ,QAAI,KAAK,OAAO,IAAI,GAAG,GAAG;AACtB,cAAQ,KAAK,OAAO,IAAI,GAAG;AAAA,IAC/B,OAAO;AACH,cAAQ,KAAK;AACb,WAAK,OAAO,IAAI,KAAK,KAAK;AAC1B,WAAK;AAAA,IACT;AACA,SAAK;AAEL,UAAM,WAAW,kBAAkB,SAAY,gBAAiB,SAAS,IAAI;AAC7E,WAAO,eAAe,EAAE;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,EAAE;AACzB,WAAO,mBAAmB,MAAM;AAChC,WAAO,gBAAgB,QAAQ;AAC/B,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,gBAAgB,CAAC;AACxB,WAAO,mBAAmB,KAAK;AAAA,EACnC;AAAA,EAEQ,UAAgB;AACpB,UAAM,SAAS,IAAI,UAAU;AAE7B,WAAO,UAAU,GAAG;AACpB,WAAO,UAAU,CAAC;AAClB,WAAO,UAAU,CAAC;AAElB,WAAO,aAAa,KAAK,YAAY;AACrC,WAAO,aAAa,KAAK,SAAS;AAElC,eAAW,CAAC,GAAG,KAAK,KAAK,QAAQ;AAC7B,YAAM,SAAS,IAAI;AAEnB,aAAO,UAAU,EAAE;AAEnB,YAAM,SAAS,IAAI,IAAI;AAEvB,UAAI,UAAU,KAAK;AACf,eAAO,UAAU,MAAO,SAAS,GAAI;AACrC,cAAM,MAAM,UAAU;AACtB,YAAI,OAAO,KAAK;AACZ,iBAAO,UAAU,MAAO,MAAM,GAAI;AAAA,QACtC,OAAO;AACH,iBAAO,UAAU,GAAG;AAAA,QACxB;AACA,eAAO,UAAU,UAAU,EAAE;AAC7B,YAAK,UAAU,KAAM,GAAG;AACpB,iBAAO,UAAU,CAAC;AAAA,QACtB;AAAA,MACJ,OAAO;AACH,eAAO,UAAU,SAAS,GAAI;AAC9B,eAAO,UAAW,UAAU,IAAK,GAAI;AAAA,MACzC;AAEA,aAAO,aAAa,MAAM;AAC1B,aAAO,aAAa,GAAG;AAAA,IAC3B;AAEA,WAAO,UAAU,GAAG;AACpB,WAAO,UAAU,CAAC;AAClB,WAAO,UAAU,CAAC;AAElB,SAAK,QAAQ,OAAO,SAAS,KAAK,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAAA,EAC3F;AAAA,EAEQ,wBAAwB,WAAqB,OAAkB,UAAwB;AAC3F,UAAM,aAAa,MAAM;AACzB,UAAM,aAAa,MAAM,UAAU;AAEnC,UAAM,OAAO,OAAO,MAAM,KAAK,0BAA0B,MAAM;AAC/D,SAAK,0BAA0B,KAAK,IAAI;AAExC,UAAM,UAAU,KAAK,0BAA0B,SAAS;AAExD,SAAK,CAAC,IAAI;AACV,SAAK,OAAO,IAAI;AAEhB,cAAU,KAAK,IAAI;AAEnB,UAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,WAAO,aAAa,WAAW,UAAU,CAAC;AAC1C,WAAO,aAAa,WAAW,QAAQ,CAAC;AACxC,cAAU,KAAK,MAAM;AAErB,UAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,WAAO,aAAa,WAAW,aAAa,CAAC;AAC7C,WAAO,aAAa,WAAW,WAAW,CAAC;AAC3C,cAAU,KAAK,MAAM;AAErB,cAAU,KAAK,KAAK,yBAAyB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAA0B;AACtB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,UAAI;AACA,aAAK,QAAQ;AAEb,aAAK,QAAQ,OAAO,KAAK,gBAAgB,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErE,cAAM,YAAsB,CAAC;AAC7B,kBAAU,KAAK,KAAK,iBAAiB;AAErC,mBAAW,SAAS,KAAK,WAAW;AAChC,gBAAM,MAAM,MAAM,MAAM,OAAO;AAE/B,gBAAM,SAAS,IAAI,KAAK,MAAM,KAAK,SAAS,IAAI,IAAI,SAAS;AAC7D,gBAAM,MAAM,OAAO,MAAM,IAAI,MAAM;AACnC,cAAI,CAAC,IAAI;AAAK,cAAI,CAAC,IAAI;AAAG,cAAI,CAAC,IAAI;AACnC,cAAI,MAAM;AAEV,cAAI,aAAa,MAAM,SAAS,IAAI,GAAG,GAAG;AAAG,iBAAO;AACpD,cAAI,aAAa,MAAM,SAAS,GAAG;AAAG,iBAAO;AAE7C,cAAI,aAAa,IAAI,QAAQ,GAAG;AAAG,iBAAO;AAC1C,mBAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,kBAAM,IAAI,IAAI,WAAW,CAAC;AAC1B,gBAAI,KAAK,IAAI,IAAI;AAAM,gBAAI,KAAK,IAAK,KAAK,IAAK;AAAA,UACnD;AAEA,cAAI,aAAa,MAAM,KAAK,QAAQ,GAAG;AAAG,iBAAO;AACjD,mBAAS,IAAI,GAAG,IAAI,MAAM,KAAK,QAAQ,KAAK;AACxC,kBAAM,IAAI,MAAM,KAAK,WAAW,CAAC;AACjC,gBAAI,KAAK,IAAI,IAAI;AAAM,gBAAI,KAAK,IAAK,KAAK,IAAK;AAAA,UACnD;AACA,oBAAU,KAAK,GAAG;AAAA,QACtB;AAEA,kBAAU,KAAK,KAAK,kBAAkB;AAEtC,YAAI,KAAK,iBAAiB;AACtB,gBAAM,iBAAiB,KAAK,UAAU,OAAO,OAAK,EAAE,UAAU;AAC9D,gBAAM,MAAM,eAAe;AAE3B,cAAI,MAAM,GAAG;AACT,sBAAU,KAAK,KAAK,yBAAyB;AAE7C,kBAAM,YAAY,OAAO,KACnB,MAAQ,MAAM,KAAK,KACnB,OAAQ,MAAM,MAAM;AAC1B,kBAAM,WAAW,OAAO,KAClB,OAAO,KAAK,CAAC,WAAW,KAAK,GAAM,GAAM,CAAI,CAAC,IAC7C,OAAO,KAAK,CAAC,WAAW,KAAK,OAAO,MAAM,KAAK,EAAE,GAAG,KAAK,GAAM,GAAM,CAAI,CAAC;AACjF,sBAAU,KAAK,QAAQ;AAEvB,qBAAS,KAAK,GAAG,KAAK,KAAK,MAAM;AAC7B,oBAAM,aAAa,eAAe,EAAE,EAAE,UAAU;AAChD,oBAAM,SAAS,OAAO,MAAM,EAAE;AAC9B,qBAAO,aAAa,GAAG,CAAC;AACxB,qBAAO,CAAC,IAAI;AACZ,qBAAO,CAAC,IAAI;AACZ,wBAAU,KAAK,MAAM;AAAA,YACzB;AAEA,sBAAU,KAAK,OAAO,KAAK,CAAC,KAAM,GAAM,CAAI,CAAC,CAAC;AAE9C,qBAAS,WAAW,GAAG,WAAW,KAAK,YAAY;AAC/C,oBAAM,QAAQ,eAAe,QAAQ;AACrC,mBAAK,wBAAwB,WAAW,OAAO,QAAQ;AAAA,YAC3D;AAAA,UACJ;AAAA,QACJ;AAEA,kBAAU,KAAK,KAAK,eAAe;AAEnC,aAAK,QAAQ,OAAO,OAAO,OAAO,SAAS,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEzE,mBAAW,SAAS,KAAK,WAAW;AAChC,eAAK,QAAQ,OAAO,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,MAAM,OAAO,OAAO,CAAC;AAAA,QACvG;AAEA,YAAI,eAAe;AAAA;AAAA;AAAA;AAAA;AAKnB,mBAAW,SAAS,KAAK,WAAW;AAChC,0BAAgB,wBAAwB,MAAM,aAAa;AAC3D,0BAAgB,iDAAiD,MAAM,OAAO;AAAA,QAClF;AACA,wBAAgB;AAAA;AAAA;AAGhB,aAAK,QAAQ,OAAO,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjE,YAAI,SAAS;AAAA;AAEb,mBAAW,SAAS,KAAK,WAAW;AAChC,gBAAM,MAAM,MAAM,MAAM,OAAO;AAC/B,oBAAU,qBAAqB,GAAG,6GAA6G,MAAM,aAAa;AAAA,QACtK;AACA,kBAAU,wBAAwB,KAAK,UAAU,SAAS,CAAC;AAAA,uBACpD,KAAK,UAAU,SAAS,CAAC;AAAA;AAEhC,aAAK,QAAQ,OAAO,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAElE,cAAM,aAAa;AAAA;AAAA;AAAA;AAInB,aAAK,QAAQ,OAAO,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvD,mBAAW,SAAS,KAAK,WAAW;AAChC,gBAAM,SAAS;AAAA;AAAA,yHAEsF,MAAM,OAAO;AAAA;AAElH,eAAK,QAAQ,OAAO,QAAQ,EAAE,MAAM,uBAAuB,MAAM,aAAa,QAAQ,CAAC;AAAA,QAC3F;AAEA,aAAK,OAAO,GAAG,SAAS,MAAM,QAAQ,CAAC;AACvC,aAAK,QAAQ,GAAG,SAAS,CAAC,QAAa,OAAO,GAAG,CAAC;AAClD,aAAK,QAAQ,SAAS;AAAA,MAC1B,SAAS,KAAK;AACV,eAAO,GAAG;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;;;AIxhCA,YAAYC,SAAQ;AACpB,OAAOC,eAAc;AACrB,SAAS,YAAAC,iBAAgB;AAYzB,IAAM,kBAAkB,MAAM;AAC1B,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC1B,YAAQ,KAAK,OAAO,aAAa,CAAC,CAAC;AAAA,EACvC;AACA,QAAM,OAAiB,CAAC;AACxB,aAAW,KAAK,SAAS;AACrB,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC1B,WAAK,KAAK,IAAI,OAAO,aAAa,CAAC,CAAC;AAAA,IACxC;AAAA,EACJ;AACA,UAAQ,KAAK,GAAG,IAAI;AACpB,SAAO;AACX,GAAG;AAeI,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA,EAyBpB,YAAY,UAAkB;AArB9B,SAAQ,aAAqB;AAC7B,SAAQ,YAAyB,CAAC;AAClC,SAAQ,WAAqB,CAAC;AAC9B,SAAQ,SAA8B,oBAAI,IAAI;AAC9C,SAAQ,YAAoB;AAC5B,SAAQ,kBAA2B;AAKnC;AAAA,SAAQ,kBAAuC,oBAAI,IAAI;AACvD,SAAQ,eAAoC,oBAAI,IAAI;AACpD,SAAQ,gBAAwB;AAChC,SAAQ,eAAuB;AAE/B,SAAiB,SAAS,IAAI,oBAAoB;AAClD,SAAQ,oBAA8B,CAAC;AAMnC,SAAK,SAAY,sBAAkB,QAAQ;AAC3C,SAAK,UAAUC,UAAS,KAAK;AAE7B,SAAK,QAAQ,KAAK,KAAK,MAAM;AAE7B,SAAK,WAAW,KAAK,IAAI,MAAM,IAAI,EAAE;AAAA,EACzC;AAAA,EAEQ,iBAAiB,UAA0B;AAC/C,WAAO,WAAW,eAAe,SAAS,eAAe,QAAQ,IAAI;AAAA,EACzE;AAAA;AAAA,EAGQ,mBAAmB,MAAsB;AAC7C,WAAO,kBAAkB,MAAM,KAAK,UAAU;AAAA,EAClD;AAAA,EAEQ,uBAAuB,MAAsB;AACjD,WAAO,KACF,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAAA,EAC/B;AAAA,EAEQ,2BAA2B,MAAsB;AACrD,QAAI,oBAAoB,KAAK,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG;AACvD,YAAM,UAAU,KAAK,QAAQ,MAAM,IAAI;AACvC,aAAO,IAAI,OAAO;AAAA,IACtB;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,WAAmB,SAAkB,OAAa;AACvD,UAAM,gBAAgB,kBAAkB,WAAW,KAAK,UAAU;AAElE,SAAK;AACL,UAAM,MAAM,MAAM,KAAK,UAAU;AACjC,UAAM,gBAAgB,QAAQ,KAAK,UAAU;AAC7C,SAAK,UAAU,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,eAAe,iBAAiB,aAAa;AAAA,MAC7C;AAAA,MACA,eAAe;AAAA,MACf,SAAS,KAAK;AAAA,MACd;AAAA,MACA,mBAAmB;AAAA,IACvB,CAAC;AAAA,EACL;AAAA,EAEQ,aAAa,KAAsB;AACvC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,YAAM,IAAI,IAAI,WAAW,CAAC;AAC1B,UAAI,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MACrD,KAAK,KAAK,KAAK,KAAM,MAAM,MAAM,MAAM,MAAO,KAAK,MAAM,KAAK,IAAK;AACpE,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,QAAQ,KAAqB;AACjC,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,CAAC,KAAK,aAAa,GAAG,EAAG,QAAO;AAEpC,WAAO,IAAI,QAAQ,MAAM,OAAO,EAC3B,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ,EAEtB,QAAQ,iCAAiC,EAAE;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,WACI,WACA,aACA,SACA,UAAkF,CAAC,GAC/E;AACJ,UAAM,EAAE,SAAS,OAAO,eAAe,MAAM,WAAW,IAAI;AAE5D,SAAK,SAAS,WAAW,MAAM;AAE/B,SAAK,OAAO,MAAM,aAAa,gBAAgB,YAAY,QAAW,IAAI,UAAU,CAAC;AACrF,UAAM,SAAS,KAAK,OAAO;AAE3B,UAAM,aAAa,IAAI,MAAM,WAAW;AACxC,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,iBAAW,CAAC,IAAI,KAAK,iBAAiB,CAAC;AAAA,IAC3C;AACA,SAAK,oBAAoB;AAEzB,QAAI,SAAS;AACT,wBAAkB,KAAK,OAAO,WAAW,SAAS,WAAW;AAAA,IACjE;AACA,QAAI,YAAY;AACZ,8BAAwB,KAAK,OAAO,WAAW,UAAU;AAAA,IAC7D;AAEA,WAAO,YAAY,yDAAyD;AAC5E,WAAO,YAAY,6JAA6J;AAGhL,WAAO,YAAY,uBAAuB;AAE1C,UAAM,eAAe,KAAK,eAAe;AACzC,QAAI,SAAS;AACT,UAAI,cAAc;AACd,eAAO,YAAY,qOAAqO;AAAA,MAC5P,OAAO;AACH,eAAO,YAAY,qNAAqN;AAAA,MAC5O;AAAA,IACJ,OAAO;AACH,UAAI,cAAc;AACd,eAAO,YAAY,gHAAgH;AAAA,MACvI,OAAO;AACH,eAAO,YAAY,gGAAgG;AAAA,MACvH;AAAA,IACJ;AAEA,WAAO,YAAY,QAAQ;AAC3B,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,YAAM,QAAQ,gBAAgB,KAAK,OAAO,UAAU,CAAC,CAAC;AACtD,aAAO,YAAY,aAAa,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,KAAK,kCAAkC;AAAA,IAC3G;AACA,WAAO,YAAY,oBAAoB;AAEvC,QAAI,SAAS;AACT,WAAK,OAAO;AACZ,aAAO,YAAY,WAAW,KAAK,OAAO,MAAM,IAAI;AACpD,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,aAAK,iBAAiB,QAAQ,QAAQ,CAAC,GAAG,WAAW,CAAC,GAAG,KAAK,OAAO,QAAQ,CAAC;AAAA,MAClF;AACA,aAAO,YAAY,QAAQ;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA,EAGA,SAAS,KAAwB;AAC7B,UAAM,SAAS,KAAK,OAAO,gBAAgB;AAE3C,QAAI,IAAI,WAAW,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU;AAC1D,YAAM,IAAI;AAAA,QACN,iCAAiC,KAAK,OAAO,SAAS,KAAK,OAAO,QAAQ,iBAAiB,IAAI,MAAM;AAAA,MACzG;AAAA,IACJ;AAEA,SAAK,OAAO;AACZ,WAAO,YAAY,WAAW,KAAK,OAAO,MAAM,IAAI;AAEpD,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,QAAQ,QAAQ,QAAQ,OAAW;AAEvC,YAAM,YAAY,UAAU,GAAG;AAC/B,YAAM,MAAM,cAAc,OAAO,WAAW,GAAG,IAAI;AACnD,YAAM,QAAQ,cAAc,OAAO,KAAK,gBAAgB,SAAS,IAAI;AACrE,YAAM,YAAY,SAAS,IAAI,OAAO,KAAK,MAAM;AAEjD,YAAM,SAAS,KAAK,kBAAkB,CAAC;AACvC,UAAI,OAAO,QAAQ,UAAU;AACzB,YAAI,OAAO,SAAS,GAAG,GAAG;AACtB,iBAAO,YAAY,SAAS,MAAM,GAAG,KAAK,OAAO,MAAM,IAAI,SAAS,OAAO,GAAG,UAAU;AAAA,QAC5F,OAAO;AACH,eAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,KAAK,OAAO,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,QAC5G;AAAA,MACJ,WAAW,OAAO,QAAQ,UAAU;AAChC,aAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,KAAK,OAAO,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,MAC5G,WAAW,OAAO,QAAQ,WAAW;AACjC,eAAO,YAAY,SAAS,MAAM,GAAG,KAAK,OAAO,MAAM,UAAU,SAAS,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1G,WAAW,eAAe,MAAM;AAC5B,cAAM,SAAS,KAAK,UAAU,GAAG;AACjC,YAAI,OAAO,SAAS,MAAM,GAAG;AACzB,gBAAM,aAAa,SAAS,IAAI,QAAQ;AACxC,iBAAO,YAAY,SAAS,MAAM,GAAG,KAAK,OAAO,MAAM,QAAQ,UAAU,QAAQ,MAAM,UAAU;AAAA,QACrG,OAAO;AACH,eAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,KAAK,OAAO,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,QAC5G;AAAA,MACJ,WAAW,QAAQ,QAAQ,QAAQ,QAAW;AAC1C,aAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,KAAK,OAAO,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,MAC5G;AAAA,IACJ;AACA,WAAO,YAAY,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,WAAiB;AACb,UAAM,SAAS,KAAK,OAAO,gBAAgB;AAC3C,WAAO,YAAY,cAAc;AAEjC,QAAI,KAAK,OAAO,gBAAgB,KAAK,OAAO,SAAS,GAAG;AACpD,WAAK,kBAAkB;AACvB,YAAM,YAAY,MAAM,KAAK,kBAAkB,KAAK,OAAO,SAAS,CAAC,CAAC,GAAG,KAAK,OAAO,MAAM;AAC3F,aAAO,YAAY,oBAAoB,SAAS,KAAK;AAErD,YAAM,QAAQ,KAAK,UAAU,KAAK,aAAa,CAAC;AAChD,YAAM,mBAAmB,KAAK,2BAA2B,MAAM,IAAI;AACnE,YAAM,oBAAoB,GAAG,gBAAgB,UAAU,KAAK,kBAAkB,KAAK,OAAO,SAAS,CAAC,CAAC,IAAI,KAAK,OAAO,MAAM;AAAA,IAC/H;AAEA,WAAO,YAAY,cAAc;AAEjC,SAAK,QAAQ,OAAOC,UAAS,KAAK,OAAO,UAAU,CAAC,GAAG;AAAA,MACnD,MAAM,KAAK,UAAU,KAAK,aAAa,CAAC,EAAE;AAAA,IAC9C,CAAC;AAED,SAAK,OAAO,IAAI;AAChB,SAAK,oBAAoB,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAqB,UAA2B,MAAM,eAAwB,MAAY;AACjG,UAAM,SAAS,IAAI,UAAU;AAE7B,QAAI,cAAc;AAClB,QAAI,KAAK,SAAS,GAAG;AACjB,oBAAc,KAAK,CAAC,EAAE;AAAA,IAC1B,WAAW,SAAS;AAChB,oBAAc,QAAQ;AAAA,IAC1B;AAEA,UAAM,YAAY,cAAc,WAAW;AAE3C,UAAM,aAAa,IAAI,MAAM,WAAW;AACxC,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,iBAAW,CAAC,IAAI,KAAK,iBAAiB,CAAC;AAAA,IAC3C;AAEA,QAAI,SAAS;AACT,wBAAkB,WAAW,SAAS,WAAW;AAAA,IACrD;AACA,4BAAwB,WAAW,IAAI;AAEvC,WAAO,YAAY,yDAAyD;AAC5E,WAAO,YAAY,6JAA6J;AAEhL,UAAM,YAAY,KAAK,UAAU,UAAU,IAAI;AAC/C,QAAI,YAAY,KAAK,cAAc,GAAG;AAClC,aAAO,YAAY,sBAAsB,WAAW,cAAc,CAAC,CAAC,GAAG,SAAS,KAAK;AAAA,IACzF,OAAO;AACH,aAAO,YAAY,uBAAuB;AAAA,IAC9C;AAEA,UAAM,eAAe,KAAK,eAAe;AACzC,QAAI,SAAS;AACT,UAAI,cAAc;AACd,eAAO,YAAY,qOAAqO;AAAA,MAC5P,OAAO;AACH,eAAO,YAAY,qNAAqN;AAAA,MAC5O;AAAA,IACJ,OAAO;AACH,UAAI,cAAc;AACd,eAAO,YAAY,gHAAgH;AAAA,MACvI,OAAO;AACH,eAAO,YAAY,gGAAgG;AAAA,MACvH;AAAA,IACJ;AAEA,WAAO,YAAY,QAAQ;AAC3B,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,YAAM,QAAQ,gBAAgB,UAAU,CAAC,CAAC;AAC1C,aAAO,YAAY,aAAa,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,KAAK,kCAAkC;AAAA,IAC3G;AACA,WAAO,YAAY,oBAAoB;AAEvC,QAAI,SAAS;AAEb,QAAI,SAAS;AACT;AACA,aAAO,YAAY,WAAW,MAAM,IAAI;AACxC,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,aAAK,iBAAiB,QAAQ,QAAQ,CAAC,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC;AAAA,MACtE;AACA,aAAO,YAAY,QAAQ;AAAA,IAC/B;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC;AACA,aAAO,YAAY,WAAW,MAAM,IAAI;AACxC,YAAM,MAAM,KAAK,CAAC;AAClB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,cAAM,MAAM,IAAI,CAAC;AACjB,YAAI,QAAQ,QAAQ,QAAQ,OAAW;AAEvC,cAAM,YAAY,UAAU,GAAG;AAC/B,cAAM,MAAM,cAAc,OAAO,WAAW,GAAG,IAAI;AACnD,cAAM,QAAQ,cAAc,OAAO,KAAK,gBAAgB,SAAS,IAAI;AACrE,cAAM,YAAY,SAAS,IAAI,OAAO,KAAK,MAAM;AAEjD,cAAM,SAAS,WAAW,CAAC;AAC3B,YAAI,OAAO,QAAQ,UAAU;AACzB,cAAI,OAAO,SAAS,GAAG,GAAG;AACtB,mBAAO,YAAY,SAAS,MAAM,GAAG,MAAM,IAAI,SAAS,OAAO,GAAG,UAAU;AAAA,UAChF,OAAO;AACH,iBAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,UAChG;AAAA,QACJ,WAAW,OAAO,QAAQ,UAAU;AAChC,eAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,QAChG,WAAW,OAAO,QAAQ,WAAW;AACjC,iBAAO,YAAY,SAAS,MAAM,GAAG,MAAM,UAAU,SAAS,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC9F,WAAW,eAAe,MAAM;AAC5B,gBAAM,SAAS,KAAK,UAAU,GAAG;AACjC,cAAI,OAAO,SAAS,MAAM,GAAG;AACzB,kBAAM,aAAa,SAAS,IAAI,QAAQ;AACxC,mBAAO,YAAY,SAAS,MAAM,GAAG,MAAM,QAAQ,UAAU,QAAQ,MAAM,UAAU;AAAA,UACzF,OAAO;AACH,iBAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,UAChG;AAAA,QACJ,WAAW,QAAQ,QAAQ,QAAQ,QAAW;AAC1C,eAAK,iBAAiB,QAAQ,IAAI,SAAS,GAAG,QAAQ,QAAQ,SAAS,IAAI,QAAQ,MAAS;AAAA,QAChG;AAAA,MACJ;AACA,aAAO,YAAY,QAAQ;AAAA,IAC/B;AAEA,WAAO,YAAY,cAAc;AAEjC,QAAI,gBAAgB,WAAW,cAAc,GAAG;AAC5C,WAAK,kBAAkB;AACvB,YAAM,YAAY,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,SAAS;AAC/D,aAAO,YAAY,oBAAoB,SAAS,KAAK;AAErD,YAAM,QAAQ,KAAK,UAAU,KAAK,aAAa,CAAC;AAChD,YAAM,mBAAmB,KAAK,2BAA2B,MAAM,IAAI;AACnE,YAAM,oBAAoB,GAAG,gBAAgB,UAAU,WAAW,cAAc,CAAC,CAAC,IAAI,SAAS;AAAA,IACnG;AAEA,WAAO,YAAY,cAAc;AAEjC,SAAK,QAAQ,OAAOA,UAAS,KAAK,OAAO,UAAU,CAAC,GAAG;AAAA,MACnD,MAAM,KAAK,UAAU,KAAK,aAAa,CAAC,EAAE;AAAA,IAC9C,CAAC;AAAA,EACL;AAAA,EAEQ,iBAAiB,QAAmB,KAAa,QAAgB,QAAgB,eAA8B;AACnH,QAAI,QAAQ,KAAK,OAAO,IAAI,GAAG;AAC/B,QAAI,UAAU,QAAW;AACrB,cAAQ,KAAK,SAAS;AACtB,WAAK,SAAS,KAAK,GAAG;AACtB,WAAK,OAAO,IAAI,KAAK,KAAK;AAAA,IAC9B;AACA,SAAK;AACL,UAAM,YAAY,kBAAkB,SAAY,OAAO,aAAa,MAAM;AAC1E,WAAO,YAAY,SAAS,MAAM,GAAG,MAAM,UAAU,SAAS,OAAO,KAAK,UAAU;AAAA,EACxF;AAAA,EAEQ,gBAAgB,WAA2B;AAC/C,QAAI,KAAK,aAAa,IAAI,SAAS,GAAG;AAClC,aAAO,KAAK,aAAa,IAAI,SAAS;AAAA,IAC1C;AACA,UAAM,WAAW,KAAK;AACtB,SAAK,gBAAgB,IAAI,WAAW,QAAQ;AAC5C,UAAM,UAAU,KAAK;AACrB,SAAK,aAAa,IAAI,WAAW,OAAO;AACxC,WAAO;AAAA,EACX;AAAA,EAEQ,UAAU,MAAoB;AAElC,YAAQ,KAAK,QAAQ,IAAI,KAAK,YAAY;AAAA,EAC9C;AAAA,EAEQ,cAAc,OAAqB;AACvC,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,WAA0B;AACtB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,UAAI;AACA,aAAK,oBAAoB;AACzB,aAAK,aAAa;AAClB,aAAK,eAAe;AACpB,aAAK,mBAAmB;AACxB,aAAK,WAAW;AAEhB,aAAK,OAAO,GAAG,SAAS,MAAM;AAC1B,kBAAQ;AAAA,QACZ,CAAC;AAED,aAAK,QAAQ,GAAG,SAAS,CAAC,QAAa;AACnC,iBAAO,GAAG;AAAA,QACd,CAAC;AAED,aAAK,QAAQ,SAAS;AAAA,MAC1B,SAAS,KAAK;AACV,eAAO,GAAG;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEQ,sBAA4B;AAChC,UAAM,SAAS,IAAI,UAAU;AAE7B,WAAO,YAAY,yDAAyD;AAC5E,WAAO,YAAY,iFAAiF,KAAK,SAAS,kBAAkB,KAAK,SAAS,MAAM,IAAI;AAE5J,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC3C,YAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,YAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,UAAI,SAAS,SAAS,MAAM,SAAS,CAAC,MAAM,OAAO,SAAS,SAAS,SAAS,CAAC,MAAM,OAAO,WAAW,KAAK,QAAQ,IAAI;AACpH,eAAO,YAAY,+BAA+B,QAAQ,WAAW;AAAA,MACzE,OAAO;AACH,eAAO,YAAY,UAAU,QAAQ,WAAW;AAAA,MACpD;AAAA,IACJ;AAEA,WAAO,YAAY,QAAQ;AAE3B,SAAK,QAAQ,OAAOA,UAAS,KAAK,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAAA,EAC3F;AAAA,EAEQ,eAAqB;AACzB,QAAI,UAAU;AACd,QAAI,cAAc;AAElB,UAAM,YAAsB,CAAC;AAC7B,cAAU,KAAK,gEAAgE;AAC/E,cAAU,KAAK,uFAAuF;AACtG,cAAU,KAAK,uFAAuF;AACtG,cAAU,KAAK,8EAA8E;AAE7F,eAAW,CAAC,WAAW,QAAQ,KAAK,KAAK,iBAAiB;AACtD,YAAM,aAAa,UACd,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B,iBAAW,qBAAqB,QAAQ,iBAAiB,UAAU;AACnE;AAAA,IACJ;AAEA,UAAM,gBAAgB,CAAC,GAAG,KAAK,aAAa,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACjF,eAAW,CAAC,SAAS,KAAK,eAAe;AACrC,YAAM,WAAW,KAAK,gBAAgB,IAAI,SAAS;AACnD,gBAAU,KAAK,iBAAiB,QAAQ,uEAAuE;AAAA,IACnH;AAEA,UAAM,UAAU,UAAU;AAC1B,UAAM,iBAAiB,cAAc,IAAI,mBAAmB,WAAW,KAAK,OAAO,eAAe;AAElG,UAAM,SAAS;AAAA;AAAA,EAErB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAeE,OAAO;AAAA,EACvB,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQd,SAAK,QAAQ,OAAO,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAAA,EACzD;AAAA,EAEQ,iBAAuB;AAC3B,QAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAOV,eAAW,SAAS,KAAK,WAAW;AAChC,YAAM,QAAQ,MAAM,SAAS,oBAAoB;AACjD,YAAM,cAAc,KAAK,uBAAuB,MAAM,IAAI;AAC1D,aAAO,gBAAgB,WAAW,cAAc,MAAM,OAAO,IAAI,KAAK,UAAU,MAAM,GAAG;AAAA,IAC7F;AAEA,WAAO;AAEP,QAAI,KAAK,iBAAiB;AACtB,aAAO;AACP,iBAAW,SAAS,KAAK,WAAW;AAChC,YAAI,MAAM,mBAAmB;AACzB,gBAAM,eAAe,MAAM,UAAU;AACrC,gBAAM,eAAe,KAAK,QAAQ,MAAM,iBAAiB;AACzD,iBAAO,2DAA2D,YAAY,gBAAgB,YAAY;AAAA,QAC9G;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAEA,WAAO;AACP,WAAO;AACP,SAAK,QAAQ,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAAA,EACxD;AAAA,EAEQ,qBAA2B;AAC/B,QAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQV,eAAW,SAAS,KAAK,WAAW;AAChC,aAAO,wBAAwB,MAAM,aAAa;AAAA,IACtD;AAEA,WAAO;AACP,SAAK,QAAQ,OAAO,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAAA,EAC5D;AAAA,EAEQ,aAAmB;AACvB,UAAM,aAAa;AAAA;AAAA;AAAA;AAInB,SAAK,QAAQ,OAAO,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvD,QAAI,SAAS;AAAA;AAGb,eAAW,SAAS,KAAK,WAAW;AAChC,gBAAU,qBAAqB,MAAM,GAAG,6GAA6G,MAAM,aAAa;AAAA,IAC5K;AAEA,QAAI,SAAS,KAAK,UAAU,SAAS;AACrC,cAAU,wBAAwB,QAAQ;AAC1C,cAAU,wBAAwB,QAAQ;AAE1C,cAAU;AACV,SAAK,QAAQ,OAAO,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAAA,EACtE;AACJ;;;AC5mBA,YAAYC,SAAQ;AACpB,OAAOC,aAAY;AA+CZ,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA,EAmBrB,YAAYC,OAAc;AAf1B,SAAQ,kBAAuC,oBAAI,IAAI;AACvD,SAAQ,iBAAkC,CAAC;AAC3C,SAAQ,qBAA+B,CAAC;AAExC,SAAQ,mBAAkC;AAC1C,SAAQ,sBAAgC,CAAC;AACzC,SAAQ,8BAAsC;AAC9C,SAAQ,qBAA6B;AACrC,SAAQ,iBAAsC,oBAAI,IAAI;AAQlD,SAAK,aAAaA;AAClB,SAAK,WAAW,KAAK,IAAI,MAAM,IAAI,EAAE;AAErC,QAAI,CAAI,eAAWA,KAAI,GAAG;AACtB,YAAM,IAAI,MAAM,gCAAgCA,KAAI,EAAE;AAAA,IAC1D;AAEA,SAAK,MAAM,IAAIC,QAAOD,KAAI;AAE1B,QAAI,KAAK,IAAI,SAAS,iBAAiB,GAAG;AACtC,YAAM,IAAI;AAAA,QACN;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,CAAC,KAAK,IAAI,SAAS,iBAAiB,GAAG;AACvC,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACvF;AAEA,SAAK,uBAAuB;AAAA,EAChC;AAAA;AAAA,EAGA,gBAA0B;AACtB,WAAO,CAAC,GAAG,KAAK,gBAAgB,KAAK,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBACI,WACA,MACA,UAAmC,CAAC,GAChC;AACJ,UAAM,EAAE,SAAS,gBAAgB,UAAU,IAAI;AAC/C,WAAO,sBAAsB,IAAI;AAEjC,UAAM,YAAY,KAAK,gBAAgB,IAAI,SAAS;AACpD,QAAI,CAAC,WAAW;AACZ,YAAM,IAAI,MAAM,uBAAuB,SAAS,8BAA8B;AAAA,IAClF;AAEA,UAAM,QAAQ,KAAK,IAAI,SAAS,SAAS;AACzC,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,kDAAkD,SAAS,IAAI;AAAA,IACnF;AAEA,UAAM,WAAW,MAAM,QAAQ,EAAE,SAAS,MAAM;AAChD,SAAK,2BAA2B;AAEhC,QAAI,YAAiC,oBAAI,IAAI;AAC7C,QAAI,eAAoC,oBAAI,IAAI;AAChD,QAAI,YAA2B;AAE/B,QAAI,kBAAkB,WAAW;AAC7B,YAAM,YAAY,KAAK,uBAAuB,QAAQ;AACtD,kBAAY,UAAU;AACtB,qBAAe,UAAU;AACzB,kBAAY,KAAK,oBAAoB;AAAA,IACzC;AAEA,UAAM,UAAU,KAAK,IAAI,KAAK,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC,IAAG,mCAAS,WAAU,CAAC,IAAI;AAClG,UAAM,YAAY,KAAK,UAAU,UAAU,IAAI;AAE/C,UAAM,eAAe,KAAK,gBAAgB,MAAM,SAAS,WAAW,cAAc,SAAS;AAC3F,UAAM,SAAS,KAAK,eAAe,UAAU,cAAc,WAAW,OAAO;AAC7E,SAAK,IAAI,WAAW,WAAW,OAAO,KAAK,QAAQ,MAAM,CAAC;AAE1D,QAAI,KAAK,qBAAqB,MAAM;AAChC,WAAK,qBAAqB;AAAA,IAC9B;AAEA,UAAM,SAAS,YAAY,KAAK,WAAW,IACrC,MAAM,oBAAoB,OAAO,CAAC,GAAG,SAAS,KAC9C;AACN,SAAK,mBAAmB,WAAW,QAAQ,KAAK,MAAM;AACtD,SAAK,+BAA+B;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,YAA2B;AAC5B,UAAM,SAAS,cAAc,KAAK;AAClC,IAAG,kBAAc,QAAQ,KAAK,IAAI,SAAS,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,KAAK,IAAI,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAA+B;AACnC,UAAM,YAAY,KAAK,IAAI,SAAS,4BAA4B;AAChE,UAAM,cAAsC,CAAC;AAC7C,QAAI,WAAW;AACX,YAAM,OAAO,UAAU,QAAQ,EAAE,SAAS,MAAM;AAChD,YAAM,WAAW;AACjB,UAAIE;AACJ,cAAQA,SAAQ,SAAS,KAAK,IAAI,OAAO,MAAM;AAC3C,oBAAYA,OAAM,CAAC,CAAC,IAAIA,OAAM,CAAC;AAAA,MACnC;AAAA,IACJ;AAEA,UAAM,UAAU,KAAK,IAAI,SAAS,iBAAiB;AACnD,UAAM,QAAQ,UAAU,QAAQ,QAAQ,EAAE,SAAS,MAAM,IAAI;AAC7D,UAAM,UAAU;AAChB,QAAI;AACJ,YAAQ,QAAQ,QAAQ,KAAK,KAAK,OAAO,MAAM;AAC3C,YAAM,MAAM,MAAM,CAAC;AACnB,YAAM,YAAY,iBAAiB,KAAK,GAAG;AAC3C,YAAM,WAAW,iBAAiB,KAAK,GAAG;AAC1C,UAAI,CAAC,aAAa,CAAC,SAAU;AAC7B,YAAM,OAAO,UAAU,CAAC,EACnB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,GAAG;AAC3B,YAAM,SAAS,YAAY,SAAS,CAAC,CAAC,KAAK;AAC3C,UAAI,WAAW;AACf,UAAI,SAAS,WAAW,GAAG,GAAG;AAC1B,mBAAW,SAAS,UAAU,CAAC;AAAA,MACnC,WAAW,CAAC,SAAS,WAAW,KAAK,GAAG;AACpC,mBAAW,QAAQ;AAAA,MACvB;AACA,UAAI,UAAU;AACV,aAAK,gBAAgB,IAAI,MAAM,QAAQ;AAAA,MAC3C;AAAA,IACJ;AAEA,eAAW,SAAS,KAAK,IAAI,WAAW,GAAG;AACvC,YAAM,OAAO,MAAM;AACnB,UAAI,iDAAiD,KAAK,IAAI,GAAG;AAC7D,aAAK,eAAe,KAAK,EAAE,MAAM,MAAM,KAAK,MAAM,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;AAAA,MAClF,WAAW,wCAAwC,KAAK,IAAI,GAAG;AAC3D,aAAK,mBAAmB,KAAK,IAAI;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMQ,6BAAmC;AACvC,QAAI,KAAK,eAAe,OAAO,KAAK,KAAK,qBAAqB,MAAM;AAChE;AAAA,IACJ;AACA,UAAM,QAAQ,KAAK,IAAI,SAAS,sBAAsB;AACtD,QAAI,CAAC,OAAO;AACR,WAAK,mBAAmB;AACxB;AAAA,IACJ;AACA,SAAK,mBAAmB,MAAM,QAAQ,EAAE,SAAS,MAAM;AACvD,SAAK,sBAAsB,sBAAsB,KAAK,gBAAgB;AAEtE,UAAM,aAAa,eAAe,KAAK,KAAK,gBAAgB;AAC5D,UAAM,YAAY,aAAa,gBAAgB,KAAK,WAAW,CAAC,CAAC,IAAI;AACrE,SAAK,qBAAqB,YAAY,SAAS,UAAU,CAAC,GAAG,EAAE,IAAI;AAEnE,SAAK,oBAAoB,QAAQ,CAAC,OAAO,UAAU;AAC/C,UAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACjC,aAAK,eAAe,IAAI,OAAO,KAAK;AAAA,MACxC;AAAA,IACJ,CAAC;AACD,SAAK,8BAA8B,KAAK,oBAAoB;AAAA,EAChE;AAAA,EAEQ,uBAA6B;AACjC,QAAI,KAAK,qBAAqB,QAAQ,KAAK,oBAAoB,WAAW,KAAK,6BAA6B;AACxG;AAAA,IACJ;AAEA,QAAI,MAAM,KAAK;AAEf,UAAM,WAAW,IAAI,QAAQ,MAAM;AACnC,UAAM,YAAY,IAAI,QAAQ,KAAK,QAAQ;AAC3C,QAAI,aAAa,MAAM,cAAc,IAAI;AACrC,YAAM,MAAM,IAAI,UAAU,UAAU,YAAY,CAAC;AACjD,YAAM,SAAS,IACV,QAAQ,eAAe,UAAU,KAAK,kBAAkB,GAAG,EAC3D,QAAQ,qBAAqB,gBAAgB,KAAK,oBAAoB,MAAM,GAAG;AACpF,YAAM,IAAI,UAAU,GAAG,QAAQ,IAAI,SAAS,IAAI,UAAU,YAAY,CAAC;AAAA,IAC3E;AAEA,UAAM,SAAS,IAAI,YAAY,QAAQ;AACvC,QAAI,WAAW,IAAI;AACf;AAAA,IACJ;AAEA,QAAI,WAAW;AACf,aAAS,IAAI,KAAK,6BAA6B,IAAI,KAAK,oBAAoB,QAAQ,KAAK;AACrF,YAAM,MAAM,KAAK,oBAAoB,CAAC;AACtC,YAAM,QAAQ,cAAc,GAAG;AAC/B,YAAM,WAAW,MAAM,SAAS,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,MAAM,SAAS,CAAC,MAAM,OAAO,WAAW,KAAK,KAAK;AAClH,kBAAY,WACN,+BAA+B,KAAK,cACpC,UAAU,KAAK;AAAA,IACzB;AAEA,UAAM,IAAI,UAAU,GAAG,MAAM,IAAI,WAAW,IAAI,UAAU,MAAM;AAChE,SAAK,IAAI,WAAW,wBAAwB,OAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,UAA0F;AACrH,UAAM,aAAa,oBAAI,IAAiC;AACxD,UAAM,eAAe,oBAAI,IAAoB;AAE7C,UAAM,UAAU,SAAS,QAAQ,aAAa;AAC9C,QAAI,YAAY,GAAI,QAAO,EAAE,YAAY,oBAAI,IAAI,GAAG,aAAa;AACjE,UAAM,QAAQ,SAAS,QAAQ,gBAAgB,OAAO;AACtD,QAAI,UAAU,GAAI,QAAO,EAAE,YAAY,oBAAI,IAAI,GAAG,aAAa;AAE/D,UAAM,SAAS,SAAS,UAAU,SAAS,KAAK;AAChD,UAAM,SAAS;AACf,QAAI;AACJ,YAAQ,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM;AACvC,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,SAAS,oBAAoB,KAAK,GAAG;AAC3C,UAAI,CAAC,OAAQ;AACb,YAAM,MAAM,oBAAoB,OAAO,CAAC,CAAC;AACzC,YAAM,MAAM,SAAS,OAAO,CAAC,GAAG,EAAE;AAClC,YAAM,SAAS,YAAY,KAAK,GAAG;AACnC,UAAI,CAAC,OAAQ;AACb,YAAM,IAAI,SAAS,OAAO,CAAC,GAAG,EAAE;AAChC,UAAI,KAAK,EAAG;AAEZ,UAAI,QAAQ,GAAG;AACX,YAAI,CAAC,aAAa,IAAI,GAAG,EAAG,cAAa,IAAI,KAAK,CAAC;AACnD;AAAA,MACJ;AACA,UAAI,YAAY,WAAW,IAAI,GAAG;AAClC,UAAI,CAAC,WAAW;AACZ,oBAAY,oBAAI,IAAI;AACpB,mBAAW,IAAI,KAAK,SAAS;AAAA,MACjC;AACA,gBAAU,IAAI,IAAI,UAAU,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,IAChD;AAEA,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,CAAC,KAAK,SAAS,KAAK,YAAY;AACvC,UAAI,OAAO;AACX,UAAI,YAAY;AAChB,iBAAW,CAAC,GAAG,KAAK,KAAK,WAAW;AAChC,YAAI,QAAQ,WAAW;AACnB,iBAAO;AACP,sBAAY;AAAA,QAChB;AAAA,MACJ;AACA,UAAI,YAAY,EAAG,YAAW,IAAI,KAAK,IAAI;AAAA,IAC/C;AAEA,WAAO,EAAE,YAAY,aAAa;AAAA,EACtC;AAAA,EAEQ,sBAAqC;AACzC,UAAM,QAAQ,KAAK,IAAI,SAAS,eAAe;AAC/C,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,MAAM,MAAM,QAAQ,EAAE,SAAS,MAAM;AAE3C,UAAM,oBAAoB,oBAAI,IAAY;AAC1C,UAAM,WAAW;AACjB,QAAI;AACJ,YAAQ,IAAI,SAAS,KAAK,GAAG,OAAO,MAAM;AACtC,YAAM,KAAK,SAAS,EAAE,CAAC,GAAG,EAAE;AAC5B,YAAM,OAAO,EAAE,CAAC,EAAE,YAAY;AAC9B,UAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,MAAM,GAAG;AAC5F,0BAAkB,IAAI,EAAE;AAAA,MAC5B;AAAA,IACJ;AAEA,UAAM,eAAe,IAAI,QAAQ,UAAU;AAC3C,QAAI,iBAAiB,GAAI,QAAO;AAChC,UAAM,aAAa,IAAI,QAAQ,cAAc,YAAY;AACzD,QAAI,eAAe,GAAI,QAAO;AAC9B,UAAM,iBAAiB,IAAI,UAAU,cAAc,UAAU;AAE7D,UAAM,OAAO;AACb,QAAI,QAAQ;AACZ,YAAQ,IAAI,KAAK,KAAK,cAAc,OAAO,MAAM;AAC7C,YAAM,UAAU,mBAAmB,KAAK,EAAE,CAAC,CAAC;AAC5C,YAAM,OAAO,UAAU,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI;AAClD,YAAM,SAAU,QAAQ,MAAM,QAAQ,MACjC,QAAQ,MAAM,QAAQ,MACvB,kBAAkB,IAAI,IAAI;AAC9B,UAAI,OAAQ,QAAO;AACnB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMQ,gBACJ,MACA,SACA,WACA,cACA,WACM;AACN,QAAI,MAAM;AACV,QAAI,SAAS;AAEb,QAAI,SAAS;AACT,eAAS;AACT,aAAO;AACP,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,cAAM,QAAQ,aAAa,IAAI,CAAC,KAAK;AACrC,eAAO,KAAK,YAAY,QAAQ,CAAC,GAAG,GAAG,QAAQ,KAAK;AAAA,MACxD;AACA,aAAO;AAAA,IACX;AAEA,eAAW,OAAO,MAAM;AACpB;AACA,aAAO,WAAW,MAAM;AACxB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,cAAM,MAAM,IAAI,CAAC;AACjB,YAAI,QAAQ,QAAQ,QAAQ,OAAW;AACvC,eAAO,KAAK,WAAW,KAAK,GAAG,QAAQ,WAAW,SAAS;AAAA,MAC/D;AACA,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,WACJ,KACA,KACA,QACA,WACA,WACM;AACN,UAAM,SAAS,oBAAoB,GAAG;AACtC,UAAM,YAAY,UAAU,GAAG;AAC/B,UAAM,MAAM,cAAc,OAAO,WAAW,GAAG,IAAI;AACnD,UAAM,WAAW,UAAU,IAAI,GAAG,KAAK;AAEvC,QAAI,OAAO,QAAQ,UAAU;AACzB,UAAI,OAAO,SAAS,GAAG,GAAG;AACtB,eAAO,SAAS,MAAM,GAAG,MAAM,IAAI,WAAW,IAAI,OAAO,QAAQ,MAAM,EAAE,OAAO,GAAG;AAAA,MACvF;AACA,aAAO,KAAK,YAAY,IAAI,SAAS,GAAG,KAAK,QAAQ,QAAQ;AAAA,IACjE;AACA,QAAI,OAAO,QAAQ,UAAU;AACzB,aAAO,KAAK,YAAY,IAAI,SAAS,GAAG,KAAK,QAAQ,QAAQ;AAAA,IACjE;AACA,QAAI,OAAO,QAAQ,WAAW;AAC1B,aAAO,SAAS,MAAM,GAAG,MAAM,UAAU,WAAW,IAAI,OAAO,QAAQ,MAAM,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,IACrG;AACA,QAAI,eAAe,MAAM;AACrB,YAAM,UAAU,IAAI,QAAQ,IAAI,KAAK,YAAY;AACjD,UAAI,OAAO,SAAS,MAAM,GAAG;AACzB,cAAM,QAAQ,WAAW,IAAI,WAAY,cAAc,OAAO,YAAY;AAC1E,eAAO,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,IAAI,OAAO,KAAK,MAAM,EAAE,OAAO,MAAM;AAAA,MACpF;AACA,aAAO,KAAK,YAAY,IAAI,SAAS,GAAG,KAAK,QAAQ,QAAQ;AAAA,IACjE;AACA,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACnC,aAAO,KAAK,YAAY,OAAO,GAAG,GAAG,KAAK,QAAQ,QAAQ;AAAA,IAC9D;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,YAAY,MAAc,KAAa,QAAgB,OAAuB;AAClF,UAAM,SAAS,oBAAoB,GAAG;AACtC,UAAM,YAAY,QAAQ,IAAI,OAAO,KAAK,MAAM;AAEhD,QAAI,KAAK,qBAAqB,MAAM;AAChC,YAAM,QAAQ,cAAc,IAAI;AAChC,YAAM,WAAW,MAAM,SAAS,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,MAAM,SAAS,CAAC,MAAM,OAAO,WAAW,KAAK,KAAK;AAClH,YAAM,QAAQ,WAAW,0BAA0B;AACnD,aAAO,SAAS,MAAM,GAAG,MAAM,kBAAkB,SAAS,UAAU,KAAK,IAAI,KAAK;AAAA,IACtF;AAEA,QAAI,QAAQ,KAAK,eAAe,IAAI,IAAI;AACxC,QAAI,UAAU,QAAW;AACrB,cAAQ,KAAK,oBAAoB;AACjC,WAAK,oBAAoB,KAAK,IAAI;AAClC,WAAK,eAAe,IAAI,MAAM,KAAK;AAAA,IACvC;AACA,SAAK;AACL,WAAO,SAAS,MAAM,GAAG,MAAM,UAAU,SAAS,OAAO,KAAK;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,UAAkB,cAAsB,WAAmB,SAAyB;AACvG,QAAI,MAAM;AAEV,UAAM,SAAS,YAAY,KAAK,WAAW,IACrC,MAAM,oBAAoB,OAAO,CAAC,GAAG,SAAS,KAC9C;AAGN,UAAM,QAAQ;AACd,UAAM,WAAW,MAAM,KAAK,GAAG;AAC/B,QAAI,UAAU;AACV,YAAM,IAAI,UAAU,GAAG,SAAS,KAAK,IACjC,SAAS,CAAC,EAAE,QAAQ,eAAe,QAAQ,MAAM,GAAG,IACpD,IAAI,UAAU,SAAS,QAAQ,SAAS,CAAC,EAAE,MAAM;AAAA,IACzD,OAAO;AACH,YAAM,SAAS;AACf,YAAM,YAAY,OAAO,KAAK,GAAG;AACjC,UAAI,WAAW;AACX,cAAM,WAAW,UAAU,QAAQ,UAAU,CAAC,EAAE;AAChD,cAAM,IAAI,UAAU,GAAG,QAAQ,IAAI,mBAAmB,MAAM,QAAQ,IAAI,UAAU,QAAQ;AAAA,MAC9F;AAAA,IACJ;AAGA,UAAM,SAAS;AACf,UAAM,UAAU,IAAI,QAAQ,MAAM;AAClC,QAAI,YAAY,IAAI;AAChB,YAAM,cAAc;AACpB,YAAM,UAAU,YAAY,KAAK,GAAG;AACpC,UAAI,SAAS;AACT,cAAM,IAAI,UAAU,GAAG,QAAQ,KAAK,IAChC,gBAAgB,eAAe,iBAC/B,IAAI,UAAU,QAAQ,QAAQ,QAAQ,CAAC,EAAE,MAAM;AACnD,eAAO;AAAA,MACX;AACA,YAAM,IAAI,MAAM,8DAA8D;AAAA,IAClF;AACA,UAAM,QAAQ,IAAI,QAAQ,gBAAgB,OAAO;AACjD,QAAI,UAAU,IAAI;AACd,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACnF;AACA,UAAM,IAAI,UAAU,GAAG,UAAU,OAAO,MAAM,IAAI,eAAe,IAAI,UAAU,KAAK;AAGpF,UAAM,OAAO;AACb,UAAM,UAAU,KAAK,KAAK,GAAG;AAC7B,QAAI,WAAW,YAAY,KAAK,WAAW,KAAK,QAAQ,CAAC,EAAE,SAAS,MAAM,GAAG;AACzE,YAAM,IAAI,UAAU,GAAG,QAAQ,KAAK,IAChC,QAAQ,CAAC,EAAE,QAAQ,eAAe,QAAQ,MAAM,GAAG,IACnD,IAAI,UAAU,QAAQ,QAAQ,QAAQ,CAAC,EAAE,MAAM;AAAA,IACvD;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,WAAmB,QAAgB,aAA2B;AACrF,eAAW,SAAS,KAAK,gBAAgB;AACrC,YAAM,OAAO;AACb,YAAM,UAAU,KAAK,KAAK,MAAM,GAAG;AACnC,UAAI,CAAC,QAAS;AACd,YAAM,QAAQ,QAAQ,CAAC;AACvB,YAAM,YAAY,kBAAkB,KAAK,KAAK;AAC9C,UAAI,CAAC,aAAa,UAAU,CAAC,MAAM,UAAW;AAE9C,UAAI,MAAM,MAAM;AAChB,YAAM,IAAI,UAAU,GAAG,QAAQ,KAAK,IAChC,MAAM,QAAQ,eAAe,QAAQ,MAAM,GAAG,IAC9C,IAAI,UAAU,QAAQ,QAAQ,MAAM,MAAM;AAE9C,YAAM,SAAS;AACf,YAAM,YAAY,OAAO,KAAK,GAAG;AACjC,UAAI,WAAW;AACX,YAAI,UAAU,UAAU,CAAC;AACzB,YAAI,oBAAoB,KAAK,OAAO,GAAG;AACnC,oBAAU,QAAQ,QAAQ,qBAAqB,gBAAgB,WAAW,GAAG;AAAA,QACjF,WAAW,CAAC,OAAO,KAAK,OAAO,GAAG;AAC9B,oBAAU,QAAQ,QAAQ,MAAM,iBAAiB,WAAW,IAAI;AAAA,QACpE;AACA,cAAM,IAAI,UAAU,GAAG,UAAU,KAAK,IAAI,UAAU,IAAI,UAAU,UAAU,QAAQ,UAAU,CAAC,EAAE,MAAM;AAAA,MAC3G;AAEA,WAAK,IAAI,WAAW,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,CAAC;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEQ,iCAAuC;AAC3C,eAAWF,SAAQ,KAAK,oBAAoB;AACxC,YAAM,QAAQ,KAAK,IAAI,SAASA,KAAI;AACpC,UAAI,CAAC,MAAO;AACZ,UAAI,MAAM,MAAM,QAAQ,EAAE,SAAS,MAAM;AAEzC,YAAM,SAAS;AACf,YAAM,YAAY,OAAO,KAAK,GAAG;AACjC,UAAI,CAAC,aAAa,UAAU,CAAC,EAAE,SAAS,eAAe,EAAG;AAE1D,YAAM,SAAS,UAAU,CAAC,EAAE,QAAQ,WAAW,sBAAsB;AACrE,YAAM,IAAI,UAAU,GAAG,UAAU,KAAK,IAAI,SAAS,IAAI,UAAU,UAAU,QAAQ,UAAU,CAAC,EAAE,MAAM;AACtG,WAAK,IAAI,WAAWA,OAAM,OAAO,KAAK,KAAK,MAAM,CAAC;AAAA,IACtD;AAAA,EACJ;AACJ;;;AClkBA,YAAYG,SAAQ;AACpB,OAAOC,aAAY;;;ACMZ,SAAS,QAAQ,KAAa,KAAiD;AAClF,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,MAAI;AACJ,KAAG;AACC,WAAO,IAAI,KAAK;AAChB,cAAU,OAAO,QAAS;AAC1B,aAAS;AAAA,EACb,UAAU,OAAO,SAAU;AAC3B,SAAO,EAAE,OAAO,SAAS,IAAI;AACjC;AAaO,SAAS,SAAS,OAAyB;AAC9C,QAAM,MAAgB,CAAC;AACvB,SAAO,SAAS,KAAM;AAClB,QAAI,KAAM,QAAQ,MAAQ,GAAI;AAC9B,eAAW;AAAA,EACf;AACA,MAAI,KAAK,QAAQ,GAAI;AACrB,SAAO;AACX;AAkBO,SAAS,WAAW,KAAa,KAAa,KAA4B;AAC7E,QAAM,QAAQ,QAAQ,KAAK,GAAG;AAC9B,MAAI,MAAM,UAAU,IAAI,OAAQ,QAAO;AACvC,QAAM,SAAS,QAAQ,KAAK,MAAM,OAAO;AACzC,MAAI,OAAO,UAAU,OAAO,QAAQ,IAAI,OAAQ,QAAO;AAEvD,MAAI,cAAc;AAClB,MAAI,YAAY,OAAO;AACvB,MAAI,UAAU,OAAO,UAAU,OAAO;AACtC,MAAI,KAAK,MAAM;AACf,MAAI,MAAM,OAAO;AACjB,SAAO;AACX;AAGO,SAAS,YAAY,IAAY,SAAyB;AAC7D,QAAM,UAAU,SAAS,EAAE;AAC3B,QAAM,WAAW,SAAS,QAAQ,MAAM;AACxC,QAAM,SAAS,OAAO,MAAM,QAAQ,SAAS,SAAS,MAAM;AAC5D,UAAQ,QAAQ,CAAC,GAAG,MAAO,OAAO,CAAC,IAAI,CAAE;AACzC,WAAS,QAAQ,CAAC,GAAG,MAAO,OAAO,QAAQ,SAAS,CAAC,IAAI,CAAE;AAC3D,SAAO,OAAO,OAAO,CAAC,QAAQ,OAAO,CAAC;AAC1C;AAGO,SAAS,UAAU,KAAa,OAAe,WAA2B;AAC7E,QAAM,MAAM,QAAQ,YAAY;AAChC,MAAI,MAAM,IAAI,OAAQ,QAAO;AAC7B,SAAO,IAAI,SAAS,WAAW,OAAO,GAAG;AAC7C;AAOO,SAAS,sBAAsB,KAKpC;AACE,QAAM,SAAmB,CAAC;AAC1B,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,eAAe,IAAI;AAEvB,QAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,MAAI,MAAM;AACV,SAAO,WAAW,KAAK,KAAK,GAAG,GAAG;AAC9B,UAAM,IAAI;AACV,QAAI,IAAI,OAAO,KAAQ;AACnB,cAAQ,IAAI,aAAa,IAAI,SAAS;AACtC,eAAS,IAAI,aAAa,IAAI,YAAY,CAAC;AAAA,IAC/C,WAAW,IAAI,OAAO,IAAQ;AAC1B,YAAM,MAAM,IAAI,aAAa,IAAI,YAAY,CAAC;AAC9C,aAAO,KAAK,UAAU,KAAK,IAAI,YAAY,GAAG,GAAG,CAAC;AAAA,IACtD,WAAW,IAAI,OAAO,KAAQ;AAC1B,qBAAe,IAAI;AAAA,IACvB;AAAA,EACJ;AACA,SAAO,EAAE,QAAQ,OAAO,QAAQ,aAAa;AACjD;;;ADtFA,IAAM,eAAe,oBAAI,IAAY,CAAC,GAAM,GAAM,GAAM,GAAM,GAAM,GAAM,GAAM,GAAM,GAAM,GAAM,IAAM,EAAI,CAAC;AAE7G,IAAM,eAAe,MAAM;AAC3B,IAAM,gBAAgB,KAAK,MAAM;AAc1B,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA,EAmBrB,YAAYC,OAAc;AAf1B,SAAQ,kBAAuC,oBAAI,IAAI;AACvD,SAAQ,qBAA+B,CAAC;AAExC,SAAQ,mBAAkC;AAC1C,SAAQ,sBAAgC,CAAC;AACzC,SAAQ,qBAA6B;AACrC,SAAQ,sBAA8B;AACtC,SAAQ,sBAA8B;AACtC,SAAQ,iBAAsC,oBAAI,IAAI;AAiLtD;AAAA;AAAA;AAAA,SAAQ,eAAuB;AAzK3B,SAAK,aAAaA;AAClB,SAAK,WAAW,KAAK,IAAI,MAAM,IAAI,EAAE;AAErC,QAAI,CAAI,eAAWA,KAAI,GAAG;AACtB,YAAM,IAAI,MAAM,gCAAgCA,KAAI,EAAE;AAAA,IAC1D;AAEA,SAAK,MAAM,IAAIC,QAAOD,KAAI;AAE1B,QAAI,CAAC,KAAK,IAAI,SAAS,iBAAiB,GAAG;AACvC,YAAM,IAAI;AAAA,QACN;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,uBAAuB;AAAA,EAChC;AAAA;AAAA,EAGA,gBAA0B;AACtB,WAAO,CAAC,GAAG,KAAK,gBAAgB,KAAK,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBACI,WACA,MACA,UAAmC,CAAC,GAChC;AACJ,UAAM,EAAE,SAAS,gBAAgB,UAAU,IAAI;AAC/C,WAAO,sBAAsB,IAAI;AAEjC,UAAM,YAAY,KAAK,gBAAgB,IAAI,SAAS;AACpD,QAAI,CAAC,WAAW;AACZ,YAAM,IAAI,MAAM,uBAAuB,SAAS,8BAA8B;AAAA,IAClF;AAEA,UAAM,QAAQ,KAAK,IAAI,SAAS,SAAS;AACzC,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,kDAAkD,SAAS,IAAI;AAAA,IACnF;AAEA,UAAM,WAAW,MAAM,QAAQ;AAC/B,SAAK,2BAA2B;AAEhC,QAAI,aAAkC,oBAAI,IAAI;AAC9C,QAAI,eAAoC,oBAAI,IAAI;AAChD,QAAI,SAAwB;AAE5B,QAAI,kBAAkB,WAAW;AAC7B,YAAM,YAAY,KAAK,eAAe,QAAQ;AAC9C,mBAAa,UAAU;AACvB,qBAAe,UAAU;AACzB,eAAS,KAAK,YAAY;AAAA,IAC9B;AAEA,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK;AAAA,MAC7B,KAAK,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC;AAAA,OAC9C,mCAAS,WAAU;AAAA,IACvB,IAAI,CAAC;AAEL,UAAM,UAAU,KAAK,WAAW,MAAM,SAAS,YAAY,cAAc,MAAM;AAC/E,UAAM,EAAE,WAAW,SAAS,iBAAiB,IAAI,KAAK,gBAAgB,QAAQ;AAE9E,UAAM,WAAW,OAAO,MAAM,SAAS,UAAU,UAAU,aAAa,QAAQ,MAAM;AACtF,aAAS,KAAK,UAAU,GAAG,GAAG,SAAS;AACvC,YAAQ,KAAK,UAAU,SAAS;AAChC,aAAS,KAAK,UAAU,YAAY,QAAQ,QAAQ,OAAO;AAE3D,UAAM,aAAa,KAAK,UAAU,UAAU,IAAI,KAAK;AACrD,UAAM,QAAQ,QAAQ,UAAU,UAAU;AAC1C,eAAW,MAAM,kBAAkB;AAC/B,YAAM,QAAQ,KAAK;AACnB,eAAS,aAAa,SAAS,QAAQ,EAAE;AACzC,eAAS,aAAa,YAAY,QAAQ,CAAC;AAAA,IAC/C;AAKA,SAAK,gBAAgB,UAAU,YAAY,OAAO;AAElD,SAAK,IAAI,WAAW,WAAW,QAAQ;AAEvC,QAAI,KAAK,qBAAqB,QAAQ,KAAK,eAAe,GAAG;AACzD,WAAK,qBAAqB;AAAA,IAC9B;AAEA,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,UAAU,UAAU,IAAI,KAAK,CAAC;AAC9D,UAAM,UAAU;AAChB,SAAK,kBAAkB,WAAW,QAAQ,OAAO;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,YAA2B;AAC5B,UAAM,SAAS,cAAc,KAAK;AAClC,IAAG,kBAAc,QAAQ,KAAK,IAAI,SAAS,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,KAAK,IAAI,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAA+B;AACnC,UAAM,YAAY,KAAK,IAAI,SAAS,4BAA4B;AAChE,UAAM,cAAsC,CAAC;AAC7C,QAAI,WAAW;AACX,YAAM,OAAO,UAAU,QAAQ,EAAE,SAAS,MAAM;AAChD,YAAM,WAAW;AACjB,UAAI;AACJ,cAAQ,QAAQ,SAAS,KAAK,IAAI,OAAO,MAAM;AAC3C,oBAAY,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC;AAAA,MACnC;AAAA,IACJ;AAEA,UAAM,UAAU,KAAK,IAAI,SAAS,iBAAiB;AACnD,QAAI,SAAS;AACT,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,YAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,UAAI,MAAM;AACV,aAAO,WAAW,OAAO,KAAK,GAAG,GAAG;AAChC,cAAM,IAAI;AACV,YAAI,IAAI,OAAO,OAAU,IAAI,MAAM,EAAG;AAGtC,YAAI,IAAI,IAAI,YAAY;AACxB,cAAM,SAAS,MAAM,aAAa,CAAC;AACnC,aAAK;AACL,cAAM,MAAM,UAAU,OAAO,GAAG,MAAM;AACtC,aAAK,SAAS;AACd,cAAM,UAAU,MAAM,aAAa,CAAC;AACpC,aAAK;AACL,cAAM,OAAO,UAAU,OAAO,GAAG,OAAO;AAExC,YAAI,SAAS,YAAY,GAAG,KAAK;AACjC,YAAI,OAAO,WAAW,GAAG,EAAG,UAAS,OAAO,UAAU,CAAC;AAAA,iBAC9C,CAAC,OAAO,WAAW,KAAK,EAAG,UAAS,QAAQ;AACrD,YAAI,QAAQ;AACR,eAAK,gBAAgB,IAAI,MAAM,MAAM;AAAA,QACzC;AAAA,MACJ;AAAA,IACJ;AAEA,eAAW,KAAK,KAAK,IAAI,WAAW,GAAG;AACnC,UAAI,iDAAiD,KAAK,EAAE,SAAS,GAAG;AACpE,aAAK,mBAAmB,KAAK,EAAE,SAAS;AAAA,MAC5C;AAAA,IACJ;AAAA,EACJ;AAAA,EAQQ,6BAAmC;AACvC,QAAI,KAAK,eAAe,OAAO,KAAK,KAAK,qBAAqB,MAAM;AAChE;AAAA,IACJ;AACA,UAAM,QAAQ,KAAK,IAAI,SAAS,sBAAsB;AACtD,QAAI,CAAC,OAAO;AACR,WAAK,mBAAmB;AACxB;AAAA,IACJ;AACA,SAAK,mBAAmB,MAAM,QAAQ;AACtC,UAAM,SAAS,sBAAsB,KAAK,gBAAgB;AAC1D,SAAK,sBAAsB,OAAO;AAClC,SAAK,qBAAqB,OAAO;AACjC,SAAK,sBAAsB,OAAO;AAClC,SAAK,sBAAsB,OAAO;AAElC,SAAK,oBAAoB,QAAQ,CAAC,OAAO,UAAU;AAC/C,UAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACjC,aAAK,eAAe,IAAI,OAAO,KAAK;AAAA,MACxC;AAAA,IACJ,CAAC;AACD,SAAK,eAAe;AAAA,EACxB;AAAA,EAEQ,uBAA6B;AACjC,QAAI,KAAK,qBAAqB,QAAQ,KAAK,iBAAiB,EAAG;AAE/D,UAAM,uBAAuB,KAAK,oBAAoB,SAAS,KAAK;AAEpE,QAAI,WAAW,OAAO,MAAM,CAAC;AAC7B,aAAS,IAAI,sBAAsB,IAAI,KAAK,oBAAoB,QAAQ,KAAK;AACzE,YAAM,OAAO,KAAK,oBAAoB,CAAC;AACvC,YAAM,UAAU,OAAO,MAAM,IAAI,IAAI,KAAK,SAAS,CAAC;AACpD,cAAQ,CAAC,IAAI;AACb,cAAQ,cAAc,KAAK,QAAQ,CAAC;AACpC,cAAQ,MAAM,MAAM,GAAG,KAAK,SAAS,GAAG,SAAS;AACjD,iBAAW,OAAO,OAAO,CAAC,UAAU,YAAY,IAAQ,OAAO,CAAC,CAAC;AAAA,IACrE;AAEA,UAAM,MAAM,OAAO,MAAM,KAAK,iBAAiB,SAAS,SAAS,MAAM;AACvE,SAAK,iBAAiB,KAAK,KAAK,GAAG,GAAG,KAAK,mBAAmB;AAC9D,aAAS,KAAK,KAAK,KAAK,mBAAmB;AAC3C,SAAK,iBAAiB,KAAK,KAAK,KAAK,sBAAsB,SAAS,QAAQ,KAAK,mBAAmB;AAGpG,UAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,QAAI,MAAM;AACV,WAAO,WAAW,KAAK,KAAK,GAAG,GAAG;AAC9B,UAAI,IAAI,OAAO,KAAQ;AACnB,YAAI,cAAc,KAAK,oBAAoB,IAAI,SAAS;AACxD,YAAI,cAAc,KAAK,qBAAqB,IAAI,YAAY,CAAC;AAC7D;AAAA,MACJ;AACA,YAAM,IAAI;AAAA,IACd;AAEA,SAAK,IAAI,WAAW,wBAAwB,GAAG;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,UAA0F;AAC7G,UAAM,aAAa,oBAAI,IAAiC;AACxD,UAAM,eAAe,oBAAI,IAAoB;AAE7C,UAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,QAAI,MAAM;AACV,QAAI,MAAM;AACV,WAAO,WAAW,UAAU,KAAK,GAAG,GAAG;AACnC,YAAM,IAAI;AACV,UAAI,IAAI,OAAO,GAAM;AACjB,cAAM,SAAS,YAAY,IAAI,SAAS;AACxC;AAAA,MACJ;AACA,UAAI,CAAC,aAAa,IAAI,IAAI,EAAE,KAAK,IAAI,MAAM,EAAG;AAC9C,YAAM,MAAM,SAAS,aAAa,IAAI,SAAS;AAC/C,YAAM,KAAK,SAAS,aAAa,IAAI,YAAY,CAAC,IAAI;AACtD,UAAI,MAAM,EAAG;AAEb,UAAI,QAAQ,GAAG;AACX,YAAI,CAAC,aAAa,IAAI,GAAG,EAAG,cAAa,IAAI,KAAK,EAAE;AACpD;AAAA,MACJ;AACA,UAAI,YAAY,WAAW,IAAI,GAAG;AAClC,UAAI,CAAC,WAAW;AACZ,oBAAY,oBAAI,IAAI;AACpB,mBAAW,IAAI,KAAK,SAAS;AAAA,MACjC;AACA,gBAAU,IAAI,KAAK,UAAU,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,IAClD;AAEA,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,CAAC,KAAK,SAAS,KAAK,YAAY;AACvC,UAAI,OAAO;AACX,UAAI,YAAY;AAChB,iBAAW,CAAC,IAAI,KAAK,KAAK,WAAW;AACjC,YAAI,QAAQ,WAAW;AACnB,iBAAO;AACP,sBAAY;AAAA,QAChB;AAAA,MACJ;AACA,UAAI,YAAY,EAAG,YAAW,IAAI,KAAK,IAAI;AAAA,IAC/C;AAEA,WAAO,EAAE,YAAY,aAAa;AAAA,EACtC;AAAA,EAEQ,cAA6B;AACjC,UAAM,QAAQ,KAAK,IAAI,SAAS,eAAe;AAC/C,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,YAAY,MAAM,QAAQ;AAEhC,UAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,QAAI,MAAM;AACV,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,WAAO,WAAW,WAAW,KAAK,GAAG,GAAG;AACpC,YAAM,IAAI;AACV,UAAI,IAAI,OAAO,KAAQ;AACnB,oBAAY;AACZ,kBAAU;AACV;AAAA,MACJ;AACA,UAAI,IAAI,OAAO,KAAQ;AACnB,oBAAY;AACZ;AAAA,MACJ;AACA,UAAI,aAAa,IAAI,OAAO,MAAU,IAAI,OAAO,GAAG;AAChD,cAAM,WAAW,UAAU,aAAa,IAAI,YAAY,CAAC;AACzD,cAAM,SACD,YAAY,MAAM,YAAY,MAC9B,YAAY,MAAM,YAAY;AACnC,YAAI,OAAQ,QAAO;AACnB;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMQ,WACJ,MACA,SACA,YACA,cACA,QACM;AACN,UAAM,SAAmB,CAAC;AAC1B,UAAM,SAAS,KAAK,IAAI,KAAK,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC,IAAG,mCAAS,WAAU,GAAG,CAAC;AAChG,UAAM,UAAU,KAAK,IAAI,GAAG,SAAS,CAAC;AAEtC,UAAM,UAAU,CAACE,SAAgB,cAA8B;AAE3D,YAAM,SAAS,OAAO,MAAM,EAAE;AAC9B,aAAO,CAAC,IAAI;AACZ,aAAO,CAAC,IAAI;AACZ,aAAO,aAAaA,SAAQ,CAAC;AAC7B,aAAO,EAAE,IAAI;AACb,aAAO,EAAE,IAAI;AACb,aAAO,EAAE,IAAI;AACb,aAAO,aAAa,GAAG,EAAE;AACzB,aAAO,aAAa,SAAS,EAAE;AAC/B,aAAO,KAAK,MAAM;AAElB,iBAAW,QAAQ,WAAW;AAC1B,eAAO,KAAK,IAAI;AAAA,MACpB;AAAA,IACJ;AAEA,QAAI,SAAS;AACT,YAAM,QAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,cAAM,QAAQ,aAAa,IAAI,CAAC,KAAK;AACrC,cAAM,KAAK,KAAK,iBAAiB,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,MAC1D;AACA,cAAQ,GAAG,KAAK;AAAA,IACpB;AAEA,QAAI,SAAS,UAAU,IAAI;AAC3B,eAAW,OAAO,MAAM;AACpB,YAAM,QAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,cAAM,MAAM,IAAI,CAAC;AACjB,YAAI,QAAQ,QAAQ,QAAQ,OAAW;AACvC,cAAM,KAAK,KAAK,gBAAgB,KAAK,GAAG,YAAY,MAAM,CAAC;AAAA,MAC/D;AACA,cAAQ,QAAQ,KAAK;AACrB;AAAA,IACJ;AAEA,WAAO,OAAO,OAAO,MAAM;AAAA,EAC/B;AAAA,EAEQ,gBACJ,KACA,KACA,YACA,QACM;AACN,UAAM,YAAY,UAAU,GAAG;AAC/B,UAAM,MAAM,cAAc,OAAO,WAAW,GAAG,IAAI;AACnD,UAAM,WAAW,WAAW,IAAI,GAAG,KAAK;AAExC,QAAI,OAAO,QAAQ,UAAU;AACzB,UAAI,OAAO,SAAS,GAAG,KAAK,OAAO,UAAU,GAAG,KAAK,OAAO,gBAAgB,OAAO,cAAc;AAC7F,cAAM,UAAU,OAAO,MAAM,EAAE;AAC/B,gBAAQ,cAAc,KAAK,CAAC;AAC5B,gBAAQ,cAAc,UAAU,CAAC;AACjC,gBAAQ,aAAc,OAAO,IAAK,GAAG,CAAC;AACtC,eAAO,YAAY,GAAQ,OAAO;AAAA,MACtC;AACA,UAAI,OAAO,SAAS,GAAG,GAAG;AACtB,cAAM,UAAU,OAAO,MAAM,EAAE;AAC/B,gBAAQ,cAAc,KAAK,CAAC;AAC5B,gBAAQ,cAAc,UAAU,CAAC;AACjC,gBAAQ,cAAc,KAAK,CAAC;AAC5B,eAAO,YAAY,GAAQ,OAAO;AAAA,MACtC;AACA,aAAO,KAAK,iBAAiB,KAAK,UAAU,IAAI,SAAS,CAAC;AAAA,IAC9D;AACA,QAAI,OAAO,QAAQ,UAAU;AACzB,aAAO,KAAK,iBAAiB,KAAK,UAAU,IAAI,SAAS,CAAC;AAAA,IAC9D;AACA,QAAI,OAAO,QAAQ,WAAW;AAC1B,YAAM,UAAU,OAAO,MAAM,CAAC;AAC9B,cAAQ,cAAc,KAAK,CAAC;AAC5B,cAAQ,cAAc,UAAU,CAAC;AACjC,cAAQ,CAAC,IAAI,MAAM,IAAI;AACvB,aAAO,YAAY,GAAQ,OAAO;AAAA,IACtC;AACA,QAAI,eAAe,MAAM;AACrB,YAAM,UAAU,IAAI,QAAQ,IAAI,KAAK,YAAY;AACjD,UAAI,OAAO,SAAS,MAAM,GAAG;AACzB,cAAM,QAAQ,WAAW,IAAI,WAAY,WAAW,OAAO,SAAS;AACpE,cAAM,UAAU,OAAO,MAAM,EAAE;AAC/B,gBAAQ,cAAc,KAAK,CAAC;AAC5B,gBAAQ,cAAc,OAAO,CAAC;AAC9B,gBAAQ,cAAc,QAAQ,CAAC;AAC/B,eAAO,YAAY,GAAQ,OAAO;AAAA,MACtC;AACA,aAAO,KAAK,iBAAiB,KAAK,UAAU,IAAI,SAAS,CAAC;AAAA,IAC9D;AACA,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACnC,aAAO,KAAK,iBAAiB,KAAK,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D;AACA,WAAO,KAAK,iBAAiB,KAAK,UAAU,EAAE;AAAA,EAClD;AAAA,EAEQ,iBAAiB,KAAa,OAAe,MAAsB;AACvE,QAAI,KAAK,qBAAqB,MAAM;AAEhC,YAAMC,WAAU,OAAO,MAAM,KAAK,KAAK,SAAS,CAAC;AACjD,MAAAA,SAAQ,cAAc,KAAK,CAAC;AAC5B,MAAAA,SAAQ,cAAc,OAAO,CAAC;AAC9B,MAAAA,SAAQ,cAAc,KAAK,QAAQ,CAAC;AACpC,MAAAA,SAAQ,MAAM,MAAM,IAAI,KAAK,SAAS,GAAG,SAAS;AAClD,aAAO,YAAY,GAAQA,QAAO;AAAA,IACtC;AAEA,QAAI,QAAQ,KAAK,eAAe,IAAI,IAAI;AACxC,QAAI,UAAU,QAAW;AACrB,cAAQ,KAAK,oBAAoB;AACjC,WAAK,oBAAoB,KAAK,IAAI;AAClC,WAAK,eAAe,IAAI,MAAM,KAAK;AACnC,WAAK;AACL,WAAK;AAAA,IACT;AACA,SAAK;AAEL,UAAM,UAAU,OAAO,MAAM,EAAE;AAC/B,YAAQ,cAAc,KAAK,CAAC;AAC5B,YAAQ,cAAc,OAAO,CAAC;AAC9B,YAAQ,cAAc,OAAO,CAAC;AAC9B,WAAO,YAAY,GAAQ,OAAO;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAMQ,gBACJ,UACkE;AAClE,UAAM,mBAA6B,CAAC;AACpC,QAAI,YAAY;AAChB,QAAI,cAAc;AAClB,QAAI,UAAU;AAEd,UAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,QAAI,MAAM;AACV,WAAO,WAAW,UAAU,KAAK,GAAG,GAAG;AACnC,UAAI,IAAI,OAAO,GAAM;AACjB,YAAI,cAAc,GAAI,aAAY,IAAI;AAAA,MAC1C,WAAW,IAAI,MAAM,KAAQ,IAAI,MAAM,IAAM;AACzC,sBAAc,IAAI;AAAA,MACtB,WAAW,IAAI,OAAO,MAAQ,IAAI,QAAQ,GAAG;AACzC,kBAAU,IAAI;AAAA,MAClB,WAAW,IAAI,OAAO,OAAU,IAAI,OAAO,IAAI;AAC3C,yBAAiB,KAAK,IAAI,SAAS;AAAA,MACvC;AACA,YAAM,IAAI;AAAA,IACd;AAEA,QAAI,cAAc,IAAI;AAElB,YAAM,WAAW,WAAW,IAAI,UAAU,SAAS;AACnD,aAAO,EAAE,WAAW,UAAU,SAAS,UAAU,iBAAiB;AAAA,IACtE;AAKA,UAAM,UAAU,eAAe,IAAI,cAAe,WAAW,IAAI,UAAU,SAAS;AAEpF,WAAO,EAAE,WAAW,SAAS,iBAAiB;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAgB,UAAkB,YAAoB,SAAuB;AACjF,UAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,QAAI,MAAM;AACV,WAAO,WAAW,UAAU,KAAK,GAAG,GAAG;AACnC,UAAI,IAAI,OAAO,OAAU,IAAI,OAAO,IAAI;AACpC,iBAAS,aAAa,YAAY,IAAI,YAAY,EAAE;AACpD,iBAAS,aAAa,SAAS,IAAI,YAAY,EAAE;AACjD;AAAA,MACJ;AACA,YAAM,IAAI;AAAA,IACd;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,WAAmB,QAAgB,SAAuB;AAChF,eAAWH,SAAQ,KAAK,oBAAoB;AACxC,YAAM,QAAQ,KAAK,IAAI,SAASA,KAAI;AACpC,UAAI,CAAC,MAAO;AACZ,YAAM,MAAM,OAAO,KAAK,MAAM,QAAQ,CAAC;AAEvC,YAAM,MAAoB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,EAAE;AACpF,UAAI,MAAM;AACV,UAAI,UAAU;AACd,UAAI,mBAAmB;AAEvB,aAAO,WAAW,KAAK,KAAK,GAAG,GAAG;AAC9B,cAAM,IAAI;AAEV,YAAI,IAAI,OAAO,OAAU,IAAI,OAAO,KAAK,CAAC,kBAAkB;AAExD,cAAI,IAAI,YAAY,KAAK,IAAI,QAAQ;AACjC,kBAAM,IAAI,IAAI,IAAI,YAAY,CAAC;AAC/B,iBAAK,IAAI,OAAU,GAAG;AAClB,kBAAI,IAAI,YAAY,CAAC,IAAI,IAAI;AAC7B,wBAAU;AAAA,YACd;AAAA,UACJ;AACA,6BAAmB;AAAA,QACvB;AAEA,YAAI,IAAI,OAAO,OAAU,IAAI,OAAO,IAAI;AAEpC,gBAAM,MAAM,IAAI,aAAa,IAAI,YAAY,CAAC;AAC9C,gBAAM,YAAY,IAAI,YAAY;AAClC,gBAAM,WAAW,YAAY,MAAM;AACnC,gBAAM,OAAO,UAAU,KAAK,WAAW,GAAG;AAC1C,cAAI,SAAS,aAAa,WAAW,MAAM,IAAI,QAAQ;AACnD,gBAAI,aAAa,QAAQ,WAAW,CAAC;AACrC,gBAAI,aAAa,SAAS,WAAW,EAAE;AACvC,sBAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,SAAS;AACT,aAAK,IAAI,WAAWA,OAAM,GAAG;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;AACJ;","names":["Buffer","path","path","val","fs","archiver","Readable","archiver","Readable","fs","AdmZip","path","AdmZip","match","fs","AdmZip","path","AdmZip","rowNum","payload"]}
1
+ {"version":3,"sources":["../../src/BigBuffer.ts","../../src/ExcelReaderAbstract.ts","../../src/BiffReaderWriter.ts","../../src/XlsbReader.ts","../../src/XlsxReader.ts","../../src/xmlUtils.ts","../../src/ReaderFactory.ts","../../src/XlsbWriter.ts","../../src/Formats.ts","../../src/writerHelpers.ts","../../src/StreamingSheetState.ts","../../src/XlsxWriter.ts","../../src/XlsxUpdater.ts","../../src/atomicFile.ts","../../src/streamingZip.ts","../../src/XlsbUpdater.ts","../../src/biff12Utils.ts","../../src/ExcelConverter.ts"],"sourcesContent":["import { Buffer } from 'buffer';\n\nexport class BigBuffer {\n private chunkSize: number;\n private chunks: Buffer[];\n private currentBuffer: Buffer;\n private cursor: number;\n\n constructor(chunkSize: number = 65536) {\n this.chunkSize = chunkSize;\n this.chunks = [];\n this.currentBuffer = Buffer.alloc(chunkSize);\n this.cursor = 0;\n }\n\n ensureCapacity(size: number): void {\n if (this.cursor + size > this.chunkSize) {\n this._flush();\n }\n }\n\n private _ensureCapacity(size: number): void {\n this.ensureCapacity(size);\n }\n\n private _flush(): void {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n }\n\n write(buffer: Buffer): void {\n let len = buffer.length;\n let offset = 0;\n\n while (len > 0) {\n let available = this.chunkSize - this.cursor;\n if (available === 0) {\n this._flush();\n available = this.chunkSize;\n }\n\n const toWrite = Math.min(len, available);\n buffer.copy(this.currentBuffer, this.cursor, offset, offset + toWrite);\n\n this.cursor += toWrite;\n offset += toWrite;\n len -= toWrite;\n }\n }\n\n writeByte(val: number): void {\n this._ensureCapacity(1);\n this.currentBuffer[this.cursor] = val;\n this.cursor++;\n }\n\n writeUnsafeByte(val: number): void {\n this.currentBuffer[this.cursor++] = val;\n }\n\n writeInt32LE(val: number): void {\n this._ensureCapacity(4);\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeUnsafeInt32LE(val: number): void {\n this.currentBuffer.writeInt32LE(val, this.cursor);\n this.cursor += 4;\n }\n\n writeDoubleLE(val: number): void {\n this._ensureCapacity(8);\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeUnsafeDoubleLE(val: number): void {\n this.currentBuffer.writeDoubleLE(val, this.cursor);\n this.cursor += 8;\n }\n\n writeString(str: string): void {\n const byteLength = Buffer.byteLength(str, 'utf8');\n\n if (this.cursor + byteLength <= this.chunkSize) {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n return;\n }\n\n this._flush();\n\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf8'));\n } else {\n this.cursor += this.currentBuffer.write(str, this.cursor, 'utf8');\n }\n }\n\n writeUtf16LE(str: string): void {\n const byteLength = str.length * 2;\n\n if (this.cursor + byteLength <= this.chunkSize) {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n return;\n }\n\n this._flush();\n if (byteLength > this.chunkSize) {\n this.chunks.push(Buffer.from(str, 'utf16le'));\n } else {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.currentBuffer[this.cursor++] = code & 0xFF;\n this.currentBuffer[this.cursor++] = (code >> 8) & 0xFF;\n }\n }\n }\n\n getChunks(): Buffer[] {\n if (this.cursor > 0) {\n this.chunks.push(this.currentBuffer.subarray(0, this.cursor));\n this.currentBuffer = Buffer.alloc(this.chunkSize);\n this.cursor = 0;\n }\n return this.chunks;\n }\n\n reset(): void {\n this.chunks = [];\n this.cursor = 0;\n }\n}\n\nexport default BigBuffer;\n","import { CellValue } from './Formats';\n\n/**\n * Shared reader surface for XLSB and XLSX.\n * Always use `await reader.read()` — both formats are async in v2+.\n */\nexport abstract class ExcelReaderAbstract {\n fieldCount: number = 0;\n rowCount: number = 0;\n actualSheetName: string = '';\n resultsCount: number = 0;\n\n protected _oaEpoch: number;\n\n constructor() {\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n /** Open a workbook file. */\n abstract open(path: string, readSharedStrings?: boolean, updateMode?: boolean): Promise<void>;\n\n async close(): Promise<void> {\n // cleanup if needed\n }\n\n /**\n * Advance to the next row.\n * @returns true if a row is available; false at EOF\n */\n abstract read(): Promise<boolean>;\n\n /** Worksheet names in workbook order. */\n abstract getSheetNames(): string[];\n\n /** Cell value for column index `i` of the current row (0-based). */\n abstract getValue(i: number): CellValue;\n\n dispose(): void {\n // cleanup\n }\n\n getDateTimeFromOaDate(oaDate: number): Date {\n const ms = oaDate * 86400000 + this._oaEpoch;\n return new Date(ms);\n }\n}\n\nexport default ExcelReaderAbstract;\n","export class BiffReaderWriter {\n private buffer: Buffer;\n private pos: number;\n private length: number;\n\n _isSheet: boolean = false;\n _workbookId: number = 0;\n _recId: string | null = null;\n _workbookName: string | null = null;\n\n private _inCellXf: boolean = false;\n private _inNumberFormat: boolean = false;\n private _numberFormatIndex: number = 0;\n private _format: number = 0;\n private _formatString: string | null = null;\n\n _sharedStringValue: string | null = null;\n _sharedStringUniqueCount: number = 0;\n\n _cellType: number = 0;\n _intValue: number = 0;\n _doubleVal: number = 0.0;\n _boolValue: boolean = false;\n _stringValue: string | null = null;\n _columnNum: number = -1;\n _xfIndex: number = 0;\n _readCell: boolean = false;\n _rowIndex: number = -1;\n\n // Start of the current record data (excluding ID and Length)\n private _recordStart: number = 0;\n\n _xfIndexToNumFmtId: number[] = [];\n _customNumFmts: Set<number> = new Set();\n\n constructor(buffer: Buffer) {\n if (!Buffer.isBuffer(buffer)) {\n throw new Error(\"BiffReaderWriter expects a Buffer\");\n }\n this.buffer = buffer;\n this.pos = 0;\n this.length = buffer.length;\n }\n\n private _tryReadVariableValue(): number | null {\n if (this.pos >= this.length) return null;\n\n const b1 = this.buffer[this.pos++];\n let value = (b1 & 0x7F) >>> 0;\n\n if ((b1 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b2 = this.buffer[this.pos++];\n value = (((b2 & 0x7F) << 7) | value) >>> 0;\n\n if ((b2 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b3 = this.buffer[this.pos++];\n value = (((b3 & 0x7F) << 14) | value) >>> 0;\n\n if ((b3 & 0x80) === 0) return value;\n\n if (this.pos >= this.length) return null;\n const b4 = this.buffer[this.pos++];\n value = (((b4 & 0x7F) << 21) | value) >>> 0;\n\n return value;\n }\n\n private _getDWord(offset: number): number {\n return this.buffer.readUInt32LE(this._recordStart + offset);\n }\n\n private _getInt32(offset: number): number {\n return this.buffer.readInt32LE(this._recordStart + offset);\n }\n\n private _getWord(offset: number): number {\n return this.buffer.readUInt16LE(this._recordStart + offset);\n }\n\n private _getByte(offset: number): number {\n return this.buffer[this._recordStart + offset];\n }\n\n private _getDouble(offset: number): number {\n return this.buffer.readDoubleLE(this._recordStart + offset);\n }\n\n private _getString(offset: number, length: number): string {\n const start = this._recordStart + offset;\n const end = start + (length * 2);\n if (end > this.buffer.length) return \"\";\n return this.buffer.toString('utf16le', start, end);\n }\n\n private _getNullableString(offsetRef: { val: number }): string | null {\n const length = this._getDWord(offsetRef.val);\n offsetRef.val += 4;\n\n if (length === 0xFFFFFFFF) return null;\n\n const str = this._getString(offsetRef.val, length);\n offsetRef.val += (length * 2);\n return str;\n }\n\n readWorkbook(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._isSheet = false;\n\n if (recordId === 0x9C) {\n this._workbookId = this._getDWord(4);\n\n const offsetRef = { val: 8 };\n this._recId = this._getNullableString(offsetRef);\n\n const nameLength = this._getDWord(offsetRef.val);\n this._workbookName = this._getString(offsetRef.val + 4, nameLength);\n this._isSheet = true;\n }\n\n return true;\n }\n\n readSharedStrings(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._sharedStringValue = null;\n\n if (recordId === 0x13) {\n const length = this._getDWord(1);\n this._sharedStringValue = this._getString(5, length);\n }\n else if (recordId === 159) {\n this._sharedStringUniqueCount = this._getDWord(4);\n }\n\n return true;\n }\n\n readStyles(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n const _cellXfStart = 0x269;\n const _cellXfEnd = 0x26a;\n const _numberFormatStart = 0x267;\n const _numberFormatEnd = 0x268;\n const _xf = 0x2f;\n const _numberFormat = 0x2c;\n\n switch (recordId) {\n case _cellXfStart:\n this._inCellXf = true;\n break;\n case _cellXfEnd:\n this._inCellXf = false;\n break;\n case _numberFormatStart:\n this._inNumberFormat = true;\n break;\n case _numberFormatEnd:\n this._inNumberFormat = false;\n break;\n\n case _xf:\n if (this._inCellXf) {\n this._numberFormatIndex = this._getWord(2);\n this._xfIndexToNumFmtId.push(this._numberFormatIndex);\n }\n break;\n\n case _numberFormat:\n if (this._inNumberFormat) {\n this._format = this._getWord(0);\n const length = this._getDWord(2);\n this._formatString = this._getString(6, length);\n\n const code = this._formatString.toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n this._customNumFmts.add(this._format);\n }\n }\n break;\n }\n\n return true;\n }\n\n private _getRkNumber(offset: number): number {\n const flags = this._getByte(offset);\n let result = 0;\n\n if ((flags & 0x02) !== 0) {\n const intVal = this._getInt32(offset);\n result = intVal >> 2;\n } else {\n const raw = this._getInt32(offset);\n const highBits = (raw & 0xFFFFFFFC);\n\n // Need to construct a double from high bits.\n // Since we can't easily write to a reused buffer without risk,\n // we'll just alloc 8 bytes here. It's rare for RK to be double.\n // Alternatively, we could reuse a small buffer if we cared enough.\n const dBuf = Buffer.allocUnsafe(8);\n dBuf.writeInt32LE(0, 0);\n dBuf.writeInt32LE(highBits, 4);\n\n result = dBuf.readDoubleLE(0);\n }\n\n if ((flags & 0x01) !== 0) {\n result /= 100;\n }\n\n return result;\n }\n\n readWorksheet(): boolean {\n const recordId = this._tryReadVariableValue();\n const recordLength = this._tryReadVariableValue();\n\n if (recordId === null || recordLength === null) return false;\n\n const startPos = this.pos;\n if (startPos + recordLength > this.length) return false;\n\n this._recordStart = startPos;\n this.pos += recordLength;\n\n this._readCell = false;\n this._columnNum = -1;\n\n const _row = 0x00;\n const _blank = 0x01;\n const _number = 0x02;\n const _boolError = 0x03;\n const _bool = 0x04;\n const _float = 0x05;\n const _string = 0x06;\n const _sharedString = 0x07;\n const _formulaString = 0x08;\n const _formulaNumber = 0x09;\n const _formulaBool = 0x0a;\n const _formulaError = 0x0b;\n\n switch (recordId) {\n case _row:\n this._rowIndex = this._getInt32(0);\n break;\n\n case _blank:\n case _boolError:\n case _formulaError:\n this._readCell = true;\n this._cellType = 0;\n break;\n\n case _number:\n this._doubleVal = this._getRkNumber(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _bool:\n case _formulaBool:\n this._boolValue = (this._getByte(8) === 1);\n this._readCell = true;\n this._cellType = 4;\n break;\n\n case _formulaNumber:\n case _float:\n this._doubleVal = this._getDouble(8);\n this._readCell = true;\n this._cellType = 3;\n break;\n\n case _string:\n case _formulaString:\n {\n const length = this._getDWord(8);\n this._stringValue = this._getString(12, length);\n this._readCell = true;\n this._cellType = 5;\n break;\n }\n\n case _sharedString:\n this._intValue = this._getDWord(8);\n this._readCell = true;\n this._cellType = 2;\n break;\n }\n\n if (this._readCell) {\n this._columnNum = this._getDWord(0);\n this._xfIndex = this._getDWord(4) & 0xffffff;\n }\n\n return true;\n }\n}\n\nexport default BiffReaderWriter;\n","import AdmZip from 'adm-zip';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { BiffReaderWriter } from './BiffReaderWriter';\nimport { CellValue } from './Formats';\n\ninterface SheetInfo {\n name: string;\n rId: string;\n path: string | null;\n}\n\nexport class XlsbReader extends ExcelReaderAbstract {\n private zip: AdmZip | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n\n private _currentSheetIndex: number = -1;\n private _reader: BiffReaderWriter | null = null;\n private _currentRow: CellValue[] = [];\n private _pendingRowIndex: number = -1;\n private _eof: boolean = false;\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> | null = null;\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n this.zip = new AdmZip(path);\n\n const wbEntry = this.zip.getEntry('xl/workbook.bin');\n if (wbEntry) {\n const buf = wbEntry.getData();\n const reader = new BiffReaderWriter(buf);\n while (reader.readWorkbook()) {\n if (reader._isSheet) {\n const name = reader._workbookName!;\n const rId = reader._recId!;\n this.sheetNames.push(name);\n this.sheets.push({ name, rId, path: null });\n }\n }\n }\n\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.bin.rels');\n if (relsEntry) {\n const xml = relsEntry.getData().toString('utf8');\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n const rIdToTarget: Record<string, string> = {};\n while ((match = relRegex.exec(xml)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n\n for (const sheet of this.sheets) {\n let target = rIdToTarget[sheet.rId];\n if (target) {\n if (target.startsWith('/')) target = target.substring(1);\n if (!target.startsWith('xl/')) target = 'xl/' + target;\n sheet.path = target;\n }\n }\n }\n\n if (readSharedStrings) {\n const ssPath = 'xl/sharedStrings.bin';\n if (this.zip.getEntry(ssPath)) {\n this._readSharedStrings(ssPath);\n }\n }\n\n const stylesPath = 'xl/styles.bin';\n if (this.zip.getEntry(stylesPath)) {\n this._readStyles(stylesPath);\n }\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n }\n\n private _readSharedStrings(path: string): void {\n const entry = this.zip!.getEntry(path);\n if (!entry) return;\n const reader = new BiffReaderWriter(entry.getData());\n\n while (reader.readSharedStrings()) {\n if (reader._sharedStringValue !== null) {\n this.sharedStrings.push(reader._sharedStringValue);\n }\n }\n }\n\n private _readStyles(path: string): void {\n const entry = this.zip!.getEntry(path);\n if (!entry) return;\n\n const reader = new BiffReaderWriter(entry.getData());\n while (reader.readStyles()) {\n // just consume\n }\n\n this.xfIdToNumFmtId = reader._xfIndexToNumFmtId;\n this.customDateFormats = reader._customNumFmts;\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n if (!this._initSheet(0)) return false;\n }\n\n if (this._eof) return false;\n\n this._currentRow = [];\n\n while (true) {\n const hasRecord = this._reader!.readWorksheet();\n if (!hasRecord) {\n this._eof = true;\n return true;\n }\n\n if (this._reader!._rowIndex !== -1 && this._reader!._rowIndex !== this._pendingRowIndex) {\n this._pendingRowIndex = this._reader!._rowIndex;\n return true;\n }\n\n if (this._reader!._readCell) {\n const col = this._reader!._columnNum;\n let val: CellValue = null;\n switch (this._reader!._cellType) {\n case 2:\n val = this.sharedStrings[this._reader!._intValue];\n break;\n case 3: {\n val = this._reader!._doubleVal;\n\n const xfIndex = this._reader!._xfIndex;\n let numFmtId = 0;\n if (this.xfIdToNumFmtId && xfIndex < this.xfIdToNumFmtId.length) {\n numFmtId = this.xfIdToNumFmtId[xfIndex];\n }\n\n const isDate = (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n (this.customDateFormats && this.customDateFormats.has(numFmtId));\n\n if (isDate) {\n try {\n val = this.getDateTimeFromOaDate(val as number);\n } catch {\n // ignore date conversion errors\n }\n }\n break;\n }\n case 4:\n val = this._reader!._boolValue;\n break;\n case 5:\n val = this._reader!._stringValue;\n break;\n default:\n val = null;\n }\n\n this._currentRow[col] = val;\n if (col >= this.fieldCount) this.fieldCount = col + 1;\n }\n }\n }\n\n private _initSheet(index: number): boolean {\n if (index >= this.sheets.length) return false;\n const sheet = this.sheets[index];\n const entry = this.zip!.getEntry(sheet.path!);\n if (!entry) return false;\n\n this._reader = new BiffReaderWriter(entry.getData());\n this._eof = false;\n this._pendingRowIndex = -1;\n\n while (this._reader.readWorksheet()) {\n if (this._reader._rowIndex !== -1) {\n this._pendingRowIndex = this._reader._rowIndex;\n return true;\n }\n }\n\n this._eof = true;\n return false;\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsbReader;\n","import yauzl, { ZipFile, Entry } from 'yauzl';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\nimport { CellValue } from './Formats';\nimport { unescapeXml, columnLetterToIndex, parseSharedStringsXml } from './xmlUtils';\n\ninterface SheetInfo {\n name: string;\n sheetId: string;\n rId: string;\n path: string;\n}\n\nexport class XlsxReader extends ExcelReaderAbstract {\n private zipfile: ZipFile | null = null;\n private sharedStrings: string[] = [];\n private sheetNames: string[] = [];\n private sheets: SheetInfo[] = [];\n private entries: Map<string, Entry> = new Map();\n\n private _currentSheetIndex: number = -1;\n private _sheetXml: string | null = null;\n private _xmlPos: number = 0;\n\n private _currentRow: CellValue[] = [];\n\n xfIdToNumFmtId: number[] = [];\n customDateFormats: Set<number> = new Set();\n\n constructor() {\n super();\n }\n\n async open(path: string, readSharedStrings: boolean = true): Promise<void> {\n return new Promise((resolve, reject) => {\n yauzl.open(path, { lazyEntries: true, autoClose: false }, async (err, zipfile) => {\n if (err) return reject(err);\n this.zipfile = zipfile;\n\n this.entries = new Map();\n\n zipfile.on('entry', (entry: Entry) => {\n this.entries.set(entry.fileName, entry);\n zipfile.readEntry();\n });\n\n zipfile.on('end', async () => {\n try {\n const wbRelsContent = await this._readZipEntryContent('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (wbRelsContent) {\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n while ((match = relRegex.exec(wbRelsContent)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n }\n\n const wbContent = await this._readZipEntryContent('xl/workbook.xml');\n if (wbContent) {\n const sheetRegex = /<sheet[^>]*name=\"([^\"]*)\"[^>]*sheetId=\"([^\"]*)\"[^>]*r:id=\"([^\"]*)\"/g;\n let match;\n while ((match = sheetRegex.exec(wbContent)) !== null) {\n const name = unescapeXml(match[1]);\n const sheetId = match[2];\n const rId = match[3];\n\n const target = rIdToTarget[rId];\n let fullPath = target;\n if (!fullPath.startsWith('xl/')) {\n fullPath = 'xl/' + fullPath;\n }\n\n this.sheetNames.push(name);\n this.sheets.push({ name, sheetId, rId, path: fullPath });\n }\n }\n\n if (readSharedStrings) {\n const ssContent = await this._readZipEntryContent('xl/sharedStrings.xml');\n if (ssContent) {\n this._parseSharedStrings(ssContent);\n }\n }\n\n const stylesContent = await this._readZipEntryContent('xl/styles.xml');\n if (stylesContent) {\n this._parseStyles(stylesContent);\n }\n\n this.resultsCount = this.sheets.length;\n this._currentSheetIndex = -1;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n\n zipfile.readEntry();\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.zipfile) {\n this.zipfile.close();\n }\n }\n\n private async _readZipEntryContent(path: string): Promise<string | null> {\n const entry = this.entries.get(path);\n if (!entry) return null;\n\n return new Promise((resolve, reject) => {\n this.zipfile!.openReadStream(entry, (err, readStream) => {\n if (err) return reject(err);\n\n const chunks: Buffer[] = [];\n readStream!.on('data', (chunk: Buffer) => chunks.push(chunk));\n readStream!.on('end', () => {\n resolve(Buffer.concat(chunks).toString('utf8'));\n });\n readStream!.on('error', reject);\n });\n });\n }\n\n private _parseSharedStrings(xml: string): void {\n this.sharedStrings = parseSharedStringsXml(xml);\n }\n\n private _parseStyles(xml: string): void {\n const numFmtRegex = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let match;\n this.customDateFormats = new Set();\n\n while ((match = numFmtRegex.exec(xml)) !== null) {\n const id = parseInt(match[1]);\n const code = match[2];\n if (code.toLowerCase().includes('yy') || code.toLowerCase().includes('mm') || code.toLowerCase().includes('dd') || code.toLowerCase().includes('h:mm')) {\n this.customDateFormats.add(id);\n }\n }\n\n this.xfIdToNumFmtId = [];\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart !== -1) {\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd !== -1) {\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n const xfRegex = /<xf\\s+[^>]*numFmtId=\"(\\d+)\"/g;\n while ((match = xfRegex.exec(cellXfsContent)) !== null) {\n const numFmtId = parseInt(match[1]);\n this.xfIdToNumFmtId.push(numFmtId);\n }\n }\n }\n }\n\n getSheetNames(): string[] {\n return this.sheetNames;\n }\n\n async read(): Promise<boolean> {\n if (this._currentSheetIndex === -1) {\n this._currentSheetIndex = 0;\n await this._initSheet(this._currentSheetIndex);\n }\n\n if (this._readNextRow()) {\n return true;\n } else {\n return false;\n }\n }\n\n private async _initSheet(index: number): Promise<void> {\n if (index >= this.sheets.length) return;\n const sheet = this.sheets[index];\n this.actualSheetName = sheet.name;\n\n this._sheetXml = await this._readZipEntryContent(sheet.path);\n\n if (!this._sheetXml) {\n this._sheetXml = \"\";\n }\n\n this._xmlPos = 0;\n const sd = this._sheetXml.indexOf('<sheetData>');\n if (sd !== -1) this._xmlPos = sd + 11;\n }\n\n private _readNextRow(): boolean {\n if (!this._sheetXml) return false;\n\n const rowStart = this._sheetXml.indexOf('<row', this._xmlPos);\n if (rowStart === -1) return false;\n\n const rowEnd = this._sheetXml.indexOf('</row>', rowStart);\n if (rowEnd === -1) return false;\n\n this._xmlPos = rowEnd + 6;\n this._parseRowByIndex(rowStart, rowEnd);\n return true;\n }\n\n private _parseRowByIndex(rowStart: number, rowEnd: number): void {\n this._currentRow = [];\n const xml = this._sheetXml!;\n\n let pos = xml.indexOf('>', rowStart) + 1;\n\n while (pos < rowEnd) {\n const cStart = xml.indexOf('<c', pos);\n if (cStart === -1 || cStart >= rowEnd) break;\n\n const nextTagClose = xml.indexOf('>', cStart);\n\n let colIndex = -1;\n let type = 'n';\n let styleIndex = 0;\n\n let currentIdx = cStart + 2;\n while (currentIdx < nextTagClose) {\n while (xml.charCodeAt(currentIdx) <= 32 && currentIdx < nextTagClose) currentIdx++;\n if (currentIdx >= nextTagClose) break;\n\n const keyStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 61 && currentIdx < nextTagClose) currentIdx++;\n const key = xml.substring(keyStart, currentIdx);\n\n currentIdx++;\n\n if (xml.charCodeAt(currentIdx) === 34) {\n currentIdx++;\n const valStart = currentIdx;\n while (xml.charCodeAt(currentIdx) !== 34 && currentIdx < nextTagClose) currentIdx++;\n const val = xml.substring(valStart, currentIdx);\n currentIdx++;\n\n if (key === 'r') {\n let letterLen = 0;\n while (letterLen < val.length && val.charCodeAt(letterLen) >= 65) letterLen++;\n colIndex = columnLetterToIndex(val.substring(0, letterLen));\n } else if (key === 't') {\n type = val;\n } else if (key === 's') {\n styleIndex = parseInt(val, 10);\n }\n }\n }\n\n let val: string | null = null;\n if (xml.charCodeAt(nextTagClose - 1) === 47) {\n pos = nextTagClose + 1;\n } else {\n const cEnd = xml.indexOf('</c>', nextTagClose);\n const cellContentEnd = (cEnd !== -1 && cEnd < rowEnd) ? cEnd : rowEnd;\n\n const vStart = xml.indexOf('<v>', nextTagClose);\n if (vStart !== -1 && vStart < cellContentEnd) {\n const vInnerStart = vStart + 3;\n const vEnd = xml.indexOf('</v>', vInnerStart);\n if (vEnd !== -1 && vEnd < cellContentEnd) {\n val = xml.substring(vInnerStart, vEnd);\n }\n } else {\n if (type === 'inlineStr') {\n const tStart = xml.indexOf('<t', nextTagClose);\n if (tStart !== -1 && tStart < cellContentEnd) {\n const tContentStart = xml.indexOf('>', tStart) + 1;\n const tEnd = xml.indexOf('</t>', tContentStart);\n if (tEnd !== -1 && tEnd < cellContentEnd) {\n val = xml.substring(tContentStart, tEnd);\n }\n }\n }\n }\n pos = cellContentEnd + 4;\n }\n\n let finalVal: any = null;\n if (val !== null) {\n if (type === 's') {\n const idx = parseInt(val, 10);\n finalVal = this.sharedStrings[idx];\n } else if (type === 'b') {\n finalVal = (val === '1' || val === 'true');\n } else if (type === 'inlineStr') {\n finalVal = unescapeXml(val);\n } else if (type === 'n' || type === '') {\n finalVal = parseFloat(val);\n\n if (styleIndex > 0 && this.xfIdToNumFmtId) {\n let numFmtId = 0;\n if (styleIndex < this.xfIdToNumFmtId.length) {\n numFmtId = this.xfIdToNumFmtId[styleIndex];\n }\n\n const isDate = (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47) ||\n (this.customDateFormats && this.customDateFormats.has(numFmtId));\n\n if (isDate) {\n try {\n finalVal = this.getDateTimeFromOaDate(finalVal);\n } catch {\n // ignore date conversion errors\n }\n }\n }\n }\n }\n\n if (colIndex !== -1) {\n this._currentRow[colIndex] = finalVal;\n if (colIndex >= this.fieldCount) this.fieldCount = colIndex + 1;\n }\n }\n }\n\n getValue(i: number): CellValue {\n if (i < 0 || i >= this._currentRow.length) return null;\n return this._currentRow[i];\n }\n}\n\nexport default XlsxReader;\n","/**\n * Shared low-level XML helpers used by readers and the XlsxUpdater.\n */\n\n/** True when the string contains XML-invalid control characters (tab/CR/LF are allowed). */\nfunction hasInvalidControlChars(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) {\n return true;\n }\n }\n return false;\n}\n\n/** Remove XML-invalid control characters (tab/CR/LF and normal ranges are kept). */\nfunction stripInvalidControlChars(str: string): string {\n let out = '';\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c === 0x09 || c === 0x0a || c === 0x0d || (c >= 0x20 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfffd)) {\n out += str[i];\n }\n }\n return out;\n}\n\n/** Escape text content for use inside an XML element body. */\nexport function escapeXmlText(str: string): string {\n if (!/&|<|>|\"|'/.test(str) && !hasInvalidControlChars(str)) {\n return str;\n }\n let out = str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n if (hasInvalidControlChars(out)) {\n out = stripInvalidControlChars(out);\n }\n return out;\n}\n\n/** Unescape the five predefined XML entities. */\nexport function unescapeXml(str: string): string {\n if (!str || str.indexOf('&') === -1) return str;\n return str.replace(/&#x([0-9a-f]+);/gi, (_match, hex: string) => String.fromCodePoint(parseInt(hex, 16)))\n .replace(/&#(\\d+);/g, (_match, decimal: string) => String.fromCodePoint(parseInt(decimal, 10)))\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n}\n\n/** 0-based column index -> \"A\", \"B\", ..., \"AA\", \"AB\", ... (bijective base-26). */\nexport function columnIndexToLetter(colIndex: number): string {\n let n = colIndex + 1;\n let result = '';\n while (n > 0) {\n const rem = (n - 1) % 26;\n result = String.fromCharCode(65 + rem) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/** \"A\", \"AB\", ... -> 0-based column index. */\nexport function columnLetterToIndex(letter: string): number {\n let column = 0;\n const length = letter.length;\n for (let i = 0; i < length; i++) {\n column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);\n }\n return column - 1;\n}\n\n/**\n * Remove trailing rows that contain no non-empty cells (padding rows sometimes\n * produced by SQL exports). This keeps the written range aligned with the\n * actual data, so pivot tables do not pick up \"(blank)\" items from empty rows.\n */\nexport function trimTrailingEmptyRows<T>(rows: T[][]): T[][] {\n let end = rows.length;\n while (end > 0 && rows[end - 1].every(v => v === null || v === undefined)) {\n end--;\n }\n return end === rows.length ? rows : rows.slice(0, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.xml into the list of string values.\n * Handles plain `<si><t>…</t></si>` entries as well as rich-text `<si><r><t>…</t></r></si>` runs.\n */\nexport function parseSharedStringsXml(xml: string): string[] {\n const result: string[] = [];\n const itemRegex = /<(?:(?:[A-Za-z_][\\w.-]*):)?si\\b[^>]*>([\\s\\S]*?)<\\/(?:(?:[A-Za-z_][\\w.-]*):)?si\\s*>/gi;\n let itemMatch: RegExpExecArray | null;\n while ((itemMatch = itemRegex.exec(xml)) !== null) {\n const content = itemMatch[1];\n const textRegex = /<(?:(?:[A-Za-z_][\\w.-]*):)?t\\b[^>]*>([\\s\\S]*?)<\\/(?:(?:[A-Za-z_][\\w.-]*):)?t\\s*>/gi;\n let value = '';\n let textMatch: RegExpExecArray | null;\n while ((textMatch = textRegex.exec(content)) !== null) {\n value += textMatch[1];\n }\n result.push(unescapeXml(value));\n }\n return result;\n}\n","import * as path from 'path';\nimport { XlsxReader } from './XlsxReader';\nimport { XlsbReader } from './XlsbReader';\nimport { ExcelReaderAbstract } from './ExcelReaderAbstract';\n\n/**\n * Create an XLSB or XLSX reader based on the file extension.\n */\nexport class ReaderFactory {\n /**\n * @param filePath Path ending in `.xlsb` or `.xlsx`\n * @throws if the extension is unsupported\n */\n static create(filePath: string): ExcelReaderAbstract {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.xlsx') {\n return new XlsxReader();\n } else if (ext === '.xlsb') {\n return new XlsbReader();\n } else {\n throw new Error(`Unsupported extension: ${ext}`);\n }\n }\n}\n\nexport default ReaderFactory;\n","import * as fs from 'fs';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport { CellValue, unwrapCell, getFormat } from './Formats';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n defaultColWidth,\n} from './writerHelpers';\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n filterHeaderRange: string | null;\n filterData?: {\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n };\n}\n\n/**\n * High-performance XLSB (Excel Binary Workbook) writer.\n * Prefer this format for large datasets — typically faster and smaller than XLSX.\n */\nexport class XlsbWriter {\n private output: fs.WriteStream;\n private archive: ReturnType<typeof archiver>;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstDic: Map<string, number> = new Map();\n private sstCntUnique: number = 0;\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n private _nextFmtId: number = 167;\n private _nextXfIdx: number = 4;\n private _stFmtRecords: Map<string, { numfmtId: number; xfIndex: number }> = new Map();\n\n /** Worksheet binary template (BrtBeginSheet … dimension / views / cols placeholders). */\n private _sheet1Bytes: Buffer;\n private _workbookBinStart: Buffer;\n private _workbookBinMiddle: Buffer;\n private _workbookBinEnd: Buffer;\n /** Default styles.bin template; extended when custom number formats are registered. */\n private _stylesBin: Buffer;\n private _binaryIndexBin: Buffer;\n private _rRkIntegerLowerLimit: number;\n private _rRkIntegerUpperLimit: number;\n private _autoFilterStartBytes: Buffer;\n private _autoFilterEndBytes: Buffer;\n private _stickHeaderA1bytes: Buffer;\n /** Excel 2016+ autofilter compatibility stubs. */\n private _magicFilterExcel2016Fix0: Buffer;\n private _magicFilterExcel2016Fix1: Buffer;\n private _magicFilterExcel2016Fix2: Buffer;\n\n private readonly stream = new StreamingSheetState();\n\n\n /**\n * @param filePath Destination `.xlsb` path on disk.\n */\n constructor(filePath: string) {\n this.output = fs.createWriteStream(filePath);\n this.archive = archiver('zip');\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n this._sheet1Bytes = Buffer.from([\n 0x81, 0x01, 0x00, 0x93, 0x01, 0x17, 0xCB, 0x04,\n 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n 0xFF, 0x00, 0x00, 0x00, 0x00, 0x94, 0x01, 0x10,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x85, 0x01, 0x00, 0x89, 0x01, 0x1E, 0xDC, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x98, 0x01, 0x24, 0x03,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x8A, 0x01, 0x00, 0x86, 0x01,\n 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E, 0x00,\n 0x80, 0x95, 0x08, 0x02, 0x05, 0x00, 0x26, 0x00,\n 0xE5, 0x03, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x08,\n 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x91,\n 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E,\n 0x00, 0x80, 0x80, 0x08, 0x02, 0x05, 0x00, 0x26,\n 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00,\n 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x92, 0x01, 0x00, 0x97, 0x04, 0x42,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n 0x00, 0x00,\n 0xDD, 0x03, 0x02, 0x10, 0x00, 0xDC, 0x03, 0x30,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xD3, 0x3F,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80,\n 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x26, 0x00, 0x82, 0x01, 0x00\n ]);\n\n this._workbookBinStart = Buffer.from([\n 0x83, 0x01, 0x00, 0x80, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x78, 0x00, 0x6C, 0x00, 0x01, 0x00, 0x00, 0x00,\n 0x37, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x00, 0x00, 0x32, 0x00, 0x34, 0x00, 0x33, 0x00, 0x32, 0x00, 0x36, 0x00, 0x99, 0x01, 0x0C, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x25, 0x06, 0x01, 0x00, 0x03, 0x0F, 0x00, 0x80, 0x97, 0x10, 0x34, 0x18, 0x00, 0x00, 0x00, 0x43, 0x00, 0x3A, 0x00, 0x5C, 0x00, 0x73, 0x00, 0x71, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x5C, 0x00,\n 0x54, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x70, 0x00, 0x69, 0x00, 0x73, 0x00, 0x75, 0x00, 0x58, 0x00, 0x6C, 0x00, 0x73, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x26, 0x00,\n 0x25, 0x06, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x81, 0x18, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x31, 0x00, 0x33, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x63, 0x00,\n 0x72, 0x00, 0x3A, 0x00, 0x31, 0x00, 0x5F, 0x00, 0x7B, 0x00, 0x31, 0x00, 0x36, 0x00, 0x35, 0x00, 0x30, 0x00, 0x38, 0x00, 0x44, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x43, 0x00, 0x46, 0x00, 0x38, 0x00,\n 0x37, 0x00, 0x2D, 0x00, 0x34, 0x00, 0x37, 0x00, 0x36, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x38, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x2D, 0x00, 0x44, 0x00, 0x34, 0x00, 0x41, 0x00, 0x34, 0x00, 0x30, 0x00,\n 0x31, 0x00, 0x31, 0x00, 0x33, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x7D, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x87, 0x01, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x10, 0x00, 0x80, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x9E, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x16, 0x00, 0x00, 0xB4, 0x69, 0x00, 0x00, 0xE8, 0x26, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x78, 0x88, 0x01, 0x00,\n 0x8F, 0x01, 0x00\n ]);\n\n this._workbookBinMiddle = Buffer.from([0x90, 0x01, 0x00]);\n\n this._workbookBinEnd = Buffer.from([\n 0x9D, 0x01, 0x1A, 0x35, 0xEA, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0xFC, 0xA9, 0xF1, 0xD2, 0x4D, 0x62, 0x50, 0x3F, 0x01,\n 0x00, 0x00, 0x00, 0x6A, 0x00, 0x9B, 0x01, 0x01, 0x00, 0x23, 0x04, 0x03, 0x0F, 0x00, 0x00, 0xAB, 0x10, 0x01, 0x01, 0x24, 0x00, 0x84, 0x01, 0x00\n ]);\n\n this._stylesBin = Buffer.from([\n 0x96, 0x02, 0x00, 0xE7, 0x04, 0x04, 0x02,\n 0x00, 0x00, 0x00, 0x2C, 0x2C, 0xA4, 0x00, 0x13,\n 0x00, 0x00, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79,\n 0x00, 0x79, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x6D,\n 0x00, 0x6D, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x64,\n 0x00, 0x64, 0x00, 0x5C, 0x00, 0x20, 0x00, 0x68,\n 0x00, 0x68, 0x00, 0x3A, 0x00, 0x6D, 0x00, 0x6D,\n 0x00, 0x2C, 0x1E, 0xA6, 0x00, 0x0C, 0x00, 0x00,\n 0x00, 0x79, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79,\n 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x6D, 0x00, 0x6D,\n 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x64, 0x00, 0x64,\n 0x00, 0xE8, 0x04, 0x00, 0xE3, 0x04, 0x04, 0x01,\n 0x00, 0x00, 0x00,\n 0x2B, 0x27, 0xDC, 0x00, 0x00, 0x00, 0x90, 0x01,\n 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x07,\n 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x62, 0x00, 0x72, 0x00, 0x69,\n 0x00,\n 0x2B, 0x27, 0xDC, 0x00, 0x01, 0x00, 0xBC, 0x02,\n 0x00, 0x00, 0x00, 0x02, 0xEE, 0x00, 0x07, 0x01,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x07,\n 0x00, 0x00, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x62, 0x00, 0x72, 0x00, 0x69,\n 0x00,\n 0x25, 0x06, 0x01, 0x00, 0x02, 0x0E, 0x00, 0x80, 0x81, 0x08, 0x00, 0x26, 0x00, 0xE4, 0x04, 0x00, 0xDB, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00,\n 0x2D, 0x44, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x41, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x2D, 0x44, 0x11, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x41, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0xDC, 0x04, 0x00, 0xE5, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x2E, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x04, 0x00, 0xF2,\n 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x2F, 0x10, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\n 0x00, 0xF3, 0x04, 0x00, 0xE9, 0x04, 0x04,\n 0x04,\n 0x00, 0x00, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00,\n 0x2F, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\n 0xEA, 0x04, 0x00, 0xEB, 0x04, 0x04, 0x01, 0x00,\n 0x00, 0x00, 0x25, 0x06, 0x01, 0x00, 0x02, 0x11, 0x00, 0x80, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4E,\n 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6E, 0x00, 0x79, 0x00, 0xEC, 0x04, 0x00, 0xF9, 0x03, 0x04, 0x00, 0x00,\n 0x00, 0x00, 0xFA, 0x03, 0x00, 0xFC, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x54, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C,\n 0x00, 0x65, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x75, 0x00,\n 0x6D, 0x00, 0x32, 0x00, 0x11, 0x00, 0x00, 0x00, 0x50, 0x00, 0x69, 0x00, 0x76, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79,\n 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0x36, 0x00, 0xFD, 0x03, 0x00, 0x23,\n 0x04, 0x02, 0x0E, 0x00, 0x00, 0xEB, 0x08, 0x00, 0xF6, 0x08, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x53, 0x00, 0x6C, 0x00,\n 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x67,\n 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0xF7, 0x08, 0x00, 0xEC, 0x08, 0x00, 0x24, 0x00, 0x23, 0x04, 0x03, 0x0F, 0x00, 0x00, 0xB0, 0x10,\n 0x00, 0xB2, 0x10, 0x32, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x53, 0x00, 0x6C,\n 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x53, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x4C, 0x00, 0x69, 0x00,\n 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x31, 0x00, 0xB3, 0x10, 0x00, 0xB1, 0x10, 0x00, 0x24, 0x00, 0x97, 0x02, 0x00\n ]);\n\n this._binaryIndexBin = Buffer.from([\n 0x2A, 0x18, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95,\n 0x02, 0x00\n ]);\n\n this._rRkIntegerLowerLimit = -1 << 29;\n this._rRkIntegerUpperLimit = (1 << 29) - 1;\n\n this._autoFilterStartBytes = Buffer.from([0xA1, 0x01, 0x10]);\n this._autoFilterEndBytes = Buffer.from([0xA2, 0x01, 0x00]);\n\n this._stickHeaderA1bytes = Buffer.from([\n 0x97, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xF0, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03\n ]);\n\n this._magicFilterExcel2016Fix0 = Buffer.from([0xE1, 0x02, 0x00, 0xE5, 0x02, 0x00, 0xEA, 0x02]);\n this._magicFilterExcel2016Fix1 = Buffer.from([\n 0x27, 0x46, 0x21, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x5F,\n 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x44, 0x00, 0x61,\n 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x0F, 0x00, 0x00,\n 0x00, 0x3B, 0xFF, 0x00\n ]);\n this._magicFilterExcel2016Fix2 = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF]);\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n private _registerFormat(fmtString: string): number {\n if (this._stFmtRecords.has(fmtString)) {\n return this._stFmtRecords.get(fmtString)!.xfIndex;\n }\n const numfmtId = this._nextFmtId++;\n const xfIndex = this._nextXfIdx++;\n this._stFmtRecords.set(fmtString, { numfmtId, xfIndex });\n return xfIndex;\n }\n\n private static _buildBrtRecord(type: number, data: Buffer): Buffer {\n const header = XlsbWriter._encodeVlq(type);\n header.push(...XlsbWriter._encodeVlq(data.length));\n return Buffer.concat([Buffer.from(header), data]);\n }\n\n private static _encodeVlq(value: number): number[] {\n const result: number[] = [];\n while (value >= 0x80) {\n result.push((value & 0x7F) | 0x80);\n value >>>= 7;\n }\n result.push(value & 0x7F);\n return result;\n }\n\n private static _buildStFmtRecord(ifmt: number, fmtString: string): Buffer {\n const cch = fmtString.length;\n const remaining = 2 + 4 + cch * 2;\n const data = Buffer.alloc(2 + remaining);\n data[0] = 0x2C;\n data[1] = remaining;\n data.writeUInt16LE(ifmt, 2);\n data.writeUInt32LE(cch, 4);\n data.write(fmtString, 8, cch * 2, 'utf16le');\n return data;\n }\n\n private static _buildXfRecord(fontId: number, ifmt: number, flags: number, byte6Extra: number = 0): Buffer {\n const data = Buffer.alloc(18);\n data[0] = 0x2F;\n data[1] = 16;\n data.writeUInt16LE(fontId, 2);\n data.writeUInt16LE(ifmt, 4);\n data[6] = byte6Extra;\n data[14] = 0x10;\n data[15] = 0x10;\n data.writeUInt16LE(flags, 16);\n return data;\n }\n\n private _buildStylesBin(): Buffer {\n if (this._stFmtRecords.size === 0) {\n return this._stylesBin;\n }\n const base = this._stylesBin;\n\n // Find BrtEndFonts (0xE8, 0x04, 0x00)\n let fontEndOff = -1;\n for (let i = 3; i < base.length - 3; i++) {\n if (base[i] === 0xE8 && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n fontEndOff = i;\n break;\n }\n }\n\n // Find BrtBeginCellXFs (0xE9, 0x04)\n let xfBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xE9 && base[i + 1] === 0x04) {\n xfBeginOff = i;\n break;\n }\n }\n\n // Find BrtEndCellXFs (0xEA, 0x04, 0x00)\n let xfEndOff = -1;\n for (let i = xfBeginOff; i < base.length - 3; i++) {\n if (base[i] === 0xEA && base[i + 1] === 0x04 && base[i + 2] === 0x00) {\n xfEndOff = i;\n break;\n }\n }\n\n // Find BrtBeginFills (0xE3, 0x04) — start after BrtEndFonts\n let fillBeginOff = -1;\n for (let i = fontEndOff + 3; i < base.length - 2; i++) {\n if (base[i] === 0xE3 && base[i + 1] === 0x04) {\n fillBeginOff = i;\n break;\n }\n }\n\n const totalFmt = 2 + this._stFmtRecords.size;\n const totalXf = 4 + this._stFmtRecords.size;\n\n const parts: Buffer[] = [];\n\n // 1. BrtBeginStyleSheet\n parts.push(base.subarray(0, 3));\n\n // 2. NEW BrtFmt: VLQ(0x0267) + VLQ(4) + count(2 LE) + pad(2)\n const fmtHeader = Buffer.alloc(4);\n fmtHeader.writeUInt16LE(totalFmt, 0);\n parts.push(XlsbWriter._buildBrtRecord(0x0267, fmtHeader));\n\n // 3. BrtNumFmt records: 2 base + custom (ALWAYS add base formats)\n parts.push(XlsbWriter._buildStFmtRecord(164, 'yyyy\\\\-mm\\\\-dd\\\\ hh:mm'));\n parts.push(XlsbWriter._buildStFmtRecord(166, 'yyyy\\\\-mm\\\\-dd'));\n for (const [fmtString, st] of this._stFmtRecords) {\n parts.push(XlsbWriter._buildStFmtRecord(st.numfmtId, fmtString));\n }\n\n // 4. BrtEndFonts\n parts.push(XlsbWriter._buildBrtRecord(0x0268, Buffer.alloc(0)));\n\n // 5. Copy fills+borders+BrtFont+cellStyleXFs from template\n parts.push(base.subarray(fillBeginOff, xfBeginOff));\n\n // 7. NEW BrtBeginCellXFs\n const xfHeader = Buffer.alloc(4);\n xfHeader.writeUInt16LE(totalXf, 0);\n parts.push(XlsbWriter._buildBrtRecord(0x0269, xfHeader));\n\n // 8. Base XF records\n parts.push(XlsbWriter._buildXfRecord(0, 0, 0x0000));\n parts.push(XlsbWriter._buildXfRecord(0, 164, 0x0001));\n parts.push(XlsbWriter._buildXfRecord(0, 166, 0x0001));\n parts.push(XlsbWriter._buildXfRecord(1, 0, 0x0000, 1));\n\n // 9. Custom XF records\n const sortedXf = [...this._stFmtRecords.entries()].sort((a, b) => a[1].xfIndex - b[1].xfIndex);\n for (const [, st] of sortedXf) {\n parts.push(XlsbWriter._buildXfRecord(0, st.numfmtId, 0x0001));\n }\n\n // 10. BrtEndCellXFs\n parts.push(XlsbWriter._buildBrtRecord(0x026A, Buffer.alloc(0)));\n\n // 11. Copy remaining template\n parts.push(base.subarray(xfEndOff + 3));\n\n return Buffer.concat(parts);\n }\n\n /**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n * @param sheetName Display name (sanitized to Excel rules)\n * @param hidden Whether the sheet is hidden in Excel\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n this.sheetCount++;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/sheet${this.sheetCount}.bin`,\n hidden: hidden,\n nameInArchive: `sheet${this.sheetCount}.bin`,\n sheetId: this.sheetCount,\n filterHeaderRange: null\n });\n }\n\n /**\n * Start a new sheet in streaming mode. Call writeRow() for each row, then endSheet() when done.\n * @param sheetName Name of the sheet\n * @param columnCount Number of columns in the sheet\n * @param headers Optional header row\n * @param options Optional settings (hidden, doAutofilter)\n */\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: { hidden?: boolean; doAutofilter?: boolean; sampleRows?: unknown[][] } = {}\n ): void {\n const { hidden = false, doAutofilter = true, sampleRows } = options;\n\n // Add sheet metadata\n this.addSheet(sheetName, hidden);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n const bigBuf = this.stream.buffer!;\n\n if (headers) {\n applyHeaderWidths(this.stream.colWidths, headers, columnCount);\n }\n if (sampleRows) {\n updateColWidthsFromRows(this.stream.colWidths, sampleRows);\n }\n\n // Write sheet header\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n sheetHeader.writeInt32LE(this.stream.startCol, 40);\n sheetHeader.writeInt32LE(this.stream.endCol, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n // Write sticky header if headers are present\n if (headers) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n // Write column definitions\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n\n for (let i = this.stream.startCol; i < this.stream.endCol; i++) {\n bigBuf.writeByte(0);\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(this.stream.colWidths[i], true);\n bigBuf.writeByte(0);\n bigBuf.writeByte(Math.max(0, Math.min(255, width)));\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(2);\n }\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n // Write header row if provided\n if (headers) {\n this.createRowHeader(bigBuf, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(bigBuf, headers[c], c, true);\n }\n this.stream.rowNum++;\n }\n }\n\n /**\n * Write a single row in streaming mode. Must be called between startSheet() and endSheet().\n * @param row Array of cell values\n */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n\n // Write row header\n this.createRowHeader(bigBuf, this.stream.rowNum, this.stream.startCol, this.stream.endCol);\n\n // Write each cell\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const styleNum = fmtString !== null ? this._registerFormat(fmtString) : 0;\n\n if (typeof val === 'number') {\n if (Number.isInteger(val)) {\n if (val >= this._rRkIntegerLowerLimit && val <= this._rRkIntegerUpperLimit) {\n this.writeRkNumberInteger(bigBuf, val, c, styleNum);\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else if (typeof val === 'bigint') {\n this.writeString(bigBuf, val.toString(), c);\n } else if (typeof val === 'boolean') {\n this.writeBool(bigBuf, val, c);\n } else if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n this.writeDouble(bigBuf, oaDate, c, fmtString !== null ? styleNum : 1);\n } else if (val !== null && val !== undefined) {\n this.writeString(bigBuf, val.toString(), c, false, fmtString !== null ? styleNum : undefined);\n }\n }\n\n this.stream.rowNum++;\n }\n\n /**\n * Finalize the current streaming sheet and add it to the archive.\n * Must be called after startSheet() and writeRow() calls.\n */\n endSheet(): void {\n const bigBuf = this.stream.assertStreaming();\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n\n // Write sheet footer sections\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n // Write autofilter if enabled\n if (this.stream.doAutofilter) {\n this._autofilterIsOn = true;\n const endRow = this.stream.rowNum;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(this.stream.startCol, 0);\n colBuf.writeInt32LE(this.stream.endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n // Store filter data for later\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: endRow - 1,\n startColumn: this.stream.startCol,\n endColumn: this.stream.endCol - 1\n };\n }\n\n bigBuf.write(sheetHeader.subarray(290));\n\n // Add to archive\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n\n // Reset streaming state\n this.stream.end();\n }\n\n\n /**\n * Write an entire sheet in one call (batch mode).\n * @param rows Data rows (`CellValue` cells; null/undefined = blank)\n * @param headers Optional header row (bold + frozen + autofilter when enabled)\n * @param doAutofilter Enable autofilter when headers are present (default true)\n */\n writeSheet(rows: CellValue[][], headers: string[] | null = null, doAutofilter: boolean = true): void {\n const bigBuf = new BigBuffer();\n let columnCount = 0;\n\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n const colWidths = initColWidths(columnCount);\n\n if (headers) {\n applyHeaderWidths(colWidths, headers, columnCount);\n }\n updateColWidthsFromRows(colWidths, rows);\n\n const sheetHeader = Buffer.from(this._sheet1Bytes);\n const startCol = 0;\n const endCol = columnCount;\n\n sheetHeader.writeInt32LE(startCol, 40);\n sheetHeader.writeInt32LE(endCol, 44);\n\n if (this.sheetCount !== 1) {\n sheetHeader[54] = 0x9C;\n }\n\n bigBuf.write(sheetHeader.subarray(0, 84));\n\n if (headers) {\n bigBuf.write(this._stickHeaderA1bytes);\n }\n\n bigBuf.write(sheetHeader.subarray(84, 159));\n\n bigBuf.writeByte(134);\n bigBuf.writeByte(3);\n\n for (let i = startCol; i < endCol; i++) {\n bigBuf.writeByte(0);\n bigBuf.writeByte(60);\n bigBuf.writeByte(18);\n\n bigBuf.writeInt32LE(i);\n bigBuf.writeInt32LE(i);\n\n const width = defaultColWidth(colWidths[i], true);\n bigBuf.writeByte(0);\n bigBuf.writeByte(Math.max(0, Math.min(255, width)));\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n bigBuf.writeByte(0);\n\n bigBuf.writeByte(2);\n }\n\n bigBuf.writeByte(0);\n bigBuf.writeByte(135);\n bigBuf.writeByte(3);\n bigBuf.writeByte(0);\n\n bigBuf.write(sheetHeader.subarray(159, 175));\n bigBuf.write(Buffer.from([38, 0]));\n\n let rowNum = 0;\n\n if (headers) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n for (let c = 0; c < headers.length; c++) {\n this.writeString(bigBuf, headers[c], c, true);\n }\n rowNum++;\n }\n\n for (let r = 0; r < rows.length; r++) {\n this.createRowHeader(bigBuf, rowNum, startCol, endCol);\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const styleNum = fmtString !== null ? this._registerFormat(fmtString) : 0;\n\n if (typeof val === 'number') {\n if (Number.isInteger(val)) {\n if (val >= this._rRkIntegerLowerLimit && val <= this._rRkIntegerUpperLimit) {\n this.writeRkNumberInteger(bigBuf, val, c, styleNum);\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else {\n this.writeDouble(bigBuf, val, c, styleNum);\n }\n } else if (typeof val === 'bigint') {\n this.writeString(bigBuf, val.toString(), c);\n } else if (typeof val === 'boolean') {\n this.writeBool(bigBuf, val, c);\n } else if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n this.writeDouble(bigBuf, oaDate, c, fmtString !== null ? styleNum : 1);\n } else if (val !== null && val !== undefined) {\n this.writeString(bigBuf, val.toString(), c, false, fmtString !== null ? styleNum : undefined);\n }\n }\n rowNum++;\n }\n\n bigBuf.write(sheetHeader.subarray(218, 290));\n\n if (doAutofilter && headers) {\n this._autofilterIsOn = true;\n const endRow = rows.length + 1;\n\n bigBuf.write(this._autoFilterStartBytes);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(0, 0);\n rowBuf.writeInt32LE(endRow - 1, 4);\n bigBuf.write(rowBuf);\n\n const colBuf = Buffer.alloc(8);\n colBuf.writeInt32LE(startCol, 0);\n colBuf.writeInt32LE(endCol - 1, 4);\n bigBuf.write(colBuf);\n\n bigBuf.write(this._autoFilterEndBytes);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n sheet.filterData = {\n startRow: 0,\n endRow: rows.length,\n startColumn: startCol,\n endColumn: endCol - 1\n };\n }\n\n bigBuf.write(sheetHeader.subarray(290));\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: this.sheetList[this.sheetCount - 1].pathInArchive });\n }\n\n\n\n createRowHeader(bigBuf: BigBuffer, rowNumber: number, startCol: number, endCol: number): void {\n bigBuf.ensureCapacity(27);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(25);\n bigBuf.writeUnsafeInt32LE(rowNumber);\n bigBuf.writeUnsafeInt32LE(0);\n bigBuf.writeUnsafeByte(44);\n bigBuf.writeUnsafeByte(1);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(1);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeInt32LE(startCol);\n bigBuf.writeUnsafeInt32LE(endCol);\n }\n\n writeRkNumberInteger(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n bigBuf.ensureCapacity(14);\n bigBuf.writeUnsafeByte(2);\n bigBuf.writeUnsafeByte(12);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n const rkVal = (val << 2) | 2;\n bigBuf.writeUnsafeInt32LE(rkVal);\n }\n\n writeDouble(bigBuf: BigBuffer, val: number, colNum: number, styleNum: number = 0): void {\n bigBuf.ensureCapacity(18);\n bigBuf.writeUnsafeByte(5);\n bigBuf.writeUnsafeByte(16);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeDoubleLE(val);\n }\n\n writeBool(bigBuf: BigBuffer, val: boolean, colNum: number): void {\n bigBuf.ensureCapacity(13);\n bigBuf.writeUnsafeByte(0x04);\n bigBuf.writeUnsafeByte(9);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeInt32LE(0);\n bigBuf.writeUnsafeByte(val ? 1 : 0);\n }\n\n writeDateTime(bigBuf: BigBuffer, date: Date, colNum: number): void {\n // Use UTC time to avoid timezone conversion issues\n const oaDate = (date.getTime() - this._oaEpoch) / 86400000;\n this.writeDouble(bigBuf, oaDate, colNum, 1);\n }\n\n private _getDateWidth(_date: Date): number {\n return 19; // \"YYYY-MM-DD HH:MM:SS\" ≈ 19 chars\n }\n\n writeString(bigBuf: BigBuffer, val: string, colNum: number, bolded: boolean = false, styleOverride?: number): void {\n let index: number;\n if (this.sstDic.has(val)) {\n index = this.sstDic.get(val)!;\n } else {\n index = this.sstCntUnique;\n this.sstDic.set(val, index);\n this.sstCntUnique++;\n }\n this.sstCntAll++;\n\n const styleNum = styleOverride !== undefined ? styleOverride : (bolded ? 3 : 0);\n bigBuf.ensureCapacity(17);\n bigBuf.writeUnsafeByte(7);\n bigBuf.writeUnsafeByte(12);\n bigBuf.writeUnsafeInt32LE(colNum);\n bigBuf.writeUnsafeByte(styleNum);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeByte(0);\n bigBuf.writeUnsafeInt32LE(index);\n }\n\n private saveSst(): void {\n const bigBuf = new BigBuffer();\n\n bigBuf.writeByte(159);\n bigBuf.writeByte(1);\n bigBuf.writeByte(8);\n\n bigBuf.writeInt32LE(this.sstCntUnique);\n bigBuf.writeInt32LE(this.sstCntAll);\n\n for (const [txt] of this.sstDic) {\n const txtLen = txt.length;\n\n bigBuf.writeByte(19);\n\n const recLen = 5 + 2 * txtLen;\n\n if (recLen >= 128) {\n bigBuf.writeByte(128 + (recLen % 128));\n const tmp = recLen >> 7;\n if (tmp >= 256) {\n bigBuf.writeByte(128 + (tmp % 128));\n } else {\n bigBuf.writeByte(tmp);\n }\n bigBuf.writeByte(recLen >> 14);\n if ((recLen >> 14) > 0) {\n bigBuf.writeByte(0);\n }\n } else {\n bigBuf.writeByte(recLen & 0xFF);\n bigBuf.writeByte((recLen >> 8) & 0xFF);\n }\n\n bigBuf.writeInt32LE(txtLen);\n bigBuf.writeUtf16LE(txt);\n }\n\n bigBuf.writeByte(160);\n bigBuf.writeByte(1);\n bigBuf.writeByte(0);\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: 'xl/sharedStrings.bin' });\n }\n\n private _writeFilterDefinedName(wbBuffers: Buffer[], sheet: SheetInfo, sheetNum: number): void {\n const filterData = sheet.filterData!;\n const sheetIndex = sheet.sheetId - 1;\n\n const fix1 = Buffer.alloc(this._magicFilterExcel2016Fix1.length);\n this._magicFilterExcel2016Fix1.copy(fix1);\n\n const lastIdx = this._magicFilterExcel2016Fix1.length - 2;\n\n fix1[7] = sheetIndex;\n fix1[lastIdx] = sheetNum;\n\n wbBuffers.push(fix1);\n\n const rowBuf = Buffer.alloc(8);\n rowBuf.writeInt32LE(filterData.startRow, 0);\n rowBuf.writeInt32LE(filterData.endRow, 4);\n wbBuffers.push(rowBuf);\n\n const colBuf = Buffer.alloc(4);\n colBuf.writeInt16LE(filterData.startColumn, 0);\n colBuf.writeInt16LE(filterData.endColumn, 2);\n wbBuffers.push(colBuf);\n\n wbBuffers.push(this._magicFilterExcel2016Fix2);\n }\n\n /**\n * Finalize the ZIP package and close the output stream.\n * Must be awaited before the file is fully written.\n */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.saveSst();\n\n this.archive.append(this._buildStylesBin(), { name: 'xl/styles.bin' });\n\n const wbBuffers: Buffer[] = [];\n wbBuffers.push(this._workbookBinStart);\n\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n\n const recLen = 4 + 12 + sheet.name.length * 2 + rId.length * 2;\n const buf = Buffer.alloc(3 + recLen);\n buf[0] = 156; buf[1] = 1; buf[2] = recLen;\n let pos = 3;\n\n buf.writeInt32LE(sheet.hidden ? 1 : 0, pos); pos += 4;\n buf.writeInt32LE(sheet.sheetId, pos); pos += 4;\n\n buf.writeInt32LE(rId.length, pos); pos += 4;\n for (let i = 0; i < rId.length; i++) {\n const c = rId.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n\n buf.writeInt32LE(sheet.name.length, pos); pos += 4;\n for (let i = 0; i < sheet.name.length; i++) {\n const c = sheet.name.charCodeAt(i);\n buf[pos++] = c & 0xFF; buf[pos++] = (c >> 8) & 0xFF;\n }\n wbBuffers.push(buf);\n }\n\n wbBuffers.push(this._workbookBinMiddle);\n\n if (this._autofilterIsOn) {\n const filteredSheets = this.sheetList.filter(s => s.filterData);\n const cnt = filteredSheets.length;\n\n if (cnt > 0) {\n wbBuffers.push(this._magicFilterExcel2016Fix0);\n\n const firstByte = cnt <= 20\n ? 0x10 + (cnt - 1) * 0x0C\n : 0x80 + (cnt - 21) * 0x0C;\n const countBuf = cnt <= 10\n ? Buffer.from([firstByte, cnt, 0x00, 0x00, 0x00])\n : Buffer.from([firstByte, Math.floor((cnt - 1) / 10), cnt, 0x00, 0x00, 0x00]);\n wbBuffers.push(countBuf);\n\n for (let nm = 0; nm < cnt; nm++) {\n const sheetIndex = filteredSheets[nm].sheetId - 1;\n const idxBuf = Buffer.alloc(12);\n idxBuf.writeInt32LE(0, 0);\n idxBuf[4] = sheetIndex;\n idxBuf[8] = sheetIndex;\n wbBuffers.push(idxBuf);\n }\n\n wbBuffers.push(Buffer.from([0xE2, 0x02, 0x00]));\n\n for (let sheetNum = 0; sheetNum < cnt; sheetNum++) {\n const sheet = filteredSheets[sheetNum];\n this._writeFilterDefinedName(wbBuffers, sheet, sheetNum);\n }\n }\n }\n\n wbBuffers.push(this._workbookBinEnd);\n\n this.archive.append(Buffer.concat(wbBuffers), { name: 'xl/workbook.bin' });\n\n for (const sheet of this.sheetList) {\n this.archive.append(this._binaryIndexBin, { name: `xl/worksheets/binaryIndex${sheet.sheetId}.bin` });\n }\n\n let contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n<Default Extension=\"bin\" ContentType=\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\"/>\n<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>`;\n for (const sheet of this.sheetList) {\n contentTypes += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.ms-excel.worksheet\"/>`;\n contentTypes += `<Override PartName=\"/xl/worksheets/binaryIndex${sheet.sheetId}.bin\" ContentType=\"application/vnd.ms-excel.binIndexWs\"/>`;\n }\n contentTypes += `<Override PartName=\"/xl/styles.bin\" ContentType=\"application/vnd.ms-excel.styles\"/>\n<Override PartName=\"/xl/sharedStrings.bin\" ContentType=\"application/vnd.ms-excel.sharedStrings\"/>\n</Types>`;\n this.archive.append(contentTypes, { name: '[Content_Types].xml' });\n\n let wbRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n for (const sheet of this.sheetList) {\n const rId = `rId${sheet.sheetId}`;\n wbRels += `<Relationship Id=\"${rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n wbRels += `<Relationship Id=\"rId${this.sheetList.length + 2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.bin\"/>\n<Relationship Id=\"rId${this.sheetList.length + 3}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.bin\"/>\n</Relationships>`;\n this.archive.append(wbRels, { name: 'xl/_rels/workbook.bin.rels' });\n\n const globalRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.bin\"/>\n</Relationships>`;\n this.archive.append(globalRels, { name: '_rels/.rels' });\n\n for (const sheet of this.sheetList) {\n const wsRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.microsoft.com/office/2006/relationships/xlBinaryIndex\" Target=\"binaryIndex${sheet.sheetId}.bin\"/>\n</Relationships>`;\n this.archive.append(wsRels, { name: `xl/worksheets/_rels/${sheet.nameInArchive}.rels` });\n }\n\n this.output.on('close', () => resolve());\n this.archive.on('error', (err: any) => reject(err));\n this.archive.finalize();\n } catch (err) {\n reject(err);\n }\n });\n }\n}\n\nexport default XlsbWriter;\n","export type PrimitiveCellValue = string | number | boolean | Date | bigint | null | undefined;\n\nexport interface FormattedCell {\n value: PrimitiveCellValue;\n format: string;\n}\n\nexport type CellValue = PrimitiveCellValue | FormattedCell;\n\n/** Built-in Excel number-format strings for {@link FormattedCell}. */\nexport const F = {\n THOUSANDS_SEP: '#,##0',\n CURRENCY_PLN: '#,##0.00 \"z\\u0142\"',\n CURRENCY_EUR: '#,##0.00 \\u20AC',\n PERCENTAGE: '0%',\n SCIENTIFIC: '0.00E+00',\n TWO_DECIMALS: '#,##0.00',\n TEXT: '@',\n LEADING_ZEROS: '000000000',\n\n DATE_SHORT: 'dd.mm.yyyy',\n DATE_LONG: 'd mmmm yyyy',\n DATE_DAY_MONTH_YEAR: 'dd-mm-yyyy',\n DATE_ISO: 'yyyy-mm-dd',\n DATE_MONTH_YEAR: 'mmmm yyyy',\n DATE_WEEKDAY: 'dddd, d mmmm yyyy',\n DATE_DAY_MONTH: 'd mmmm',\n DATE_YEAR_ONLY: 'yyyy',\n\n DATETIME_SHORT: 'dd.mm.yyyy hh:mm',\n DATETIME_LONG: 'd mmmm yyyy hh:mm:ss',\n TIME_HH_MM: 'hh:mm',\n TIME_HH_MM_SS: 'hh:mm:ss',\n TIME_12H: 'h:mm AM/PM',\n DATETIME_24H: 'dd.mm.yyyy hh:mm:ss',\n DATETIME_ISO: 'yyyy-mm-dd\"T\"hh:mm:ss',\n TIME_MS: 'hh:mm:ss.000',\n};\n\nexport function isFormattedCell(val: unknown): val is FormattedCell {\n return val !== null && val !== undefined && typeof val === 'object' && 'format' in val && typeof (val as FormattedCell).format === 'string';\n}\n\nexport function unwrapCell(val: CellValue): PrimitiveCellValue {\n if (isFormattedCell(val)) {\n return val.value;\n }\n return val;\n}\n\nexport function getFormat(val: CellValue): string | null {\n if (isFormattedCell(val)) {\n return val.format;\n }\n return null;\n}\n","import { isFormattedCell } from './Formats';\n\n/** Excel sheet name characters that must be replaced. */\nexport const INVALID_SHEET_NAME_CHARS = /[\\\\/*?[\\]:]/g;\n\n/**\n * Sanitize an Excel sheet name (invalid chars, max 31 chars, non-empty).\n * @param sheetCount Current sheet count before adding this sheet (used for defaults).\n */\nexport function sanitizeSheetName(name: string, sheetCount: number): string {\n if (!name || typeof name !== 'string') {\n return `Sheet${sheetCount + 1}`;\n }\n\n let sanitized = name.replace(INVALID_SHEET_NAME_CHARS, '_');\n\n if (sanitized.length > 31) {\n sanitized = sanitized.substring(0, 31);\n }\n\n if (sanitized.trim().length === 0) {\n sanitized = `Sheet${sheetCount + 1}`;\n }\n\n return sanitized;\n}\n\n/** Create column-width scratch array filled with -1 (unknown). */\nexport function initColWidths(columnCount: number): number[] {\n return new Array(columnCount).fill(-1.0);\n}\n\n/** Apply autofit widths from header labels. */\nexport function applyHeaderWidths(colWidths: number[], headers: string[], columnCount: number): void {\n for (let i = 0; i < columnCount; i++) {\n const len = headers[i] ? headers[i].length + 1 : 0;\n let width = 1.25 * len + 2;\n if (width > 80) width = 80;\n if (colWidths[i] < width) colWidths[i] = width;\n }\n}\n\n/**\n * Sample up to `sampleLimit` rows and expand column widths (autofit).\n * Skips null/undefined cells; Dates use a fixed display length of 20.\n */\nexport function updateColWidthsFromRows(\n colWidths: number[],\n rows: unknown[][],\n sampleLimit: number = 100\n): void {\n for (let r = 0; r < Math.min(rows.length, sampleLimit); r++) {\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n const val = isFormattedCell(raw) ? raw.value : raw;\n const len = val instanceof Date ? 20 : String(val).length + 1;\n let width = 1.25 * len + 2;\n if (width > 80) width = 80;\n if (colWidths[c] < width) colWidths[c] = width;\n }\n }\n}\n\n/**\n * Resolve a stored autofit width to the value written into the file.\n * XLSB uses floored integers; XLSX keeps the float.\n */\nexport function defaultColWidth(width: number, floor: boolean = false): number {\n if (width > 0) {\n return floor ? Math.floor(width) : width;\n }\n return 10;\n}\n","import { BigBuffer } from './BigBuffer';\nimport { initColWidths } from './writerHelpers';\n\n/**\n * Shared streaming-sheet session state for Node writers.\n * Holds buffer, row cursor, column range, autofilter flag, and autofit widths.\n */\nexport class StreamingSheetState {\n isStreaming: boolean = false;\n rowNum: number = 0;\n startCol: number = 0;\n endCol: number = 0;\n doAutofilter: boolean = false;\n colWidths: number[] = [];\n buffer: BigBuffer | null = null;\n\n /**\n * Begin a streaming sheet session.\n * @throws if already streaming\n */\n begin(columnCount: number, doAutofilter: boolean, buffer: BigBuffer): void {\n if (this.isStreaming) {\n throw new Error('Already in streaming mode. Call endSheet() first.');\n }\n\n this.isStreaming = true;\n this.buffer = buffer;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = columnCount;\n this.doAutofilter = doAutofilter;\n this.colWidths = initColWidths(columnCount);\n }\n\n /** Assert streaming mode and return the active buffer. */\n assertStreaming(): BigBuffer {\n if (!this.isStreaming || !this.buffer) {\n throw new Error('Not in streaming mode. Call startSheet() first.');\n }\n return this.buffer;\n }\n\n /** Reset after endSheet(). */\n end(): void {\n this.isStreaming = false;\n this.buffer = null;\n this.rowNum = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.doAutofilter = false;\n this.colWidths = [];\n }\n}\n","import * as fs from 'fs';\nimport archiver from 'archiver';\nimport { Readable } from 'stream';\nimport { BigBuffer } from './BigBuffer';\nimport { CellValue, unwrapCell, getFormat } from './Formats';\nimport { StreamingSheetState } from './StreamingSheetState';\nimport {\n sanitizeSheetName,\n initColWidths,\n applyHeaderWidths,\n updateColWidthsFromRows,\n defaultColWidth,\n} from './writerHelpers';\n\nconst COLUMN_LETTERS = (() => {\n const letters: string[] = [];\n for (let i = 65; i < 91; i++) {\n letters.push(String.fromCharCode(i));\n }\n const temp: string[] = [];\n for (const p of letters) {\n for (let i = 65; i < 91; i++) {\n temp.push(p + String.fromCharCode(i));\n }\n }\n letters.push(...temp);\n return letters;\n})();\n\ninterface SheetInfo {\n name: string;\n pathInArchive: string;\n hidden: boolean;\n nameInArchive: string;\n sheetId: number;\n rId: string;\n filterHeaderRange: string | null;\n}\n\n/**\n * XLSX (Office Open XML) writer with streaming ZIP output.\n */\nexport class XlsxWriter {\n private output: fs.WriteStream;\n private archive: archiver.Archiver;\n\n private sheetCount: number = 0;\n private sheetList: SheetInfo[] = [];\n private sstArray: string[] = [];\n private sstMap: Map<string, number> = new Map();\n private sstCntAll: number = 0;\n private _autofilterIsOn: boolean = false;\n\n private _oaEpoch: number;\n\n // Format registry\n private _formatRegistry: Map<string, number> = new Map();\n private _formatXfMap: Map<string, number> = new Map();\n private _nextNumfmtId: number = 165;\n private _nextXfIndex: number = 4;\n\n private readonly stream = new StreamingSheetState();\n private currentColLetters: string[] = [];\n\n /**\n * @param filePath Destination `.xlsx` path on disk.\n */\n constructor(filePath: string) {\n this.output = fs.createWriteStream(filePath);\n this.archive = archiver('zip');\n\n this.archive.pipe(this.output);\n\n this._oaEpoch = Date.UTC(1899, 11, 30);\n }\n\n private _getColumnLetter(colIndex: number): string {\n return colIndex < COLUMN_LETTERS.length ? COLUMN_LETTERS[colIndex] : 'A';\n }\n\n /** @deprecated Internal; kept for unit-test access. Prefer sanitizeSheetName(). */\n private _sanitizeSheetName(name: string): string {\n return sanitizeSheetName(name, this.sheetCount);\n }\n\n private _escapeSheetNameForXml(name: string): string {\n return name\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n }\n\n private _formatSheetNameForFormula(name: string): string {\n if (/[\\s\\-+=()!@#$%^&]/.test(name) || /^[0-9]/.test(name)) {\n const escaped = name.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n return name;\n }\n\n /**\n * Register a worksheet (metadata only). Prefer `writeSheet` / `startSheet` for data.\n */\n addSheet(sheetName: string, hidden: boolean = false): void {\n const sanitizedName = sanitizeSheetName(sheetName, this.sheetCount);\n\n this.sheetCount++;\n const rId = `rId${this.sheetCount}`;\n const sheetFileName = `sheet${this.sheetCount}.xml`;\n this.sheetList.push({\n name: sanitizedName,\n pathInArchive: `xl/worksheets/${sheetFileName}`,\n hidden: hidden,\n nameInArchive: sheetFileName,\n sheetId: this.sheetCount,\n rId: rId,\n filterHeaderRange: null\n });\n }\n\n private _needsEscape(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c === 38 || c === 60 || c === 62 || c === 34 || c === 39 ||\n (c >= 0 && c <= 8) || c === 11 || c === 12 || (c >= 14 && c <= 31)) {\n return true;\n }\n }\n return false;\n }\n\n private _escape(str: string): string {\n if (typeof str !== 'string') return str;\n if (!this._needsEscape(str)) return str;\n\n return str.replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g, '');\n }\n\n /**\n * Start streaming a sheet. Call `writeRow` for each row, then `endSheet`.\n */\n startSheet(\n sheetName: string,\n columnCount: number,\n headers?: string[],\n options: { hidden?: boolean; doAutofilter?: boolean; sampleRows?: unknown[][] } = {}\n ): void {\n const { hidden = false, doAutofilter = true, sampleRows } = options;\n\n this.addSheet(sheetName, hidden);\n\n this.stream.begin(columnCount, doAutofilter && headers !== undefined, new BigBuffer());\n const bigBuf = this.stream.buffer!;\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n this.currentColLetters = colLetters;\n\n if (headers) {\n applyHeaderWidths(this.stream.colWidths, headers, columnCount);\n }\n if (sampleRows) {\n updateColWidthsFromRows(this.stream.colWidths, sampleRows);\n }\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString('<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">');\n\n // Dimension - just A1 since we don't know row count in advance\n bigBuf.writeString('<dimension ref=\"A1\"/>');\n\n const isFirstSheet = this.sheetCount === 1;\n if (headers) {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n } else {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n }\n\n bigBuf.writeString('<cols>');\n for (let i = 0; i < columnCount; i++) {\n const width = defaultColWidth(this.stream.colWidths[i]);\n bigBuf.writeString(`<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" bestFit=\"1\" customWidth=\"1\" />`);\n }\n bigBuf.writeString('</cols><sheetData>');\n\n if (headers) {\n this.stream.rowNum++;\n bigBuf.writeString(`<row r=\"${this.stream.rowNum}\">`);\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(bigBuf, headers[c], colLetters[c], this.stream.rowNum, 3);\n }\n bigBuf.writeString('</row>');\n }\n }\n\n /** Write one data row in streaming mode. */\n writeRow(row: CellValue[]): void {\n const bigBuf = this.stream.assertStreaming();\n\n if (row.length !== this.stream.endCol - this.stream.startCol) {\n throw new Error(\n `Row length mismatch. Expected ${this.stream.endCol - this.stream.startCol} columns, got ${row.length}`\n );\n }\n\n this.stream.rowNum++;\n bigBuf.writeString(`<row r=\"${this.stream.rowNum}\">`);\n\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const xfIdx = fmtString !== null ? this._registerFormat(fmtString) : -1;\n const styleAttr = xfIdx >= 0 ? ` s=\"${xfIdx}\"` : '';\n\n const colRef = this.currentColLetters[c];\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n bigBuf.writeString(`<c r=\"${colRef}${this.stream.rowNum}\"${styleAttr}><v>${val}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (typeof val === 'bigint') {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n } else if (typeof val === 'boolean') {\n bigBuf.writeString(`<c r=\"${colRef}${this.stream.rowNum}\" t=\"b\"${styleAttr}><v>${val ? 1 : 0}</v></c>`);\n } else if (val instanceof Date) {\n const oaDate = this._toOADate(val);\n if (Number.isFinite(oaDate)) {\n const finalStyle = xfIdx >= 0 ? xfIdx : 1;\n bigBuf.writeString(`<c r=\"${colRef}${this.stream.rowNum}\" s=\"${finalStyle}\"><v>${oaDate}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (val !== null && val !== undefined) {\n this._writeStringCell(bigBuf, val.toString(), colRef, this.stream.rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n }\n bigBuf.writeString('</row>');\n }\n\n /** Finish the current streaming sheet and append it to the archive. */\n endSheet(): void {\n const bigBuf = this.stream.assertStreaming();\n bigBuf.writeString('</sheetData>');\n\n if (this.stream.doAutofilter && this.stream.endCol > 0) {\n this._autofilterIsOn = true;\n const filterRef = `A1:${this.currentColLetters[this.stream.endCol - 1]}${this.stream.rowNum}`;\n bigBuf.writeString(`<autoFilter ref=\"${filterRef}\"/>`);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n const formulaSheetName = this._formatSheetNameForFormula(sheet.name);\n sheet.filterHeaderRange = `${formulaSheetName}!$A$1:$${this.currentColLetters[this.stream.endCol - 1]}$${this.stream.rowNum}`;\n }\n\n bigBuf.writeString('</worksheet>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n\n this.stream.end();\n this.currentColLetters = [];\n }\n\n /**\n * Write an entire sheet in one call (batch mode).\n */\n writeSheet(rows: CellValue[][], headers: string[] | null = null, doAutofilter: boolean = true): void {\n const bigBuf = new BigBuffer();\n\n let columnCount = 0;\n if (rows.length > 0) {\n columnCount = rows[0].length;\n } else if (headers) {\n columnCount = headers.length;\n }\n\n const colWidths = initColWidths(columnCount);\n\n const colLetters = new Array(columnCount);\n for (let i = 0; i < columnCount; i++) {\n colLetters[i] = this._getColumnLetter(i);\n }\n\n if (headers) {\n applyHeaderWidths(colWidths, headers, columnCount);\n }\n updateColWidthsFromRows(colWidths, rows);\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString('<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">');\n\n const totalRows = rows.length + (headers ? 1 : 0);\n if (totalRows > 0 && columnCount > 0) {\n bigBuf.writeString(`<dimension ref=\"A1:${colLetters[columnCount - 1]}${totalRows}\"/>`);\n } else {\n bigBuf.writeString('<dimension ref=\"A1\"/>');\n }\n\n const isFirstSheet = this.sheetCount === 1;\n if (headers) {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\" /><selection pane=\"bottomLeft\" /></sheetView></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n } else {\n if (isFirstSheet) {\n bigBuf.writeString('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n } else {\n bigBuf.writeString('<sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n }\n\n bigBuf.writeString('<cols>');\n for (let i = 0; i < columnCount; i++) {\n const width = defaultColWidth(colWidths[i]);\n bigBuf.writeString(`<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" bestFit=\"1\" customWidth=\"1\" />`);\n }\n bigBuf.writeString('</cols><sheetData>');\n\n let rowNum = 0;\n\n if (headers) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n for (let c = 0; c < headers.length; c++) {\n this._writeStringCell(bigBuf, headers[c], colLetters[c], rowNum, 3);\n }\n bigBuf.writeString('</row>');\n }\n\n for (let r = 0; r < rows.length; r++) {\n rowNum++;\n bigBuf.writeString(`<row r=\"${rowNum}\">`);\n const row = rows[r];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const xfIdx = fmtString !== null ? this._registerFormat(fmtString) : -1;\n const styleAttr = xfIdx >= 0 ? ` s=\"${xfIdx}\"` : '';\n\n const colRef = colLetters[c];\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\"${styleAttr}><v>${val}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (typeof val === 'bigint') {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n } else if (typeof val === 'boolean') {\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\" t=\"b\"${styleAttr}><v>${val ? 1 : 0}</v></c>`);\n } else if (val instanceof Date) {\n const oaDate = this._toOADate(val);\n if (Number.isFinite(oaDate)) {\n const finalStyle = xfIdx >= 0 ? xfIdx : 1;\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\" s=\"${finalStyle}\"><v>${oaDate}</v></c>`);\n } else {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n } else if (val !== null && val !== undefined) {\n this._writeStringCell(bigBuf, val.toString(), colRef, rowNum, xfIdx >= 0 ? xfIdx : undefined);\n }\n }\n bigBuf.writeString('</row>');\n }\n\n bigBuf.writeString('</sheetData>');\n\n if (doAutofilter && headers && columnCount > 0) {\n this._autofilterIsOn = true;\n const filterRef = `A1:${colLetters[columnCount - 1]}${totalRows}`;\n bigBuf.writeString(`<autoFilter ref=\"${filterRef}\"/>`);\n\n const sheet = this.sheetList[this.sheetCount - 1];\n const formulaSheetName = this._formatSheetNameForFormula(sheet.name);\n sheet.filterHeaderRange = `${formulaSheetName}!$A$1:$${colLetters[columnCount - 1]}$${totalRows}`;\n }\n\n bigBuf.writeString('</worksheet>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), {\n name: this.sheetList[this.sheetCount - 1].pathInArchive\n });\n }\n\n private _writeStringCell(bigBuf: BigBuffer, val: string, colRef: string, rowNum: number, styleOverride?: number): void {\n let index = this.sstMap.get(val);\n if (index === undefined) {\n index = this.sstArray.length;\n this.sstArray.push(val);\n this.sstMap.set(val, index);\n }\n this.sstCntAll++;\n const styleAttr = styleOverride !== undefined ? ` s=\"${styleOverride}\"` : '';\n bigBuf.writeString(`<c r=\"${colRef}${rowNum}\" t=\"s\"${styleAttr}><v>${index}</v></c>`);\n }\n\n private _registerFormat(fmtString: string): number {\n if (this._formatXfMap.has(fmtString)) {\n return this._formatXfMap.get(fmtString)!;\n }\n const numfmtId = this._nextNumfmtId++;\n this._formatRegistry.set(fmtString, numfmtId);\n const xfIndex = this._nextXfIndex++;\n this._formatXfMap.set(fmtString, xfIndex);\n return xfIndex;\n }\n\n private _toOADate(date: Date): number {\n // Use UTC time to avoid timezone conversion issues\n return (date.getTime() - this._oaEpoch) / 86400000;\n }\n\n private _getDateWidth(_date: Date): number {\n return 19; // \"YYYY-MM-DD HH:MM:SS\" ≈ 19 chars\n }\n\n /** Finalize the ZIP package and close the output stream. */\n finalize(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this._writeSharedStrings();\n this._writeStyles();\n this._writeWorkbook();\n this._writeContentTypes();\n this._writeRels();\n\n this.output.on('close', () => {\n resolve();\n });\n\n this.archive.on('error', (err: any) => {\n reject(err);\n });\n\n this.archive.finalize();\n } catch (err) {\n reject(err);\n }\n });\n }\n\n private _writeSharedStrings(): void {\n const bigBuf = new BigBuffer();\n\n bigBuf.writeString('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n bigBuf.writeString(`<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${this.sstCntAll}\" uniqueCount=\"${this.sstArray.length}\">`);\n\n for (let i = 0; i < this.sstArray.length; i++) {\n const txt = this.sstArray[i];\n const cleanTxt = this._escape(txt);\n if (cleanTxt.length > 0 && (cleanTxt[0] === ' ' || cleanTxt[cleanTxt.length - 1] === ' ' || /[\\t\\n\\r]/.test(cleanTxt))) {\n bigBuf.writeString(`<si><t xml:space=\"preserve\">${cleanTxt}</t></si>`);\n } else {\n bigBuf.writeString(`<si><t>${cleanTxt}</t></si>`);\n }\n }\n\n bigBuf.writeString('</sst>');\n\n this.archive.append(Readable.from(bigBuf.getChunks()), { name: 'xl/sharedStrings.xml' });\n }\n\n private _writeStyles(): void {\n let numFmts = '';\n let numFmtCount = 0;\n\n const xfEntries: string[] = [];\n xfEntries.push('<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>');\n xfEntries.push('<xf numFmtId=\"14\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>');\n xfEntries.push('<xf numFmtId=\"22\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>');\n xfEntries.push('<xf numFmtId=\"0\" fontId=\"1\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"/>');\n\n for (const [fmtString, numfmtId] of this._formatRegistry) {\n const escapedFmt = fmtString\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n numFmts += `<numFmt numFmtId=\"${numfmtId}\" formatCode=\"${escapedFmt}\"/>`;\n numFmtCount++;\n }\n\n const sortedFormats = [...this._formatXfMap.entries()].sort((a, b) => a[1] - b[1]);\n for (const [fmtString] of sortedFormats) {\n const numfmtId = this._formatRegistry.get(fmtString)!;\n xfEntries.push(`<xf numFmtId=\"${numfmtId}\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>`);\n }\n\n const totalXf = xfEntries.length;\n const numFmtsSection = numFmtCount > 0 ? `<numFmts count=\"${numFmtCount}\">${numFmts}</numFmts>` : '';\n\n const styles = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsSection}\n<fonts count=\"2\">\n<font><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font>\n<font><b/><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></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><left/><right/><top/><bottom/><diagonal/></border>\n</borders>\n<cellStyleXfs count=\"1\">\n<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\n</cellStyleXfs>\n<cellXfs count=\"${totalXf}\">\n${xfEntries.join('\\n')}\n</cellXfs>\n<cellStyles count=\"1\">\n<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>\n</cellStyles>\n<dxfs count=\"0\"/>\n<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>\n</styleSheet>`;\n this.archive.append(styles, { name: 'xl/styles.xml' });\n }\n\n private _writeWorkbook(): void {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n<fileVersion appName=\"xl\" lastEdited=\"4\" lowestEdited=\"4\" rupBuild=\"4505\"/>\n<workbookPr defaultThemeVersion=\"124226\"/>\n<bookViews><workbookView xWindow=\"240\" yWindow=\"15\" windowWidth=\"16095\" windowHeight=\"9660\"/></bookViews>\n<sheets>`;\n\n for (const sheet of this.sheetList) {\n const state = sheet.hidden ? ' state=\"hidden\"' : '';\n const escapedName = this._escapeSheetNameForXml(sheet.name);\n xml += `<sheet name=\"${escapedName}\" sheetId=\"${sheet.sheetId}\"${state} r:id=\"${sheet.rId}\"/>`;\n }\n\n xml += `</sheets>`;\n\n if (this._autofilterIsOn) {\n xml += '<definedNames>';\n for (const sheet of this.sheetList) {\n if (sheet.filterHeaderRange) {\n const localSheetId = sheet.sheetId - 1;\n const escapedRange = this._escape(sheet.filterHeaderRange);\n xml += `<definedName name=\"_xlnm._FilterDatabase\" localSheetId=\"${localSheetId}\" hidden=\"1\">${escapedRange}</definedName>`;\n }\n }\n xml += '</definedNames>';\n }\n\n xml += '<calcPr calcId=\"124519\" fullCalcOnLoad=\"1\"/>';\n xml += `</workbook>`;\n this.archive.append(xml, { name: 'xl/workbook.xml' });\n }\n\n private _writeContentTypes(): void {\n let xml = `<?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=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>\n<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\n<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\n<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>`;\n\n for (const sheet of this.sheetList) {\n xml += `<Override PartName=\"/${sheet.pathInArchive}\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n }\n\n xml += `</Types>`;\n this.archive.append(xml, { name: '[Content_Types].xml' });\n }\n\n private _writeRels(): void {\n const globalRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\n</Relationships>`;\n this.archive.append(globalRels, { name: '_rels/.rels' });\n\n let wbRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`;\n\n for (const sheet of this.sheetList) {\n wbRels += `<Relationship Id=\"${sheet.rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/${sheet.nameInArchive}\"/>`;\n }\n\n let nextId = this.sheetList.length + 1;\n wbRels += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n wbRels += `<Relationship Id=\"rId${nextId++}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/>`;\n\n wbRels += `</Relationships>`;\n this.archive.append(wbRels, { name: 'xl/_rels/workbook.xml.rels' });\n }\n}\n\nexport default XlsxWriter;\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport { writeBufferAtomically } from './atomicFile';\nimport { writeAdmZipStreaming, StagedZipPart } from './streamingZip';\nimport {\n escapeXmlText,\n columnIndexToLetter,\n columnLetterToIndex,\n parseSharedStringsXml,\n trimTrailingEmptyRows,\n} from './xmlUtils';\n\n/**\n * Options for {@link XlsxUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use style 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\n/** A one-pass synchronous or asynchronous source of worksheet rows. */\nexport type RowSource =\n | Iterable<ReadonlyArray<CellValue>>\n | AsyncIterable<ReadonlyArray<CellValue>>;\n\ninterface PivotCacheDef {\n path: string;\n xml: string;\n}\n\n/**\n * Update the data of a worksheet inside an existing XLSX file without rebuilding\n * the workbook. Everything outside the target sheet's cell data — pivot tables\n * and their caches, other sheets, styles, themes, defined names — is preserved\n * byte-for-byte. This makes it possible to refresh a data sheet that other\n * Excel features (pivot tables, charts, formulas) are wired to.\n *\n * ```ts\n * const updater = new XlsxUpdater('report.xlsx');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsx'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsxUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n private temporaryDirectory: string | null = null;\n private readonly stagedParts: StagedZipPart = new Map();\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefs: PivotCacheDef[] = [];\n private pivotTableDefPaths: string[] = [];\n\n private sharedStringsXml: string | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsOriginalLength: number = 0;\n private sharedStringsCount: number = 0;\n private sharedStringsPending: string[] = [];\n private sharedStringsDirty: boolean = false;\n private stringIndexMap: Map<string, number> = new Map();\n\n private readonly _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsx` file.\n */\n constructor(filePath: string) {\n this.sourcePath = filePath;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`XlsxUpdater: file not found: ${filePath}`);\n }\n\n this.zip = new AdmZip(filePath);\n\n if (this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsxUpdater: XLSB files are not supported yet. Convert the workbook to XLSX first.'\n );\n }\n if (!this.zip.getEntry('xl/workbook.xml')) {\n throw new Error('XlsxUpdater: not a valid XLSX workbook (xl/workbook.xml missing).');\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsxUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsxUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetXml = this._entryData(sheetPath).toString('utf8');\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsXml !== null) {\n this.sharedStringsCount = Math.max(\n 0,\n this.sharedStringsCount - this._sharedStringRefCount(sheetXml),\n );\n this.sharedStringsDirty = true;\n }\n\n let colStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateStyle: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectExistingStyles(sheetXml);\n colStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateStyle = this._findDateStyleIndex();\n }\n\n const lastCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0) - 1;\n const totalRows = rows.length + (headers ? 1 : 0);\n\n const newSheetData = this._buildSheetData(rows, headers, colStyles, headerStyles, dateStyle);\n const newXml = this._patchSheetXml(sheetXml, newSheetData, totalRows, lastCol);\n this.zip.updateFile(sheetPath, Buffer.from(newXml, 'utf8'));\n this._discardStagedPart(sheetPath);\n\n if (this.sharedStringsXml !== null) {\n this._commitSharedStrings();\n }\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n this._updatePivotCaches(sheetName, dimRef, rows.length);\n this._addRefreshOnLoadToPivotTables();\n }\n\n /**\n * Replace worksheet rows from a one-pass source without materialising the\n * complete result set. Use {@link saveStreaming} to keep the final ZIP\n * write streaming as well.\n */\n async replaceSheetDataStream(\n sheetName: string,\n rows: RowSource,\n options: ReplaceSheetDataOptions = {},\n ): Promise<void> {\n const { headers, styleFallback = 'inherit' } = options;\n if (styleFallback !== 'inherit' && styleFallback !== 'general') {\n throw new Error(\"XlsxUpdater: styleFallback must be 'inherit' or 'general'.\");\n }\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsxUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsxUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const oldStage = this.stagedParts.get(sheetPath);\n const beforeValuesLength = this.sharedStringsValues.length;\n const beforePendingLength = this.sharedStringsPending.length;\n const beforeSharedStringsCount = this.sharedStringsCount;\n const beforeSharedStringsDirty = this.sharedStringsDirty;\n const beforeSharedStringsXml = this.sharedStringsXml;\n const beforeSharedStringsOriginalLength = this.sharedStringsOriginalLength;\n const beforeStringIndexMap = new Map(this.stringIndexMap);\n const sharedStringsEntry = this.zip.getEntry('xl/sharedStrings.xml');\n const beforeSharedStringsBytes = sharedStringsEntry || this.stagedParts.has('xl/sharedStrings.xml')\n ? Buffer.from(this._entryData('xl/sharedStrings.xml'))\n : null;\n const createdParts: string[] = [];\n const oldSheetXml = this._entryData(sheetPath).toString('utf8');\n const rowsPath = this._temporaryPath('.rows');\n const outputPath = this._temporaryPath('.xml');\n createdParts.push(rowsPath, outputPath);\n let output: fs.WriteStream | null = null;\n\n try {\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsXml !== null) {\n this.sharedStringsCount = Math.max(\n 0,\n this.sharedStringsCount - this._sharedStringRefCount(oldSheetXml),\n );\n this.sharedStringsDirty = true;\n }\n\n let colStyles = new Map<number, number>();\n let headerStyles = new Map<number, number>();\n let dateStyle: number | null = null;\n if (styleFallback !== 'general') {\n const collected = this._collectExistingStyles(oldSheetXml);\n colStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateStyle = this._findDateStyleIndex();\n }\n\n const prefixMatch = /<([A-Za-z_][\\w.-]*:)?sheetData\\b/.exec(oldSheetXml);\n const prefix = prefixMatch?.[1] ?? '';\n const rowOutput = fs.createWriteStream(rowsPath);\n output = rowOutput;\n let outputError: Error | null = null;\n rowOutput.on('error', error => { outputError = error; });\n\n let nextRow = 1;\n let width = headers?.length ?? 0;\n let dataRowsSeen = 0;\n let keptDataRows = 0;\n let lastKeptEnd = 0;\n let pendingEmptyWidth = 0;\n let writtenBytes = 0;\n\n const write = async (data: Buffer): Promise<void> => {\n if (outputError) throw outputError;\n writtenBytes += data.length;\n if (rowOutput.write(data)) return;\n await new Promise<void>((resolve, reject) => {\n const onDrain = () => { cleanup(); resolve(); };\n const onError = (error: Error) => { cleanup(); reject(error); };\n const cleanup = () => {\n rowOutput.off('drain', onDrain);\n rowOutput.off('error', onError);\n };\n rowOutput.once('drain', onDrain);\n rowOutput.once('error', onError);\n });\n };\n\n if (headers !== undefined) {\n const cells = headers.map((value, column) =>\n this._valueCell(value, column, nextRow, headerStyles, dateStyle));\n const header = `<${prefix}row r=\"${nextRow}\">${cells.join('')}</${prefix}row>`;\n await write(Buffer.from(header, 'utf8'));\n lastKeptEnd = writtenBytes;\n nextRow++;\n }\n\n for await (const sourceRow of rows) {\n if (typeof sourceRow === 'string' || sourceRow instanceof Uint8Array) {\n throw new TypeError('Each row must be an iterable of cells, not text');\n }\n const row = Array.from(sourceRow) as CellValue[];\n const cells = row.map((value, column) =>\n value === null || value === undefined\n ? ''\n : this._valueCell(value, column, nextRow, colStyles, dateStyle));\n const rowXml = `<${prefix}row r=\"${nextRow}\">${cells.join('')}</${prefix}row>`;\n await write(Buffer.from(rowXml, 'utf8'));\n dataRowsSeen++;\n nextRow++;\n\n if (row.every(value => value === null || value === undefined)) {\n pendingEmptyWidth = Math.max(pendingEmptyWidth, row.length);\n } else {\n width = Math.max(width, pendingEmptyWidth, row.length);\n pendingEmptyWidth = 0;\n keptDataRows = dataRowsSeen;\n lastKeptEnd = writtenBytes;\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n rowOutput.once('close', resolve);\n rowOutput.once('error', reject);\n rowOutput.end();\n });\n if (outputError) throw outputError;\n\n const rowsFd = fs.openSync(rowsPath, 'r+');\n try {\n fs.ftruncateSync(rowsFd, lastKeptEnd);\n } finally {\n fs.closeSync(rowsFd);\n }\n\n const totalRows = keptDataRows + (headers !== undefined ? 1 : 0);\n const lastCol = width - 1;\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n this._patchSheetFile(oldSheetXml, rowsPath, outputPath, dimRef);\n this._stagePart(sheetPath, outputPath);\n this._commitSharedStrings();\n this._updatePivotCaches(sheetName, dimRef, keptDataRows);\n this._addRefreshOnLoadToPivotTables();\n\n if (oldStage && oldStage !== outputPath) {\n this._removeTemporaryFile(oldStage);\n }\n createdParts.splice(createdParts.indexOf(outputPath), 1);\n } catch (error) {\n this.sharedStringsValues.length = beforeValuesLength;\n this.sharedStringsPending.length = beforePendingLength;\n this.sharedStringsCount = beforeSharedStringsCount;\n this.sharedStringsDirty = beforeSharedStringsDirty;\n this.sharedStringsXml = beforeSharedStringsXml;\n this.sharedStringsOriginalLength = beforeSharedStringsOriginalLength;\n this.stringIndexMap.clear();\n for (const [value, index] of beforeStringIndexMap) this.stringIndexMap.set(value, index);\n if (beforeSharedStringsBytes) {\n this.zip.updateFile('xl/sharedStrings.xml', beforeSharedStringsBytes);\n }\n if (oldStage) this.stagedParts.set(sheetPath, oldStage);\n else this.stagedParts.delete(sheetPath);\n throw error;\n } finally {\n if (output && !output.closed) output.destroy();\n for (const temporaryPath of createdParts) {\n this._removeTemporaryFile(temporaryPath);\n }\n }\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n this._materializeStagedParts();\n writeBufferAtomically(this.zip.toBuffer(), target);\n }\n\n /** Save staged streaming replacements without materialising the ZIP. */\n async saveStreaming(outputPath?: string): Promise<void> {\n const target = outputPath ?? this.sourcePath;\n await writeAdmZipStreaming(this.zip, this.stagedParts, target);\n\n // Keep the updater reusable after an in-place save. The synchronous\n // AdmZip path is refreshed with the staged parts only after the output\n // archive has been safely installed.\n this._materializeStagedParts();\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n this._materializeStagedParts();\n return this.zip.toBuffer();\n }\n\n /**\n * Release the staging directory and any unsaved staged parts.\n * The updater remains usable; a new staging directory is created lazily\n * on the next streaming replacement.\n */\n dispose(): void {\n for (const stagedPath of this.stagedParts.values()) {\n try {\n fs.rmSync(stagedPath, { force: true });\n } catch {\n // Best-effort cleanup.\n }\n }\n this.stagedParts.clear();\n if (this.temporaryDirectory !== null) {\n try {\n fs.rmSync(this.temporaryDirectory, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup.\n }\n this.temporaryDirectory = null;\n }\n }\n\n /** Support `using` declarations for automatic staging cleanup. */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n private _ensureTemporaryDirectory(): string {\n if (this.temporaryDirectory === null) {\n this.temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'spreadsheet-updater-'));\n } else {\n try {\n fs.mkdirSync(this.temporaryDirectory, { recursive: true });\n } catch {\n // Best-effort; file creation will surface persistent failures.\n }\n }\n return this.temporaryDirectory;\n }\n\n private _temporaryPath(suffix: string): string {\n return path.join(this._ensureTemporaryDirectory(), `part-${Date.now()}-${Math.random().toString(16).slice(2)}${suffix}`);\n }\n\n private _removeTemporaryFile(filePath: string): void {\n try {\n fs.rmSync(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n\n private _entryData(name: string): Buffer {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) return fs.readFileSync(stagedPath);\n const entry = this.zip.getEntry(name);\n if (!entry) throw new Error(`XlsxUpdater: ZIP member missing: ${name}`);\n return entry.getData();\n }\n\n private _stagePart(name: string, filePath: string): void {\n this.stagedParts.set(name, filePath);\n }\n\n private _discardStagedPart(name: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (!stagedPath) return;\n this._removeTemporaryFile(stagedPath);\n this.stagedParts.delete(name);\n }\n\n private _materializeStagedParts(): void {\n for (const [name, stagedPath] of this.stagedParts) {\n this.zip.updateFile(name, fs.readFileSync(stagedPath));\n this._removeTemporaryFile(stagedPath);\n }\n this.stagedParts.clear();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.xml.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n while ((match = relRegex.exec(rels)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.xml');\n const wbXml = wbEntry ? wbEntry.getData().toString('utf8') : '';\n const sheetRe = /<sheet\\b[^>]*>/g;\n let match;\n while ((match = sheetRe.exec(wbXml)) !== null) {\n const tag = match[0];\n const nameMatch = /name=\"([^\"]*)\"/.exec(tag);\n const rIdMatch = /r:id=\"([^\"]*)\"/.exec(tag);\n if (!nameMatch || !rIdMatch) continue;\n const name = nameMatch[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n const target = rIdToTarget[rIdMatch[1]] ?? '';\n let fullPath = target;\n if (fullPath.startsWith('/')) {\n fullPath = fullPath.substring(1);\n } else if (!fullPath.startsWith('xl/')) {\n fullPath = 'xl/' + fullPath;\n }\n if (fullPath) {\n this.sheetNameToPath.set(name, fullPath);\n }\n }\n\n for (const entry of this.zip.getEntries()) {\n const name = entry.entryName;\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.xml$/.test(name)) {\n this.pivotCacheDefs.push({ path: name, xml: entry.getData().toString('utf8') });\n } else if (/^xl\\/pivotTables\\/pivotTable\\d*\\.xml$/.test(name)) {\n this.pivotTableDefPaths.push(name);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsXml !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.xml');\n if (!entry && !this.stagedParts.has('xl/sharedStrings.xml')) {\n this.sharedStringsXml = null;\n return;\n }\n this.sharedStringsXml = this._entryData('xl/sharedStrings.xml').toString('utf8');\n this.sharedStringsValues = parseSharedStringsXml(this.sharedStringsXml);\n\n const countMatch = /<(?:[A-Za-z_][\\w.-]*:)?sst\\b[^>]*>/i.exec(this.sharedStringsXml);\n const countAttr = countMatch ? /(?:^|\\s)count\\s*=\\s*[\"'](\\d+)[\"']/.exec(countMatch[0]) : null;\n this.sharedStringsCount = countAttr ? parseInt(countAttr[1], 10) : this.sharedStringsValues.length;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this.sharedStringsOriginalLength = this.sharedStringsValues.length;\n this.sharedStringsPending = [];\n this.sharedStringsDirty = false;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsXml === null || !this.sharedStringsDirty) {\n return;\n }\n\n let xml = this.sharedStringsXml;\n\n const sstMatch = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sst\\b[^>]*>/i.exec(xml);\n if (!sstMatch || sstMatch.index === undefined) {\n throw new Error('XlsxUpdater: sharedStrings.xml has no sst element.');\n }\n const tag = sstMatch[0];\n const prefix = sstMatch.groups?.prefix ?? '';\n const newTag = XlsxUpdater._replaceOrAddXmlAttribute(\n XlsxUpdater._replaceOrAddXmlAttribute(tag, 'count', String(this.sharedStringsCount)),\n 'uniqueCount',\n String(this.sharedStringsValues.length),\n );\n xml = xml.substring(0, sstMatch.index) + newTag + xml.substring(sstMatch.index + tag.length);\n\n const closingRe = new RegExp(`</${prefix}sst\\\\s*>\\\\s*$`, 'i');\n const closingMatch = closingRe.exec(xml);\n if (!closingMatch || closingMatch.index === undefined) {\n throw new Error('XlsxUpdater: sharedStrings.xml has no closing sst element.');\n }\n\n const appended = this.sharedStringsPending.map(txt => {\n const clean = escapeXmlText(txt);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n const tAttr = preserve ? ' xml:space=\"preserve\"' : '';\n return `<${prefix}si><${prefix}t${tAttr}>${clean}</${prefix}t></${prefix}si>`;\n }).join('');\n\n xml = xml.substring(0, closingMatch.index) + appended + xml.substring(closingMatch.index);\n this.zip.updateFile('xl/sharedStrings.xml', Buffer.from(xml, 'utf8'));\n this.sharedStringsXml = xml;\n this.sharedStringsOriginalLength = this.sharedStringsValues.length;\n this.sharedStringsPending = [];\n this.sharedStringsDirty = false;\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectExistingStyles(sheetXml: string): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const sdStart = sheetXml.indexOf('<sheetData>');\n if (sdStart === -1) return { dataStyles: new Map(), headerStyles };\n const sdEnd = sheetXml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) return { dataStyles: new Map(), headerStyles };\n\n const region = sheetXml.substring(sdStart, sdEnd);\n const cellRe = /<c\\b[^>]*>/g;\n let m;\n while ((m = cellRe.exec(region)) !== null) {\n const tag = m[0];\n const rMatch = /r=\"([A-Z]+)(\\d+)\"/.exec(tag);\n if (!rMatch) continue;\n const col = columnLetterToIndex(rMatch[1]);\n const row = parseInt(rMatch[2], 10);\n const sMatch = /s=\"(\\d+)\"/.exec(tag);\n if (!sMatch) continue;\n const s = parseInt(sMatch[1], 10);\n if (s <= 0) continue;\n\n if (row === 1) {\n if (!headerStyles.has(col)) headerStyles.set(col, s);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(s, (colCounts.get(s) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [s, count] of colCounts) {\n if (count > bestCount) {\n best = s;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateStyleIndex(): number | null {\n const entry = this.zip.getEntry('xl/styles.xml');\n if (!entry) return null;\n const xml = entry.getData().toString('utf8');\n\n const customDateFormats = new Set<number>();\n const numFmtRe = /<numFmt\\s+[^>]*numFmtId=\"(\\d+)\"[^>]*formatCode=\"([^\"]*)\"/g;\n let m;\n while ((m = numFmtRe.exec(xml)) !== null) {\n const id = parseInt(m[1], 10);\n const code = m[2].toLowerCase();\n if (code.includes('yy') || code.includes('mm') || code.includes('dd') || code.includes('h:mm')) {\n customDateFormats.add(id);\n }\n }\n\n const cellXfsStart = xml.indexOf('<cellXfs');\n if (cellXfsStart === -1) return null;\n const cellXfsEnd = xml.indexOf('</cellXfs>', cellXfsStart);\n if (cellXfsEnd === -1) return null;\n const cellXfsContent = xml.substring(cellXfsStart, cellXfsEnd);\n\n const xfRe = /<xf\\b[^>]*>/g;\n let index = 0;\n while ((m = xfRe.exec(cellXfsContent)) !== null) {\n const nfMatch = /numFmtId=\"(\\d+)\"/.exec(m[0]);\n const nfId = nfMatch ? parseInt(nfMatch[1], 10) : 0;\n const isDate = (nfId >= 14 && nfId <= 22) ||\n (nfId >= 45 && nfId <= 47) ||\n customDateFormats.has(nfId);\n if (isDate) return index;\n index++;\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Cell / row serialization\n // ------------------------------------------------------------------\n\n private _buildSheetData(\n rows: CellValue[][],\n headers: string[] | undefined,\n colStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n let out = '';\n let rowNum = 0;\n\n if (headers) {\n rowNum = 1;\n out += '<row r=\"1\">';\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n out += this._stringCell(headers[c], c, rowNum, style);\n }\n out += '</row>';\n }\n\n for (const row of rows) {\n rowNum++;\n out += `<row r=\"${rowNum}\">`;\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n out += this._valueCell(raw, c, rowNum, colStyles, dateStyle);\n }\n out += '</row>';\n }\n return out;\n }\n\n private _valueCell(\n raw: CellValue,\n col: number,\n rowNum: number,\n colStyles: Map<number, number>,\n dateStyle: number | null\n ): string {\n const colRef = columnIndexToLetter(col);\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = colStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val)) {\n return `<c r=\"${colRef}${rowNum}\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'bigint') {\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (typeof val === 'boolean') {\n return `<c r=\"${colRef}${rowNum}\" t=\"b\"${colStyle > 0 ? ` s=\"${colStyle}\"` : ''}><v>${val ? 1 : 0}</v></c>`;\n }\n if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateStyle !== null ? dateStyle : 0);\n return `<c r=\"${colRef}${rowNum}\"${style > 0 ? ` s=\"${style}\"` : ''}><v>${oaDate}</v></c>`;\n }\n return this._stringCell(val.toString(), col, rowNum, colStyle);\n }\n if (val !== null && val !== undefined) {\n return this._stringCell(String(val), col, rowNum, colStyle);\n }\n return '';\n }\n\n private _stringCell(text: string, col: number, rowNum: number, style: number): string {\n const colRef = columnIndexToLetter(col);\n const styleAttr = style > 0 ? ` s=\"${style}\"` : '';\n\n if (this.sharedStringsXml === null) {\n const clean = escapeXmlText(text);\n const preserve = clean.length > 0 && (clean[0] === ' ' || clean[clean.length - 1] === ' ' || /[\\t\\n\\r]/.test(clean));\n const tAttr = preserve ? ' xml:space=\"preserve\"' : '';\n return `<c r=\"${colRef}${rowNum}\" t=\"inlineStr\"${styleAttr}><is><t${tAttr}>${clean}</t></is></c>`;\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n this.sharedStringsPending.push(text);\n }\n this.sharedStringsCount++;\n this.sharedStringsDirty = true;\n return `<c r=\"${colRef}${rowNum}\" t=\"s\"${styleAttr}><v>${index}</v></c>`;\n }\n\n private static _replaceOrAddXmlAttribute(tag: string, name: string, value: string): string {\n const escaped = escapeXmlText(value);\n const attribute = new RegExp(`(\\\\s${name}\\\\s*=\\\\s*[\"'])[^\"']*([\"'])`, 'i');\n if (attribute.test(tag)) {\n return tag.replace(attribute, `$1${escaped}$2`);\n }\n const insertion = ` ${name}=\"${escaped}\"`;\n return tag.endsWith('/>')\n ? `${tag.slice(0, -2)}${insertion}/>`\n : `${tag.slice(0, -1)}${insertion}>`;\n }\n\n private _sharedStringRefCount(sheetXml: string): number {\n const cellTags = sheetXml.match(/<(?:(?:[A-Za-z_][\\w.-]*):)?c\\b[^>]*>/gi) ?? [];\n return cellTags.filter(tag => /(?:^|\\s)t\\s*=\\s*[\"']s[\"']/i.test(tag)).length;\n }\n\n // ------------------------------------------------------------------\n // Worksheet XML patching\n // ------------------------------------------------------------------\n\n private _patchSheetXml(sheetXml: string, newSheetData: string, totalRows: number, lastCol: number): string {\n let xml = sheetXml;\n\n const dimRef = totalRows > 0 && lastCol >= 0\n ? `A1:${columnIndexToLetter(lastCol)}${totalRows}`\n : 'A1';\n\n // Update the dimension element, or insert one if missing.\n const dimRe = /<dimension\\b[^>]*>/;\n const dimMatch = dimRe.exec(xml);\n if (dimMatch) {\n xml = xml.substring(0, dimMatch.index) +\n dimMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(dimMatch.index + dimMatch[0].length);\n } else {\n const rootRe = /<worksheet\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n const insertAt = rootMatch.index + rootMatch[0].length;\n xml = xml.substring(0, insertAt) + `<dimension ref=\"${dimRef}\"/>` + xml.substring(insertAt);\n }\n }\n\n // Replace the entire sheetData element content.\n const sdOpen = '<sheetData>';\n const sdStart = xml.indexOf(sdOpen);\n if (sdStart === -1) {\n const selfClosing = /<sheetData\\s*\\/\\s*>/;\n const scMatch = selfClosing.exec(xml);\n if (scMatch) {\n xml = xml.substring(0, scMatch.index) +\n '<sheetData>' + newSheetData + '</sheetData>' +\n xml.substring(scMatch.index + scMatch[0].length);\n return xml;\n }\n throw new Error('XlsxUpdater: <sheetData> element not found in worksheet XML.');\n }\n const sdEnd = xml.indexOf('</sheetData>', sdStart);\n if (sdEnd === -1) {\n throw new Error('XlsxUpdater: <sheetData> element not closed in worksheet XML.');\n }\n xml = xml.substring(0, sdStart + sdOpen.length) + newSheetData + xml.substring(sdEnd);\n\n // Keep the autoFilter range in sync with the new data bounds.\n const afRe = /<autoFilter\\b[^>]*>/;\n const afMatch = afRe.exec(xml);\n if (afMatch && totalRows > 0 && lastCol >= 0 && afMatch[0].includes('ref=')) {\n xml = xml.substring(0, afMatch.index) +\n afMatch[0].replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(afMatch.index + afMatch[0].length);\n }\n\n return xml;\n }\n\n private _patchSheetFile(\n sheetXml: string,\n rowsPath: string,\n outputPath: string,\n dimensionRef: string,\n ): void {\n const source = Buffer.from(sheetXml, 'utf8');\n const text = sheetXml;\n const replacements: Array<{\n start: number;\n end: number;\n data?: Buffer;\n rows?: boolean;\n suffix?: Buffer;\n }> = [];\n\n const emptySheetData = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sheetData\\b(?<attrs>[^>]*)\\/>/i.exec(text);\n if (emptySheetData && emptySheetData.index !== undefined) {\n const prefix = emptySheetData.groups?.prefix ?? '';\n replacements.push({\n start: emptySheetData.index,\n end: emptySheetData.index + emptySheetData[0].length,\n data: Buffer.from(`<${prefix}sheetData${emptySheetData.groups?.attrs ?? ''}>`, 'utf8'),\n rows: true,\n suffix: Buffer.from(`</${prefix}sheetData>`, 'utf8'),\n });\n } else {\n const opening = /<(?<prefix>[A-Za-z_][\\w.-]*:)?sheetData\\b[^>]*>/i.exec(text);\n if (!opening || opening.index === undefined) {\n throw new Error('XlsxUpdater: <sheetData> element not found in worksheet XML.');\n }\n const prefix = opening.groups?.prefix ?? '';\n const closeRe = new RegExp(`</${prefix}sheetData\\\\s*>`, 'i');\n const closing = closeRe.exec(text.slice(opening.index + opening[0].length));\n if (!closing || closing.index === undefined) {\n throw new Error('XlsxUpdater: <sheetData> element not closed in worksheet XML.');\n }\n const closingStart = opening.index + opening[0].length + closing.index;\n replacements.push({\n start: opening.index + opening[0].length,\n end: closingStart,\n rows: true,\n });\n }\n\n const dimension = /<(?<prefix>[A-Za-z_][\\w.-]*:)?dimension\\b[^>]*>/i.exec(text);\n if (dimension && dimension.index !== undefined) {\n replacements.push({\n start: dimension.index,\n end: dimension.index + dimension[0].length,\n data: Buffer.from(\n XlsxUpdater._replaceOrAddXmlAttribute(dimension[0], 'ref', dimensionRef),\n ),\n });\n } else {\n const root = /<(?<prefix>[A-Za-z_][\\w.-]*:)?worksheet\\b[^>]*>/i.exec(text);\n if (root && root.index !== undefined) {\n const prefix = root.groups?.prefix ?? '';\n const insertAt = root.index + root[0].length;\n replacements.push({\n start: insertAt,\n end: insertAt,\n data: Buffer.from(`<${prefix}dimension ref=\"${dimensionRef}\"/>`, 'utf8'),\n });\n }\n }\n\n const autoFilter = /<(?<prefix>[A-Za-z_][\\w.-]*:)?autoFilter\\b[^>]*>/i.exec(text);\n if (autoFilter && autoFilter.index !== undefined) {\n replacements.push({\n start: autoFilter.index,\n end: autoFilter.index + autoFilter[0].length,\n data: Buffer.from(\n XlsxUpdater._replaceOrAddXmlAttribute(autoFilter[0], 'ref', dimensionRef),\n 'utf8',\n ),\n });\n }\n\n replacements.sort((a, b) => a.start - b.start || a.end - b.end);\n const fd = fs.openSync(outputPath, 'w');\n let cursor = 0;\n const writeBuffer = (data: Buffer) => {\n fs.writeSync(fd, data);\n };\n const copyRows = () => {\n const rowsFd = fs.openSync(rowsPath, 'r');\n try {\n const chunk = Buffer.alloc(1024 * 1024);\n const length = fs.statSync(rowsPath).size;\n let position = 0;\n while (position < length) {\n const count = fs.readSync(rowsFd, chunk, 0, Math.min(chunk.length, length - position), position);\n if (count <= 0) throw new Error('XlsxUpdater: failed to read staged rows.');\n fs.writeSync(fd, chunk, 0, count);\n position += count;\n }\n } finally {\n fs.closeSync(rowsFd);\n }\n };\n try {\n for (const replacement of replacements) {\n const startByte = Buffer.byteLength(text.slice(0, replacement.start), 'utf8');\n const endByte = Buffer.byteLength(text.slice(0, replacement.end), 'utf8');\n if (startByte < cursor) throw new Error('XlsxUpdater: overlapping worksheet replacements.');\n writeBuffer(source.subarray(cursor, startByte));\n if (replacement.data) writeBuffer(replacement.data);\n if (replacement.rows) copyRows();\n if (replacement.suffix) writeBuffer(replacement.suffix);\n cursor = endByte;\n }\n writeBuffer(source.subarray(cursor));\n } finally {\n fs.closeSync(fd);\n }\n }\n\n // ------------------------------------------------------------------\n // Pivot table integration\n // ------------------------------------------------------------------\n\n private _updatePivotCaches(sheetName: string, dimRef: string, recordCount: number): void {\n for (const cache of this.pivotCacheDefs) {\n const wsRe = /<worksheetSource\\b[^>]*>/;\n const wsMatch = wsRe.exec(cache.xml);\n if (!wsMatch) continue;\n const wsTag = wsMatch[0];\n const sheetAttr = /sheet=\"([^\"]*)\"/.exec(wsTag);\n if (!sheetAttr || sheetAttr[1] !== sheetName) continue;\n\n let xml = cache.xml;\n xml = xml.substring(0, wsMatch.index) +\n wsTag.replace(/ref=\"[^\"]*\"/, `ref=\"${dimRef}\"`) +\n xml.substring(wsMatch.index + wsTag.length);\n\n const rootRe = /<pivotCacheDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (rootMatch) {\n let rootTag = rootMatch[0];\n if (/recordCount=\"\\d+\"/.test(rootTag)) {\n rootTag = rootTag.replace(/recordCount=\"\\d+\"/, `recordCount=\"${recordCount}\"`);\n } else if (!/\\/>$/.test(rootTag)) {\n rootTag = rootTag.replace(/>$/, ` recordCount=\"${recordCount}\">`);\n }\n xml = xml.substring(0, rootMatch.index) + rootTag + xml.substring(rootMatch.index + rootMatch[0].length);\n }\n\n this.zip.updateFile(cache.path, Buffer.from(xml, 'utf8'));\n }\n }\n\n private _addRefreshOnLoadToPivotTables(): void {\n for (const path of this.pivotTableDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n let xml = entry.getData().toString('utf8');\n\n const rootRe = /<pivotTableDefinition\\b[^>]*>/;\n const rootMatch = rootRe.exec(xml);\n if (!rootMatch || rootMatch[0].includes('refreshOnLoad')) continue;\n\n const newTag = rootMatch[0].replace(/(\\/?>)$/, ' refreshOnLoad=\"1\"$1');\n xml = xml.substring(0, rootMatch.index) + newTag + xml.substring(rootMatch.index + rootMatch[0].length);\n this.zip.updateFile(path, Buffer.from(xml, 'utf8'));\n }\n }\n}\n\nexport default XlsxUpdater;\n\n/** Explicit name for updating macro-enabled XLSM packages. */\nexport { XlsxUpdater as XlsmUpdater };\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\n\n/** Internal file operations seam used to test replacement races without Excel. */\nexport interface AtomicFileOperations {\n exists(filePath: string): boolean;\n rename(sourcePath: string, destinationPath: string): void;\n remove(filePath: string): void;\n}\nconst realFileOperations: AtomicFileOperations = {\n exists: (filePath) => fs.existsSync(filePath),\n rename: (sourcePath, destinationPath) => fs.renameSync(sourcePath, destinationPath),\n remove: (filePath) => fs.rmSync(filePath),\n};\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction destinationExistsError(destinationPath: string): Error {\n return new Error(\n `Excel conversion: destination already exists (pass { overwrite: true } to replace it): ${destinationPath}`\n );\n}\n\nfunction readDestinationMode(target: string): number | undefined {\n try {\n if (!fs.existsSync(target)) return undefined;\n return fs.statSync(target).mode & 0o777;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Installs a temporary conversion result without deleting an unapproved or\n * concurrently-created destination. Existing destinations are moved aside\n * before replacement so a failed final rename can be rolled back safely.\n */\nexport function installTemporaryOutput(\n temporaryPath: string,\n destinationPath: string,\n overwrite: boolean,\n operations: AtomicFileOperations = realFileOperations\n): void {\n const backupPath = `${destinationPath}.${randomUUID()}.replacement-backup`;\n let backupCreated = false;\n let installed = false;\n\n if (operations.exists(destinationPath)) {\n if (!overwrite) {\n throw destinationExistsError(destinationPath);\n }\n\n // A rename preserves the old destination if anything fails later.\n operations.rename(destinationPath, backupPath);\n backupCreated = true;\n }\n\n try {\n try {\n operations.rename(temporaryPath, destinationPath);\n installed = true;\n } catch (error) {\n // If overwrite was allowed and a destination appeared after the\n // check above, preserve it as well and retry once.\n if (overwrite && !backupCreated && operations.exists(destinationPath)) {\n operations.rename(destinationPath, backupPath);\n backupCreated = true;\n operations.rename(temporaryPath, destinationPath);\n installed = true;\n } else {\n throw error;\n }\n }\n\n if (backupCreated) {\n operations.remove(backupPath);\n }\n } catch (error) {\n if (backupCreated && !installed) {\n if (!operations.exists(destinationPath)) {\n try {\n operations.rename(backupPath, destinationPath);\n backupCreated = false;\n } catch (rollbackError) {\n throw new Error(\n `Excel conversion: final destination install failed (${errorMessage(error)}), ` +\n `and restoring the original destination also failed (${errorMessage(rollbackError)}). ` +\n `Original file remains at ${backupPath}.`\n );\n }\n } else {\n throw new Error(\n `Excel conversion: final destination install failed (${errorMessage(error)}). ` +\n `A concurrent destination was preserved; the original file remains at ${backupPath}.`\n );\n }\n }\n\n throw error;\n }\n}\n\n/**\n * Write a complete buffer through a same-directory temporary file and replace\n * the destination only after the write has completed successfully.\n */\nexport function writeBufferAtomically(buffer: Buffer, destinationPath: string): void {\n const target = path.resolve(destinationPath);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporaryPath = path.join(\n path.dirname(target),\n `.${path.basename(target)}.${randomUUID()}.tmp`\n );\n const destinationMode = readDestinationMode(target);\n\n try {\n const fd = fs.openSync(temporaryPath, 'w', destinationMode ?? 0o666);\n try {\n if (destinationMode !== undefined) {\n try {\n fs.fchmodSync(fd, destinationMode);\n } catch {\n // Preserve the original write error; mode is best-effort.\n }\n }\n fs.writeFileSync(fd, buffer);\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n if (destinationMode !== undefined) {\n try {\n fs.chmodSync(temporaryPath, destinationMode);\n } catch {\n // Preserve the original write/rename error.\n }\n }\n fs.renameSync(temporaryPath, target);\n } finally {\n if (fs.existsSync(temporaryPath)) {\n try {\n fs.rmSync(temporaryPath);\n } catch {\n // Preserve the original write/rename error.\n }\n }\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport { finished } from 'stream/promises';\nimport { Readable } from 'stream';\nimport AdmZip from 'adm-zip';\nimport archiver from 'archiver';\n\n/** A file-backed replacement for one ZIP member. */\nexport type StagedZipPart = Map<string, string>;\n\nfunction readDestinationMode(target: string): number | undefined {\n try {\n if (!fs.existsSync(target)) return undefined;\n return fs.statSync(target).mode & 0o777;\n } catch {\n return undefined;\n }\n}\n\nfunction appendAndWait(\n archive: archiver.Archiver,\n source: NodeJS.ReadableStream,\n name: string,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const cleanup = (): void => {\n archive.off('entry', onEntry);\n archive.off('error', onError);\n const maybeEmitter = source as NodeJS.EventEmitter;\n if (typeof maybeEmitter.off === 'function') {\n maybeEmitter.off('error', onError);\n }\n };\n const onEntry = (): void => {\n cleanup();\n resolve();\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n archive.once('entry', onEntry);\n archive.once('error', onError);\n const maybeEmitter = source as NodeJS.EventEmitter;\n if (typeof maybeEmitter.once === 'function') {\n maybeEmitter.once('error', onError);\n }\n try {\n archive.append(source as never, { name });\n } catch (error) {\n cleanup();\n reject(error as Error);\n }\n });\n}\n\n/**\n * Rebuild an existing ZIP package without creating a complete output Buffer.\n * Unchanged members are copied one at a time; staged members are read from\n * temporary files.\n */\nexport async function writeAdmZipStreaming(\n zip: AdmZip,\n stagedParts: StagedZipPart,\n destinationPath: string,\n): Promise<void> {\n const target = path.resolve(destinationPath);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n const temporaryPath = path.join(\n path.dirname(target),\n `.${path.basename(target)}.${randomUUID()}.tmp`\n );\n const destinationMode = readDestinationMode(target);\n\n let output: fs.WriteStream | null = null;\n let archive: archiver.Archiver | null = null;\n try {\n output = fs.createWriteStream(\n temporaryPath,\n destinationMode !== undefined ? { mode: destinationMode } : {},\n );\n archive = archiver('zip');\n archive.pipe(output);\n\n for (const entry of zip.getEntries()) {\n const stagedPath = stagedParts.get(entry.entryName);\n if (stagedPath) {\n await appendAndWait(archive, fs.createReadStream(stagedPath), entry.entryName);\n } else {\n // Decompress each member only after the previous one has been\n // consumed so a single buffer is retained at a time.\n await appendAndWait(archive, Readable.from([entry.getData()]), entry.entryName);\n }\n }\n\n await archive.finalize();\n await finished(output);\n\n if (destinationMode !== undefined) {\n try {\n fs.chmodSync(temporaryPath, destinationMode);\n } catch {\n // Preserve the original archive or rename error.\n }\n }\n const fd = fs.openSync(temporaryPath, 'r+');\n try {\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n fs.renameSync(temporaryPath, target);\n } catch (error) {\n try {\n archive?.abort();\n } catch {\n // Preserve the original archive error.\n }\n throw error;\n } finally {\n if (output && !output.closed) {\n output.destroy();\n }\n if (fs.existsSync(temporaryPath)) {\n try {\n fs.rmSync(temporaryPath);\n } catch {\n // Preserve the original archive or rename error.\n }\n }\n }\n}\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport AdmZip from 'adm-zip';\nimport { CellValue, getFormat, unwrapCell } from './Formats';\nimport { writeBufferAtomically } from './atomicFile';\nimport { writeAdmZipStreaming, StagedZipPart } from './streamingZip';\nimport {\n readRecord,\n buildRecord,\n readUtf16,\n parseSharedStringsBin,\n Biff12Record,\n} from './biff12Utils';\nimport { trimTrailingEmptyRows } from './xmlUtils';\n\n/**\n * Options for {@link XlsbUpdater.replaceSheetData}.\n */\nexport interface ReplaceSheetDataOptions {\n /**\n * Optional header row written into row 1 of the target sheet.\n * When omitted, row 1 is filled with the data rows.\n */\n headers?: string[];\n /**\n * Style strategy for the new cells:\n * - `'inherit'` (default): reuse the dominant cell style (xf) of each column from the\n * existing data (and the original header style for row 1), so date/number\n * formatting of the sheet is preserved. Falls back to General (0).\n * - `'general'`: all new cells use xf 0 (General).\n */\n styleFallback?: 'inherit' | 'general';\n}\n\n/** A one-pass synchronous or asynchronous source of worksheet rows. */\nexport type RowSource =\n | Iterable<ReadonlyArray<CellValue>>\n | AsyncIterable<ReadonlyArray<CellValue>>;\n\n/** Worksheet cell records (BrtCellBlank … BrtFmlaError). */\nconst CELL_RECORDS = new Set<number>([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b]);\n\nconst RK_INT_LOWER = -1 << 29;\nconst RK_INT_UPPER = (1 << 29) - 1;\n\n/**\n * Update the data of a worksheet inside an existing XLSB file without rebuilding\n * the workbook. Everything outside the target sheet's rows — pivot tables and\n * their caches, other sheets, styles, column widths, views — is preserved.\n * This makes it possible to refresh a data sheet that pivot tables are wired to.\n *\n * ```ts\n * const updater = new XlsbUpdater('report.xlsb');\n * updater.replaceSheetData('data1', rows, { headers: ['ID', 'NAME', 'AMOUNT'] });\n * updater.save('report_new.xlsb'); // or updater.save() to overwrite in place\n * ```\n */\nexport class XlsbUpdater {\n private readonly zip: AdmZip;\n private readonly sourcePath: string;\n private temporaryDirectory: string | null = null;\n private readonly stagedParts: StagedZipPart = new Map();\n\n private sheetNameToPath: Map<string, string> = new Map();\n private pivotCacheDefPaths: string[] = [];\n\n private sharedStringsBuf: Buffer | null = null;\n private sharedStringsValues: string[] = [];\n private sharedStringsTotal: number = 0;\n private sharedStringsUnique: number = 0;\n private sharedStringsEndSst: number = 0;\n private stringIndexMap: Map<string, number> = new Map();\n private sharedStringsDirty: boolean = false;\n\n private readonly _oaEpoch: number;\n\n /**\n * @param path Path to an existing `.xlsb` file.\n */\n constructor(filePath: string) {\n this.sourcePath = filePath;\n this._oaEpoch = Date.UTC(1899, 11, 30);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`XlsbUpdater: file not found: ${filePath}`);\n }\n\n this.zip = new AdmZip(filePath);\n\n if (!this.zip.getEntry('xl/workbook.bin')) {\n throw new Error(\n 'XlsbUpdater: not an XLSB workbook (xl/workbook.bin missing). Convert the file to XLSB first.'\n );\n }\n\n this._loadWorkbookStructure();\n }\n\n /** Worksheet names in workbook order. */\n getSheetNames(): string[] {\n return [...this.sheetNameToPath.keys()];\n }\n\n /**\n * Clear the entire cell data of the target sheet and write new rows in its place.\n * All other parts of the workbook (pivot tables, other sheets, styles, …) are preserved.\n *\n * @param sheetName Name of the worksheet to replace.\n * @param rows New data rows (`CellValue` cells; null/undefined = blank).\n * @param options See {@link ReplaceSheetDataOptions}.\n */\n replaceSheetData(\n sheetName: string,\n rows: CellValue[][],\n options: ReplaceSheetDataOptions = {}\n ): void {\n const { headers, styleFallback = 'inherit' } = options;\n rows = trimTrailingEmptyRows(rows);\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsbUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsbUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const sheetBuf = this._entryData(sheetPath);\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsBuf !== null) {\n this.sharedStringsTotal = Math.max(\n 0,\n this.sharedStringsTotal - this._sharedStringRefCount(sheetBuf),\n );\n this.sharedStringsDirty = true;\n }\n\n let dataStyles: Map<number, number> = new Map();\n let headerStyles: Map<number, number> = new Map();\n let dateXf: number | null = null;\n\n if (styleFallback !== 'general') {\n const collected = this._collectStyles(sheetBuf);\n dataStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateXf = this._findDateXf();\n }\n\n const lastCol = Math.max(0, Math.max(\n rows.reduce((m, r) => Math.max(m, r.length), 0),\n headers?.length ?? 0\n ) - 1);\n\n const newRows = this._buildRows(rows, headers, dataStyles, headerStyles, dateXf);\n const { rowsStart, rowsEnd, autoFilterRanges } = this._findRowsRegion(sheetBuf);\n\n const newSheet = Buffer.alloc(sheetBuf.length - (rowsEnd - rowsStart) + newRows.length);\n sheetBuf.copy(newSheet, 0, 0, rowsStart);\n newRows.copy(newSheet, rowsStart);\n sheetBuf.copy(newSheet, rowsStart + newRows.length, rowsEnd);\n\n const lastRowIdx = rows.length + (headers ? 1 : 0) - 1;\n const delta = newRows.length - (rowsEnd - rowsStart);\n for (const af of autoFilterRanges) {\n const newAf = af + delta;\n newSheet.writeInt32LE(lastCol, newAf + 12);\n newSheet.writeInt32LE(lastRowIdx, newAf + 4);\n }\n\n // Keep the sheet dimension record (0x98) in sync with the new data. Excel uses\n // its rwLast/colLast fields to read the full row range; stale values make the\n // last written row invisible (and drop it from pivot refreshes).\n this._patchDimension(newSheet, lastRowIdx, lastCol);\n\n this.zip.updateFile(sheetPath, newSheet);\n this._discardStagedPart(sheetPath);\n\n if (this.sharedStringsBuf !== null) {\n this._commitSharedStrings();\n }\n\n const rwLast = Math.max(0, rows.length + (headers ? 1 : 0) - 1);\n const colLast = lastCol;\n this._patchPivotCaches(sheetName, rwLast, colLast);\n }\n\n /** Replace worksheet rows from a one-pass source. */\n async replaceSheetDataStream(\n sheetName: string,\n rows: RowSource,\n options: ReplaceSheetDataOptions = {},\n ): Promise<void> {\n const { headers, styleFallback = 'inherit' } = options;\n if (styleFallback !== 'inherit' && styleFallback !== 'general') {\n throw new Error(\"XlsbUpdater: styleFallback must be 'inherit' or 'general'.\");\n }\n\n const sheetPath = this.sheetNameToPath.get(sheetName);\n if (!sheetPath) {\n throw new Error(`XlsbUpdater: sheet \"${sheetName}\" not found in the workbook.`);\n }\n const entry = this.zip.getEntry(sheetPath);\n if (!entry) {\n throw new Error(`XlsbUpdater: worksheet part missing for sheet \"${sheetName}\".`);\n }\n\n const oldStage = this.stagedParts.get(sheetPath);\n const beforeValuesLength = this.sharedStringsValues.length;\n const beforeAppendCount = this._appendCount;\n const beforeSharedStringsTotal = this.sharedStringsTotal;\n const beforeSharedStringsUnique = this.sharedStringsUnique;\n const beforeSharedStringsEndSst = this.sharedStringsEndSst;\n const beforeSharedStringsDirty = this.sharedStringsDirty;\n const beforeStringIndexMap = new Map(this.stringIndexMap);\n const sharedStringsEntry = this.zip.getEntry('xl/sharedStrings.bin');\n const beforeSharedStringsBytes = sharedStringsEntry || this.stagedParts.has('xl/sharedStrings.bin')\n ? Buffer.from(this._entryData('xl/sharedStrings.bin'))\n : null;\n const beforeSharedStringsBuf = this.sharedStringsBuf ? Buffer.from(this.sharedStringsBuf) : null;\n const oldSheet = this._entryData(sheetPath);\n const rowsPath = this._temporaryPath('.rows');\n const outputPath = this._temporaryPath('.bin');\n const createdParts = [rowsPath, outputPath];\n let output: fs.WriteStream | null = null;\n\n try {\n this._ensureSharedStringsLoaded();\n if (this.sharedStringsBuf !== null) {\n this.sharedStringsTotal = Math.max(\n 0,\n this.sharedStringsTotal - this._sharedStringRefCount(oldSheet),\n );\n this.sharedStringsDirty = true;\n }\n\n let dataStyles = new Map<number, number>();\n let headerStyles = new Map<number, number>();\n let dateXf: number | null = null;\n if (styleFallback !== 'general') {\n const collected = this._collectStyles(oldSheet);\n dataStyles = collected.dataStyles;\n headerStyles = collected.headerStyles;\n dateXf = this._findDateXf();\n }\n\n const rowOutput = fs.createWriteStream(rowsPath);\n output = rowOutput;\n let outputError: Error | null = null;\n rowOutput.on('error', error => { outputError = error; });\n let writtenBytes = 0;\n let lastKeptEnd = 0;\n let width = headers?.length ?? 0;\n let dataRowsSeen = 0;\n let keptDataRows = 0;\n let pendingEmptyWidth = 0;\n let nextRow = 0;\n const rowHeaderOffsets: number[] = [];\n\n const write = async (data: Buffer): Promise<void> => {\n if (outputError) throw outputError;\n writtenBytes += data.length;\n if (rowOutput.write(data)) return;\n await new Promise<void>((resolve, reject) => {\n const onDrain = () => { cleanup(); resolve(); };\n const onError = (error: Error) => { cleanup(); reject(error); };\n const cleanup = () => {\n rowOutput.off('drain', onDrain);\n rowOutput.off('error', onError);\n };\n rowOutput.once('drain', onDrain);\n rowOutput.once('error', onError);\n });\n };\n\n const writeRow = async (rowNumber: number, cells: Buffer[]): Promise<void> => {\n rowHeaderOffsets.push(writtenBytes);\n const header = Buffer.alloc(27);\n header[0] = 0x00;\n header[1] = 25;\n header.writeInt32LE(rowNumber, 2);\n header[10] = 0x2c;\n header[11] = 0x01;\n header[15] = 0x01;\n header.writeInt32LE(0, 19);\n header.writeInt32LE(0, 23);\n await write(header);\n for (const cell of cells) await write(cell);\n };\n\n if (headers !== undefined) {\n await writeRow(0, headers.map((value, column) =>\n this._stringCellBytes(column, styleFallback === 'general' ? 0 : (headerStyles.get(column) ?? 0), value)));\n lastKeptEnd = writtenBytes;\n nextRow = 1;\n }\n\n for await (const sourceRow of rows) {\n if (typeof sourceRow === 'string' || sourceRow instanceof Uint8Array) {\n throw new TypeError('Each row must be an iterable of cells, not text');\n }\n const row = Array.from(sourceRow) as CellValue[];\n const cells = row\n .map((value, column) => value === null || value === undefined\n ? null\n : this._valueCellBytes(value, column, dataStyles, dateXf))\n .filter((cell): cell is Buffer => cell !== null);\n await writeRow(nextRow, cells);\n dataRowsSeen++;\n nextRow++;\n\n if (row.every(value => value === null || value === undefined)) {\n pendingEmptyWidth = Math.max(pendingEmptyWidth, row.length);\n } else {\n width = Math.max(width, pendingEmptyWidth, row.length);\n pendingEmptyWidth = 0;\n keptDataRows = dataRowsSeen;\n lastKeptEnd = writtenBytes;\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n rowOutput.once('close', resolve);\n rowOutput.once('error', reject);\n rowOutput.end();\n });\n if (outputError) throw outputError;\n\n const rowsFd = fs.openSync(rowsPath, 'r+');\n try {\n fs.ftruncateSync(rowsFd, lastKeptEnd);\n } finally {\n fs.closeSync(rowsFd);\n }\n const lastCol = Math.max(0, width - 1);\n const rowPatchFd = fs.openSync(rowsPath, 'r+');\n try {\n const lastColBuffer = Buffer.alloc(4);\n lastColBuffer.writeInt32LE(lastCol, 0);\n for (const offset of rowHeaderOffsets) {\n if (offset >= lastKeptEnd) continue;\n fs.writeSync(rowPatchFd, lastColBuffer, 0, lastColBuffer.length, offset + 23);\n }\n } finally {\n fs.closeSync(rowPatchFd);\n }\n\n const { rowsStart, rowsEnd, autoFilterRanges } = this._findRowsRegion(oldSheet);\n const oldLength = oldSheet.length;\n const newRowsLength = fs.statSync(rowsPath).size;\n const delta = newRowsLength - (rowsEnd - rowsStart);\n const outputFd = fs.openSync(outputPath, 'w');\n try {\n fs.writeSync(outputFd, oldSheet, 0, rowsStart, null);\n const rowsFdRead = fs.openSync(rowsPath, 'r');\n try {\n const chunk = Buffer.alloc(1024 * 1024);\n let position = 0;\n while (position < newRowsLength) {\n const count = fs.readSync(rowsFdRead, chunk, 0, Math.min(chunk.length, newRowsLength - position), position);\n if (count <= 0) throw new Error('XlsbUpdater: failed to read staged rows.');\n fs.writeSync(outputFd, chunk, 0, count);\n position += count;\n }\n } finally {\n fs.closeSync(rowsFdRead);\n }\n fs.writeSync(outputFd, oldSheet, rowsEnd, oldLength - rowsEnd, rowsStart + newRowsLength);\n } finally {\n fs.closeSync(outputFd);\n }\n\n this._patchSheetMetadataFile(\n outputPath,\n oldSheet,\n rowsEnd,\n delta,\n autoFilterRanges,\n Math.max(0, keptDataRows + (headers !== undefined ? 1 : 0) - 1),\n lastCol,\n );\n this._stagePart(sheetPath, outputPath);\n this._commitSharedStrings();\n this._patchPivotCaches(\n sheetName,\n Math.max(0, keptDataRows + (headers !== undefined ? 1 : 0) - 1),\n lastCol,\n );\n\n if (oldStage && oldStage !== outputPath) this._removeTemporaryFile(oldStage);\n createdParts.splice(createdParts.indexOf(outputPath), 1);\n } catch (error) {\n this.sharedStringsValues.length = beforeValuesLength;\n this._appendCount = beforeAppendCount;\n this.sharedStringsTotal = beforeSharedStringsTotal;\n this.sharedStringsUnique = beforeSharedStringsUnique;\n this.sharedStringsEndSst = beforeSharedStringsEndSst;\n this.sharedStringsDirty = beforeSharedStringsDirty;\n this.sharedStringsBuf = beforeSharedStringsBuf;\n this.stringIndexMap.clear();\n for (const [value, index] of beforeStringIndexMap) this.stringIndexMap.set(value, index);\n if (beforeSharedStringsBytes) {\n this.zip.updateFile('xl/sharedStrings.bin', beforeSharedStringsBytes);\n }\n if (oldStage) this.stagedParts.set(sheetPath, oldStage);\n else this.stagedParts.delete(sheetPath);\n throw error;\n } finally {\n if (output && !output.closed) output.destroy();\n for (const temporaryPath of createdParts) this._removeTemporaryFile(temporaryPath);\n }\n }\n\n /**\n * Write the updated workbook to disk.\n * @param outputPath Destination path; defaults to the source file (overwrites in place).\n */\n save(outputPath?: string): void {\n const target = outputPath ?? this.sourcePath;\n this._materializeStagedParts();\n writeBufferAtomically(this.zip.toBuffer(), target);\n }\n\n /** Save staged streaming replacements without materialising the ZIP. */\n async saveStreaming(outputPath?: string): Promise<void> {\n const target = outputPath ?? this.sourcePath;\n await writeAdmZipStreaming(this.zip, this.stagedParts, target);\n this._materializeStagedParts();\n }\n\n /** The updated workbook as an in-memory ZIP buffer. */\n toBuffer(): Buffer {\n this._materializeStagedParts();\n return this.zip.toBuffer();\n }\n\n /**\n * Release the staging directory and any unsaved staged parts.\n * The updater remains usable; a new staging directory is created lazily\n * on the next streaming replacement.\n */\n dispose(): void {\n for (const stagedPath of this.stagedParts.values()) {\n try {\n fs.rmSync(stagedPath, { force: true });\n } catch {\n // Best-effort cleanup.\n }\n }\n this.stagedParts.clear();\n if (this.temporaryDirectory !== null) {\n try {\n fs.rmSync(this.temporaryDirectory, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup.\n }\n this.temporaryDirectory = null;\n }\n }\n\n /** Support `using` declarations for automatic staging cleanup. */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n private _ensureTemporaryDirectory(): string {\n if (this.temporaryDirectory === null) {\n this.temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'spreadsheet-updater-'));\n } else {\n try {\n fs.mkdirSync(this.temporaryDirectory, { recursive: true });\n } catch {\n // Best-effort; file creation will surface persistent failures.\n }\n }\n return this.temporaryDirectory;\n }\n\n private _temporaryPath(suffix: string): string {\n return path.join(this._ensureTemporaryDirectory(), `part-${Date.now()}-${Math.random().toString(16).slice(2)}${suffix}`);\n }\n\n private _removeTemporaryFile(filePath: string): void {\n try {\n fs.rmSync(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n\n private _entryData(name: string): Buffer {\n const stagedPath = this.stagedParts.get(name);\n if (stagedPath) return fs.readFileSync(stagedPath);\n const entry = this.zip.getEntry(name);\n if (!entry) throw new Error(`XlsbUpdater: ZIP member missing: ${name}`);\n return entry.getData();\n }\n\n private _stagePart(name: string, filePath: string): void {\n this.stagedParts.set(name, filePath);\n }\n\n private _discardStagedPart(name: string): void {\n const stagedPath = this.stagedParts.get(name);\n if (!stagedPath) return;\n this._removeTemporaryFile(stagedPath);\n this.stagedParts.delete(name);\n }\n\n private _materializeStagedParts(): void {\n for (const [name, stagedPath] of this.stagedParts) {\n this.zip.updateFile(name, fs.readFileSync(stagedPath));\n this._removeTemporaryFile(stagedPath);\n }\n this.stagedParts.clear();\n }\n\n // ------------------------------------------------------------------\n // Workbook structure\n // ------------------------------------------------------------------\n\n private _loadWorkbookStructure(): void {\n const relsEntry = this.zip.getEntry('xl/_rels/workbook.bin.rels');\n const rIdToTarget: Record<string, string> = {};\n if (relsEntry) {\n const rels = relsEntry.getData().toString('utf8');\n const relRegex = /<Relationship[^>]*Id=\"([^\"]*)\"[^>]*Target=\"([^\"]*)\"/g;\n let match;\n while ((match = relRegex.exec(rels)) !== null) {\n rIdToTarget[match[1]] = match[2];\n }\n }\n\n const wbEntry = this.zip.getEntry('xl/workbook.bin');\n if (wbEntry) {\n const wbBuf = wbEntry.getData();\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(wbBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id !== 0x009c || rec.len < 8) continue;\n\n // BrtBundleSh: hidden(4) + sheetId(4) + rId(string) + name(string)\n let o = rec.dataStart + 8;\n const rIdLen = wbBuf.readUInt32LE(o);\n o += 4;\n const rId = readUtf16(wbBuf, o, rIdLen);\n o += rIdLen * 2;\n const nameLen = wbBuf.readUInt32LE(o);\n o += 4;\n const name = readUtf16(wbBuf, o, nameLen);\n\n let target = rIdToTarget[rId] ?? '';\n if (target.startsWith('/')) target = target.substring(1);\n else if (!target.startsWith('xl/')) target = 'xl/' + target;\n if (target) {\n this.sheetNameToPath.set(name, target);\n }\n }\n }\n\n for (const e of this.zip.getEntries()) {\n if (/^xl\\/pivotCache\\/pivotCacheDefinition\\d*\\.bin$/.test(e.entryName)) {\n this.pivotCacheDefPaths.push(e.entryName);\n }\n }\n }\n\n // ------------------------------------------------------------------\n // Shared strings\n // ------------------------------------------------------------------\n\n private _appendCount: number = 0;\n\n private _ensureSharedStringsLoaded(): void {\n if (this.stringIndexMap.size > 0 || this.sharedStringsBuf !== null) {\n return;\n }\n const entry = this.zip.getEntry('xl/sharedStrings.bin');\n if (!entry && !this.stagedParts.has('xl/sharedStrings.bin')) {\n this.sharedStringsBuf = null;\n return;\n }\n this.sharedStringsBuf = this._entryData('xl/sharedStrings.bin');\n const parsed = parseSharedStringsBin(this.sharedStringsBuf);\n this.sharedStringsValues = parsed.values;\n this.sharedStringsTotal = parsed.total;\n this.sharedStringsUnique = parsed.unique;\n this.sharedStringsEndSst = parsed.endSstOffset;\n\n this.sharedStringsValues.forEach((value, index) => {\n if (!this.stringIndexMap.has(value)) {\n this.stringIndexMap.set(value, index);\n }\n });\n this._appendCount = 0;\n this.sharedStringsDirty = false;\n }\n\n private _commitSharedStrings(): void {\n if (this.sharedStringsBuf === null || !this.sharedStringsDirty) return;\n\n const originalValuesLength = this.sharedStringsValues.length - this._appendCount;\n\n let newItems = Buffer.alloc(0);\n for (let i = originalValuesLength; i < this.sharedStringsValues.length; i++) {\n const text = this.sharedStringsValues[i];\n const payload = Buffer.alloc(1 + 4 + text.length * 2);\n payload[0] = 0x00;\n payload.writeUInt32LE(text.length, 1);\n payload.write(text, 5, text.length * 2, 'utf16le');\n newItems = Buffer.concat([newItems, buildRecord(0x0013, payload)]);\n }\n\n const out = Buffer.alloc(this.sharedStringsBuf.length + newItems.length);\n this.sharedStringsBuf.copy(out, 0, 0, this.sharedStringsEndSst);\n newItems.copy(out, this.sharedStringsEndSst);\n this.sharedStringsBuf.copy(out, this.sharedStringsEndSst + newItems.length, this.sharedStringsEndSst);\n\n // Patch cstTotal / cstUnique inside BrtBeginSst.\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(out, pos, rec)) {\n if (rec.id === 0x009f) {\n out.writeUInt32LE(this.sharedStringsTotal, rec.dataStart);\n out.writeUInt32LE(this.sharedStringsUnique, rec.dataStart + 4);\n break;\n }\n pos = rec.dataEnd;\n }\n\n this.zip.updateFile('xl/sharedStrings.bin', out);\n this.sharedStringsBuf = out;\n this._appendCount = 0;\n this.sharedStringsDirty = false;\n }\n\n // ------------------------------------------------------------------\n // Styles\n // ------------------------------------------------------------------\n\n private _collectStyles(sheetBuf: Buffer): { dataStyles: Map<number, number>; headerStyles: Map<number, number> } {\n const dataCounts = new Map<number, Map<number, number>>();\n const headerStyles = new Map<number, number>();\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let row = -1;\n while (readRecord(sheetBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x00) {\n row = sheetBuf.readInt32LE(rec.dataStart);\n continue;\n }\n if (!CELL_RECORDS.has(rec.id) || rec.len < 8) continue;\n const col = sheetBuf.readUInt32LE(rec.dataStart);\n const xf = sheetBuf.readUInt32LE(rec.dataStart + 4) & 0xffffff;\n if (xf <= 0) continue;\n\n if (row === 0) {\n if (!headerStyles.has(col)) headerStyles.set(col, xf);\n continue;\n }\n let colCounts = dataCounts.get(col);\n if (!colCounts) {\n colCounts = new Map();\n dataCounts.set(col, colCounts);\n }\n colCounts.set(xf, (colCounts.get(xf) ?? 0) + 1);\n }\n\n const dataStyles = new Map<number, number>();\n for (const [col, colCounts] of dataCounts) {\n let best = 0;\n let bestCount = -1;\n for (const [xf, count] of colCounts) {\n if (count > bestCount) {\n best = xf;\n bestCount = count;\n }\n }\n if (bestCount > 0) dataStyles.set(col, best);\n }\n\n return { dataStyles, headerStyles };\n }\n\n private _findDateXf(): number | null {\n const entry = this.zip.getEntry('xl/styles.bin');\n if (!entry) return null;\n const stylesBuf = entry.getData();\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let inCellXfs = false;\n let xfIndex = 0;\n while (readRecord(stylesBuf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x0269) {\n inCellXfs = true;\n xfIndex = 0;\n continue;\n }\n if (rec.id === 0x026a) {\n inCellXfs = false;\n continue;\n }\n if (inCellXfs && rec.id === 0x002f && rec.len >= 4) {\n const numFmtId = stylesBuf.readUInt16LE(rec.dataStart + 2);\n const isDate =\n (numFmtId >= 14 && numFmtId <= 22) ||\n (numFmtId >= 45 && numFmtId <= 47);\n if (isDate) return xfIndex;\n xfIndex++;\n }\n }\n return null;\n }\n\n // ------------------------------------------------------------------\n // Row / cell serialization\n // ------------------------------------------------------------------\n\n private _buildRows(\n rows: CellValue[][],\n headers: string[] | undefined,\n dataStyles: Map<number, number>,\n headerStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const chunks: Buffer[] = [];\n const maxCol = Math.max(rows.reduce((m, r) => Math.max(m, r.length), 0), headers?.length ?? 0, 0);\n const colLast = Math.max(0, maxCol - 1);\n\n const pushRow = (rowNum: number, cellBytes: Buffer[]): void => {\n // BrtRowHeader (0x00, len 25): rw(4) + zero(4) + flags(9) + colFirst(4) + colLast(4)\n const header = Buffer.alloc(27);\n header[0] = 0x00;\n header[1] = 25;\n header.writeInt32LE(rowNum, 2);\n header[10] = 0x2c;\n header[11] = 0x01;\n header[15] = 0x01;\n header.writeInt32LE(0, 19);\n header.writeInt32LE(colLast, 23);\n chunks.push(header);\n\n for (const cell of cellBytes) {\n chunks.push(cell);\n }\n };\n\n if (headers) {\n const cells: Buffer[] = [];\n for (let c = 0; c < headers.length; c++) {\n const style = headerStyles.get(c) ?? 0;\n cells.push(this._stringCellBytes(c, style, headers[c]));\n }\n pushRow(0, cells);\n }\n\n let rowNum = headers ? 1 : 0;\n for (const row of rows) {\n const cells: Buffer[] = [];\n for (let c = 0; c < row.length; c++) {\n const raw = row[c];\n if (raw === null || raw === undefined) continue;\n cells.push(this._valueCellBytes(raw, c, dataStyles, dateXf));\n }\n pushRow(rowNum, cells);\n rowNum++;\n }\n\n return Buffer.concat(chunks);\n }\n\n private _valueCellBytes(\n raw: CellValue,\n col: number,\n dataStyles: Map<number, number>,\n dateXf: number | null\n ): Buffer {\n const fmtString = getFormat(raw);\n const val = fmtString !== null ? unwrapCell(raw) : raw;\n const colStyle = dataStyles.get(col) ?? 0;\n\n if (typeof val === 'number') {\n if (Number.isFinite(val) && Number.isInteger(val) && val >= RK_INT_LOWER && val <= RK_INT_UPPER) {\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeInt32LE((val << 2) | 2, 8);\n return buildRecord(0x0002, payload);\n }\n if (Number.isFinite(val)) {\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload.writeDoubleLE(val, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'bigint') {\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (typeof val === 'boolean') {\n const payload = Buffer.alloc(9);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(colStyle, 4);\n payload[8] = val ? 1 : 0;\n return buildRecord(0x0004, payload);\n }\n if (val instanceof Date) {\n const oaDate = (val.getTime() - this._oaEpoch) / 86400000;\n if (Number.isFinite(oaDate)) {\n const style = colStyle > 0 ? colStyle : (dateXf !== null ? dateXf : 0);\n const payload = Buffer.alloc(16);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeDoubleLE(oaDate, 8);\n return buildRecord(0x0005, payload);\n }\n return this._stringCellBytes(col, colStyle, val.toString());\n }\n if (val !== null && val !== undefined) {\n return this._stringCellBytes(col, colStyle, String(val));\n }\n return this._stringCellBytes(col, colStyle, '');\n }\n\n private _stringCellBytes(col: number, style: number, text: string): Buffer {\n if (this.sharedStringsBuf === null) {\n // Inline string (BrtCellSt): col(4) + xf(4) + cch(4) + utf16.\n const payload = Buffer.alloc(12 + text.length * 2);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(text.length, 8);\n payload.write(text, 12, text.length * 2, 'utf16le');\n return buildRecord(0x0006, payload);\n }\n\n let index = this.stringIndexMap.get(text);\n if (index === undefined) {\n index = this.sharedStringsValues.length;\n this.sharedStringsValues.push(text);\n this.stringIndexMap.set(text, index);\n this.sharedStringsUnique++;\n this._appendCount++;\n }\n this.sharedStringsTotal++;\n this.sharedStringsDirty = true;\n\n const payload = Buffer.alloc(12);\n payload.writeUInt32LE(col, 0);\n payload.writeUInt32LE(style, 4);\n payload.writeUInt32LE(index, 8);\n return buildRecord(0x0007, payload);\n }\n\n private _sharedStringRefCount(sheetBuf: Buffer): number {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let count = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x0007) count++;\n pos = rec.dataEnd;\n }\n return count;\n }\n\n private _patchSheetMetadataFile(\n filePath: string,\n originalSheet: Buffer,\n rowsEnd: number,\n delta: number,\n autoFilterRanges: number[],\n lastRowIdx: number,\n lastCol: number,\n ): void {\n const fd = fs.openSync(filePath, 'r+');\n try {\n const patchInt32 = (offset: number, value: number): void => {\n const bytes = Buffer.alloc(4);\n bytes.writeInt32LE(value, 0);\n fs.writeSync(fd, bytes, 0, bytes.length, offset);\n };\n\n for (const filterOffset of autoFilterRanges) {\n const newOffset = filterOffset >= rowsEnd ? filterOffset + delta : filterOffset;\n patchInt32(newOffset + 4, lastRowIdx);\n patchInt32(newOffset + 12, lastCol);\n }\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(originalSheet, pos, rec)) {\n if (rec.id === 0x0098 && rec.len >= 36) {\n const shift = rec.dataStart >= rowsEnd ? delta : 0;\n patchInt32(rec.dataStart + shift + 24, lastRowIdx);\n patchInt32(rec.dataStart + shift + 32, lastCol);\n break;\n }\n pos = rec.dataEnd;\n }\n } finally {\n fs.closeSync(fd);\n }\n }\n\n // ------------------------------------------------------------------\n // Rows region detection\n // ------------------------------------------------------------------\n\n private _findRowsRegion(\n sheetBuf: Buffer\n ): { rowsStart: number; rowsEnd: number; autoFilterRanges: number[] } {\n const autoFilterRanges: number[] = [];\n let rowsStart = -1;\n let lastCellEnd = -1;\n let lastW25 = -1;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x00) {\n if (rowsStart === -1) rowsStart = rec.headerStart;\n } else if (rec.id >= 0x01 && rec.id <= 0x0b) {\n lastCellEnd = rec.dataEnd;\n } else if (rec.id === 0x25 && rec.len === 6) {\n lastW25 = rec.headerStart;\n } else if (rec.id === 0x00a1 && rec.len >= 16) {\n autoFilterRanges.push(rec.dataStart);\n }\n pos = rec.dataEnd;\n }\n\n if (rowsStart === -1) {\n // Empty sheet: insert before the trailing wrapper (last 0x25) or at the end.\n const insertAt = lastW25 >= 0 ? lastW25 : sheetBuf.length;\n return { rowsStart: insertAt, rowsEnd: insertAt, autoFilterRanges };\n }\n\n // Replace only the row records. The row-block terminator records that Excel\n // writes after the last row (0x92/0x217/0x1dd/0x1dc) must be preserved,\n // otherwise Excel drops the last written row.\n const rowsEnd = lastCellEnd >= 0 ? lastCellEnd : (lastW25 >= 0 ? lastW25 : sheetBuf.length);\n\n return { rowsStart, rowsEnd, autoFilterRanges };\n }\n\n /**\n * Keep the sheet dimension record (0x98) in sync with the new data.\n * Excel uses its rwLast (payload offset 24) and colLast (payload offset 32)\n * fields to read the full row range; stale values make the last written row\n * invisible to Excel (and drop it from pivot refreshes).\n */\n private _patchDimension(sheetBuf: Buffer, lastRowIdx: number, lastCol: number): void {\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(sheetBuf, pos, rec)) {\n if (rec.id === 0x0098 && rec.len >= 36) {\n sheetBuf.writeInt32LE(lastRowIdx, rec.dataStart + 24);\n sheetBuf.writeInt32LE(lastCol, rec.dataStart + 32);\n return;\n }\n pos = rec.dataEnd;\n }\n }\n\n // ------------------------------------------------------------------\n // Pivot cache integration\n // ------------------------------------------------------------------\n\n private _patchPivotCaches(sheetName: string, rwLast: number, colLast: number): void {\n for (const path of this.pivotCacheDefPaths) {\n const entry = this.zip.getEntry(path);\n if (!entry) continue;\n const buf = Buffer.from(entry.getData());\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n let patched = false;\n let refreshXfPatched = false;\n\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n\n if (rec.id === 0x00b3 && rec.len >= 4 && !refreshXfPatched) {\n // BrtBeginPivotCacheDefinition flags: bit 0x04 of payload offset 3 = refreshOnLoad.\n if (rec.dataStart + 4 <= buf.length) {\n const v = buf[rec.dataStart + 3];\n if ((v & 0x04) === 0) {\n buf[rec.dataStart + 3] = v | 0x04;\n patched = true;\n }\n }\n refreshXfPatched = true;\n }\n\n if (rec.id === 0x00bb && rec.len >= 23) {\n // BrtPivotCacheSource: [3] + cch(4) + name(utf16) + rwFirst(4) rwLast(4) colFirst(4) colLast(4)\n const cch = buf.readUInt32LE(rec.dataStart + 3);\n const nameStart = rec.dataStart + 7;\n const refStart = nameStart + cch * 2;\n const name = readUtf16(buf, nameStart, cch);\n if (name === sheetName && refStart + 16 <= buf.length) {\n buf.writeInt32LE(rwLast, refStart + 4);\n buf.writeInt32LE(colLast, refStart + 12);\n patched = true;\n }\n }\n }\n\n if (patched) {\n this.zip.updateFile(path, buf);\n }\n }\n }\n}\n\nexport default XlsbUpdater;\n","/**\n * Low-level BIFF12 (XLSB) record helpers shared by readers and the XlsbUpdater.\n *\n * A BIFF12 record is: VLQ(id) + VLQ(length) + payload[length].\n */\n\n/** Decode a 7-bit VLQ integer at `pos`. Returns the value and the next byte offset. */\nexport function readVlq(buf: Buffer, pos: number): { value: number; nextPos: number } {\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n byte = buf[pos++];\n value |= (byte & 0x7f) << shift;\n shift += 7;\n } while ((byte & 0x80) !== 0);\n return { value, nextPos: pos };\n}\n\n/** Number of bytes needed to VLQ-encode `value`. */\nexport function vlqLength(value: number): number {\n let n = 1;\n while (value >= 0x80) {\n n++;\n value >>>= 7;\n }\n return n;\n}\n\n/** Encode `value` as a 7-bit VLQ byte array. */\nexport function vlqBytes(value: number): number[] {\n const out: number[] = [];\n while (value >= 0x80) {\n out.push((value & 0x7f) | 0x80);\n value >>>= 7;\n }\n out.push(value & 0x7f);\n return out;\n}\n\n/** A single BIFF12 record view (byte offsets into the source buffer). */\nexport interface Biff12Record {\n /** Byte offset of the record header (id + length). */\n headerStart: number;\n /** Byte offset just past the header — the payload starts here. */\n dataStart: number;\n /** Byte offset just past the payload. */\n dataEnd: number;\n id: number;\n len: number;\n}\n\n/**\n * Fill `rec` with the record starting at `pos`. Returns false when the buffer\n * is exhausted or the record would run past the end.\n */\nexport function readRecord(buf: Buffer, pos: number, rec: Biff12Record): boolean {\n const idRes = readVlq(buf, pos);\n if (idRes.nextPos > buf.length) return false;\n const lenRes = readVlq(buf, idRes.nextPos);\n if (lenRes.nextPos + lenRes.value > buf.length) return false;\n\n rec.headerStart = pos;\n rec.dataStart = lenRes.nextPos;\n rec.dataEnd = lenRes.nextPos + lenRes.value;\n rec.id = idRes.value;\n rec.len = lenRes.value;\n return true;\n}\n\n/** Build a BIFF12 record from an id and payload buffer. */\nexport function buildRecord(id: number, payload: Buffer): Buffer {\n const idBytes = vlqBytes(id);\n const lenBytes = vlqBytes(payload.length);\n const header = Buffer.alloc(idBytes.length + lenBytes.length);\n idBytes.forEach((b, i) => (header[i] = b));\n lenBytes.forEach((b, i) => (header[idBytes.length + i] = b));\n return Buffer.concat([header, payload]);\n}\n\n/** Read a UTF-16LE string of `charCount` characters starting at `start`. */\nexport function readUtf16(buf: Buffer, start: number, charCount: number): string {\n const end = start + charCount * 2;\n if (end > buf.length) return '';\n return buf.toString('utf16le', start, end);\n}\n\n/**\n * Parse the contents of xl/sharedStrings.bin.\n * Returns the string values in order, the SST counters, and the byte offset of\n * the BrtEndSst record where new items must be inserted.\n */\nexport function parseSharedStringsBin(buf: Buffer): {\n values: string[];\n total: number;\n unique: number;\n endSstOffset: number;\n} {\n const values: string[] = [];\n let total = 0;\n let unique = 0;\n let endSstOffset = buf.length;\n\n const rec: Biff12Record = { headerStart: 0, dataStart: 0, dataEnd: 0, id: 0, len: 0 };\n let pos = 0;\n while (readRecord(buf, pos, rec)) {\n pos = rec.dataEnd;\n if (rec.id === 0x009f) {\n total = buf.readUInt32LE(rec.dataStart);\n unique = buf.readUInt32LE(rec.dataStart + 4);\n } else if (rec.id === 0x0013) {\n const cch = buf.readUInt32LE(rec.dataStart + 1);\n values.push(readUtf16(buf, rec.dataStart + 5, cch));\n } else if (rec.id === 0x00a0) {\n endSstOffset = rec.headerStart;\n }\n }\n return { values, total, unique, endSstOffset };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport { spawn } from 'child_process';\nimport { installTemporaryOutput } from './atomicFile';\n\n/** Options for an Excel format conversion. */\nexport interface ExcelConversionOptions {\n /** Allow replacing an existing destination file. Defaults to false. */\n overwrite?: boolean;\n}\n\nconst POWERSHELL_CONVERSION_SCRIPT = `\n$ErrorActionPreference = 'Stop'\n$inputPath = [Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_INPUT')\n$outputPath = [Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_OUTPUT')\n$fileFormat = [int][Environment]::GetEnvironmentVariable('JUSTYBASE_EXCEL_FORMAT')\n$excel = $null\n$workbook = $null\n$exitCode = 0\n\ntry {\n $excel = New-Object -ComObject Excel.Application\n $excel.Visible = $false\n $excel.DisplayAlerts = $false\n $excel.ScreenUpdating = $false\n\n # Open read-only so the source workbook is never changed by the conversion.\n $workbook = $excel.Workbooks.Open($inputPath, 0, $true)\n if ($null -eq $workbook) {\n throw 'Excel did not return a workbook when opening the source file.'\n }\n\n $workbook.SaveAs($outputPath, $fileFormat)\n} catch {\n $exitCode = 1\n [Console]::Error.WriteLine($_.Exception.ToString())\n} finally {\n if ($null -ne $workbook) {\n try { $workbook.Close($false) } catch { }\n try { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook) | Out-Null } catch { }\n }\n if ($null -ne $excel) {\n try { $excel.Quit() } catch { }\n try { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null } catch { }\n }\n [GC]::Collect()\n [GC]::WaitForPendingFinalizers()\n}\n\nexit $exitCode\n`;\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction validateConversionPaths(\n inputPath: string,\n outputPath: string,\n inputExtension: string,\n outputExtension: string,\n overwrite: boolean\n): { input: string; output: string } {\n const input = path.resolve(inputPath);\n const output = path.resolve(outputPath);\n\n if (path.extname(input).toLowerCase() !== inputExtension) {\n throw new Error(\n `Excel conversion: source must have the ${inputExtension} extension: ${inputPath}`\n );\n }\n if (path.extname(output).toLowerCase() !== outputExtension) {\n throw new Error(\n `Excel conversion: destination must have the ${outputExtension} extension: ${outputPath}`\n );\n }\n if (!fs.existsSync(input)) {\n throw new Error(`Excel conversion: source file not found: ${inputPath}`);\n }\n if (!fs.statSync(input).isFile()) {\n throw new Error(`Excel conversion: source path is not a file: ${inputPath}`);\n }\n if (!fs.existsSync(path.dirname(output))) {\n throw new Error(`Excel conversion: destination directory not found: ${path.dirname(output)}`);\n }\n if (fs.existsSync(output)) {\n if (fs.statSync(output).isDirectory()) {\n throw new Error(`Excel conversion: destination path is a directory: ${outputPath}`);\n }\n if (!overwrite) {\n throw new Error(\n `Excel conversion: destination already exists (pass { overwrite: true } to replace it): ${outputPath}`\n );\n }\n }\n\n if (process.platform === 'win32' && input.toLowerCase() === output.toLowerCase()) {\n throw new Error('Excel conversion: source and destination must be different files.');\n }\n\n return { input, output };\n}\n\nfunction runPowerShellConversion(inputPath: string, outputPath: string, fileFormat: 50 | 51): Promise<void> {\n const encodedCommand = Buffer.from(POWERSHELL_CONVERSION_SCRIPT, 'utf16le').toString('base64');\n const environment: NodeJS.ProcessEnv = {\n ...process.env,\n JUSTYBASE_EXCEL_INPUT: inputPath,\n JUSTYBASE_EXCEL_OUTPUT: outputPath,\n JUSTYBASE_EXCEL_FORMAT: String(fileFormat),\n };\n\n return new Promise((resolve, reject) => {\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const child = spawn(\n 'powershell.exe',\n [\n '-NoLogo',\n '-NoProfile',\n '-NonInteractive',\n '-ExecutionPolicy',\n 'Bypass',\n '-EncodedCommand',\n encodedCommand,\n ],\n { env: environment, windowsHide: true }\n );\n\n child.stdout?.setEncoding('utf8');\n child.stderr?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => { stdout += chunk; });\n child.stderr?.on('data', (chunk: string) => { stderr += chunk; });\n\n child.once('error', (error) => {\n if (settled) return;\n settled = true;\n reject(new Error(`Excel conversion: unable to start PowerShell/COM: ${error.message}`));\n });\n\n child.once('close', (code) => {\n if (settled) return;\n settled = true;\n if (code === 0) {\n resolve();\n return;\n }\n\n const details = (stderr || stdout).replace(/\\s+/g, ' ').trim();\n reject(new Error(\n `Excel conversion failed (PowerShell exit code ${code ?? 'unknown'})${details ? `: ${details}` : '.'}`\n ));\n });\n });\n}\n\nasync function convertExcelFile(\n inputPath: string,\n outputPath: string,\n inputExtension: string,\n outputExtension: string,\n fileFormat: 50 | 51,\n options: ExcelConversionOptions = {}\n): Promise<void> {\n const { input, output } = validateConversionPaths(\n inputPath,\n outputPath,\n inputExtension,\n outputExtension,\n options.overwrite === true\n );\n\n if (process.platform !== 'win32') {\n throw new Error('Excel conversion requires Windows with desktop Microsoft Excel and COM automation.');\n }\n\n const temporaryOutput = path.join(\n path.dirname(output),\n `.${path.basename(output, outputExtension)}.${randomUUID()}.conversion${outputExtension}`\n );\n\n try {\n await runPowerShellConversion(input, temporaryOutput, fileFormat);\n if (!fs.existsSync(temporaryOutput)) {\n throw new Error('Excel conversion completed without creating the destination file.');\n }\n\n installTemporaryOutput(temporaryOutput, output, options.overwrite === true);\n } catch (error) {\n throw new Error(`Excel conversion ${inputExtension} -> ${outputExtension}: ${errorMessage(error)}`);\n } finally {\n if (fs.existsSync(temporaryOutput)) {\n try {\n fs.rmSync(temporaryOutput);\n } catch {\n // Preserve the original conversion error if cleanup also fails.\n }\n }\n }\n}\n\n/** Convert an Excel Binary Workbook (.xlsb) to an Open XML Workbook (.xlsx). */\nexport function convertXlsbToXlsx(\n inputPath: string,\n outputPath: string,\n options?: ExcelConversionOptions\n): Promise<void> {\n return convertExcelFile(inputPath, outputPath, '.xlsb', '.xlsx', 51, options);\n}\n\n/** Convert an Open XML Workbook (.xlsx) to an Excel Binary Workbook (.xlsb). */\nexport function convertXlsxToXlsb(\n inputPath: string,\n outputPath: string,\n options?: ExcelConversionOptions\n): Promise<void> {\n return convertExcelFile(inputPath, outputPath, '.xlsx', '.xlsb', 50, options);\n}\n"],"mappings":"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AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MACN;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAC9C,CAAC;AAED,SAAK,oBAAoB,OAAO,KAAK;AAAA,MACjC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpC;AAAA,MAAM;AAAA,MAAM;AAAA,IAChB,CAAC;AAED,SAAK,qBAAqB,OAAO,KAAK,CAAC,KAAM,GAAM,CAAI,CAAC;AAExD,SAAK,kBAAkB,OAAO,KAAK;AAAA,MAC/B;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1I;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,IAC9I,CAAC;AAED,SAAK,aAAa,OAAO,KAAK;AAAA,MAC1B;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpC;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MACZ;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpC;AAAA,MACA;AAAA,MAAM;AAAA,MAAM;AAAA,MACZ;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACzG;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC1C;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACpI;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA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","names":["Buffer","path","path","resolve","val","resolve","fs","archiver","Readable","archiver","Readable","resolve","fs","path","AdmZip","fs","path","fs","path","randomUUID","Readable","archiver","readDestinationMode","resolve","maybeEmitter","AdmZip","resolve","match","path","fs","os","path","AdmZip","AdmZip","resolve","rowNum","payload","path","fs","path","randomUUID","errorMessage","resolve","randomUUID"]}