@ngxsmk/cdk 1.3.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +1 -1
  2. package/cva-base/cva-base.d.ts +34 -0
  3. package/cva-base/cva-base.d.ts.map +1 -0
  4. package/cva-base/index.d.ts +2 -0
  5. package/cva-base/index.d.ts.map +1 -0
  6. package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
  7. package/esm2022/cva-base/cva-base.mjs +45 -0
  8. package/esm2022/cva-base/index.mjs +2 -0
  9. package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
  10. package/esm2022/input-group/index.mjs +3 -0
  11. package/esm2022/input-group/input-group-engine.mjs +219 -0
  12. package/esm2022/input-group/models/index.mjs +2 -0
  13. package/esm2022/input-group/models/input-group.model.mjs +2 -0
  14. package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
  15. package/esm2022/listbox-keyboard/index.mjs +2 -0
  16. package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
  17. package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
  18. package/esm2022/public-api.mjs +10 -1
  19. package/esm2022/scheduler/index.mjs +5 -0
  20. package/esm2022/scheduler/models/date-range.mjs +2 -0
  21. package/esm2022/scheduler/models/event.model.mjs +2 -0
  22. package/esm2022/scheduler/models/index.mjs +6 -0
  23. package/esm2022/scheduler/models/resource.model.mjs +5 -0
  24. package/esm2022/scheduler/models/selection.model.mjs +7 -0
  25. package/esm2022/scheduler/models/view.model.mjs +7 -0
  26. package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
  27. package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
  28. package/esm2022/scheduler/plugin/index.mjs +8 -0
  29. package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
  30. package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
  31. package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
  32. package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
  33. package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
  34. package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
  35. package/esm2022/scheduler/scheduler-engine.mjs +316 -0
  36. package/esm2022/scheduler/utils/date-utils.mjs +131 -0
  37. package/esm2022/scheduler/utils/index.mjs +3 -0
  38. package/esm2022/scheduler/utils/snap.mjs +24 -0
  39. package/esm2022/spreadsheet/index.mjs +5 -0
  40. package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
  41. package/esm2022/spreadsheet/models/column.model.mjs +2 -0
  42. package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
  43. package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
  44. package/esm2022/spreadsheet/models/index.mjs +8 -0
  45. package/esm2022/spreadsheet/models/row.model.mjs +2 -0
  46. package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
  47. package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
  48. package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
  49. package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
  50. package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
  51. package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
  52. package/esm2022/spreadsheet/plugin/index.mjs +10 -0
  53. package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
  54. package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
  55. package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
  56. package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
  57. package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
  58. package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
  59. package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
  60. package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
  61. package/esm2022/spreadsheet/utils/index.mjs +2 -0
  62. package/esm2022/testing/a11y.mjs +6 -3
  63. package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
  64. package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
  65. package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
  66. package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
  67. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
  68. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
  69. package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
  70. package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
  71. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
  72. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
  73. package/fesm2022/ngxsmk-cdk-testing.mjs +5 -2
  74. package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -1
  75. package/fesm2022/ngxsmk-cdk.mjs +5 -0
  76. package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
  77. package/input-group/index.d.ts +3 -0
  78. package/input-group/index.d.ts.map +1 -0
  79. package/input-group/input-group-engine.d.ts +88 -0
  80. package/input-group/input-group-engine.d.ts.map +1 -0
  81. package/input-group/models/index.d.ts +2 -0
  82. package/input-group/models/index.d.ts.map +1 -0
  83. package/input-group/models/input-group.model.d.ts +114 -0
  84. package/input-group/models/input-group.model.d.ts.map +1 -0
  85. package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
  86. package/listbox-keyboard/index.d.ts +2 -0
  87. package/listbox-keyboard/index.d.ts.map +1 -0
  88. package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
  89. package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
  90. package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
  91. package/package.json +40 -1
  92. package/public-api.d.ts +8 -0
  93. package/public-api.d.ts.map +1 -1
  94. package/scheduler/index.d.ts +5 -0
  95. package/scheduler/index.d.ts.map +1 -0
  96. package/scheduler/models/date-range.d.ts +6 -0
  97. package/scheduler/models/date-range.d.ts.map +1 -0
  98. package/scheduler/models/event.model.d.ts +50 -0
  99. package/scheduler/models/event.model.d.ts.map +1 -0
  100. package/scheduler/models/index.d.ts +6 -0
  101. package/scheduler/models/index.d.ts.map +1 -0
  102. package/scheduler/models/resource.model.d.ts +16 -0
  103. package/scheduler/models/resource.model.d.ts.map +1 -0
  104. package/scheduler/models/selection.model.d.ts +12 -0
  105. package/scheduler/models/selection.model.d.ts.map +1 -0
  106. package/scheduler/models/view.model.d.ts +21 -0
  107. package/scheduler/models/view.model.d.ts.map +1 -0
  108. package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
  109. package/scheduler/plugin/drag-plugin.d.ts +28 -0
  110. package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
  111. package/scheduler/plugin/index.d.ts +8 -0
  112. package/scheduler/plugin/index.d.ts.map +1 -0
  113. package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
  114. package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
  115. package/scheduler/plugin/plugin-host.d.ts +16 -0
  116. package/scheduler/plugin/plugin-host.d.ts.map +1 -0
  117. package/scheduler/plugin/plugin.types.d.ts +9 -0
  118. package/scheduler/plugin/plugin.types.d.ts.map +1 -0
  119. package/scheduler/plugin/resize-plugin.d.ts +26 -0
  120. package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
  121. package/scheduler/plugin/selection-plugin.d.ts +40 -0
  122. package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
  123. package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
  124. package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
  125. package/scheduler/scheduler-engine.d.ts +95 -0
  126. package/scheduler/scheduler-engine.d.ts.map +1 -0
  127. package/scheduler/utils/date-utils.d.ts +26 -0
  128. package/scheduler/utils/date-utils.d.ts.map +1 -0
  129. package/scheduler/utils/index.d.ts +3 -0
  130. package/scheduler/utils/index.d.ts.map +1 -0
  131. package/scheduler/utils/snap.d.ts +7 -0
  132. package/scheduler/utils/snap.d.ts.map +1 -0
  133. package/spreadsheet/index.d.ts +5 -0
  134. package/spreadsheet/index.d.ts.map +1 -0
  135. package/spreadsheet/models/cell.model.d.ts +44 -0
  136. package/spreadsheet/models/cell.model.d.ts.map +1 -0
  137. package/spreadsheet/models/column.model.d.ts +77 -0
  138. package/spreadsheet/models/column.model.d.ts.map +1 -0
  139. package/spreadsheet/models/filter.model.d.ts +15 -0
  140. package/spreadsheet/models/filter.model.d.ts.map +1 -0
  141. package/spreadsheet/models/formula.model.d.ts +65 -0
  142. package/spreadsheet/models/formula.model.d.ts.map +1 -0
  143. package/spreadsheet/models/index.d.ts +8 -0
  144. package/spreadsheet/models/index.d.ts.map +1 -0
  145. package/spreadsheet/models/row.model.d.ts +33 -0
  146. package/spreadsheet/models/row.model.d.ts.map +1 -0
  147. package/spreadsheet/models/selection.model.d.ts +18 -0
  148. package/spreadsheet/models/selection.model.d.ts.map +1 -0
  149. package/spreadsheet/models/sort.model.d.ts +14 -0
  150. package/spreadsheet/models/sort.model.d.ts.map +1 -0
  151. package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
  152. package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
  153. package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
  154. package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
  155. package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
  156. package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
  157. package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
  158. package/spreadsheet/plugin/index.d.ts +10 -0
  159. package/spreadsheet/plugin/index.d.ts.map +1 -0
  160. package/spreadsheet/plugin/plugin-host.d.ts +66 -0
  161. package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
  162. package/spreadsheet/plugin/plugin.types.d.ts +58 -0
  163. package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
  164. package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
  165. package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
  166. package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
  167. package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
  168. package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
  169. package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
  170. package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
  171. package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
  172. package/spreadsheet/spreadsheet-engine.d.ts +194 -0
  173. package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
  174. package/spreadsheet/utils/cell-utils.d.ts +26 -0
  175. package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
  176. package/spreadsheet/utils/index.d.ts +2 -0
  177. package/spreadsheet/utils/index.d.ts.map +1 -0
  178. package/testing/a11y.d.ts +5 -1
  179. package/testing/a11y.d.ts.map +1 -1
