@ngxsmk/cdk 1.3.2 → 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.
- package/cva-base/cva-base.d.ts +34 -0
- package/cva-base/cva-base.d.ts.map +1 -0
- package/cva-base/index.d.ts +2 -0
- package/cva-base/index.d.ts.map +1 -0
- package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
- package/esm2022/cva-base/cva-base.mjs +45 -0
- package/esm2022/cva-base/index.mjs +2 -0
- package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
- package/esm2022/input-group/index.mjs +3 -0
- package/esm2022/input-group/input-group-engine.mjs +219 -0
- package/esm2022/input-group/models/index.mjs +2 -0
- package/esm2022/input-group/models/input-group.model.mjs +2 -0
- package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
- package/esm2022/listbox-keyboard/index.mjs +2 -0
- package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
- package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
- package/esm2022/public-api.mjs +10 -1
- package/esm2022/scheduler/index.mjs +5 -0
- package/esm2022/scheduler/models/date-range.mjs +2 -0
- package/esm2022/scheduler/models/event.model.mjs +2 -0
- package/esm2022/scheduler/models/index.mjs +6 -0
- package/esm2022/scheduler/models/resource.model.mjs +5 -0
- package/esm2022/scheduler/models/selection.model.mjs +7 -0
- package/esm2022/scheduler/models/view.model.mjs +7 -0
- package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
- package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
- package/esm2022/scheduler/plugin/index.mjs +8 -0
- package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
- package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
- package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
- package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
- package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
- package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
- package/esm2022/scheduler/scheduler-engine.mjs +316 -0
- package/esm2022/scheduler/utils/date-utils.mjs +131 -0
- package/esm2022/scheduler/utils/index.mjs +3 -0
- package/esm2022/scheduler/utils/snap.mjs +24 -0
- package/esm2022/spreadsheet/index.mjs +5 -0
- package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
- package/esm2022/spreadsheet/models/column.model.mjs +2 -0
- package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
- package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
- package/esm2022/spreadsheet/models/index.mjs +8 -0
- package/esm2022/spreadsheet/models/row.model.mjs +2 -0
- package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
- package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
- package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
- package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
- package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
- package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
- package/esm2022/spreadsheet/plugin/index.mjs +10 -0
- package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
- package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
- package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
- package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
- package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
- package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
- package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
- package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
- package/esm2022/spreadsheet/utils/index.mjs +2 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk.mjs +5 -0
- package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
- package/input-group/index.d.ts +3 -0
- package/input-group/index.d.ts.map +1 -0
- package/input-group/input-group-engine.d.ts +88 -0
- package/input-group/input-group-engine.d.ts.map +1 -0
- package/input-group/models/index.d.ts +2 -0
- package/input-group/models/index.d.ts.map +1 -0
- package/input-group/models/input-group.model.d.ts +114 -0
- package/input-group/models/input-group.model.d.ts.map +1 -0
- package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
- package/listbox-keyboard/index.d.ts +2 -0
- package/listbox-keyboard/index.d.ts.map +1 -0
- package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
- package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
- package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
- package/package.json +41 -11
- package/public-api.d.ts +8 -0
- package/public-api.d.ts.map +1 -1
- package/scheduler/index.d.ts +5 -0
- package/scheduler/index.d.ts.map +1 -0
- package/scheduler/models/date-range.d.ts +6 -0
- package/scheduler/models/date-range.d.ts.map +1 -0
- package/scheduler/models/event.model.d.ts +50 -0
- package/scheduler/models/event.model.d.ts.map +1 -0
- package/scheduler/models/index.d.ts +6 -0
- package/scheduler/models/index.d.ts.map +1 -0
- package/scheduler/models/resource.model.d.ts +16 -0
- package/scheduler/models/resource.model.d.ts.map +1 -0
- package/scheduler/models/selection.model.d.ts +12 -0
- package/scheduler/models/selection.model.d.ts.map +1 -0
- package/scheduler/models/view.model.d.ts +21 -0
- package/scheduler/models/view.model.d.ts.map +1 -0
- package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
- package/scheduler/plugin/drag-plugin.d.ts +28 -0
- package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
- package/scheduler/plugin/index.d.ts +8 -0
- package/scheduler/plugin/index.d.ts.map +1 -0
- package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
- package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
- package/scheduler/plugin/plugin-host.d.ts +16 -0
- package/scheduler/plugin/plugin-host.d.ts.map +1 -0
- package/scheduler/plugin/plugin.types.d.ts +9 -0
- package/scheduler/plugin/plugin.types.d.ts.map +1 -0
- package/scheduler/plugin/resize-plugin.d.ts +26 -0
- package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
- package/scheduler/plugin/selection-plugin.d.ts +40 -0
- package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
- package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
- package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
- package/scheduler/scheduler-engine.d.ts +95 -0
- package/scheduler/scheduler-engine.d.ts.map +1 -0
- package/scheduler/utils/date-utils.d.ts +26 -0
- package/scheduler/utils/date-utils.d.ts.map +1 -0
- package/scheduler/utils/index.d.ts +3 -0
- package/scheduler/utils/index.d.ts.map +1 -0
- package/scheduler/utils/snap.d.ts +7 -0
- package/scheduler/utils/snap.d.ts.map +1 -0
- package/spreadsheet/index.d.ts +5 -0
- package/spreadsheet/index.d.ts.map +1 -0
- package/spreadsheet/models/cell.model.d.ts +44 -0
- package/spreadsheet/models/cell.model.d.ts.map +1 -0
- package/spreadsheet/models/column.model.d.ts +77 -0
- package/spreadsheet/models/column.model.d.ts.map +1 -0
- package/spreadsheet/models/filter.model.d.ts +15 -0
- package/spreadsheet/models/filter.model.d.ts.map +1 -0
- package/spreadsheet/models/formula.model.d.ts +65 -0
- package/spreadsheet/models/formula.model.d.ts.map +1 -0
- package/spreadsheet/models/index.d.ts +8 -0
- package/spreadsheet/models/index.d.ts.map +1 -0
- package/spreadsheet/models/row.model.d.ts +33 -0
- package/spreadsheet/models/row.model.d.ts.map +1 -0
- package/spreadsheet/models/selection.model.d.ts +18 -0
- package/spreadsheet/models/selection.model.d.ts.map +1 -0
- package/spreadsheet/models/sort.model.d.ts +14 -0
- package/spreadsheet/models/sort.model.d.ts.map +1 -0
- package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
- package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
- package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/index.d.ts +10 -0
- package/spreadsheet/plugin/index.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin-host.d.ts +66 -0
- package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin.types.d.ts +58 -0
- package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
- package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
- package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
- package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
- package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
- package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
- package/spreadsheet/spreadsheet-engine.d.ts +194 -0
- package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
- package/spreadsheet/utils/cell-utils.d.ts +26 -0
- package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
- package/spreadsheet/utils/index.d.ts +2 -0
- package/spreadsheet/utils/index.d.ts.map +1 -0
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL2Zvcm11bGEtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdCQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQU94QjtRQU5TLFNBQUksR0FBRyxTQUFTLENBQUM7UUFDakIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVmLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztRQUd0RCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQXlCO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLGdCQUFnQixDQUFDLEVBQW1CO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxRQUFRLENBQUMsT0FBZSxFQUFFLFlBQXNDO1FBQzlELElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxvQkFBb0I7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDO2dCQUN6QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsY0FBYztRQUNaLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBWSxFQUFFLEtBQWtCLEVBQUUsRUFBRTtZQUNqRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU87WUFDOUIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPO1lBQzVCLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwQixDQUFDO1lBQ0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDO1FBRUYsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsZUFBZTtJQUVQLE1BQU0sQ0FBQyxPQUFlO1FBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNsRSxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQVksRUFBRSxHQUFvQjtRQUN6RCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQVksRUFBRSxHQUFvQjtRQUN6RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU1QixPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLEVBQVUsQ0FBQztnQkFDZixJQUFJLEVBQUUsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQzVDLEVBQUUsR0FBRyxHQUFHLENBQUM7b0JBQ1QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNaLENBQUM7cUJBQU0sSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNuRCxFQUFFLEdBQUcsSUFBSSxDQUFDO29CQUNWLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNmLENBQUM7cUJBQU0sSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNuRCxFQUFFLEdBQUcsSUFBSSxDQUFDO29CQUNWLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNmLENBQUM7cUJBQU0sSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNuRCxFQUFFLEdBQUcsSUFBSSxDQUFDO29CQUNWLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNmLENBQUM7cUJBQU0sSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ3RCLEVBQUUsR0FBRyxHQUFHLENBQUM7b0JBQ1QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNaLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzNDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQXdCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBa0IsQ0FBQztZQUMxRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVksRUFBRSxHQUFvQjtRQUNyRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU1QixPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3RELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFrQixDQUFDO1lBQ25FLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBWSxFQUFFLEdBQW9CO1FBQ3JELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFjLENBQUM7WUFDdEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBa0IsQ0FBQztZQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVksRUFBRSxHQUFvQjtRQUNyRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU1QixPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqRixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBYyxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQWtCLENBQUM7WUFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUFZLEVBQUUsR0FBb0I7UUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQWMsQ0FBQztZQUN0QyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFpQixDQUFDO1FBQzFELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBWSxFQUFFLEdBQW9CO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLGlCQUFpQjtRQUNqQixJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3RELEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTTtnQkFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBZ0IsQ0FBQztRQUN0RCxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QixJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUc7Z0JBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELFNBQVM7UUFDVCxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzNDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixPQUNFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU07Z0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQ3pFLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBZ0IsQ0FBQztRQUNyRSxDQUFDO1FBRUQsVUFBVTtRQUNWLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2IsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBaUIsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDOUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDYixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFpQixDQUFDO1FBQzFELENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUU1QiwrQkFBK0I7WUFDL0IsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDbkQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNWLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLE9BQU87b0JBQ0wsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRztvQkFDekIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHO29CQUN6QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUc7b0JBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHO2lCQUNBLENBQUM7WUFDcEIsQ0FBQztZQUVELGdCQUFnQjtZQUNoQixJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNuRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxJQUFJLEdBQWtCLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUc7d0JBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU07b0JBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBc0IsQ0FBQztZQUN2RixDQUFDO1lBRUQsaUJBQWlCO1lBQ2pCLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBaUIsQ0FBQztRQUN6RSxDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQVksRUFBRSxHQUFvQjtRQUN0RCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25FLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBWSxFQUFFLEdBQW9CO1FBQ3BELE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRztZQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBRUQsa0JBQWtCO0lBRVYsU0FBUyxDQUNmLElBQWlCLEVBQ2pCLFlBQXNDO1FBRXRDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssUUFBUTtnQkFDWCxPQUFRLElBQW1CLENBQUMsS0FBSyxDQUFDO1lBQ3BDLEtBQUssUUFBUTtnQkFDWCxPQUFRLElBQW1CLENBQUMsS0FBSyxDQUFDO1lBQ3BDLEtBQUssU0FBUztnQkFDWixPQUFRLElBQW9CLENBQUMsS0FBSyxDQUFDO1lBQ3JDLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBbUIsQ0FBQztnQkFDcEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNoRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0QsT0FBTyxHQUF1QyxDQUFDO1lBQ2pELENBQUM7WUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQW9CLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDckQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUNELEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxTQUFTLEdBQUcsSUFBbUIsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssR0FBRztvQkFBRSxPQUFPLENBQUUsR0FBYyxDQUFDO2dCQUNsRCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7WUFDRCxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQXdCLENBQUM7Z0JBQ3hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLEVBQUU7b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUNELEtBQUssV0FBVztnQkFDZCxPQUFPLENBQUMsQ0FBQztZQUNYO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEVBQVUsRUFBRSxDQUFVLEVBQUUsQ0FBVTtRQUN0RCxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRSxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ1gsS0FBSyxHQUFHO2dCQUNOLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNqQixLQUFLLEdBQUc7Z0JBQ04sT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLEtBQUssR0FBRztnQkFDTixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxHQUFHO2dCQUNOLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUUsSUFBMEIsQ0FBQztZQUMxRCxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsS0FBSyxHQUFHO2dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzlCLEtBQUssSUFBSTtnQkFDUCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUM5QixLQUFLLEdBQUc7Z0JBQ04sT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLEtBQUssR0FBRztnQkFDTixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxJQUFJO2dCQUNQLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2xCO2dCQUNFLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsT0FBZTtRQUNsQyxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUM7UUFDaEMsSUFBSSxLQUFLLENBQUM7UUFDVixPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDJCQUEyQjtJQUVuQix5QkFBeUI7UUFDL0IsTUFBTSxHQUFHLEdBQXNCO1lBQzdCO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3JFO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNYLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekUsQ0FBQzthQUNGO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTTthQUMvRDtZQUNEO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyRTtZQUNEO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyRTtZQUNEO2dCQUNFLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVDO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDbEM7WUFDRDtnQkFDRSxJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPLEVBQUUsUUFBUTtnQkFDakIsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNqQztZQUNEO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3ZCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDNUI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPLEVBQUUsQ0FBQztnQkFDVixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDWCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RixDQUFDO2FBQ0Y7WUFDRCxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoRjtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPLEVBQUUsQ0FBQztnQkFDVixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RDtZQUNELEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2xGLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQzdFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEYsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN0RixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1NBQy9FLENBQUM7UUFDRixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELFNBQVMsZUFBZSxDQUFDLEdBQVc7SUFDbEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxLQUFLO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNwcmVhZHNoZWV0UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4udHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldEVuZ2luZSB9IGZyb20gJy4uL3NwcmVhZHNoZWV0LWVuZ2luZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEZvcm11bGFOb2RlLFxuICBDZWxsUmVmTm9kZSxcbiAgUmFuZ2VSZWZOb2RlLFxuICBOdW1iZXJOb2RlLFxuICBTdHJpbmdOb2RlLFxuICBCb29sZWFuTm9kZSxcbiAgQmluYXJ5T3BOb2RlLFxuICBVbmFyeU9wTm9kZSxcbiAgRnVuY3Rpb25DYWxsTm9kZSxcbiAgRm9ybXVsYVJlc3VsdCxcbiAgRm9ybXVsYUZ1bmN0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuXG4vKipcbiAqIEZvcm11bGFQbHVnaW4gZXZhbHVhdGVzIGZvcm11bGFzIGluIGNlbGxzLlxuICogTWFpbnRhaW5zIGEgZGVwZW5kZW5jeSBncmFwaCBmb3IgcmVjYWxjdWxhdGlvbiBvcmRlcmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZvcm11bGFQbHVnaW4gaW1wbGVtZW50cyBTcHJlYWRzaGVldFBsdWdpbiB7XG4gIHJlYWRvbmx5IG5hbWUgPSAnZm9ybXVsYSc7XG4gIHJlYWRvbmx5IHByaW9yaXR5ID0gNTA7XG5cbiAgcHJpdmF0ZSBfZW5naW5lOiBTcHJlYWRzaGVldEVuZ2luZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9mdW5jdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRm9ybXVsYUZ1bmN0aW9uPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyQnVpbHRpbkZ1bmN0aW9ucygpO1xuICB9XG5cbiAgb25Jbml0KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XG4gIH1cblxuICBvbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZnVuY3Rpb25zLmNsZWFyKCk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYSBjdXN0b20gZnVuY3Rpb24uICovXG4gIHJlZ2lzdGVyRnVuY3Rpb24oZm46IEZvcm11bGFGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2Z1bmN0aW9ucy5zZXQoZm4ubmFtZS50b1VwcGVyQ2FzZSgpLCBmbik7XG4gIH1cblxuICAvKiogRXZhbHVhdGUgYSBmb3JtdWxhIHN0cmluZy4gKi9cbiAgZXZhbHVhdGUoZm9ybXVsYTogc3RyaW5nLCBnZXRDZWxsVmFsdWU6IChyZWY6IHN0cmluZykgPT4gdW5rbm93bik6IEZvcm11bGFSZXN1bHQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc3QgPSB0aGlzLl9wYXJzZShmb3JtdWxhKTtcbiAgICAgIGlmICghYXN0KSByZXR1cm4geyB2YWx1ZTogbnVsbCwgZXJyb3I6ICcjUEFSU0UhJyB9O1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9ldmFsTm9kZShhc3QsIGdldENlbGxWYWx1ZSk7XG4gICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBudWxsLCBlcnJvcjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJyNFUlJPUiEnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgZGVwZW5kZW5jeSBncmFwaDogd2hpY2ggY2VsbHMgZGVwZW5kIG9uIHdoaWNoLiAqL1xuICBidWlsZERlcGVuZGVuY3lHcmFwaCgpOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGdyYXBoID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm4gZ3JhcGg7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fZW5naW5lLnJvd0RhdGEoKTtcbiAgICBjb25zdCBjb2xzID0gdGhpcy5fZW5naW5lLmNvbHVtbkRlZnMoKTtcblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xuICAgICAgICBjb25zdCB2YWwgPSByb3dzW3JdLmNlbGxzW2NvbC5pZF0/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==
|