@visactor/vtable-sheet 1.22.2 → 1.22.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/vtable-sheet.js +16 -5
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.js +4 -2
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.js +20 -18
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/formula/formula-engine.js +12 -9
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/ts-types/index.d.ts +16 -0
- package/cjs/ts-types/index.js.map +1 -1
- package/dist/vtable-sheet.js +173 -75
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/vtable-sheet.js +16 -5
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.js +3 -1
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.js +20 -18
- package/es/core/table-plugins.js.map +1 -1
- package/es/formula/formula-engine.js +12 -9
- package/es/formula/formula-engine.js.map +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/ts-types/index.d.ts +16 -0
- package/es/ts-types/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formula/formula-engine.ts"],"names":[],"mappings":"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","file":"formula-engine.js","sourcesContent":["/**\n * 嵌套公式计算引擎 - 清理版本\n * 支持函数嵌套调用和完整的依赖关系\n */\n\nimport type { FormulaCell, FormulaResult } from '../ts-types/formula';\nimport { supportedFunctions } from './formula-helper';\n\nexport interface FormulaEngineConfig {\n precisionRounding?: number;\n caseSensitive?: boolean;\n ignoreWhiteSpace?: 'standard' | 'any';\n nullDate?: { year: number; month: number; day: number };\n dateFormats?: string[];\n timeFormats?: string[];\n}\n\nexport class FormulaEngine {\n private sheets: Map<string, number> = new Map();\n private reverseSheets: Map<number, string> = new Map();\n private sheetData: Map<number, unknown[][]> = new Map();\n private formulaCells: Map<string, string> = new Map();\n private dependencies: Map<string, Set<string>> = new Map();\n private dependents: Map<string, Set<string>> = new Map();\n private nextSheetId = 0;\n private activeSheetKey: string | null = null;\n\n constructor(_config: FormulaEngineConfig = {}) {\n // 配置暂时不使用,保持兼容性\n }\n\n /**\n * 设置活动工作表\n * @param sheetKey 工作表键\n */\n setActiveSheet(sheetKey: string): void {\n if (this.sheets.has(sheetKey)) {\n this.activeSheetKey = sheetKey;\n }\n }\n\n /**\n * 获取活动工作表\n * @returns 活动工作表键\n */\n getActiveSheet(): string | null {\n return this.activeSheetKey;\n }\n\n addSheet(sheetKey: string, data?: unknown[][]): number {\n if (this.sheets.has(sheetKey)) {\n return this.sheets.get(sheetKey) as number;\n }\n\n const sheetId = this.nextSheetId++;\n this.sheets.set(sheetKey, sheetId);\n this.reverseSheets.set(sheetId, sheetKey);\n\n // 初始化工作表数据\n const sheetData = data || [['']];\n // this.sheetData.set(sheetId, this.normalizeData(sheetData));\n this.sheetData.set(sheetId, sheetData);\n\n return sheetId;\n }\n updateSheetData(sheetKey: string, data: unknown[][]): void {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId !== undefined && sheetId !== null) {\n this.sheetData.set(sheetId, data);\n }\n }\n\n private normalizeData(data: unknown[][]): unknown[][] {\n if (!Array.isArray(data) || data.length === 0) {\n return [['']];\n }\n\n const maxCols = Math.max(...data.map(row => (Array.isArray(row) ? row.length : 0)));\n\n return data.map(row => {\n if (!Array.isArray(row)) {\n return Array(maxCols).fill('');\n }\n\n const normalizedRow = row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) && cell.trim() !== '' ? num : cell;\n }\n return cell ?? '';\n });\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n\n return normalizedRow;\n });\n }\n\n getSheetId(sheetKey: string): number {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId === undefined) {\n return this.addSheet(sheetKey);\n }\n return sheetId;\n }\n\n /**\n * 获取单元格的公式字符串\n */\n getFormulaString(cell: FormulaCell): string | null {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.get(cellKey) || null;\n }\n\n /**\n * 清除指定单元格的依赖关系\n */\n private clearDependencies(cellKey: string): void {\n // 清除该单元格对其他单元的依赖\n const oldDeps = this.dependencies.get(cellKey) || new Set();\n for (const dep of oldDeps) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.delete(cellKey);\n if (depDependents.size === 0) {\n this.dependents.delete(dep);\n } else {\n this.dependents.set(dep, depDependents);\n }\n }\n\n // 清除该单元格的依赖记录\n this.dependencies.delete(cellKey);\n }\n\n /**\n * 设置单元格内容但不更新依赖关系(用于批量操作)\n */\n private setCellContentWithoutDependencyUpdate(cell: FormulaCell, value: unknown): void {\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n throw new Error('Invalid cell parameter');\n }\n\n if (cell.row < 0 || cell.col < 0) {\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n const sheetId = this.getSheetId(cell.sheet);\n\n if (!this.sheetData.has(sheetId)) {\n this.sheetData.set(sheetId, [['']]);\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet) {\n throw new Error(`Sheet data not found for ID: ${sheetId}`);\n }\n\n // 确保行存在\n while (sheet.length <= cell.row) {\n sheet.push([]);\n }\n\n // 确保列存在\n while (sheet[cell.row].length <= cell.col) {\n sheet[cell.row].push('');\n }\n\n let processedValue = value;\n\n // 处理空值\n if (processedValue === null || processedValue === undefined) {\n processedValue = '';\n }\n\n // 只有字符串类型的值才需要检查是否为数字\n if (typeof processedValue === 'string' && !processedValue.startsWith('=')) {\n const numericValue = Number(processedValue);\n // 只有非空字符串且能转换为有效数字时才转换\n if (!isNaN(numericValue) && processedValue.trim() !== '') {\n processedValue = numericValue;\n }\n }\n\n // 更新单元格值\n sheet[cell.row][cell.col] = processedValue;\n }\n\n setCellContent(cell: FormulaCell, value: unknown): void {\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n throw new Error('Invalid cell parameter');\n }\n\n if (cell.row < 0 || cell.col < 0) {\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n const sheetId = this.getSheetId(cell.sheet);\n\n if (!this.sheetData.has(sheetId)) {\n this.sheetData.set(sheetId, [['']]);\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet) {\n throw new Error(`Sheet data not found for ID: ${sheetId}`);\n }\n\n // 确保行存在\n while (sheet.length <= cell.row) {\n sheet.push([]);\n }\n\n // 确保列存在\n while (sheet[cell.row].length <= cell.col) {\n sheet[cell.row].push('');\n }\n\n // 处理值\n let processedValue = value;\n if (processedValue === undefined || processedValue === null) {\n processedValue = '';\n }\n\n // 只有字符串类型的值才需要检查是否为数字\n if (typeof processedValue === 'string' && !processedValue.startsWith('=')) {\n const numericValue = Number(processedValue);\n // 只有非空字符串且能转换为有效数字时才转换\n if (!isNaN(numericValue) && processedValue.trim() !== '') {\n processedValue = numericValue;\n }\n }\n\n // 更新单元格值\n sheet[cell.row][cell.col] = processedValue;\n\n // 如果是公式,更新依赖关系\n if (typeof processedValue === 'string' && processedValue.startsWith('=')) {\n const cellKey = this.getCellKey(cell);\n // 自动纠正公式大小写\n const correctedFormula = this.correctFormulaCase(processedValue);\n this.formulaCells.set(cellKey, correctedFormula);\n this.updateDependencies(cellKey, correctedFormula);\n // 更新单元格值为纠正后的公式\n sheet[cell.row][cell.col] = correctedFormula;\n // console.log(`Set formula ${cellKey}: ${correctedFormula}`);\n }\n\n // 重新计算受影响的单元格\n this.recalculateDependents(cell);\n }\n\n private getCellKey(cell: FormulaCell): string {\n return `${cell.sheet}!${this.getA1Notation(cell.row, cell.col)}`;\n }\n\n private getA1Notation(row: number, col: number): string {\n let columnStr = '';\n let tempCol = col;\n do {\n columnStr = String.fromCharCode(65 + (tempCol % 26)) + columnStr;\n tempCol = Math.floor(tempCol / 26) - 1;\n } while (tempCol >= 0);\n\n return columnStr + (row + 1);\n }\n\n private parseA1Notation(cellRef: string): { row: number; col: number } {\n const match = cellRef.match(/^([A-Z]+)([0-9]+)$/);\n if (!match) {\n throw new Error(`Invalid cell reference: ${cellRef}`);\n }\n\n const colLetters = match[1];\n const rowNumber = parseInt(match[2], 10);\n\n // 转换列字母为索引 (A=0, B=1, ..., Z=25, AA=26, etc.)\n let col = 0;\n for (let i = 0; i < colLetters.length; i++) {\n col = col * 26 + (colLetters.charCodeAt(i) - 65);\n }\n\n return { row: rowNumber - 1, col };\n }\n\n private parseCellKey(cellKey: string): FormulaCell | null {\n const parts = cellKey.split('!');\n if (parts.length !== 2) {\n return null;\n }\n\n const [sheet, a1Notation] = parts;\n try {\n const { row, col } = this.parseA1Notation(a1Notation);\n return { sheet, row, col };\n } catch {\n return null;\n }\n }\n\n calculateFormula(formula: string): { value: unknown; error?: string } {\n try {\n if (!formula.startsWith('=')) {\n return { value: formula, error: undefined };\n }\n\n // 自动纠正公式大小写\n const correctedFormula = this.correctFormulaCase(formula);\n const expression = correctedFormula.substring(1).trim();\n\n // 检查是否包含#REF!错误\n if (expression.includes('#REF!')) {\n return { value: '#REF!', error: undefined };\n }\n\n // 使用递归下降解析器\n const result = this.parseExpression(expression);\n return result;\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n /**\n * 自动纠正公式的大小写\n * 将函数名转换为大写,将单元格引用转换为大写(如 f4 -> F4)\n * 保持工作表名称不变(区分大小写)\n */\n private correctFormulaCase(formula: string): string {\n if (!formula.startsWith('=')) {\n return formula;\n }\n\n let corrected = '=';\n const expression = formula.substring(1);\n\n // 用于跟踪是否在字符串字面量中\n let inQuotes = false;\n let quoteChar = '';\n let i = 0;\n\n while (i < expression.length) {\n const char = expression[i];\n\n // 处理字符串字面量\n if ((char === '\"' || char === \"'\") && (i === 0 || expression[i - 1] !== '\\\\')) {\n if (!inQuotes) {\n inQuotes = true;\n quoteChar = char;\n } else if (char === quoteChar) {\n inQuotes = false;\n quoteChar = '';\n }\n corrected += char;\n i++;\n continue;\n }\n\n // 如果在字符串中,直接复制字符\n if (inQuotes) {\n corrected += char;\n i++;\n continue;\n }\n\n // 查找函数名模式(字母开头,后跟字母数字,然后是左括号)\n const funcMatch = expression.substring(i).match(/^[A-Za-z][A-Za-z0-9]*\\s*\\(/);\n if (funcMatch) {\n const funcName = funcMatch[0].replace(/\\s*\\($/, '');\n corrected += funcName.toUpperCase() + '(';\n i += funcName.length + 1;\n // 跳过可能的空白字符\n while (i < expression.length && expression[i] === ' ') {\n i++;\n }\n continue;\n }\n\n // 查找带工作表前缀的单元格引用(如 Sheet1!a1)\n const sheetCellMatch = expression.substring(i).match(/^[A-Za-z0-9_]+![A-Za-z]+[0-9]+/);\n if (sheetCellMatch) {\n const fullRef = sheetCellMatch[0];\n const [sheetName, cellRef] = fullRef.split('!');\n\n // 查找原始工作表名称(保持大小写)\n const originalSheetName = this.findOriginalSheetName(sheetName);\n\n // 保持工作表名称不变,只纠正单元格引用\n const letters = cellRef.replace(/[0-9]/g, '');\n const numbers = cellRef.replace(/[A-Za-z]/g, '');\n corrected += (originalSheetName || sheetName) + '!' + letters.toUpperCase() + numbers;\n i += fullRef.length;\n continue;\n }\n\n // 查找带工作表前缀的范围引用(如 Sheet1!a1:b2)\n const sheetRangeMatch = expression.substring(i).match(/^[A-Za-z0-9_]+![A-Za-z]+[0-9]+:[A-Za-z]+[0-9]+/);\n if (sheetRangeMatch) {\n const fullRangeRef = sheetRangeMatch[0];\n const [sheetPart, rangePart] = fullRangeRef.split('!');\n const [startCell, endCell] = rangePart.split(':');\n\n // 查找原始工作表名称(保持大小写)\n const originalSheetName = this.findOriginalSheetName(sheetPart);\n\n // 转换起始单元格\n const startLetters = startCell.replace(/[0-9]/g, '');\n const startNumbers = startCell.replace(/[A-Za-z]/g, '');\n const newStartCell = startLetters.toUpperCase() + startNumbers;\n\n // 转换结束单元格\n const endLetters = endCell.replace(/[0-9]/g, '');\n const endNumbers = endCell.replace(/[A-Za-z]/g, '');\n const newEndCell = endLetters.toUpperCase() + endNumbers;\n\n corrected += (originalSheetName || sheetPart) + '!' + newStartCell + ':' + newEndCell;\n i += fullRangeRef.length;\n continue;\n }\n\n // 查找普通单元格引用模式(字母+数字,如 f4, A1, AA10)\n const cellMatch = expression.substring(i).match(/^[A-Za-z]+[0-9]+/);\n if (cellMatch) {\n const cellRef = cellMatch[0];\n // 将字母部分转换为大写\n const letters = cellRef.replace(/[0-9]/g, '');\n const numbers = cellRef.replace(/[A-Za-z]/g, '');\n corrected += letters.toUpperCase() + numbers;\n i += cellRef.length;\n continue;\n }\n\n // 查找普通范围引用模式(如 f4:f8, A1:B2)\n const rangeMatch = expression.substring(i).match(/^[A-Za-z]+[0-9]+:[A-Za-z]+[0-9]+/);\n if (rangeMatch) {\n const rangeRef = rangeMatch[0];\n const [startCell, endCell] = rangeRef.split(':');\n\n // 转换起始单元格\n const startLetters = startCell.replace(/[0-9]/g, '');\n const startNumbers = startCell.replace(/[A-Za-z]/g, '');\n const newStartCell = startLetters.toUpperCase() + startNumbers;\n\n // 转换结束单元格\n const endLetters = endCell.replace(/[0-9]/g, '');\n const endNumbers = endCell.replace(/[A-Za-z]/g, '');\n const newEndCell = endLetters.toUpperCase() + endNumbers;\n\n corrected += newStartCell + ':' + newEndCell;\n i += rangeRef.length;\n continue;\n }\n\n // 普通字符,直接复制\n corrected += char;\n i++;\n }\n\n return corrected;\n }\n\n /**\n * 查找原始工作表名称(保持大小写)\n */\n private findOriginalSheetName(sheetName: string): string | null {\n // 首先尝试精确匹配\n if (this.sheets.has(sheetName)) {\n return sheetName;\n }\n\n // 如果找不到,尝试不区分大小写的匹配\n const lowerSheetName = sheetName.toLowerCase();\n for (const [existingSheetName] of this.sheets.entries()) {\n if (existingSheetName.toLowerCase() === lowerSheetName) {\n return existingSheetName;\n }\n }\n\n return null;\n }\n\n private parseExpression(expr: string): { value: unknown; error?: string } {\n expr = expr.trim();\n\n // 首先处理函数调用(最高优先级)\n const functionResult = this.tryParseFunction(expr);\n if (functionResult) {\n return functionResult;\n }\n\n // 处理比较运算符\n const comparisonResult = this.tryParseComparison(expr);\n if (comparisonResult) {\n return comparisonResult;\n }\n\n // 处理算术表达式\n return this.parseArithmetic(expr);\n }\n\n private tryParseComparison(expr: string): { value: unknown; error?: string } | null {\n const operators = ['>=', '<=', '<>', '>', '<', '='];\n\n for (const op of operators) {\n const index = expr.indexOf(op);\n if (index !== -1) {\n const leftExpr = expr.substring(0, index).trim();\n const rightExpr = expr.substring(index + op.length).trim();\n\n // 如果左边或右边为空,跳过这个运算符\n if (!leftExpr || !rightExpr) {\n continue;\n }\n\n const leftResult = this.parseExpression(leftExpr);\n const rightResult = this.parseExpression(rightExpr);\n\n if (leftResult.error || rightResult.error) {\n return { value: null, error: 'Comparison operands error' };\n }\n\n // 尝试转换为数字进行比较\n const leftVal = Number(leftResult.value);\n const rightVal = Number(rightResult.value);\n\n let result = false;\n if (!isNaN(leftVal) && !isNaN(rightVal)) {\n // 数值比较\n switch (op) {\n case '>=': {\n result = leftVal >= rightVal;\n break;\n }\n case '<=': {\n result = leftVal <= rightVal;\n break;\n }\n case '<>': {\n result = leftVal !== rightVal;\n break;\n }\n case '>': {\n result = leftVal > rightVal;\n break;\n }\n case '<': {\n result = leftVal < rightVal;\n break;\n }\n case '=': {\n result = leftVal === rightVal;\n break;\n }\n }\n } else {\n // 字符串比较\n const leftStr = String(leftResult.value);\n const rightStr = String(rightResult.value);\n switch (op) {\n case '>=': {\n result = leftStr >= rightStr;\n break;\n }\n case '<=': {\n result = leftStr <= rightStr;\n break;\n }\n case '<>': {\n result = leftStr !== rightStr;\n break;\n }\n case '>': {\n result = leftStr > rightStr;\n break;\n }\n case '<': {\n result = leftStr < rightStr;\n break;\n }\n case '=': {\n result = leftStr === rightStr;\n break;\n }\n }\n }\n\n return { value: result, error: undefined };\n }\n }\n\n return null;\n }\n\n private parseArithmetic(expr: string): { value: unknown; error?: string } {\n try {\n // 首先处理函数调用\n const functionResult = this.tryParseFunction(expr);\n if (functionResult) {\n return functionResult;\n }\n\n // 处理字符串\n if (expr.startsWith('\"') && expr.endsWith('\"')) {\n return { value: expr.slice(1, -1), error: undefined };\n }\n\n // 处理单元格引用(包括带工作表前缀的引用,如 Sheet1!A1)\n if (/^([A-Za-z0-9_]+!)?[A-Z]+[0-9]+$/.test(expr)) {\n return { value: this.getCellValueByA1(expr), error: undefined };\n }\n\n // 处理数字\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return { value: Number(expr), error: undefined };\n }\n\n // 处理范围引用(包括带工作表前缀的范围,如 Sheet1!A2:A4)\n if (/^([A-Za-z0-9_]+!)?[A-Z]+[0-9]+:[A-Z]+[0-9]+$/.test(expr)) {\n const values = this.getRangeValuesFromExpr(expr);\n return { value: values, error: undefined };\n }\n\n // 处理算术表达式(包含+、-、*、/)\n if (expr.includes('+') || expr.includes('-') || expr.includes('*') || expr.includes('/')) {\n return this.evaluateArithmeticWithFunctions(expr);\n }\n\n // 如果都不匹配,返回原始值\n return { value: expr, error: undefined };\n } catch (error) {\n return { value: null, error: error instanceof Error ? error.message : 'Arithmetic parsing failed' };\n }\n }\n\n private tryParseFunction(expr: string): { value: unknown; error?: string } | null {\n // 更精确地匹配函数调用 - 确保是整个表达式且括号平衡\n // 首先检查是否以函数名开头\n const funcStartMatch = expr.match(/^([A-Z]+)\\s*\\(/i);\n if (!funcStartMatch) {\n return null;\n }\n\n const funcName = funcStartMatch[1].toUpperCase();\n\n // 找到匹配的右括号\n let depth = 1;\n let argsEnd = funcStartMatch[0].length - 1; // 位置在左括号\n\n for (let i = funcStartMatch[0].length; i < expr.length; i++) {\n if (expr[i] === '(') {\n depth++;\n } else if (expr[i] === ')') {\n depth--;\n if (depth === 0) {\n argsEnd = i;\n break;\n }\n }\n }\n\n if (depth !== 0) {\n return null; // 没有找到匹配的右括号\n }\n\n // 确保这是整个表达式(没有剩余字符)\n if (argsEnd + 1 !== expr.length) {\n return null; // 这不是一个完整的函数调用,后面还有其他内容\n }\n\n const argsStr = expr.substring(funcStartMatch[0].length, argsEnd);\n\n // 解析参数(处理嵌套)\n const args = this.parseArguments(argsStr);\n\n // 计算每个参数的值\n const argValues: unknown[] = [];\n for (const arg of args) {\n const result = this.parseExpression(arg);\n if (result.error) {\n return { value: null, error: `Argument error in ${funcName}: ${result.error}` };\n }\n argValues.push(result.value);\n }\n\n // 执行函数\n return this.executeFunction(funcName, argValues);\n }\n\n private parseArguments(argsStr: string): string[] {\n const args: string[] = [];\n let current = '';\n let depth = 0;\n let inQuotes = false;\n\n for (let i = 0; i < argsStr.length; i++) {\n const char = argsStr[i];\n\n if (char === '\"' && (i === 0 || argsStr[i - 1] !== '\\\\')) {\n inQuotes = !inQuotes;\n }\n\n if (!inQuotes) {\n if (char === '(') {\n depth++;\n }\n if (char === ')') {\n depth--;\n }\n\n if (char === ',' && depth === 0) {\n args.push(current.trim());\n current = '';\n continue;\n }\n }\n\n current += char;\n }\n\n if (current.trim()) {\n args.push(current.trim());\n }\n\n // 如果只有一个参数且包含函数调用,需要特殊处理\n if (args.length === 1 && args[0].includes('(') && args[0].includes(')')) {\n // 检查是否可能是多个参数被错误解析\n const singleArg = args[0];\n\n // 尝试重新解析,考虑函数嵌套\n const reArgs: string[] = [];\n let reCurrent = '';\n let reDepth = 0;\n let reInQuotes = false;\n\n for (let i = 0; i < singleArg.length; i++) {\n const char = singleArg[i];\n\n if (char === '\"' && (i === 0 || singleArg[i - 1] !== '\\\\')) {\n reInQuotes = !reInQuotes;\n }\n\n if (!reInQuotes) {\n if (char === '(') {\n reDepth++;\n }\n if (char === ')') {\n reDepth--;\n }\n\n if (char === ',' && reDepth === 0) {\n reArgs.push(reCurrent.trim());\n reCurrent = '';\n continue;\n }\n }\n\n reCurrent += char;\n }\n\n if (reCurrent.trim()) {\n reArgs.push(reCurrent.trim());\n }\n\n // 如果重新解析得到多个参数,使用重新解析的结果\n if (reArgs.length > 1) {\n return reArgs;\n }\n }\n\n return args;\n }\n\n private executeFunction(funcName: string, args: unknown[]): { value: unknown; error?: string } {\n try {\n switch (funcName) {\n // 数学函数\n case 'SUM':\n return this.calculateSum(args);\n case 'AVERAGE':\n return this.calculateAverage(args);\n case 'MAX':\n return this.calculateMax(args);\n case 'MIN':\n return this.calculateMin(args);\n case 'ABS':\n return this.calculateAbs(args);\n case 'ROUND':\n return this.calculateRound(args);\n case 'INT':\n return this.calculateInt(args);\n case 'RAND':\n return this.calculateRand(args);\n\n // 统计函数\n case 'COUNT':\n return this.calculateCount(args);\n case 'COUNTA':\n return this.calculateCountA(args);\n case 'STDEV':\n return this.calculateStdev(args);\n case 'VAR':\n return this.calculateVar(args);\n case 'MEDIAN':\n return this.calculateMedian(args);\n case 'PRODUCT':\n return this.calculateProduct(args);\n\n // 逻辑函数\n case 'IF':\n return this.calculateIf(args);\n case 'AND':\n return this.calculateAnd(args);\n case 'OR':\n return this.calculateOr(args);\n case 'NOT':\n return this.calculateNot(args);\n\n // 日期函数\n case 'TODAY':\n return this.calculateToday(args);\n case 'NOW':\n return this.calculateNow(args);\n\n default:\n return { value: null, error: `Unknown function: ${funcName}` };\n }\n } catch (error) {\n return { value: null, error: error instanceof Error ? error.message : 'Function execution failed' };\n }\n }\n\n // 函数实现\n private calculateSum(args: unknown[]): { value: unknown; error?: string } {\n let total = 0;\n for (const arg of this.flattenArgsWithRanges(args)) {\n const num = Number(arg);\n if (!isNaN(num)) {\n total += num;\n }\n }\n return { value: total, error: undefined };\n }\n\n private calculateAverage(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args).filter(arg => !isNaN(Number(arg)));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n const sum = values.reduce((acc: number, val) => acc + Number(val), 0);\n return { value: Number(sum) / Number(values.length), error: undefined };\n }\n\n private calculateMax(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args)\n .filter(arg => !isNaN(Number(arg)))\n .map(arg => Number(arg));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n return { value: Math.max(...values), error: undefined };\n }\n\n private calculateMin(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args)\n .filter(arg => !isNaN(Number(arg)))\n .map(arg => Number(arg));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n return { value: Math.min(...values), error: undefined };\n }\n\n private calculateAbs(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'ABS requires exactly 1 argument' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'ABS argument must be a number' };\n }\n return { value: Math.abs(num), error: undefined };\n }\n\n private calculateRound(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1 || args.length > 2) {\n return { value: null, error: 'ROUND requires 1 or 2 arguments' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'ROUND argument must be a number' };\n }\n const digits = args.length === 2 ? Number(args[1]) : 0;\n if (isNaN(digits)) {\n return { value: null, error: 'ROUND digits must be a number' };\n }\n const factor = Math.pow(10, digits);\n return { value: Math.round(num * factor) / factor, error: undefined };\n }\n\n private calculateInt(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'INT requires exactly 1 argument' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'INT argument must be a number' };\n }\n return { value: Math.floor(num), error: undefined };\n }\n\n private calculateRand(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'RAND requires no arguments' };\n }\n return { value: Math.random(), error: undefined };\n }\n\n private calculateCount(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args);\n let count = 0;\n for (const value of values) {\n // COUNT only counts numeric values, excluding empty strings, null, undefined\n if (value !== '' && value !== null && value !== undefined) {\n const num = Number(value);\n if (!isNaN(num)) {\n count++;\n }\n }\n }\n return { value: count, error: undefined };\n }\n\n private calculateCountA(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args);\n let count = 0;\n for (const value of values) {\n if (value !== null && value !== undefined && value !== '') {\n count++;\n }\n }\n return { value: count, error: undefined };\n }\n\n private calculateStdev(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length < 2) {\n return { value: 0, error: undefined };\n }\n\n // Calculate mean\n const mean = values.reduce((sum, val) => sum + val, 0) / values.length;\n\n // Calculate variance\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / (values.length - 1);\n\n // Return standard deviation\n return { value: Math.sqrt(variance), error: undefined };\n }\n\n private calculateVar(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length < 2) {\n return { value: 0, error: undefined };\n }\n\n // Calculate mean\n const mean = values.reduce((sum, val) => sum + val, 0) / values.length;\n\n // Calculate variance (sample variance - divide by n-1 like STDEV)\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / (values.length - 1);\n\n return { value: variance, error: undefined };\n }\n\n private calculateMedian(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n\n // Sort the values\n const sortedValues = values.sort((a, b) => a - b);\n\n if (sortedValues.length % 2 === 0) {\n // Even number of values - return average of middle two\n const mid1 = sortedValues[sortedValues.length / 2 - 1];\n const mid2 = sortedValues[sortedValues.length / 2];\n return { value: (mid1 + mid2) / 2, error: undefined };\n }\n // Odd number of values - return middle value\n return { value: sortedValues[Math.floor(sortedValues.length / 2)], error: undefined };\n }\n\n private calculateProduct(args: unknown[]): { value: unknown; error?: string } {\n let product = 1;\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n\n for (const value of values) {\n product *= value;\n }\n\n return { value: product, error: undefined };\n }\n\n private calculateIf(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 3) {\n return { value: null, error: 'IF requires exactly 3 arguments' };\n }\n\n // 第一个参数是条件\n const condition = this.isTruthy(args[0]);\n\n // 返回对应的结果\n return { value: condition ? args[1] : args[2], error: undefined };\n }\n\n private calculateAnd(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1) {\n return { value: null, error: 'AND requires at least 1 argument' };\n }\n for (const arg of args) {\n if (!this.isTruthy(arg)) {\n return { value: false, error: undefined };\n }\n }\n return { value: true, error: undefined };\n }\n\n private calculateOr(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1) {\n return { value: null, error: 'OR requires at least 1 argument' };\n }\n for (const arg of args) {\n if (this.isTruthy(arg)) {\n return { value: true, error: undefined };\n }\n }\n return { value: false, error: undefined };\n }\n\n private calculateNot(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'NOT requires exactly 1 argument' };\n }\n return { value: !this.isTruthy(args[0]), error: undefined };\n }\n\n private calculateToday(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'TODAY requires no arguments' };\n }\n return { value: new Date(), error: undefined };\n }\n\n private calculateNow(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'NOW requires no arguments' };\n }\n return { value: new Date(), error: undefined };\n }\n\n private flattenArgs(args: unknown[]): unknown[] {\n const result: unknown[] = [];\n for (const arg of args) {\n if (Array.isArray(arg)) {\n result.push(...arg);\n } else {\n result.push(arg);\n }\n }\n return result;\n }\n\n private flattenArgsWithRanges(args: unknown[]): unknown[] {\n const result: unknown[] = [];\n for (const arg of args) {\n if (Array.isArray(arg)) {\n result.push(...arg);\n } else if (typeof arg === 'string' && arg.includes(':')) {\n // 处理范围引用,如 A2:A4\n try {\n const rangeValues = this.getRangeValuesFromExpr(arg);\n result.push(...rangeValues);\n } catch {\n // 如果范围解析失败,保持原样\n result.push(arg);\n }\n } else {\n result.push(arg);\n }\n }\n return result;\n }\n\n private isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (value === false || value === 0 || value === '') {\n return false;\n }\n if (value === true) {\n return true;\n }\n\n // 处理字符串\n if (typeof value === 'string') {\n if (value.toLowerCase() === 'false') {\n return false;\n }\n if (value.toLowerCase() === 'true') {\n return true;\n }\n }\n\n const num = Number(value);\n if (!isNaN(num)) {\n return num !== 0;\n }\n\n return true; // 非空值视为true\n }\n\n private evaluateArithmeticWithFunctions(expr: string): { value: unknown; error?: string } {\n try {\n // 这个函数处理包含函数调用的算术表达式,如 SUM(A2:A4)+AVERAGE(A2:A4)\n\n // 1. 首先找到所有的函数调用\n const functionMatches = [];\n const functionRegex = /[A-Z]+\\([^)]*\\)/g;\n let match;\n\n while ((match = functionRegex.exec(expr)) !== null) {\n functionMatches.push({\n match: match[0],\n start: match.index,\n end: match.index + match[0].length\n });\n }\n\n // 2. 计算每个函数的值\n let processedExpr = expr;\n const functionValues = [];\n\n for (const funcMatch of functionMatches) {\n const funcResult = this.parseExpression(funcMatch.match);\n if (funcResult.error) {\n return { value: null, error: `Error in function ${funcMatch.match}: ${funcResult.error}` };\n }\n functionValues.push(funcResult.value);\n // 用占位符替换函数调用,避免重复处理\n processedExpr = processedExpr.replace(funcMatch.match, `__FUNC_${functionValues.length - 1}__`);\n }\n\n // 3. 处理剩余的单元格引用\n const cellRefs = processedExpr.match(/[A-Z]+[0-9]+/g) || [];\n for (const cellRef of cellRefs) {\n const value = this.getCellValueByA1(cellRef);\n processedExpr = processedExpr.replace(cellRef, String(value));\n }\n\n // 4. 将占位符替换回实际值\n for (let i = 0; i < functionValues.length; i++) {\n processedExpr = processedExpr.replace(`__FUNC_${i}__`, String(functionValues[i]));\n }\n\n // 5. 计算最终的算术表达式\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const result = Function('\"use strict\"; return (' + processedExpr + ')')();\n return { value: result, error: undefined };\n } catch (error) {\n return { value: null, error: 'Basic arithmetic evaluation failed' };\n }\n }\n\n private getCellValueByA1(a1Notation: string): unknown {\n try {\n let sheetKey = this.activeSheetKey || this.reverseSheets.get(0) || 'Sheet1';\n let cellRef = a1Notation;\n\n // 检查是否包含工作表前缀\n if (a1Notation.includes('!')) {\n const parts = a1Notation.split('!');\n if (parts.length === 2) {\n sheetKey = parts[0];\n cellRef = parts[1];\n }\n }\n\n const { row, col } = this.parseA1Notation(cellRef);\n const cell: FormulaCell = { sheet: sheetKey, row, col };\n return this.getCellValue(cell).value;\n } catch {\n return 0;\n }\n }\n\n private getRangeValuesFromExpr(expr: string): unknown[] {\n try {\n if (!expr.includes(':')) {\n return [this.getCellValueByA1(expr)];\n }\n\n // 解析范围引用,可能包含工作表前缀,如 DataSheet!A2:A4\n let sheetKey = this.activeSheetKey || this.reverseSheets.get(0) || 'Sheet1';\n let rangeExpr = expr;\n\n // 检查是否包含工作表前缀\n if (expr.includes('!')) {\n const parts = expr.split('!');\n if (parts.length === 2) {\n sheetKey = parts[0];\n rangeExpr = parts[1];\n }\n }\n\n const [start, end] = rangeExpr.split(':');\n const startCell = this.parseA1Notation(start.trim());\n const endCell = this.parseA1Notation(end.trim());\n\n const values: unknown[] = [];\n\n for (let row = startCell.row; row <= endCell.row; row++) {\n for (let col = startCell.col; col <= endCell.col; col++) {\n const cell: FormulaCell = { sheet: sheetKey, row, col };\n values.push(this.getCellValue(cell).value);\n }\n }\n\n return values;\n } catch {\n return [];\n }\n }\n\n // 公共方法\n getCellValue(cell: FormulaCell): FormulaResult {\n try {\n const sheetId = this.sheets.get(cell.sheet);\n if (sheetId === undefined) {\n return { value: '', error: undefined };\n }\n\n const sheet = this.sheetData.get(sheetId);\n\n if (!sheet || !sheet[cell.row] || sheet[cell.row][cell.col] === undefined || sheet[cell.row][cell.col] === null) {\n return { value: '', error: undefined };\n }\n\n const value = sheet[cell.row][cell.col];\n\n // 如果是公式,计算其结果\n if (typeof value === 'string' && value.startsWith('=')) {\n const result = this.calculateFormula(value);\n return result;\n }\n\n // 如果是公式错误\n if (value instanceof FormulaError) {\n return { value: null, error: value.message };\n }\n\n return { value, error: undefined };\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n getCellFormula(cell: FormulaCell): string | undefined {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.get(cellKey);\n }\n\n isCellFormula(cell: FormulaCell): boolean {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.has(cellKey);\n }\n\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n const cellKey = this.getCellKey(cell);\n const dependents = this.dependents.get(cellKey);\n\n if (!dependents) {\n return [];\n }\n\n const result: FormulaCell[] = [];\n for (const dependent of dependents) {\n const parsed = this.parseCellKey(dependent);\n if (parsed) {\n result.push(parsed);\n }\n }\n\n return result;\n }\n\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n const cellKey = this.getCellKey(cell);\n const dependencies = this.dependencies.get(cellKey);\n\n if (!dependencies) {\n return [];\n }\n\n const result: FormulaCell[] = [];\n for (const dependency of dependencies) {\n const parsed = this.parseCellKey(dependency);\n if (parsed) {\n result.push(parsed);\n }\n }\n\n return result;\n }\n\n getAvailableFunctions(): string[] {\n return [...supportedFunctions];\n }\n\n // 新增方法:验证公式语法(仅语法验证,不计算)\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 仅进行语法验证,不进行实际计算\n if (!formula.startsWith('=')) {\n return { isValid: true }; // 非公式总是有效的\n }\n\n const expression = formula.substring(1).trim();\n if (!expression) {\n return { isValid: false, error: 'Empty expression' };\n }\n\n // 基本语法检查\n this.validateExpressionStructure(expression);\n\n // 验证函数名是否有效\n this.validateFunctionNames(expression);\n\n return { isValid: true };\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid formula syntax'\n };\n }\n }\n\n private validateFunctionNames(expr: string): void {\n // 匹配函数调用模式\n const functionPattern = /([A-Z]+)\\s*\\(/gi;\n let match;\n\n while ((match = functionPattern.exec(expr)) !== null) {\n const funcName = match[1].toUpperCase();\n if (!supportedFunctions.includes(funcName)) {\n throw new Error(`Unknown function: ${funcName}`);\n }\n }\n }\n\n private validateExpressionStructure(expr: string): void {\n // 检查括号是否匹配\n const openParenCount = (expr.match(/\\(/g) || []).length;\n const closeParenCount = (expr.match(/\\)/g) || []).length;\n if (openParenCount !== closeParenCount) {\n throw new Error('Unmatched parentheses');\n }\n\n // 检查引号是否匹配\n const doubleQuoteCount = (expr.match(/\"/g) || []).length;\n if (doubleQuoteCount % 2 !== 0) {\n throw new Error('Unmatched quotes');\n }\n\n // 检查是否有未完成的操作符\n if (expr.match(/[+\\-*/^&%<>=]$/)) {\n throw new Error('Expression ends with operator');\n }\n\n // 检查是否有连续的逗号\n if (expr.match(/,,/)) {\n throw new Error('Consecutive commas');\n }\n\n // 检查是否有未完成的函数参数\n if (expr.match(/\\([^)]*,\\s*\\)/) || expr.match(/,\\s*\\)/) || expr.match(/\\(\\s*\\)/)) {\n throw new Error('Invalid function arguments');\n }\n\n // 检查是否有连续的操作符 (如 1++1)\n if (expr.match(/[+\\-*/^&%][+\\-*/^&%]/)) {\n throw new Error('Basic arithmetic evaluation failed');\n }\n }\n\n release(): void {\n this.sheets.clear();\n this.reverseSheets.clear();\n this.sheetData.clear();\n this.formulaCells.clear();\n this.dependencies.clear();\n this.dependents.clear();\n this.nextSheetId = 0;\n }\n\n // 新增方法:导出公式\n exportFormulas(sheetKey: string): Record<string, string> {\n const result: Record<string, string> = {};\n const sheetId = this.sheets.get(sheetKey);\n\n if (sheetId === undefined) {\n return result;\n }\n\n // 遍历所有公式单元格\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey, formula] = entry;\n const cell = this.parseCellKey(cellKey);\n if (cell && cell.sheet === sheetKey) {\n const a1Notation = this.getA1Notation(cell.row, cell.col);\n result[a1Notation] = formula;\n }\n }\n\n return result;\n }\n\n // 新增方法:获取所有工作表\n getAllSheets(): Array<{ key: string; id: number; name: string }> {\n const result: Array<{ key: string; id: number; name: string }> = [];\n\n for (const entry of Array.from(this.sheets.entries())) {\n const [sheetKey, sheetId] = entry;\n result.push({\n key: sheetKey,\n id: sheetId,\n name: sheetKey // 使用key作为名称\n });\n }\n\n return result;\n }\n\n // 新增方法:按依赖关系对公式进行排序\n sortFormulasByDependency(sheetKey: string, formulas: Record<string, string>): [string, string][] {\n try {\n // 创建临时依赖图用于排序\n const tempDependencies = new Map<string, Set<string>>();\n const tempDependents = new Map<string, Set<string>>();\n\n // 分析所有公式的依赖关系\n for (const [cellRef, formula] of Object.entries(formulas)) {\n const cellKey = `${sheetKey}!${cellRef}`;\n const dependencies = this.extractCellReferences(formula, sheetKey);\n\n tempDependencies.set(cellKey, new Set(dependencies));\n\n // 建立反向依赖关系\n for (const dep of dependencies) {\n const depDependents = tempDependents.get(dep) || new Set();\n depDependents.add(cellKey);\n tempDependents.set(dep, depDependents);\n }\n }\n\n // 使用拓扑排序\n const visited = new Set<string>();\n const tempVisited = new Set<string>();\n const result: [string, string][] = [];\n\n const visit = (cellKey: string): void => {\n if (visited.has(cellKey)) {\n return;\n }\n if (tempVisited.has(cellKey)) {\n console.warn(`Circular dependency detected involving cell ${cellKey}`);\n return;\n }\n\n tempVisited.add(cellKey);\n\n const deps = tempDependencies.get(cellKey) || new Set();\n for (const dep of deps) {\n if (tempDependencies.has(dep)) {\n // 只访问也是公式的依赖\n visit(dep);\n }\n }\n\n tempVisited.delete(cellKey);\n visited.add(cellKey);\n\n // 提取单元格引用(移除工作表前缀)\n const cellRef = cellKey.substring(sheetKey.length + 1);\n const formula = formulas[cellRef];\n if (formula) {\n result.push([cellRef, formula]);\n }\n };\n\n // 访问所有公式单元格\n for (const cellKey of tempDependencies.keys()) {\n if (!visited.has(cellKey)) {\n visit(cellKey);\n }\n }\n\n return result;\n } catch (error) {\n console.warn(`Failed to sort formulas by dependency for sheet ${sheetKey}:`, error);\n // 如果排序失败,返回原始顺序\n return Object.entries(formulas);\n }\n }\n\n // 新增方法:删除工作表\n removeSheet(sheetKey: string): void {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId === undefined) {\n return;\n }\n\n // 不能删除最后一个sheet\n if (this.sheets.size <= 1) {\n throw new Error('Cannot remove the last sheet');\n }\n\n // 删除工作表数据\n this.sheetData.delete(sheetId);\n this.sheets.delete(sheetKey);\n this.reverseSheets.delete(sheetId);\n\n // 删除相关的公式和依赖关系\n const keysToRemove: string[] = [];\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey] = entry;\n if (cellKey.startsWith(`${sheetKey}!`)) {\n keysToRemove.push(cellKey);\n }\n }\n\n for (const cellKey of keysToRemove) {\n this.formulaCells.delete(cellKey);\n this.dependencies.delete(cellKey);\n this.dependents.delete(cellKey);\n }\n\n // 清理依赖关系中的引用\n for (const entry of Array.from(this.dependencies.entries())) {\n const [cellKey, deps] = entry;\n const newDeps = new Set<string>();\n for (const dep of deps) {\n if (!dep.startsWith(`${sheetKey}!`)) {\n newDeps.add(dep);\n }\n }\n if (newDeps.size === 0) {\n this.dependencies.delete(cellKey);\n } else {\n this.dependencies.set(cellKey, newDeps);\n }\n }\n\n for (const entry of Array.from(this.dependents.entries())) {\n const [cellKey, dependents] = entry;\n const newDependents = new Set<string>();\n for (const dep of dependents) {\n if (!dep.startsWith(`${sheetKey}!`)) {\n newDependents.add(dep);\n }\n }\n if (newDependents.size === 0) {\n this.dependents.delete(cellKey);\n } else {\n this.dependents.set(cellKey, newDependents);\n }\n }\n }\n\n // 新增方法:重命名工作表\n renameSheet(oldKey: string, newKey: string): void {\n const sheetId = this.sheets.get(oldKey);\n if (sheetId === undefined) {\n throw new Error(`Sheet not found: ${oldKey}`);\n }\n\n if (this.sheets.has(newKey)) {\n throw new Error(`Sheet already exists: ${newKey}`);\n }\n\n // 更新工作表映射\n this.sheets.delete(oldKey);\n this.sheets.set(newKey, sheetId);\n this.reverseSheets.set(sheetId, newKey);\n\n // 更新公式单元格的键\n const formulaEntriesToUpdate: [string, string][] = [];\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey, formula] = entry;\n if (cellKey.startsWith(`${oldKey}!`)) {\n const newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n formulaEntriesToUpdate.push([newCellKey, formula]);\n this.formulaCells.delete(cellKey);\n }\n }\n\n for (const [newCellKey, formula] of formulaEntriesToUpdate) {\n this.formulaCells.set(newCellKey, formula);\n }\n\n // 更新依赖关系的键\n const dependencyEntriesToUpdate: [string, Set<string>][] = [];\n for (const entry of Array.from(this.dependencies.entries())) {\n const [cellKey, deps] = entry;\n let newCellKey = cellKey;\n const newDeps = new Set<string>();\n\n if (cellKey.startsWith(`${oldKey}!`)) {\n newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n }\n\n for (const dep of deps) {\n if (dep.startsWith(`${oldKey}!`)) {\n newDeps.add(dep.replace(`${oldKey}!`, `${newKey}!`));\n } else {\n newDeps.add(dep);\n }\n }\n\n if (newCellKey !== cellKey || !this.areSetsEqual(newDeps, deps)) {\n dependencyEntriesToUpdate.push([newCellKey, newDeps]);\n this.dependencies.delete(cellKey);\n }\n }\n\n for (const [newCellKey, newDeps] of dependencyEntriesToUpdate) {\n this.dependencies.set(newCellKey, newDeps);\n }\n\n // 更新被依赖关系的键\n const dependentEntriesToUpdate: [string, Set<string>][] = [];\n for (const entry of Array.from(this.dependents.entries())) {\n const [cellKey, dependents] = entry;\n let newCellKey = cellKey;\n const newDependents = new Set<string>();\n\n if (cellKey.startsWith(`${oldKey}!`)) {\n newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n }\n\n for (const dep of dependents) {\n if (dep.startsWith(`${oldKey}!`)) {\n newDependents.add(dep.replace(`${oldKey}!`, `${newKey}!`));\n } else {\n newDependents.add(dep);\n }\n }\n\n if (newCellKey !== cellKey || !this.areSetsEqual(newDependents, dependents)) {\n dependentEntriesToUpdate.push([newCellKey, newDependents]);\n this.dependents.delete(cellKey);\n }\n }\n\n for (const [newCellKey, newDependents] of dependentEntriesToUpdate) {\n this.dependents.set(newCellKey, newDependents);\n }\n }\n\n // 辅助方法:比较两个Set是否相等\n private areSetsEqual(set1: Set<string>, set2: Set<string>): boolean {\n if (set1.size !== set2.size) {\n return false;\n }\n for (const item of set1) {\n if (!set2.has(item)) {\n return false;\n }\n }\n return true;\n }\n\n // 依赖关系管理\n private updateDependencies(cellKey: string, formula: string): void {\n // 清除旧的依赖关系\n const oldDeps = this.dependencies.get(cellKey) || new Set();\n for (const dep of oldDeps) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.delete(cellKey);\n if (depDependents.size === 0) {\n this.dependents.delete(dep);\n } else {\n this.dependents.set(dep, depDependents);\n }\n }\n\n // 从cellKey中提取当前工作表上下文\n const currentSheet = this.parseCellKey(cellKey)?.sheet || 'Sheet1';\n\n // 提取新的依赖关系,传入当前工作表上下文\n const dependencies = this.extractCellReferences(formula, currentSheet);\n this.dependencies.set(cellKey, new Set(dependencies));\n\n // 建立新的依赖关系\n for (const dep of dependencies) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.add(cellKey);\n this.dependents.set(dep, depDependents);\n }\n }\n\n private extractCellReferences(formula: string, currentSheet: string = 'Sheet1'): string[] {\n if (!formula || typeof formula !== 'string' || !formula.startsWith('=')) {\n return [];\n }\n\n const expression = formula.substring(1).trim();\n const references: string[] = [];\n\n try {\n this.extractReferencesFromExpression(expression, references, currentSheet);\n } catch (error) {\n console.warn('Failed to extract cell references:', error);\n }\n\n return [...new Set(references)];\n }\n\n private extractReferencesFromExpression(expr: string, references: string[], currentSheet: string = 'Sheet1'): void {\n // 移除字符串字面量,避免误匹配\n let cleanExpr = expr.replace(/\"[^\"]*\"/g, '');\n cleanExpr = cleanExpr.replace(/'[^']*'/g, '');\n\n // 匹配单元格引用 (A1, B2, Sheet1!A1, 等)\n const cellRefPattern = /(?:([A-Za-z0-9_]+)!)?([A-Z]+[0-9]+)(?::([A-Z]+[0-9]+))?/g;\n let match;\n\n while ((match = cellRefPattern.exec(cleanExpr)) !== null) {\n const sheetName = match[1] || currentSheet; // 使用当前工作表上下文,而不是默认Sheet1\n const startCell = match[2];\n const endCell = match[3];\n\n if (endCell) {\n // 范围引用,如 A1:B2 - 需要展开为所有单个单元格\n const expandedRefs = this.expandRangeToCells(sheetName, startCell, endCell);\n references.push(...expandedRefs);\n } else {\n // 单个单元格引用,如 A1\n references.push(`${sheetName}!${startCell}`);\n }\n }\n\n // 也匹配单独的单元格引用\n const singleCellPattern = /[A-Z]+[0-9]+/g;\n const singleMatches = cleanExpr.match(singleCellPattern) || [];\n for (const match of singleMatches) {\n if (!references.some(ref => ref.endsWith(match))) {\n references.push(`${currentSheet}!${match}`); // 使用当前工作表上下文\n }\n }\n }\n\n private expandRangeToCells(sheetName: string, startCell: string, endCell: string): string[] {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\n\n const cells: string[] = [];\n\n // 确保start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n cells.push(`${sheetName}!${this.getA1Notation(row, col)}`);\n }\n }\n\n return cells;\n } catch {\n // 如果解析失败,返回原始范围\n return [`${sheetName}!${startCell}:${endCell}`];\n }\n }\n\n private recalculateDependents(changedCell: FormulaCell): void {\n this.recalculateDependentsWithTracking(changedCell, new Set<string>());\n }\n\n private recalculateDependentsWithTracking(changedCell: FormulaCell, visited: Set<string>): void {\n const cellKey = this.getCellKey(changedCell);\n\n // 防止循环依赖导致的无限递归\n if (visited.has(cellKey)) {\n return;\n }\n\n const dependents = this.dependents.get(cellKey);\n\n if (!dependents || dependents.size === 0) {\n return;\n }\n\n // 按依赖顺序重新计算\n const sortedDependents = this.sortCellsByDependency([...dependents]);\n\n for (const dependentKey of sortedDependents) {\n this.recalculateSingleCellWithTracking(dependentKey, visited);\n }\n }\n\n private recalculateSingleCellWithTracking(cellKey: string, visited: Set<string>): void {\n // 防止循环依赖导致的无限递归\n if (visited.has(cellKey)) {\n return;\n }\n\n const formula = this.formulaCells.get(cellKey);\n if (!formula) {\n return;\n }\n\n const cell = this.parseCellKey(cellKey);\n if (!cell) {\n return;\n }\n\n // 重新计算公式并更新值\n const result = this.calculateFormula(formula);\n if (result.error) {\n return;\n }\n\n const sheetId = this.sheets.get(cell.sheet);\n if (sheetId === undefined) {\n return;\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet || !sheet[cell.row] || sheet[cell.row][cell.col] === undefined) {\n return;\n }\n\n const oldValue = sheet[cell.row][cell.col];\n const newValue = result.value;\n sheet[cell.row][cell.col] = newValue;\n\n // 如果值发生了变化,递归重新计算其依赖\n if (oldValue !== newValue) {\n // 将当前单元格添加到访问集合中,防止循环\n visited.add(cellKey);\n this.recalculateDependentsWithTracking(cell, visited);\n // 从访问集合中移除,允许在其他路径中重新访问\n visited.delete(cellKey);\n }\n }\n\n private sortCellsByDependency(cells: string[]): string[] {\n const visited = new Set<string>();\n const tempVisited = new Set<string>();\n const result: string[] = [];\n\n const visit = (cell: string): void => {\n if (visited.has(cell)) {\n return;\n }\n if (tempVisited.has(cell)) {\n console.warn(`Circular dependency detected involving cell ${cell}`);\n return;\n }\n\n tempVisited.add(cell);\n\n const deps = this.dependencies.get(cell) || new Set();\n for (const dep of deps) {\n if (cells.includes(dep)) {\n visit(dep);\n }\n }\n\n tempVisited.delete(cell);\n visited.add(cell);\n result.push(cell);\n };\n\n for (const cell of cells) {\n if (!visited.has(cell)) {\n visit(cell);\n }\n }\n\n return result;\n }\n\n /**\n * 调整公式引用 - 当插入或删除行/列时 (MIT兼容)\n * @param sheetKey 工作表键\n * @param type 调整类型 ('insert' | 'delete')\n * @param dimension 维度 ('row' | 'column')\n * @param index 插入/删除的位置索引\n * @param count 插入/删除的数量\n */\n adjustFormulaReferences(\n sheetKey: string,\n type: 'insert' | 'delete',\n dimension: 'row' | 'column',\n index: number,\n count: number,\n totalColCount: number,\n totalRowCount: number\n ): { adjustedCells: FormulaCell[]; movedCells: FormulaCell[] } {\n try {\n const adjustedFormulas: Array<{ cell: FormulaCell; oldFormula: string; newFormula: string }> = [];\n const movedFormulas: Array<{ oldCellKey: string; newCell: FormulaCell; formula: string }> = [];\n const deletedCells: Set<string> = new Set();\n\n // 第一步:收集被删除的单元格\n if (type === 'delete') {\n for (let i = 0; i < count; i++) {\n if (dimension === 'row') {\n // 收集被删除行的所有单元格\n for (let col = 0; col < totalColCount; col++) {\n // 假设最大1000列\n const deletedCell = { sheet: sheetKey, row: index + i, col };\n const deletedCellKey = this.getCellKey(deletedCell);\n deletedCells.add(deletedCellKey);\n }\n } else if (dimension === 'column') {\n // 收集被删除列的所有单元格\n for (let row = 0; row < totalRowCount; row++) {\n // 假设最大100万行\n const deletedCell = { sheet: sheetKey, row, col: index + i };\n const deletedCellKey = this.getCellKey(deletedCell);\n deletedCells.add(deletedCellKey);\n }\n }\n }\n }\n\n // 第二步:处理公式单元格\n const entries = Array.from(this.formulaCells.entries());\n\n for (const [cellKey, formula] of entries) {\n const cell = this.parseCellKey(cellKey);\n if (!cell || cell.sheet !== sheetKey) {\n continue; // 跳过其他工作表的公式\n }\n\n // 检查公式单元格本身是否需要移动\n const newCell = { ...cell };\n let cellNeedsMove = false;\n\n if (dimension === 'row') {\n if (type === 'insert' && cell.row >= index) {\n // 插入行:在插入点之后的单元格需要向后移动\n newCell.row = cell.row + count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.row > index) {\n // 删除行:在删除点之后的单元格需要向前移动\n newCell.row = cell.row - count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.row >= index && cell.row < index + count) {\n // 删除的行:这些公式单元格将被删除\n this.formulaCells.delete(cellKey);\n continue;\n }\n } else if (dimension === 'column') {\n if (type === 'insert' && cell.col >= index) {\n // 插入列:在插入点之后的单元格需要向后移动\n newCell.col = cell.col + count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.col > index) {\n // 删除列:在删除点之后的单元格需要向前移动\n newCell.col = cell.col - count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.col >= index && cell.col < index + count) {\n // 删除的列:这些公式单元格将被删除\n this.formulaCells.delete(cellKey);\n continue;\n }\n }\n\n // 调整公式引用,传入被删除的单元格信息\n const newFormula = this.adjustFormulaReference(formula, type, dimension, index, count);\n\n if (cellNeedsMove) {\n // 如果单元格位置发生变化,需要移动公式\n // 注意:公式中的引用已经根据操作类型调整了,这是正确的\n movedFormulas.push({ oldCellKey: cellKey, newCell, formula: newFormula });\n // 删除旧的公式条目和依赖关系\n this.formulaCells.delete(cellKey);\n this.clearDependencies(cellKey);\n } else if (newFormula !== formula) {\n // 如果只有公式引用发生变化,更新原单元格\n adjustedFormulas.push({ cell, oldFormula: formula, newFormula });\n // 清除旧的依赖关系,将在批量更新时重新建立\n this.clearDependencies(cellKey);\n }\n }\n\n // 处理移动的公式\n for (const { newCell, formula } of movedFormulas) {\n const newCellKey = this.getCellKey(newCell);\n\n // Debug: Check if this is the D6 formula\n // if (newCellKey === 'Sheet1!D6') {\n // const fs = require('fs');\n // fs.appendFileSync('/Users/bytedance/VisActor/VTable3/debug_formula.log', `DEBUG: Moving D6 formula to ${newCellKey}: ${formula}\\n`);\n // }\n\n this.formulaCells.set(newCellKey, formula);\n // 重新建立依赖关系\n this.updateDependencies(newCellKey, formula);\n // 更新单元格内容但不重新计算依赖(因为已经更新了)\n this.setCellContentWithoutDependencyUpdate(newCell, formula);\n }\n\n // 批量更新调整后的公式\n for (const { cell, newFormula } of adjustedFormulas) {\n const cellKey = this.getCellKey(cell);\n // 更新公式存储\n this.formulaCells.set(cellKey, newFormula);\n // 更新依赖关系\n this.updateDependencies(cellKey, newFormula);\n // 更新单元格内容但不重新计算依赖(因为已经更新了)\n this.setCellContentWithoutDependencyUpdate(cell, newFormula);\n }\n\n const totalChanges = adjustedFormulas.length + movedFormulas.length;\n if (totalChanges > 0) {\n // console.log(\n // `Adjusted ${adjustedFormulas.length} formulas and moved ${movedFormulas.length} ` +\n // `formulas for ${type} ${dimension} at ${index}`\n // );\n }\n\n // 返回所有受影响的单元格\n const adjustedCells = adjustedFormulas.map(item => item.cell);\n const movedCells = movedFormulas.map(item => item.newCell);\n\n return { adjustedCells, movedCells };\n } catch (error) {\n console.error(`Failed to adjust formula references for ${type} ${dimension} at ${index}:`, error);\n return { adjustedCells: [], movedCells: [] };\n }\n }\n\n /**\n * 调整单个公式引用 (MIT兼容)\n * @param formula 原公式\n * @param type 调整类型 ('insert' | 'delete')\n * @param dimension 维度 ('row' | 'column')\n * @param index 插入/删除的位置索引\n * @param count 插入/删除的数量\n * @returns 调整后的公式\n */\n private adjustFormulaReference(\n formula: string,\n type: 'insert' | 'delete',\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): string {\n if (!formula || !formula.startsWith('=')) {\n return formula;\n }\n\n const expression = formula.substring(1);\n\n // 使用正则表达式匹配单元格引用 (A1, B2, 等) 和范围引用 (A1:B2)\n const cellRefRegex = /([A-Z]+)([0-9]+)/g;\n const rangeRefRegex = /([A-Z]+[0-9]+):([A-Z]+[0-9]+)/g;\n\n let newExpression = expression;\n let match: RegExpExecArray | null;\n const replacements: Array<{ start: number; end: number; replacement: string }> = [];\n\n // 首先处理范围引用\n while ((match = rangeRefRegex.exec(expression)) !== null) {\n const fullRangeMatch = match[0];\n const startCell = match[1];\n const endCell = match[2];\n\n // Debug: Check B2:B5 case\n\n if (type === 'delete') {\n // 检查范围是否包含被删除的单元格\n const rangeContainsDeletedCells = this.rangeContainsDeletedCells(startCell, endCell, dimension, index, count);\n\n if (rangeContainsDeletedCells) {\n // 范围包含被删除的单元格,需要调整范围\n const newRange = this.adjustRangeForDeletion(startCell, endCell, dimension, index, count);\n if (newRange !== fullRangeMatch) {\n replacements.push({\n start: match.index,\n end: match.index + fullRangeMatch.length,\n replacement: newRange\n });\n }\n }\n }\n }\n\n // 重置正则表达式,避免与范围引用冲突\n cellRefRegex.lastIndex = 0;\n\n while ((match = cellRefRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const colLetters = match[1];\n const rowNumber = parseInt(match[2], 10);\n\n // 检查这个单元格引用是否已经被范围引用处理过\n const currentMatchIndex = match.index;\n const isPartOfRange = replacements.some(\n replacement => currentMatchIndex >= replacement.start && currentMatchIndex < replacement.end\n );\n\n if (isPartOfRange) {\n continue;\n }\n\n let needsAdjustment = false;\n let newRowNumber = rowNumber;\n let newColLetters = colLetters;\n\n if (dimension === 'row') {\n // Convert 1-based row number to 0-based for comparison\n const zeroBasedRowNumber = rowNumber - 1;\n\n if (type === 'insert' && zeroBasedRowNumber >= index) {\n // 插入行:在插入点之后的行需要向后移动\n newRowNumber = rowNumber + count;\n needsAdjustment = true;\n } else if (type === 'delete' && zeroBasedRowNumber >= index) {\n // 删除行:在删除点及之后的行需要向前移动\n if (zeroBasedRowNumber >= index + count) {\n // 完全在删除范围之后的行\n newRowNumber = rowNumber - count;\n needsAdjustment = true;\n } else if (zeroBasedRowNumber >= index && zeroBasedRowNumber < index + count) {\n // 在删除范围内的行:需要调整到删除前的位置\n newRowNumber = index; // 调整到删除位置(即原来的位置-1)\n needsAdjustment = true;\n }\n }\n } else if (dimension === 'column') {\n const colIndex = this.columnLettersToIndex(colLetters);\n\n if (type === 'insert' && colIndex >= index) {\n // 插入列:在插入点之后的列需要向后移动\n newColLetters = this.indexToColumnLetters(colIndex + count);\n needsAdjustment = true;\n } else if (type === 'delete' && colIndex >= index) {\n // 删除列:在删除点及之后的列需要向前移动\n if (colIndex >= index + count) {\n // 完全在删除范围之后的列\n newColLetters = this.indexToColumnLetters(colIndex - count);\n needsAdjustment = true;\n } else if (colIndex >= index && colIndex < index + count) {\n // 在删除范围内的列:需要调整到删除前的位置\n newColLetters = this.indexToColumnLetters(index); // 调整到删除位置\n needsAdjustment = true;\n }\n }\n }\n if (needsAdjustment) {\n let replacement: string;\n if (dimension === 'row' && newRowNumber === index) {\n // 行被调整到删除位置,表示该行被删除\n replacement = '#REF!';\n } else if (\n dimension === 'column' &&\n this.indexToColumnLetters(this.columnLettersToIndex(newColLetters)) === this.indexToColumnLetters(index)\n ) {\n // 列被调整到删除位置,表示该列被删除\n replacement = '#REF!';\n } else {\n replacement = newColLetters + newRowNumber;\n }\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement: replacement\n });\n }\n }\n\n // 按位置倒序排序,以便从后向前替换\n replacements.sort((a, b) => b.start - a.start);\n\n // 执行替换\n for (const { start, end, replacement } of replacements) {\n newExpression = newExpression.substring(0, start) + replacement + newExpression.substring(end);\n }\n\n return '=' + newExpression;\n }\n\n /**\n * 将列字母转换为索引 (A=0, B=1, ..., Z=25, AA=26, 等) (MIT兼容)\n * @param letters 列字母\n * @returns 列索引\n */\n private columnLettersToIndex(letters: string): number {\n let index = 0;\n for (let i = 0; i < letters.length; i++) {\n index = index * 26 + (letters.charCodeAt(i) - 64); // A=1, B=2, etc.\n }\n return index - 1; // Convert to 0-based index\n }\n\n /**\n * 将列索引转换为字母 (0=A, 1=B, ..., 25=Z, 26=AA, 等) (MIT兼容)\n * @param index 列索引\n * @returns 列字母\n */\n private indexToColumnLetters(index: number): string {\n let letters = '';\n do {\n letters = String.fromCharCode(65 + (index % 26)) + letters;\n index = Math.floor(index / 26) - 1;\n } while (index >= 0);\n return letters;\n }\n\n /**\n * 检查范围是否包含被删除的单元格\n * @param startCell 范围起始单元格 (如 \"A1\")\n * @param endCell 范围结束单元格 (如 \"B2\")\n * @param dimension 删除维度 ('row' | 'column')\n * @param index 删除起始索引\n * @param count 删除数量\n * @param deletedCells 被删除的单元格集合\n * @param currentSheet 当前工作表\n * @returns 是否包含被删除的单元格\n */\n private rangeContainsDeletedCells(\n startCell: string,\n endCell: string,\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): boolean {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\n\n // 确保start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n if (dimension === 'row') {\n // 检查删除的行是否在范围内\n const deleteStartRow = index;\n const deleteEndRow = index + count - 1;\n\n // 检查是否有重叠\n if (deleteEndRow >= minRow && deleteStartRow <= maxRow) {\n return true;\n }\n } else if (dimension === 'column') {\n // 检查删除的列是否在范围内\n const deleteStartCol = index;\n const deleteEndCol = index + count - 1;\n\n // 检查是否有重叠\n if (deleteEndCol >= minCol && deleteStartCol <= maxCol) {\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * 调整范围引用以处理删除操作\n * @param startCell 范围起始单元格 (如 \"A1\")\n * @param endCell 范围结束单元格 (如 \"B2\")\n * @param dimension 删除维度 ('row' | 'column')\n * @param index 删除起始索引\n * @param count 删除数量\n * @param deletedCells 被删除的单元格集合\n * @param currentSheet 当前工作表\n * @returns 调整后的范围引用\n */\n private adjustRangeForDeletion(\n startCell: string,\n endCell: string,\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): string {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\n\n // 确保start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n let newMinRow = minRow;\n let newMaxRow = maxRow;\n let newMinCol = minCol;\n let newMaxCol = maxCol;\n\n if (dimension === 'row') {\n const deleteStartRow = index;\n const deleteEndRow = index + count - 1;\n\n // 检查整个范围是否被删除\n const entireRangeDeleted = minRow >= deleteStartRow && maxRow <= deleteEndRow;\n if (entireRangeDeleted) {\n return '#REF!';\n }\n\n // 调整起始行\n if (minRow >= deleteStartRow && minRow <= deleteEndRow) {\n // 起始行被删除 - 调整到删除边界位置(保持相同位置)\n newMinRow = deleteStartRow;\n } else if (minRow > deleteEndRow) {\n // 起始行在删除范围之后,需要向前移动\n newMinRow = minRow - count;\n if (newMinRow < 0) {\n newMinRow = 0; // 确保不为负数\n }\n }\n\n // 调整结束行\n if (maxRow >= deleteStartRow && maxRow <= deleteEndRow) {\n // 结束行被删除 - 调整到删除前的位置\n newMaxRow = deleteStartRow > 0 ? deleteStartRow - 1 : 0;\n } else if (maxRow > deleteEndRow) {\n // 结束行在删除范围之后,需要向前移动\n newMaxRow = maxRow - count;\n if (newMaxRow < 0) {\n newMaxRow = 0; // 确保不为负数\n }\n }\n\n // 检查调整后的范围是否有效\n if (newMinRow > newMaxRow) {\n return '#REF!';\n }\n } else if (dimension === 'column') {\n const deleteStartCol = index;\n const deleteEndCol = index + count - 1;\n\n // 检查整个范围是否被删除\n const entireRangeDeleted = minCol >= deleteStartCol && maxCol <= deleteEndCol;\n if (entireRangeDeleted) {\n return '#REF!';\n }\n\n // 调整起始列\n if (minCol >= deleteStartCol && minCol <= deleteEndCol) {\n // 起始列被删除 - 调整到删除前的位置\n newMinCol = deleteStartCol > 0 ? deleteStartCol - 1 : 0;\n } else if (minCol > deleteEndCol) {\n // 起始列在删除范围之后,需要向前移动\n newMinCol = minCol - count;\n if (newMinCol < 0) {\n newMinCol = 0; // 确保不为负数\n }\n }\n\n // 调整结束列\n if (maxCol >= deleteStartCol && maxCol <= deleteEndCol) {\n // 结束列被删除 - 调整到删除前的位置\n newMaxCol = deleteStartCol > 0 ? deleteStartCol - 1 : 0;\n } else if (maxCol > deleteEndCol) {\n // 结束列在删除范围之后,需要向前移动\n newMaxCol = maxCol - count;\n if (newMaxCol < 0) {\n newMaxCol = 0; // 确保不为负数\n }\n }\n\n // 检查调整后的范围是否有效\n if (newMinCol > newMaxCol) {\n return '#REF!';\n }\n\n // 如果起始列或结束列是#REF!,或者整个范围无效,返回#REF!\n if (newMinCol === -1 || newMaxCol === -1) {\n return '#REF!';\n }\n }\n\n // 如果起始和结束都是#REF!,返回#REF!\n if (\n (dimension === 'row' && newMinRow === -1 && newMaxRow === -1) ||\n (dimension === 'column' && newMinCol === -1 && newMaxCol === -1)\n ) {\n return '#REF!';\n }\n\n // 构建新的范围引用\n let newStartCell: string;\n let newEndCell: string;\n\n if (dimension === 'row') {\n if (newMinRow === -1) {\n newStartCell = '#REF!';\n } else {\n newStartCell = this.getA1Notation(newMinRow, newMinCol);\n }\n\n if (newMaxRow === -1) {\n newEndCell = '#REF!';\n } else {\n newEndCell = this.getA1Notation(newMaxRow, newMaxCol);\n }\n } else {\n if (newMinCol === -1) {\n newStartCell = '#REF!';\n } else {\n newStartCell = this.getA1Notation(newMinRow, newMinCol);\n }\n\n if (newMaxCol === -1) {\n newEndCell = '#REF!';\n } else {\n newEndCell = this.getA1Notation(newMaxRow, newMaxCol);\n }\n }\n\n // 如果起始和结束相同,返回单个单元格引用\n if (newStartCell === newEndCell) {\n return newStartCell;\n }\n\n return `${newStartCell}:${newEndCell}`;\n } catch {\n return '#REF!';\n }\n }\n\n /**\n * 专门处理列位置移动的公式引用调整\n * 避免在移动过程中产生#REF!错误\n * @param sheetKey 工作表键\n * @param sourceCol 源列索引\n * @param targetCol 目标列索引\n * @param totalColCount 总列数\n * @param totalRowCount 总行数\n * @returns 受影响的单元格列表\n */\n adjustFormulaReferencesForColumnMove(\n sheetKey: string,\n sourceCol: number,\n targetCol: number,\n totalColCount: number,\n totalRowCount: number\n ): { adjustedCells: FormulaCell[]; movedCells: FormulaCell[] } {\n try {\n const adjustedFormulas: Array<{ cell: FormulaCell; oldFormula: string; newFormula: string }> = [];\n const movedFormulas: Array<{ oldCellKey: string; newCell: FormulaCell; formula: string }> = [];\n\n // 确定移动方向\n const isMovingForward = targetCol > sourceCol;\n\n // 第二步:创建列映射 - 先处理引用调整映射\n const columnMapping = new Map<number, number>();\n\n if (isMovingForward) {\n // 向前移动:sourceCol -> targetCol\n // 1. 在 (sourceCol, targetCol] 范围内的列需要向左移动一位\n for (let col = sourceCol + 1; col <= targetCol; col++) {\n columnMapping.set(col, col - 1);\n }\n // 2. 源列移动到目标位置\n columnMapping.set(sourceCol, targetCol);\n } else {\n // 向后移动:sourceCol -> targetCol\n // 1. 在 [targetCol, sourceCol) 范围内的列需要向右移动一位\n for (let col = targetCol; col < sourceCol; col++) {\n columnMapping.set(col, col + 1);\n }\n // 2. 源列移动到目标位置\n columnMapping.set(sourceCol, targetCol);\n }\n\n // 第一步:处理所有公式中的引用调整(包括公式单元格本身可能需要移动的情况)\n for (const [cellKey, formula] of Array.from(this.formulaCells.entries())) {\n const cell = this.parseCellKey(cellKey);\n if (!cell || cell.sheet !== sheetKey) {\n continue;\n }\n\n // 检查这个公式单元格是否受到列移动的影响\n let needsCellMove = false;\n const newCellLocation = { ...cell };\n\n // 如果公式单元格本身在受影响的列中,需要更新其位置\n if (columnMapping.has(cell.col)) {\n const mappedCol = columnMapping.get(cell.col);\n if (mappedCol !== undefined) {\n newCellLocation.col = mappedCol;\n needsCellMove = true;\n }\n }\n\n // 应用列映射到公式引用\n const newFormula = this.adjustFormulaWithColumnMapping(formula, columnMapping);\n\n if (needsCellMove || newFormula !== formula) {\n if (needsCellMove) {\n // 公式单元格需要移动位置\n movedFormulas.push({\n oldCellKey: cellKey,\n newCell: newCellLocation,\n formula: newFormula\n });\n this.formulaCells.delete(cellKey);\n this.clearDependencies(cellKey);\n } else {\n // 只需要调整公式引用,不需要移动单元格\n adjustedFormulas.push({ cell, oldFormula: formula, newFormula });\n this.clearDependencies(cellKey);\n }\n }\n }\n\n // 第三步:应用所有更改\n // 先处理移动的公式\n for (const { newCell, formula } of movedFormulas) {\n const newCellKey = this.getCellKey(newCell);\n this.formulaCells.set(newCellKey, formula);\n this.updateDependencies(newCellKey, formula);\n this.setCellContentWithoutDependencyUpdate(newCell, formula);\n }\n\n // 再处理调整的公式\n for (const { cell, newFormula } of adjustedFormulas) {\n const cellKey = this.getCellKey(cell);\n this.formulaCells.set(cellKey, newFormula);\n this.updateDependencies(cellKey, newFormula);\n this.setCellContentWithoutDependencyUpdate(cell, newFormula);\n }\n\n const adjustedCells = adjustedFormulas.map(item => item.cell);\n const movedCells = movedFormulas.map(item => item.newCell);\n\n return { adjustedCells, movedCells };\n } catch (error) {\n console.error('Error in adjustFormulaReferencesForColumnMove:', error);\n return { adjustedCells: [], movedCells: [] };\n }\n }\n\n /**\n * 使用列映射调整公式中的所有引用\n */\n private adjustFormulaWithColumnMapping(formula: string, columnMapping: Map<number, number>): string {\n if (!formula || !formula.startsWith('=')) {\n return formula;\n }\n\n let expression = formula.substring(1);\n\n // 处理范围引用 (如 D4:D6)\n const rangeRegex = /([A-Z]+)([0-9]+):([A-Z]+)([0-9]+)/g;\n let match: RegExpExecArray | null;\n const rangeReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n const processedRanges: Array<{ start: number; end: number }> = [];\n\n while ((match = rangeRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const startCol = match[1];\n const startRow = match[2];\n const endCol = match[3];\n const endRow = match[4];\n\n const startColIndex = this.columnLettersToIndex(startCol);\n const endColIndex = this.columnLettersToIndex(endCol);\n\n let newStartCol = startColIndex;\n let newEndCol = endColIndex;\n\n // 检查起始列是否需要调整\n if (columnMapping.has(startColIndex)) {\n const mappedStartCol = columnMapping.get(startColIndex);\n if (mappedStartCol !== undefined) {\n newStartCol = mappedStartCol;\n }\n }\n\n // 检查结束列是否需要调整\n if (columnMapping.has(endColIndex)) {\n const mappedEndCol = columnMapping.get(endColIndex);\n if (mappedEndCol !== undefined) {\n newEndCol = mappedEndCol;\n }\n }\n\n // 确保范围有效(起始不大于结束)\n if (newStartCol > newEndCol) {\n [newStartCol, newEndCol] = [newEndCol, newStartCol];\n }\n\n const newStartColLetters = this.indexToColumnLetters(newStartCol);\n const newEndColLetters = this.indexToColumnLetters(newEndCol);\n const replacement = `${newStartColLetters}${startRow}:${newEndColLetters}${endRow}`;\n\n rangeReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n\n processedRanges.push({ start: match.index, end: match.index + fullMatch.length });\n }\n\n // 应用范围替换(从后往前,避免位置偏移)\n for (let i = rangeReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = rangeReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n // 处理单个单元格引用 (如 D4),但跳过已经在范围中处理过的\n const cellRegex = /([A-Z]+)([0-9]+)/g;\n const cellReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n\n while ((match = cellRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const colLetters = match[1];\n const row = match[2];\n const colIndex = this.columnLettersToIndex(colLetters);\n\n const matchIndex = match.index; // 保存到局部变量\n\n // 检查这个位置是否已经在范围中被处理过\n const isInProcessedRange = processedRanges.some(range => {\n return matchIndex >= range.start && matchIndex < range.end;\n });\n\n if (isInProcessedRange) {\n continue; // 跳过已经在范围中处理过的单元格\n }\n\n // 检查该列是否需要调整\n if (columnMapping.has(colIndex)) {\n const newColIndex = columnMapping.get(colIndex);\n if (newColIndex !== undefined) {\n const newColLetters = this.indexToColumnLetters(newColIndex);\n const replacement = `${newColLetters}${row}`;\n\n cellReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n }\n }\n }\n\n // 应用单元格替换(从后往前,避免位置偏移)\n for (let i = cellReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = cellReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n return '=' + expression;\n }\n\n /**\n * 移动行表头位置.将sourceRow位置开始往后moveCount个行,移动调整到targetRow位置处\n * @param sheetKey 工作表键\n * @param sourceRow 源行索引\n * @param targetRow 目标行索引\n * @param totalColCount 总列数\n * @param totalRowCount 总行数\n * @returns 受影响的单元格列表\n */\n adjustFormulaReferencesForRowMove(\n sheetKey: string,\n sourceRow: number,\n targetRow: number\n ): { adjustedCells: FormulaCell[]; movedCells: FormulaCell[] } {\n try {\n // 验证输入参数\n if (sourceRow < 0 || targetRow < 0) {\n return { adjustedCells: [], movedCells: [] };\n }\n\n const adjustedFormulas: Array<{ cell: FormulaCell; oldFormula: string; newFormula: string }> = [];\n const movedFormulas: Array<{ oldCellKey: string; newCell: FormulaCell; formula: string }> = [];\n\n // 确定移动方向\n const isMovingForward = targetRow > sourceRow;\n\n // 创建行映射 - 处理引用调整映射\n const rowMapping = new Map<number, number>();\n\n if (isMovingForward) {\n // 向前移动:sourceRow -> targetRow\n // 1. 在 (sourceRow, targetRow] 范围内的行需要向上移动一位\n for (let row = sourceRow + 1; row <= targetRow; row++) {\n rowMapping.set(row, row - 1);\n }\n // 2. 源行移动到目标位置\n rowMapping.set(sourceRow, targetRow);\n } else {\n // 向后移动:sourceRow -> targetRow\n // 1. 在 [targetRow, sourceRow) 范围内的行需要向下移动一位\n for (let row = targetRow; row < sourceRow; row++) {\n rowMapping.set(row, row + 1);\n }\n // 2. 源行移动到目标位置\n rowMapping.set(sourceRow, targetRow);\n }\n // 处理所有公式中的引用调整\n for (const [cellKey, formula] of Array.from(this.formulaCells.entries())) {\n const cell = this.parseCellKey(cellKey);\n if (!cell || cell.sheet !== sheetKey) {\n continue;\n }\n\n let needsCellMove = false;\n const newCellLocation = { ...cell };\n\n // 检查公式单元格本身是否在移动范围内\n if (rowMapping.has(cell.row)) {\n const mappedRow = rowMapping.get(cell.row);\n if (mappedRow !== undefined && mappedRow !== cell.row) {\n newCellLocation.row = mappedRow;\n needsCellMove = true;\n }\n }\n\n // 应用行映射到公式引用\n const newFormula = this.adjustFormulaWithRowMapping(formula, rowMapping);\n\n if (needsCellMove || newFormula !== formula) {\n if (needsCellMove) {\n // 公式单元格需要移动位置\n movedFormulas.push({\n oldCellKey: cellKey,\n newCell: newCellLocation,\n formula: newFormula\n });\n this.formulaCells.delete(cellKey);\n this.clearDependencies(cellKey);\n } else {\n // 只需要调整公式引用,不需要移动单元格\n adjustedFormulas.push({ cell, oldFormula: formula, newFormula });\n this.clearDependencies(cellKey);\n }\n }\n }\n\n // 应用所有更改\n // 先处理移动的公式\n for (const { newCell, formula } of movedFormulas) {\n const newCellKey = this.getCellKey(newCell);\n this.formulaCells.set(newCellKey, formula);\n this.updateDependencies(newCellKey, formula);\n this.setCellContentWithoutDependencyUpdate(newCell, formula);\n }\n\n // 再处理调整的公式\n for (const { cell, newFormula } of adjustedFormulas) {\n const cellKey = this.getCellKey(cell);\n this.formulaCells.set(cellKey, newFormula);\n this.updateDependencies(cellKey, newFormula);\n this.setCellContentWithoutDependencyUpdate(cell, newFormula);\n }\n\n const adjustedCells = adjustedFormulas.map(item => item.cell);\n const movedCells = movedFormulas.map(item => item.newCell);\n\n return { adjustedCells, movedCells };\n } catch (error) {\n console.error('Error in adjustFormulaReferencesForRowMove:', error);\n return { adjustedCells: [], movedCells: [] };\n }\n }\n\n /**\n * 使用行映射调整公式中的所有引用\n */\n private adjustFormulaWithRowMapping(formula: string, rowMapping: Map<number, number>): string {\n if (!formula || !formula.startsWith('=')) {\n return formula;\n }\n\n let expression = formula.substring(1);\n\n // 处理范围引用 (如 D4:D6)\n const rangeRegex = /([A-Z]+)([0-9]+):([A-Z]+)([0-9]+)/g;\n let match: RegExpExecArray | null;\n const rangeReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n const processedRanges: Array<{ start: number; end: number }> = [];\n\n while ((match = rangeRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const startCol = match[1];\n const startRow = match[2];\n const endCol = match[3];\n const endRow = match[4];\n\n const startRowIndex = parseInt(startRow, 10) - 1; // Excel行号从1开始,转换为从0开始\n const endRowIndex = parseInt(endRow, 10) - 1;\n\n let newStartRow = startRowIndex;\n let newEndRow = endRowIndex;\n\n // 检查起始行是否需要调整\n if (rowMapping.has(startRowIndex)) {\n const mappedStartRow = rowMapping.get(startRowIndex);\n if (mappedStartRow !== undefined) {\n newStartRow = mappedStartRow;\n }\n }\n\n // 检查结束行是否需要调整\n if (rowMapping.has(endRowIndex)) {\n const mappedEndRow = rowMapping.get(endRowIndex);\n if (mappedEndRow !== undefined) {\n newEndRow = mappedEndRow;\n }\n }\n\n // 只有当至少有一个行需要调整时才进行替换\n if (newStartRow !== startRowIndex || newEndRow !== endRowIndex) {\n const newStartRowNumber = newStartRow + 1; // 转换回Excel行号(从1开始)\n const newEndRowNumber = newEndRow + 1;\n const replacement = `${startCol}${newStartRowNumber}:${endCol}${newEndRowNumber}`;\n\n rangeReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n\n processedRanges.push({ start: match.index, end: match.index + fullMatch.length });\n }\n }\n\n // 应用范围替换(从后往前,避免位置偏移)\n for (let i = rangeReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = rangeReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n // 处理单个单元格引用 (如 D4),但跳过已经在范围中处理过的\n const cellRegex = /([A-Z]+)([0-9]+)/g;\n const cellReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n\n while ((match = cellRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const colLetters = match[1];\n const row = match[2];\n const rowIndex = parseInt(row, 10) - 1; // Excel行号从1开始,转换为从0开始\n\n const matchIndex = match.index; // 保存到局部变量\n\n // 检查这个位置是否已经在范围中被处理过\n const isInProcessedRange = processedRanges.some(range => {\n return matchIndex >= range.start && matchIndex < range.end;\n });\n\n if (isInProcessedRange) {\n continue; // 跳过已经在范围中处理过的单元格\n }\n\n // 检查该行是否需要调整\n if (rowMapping.has(rowIndex)) {\n const newRowIndex = rowMapping.get(rowIndex);\n if (newRowIndex !== undefined) {\n const newRowNumber = newRowIndex + 1; // 转换回Excel行号(从1开始)\n const replacement = `${colLetters}${newRowNumber}`;\n\n cellReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n }\n }\n }\n\n // 应用单元格替换(从后往前,避免位置偏移)\n for (let i = cellReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = cellReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n return '=' + expression;\n }\n}\n\nclass FormulaError {\n constructor(public message: string, public type: 'REF' | 'VALUE' | 'DIV0' | 'NAME' | 'NA' = 'VALUE') {}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/formula/formula-engine.ts"],"names":[],"mappings":";;;AAMA,qDAAsD;AAWtD,MAAa,aAAa;IAUxB,YAAY,UAA+B,EAAE;QATrC,WAAM,GAAwB,IAAI,GAAG,EAAE,CAAC;QACxC,kBAAa,GAAwB,IAAI,GAAG,EAAE,CAAC;QAC/C,cAAS,GAA6B,IAAI,GAAG,EAAE,CAAC;QAChD,iBAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;QAC9C,iBAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;QACnD,eAAU,GAA6B,IAAI,GAAG,EAAE,CAAC;QACjD,gBAAW,GAAG,CAAC,CAAC;QAChB,mBAAc,GAAkB,IAAI,CAAC;IAI7C,CAAC;IAMD,cAAc,CAAC,QAAgB;QAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC7B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;SAChC;IACH,CAAC;IAMD,cAAc;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,QAAQ,CAAC,QAAgB,EAAE,IAAkB;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAW,CAAC;SAC5C;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAG1C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEvC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,eAAe,CAAC,QAAgB,EAAE,IAAiB;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE;YAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACnC;IACH,CAAC;IAEO,aAAa,CAAC,IAAiB;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACf;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACvB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAChC;YAED,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;oBAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;wBACxB,OAAO,IAAI,CAAC;qBACb;oBACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;oBACzB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;iBACvD;gBACD,OAAO,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,OAAO,aAAa,CAAC,MAAM,GAAG,OAAO,EAAE;gBACrC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACxB;YAED,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAChC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAKD,gBAAgB,CAAC,IAAiB;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IAChD,CAAC;IAKO,iBAAiB,CAAC,OAAe;QAEvC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAC5D,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;gBAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aAC7B;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;aACzC;SACF;QAGD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAKO,qCAAqC,CAAC,IAAiB,EAAE,KAAc;QAC7E,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE;YACzF,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;SAC3C;QAED,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;SACrF;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACrC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;SAC5D;QAGD,OAAO,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAChB;QAGD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YACzC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC1B;QAED,IAAI,cAAc,GAAG,KAAK,CAAC;QAG3B,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,SAAS,EAAE;YAC3D,cAAc,GAAG,EAAE,CAAC;SACrB;QAGD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACzE,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;YAE5C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACxD,cAAc,GAAG,YAAY,CAAC;aAC/B;SACF;QAGD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;IAC7C,CAAC;IAED,cAAc,CAAC,IAAiB,EAAE,KAAc;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE;YACzF,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;SAC3C;QAED,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;SACrF;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACrC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;SAC5D;QAGD,OAAO,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAChB;QAGD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YACzC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC1B;QAGD,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,EAAE;YAC3D,cAAc,GAAG,EAAE,CAAC;SACrB;QAGD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACzE,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;YAE5C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACxD,cAAc,GAAG,YAAY,CAAC;aAC/B;SACF;QAGD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;QAG3C,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;YACjE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YACjD,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YAEnD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;SAE9C;QAGD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,UAAU,CAAC,IAAiB;QAClC,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnE,CAAC;IAEO,aAAa,CAAC,GAAW,EAAE,GAAW;QAC5C,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,GAAG;YACD,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;YACjE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;SACxC,QAAQ,OAAO,IAAI,CAAC,EAAE;QAEvB,OAAO,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;SACvD;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAGzC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SAClD;QAED,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;IACrC,CAAC;IAEO,YAAY,CAAC,OAAe;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;QAClC,IAAI;YACF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACtD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;SAC5B;QAAC,WAAM;YACN,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,gBAAgB,CAAC,OAAe;QAC9B,IAAI;YACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBAC5B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAC7C;YAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAGxD,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAC7C;YAGD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC;SACf;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB;aACrE,CAAC;SACH;IACH,CAAC;IAOO,kBAAkB,CAAC,OAAe;QACxC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC5B,OAAO,OAAO,CAAC;SAChB;QAED,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAGxC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE;YAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAG3B,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;gBAC7E,IAAI,CAAC,QAAQ,EAAE;oBACb,QAAQ,GAAG,IAAI,CAAC;oBAChB,SAAS,GAAG,IAAI,CAAC;iBAClB;qBAAM,IAAI,IAAI,KAAK,SAAS,EAAE;oBAC7B,QAAQ,GAAG,KAAK,CAAC;oBACjB,SAAS,GAAG,EAAE,CAAC;iBAChB;gBACD,SAAS,IAAI,IAAI,CAAC;gBAClB,CAAC,EAAE,CAAC;gBACJ,SAAS;aACV;YAGD,IAAI,QAAQ,EAAE;gBACZ,SAAS,IAAI,IAAI,CAAC;gBAClB,CAAC,EAAE,CAAC;gBACJ,SAAS;aACV;YAGD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC9E,IAAI,SAAS,EAAE;gBACb,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACpD,SAAS,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;gBAC1C,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBAEzB,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;oBACrD,CAAC,EAAE,CAAC;iBACL;gBACD,SAAS;aACV;YAGD,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACvF,IAAI,cAAc,EAAE;gBAClB,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAGhD,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBAGhE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACjD,SAAS,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC;gBACtF,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;gBACpB,SAAS;aACV;YAGD,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACxG,IAAI,eAAe,EAAE;gBACnB,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvD,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAGlD,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBAGhE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrD,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC;gBAG/D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC;gBAEzD,SAAS,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC;gBACtF,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC;gBACzB,SAAS;aACV;YAGD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACpE,IAAI,SAAS,EAAE;gBACb,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACjD,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC;gBAC7C,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;gBACpB,SAAS;aACV;YAGD,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACrF,IAAI,UAAU,EAAE;gBACd,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAGjD,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrD,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC;gBAG/D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC;gBAEzD,SAAS,IAAI,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC;gBAC7C,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC;gBACrB,SAAS;aACV;YAGD,SAAS,IAAI,IAAI,CAAC;YAClB,CAAC,EAAE,CAAC;SACL;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAKO,qBAAqB,CAAC,SAAiB;QAE7C,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QAGD,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE;YACvD,IAAI,iBAAiB,CAAC,WAAW,EAAE,KAAK,cAAc,EAAE;gBACtD,OAAO,iBAAiB,CAAC;aAC1B;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe,CAAC,IAAY;QAClC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAGnB,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,cAAc,EAAE;YAClB,OAAO,cAAc,CAAC;SACvB;QAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,gBAAgB,EAAE;YACpB,OAAO,gBAAgB,CAAC;SACzB;QAGD,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAEO,kBAAkB,CAAC,IAAY;QACrC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEpD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAG3D,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE;oBAC3B,SAAS;iBACV;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAClD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAEpD,IAAI,UAAU,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE;oBACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;iBAC5D;gBAGD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAE3C,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBAEvC,QAAQ,EAAE,EAAE;wBACV,KAAK,IAAI,CAAC,CAAC;4BACT,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC;4BAC7B,MAAM;yBACP;wBACD,KAAK,IAAI,CAAC,CAAC;4BACT,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC;4BAC7B,MAAM;yBACP;wBACD,KAAK,IAAI,CAAC,CAAC;4BACT,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;4BAC9B,MAAM;yBACP;wBACD,KAAK,GAAG,CAAC,CAAC;4BACR,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;4BAC5B,MAAM;yBACP;wBACD,KAAK,GAAG,CAAC,CAAC;4BACR,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;4BAC5B,MAAM;yBACP;wBACD,KAAK,GAAG,CAAC,CAAC;4BACR,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;4BAC9B,MAAM;yBACP;qBACF;iBACF;qBAAM;oBAEL,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBAC3C,QAAQ,EAAE,EAAE;wBACV,KAAK,IAAI,CAAC,CAAC;4BACT,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC;4BAC7B,MAAM;yBACP;wBACD,KAAK,IAAI,CAAC,CAAC;4BACT,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC;4BAC7B,MAAM;yBACP;wBACD,KAAK,IAAI,CAAC,CAAC;4BACT,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;4BAC9B,MAAM;yBACP;wBACD,KAAK,GAAG,CAAC,CAAC;4BACR,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;4BAC5B,MAAM;yBACP;wBACD,KAAK,GAAG,CAAC,CAAC;4BACR,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;4BAC5B,MAAM;yBACP;wBACD,KAAK,GAAG,CAAC,CAAC;4BACR,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;4BAC9B,MAAM;yBACP;qBACF;iBACF;gBAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAC5C;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe,CAAC,IAAY;QAClC,IAAI;YAEF,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,cAAc,EAAE;gBAClB,OAAO,cAAc,CAAC;aACvB;YAGD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC9C,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aACvD;YAGD,IAAI,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAChD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aACjE;YAGD,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAChC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAClD;YAGD,IAAI,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACjD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAC5C;YAGD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACxF,OAAO,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAAC;aACnD;YAGD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAC1C;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC;SACrG;IACH,CAAC;IAEO,gBAAgB,CAAC,IAAY;QAGnC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrD,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAGjD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAE3C,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBACnB,KAAK,EAAE,CAAC;aACT;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBAC1B,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,EAAE;oBACf,OAAO,GAAG,CAAC,CAAC;oBACZ,MAAM;iBACP;aACF;SACF;QAED,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,IAAI,CAAC;SACb;QAGD,IAAI,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAGlE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAG1C,MAAM,SAAS,GAAc,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,KAAK,EAAE;gBAChB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aACjF;YACD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC9B;QAGD,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc,CAAC,OAAe;QACpC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAExB,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;gBACxD,QAAQ,GAAG,CAAC,QAAQ,CAAC;aACtB;YAED,IAAI,CAAC,QAAQ,EAAE;gBACb,IAAI,IAAI,KAAK,GAAG,EAAE;oBAChB,KAAK,EAAE,CAAC;iBACT;gBACD,IAAI,IAAI,KAAK,GAAG,EAAE;oBAChB,KAAK,EAAE,CAAC;iBACT;gBAED,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE;oBAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1B,OAAO,GAAG,EAAE,CAAC;oBACb,SAAS;iBACV;aACF;YAED,OAAO,IAAI,IAAI,CAAC;SACjB;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;SAC3B;QAGD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAEvE,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAG1B,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,UAAU,GAAG,KAAK,CAAC;YAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE1B,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;oBAC1D,UAAU,GAAG,CAAC,UAAU,CAAC;iBAC1B;gBAED,IAAI,CAAC,UAAU,EAAE;oBACf,IAAI,IAAI,KAAK,GAAG,EAAE;wBAChB,OAAO,EAAE,CAAC;qBACX;oBACD,IAAI,IAAI,KAAK,GAAG,EAAE;wBAChB,OAAO,EAAE,CAAC;qBACX;oBAED,IAAI,IAAI,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE;wBACjC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC9B,SAAS,GAAG,EAAE,CAAC;wBACf,SAAS;qBACV;iBACF;gBAED,SAAS,IAAI,IAAI,CAAC;aACnB;YAED,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE;gBACpB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;aAC/B;YAGD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,OAAO,MAAM,CAAC;aACf;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe,CAAC,QAAgB,EAAE,IAAe;QACvD,IAAI;YACF,QAAQ,QAAQ,EAAE;gBAEhB,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,SAAS;oBACZ,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACrC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,OAAO;oBACV,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACnC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,MAAM;oBACT,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAGlC,KAAK,OAAO;oBACV,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACnC,KAAK,QAAQ;oBACX,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACpC,KAAK,OAAO;oBACV,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACnC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,QAAQ;oBACX,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACpC,KAAK,SAAS;oBACZ,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAGrC,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAChC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,IAAI;oBACP,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAChC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAGjC,KAAK,OAAO;oBACV,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACnC,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAEjC;oBACE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,QAAQ,EAAE,EAAE,CAAC;aAClE;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC;SACrG;IACH,CAAC;IAGO,YAAY,CAAC,IAAe;QAClC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACf,KAAK,IAAI,GAAG,CAAC;aACd;SACF;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAEO,gBAAgB,CAAC,IAAe;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1E,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;aAC5C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;aAClC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1D,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;aAC5C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;aAClC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1D,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;SAClE;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;SAChE;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAEO,cAAc,CAAC,IAAe;QACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACtC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;SAClE;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;SAClE;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;YACjB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;SAChE;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACxE,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;SAClE;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;SAChE;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACtD,CAAC;IAEO,aAAa,CAAC,IAAe;QACnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;SAC7D;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAEO,cAAc,CAAC,IAAe;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAE1B,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;gBACzD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;oBACf,KAAK,EAAE,CAAC;iBACT;aACF;SACF;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAEO,eAAe,CAAC,IAAe;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;gBACzD,KAAK,EAAE,CAAC;aACT;SACF;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAEO,cAAc,CAAC,IAAe;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aAClC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC;aACrF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvC;QAGD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAGvE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAGrG,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1D,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aAClC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC;aACrF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvC;QAGD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAGvE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAErG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;IAEO,eAAe,CAAC,IAAe;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aAClC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC;aACrF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvC;QAGD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAElD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;YAEjC,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvD;QAED,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACxF,CAAC;IAEO,gBAAgB,CAAC,IAAe;QACtC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aAClC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC;aACrF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACvC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,OAAO,IAAI,KAAK,CAAC;SAClB;QAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9C,CAAC;IAEO,WAAW,CAAC,IAAe;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;SAClE;QAGD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAGzC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpE,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;SACnE;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAC3C;SACF;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC3C,CAAC;IAEO,WAAW,CAAC,IAAe;QACjC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;SAClE;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACtB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAC1C;SACF;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;SAClE;QACD,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9D,CAAC;IAEO,cAAc,CAAC,IAAe;QACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;SAC9D;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAEO,YAAY,CAAC,IAAe;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;SAC5D;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAEO,WAAW,CAAC,IAAe;QACjC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACtB,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;aACrB;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClB;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,qBAAqB,CAAC,IAAe;QAC3C,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACtB,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;aACrB;iBAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAEvD,IAAI;oBACF,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;iBAC7B;gBAAC,WAAM;oBAEN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClB;aACF;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClB;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,KAAc;QAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;YACzC,OAAO,KAAK,CAAC;SACd;QACD,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE;YAClD,OAAO,KAAK,CAAC;SACd;QACD,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,OAAO,IAAI,CAAC;SACb;QAGD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;gBACnC,OAAO,KAAK,CAAC;aACd;YACD,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;gBAClC,OAAO,IAAI,CAAC;aACb;SACF;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACf,OAAO,GAAG,KAAK,CAAC,CAAC;SAClB;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,+BAA+B,CAAC,IAAY;QAClD,IAAI;YAIF,MAAM,eAAe,GAAG,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAG,kBAAkB,CAAC;YACzC,IAAI,KAAK,CAAC;YAEV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;gBAClD,eAAe,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;oBACf,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;iBACnC,CAAC,CAAC;aACJ;YAGD,IAAI,aAAa,GAAG,IAAI,CAAC;YACzB,MAAM,cAAc,GAAG,EAAE,CAAC;YAE1B,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE;gBACvC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,UAAU,CAAC,KAAK,EAAE;oBACpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,SAAS,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;iBAC5F;gBACD,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAEtC,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;aACjG;YAGD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC5D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC7C,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aAC/D;YAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACnF;YAID,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,GAAG,aAAa,GAAG,GAAG,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAC5C;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;SACrE;IACH,CAAC;IAEO,gBAAgB,CAAC,UAAkB;QACzC,IAAI;YACF,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;YAC5E,IAAI,OAAO,GAAG,UAAU,CAAC;YAGzB,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtB,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACpB,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;iBACpB;aACF;YAED,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,GAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;SACtC;QAAC,WAAM;YACN,OAAO,CAAC,CAAC;SACV;IACH,CAAC;IAEO,sBAAsB,CAAC,IAAY;QACzC,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACvB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;aACtC;YAGD,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;YAC5E,IAAI,SAAS,GAAG,IAAI,CAAC;YAGrB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtB,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACpB,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;iBACtB;aACF;YAED,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAEjD,MAAM,MAAM,GAAc,EAAE,CAAC;YAE7B,KAAK,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACvD,KAAK,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBACvD,MAAM,IAAI,GAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;oBACxD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;iBAC5C;aACF;YAED,OAAO,MAAM,CAAC;SACf;QAAC,WAAM;YACN,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAGD,YAAY,CAAC,IAAiB;QAC5B,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,OAAO,KAAK,SAAS,EAAE;gBACzB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aACxC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC/G,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aACxC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAGxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACtD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC5C,OAAO,MAAM,CAAC;aACf;YAGD,IAAI,KAAK,YAAY,YAAY,EAAE;gBACjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;aAC9C;YAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACpC;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC;SACH;IACH,CAAC;IAED,cAAc,CAAC,IAAiB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,IAAiB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,iBAAiB,CAAC,IAAiB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,EAAE,CAAC;SACX;QAED,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACrB;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iBAAiB,CAAC,IAAiB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,EAAE,CAAC;SACX;QAED,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACrB;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB;QACnB,OAAO,CAAC,GAAG,mCAAkB,CAAC,CAAC;IACjC,CAAC;IAGD,eAAe,CAAC,OAAe;QAC7B,IAAI;YAEF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aAC1B;YAED,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;aACtD;YAGD,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;YAG7C,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAEvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SAC1B;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;aACzE,CAAC;SACH;IACH,CAAC;IAEO,qBAAqB,CAAC,IAAY;QAExC,MAAM,eAAe,GAAG,iBAAiB,CAAC;QAC1C,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;YACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,IAAI,CAAC,mCAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBAC1C,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;aAClD;SACF;IACH,CAAC;IAEO,2BAA2B,CAAC,IAAY;QAE9C,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACxD,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACzD,IAAI,cAAc,KAAK,eAAe,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;SAC1C;QAGD,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACzD,IAAI,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;SACrC;QAGD,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QAGD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACvC;QAGD,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YAChF,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC/C;QAGD,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;SACvD;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;IAGD,cAAc,CAAC,QAAgB;QAC7B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,MAAM,CAAC;SACf;QAGD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE;YAC3D,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;gBACnC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1D,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;aAC9B;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAGD,YAAY;QACV,MAAM,MAAM,GAAqD,EAAE,CAAC;QAEpE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE;YACrD,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,QAAQ;gBACb,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;SACJ;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAGD,wBAAwB,CAAC,QAAgB,EAAE,QAAgC;QACzE,IAAI;YAEF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;YACxD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;YAGtD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACzD,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;gBACzC,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAEnE,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;gBAGrD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE;oBAC9B,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;oBAC3D,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC3B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBACxC;aACF;YAGD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;YACtC,MAAM,MAAM,GAAuB,EAAE,CAAC;YAEtC,MAAM,KAAK,GAAG,CAAC,OAAe,EAAQ,EAAE;gBACtC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBACxB,OAAO;iBACR;gBACD,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBAC5B,OAAO,CAAC,IAAI,CAAC,+CAA+C,OAAO,EAAE,CAAC,CAAC;oBACvE,OAAO;iBACR;gBAED,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;gBACxD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;oBACtB,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAE7B,KAAK,CAAC,GAAG,CAAC,CAAC;qBACZ;iBACF;gBAED,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAGrB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,OAAO,EAAE;oBACX,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;iBACjC;YACH,CAAC,CAAC;YAGF,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE;gBAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBACzB,KAAK,CAAC,OAAO,CAAC,CAAC;iBAChB;aACF;YAED,OAAO,MAAM,CAAC;SACf;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,mDAAmD,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAEpF,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SACjC;IACH,CAAC;IAGD,WAAW,CAAC,QAAgB;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO;SACR;QAGD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SACjD;QAGD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAGnC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE;YAC3D,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;YACxB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE;gBACtC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC5B;SACF;QAED,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SACjC;QAGD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE;YAC3D,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE;oBACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAClB;aACF;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACnC;iBAAM;gBACL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aACzC;SACF;QAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE;YACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;YACxC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;gBAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE;oBACnC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBACxB;aACF;YACD,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;gBAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACjC;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;aAC7C;SACF;IACH,CAAC;IAGD,WAAW,CAAC,MAAc,EAAE,MAAc;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;SAC/C;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;SACpD;QAGD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAGxC,MAAM,sBAAsB,GAAuB,EAAE,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE;YAC3D,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACjC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE;gBACpC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC;gBAC/D,sBAAsB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBACnD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACnC;SACF;QAED,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,sBAAsB,EAAE;YAC1D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;SAC5C;QAGD,MAAM,yBAAyB,GAA4B,EAAE,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE;YAC3D,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;YAC9B,IAAI,UAAU,GAAG,OAAO,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAElC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE;gBACpC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC;aAC1D;YAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE;oBAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;iBACtD;qBAAM;oBACL,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAClB;aACF;YAED,IAAI,UAAU,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBAC/D,yBAAyB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACnC;SACF;QAED,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,yBAAyB,EAAE;YAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;SAC5C;QAGD,MAAM,wBAAwB,GAA4B,EAAE,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE;YACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;YACpC,IAAI,UAAU,GAAG,OAAO,CAAC;YACzB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;YAExC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE;gBACpC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC;aAC1D;YAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;gBAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE;oBAChC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;iBAC5D;qBAAM;oBACL,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBACxB;aACF;YAED,IAAI,UAAU,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE;gBAC3E,wBAAwB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACjC;SACF;QAED,KAAK,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,wBAAwB,EAAE;YAClE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;SAChD;IACH,CAAC;IAGO,YAAY,CAAC,IAAiB,EAAE,IAAiB;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;YAC3B,OAAO,KAAK,CAAC;SACd;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnB,OAAO,KAAK,CAAC;aACd;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAGO,kBAAkB,CAAC,OAAe,EAAE,OAAe;;QAEzD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAC5D,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;gBAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aAC7B;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;aACzC;SACF;QAGD,MAAM,YAAY,GAAG,CAAA,MAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,0CAAE,KAAK,KAAI,QAAQ,CAAC;QAGnE,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAGtD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE;YAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAC5D,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;SACzC;IACH,CAAC;IAEO,qBAAqB,CAAC,OAAe,EAAE,eAAuB,QAAQ;QAC5E,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACvE,OAAO,EAAE,CAAC;SACX;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI;YACF,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;SAC5E;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;SAC3D;QAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAClC,CAAC;IAEO,+BAA+B,CAAC,IAAY,EAAE,UAAoB,EAAE,eAAuB,QAAQ;QAEzG,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC7C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAG9C,MAAM,cAAc,GAAG,0DAA0D,CAAC;QAClF,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE;YACxD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;YAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzB,IAAI,OAAO,EAAE;gBAEX,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC5E,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;aAClC;iBAAM;gBAEL,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;aAC9C;SACF;QAGD,MAAM,iBAAiB,GAAG,eAAe,CAAC;QAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;gBAChD,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI,KAAK,EAAE,CAAC,CAAC;aAC7C;SACF;IACH,CAAC;IAEO,kBAAkB,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;QAC9E,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAE1C,MAAM,KAAK,GAAa,EAAE,CAAC;YAG3B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAE5C,KAAK,IAAI,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;gBAC3C,KAAK,IAAI,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;oBAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;iBAC5D;aACF;YAED,OAAO,KAAK,CAAC;SACd;QAAC,WAAM;YAEN,OAAO,CAAC,GAAG,SAAS,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;SACjD;IACH,CAAC;IAEO,qBAAqB,CAAC,WAAwB;QACpD,IAAI,CAAC,iCAAiC,CAAC,WAAW,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;IACzE,CAAC;IAEO,iCAAiC,CAAC,WAAwB,EAAE,OAAoB;QACtF,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAG7C,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACxB,OAAO;SACR;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE;YACxC,OAAO;SACR;QAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;QAErE,KAAK,MAAM,YAAY,IAAI,gBAAgB,EAAE;YAC3C,IAAI,CAAC,iCAAiC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;SAC/D;IACH,CAAC;IAEO,iCAAiC,CAAC,OAAe,EAAE,OAAoB;QAE7E,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACxB,OAAO;SACR;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QAGD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,OAAO;SACR;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO;SACR;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YACzE,OAAO;SACR;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QAGrC,IAAI,QAAQ,KAAK,QAAQ,EAAE;YAEzB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,IAAI,CAAC,iCAAiC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAEtD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SACzB;IACH,CAAC;IAEO,qBAAqB,CAAC,KAAe;QAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;YACnC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACrB,OAAO;aACR;YACD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACzB,OAAO,CAAC,IAAI,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;gBACpE,OAAO;aACR;YAED,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACvB,KAAK,CAAC,GAAG,CAAC,CAAC;iBACZ;aACF;YAED,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACtB,KAAK,CAAC,IAAI,CAAC,CAAC;aACb;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAUD,uBAAuB,CACrB,QAAgB,EAChB,IAAyB,EACzB,SAA2B,EAC3B,KAAa,EACb,KAAa,EACb,aAAqB,EACrB,aAAqB;QAErB,IAAI;YACF,MAAM,gBAAgB,GAAyE,EAAE,CAAC;YAClG,MAAM,aAAa,GAAyE,EAAE,CAAC;YAC/F,MAAM,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;YAG5C,IAAI,IAAI,KAAK,QAAQ,EAAE;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;oBAC9B,IAAI,SAAS,KAAK,KAAK,EAAE;wBAEvB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,aAAa,EAAE,GAAG,EAAE,EAAE;4BAE5C,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;4BAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;4BACpD,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;yBAClC;qBACF;yBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;wBAEjC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,aAAa,EAAE,GAAG,EAAE,EAAE;4BAE5C,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;4BAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;4BACpD,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;yBAClC;qBACF;iBACF;aACF;YAGD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;YAExD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;oBACpC,SAAS;iBACV;gBAGD,MAAM,OAAO,qBAAQ,IAAI,CAAE,CAAC;gBAC5B,IAAI,aAAa,GAAG,KAAK,CAAC;gBAE1B,IAAI,SAAS,KAAK,KAAK,EAAE;oBACvB,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,EAAE;wBAE1C,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;wBAC/B,aAAa,GAAG,IAAI,CAAC;qBACtB;yBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE;wBAEhD,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;wBAC/B,aAAa,GAAG,IAAI,CAAC;qBACtB;yBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,EAAE;wBAE7E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBAClC,SAAS;qBACV;iBACF;qBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;oBACjC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,EAAE;wBAE1C,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;wBAC/B,aAAa,GAAG,IAAI,CAAC;qBACtB;yBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE;wBAEhD,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;wBAC/B,aAAa,GAAG,IAAI,CAAC;qBACtB;yBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,EAAE;wBAE7E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBAClC,SAAS;qBACV;iBACF;gBAGD,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAEvF,IAAI,aAAa,EAAE;oBAGjB,aAAa,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;oBAE1E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAClC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;iBACjC;qBAAM,IAAI,UAAU,KAAK,OAAO,EAAE;oBAEjC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;oBAEjE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;iBACjC;aACF;YAGD,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE;gBAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAQ5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAE3C,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAE7C,IAAI,CAAC,qCAAqC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aAC9D;YAGD,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,gBAAgB,EAAE;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAEtC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAE3C,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAE7C,IAAI,CAAC,qCAAqC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;aAC9D;YAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;YACpE,IAAI,YAAY,GAAG,CAAC,EAAE;aAKrB;YAGD,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;SACtC;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,2CAA2C,IAAI,IAAI,SAAS,OAAO,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;YAClG,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;SAC9C;IACH,CAAC;IAWO,sBAAsB,CAC5B,OAAe,EACf,IAAyB,EACzB,SAA2B,EAC3B,KAAa,EACb,KAAa;QAEb,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxC,OAAO,OAAO,CAAC;SAChB;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAGxC,MAAM,YAAY,GAAG,mBAAmB,CAAC;QACzC,MAAM,aAAa,GAAG,gCAAgC,CAAC;QAEvD,IAAI,aAAa,GAAG,UAAU,CAAC;QAC/B,IAAI,KAA6B,CAAC;QAClC,MAAM,YAAY,GAA+D,EAAE,CAAC;QAGpF,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE;YACxD,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAIzB,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAErB,MAAM,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAE9G,IAAI,yBAAyB,EAAE;oBAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;oBAC1F,IAAI,QAAQ,KAAK,cAAc,EAAE;wBAC/B,YAAY,CAAC,IAAI,CAAC;4BAChB,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,MAAM;4BACxC,WAAW,EAAE,QAAQ;yBACtB,CAAC,CAAC;qBACJ;iBACF;aACF;SACF;QAGD,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;QAE3B,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE;YACvD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAGzC,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC;YACtC,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CACrC,WAAW,CAAC,EAAE,CAAC,iBAAiB,IAAI,WAAW,CAAC,KAAK,IAAI,iBAAiB,GAAG,WAAW,CAAC,GAAG,CAC7F,CAAC;YAEF,IAAI,aAAa,EAAE;gBACjB,SAAS;aACV;YAED,IAAI,eAAe,GAAG,KAAK,CAAC;YAC5B,IAAI,YAAY,GAAG,SAAS,CAAC;YAC7B,IAAI,aAAa,GAAG,UAAU,CAAC;YAE/B,IAAI,SAAS,KAAK,KAAK,EAAE;gBAEvB,MAAM,kBAAkB,GAAG,SAAS,GAAG,CAAC,CAAC;gBAEzC,IAAI,IAAI,KAAK,QAAQ,IAAI,kBAAkB,IAAI,KAAK,EAAE;oBAEpD,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC;oBACjC,eAAe,GAAG,IAAI,CAAC;iBACxB;qBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,kBAAkB,IAAI,KAAK,EAAE;oBAE3D,IAAI,kBAAkB,IAAI,KAAK,GAAG,KAAK,EAAE;wBAEvC,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC;wBACjC,eAAe,GAAG,IAAI,CAAC;qBACxB;yBAAM,IAAI,kBAAkB,IAAI,KAAK,IAAI,kBAAkB,GAAG,KAAK,GAAG,KAAK,EAAE;wBAE5E,YAAY,GAAG,KAAK,CAAC;wBACrB,eAAe,GAAG,IAAI,CAAC;qBACxB;iBACF;aACF;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAEvD,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE;oBAE1C,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;oBAC5D,eAAe,GAAG,IAAI,CAAC;iBACxB;qBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE;oBAEjD,IAAI,QAAQ,IAAI,KAAK,GAAG,KAAK,EAAE;wBAE7B,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;wBAC5D,eAAe,GAAG,IAAI,CAAC;qBACxB;yBAAM,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK,EAAE;wBAExD,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;wBACjD,eAAe,GAAG,IAAI,CAAC;qBACxB;iBACF;aACF;YACD,IAAI,eAAe,EAAE;gBACnB,IAAI,WAAmB,CAAC;gBACxB,IAAI,SAAS,KAAK,KAAK,IAAI,YAAY,KAAK,KAAK,EAAE;oBAEjD,WAAW,GAAG,OAAO,CAAC;iBACvB;qBAAM,IACL,SAAS,KAAK,QAAQ;oBACtB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,KAAK,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EACxG;oBAEA,WAAW,GAAG,OAAO,CAAC;iBACvB;qBAAM;oBACL,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;iBAC5C;gBACD,YAAY,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM;oBACnC,WAAW,EAAE,WAAW;iBACzB,CAAC,CAAC;aACJ;SACF;QAGD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAG/C,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,YAAY,EAAE;YACtD,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;SAChG;QAED,OAAO,GAAG,GAAG,aAAa,CAAC;IAC7B,CAAC;IAOO,oBAAoB,CAAC,OAAe;QAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SACnD;QACD,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAOO,oBAAoB,CAAC,KAAa;QACxC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,GAAG;YACD,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;YAC3D,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;SACpC,QAAQ,KAAK,IAAI,CAAC,EAAE;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC;IAaO,yBAAyB,CAC/B,SAAiB,EACjB,OAAe,EACf,SAA2B,EAC3B,KAAa,EACb,KAAa;QAEb,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAG1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAE5C,IAAI,SAAS,KAAK,KAAK,EAAE;gBAEvB,MAAM,cAAc,GAAG,KAAK,CAAC;gBAC7B,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAGvC,IAAI,YAAY,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,EAAE;oBACtD,OAAO,IAAI,CAAC;iBACb;aACF;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;gBAEjC,MAAM,cAAc,GAAG,KAAK,CAAC;gBAC7B,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAGvC,IAAI,YAAY,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,EAAE;oBACtD,OAAO,IAAI,CAAC;iBACb;aACF;YAED,OAAO,KAAK,CAAC;SACd;QAAC,WAAM;YACN,OAAO,KAAK,CAAC;SACd;IACH,CAAC;IAaO,sBAAsB,CAC5B,SAAiB,EACjB,OAAe,EACf,SAA2B,EAC3B,KAAa,EACb,KAAa;QAEb,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAG1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAE5C,IAAI,SAAS,GAAG,MAAM,CAAC;YACvB,IAAI,SAAS,GAAG,MAAM,CAAC;YACvB,IAAI,SAAS,GAAG,MAAM,CAAC;YACvB,IAAI,SAAS,GAAG,MAAM,CAAC;YAEvB,IAAI,SAAS,KAAK,KAAK,EAAE;gBACvB,MAAM,cAAc,GAAG,KAAK,CAAC;gBAC7B,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAGvC,MAAM,kBAAkB,GAAG,MAAM,IAAI,cAAc,IAAI,MAAM,IAAI,YAAY,CAAC;gBAC9E,IAAI,kBAAkB,EAAE;oBACtB,OAAO,OAAO,CAAC;iBAChB;gBAGD,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,IAAI,YAAY,EAAE;oBAEtD,SAAS,GAAG,cAAc,CAAC;iBAC5B;qBAAM,IAAI,MAAM,GAAG,YAAY,EAAE;oBAEhC,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;oBAC3B,IAAI,SAAS,GAAG,CAAC,EAAE;wBACjB,SAAS,GAAG,CAAC,CAAC;qBACf;iBACF;gBAGD,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,IAAI,YAAY,EAAE;oBAEtD,SAAS,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzD;qBAAM,IAAI,MAAM,GAAG,YAAY,EAAE;oBAEhC,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;oBAC3B,IAAI,SAAS,GAAG,CAAC,EAAE;wBACjB,SAAS,GAAG,CAAC,CAAC;qBACf;iBACF;gBAGD,IAAI,SAAS,GAAG,SAAS,EAAE;oBACzB,OAAO,OAAO,CAAC;iBAChB;aACF;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;gBACjC,MAAM,cAAc,GAAG,KAAK,CAAC;gBAC7B,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAGvC,MAAM,kBAAkB,GAAG,MAAM,IAAI,cAAc,IAAI,MAAM,IAAI,YAAY,CAAC;gBAC9E,IAAI,kBAAkB,EAAE;oBACtB,OAAO,OAAO,CAAC;iBAChB;gBAGD,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,IAAI,YAAY,EAAE;oBAEtD,SAAS,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzD;qBAAM,IAAI,MAAM,GAAG,YAAY,EAAE;oBAEhC,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;oBAC3B,IAAI,SAAS,GAAG,CAAC,EAAE;wBACjB,SAAS,GAAG,CAAC,CAAC;qBACf;iBACF;gBAGD,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,IAAI,YAAY,EAAE;oBAEtD,SAAS,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzD;qBAAM,IAAI,MAAM,GAAG,YAAY,EAAE;oBAEhC,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;oBAC3B,IAAI,SAAS,GAAG,CAAC,EAAE;wBACjB,SAAS,GAAG,CAAC,CAAC;qBACf;iBACF;gBAGD,IAAI,SAAS,GAAG,SAAS,EAAE;oBACzB,OAAO,OAAO,CAAC;iBAChB;gBAGD,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;oBACxC,OAAO,OAAO,CAAC;iBAChB;aACF;YAGD,IACE,CAAC,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC;gBAC7D,CAAC,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,EAChE;gBACA,OAAO,OAAO,CAAC;aAChB;YAGD,IAAI,YAAoB,CAAC;YACzB,IAAI,UAAkB,CAAC;YAEvB,IAAI,SAAS,KAAK,KAAK,EAAE;gBACvB,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;oBACpB,YAAY,GAAG,OAAO,CAAC;iBACxB;qBAAM;oBACL,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBACzD;gBAED,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;oBACpB,UAAU,GAAG,OAAO,CAAC;iBACtB;qBAAM;oBACL,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBACvD;aACF;iBAAM;gBACL,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;oBACpB,YAAY,GAAG,OAAO,CAAC;iBACxB;qBAAM;oBACL,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBACzD;gBAED,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;oBACpB,UAAU,GAAG,OAAO,CAAC;iBACtB;qBAAM;oBACL,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBACvD;aACF;YAGD,IAAI,YAAY,KAAK,UAAU,EAAE;gBAC/B,OAAO,YAAY,CAAC;aACrB;YAED,OAAO,GAAG,YAAY,IAAI,UAAU,EAAE,CAAC;SACxC;QAAC,WAAM;YACN,OAAO,OAAO,CAAC;SAChB;IACH,CAAC;IAYD,oCAAoC,CAClC,QAAgB,EAChB,SAAiB,EACjB,SAAiB,EACjB,aAAqB,EACrB,aAAqB;QAErB,IAAI;YACF,MAAM,gBAAgB,GAAyE,EAAE,CAAC;YAClG,MAAM,aAAa,GAAyE,EAAE,CAAC;YAG/F,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;YAG9C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;YAEhD,IAAI,eAAe,EAAE;gBAGnB,KAAK,IAAI,GAAG,GAAG,SAAS,GAAG,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,EAAE,EAAE;oBACrD,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;iBACjC;gBAED,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACzC;iBAAM;gBAGL,KAAK,IAAI,GAAG,GAAG,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE,GAAG,EAAE,EAAE;oBAChD,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;iBACjC;gBAED,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACzC;YAGD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE;gBACxE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;oBACpC,SAAS;iBACV;gBAGD,IAAI,aAAa,GAAG,KAAK,CAAC;gBAC1B,MAAM,eAAe,qBAAQ,IAAI,CAAE,CAAC;gBAGpC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;oBAC/B,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC9C,IAAI,SAAS,KAAK,SAAS,EAAE;wBAC3B,eAAe,CAAC,GAAG,GAAG,SAAS,CAAC;wBAChC,aAAa,GAAG,IAAI,CAAC;qBACtB;iBACF;gBAGD,MAAM,UAAU,GAAG,IAAI,CAAC,8BAA8B,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAErG,IAAI,aAAa,IAAI,UAAU,KAAK,OAAO,EAAE;oBAC3C,IAAI,aAAa,EAAE;wBAEjB,aAAa,CAAC,IAAI,CAAC;4BACjB,UAAU,EAAE,OAAO;4BACnB,OAAO,EAAE,eAAe;4BACxB,OAAO,EAAE,UAAU;yBACpB,CAAC,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBAClC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;qBACjC;yBAAM;wBAEL,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;wBACjE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;qBACjC;iBACF;aACF;YAID,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE;gBAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC7C,IAAI,CAAC,qCAAqC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aAC9D;YAGD,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,gBAAgB,EAAE;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC3C,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC7C,IAAI,CAAC,qCAAqC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;aAC9D;YAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;SACtC;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;SAC9C;IACH,CAAC;IAKO,8BAA8B,CACpC,OAAe,EACf,aAAkC,EAClC,SAAkB,EAClB,SAAkB;QAElB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxC,OAAO,OAAO,CAAC;SAChB;QAED,IAAI,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAGtC,MAAM,UAAU,GAAG,oCAAoC,CAAC;QACxD,IAAI,KAA6B,CAAC;QAClC,MAAM,iBAAiB,GAA+D,EAAE,CAAC;QACzF,MAAM,eAAe,GAA0C,EAAE,CAAC;QAElE,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAEtD,IAAI,WAAW,GAAG,aAAa,CAAC;YAChC,IAAI,SAAS,GAAG,WAAW,CAAC;YAI5B,MAAM,kBAAkB,GAAG,aAAa,IAAI,SAAS,IAAI,SAAS,IAAI,WAAW,CAAC;YAElF,IAAI,kBAAkB,EAAE;gBAGtB,WAAW,GAAG,aAAa,CAAC;gBAC5B,SAAS,GAAG,WAAW,CAAC;aACzB;iBAAM;gBAGL,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;oBACpC,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACxD,IAAI,cAAc,KAAK,SAAS,EAAE;wBAChC,WAAW,GAAG,cAAc,CAAC;qBAC9B;iBACF;gBAGD,IAAI,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;oBAClC,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACpD,IAAI,YAAY,KAAK,SAAS,EAAE;wBAC9B,SAAS,GAAG,YAAY,CAAC;qBAC1B;iBACF;aACF;YAGD,IAAI,WAAW,GAAG,SAAS,EAAE;gBAC3B,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;aACrD;YAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;YAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,GAAG,kBAAkB,GAAG,QAAQ,IAAI,gBAAgB,GAAG,MAAM,EAAE,CAAC;YAEpF,iBAAiB,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM;gBACnC,WAAW;aACZ,CAAC,CAAC;YAEH,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;SACnF;QAGD,KAAK,IAAI,CAAC,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACtD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACzD,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;SACvF;QAGD,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACtC,MAAM,gBAAgB,GAA+D,EAAE,CAAC;QAExF,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE;YACpD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;YAG/B,MAAM,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACtD,OAAO,UAAU,IAAI,KAAK,CAAC,KAAK,IAAI,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,IAAI,kBAAkB,EAAE;gBACtB,SAAS;aACV;YAGD,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAC/B,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChD,IAAI,WAAW,KAAK,SAAS,EAAE;oBAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;oBAC7D,MAAM,WAAW,GAAG,GAAG,aAAa,GAAG,GAAG,EAAE,CAAC;oBAE7C,gBAAgB,CAAC,IAAI,CAAC;wBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM;wBACnC,WAAW;qBACZ,CAAC,CAAC;iBACJ;aACF;SACF;QAGD,KAAK,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACxD,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;SACvF;QAED,OAAO,GAAG,GAAG,UAAU,CAAC;IAC1B,CAAC;IAWD,iCAAiC,CAC/B,QAAgB,EAChB,SAAiB,EACjB,SAAiB;QAEjB,IAAI;YAEF,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE;gBAClC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;aAC9C;YAED,MAAM,gBAAgB,GAAyE,EAAE,CAAC;YAClG,MAAM,aAAa,GAAyE,EAAE,CAAC;YAG/F,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;YAG9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;YAE7C,IAAI,eAAe,EAAE;gBAGnB,KAAK,IAAI,GAAG,GAAG,SAAS,GAAG,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,EAAE,EAAE;oBACrD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;iBAC9B;gBAED,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACtC;iBAAM;gBAGL,KAAK,IAAI,GAAG,GAAG,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE,GAAG,EAAE,EAAE;oBAChD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;iBAC9B;gBAED,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACtC;YAED,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE;gBACxE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;oBACpC,SAAS;iBACV;gBAED,IAAI,aAAa,GAAG,KAAK,CAAC;gBAC1B,MAAM,eAAe,qBAAQ,IAAI,CAAE,CAAC;gBAGpC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;oBAC5B,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC3C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,GAAG,EAAE;wBACrD,eAAe,CAAC,GAAG,GAAG,SAAS,CAAC;wBAChC,aAAa,GAAG,IAAI,CAAC;qBACtB;iBACF;gBAGD,MAAM,UAAU,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAEzE,IAAI,aAAa,IAAI,UAAU,KAAK,OAAO,EAAE;oBAC3C,IAAI,aAAa,EAAE;wBAEjB,aAAa,CAAC,IAAI,CAAC;4BACjB,UAAU,EAAE,OAAO;4BACnB,OAAO,EAAE,eAAe;4BACxB,OAAO,EAAE,UAAU;yBACpB,CAAC,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBAClC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;qBACjC;yBAAM;wBAEL,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;wBACjE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;qBACjC;iBACF;aACF;YAID,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE;gBAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC7C,IAAI,CAAC,qCAAqC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aAC9D;YAGD,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,gBAAgB,EAAE;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC3C,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC7C,IAAI,CAAC,qCAAqC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;aAC9D;YAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;SACtC;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;YACpE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;SAC9C;IACH,CAAC;IAKO,2BAA2B,CAAC,OAAe,EAAE,UAA+B;QAClF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxC,OAAO,OAAO,CAAC;SAChB;QAED,IAAI,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAGtC,MAAM,UAAU,GAAG,oCAAoC,CAAC;QACxD,IAAI,KAA6B,CAAC;QAClC,MAAM,iBAAiB,GAA+D,EAAE,CAAC;QACzF,MAAM,eAAe,GAA0C,EAAE,CAAC;QAElE,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAE7C,IAAI,WAAW,GAAG,aAAa,CAAC;YAChC,IAAI,SAAS,GAAG,WAAW,CAAC;YAG5B,IAAI,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;gBACjC,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACrD,IAAI,cAAc,KAAK,SAAS,EAAE;oBAChC,WAAW,GAAG,cAAc,CAAC;iBAC9B;aACF;YAGD,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBAC/B,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,YAAY,KAAK,SAAS,EAAE;oBAC9B,SAAS,GAAG,YAAY,CAAC;iBAC1B;aACF;YAGD,IAAI,WAAW,KAAK,aAAa,IAAI,SAAS,KAAK,WAAW,EAAE;gBAC9D,MAAM,iBAAiB,GAAG,WAAW,GAAG,CAAC,CAAC;gBAC1C,MAAM,eAAe,GAAG,SAAS,GAAG,CAAC,CAAC;gBACtC,MAAM,WAAW,GAAG,GAAG,QAAQ,GAAG,iBAAiB,IAAI,MAAM,GAAG,eAAe,EAAE,CAAC;gBAElF,iBAAiB,CAAC,IAAI,CAAC;oBACrB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM;oBACnC,WAAW;iBACZ,CAAC,CAAC;gBAEH,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;aACnF;SACF;QAGD,KAAK,IAAI,CAAC,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACtD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACzD,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;SACvF;QAGD,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACtC,MAAM,gBAAgB,GAA+D,EAAE,CAAC;QAExF,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE;YACpD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAEvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;YAG/B,MAAM,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACtD,OAAO,UAAU,IAAI,KAAK,CAAC,KAAK,IAAI,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,IAAI,kBAAkB,EAAE;gBACtB,SAAS;aACV;YAGD,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAC5B,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7C,IAAI,WAAW,KAAK,SAAS,EAAE;oBAC7B,MAAM,YAAY,GAAG,WAAW,GAAG,CAAC,CAAC;oBACrC,MAAM,WAAW,GAAG,GAAG,UAAU,GAAG,YAAY,EAAE,CAAC;oBAEnD,gBAAgB,CAAC,IAAI,CAAC;wBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM;wBACnC,WAAW;qBACZ,CAAC,CAAC;iBACJ;aACF;SACF;QAGD,KAAK,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACxD,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;SACvF;QAED,OAAO,GAAG,GAAG,UAAU,CAAC;IAC1B,CAAC;CACF;AA92FD,sCA82FC;AAED,MAAM,YAAY;IAChB,YAAmB,OAAe,EAAS,OAAiD,OAAO;QAAhF,YAAO,GAAP,OAAO,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAoD;IAAG,CAAC;CACxG","file":"formula-engine.js","sourcesContent":["/**\n * 嵌套公式计算引擎 - 清理版本\n * 支持函数嵌套调用和完整的依赖关系\n */\n\nimport type { FormulaCell, FormulaResult } from '../ts-types/formula';\nimport { supportedFunctions } from './formula-helper';\n\nexport interface FormulaEngineConfig {\n precisionRounding?: number;\n caseSensitive?: boolean;\n ignoreWhiteSpace?: 'standard' | 'any';\n nullDate?: { year: number; month: number; day: number };\n dateFormats?: string[];\n timeFormats?: string[];\n}\n\nexport class FormulaEngine {\n private sheets: Map<string, number> = new Map();\n private reverseSheets: Map<number, string> = new Map();\n private sheetData: Map<number, unknown[][]> = new Map();\n private formulaCells: Map<string, string> = new Map();\n private dependencies: Map<string, Set<string>> = new Map();\n private dependents: Map<string, Set<string>> = new Map();\n private nextSheetId = 0;\n private activeSheetKey: string | null = null;\n\n constructor(_config: FormulaEngineConfig = {}) {\n // 配置暂时不使用,保持兼容性\n }\n\n /**\n * 设置活动工作表\n * @param sheetKey 工作表键\n */\n setActiveSheet(sheetKey: string): void {\n if (this.sheets.has(sheetKey)) {\n this.activeSheetKey = sheetKey;\n }\n }\n\n /**\n * 获取活动工作表\n * @returns 活动工作表键\n */\n getActiveSheet(): string | null {\n return this.activeSheetKey;\n }\n\n addSheet(sheetKey: string, data?: unknown[][]): number {\n if (this.sheets.has(sheetKey)) {\n return this.sheets.get(sheetKey) as number;\n }\n\n const sheetId = this.nextSheetId++;\n this.sheets.set(sheetKey, sheetId);\n this.reverseSheets.set(sheetId, sheetKey);\n\n // 初始化工作表数据\n const sheetData = data || [['']];\n // this.sheetData.set(sheetId, this.normalizeData(sheetData));\n this.sheetData.set(sheetId, sheetData);\n\n return sheetId;\n }\n updateSheetData(sheetKey: string, data: unknown[][]): void {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId !== undefined && sheetId !== null) {\n this.sheetData.set(sheetId, data);\n }\n }\n\n private normalizeData(data: unknown[][]): unknown[][] {\n if (!Array.isArray(data) || data.length === 0) {\n return [['']];\n }\n\n const maxCols = Math.max(...data.map(row => (Array.isArray(row) ? row.length : 0)));\n\n return data.map(row => {\n if (!Array.isArray(row)) {\n return Array(maxCols).fill('');\n }\n\n const normalizedRow = row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) && cell.trim() !== '' ? num : cell;\n }\n return cell ?? '';\n });\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n\n return normalizedRow;\n });\n }\n\n getSheetId(sheetKey: string): number {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId === undefined) {\n return this.addSheet(sheetKey);\n }\n return sheetId;\n }\n\n /**\n * 获取单元格的公式字符串\n */\n getFormulaString(cell: FormulaCell): string | null {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.get(cellKey) || null;\n }\n\n /**\n * 清除指定单元格的依赖关系\n */\n private clearDependencies(cellKey: string): void {\n // 清除该单元格对其他单元的依赖\n const oldDeps = this.dependencies.get(cellKey) || new Set();\n for (const dep of oldDeps) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.delete(cellKey);\n if (depDependents.size === 0) {\n this.dependents.delete(dep);\n } else {\n this.dependents.set(dep, depDependents);\n }\n }\n\n // 清除该单元格的依赖记录\n this.dependencies.delete(cellKey);\n }\n\n /**\n * 设置单元格内容但不更新依赖关系(用于批量操作)\n */\n private setCellContentWithoutDependencyUpdate(cell: FormulaCell, value: unknown): void {\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n throw new Error('Invalid cell parameter');\n }\n\n if (cell.row < 0 || cell.col < 0) {\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n const sheetId = this.getSheetId(cell.sheet);\n\n if (!this.sheetData.has(sheetId)) {\n this.sheetData.set(sheetId, [['']]);\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet) {\n throw new Error(`Sheet data not found for ID: ${sheetId}`);\n }\n\n // 确保行存在\n while (sheet.length <= cell.row) {\n sheet.push([]);\n }\n\n // 确保列存在\n while (sheet[cell.row].length <= cell.col) {\n sheet[cell.row].push('');\n }\n\n let processedValue = value;\n\n // 处理空值\n if (processedValue === null || processedValue === undefined) {\n processedValue = '';\n }\n\n // 只有字符串类型的值才需要检查是否为数字\n if (typeof processedValue === 'string' && !processedValue.startsWith('=')) {\n const numericValue = Number(processedValue);\n // 只有非空字符串且能转换为有效数字时才转换\n if (!isNaN(numericValue) && processedValue.trim() !== '') {\n processedValue = numericValue;\n }\n }\n\n // 更新单元格值\n sheet[cell.row][cell.col] = processedValue;\n }\n\n setCellContent(cell: FormulaCell, value: unknown): void {\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n throw new Error('Invalid cell parameter');\n }\n\n if (cell.row < 0 || cell.col < 0) {\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n const sheetId = this.getSheetId(cell.sheet);\n\n if (!this.sheetData.has(sheetId)) {\n this.sheetData.set(sheetId, [['']]);\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet) {\n throw new Error(`Sheet data not found for ID: ${sheetId}`);\n }\n\n // 确保行存在\n while (sheet.length <= cell.row) {\n sheet.push([]);\n }\n\n // 确保列存在\n while (sheet[cell.row].length <= cell.col) {\n sheet[cell.row].push('');\n }\n\n // 处理值\n let processedValue = value;\n if (processedValue === undefined || processedValue === null) {\n processedValue = '';\n }\n\n // 只有字符串类型的值才需要检查是否为数字\n if (typeof processedValue === 'string' && !processedValue.startsWith('=')) {\n const numericValue = Number(processedValue);\n // 只有非空字符串且能转换为有效数字时才转换\n if (!isNaN(numericValue) && processedValue.trim() !== '') {\n processedValue = numericValue;\n }\n }\n\n // 更新单元格值\n sheet[cell.row][cell.col] = processedValue;\n\n // 如果是公式,更新依赖关系\n if (typeof processedValue === 'string' && processedValue.startsWith('=')) {\n const cellKey = this.getCellKey(cell);\n // 自动纠正公式大小写\n const correctedFormula = this.correctFormulaCase(processedValue);\n this.formulaCells.set(cellKey, correctedFormula);\n this.updateDependencies(cellKey, correctedFormula);\n // 更新单元格值为纠正后的公式\n sheet[cell.row][cell.col] = correctedFormula;\n // console.log(`Set formula ${cellKey}: ${correctedFormula}`);\n }\n\n // 重新计算受影响的单元格\n this.recalculateDependents(cell);\n }\n\n private getCellKey(cell: FormulaCell): string {\n return `${cell.sheet}!${this.getA1Notation(cell.row, cell.col)}`;\n }\n\n private getA1Notation(row: number, col: number): string {\n let columnStr = '';\n let tempCol = col;\n do {\n columnStr = String.fromCharCode(65 + (tempCol % 26)) + columnStr;\n tempCol = Math.floor(tempCol / 26) - 1;\n } while (tempCol >= 0);\n\n return columnStr + (row + 1);\n }\n\n private parseA1Notation(cellRef: string): { row: number; col: number } {\n const match = cellRef.match(/^([A-Z]+)([0-9]+)$/);\n if (!match) {\n throw new Error(`Invalid cell reference: ${cellRef}`);\n }\n\n const colLetters = match[1];\n const rowNumber = parseInt(match[2], 10);\n\n // 转换列字母为索引 (A=0, B=1, ..., Z=25, AA=26, etc.)\n let col = 0;\n for (let i = 0; i < colLetters.length; i++) {\n col = col * 26 + (colLetters.charCodeAt(i) - 65);\n }\n\n return { row: rowNumber - 1, col };\n }\n\n private parseCellKey(cellKey: string): FormulaCell | null {\n const parts = cellKey.split('!');\n if (parts.length !== 2) {\n return null;\n }\n\n const [sheet, a1Notation] = parts;\n try {\n const { row, col } = this.parseA1Notation(a1Notation);\n return { sheet, row, col };\n } catch {\n return null;\n }\n }\n\n calculateFormula(formula: string): { value: unknown; error?: string } {\n try {\n if (!formula.startsWith('=')) {\n return { value: formula, error: undefined };\n }\n\n // 自动纠正公式大小写\n const correctedFormula = this.correctFormulaCase(formula);\n const expression = correctedFormula.substring(1).trim();\n\n // 检查是否包含#REF!错误\n if (expression.includes('#REF!')) {\n return { value: '#REF!', error: undefined };\n }\n\n // 使用递归下降解析器\n const result = this.parseExpression(expression);\n return result;\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n /**\n * 自动纠正公式的大小写\n * 将函数名转换为大写,将单元格引用转换为大写(如 f4 -> F4)\n * 保持工作表名称不变(区分大小写)\n */\n private correctFormulaCase(formula: string): string {\n if (!formula.startsWith('=')) {\n return formula;\n }\n\n let corrected = '=';\n const expression = formula.substring(1);\n\n // 用于跟踪是否在字符串字面量中\n let inQuotes = false;\n let quoteChar = '';\n let i = 0;\n\n while (i < expression.length) {\n const char = expression[i];\n\n // 处理字符串字面量\n if ((char === '\"' || char === \"'\") && (i === 0 || expression[i - 1] !== '\\\\')) {\n if (!inQuotes) {\n inQuotes = true;\n quoteChar = char;\n } else if (char === quoteChar) {\n inQuotes = false;\n quoteChar = '';\n }\n corrected += char;\n i++;\n continue;\n }\n\n // 如果在字符串中,直接复制字符\n if (inQuotes) {\n corrected += char;\n i++;\n continue;\n }\n\n // 查找函数名模式(字母开头,后跟字母数字,然后是左括号)\n const funcMatch = expression.substring(i).match(/^[A-Za-z][A-Za-z0-9]*\\s*\\(/);\n if (funcMatch) {\n const funcName = funcMatch[0].replace(/\\s*\\($/, '');\n corrected += funcName.toUpperCase() + '(';\n i += funcName.length + 1;\n // 跳过可能的空白字符\n while (i < expression.length && expression[i] === ' ') {\n i++;\n }\n continue;\n }\n\n // 查找带工作表前缀的单元格引用(如 Sheet1!a1)\n const sheetCellMatch = expression.substring(i).match(/^[A-Za-z0-9_]+![A-Za-z]+[0-9]+/);\n if (sheetCellMatch) {\n const fullRef = sheetCellMatch[0];\n const [sheetName, cellRef] = fullRef.split('!');\n\n // 查找原始工作表名称(保持大小写)\n const originalSheetName = this.findOriginalSheetName(sheetName);\n\n // 保持工作表名称不变,只纠正单元格引用\n const letters = cellRef.replace(/[0-9]/g, '');\n const numbers = cellRef.replace(/[A-Za-z]/g, '');\n corrected += (originalSheetName || sheetName) + '!' + letters.toUpperCase() + numbers;\n i += fullRef.length;\n continue;\n }\n\n // 查找带工作表前缀的范围引用(如 Sheet1!a1:b2)\n const sheetRangeMatch = expression.substring(i).match(/^[A-Za-z0-9_]+![A-Za-z]+[0-9]+:[A-Za-z]+[0-9]+/);\n if (sheetRangeMatch) {\n const fullRangeRef = sheetRangeMatch[0];\n const [sheetPart, rangePart] = fullRangeRef.split('!');\n const [startCell, endCell] = rangePart.split(':');\n\n // 查找原始工作表名称(保持大小写)\n const originalSheetName = this.findOriginalSheetName(sheetPart);\n\n // 转换起始单元格\n const startLetters = startCell.replace(/[0-9]/g, '');\n const startNumbers = startCell.replace(/[A-Za-z]/g, '');\n const newStartCell = startLetters.toUpperCase() + startNumbers;\n\n // 转换结束单元格\n const endLetters = endCell.replace(/[0-9]/g, '');\n const endNumbers = endCell.replace(/[A-Za-z]/g, '');\n const newEndCell = endLetters.toUpperCase() + endNumbers;\n\n corrected += (originalSheetName || sheetPart) + '!' + newStartCell + ':' + newEndCell;\n i += fullRangeRef.length;\n continue;\n }\n\n // 查找普通单元格引用模式(字母+数字,如 f4, A1, AA10)\n const cellMatch = expression.substring(i).match(/^[A-Za-z]+[0-9]+/);\n if (cellMatch) {\n const cellRef = cellMatch[0];\n // 将字母部分转换为大写\n const letters = cellRef.replace(/[0-9]/g, '');\n const numbers = cellRef.replace(/[A-Za-z]/g, '');\n corrected += letters.toUpperCase() + numbers;\n i += cellRef.length;\n continue;\n }\n\n // 查找普通范围引用模式(如 f4:f8, A1:B2)\n const rangeMatch = expression.substring(i).match(/^[A-Za-z]+[0-9]+:[A-Za-z]+[0-9]+/);\n if (rangeMatch) {\n const rangeRef = rangeMatch[0];\n const [startCell, endCell] = rangeRef.split(':');\n\n // 转换起始单元格\n const startLetters = startCell.replace(/[0-9]/g, '');\n const startNumbers = startCell.replace(/[A-Za-z]/g, '');\n const newStartCell = startLetters.toUpperCase() + startNumbers;\n\n // 转换结束单元格\n const endLetters = endCell.replace(/[0-9]/g, '');\n const endNumbers = endCell.replace(/[A-Za-z]/g, '');\n const newEndCell = endLetters.toUpperCase() + endNumbers;\n\n corrected += newStartCell + ':' + newEndCell;\n i += rangeRef.length;\n continue;\n }\n\n // 普通字符,直接复制\n corrected += char;\n i++;\n }\n\n return corrected;\n }\n\n /**\n * 查找原始工作表名称(保持大小写)\n */\n private findOriginalSheetName(sheetName: string): string | null {\n // 首先尝试精确匹配\n if (this.sheets.has(sheetName)) {\n return sheetName;\n }\n\n // 如果找不到,尝试不区分大小写的匹配\n const lowerSheetName = sheetName.toLowerCase();\n for (const [existingSheetName] of this.sheets.entries()) {\n if (existingSheetName.toLowerCase() === lowerSheetName) {\n return existingSheetName;\n }\n }\n\n return null;\n }\n\n private parseExpression(expr: string): { value: unknown; error?: string } {\n expr = expr.trim();\n\n // 首先处理函数调用(最高优先级)\n const functionResult = this.tryParseFunction(expr);\n if (functionResult) {\n return functionResult;\n }\n\n // 处理比较运算符\n const comparisonResult = this.tryParseComparison(expr);\n if (comparisonResult) {\n return comparisonResult;\n }\n\n // 处理算术表达式\n return this.parseArithmetic(expr);\n }\n\n private tryParseComparison(expr: string): { value: unknown; error?: string } | null {\n const operators = ['>=', '<=', '<>', '>', '<', '='];\n\n for (const op of operators) {\n const index = expr.indexOf(op);\n if (index !== -1) {\n const leftExpr = expr.substring(0, index).trim();\n const rightExpr = expr.substring(index + op.length).trim();\n\n // 如果左边或右边为空,跳过这个运算符\n if (!leftExpr || !rightExpr) {\n continue;\n }\n\n const leftResult = this.parseExpression(leftExpr);\n const rightResult = this.parseExpression(rightExpr);\n\n if (leftResult.error || rightResult.error) {\n return { value: null, error: 'Comparison operands error' };\n }\n\n // 尝试转换为数字进行比较\n const leftVal = Number(leftResult.value);\n const rightVal = Number(rightResult.value);\n\n let result = false;\n if (!isNaN(leftVal) && !isNaN(rightVal)) {\n // 数值比较\n switch (op) {\n case '>=': {\n result = leftVal >= rightVal;\n break;\n }\n case '<=': {\n result = leftVal <= rightVal;\n break;\n }\n case '<>': {\n result = leftVal !== rightVal;\n break;\n }\n case '>': {\n result = leftVal > rightVal;\n break;\n }\n case '<': {\n result = leftVal < rightVal;\n break;\n }\n case '=': {\n result = leftVal === rightVal;\n break;\n }\n }\n } else {\n // 字符串比较\n const leftStr = String(leftResult.value);\n const rightStr = String(rightResult.value);\n switch (op) {\n case '>=': {\n result = leftStr >= rightStr;\n break;\n }\n case '<=': {\n result = leftStr <= rightStr;\n break;\n }\n case '<>': {\n result = leftStr !== rightStr;\n break;\n }\n case '>': {\n result = leftStr > rightStr;\n break;\n }\n case '<': {\n result = leftStr < rightStr;\n break;\n }\n case '=': {\n result = leftStr === rightStr;\n break;\n }\n }\n }\n\n return { value: result, error: undefined };\n }\n }\n\n return null;\n }\n\n private parseArithmetic(expr: string): { value: unknown; error?: string } {\n try {\n // 首先处理函数调用\n const functionResult = this.tryParseFunction(expr);\n if (functionResult) {\n return functionResult;\n }\n\n // 处理字符串\n if (expr.startsWith('\"') && expr.endsWith('\"')) {\n return { value: expr.slice(1, -1), error: undefined };\n }\n\n // 处理单元格引用(包括带工作表前缀的引用,如 Sheet1!A1)\n if (/^([A-Za-z0-9_]+!)?[A-Z]+[0-9]+$/.test(expr)) {\n return { value: this.getCellValueByA1(expr), error: undefined };\n }\n\n // 处理数字\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return { value: Number(expr), error: undefined };\n }\n\n // 处理范围引用(包括带工作表前缀的范围,如 Sheet1!A2:A4)\n if (/^([A-Za-z0-9_]+!)?[A-Z]+[0-9]+:[A-Z]+[0-9]+$/.test(expr)) {\n const values = this.getRangeValuesFromExpr(expr);\n return { value: values, error: undefined };\n }\n\n // 处理算术表达式(包含+、-、*、/)\n if (expr.includes('+') || expr.includes('-') || expr.includes('*') || expr.includes('/')) {\n return this.evaluateArithmeticWithFunctions(expr);\n }\n\n // 如果都不匹配,返回原始值\n return { value: expr, error: undefined };\n } catch (error) {\n return { value: null, error: error instanceof Error ? error.message : 'Arithmetic parsing failed' };\n }\n }\n\n private tryParseFunction(expr: string): { value: unknown; error?: string } | null {\n // 更精确地匹配函数调用 - 确保是整个表达式且括号平衡\n // 首先检查是否以函数名开头\n const funcStartMatch = expr.match(/^([A-Z]+)\\s*\\(/i);\n if (!funcStartMatch) {\n return null;\n }\n\n const funcName = funcStartMatch[1].toUpperCase();\n\n // 找到匹配的右括号\n let depth = 1;\n let argsEnd = funcStartMatch[0].length - 1; // 位置在左括号\n\n for (let i = funcStartMatch[0].length; i < expr.length; i++) {\n if (expr[i] === '(') {\n depth++;\n } else if (expr[i] === ')') {\n depth--;\n if (depth === 0) {\n argsEnd = i;\n break;\n }\n }\n }\n\n if (depth !== 0) {\n return null; // 没有找到匹配的右括号\n }\n\n // 确保这是整个表达式(没有剩余字符)\n if (argsEnd + 1 !== expr.length) {\n return null; // 这不是一个完整的函数调用,后面还有其他内容\n }\n\n const argsStr = expr.substring(funcStartMatch[0].length, argsEnd);\n\n // 解析参数(处理嵌套)\n const args = this.parseArguments(argsStr);\n\n // 计算每个参数的值\n const argValues: unknown[] = [];\n for (const arg of args) {\n const result = this.parseExpression(arg);\n if (result.error) {\n return { value: null, error: `Argument error in ${funcName}: ${result.error}` };\n }\n argValues.push(result.value);\n }\n\n // 执行函数\n return this.executeFunction(funcName, argValues);\n }\n\n private parseArguments(argsStr: string): string[] {\n const args: string[] = [];\n let current = '';\n let depth = 0;\n let inQuotes = false;\n\n for (let i = 0; i < argsStr.length; i++) {\n const char = argsStr[i];\n\n if (char === '\"' && (i === 0 || argsStr[i - 1] !== '\\\\')) {\n inQuotes = !inQuotes;\n }\n\n if (!inQuotes) {\n if (char === '(') {\n depth++;\n }\n if (char === ')') {\n depth--;\n }\n\n if (char === ',' && depth === 0) {\n args.push(current.trim());\n current = '';\n continue;\n }\n }\n\n current += char;\n }\n\n if (current.trim()) {\n args.push(current.trim());\n }\n\n // 如果只有一个参数且包含函数调用,需要特殊处理\n if (args.length === 1 && args[0].includes('(') && args[0].includes(')')) {\n // 检查是否可能是多个参数被错误解析\n const singleArg = args[0];\n\n // 尝试重新解析,考虑函数嵌套\n const reArgs: string[] = [];\n let reCurrent = '';\n let reDepth = 0;\n let reInQuotes = false;\n\n for (let i = 0; i < singleArg.length; i++) {\n const char = singleArg[i];\n\n if (char === '\"' && (i === 0 || singleArg[i - 1] !== '\\\\')) {\n reInQuotes = !reInQuotes;\n }\n\n if (!reInQuotes) {\n if (char === '(') {\n reDepth++;\n }\n if (char === ')') {\n reDepth--;\n }\n\n if (char === ',' && reDepth === 0) {\n reArgs.push(reCurrent.trim());\n reCurrent = '';\n continue;\n }\n }\n\n reCurrent += char;\n }\n\n if (reCurrent.trim()) {\n reArgs.push(reCurrent.trim());\n }\n\n // 如果重新解析得到多个参数,使用重新解析的结果\n if (reArgs.length > 1) {\n return reArgs;\n }\n }\n\n return args;\n }\n\n private executeFunction(funcName: string, args: unknown[]): { value: unknown; error?: string } {\n try {\n switch (funcName) {\n // 数学函数\n case 'SUM':\n return this.calculateSum(args);\n case 'AVERAGE':\n return this.calculateAverage(args);\n case 'MAX':\n return this.calculateMax(args);\n case 'MIN':\n return this.calculateMin(args);\n case 'ABS':\n return this.calculateAbs(args);\n case 'ROUND':\n return this.calculateRound(args);\n case 'INT':\n return this.calculateInt(args);\n case 'RAND':\n return this.calculateRand(args);\n\n // 统计函数\n case 'COUNT':\n return this.calculateCount(args);\n case 'COUNTA':\n return this.calculateCountA(args);\n case 'STDEV':\n return this.calculateStdev(args);\n case 'VAR':\n return this.calculateVar(args);\n case 'MEDIAN':\n return this.calculateMedian(args);\n case 'PRODUCT':\n return this.calculateProduct(args);\n\n // 逻辑函数\n case 'IF':\n return this.calculateIf(args);\n case 'AND':\n return this.calculateAnd(args);\n case 'OR':\n return this.calculateOr(args);\n case 'NOT':\n return this.calculateNot(args);\n\n // 日期函数\n case 'TODAY':\n return this.calculateToday(args);\n case 'NOW':\n return this.calculateNow(args);\n\n default:\n return { value: null, error: `Unknown function: ${funcName}` };\n }\n } catch (error) {\n return { value: null, error: error instanceof Error ? error.message : 'Function execution failed' };\n }\n }\n\n // 函数实现\n private calculateSum(args: unknown[]): { value: unknown; error?: string } {\n let total = 0;\n for (const arg of this.flattenArgsWithRanges(args)) {\n const num = Number(arg);\n if (!isNaN(num)) {\n total += num;\n }\n }\n return { value: total, error: undefined };\n }\n\n private calculateAverage(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args).filter(arg => !isNaN(Number(arg)));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n const sum = values.reduce((acc: number, val) => acc + Number(val), 0);\n return { value: Number(sum) / Number(values.length), error: undefined };\n }\n\n private calculateMax(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args)\n .filter(arg => !isNaN(Number(arg)))\n .map(arg => Number(arg));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n return { value: Math.max(...values), error: undefined };\n }\n\n private calculateMin(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args)\n .filter(arg => !isNaN(Number(arg)))\n .map(arg => Number(arg));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n return { value: Math.min(...values), error: undefined };\n }\n\n private calculateAbs(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'ABS requires exactly 1 argument' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'ABS argument must be a number' };\n }\n return { value: Math.abs(num), error: undefined };\n }\n\n private calculateRound(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1 || args.length > 2) {\n return { value: null, error: 'ROUND requires 1 or 2 arguments' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'ROUND argument must be a number' };\n }\n const digits = args.length === 2 ? Number(args[1]) : 0;\n if (isNaN(digits)) {\n return { value: null, error: 'ROUND digits must be a number' };\n }\n const factor = Math.pow(10, digits);\n return { value: Math.round(num * factor) / factor, error: undefined };\n }\n\n private calculateInt(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'INT requires exactly 1 argument' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'INT argument must be a number' };\n }\n return { value: Math.floor(num), error: undefined };\n }\n\n private calculateRand(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'RAND requires no arguments' };\n }\n return { value: Math.random(), error: undefined };\n }\n\n private calculateCount(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args);\n let count = 0;\n for (const value of values) {\n // COUNT only counts numeric values, excluding empty strings, null, undefined\n if (value !== '' && value !== null && value !== undefined) {\n const num = Number(value);\n if (!isNaN(num)) {\n count++;\n }\n }\n }\n return { value: count, error: undefined };\n }\n\n private calculateCountA(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args);\n let count = 0;\n for (const value of values) {\n if (value !== null && value !== undefined && value !== '') {\n count++;\n }\n }\n return { value: count, error: undefined };\n }\n\n private calculateStdev(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length < 2) {\n return { value: 0, error: undefined };\n }\n\n // Calculate mean\n const mean = values.reduce((sum, val) => sum + val, 0) / values.length;\n\n // Calculate variance\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / (values.length - 1);\n\n // Return standard deviation\n return { value: Math.sqrt(variance), error: undefined };\n }\n\n private calculateVar(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length < 2) {\n return { value: 0, error: undefined };\n }\n\n // Calculate mean\n const mean = values.reduce((sum, val) => sum + val, 0) / values.length;\n\n // Calculate variance (sample variance - divide by n-1 like STDEV)\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / (values.length - 1);\n\n return { value: variance, error: undefined };\n }\n\n private calculateMedian(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n\n // Sort the values\n const sortedValues = values.sort((a, b) => a - b);\n\n if (sortedValues.length % 2 === 0) {\n // Even number of values - return average of middle two\n const mid1 = sortedValues[sortedValues.length / 2 - 1];\n const mid2 = sortedValues[sortedValues.length / 2];\n return { value: (mid1 + mid2) / 2, error: undefined };\n }\n // Odd number of values - return middle value\n return { value: sortedValues[Math.floor(sortedValues.length / 2)], error: undefined };\n }\n\n private calculateProduct(args: unknown[]): { value: unknown; error?: string } {\n let product = 1;\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n\n for (const value of values) {\n product *= value;\n }\n\n return { value: product, error: undefined };\n }\n\n private calculateIf(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 3) {\n return { value: null, error: 'IF requires exactly 3 arguments' };\n }\n\n // 第一个参数是条件\n const condition = this.isTruthy(args[0]);\n\n // 返回对应的结果\n return { value: condition ? args[1] : args[2], error: undefined };\n }\n\n private calculateAnd(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1) {\n return { value: null, error: 'AND requires at least 1 argument' };\n }\n for (const arg of args) {\n if (!this.isTruthy(arg)) {\n return { value: false, error: undefined };\n }\n }\n return { value: true, error: undefined };\n }\n\n private calculateOr(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1) {\n return { value: null, error: 'OR requires at least 1 argument' };\n }\n for (const arg of args) {\n if (this.isTruthy(arg)) {\n return { value: true, error: undefined };\n }\n }\n return { value: false, error: undefined };\n }\n\n private calculateNot(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'NOT requires exactly 1 argument' };\n }\n return { value: !this.isTruthy(args[0]), error: undefined };\n }\n\n private calculateToday(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'TODAY requires no arguments' };\n }\n return { value: new Date(), error: undefined };\n }\n\n private calculateNow(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'NOW requires no arguments' };\n }\n return { value: new Date(), error: undefined };\n }\n\n private flattenArgs(args: unknown[]): unknown[] {\n const result: unknown[] = [];\n for (const arg of args) {\n if (Array.isArray(arg)) {\n result.push(...arg);\n } else {\n result.push(arg);\n }\n }\n return result;\n }\n\n private flattenArgsWithRanges(args: unknown[]): unknown[] {\n const result: unknown[] = [];\n for (const arg of args) {\n if (Array.isArray(arg)) {\n result.push(...arg);\n } else if (typeof arg === 'string' && arg.includes(':')) {\n // 处理范围引用,如 A2:A4\n try {\n const rangeValues = this.getRangeValuesFromExpr(arg);\n result.push(...rangeValues);\n } catch {\n // 如果范围解析失败,保持原样\n result.push(arg);\n }\n } else {\n result.push(arg);\n }\n }\n return result;\n }\n\n private isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (value === false || value === 0 || value === '') {\n return false;\n }\n if (value === true) {\n return true;\n }\n\n // 处理字符串\n if (typeof value === 'string') {\n if (value.toLowerCase() === 'false') {\n return false;\n }\n if (value.toLowerCase() === 'true') {\n return true;\n }\n }\n\n const num = Number(value);\n if (!isNaN(num)) {\n return num !== 0;\n }\n\n return true; // 非空值视为true\n }\n\n private evaluateArithmeticWithFunctions(expr: string): { value: unknown; error?: string } {\n try {\n // 这个函数处理包含函数调用的算术表达式,如 SUM(A2:A4)+AVERAGE(A2:A4)\n\n // 1. 首先找到所有的函数调用\n const functionMatches = [];\n const functionRegex = /[A-Z]+\\([^)]*\\)/g;\n let match;\n\n while ((match = functionRegex.exec(expr)) !== null) {\n functionMatches.push({\n match: match[0],\n start: match.index,\n end: match.index + match[0].length\n });\n }\n\n // 2. 计算每个函数的值\n let processedExpr = expr;\n const functionValues = [];\n\n for (const funcMatch of functionMatches) {\n const funcResult = this.parseExpression(funcMatch.match);\n if (funcResult.error) {\n return { value: null, error: `Error in function ${funcMatch.match}: ${funcResult.error}` };\n }\n functionValues.push(funcResult.value);\n // 用占位符替换函数调用,避免重复处理\n processedExpr = processedExpr.replace(funcMatch.match, `__FUNC_${functionValues.length - 1}__`);\n }\n\n // 3. 处理剩余的单元格引用\n const cellRefs = processedExpr.match(/[A-Z]+[0-9]+/g) || [];\n for (const cellRef of cellRefs) {\n const value = this.getCellValueByA1(cellRef);\n processedExpr = processedExpr.replace(cellRef, String(value));\n }\n\n // 4. 将占位符替换回实际值\n for (let i = 0; i < functionValues.length; i++) {\n processedExpr = processedExpr.replace(`__FUNC_${i}__`, String(functionValues[i]));\n }\n\n // 5. 计算最终的算术表达式\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const result = Function('\"use strict\"; return (' + processedExpr + ')')();\n return { value: result, error: undefined };\n } catch (error) {\n return { value: null, error: 'Basic arithmetic evaluation failed' };\n }\n }\n\n private getCellValueByA1(a1Notation: string): unknown {\n try {\n let sheetKey = this.activeSheetKey || this.reverseSheets.get(0) || 'Sheet1';\n let cellRef = a1Notation;\n\n // 检查是否包含工作表前缀\n if (a1Notation.includes('!')) {\n const parts = a1Notation.split('!');\n if (parts.length === 2) {\n sheetKey = parts[0];\n cellRef = parts[1];\n }\n }\n\n const { row, col } = this.parseA1Notation(cellRef);\n const cell: FormulaCell = { sheet: sheetKey, row, col };\n return this.getCellValue(cell).value;\n } catch {\n return 0;\n }\n }\n\n private getRangeValuesFromExpr(expr: string): unknown[] {\n try {\n if (!expr.includes(':')) {\n return [this.getCellValueByA1(expr)];\n }\n\n // 解析范围引用,可能包含工作表前缀,如 DataSheet!A2:A4\n let sheetKey = this.activeSheetKey || this.reverseSheets.get(0) || 'Sheet1';\n let rangeExpr = expr;\n\n // 检查是否包含工作表前缀\n if (expr.includes('!')) {\n const parts = expr.split('!');\n if (parts.length === 2) {\n sheetKey = parts[0];\n rangeExpr = parts[1];\n }\n }\n\n const [start, end] = rangeExpr.split(':');\n const startCell = this.parseA1Notation(start.trim());\n const endCell = this.parseA1Notation(end.trim());\n\n const values: unknown[] = [];\n\n for (let row = startCell.row; row <= endCell.row; row++) {\n for (let col = startCell.col; col <= endCell.col; col++) {\n const cell: FormulaCell = { sheet: sheetKey, row, col };\n values.push(this.getCellValue(cell).value);\n }\n }\n\n return values;\n } catch {\n return [];\n }\n }\n\n // 公共方法\n getCellValue(cell: FormulaCell): FormulaResult {\n try {\n const sheetId = this.sheets.get(cell.sheet);\n if (sheetId === undefined) {\n return { value: '', error: undefined };\n }\n\n const sheet = this.sheetData.get(sheetId);\n\n if (!sheet || !sheet[cell.row] || sheet[cell.row][cell.col] === undefined || sheet[cell.row][cell.col] === null) {\n return { value: '', error: undefined };\n }\n\n const value = sheet[cell.row][cell.col];\n\n // 如果是公式,计算其结果\n if (typeof value === 'string' && value.startsWith('=')) {\n const result = this.calculateFormula(value);\n return result;\n }\n\n // 如果是公式错误\n if (value instanceof FormulaError) {\n return { value: null, error: value.message };\n }\n\n return { value, error: undefined };\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n getCellFormula(cell: FormulaCell): string | undefined {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.get(cellKey);\n }\n\n isCellFormula(cell: FormulaCell): boolean {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.has(cellKey);\n }\n\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n const cellKey = this.getCellKey(cell);\n const dependents = this.dependents.get(cellKey);\n\n if (!dependents) {\n return [];\n }\n\n const result: FormulaCell[] = [];\n for (const dependent of dependents) {\n const parsed = this.parseCellKey(dependent);\n if (parsed) {\n result.push(parsed);\n }\n }\n\n return result;\n }\n\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n const cellKey = this.getCellKey(cell);\n const dependencies = this.dependencies.get(cellKey);\n\n if (!dependencies) {\n return [];\n }\n\n const result: FormulaCell[] = [];\n for (const dependency of dependencies) {\n const parsed = this.parseCellKey(dependency);\n if (parsed) {\n result.push(parsed);\n }\n }\n\n return result;\n }\n\n getAvailableFunctions(): string[] {\n return [...supportedFunctions];\n }\n\n // 新增方法:验证公式语法(仅语法验证,不计算)\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 仅进行语法验证,不进行实际计算\n if (!formula.startsWith('=')) {\n return { isValid: true }; // 非公式总是有效的\n }\n\n const expression = formula.substring(1).trim();\n if (!expression) {\n return { isValid: false, error: 'Empty expression' };\n }\n\n // 基本语法检查\n this.validateExpressionStructure(expression);\n\n // 验证函数名是否有效\n this.validateFunctionNames(expression);\n\n return { isValid: true };\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid formula syntax'\n };\n }\n }\n\n private validateFunctionNames(expr: string): void {\n // 匹配函数调用模式\n const functionPattern = /([A-Z]+)\\s*\\(/gi;\n let match;\n\n while ((match = functionPattern.exec(expr)) !== null) {\n const funcName = match[1].toUpperCase();\n if (!supportedFunctions.includes(funcName)) {\n throw new Error(`Unknown function: ${funcName}`);\n }\n }\n }\n\n private validateExpressionStructure(expr: string): void {\n // 检查括号是否匹配\n const openParenCount = (expr.match(/\\(/g) || []).length;\n const closeParenCount = (expr.match(/\\)/g) || []).length;\n if (openParenCount !== closeParenCount) {\n throw new Error('Unmatched parentheses');\n }\n\n // 检查引号是否匹配\n const doubleQuoteCount = (expr.match(/\"/g) || []).length;\n if (doubleQuoteCount % 2 !== 0) {\n throw new Error('Unmatched quotes');\n }\n\n // 检查是否有未完成的操作符\n if (expr.match(/[+\\-*/^&%<>=]$/)) {\n throw new Error('Expression ends with operator');\n }\n\n // 检查是否有连续的逗号\n if (expr.match(/,,/)) {\n throw new Error('Consecutive commas');\n }\n\n // 检查是否有未完成的函数参数\n if (expr.match(/\\([^)]*,\\s*\\)/) || expr.match(/,\\s*\\)/) || expr.match(/\\(\\s*\\)/)) {\n throw new Error('Invalid function arguments');\n }\n\n // 检查是否有连续的操作符 (如 1++1)\n if (expr.match(/[+\\-*/^&%][+\\-*/^&%]/)) {\n throw new Error('Basic arithmetic evaluation failed');\n }\n }\n\n release(): void {\n this.sheets.clear();\n this.reverseSheets.clear();\n this.sheetData.clear();\n this.formulaCells.clear();\n this.dependencies.clear();\n this.dependents.clear();\n this.nextSheetId = 0;\n }\n\n // 新增方法:导出公式\n exportFormulas(sheetKey: string): Record<string, string> {\n const result: Record<string, string> = {};\n const sheetId = this.sheets.get(sheetKey);\n\n if (sheetId === undefined) {\n return result;\n }\n\n // 遍历所有公式单元格\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey, formula] = entry;\n const cell = this.parseCellKey(cellKey);\n if (cell && cell.sheet === sheetKey) {\n const a1Notation = this.getA1Notation(cell.row, cell.col);\n result[a1Notation] = formula;\n }\n }\n\n return result;\n }\n\n // 新增方法:获取所有工作表\n getAllSheets(): Array<{ key: string; id: number; name: string }> {\n const result: Array<{ key: string; id: number; name: string }> = [];\n\n for (const entry of Array.from(this.sheets.entries())) {\n const [sheetKey, sheetId] = entry;\n result.push({\n key: sheetKey,\n id: sheetId,\n name: sheetKey // 使用key作为名称\n });\n }\n\n return result;\n }\n\n // 新增方法:按依赖关系对公式进行排序\n sortFormulasByDependency(sheetKey: string, formulas: Record<string, string>): [string, string][] {\n try {\n // 创建临时依赖图用于排序\n const tempDependencies = new Map<string, Set<string>>();\n const tempDependents = new Map<string, Set<string>>();\n\n // 分析所有公式的依赖关系\n for (const [cellRef, formula] of Object.entries(formulas)) {\n const cellKey = `${sheetKey}!${cellRef}`;\n const dependencies = this.extractCellReferences(formula, sheetKey);\n\n tempDependencies.set(cellKey, new Set(dependencies));\n\n // 建立反向依赖关系\n for (const dep of dependencies) {\n const depDependents = tempDependents.get(dep) || new Set();\n depDependents.add(cellKey);\n tempDependents.set(dep, depDependents);\n }\n }\n\n // 使用拓扑排序\n const visited = new Set<string>();\n const tempVisited = new Set<string>();\n const result: [string, string][] = [];\n\n const visit = (cellKey: string): void => {\n if (visited.has(cellKey)) {\n return;\n }\n if (tempVisited.has(cellKey)) {\n console.warn(`Circular dependency detected involving cell ${cellKey}`);\n return;\n }\n\n tempVisited.add(cellKey);\n\n const deps = tempDependencies.get(cellKey) || new Set();\n for (const dep of deps) {\n if (tempDependencies.has(dep)) {\n // 只访问也是公式的依赖\n visit(dep);\n }\n }\n\n tempVisited.delete(cellKey);\n visited.add(cellKey);\n\n // 提取单元格引用(移除工作表前缀)\n const cellRef = cellKey.substring(sheetKey.length + 1);\n const formula = formulas[cellRef];\n if (formula) {\n result.push([cellRef, formula]);\n }\n };\n\n // 访问所有公式单元格\n for (const cellKey of tempDependencies.keys()) {\n if (!visited.has(cellKey)) {\n visit(cellKey);\n }\n }\n\n return result;\n } catch (error) {\n console.warn(`Failed to sort formulas by dependency for sheet ${sheetKey}:`, error);\n // 如果排序失败,返回原始顺序\n return Object.entries(formulas);\n }\n }\n\n // 新增方法:删除工作表\n removeSheet(sheetKey: string): void {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId === undefined) {\n return;\n }\n\n // 不能删除最后一个sheet\n if (this.sheets.size <= 1) {\n throw new Error('Cannot remove the last sheet');\n }\n\n // 删除工作表数据\n this.sheetData.delete(sheetId);\n this.sheets.delete(sheetKey);\n this.reverseSheets.delete(sheetId);\n\n // 删除相关的公式和依赖关系\n const keysToRemove: string[] = [];\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey] = entry;\n if (cellKey.startsWith(`${sheetKey}!`)) {\n keysToRemove.push(cellKey);\n }\n }\n\n for (const cellKey of keysToRemove) {\n this.formulaCells.delete(cellKey);\n this.dependencies.delete(cellKey);\n this.dependents.delete(cellKey);\n }\n\n // 清理依赖关系中的引用\n for (const entry of Array.from(this.dependencies.entries())) {\n const [cellKey, deps] = entry;\n const newDeps = new Set<string>();\n for (const dep of deps) {\n if (!dep.startsWith(`${sheetKey}!`)) {\n newDeps.add(dep);\n }\n }\n if (newDeps.size === 0) {\n this.dependencies.delete(cellKey);\n } else {\n this.dependencies.set(cellKey, newDeps);\n }\n }\n\n for (const entry of Array.from(this.dependents.entries())) {\n const [cellKey, dependents] = entry;\n const newDependents = new Set<string>();\n for (const dep of dependents) {\n if (!dep.startsWith(`${sheetKey}!`)) {\n newDependents.add(dep);\n }\n }\n if (newDependents.size === 0) {\n this.dependents.delete(cellKey);\n } else {\n this.dependents.set(cellKey, newDependents);\n }\n }\n }\n\n // 新增方法:重命名工作表\n renameSheet(oldKey: string, newKey: string): void {\n const sheetId = this.sheets.get(oldKey);\n if (sheetId === undefined) {\n throw new Error(`Sheet not found: ${oldKey}`);\n }\n\n if (this.sheets.has(newKey)) {\n throw new Error(`Sheet already exists: ${newKey}`);\n }\n\n // 更新工作表映射\n this.sheets.delete(oldKey);\n this.sheets.set(newKey, sheetId);\n this.reverseSheets.set(sheetId, newKey);\n\n // 更新公式单元格的键\n const formulaEntriesToUpdate: [string, string][] = [];\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey, formula] = entry;\n if (cellKey.startsWith(`${oldKey}!`)) {\n const newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n formulaEntriesToUpdate.push([newCellKey, formula]);\n this.formulaCells.delete(cellKey);\n }\n }\n\n for (const [newCellKey, formula] of formulaEntriesToUpdate) {\n this.formulaCells.set(newCellKey, formula);\n }\n\n // 更新依赖关系的键\n const dependencyEntriesToUpdate: [string, Set<string>][] = [];\n for (const entry of Array.from(this.dependencies.entries())) {\n const [cellKey, deps] = entry;\n let newCellKey = cellKey;\n const newDeps = new Set<string>();\n\n if (cellKey.startsWith(`${oldKey}!`)) {\n newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n }\n\n for (const dep of deps) {\n if (dep.startsWith(`${oldKey}!`)) {\n newDeps.add(dep.replace(`${oldKey}!`, `${newKey}!`));\n } else {\n newDeps.add(dep);\n }\n }\n\n if (newCellKey !== cellKey || !this.areSetsEqual(newDeps, deps)) {\n dependencyEntriesToUpdate.push([newCellKey, newDeps]);\n this.dependencies.delete(cellKey);\n }\n }\n\n for (const [newCellKey, newDeps] of dependencyEntriesToUpdate) {\n this.dependencies.set(newCellKey, newDeps);\n }\n\n // 更新被依赖关系的键\n const dependentEntriesToUpdate: [string, Set<string>][] = [];\n for (const entry of Array.from(this.dependents.entries())) {\n const [cellKey, dependents] = entry;\n let newCellKey = cellKey;\n const newDependents = new Set<string>();\n\n if (cellKey.startsWith(`${oldKey}!`)) {\n newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n }\n\n for (const dep of dependents) {\n if (dep.startsWith(`${oldKey}!`)) {\n newDependents.add(dep.replace(`${oldKey}!`, `${newKey}!`));\n } else {\n newDependents.add(dep);\n }\n }\n\n if (newCellKey !== cellKey || !this.areSetsEqual(newDependents, dependents)) {\n dependentEntriesToUpdate.push([newCellKey, newDependents]);\n this.dependents.delete(cellKey);\n }\n }\n\n for (const [newCellKey, newDependents] of dependentEntriesToUpdate) {\n this.dependents.set(newCellKey, newDependents);\n }\n }\n\n // 辅助方法:比较两个Set是否相等\n private areSetsEqual(set1: Set<string>, set2: Set<string>): boolean {\n if (set1.size !== set2.size) {\n return false;\n }\n for (const item of set1) {\n if (!set2.has(item)) {\n return false;\n }\n }\n return true;\n }\n\n // 依赖关系管理\n private updateDependencies(cellKey: string, formula: string): void {\n // 清除旧的依赖关系\n const oldDeps = this.dependencies.get(cellKey) || new Set();\n for (const dep of oldDeps) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.delete(cellKey);\n if (depDependents.size === 0) {\n this.dependents.delete(dep);\n } else {\n this.dependents.set(dep, depDependents);\n }\n }\n\n // 从cellKey中提取当前工作表上下文\n const currentSheet = this.parseCellKey(cellKey)?.sheet || 'Sheet1';\n\n // 提取新的依赖关系,传入当前工作表上下文\n const dependencies = this.extractCellReferences(formula, currentSheet);\n this.dependencies.set(cellKey, new Set(dependencies));\n\n // 建立新的依赖关系\n for (const dep of dependencies) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.add(cellKey);\n this.dependents.set(dep, depDependents);\n }\n }\n\n private extractCellReferences(formula: string, currentSheet: string = 'Sheet1'): string[] {\n if (!formula || typeof formula !== 'string' || !formula.startsWith('=')) {\n return [];\n }\n\n const expression = formula.substring(1).trim();\n const references: string[] = [];\n\n try {\n this.extractReferencesFromExpression(expression, references, currentSheet);\n } catch (error) {\n console.warn('Failed to extract cell references:', error);\n }\n\n return [...new Set(references)];\n }\n\n private extractReferencesFromExpression(expr: string, references: string[], currentSheet: string = 'Sheet1'): void {\n // 移除字符串字面量,避免误匹配\n let cleanExpr = expr.replace(/\"[^\"]*\"/g, '');\n cleanExpr = cleanExpr.replace(/'[^']*'/g, '');\n\n // 匹配单元格引用 (A1, B2, Sheet1!A1, 等)\n const cellRefPattern = /(?:([A-Za-z0-9_]+)!)?([A-Z]+[0-9]+)(?::([A-Z]+[0-9]+))?/g;\n let match;\n\n while ((match = cellRefPattern.exec(cleanExpr)) !== null) {\n const sheetName = match[1] || currentSheet; // 使用当前工作表上下文,而不是默认Sheet1\n const startCell = match[2];\n const endCell = match[3];\n\n if (endCell) {\n // 范围引用,如 A1:B2 - 需要展开为所有单个单元格\n const expandedRefs = this.expandRangeToCells(sheetName, startCell, endCell);\n references.push(...expandedRefs);\n } else {\n // 单个单元格引用,如 A1\n references.push(`${sheetName}!${startCell}`);\n }\n }\n\n // 也匹配单独的单元格引用\n const singleCellPattern = /[A-Z]+[0-9]+/g;\n const singleMatches = cleanExpr.match(singleCellPattern) || [];\n for (const match of singleMatches) {\n if (!references.some(ref => ref.endsWith(match))) {\n references.push(`${currentSheet}!${match}`); // 使用当前工作表上下文\n }\n }\n }\n\n private expandRangeToCells(sheetName: string, startCell: string, endCell: string): string[] {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\n\n const cells: string[] = [];\n\n // 确保start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n cells.push(`${sheetName}!${this.getA1Notation(row, col)}`);\n }\n }\n\n return cells;\n } catch {\n // 如果解析失败,返回原始范围\n return [`${sheetName}!${startCell}:${endCell}`];\n }\n }\n\n private recalculateDependents(changedCell: FormulaCell): void {\n this.recalculateDependentsWithTracking(changedCell, new Set<string>());\n }\n\n private recalculateDependentsWithTracking(changedCell: FormulaCell, visited: Set<string>): void {\n const cellKey = this.getCellKey(changedCell);\n\n // 防止循环依赖导致的无限递归\n if (visited.has(cellKey)) {\n return;\n }\n\n const dependents = this.dependents.get(cellKey);\n\n if (!dependents || dependents.size === 0) {\n return;\n }\n\n // 按依赖顺序重新计算\n const sortedDependents = this.sortCellsByDependency([...dependents]);\n\n for (const dependentKey of sortedDependents) {\n this.recalculateSingleCellWithTracking(dependentKey, visited);\n }\n }\n\n private recalculateSingleCellWithTracking(cellKey: string, visited: Set<string>): void {\n // 防止循环依赖导致的无限递归\n if (visited.has(cellKey)) {\n return;\n }\n\n const formula = this.formulaCells.get(cellKey);\n if (!formula) {\n return;\n }\n\n const cell = this.parseCellKey(cellKey);\n if (!cell) {\n return;\n }\n\n // 重新计算公式并更新值\n const result = this.calculateFormula(formula);\n if (result.error) {\n return;\n }\n\n const sheetId = this.sheets.get(cell.sheet);\n if (sheetId === undefined) {\n return;\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet || !sheet[cell.row] || sheet[cell.row][cell.col] === undefined) {\n return;\n }\n\n const oldValue = sheet[cell.row][cell.col];\n const newValue = result.value;\n sheet[cell.row][cell.col] = newValue;\n\n // 如果值发生了变化,递归重新计算其依赖\n if (oldValue !== newValue) {\n // 将当前单元格添加到访问集合中,防止循环\n visited.add(cellKey);\n this.recalculateDependentsWithTracking(cell, visited);\n // 从访问集合中移除,允许在其他路径中重新访问\n visited.delete(cellKey);\n }\n }\n\n private sortCellsByDependency(cells: string[]): string[] {\n const visited = new Set<string>();\n const tempVisited = new Set<string>();\n const result: string[] = [];\n\n const visit = (cell: string): void => {\n if (visited.has(cell)) {\n return;\n }\n if (tempVisited.has(cell)) {\n console.warn(`Circular dependency detected involving cell ${cell}`);\n return;\n }\n\n tempVisited.add(cell);\n\n const deps = this.dependencies.get(cell) || new Set();\n for (const dep of deps) {\n if (cells.includes(dep)) {\n visit(dep);\n }\n }\n\n tempVisited.delete(cell);\n visited.add(cell);\n result.push(cell);\n };\n\n for (const cell of cells) {\n if (!visited.has(cell)) {\n visit(cell);\n }\n }\n\n return result;\n }\n\n /**\n * 调整公式引用 - 当插入或删除行/列时 (MIT兼容)\n * @param sheetKey 工作表键\n * @param type 调整类型 ('insert' | 'delete')\n * @param dimension 维度 ('row' | 'column')\n * @param index 插入/删除的位置索引\n * @param count 插入/删除的数量\n */\n adjustFormulaReferences(\n sheetKey: string,\n type: 'insert' | 'delete',\n dimension: 'row' | 'column',\n index: number,\n count: number,\n totalColCount: number,\n totalRowCount: number\n ): { adjustedCells: FormulaCell[]; movedCells: FormulaCell[] } {\n try {\n const adjustedFormulas: Array<{ cell: FormulaCell; oldFormula: string; newFormula: string }> = [];\n const movedFormulas: Array<{ oldCellKey: string; newCell: FormulaCell; formula: string }> = [];\n const deletedCells: Set<string> = new Set();\n\n // 第一步:收集被删除的单元格\n if (type === 'delete') {\n for (let i = 0; i < count; i++) {\n if (dimension === 'row') {\n // 收集被删除行的所有单元格\n for (let col = 0; col < totalColCount; col++) {\n // 假设最大1000列\n const deletedCell = { sheet: sheetKey, row: index + i, col };\n const deletedCellKey = this.getCellKey(deletedCell);\n deletedCells.add(deletedCellKey);\n }\n } else if (dimension === 'column') {\n // 收集被删除列的所有单元格\n for (let row = 0; row < totalRowCount; row++) {\n // 假设最大100万行\n const deletedCell = { sheet: sheetKey, row, col: index + i };\n const deletedCellKey = this.getCellKey(deletedCell);\n deletedCells.add(deletedCellKey);\n }\n }\n }\n }\n\n // 第二步:处理公式单元格\n const entries = Array.from(this.formulaCells.entries());\n\n for (const [cellKey, formula] of entries) {\n const cell = this.parseCellKey(cellKey);\n if (!cell || cell.sheet !== sheetKey) {\n continue; // 跳过其他工作表的公式\n }\n\n // 检查公式单元格本身是否需要移动\n const newCell = { ...cell };\n let cellNeedsMove = false;\n\n if (dimension === 'row') {\n if (type === 'insert' && cell.row >= index) {\n // 插入行:在插入点之后的单元格需要向后移动\n newCell.row = cell.row + count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.row > index) {\n // 删除行:在删除点之后的单元格需要向前移动\n newCell.row = cell.row - count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.row >= index && cell.row < index + count) {\n // 删除的行:这些公式单元格将被删除\n this.formulaCells.delete(cellKey);\n continue;\n }\n } else if (dimension === 'column') {\n if (type === 'insert' && cell.col >= index) {\n // 插入列:在插入点之后的单元格需要向后移动\n newCell.col = cell.col + count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.col > index) {\n // 删除列:在删除点之后的单元格需要向前移动\n newCell.col = cell.col - count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.col >= index && cell.col < index + count) {\n // 删除的列:这些公式单元格将被删除\n this.formulaCells.delete(cellKey);\n continue;\n }\n }\n\n // 调整公式引用,传入被删除的单元格信息\n const newFormula = this.adjustFormulaReference(formula, type, dimension, index, count);\n\n if (cellNeedsMove) {\n // 如果单元格位置发生变化,需要移动公式\n // 注意:公式中的引用已经根据操作类型调整了,这是正确的\n movedFormulas.push({ oldCellKey: cellKey, newCell, formula: newFormula });\n // 删除旧的公式条目和依赖关系\n this.formulaCells.delete(cellKey);\n this.clearDependencies(cellKey);\n } else if (newFormula !== formula) {\n // 如果只有公式引用发生变化,更新原单元格\n adjustedFormulas.push({ cell, oldFormula: formula, newFormula });\n // 清除旧的依赖关系,将在批量更新时重新建立\n this.clearDependencies(cellKey);\n }\n }\n\n // 处理移动的公式\n for (const { newCell, formula } of movedFormulas) {\n const newCellKey = this.getCellKey(newCell);\n\n // Debug: Check if this is the D6 formula\n // if (newCellKey === 'Sheet1!D6') {\n // const fs = require('fs');\n // fs.appendFileSync('/Users/bytedance/VisActor/VTable3/debug_formula.log', `DEBUG: Moving D6 formula to ${newCellKey}: ${formula}\\n`);\n // }\n\n this.formulaCells.set(newCellKey, formula);\n // 重新建立依赖关系\n this.updateDependencies(newCellKey, formula);\n // 更新单元格内容但不重新计算依赖(因为已经更新了)\n this.setCellContentWithoutDependencyUpdate(newCell, formula);\n }\n\n // 批量更新调整后的公式\n for (const { cell, newFormula } of adjustedFormulas) {\n const cellKey = this.getCellKey(cell);\n // 更新公式存储\n this.formulaCells.set(cellKey, newFormula);\n // 更新依赖关系\n this.updateDependencies(cellKey, newFormula);\n // 更新单元格内容但不重新计算依赖(因为已经更新了)\n this.setCellContentWithoutDependencyUpdate(cell, newFormula);\n }\n\n const totalChanges = adjustedFormulas.length + movedFormulas.length;\n if (totalChanges > 0) {\n // console.log(\n // `Adjusted ${adjustedFormulas.length} formulas and moved ${movedFormulas.length} ` +\n // `formulas for ${type} ${dimension} at ${index}`\n // );\n }\n\n // 返回所有受影响的单元格\n const adjustedCells = adjustedFormulas.map(item => item.cell);\n const movedCells = movedFormulas.map(item => item.newCell);\n\n return { adjustedCells, movedCells };\n } catch (error) {\n console.error(`Failed to adjust formula references for ${type} ${dimension} at ${index}:`, error);\n return { adjustedCells: [], movedCells: [] };\n }\n }\n\n /**\n * 调整单个公式引用 (MIT兼容)\n * @param formula 原公式\n * @param type 调整类型 ('insert' | 'delete')\n * @param dimension 维度 ('row' | 'column')\n * @param index 插入/删除的位置索引\n * @param count 插入/删除的数量\n * @returns 调整后的公式\n */\n private adjustFormulaReference(\n formula: string,\n type: 'insert' | 'delete',\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): string {\n if (!formula || !formula.startsWith('=')) {\n return formula;\n }\n\n const expression = formula.substring(1);\n\n // 使用正则表达式匹配单元格引用 (A1, B2, 等) 和范围引用 (A1:B2)\n const cellRefRegex = /([A-Z]+)([0-9]+)/g;\n const rangeRefRegex = /([A-Z]+[0-9]+):([A-Z]+[0-9]+)/g;\n\n let newExpression = expression;\n let match: RegExpExecArray | null;\n const replacements: Array<{ start: number; end: number; replacement: string }> = [];\n\n // 首先处理范围引用\n while ((match = rangeRefRegex.exec(expression)) !== null) {\n const fullRangeMatch = match[0];\n const startCell = match[1];\n const endCell = match[2];\n\n // Debug: Check B2:B5 case\n\n if (type === 'delete') {\n // 检查范围是否包含被删除的单元格\n const rangeContainsDeletedCells = this.rangeContainsDeletedCells(startCell, endCell, dimension, index, count);\n\n if (rangeContainsDeletedCells) {\n // 范围包含被删除的单元格,需要调整范围\n const newRange = this.adjustRangeForDeletion(startCell, endCell, dimension, index, count);\n if (newRange !== fullRangeMatch) {\n replacements.push({\n start: match.index,\n end: match.index + fullRangeMatch.length,\n replacement: newRange\n });\n }\n }\n }\n }\n\n // 重置正则表达式,避免与范围引用冲突\n cellRefRegex.lastIndex = 0;\n\n while ((match = cellRefRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const colLetters = match[1];\n const rowNumber = parseInt(match[2], 10);\n\n // 检查这个单元格引用是否已经被范围引用处理过\n const currentMatchIndex = match.index;\n const isPartOfRange = replacements.some(\n replacement => currentMatchIndex >= replacement.start && currentMatchIndex < replacement.end\n );\n\n if (isPartOfRange) {\n continue;\n }\n\n let needsAdjustment = false;\n let newRowNumber = rowNumber;\n let newColLetters = colLetters;\n\n if (dimension === 'row') {\n // Convert 1-based row number to 0-based for comparison\n const zeroBasedRowNumber = rowNumber - 1;\n\n if (type === 'insert' && zeroBasedRowNumber >= index) {\n // 插入行:在插入点之后的行需要向后移动\n newRowNumber = rowNumber + count;\n needsAdjustment = true;\n } else if (type === 'delete' && zeroBasedRowNumber >= index) {\n // 删除行:在删除点及之后的行需要向前移动\n if (zeroBasedRowNumber >= index + count) {\n // 完全在删除范围之后的行\n newRowNumber = rowNumber - count;\n needsAdjustment = true;\n } else if (zeroBasedRowNumber >= index && zeroBasedRowNumber < index + count) {\n // 在删除范围内的行:需要调整到删除前的位置\n newRowNumber = index; // 调整到删除位置(即原来的位置-1)\n needsAdjustment = true;\n }\n }\n } else if (dimension === 'column') {\n const colIndex = this.columnLettersToIndex(colLetters);\n\n if (type === 'insert' && colIndex >= index) {\n // 插入列:在插入点之后的列需要向后移动\n newColLetters = this.indexToColumnLetters(colIndex + count);\n needsAdjustment = true;\n } else if (type === 'delete' && colIndex >= index) {\n // 删除列:在删除点及之后的列需要向前移动\n if (colIndex >= index + count) {\n // 完全在删除范围之后的列\n newColLetters = this.indexToColumnLetters(colIndex - count);\n needsAdjustment = true;\n } else if (colIndex >= index && colIndex < index + count) {\n // 在删除范围内的列:需要调整到删除前的位置\n newColLetters = this.indexToColumnLetters(index); // 调整到删除位置\n needsAdjustment = true;\n }\n }\n }\n if (needsAdjustment) {\n let replacement: string;\n if (dimension === 'row' && newRowNumber === index) {\n // 行被调整到删除位置,表示该行被删除\n replacement = '#REF!';\n } else if (\n dimension === 'column' &&\n this.indexToColumnLetters(this.columnLettersToIndex(newColLetters)) === this.indexToColumnLetters(index)\n ) {\n // 列被调整到删除位置,表示该列被删除\n replacement = '#REF!';\n } else {\n replacement = newColLetters + newRowNumber;\n }\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement: replacement\n });\n }\n }\n\n // 按位置倒序排序,以便从后向前替换\n replacements.sort((a, b) => b.start - a.start);\n\n // 执行替换\n for (const { start, end, replacement } of replacements) {\n newExpression = newExpression.substring(0, start) + replacement + newExpression.substring(end);\n }\n\n return '=' + newExpression;\n }\n\n /**\n * 将列字母转换为索引 (A=0, B=1, ..., Z=25, AA=26, 等) (MIT兼容)\n * @param letters 列字母\n * @returns 列索引\n */\n private columnLettersToIndex(letters: string): number {\n let index = 0;\n for (let i = 0; i < letters.length; i++) {\n index = index * 26 + (letters.charCodeAt(i) - 64); // A=1, B=2, etc.\n }\n return index - 1; // Convert to 0-based index\n }\n\n /**\n * 将列索引转换为字母 (0=A, 1=B, ..., 25=Z, 26=AA, 等) (MIT兼容)\n * @param index 列索引\n * @returns 列字母\n */\n private indexToColumnLetters(index: number): string {\n let letters = '';\n do {\n letters = String.fromCharCode(65 + (index % 26)) + letters;\n index = Math.floor(index / 26) - 1;\n } while (index >= 0);\n return letters;\n }\n\n /**\n * 检查范围是否包含被删除的单元格\n * @param startCell 范围起始单元格 (如 \"A1\")\n * @param endCell 范围结束单元格 (如 \"B2\")\n * @param dimension 删除维度 ('row' | 'column')\n * @param index 删除起始索引\n * @param count 删除数量\n * @param deletedCells 被删除的单元格集合\n * @param currentSheet 当前工作表\n * @returns 是否包含被删除的单元格\n */\n private rangeContainsDeletedCells(\n startCell: string,\n endCell: string,\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): boolean {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\n\n // 确保start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n if (dimension === 'row') {\n // 检查删除的行是否在范围内\n const deleteStartRow = index;\n const deleteEndRow = index + count - 1;\n\n // 检查是否有重叠\n if (deleteEndRow >= minRow && deleteStartRow <= maxRow) {\n return true;\n }\n } else if (dimension === 'column') {\n // 检查删除的列是否在范围内\n const deleteStartCol = index;\n const deleteEndCol = index + count - 1;\n\n // 检查是否有重叠\n if (deleteEndCol >= minCol && deleteStartCol <= maxCol) {\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * 调整范围引用以处理删除操作\n * @param startCell 范围起始单元格 (如 \"A1\")\n * @param endCell 范围结束单元格 (如 \"B2\")\n * @param dimension 删除维度 ('row' | 'column')\n * @param index 删除起始索引\n * @param count 删除数量\n * @param deletedCells 被删除的单元格集合\n * @param currentSheet 当前工作表\n * @returns 调整后的范围引用\n */\n private adjustRangeForDeletion(\n startCell: string,\n endCell: string,\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): string {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\n\n // 确保start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n let newMinRow = minRow;\n let newMaxRow = maxRow;\n let newMinCol = minCol;\n let newMaxCol = maxCol;\n\n if (dimension === 'row') {\n const deleteStartRow = index;\n const deleteEndRow = index + count - 1;\n\n // 检查整个范围是否被删除\n const entireRangeDeleted = minRow >= deleteStartRow && maxRow <= deleteEndRow;\n if (entireRangeDeleted) {\n return '#REF!';\n }\n\n // 调整起始行\n if (minRow >= deleteStartRow && minRow <= deleteEndRow) {\n // 起始行被删除 - 调整到删除边界位置(保持相同位置)\n newMinRow = deleteStartRow;\n } else if (minRow > deleteEndRow) {\n // 起始行在删除范围之后,需要向前移动\n newMinRow = minRow - count;\n if (newMinRow < 0) {\n newMinRow = 0; // 确保不为负数\n }\n }\n\n // 调整结束行\n if (maxRow >= deleteStartRow && maxRow <= deleteEndRow) {\n // 结束行被删除 - 调整到删除前的位置\n newMaxRow = deleteStartRow > 0 ? deleteStartRow - 1 : 0;\n } else if (maxRow > deleteEndRow) {\n // 结束行在删除范围之后,需要向前移动\n newMaxRow = maxRow - count;\n if (newMaxRow < 0) {\n newMaxRow = 0; // 确保不为负数\n }\n }\n\n // 检查调整后的范围是否有效\n if (newMinRow > newMaxRow) {\n return '#REF!';\n }\n } else if (dimension === 'column') {\n const deleteStartCol = index;\n const deleteEndCol = index + count - 1;\n\n // 检查整个范围是否被删除\n const entireRangeDeleted = minCol >= deleteStartCol && maxCol <= deleteEndCol;\n if (entireRangeDeleted) {\n return '#REF!';\n }\n\n // 调整起始列\n if (minCol >= deleteStartCol && minCol <= deleteEndCol) {\n // 起始列被删除 - 调整到删除前的位置\n newMinCol = deleteStartCol > 0 ? deleteStartCol - 1 : 0;\n } else if (minCol > deleteEndCol) {\n // 起始列在删除范围之后,需要向前移动\n newMinCol = minCol - count;\n if (newMinCol < 0) {\n newMinCol = 0; // 确保不为负数\n }\n }\n\n // 调整结束列\n if (maxCol >= deleteStartCol && maxCol <= deleteEndCol) {\n // 结束列被删除 - 调整到删除前的位置\n newMaxCol = deleteStartCol > 0 ? deleteStartCol - 1 : 0;\n } else if (maxCol > deleteEndCol) {\n // 结束列在删除范围之后,需要向前移动\n newMaxCol = maxCol - count;\n if (newMaxCol < 0) {\n newMaxCol = 0; // 确保不为负数\n }\n }\n\n // 检查调整后的范围是否有效\n if (newMinCol > newMaxCol) {\n return '#REF!';\n }\n\n // 如果起始列或结束列是#REF!,或者整个范围无效,返回#REF!\n if (newMinCol === -1 || newMaxCol === -1) {\n return '#REF!';\n }\n }\n\n // 如果起始和结束都是#REF!,返回#REF!\n if (\n (dimension === 'row' && newMinRow === -1 && newMaxRow === -1) ||\n (dimension === 'column' && newMinCol === -1 && newMaxCol === -1)\n ) {\n return '#REF!';\n }\n\n // 构建新的范围引用\n let newStartCell: string;\n let newEndCell: string;\n\n if (dimension === 'row') {\n if (newMinRow === -1) {\n newStartCell = '#REF!';\n } else {\n newStartCell = this.getA1Notation(newMinRow, newMinCol);\n }\n\n if (newMaxRow === -1) {\n newEndCell = '#REF!';\n } else {\n newEndCell = this.getA1Notation(newMaxRow, newMaxCol);\n }\n } else {\n if (newMinCol === -1) {\n newStartCell = '#REF!';\n } else {\n newStartCell = this.getA1Notation(newMinRow, newMinCol);\n }\n\n if (newMaxCol === -1) {\n newEndCell = '#REF!';\n } else {\n newEndCell = this.getA1Notation(newMaxRow, newMaxCol);\n }\n }\n\n // 如果起始和结束相同,返回单个单元格引用\n if (newStartCell === newEndCell) {\n return newStartCell;\n }\n\n return `${newStartCell}:${newEndCell}`;\n } catch {\n return '#REF!';\n }\n }\n\n /**\n * 专门处理列位置移动的公式引用调整\n * 避免在移动过程中产生#REF!错误\n * @param sheetKey 工作表键\n * @param sourceCol 源列索引\n * @param targetCol 目标列索引\n * @param totalColCount 总列数\n * @param totalRowCount 总行数\n * @returns 受影响的单元格列表\n */\n adjustFormulaReferencesForColumnMove(\n sheetKey: string,\n sourceCol: number,\n targetCol: number,\n totalColCount: number,\n totalRowCount: number\n ): { adjustedCells: FormulaCell[]; movedCells: FormulaCell[] } {\n try {\n const adjustedFormulas: Array<{ cell: FormulaCell; oldFormula: string; newFormula: string }> = [];\n const movedFormulas: Array<{ oldCellKey: string; newCell: FormulaCell; formula: string }> = [];\n\n // 确定移动方向\n const isMovingForward = targetCol > sourceCol;\n\n // 第二步:创建列映射 - 先处理引用调整映射\n const columnMapping = new Map<number, number>();\n\n if (isMovingForward) {\n // 向前移动:sourceCol -> targetCol\n // 1. 在 (sourceCol, targetCol] 范围内的列需要向左移动一位\n for (let col = sourceCol + 1; col <= targetCol; col++) {\n columnMapping.set(col, col - 1);\n }\n // 2. 源列移动到目标位置\n columnMapping.set(sourceCol, targetCol);\n } else {\n // 向后移动:sourceCol -> targetCol\n // 1. 在 [targetCol, sourceCol) 范围内的列需要向右移动一位\n for (let col = targetCol; col < sourceCol; col++) {\n columnMapping.set(col, col + 1);\n }\n // 2. 源列移动到目标位置\n columnMapping.set(sourceCol, targetCol);\n }\n\n // 第一步:处理所有公式中的引用调整(包括公式单元格本身可能需要移动的情况)\n for (const [cellKey, formula] of Array.from(this.formulaCells.entries())) {\n const cell = this.parseCellKey(cellKey);\n if (!cell || cell.sheet !== sheetKey) {\n continue;\n }\n\n // 检查这个公式单元格是否受到列移动的影响\n let needsCellMove = false;\n const newCellLocation = { ...cell };\n\n // 如果公式单元格本身在受影响的列中,需要更新其位置\n if (columnMapping.has(cell.col)) {\n const mappedCol = columnMapping.get(cell.col);\n if (mappedCol !== undefined) {\n newCellLocation.col = mappedCol;\n needsCellMove = true;\n }\n }\n\n // 应用列映射到公式引用\n const newFormula = this.adjustFormulaWithColumnMapping(formula, columnMapping, sourceCol, targetCol);\n\n if (needsCellMove || newFormula !== formula) {\n if (needsCellMove) {\n // 公式单元格需要移动位置\n movedFormulas.push({\n oldCellKey: cellKey,\n newCell: newCellLocation,\n formula: newFormula\n });\n this.formulaCells.delete(cellKey);\n this.clearDependencies(cellKey);\n } else {\n // 只需要调整公式引用,不需要移动单元格\n adjustedFormulas.push({ cell, oldFormula: formula, newFormula });\n this.clearDependencies(cellKey);\n }\n }\n }\n\n // 第三步:应用所有更改\n // 先处理移动的公式\n for (const { newCell, formula } of movedFormulas) {\n const newCellKey = this.getCellKey(newCell);\n this.formulaCells.set(newCellKey, formula);\n this.updateDependencies(newCellKey, formula);\n this.setCellContentWithoutDependencyUpdate(newCell, formula);\n }\n\n // 再处理调整的公式\n for (const { cell, newFormula } of adjustedFormulas) {\n const cellKey = this.getCellKey(cell);\n this.formulaCells.set(cellKey, newFormula);\n this.updateDependencies(cellKey, newFormula);\n this.setCellContentWithoutDependencyUpdate(cell, newFormula);\n }\n\n const adjustedCells = adjustedFormulas.map(item => item.cell);\n const movedCells = movedFormulas.map(item => item.newCell);\n\n return { adjustedCells, movedCells };\n } catch (error) {\n console.error('Error in adjustFormulaReferencesForColumnMove:', error);\n return { adjustedCells: [], movedCells: [] };\n }\n }\n\n /**\n * 使用列映射调整公式中的所有引用\n */\n private adjustFormulaWithColumnMapping(\n formula: string,\n columnMapping: Map<number, number>,\n sourceCol?: number,\n targetCol?: number\n ): string {\n if (!formula || !formula.startsWith('=')) {\n return formula;\n }\n\n let expression = formula.substring(1);\n\n // 处理范围引用 (如 D4:D6)\n const rangeRegex = /([A-Z]+)([0-9]+):([A-Z]+)([0-9]+)/g;\n let match: RegExpExecArray | null;\n const rangeReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n const processedRanges: Array<{ start: number; end: number }> = [];\n\n while ((match = rangeRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const startCol = match[1];\n const startRow = match[2];\n const endCol = match[3];\n const endRow = match[4];\n\n const startColIndex = this.columnLettersToIndex(startCol);\n const endColIndex = this.columnLettersToIndex(endCol);\n\n let newStartCol = startColIndex;\n let newEndCol = endColIndex;\n\n // 关键修复:当范围包含被移动的列时,保持原始范围不变\n // 检查原始范围是否包含被移动的列\n const isSourceColInRange = startColIndex <= sourceCol && sourceCol <= endColIndex;\n\n if (isSourceColInRange) {\n // 如果移动的列在范围内,保持原始范围引用不变\n // 这样公式 A2:C2 在移动列后仍然是 A2:C2\n newStartCol = startColIndex;\n newEndCol = endColIndex;\n } else {\n // 只有范围不包含被移动的列时,才正常调整引用\n // 检查起始列是否需要调整\n if (columnMapping.has(startColIndex)) {\n const mappedStartCol = columnMapping.get(startColIndex);\n if (mappedStartCol !== undefined) {\n newStartCol = mappedStartCol;\n }\n }\n\n // 检查结束列是否需要调整\n if (columnMapping.has(endColIndex)) {\n const mappedEndCol = columnMapping.get(endColIndex);\n if (mappedEndCol !== undefined) {\n newEndCol = mappedEndCol;\n }\n }\n }\n\n // 确保范围有效(起始不大于结束)\n if (newStartCol > newEndCol) {\n [newStartCol, newEndCol] = [newEndCol, newStartCol];\n }\n\n const newStartColLetters = this.indexToColumnLetters(newStartCol);\n const newEndColLetters = this.indexToColumnLetters(newEndCol);\n const replacement = `${newStartColLetters}${startRow}:${newEndColLetters}${endRow}`;\n\n rangeReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n\n processedRanges.push({ start: match.index, end: match.index + fullMatch.length });\n }\n\n // 应用范围替换(从后往前,避免位置偏移)\n for (let i = rangeReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = rangeReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n // 处理单个单元格引用 (如 D4),但跳过已经在范围中处理过的\n const cellRegex = /([A-Z]+)([0-9]+)/g;\n const cellReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n\n while ((match = cellRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const colLetters = match[1];\n const row = match[2];\n const colIndex = this.columnLettersToIndex(colLetters);\n\n const matchIndex = match.index; // 保存到局部变量\n\n // 检查这个位置是否已经在范围中被处理过\n const isInProcessedRange = processedRanges.some(range => {\n return matchIndex >= range.start && matchIndex < range.end;\n });\n\n if (isInProcessedRange) {\n continue; // 跳过已经在范围中处理过的单元格\n }\n\n // 检查该列是否需要调整\n if (columnMapping.has(colIndex)) {\n const newColIndex = columnMapping.get(colIndex);\n if (newColIndex !== undefined) {\n const newColLetters = this.indexToColumnLetters(newColIndex);\n const replacement = `${newColLetters}${row}`;\n\n cellReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n }\n }\n }\n\n // 应用单元格替换(从后往前,避免位置偏移)\n for (let i = cellReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = cellReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n return '=' + expression;\n }\n\n /**\n * 移动行表头位置.将sourceRow位置开始往后moveCount个行,移动调整到targetRow位置处\n * @param sheetKey 工作表键\n * @param sourceRow 源行索引\n * @param targetRow 目标行索引\n * @param totalColCount 总列数\n * @param totalRowCount 总行数\n * @returns 受影响的单元格列表\n */\n adjustFormulaReferencesForRowMove(\n sheetKey: string,\n sourceRow: number,\n targetRow: number\n ): { adjustedCells: FormulaCell[]; movedCells: FormulaCell[] } {\n try {\n // 验证输入参数\n if (sourceRow < 0 || targetRow < 0) {\n return { adjustedCells: [], movedCells: [] };\n }\n\n const adjustedFormulas: Array<{ cell: FormulaCell; oldFormula: string; newFormula: string }> = [];\n const movedFormulas: Array<{ oldCellKey: string; newCell: FormulaCell; formula: string }> = [];\n\n // 确定移动方向\n const isMovingForward = targetRow > sourceRow;\n\n // 创建行映射 - 处理引用调整映射\n const rowMapping = new Map<number, number>();\n\n if (isMovingForward) {\n // 向前移动:sourceRow -> targetRow\n // 1. 在 (sourceRow, targetRow] 范围内的行需要向上移动一位\n for (let row = sourceRow + 1; row <= targetRow; row++) {\n rowMapping.set(row, row - 1);\n }\n // 2. 源行移动到目标位置\n rowMapping.set(sourceRow, targetRow);\n } else {\n // 向后移动:sourceRow -> targetRow\n // 1. 在 [targetRow, sourceRow) 范围内的行需要向下移动一位\n for (let row = targetRow; row < sourceRow; row++) {\n rowMapping.set(row, row + 1);\n }\n // 2. 源行移动到目标位置\n rowMapping.set(sourceRow, targetRow);\n }\n // 处理所有公式中的引用调整\n for (const [cellKey, formula] of Array.from(this.formulaCells.entries())) {\n const cell = this.parseCellKey(cellKey);\n if (!cell || cell.sheet !== sheetKey) {\n continue;\n }\n\n let needsCellMove = false;\n const newCellLocation = { ...cell };\n\n // 检查公式单元格本身是否在移动范围内\n if (rowMapping.has(cell.row)) {\n const mappedRow = rowMapping.get(cell.row);\n if (mappedRow !== undefined && mappedRow !== cell.row) {\n newCellLocation.row = mappedRow;\n needsCellMove = true;\n }\n }\n\n // 应用行映射到公式引用\n const newFormula = this.adjustFormulaWithRowMapping(formula, rowMapping);\n\n if (needsCellMove || newFormula !== formula) {\n if (needsCellMove) {\n // 公式单元格需要移动位置\n movedFormulas.push({\n oldCellKey: cellKey,\n newCell: newCellLocation,\n formula: newFormula\n });\n this.formulaCells.delete(cellKey);\n this.clearDependencies(cellKey);\n } else {\n // 只需要调整公式引用,不需要移动单元格\n adjustedFormulas.push({ cell, oldFormula: formula, newFormula });\n this.clearDependencies(cellKey);\n }\n }\n }\n\n // 应用所有更改\n // 先处理移动的公式\n for (const { newCell, formula } of movedFormulas) {\n const newCellKey = this.getCellKey(newCell);\n this.formulaCells.set(newCellKey, formula);\n this.updateDependencies(newCellKey, formula);\n this.setCellContentWithoutDependencyUpdate(newCell, formula);\n }\n\n // 再处理调整的公式\n for (const { cell, newFormula } of adjustedFormulas) {\n const cellKey = this.getCellKey(cell);\n this.formulaCells.set(cellKey, newFormula);\n this.updateDependencies(cellKey, newFormula);\n this.setCellContentWithoutDependencyUpdate(cell, newFormula);\n }\n\n const adjustedCells = adjustedFormulas.map(item => item.cell);\n const movedCells = movedFormulas.map(item => item.newCell);\n\n return { adjustedCells, movedCells };\n } catch (error) {\n console.error('Error in adjustFormulaReferencesForRowMove:', error);\n return { adjustedCells: [], movedCells: [] };\n }\n }\n\n /**\n * 使用行映射调整公式中的所有引用\n */\n private adjustFormulaWithRowMapping(formula: string, rowMapping: Map<number, number>): string {\n if (!formula || !formula.startsWith('=')) {\n return formula;\n }\n\n let expression = formula.substring(1);\n\n // 处理范围引用 (如 D4:D6)\n const rangeRegex = /([A-Z]+)([0-9]+):([A-Z]+)([0-9]+)/g;\n let match: RegExpExecArray | null;\n const rangeReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n const processedRanges: Array<{ start: number; end: number }> = [];\n\n while ((match = rangeRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const startCol = match[1];\n const startRow = match[2];\n const endCol = match[3];\n const endRow = match[4];\n\n const startRowIndex = parseInt(startRow, 10) - 1; // Excel行号从1开始,转换为从0开始\n const endRowIndex = parseInt(endRow, 10) - 1;\n\n let newStartRow = startRowIndex;\n let newEndRow = endRowIndex;\n\n // 检查起始行是否需要调整\n if (rowMapping.has(startRowIndex)) {\n const mappedStartRow = rowMapping.get(startRowIndex);\n if (mappedStartRow !== undefined) {\n newStartRow = mappedStartRow;\n }\n }\n\n // 检查结束行是否需要调整\n if (rowMapping.has(endRowIndex)) {\n const mappedEndRow = rowMapping.get(endRowIndex);\n if (mappedEndRow !== undefined) {\n newEndRow = mappedEndRow;\n }\n }\n\n // 只有当至少有一个行需要调整时才进行替换\n if (newStartRow !== startRowIndex || newEndRow !== endRowIndex) {\n const newStartRowNumber = newStartRow + 1; // 转换回Excel行号(从1开始)\n const newEndRowNumber = newEndRow + 1;\n const replacement = `${startCol}${newStartRowNumber}:${endCol}${newEndRowNumber}`;\n\n rangeReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n\n processedRanges.push({ start: match.index, end: match.index + fullMatch.length });\n }\n }\n\n // 应用范围替换(从后往前,避免位置偏移)\n for (let i = rangeReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = rangeReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n // 处理单个单元格引用 (如 D4),但跳过已经在范围中处理过的\n const cellRegex = /([A-Z]+)([0-9]+)/g;\n const cellReplacements: Array<{ start: number; end: number; replacement: string }> = [];\n\n while ((match = cellRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const colLetters = match[1];\n const row = match[2];\n const rowIndex = parseInt(row, 10) - 1; // Excel行号从1开始,转换为从0开始\n\n const matchIndex = match.index; // 保存到局部变量\n\n // 检查这个位置是否已经在范围中被处理过\n const isInProcessedRange = processedRanges.some(range => {\n return matchIndex >= range.start && matchIndex < range.end;\n });\n\n if (isInProcessedRange) {\n continue; // 跳过已经在范围中处理过的单元格\n }\n\n // 检查该行是否需要调整\n if (rowMapping.has(rowIndex)) {\n const newRowIndex = rowMapping.get(rowIndex);\n if (newRowIndex !== undefined) {\n const newRowNumber = newRowIndex + 1; // 转换回Excel行号(从1开始)\n const replacement = `${colLetters}${newRowNumber}`;\n\n cellReplacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement\n });\n }\n }\n }\n\n // 应用单元格替换(从后往前,避免位置偏移)\n for (let i = cellReplacements.length - 1; i >= 0; i--) {\n const { start, end, replacement } = cellReplacements[i];\n expression = expression.substring(0, start) + replacement + expression.substring(end);\n }\n\n return '=' + expression;\n }\n}\n\nclass FormulaError {\n constructor(public message: string, public type: 'REF' | 'VALUE' | 'DIV0' | 'NAME' | 'NA' = 'VALUE') {}\n}\n"]}
|