@ricsam/formula-engine 0.2.11 → 0.2.13

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.
Files changed (36) hide show
  1. package/dist/cjs/core/autofill-utils.cjs +68 -2
  2. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  3. package/dist/cjs/core/engine-snapshot.cjs +2 -2
  4. package/dist/cjs/core/engine-snapshot.cjs.map +3 -3
  5. package/dist/cjs/core/engine.cjs +47 -3
  6. package/dist/cjs/core/engine.cjs.map +3 -3
  7. package/dist/cjs/core/managers/copy-manager.cjs +163 -14
  8. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  9. package/dist/cjs/core/managers/range-metadata-manager.cjs +135 -0
  10. package/dist/cjs/core/managers/range-metadata-manager.cjs.map +10 -0
  11. package/dist/cjs/core/managers/style-manager.cjs +19 -14
  12. package/dist/cjs/core/managers/style-manager.cjs.map +3 -3
  13. package/dist/cjs/core/types.cjs.map +1 -1
  14. package/dist/cjs/package.json +1 -1
  15. package/dist/mjs/core/autofill-utils.mjs +68 -2
  16. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  17. package/dist/mjs/core/engine-snapshot.mjs +2 -2
  18. package/dist/mjs/core/engine-snapshot.mjs.map +3 -3
  19. package/dist/mjs/core/engine.mjs +47 -3
  20. package/dist/mjs/core/engine.mjs.map +3 -3
  21. package/dist/mjs/core/managers/copy-manager.mjs +163 -14
  22. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  23. package/dist/mjs/core/managers/range-metadata-manager.mjs +95 -0
  24. package/dist/mjs/core/managers/range-metadata-manager.mjs.map +10 -0
  25. package/dist/mjs/core/managers/style-manager.mjs +19 -14
  26. package/dist/mjs/core/managers/style-manager.mjs.map +3 -3
  27. package/dist/mjs/core/types.mjs.map +1 -1
  28. package/dist/mjs/package.json +1 -1
  29. package/dist/types/core/autofill-utils.d.ts +7 -1
  30. package/dist/types/core/engine-snapshot.d.ts +4 -2
  31. package/dist/types/core/engine.d.ts +32 -1
  32. package/dist/types/core/managers/copy-manager.d.ts +11 -1
  33. package/dist/types/core/managers/range-metadata-manager.d.ts +22 -0
  34. package/dist/types/core/managers/style-manager.d.ts +4 -3
  35. package/dist/types/core/types.d.ts +26 -6
  36. package/package.json +1 -1