@@ -0,0 +1,456 @@
1
+ /**
2
+ * FormulaPlugin evaluates formulas in cells.
3
+ * Maintains a dependency graph for recalculation ordering.
4
+ */
5
+ export class FormulaPlugin {
6
+ constructor() {
7
+ this.name = 'formula';
8
+ this.priority = 50;
9
+ this._engine = null;
10
+ this._functions = new Map();
11
+ this._registerBuiltinFunctions();
12
+ }
13
+ onInit(engine) {
14
+ this._engine = engine;
15
+ }
16
+ onDestroy() {
17
+ this._functions.clear();
18
+ }
19
+ /** Register a custom function. */
20
+ registerFunction(fn) {
21
+ this._functions.set(fn.name.toUpperCase(), fn);
22
+ }
23
+ /** Evaluate a formula string. */
24
+ evaluate(formula, getCellValue) {
25
+ try {
26
+ const ast = this._parse(formula);
27
+ if (!ast)
28
+ return { value: null, error: '#PARSE!' };
29
+ const value = this._evalNode(ast, getCellValue);
30
+ return { value };
31
+ }
32
+ catch (e) {
33
+ return { value: null, error: e instanceof Error ? e.message : '#ERROR!' };
34
+ }
35
+ }
36
+ /** Build a dependency graph: which cells depend on which. */
37
+ buildDependencyGraph() {
38
+ const graph = new Map();
39
+ if (!this._engine)
40
+ return graph;
41
+ const rows = this._engine.rowData();
42
+ const cols = this._engine.columnDefs();
43
+ for (let r = 0; r < rows.length; r++) {
44
+ for (const col of cols) {
45
+ const val = rows[r].cells[col.id]?.value;
46
+ if (typeof val === 'string' && val.startsWith('=')) {
47
+ const refs = this._extractRefs(val);
48
+ graph.set(`${r}:${col.id}`, refs);
49
+ }
50
+ }
51
+ }
52
+ return graph;
53
+ }
54
+ /** Topologically sort cells by their dependencies (recalc order). */
55
+ getRecalcOrder() {
56
+ const graph = this.buildDependencyGraph();
57
+ const visited = new Set();
58
+ const order = [];
59
+ const visit = (cell, stack) => {
60
+ if (visited.has(cell))
61
+ return;
62
+ if (stack.has(cell))
63
+ return;
64
+ stack.add(cell);
65
+ const deps = graph.get(cell) ?? [];
66
+ for (const dep of deps) {
67
+ visit(dep, stack);
68
+ }
69
+ stack.delete(cell);
70
+ visited.add(cell);
71
+ order.push(cell);
72
+ };
73
+ for (const cell of graph.keys()) {
74
+ visit(cell, new Set());
75
+ }
76
+ return order;
77
+ }
78
+ // ── Parser ──
79
+ _parse(formula) {
80
+ const expr = formula.startsWith('=') ? formula.slice(1) : formula;
81
+ try {
82
+ return this._parseExpression(expr, { pos: 0 });
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ _parseExpression(expr, ctx) {
89
+ return this._parseComparison(expr, ctx);
90
+ }
91
+ _parseComparison(expr, ctx) {
92
+ let left = this._parseConcat(expr, ctx);
93
+ this._skipSpaces(expr, ctx);
94
+ while (ctx.pos < expr.length) {
95
+ const ch = expr[ctx.pos];
96
+ if (ch === '=' || ch === '<' || ch === '>') {
97
+ let op;
98
+ if (ch === '=' && expr[ctx.pos + 1] !== '=') {
99
+ op = '=';
100
+ ctx.pos++;
101
+ }
102
+ else if (ch === '<' && expr[ctx.pos + 1] === '>') {
103
+ op = '<>';
104
+ ctx.pos += 2;
105
+ }
106
+ else if (ch === '<' && expr[ctx.pos + 1] === '=') {
107
+ op = '<=';
108
+ ctx.pos += 2;
109
+ }
110
+ else if (ch === '>' && expr[ctx.pos + 1] === '=') {
111
+ op = '>=';
112
+ ctx.pos += 2;
113
+ }
114
+ else if (ch === '>') {
115
+ op = '>';
116
+ ctx.pos++;
117
+ }
118
+ else {
119
+ break;
120
+ }
121
+ const right = this._parseConcat(expr, ctx);
122
+ left = { type: 'binary_op', op: op, left, right };
123
+ }
124
+ else {
125
+ break;
126
+ }
127
+ }
128
+ return left;
129
+ }
130
+ _parseConcat(expr, ctx) {
131
+ let left = this._parseAddSub(expr, ctx);
132
+ this._skipSpaces(expr, ctx);
133
+ while (ctx.pos < expr.length && expr[ctx.pos] === '&') {
134
+ ctx.pos++;
135
+ const right = this._parseAddSub(expr, ctx);
136
+ left = { type: 'binary_op', op: '&', left, right };
137
+ this._skipSpaces(expr, ctx);
138
+ }
139
+ return left;
140
+ }
141
+ _parseAddSub(expr, ctx) {
142
+ let left = this._parseMulDiv(expr, ctx);
143
+ this._skipSpaces(expr, ctx);
144
+ while (ctx.pos < expr.length && (expr[ctx.pos] === '+' || expr[ctx.pos] === '-')) {
145
+ const op = expr[ctx.pos];
146
+ ctx.pos++;
147
+ const right = this._parseMulDiv(expr, ctx);
148
+ left = { type: 'binary_op', op, left, right };
149
+ this._skipSpaces(expr, ctx);
150
+ }
151
+ return left;
152
+ }
153
+ _parseMulDiv(expr, ctx) {
154
+ let left = this._parseUnary(expr, ctx);
155
+ this._skipSpaces(expr, ctx);
156
+ while (ctx.pos < expr.length && (expr[ctx.pos] === '*' || expr[ctx.pos] === '/')) {
157
+ const op = expr[ctx.pos];
158
+ ctx.pos++;
159
+ const right = this._parseUnary(expr, ctx);
160
+ left = { type: 'binary_op', op, left, right };
161
+ this._skipSpaces(expr, ctx);
162
+ }
163
+ return left;
164
+ }
165
+ _parseUnary(expr, ctx) {
166
+ this._skipSpaces(expr, ctx);
167
+ if (ctx.pos < expr.length && (expr[ctx.pos] === '-' || expr[ctx.pos] === '+')) {
168
+ const op = expr[ctx.pos];
169
+ ctx.pos++;
170
+ const operand = this._parseUnary(expr, ctx);
171
+ return { type: 'unary_op', op, operand };
172
+ }
173
+ return this._parsePrimary(expr, ctx);
174
+ }
175
+ _parsePrimary(expr, ctx) {
176
+ this._skipSpaces(expr, ctx);
177
+ if (ctx.pos >= expr.length) {
178
+ throw new Error('Unexpected end of expression');
179
+ }
180
+ const ch = expr[ctx.pos];
181
+ // String literal
182
+ if (ch === '"') {
183
+ ctx.pos++;
184
+ let str = '';
185
+ while (ctx.pos < expr.length && expr[ctx.pos] !== '"') {
186
+ str += expr[ctx.pos++];
187
+ }
188
+ if (ctx.pos < expr.length)
189
+ ctx.pos++;
190
+ return { type: 'string', value: str };
191
+ }
192
+ // Parenthesized expression
193
+ if (ch === '(') {
194
+ ctx.pos++;
195
+ const node = this._parseExpression(expr, ctx);
196
+ this._skipSpaces(expr, ctx);
197
+ if (ctx.pos < expr.length && expr[ctx.pos] === ')')
198
+ ctx.pos++;
199
+ return node;
200
+ }
201
+ // Number
202
+ if ((ch >= '0' && ch <= '9') || ch === '.') {
203
+ let numStr = '';
204
+ while (ctx.pos < expr.length &&
205
+ ((expr[ctx.pos] >= '0' && expr[ctx.pos] <= '9') || expr[ctx.pos] === '.')) {
206
+ numStr += expr[ctx.pos++];
207
+ }
208
+ return { type: 'number', value: parseFloat(numStr) };
209
+ }
210
+ // Boolean
211
+ const upper = expr.slice(ctx.pos).toUpperCase();
212
+ if (upper.startsWith('TRUE')) {
213
+ ctx.pos += 4;
214
+ return { type: 'boolean', value: true };
215
+ }
216
+ if (upper.startsWith('FALSE')) {
217
+ ctx.pos += 5;
218
+ return { type: 'boolean', value: false };
219
+ }
220
+ // Cell reference, range, or function call
221
+ if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
222
+ let name = '';
223
+ while (ctx.pos < expr.length && /[A-Za-z0-9_]/.test(expr[ctx.pos])) {
224
+ name += expr[ctx.pos++];
225
+ }
226
+ this._skipSpaces(expr, ctx);
227
+ // Range reference (e.g. A1:B5)
228
+ if (ctx.pos < expr.length && expr[ctx.pos] === ':') {
229
+ ctx.pos++;
230
+ const end = this._parseCellRef(expr, ctx);
231
+ const startParsed = parseCellRefStr(name);
232
+ return {
233
+ type: 'range_ref',
234
+ startCol: startParsed.col,
235
+ startRow: startParsed.row,
236
+ endCol: end.col,
237
+ endRow: end.row,
238
+ };
239
+ }
240
+ // Function call
241
+ if (ctx.pos < expr.length && expr[ctx.pos] === '(') {
242
+ ctx.pos++;
243
+ const args = [];
244
+ while (ctx.pos < expr.length && expr[ctx.pos] !== ')') {
245
+ args.push(this._parseExpression(expr, ctx));
246
+ this._skipSpaces(expr, ctx);
247
+ if (ctx.pos < expr.length && expr[ctx.pos] === ',')
248
+ ctx.pos++;
249
+ this._skipSpaces(expr, ctx);
250
+ }
251
+ if (ctx.pos < expr.length)
252
+ ctx.pos++;
253
+ return { type: 'function_call', name: name.toUpperCase(), args };
254
+ }
255
+ // Cell reference
256
+ const ref = parseCellRefStr(name);
257
+ return { type: 'cell_ref', col: ref.col, row: ref.row };
258
+ }
259
+ throw new Error(`Unexpected character: ${ch}`);
260
+ }
261
+ _parseCellRef(expr, ctx) {
262
+ let name = '';
263
+ while (ctx.pos < expr.length && /[A-Za-z0-9_]/.test(expr[ctx.pos])) {
264
+ name += expr[ctx.pos++];
265
+ }
266
+ return parseCellRefStr(name);
267
+ }
268
+ _skipSpaces(expr, ctx) {
269
+ while (ctx.pos < expr.length && expr[ctx.pos] === ' ')
270
+ ctx.pos++;
271
+ }
272
+ // ── Evaluator ──
273
+ _evalNode(node, getCellValue) {
274
+ switch (node.type) {
275
+ case 'number':
276
+ return node.value;
277
+ case 'string':
278
+ return node.value;
279
+ case 'boolean':
280
+ return node.value;
281
+ case 'cell_ref': {
282
+ const refNode = node;
283
+ const ref = `${refNode.col}${refNode.row}`;
284
+ const val = getCellValue(ref);
285
+ if (typeof val === 'string' && val.startsWith('=')) {
286
+ const result = this.evaluate(val, getCellValue);
287
+ return result.value;
288
+ }
289
+ return val;
290
+ }
291
+ case 'binary_op': {
292
+ const binNode = node;
293
+ const l = this._evalNode(binNode.left, getCellValue);
294
+ const r = this._evalNode(binNode.right, getCellValue);
295
+ return this._evalBinaryOp(binNode.op, l, r);
296
+ }
297
+ case 'unary_op': {
298
+ const unaryNode = node;
299
+ const val = this._evalNode(unaryNode.operand, getCellValue);
300
+ if (unaryNode.op === '-')
301
+ return -val;
302
+ return val;
303
+ }
304
+ case 'function_call': {
305
+ const fnNode = node;
306
+ const fn = this._functions.get(fnNode.name);
307
+ if (!fn)
308
+ throw new Error(`Unknown function: ${fnNode.name}`);
309
+ const args = fnNode.args.map((a) => this._evalNode(a, getCellValue));
310
+ return fn.fn(args);
311
+ }
312
+ case 'range_ref':
313
+ return 0;
314
+ default:
315
+ return null;
316
+ }
317
+ }
318
+ _evalBinaryOp(op, l, r) {
319
+ const ln = typeof l === 'number' ? l : parseFloat(String(l)) || 0;
320
+ const rn = typeof r === 'number' ? r : parseFloat(String(r)) || 0;
321
+ switch (op) {
322
+ case '+':
323
+ return ln + rn;
324
+ case '-':
325
+ return ln - rn;
326
+ case '*':
327
+ return ln * rn;
328
+ case '/':
329
+ return rn !== 0 ? ln / rn : null;
330
+ case '&':
331
+ return String(l ?? '') + String(r ?? '');
332
+ case '=':
333
+ return l === r || ln === rn;
334
+ case '<>':
335
+ return l !== r && ln !== rn;
336
+ case '>':
337
+ return ln > rn;
338
+ case '<':
339
+ return ln < rn;
340
+ case '>=':
341
+ return ln >= rn;
342
+ case '<=':
343
+ return ln <= rn;
344
+ default:
345
+ return 0;
346
+ }
347
+ }
348
+ _extractRefs(formula) {
349
+ const refs = [];
350
+ const regex = /([A-Z]+)(\d+)/gi;
351
+ let match;
352
+ while ((match = regex.exec(formula)) !== null) {
353
+ refs.push(`${match[1].toUpperCase()}${match[2]}`);
354
+ }
355
+ return refs;
356
+ }
357
+ // ── Built-in Functions ──
358
+ _registerBuiltinFunctions() {
359
+ const fns = [
360
+ {
361
+ name: 'SUM',
362
+ minArgs: 1,
363
+ maxArgs: Infinity,
364
+ fn: (args) => args.reduce((s, v) => s + (Number(v) || 0), 0),
365
+ },
366
+ {
367
+ name: 'AVERAGE',
368
+ minArgs: 1,
369
+ maxArgs: Infinity,
370
+ fn: (args) => {
371
+ const nums = args.map(Number).filter((n) => !isNaN(n));
372
+ return nums.length ? nums.reduce((s, v) => s + v, 0) / nums.length : 0;
373
+ },
374
+ },
375
+ {
376
+ name: 'COUNT',
377
+ minArgs: 1,
378
+ maxArgs: Infinity,
379
+ fn: (args) => args.filter((v) => v != null && v !== '').length,
380
+ },
381
+ {
382
+ name: 'MIN',
383
+ minArgs: 1,
384
+ maxArgs: Infinity,
385
+ fn: (args) => Math.min(...args.map(Number).filter((n) => !isNaN(n))),
386
+ },
387
+ {
388
+ name: 'MAX',
389
+ minArgs: 1,
390
+ maxArgs: Infinity,
391
+ fn: (args) => Math.max(...args.map(Number).filter((n) => !isNaN(n))),
392
+ },
393
+ {
394
+ name: 'IF',
395
+ minArgs: 3,
396
+ maxArgs: 3,
397
+ fn: (args) => (args[0] ? args[1] : args[2]),
398
+ },
399
+ {
400
+ name: 'AND',
401
+ minArgs: 1,
402
+ maxArgs: Infinity,
403
+ fn: (args) => args.every(Boolean),
404
+ },
405
+ {
406
+ name: 'OR',
407
+ minArgs: 1,
408
+ maxArgs: Infinity,
409
+ fn: (args) => args.some(Boolean),
410
+ },
411
+ {
412
+ name: 'NOT',
413
+ minArgs: 1,
414
+ maxArgs: 1,
415
+ fn: (args) => !args[0],
416
+ },
417
+ {
418
+ name: 'CONCAT',
419
+ minArgs: 1,
420
+ maxArgs: Infinity,
421
+ fn: (args) => args.join(''),
422
+ },
423
+ {
424
+ name: 'ROUND',
425
+ minArgs: 1,
426
+ maxArgs: 2,
427
+ fn: (args) => {
428
+ const decimals = args[1] != null ? Number(args[1]) : 0;
429
+ return Math.round(Number(args[0]) * Math.pow(10, decimals)) / Math.pow(10, decimals);
430
+ },
431
+ },
432
+ { name: 'ABS', minArgs: 1, maxArgs: 1, fn: (args) => Math.abs(Number(args[0])) },
433
+ {
434
+ name: 'POWER',
435
+ minArgs: 2,
436
+ maxArgs: 2,
437
+ fn: (args) => Math.pow(Number(args[0]), Number(args[1])),
438
+ },
439
+ { name: 'SQRT', minArgs: 1, maxArgs: 1, fn: (args) => Math.sqrt(Number(args[0])) },
440
+ { name: 'LEN', minArgs: 1, maxArgs: 1, fn: (args) => String(args[0]).length },
441
+ { name: 'UPPER', minArgs: 1, maxArgs: 1, fn: (args) => String(args[0]).toUpperCase() },
442
+ { name: 'LOWER', minArgs: 1, maxArgs: 1, fn: (args) => String(args[0]).toLowerCase() },
443
+ { name: 'TRIM', minArgs: 1, maxArgs: 1, fn: (args) => String(args[0]).trim() },
444
+ ];
445
+ for (const fn of fns) {
446
+ this._functions.set(fn.name, fn);
447
+ }
448
+ }
449
+ }
450
+ function parseCellRefStr(ref) {
451
+ const match = ref.match(/^([A-Z]+)(\d+)$/i);
452
+ if (!match)
453
+ throw new Error(`Invalid cell reference: ${ref}`);
454
+ return { col: match[1].toUpperCase(), row: parseInt(match[2], 10) };
455
+ }
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL2Zvcm11bGEtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdCQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQU94QjtRQU5TLFNBQUksR0FBRyxTQUFTLENBQUM7UUFDakIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVmLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztRQUd0RCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQXlCO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLGdCQUFnQixDQUFDLEVBQW1CO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxRQUFRLENBQUMsT0FBZSxFQUFFLFlBQXNDO1FBQzlELElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2hELE9BQU8sRUFBRSxL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O1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNwcmVhZHNoZWV0UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4udHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldEVuZ2luZSB9IGZyb20gJy4uL3NwcmVhZHNoZWV0LWVuZ2luZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEZvcm11bGFOb2RlLFxuICBDZWxsUmVmTm9kZSxcbiAgUmFuZ2VSZWZOb2RlLFxuICBOdW1iZXJOb2RlLFxuICBTdHJpbmdOb2RlLFxuICBCb29sZWFuTm9kZSxcbiAgQmluYXJ5T3BOb2RlLFxuICBVbmFyeU9wTm9kZSxcbiAgRnVuY3Rpb25DYWxsTm9kZSxcbiAgRm9ybXVsYVJlc3VsdCxcbiAgRm9ybXVsYUZ1bmN0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuXG4vKipcbiAqIEZvcm11bGFQbHVnaW4gZXZhbHVhdGVzIGZvcm11bGFzIGluIGNlbGxzLlxuICogTWFpbnRhaW5zIGEgZGVwZW5kZW5jeSBncmFwaCBmb3IgcmVjYWxjdWxhdGlvbiBvcmRlcmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZvcm11bGFQbHVnaW4gaW1wbGVtZW50cyBTcHJlYWRzaGVldFBsdWdpbiB7XG4gIHJlYWRvbmx5IG5hbWUgPSAnZm9ybXVsYSc7XG4gIHJlYWRvbmx5IHByaW9yaXR5ID0gNTA7XG5cbiAgcHJpdmF0ZSBfZW5naW5lOiBTcHJlYWRzaGVldEVuZ2luZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9mdW5jdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRm9ybXVsYUZ1bmN0aW9uPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyQnVpbHRpbkZ1bmN0aW9ucygpO1xuICB9XG5cbiAgb25Jbml0KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XG4gIH1cblxuICBvbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZnVuY3Rpb25zLmNsZWFyKCk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYSBjdXN0b20gZnVuY3Rpb24uICovXG4gIHJlZ2lzdGVyRnVuY3Rpb24oZm46IEZvcm11bGFGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2Z1bmN0aW9ucy5zZXQoZm4ubmFtZS50b1VwcGVyQ2FzZSgpLCBmbik7XG4gIH1cblxuICAvKiogRXZhbHVhdGUgYSBmb3JtdWxhIHN0cmluZy4gKi9cbiAgZXZhbHVhdGUoZm9ybXVsYTogc3RyaW5nLCBnZXRDZWxsVmFsdWU6IChyZWY6IHN0cmluZykgPT4gdW5rbm93bik6IEZvcm11bGFSZXN1bHQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc3QgPSB0aGlzLl9wYXJzZShmb3JtdWxhKTtcbiAgICAgIGlmICghYXN0KSByZXR1cm4geyB2YWx1ZTogbnVsbCwgZXJyb3I6ICcjUEFSU0UhJyB9O1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9ldmFsTm9kZShhc3QsIGdldENlbGxWYWx1ZSk7XG4gICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBudWxsLCBlcnJvcjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJyNFUlJPUiEnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgZGVwZW5kZW5jeSBncmFwaDogd2hpY2ggY2VsbHMgZGVwZW5kIG9uIHdoaWNoLiAqL1xuICBidWlsZERlcGVuZGVuY3lHcmFwaCgpOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGdyYXBoID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm4gZ3JhcGg7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fZW5naW5lLnJvd0RhdGEoKTtcbiAgICBjb25zdCBjb2xzID0gdGhpcy5fZW5naW5lLmNvbHVtbkRlZnMoKTtcblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xuICAgICAgICBjb25zdCB2YWwgPSByb3dzW3JdLmNlbGxzW2NvbC5pZF0/LnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnN0YXJ0c1dpdGgoJz0nKSkge1xuICAgICAgICAgIGNvbnN0IHJlZnMgPSB0aGlzLl9leHRyYWN0UmVmcyh2YWwpO1xuICAgICAgICAgIGdyYXBoLnNldChgJHtyfToke2NvbC5pZH1gLCByZWZzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBncmFwaDtcbiAgfVxuXG4gIC8qKiBUb3BvbG9naWNhbGx5IHNvcnQgY2VsbHMgYnkgdGhlaXIgZGVwZW5kZW5jaWVzIChyZWNhbGMgb3JkZXIpLiAqL1xuICBnZXRSZWNhbGNPcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZ3JhcGggPSB0aGlzLmJ1aWxkRGVwZW5kZW5jeUdyYXBoKCk7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgdmlzaXQgPSAoY2VsbDogc3RyaW5nLCBzdGFjazogU2V0PHN0cmluZz4pID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhjZWxsKSkgcmV0dXJuO1xuICAgICAgaWYgKHN0YWNrLmhhcyhjZWxsKSkgcmV0dXJuO1xuICAgICAgc3RhY2suYWRkKGNlbGwpO1xuICAgICAgY29uc3QgZGVwcyA9IGdyYXBoLmdldChjZWxsKSA/PyBbXTtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgdmlzaXQoZGVwLCBzdGFjayk7XG4gICAgICB9XG4gICAgICBzdGFjay5kZWxldGUoY2VsbCk7XG4gICAgICB2aXNpdGVkLmFkZChjZWxsKTtcbiAgICAgIG9yZGVyLnB1c2goY2VsbCk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgY2VsbCBvZiBncmFwaC5rZXlzKCkpIHtcbiAgICAgIHZpc2l0KGNlbGwsIG5ldyBTZXQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBhcnNlciDilIDilIBcblxuICBwcml2YXRlIF9wYXJzZShmb3JtdWxhOiBzdHJpbmcpOiBGb3JtdWxhTm9kZSB8IG51bGwge1xuICAgIGNvbnN0IGV4cHIgPSBmb3JtdWxhLnN0YXJ0c1dpdGgoJz0nKSA/IGZvcm11bGEuc2xpY2UoMSkgOiBmb3JtdWxhO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFyc2VFeHByZXNzaW9uKGV4cHIsIHsgcG9zOiAwIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VFeHByZXNzaW9uKGV4cHI6IHN0cmluZywgY3R4OiB7IHBvczogbnVtYmVyIH0pOiBGb3JtdWxhTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlQ29tcGFyaXNvbihleHByLCBjdHgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VDb21wYXJpc29uKGV4cHI6IHN0cmluZywgY3R4OiB7IHBvczogbnVtYmVyIH0pOiBGb3JtdWxhTm9kZSB7XG4gICAgbGV0IGxlZnQgPSB0aGlzLl9wYXJzZUNvbmNhdChleHByLCBjdHgpO1xuICAgIHRoaXMuX3NraXBTcGFjZXMoZXhwciwgY3R4KTtcblxuICAgIHdoaWxlIChjdHgucG9zIDwgZXhwci5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNoID0gZXhwcltjdHgucG9zXTtcbiAgICAgIGlmIChjaCA9PT0gJz0nIHx8IGNoID09PSAnPCcgfHwgY2ggPT09ICc+Jykge1xuICAgICAgICBsZXQgb3A6IHN0cmluZztcbiAgICAgICAgaWYgKGNoID09PSAnPScgJiYgZXhwcltjdHgucG9zICsgMV0gIT09ICc9Jykge1xuICAgICAgICAgIG9wID0gJz0nO1xuICAgICAgICAgIGN0eC5wb3MrKztcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJzwnICYmIGV4cHJbY3R4LnBvcyArIDFdID09PSAnPicpIHtcbiAgICAgICAgICBvcCA9ICc8Pic7XG4gICAgICAgICAgY3R4LnBvcyArPSAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnPCcgJiYgZXhwcltjdHgucG9zICsgMV0gPT09ICc9Jykge1xuICAgICAgICAgIG9wID0gJzw9JztcbiAgICAgICAgICBjdHgucG9zICs9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICc+JyAmJiBleHByW2N0eC5wb3MgKyAxXSA9PT0gJz0nKSB7XG4gICAgICAgICAgb3AgPSAnPj0nO1xuICAgICAgICAgIGN0eC5wb3MgKz0gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJz4nKSB7XG4gICAgICAgICAgb3AgPSAnPic7XG4gICAgICAgICAgY3R4LnBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fcGFyc2VDb25jYXQoZXhwciwgY3R4KTtcbiAgICAgICAgbGVmdCA9IHsgdHlwZTogJ2JpbmFyeV9vcCcsIG9wOiBvcCBhcyBCaW5hcnlPcE5vZGVbJ29wJ10sIGxlZnQsIHJpZ2h0IH0gYXMgQmluYXJ5T3BOb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlZnQ7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUNvbmNhdChleHByOiBzdHJpbmcsIGN0eDogeyBwb3M6IG51bWJlciB9KTogRm9ybXVsYU5vZGUge1xuICAgIGxldCBsZWZ0ID0gdGhpcy5fcGFyc2VBZGRTdWIoZXhwciwgY3R4KTtcbiAgICB0aGlzLl9za2lwU3BhY2VzKGV4cHIsIGN0eCk7XG5cbiAgICB3aGlsZSAoY3R4LnBvcyA8IGV4cHIubGVuZ3RoICYmIGV4cHJbY3R4LnBvc10gPT09ICcmJykge1xuICAgICAgY3R4LnBvcysrO1xuICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLl9wYXJzZUFkZFN1YihleHByLCBjdHgpO1xuICAgICAgbGVmdCA9IHsgdHlwZTogJ2JpbmFyeV9vcCcsIG9wOiAnJicsIGxlZnQsIHJpZ2h0IH0gYXMgQmluYXJ5T3BOb2RlO1xuICAgICAgdGhpcy5fc2tpcFNwYWNlcyhleHByLCBjdHgpO1xuICAgIH1cblxuICAgIHJldHVybiBsZWZ0O1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VBZGRTdWIoZXhwcjogc3RyaW5nLCBjdHg6IHsgcG9zOiBudW1iZXIgfSk6IEZvcm11bGFOb2RlIHtcbiAgICBsZXQgbGVmdCA9IHRoaXMuX3BhcnNlTXVsRGl2KGV4cHIsIGN0eCk7XG4gICAgdGhpcy5fc2tpcFNwYWNlcyhleHByLCBjdHgpO1xuXG4gICAgd2hpbGUgKGN0eC5wb3MgPCBleHByLmxlbmd0aCAmJiAoZXhwcltjdHgucG9zXSA9PT0gJysnIHx8IGV4cHJbY3R4LnBvc10gPT09ICctJykpIHtcbiAgICAgIGNvbnN0IG9wID0gZXhwcltjdHgucG9zXSBhcyAnKycgfCAnLSc7XG4gICAgICBjdHgucG9zKys7XG4gICAgICBjb25zdCByaWdodCA9IHRoaXMuX3BhcnNlTXVsRGl2KGV4cHIsIGN0eCk7XG4gICAgICBsZWZ0ID0geyB0eXBlOiAnYmluYXJ5X29wJywgb3AsIGxlZnQsIHJpZ2h0IH0gYXMgQmluYXJ5T3BOb2RlO1xuICAgICAgdGhpcy5fc2tpcFNwYWNlcyhleHByLCBjdHgpO1xuICAgIH1cblxuICAgIHJldHVybiBsZWZ0O1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VNdWxEaXYoZXhwcjogc3RyaW5nLCBjdHg6IHsgcG9zOiBudW1iZXIgfSk6IEZvcm11bGFOb2RlIHtcbiAgICBsZXQgbGVmdCA9IHRoaXMuX3BhcnNlVW5hcnkoZXhwciwgY3R4KTtcbiAgICB0aGlzLl9za2lwU3BhY2VzKGV4cHIsIGN0eCk7XG5cbiAgICB3aGlsZSAoY3R4LnBvcyA8IGV4cHIubGVuZ3RoICYmIChleHByW2N0eC5wb3NdID09PSAnKicgfHwgZXhwcltjdHgucG9zXSA9PT0gJy8nKSkge1xuICAgICAgY29uc3Qgb3AgPSBleHByW2N0eC5wb3NdIGFzICcqJyB8ICcvJztcbiAgICAgIGN0eC5wb3MrKztcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fcGFyc2VVbmFyeShleHByLCBjdHgpO1xuICAgICAgbGVmdCA9IHsgdHlwZTogJ2JpbmFyeV9vcCcsIG9wLCBsZWZ0LCByaWdodCB9IGFzIEJpbmFyeU9wTm9kZTtcbiAgICAgIHRoaXMuX3NraXBTcGFjZXMoZXhwciwgY3R4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVmdDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVW5hcnkoZXhwcjogc3RyaW5nLCBjdHg6IHsgcG9zOiBudW1iZXIgfSk6IEZvcm11bGFOb2RlIHtcbiAgICB0aGlzLl9za2lwU3BhY2VzKGV4cHIsIGN0eCk7XG4gICAgaWYgKGN0eC5wb3MgPCBleHByLmxlbmd0aCAmJiAoZXhwcltjdHgucG9zXSA9PT0gJy0nIHx8IGV4cHJbY3R4LnBvc10gPT09ICcrJykpIHtcbiAgICAgIGNvbnN0IG9wID0gZXhwcltjdHgucG9zXSBhcyAnLScgfCAnKyc7XG4gICAgICBjdHgucG9zKys7XG4gICAgICBjb25zdCBvcGVyYW5kID0gdGhpcy5fcGFyc2VVbmFyeShleHByLCBjdHgpO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ3VuYXJ5X29wJywgb3AsIG9wZXJhbmQgfSBhcyBVbmFyeU9wTm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlUHJpbWFyeShleHByLCBjdHgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VQcmltYXJ5KGV4cHI6IHN0cmluZywgY3R4OiB7IHBvczogbnVtYmVyIH0pOiBGb3JtdWxhTm9kZSB7XG4gICAgdGhpcy5fc2tpcFNwYWNlcyhleHByLCBjdHgpO1xuXG4gICAgaWYgKGN0eC5wb3MgPj0gZXhwci5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoID0gZXhwcltjdHgucG9zXTtcblxuICAgIC8vIFN0cmluZyBsaXRlcmFsXG4gICAgaWYgKGNoID09PSAnXCInKSB7XG4gICAgICBjdHgucG9zKys7XG4gICAgICBsZXQgc3RyID0gJyc7XG4gICAgICB3aGlsZSAoY3R4LnBvcyA8IGV4cHIubGVuZ3RoICYmIGV4cHJbY3R4LnBvc10gIT09ICdcIicpIHtcbiAgICAgICAgc3RyICs9IGV4cHJbY3R4LnBvcysrXTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHgucG9zIDwgZXhwci5sZW5ndGgpIGN0eC5wb3MrKztcbiAgICAgIHJldHVybiB7IHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogc3RyIH0gYXMgU3RyaW5nTm9kZTtcbiAgICB9XG5cbiAgICAvLyBQYXJlbnRoZXNpemVkIGV4cHJlc3Npb25cbiAgICBpZiAoY2ggPT09ICcoJykge1xuICAgICAgY3R4LnBvcysrO1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3BhcnNlRXhwcmVzc2lvbihleHByLCBjdHgpO1xuICAgICAgdGhpcy5fc2tpcFNwYWNlcyhleHByLCBjdHgpO1xuICAgICAgaWYgKGN0eC5wb3MgPCBleHByLmxlbmd0aCAmJiBleHByW2N0eC5wb3NdID09PSAnKScpIGN0eC5wb3MrKztcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIE51bWJlclxuICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgY2ggPT09ICcuJykge1xuICAgICAgbGV0IG51bVN0ciA9ICcnO1xuICAgICAgd2hpbGUgKFxuICAgICAgICBjdHgucG9zIDwgZXhwci5sZW5ndGggJiZcbiAgICAgICAgKChleHByW2N0eC5wb3NdID49ICcwJyAmJiBleHByW2N0eC5wb3NdIDw9ICc5JykgfHwgZXhwcltjdHgucG9zXSA9PT0gJy4nKVxuICAgICAgKSB7XG4gICAgICAgIG51bVN0ciArPSBleHByW2N0eC5wb3MrK107XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0eXBlOiAnbnVtYmVyJywgdmFsdWU6IHBhcnNlRmxvYXQobnVtU3RyKSB9IGFzIE51bWJlck5vZGU7XG4gICAgfVxuXG4gICAgLy8gQm9vbGVhblxuICAgIGNvbnN0IHVwcGVyID0gZXhwci5zbGljZShjdHgucG9zKS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICh1cHBlci5zdGFydHNXaXRoKCdUUlVFJykpIHtcbiAgICAgIGN0eC5wb3MgKz0gNDtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdib29sZWFuJywgdmFsdWU6IHRydWUgfSBhcyBCb29sZWFuTm9kZTtcbiAgICB9XG4gICAgaWYgKHVwcGVyLnN0YXJ0c1dpdGgoJ0ZBTFNFJykpIHtcbiAgICAgIGN0eC5wb3MgKz0gNTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdib29sZWFuJywgdmFsdWU6IGZhbHNlIH0gYXMgQm9vbGVhbk5vZGU7XG4gICAgfVxuXG4gICAgLy8gQ2VsbCByZWZlcmVuY2UsIHJhbmdlLCBvciBmdW5jdGlvbiBjYWxsXG4gICAgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykpIHtcbiAgICAgIGxldCBuYW1lID0gJyc7XG4gICAgICB3aGlsZSAoY3R4LnBvcyA8IGV4cHIubGVuZ3RoICYmIC9bQS1aYS16MC05X10vLnRlc3QoZXhwcltjdHgucG9zXSkpIHtcbiAgICAgICAgbmFtZSArPSBleHByW2N0eC5wb3MrK107XG4gICAgICB9XG4gICAgICB0aGlzLl9za2lwU3BhY2VzKGV4cHIsIGN0eCk7XG5cbiAgICAgIC8vIFJhbmdlIHJlZmVyZW5jZSAoZS5nLiBBMTpCNSlcbiAgICAgIGlmIChjdHgucG9zIDwgZXhwci5sZW5ndGggJiYgZXhwcltjdHgucG9zXSA9PT0gJzonKSB7XG4gICAgICAgIGN0eC5wb3MrKztcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5fcGFyc2VDZWxsUmVmKGV4cHIsIGN0eCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyc2VkID0gcGFyc2VDZWxsUmVmU3RyKG5hbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdyYW5nZV9yZWYnLFxuICAgICAgICAgIHN0YXJ0Q29sOiBzdGFydFBhcnNlZC5jb2wsXG4gICAgICAgICAgc3RhcnRSb3c6IHN0YXJ0UGFyc2VkLnJvdyxcbiAgICAgICAgICBlbmRDb2w6IGVuZC5jb2wsXG4gICAgICAgICAgZW5kUm93OiBlbmQucm93LFxuICAgICAgICB9IGFzIFJhbmdlUmVmTm9kZTtcbiAgICAgIH1cblxuICAgICAgLy8gRnVuY3Rpb24gY2FsbFxuICAgICAgaWYgKGN0eC5wb3MgPCBleHByLmxlbmd0aCAmJiBleHByW2N0eC5wb3NdID09PSAnKCcpIHtcbiAgICAgICAgY3R4LnBvcysrO1xuICAgICAgICBjb25zdCBhcmdzOiBGb3JtdWxhTm9kZVtdID0gW107XG4gICAgICAgIHdoaWxlIChjdHgucG9zIDwgZXhwci5sZW5ndGggJiYgZXhwcltjdHgucG9zXSAhPT0gJyknKSB7XG4gICAgICAgICAgYXJncy5wdXNoKHRoaXMuX3BhcnNlRXhwcmVzc2lvbihleHByLCBjdHgpKTtcbiAgICAgICAgICB0aGlzLl9za2lwU3BhY2VzKGV4cHIsIGN0eCk7XG4gICAgICAgICAgaWYgKGN0eC5wb3MgPCBleHByLmxlbmd0aCAmJiBleHByW2N0eC5wb3NdID09PSAnLCcpIGN0eC5wb3MrKztcbiAgICAgICAgICB0aGlzLl9za2lwU3BhY2VzKGV4cHIsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5wb3MgPCBleHByLmxlbmd0aCkgY3R4LnBvcysrO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZnVuY3Rpb25fY2FsbCcsIG5hbWU6IG5hbWUudG9VcHBlckNhc2UoKSwgYXJncyB9IGFzIEZ1bmN0aW9uQ2FsbE5vZGU7XG4gICAgICB9XG5cbiAgICAgIC8vIENlbGwgcmVmZXJlbmNlXG4gICAgICBjb25zdCByZWYgPSBwYXJzZUNlbGxSZWZTdHIobmFtZSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY2VsbF9yZWYnLCBjb2w6IHJlZi5jb2wsIHJvdzogcmVmLnJvdyB9IGFzIENlbGxSZWZOb2RlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICR7Y2h9YCk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUNlbGxSZWYoZXhwcjogc3RyaW5nLCBjdHg6IHsgcG9zOiBudW1iZXIgfSk6IHsgY29sOiBzdHJpbmc7IHJvdzogbnVtYmVyIH0ge1xuICAgIGxldCBuYW1lID0gJyc7XG4gICAgd2hpbGUgKGN0eC5wb3MgPCBleHByLmxlbmd0aCAmJiAvW0EtWmEtejAtOV9dLy50ZXN0KGV4cHJbY3R4LnBvc10pKSB7XG4gICAgICBuYW1lICs9IGV4cHJbY3R4LnBvcysrXTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlQ2VsbFJlZlN0cihuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NraXBTcGFjZXMoZXhwcjogc3RyaW5nLCBjdHg6IHsgcG9zOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIHdoaWxlIChjdHgucG9zIDwgZXhwci5sZW5ndGggJiYgZXhwcltjdHgucG9zXSA9PT0gJyAnKSBjdHgucG9zKys7XG4gIH1cblxuICAvLyDilIDilIAgRXZhbHVhdG9yIOKUgOKUgFxuXG4gIHByaXZhdGUgX2V2YWxOb2RlKFxuICAgIG5vZGU6IEZvcm11bGFOb2RlLFxuICAgIGdldENlbGxWYWx1ZTogKHJlZjogc3RyaW5nKSA9PiB1bmtub3duLFxuICApOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiAobm9kZSBhcyBOdW1iZXJOb2RlKS52YWx1ZTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiAobm9kZSBhcyBTdHJpbmdOb2RlKS52YWx1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gKG5vZGUgYXMgQm9vbGVhbk5vZGUpLnZhbHVlO1xuICAgICAgY2FzZSAnY2VsbF9yZWYnOiB7XG4gICAgICAgIGNvbnN0IHJlZk5vZGUgPSBub2RlIGFzIENlbGxSZWZOb2RlO1xuICAgICAgICBjb25zdCByZWYgPSBgJHtyZWZOb2RlLmNvbH0ke3JlZk5vZGUucm93fWA7XG4gICAgICAgIGNvbnN0IHZhbCA9IGdldENlbGxWYWx1ZShyZWYpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnN0YXJ0c1dpdGgoJz0nKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXZhbHVhdGUodmFsLCBnZXRDZWxsVmFsdWUpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbCBhcyBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpbmFyeV9vcCc6IHtcbiAgICAgICAgY29uc3QgYmluTm9kZSA9IG5vZGUgYXMgQmluYXJ5T3BOb2RlO1xuICAgICAgICBjb25zdCBsID0gdGhpcy5fZXZhbE5vZGUoYmluTm9kZS5sZWZ0LCBnZXRDZWxsVmFsdWUpO1xuICAgICAgICBjb25zdCByID0gdGhpcy5fZXZhbE5vZGUoYmluTm9kZS5yaWdodCwgZ2V0Q2VsbFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2YWxCaW5hcnlPcChiaW5Ob2RlLm9wLCBsLCByKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuYXJ5X29wJzoge1xuICAgICAgICBjb25zdCB1bmFyeU5vZGUgPSBub2RlIGFzIFVuYXJ5T3BOb2RlO1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLl9ldmFsTm9kZSh1bmFyeU5vZGUub3BlcmFuZCwgZ2V0Q2VsbFZhbHVlKTtcbiAgICAgICAgaWYgKHVuYXJ5Tm9kZS5vcCA9PT0gJy0nKSByZXR1cm4gLSh2YWwgYXMgbnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Z1bmN0aW9uX2NhbGwnOiB7XG4gICAgICAgIGNvbnN0IGZuTm9kZSA9IG5vZGUgYXMgRnVuY3Rpb25DYWxsTm9kZTtcbiAgICAgICAgY29uc3QgZm4gPSB0aGlzLl9mdW5jdGlvbnMuZ2V0KGZuTm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKCFmbikgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZ1bmN0aW9uOiAke2ZuTm9kZS5uYW1lfWApO1xuICAgICAgICBjb25zdCBhcmdzID0gZm5Ob2RlLmFyZ3MubWFwKChhOiBGb3JtdWxhTm9kZSkgPT4gdGhpcy5fZXZhbE5vZGUoYSwgZ2V0Q2VsbFZhbHVlKSk7XG4gICAgICAgIHJldHVybiBmbi5mbihhcmdzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JhbmdlX3JlZic6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXZhbEJpbmFyeU9wKG9wOiBzdHJpbmcsIGw6IHVua25vd24sIHI6IHVua25vd24pOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHtcbiAgICBjb25zdCBsbiA9IHR5cGVvZiBsID09PSAnbnVtYmVyJyA/IGwgOiBwYXJzZUZsb2F0KFN0cmluZyhsKSkgfHwgMDtcbiAgICBjb25zdCBybiA9IHR5cGVvZiByID09PSAnbnVtYmVyJyA/IHIgOiBwYXJzZUZsb2F0KFN0cmluZyhyKSkgfHwgMDtcblxuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJysnOlxuICAgICAgICByZXR1cm4gbG4gKyBybjtcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgICByZXR1cm4gbG4gLSBybjtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gbG4gKiBybjtcbiAgICAgIGNhc2UgJy8nOlxuICAgICAgICByZXR1cm4gcm4gIT09IDAgPyBsbiAvIHJuIDogKG51bGwgYXMgdW5rbm93biBhcyBudW1iZXIpO1xuICAgICAgY2FzZSAnJic6XG4gICAgICAgIHJldHVybiBTdHJpbmcobCA/PyAnJykgKyBTdHJpbmcociA/PyAnJyk7XG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgcmV0dXJuIGwgPT09IHIgfHwgbG4gPT09IHJuO1xuICAgICAgY2FzZSAnPD4nOlxuICAgICAgICByZXR1cm4gbCAhPT0gciAmJiBsbiAhPT0gcm47XG4gICAgICBjYXNlICc+JzpcbiAgICAgICAgcmV0dXJuIGxuID4gcm47XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgcmV0dXJuIGxuIDwgcm47XG4gICAgICBjYXNlICc+PSc6XG4gICAgICAgIHJldHVybiBsbiA+PSBybjtcbiAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgcmV0dXJuIGxuIDw9IHJuO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXh0cmFjdFJlZnMoZm9ybXVsYTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlZnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVnZXggPSAvKFtBLVpdKykoXFxkKykvZ2k7XG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGZvcm11bGEpKSAhPT0gbnVsbCkge1xuICAgICAgcmVmcy5wdXNoKGAke21hdGNoWzFdLnRvVXBwZXJDYXNlKCl9JHttYXRjaFsyXX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZnM7XG4gIH1cblxuICAvLyDilIDilIAgQnVpbHQtaW4gRnVuY3Rpb25zIOKUgOKUgFxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQnVpbHRpbkZ1bmN0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBmbnM6IEZvcm11bGFGdW5jdGlvbltdID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnU1VNJyxcbiAgICAgICAgbWluQXJnczogMSxcbiAgICAgICAgbWF4QXJnczogSW5maW5pdHksXG4gICAgICAgIGZuOiAoYXJncykgPT4gYXJncy5yZWR1Y2U8bnVtYmVyPigocywgdikgPT4gcyArIChOdW1iZXIodikgfHwgMCksIDApLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0FWRVJBR0UnLFxuICAgICAgICBtaW5BcmdzOiAxLFxuICAgICAgICBtYXhBcmdzOiBJbmZpbml0eSxcbiAgICAgICAgZm46IChhcmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbnVtcyA9IGFyZ3MubWFwKE51bWJlcikuZmlsdGVyKChuKSA9PiAhaXNOYU4obikpO1xuICAgICAgICAgIHJldHVybiBudW1zLmxlbmd0aCA/IG51bXMucmVkdWNlKChzLCB2KSA9PiBzICsgdiwgMCkgLyBudW1zLmxlbmd0aCA6IDA7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnQ09VTlQnLFxuICAgICAgICBtaW5BcmdzOiAxLFxuICAgICAgICBtYXhBcmdzOiBJbmZpbml0eSxcbiAgICAgICAgZm46IChhcmdzKSA9PiBhcmdzLmZpbHRlcigodikgPT4gdiAhPSBudWxsICYmIHYgIT09ICcnKS5sZW5ndGgsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnTUlOJyxcbiAgICAgICAgbWluQXJnczogMSxcbiAgICAgICAgbWF4QXJnczogSW5maW5pdHksXG4gICAgICAgIGZuOiAoYXJncykgPT4gTWF0aC5taW4oLi4uYXJncy5tYXAoTnVtYmVyKS5maWx0ZXIoKG4pID0+ICFpc05hTihuKSkpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ01BWCcsXG4gICAgICAgIG1pbkFyZ3M6IDEsXG4gICAgICAgIG1heEFyZ3M6IEluZmluaXR5LFxuICAgICAgICBmbjogKGFyZ3MpID0+IE1hdGgubWF4KC4uLmFyZ3MubWFwKE51bWJlcikuZmlsdGVyKChuKSA9PiAhaXNOYU4obikpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdJRicsXG4gICAgICAgIG1pbkFyZ3M6IDMsXG4gICAgICAgIG1heEFyZ3M6IDMsXG4gICAgICAgIGZuOiAoYXJncykgPT4gKGFyZ3NbMF0gPyBhcmdzWzFdIDogYXJnc1syXSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnQU5EJyxcbiAgICAgICAgbWluQXJnczogMSxcbiAgICAgICAgbWF4QXJnczogSW5maW5pdHksXG4gICAgICAgIGZuOiAoYXJncykgPT4gYXJncy5ldmVyeShCb29sZWFuKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdPUicsXG4gICAgICAgIG1pbkFyZ3M6IDEsXG4gICAgICAgIG1heEFyZ3M6IEluZmluaXR5LFxuICAgICAgICBmbjogKGFyZ3MpID0+IGFyZ3Muc29tZShCb29sZWFuKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdOT1QnLFxuICAgICAgICBtaW5BcmdzOiAxLFxuICAgICAgICBtYXhBcmdzOiAxLFxuICAgICAgICBmbjogKGFyZ3MpID0+ICFhcmdzWzBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0NPTkNBVCcsXG4gICAgICAgIG1pbkFyZ3M6IDEsXG4gICAgICAgIG1heEFyZ3M6IEluZmluaXR5LFxuICAgICAgICBmbjogKGFyZ3MpID0+IGFyZ3Muam9pbignJyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnUk9VTkQnLFxuICAgICAgICBtaW5BcmdzOiAxLFxuICAgICAgICBtYXhBcmdzOiAyLFxuICAgICAgICBmbjogKGFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWNpbWFscyA9IGFyZ3NbMV0gIT0gbnVsbCA/IE51bWJlcihhcmdzWzFdKSA6IDA7XG4gICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoTnVtYmVyKGFyZ3NbMF0pICogTWF0aC5wb3coMTAsIGRlY2ltYWxzKSkgLyBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgbmFtZTogJ0FCUycsIG1pbkFyZ3M6IDEsIG1heEFyZ3M6IDEsIGZuOiAoYXJncykgPT4gTWF0aC5hYnMoTnVtYmVyKGFyZ3NbMF0pKSB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnUE9XRVInLFxuICAgICAgICBtaW5BcmdzOiAyLFxuICAgICAgICBtYXhBcmdzOiAyLFxuICAgICAgICBmbjogKGFyZ3MpID0+IE1hdGgucG93KE51bWJlcihhcmdzWzBdKSwgTnVtYmVyKGFyZ3NbMV0pKSxcbiAgICAgIH0sXG4gICAgICB7IG5hbWU6ICdTUVJUJywgbWluQXJnczogMSwgbWF4QXJnczogMSwgZm46IChhcmdzKSA9PiBNYXRoLnNxcnQoTnVtYmVyKGFyZ3NbMF0pKSB9LFxuICAgICAgeyBuYW1lOiAnTEVOJywgbWluQXJnczogMSwgbWF4QXJnczogMSwgZm46IChhcmdzKSA9PiBTdHJpbmcoYXJnc1swXSkubGVuZ3RoIH0sXG4gICAgICB7IG5hbWU6ICdVUFBFUicsIG1pbkFyZ3M6IDEsIG1heEFyZ3M6IDEsIGZuOiAoYXJncykgPT4gU3RyaW5nKGFyZ3NbMF0pLnRvVXBwZXJDYXNlKCkgfSxcbiAgICAgIHsgbmFtZTogJ0xPV0VSJywgbWluQXJnczogMSwgbWF4QXJnczogMSwgZm46IChhcmdzKSA9PiBTdHJpbmcoYXJnc1swXSkudG9Mb3dlckNhc2UoKSB9LFxuICAgICAgeyBuYW1lOiAnVFJJTScsIG1pbkFyZ3M6IDEsIG1heEFyZ3M6IDEsIGZuOiAoYXJncykgPT4gU3RyaW5nKGFyZ3NbMF0pLnRyaW0oKSB9LFxuICAgIF07XG4gICAgZm9yIChjb25zdCBmbiBvZiBmbnMpIHtcbiAgICAgIHRoaXMuX2Z1bmN0aW9ucy5zZXQoZm4ubmFtZSwgZm4pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNlbGxSZWZTdHIocmVmOiBzdHJpbmcpOiB7IGNvbDogc3RyaW5nOyByb3c6IG51bWJlciB9IHtcbiAgY29uc3QgbWF0Y2ggPSByZWYubWF0Y2goL14oW0EtWl0rKShcXGQrKSQvaSk7XG4gIGlmICghbWF0Y2gpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjZWxsIHJlZmVyZW5jZTogJHtyZWZ9YCk7XG4gIHJldHVybiB7IGNvbDogbWF0Y2hbMV0udG9VcHBlckNhc2UoKSwgcm93OiBwYXJzZUludChtYXRjaFsyXSwgMTApIH07XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ export * from './plugin.types';
2
+ export * from './plugin-host';
3
+ export * from './sort-plugin';
4
+ export * from './filter-plugin';
5
+ export * from './selection-plugin';
6
+ export * from './formula-plugin';
7
+ export * from './clipboard-plugin';
8
+ export * from './undo-plugin';
9
+ export * from './validation-plugin';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9wbHVnaW4udHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9wbHVnaW4taG9zdCc7XG5leHBvcnQgKiBmcm9tICcuL3NvcnQtcGx1Z2luJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsdGVyLXBsdWdpbic7XG5leHBvcnQgKiBmcm9tICcuL3NlbGVjdGlvbi1wbHVnaW4nO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtdWxhLXBsdWdpbic7XG5leHBvcnQgKiBmcm9tICcuL2NsaXBib2FyZC1wbHVnaW4nO1xuZXhwb3J0ICogZnJvbSAnLi91bmRvLXBsdWdpbic7XG5leHBvcnQgKiBmcm9tICcuL3ZhbGlkYXRpb24tcGx1Z2luJztcbiJdfQ==