@@ -12,14 +12,16 @@ class CopyManager {
12
12
  workbookManager;
13
13
  evaluationManager;
14
14
  styleManager;
15
- constructor(workbookManager, evaluationManager, styleManager) {
15
+ rangeMetadataManager;
16
+ constructor(workbookManager, evaluationManager, styleManager, rangeMetadataManager) {
16
17
  this.workbookManager = workbookManager;
17
18
  this.evaluationManager = evaluationManager;
18
19
  this.styleManager = styleManager;
20
+ this.rangeMetadataManager = rangeMetadataManager;
19
21
  }
20
22
  normalizeInclude(include) {
21
23
  if (!include || include === "all") {
22
- return ["content", "style", "metadata"];
24
+ return ["content", "style", "cellMetadata", "rangeMetadata"];
23
25
  }
24
26
  return include;
25
27
  }
@@ -42,7 +44,15 @@ class CopyManager {
42
44
  const rowOffset = target.rowIndex - topLeft.rowIndex;
43
45
  const colOffset = target.colIndex - topLeft.colIndex;
44
46
  const snapshot = this.snapshotCellsWithStyles(source);
47
+ const rangeMetadataCopies = this.shouldInclude(options, "rangeMetadata") ? this.collectRangeMetadataCopies(source, topLeft, target, rowOffset, colOffset) : [];
48
+ const sourceRange = this.getBoundingBox(source);
49
+ const targetRange = this.adjustRange(sourceRange, rowOffset, colOffset);
45
50
  this.clearSourceCells(source);
51
+ if (this.shouldInclude(options, "cellMetadata")) {
52
+ for (const cell of source) {
53
+ this.workbookManager.setCellMetadata(cell, undefined);
54
+ }
55
+ }
46
56
  if (this.shouldInclude(options, "style")) {
47
57
  for (const cell of source) {
48
58
  const cellRange = {
@@ -59,6 +69,10 @@ class CopyManager {
59
69
  this.styleManager.clearCellStylesInRange(cellRange);
60
70
  }
61
71
  }
72
+ if (this.shouldInclude(options, "rangeMetadata")) {
73
+ this.rangeMetadataManager.clearRangeMetadataInRange(this.getRangeAddressFromBoundingBox(topLeft, sourceRange));
74
+ this.rangeMetadataManager.clearRangeMetadataInRange(this.getRangeAddressFromBoundingBox(target, targetRange));
75
+ }
62
76
  const movedCellsSet = new Set(source.map((c) => `${c.workbookName}:${c.sheetName}:${c.colIndex}:${c.rowIndex}`));
63
77
  const movedCellsInfo = {
64
78
  cellsSet: movedCellsSet,
@@ -90,7 +104,7 @@ class CopyManager {
90
104
  }
91
105
  this.workbookManager.setCellContent(targetCell, targetContent);
92
106
  }
93
- if (this.shouldInclude(options, "metadata")) {
107
+ if (this.shouldInclude(options, "cellMetadata")) {
94
108
  if (snap.metadata) {
95
109
  this.workbookManager.setCellMetadata(targetCell, {
96
110
  ...snap.metadata
@@ -103,6 +117,9 @@ class CopyManager {
103
117
  this.applyStylesFromSnapshot(snap, targetCell);
104
118
  }
105
119
  }
120
+ if (this.shouldInclude(options, "rangeMetadata")) {
121
+ this.applyRangeMetadataCopies(rangeMetadataCopies);
122
+ }
106
123
  }
107
124
  copyOnlyCells(source, target, options) {
108
125
  const topLeft = this.findTopLeft(source);
@@ -122,9 +139,25 @@ class CopyManager {
122
139
  this.copyCellContentFromSnapshot(cellSnapshot, targetCell, topLeft, options);
123
140
  }
124
141
  }
142
+ if (this.shouldInclude(options, "cellMetadata")) {
143
+ for (let i = 0;i < source.length; i++) {
144
+ const sourceCell = source[i];
145
+ const cellSnapshot = snapshot[i];
146
+ const targetCell = {
147
+ workbookName: target.workbookName,
148
+ sheetName: target.sheetName,
149
+ colIndex: sourceCell.colIndex + colOffset,
150
+ rowIndex: sourceCell.rowIndex + rowOffset
151
+ };
152
+ this.copyCellMetadataFromSnapshot(cellSnapshot, targetCell);
153
+ }
154
+ }
125
155
  if (this.shouldInclude(options, "style")) {
126
156
  this.copyFormatting(source, topLeft, target, rowOffset, colOffset);
127
157
  }
158
+ if (this.shouldInclude(options, "rangeMetadata")) {
159
+ this.copyRangeMetadata(source, topLeft, target, rowOffset, colOffset);
160
+ }
128
161
  }
129
162
  findTopLeft(cells) {
130
163
  let minRow = Infinity;
@@ -264,14 +297,14 @@ class CopyManager {
264
297
  const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${targetCell.rowIndex + 1}`;
265
298
  targetSheet.content.set(targetKey, targetContent);
266
299
  }
267
- if (this.shouldInclude(options, "metadata")) {
268
- if (snapshot.metadata) {
269
- this.workbookManager.setCellMetadata(targetCell, {
270
- ...snapshot.metadata
271
- });
272
- } else {
273
- this.workbookManager.setCellMetadata(targetCell, undefined);
274
- }
300
+ }
301
+ copyCellMetadataFromSnapshot(snapshot, targetCell) {
302
+ if (snapshot.metadata) {
303
+ this.workbookManager.setCellMetadata(targetCell, {
304
+ ...snapshot.metadata
305
+ });
306
+ } else {
307
+ this.workbookManager.setCellMetadata(targetCell, undefined);
275
308
  }
276
309
  }
277
310
  copyCellContent(sourceCell, targetCell, sourceTopLeft, options) {
@@ -326,7 +359,7 @@ class CopyManager {
326
359
  const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${targetCell.rowIndex + 1}`;
327
360
  targetSheet.content.set(targetKey, targetContent);
328
361
  }
329
- if (this.shouldInclude(options, "metadata")) {
362
+ if (this.shouldInclude(options, "cellMetadata")) {
330
363
  const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);
331
364
  if (sourceMetadata) {
332
365
  this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });
@@ -431,6 +464,61 @@ class CopyManager {
431
464
  }
432
465
  }
433
466
  }
467
+ cloneMetadataValue(metadata) {
468
+ if (!metadata || typeof metadata !== "object") {
469
+ return metadata;
470
+ }
471
+ try {
472
+ return structuredClone(metadata);
473
+ } catch {
474
+ return Array.isArray(metadata) ? [...metadata] : { ...metadata };
475
+ }
476
+ }
477
+ getRangeAddressFromBoundingBox(base, range) {
478
+ return {
479
+ workbookName: base.workbookName,
480
+ sheetName: base.sheetName,
481
+ range
482
+ };
483
+ }
484
+ collectRangeMetadataCopies(sourceCells, sourceTopLeft, target, rowOffset, colOffset) {
485
+ const sourceRange = this.getBoundingBox(sourceCells);
486
+ const copies = [];
487
+ for (const entry of this.rangeMetadataManager.getAllRangeMetadata()) {
488
+ for (const area of entry.areas) {
489
+ if (area.workbookName !== sourceTopLeft.workbookName || area.sheetName !== sourceTopLeft.sheetName) {
490
+ continue;
491
+ }
492
+ const intersection = intersectRanges(area.range, sourceRange);
493
+ if (!intersection) {
494
+ continue;
495
+ }
496
+ copies.push({
497
+ areas: [
498
+ {
499
+ workbookName: target.workbookName,
500
+ sheetName: target.sheetName,
501
+ range: this.adjustRange(intersection, rowOffset, colOffset)
502
+ }
503
+ ],
504
+ metadata: this.cloneMetadataValue(entry.metadata)
505
+ });
506
+ }
507
+ }
508
+ return copies;
509
+ }
510
+ applyRangeMetadataCopies(copies) {
511
+ for (const copy of copies) {
512
+ this.rangeMetadataManager.addRangeMetadata(copy);
513
+ }
514
+ }
515
+ copyRangeMetadata(sourceCells, sourceTopLeft, target, rowOffset, colOffset) {
516
+ const sourceRange = this.getBoundingBox(sourceCells);
517
+ const targetRange = this.adjustRange(sourceRange, rowOffset, colOffset);
518
+ const copies = this.collectRangeMetadataCopies(sourceCells, sourceTopLeft, target, rowOffset, colOffset);
519
+ this.rangeMetadataManager.clearRangeMetadataInRange(this.getRangeAddressFromBoundingBox(target, targetRange));
520
+ this.applyRangeMetadataCopies(copies);
521
+ }
434
522
  getBoundingBox(cells) {
435
523
  let minRow = Infinity;
436
524
  let maxRow = -Infinity;
@@ -472,6 +560,8 @@ class CopyManager {
472
560
  this.fillRangeWithSeed(seedRange, targetRange, {
473
561
  copyContent: this.shouldInclude(options, "content"),
474
562
  copyStyles: this.shouldInclude(options, "style"),
563
+ copyCellMetadata: this.shouldInclude(options, "cellMetadata"),
564
+ copyRangeMetadata: this.shouldInclude(options, "rangeMetadata"),
475
565
  contentType: options.type ?? "formula",
476
566
  adjustFormulas: true
477
567
  });
@@ -485,6 +575,9 @@ class CopyManager {
485
575
  if (options.copyStyles) {
486
576
  this.styleManager.clearCellStylesInRange(targetRange);
487
577
  }
578
+ if (options.copyRangeMetadata) {
579
+ this.rangeMetadataManager.clearRangeMetadataInRange(targetRange);
580
+ }
488
581
  const seedCells = this.expandRangeToCells(seedRange);
489
582
  const seedWidth = this.getRangeWidth(seedRange);
490
583
  const seedHeight = this.getRangeHeight(seedRange);
@@ -514,6 +607,12 @@ class CopyManager {
514
607
  if (options.copyStyles) {
515
608
  this.copyCellFormatting(seedCell, targetCell);
516
609
  }
610
+ if (options.copyCellMetadata) {
611
+ this.copyCellMetadata(seedCell, targetCell);
612
+ }
613
+ if (options.copyRangeMetadata) {
614
+ this.copyCellRangeMetadata(seedCell, targetCell);
615
+ }
517
616
  const key = `${targetCell.colIndex}-${targetCell.rowIndex}`;
518
617
  const sheet = this.workbookManager.getSheet({
519
618
  workbookName: targetCell.workbookName,
@@ -552,6 +651,12 @@ class CopyManager {
552
651
  if (options.copyStyles) {
553
652
  this.copyCellFormatting(sourceCell, targetCell);
554
653
  }
654
+ if (options.copyCellMetadata) {
655
+ this.copyCellMetadata(sourceCell, targetCell);
656
+ }
657
+ if (options.copyRangeMetadata) {
658
+ this.copyCellRangeMetadata(sourceCell, targetCell);
659
+ }
555
660
  }
556
661
  }
557
662
  }
@@ -651,7 +756,7 @@ class CopyManager {
651
756
  const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${targetCell.rowIndex + 1}`;
652
757
  targetSheet.content.set(targetKey, targetContent);
653
758
  }
654
- if (this.shouldInclude(options, "metadata")) {
759
+ if (this.shouldInclude(options, "cellMetadata")) {
655
760
  const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);
656
761
  if (sourceMetadata) {
657
762
  this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });
@@ -703,6 +808,50 @@ class CopyManager {
703
808
  return formula;
704
809
  }
705
810
  }
811
+ copyCellMetadata(sourceCell, targetCell) {
812
+ const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);
813
+ if (sourceMetadata) {
814
+ this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });
815
+ } else {
816
+ this.workbookManager.setCellMetadata(targetCell, undefined);
817
+ }
818
+ }
819
+ copyCellRangeMetadata(sourceCell, targetCell) {
820
+ const targetCellRange = {
821
+ workbookName: targetCell.workbookName,
822
+ sheetName: targetCell.sheetName,
823
+ range: {
824
+ start: { col: targetCell.colIndex, row: targetCell.rowIndex },
825
+ end: {
826
+ col: { type: "number", value: targetCell.colIndex },
827
+ row: { type: "number", value: targetCell.rowIndex }
828
+ }
829
+ }
830
+ };
831
+ this.rangeMetadataManager.clearRangeMetadataInRange(targetCellRange);
832
+ const sourceCellRange = {
833
+ start: { col: sourceCell.colIndex, row: sourceCell.rowIndex },
834
+ end: {
835
+ col: { type: "number", value: sourceCell.colIndex },
836
+ row: { type: "number", value: sourceCell.rowIndex }
837
+ }
838
+ };
839
+ for (const entry of this.rangeMetadataManager.getAllRangeMetadata()) {
840
+ for (const area of entry.areas) {
841
+ if (area.workbookName !== sourceCell.workbookName || area.sheetName !== sourceCell.sheetName) {
842
+ continue;
843
+ }
844
+ const intersection = intersectRanges(area.range, sourceCellRange);
845
+ if (!intersection) {
846
+ continue;
847
+ }
848
+ this.rangeMetadataManager.addRangeMetadata({
849
+ areas: [targetCellRange],
850
+ metadata: this.cloneMetadataValue(entry.metadata)
851
+ });
852
+ }
853
+ }
854
+ }
706
855
  copyCellFormatting(sourceCell, targetCell) {
707
856
  const targetCellRange = {
708
857
  workbookName: targetCell.workbookName,
@@ -789,4 +938,4 @@ export {
789
938
  CopyManager
790
939
  };
791
940
 
792
- //# debugId=9E025649C6A89F3564756E2164756E21
941
+ //# debugId=B7E36A3C8B2E835C64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/managers/copy-manager.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * CopyManager - Manages cell copy/paste operations\n */\n\nimport type {\n CellAddress,\n CopyCellsOptions,\n ConditionalStyle,\n DirectCellStyle,\n LocalCellAddress,\n RangeAddress,\n SerializedCellValue,\n SpreadsheetRange,\n} from \"../types.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport type { EvaluationManager } from \"./evaluation-manager.mjs\";\nimport type { StyleManager } from \"./style-manager.mjs\";\nimport { parseFormula } from \"../../parser/parser.mjs\";\nimport { astToString } from \"../../parser/formatter.mjs\";\nimport { transformAST } from \"../ast-traverser.mjs\";\nimport type { ReferenceNode, RangeNode } from \"../../parser/ast.mjs\";\nimport { getCellReference, isCellInRange } from \"../utils.mjs\";\nimport { intersectRanges } from \"../utils/range-utils.mjs\";\nimport {\n updateReferencesForMovedCells,\n type MovedCellsInfo,\n} from \"../cell-mover.mjs\";\n\n/**\n * Snapshot of a cell's content, metadata, and styles\n */\ninterface CellSnapshot {\n address: CellAddress;\n content: SerializedCellValue | undefined;\n metadata: unknown | undefined;\n matchingCellStyles?: DirectCellStyle[];\n matchingConditionalStyles?: ConditionalStyle[];\n}\n\nexport class CopyManager {\n constructor(\n private workbookManager: WorkbookManager,\n private evaluationManager: EvaluationManager,\n private styleManager: StyleManager\n ) {}\n\n /**\n * Normalize the include option to an array of parts to copy\n */\n private normalizeInclude(\n include: CopyCellsOptions[\"include\"]\n ): (\"content\" | \"style\" | \"metadata\")[] {\n if (!include || include === \"all\") {\n return [\"content\", \"style\", \"metadata\"];\n }\n return include;\n }\n\n /**\n * Check if a specific part should be included in the copy operation\n */\n private shouldInclude(\n options: CopyCellsOptions,\n part: \"content\" | \"style\" | \"metadata\"\n ): boolean {\n const normalized = this.normalizeInclude(options.include);\n return normalized.includes(part);\n }\n\n /**\n * Paste cells from source to target\n * Delegates to cutCells for move operations or copyOnlyCells for copy operations\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n if (source.length === 0) {\n return;\n }\n\n if (options.cut === true) {\n return this.cutCells(source, target, options);\n } else {\n return this.copyOnlyCells(source, target, options);\n }\n }\n\n /**\n * Cut cells: Proper snapshot flow for move operations\n * 1. Snapshot source cells (with styles)\n * 2. Remove source cells and punch holes in style areas\n * 3. Update references in OTHER cells (not in moved set)\n * 4. Update formulas in snapshot and apply to target\n */\n private cutCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n const topLeft = this.findTopLeft(source);\n const rowOffset = target.rowIndex - topLeft.rowIndex;\n const colOffset = target.colIndex - topLeft.colIndex;\n\n // 1. Snapshot source cells (with styles)\n const snapshot = this.snapshotCellsWithStyles(source);\n\n // 2. Remove source cells (content) and punch holes in styles\n this.clearSourceCells(source);\n\n // Punch holes in style areas for each cut cell\n if (this.shouldInclude(options, \"style\")) {\n for (const cell of source) {\n const cellRange: RangeAddress = {\n workbookName: cell.workbookName,\n sheetName: cell.sheetName,\n range: {\n start: { col: cell.colIndex, row: cell.rowIndex },\n end: {\n col: { type: \"number\", value: cell.colIndex },\n row: { type: \"number\", value: cell.rowIndex },\n },\n },\n };\n this.styleManager.clearCellStylesInRange(cellRange);\n }\n }\n\n // 3. Update references in OTHER cells (not in moved set)\n const movedCellsSet = new Set(\n source.map(\n (c) => `${c.workbookName}:${c.sheetName}:${c.colIndex}:${c.rowIndex}`\n )\n );\n\n const movedCellsInfo: MovedCellsInfo = {\n cellsSet: movedCellsSet,\n workbookName: topLeft.workbookName,\n sheetName: topLeft.sheetName,\n rowOffset,\n colOffset,\n };\n\n this.workbookManager.updateFormulasExcluding(movedCellsSet, (formula) =>\n updateReferencesForMovedCells(formula, movedCellsInfo)\n );\n\n // 4. Update formulas in snapshot and apply to target\n for (let i = 0; i < snapshot.length; i++) {\n const snap = snapshot[i]!;\n const sourceCell = source[i]!;\n const targetCell: CellAddress = {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n colIndex: sourceCell.colIndex + colOffset,\n rowIndex: sourceCell.rowIndex + rowOffset,\n };\n\n // Apply content (with formula adjustment)\n if (this.shouldInclude(options, \"content\") && snap.content) {\n let targetContent = snap.content;\n\n if (typeof snap.content === \"string\" && snap.content.startsWith(\"=\")) {\n // Adjust formula references relative to new position\n targetContent = this.adjustFormulaReferences(\n snap.content,\n {\n colIndex: snap.address.colIndex,\n rowIndex: snap.address.rowIndex,\n },\n {\n colIndex: targetCell.colIndex,\n rowIndex: targetCell.rowIndex,\n }\n );\n }\n\n // Use setCellContent to ensure proper cache invalidation and dependency tracking\n this.workbookManager.setCellContent(targetCell, targetContent);\n }\n\n // Apply metadata\n if (this.shouldInclude(options, \"metadata\")) {\n if (snap.metadata) {\n this.workbookManager.setCellMetadata(targetCell, {\n ...snap.metadata,\n });\n } else {\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n\n // Apply styles from snapshot to new location\n if (this.shouldInclude(options, \"style\")) {\n this.applyStylesFromSnapshot(snap, targetCell);\n }\n }\n }\n\n /**\n * Copy cells: Standard copy operation (not cut/move)\n * Snapshot → Copy with adjustment → Copy formatting\n */\n private copyOnlyCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n const topLeft = this.findTopLeft(source);\n const rowOffset = target.rowIndex - topLeft.rowIndex;\n const colOffset = target.colIndex - topLeft.colIndex;\n\n // SNAPSHOT source cells (handles overlapping ranges)\n const snapshot = this.snapshotCells(source);\n\n // Copy cell contents if requested (from snapshot, not live cells)\n if (this.shouldInclude(options, \"content\")) {\n for (let i = 0; i < source.length; i++) {\n const sourceCell = source[i]!;\n const cellSnapshot = snapshot[i]!;\n const targetCell: CellAddress = {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n colIndex: sourceCell.colIndex + colOffset,\n rowIndex: sourceCell.rowIndex + rowOffset,\n };\n\n this.copyCellContentFromSnapshot(\n cellSnapshot,\n targetCell,\n topLeft,\n options\n );\n }\n }\n\n // Copy formatting if requested\n if (this.shouldInclude(options, \"style\")) {\n this.copyFormatting(source, topLeft, target, rowOffset, colOffset);\n }\n }\n\n /**\n * Find the top-left cell (minimum row/col indices)\n */\n private findTopLeft(cells: CellAddress[]): CellAddress {\n let minRow = Infinity;\n let minCol = Infinity;\n let topLeftCell = cells[0]!;\n\n for (const cell of cells) {\n if (\n cell.rowIndex < minRow ||\n (cell.rowIndex === minRow && cell.colIndex < minCol)\n ) {\n minRow = cell.rowIndex;\n minCol = cell.colIndex;\n topLeftCell = cell;\n }\n }\n\n return topLeftCell;\n }\n\n /**\n * Create a snapshot of cells' content and metadata\n * This prevents issues with overlapping ranges where source and target overlap\n * Used for copy operations (not cut)\n */\n private snapshotCells(cells: CellAddress[]): CellSnapshot[] {\n return cells.map((cell) => {\n const sheet = this.workbookManager.getSheet({\n workbookName: cell.workbookName,\n sheetName: cell.sheetName,\n });\n\n const key = `${String.fromCharCode(65 + cell.colIndex)}${\n cell.rowIndex + 1\n }`;\n const content = sheet?.content.get(key);\n const metadata = this.workbookManager.getCellMetadata(cell);\n\n return {\n address: cell,\n content,\n metadata,\n };\n });\n }\n\n /**\n * Create a snapshot of cells with content, metadata, AND styles\n * Used for cut operations to preserve all cell information\n */\n private snapshotCellsWithStyles(cells: CellAddress[]): CellSnapshot[] {\n const allCellStyles = this.styleManager.getAllCellStyles();\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n\n return cells.map((cell) => {\n const sheet = this.workbookManager.getSheet({\n workbookName: cell.workbookName,\n sheetName: cell.sheetName,\n });\n\n const key = getCellReference(cell);\n const content = sheet?.content.get(key);\n const metadata = this.workbookManager.getCellMetadata(cell);\n\n // Find all styles that apply to this cell\n const matchingCellStyles = allCellStyles.filter((style) =>\n style.areas.some(\n (area) =>\n area.workbookName === cell.workbookName &&\n area.sheetName === cell.sheetName &&\n isCellInRange(cell, area.range)\n )\n );\n\n const matchingConditionalStyles = allConditionalStyles.filter((style) =>\n style.areas.some(\n (area) =>\n area.workbookName === cell.workbookName &&\n area.sheetName === cell.sheetName &&\n isCellInRange(cell, area.range)\n )\n );\n\n return {\n address: cell,\n content,\n metadata,\n matchingCellStyles,\n matchingConditionalStyles,\n };\n });\n }\n\n /**\n * Apply styles from a snapshot to a target cell\n * Creates new style areas at the target location\n */\n private applyStylesFromSnapshot(\n snapshot: CellSnapshot,\n targetCell: CellAddress\n ): void {\n // Apply cell styles\n if (snapshot.matchingCellStyles) {\n for (const style of snapshot.matchingCellStyles) {\n const newStyle: DirectCellStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n\n // Apply conditional styles\n if (snapshot.matchingConditionalStyles) {\n for (const style of snapshot.matchingConditionalStyles) {\n const newStyle: ConditionalStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n\n /**\n * Copy content from a cell snapshot to a target cell\n */\n private copyCellContentFromSnapshot(\n snapshot: CellSnapshot,\n targetCell: CellAddress,\n sourceTopLeft: CellAddress,\n options: CopyCellsOptions\n ): void {\n if (!snapshot.content) {\n // Source cell was empty\n return;\n }\n\n let targetContent: SerializedCellValue;\n const copyType = options.type ?? \"formula\";\n\n if (copyType === \"value\") {\n // Copy evaluated value\n const evalResult = this.evaluationManager.getCellEvaluationResult(\n snapshot.address\n );\n\n if (!evalResult || evalResult.type !== \"value\") {\n // If evaluation failed or is not a value, copy as-is\n targetContent = snapshot.content;\n } else {\n // Convert to literal value\n const result = evalResult.result;\n if (result.type === \"number\") {\n targetContent = result.value;\n } else if (result.type === \"string\") {\n targetContent = result.value;\n } else if (result.type === \"boolean\") {\n targetContent = result.value;\n } else {\n // Error or other type, copy as-is\n targetContent = snapshot.content;\n }\n }\n } else {\n // Copy formula\n if (\n typeof snapshot.content === \"string\" &&\n snapshot.content.startsWith(\"=\")\n ) {\n // Adjust formula references\n targetContent = this.adjustFormulaReferences(\n snapshot.content,\n {\n colIndex: snapshot.address.colIndex,\n rowIndex: snapshot.address.rowIndex,\n },\n {\n colIndex: targetCell.colIndex,\n rowIndex: targetCell.rowIndex,\n }\n );\n } else {\n // Not a formula, copy as-is\n targetContent = snapshot.content;\n }\n }\n\n // Set target cell content\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.set(targetKey, targetContent);\n }\n\n // Copy metadata if requested\n if (this.shouldInclude(options, \"metadata\")) {\n if (snapshot.metadata) {\n this.workbookManager.setCellMetadata(targetCell, {\n ...snapshot.metadata,\n });\n } else {\n // Clear target metadata if source has none\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n }\n\n /**\n * Update all formula references when cells are cut (moved)\n */\n /**\n * Copy content from one cell to another\n */\n private copyCellContent(\n sourceCell: CellAddress,\n targetCell: CellAddress,\n sourceTopLeft: CellAddress,\n options: CopyCellsOptions\n ): void {\n const sheet = this.workbookManager.getSheet({\n workbookName: sourceCell.workbookName,\n sheetName: sourceCell.sheetName,\n });\n\n if (!sheet) {\n return;\n }\n\n const key = `${String.fromCharCode(65 + sourceCell.colIndex)}${\n sourceCell.rowIndex + 1\n }`;\n const cellContent = sheet.content.get(key);\n\n if (!cellContent) {\n // Source cell is empty\n return;\n }\n\n let targetContent: SerializedCellValue;\n const copyType = options.type ?? \"formula\";\n\n if (copyType === \"value\") {\n // Copy evaluated value\n const evalResult =\n this.evaluationManager.getCellEvaluationResult(sourceCell);\n\n if (!evalResult || evalResult.type !== \"value\") {\n // If evaluation failed or is not a value, copy as-is\n targetContent = cellContent;\n } else {\n // Convert to literal value\n const result = evalResult.result;\n if (result.type === \"number\") {\n targetContent = result.value;\n } else if (result.type === \"string\") {\n targetContent = result.value;\n } else if (result.type === \"boolean\") {\n targetContent = result.value;\n } else {\n // Error or other type, copy as-is\n targetContent = cellContent;\n }\n }\n } else {\n // Copy formula\n if (typeof cellContent === \"string\" && cellContent.startsWith(\"=\")) {\n // Adjust formula references\n targetContent = this.adjustFormulaReferences(\n cellContent,\n {\n colIndex: sourceCell.colIndex,\n rowIndex: sourceCell.rowIndex,\n },\n {\n colIndex: targetCell.colIndex,\n rowIndex: targetCell.rowIndex,\n }\n );\n } else {\n // Not a formula, copy as-is\n targetContent = cellContent;\n }\n }\n\n // Set target cell content (using the engine's method through workbook manager)\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.set(targetKey, targetContent);\n }\n\n // Copy metadata if requested\n if (this.shouldInclude(options, \"metadata\")) {\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });\n } else {\n // Clear target metadata if source has none\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n }\n\n /**\n * Adjust formula references when copying\n * Based on autofill-utils.ts adjustFormulaReferences\n */\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Copy formatting (cellStyles and conditionalStyles) from source to target\n * Clears existing cell styles in target range first (Excel behavior)\n */\n private copyFormatting(\n sourceCells: CellAddress[],\n sourceTopLeft: CellAddress,\n target: CellAddress,\n rowOffset: number,\n colOffset: number\n ): void {\n // STEP 1: Clear existing cell styles in target range (Excel-like replacement)\n const sourceRange = this.getBoundingBox(sourceCells);\n const targetRange: RangeAddress = {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n range: this.adjustRange(sourceRange, rowOffset, colOffset),\n };\n\n this.styleManager.clearCellStylesInRange(targetRange);\n\n // Get all styles for the source workbook\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 2: Copy conditional styles\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceTopLeft.workbookName &&\n area.sheetName === sourceTopLeft.sheetName\n ) {\n // Calculate intersection of style range with source bounding box\n const intersection = intersectRanges(area.range, sourceRange);\n if (intersection) {\n // Copy only the intersection, offset to target\n const newStyle: ConditionalStyle = {\n areas: [\n {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n range: this.adjustRange(intersection, rowOffset, colOffset),\n },\n ],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // STEP 3: Copy cell styles\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceTopLeft.workbookName &&\n area.sheetName === sourceTopLeft.sheetName\n ) {\n // Calculate intersection of style range with source bounding box\n const intersection = intersectRanges(area.range, sourceRange);\n if (intersection) {\n // Copy only the intersection, offset to target\n const newStyle: DirectCellStyle = {\n areas: [\n {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n range: this.adjustRange(intersection, rowOffset, colOffset),\n },\n ],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n\n /**\n * Get bounding box for a set of cells\n */\n private getBoundingBox(cells: CellAddress[]): SpreadsheetRange {\n let minRow = Infinity;\n let maxRow = -Infinity;\n let minCol = Infinity;\n let maxCol = -Infinity;\n\n for (const cell of cells) {\n minRow = Math.min(minRow, cell.rowIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n minCol = Math.min(minCol, cell.colIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n }\n\n return {\n start: { col: minCol, row: minRow },\n end: {\n col: { type: \"number\", value: maxCol },\n row: { type: \"number\", value: maxRow },\n },\n };\n }\n\n /**\n * Adjust a range by row and column offsets\n */\n private adjustRange(\n range: SpreadsheetRange,\n rowOffset: number,\n colOffset: number\n ): SpreadsheetRange {\n return {\n start: {\n col: range.start.col + colOffset,\n row: range.start.row + rowOffset,\n },\n end: {\n col:\n range.end.col.type === \"number\"\n ? { type: \"number\", value: range.end.col.value + colOffset }\n : range.end.col,\n row:\n range.end.row.type === \"number\"\n ? { type: \"number\", value: range.end.row.value + rowOffset }\n : range.end.row,\n },\n };\n }\n\n /**\n * Clear source cells (for cut operation)\n */\n private clearSourceCells(cells: CellAddress[]): void {\n for (const cell of cells) {\n // Use setCellContent with empty string to properly clear the cell\n // This ensures indexes are updated and caches are properly managed\n this.workbookManager.setCellContent(cell, \"\");\n }\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n for (const targetRange of targetRanges) {\n this.fillRangeWithSeed(seedRange, targetRange, {\n copyContent: this.shouldInclude(options, \"content\"),\n copyStyles: this.shouldInclude(options, \"style\"),\n contentType: options.type ?? \"formula\",\n adjustFormulas: true,\n });\n }\n\n // Clear seed range if cut operation\n if (options.cut) {\n const seedCells = this.expandRangeToCells(seedRange);\n this.clearSourceCells(seedCells);\n }\n }\n\n /**\n * Fill a target range with a seed range using column-first strategy\n * Step 0: Clear existing cell styles in target (Excel behavior)\n * Step 1: Fill down - extend seed pattern vertically to match target height\n * Step 2: Replicate right - copy filled columns horizontally\n */\n private fillRangeWithSeed(\n seedRange: RangeAddress,\n targetRange: RangeAddress,\n options: {\n copyContent: boolean;\n copyStyles: boolean;\n contentType: \"value\" | \"formula\";\n adjustFormulas: boolean;\n }\n ): void {\n // Step 0: Clear existing cell styles in target range (Excel-like replacement)\n if (options.copyStyles) {\n this.styleManager.clearCellStylesInRange(targetRange);\n }\n\n const seedCells = this.expandRangeToCells(seedRange);\n const seedWidth = this.getRangeWidth(seedRange);\n const seedHeight = this.getRangeHeight(seedRange);\n const targetWidth = this.getRangeWidth(targetRange);\n const targetHeight = this.getRangeHeight(targetRange);\n\n // Step 1: Fill down - replicate seed pattern vertically\n const filledColumns: Map<\n string,\n { cell: CellAddress; content: SerializedCellValue }\n > = new Map();\n\n for (let col = 0; col < seedWidth; col++) {\n for (let row = 0; row < targetHeight; row++) {\n const seedRow = row % seedHeight;\n const seedCell = seedCells.find(\n (c) =>\n c.colIndex === seedRange.range.start.col + col &&\n c.rowIndex === seedRange.range.start.row + seedRow\n );\n\n if (seedCell) {\n const targetCell: CellAddress = {\n workbookName: targetRange.workbookName,\n sheetName: targetRange.sheetName,\n colIndex: targetRange.range.start.col + col,\n rowIndex: targetRange.range.start.row + row,\n };\n\n const rowDelta = targetCell.rowIndex - seedCell.rowIndex;\n const colDelta = targetCell.colIndex - seedCell.colIndex;\n\n if (options.copyContent) {\n this.copyCellContentWithOffset(\n seedCell,\n targetCell,\n rowDelta,\n colDelta,\n {\n type: options.contentType,\n cut: false,\n include: [\"content\"],\n }\n );\n }\n\n if (options.copyStyles) {\n this.copyCellFormatting(seedCell, targetCell);\n }\n\n // Store filled column for horizontal replication\n const key = `${targetCell.colIndex}-${targetCell.rowIndex}`;\n const sheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n const cellKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n const content = sheet?.content.get(cellKey) || \"\";\n filledColumns.set(key, { cell: targetCell, content });\n }\n }\n }\n\n // Step 2: Replicate right - copy filled columns horizontally\n if (targetWidth > seedWidth) {\n for (let col = seedWidth; col < targetWidth; col++) {\n const sourceCol = col % seedWidth;\n\n for (let row = 0; row < targetHeight; row++) {\n const sourceCell: CellAddress = {\n workbookName: targetRange.workbookName,\n sheetName: targetRange.sheetName,\n colIndex: targetRange.range.start.col + sourceCol,\n rowIndex: targetRange.range.start.row + row,\n };\n\n const targetCell: CellAddress = {\n workbookName: targetRange.workbookName,\n sheetName: targetRange.sheetName,\n colIndex: targetRange.range.start.col + col,\n rowIndex: targetRange.range.start.row + row,\n };\n\n const colDelta = targetCell.colIndex - sourceCell.colIndex;\n\n if (options.copyContent) {\n this.copyCellContentWithOffset(\n sourceCell,\n targetCell,\n 0,\n colDelta,\n {\n type: options.contentType,\n cut: false,\n include: [\"content\"],\n }\n );\n }\n\n if (options.copyStyles) {\n this.copyCellFormatting(sourceCell, targetCell);\n }\n }\n }\n }\n }\n\n /**\n * Get the width of a range (number of columns)\n */\n private getRangeWidth(range: RangeAddress): number {\n if (range.range.end.col.type === \"infinity\") {\n return 100; // Default for infinite\n }\n return range.range.end.col.value - range.range.start.col + 1;\n }\n\n /**\n * Get the height of a range (number of rows)\n */\n private getRangeHeight(range: RangeAddress): number {\n if (range.range.end.row.type === \"infinity\") {\n return 100; // Default for infinite\n }\n return range.range.end.row.value - range.range.start.row + 1;\n }\n\n /**\n * Expand a RangeAddress into an array of CellAddress\n * Handles finite ranges, row-bounded, and column-bounded ranges\n */\n public expandRangeToCells(rangeAddress: RangeAddress): CellAddress[] {\n const { workbookName, sheetName, range } = rangeAddress;\n const cells: CellAddress[] = [];\n\n const startCol = range.start.col;\n const startRow = range.start.row;\n\n // Determine end column\n let endCol: number;\n if (range.end.col.type === \"infinity\") {\n // Limit infinite column ranges to a reasonable size (e.g., 100 columns)\n endCol = startCol + 99;\n } else {\n endCol = range.end.col.value;\n }\n\n // Determine end row\n let endRow: number;\n if (range.end.row.type === \"infinity\") {\n // Limit infinite row ranges to a reasonable size (e.g., 100 rows)\n endRow = startRow + 99;\n } else {\n endRow = range.end.row.value;\n }\n\n // Generate all cells in the range\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n cells.push({\n workbookName,\n sheetName,\n colIndex: col,\n rowIndex: row,\n });\n }\n }\n\n return cells;\n }\n\n /**\n * Copy cell content with explicit row/column offset for fill operations\n */\n private copyCellContentWithOffset(\n sourceCell: CellAddress,\n targetCell: CellAddress,\n rowDelta: number,\n colDelta: number,\n options: CopyCellsOptions\n ): void {\n const sheet = this.workbookManager.getSheet({\n workbookName: sourceCell.workbookName,\n sheetName: sourceCell.sheetName,\n });\n\n if (!sheet) {\n return;\n }\n\n const key = `${String.fromCharCode(65 + sourceCell.colIndex)}${\n sourceCell.rowIndex + 1\n }`;\n const cellContent = sheet.content.get(key);\n\n if (!cellContent) {\n // Source cell is empty - clear target\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.delete(targetKey);\n }\n return;\n }\n\n let targetContent: SerializedCellValue;\n const copyType = options.type ?? \"formula\";\n\n if (copyType === \"value\") {\n // Copy evaluated value\n const evalResult =\n this.evaluationManager.getCellEvaluationResult(sourceCell);\n\n if (!evalResult || evalResult.type !== \"value\") {\n // If evaluation failed or is not a value, copy as-is\n targetContent = cellContent;\n } else {\n // Convert to literal value\n const result = evalResult.result;\n if (result.type === \"number\") {\n targetContent = result.value;\n } else if (result.type === \"string\") {\n targetContent = result.value;\n } else if (result.type === \"boolean\") {\n targetContent = result.value;\n } else {\n // Error or other type, copy as-is\n targetContent = cellContent;\n }\n }\n } else {\n // Copy formula with offset adjustment\n if (typeof cellContent === \"string\" && cellContent.startsWith(\"=\")) {\n // Adjust formula references based on offset\n targetContent = this.adjustFormulaWithOffset(\n cellContent,\n rowDelta,\n colDelta\n );\n } else {\n // Not a formula, copy as-is\n targetContent = cellContent;\n }\n }\n\n // Set target cell content\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.set(targetKey, targetContent);\n }\n\n // Copy metadata if requested\n if (this.shouldInclude(options, \"metadata\")) {\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });\n } else {\n // Clear target metadata if source has none\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n }\n\n /**\n * Adjust formula references by a specific row/column offset\n */\n private adjustFormulaWithOffset(\n formula: string,\n rowDelta: number,\n colDelta: number\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula with offset:\", error);\n return formula;\n }\n }\n\n /**\n * Copy formatting from one cell to another\n * Clears existing cell styles at target (Excel behavior) before copying new ones\n */\n private copyCellFormatting(\n sourceCell: CellAddress,\n targetCell: CellAddress\n ): void {\n // STEP 1: Clear existing cell styles at target cell (Excel-like replacement)\n const targetCellRange: RangeAddress = {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n };\n\n this.styleManager.clearCellStylesInRange(targetCellRange);\n\n // Get all styles that intersect with the source cell\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: sourceCell.colIndex, row: sourceCell.rowIndex },\n end: {\n col: { type: \"number\", value: sourceCell.colIndex },\n row: { type: \"number\", value: sourceCell.rowIndex },\n },\n };\n\n // STEP 2: Copy conditional styles that apply to source cell\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceCell.workbookName &&\n area.sheetName === sourceCell.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n // Apply style to target cell\n const newStyle: ConditionalStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: {\n col: targetCell.colIndex,\n row: targetCell.rowIndex,\n },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // STEP 3: Copy cell styles that apply to source cell\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceCell.workbookName &&\n area.sheetName === sourceCell.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n // Apply style to target cell\n const newStyle: DirectCellStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: {\n col: targetCell.colIndex,\n row: targetCell.rowIndex,\n },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n}\n"
5
+ "/**\n * CopyManager - Manages cell copy/paste operations\n */\n\nimport type {\n CellAddress,\n CopyCellsOptions,\n CopyCellsIncludePart,\n ConditionalStyle,\n DirectCellStyle,\n LocalCellAddress,\n RangeAddress,\n RangeMetadataInput,\n SerializedCellValue,\n SpreadsheetRange,\n} from \"../types.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport type { EvaluationManager } from \"./evaluation-manager.mjs\";\nimport type { StyleManager } from \"./style-manager.mjs\";\nimport type { RangeMetadataManager } from \"./range-metadata-manager.mjs\";\nimport { parseFormula } from \"../../parser/parser.mjs\";\nimport { astToString } from \"../../parser/formatter.mjs\";\nimport { transformAST } from \"../ast-traverser.mjs\";\nimport type { ReferenceNode, RangeNode } from \"../../parser/ast.mjs\";\nimport { getCellReference, isCellInRange } from \"../utils.mjs\";\nimport { intersectRanges } from \"../utils/range-utils.mjs\";\nimport {\n updateReferencesForMovedCells,\n type MovedCellsInfo,\n} from \"../cell-mover.mjs\";\n\n/**\n * Snapshot of a cell's content, metadata, and styles\n */\ninterface CellSnapshot {\n address: CellAddress;\n content: SerializedCellValue | undefined;\n metadata: unknown | undefined;\n matchingCellStyles?: DirectCellStyle[];\n matchingConditionalStyles?: ConditionalStyle[];\n}\n\nexport class CopyManager {\n constructor(\n private workbookManager: WorkbookManager,\n private evaluationManager: EvaluationManager,\n private styleManager: StyleManager,\n private rangeMetadataManager: RangeMetadataManager\n ) {}\n\n /**\n * Normalize the include option to an array of parts to copy\n */\n private normalizeInclude(\n include: CopyCellsOptions[\"include\"]\n ): CopyCellsIncludePart[] {\n if (!include || include === \"all\") {\n return [\"content\", \"style\", \"cellMetadata\", \"rangeMetadata\"];\n }\n return include;\n }\n\n /**\n * Check if a specific part should be included in the copy operation\n */\n private shouldInclude(\n options: CopyCellsOptions,\n part: CopyCellsIncludePart\n ): boolean {\n const normalized = this.normalizeInclude(options.include);\n return normalized.includes(part);\n }\n\n /**\n * Paste cells from source to target\n * Delegates to cutCells for move operations or copyOnlyCells for copy operations\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n if (source.length === 0) {\n return;\n }\n\n if (options.cut === true) {\n return this.cutCells(source, target, options);\n } else {\n return this.copyOnlyCells(source, target, options);\n }\n }\n\n /**\n * Cut cells: Proper snapshot flow for move operations\n * 1. Snapshot source cells (with styles)\n * 2. Remove source cells and punch holes in style areas\n * 3. Update references in OTHER cells (not in moved set)\n * 4. Update formulas in snapshot and apply to target\n */\n private cutCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n const topLeft = this.findTopLeft(source);\n const rowOffset = target.rowIndex - topLeft.rowIndex;\n const colOffset = target.colIndex - topLeft.colIndex;\n\n // 1. Snapshot source cells (with styles)\n const snapshot = this.snapshotCellsWithStyles(source);\n const rangeMetadataCopies = this.shouldInclude(options, \"rangeMetadata\")\n ? this.collectRangeMetadataCopies(\n source,\n topLeft,\n target,\n rowOffset,\n colOffset\n )\n : [];\n const sourceRange = this.getBoundingBox(source);\n const targetRange = this.adjustRange(sourceRange, rowOffset, colOffset);\n\n // 2. Remove source cells (content) and punch holes in styles\n this.clearSourceCells(source);\n\n if (this.shouldInclude(options, \"cellMetadata\")) {\n for (const cell of source) {\n this.workbookManager.setCellMetadata(cell, undefined);\n }\n }\n\n // Punch holes in style areas for each cut cell\n if (this.shouldInclude(options, \"style\")) {\n for (const cell of source) {\n const cellRange: RangeAddress = {\n workbookName: cell.workbookName,\n sheetName: cell.sheetName,\n range: {\n start: { col: cell.colIndex, row: cell.rowIndex },\n end: {\n col: { type: \"number\", value: cell.colIndex },\n row: { type: \"number\", value: cell.rowIndex },\n },\n },\n };\n this.styleManager.clearCellStylesInRange(cellRange);\n }\n }\n\n if (this.shouldInclude(options, \"rangeMetadata\")) {\n this.rangeMetadataManager.clearRangeMetadataInRange(\n this.getRangeAddressFromBoundingBox(topLeft, sourceRange)\n );\n this.rangeMetadataManager.clearRangeMetadataInRange(\n this.getRangeAddressFromBoundingBox(target, targetRange)\n );\n }\n\n // 3. Update references in OTHER cells (not in moved set)\n const movedCellsSet = new Set(\n source.map(\n (c) => `${c.workbookName}:${c.sheetName}:${c.colIndex}:${c.rowIndex}`\n )\n );\n\n const movedCellsInfo: MovedCellsInfo = {\n cellsSet: movedCellsSet,\n workbookName: topLeft.workbookName,\n sheetName: topLeft.sheetName,\n rowOffset,\n colOffset,\n };\n\n this.workbookManager.updateFormulasExcluding(movedCellsSet, (formula) =>\n updateReferencesForMovedCells(formula, movedCellsInfo)\n );\n\n // 4. Update formulas in snapshot and apply to target\n for (let i = 0; i < snapshot.length; i++) {\n const snap = snapshot[i]!;\n const sourceCell = source[i]!;\n const targetCell: CellAddress = {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n colIndex: sourceCell.colIndex + colOffset,\n rowIndex: sourceCell.rowIndex + rowOffset,\n };\n\n // Apply content (with formula adjustment)\n if (this.shouldInclude(options, \"content\") && snap.content) {\n let targetContent = snap.content;\n\n if (typeof snap.content === \"string\" && snap.content.startsWith(\"=\")) {\n // Adjust formula references relative to new position\n targetContent = this.adjustFormulaReferences(\n snap.content,\n {\n colIndex: snap.address.colIndex,\n rowIndex: snap.address.rowIndex,\n },\n {\n colIndex: targetCell.colIndex,\n rowIndex: targetCell.rowIndex,\n }\n );\n }\n\n // Use setCellContent to ensure proper cache invalidation and dependency tracking\n this.workbookManager.setCellContent(targetCell, targetContent);\n }\n\n // Apply cell metadata\n if (this.shouldInclude(options, \"cellMetadata\")) {\n if (snap.metadata) {\n this.workbookManager.setCellMetadata(targetCell, {\n ...snap.metadata,\n });\n } else {\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n\n // Apply styles from snapshot to new location\n if (this.shouldInclude(options, \"style\")) {\n this.applyStylesFromSnapshot(snap, targetCell);\n }\n }\n\n if (this.shouldInclude(options, \"rangeMetadata\")) {\n this.applyRangeMetadataCopies(rangeMetadataCopies);\n }\n }\n\n /**\n * Copy cells: Standard copy operation (not cut/move)\n * Snapshot → Copy with adjustment → Copy formatting\n */\n private copyOnlyCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n const topLeft = this.findTopLeft(source);\n const rowOffset = target.rowIndex - topLeft.rowIndex;\n const colOffset = target.colIndex - topLeft.colIndex;\n\n // SNAPSHOT source cells (handles overlapping ranges)\n const snapshot = this.snapshotCells(source);\n\n // Copy cell contents if requested (from snapshot, not live cells)\n if (this.shouldInclude(options, \"content\")) {\n for (let i = 0; i < source.length; i++) {\n const sourceCell = source[i]!;\n const cellSnapshot = snapshot[i]!;\n const targetCell: CellAddress = {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n colIndex: sourceCell.colIndex + colOffset,\n rowIndex: sourceCell.rowIndex + rowOffset,\n };\n\n this.copyCellContentFromSnapshot(\n cellSnapshot,\n targetCell,\n topLeft,\n options\n );\n }\n }\n\n // Copy cell metadata if requested\n if (this.shouldInclude(options, \"cellMetadata\")) {\n for (let i = 0; i < source.length; i++) {\n const sourceCell = source[i]!;\n const cellSnapshot = snapshot[i]!;\n const targetCell: CellAddress = {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n colIndex: sourceCell.colIndex + colOffset,\n rowIndex: sourceCell.rowIndex + rowOffset,\n };\n\n this.copyCellMetadataFromSnapshot(cellSnapshot, targetCell);\n }\n }\n\n // Copy formatting if requested\n if (this.shouldInclude(options, \"style\")) {\n this.copyFormatting(source, topLeft, target, rowOffset, colOffset);\n }\n\n // Copy range metadata if requested\n if (this.shouldInclude(options, \"rangeMetadata\")) {\n this.copyRangeMetadata(source, topLeft, target, rowOffset, colOffset);\n }\n }\n\n /**\n * Find the top-left cell (minimum row/col indices)\n */\n private findTopLeft(cells: CellAddress[]): CellAddress {\n let minRow = Infinity;\n let minCol = Infinity;\n let topLeftCell = cells[0]!;\n\n for (const cell of cells) {\n if (\n cell.rowIndex < minRow ||\n (cell.rowIndex === minRow && cell.colIndex < minCol)\n ) {\n minRow = cell.rowIndex;\n minCol = cell.colIndex;\n topLeftCell = cell;\n }\n }\n\n return topLeftCell;\n }\n\n /**\n * Create a snapshot of cells' content and metadata\n * This prevents issues with overlapping ranges where source and target overlap\n * Used for copy operations (not cut)\n */\n private snapshotCells(cells: CellAddress[]): CellSnapshot[] {\n return cells.map((cell) => {\n const sheet = this.workbookManager.getSheet({\n workbookName: cell.workbookName,\n sheetName: cell.sheetName,\n });\n\n const key = `${String.fromCharCode(65 + cell.colIndex)}${\n cell.rowIndex + 1\n }`;\n const content = sheet?.content.get(key);\n const metadata = this.workbookManager.getCellMetadata(cell);\n\n return {\n address: cell,\n content,\n metadata,\n };\n });\n }\n\n /**\n * Create a snapshot of cells with content, metadata, AND styles\n * Used for cut operations to preserve all cell information\n */\n private snapshotCellsWithStyles(cells: CellAddress[]): CellSnapshot[] {\n const allCellStyles = this.styleManager.getAllCellStyles();\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n\n return cells.map((cell) => {\n const sheet = this.workbookManager.getSheet({\n workbookName: cell.workbookName,\n sheetName: cell.sheetName,\n });\n\n const key = getCellReference(cell);\n const content = sheet?.content.get(key);\n const metadata = this.workbookManager.getCellMetadata(cell);\n\n // Find all styles that apply to this cell\n const matchingCellStyles = allCellStyles.filter((style) =>\n style.areas.some(\n (area) =>\n area.workbookName === cell.workbookName &&\n area.sheetName === cell.sheetName &&\n isCellInRange(cell, area.range)\n )\n );\n\n const matchingConditionalStyles = allConditionalStyles.filter((style) =>\n style.areas.some(\n (area) =>\n area.workbookName === cell.workbookName &&\n area.sheetName === cell.sheetName &&\n isCellInRange(cell, area.range)\n )\n );\n\n return {\n address: cell,\n content,\n metadata,\n matchingCellStyles,\n matchingConditionalStyles,\n };\n });\n }\n\n /**\n * Apply styles from a snapshot to a target cell\n * Creates new style areas at the target location\n */\n private applyStylesFromSnapshot(\n snapshot: CellSnapshot,\n targetCell: CellAddress\n ): void {\n // Apply cell styles\n if (snapshot.matchingCellStyles) {\n for (const style of snapshot.matchingCellStyles) {\n const newStyle: DirectCellStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n\n // Apply conditional styles\n if (snapshot.matchingConditionalStyles) {\n for (const style of snapshot.matchingConditionalStyles) {\n const newStyle: ConditionalStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n\n /**\n * Copy content from a cell snapshot to a target cell\n */\n private copyCellContentFromSnapshot(\n snapshot: CellSnapshot,\n targetCell: CellAddress,\n sourceTopLeft: CellAddress,\n options: CopyCellsOptions\n ): void {\n if (!snapshot.content) {\n // Source cell was empty\n return;\n }\n\n let targetContent: SerializedCellValue;\n const copyType = options.type ?? \"formula\";\n\n if (copyType === \"value\") {\n // Copy evaluated value\n const evalResult = this.evaluationManager.getCellEvaluationResult(\n snapshot.address\n );\n\n if (!evalResult || evalResult.type !== \"value\") {\n // If evaluation failed or is not a value, copy as-is\n targetContent = snapshot.content;\n } else {\n // Convert to literal value\n const result = evalResult.result;\n if (result.type === \"number\") {\n targetContent = result.value;\n } else if (result.type === \"string\") {\n targetContent = result.value;\n } else if (result.type === \"boolean\") {\n targetContent = result.value;\n } else {\n // Error or other type, copy as-is\n targetContent = snapshot.content;\n }\n }\n } else {\n // Copy formula\n if (\n typeof snapshot.content === \"string\" &&\n snapshot.content.startsWith(\"=\")\n ) {\n // Adjust formula references\n targetContent = this.adjustFormulaReferences(\n snapshot.content,\n {\n colIndex: snapshot.address.colIndex,\n rowIndex: snapshot.address.rowIndex,\n },\n {\n colIndex: targetCell.colIndex,\n rowIndex: targetCell.rowIndex,\n }\n );\n } else {\n // Not a formula, copy as-is\n targetContent = snapshot.content;\n }\n }\n\n // Set target cell content\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.set(targetKey, targetContent);\n }\n\n }\n\n private copyCellMetadataFromSnapshot(\n snapshot: CellSnapshot,\n targetCell: CellAddress\n ): void {\n if (snapshot.metadata) {\n this.workbookManager.setCellMetadata(targetCell, {\n ...snapshot.metadata,\n });\n } else {\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n\n /**\n * Update all formula references when cells are cut (moved)\n */\n /**\n * Copy content from one cell to another\n */\n private copyCellContent(\n sourceCell: CellAddress,\n targetCell: CellAddress,\n sourceTopLeft: CellAddress,\n options: CopyCellsOptions\n ): void {\n const sheet = this.workbookManager.getSheet({\n workbookName: sourceCell.workbookName,\n sheetName: sourceCell.sheetName,\n });\n\n if (!sheet) {\n return;\n }\n\n const key = `${String.fromCharCode(65 + sourceCell.colIndex)}${\n sourceCell.rowIndex + 1\n }`;\n const cellContent = sheet.content.get(key);\n\n if (!cellContent) {\n // Source cell is empty\n return;\n }\n\n let targetContent: SerializedCellValue;\n const copyType = options.type ?? \"formula\";\n\n if (copyType === \"value\") {\n // Copy evaluated value\n const evalResult =\n this.evaluationManager.getCellEvaluationResult(sourceCell);\n\n if (!evalResult || evalResult.type !== \"value\") {\n // If evaluation failed or is not a value, copy as-is\n targetContent = cellContent;\n } else {\n // Convert to literal value\n const result = evalResult.result;\n if (result.type === \"number\") {\n targetContent = result.value;\n } else if (result.type === \"string\") {\n targetContent = result.value;\n } else if (result.type === \"boolean\") {\n targetContent = result.value;\n } else {\n // Error or other type, copy as-is\n targetContent = cellContent;\n }\n }\n } else {\n // Copy formula\n if (typeof cellContent === \"string\" && cellContent.startsWith(\"=\")) {\n // Adjust formula references\n targetContent = this.adjustFormulaReferences(\n cellContent,\n {\n colIndex: sourceCell.colIndex,\n rowIndex: sourceCell.rowIndex,\n },\n {\n colIndex: targetCell.colIndex,\n rowIndex: targetCell.rowIndex,\n }\n );\n } else {\n // Not a formula, copy as-is\n targetContent = cellContent;\n }\n }\n\n // Set target cell content (using the engine's method through workbook manager)\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.set(targetKey, targetContent);\n }\n\n // Copy cell metadata if requested\n if (this.shouldInclude(options, \"cellMetadata\")) {\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });\n } else {\n // Clear target metadata if source has none\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n }\n\n /**\n * Adjust formula references when copying\n * Based on autofill-utils.ts adjustFormulaReferences\n */\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Copy formatting (cellStyles and conditionalStyles) from source to target\n * Clears existing cell styles in target range first (Excel behavior)\n */\n private copyFormatting(\n sourceCells: CellAddress[],\n sourceTopLeft: CellAddress,\n target: CellAddress,\n rowOffset: number,\n colOffset: number\n ): void {\n // STEP 1: Clear existing cell styles in target range (Excel-like replacement)\n const sourceRange = this.getBoundingBox(sourceCells);\n const targetRange: RangeAddress = {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n range: this.adjustRange(sourceRange, rowOffset, colOffset),\n };\n\n this.styleManager.clearCellStylesInRange(targetRange);\n\n // Get all styles for the source workbook\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 2: Copy conditional styles\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceTopLeft.workbookName &&\n area.sheetName === sourceTopLeft.sheetName\n ) {\n // Calculate intersection of style range with source bounding box\n const intersection = intersectRanges(area.range, sourceRange);\n if (intersection) {\n // Copy only the intersection, offset to target\n const newStyle: ConditionalStyle = {\n areas: [\n {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n range: this.adjustRange(intersection, rowOffset, colOffset),\n },\n ],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // STEP 3: Copy cell styles\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceTopLeft.workbookName &&\n area.sheetName === sourceTopLeft.sheetName\n ) {\n // Calculate intersection of style range with source bounding box\n const intersection = intersectRanges(area.range, sourceRange);\n if (intersection) {\n // Copy only the intersection, offset to target\n const newStyle: DirectCellStyle = {\n areas: [\n {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n range: this.adjustRange(intersection, rowOffset, colOffset),\n },\n ],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n\n private cloneMetadataValue(metadata: unknown): unknown {\n if (!metadata || typeof metadata !== \"object\") {\n return metadata;\n }\n\n try {\n return structuredClone(metadata);\n } catch {\n return Array.isArray(metadata) ? [...metadata] : { ...metadata };\n }\n }\n\n private getRangeAddressFromBoundingBox(\n base: Pick<CellAddress, \"workbookName\" | \"sheetName\">,\n range: SpreadsheetRange\n ): RangeAddress {\n return {\n workbookName: base.workbookName,\n sheetName: base.sheetName,\n range,\n };\n }\n\n private collectRangeMetadataCopies(\n sourceCells: CellAddress[],\n sourceTopLeft: CellAddress,\n target: CellAddress,\n rowOffset: number,\n colOffset: number\n ): RangeMetadataInput[] {\n const sourceRange = this.getBoundingBox(sourceCells);\n const copies: RangeMetadataInput[] = [];\n\n for (const entry of this.rangeMetadataManager.getAllRangeMetadata()) {\n for (const area of entry.areas) {\n if (\n area.workbookName !== sourceTopLeft.workbookName ||\n area.sheetName !== sourceTopLeft.sheetName\n ) {\n continue;\n }\n\n const intersection = intersectRanges(area.range, sourceRange);\n if (!intersection) {\n continue;\n }\n\n copies.push({\n areas: [\n {\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n range: this.adjustRange(intersection, rowOffset, colOffset),\n },\n ],\n metadata: this.cloneMetadataValue(entry.metadata),\n });\n }\n }\n\n return copies;\n }\n\n private applyRangeMetadataCopies(copies: RangeMetadataInput[]): void {\n for (const copy of copies) {\n this.rangeMetadataManager.addRangeMetadata(copy);\n }\n }\n\n private copyRangeMetadata(\n sourceCells: CellAddress[],\n sourceTopLeft: CellAddress,\n target: CellAddress,\n rowOffset: number,\n colOffset: number\n ): void {\n const sourceRange = this.getBoundingBox(sourceCells);\n const targetRange = this.adjustRange(sourceRange, rowOffset, colOffset);\n const copies = this.collectRangeMetadataCopies(\n sourceCells,\n sourceTopLeft,\n target,\n rowOffset,\n colOffset\n );\n\n this.rangeMetadataManager.clearRangeMetadataInRange(\n this.getRangeAddressFromBoundingBox(target, targetRange)\n );\n this.applyRangeMetadataCopies(copies);\n }\n\n /**\n * Get bounding box for a set of cells\n */\n private getBoundingBox(cells: CellAddress[]): SpreadsheetRange {\n let minRow = Infinity;\n let maxRow = -Infinity;\n let minCol = Infinity;\n let maxCol = -Infinity;\n\n for (const cell of cells) {\n minRow = Math.min(minRow, cell.rowIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n minCol = Math.min(minCol, cell.colIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n }\n\n return {\n start: { col: minCol, row: minRow },\n end: {\n col: { type: \"number\", value: maxCol },\n row: { type: \"number\", value: maxRow },\n },\n };\n }\n\n /**\n * Adjust a range by row and column offsets\n */\n private adjustRange(\n range: SpreadsheetRange,\n rowOffset: number,\n colOffset: number\n ): SpreadsheetRange {\n return {\n start: {\n col: range.start.col + colOffset,\n row: range.start.row + rowOffset,\n },\n end: {\n col:\n range.end.col.type === \"number\"\n ? { type: \"number\", value: range.end.col.value + colOffset }\n : range.end.col,\n row:\n range.end.row.type === \"number\"\n ? { type: \"number\", value: range.end.row.value + rowOffset }\n : range.end.row,\n },\n };\n }\n\n /**\n * Clear source cells (for cut operation)\n */\n private clearSourceCells(cells: CellAddress[]): void {\n for (const cell of cells) {\n // Use setCellContent with empty string to properly clear the cell\n // This ensures indexes are updated and caches are properly managed\n this.workbookManager.setCellContent(cell, \"\");\n }\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n for (const targetRange of targetRanges) {\n this.fillRangeWithSeed(seedRange, targetRange, {\n copyContent: this.shouldInclude(options, \"content\"),\n copyStyles: this.shouldInclude(options, \"style\"),\n copyCellMetadata: this.shouldInclude(options, \"cellMetadata\"),\n copyRangeMetadata: this.shouldInclude(options, \"rangeMetadata\"),\n contentType: options.type ?? \"formula\",\n adjustFormulas: true,\n });\n }\n\n // Clear seed range if cut operation\n if (options.cut) {\n const seedCells = this.expandRangeToCells(seedRange);\n this.clearSourceCells(seedCells);\n }\n }\n\n /**\n * Fill a target range with a seed range using column-first strategy\n * Step 0: Clear existing cell styles in target (Excel behavior)\n * Step 1: Fill down - extend seed pattern vertically to match target height\n * Step 2: Replicate right - copy filled columns horizontally\n */\n private fillRangeWithSeed(\n seedRange: RangeAddress,\n targetRange: RangeAddress,\n options: {\n copyContent: boolean;\n copyStyles: boolean;\n copyCellMetadata: boolean;\n copyRangeMetadata: boolean;\n contentType: \"value\" | \"formula\";\n adjustFormulas: boolean;\n }\n ): void {\n // Step 0: Clear existing cell styles in target range (Excel-like replacement)\n if (options.copyStyles) {\n this.styleManager.clearCellStylesInRange(targetRange);\n }\n if (options.copyRangeMetadata) {\n this.rangeMetadataManager.clearRangeMetadataInRange(targetRange);\n }\n\n const seedCells = this.expandRangeToCells(seedRange);\n const seedWidth = this.getRangeWidth(seedRange);\n const seedHeight = this.getRangeHeight(seedRange);\n const targetWidth = this.getRangeWidth(targetRange);\n const targetHeight = this.getRangeHeight(targetRange);\n\n // Step 1: Fill down - replicate seed pattern vertically\n const filledColumns: Map<\n string,\n { cell: CellAddress; content: SerializedCellValue }\n > = new Map();\n\n for (let col = 0; col < seedWidth; col++) {\n for (let row = 0; row < targetHeight; row++) {\n const seedRow = row % seedHeight;\n const seedCell = seedCells.find(\n (c) =>\n c.colIndex === seedRange.range.start.col + col &&\n c.rowIndex === seedRange.range.start.row + seedRow\n );\n\n if (seedCell) {\n const targetCell: CellAddress = {\n workbookName: targetRange.workbookName,\n sheetName: targetRange.sheetName,\n colIndex: targetRange.range.start.col + col,\n rowIndex: targetRange.range.start.row + row,\n };\n\n const rowDelta = targetCell.rowIndex - seedCell.rowIndex;\n const colDelta = targetCell.colIndex - seedCell.colIndex;\n\n if (options.copyContent) {\n this.copyCellContentWithOffset(\n seedCell,\n targetCell,\n rowDelta,\n colDelta,\n {\n type: options.contentType,\n cut: false,\n include: [\"content\"],\n }\n );\n }\n\n if (options.copyStyles) {\n this.copyCellFormatting(seedCell, targetCell);\n }\n\n if (options.copyCellMetadata) {\n this.copyCellMetadata(seedCell, targetCell);\n }\n\n if (options.copyRangeMetadata) {\n this.copyCellRangeMetadata(seedCell, targetCell);\n }\n\n // Store filled column for horizontal replication\n const key = `${targetCell.colIndex}-${targetCell.rowIndex}`;\n const sheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n const cellKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n const content = sheet?.content.get(cellKey) || \"\";\n filledColumns.set(key, { cell: targetCell, content });\n }\n }\n }\n\n // Step 2: Replicate right - copy filled columns horizontally\n if (targetWidth > seedWidth) {\n for (let col = seedWidth; col < targetWidth; col++) {\n const sourceCol = col % seedWidth;\n\n for (let row = 0; row < targetHeight; row++) {\n const sourceCell: CellAddress = {\n workbookName: targetRange.workbookName,\n sheetName: targetRange.sheetName,\n colIndex: targetRange.range.start.col + sourceCol,\n rowIndex: targetRange.range.start.row + row,\n };\n\n const targetCell: CellAddress = {\n workbookName: targetRange.workbookName,\n sheetName: targetRange.sheetName,\n colIndex: targetRange.range.start.col + col,\n rowIndex: targetRange.range.start.row + row,\n };\n\n const colDelta = targetCell.colIndex - sourceCell.colIndex;\n\n if (options.copyContent) {\n this.copyCellContentWithOffset(\n sourceCell,\n targetCell,\n 0,\n colDelta,\n {\n type: options.contentType,\n cut: false,\n include: [\"content\"],\n }\n );\n }\n\n if (options.copyStyles) {\n this.copyCellFormatting(sourceCell, targetCell);\n }\n\n if (options.copyCellMetadata) {\n this.copyCellMetadata(sourceCell, targetCell);\n }\n\n if (options.copyRangeMetadata) {\n this.copyCellRangeMetadata(sourceCell, targetCell);\n }\n }\n }\n }\n }\n\n /**\n * Get the width of a range (number of columns)\n */\n private getRangeWidth(range: RangeAddress): number {\n if (range.range.end.col.type === \"infinity\") {\n return 100; // Default for infinite\n }\n return range.range.end.col.value - range.range.start.col + 1;\n }\n\n /**\n * Get the height of a range (number of rows)\n */\n private getRangeHeight(range: RangeAddress): number {\n if (range.range.end.row.type === \"infinity\") {\n return 100; // Default for infinite\n }\n return range.range.end.row.value - range.range.start.row + 1;\n }\n\n /**\n * Expand a RangeAddress into an array of CellAddress\n * Handles finite ranges, row-bounded, and column-bounded ranges\n */\n public expandRangeToCells(rangeAddress: RangeAddress): CellAddress[] {\n const { workbookName, sheetName, range } = rangeAddress;\n const cells: CellAddress[] = [];\n\n const startCol = range.start.col;\n const startRow = range.start.row;\n\n // Determine end column\n let endCol: number;\n if (range.end.col.type === \"infinity\") {\n // Limit infinite column ranges to a reasonable size (e.g., 100 columns)\n endCol = startCol + 99;\n } else {\n endCol = range.end.col.value;\n }\n\n // Determine end row\n let endRow: number;\n if (range.end.row.type === \"infinity\") {\n // Limit infinite row ranges to a reasonable size (e.g., 100 rows)\n endRow = startRow + 99;\n } else {\n endRow = range.end.row.value;\n }\n\n // Generate all cells in the range\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n cells.push({\n workbookName,\n sheetName,\n colIndex: col,\n rowIndex: row,\n });\n }\n }\n\n return cells;\n }\n\n /**\n * Copy cell content with explicit row/column offset for fill operations\n */\n private copyCellContentWithOffset(\n sourceCell: CellAddress,\n targetCell: CellAddress,\n rowDelta: number,\n colDelta: number,\n options: CopyCellsOptions\n ): void {\n const sheet = this.workbookManager.getSheet({\n workbookName: sourceCell.workbookName,\n sheetName: sourceCell.sheetName,\n });\n\n if (!sheet) {\n return;\n }\n\n const key = `${String.fromCharCode(65 + sourceCell.colIndex)}${\n sourceCell.rowIndex + 1\n }`;\n const cellContent = sheet.content.get(key);\n\n if (!cellContent) {\n // Source cell is empty - clear target\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.delete(targetKey);\n }\n return;\n }\n\n let targetContent: SerializedCellValue;\n const copyType = options.type ?? \"formula\";\n\n if (copyType === \"value\") {\n // Copy evaluated value\n const evalResult =\n this.evaluationManager.getCellEvaluationResult(sourceCell);\n\n if (!evalResult || evalResult.type !== \"value\") {\n // If evaluation failed or is not a value, copy as-is\n targetContent = cellContent;\n } else {\n // Convert to literal value\n const result = evalResult.result;\n if (result.type === \"number\") {\n targetContent = result.value;\n } else if (result.type === \"string\") {\n targetContent = result.value;\n } else if (result.type === \"boolean\") {\n targetContent = result.value;\n } else {\n // Error or other type, copy as-is\n targetContent = cellContent;\n }\n }\n } else {\n // Copy formula with offset adjustment\n if (typeof cellContent === \"string\" && cellContent.startsWith(\"=\")) {\n // Adjust formula references based on offset\n targetContent = this.adjustFormulaWithOffset(\n cellContent,\n rowDelta,\n colDelta\n );\n } else {\n // Not a formula, copy as-is\n targetContent = cellContent;\n }\n }\n\n // Set target cell content\n const targetSheet = this.workbookManager.getSheet({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n if (targetSheet) {\n const targetKey = `${String.fromCharCode(65 + targetCell.colIndex)}${\n targetCell.rowIndex + 1\n }`;\n targetSheet.content.set(targetKey, targetContent);\n }\n\n // Copy cell metadata if requested\n if (this.shouldInclude(options, \"cellMetadata\")) {\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });\n } else {\n // Clear target metadata if source has none\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n }\n\n /**\n * Adjust formula references by a specific row/column offset\n */\n private adjustFormulaWithOffset(\n formula: string,\n rowDelta: number,\n colDelta: number\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula with offset:\", error);\n return formula;\n }\n }\n\n private copyCellMetadata(\n sourceCell: CellAddress,\n targetCell: CellAddress\n ): void {\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCell);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCell, { ...sourceMetadata });\n } else {\n this.workbookManager.setCellMetadata(targetCell, undefined);\n }\n }\n\n private copyCellRangeMetadata(\n sourceCell: CellAddress,\n targetCell: CellAddress\n ): void {\n const targetCellRange: RangeAddress = {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n };\n\n this.rangeMetadataManager.clearRangeMetadataInRange(targetCellRange);\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: sourceCell.colIndex, row: sourceCell.rowIndex },\n end: {\n col: { type: \"number\", value: sourceCell.colIndex },\n row: { type: \"number\", value: sourceCell.rowIndex },\n },\n };\n\n for (const entry of this.rangeMetadataManager.getAllRangeMetadata()) {\n for (const area of entry.areas) {\n if (\n area.workbookName !== sourceCell.workbookName ||\n area.sheetName !== sourceCell.sheetName\n ) {\n continue;\n }\n\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (!intersection) {\n continue;\n }\n\n this.rangeMetadataManager.addRangeMetadata({\n areas: [targetCellRange],\n metadata: this.cloneMetadataValue(entry.metadata),\n });\n }\n }\n }\n\n /**\n * Copy formatting from one cell to another\n * Clears existing cell styles at target (Excel behavior) before copying new ones\n */\n private copyCellFormatting(\n sourceCell: CellAddress,\n targetCell: CellAddress\n ): void {\n // STEP 1: Clear existing cell styles at target cell (Excel-like replacement)\n const targetCellRange: RangeAddress = {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n };\n\n this.styleManager.clearCellStylesInRange(targetCellRange);\n\n // Get all styles that intersect with the source cell\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: sourceCell.colIndex, row: sourceCell.rowIndex },\n end: {\n col: { type: \"number\", value: sourceCell.colIndex },\n row: { type: \"number\", value: sourceCell.rowIndex },\n },\n };\n\n // STEP 2: Copy conditional styles that apply to source cell\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceCell.workbookName &&\n area.sheetName === sourceCell.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n // Apply style to target cell\n const newStyle: ConditionalStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: {\n col: targetCell.colIndex,\n row: targetCell.rowIndex,\n },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // STEP 3: Copy cell styles that apply to source cell\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === sourceCell.workbookName &&\n area.sheetName === sourceCell.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n // Apply style to target cell\n const newStyle: DirectCellStyle = {\n areas: [\n {\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n range: {\n start: {\n col: targetCell.colIndex,\n row: targetCell.rowIndex,\n },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n ],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "9E025649C6A89F3564756E2164756E21",
7
+ "mappings": ";AAoBA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAgBO,MAAM,YAAY;AAAA,EAEb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAJV,WAAW,CACD,iBACA,mBACA,cACA,sBACR;AAAA,IAJQ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAMF,gBAAgB,CACtB,SACwB;AAAA,IACxB,IAAI,CAAC,WAAW,YAAY,OAAO;AAAA,MACjC,OAAO,CAAC,WAAW,SAAS,gBAAgB,eAAe;AAAA,IAC7D;AAAA,IACA,OAAO;AAAA;AAAA,EAMD,aAAa,CACnB,SACA,MACS;AAAA,IACT,MAAM,aAAa,KAAK,iBAAiB,QAAQ,OAAO;AAAA,IACxD,OAAO,WAAW,SAAS,IAAI;AAAA;AAAA,EAOjC,UAAU,CACR,QACA,QACA,SACM;AAAA,IACN,IAAI,OAAO,WAAW,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,QAAQ,MAAM;AAAA,MACxB,OAAO,KAAK,SAAS,QAAQ,QAAQ,OAAO;AAAA,IAC9C,EAAO;AAAA,MACL,OAAO,KAAK,cAAc,QAAQ,QAAQ,OAAO;AAAA;AAAA;AAAA,EAW7C,QAAQ,CACd,QACA,QACA,SACM;AAAA,IACN,MAAM,UAAU,KAAK,YAAY,MAAM;AAAA,IACvC,MAAM,YAAY,OAAO,WAAW,QAAQ;AAAA,IAC5C,MAAM,YAAY,OAAO,WAAW,QAAQ;AAAA,IAG5C,MAAM,WAAW,KAAK,wBAAwB,MAAM;AAAA,IACpD,MAAM,sBAAsB,KAAK,cAAc,SAAS,eAAe,IACnE,KAAK,2BACH,QACA,SACA,QACA,WACA,SACF,IACA,CAAC;AAAA,IACL,MAAM,cAAc,KAAK,eAAe,MAAM;AAAA,IAC9C,MAAM,cAAc,KAAK,YAAY,aAAa,WAAW,SAAS;AAAA,IAGtE,KAAK,iBAAiB,MAAM;AAAA,IAE5B,IAAI,KAAK,cAAc,SAAS,cAAc,GAAG;AAAA,MAC/C,WAAW,QAAQ,QAAQ;AAAA,QACzB,KAAK,gBAAgB,gBAAgB,MAAM,SAAS;AAAA,MACtD;AAAA,IACF;AAAA,IAGA,IAAI,KAAK,cAAc,SAAS,OAAO,GAAG;AAAA,MACxC,WAAW,QAAQ,QAAQ;AAAA,QACzB,MAAM,YAA0B;AAAA,UAC9B,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,OAAO;AAAA,YACL,OAAO,EAAE,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS;AAAA,YAChD,KAAK;AAAA,cACH,KAAK,EAAE,MAAM,UAAU,OAAO,KAAK,SAAS;AAAA,cAC5C,KAAK,EAAE,MAAM,UAAU,OAAO,KAAK,SAAS;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AAAA,QACA,KAAK,aAAa,uBAAuB,SAAS;AAAA,MACpD;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,cAAc,SAAS,eAAe,GAAG;AAAA,MAChD,KAAK,qBAAqB,0BACxB,KAAK,+BAA+B,SAAS,WAAW,CAC1D;AAAA,MACA,KAAK,qBAAqB,0BACxB,KAAK,+BAA+B,QAAQ,WAAW,CACzD;AAAA,IACF;AAAA,IAGA,MAAM,gBAAgB,IAAI,IACxB,OAAO,IACL,CAAC,MAAM,GAAG,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,UAC7D,CACF;AAAA,IAEA,MAAM,iBAAiC;AAAA,MACrC,UAAU;AAAA,MACV,cAAc,QAAQ;AAAA,MACtB,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AAAA,IAEA,KAAK,gBAAgB,wBAAwB,eAAe,CAAC,YAC3D,8BAA8B,SAAS,cAAc,CACvD;AAAA,IAGA,SAAS,IAAI,EAAG,IAAI,SAAS,QAAQ,KAAK;AAAA,MACxC,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,aAAa,OAAO;AAAA,MAC1B,MAAM,aAA0B;AAAA,QAC9B,cAAc,OAAO;AAAA,QACrB,WAAW,OAAO;AAAA,QAClB,UAAU,WAAW,WAAW;AAAA,QAChC,UAAU,WAAW,WAAW;AAAA,MAClC;AAAA,MAGA,IAAI,KAAK,cAAc,SAAS,SAAS,KAAK,KAAK,SAAS;AAAA,QAC1D,IAAI,gBAAgB,KAAK;AAAA,QAEzB,IAAI,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,WAAW,GAAG,GAAG;AAAA,UAEpE,gBAAgB,KAAK,wBACnB,KAAK,SACL;AAAA,YACE,UAAU,KAAK,QAAQ;AAAA,YACvB,UAAU,KAAK,QAAQ;AAAA,UACzB,GACA;AAAA,YACE,UAAU,WAAW;AAAA,YACrB,UAAU,WAAW;AAAA,UACvB,CACF;AAAA,QACF;AAAA,QAGA,KAAK,gBAAgB,eAAe,YAAY,aAAa;AAAA,MAC/D;AAAA,MAGA,IAAI,KAAK,cAAc,SAAS,cAAc,GAAG;AAAA,QAC/C,IAAI,KAAK,UAAU;AAAA,UACjB,KAAK,gBAAgB,gBAAgB,YAAY;AAAA,eAC5C,KAAK;AAAA,UACV,CAAC;AAAA,QACH,EAAO;AAAA,UACL,KAAK,gBAAgB,gBAAgB,YAAY,SAAS;AAAA;AAAA,MAE9D;AAAA,MAGA,IAAI,KAAK,cAAc,SAAS,OAAO,GAAG;AAAA,QACxC,KAAK,wBAAwB,MAAM,UAAU;AAAA,MAC/C;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,cAAc,SAAS,eAAe,GAAG;AAAA,MAChD,KAAK,yBAAyB,mBAAmB;AAAA,IACnD;AAAA;AAAA,EAOM,aAAa,CACnB,QACA,QACA,SACM;AAAA,IACN,MAAM,UAAU,KAAK,YAAY,MAAM;AAAA,IACvC,MAAM,YAAY,OAAO,WAAW,QAAQ;AAAA,IAC5C,MAAM,YAAY,OAAO,WAAW,QAAQ;AAAA,IAG5C,MAAM,WAAW,KAAK,cAAc,MAAM;AAAA,IAG1C,IAAI,KAAK,cAAc,SAAS,SAAS,GAAG;AAAA,MAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACtC,MAAM,aAAa,OAAO;AAAA,QAC1B,MAAM,eAAe,SAAS;AAAA,QAC9B,MAAM,aAA0B;AAAA,UAC9B,cAAc,OAAO;AAAA,UACrB,WAAW,OAAO;AAAA,UAClB,UAAU,WAAW,WAAW;AAAA,UAChC,UAAU,WAAW,WAAW;AAAA,QAClC;AAAA,QAEA,KAAK,4BACH,cACA,YACA,SACA,OACF;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAI,KAAK,cAAc,SAAS,cAAc,GAAG;AAAA,MAC/C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACtC,MAAM,aAAa,OAAO;AAAA,QAC1B,MAAM,eAAe,SAAS;AAAA,QAC9B,MAAM,aAA0B;AAAA,UAC9B,cAAc,OAAO;AAAA,UACrB,WAAW,OAAO;AAAA,UAClB,UAAU,WAAW,WAAW;AAAA,UAChC,UAAU,WAAW,WAAW;AAAA,QAClC;AAAA,QAEA,KAAK,6BAA6B,cAAc,UAAU;AAAA,MAC5D;AAAA,IACF;AAAA,IAGA,IAAI,KAAK,cAAc,SAAS,OAAO,GAAG;AAAA,MACxC,KAAK,eAAe,QAAQ,SAAS,QAAQ,WAAW,SAAS;AAAA,IACnE;AAAA,IAGA,IAAI,KAAK,cAAc,SAAS,eAAe,GAAG;AAAA,MAChD,KAAK,kBAAkB,QAAQ,SAAS,QAAQ,WAAW,SAAS;AAAA,IACtE;AAAA;AAAA,EAMM,WAAW,CAAC,OAAmC;AAAA,IACrD,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,IAAI,cAAc,MAAM;AAAA,IAExB,WAAW,QAAQ,OAAO;AAAA,MACxB,IACE,KAAK,WAAW,UACf,KAAK,aAAa,UAAU,KAAK,WAAW,QAC7C;AAAA,QACA,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAQD,aAAa,CAAC,OAAsC;AAAA,IAC1D,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,MACzB,MAAM,QAAQ,KAAK,gBAAgB,SAAS;AAAA,QAC1C,cAAc,KAAK;AAAA,QACnB,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,MAED,MAAM,MAAM,GAAG,OAAO,aAAa,KAAK,KAAK,QAAQ,IACnD,KAAK,WAAW;AAAA,MAElB,MAAM,UAAU,OAAO,QAAQ,IAAI,GAAG;AAAA,MACtC,MAAM,WAAW,KAAK,gBAAgB,gBAAgB,IAAI;AAAA,MAE1D,OAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,KACD;AAAA;AAAA,EAOK,uBAAuB,CAAC,OAAsC;AAAA,IACpE,MAAM,gBAAgB,KAAK,aAAa,iBAAiB;AAAA,IACzD,MAAM,uBAAuB,KAAK,aAAa,wBAAwB;AAAA,IAEvE,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,MACzB,MAAM,QAAQ,KAAK,gBAAgB,SAAS;AAAA,QAC1C,cAAc,KAAK;AAAA,QACnB,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,MAED,MAAM,MAAM,iBAAiB,IAAI;AAAA,MACjC,MAAM,UAAU,OAAO,QAAQ,IAAI,GAAG;AAAA,MACtC,MAAM,WAAW,KAAK,gBAAgB,gBAAgB,IAAI;AAAA,MAG1D,MAAM,qBAAqB,cAAc,OAAO,CAAC,UAC/C,MAAM,MAAM,KACV,CAAC,SACC,KAAK,iBAAiB,KAAK,gBAC3B,KAAK,cAAc,KAAK,aACxB,cAAc,MAAM,KAAK,KAAK,CAClC,CACF;AAAA,MAEA,MAAM,4BAA4B,qBAAqB,OAAO,CAAC,UAC7D,MAAM,MAAM,KACV,CAAC,SACC,KAAK,iBAAiB,KAAK,gBAC3B,KAAK,cAAc,KAAK,aACxB,cAAc,MAAM,KAAK,KAAK,CAClC,CACF;AAAA,MAEA,OAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,KACD;AAAA;AAAA,EAOK,uBAAuB,CAC7B,UACA,YACM;AAAA,IAEN,IAAI,SAAS,oBAAoB;AAAA,MAC/B,WAAW,SAAS,SAAS,oBAAoB;AAAA,QAC/C,MAAM,WAA4B;AAAA,UAChC,OAAO;AAAA,YACL;AAAA,cACE,cAAc,WAAW;AAAA,cACzB,WAAW,WAAW;AAAA,cACtB,OAAO;AAAA,gBACL,OAAO,EAAE,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AAAA,gBAC5D,KAAK;AAAA,kBACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,kBAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,gBACpD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA,OAAO,MAAM;AAAA,QACf;AAAA,QACA,KAAK,aAAa,aAAa,QAAQ;AAAA,MACzC;AAAA,IACF;AAAA,IAGA,IAAI,SAAS,2BAA2B;AAAA,MACtC,WAAW,SAAS,SAAS,2BAA2B;AAAA,QACtD,MAAM,WAA6B;AAAA,UACjC,OAAO;AAAA,YACL;AAAA,cACE,cAAc,WAAW;AAAA,cACzB,WAAW,WAAW;AAAA,cACtB,OAAO;AAAA,gBACL,OAAO,EAAE,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AAAA,gBAC5D,KAAK;AAAA,kBACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,kBAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,gBACpD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA,WAAW,MAAM;AAAA,QACnB;AAAA,QACA,KAAK,aAAa,oBAAoB,QAAQ;AAAA,MAChD;AAAA,IACF;AAAA;AAAA,EAMM,2BAA2B,CACjC,UACA,YACA,eACA,SACM;AAAA,IACN,IAAI,CAAC,SAAS,SAAS;AAAA,MAErB;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,MAAM,WAAW,QAAQ,QAAQ;AAAA,IAEjC,IAAI,aAAa,SAAS;AAAA,MAExB,MAAM,aAAa,KAAK,kBAAkB,wBACxC,SAAS,OACX;AAAA,MAEA,IAAI,CAAC,cAAc,WAAW,SAAS,SAAS;AAAA,QAE9C,gBAAgB,SAAS;AAAA,MAC3B,EAAO;AAAA,QAEL,MAAM,SAAS,WAAW;AAAA,QAC1B,IAAI,OAAO,SAAS,UAAU;AAAA,UAC5B,gBAAgB,OAAO;AAAA,QACzB,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,UACnC,gBAAgB,OAAO;AAAA,QACzB,EAAO,SAAI,OAAO,SAAS,WAAW;AAAA,UACpC,gBAAgB,OAAO;AAAA,QACzB,EAAO;AAAA,UAEL,gBAAgB,SAAS;AAAA;AAAA;AAAA,IAG/B,EAAO;AAAA,MAEL,IACE,OAAO,SAAS,YAAY,YAC5B,SAAS,QAAQ,WAAW,GAAG,GAC/B;AAAA,QAEA,gBAAgB,KAAK,wBACnB,SAAS,SACT;AAAA,UACE,UAAU,SAAS,QAAQ;AAAA,UAC3B,UAAU,SAAS,QAAQ;AAAA,QAC7B,GACA;AAAA,UACE,UAAU,WAAW;AAAA,UACrB,UAAU,WAAW;AAAA,QACvB,CACF;AAAA,MACF,EAAO;AAAA,QAEL,gBAAgB,SAAS;AAAA;AAAA;AAAA,IAK7B,MAAM,cAAc,KAAK,gBAAgB,SAAS;AAAA,MAChD,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IAED,IAAI,aAAa;AAAA,MACf,MAAM,YAAY,GAAG,OAAO,aAAa,KAAK,WAAW,QAAQ,IAC/D,WAAW,WAAW;AAAA,MAExB,YAAY,QAAQ,IAAI,WAAW,aAAa;AAAA,IAClD;AAAA;AAAA,EAIM,4BAA4B,CAClC,UACA,YACM;AAAA,IACN,IAAI,SAAS,UAAU;AAAA,MACrB,KAAK,gBAAgB,gBAAgB,YAAY;AAAA,WAC5C,SAAS;AAAA,MACd,CAAC;AAAA,IACH,EAAO;AAAA,MACL,KAAK,gBAAgB,gBAAgB,YAAY,SAAS;AAAA;AAAA;AAAA,EAUtD,eAAe,CACrB,YACA,YACA,eACA,SACM;AAAA,IACN,MAAM,QAAQ,KAAK,gBAAgB,SAAS;AAAA,MAC1C,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IAED,IAAI,CAAC,OAAO;AAAA,MACV;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,GAAG,OAAO,aAAa,KAAK,WAAW,QAAQ,IACzD,WAAW,WAAW;AAAA,IAExB,MAAM,cAAc,MAAM,QAAQ,IAAI,GAAG;AAAA,IAEzC,IAAI,CAAC,aAAa;AAAA,MAEhB;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,MAAM,WAAW,QAAQ,QAAQ;AAAA,IAEjC,IAAI,aAAa,SAAS;AAAA,MAExB,MAAM,aACJ,KAAK,kBAAkB,wBAAwB,UAAU;AAAA,MAE3D,IAAI,CAAC,cAAc,WAAW,SAAS,SAAS;AAAA,QAE9C,gBAAgB;AAAA,MAClB,EAAO;AAAA,QAEL,MAAM,SAAS,WAAW;AAAA,QAC1B,IAAI,OAAO,SAAS,UAAU;AAAA,UAC5B,gBAAgB,OAAO;AAAA,QACzB,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,UACnC,gBAAgB,OAAO;AAAA,QACzB,EAAO,SAAI,OAAO,SAAS,WAAW;AAAA,UACpC,gBAAgB,OAAO;AAAA,QACzB,EAAO;AAAA,UAEL,gBAAgB;AAAA;AAAA;AAAA,IAGtB,EAAO;AAAA,MAEL,IAAI,OAAO,gBAAgB,YAAY,YAAY,WAAW,GAAG,GAAG;AAAA,QAElE,gBAAgB,KAAK,wBACnB,aACA;AAAA,UACE,UAAU,WAAW;AAAA,UACrB,UAAU,WAAW;AAAA,QACvB,GACA;AAAA,UACE,UAAU,WAAW;AAAA,UACrB,UAAU,WAAW;AAAA,QACvB,CACF;AAAA,MACF,EAAO;AAAA,QAEL,gBAAgB;AAAA;AAAA;AAAA,IAKpB,MAAM,cAAc,KAAK,gBAAgB,SAAS;AAAA,MAChD,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IAED,IAAI,aAAa;AAAA,MACf,MAAM,YAAY,GAAG,OAAO,aAAa,KAAK,WAAW,QAAQ,IAC/D,WAAW,WAAW;AAAA,MAExB,YAAY,QAAQ,IAAI,WAAW,aAAa;AAAA,IAClD;AAAA,IAGA,IAAI,KAAK,cAAc,SAAS,cAAc,GAAG;AAAA,MAC/C,MAAM,iBAAiB,KAAK,gBAAgB,gBAAgB,UAAU;AAAA,MACtE,IAAI,gBAAgB;AAAA,QAClB,KAAK,gBAAgB,gBAAgB,YAAY,KAAK,eAAe,CAAC;AAAA,MACxE,EAAO;AAAA,QAEL,KAAK,gBAAgB,gBAAgB,YAAY,SAAS;AAAA;AAAA,IAE9D;AAAA;AAAA,EAOM,uBAAuB,CAC7B,SACA,eACA,eACQ;AAAA,IACR,IAAI;AAAA,MACF,MAAM,MAAM,aAAa,QAAQ,MAAM,CAAC,CAAC;AAAA,MAEzC,MAAM,WAAW,cAAc,WAAW,cAAc;AAAA,MACxD,MAAM,WAAW,cAAc,WAAW,cAAc;AAAA,MAExD,MAAM,cAAc,aAAa,KAAK,CAAC,SAAS;AAAA,QAC9C,IAAI,KAAK,SAAS,aAAa;AAAA,UAC7B,MAAM,UAAU;AAAA,UAChB,OAAO;AAAA,eACF;AAAA,YACH,SAAS;AAAA,cACP,UAAU,QAAQ,WAAW,MACzB,QAAQ,QAAQ,WAChB,QAAQ,QAAQ,WAAW;AAAA,cAC/B,UAAU,QAAQ,WAAW,MACzB,QAAQ,QAAQ,WAChB,QAAQ,QAAQ,WAAW;AAAA,YACjC;AAAA,UACF;AAAA,QACF,EAAO,SAAI,KAAK,SAAS,SAAS;AAAA,UAChC,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,eACF;AAAA,YACH,OAAO;AAAA,cACL,OAAO;AAAA,gBACL,KAAK,UAAU,WAAW,MAAM,MAC5B,UAAU,MAAM,MAAM,MACtB,UAAU,MAAM,MAAM,MAAM;AAAA,gBAChC,KAAK,UAAU,WAAW,MAAM,MAC5B,UAAU,MAAM,MAAM,MACtB,UAAU,MAAM,MAAM,MAAM;AAAA,cAClC;AAAA,cACA,KAAK;AAAA,gBACH,KACE,UAAU,MAAM,IAAI,IAAI,SAAS,WAC7B,UAAU,WAAW,IAAI,MACvB,UAAU,MAAM,IAAI,MACpB;AAAA,kBACE,MAAM;AAAA,kBACN,OAAO,UAAU,MAAM,IAAI,IAAI,QAAQ;AAAA,gBACzC,IACF,UAAU,MAAM,IAAI;AAAA,gBAC1B,KACE,UAAU,MAAM,IAAI,IAAI,SAAS,WAC7B,UAAU,WAAW,IAAI,MACvB,UAAU,MAAM,IAAI,MACpB;AAAA,kBACE,MAAM;AAAA,kBACN,OAAO,UAAU,MAAM,IAAI,IAAI,QAAQ;AAAA,gBACzC,IACF,UAAU,MAAM,IAAI;AAAA,cAC5B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,OAAO;AAAA,OACR;AAAA,MAED,OAAO,IAAI,YAAY,WAAW;AAAA,MAClC,OAAO,OAAO;AAAA,MAEd,QAAQ,KAAK,wCAAwC,KAAK;AAAA,MAC1D,OAAO;AAAA;AAAA;AAAA,EAQH,cAAc,CACpB,aACA,eACA,QACA,WACA,WACM;AAAA,IAEN,MAAM,cAAc,KAAK,eAAe,WAAW;AAAA,IACnD,MAAM,cAA4B;AAAA,MAChC,cAAc,OAAO;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,OAAO,KAAK,YAAY,aAAa,WAAW,SAAS;AAAA,IAC3D;AAAA,IAEA,KAAK,aAAa,uBAAuB,WAAW;AAAA,IAGpD,MAAM,uBAAuB,KAAK,aAAa,wBAAwB;AAAA,IACvE,MAAM,gBAAgB,KAAK,aAAa,iBAAiB;AAAA,IAGzD,WAAW,SAAS,sBAAsB;AAAA,MACxC,WAAW,QAAQ,MAAM,OAAO;AAAA,QAC9B,IACE,KAAK,iBAAiB,cAAc,gBACpC,KAAK,cAAc,cAAc,WACjC;AAAA,UAEA,MAAM,eAAe,gBAAgB,KAAK,OAAO,WAAW;AAAA,UAC5D,IAAI,cAAc;AAAA,YAEhB,MAAM,WAA6B;AAAA,cACjC,OAAO;AAAA,gBACL;AAAA,kBACE,cAAc,OAAO;AAAA,kBACrB,WAAW,OAAO;AAAA,kBAClB,OAAO,KAAK,YAAY,cAAc,WAAW,SAAS;AAAA,gBAC5D;AAAA,cACF;AAAA,cACA,WAAW,MAAM;AAAA,YACnB;AAAA,YACA,KAAK,aAAa,oBAAoB,QAAQ;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAGA,WAAW,SAAS,eAAe;AAAA,MACjC,WAAW,QAAQ,MAAM,OAAO;AAAA,QAC9B,IACE,KAAK,iBAAiB,cAAc,gBACpC,KAAK,cAAc,cAAc,WACjC;AAAA,UAEA,MAAM,eAAe,gBAAgB,KAAK,OAAO,WAAW;AAAA,UAC5D,IAAI,cAAc;AAAA,YAEhB,MAAM,WAA4B;AAAA,cAChC,OAAO;AAAA,gBACL;AAAA,kBACE,cAAc,OAAO;AAAA,kBACrB,WAAW,OAAO;AAAA,kBAClB,OAAO,KAAK,YAAY,cAAc,WAAW,SAAS;AAAA,gBAC5D;AAAA,cACF;AAAA,cACA,OAAO,MAAM;AAAA,YACf;AAAA,YACA,KAAK,aAAa,aAAa,QAAQ;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAGM,kBAAkB,CAAC,UAA4B;AAAA,IACrD,IAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAAA,MAC7C,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,OAAO,gBAAgB,QAAQ;AAAA,MAC/B,MAAM;AAAA,MACN,OAAO,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,KAAK,SAAS;AAAA;AAAA;AAAA,EAI3D,8BAA8B,CACpC,MACA,OACc;AAAA,IACd,OAAO;AAAA,MACL,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,MAChB;AAAA,IACF;AAAA;AAAA,EAGM,0BAA0B,CAChC,aACA,eACA,QACA,WACA,WACsB;AAAA,IACtB,MAAM,cAAc,KAAK,eAAe,WAAW;AAAA,IACnD,MAAM,SAA+B,CAAC;AAAA,IAEtC,WAAW,SAAS,KAAK,qBAAqB,oBAAoB,GAAG;AAAA,MACnE,WAAW,QAAQ,MAAM,OAAO;AAAA,QAC9B,IACE,KAAK,iBAAiB,cAAc,gBACpC,KAAK,cAAc,cAAc,WACjC;AAAA,UACA;AAAA,QACF;AAAA,QAEA,MAAM,eAAe,gBAAgB,KAAK,OAAO,WAAW;AAAA,QAC5D,IAAI,CAAC,cAAc;AAAA,UACjB;AAAA,QACF;AAAA,QAEA,OAAO,KAAK;AAAA,UACV,OAAO;AAAA,YACL;AAAA,cACE,cAAc,OAAO;AAAA,cACrB,WAAW,OAAO;AAAA,cAClB,OAAO,KAAK,YAAY,cAAc,WAAW,SAAS;AAAA,YAC5D;AAAA,UACF;AAAA,UACA,UAAU,KAAK,mBAAmB,MAAM,QAAQ;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,wBAAwB,CAAC,QAAoC;AAAA,IACnE,WAAW,QAAQ,QAAQ;AAAA,MACzB,KAAK,qBAAqB,iBAAiB,IAAI;AAAA,IACjD;AAAA;AAAA,EAGM,iBAAiB,CACvB,aACA,eACA,QACA,WACA,WACM;AAAA,IACN,MAAM,cAAc,KAAK,eAAe,WAAW;AAAA,IACnD,MAAM,cAAc,KAAK,YAAY,aAAa,WAAW,SAAS;AAAA,IACtE,MAAM,SAAS,KAAK,2BAClB,aACA,eACA,QACA,WACA,SACF;AAAA,IAEA,KAAK,qBAAqB,0BACxB,KAAK,+BAA+B,QAAQ,WAAW,CACzD;AAAA,IACA,KAAK,yBAAyB,MAAM;AAAA;AAAA,EAM9B,cAAc,CAAC,OAAwC;AAAA,IAC7D,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IAEb,WAAW,QAAQ,OAAO;AAAA,MACxB,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,IACzC;AAAA,IAEA,OAAO;AAAA,MACL,OAAO,EAAE,KAAK,QAAQ,KAAK,OAAO;AAAA,MAClC,KAAK;AAAA,QACH,KAAK,EAAE,MAAM,UAAU,OAAO,OAAO;AAAA,QACrC,KAAK,EAAE,MAAM,UAAU,OAAO,OAAO;AAAA,MACvC;AAAA,IACF;AAAA;AAAA,EAMM,WAAW,CACjB,OACA,WACA,WACkB;AAAA,IAClB,OAAO;AAAA,MACL,OAAO;AAAA,QACL,KAAK,MAAM,MAAM,MAAM;AAAA,QACvB,KAAK,MAAM,MAAM,MAAM;AAAA,MACzB;AAAA,MACA,KAAK;AAAA,QACH,KACE,MAAM,IAAI,IAAI,SAAS,WACnB,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,IAAI,QAAQ,UAAU,IACzD,MAAM,IAAI;AAAA,QAChB,KACE,MAAM,IAAI,IAAI,SAAS,WACnB,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,IAAI,QAAQ,UAAU,IACzD,MAAM,IAAI;AAAA,MAClB;AAAA,IACF;AAAA;AAAA,EAMM,gBAAgB,CAAC,OAA4B;AAAA,IACnD,WAAW,QAAQ,OAAO;AAAA,MAGxB,KAAK,gBAAgB,eAAe,MAAM,EAAE;AAAA,IAC9C;AAAA;AAAA,EAQF,SAAS,CACP,WACA,cACA,SACM;AAAA,IACN,WAAW,eAAe,cAAc;AAAA,MACtC,KAAK,kBAAkB,WAAW,aAAa;AAAA,QAC7C,aAAa,KAAK,cAAc,SAAS,SAAS;AAAA,QAClD,YAAY,KAAK,cAAc,SAAS,OAAO;AAAA,QAC/C,kBAAkB,KAAK,cAAc,SAAS,cAAc;AAAA,QAC5D,mBAAmB,KAAK,cAAc,SAAS,eAAe;AAAA,QAC9D,aAAa,QAAQ,QAAQ;AAAA,QAC7B,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,QAAQ,KAAK;AAAA,MACf,MAAM,YAAY,KAAK,mBAAmB,SAAS;AAAA,MACnD,KAAK,iBAAiB,SAAS;AAAA,IACjC;AAAA;AAAA,EASM,iBAAiB,CACvB,WACA,aACA,SAQM;AAAA,IAEN,IAAI,QAAQ,YAAY;AAAA,MACtB,KAAK,aAAa,uBAAuB,WAAW;AAAA,IACtD;AAAA,IACA,IAAI,QAAQ,mBAAmB;AAAA,MAC7B,KAAK,qBAAqB,0BAA0B,WAAW;AAAA,IACjE;AAAA,IAEA,MAAM,YAAY,KAAK,mBAAmB,SAAS;AAAA,IACnD,MAAM,YAAY,KAAK,cAAc,SAAS;AAAA,IAC9C,MAAM,aAAa,KAAK,eAAe,SAAS;AAAA,IAChD,MAAM,cAAc,KAAK,cAAc,WAAW;AAAA,IAClD,MAAM,eAAe,KAAK,eAAe,WAAW;AAAA,IAGpD,MAAM,gBAGF,IAAI;AAAA,IAER,SAAS,MAAM,EAAG,MAAM,WAAW,OAAO;AAAA,MACxC,SAAS,MAAM,EAAG,MAAM,cAAc,OAAO;AAAA,QAC3C,MAAM,UAAU,MAAM;AAAA,QACtB,MAAM,WAAW,UAAU,KACzB,CAAC,MACC,EAAE,aAAa,UAAU,MAAM,MAAM,MAAM,OAC3C,EAAE,aAAa,UAAU,MAAM,MAAM,MAAM,OAC/C;AAAA,QAEA,IAAI,UAAU;AAAA,UACZ,MAAM,aAA0B;AAAA,YAC9B,cAAc,YAAY;AAAA,YAC1B,WAAW,YAAY;AAAA,YACvB,UAAU,YAAY,MAAM,MAAM,MAAM;AAAA,YACxC,UAAU,YAAY,MAAM,MAAM,MAAM;AAAA,UAC1C;AAAA,UAEA,MAAM,WAAW,WAAW,WAAW,SAAS;AAAA,UAChD,MAAM,WAAW,WAAW,WAAW,SAAS;AAAA,UAEhD,IAAI,QAAQ,aAAa;AAAA,YACvB,KAAK,0BACH,UACA,YACA,UACA,UACA;AAAA,cACE,MAAM,QAAQ;AAAA,cACd,KAAK;AAAA,cACL,SAAS,CAAC,SAAS;AAAA,YACrB,CACF;AAAA,UACF;AAAA,UAEA,IAAI,QAAQ,YAAY;AAAA,YACtB,KAAK,mBAAmB,UAAU,UAAU;AAAA,UAC9C;AAAA,UAEA,IAAI,QAAQ,kBAAkB;AAAA,YAC5B,KAAK,iBAAiB,UAAU,UAAU;AAAA,UAC5C;AAAA,UAEA,IAAI,QAAQ,mBAAmB;AAAA,YAC7B,KAAK,sBAAsB,UAAU,UAAU;AAAA,UACjD;AAAA,UAGA,MAAM,MAAM,GAAG,WAAW,YAAY,WAAW;AAAA,UACjD,MAAM,QAAQ,KAAK,gBAAgB,SAAS;AAAA,YAC1C,cAAc,WAAW;AAAA,YACzB,WAAW,WAAW;AAAA,UACxB,CAAC;AAAA,UACD,MAAM,UAAU,GAAG,OAAO,aAAa,KAAK,WAAW,QAAQ,IAC7D,WAAW,WAAW;AAAA,UAExB,MAAM,UAAU,OAAO,QAAQ,IAAI,OAAO,KAAK;AAAA,UAC/C,cAAc,IAAI,KAAK,EAAE,MAAM,YAAY,QAAQ,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAI,cAAc,WAAW;AAAA,MAC3B,SAAS,MAAM,UAAW,MAAM,aAAa,OAAO;AAAA,QAClD,MAAM,YAAY,MAAM;AAAA,QAExB,SAAS,MAAM,EAAG,MAAM,cAAc,OAAO;AAAA,UAC3C,MAAM,aAA0B;AAAA,YAC9B,cAAc,YAAY;AAAA,YAC1B,WAAW,YAAY;AAAA,YACvB,UAAU,YAAY,MAAM,MAAM,MAAM;AAAA,YACxC,UAAU,YAAY,MAAM,MAAM,MAAM;AAAA,UAC1C;AAAA,UAEA,MAAM,aAA0B;AAAA,YAC9B,cAAc,YAAY;AAAA,YAC1B,WAAW,YAAY;AAAA,YACvB,UAAU,YAAY,MAAM,MAAM,MAAM;AAAA,YACxC,UAAU,YAAY,MAAM,MAAM,MAAM;AAAA,UAC1C;AAAA,UAEA,MAAM,WAAW,WAAW,WAAW,WAAW;AAAA,UAElD,IAAI,QAAQ,aAAa;AAAA,YACvB,KAAK,0BACH,YACA,YACA,GACA,UACA;AAAA,cACE,MAAM,QAAQ;AAAA,cACd,KAAK;AAAA,cACL,SAAS,CAAC,SAAS;AAAA,YACrB,CACF;AAAA,UACF;AAAA,UAEA,IAAI,QAAQ,YAAY;AAAA,YACtB,KAAK,mBAAmB,YAAY,UAAU;AAAA,UAChD;AAAA,UAEA,IAAI,QAAQ,kBAAkB;AAAA,YAC5B,KAAK,iBAAiB,YAAY,UAAU;AAAA,UAC9C;AAAA,UAEA,IAAI,QAAQ,mBAAmB;AAAA,YAC7B,KAAK,sBAAsB,YAAY,UAAU;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAMM,aAAa,CAAC,OAA6B;AAAA,IACjD,IAAI,MAAM,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,MAC3C,OAAO;AAAA,IACT;AAAA,IACA,OAAO,MAAM,MAAM,IAAI,IAAI,QAAQ,MAAM,MAAM,MAAM,MAAM;AAAA;AAAA,EAMrD,cAAc,CAAC,OAA6B;AAAA,IAClD,IAAI,MAAM,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,MAC3C,OAAO;AAAA,IACT;AAAA,IACA,OAAO,MAAM,MAAM,IAAI,IAAI,QAAQ,MAAM,MAAM,MAAM,MAAM;AAAA;AAAA,EAOtD,kBAAkB,CAAC,cAA2C;AAAA,IACnE,QAAQ,cAAc,WAAW,UAAU;AAAA,IAC3C,MAAM,QAAuB,CAAC;AAAA,IAE9B,MAAM,WAAW,MAAM,MAAM;AAAA,IAC7B,MAAM,WAAW,MAAM,MAAM;AAAA,IAG7B,IAAI;AAAA,IACJ,IAAI,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,MAErC,SAAS,WAAW;AAAA,IACtB,EAAO;AAAA,MACL,SAAS,MAAM,IAAI,IAAI;AAAA;AAAA,IAIzB,IAAI;AAAA,IACJ,IAAI,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,MAErC,SAAS,WAAW;AAAA,IACtB,EAAO;AAAA,MACL,SAAS,MAAM,IAAI,IAAI;AAAA;AAAA,IAIzB,SAAS,MAAM,SAAU,OAAO,QAAQ,OAAO;AAAA,MAC7C,SAAS,MAAM,SAAU,OAAO,QAAQ,OAAO;AAAA,QAC7C,MAAM,KAAK;AAAA,UACT;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAMD,yBAAyB,CAC/B,YACA,YACA,UACA,UACA,SACM;AAAA,IACN,MAAM,QAAQ,KAAK,gBAAgB,SAAS;AAAA,MAC1C,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IAED,IAAI,CAAC,OAAO;AAAA,MACV;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,GAAG,OAAO,aAAa,KAAK,WAAW,QAAQ,IACzD,WAAW,WAAW;AAAA,IAExB,MAAM,cAAc,MAAM,QAAQ,IAAI,GAAG;AAAA,IAEzC,IAAI,CAAC,aAAa;AAAA,MAEhB,MAAM,eAAc,KAAK,gBAAgB,SAAS;AAAA,QAChD,cAAc,WAAW;AAAA,QACzB,WAAW,WAAW;AAAA,MACxB,CAAC;AAAA,MACD,IAAI,cAAa;AAAA,QACf,MAAM,YAAY,GAAG,OAAO,aAAa,KAAK,WAAW,QAAQ,IAC/D,WAAW,WAAW;AAAA,QAExB,aAAY,QAAQ,OAAO,SAAS;AAAA,MACtC;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,MAAM,WAAW,QAAQ,QAAQ;AAAA,IAEjC,IAAI,aAAa,SAAS;AAAA,MAExB,MAAM,aACJ,KAAK,kBAAkB,wBAAwB,UAAU;AAAA,MAE3D,IAAI,CAAC,cAAc,WAAW,SAAS,SAAS;AAAA,QAE9C,gBAAgB;AAAA,MAClB,EAAO;AAAA,QAEL,MAAM,SAAS,WAAW;AAAA,QAC1B,IAAI,OAAO,SAAS,UAAU;AAAA,UAC5B,gBAAgB,OAAO;AAAA,QACzB,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,UACnC,gBAAgB,OAAO;AAAA,QACzB,EAAO,SAAI,OAAO,SAAS,WAAW;AAAA,UACpC,gBAAgB,OAAO;AAAA,QACzB,EAAO;AAAA,UAEL,gBAAgB;AAAA;AAAA;AAAA,IAGtB,EAAO;AAAA,MAEL,IAAI,OAAO,gBAAgB,YAAY,YAAY,WAAW,GAAG,GAAG;AAAA,QAElE,gBAAgB,KAAK,wBACnB,aACA,UACA,QACF;AAAA,MACF,EAAO;AAAA,QAEL,gBAAgB;AAAA;AAAA;AAAA,IAKpB,MAAM,cAAc,KAAK,gBAAgB,SAAS;AAAA,MAChD,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IAED,IAAI,aAAa;AAAA,MACf,MAAM,YAAY,GAAG,OAAO,aAAa,KAAK,WAAW,QAAQ,IAC/D,WAAW,WAAW;AAAA,MAExB,YAAY,QAAQ,IAAI,WAAW,aAAa;AAAA,IAClD;AAAA,IAGA,IAAI,KAAK,cAAc,SAAS,cAAc,GAAG;AAAA,MAC/C,MAAM,iBAAiB,KAAK,gBAAgB,gBAAgB,UAAU;AAAA,MACtE,IAAI,gBAAgB;AAAA,QAClB,KAAK,gBAAgB,gBAAgB,YAAY,KAAK,eAAe,CAAC;AAAA,MACxE,EAAO;AAAA,QAEL,KAAK,gBAAgB,gBAAgB,YAAY,SAAS;AAAA;AAAA,IAE9D;AAAA;AAAA,EAMM,uBAAuB,CAC7B,SACA,UACA,UACQ;AAAA,IACR,IAAI;AAAA,MACF,MAAM,MAAM,aAAa,QAAQ,MAAM,CAAC,CAAC;AAAA,MAEzC,MAAM,cAAc,aAAa,KAAK,CAAC,SAAS;AAAA,QAC9C,IAAI,KAAK,SAAS,aAAa;AAAA,UAC7B,MAAM,UAAU;AAAA,UAChB,OAAO;AAAA,eACF;AAAA,YACH,SAAS;AAAA,cACP,UAAU,QAAQ,WAAW,MACzB,QAAQ,QAAQ,WAChB,QAAQ,QAAQ,WAAW;AAAA,cAC/B,UAAU,QAAQ,WAAW,MACzB,QAAQ,QAAQ,WAChB,QAAQ,QAAQ,WAAW;AAAA,YACjC;AAAA,UACF;AAAA,QACF,EAAO,SAAI,KAAK,SAAS,SAAS;AAAA,UAChC,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,eACF;AAAA,YACH,OAAO;AAAA,cACL,OAAO;AAAA,gBACL,KAAK,UAAU,WAAW,MAAM,MAC5B,UAAU,MAAM,MAAM,MACtB,UAAU,MAAM,MAAM,MAAM;AAAA,gBAChC,KAAK,UAAU,WAAW,MAAM,MAC5B,UAAU,MAAM,MAAM,MACtB,UAAU,MAAM,MAAM,MAAM;AAAA,cAClC;AAAA,cACA,KAAK;AAAA,gBACH,KACE,UAAU,MAAM,IAAI,IAAI,SAAS,WAC7B,UAAU,WAAW,IAAI,MACvB,UAAU,MAAM,IAAI,MACpB;AAAA,kBACE,MAAM;AAAA,kBACN,OAAO,UAAU,MAAM,IAAI,IAAI,QAAQ;AAAA,gBACzC,IACF,UAAU,MAAM,IAAI;AAAA,gBAC1B,KACE,UAAU,MAAM,IAAI,IAAI,SAAS,WAC7B,UAAU,WAAW,IAAI,MACvB,UAAU,MAAM,IAAI,MACpB;AAAA,kBACE,MAAM;AAAA,kBACN,OAAO,UAAU,MAAM,IAAI,IAAI,QAAQ;AAAA,gBACzC,IACF,UAAU,MAAM,IAAI;AAAA,cAC5B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,OAAO;AAAA,OACR;AAAA,MAED,OAAO,IAAI,YAAY,WAAW;AAAA,MAClC,OAAO,OAAO;AAAA,MAEd,QAAQ,KAAK,yCAAyC,KAAK;AAAA,MAC3D,OAAO;AAAA;AAAA;AAAA,EAIH,gBAAgB,CACtB,YACA,YACM;AAAA,IACN,MAAM,iBAAiB,KAAK,gBAAgB,gBAAgB,UAAU;AAAA,IACtE,IAAI,gBAAgB;AAAA,MAClB,KAAK,gBAAgB,gBAAgB,YAAY,KAAK,eAAe,CAAC;AAAA,IACxE,EAAO;AAAA,MACL,KAAK,gBAAgB,gBAAgB,YAAY,SAAS;AAAA;AAAA;AAAA,EAItD,qBAAqB,CAC3B,YACA,YACM;AAAA,IACN,MAAM,kBAAgC;AAAA,MACpC,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,MACtB,OAAO;AAAA,QACL,OAAO,EAAE,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AAAA,QAC5D,KAAK;AAAA,UACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,UAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,qBAAqB,0BAA0B,eAAe;AAAA,IAEnE,MAAM,kBAAoC;AAAA,MACxC,OAAO,EAAE,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AAAA,MAC5D,KAAK;AAAA,QACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,QAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,MACpD;AAAA,IACF;AAAA,IAEA,WAAW,SAAS,KAAK,qBAAqB,oBAAoB,GAAG;AAAA,MACnE,WAAW,QAAQ,MAAM,OAAO;AAAA,QAC9B,IACE,KAAK,iBAAiB,WAAW,gBACjC,KAAK,cAAc,WAAW,WAC9B;AAAA,UACA;AAAA,QACF;AAAA,QAEA,MAAM,eAAe,gBAAgB,KAAK,OAAO,eAAe;AAAA,QAChE,IAAI,CAAC,cAAc;AAAA,UACjB;AAAA,QACF;AAAA,QAEA,KAAK,qBAAqB,iBAAiB;AAAA,UACzC,OAAO,CAAC,eAAe;AAAA,UACvB,UAAU,KAAK,mBAAmB,MAAM,QAAQ;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA,EAOM,kBAAkB,CACxB,YACA,YACM;AAAA,IAEN,MAAM,kBAAgC;AAAA,MACpC,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,MACtB,OAAO;AAAA,QACL,OAAO,EAAE,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AAAA,QAC5D,KAAK;AAAA,UACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,UAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,aAAa,uBAAuB,eAAe;AAAA,IAGxD,MAAM,uBAAuB,KAAK,aAAa,wBAAwB;AAAA,IACvE,MAAM,gBAAgB,KAAK,aAAa,iBAAiB;AAAA,IAEzD,MAAM,kBAAoC;AAAA,MACxC,OAAO,EAAE,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AAAA,MAC5D,KAAK;AAAA,QACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,QAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,MACpD;AAAA,IACF;AAAA,IAGA,WAAW,SAAS,sBAAsB;AAAA,MACxC,WAAW,QAAQ,MAAM,OAAO;AAAA,QAC9B,IACE,KAAK,iBAAiB,WAAW,gBACjC,KAAK,cAAc,WAAW,WAC9B;AAAA,UACA,MAAM,eAAe,gBAAgB,KAAK,OAAO,eAAe;AAAA,UAChE,IAAI,cAAc;AAAA,YAEhB,MAAM,WAA6B;AAAA,cACjC,OAAO;AAAA,gBACL;AAAA,kBACE,cAAc,WAAW;AAAA,kBACzB,WAAW,WAAW;AAAA,kBACtB,OAAO;AAAA,oBACL,OAAO;AAAA,sBACL,KAAK,WAAW;AAAA,sBAChB,KAAK,WAAW;AAAA,oBAClB;AAAA,oBACA,KAAK;AAAA,sBACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,sBAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,oBACpD;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA,WAAW,MAAM;AAAA,YACnB;AAAA,YACA,KAAK,aAAa,oBAAoB,QAAQ;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAGA,WAAW,SAAS,eAAe;AAAA,MACjC,WAAW,QAAQ,MAAM,OAAO;AAAA,QAC9B,IACE,KAAK,iBAAiB,WAAW,gBACjC,KAAK,cAAc,WAAW,WAC9B;AAAA,UACA,MAAM,eAAe,gBAAgB,KAAK,OAAO,eAAe;AAAA,UAChE,IAAI,cAAc;AAAA,YAEhB,MAAM,WAA4B;AAAA,cAChC,OAAO;AAAA,gBACL;AAAA,kBACE,cAAc,WAAW;AAAA,kBACzB,WAAW,WAAW;AAAA,kBACtB,OAAO;AAAA,oBACL,OAAO;AAAA,sBACL,KAAK,WAAW;AAAA,sBAChB,KAAK,WAAW;AAAA,oBAClB;AAAA,oBACA,KAAK;AAAA,sBACH,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,sBAClD,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,SAAS;AAAA,oBACpD;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA,OAAO,MAAM;AAAA,YACf;AAAA,YACA,KAAK,aAAa,aAAa,QAAQ;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAEJ;",
8
+ "debugId": "B7E36A3C8B2E835C64756E2164756E21",
9
9
  "names": []
10
10
  }