@shaxpir/squilt 1.0.0 → 1.1.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 (68) hide show
  1. package/README.md +289 -1
  2. package/dist/ast/AlterTableQuery.d.ts +32 -0
  3. package/dist/ast/AlterTableQuery.js +60 -0
  4. package/dist/ast/BetweenExpression.d.ts +10 -0
  5. package/dist/ast/BetweenExpression.js +18 -0
  6. package/dist/ast/CastExpression.d.ts +13 -0
  7. package/dist/ast/CastExpression.js +25 -0
  8. package/dist/ast/CollateExpression.d.ts +18 -0
  9. package/dist/ast/CollateExpression.js +30 -0
  10. package/dist/ast/CreateIndexQuery.d.ts +25 -0
  11. package/dist/ast/CreateIndexQuery.js +64 -0
  12. package/dist/ast/CreateTableQuery.d.ts +57 -0
  13. package/dist/ast/CreateTableQuery.js +79 -0
  14. package/dist/ast/CreateViewQuery.d.ts +34 -0
  15. package/dist/ast/CreateViewQuery.js +61 -0
  16. package/dist/ast/CreateVirtualTableQuery.d.ts +32 -0
  17. package/dist/ast/CreateVirtualTableQuery.js +74 -0
  18. package/dist/ast/DeleteQuery.d.ts +17 -0
  19. package/dist/ast/DeleteQuery.js +43 -0
  20. package/dist/ast/DropIndexQuery.d.ts +14 -0
  21. package/dist/ast/DropIndexQuery.js +35 -0
  22. package/dist/ast/DropTableQuery.d.ts +14 -0
  23. package/dist/ast/DropTableQuery.js +35 -0
  24. package/dist/ast/DropViewQuery.d.ts +11 -0
  25. package/dist/ast/DropViewQuery.js +24 -0
  26. package/dist/ast/FunctionExpression.d.ts +21 -0
  27. package/dist/ast/FunctionExpression.js +40 -1
  28. package/dist/ast/FunctionName.d.ts +1 -1
  29. package/dist/ast/FunctionName.js +1 -1
  30. package/dist/ast/InsertQuery.d.ts +24 -1
  31. package/dist/ast/InsertQuery.js +49 -1
  32. package/dist/ast/Operator.d.ts +2 -0
  33. package/dist/ast/Operator.js +3 -1
  34. package/dist/ast/SelectQuery.d.ts +4 -0
  35. package/dist/ast/SelectQuery.js +11 -1
  36. package/dist/ast/SubqueryExpression.d.ts +18 -0
  37. package/dist/ast/SubqueryExpression.js +27 -0
  38. package/dist/ast/UpdateQuery.d.ts +24 -0
  39. package/dist/ast/UpdateQuery.js +51 -0
  40. package/dist/ast/WindowExpression.d.ts +51 -0
  41. package/dist/ast/WindowExpression.js +61 -0
  42. package/dist/ast/WindowSpecification.d.ts +46 -0
  43. package/dist/ast/WindowSpecification.js +60 -0
  44. package/dist/builder/QueryBuilder.d.ts +20 -0
  45. package/dist/builder/QueryBuilder.js +41 -1
  46. package/dist/builder/Shorthand.d.ts +51 -0
  47. package/dist/builder/Shorthand.js +125 -1
  48. package/dist/index.d.ts +17 -1
  49. package/dist/index.js +59 -3
  50. package/dist/renderer/CompactQueryRenderer.d.ts +34 -2
  51. package/dist/renderer/CompactQueryRenderer.js +272 -2
  52. package/dist/renderer/IndentedQueryRenderer.d.ts +34 -2
  53. package/dist/renderer/IndentedQueryRenderer.js +289 -3
  54. package/dist/renderer/QueryRenderer.d.ts +11 -1
  55. package/dist/renderer/QueryRenderer.js +1 -1
  56. package/dist/validate/CommonQueryValidator.d.ts +31 -1
  57. package/dist/validate/CommonQueryValidator.js +253 -4
  58. package/dist/validate/QueryValidator.d.ts +10 -1
  59. package/dist/validate/QueryValidator.js +1 -1
  60. package/dist/validate/SQLiteQueryValidator.d.ts +16 -1
  61. package/dist/validate/SQLiteQueryValidator.js +32 -3
  62. package/dist/visitor/ParamCollector.d.ts +30 -0
  63. package/dist/visitor/ParamCollector.js +109 -2
  64. package/dist/visitor/QueryIdentityTransformer.d.ts +30 -0
  65. package/dist/visitor/QueryIdentityTransformer.js +217 -2
  66. package/dist/visitor/SqlTreeNodeVisitor.d.ts +30 -0
  67. package/dist/visitor/SqlTreeNodeVisitor.js +1 -1
  68. package/package.json +4 -1
@@ -38,11 +38,266 @@ class IndentedQueryRenderer {
38
38
  if (node['_columns'].length > 0) {
39
39
  parts.push(`${this.getIndent()}(${node['_columns'].map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
40
40
  }
41
- parts.push(`${this.getIndent()}VALUES`);
42
- parts.push(`${this.getIndent()}(${node['_values'].map(v => v.accept(this)).join(', ')})`);
41
+ if (node['_fromSelect']) {
42
+ parts.push(node['_fromSelect'].accept(this));
43
+ }
44
+ else {
45
+ parts.push(`${this.getIndent()}VALUES`);
46
+ parts.push(`${this.getIndent()}(${node['_values'].map(v => v.accept(this)).join(', ')})`);
47
+ }
48
+ // ON CONFLICT clause
49
+ if (node['_onConflictColumns'].length > 0) {
50
+ const conflictCols = node['_onConflictColumns'].map(QueryRenderer_1.quoteIdentifier).join(', ');
51
+ if (node['_doNothing']) {
52
+ parts.push(`${this.getIndent()}ON CONFLICT (${conflictCols}) DO NOTHING`);
53
+ }
54
+ else if (node['_doUpdateSets'].length > 0) {
55
+ let onConflictLine = `${this.getIndent()}ON CONFLICT (${conflictCols})`;
56
+ if (node['_onConflictWhere']) {
57
+ onConflictLine += ` WHERE ${node['_onConflictWhere'].accept(this)}`;
58
+ }
59
+ parts.push(onConflictLine);
60
+ const setClauses = node['_doUpdateSets'].map(s => `${(0, QueryRenderer_1.quoteIdentifier)(s.column)} = ${s.value.accept(this)}`).join(', ');
61
+ parts.push(`${this.getIndent()}DO UPDATE SET ${setClauses}`);
62
+ }
63
+ }
64
+ if (node['_returning'].length > 0) {
65
+ parts.push(`${this.getIndent()}RETURNING ${node['_returning'].map(r => r.accept(this)).join(', ')}`);
66
+ }
67
+ this.dedent();
68
+ return parts.join('\n');
69
+ }
70
+ visitDeleteQuery(node) {
71
+ this.indent();
72
+ const parts = [];
73
+ parts.push(`${this.getIndent()}DELETE`);
74
+ parts.push(`${this.getIndent()}FROM ${(0, QueryRenderer_1.quoteIdentifier)(node['_tableName'])}`);
75
+ if (node['_where']) {
76
+ parts.push(`${this.getIndent()}WHERE ${node['_where'].accept(this)}`);
77
+ }
78
+ if (node['_returning'].length > 0) {
79
+ parts.push(`${this.getIndent()}RETURNING ${node['_returning'].map(r => r.accept(this)).join(', ')}`);
80
+ }
81
+ this.dedent();
82
+ return parts.join('\n');
83
+ }
84
+ visitUpdateQuery(node) {
85
+ this.indent();
86
+ const parts = [];
87
+ parts.push(`${this.getIndent()}UPDATE ${(0, QueryRenderer_1.quoteIdentifier)(node['_tableName'])}`);
88
+ if (node['_set'].length > 0) {
89
+ const setClauses = node['_set'].map(s => `${(0, QueryRenderer_1.quoteIdentifier)(s.column)} = ${s.value.accept(this)}`).join(', ');
90
+ parts.push(`${this.getIndent()}SET ${setClauses}`);
91
+ }
92
+ if (node['_where']) {
93
+ parts.push(`${this.getIndent()}WHERE ${node['_where'].accept(this)}`);
94
+ }
95
+ if (node['_returning'].length > 0) {
96
+ parts.push(`${this.getIndent()}RETURNING ${node['_returning'].map(r => r.accept(this)).join(', ')}`);
97
+ }
43
98
  this.dedent();
44
99
  return parts.join('\n');
45
100
  }
101
+ visitDropTableQuery(node) {
102
+ const ifExists = node.hasIfExists ? ' IF EXISTS' : '';
103
+ return `DROP TABLE${ifExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)}`;
104
+ }
105
+ visitDropIndexQuery(node) {
106
+ const ifExists = node.hasIfExists ? ' IF EXISTS' : '';
107
+ return `DROP INDEX${ifExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.indexName)}`;
108
+ }
109
+ visitDropViewQuery(node) {
110
+ const ifExists = node.hasIfExists ? ' IF EXISTS' : '';
111
+ return `DROP VIEW${ifExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.viewName)}`;
112
+ }
113
+ visitCreateViewQuery(node) {
114
+ const parts = [];
115
+ parts.push('CREATE');
116
+ if (node.isTemporary) {
117
+ parts.push('TEMPORARY');
118
+ }
119
+ parts.push('VIEW');
120
+ if (node.hasIfNotExists) {
121
+ parts.push('IF NOT EXISTS');
122
+ }
123
+ parts.push((0, QueryRenderer_1.quoteIdentifier)(node.viewName));
124
+ if (node.columns.length > 0) {
125
+ parts.push(`(${node.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
126
+ }
127
+ parts.push('AS');
128
+ if (!node.selectQuery) {
129
+ throw new Error('CreateViewQuery must have a SELECT query');
130
+ }
131
+ parts.push(node.selectQuery.accept(this));
132
+ return parts.join(' ');
133
+ }
134
+ visitCreateIndexQuery(node) {
135
+ const unique = node.isUnique ? 'UNIQUE ' : '';
136
+ const ifNotExists = node.hasIfNotExists ? ' IF NOT EXISTS' : '';
137
+ let sql = `CREATE ${unique}INDEX${ifNotExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.indexName)} ON ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} (${node.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`;
138
+ if (node.whereExpression) {
139
+ sql += ` WHERE ${node.whereExpression.accept(this)}`;
140
+ }
141
+ return sql;
142
+ }
143
+ visitAlterTableQuery(node) {
144
+ const op = node.operation;
145
+ if (!op) {
146
+ throw new Error('AlterTableQuery must have an operation');
147
+ }
148
+ switch (op.type) {
149
+ case 'ADD_COLUMN':
150
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} ADD COLUMN ${this.renderColumnDefinition(op.column)}`;
151
+ case 'RENAME_COLUMN':
152
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} RENAME COLUMN ${(0, QueryRenderer_1.quoteIdentifier)(op.oldName)} TO ${(0, QueryRenderer_1.quoteIdentifier)(op.newName)}`;
153
+ case 'DROP_COLUMN':
154
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} DROP COLUMN ${(0, QueryRenderer_1.quoteIdentifier)(op.columnName)}`;
155
+ case 'RENAME_TABLE':
156
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} RENAME TO ${(0, QueryRenderer_1.quoteIdentifier)(op.newTableName)}`;
157
+ }
158
+ }
159
+ visitCreateTableQuery(node) {
160
+ this.indent();
161
+ const parts = [];
162
+ const ifNotExists = node.hasIfNotExists ? ' IF NOT EXISTS' : '';
163
+ parts.push(`${this.getIndent()}CREATE TABLE${ifNotExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} (`);
164
+ this.indent();
165
+ const definitions = [];
166
+ // Column definitions
167
+ for (const col of node.columns) {
168
+ definitions.push(`${this.getIndent()}${this.renderColumnDefinition(col)}`);
169
+ }
170
+ // Table constraints
171
+ for (const constraint of node.tableConstraints) {
172
+ definitions.push(`${this.getIndent()}${this.renderTableConstraint(constraint)}`);
173
+ }
174
+ parts.push(definitions.join(',\n'));
175
+ this.dedent();
176
+ // Table options
177
+ const options = [];
178
+ if (node.hasWithoutRowid) {
179
+ options.push('WITHOUT ROWID');
180
+ }
181
+ if (node.isStrict) {
182
+ options.push('STRICT');
183
+ }
184
+ if (options.length > 0) {
185
+ parts.push(`${this.getIndent()}) ${options.join(', ')}`);
186
+ }
187
+ else {
188
+ parts.push(`${this.getIndent()})`);
189
+ }
190
+ this.dedent();
191
+ return parts.join('\n');
192
+ }
193
+ visitCreateVirtualTableQuery(node) {
194
+ this.indent();
195
+ const parts = [];
196
+ const ifNotExists = node.hasIfNotExists ? ' IF NOT EXISTS' : '';
197
+ parts.push(`${this.getIndent()}CREATE VIRTUAL TABLE${ifNotExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} USING ${node.module}(`);
198
+ this.indent();
199
+ const args = [];
200
+ // Add columns (FTS5 columns don't have types)
201
+ for (const col of node.columns) {
202
+ args.push(`${this.getIndent()}${(0, QueryRenderer_1.quoteIdentifier)(col)}`);
203
+ }
204
+ // Add FTS5 options
205
+ const opts = node.options;
206
+ if (opts.tokenize) {
207
+ args.push(`${this.getIndent()}tokenize = '${opts.tokenize}'`);
208
+ }
209
+ if (opts.content) {
210
+ args.push(`${this.getIndent()}content = '${opts.content}'`);
211
+ }
212
+ if (opts.contentRowid) {
213
+ args.push(`${this.getIndent()}content_rowid = '${opts.contentRowid}'`);
214
+ }
215
+ if (opts.prefix) {
216
+ args.push(`${this.getIndent()}prefix = '${opts.prefix}'`);
217
+ }
218
+ parts.push(args.join(',\n'));
219
+ this.dedent();
220
+ parts.push(`${this.getIndent()})`);
221
+ this.dedent();
222
+ return parts.join('\n');
223
+ }
224
+ renderColumnDefinition(col) {
225
+ const parts = [(0, QueryRenderer_1.quoteIdentifier)(col.name), col.type];
226
+ if (col.constraints.primaryKey) {
227
+ parts.push('PRIMARY KEY');
228
+ if (col.constraints.autoIncrement) {
229
+ parts.push('AUTOINCREMENT');
230
+ }
231
+ }
232
+ if (col.constraints.notNull) {
233
+ parts.push('NOT NULL');
234
+ }
235
+ if (col.constraints.unique) {
236
+ parts.push('UNIQUE');
237
+ }
238
+ if (col.constraints.default !== undefined) {
239
+ if (col.constraints.default === null) {
240
+ parts.push('DEFAULT NULL');
241
+ }
242
+ else if (typeof col.constraints.default === 'string') {
243
+ // Check if it's a SQL keyword/function like CURRENT_TIMESTAMP
244
+ const sqlKeywords = ['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME', 'TRUE', 'FALSE'];
245
+ if (sqlKeywords.includes(col.constraints.default.toUpperCase())) {
246
+ parts.push(`DEFAULT ${col.constraints.default}`);
247
+ }
248
+ else {
249
+ parts.push(`DEFAULT '${col.constraints.default.replace(/'/g, "''")}'`);
250
+ }
251
+ }
252
+ else {
253
+ parts.push(`DEFAULT ${col.constraints.default}`);
254
+ }
255
+ }
256
+ if (col.constraints.check) {
257
+ parts.push(`CHECK ${col.constraints.check.accept(this)}`);
258
+ }
259
+ if (col.constraints.references) {
260
+ const ref = col.constraints.references;
261
+ let refStr = `REFERENCES ${(0, QueryRenderer_1.quoteIdentifier)(ref.table)}(${(0, QueryRenderer_1.quoteIdentifier)(ref.column)})`;
262
+ if (ref.onDelete) {
263
+ refStr += ` ON DELETE ${ref.onDelete}`;
264
+ }
265
+ if (ref.onUpdate) {
266
+ refStr += ` ON UPDATE ${ref.onUpdate}`;
267
+ }
268
+ parts.push(refStr);
269
+ }
270
+ return parts.join(' ');
271
+ }
272
+ renderTableConstraint(constraint) {
273
+ const parts = [];
274
+ if (constraint.name) {
275
+ parts.push(`CONSTRAINT ${(0, QueryRenderer_1.quoteIdentifier)(constraint.name)}`);
276
+ }
277
+ switch (constraint.type) {
278
+ case 'PRIMARY KEY':
279
+ parts.push(`PRIMARY KEY (${constraint.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
280
+ break;
281
+ case 'UNIQUE':
282
+ parts.push(`UNIQUE (${constraint.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
283
+ break;
284
+ case 'FOREIGN KEY':
285
+ const ref = constraint.references;
286
+ let fkStr = `FOREIGN KEY (${constraint.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')}) REFERENCES ${(0, QueryRenderer_1.quoteIdentifier)(ref.table)}(${(0, QueryRenderer_1.quoteIdentifier)(ref.column)})`;
287
+ if (ref.onDelete) {
288
+ fkStr += ` ON DELETE ${ref.onDelete}`;
289
+ }
290
+ if (ref.onUpdate) {
291
+ fkStr += ` ON UPDATE ${ref.onUpdate}`;
292
+ }
293
+ parts.push(fkStr);
294
+ break;
295
+ case 'CHECK':
296
+ parts.push(`CHECK ${constraint.check.accept(this)}`);
297
+ break;
298
+ }
299
+ return parts.join(' ');
300
+ }
46
301
  visitSelectQuery(node) {
47
302
  const parts = [];
48
303
  if (node['_with'].length > 0) {
@@ -92,6 +347,12 @@ class IndentedQueryRenderer {
92
347
  if (node['_union'].length > 0) {
93
348
  parts.push(node['_union'].map(u => `${this.getIndent()}UNION\n${u.accept(this)}`).join('\n'));
94
349
  }
350
+ if (node['_intersect'].length > 0) {
351
+ parts.push(node['_intersect'].map(i => `${this.getIndent()}INTERSECT\n${i.accept(this)}`).join('\n'));
352
+ }
353
+ if (node['_except'].length > 0) {
354
+ parts.push(node['_except'].map(e => `${this.getIndent()}EXCEPT\n${e.accept(this)}`).join('\n'));
355
+ }
95
356
  if (node['_orderBy'].length > 0) {
96
357
  parts.push(`${this.getIndent()}ORDER BY ${node['_orderBy'].map(o => o.accept(this)).join(', ')}`);
97
358
  }
@@ -158,6 +419,10 @@ class IndentedQueryRenderer {
158
419
  visitBinaryExpression(node) {
159
420
  return `(${node.left.accept(this)} ${node.operator} ${node.right.accept(this)})`;
160
421
  }
422
+ visitBetweenExpression(node) {
423
+ const not = node.not ? ' NOT' : '';
424
+ return `(${node.operand.accept(this)}${not} BETWEEN ${node.low.accept(this)} AND ${node.high.accept(this)})`;
425
+ }
161
426
  visitUnaryExpression(node) {
162
427
  const operand = node.operand.accept(this);
163
428
  if (node.operator === Operator_1.Operator.IS_NULL || node.operator === Operator_1.Operator.IS_NOT_NULL) {
@@ -204,6 +469,27 @@ class IndentedQueryRenderer {
204
469
  this.dedent();
205
470
  return parts.join('\n');
206
471
  }
472
+ visitCastExpression(node) {
473
+ return `CAST(${node.expression.accept(this)} AS ${node.targetType})`;
474
+ }
475
+ visitCollateExpression(node) {
476
+ return `${node.expression.accept(this)} COLLATE ${node.collation}`;
477
+ }
478
+ visitSubqueryExpression(node) {
479
+ return `(${node.subquery.accept(this)})`;
480
+ }
481
+ visitWindowExpression(node) {
482
+ const fnPart = node.function.accept(this);
483
+ const spec = node.windowSpec;
484
+ const parts = [];
485
+ if (spec.partitionByColumns.length > 0) {
486
+ parts.push(`PARTITION BY ${spec.partitionByColumns.map(c => c.accept(this)).join(', ')}`);
487
+ }
488
+ if (spec.orderByColumns.length > 0) {
489
+ parts.push(`ORDER BY ${spec.orderByColumns.map(o => o.accept(this)).join(', ')}`);
490
+ }
491
+ return `${fnPart} OVER (${parts.join(' ')})`;
492
+ }
207
493
  visitFunctionExpression(node) {
208
494
  const args = node.args.map(a => a.accept(this)).join(', ');
209
495
  const distinctPrefix = node.distinct ? 'DISTINCT ' : '';
@@ -227,4 +513,4 @@ class IndentedQueryRenderer {
227
513
  }
228
514
  }
229
515
  exports.IndentedQueryRenderer = IndentedQueryRenderer;
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZW50ZWRRdWVyeVJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbmRlcmVyL0luZGVudGVkUXVlcnlSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx3Q0FBcUM7QUFNckMsc0NBQTBFO0FBSTFFLHNDQUFtQztBQUVuQyw4Q0FBMkM7QUFFM0Msb0RBQWlEO0FBR2pELHNFQUE4SDtBQUM5SCxtREFBaUU7QUFFakUsTUFBYSxxQkFBcUI7SUFTaEMsWUFBbUIsY0FBc0I7UUFOL0IsNEJBQXVCLEdBQUcsSUFBSSxtREFBOEIsRUFBVSxDQUFDO1FBQ3ZFLHVCQUFrQixHQUFHLElBQUksOENBQXlCLEVBQVUsQ0FBQztRQUcvRCxxQkFBZ0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUdwQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxjQUFjLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQStCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sU0FBUztRQUNmLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLE1BQU07UUFDWixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBaUI7UUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEYsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsK0JBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBaUI7UUFDaEMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2SCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUMzQixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELElBQUksVUFBVSxZQUFZLFdBQUksRUFBRSxDQUFDO29CQUMvQixpQkFBaUIsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pFLENBQUM7cUJBQU0sSUFDTCxVQUFVLFlBQVksYUFBSztvQkFDM0IsVUFBVSxZQUFZLFdBQUk7b0JBQzFCLFVBQVUsWUFBWSxnQkFBUztvQkFDL0IsVUFBVSxZQUFZLG1CQUFZO29CQUNsQyxVQUFVLFlBQVksbUJBQVksRUFDbEMsQ0FBQztvQkFDRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7d0JBQ3RCLGlCQUFpQixJQUFJLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDMUUsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLGlCQUFpQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDNUUsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFL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QUVELGtCQUFrQixDQUFDLElBQW1CO1FBQ3BDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBbUI7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFrQjtRQUNqQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQscUJBQXFCLENBQUMsSUFBc0I7UUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsT0FBTyxhQUFhLFdBQVcsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7QUFwUEQsc0RBb1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxpYXNhYmxlRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBBbGlhcyB9IGZyb20gXCIuLi9hc3QvQWxpYXNcIjtcbmltcG9ydCB7IEJpbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0JpbmFyeUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc2VFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9DYXNlRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBFeGlzdHNFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9FeGlzdHNFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBGcm9tLCBKc29uRWFjaEZyb20sIFN1YnF1ZXJ5RnJvbSwgVGFibGVGcm9tIH0gZnJvbSBcIi4uL2FzdC9Gcm9tXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Z1bmN0aW9uRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSW5FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9JbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEluc2VydFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9JbnNlcnRRdWVyeVwiO1xuaW1wb3J0IHsgSm9pbiB9IGZyb20gXCIuLi9hc3QvSm9pblwiO1xuaW1wb3J0IHsgTnVsbExpdGVyYWwsIE51bWJlckxpdGVyYWwsIFBhcmFtLCBTdHJpbmdMaXRlcmFsIH0gZnJvbSBcIi4uL2FzdC9MaXRlcmFsc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3IgfSBmcm9tIFwiLi4vYXN0L09wZXJhdG9yXCI7XG5pbXBvcnQgeyBPcmRlckJ5IH0gZnJvbSBcIi4uL2FzdC9PcmRlckJ5XCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeSB9IGZyb20gXCIuLi9hc3QvU2VsZWN0UXVlcnlcIjtcbmltcG9ydCB7IFVuYXJ5RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvVW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBXaXRoIH0gZnJvbSBcIi4uL2FzdC9XaXRoXCI7XG5pbXBvcnQgeyBDb2x1bW5MaWtlVmlzaXRvckFjY2VwdG9yLCBGcm9tTGlrZUFuZEpvaW5WaXNpdG9yQWNjZXB0b3IsIFNxbFRyZWVOb2RlVmlzaXRvciB9IGZyb20gXCIuLi92aXNpdG9yL1NxbFRyZWVOb2RlVmlzaXRvclwiO1xuaW1wb3J0IHsgUXVlcnlSZW5kZXJlciwgcXVvdGVJZGVudGlmaWVyIH0gZnJvbSBcIi4vUXVlcnlSZW5kZXJlclwiO1xuXG5leHBvcnQgY2xhc3MgSW5kZW50ZWRRdWVyeVJlbmRlcmVyXG4gIGltcGxlbWVudHMgUXVlcnlSZW5kZXJlciwgU3FsVHJlZU5vZGVWaXNpdG9yPHN0cmluZz5cbntcbiAgcHJvdGVjdGVkIGZyb21MaWtlQW5kSm9pbkFjY2VwdG9yID0gbmV3IEZyb21MaWtlQW5kSm9pblZpc2l0b3JBY2NlcHRvcjxzdHJpbmc+KCk7XG4gIHByb3RlY3RlZCBjb2x1bW5MaWtlQWNjZXB0b3IgPSBuZXcgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvcjxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzcGFjZXNQZXJMZXZlbDogbnVtYmVyO1xuICBwcml2YXRlIGluZGVudGF0aW9uTGV2ZWw6IG51bWJlciA9IC0xO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzcGFjZXNQZXJMZXZlbDogbnVtYmVyKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNwYWNlc1BlckxldmVsKSB8fCBzcGFjZXNQZXJMZXZlbCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NwYWNlc1BlckxldmVsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIHRoaXMuc3BhY2VzUGVyTGV2ZWwgPSBzcGFjZXNQZXJMZXZlbDtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIobm9kZTogU2VsZWN0UXVlcnkgfCBJbnNlcnRRdWVyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vZGUuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbmRlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyAnLnJlcGVhdCh0aGlzLmluZGVudGF0aW9uTGV2ZWwgKiB0aGlzLnNwYWNlc1BlckxldmVsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5kZW50KCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZW50YXRpb25MZXZlbCsrO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5pbmRlbnRhdGlvbkxldmVsLS07XG4gIH1cblxuICB2aXNpdEluc2VydFF1ZXJ5KG5vZGU6IEluc2VydFF1ZXJ5KTogc3RyaW5nIHtcbiAgICB0aGlzLmluZGVudCgpO1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1JTlNFUlQke25vZGUuaXNPclJlcGxhY2UoKSA/ICcgT1IgUkVQTEFDRScgOiAnJ31gKTtcbiAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9SU5UTyAke3F1b3RlSWRlbnRpZmllcihub2RlWydfdGFibGVOYW1lJ10pfWApO1xuICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX0oJHtub2RlWydfY29sdW1ucyddLm1hcChxdW90ZUlkZW50aWZpZXIpLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9VkFMVUVTYCk7XG4gICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfSgke25vZGVbJ192YWx1ZXMnXS5tYXAodiA9PiB2LmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX0pYCk7XG4gICAgdGhpcy5kZWRlbnQoKTtcbiAgICByZXR1cm4gcGFydHMuam9pbignXFxuJyk7XG4gIH1cblxuICB2aXNpdFNlbGVjdFF1ZXJ5KG5vZGU6IFNlbGVjdFF1ZXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobm9kZVsnX3dpdGgnXS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmluZGVudCgpO1xuICAgICAgcGFydHMucHVzaCgnV0lUSCcpO1xuICAgICAgcGFydHMucHVzaChub2RlWydfd2l0aCddLm1hcCh3ID0+IHcuYWNjZXB0KHRoaXMpKS5qb2luKCcsXFxuJykpO1xuICAgICAgdGhpcy5kZWRlbnQoKTtcbiAgICB9XG4gICAgdGhpcy5pbmRlbnQoKTtcbiAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9U0VMRUNUJHtub2RlLmlzRGlzdGluY3QoKSA/ICcgRElTVElOQ1QnIDogJyd9YCk7XG4gICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChub2RlWydfY29sdW1ucyddLm1hcChjID0+IGAke3RoaXMuZ2V0SW5kZW50KCl9ICAke3RoaXMuY29sdW1uTGlrZUFjY2VwdG9yLmFjY2VwdCh0aGlzLCBjKX1gKS5qb2luKCcsXFxuJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9ICAqYCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZnJvbXNBbmRKb2lucyddLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmcm9tc0FuZEpvaW5zVGV4dCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBmcm9tT3JKb2luIG9mIG5vZGVbJ19mcm9tc0FuZEpvaW5zJ10pIHtcbiAgICAgICAgaWYgKGZyb21PckpvaW4gaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICAgICAgZnJvbXNBbmRKb2luc1RleHQgKz0gYFxcbiR7dGhpcy5nZXRJbmRlbnQoKX0ke2Zyb21PckpvaW4uYWNjZXB0KHRoaXMpfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIEFsaWFzIHx8XG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIEZyb20gfHxcbiAgICAgICAgICBmcm9tT3JKb2luIGluc3RhbmNlb2YgVGFibGVGcm9tIHx8XG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSB8fFxuICAgICAgICAgIGZyb21PckpvaW4gaW5zdGFuY2VvZiBKc29uRWFjaEZyb21cbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGZyb21zQW5kSm9pbnNUZXh0KSB7XG4gICAgICAgICAgICBmcm9tc0FuZEpvaW5zVGV4dCArPSBgLFxcbiR7dGhpcy5nZXRJbmRlbnQoKX0ke2Zyb21PckpvaW4uYWNjZXB0KHRoaXMpfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21zQW5kSm9pbnNUZXh0ICs9IGAke3RoaXMuZ2V0SW5kZW50KCl9RlJPTSAke2Zyb21PckpvaW4uYWNjZXB0KHRoaXMpfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwYXJ0cy5wdXNoKGZyb21zQW5kSm9pbnNUZXh0KTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ193aGVyZSddKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9V0hFUkUgJHtub2RlWydfd2hlcmUnXS5hY2NlcHQodGhpcyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZ3JvdXBCeSddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1HUk9VUCBCWSAke25vZGVbJ19ncm91cEJ5J10ubWFwKGMgPT4gYy5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfaGF2aW5nJ10pIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1IQVZJTkcgJHtub2RlWydfaGF2aW5nJ10uYWNjZXB0KHRoaXMpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX3VuaW9uJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChub2RlWydfdW5pb24nXS5tYXAodSA9PiBgJHt0aGlzLmdldEluZGVudCgpfVVOSU9OXFxuJHt1LmFjY2VwdCh0aGlzKX1gKS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIGlmIChub2RlWydfb3JkZXJCeSddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1PUkRFUiBCWSAke25vZGVbJ19vcmRlckJ5J10ubWFwKG8gPT4gby5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfbGltaXQnXSAhPT0gbnVsbCAmJiBub2RlWydfbGltaXQnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9TElNSVQgJHtub2RlWydfbGltaXQnXX1gKTtcbiAgICAgIGlmIChub2RlWydfb2Zmc2V0J10gIT09IG51bGwgJiYgbm9kZVsnX29mZnNldCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfU9GRlNFVCAke25vZGVbJ19vZmZzZXQnXX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kZWRlbnQoKTtcbiAgICByZXR1cm4gcGFydHMuZmlsdGVyKHAgPT4gcCkuam9pbignXFxuJyk7XG4gIH1cblxuICB2aXNpdFRhYmxlRnJvbShub2RlOiBUYWJsZUZyb20pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUpfWA7XG4gIH1cblxuICB2aXNpdFN1YnF1ZXJ5RnJvbShub2RlOiBTdWJxdWVyeUZyb20pOiBzdHJpbmcge1xuICAgIHRoaXMuaW5kZW50KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYChcXG4ke25vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpfVxcbiR7dGhpcy5nZXRJbmRlbnQoKX0pYDtcbiAgICB0aGlzLmRlZGVudCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2aXNpdEpzb25FYWNoRnJvbShub2RlOiBKc29uRWFjaEZyb20pOiBzdHJpbmcge1xuICAgIGNvbnN0IGV4cHIgPSBub2RlLmpzb25FeHByZXNzaW9uLmFjY2VwdCh0aGlzKTtcbiAgICBjb25zdCBwYXRoID0gbm9kZS5qc29uUGF0aCA/IGAsICR7bm9kZS5qc29uUGF0aC5hY2NlcHQodGhpcyl9YCA6ICcnO1xuICAgIHJldHVybiBganNvbl9lYWNoKCR7ZXhwcn0ke3BhdGh9KWA7XG4gIH1cblxuICB2aXNpdENvbHVtbihub2RlOiBDb2x1bW4pOiBzdHJpbmcge1xuICAgIGlmIChub2RlLmhhc1RhYmxlTmFtZSgpKSB7XG4gICAgICByZXR1cm4gYCR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lIGFzIHN0cmluZyl9LiR7cXVvdGVJZGVudGlmaWVyKG5vZGUuY29sdW1uTmFtZSl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke3F1b3RlSWRlbnRpZmllcihub2RlLmNvbHVtbk5hbWUpfWA7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRBbGlhcyhub2RlOiBBbGlhczxGcm9tfEFsaWFzYWJsZUV4cHJlc3Npb24+KTogc3RyaW5nIHtcbiAgICBjb25zdCByZW5kZXJlZEFsaWFzTmFtZSA9IHF1b3RlSWRlbnRpZmllcihub2RlLmFsaWFzIGFzIHN0cmluZyk7XG4gICAgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgICByZXR1cm4gYCR7bm9kZS5yZWZlcmVudC5hY2NlcHQodGhpcyl9ICR7cmVuZGVyZWRBbGlhc05hbWV9YDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbm9kZS5yZWZlcmVudCBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSB8fFxuICAgICAgbm9kZS5yZWZlcmVudCBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5XG4gICAgKSB7XG4gICAgICB0aGlzLmluZGVudCgpO1xuICAgICAgY29uc3QgcmVuZGVyZWRTdWJxdWVyeSA9IGAke25vZGUucmVmZXJlbnQuYWNjZXB0KHRoaXMpfVxcbmA7XG4gICAgICBjb25zdCByZXN1bHQgPSBgKFxcbiR7cmVuZGVyZWRTdWJxdWVyeX0ke3RoaXMuZ2V0SW5kZW50KCl9KSBBUyAke3JlbmRlcmVkQWxpYXNOYW1lfWA7XG4gICAgICB0aGlzLmRlZGVudCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke25vZGUucmVmZXJlbnQuYWNjZXB0KHRoaXMpfSBBUyAke3JlbmRlcmVkQWxpYXNOYW1lfWA7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRKb2luQ2xhdXNlKG5vZGU6IEpvaW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtub2RlLnR5cGV9IEpPSU4gJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUpfSAke3F1b3RlSWRlbnRpZmllcihub2RlLmFsaWFzKX0gT04gJHtub2RlLm9uLmFjY2VwdCh0aGlzKX1gO1xuICB9XG5cbiAgdmlzaXRPcmRlckJ5KG5vZGU6IE9yZGVyQnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtub2RlLmNvbHVtbi5hY2NlcHQodGhpcyl9ICR7bm9kZS5kaXJlY3Rpb259YDtcbiAgfVxuXG4gIHZpc2l0V2l0aENsYXVzZShub2RlOiBXaXRoKTogc3RyaW5nIHtcbiAgICB0aGlzLmluZGVudCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGAke3RoaXMuZ2V0SW5kZW50KCl9JHtxdW90ZUlkZW50aWZpZXIobm9kZS5uYW1lKX0gQVMgKFxcbiR7bm9kZS5xdWVyeS5hY2NlcHQodGhpcyl9XFxuJHt0aGlzLmdldEluZGVudCgpfSlgO1xuICAgIHRoaXMuZGVkZW50KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihub2RlOiBCaW5hcnlFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCgke25vZGUubGVmdC5hY2NlcHQodGhpcyl9ICR7bm9kZS5vcGVyYXRvcn0gJHtub2RlLnJpZ2h0LmFjY2VwdCh0aGlzKX0pYDtcbiAgfVxuXG4gIHZpc2l0VW5hcnlFeHByZXNzaW9uKG5vZGU6IFVuYXJ5RXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgb3BlcmFuZCA9IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7XG4gICAgaWYgKG5vZGUub3BlcmF0b3IgPT09IE9wZXJhdG9yLklTX05VTEwgfHwgbm9kZS5vcGVyYXRvciA9PT0gT3BlcmF0b3IuSVNfTk9UX05VTEwpIHtcbiAgICAgIHJldHVybiBgKCR7b3BlcmFuZH0gJHtub2RlLm9wZXJhdG9yfSlgO1xuICAgIH0gZWxzZSBpZiAobm9kZS5vcGVyYXRvciA9PT0gJ05PVCcpIHtcbiAgICAgIHJldHVybiBgKE5PVCAke29wZXJhbmR9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgKCR7bm9kZS5vcGVyYXRvcn0ke29wZXJhbmR9KWA7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRJbkV4cHJlc3Npb24obm9kZTogSW5FeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBsZWZ0U3RyID0gbm9kZS5sZWZ0Lmxlbmd0aCA+IDFcbiAgICAgID8gYCgke25vZGUubGVmdC5tYXAobCA9PiBsLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX0pYFxuICAgICAgOiBub2RlLmxlZnRbMF0uYWNjZXB0KHRoaXMpO1xuICAgIGNvbnN0IG5vdCA9IG5vZGUubm90ID8gJyBOT1QnIDogJyc7XG4gICAgbGV0IHJpZ2h0OiBzdHJpbmc7XG4gICAgaWYgKG5vZGUudmFsdWVzIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJpZ2h0ID0gYChcXG4ke25vZGUudmFsdWVzLmFjY2VwdCh0aGlzKX1cXG4ke3RoaXMuZ2V0SW5kZW50KCl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJpZ2h0ID0gYCgke25vZGUudmFsdWVzLm1hcChzZXQgPT5cbiAgICAgICAgc2V0Lmxlbmd0aCA+IDEgPyBgKCR7c2V0Lm1hcCh2ID0+IHYuYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfSlgIDogc2V0WzBdLmFjY2VwdCh0aGlzKVxuICAgICAgKS5qb2luKCcsICcpfSlgO1xuICAgIH1cbiAgICByZXR1cm4gYCgke2xlZnRTdHJ9JHtub3R9IElOICR7cmlnaHR9KWA7XG4gIH1cblxuICB2aXNpdENvbmNhdChub2RlOiBDb25jYXQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgKCR7bm9kZS5leHByZXNzaW9ucy5tYXAoZSA9PiBlLmFjY2VwdCh0aGlzKSkuam9pbignIHx8ICcpfSlgO1xuICB9XG5cbiAgdmlzaXRDYXNlRXhwcmVzc2lvbihub2RlOiBDYXNlRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW2Ake3RoaXMuZ2V0SW5kZW50KCl9Q0FTRWBdO1xuICAgIHRoaXMuaW5kZW50KCk7XG4gICAgZm9yIChjb25zdCBjIG9mIG5vZGUuY2FzZXMpIHtcbiAgICAgIHRoaXMuaW5kZW50KCk7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9V0hFTiAke2Mud2hlbi5hY2NlcHQodGhpcyl9IFRIRU4gJHtjLnRoZW4uYWNjZXB0KHRoaXMpfWApO1xuICAgICAgdGhpcy5kZWRlbnQoKTtcbiAgICB9XG4gICAgaWYgKG5vZGUuZWxzZSkge1xuICAgICAgdGhpcy5pbmRlbnQoKTtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1FTFNFICR7bm9kZS5lbHNlLmFjY2VwdCh0aGlzKX1gKTtcbiAgICAgIHRoaXMuZGVkZW50KCk7XG4gICAgfVxuICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1FTkRgKTtcbiAgICB0aGlzLmRlZGVudCgpO1xuICAgIHJldHVybiBwYXJ0cy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKG5vZGU6IEZ1bmN0aW9uRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJncyA9IG5vZGUuYXJncy5tYXAoYSA9PiBhLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKTtcbiAgICBjb25zdCBkaXN0aW5jdFByZWZpeCA9IG5vZGUuZGlzdGluY3QgPyAnRElTVElOQ1QgJyA6ICcnO1xuICAgIHJldHVybiBgJHtub2RlLm5hbWV9KCR7ZGlzdGluY3RQcmVmaXh9JHthcmdzfSlgO1xuICB9XG5cbiAgdmlzaXRQYXJhbUV4cHJlc3Npb24oX25vZGU6IFBhcmFtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJz8nO1xuICB9XG5cbiAgdmlzaXRTdHJpbmdMaXRlcmFsKG5vZGU6IFN0cmluZ0xpdGVyYWwpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gIH1cblxuICB2aXNpdE51bWJlckxpdGVyYWwobm9kZTogTnVtYmVyTGl0ZXJhbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHZpc2l0TnVsbExpdGVyYWwoX25vZGU6IE51bGxMaXRlcmFsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ05VTEwnO1xuICB9XG5cbiAgdmlzaXRFeGlzdHNFeHByZXNzaW9uKG5vZGU6IEV4aXN0c0V4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnF1ZXJ5U3FsID0gbm9kZS5zdWJxdWVyeS5hY2NlcHQodGhpcyk7XG4gICAgcmV0dXJuIGBFWElTVFMgKFxcbiR7c3VicXVlcnlTcWx9XFxuJHt0aGlzLmdldEluZGVudCgpfSlgO1xuICB9XG59XG4iXX0=
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZW50ZWRRdWVyeVJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbmRlcmVyL0luZGVudGVkUXVlcnlSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx3Q0FBcUM7QUFvQnJDLHNDQUEwRTtBQUsxRSxzQ0FBbUM7QUFFbkMsOENBQTJDO0FBRTNDLG9EQUFpRDtBQUdqRCxzRUFBOEg7QUFDOUgsbURBQWtGO0FBRWxGLE1BQWEscUJBQXFCO0lBU2hDLFlBQW1CLGNBQXNCO1FBTi9CLDRCQUF1QixHQUFHLElBQUksbURBQThCLEVBQVUsQ0FBQztRQUN2RSx1QkFBa0IsR0FBRyxJQUFJLDhDQUF5QixFQUFVLENBQUM7UUFHL0QscUJBQWdCLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFHcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksY0FBYyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFxQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sTUFBTTtRQUNaLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQWlCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztR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QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUs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QUFJLENBQUMsR0FBRyxDQUFDO0lBQy9DLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFtQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWtCO1FBQ2pDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFzQjtRQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxPQUFPLGFBQWEsV0FBVyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQTdqQkQsc0RBNmpCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsaWFzYWJsZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgQWxpYXMgfSBmcm9tIFwiLi4vYXN0L0FsaWFzXCI7XG5pbXBvcnQgeyBBbHRlclRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0FsdGVyVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQmV0d2VlbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0JldHdlZW5FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBCaW5hcnlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9CaW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBDYXNlRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQ2FzZUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc3RFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9DYXN0RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sbGF0ZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0NvbGxhdGVFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBTdWJxdWVyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1N1YnF1ZXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgV2luZG93RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvV2luZG93RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBDcmVhdGVJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVJbmRleFF1ZXJ5XCI7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZVF1ZXJ5LCBDb2x1bW5EZWZpbml0aW9uLCBUYWJsZUNvbnN0cmFpbnQgfSBmcm9tIFwiLi4vYXN0L0NyZWF0ZVRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpcnR1YWxUYWJsZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVWaXJ0dWFsVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVmlld1F1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVWaWV3UXVlcnlcIjtcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9EZWxldGVRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcEluZGV4UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BJbmRleFF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvRHJvcFRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IERyb3BWaWV3UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BWaWV3UXVlcnlcIjtcbmltcG9ydCB7IEV4aXN0c0V4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0V4aXN0c0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IEZyb20sIEpzb25FYWNoRnJvbSwgU3VicXVlcnlGcm9tLCBUYWJsZUZyb20gfSBmcm9tIFwiLi4vYXN0L0Zyb21cIjtcbmltcG9ydCB7IEZ1bmN0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvRnVuY3Rpb25FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBJbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0luRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0luc2VydFF1ZXJ5XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvVXBkYXRlUXVlcnlcIjtcbmltcG9ydCB7IEpvaW4gfSBmcm9tIFwiLi4vYXN0L0pvaW5cIjtcbmltcG9ydCB7IE51bGxMaXRlcmFsLCBOdW1iZXJMaXRlcmFsLCBQYXJhbSwgU3RyaW5nTGl0ZXJhbCB9IGZyb20gXCIuLi9hc3QvTGl0ZXJhbHNcIjtcbmltcG9ydCB7IE9wZXJhdG9yIH0gZnJvbSBcIi4uL2FzdC9PcGVyYXRvclwiO1xuaW1wb3J0IHsgT3JkZXJCeSB9IGZyb20gXCIuLi9hc3QvT3JkZXJCeVwiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L1NlbGVjdFF1ZXJ5XCI7XG5pbXBvcnQgeyBVbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1VuYXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgV2l0aCB9IGZyb20gXCIuLi9hc3QvV2l0aFwiO1xuaW1wb3J0IHsgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvciwgRnJvbUxpa2VBbmRKb2luVmlzaXRvckFjY2VwdG9yLCBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVuZGVyZXIsIFJlbmRlcmFibGVRdWVyeSwgcXVvdGVJZGVudGlmaWVyIH0gZnJvbSBcIi4vUXVlcnlSZW5kZXJlclwiO1xuXG5leHBvcnQgY2xhc3MgSW5kZW50ZWRRdWVyeVJlbmRlcmVyXG4gIGltcGxlbWVudHMgUXVlcnlSZW5kZXJlciwgU3FsVHJlZU5vZGVWaXNpdG9yPHN0cmluZz5cbntcbiAgcHJvdGVjdGVkIGZyb21MaWtlQW5kSm9pbkFjY2VwdG9yID0gbmV3IEZyb21MaWtlQW5kSm9pblZpc2l0b3JBY2NlcHRvcjxzdHJpbmc+KCk7XG4gIHByb3RlY3RlZCBjb2x1bW5MaWtlQWNjZXB0b3IgPSBuZXcgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvcjxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzcGFjZXNQZXJMZXZlbDogbnVtYmVyO1xuICBwcml2YXRlIGluZGVudGF0aW9uTGV2ZWw6IG51bWJlciA9IC0xO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzcGFjZXNQZXJMZXZlbDogbnVtYmVyKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNwYWNlc1BlckxldmVsKSB8fCBzcGFjZXNQZXJMZXZlbCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NwYWNlc1BlckxldmVsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIHRoaXMuc3BhY2VzUGVyTGV2ZWwgPSBzcGFjZXNQZXJMZXZlbDtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIobm9kZTogUmVuZGVyYWJsZVF1ZXJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbm9kZS5hY2NlcHQodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIGdldEluZGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnICcucmVwZWF0KHRoaXMuaW5kZW50YXRpb25MZXZlbCAqIHRoaXMuc3BhY2VzUGVyTGV2ZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5pbmRlbnRhdGlvbkxldmVsKys7XG4gIH1cblxuICBwcml2YXRlIGRlZGVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmluZGVudGF0aW9uTGV2ZWwtLTtcbiAgfVxuXG4gIHZpc2l0SW5zZXJ0UXVlcnkobm9kZTogSW5zZXJ0UXVlcnkpOiBzdHJpbmcge1xuICAgIHRoaXMuaW5kZW50KCk7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfUlOU0VSVCR7bm9kZS5pc09yUmVwbGFjZSgpID8gJyBPUiBSRVBMQUNFJyA6ICcnfWApO1xuICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1JTlRPICR7cXVvdGVJZGVudGlmaWVyKG5vZGVbJ190YWJsZU5hbWUnXSl9YCk7XG4gICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfSgke25vZGVbJ19jb2x1bW5zJ10ubWFwKHF1b3RlSWRlbnRpZmllcikuam9pbignLCAnKX0pYCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZnJvbVNlbGVjdCddKSB7XG4gICAgICBwYXJ0cy5wdXNoKG5vZGVbJ19mcm9tU2VsZWN0J10uYWNjZXB0KHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfVZBTFVFU2ApO1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfSgke25vZGVbJ192YWx1ZXMnXS5tYXAodiA9PiB2LmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX0pYCk7XG4gICAgfVxuICAgIC8vIE9OIENPTkZMSUNUIGNsYXVzZVxuICAgIGlmIChub2RlWydfb25Db25mbGljdENvbHVtbnMnXS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb25mbGljdENvbHMgPSBub2RlWydfb25Db25mbGljdENvbHVtbnMnXS5tYXAocXVvdGVJZGVudGlmaWVyKS5qb2luKCcsICcpO1xuICAgICAgaWYgKG5vZGVbJ19kb05vdGhpbmcnXSkge1xuICAgICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9T04gQ09ORkxJQ1QgKCR7Y29uZmxpY3RDb2xzfSkgRE8gTk9USElOR2ApO1xuICAgICAgfSBlbHNlIGlmIChub2RlWydfZG9VcGRhdGVTZXRzJ10ubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgb25Db25mbGljdExpbmUgPSBgJHt0aGlzLmdldEluZGVudCgpfU9OIENPTkZMSUNUICgke2NvbmZsaWN0Q29sc30pYDtcbiAgICAgICAgaWYgKG5vZGVbJ19vbkNvbmZsaWN0V2hlcmUnXSkge1xuICAgICAgICAgIG9uQ29uZmxpY3RMaW5lICs9IGAgV0hFUkUgJHtub2RlWydfb25Db25mbGljdFdoZXJlJ10uYWNjZXB0KHRoaXMpfWA7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHMucHVzaChvbkNvbmZsaWN0TGluZSk7XG4gICAgICAgIGNvbnN0IHNldENsYXVzZXMgPSBub2RlWydfZG9VcGRhdGVTZXRzJ10ubWFwKHMgPT5cbiAgICAgICAgICBgJHtxdW90ZUlkZW50aWZpZXIocy5jb2x1bW4pfSA9ICR7cy52YWx1ZS5hY2NlcHQodGhpcyl9YFxuICAgICAgICApLmpvaW4oJywgJyk7XG4gICAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1ETyBVUERBVEUgU0VUICR7c2V0Q2xhdXNlc31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGVbJ19yZXR1cm5pbmcnXS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9UkVUVVJOSU5HICR7bm9kZVsnX3JldHVybmluZyddLm1hcChyID0+IHIuYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICB0aGlzLmRlZGVudCgpO1xuICAgIHJldHVybiBwYXJ0cy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHZpc2l0RGVsZXRlUXVlcnkobm9kZTogRGVsZXRlUXVlcnkpOiBzdHJpbmcge1xuICAgIHRoaXMuaW5kZW50KCk7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfURFTEVURWApO1xuICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1GUk9NICR7cXVvdGVJZGVudGlmaWVyKG5vZGVbJ190YWJsZU5hbWUnXSl9YCk7XG4gICAgaWYgKG5vZGVbJ193aGVyZSddKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9V0hFUkUgJHtub2RlWydfd2hlcmUnXS5hY2NlcHQodGhpcyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfcmV0dXJuaW5nJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfVJFVFVSTklORyAke25vZGVbJ19yZXR1cm5pbmcnXS5tYXAociA9PiByLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgdGhpcy5kZWRlbnQoKTtcbiAgICByZXR1cm4gcGFydHMuam9pbignXFxuJyk7XG4gIH1cblxuICB2aXNpdFVwZGF0ZVF1ZXJ5KG5vZGU6IFVwZGF0ZVF1ZXJ5KTogc3RyaW5nIHtcbiAgICB0aGlzLmluZGVudCgpO1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1VUERBVEUgJHtxdW90ZUlkZW50aWZpZXIobm9kZVsnX3RhYmxlTmFtZSddKX1gKTtcbiAgICBpZiAobm9kZVsnX3NldCddLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNldENsYXVzZXMgPSBub2RlWydfc2V0J10ubWFwKHMgPT5cbiAgICAgICAgYCR7cXVvdGVJZGVudGlmaWVyKHMuY29sdW1uKX0gPSAke3MudmFsdWUuYWNjZXB0KHRoaXMpfWBcbiAgICAgICkuam9pbignLCAnKTtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1TRVQgJHtzZXRDbGF1c2VzfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX3doZXJlJ10pIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1XSEVSRSAke25vZGVbJ193aGVyZSddLmFjY2VwdCh0aGlzKX1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19yZXR1cm5pbmcnXS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9UkVUVVJOSU5HICR7bm9kZVsnX3JldHVybmluZyddLm1hcChyID0+IHIuYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICB0aGlzLmRlZGVudCgpO1xuICAgIHJldHVybiBwYXJ0cy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHZpc2l0RHJvcFRhYmxlUXVlcnkobm9kZTogRHJvcFRhYmxlUXVlcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlmRXhpc3RzID0gbm9kZS5oYXNJZkV4aXN0cyA/ICcgSUYgRVhJU1RTJyA6ICcnO1xuICAgIHJldHVybiBgRFJPUCBUQUJMRSR7aWZFeGlzdHN9ICR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX1gO1xuICB9XG5cbiAgdmlzaXREcm9wSW5kZXhRdWVyeShub2RlOiBEcm9wSW5kZXhRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgaWZFeGlzdHMgPSBub2RlLmhhc0lmRXhpc3RzID8gJyBJRiBFWElTVFMnIDogJyc7XG4gICAgcmV0dXJuIGBEUk9QIElOREVYJHtpZkV4aXN0c30gJHtxdW90ZUlkZW50aWZpZXIobm9kZS5pbmRleE5hbWUpfWA7XG4gIH1cblxuICB2aXNpdERyb3BWaWV3UXVlcnkobm9kZTogRHJvcFZpZXdRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgaWZFeGlzdHMgPSBub2RlLmhhc0lmRXhpc3RzID8gJyBJRiBFWElTVFMnIDogJyc7XG4gICAgcmV0dXJuIGBEUk9QIFZJRVcke2lmRXhpc3RzfSAke3F1b3RlSWRlbnRpZmllcihub2RlLnZpZXdOYW1lKX1gO1xuICB9XG5cbiAgdmlzaXRDcmVhdGVWaWV3UXVlcnkobm9kZTogQ3JlYXRlVmlld1F1ZXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIHBhcnRzLnB1c2goJ0NSRUFURScpO1xuICAgIGlmIChub2RlLmlzVGVtcG9yYXJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKCdURU1QT1JBUlknKTtcbiAgICB9XG4gICAgcGFydHMucHVzaCgnVklFVycpO1xuICAgIGlmIChub2RlLmhhc0lmTm90RXhpc3RzKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdJRiBOT1QgRVhJU1RTJyk7XG4gICAgfVxuICAgIHBhcnRzLnB1c2gocXVvdGVJZGVudGlmaWVyKG5vZGUudmlld05hbWUpKTtcblxuICAgIGlmIChub2RlLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgKCR7bm9kZS5jb2x1bW5zLm1hcChxdW90ZUlkZW50aWZpZXIpLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIHBhcnRzLnB1c2goJ0FTJyk7XG5cbiAgICBpZiAoIW5vZGUuc2VsZWN0UXVlcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JlYXRlVmlld1F1ZXJ5IG11c3QgaGF2ZSBhIFNFTEVDVCBxdWVyeScpO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKG5vZGUuc2VsZWN0UXVlcnkuYWNjZXB0KHRoaXMpKTtcblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2aXNpdENyZWF0ZUluZGV4UXVlcnkobm9kZTogQ3JlYXRlSW5kZXhRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlID0gbm9kZS5pc1VuaXF1ZSA/ICdVTklRVUUgJyA6ICcnO1xuICAgIGNvbnN0IGlmTm90RXhpc3RzID0gbm9kZS5oYXNJZk5vdEV4aXN0cyA/ICcgSUYgTk9UIEVYSVNUUycgOiAnJztcblxuICAgIGxldCBzcWwgPSBgQ1JFQVRFICR7dW5pcXVlfUlOREVYJHtpZk5vdEV4aXN0c30gJHtxdW90ZUlkZW50aWZpZXIobm9kZS5pbmRleE5hbWUpfSBPTiAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9ICgke25vZGUuY29sdW1ucy5tYXAocXVvdGVJZGVudGlmaWVyKS5qb2luKCcsICcpfSlgO1xuXG4gICAgaWYgKG5vZGUud2hlcmVFeHByZXNzaW9uKSB7XG4gICAgICBzcWwgKz0gYCBXSEVSRSAke25vZGUud2hlcmVFeHByZXNzaW9uLmFjY2VwdCh0aGlzKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBzcWw7XG4gIH1cblxuICB2aXNpdEFsdGVyVGFibGVRdWVyeShub2RlOiBBbHRlclRhYmxlUXVlcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wID0gbm9kZS5vcGVyYXRpb247XG4gICAgaWYgKCFvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbHRlclRhYmxlUXVlcnkgbXVzdCBoYXZlIGFuIG9wZXJhdGlvbicpO1xuICAgIH1cblxuICAgIHN3aXRjaCAob3AudHlwZSkge1xuICAgICAgY2FzZSAnQUREX0NPTFVNTic6XG4gICAgICAgIHJldHVybiBgQUxURVIgVEFCTEUgJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUpfSBBREQgQ09MVU1OICR7dGhpcy5yZW5kZXJDb2x1bW5EZWZpbml0aW9uKG9wLmNvbHVtbil9YDtcbiAgICAgIGNhc2UgJ1JFTkFNRV9DT0xVTU4nOlxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX0gUkVOQU1FIENPTFVNTiAke3F1b3RlSWRlbnRpZmllcihvcC5vbGROYW1lKX0gVE8gJHtxdW90ZUlkZW50aWZpZXIob3AubmV3TmFtZSl9YDtcbiAgICAgIGNhc2UgJ0RST1BfQ09MVU1OJzpcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUQUJMRSAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9IERST1AgQ09MVU1OICR7cXVvdGVJZGVudGlmaWVyKG9wLmNvbHVtbk5hbWUpfWA7XG4gICAgICBjYXNlICdSRU5BTUVfVEFCTEUnOlxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX0gUkVOQU1FIFRPICR7cXVvdGVJZGVudGlmaWVyKG9wLm5ld1RhYmxlTmFtZSl9YDtcbiAgICB9XG4gIH1cblxuICB2aXNpdENyZWF0ZVRhYmxlUXVlcnkobm9kZTogQ3JlYXRlVGFibGVRdWVyeSk6IHN0cmluZyB7XG4gICAgdGhpcy5pbmRlbnQoKTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBpZk5vdEV4aXN0cyA9IG5vZGUuaGFzSWZOb3RFeGlzdHMgPyAnIElGIE5PVCBFWElTVFMnIDogJyc7XG4gICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfUNSRUFURSBUQUJMRSR7aWZOb3RFeGlzdHN9ICR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX0gKGApO1xuXG4gICAgdGhpcy5pbmRlbnQoKTtcbiAgICBjb25zdCBkZWZpbml0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIENvbHVtbiBkZWZpbml0aW9uc1xuICAgIGZvciAoY29uc3QgY29sIG9mIG5vZGUuY29sdW1ucykge1xuICAgICAgZGVmaW5pdGlvbnMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfSR7dGhpcy5yZW5kZXJDb2x1bW5EZWZpbml0aW9uKGNvbCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVGFibGUgY29uc3RyYWludHNcbiAgICBmb3IgKGNvbnN0IGNvbnN0cmFpbnQgb2Ygbm9kZS50YWJsZUNvbnN0cmFpbnRzKSB7XG4gICAgICBkZWZpbml0aW9ucy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9JHt0aGlzLnJlbmRlclRhYmxlQ29uc3RyYWludChjb25zdHJhaW50KX1gKTtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKGRlZmluaXRpb25zLmpvaW4oJyxcXG4nKSk7XG4gICAgdGhpcy5kZWRlbnQoKTtcblxuICAgIC8vIFRhYmxlIG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChub2RlLmhhc1dpdGhvdXRSb3dpZCkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdXSVRIT1VUIFJPV0lEJyk7XG4gICAgfVxuICAgIGlmIChub2RlLmlzU3RyaWN0KSB7XG4gICAgICBvcHRpb25zLnB1c2goJ1NUUklDVCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX0pICR7b3B0aW9ucy5qb2luKCcsICcpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9KWApO1xuICAgIH1cblxuICAgIHRoaXMuZGVkZW50KCk7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgdmlzaXRDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeShub2RlOiBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSk6IHN0cmluZyB7XG4gICAgdGhpcy5pbmRlbnQoKTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBpZk5vdEV4aXN0cyA9IG5vZGUuaGFzSWZOb3RFeGlzdHMgPyAnIElGIE5PVCBFWElTVFMnIDogJyc7XG4gICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfUNSRUFURSBWSVJUVUFMIFRBQkxFJHtpZk5vdEV4aXN0c30gJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUpfSBVU0lORyAke25vZGUubW9kdWxlfShgKTtcblxuICAgIHRoaXMuaW5kZW50KCk7XG4gICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFkZCBjb2x1bW5zIChGVFM1IGNvbHVtbnMgZG9uJ3QgaGF2ZSB0eXBlcylcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBub2RlLmNvbHVtbnMpIHtcbiAgICAgIGFyZ3MucHVzaChgJHt0aGlzLmdldEluZGVudCgpfSR7cXVvdGVJZGVudGlmaWVyKGNvbCl9YCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIEZUUzUgb3B0aW9uc1xuICAgIGNvbnN0IG9wdHMgPSBub2RlLm9wdGlvbnM7XG4gICAgaWYgKG9wdHMudG9rZW5pemUpIHtcbiAgICAgIGFyZ3MucHVzaChgJHt0aGlzLmdldEluZGVudCgpfXRva2VuaXplID0gJyR7b3B0cy50b2tlbml6ZX0nYCk7XG4gICAgfVxuICAgIGlmIChvcHRzLmNvbnRlbnQpIHtcbiAgICAgIGFyZ3MucHVzaChgJHt0aGlzLmdldEluZGVudCgpfWNvbnRlbnQgPSAnJHtvcHRzLmNvbnRlbnR9J2ApO1xuICAgIH1cbiAgICBpZiAob3B0cy5jb250ZW50Um93aWQpIHtcbiAgICAgIGFyZ3MucHVzaChgJHt0aGlzLmdldEluZGVudCgpfWNvbnRlbnRfcm93aWQgPSAnJHtvcHRzLmNvbnRlbnRSb3dpZH0nYCk7XG4gICAgfVxuICAgIGlmIChvcHRzLnByZWZpeCkge1xuICAgICAgYXJncy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9cHJlZml4ID0gJyR7b3B0cy5wcmVmaXh9J2ApO1xuICAgIH1cblxuICAgIHBhcnRzLnB1c2goYXJncy5qb2luKCcsXFxuJykpO1xuICAgIHRoaXMuZGVkZW50KCk7XG4gICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfSlgKTtcbiAgICB0aGlzLmRlZGVudCgpO1xuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbHVtbkRlZmluaXRpb24oY29sOiBDb2x1bW5EZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbcXVvdGVJZGVudGlmaWVyKGNvbC5uYW1lKSwgY29sLnR5cGVdO1xuXG4gICAgaWYgKGNvbC5jb25zdHJhaW50cy5wcmltYXJ5S2V5KSB7XG4gICAgICBwYXJ0cy5wdXNoKCdQUklNQVJZIEtFWScpO1xuICAgICAgaWYgKGNvbC5jb25zdHJhaW50cy5hdXRvSW5jcmVtZW50KSB7XG4gICAgICAgIHBhcnRzLnB1c2goJ0FVVE9JTkNSRU1FTlQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbC5jb25zdHJhaW50cy5ub3ROdWxsKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdOT1QgTlVMTCcpO1xuICAgIH1cbiAgICBpZiAoY29sLmNvbnN0cmFpbnRzLnVuaXF1ZSkge1xuICAgICAgcGFydHMucHVzaCgnVU5JUVVFJyk7XG4gICAgfVxuICAgIGlmIChjb2wuY29uc3RyYWludHMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29sLmNvbnN0cmFpbnRzLmRlZmF1bHQgPT09IG51bGwpIHtcbiAgICAgICAgcGFydHMucHVzaCgnREVGQVVMVCBOVUxMJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2wuY29uc3RyYWludHMuZGVmYXVsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIFNRTCBrZXl3b3JkL2Z1bmN0aW9uIGxpa2UgQ1VSUkVOVF9USU1FU1RBTVBcbiAgICAgICAgY29uc3Qgc3FsS2V5d29yZHMgPSBbJ0NVUlJFTlRfVElNRVNUQU1QJywgJ0NVUlJFTlRfREFURScsICdDVVJSRU5UX1RJTUUnLCAnVFJVRScsICdGQUxTRSddO1xuICAgICAgICBpZiAoc3FsS2V5d29yZHMuaW5jbHVkZXMoY29sLmNvbnN0cmFpbnRzLmRlZmF1bHQudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGBERUZBVUxUICR7Y29sLmNvbnN0cmFpbnRzLmRlZmF1bHR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMucHVzaChgREVGQVVMVCAnJHtjb2wuY29uc3RyYWludHMuZGVmYXVsdC5yZXBsYWNlKC8nL2csIFwiJydcIil9J2ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5wdXNoKGBERUZBVUxUICR7Y29sLmNvbnN0cmFpbnRzLmRlZmF1bHR9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb2wuY29uc3RyYWludHMuY2hlY2spIHtcbiAgICAgIHBhcnRzLnB1c2goYENIRUNLICR7Y29sLmNvbnN0cmFpbnRzLmNoZWNrLmFjY2VwdCh0aGlzKX1gKTtcbiAgICB9XG4gICAgaWYgKGNvbC5jb25zdHJhaW50cy5yZWZlcmVuY2VzKSB7XG4gICAgICBjb25zdCByZWYgPSBjb2wuY29uc3RyYWludHMucmVmZXJlbmNlcztcbiAgICAgIGxldCByZWZTdHIgPSBgUkVGRVJFTkNFUyAke3F1b3RlSWRlbnRpZmllcihyZWYudGFibGUpfSgke3F1b3RlSWRlbnRpZmllcihyZWYuY29sdW1uKX0pYDtcbiAgICAgIGlmIChyZWYub25EZWxldGUpIHtcbiAgICAgICAgcmVmU3RyICs9IGAgT04gREVMRVRFICR7cmVmLm9uRGVsZXRlfWA7XG4gICAgICB9XG4gICAgICBpZiAocmVmLm9uVXBkYXRlKSB7XG4gICAgICAgIHJlZlN0ciArPSBgIE9OIFVQREFURSAke3JlZi5vblVwZGF0ZX1gO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaChyZWZTdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyVGFibGVDb25zdHJhaW50KGNvbnN0cmFpbnQ6IFRhYmxlQ29uc3RyYWludCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY29uc3RyYWludC5uYW1lKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBDT05TVFJBSU5UICR7cXVvdGVJZGVudGlmaWVyKGNvbnN0cmFpbnQubmFtZSl9YCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb25zdHJhaW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ1BSSU1BUlkgS0VZJzpcbiAgICAgICAgcGFydHMucHVzaChgUFJJTUFSWSBLRVkgKCR7Y29uc3RyYWludC5jb2x1bW5zIS5tYXAocXVvdGVJZGVudGlmaWVyKS5qb2luKCcsICcpfSlgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdVTklRVUUnOlxuICAgICAgICBwYXJ0cy5wdXNoKGBVTklRVUUgKCR7Y29uc3RyYWludC5jb2x1bW5zIS5tYXAocXVvdGVJZGVudGlmaWVyKS5qb2luKCcsICcpfSlgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdGT1JFSUdOIEtFWSc6XG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnN0cmFpbnQucmVmZXJlbmNlcyE7XG4gICAgICAgIGxldCBma1N0ciA9IGBGT1JFSUdOIEtFWSAoJHtjb25zdHJhaW50LmNvbHVtbnMhLm1hcChxdW90ZUlkZW50aWZpZXIpLmpvaW4oJywgJyl9KSBSRUZFUkVOQ0VTICR7cXVvdGVJZGVudGlmaWVyKHJlZi50YWJsZSl9KCR7cXVvdGVJZGVudGlmaWVyKHJlZi5jb2x1bW4pfSlgO1xuICAgICAgICBpZiAocmVmLm9uRGVsZXRlKSB7XG4gICAgICAgICAgZmtTdHIgKz0gYCBPTiBERUxFVEUgJHtyZWYub25EZWxldGV9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmLm9uVXBkYXRlKSB7XG4gICAgICAgICAgZmtTdHIgKz0gYCBPTiBVUERBVEUgJHtyZWYub25VcGRhdGV9YDtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGZrU3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdDSEVDSyc6XG4gICAgICAgIHBhcnRzLnB1c2goYENIRUNLICR7Y29uc3RyYWludC5jaGVjayEuYWNjZXB0KHRoaXMpfWApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xuICB9XG5cbiAgdmlzaXRTZWxlY3RRdWVyeShub2RlOiBTZWxlY3RRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGVbJ193aXRoJ10ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pbmRlbnQoKTtcbiAgICAgIHBhcnRzLnB1c2goJ1dJVEgnKTtcbiAgICAgIHBhcnRzLnB1c2gobm9kZVsnX3dpdGgnXS5tYXAodyA9PiB3LmFjY2VwdCh0aGlzKSkuam9pbignLFxcbicpKTtcbiAgICAgIHRoaXMuZGVkZW50KCk7XG4gICAgfVxuICAgIHRoaXMuaW5kZW50KCk7XG4gICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfVNFTEVDVCR7bm9kZS5pc0Rpc3RpbmN0KCkgPyAnIERJU1RJTkNUJyA6ICcnfWApO1xuICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2gobm9kZVsnX2NvbHVtbnMnXS5tYXAoYyA9PiBgJHt0aGlzLmdldEluZGVudCgpfSAgJHt0aGlzLmNvbHVtbkxpa2VBY2NlcHRvci5hY2NlcHQodGhpcywgYyl9YCkuam9pbignLFxcbicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfSAgKmApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2Zyb21zQW5kSm9pbnMnXS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZnJvbXNBbmRKb2luc1RleHQgPSAnJztcbiAgICAgIGZvciAoY29uc3QgZnJvbU9ySm9pbiBvZiBub2RlWydfZnJvbXNBbmRKb2lucyddKSB7XG4gICAgICAgIGlmIChmcm9tT3JKb2luIGluc3RhbmNlb2YgSm9pbikge1xuICAgICAgICAgIGZyb21zQW5kSm9pbnNUZXh0ICs9IGBcXG4ke3RoaXMuZ2V0SW5kZW50KCl9JHtmcm9tT3JKb2luLmFjY2VwdCh0aGlzKX1gO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGZyb21PckpvaW4gaW5zdGFuY2VvZiBBbGlhcyB8fFxuICAgICAgICAgIGZyb21PckpvaW4gaW5zdGFuY2VvZiBGcm9tIHx8XG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIFRhYmxlRnJvbSB8fFxuICAgICAgICAgIGZyb21PckpvaW4gaW5zdGFuY2VvZiBTdWJxdWVyeUZyb20gfHxcbiAgICAgICAgICBmcm9tT3JKb2luIGluc3RhbmNlb2YgSnNvbkVhY2hGcm9tXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChmcm9tc0FuZEpvaW5zVGV4dCkge1xuICAgICAgICAgICAgZnJvbXNBbmRKb2luc1RleHQgKz0gYCxcXG4ke3RoaXMuZ2V0SW5kZW50KCl9JHtmcm9tT3JKb2luLmFjY2VwdCh0aGlzKX1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tc0FuZEpvaW5zVGV4dCArPSBgJHt0aGlzLmdldEluZGVudCgpfUZST00gJHtmcm9tT3JKb2luLmFjY2VwdCh0aGlzKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMucHVzaChmcm9tc0FuZEpvaW5zVGV4dCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfd2hlcmUnXSkge1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfVdIRVJFICR7bm9kZVsnX3doZXJlJ10uYWNjZXB0KHRoaXMpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2dyb3VwQnknXS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9R1JPVVAgQlkgJHtub2RlWydfZ3JvdXBCeSddLm1hcChjID0+IGMuYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2hhdmluZyddKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9SEFWSU5HICR7bm9kZVsnX2hhdmluZyddLmFjY2VwdCh0aGlzKX1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ191bmlvbiddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2gobm9kZVsnX3VuaW9uJ10ubWFwKHUgPT4gYCR7dGhpcy5nZXRJbmRlbnQoKX1VTklPTlxcbiR7dS5hY2NlcHQodGhpcyl9YCkuam9pbignXFxuJykpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2ludGVyc2VjdCddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2gobm9kZVsnX2ludGVyc2VjdCddLm1hcChpID0+IGAke3RoaXMuZ2V0SW5kZW50KCl9SU5URVJTRUNUXFxuJHtpLmFjY2VwdCh0aGlzKX1gKS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZXhjZXB0J10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChub2RlWydfZXhjZXB0J10ubWFwKGUgPT4gYCR7dGhpcy5nZXRJbmRlbnQoKX1FWENFUFRcXG4ke2UuYWNjZXB0KHRoaXMpfWApLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19vcmRlckJ5J10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfU9SREVSIEJZICR7bm9kZVsnX29yZGVyQnknXS5tYXAobyA9PiBvLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19saW1pdCddICE9PSBudWxsICYmIG5vZGVbJ19saW1pdCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7dGhpcy5nZXRJbmRlbnQoKX1MSU1JVCAke25vZGVbJ19saW1pdCddfWApO1xuICAgICAgaWYgKG5vZGVbJ19vZmZzZXQnXSAhPT0gbnVsbCAmJiBub2RlWydfb2Zmc2V0J10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9T0ZGU0VUICR7bm9kZVsnX29mZnNldCddfWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRlZGVudCgpO1xuICAgIHJldHVybiBwYXJ0cy5maWx0ZXIocCA9PiBwKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHZpc2l0VGFibGVGcm9tKG5vZGU6IFRhYmxlRnJvbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9YDtcbiAgfVxuXG4gIHZpc2l0U3VicXVlcnlGcm9tKG5vZGU6IFN1YnF1ZXJ5RnJvbSk6IHN0cmluZyB7XG4gICAgdGhpcy5pbmRlbnQoKTtcbiAgICBjb25zdCByZXN1bHQgPSBgKFxcbiR7bm9kZS5zdWJxdWVyeS5hY2NlcHQodGhpcyl9XFxuJHt0aGlzLmdldEluZGVudCgpfSlgO1xuICAgIHRoaXMuZGVkZW50KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZpc2l0SnNvbkVhY2hGcm9tKG5vZGU6IEpzb25FYWNoRnJvbSk6IHN0cmluZyB7XG4gICAgY29uc3QgZXhwciA9IG5vZGUuanNvbkV4cHJlc3Npb24uYWNjZXB0KHRoaXMpO1xuICAgIGNvbnN0IHBhdGggPSBub2RlLmpzb25QYXRoID8gYCwgJHtub2RlLmpzb25QYXRoLmFjY2VwdCh0aGlzKX1gIDogJyc7XG4gICAgcmV0dXJuIGBqc29uX2VhY2goJHtleHByfSR7cGF0aH0pYDtcbiAgfVxuXG4gIHZpc2l0Q29sdW1uKG5vZGU6IENvbHVtbik6IHN0cmluZyB7XG4gICAgaWYgKG5vZGUuaGFzVGFibGVOYW1lKCkpIHtcbiAgICAgIHJldHVybiBgJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUgYXMgc3RyaW5nKX0uJHtxdW90ZUlkZW50aWZpZXIobm9kZS5jb2x1bW5OYW1lKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7cXVvdGVJZGVudGlmaWVyKG5vZGUuY29sdW1uTmFtZSl9YDtcbiAgICB9XG4gIH1cblxuICB2aXNpdEFsaWFzKG5vZGU6IEFsaWFzPEZyb218QWxpYXNhYmxlRXhwcmVzc2lvbj4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlbmRlcmVkQWxpYXNOYW1lID0gcXVvdGVJZGVudGlmaWVyKG5vZGUuYWxpYXMgYXMgc3RyaW5nKTtcbiAgICBpZiAobm9kZS5yZWZlcmVudCBpbnN0YW5jZW9mIEZyb20pIHtcbiAgICAgIHJldHVybiBgJHtub2RlLnJlZmVyZW50LmFjY2VwdCh0aGlzKX0gJHtyZW5kZXJlZEFsaWFzTmFtZX1gO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgU3VicXVlcnlGcm9tIHx8XG4gICAgICBub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgU2VsZWN0UXVlcnlcbiAgICApIHtcbiAgICAgIHRoaXMuaW5kZW50KCk7XG4gICAgICBjb25zdCByZW5kZXJlZFN1YnF1ZXJ5ID0gYCR7bm9kZS5yZWZlcmVudC5hY2NlcHQodGhpcyl9XFxuYDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGAoXFxuJHtyZW5kZXJlZFN1YnF1ZXJ5fSR7dGhpcy5nZXRJbmRlbnQoKX0pIEFTICR7cmVuZGVyZWRBbGlhc05hbWV9YDtcbiAgICAgIHRoaXMuZGVkZW50KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7bm9kZS5yZWZlcmVudC5hY2NlcHQodGhpcyl9IEFTICR7cmVuZGVyZWRBbGlhc05hbWV9YDtcbiAgICB9XG4gIH1cblxuICB2aXNpdEpvaW5DbGF1c2Uobm9kZTogSm9pbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke25vZGUudHlwZX0gSk9JTiAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9ICR7cXVvdGVJZGVudGlmaWVyKG5vZGUuYWxpYXMpfSBPTiAke25vZGUub24uYWNjZXB0KHRoaXMpfWA7XG4gIH1cblxuICB2aXNpdE9yZGVyQnkobm9kZTogT3JkZXJCeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke25vZGUuY29sdW1uLmFjY2VwdCh0aGlzKX0gJHtub2RlLmRpcmVjdGlvbn1gO1xuICB9XG5cbiAgdmlzaXRXaXRoQ2xhdXNlKG5vZGU6IFdpdGgpOiBzdHJpbmcge1xuICAgIHRoaXMuaW5kZW50KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYCR7dGhpcy5nZXRJbmRlbnQoKX0ke3F1b3RlSWRlbnRpZmllcihub2RlLm5hbWUpfSBBUyAoXFxuJHtub2RlLnF1ZXJ5LmFjY2VwdCh0aGlzKX1cXG4ke3RoaXMuZ2V0SW5kZW50KCl9KWA7XG4gICAgdGhpcy5kZWRlbnQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmlzaXRCaW5hcnlFeHByZXNzaW9uKG5vZGU6IEJpbmFyeUV4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBgKCR7bm9kZS5sZWZ0LmFjY2VwdCh0aGlzKX0gJHtub2RlLm9wZXJhdG9yfSAke25vZGUucmlnaHQuYWNjZXB0KHRoaXMpfSlgO1xuICB9XG5cbiAgdmlzaXRCZXR3ZWVuRXhwcmVzc2lvbihub2RlOiBCZXR3ZWVuRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgbm90ID0gbm9kZS5ub3QgPyAnIE5PVCcgOiAnJztcbiAgICByZXR1cm4gYCgke25vZGUub3BlcmFuZC5hY2NlcHQodGhpcyl9JHtub3R9IEJFVFdFRU4gJHtub2RlLmxvdy5hY2NlcHQodGhpcyl9IEFORCAke25vZGUuaGlnaC5hY2NlcHQodGhpcyl9KWA7XG4gIH1cblxuICB2aXNpdFVuYXJ5RXhwcmVzc2lvbihub2RlOiBVbmFyeUV4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wZXJhbmQgPSBub2RlLm9wZXJhbmQuYWNjZXB0KHRoaXMpO1xuICAgIGlmIChub2RlLm9wZXJhdG9yID09PSBPcGVyYXRvci5JU19OVUxMIHx8IG5vZGUub3BlcmF0b3IgPT09IE9wZXJhdG9yLklTX05PVF9OVUxMKSB7XG4gICAgICByZXR1cm4gYCgke29wZXJhbmR9ICR7bm9kZS5vcGVyYXRvcn0pYDtcbiAgICB9IGVsc2UgaWYgKG5vZGUub3BlcmF0b3IgPT09ICdOT1QnKSB7XG4gICAgICByZXR1cm4gYChOT1QgJHtvcGVyYW5kfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCgke25vZGUub3BlcmF0b3J9JHtvcGVyYW5kfSlgO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0SW5FeHByZXNzaW9uKG5vZGU6IEluRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3QgbGVmdFN0ciA9IG5vZGUubGVmdC5sZW5ndGggPiAxXG4gICAgICA/IGAoJHtub2RlLmxlZnQubWFwKGwgPT4gbC5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9KWBcbiAgICAgIDogbm9kZS5sZWZ0WzBdLmFjY2VwdCh0aGlzKTtcbiAgICBjb25zdCBub3QgPSBub2RlLm5vdCA/ICcgTk9UJyA6ICcnO1xuICAgIGxldCByaWdodDogc3RyaW5nO1xuICAgIGlmIChub2RlLnZhbHVlcyBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICByaWdodCA9IGAoXFxuJHtub2RlLnZhbHVlcy5hY2NlcHQodGhpcyl9XFxuJHt0aGlzLmdldEluZGVudCgpfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByaWdodCA9IGAoJHtub2RlLnZhbHVlcy5tYXAoc2V0ID0+XG4gICAgICAgIHNldC5sZW5ndGggPiAxID8gYCgke3NldC5tYXAodiA9PiB2LmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX0pYCA6IHNldFswXS5hY2NlcHQodGhpcylcbiAgICAgICkuam9pbignLCAnKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGAoJHtsZWZ0U3RyfSR7bm90fSBJTiAke3JpZ2h0fSlgO1xuICB9XG5cbiAgdmlzaXRDb25jYXQobm9kZTogQ29uY2F0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCgke25vZGUuZXhwcmVzc2lvbnMubWFwKGUgPT4gZS5hY2NlcHQodGhpcykpLmpvaW4oJyB8fCAnKX0pYDtcbiAgfVxuXG4gIHZpc2l0Q2FzZUV4cHJlc3Npb24obm9kZTogQ2FzZUV4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtgJHt0aGlzLmdldEluZGVudCgpfUNBU0VgXTtcbiAgICB0aGlzLmluZGVudCgpO1xuICAgIGZvciAoY29uc3QgYyBvZiBub2RlLmNhc2VzKSB7XG4gICAgICB0aGlzLmluZGVudCgpO1xuICAgICAgcGFydHMucHVzaChgJHt0aGlzLmdldEluZGVudCgpfVdIRU4gJHtjLndoZW4uYWNjZXB0KHRoaXMpfSBUSEVOICR7Yy50aGVuLmFjY2VwdCh0aGlzKX1gKTtcbiAgICAgIHRoaXMuZGVkZW50KCk7XG4gICAgfVxuICAgIGlmIChub2RlLmVsc2UpIHtcbiAgICAgIHRoaXMuaW5kZW50KCk7XG4gICAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9RUxTRSAke25vZGUuZWxzZS5hY2NlcHQodGhpcyl9YCk7XG4gICAgICB0aGlzLmRlZGVudCgpO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKGAke3RoaXMuZ2V0SW5kZW50KCl9RU5EYCk7XG4gICAgdGhpcy5kZWRlbnQoKTtcbiAgICByZXR1cm4gcGFydHMuam9pbignXFxuJyk7XG4gIH1cblxuICB2aXNpdENhc3RFeHByZXNzaW9uKG5vZGU6IENhc3RFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYENBU1QoJHtub2RlLmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpfSBBUyAke25vZGUudGFyZ2V0VHlwZX0pYDtcbiAgfVxuXG4gIHZpc2l0Q29sbGF0ZUV4cHJlc3Npb24obm9kZTogQ29sbGF0ZUV4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtub2RlLmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpfSBDT0xMQVRFICR7bm9kZS5jb2xsYXRpb259YDtcbiAgfVxuXG4gIHZpc2l0U3VicXVlcnlFeHByZXNzaW9uKG5vZGU6IFN1YnF1ZXJ5RXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAoJHtub2RlLnN1YnF1ZXJ5LmFjY2VwdCh0aGlzKX0pYDtcbiAgfVxuXG4gIHZpc2l0V2luZG93RXhwcmVzc2lvbihub2RlOiBXaW5kb3dFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBmblBhcnQgPSBub2RlLmZ1bmN0aW9uLmFjY2VwdCh0aGlzKTtcbiAgICBjb25zdCBzcGVjID0gbm9kZS53aW5kb3dTcGVjO1xuXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHNwZWMucGFydGl0aW9uQnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYFBBUlRJVElPTiBCWSAke3NwZWMucGFydGl0aW9uQnlDb2x1bW5zLm1hcChjID0+IGMuYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBpZiAoc3BlYy5vcmRlckJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBPUkRFUiBCWSAke3NwZWMub3JkZXJCeUNvbHVtbnMubWFwKG8gPT4gby5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2ZuUGFydH0gT1ZFUiAoJHtwYXJ0cy5qb2luKCcgJyl9KWA7XG4gIH1cblxuICB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihub2RlOiBGdW5jdGlvbkV4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyZ3MgPSBub2RlLmFyZ3MubWFwKGEgPT4gYS5hY2NlcHQodGhpcykpLmpvaW4oJywgJyk7XG4gICAgY29uc3QgZGlzdGluY3RQcmVmaXggPSBub2RlLmRpc3RpbmN0ID8gJ0RJU1RJTkNUICcgOiAnJztcbiAgICByZXR1cm4gYCR7bm9kZS5uYW1lfSgke2Rpc3RpbmN0UHJlZml4fSR7YXJnc30pYDtcbiAgfVxuXG4gIHZpc2l0UGFyYW1FeHByZXNzaW9uKF9ub2RlOiBQYXJhbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuICc/JztcbiAgfVxuXG4gIHZpc2l0U3RyaW5nTGl0ZXJhbChub2RlOiBTdHJpbmdMaXRlcmFsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCcke25vZGUudmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpfSdgO1xuICB9XG5cbiAgdmlzaXROdW1iZXJMaXRlcmFsKG5vZGU6IE51bWJlckxpdGVyYWwpOiBzdHJpbmcge1xuICAgIHJldHVybiBub2RlLnZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cblxuICB2aXNpdE51bGxMaXRlcmFsKF9ub2RlOiBOdWxsTGl0ZXJhbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdOVUxMJztcbiAgfVxuXG4gIHZpc2l0RXhpc3RzRXhwcmVzc2lvbihub2RlOiBFeGlzdHNFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJxdWVyeVNxbCA9IG5vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpO1xuICAgIHJldHVybiBgRVhJU1RTIChcXG4ke3N1YnF1ZXJ5U3FsfVxcbiR7dGhpcy5nZXRJbmRlbnQoKX0pYDtcbiAgfVxufVxuIl19
@@ -1,8 +1,18 @@
1
+ import { AlterTableQuery } from "../ast/AlterTableQuery";
2
+ import { CreateIndexQuery } from "../ast/CreateIndexQuery";
3
+ import { CreateTableQuery } from "../ast/CreateTableQuery";
4
+ import { CreateViewQuery } from "../ast/CreateViewQuery";
5
+ import { DeleteQuery } from "../ast/DeleteQuery";
6
+ import { DropIndexQuery } from "../ast/DropIndexQuery";
7
+ import { DropTableQuery } from "../ast/DropTableQuery";
8
+ import { DropViewQuery } from "../ast/DropViewQuery";
1
9
  import { InsertQuery } from "../ast/InsertQuery";
10
+ import { UpdateQuery } from "../ast/UpdateQuery";
2
11
  import { SelectQuery } from "../ast/SelectQuery";
3
12
  import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
4
13
  export declare function quoteIdentifier(identifier: string): string;
14
+ export type RenderableQuery = SelectQuery | InsertQuery | UpdateQuery | DeleteQuery | CreateTableQuery | CreateIndexQuery | CreateViewQuery | AlterTableQuery | DropTableQuery | DropIndexQuery | DropViewQuery;
5
15
  export interface QueryRenderer extends SqlTreeNodeVisitor<string> {
6
- render(node: SelectQuery | InsertQuery): string;
16
+ render(node: RenderableQuery): string;
7
17
  }
8
18
  export declare function shouldQuoteIdentifier(identifier: string): boolean;
@@ -74,4 +74,4 @@ function shouldQuoteIdentifier(identifier) {
74
74
  // No quotes needed for simple, lowercase, non-reserved identifiers
75
75
  return false;
76
76
  }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlSZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW5kZXJlci9RdWVyeVJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkJBLDBDQTBCQztBQU1ELHNEQTJCQztBQW5GRCxvRUFBb0U7QUFDcEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUs7SUFDN0UsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUk7SUFDMUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVU7SUFDN0UsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxjQUFjO0lBQzFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRO0lBQzlFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUTtJQUMzRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTztJQUNoRixXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTztJQUMzRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFB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Z0VBQWdFO0lBQy9FLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLHdGQUF3RjtJQUN4RixNQUFNLHNCQUFzQixHQUFHLDBCQUEwQixDQUFDO0lBQzFELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLG9FQUFvRTtJQUNwRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQyxDQUFDLHVDQUF1QztJQUN4RCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluc2VydFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9JbnNlcnRRdWVyeVwiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L1NlbGVjdFF1ZXJ5XCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcblxuXG4vLyBDb21wcmVoZW5zaXZlIGxpc3Qgb2YgU1FMaXRlIHJlc2VydmVkIGtleXdvcmRzIChjYXNlLWluc2Vuc2l0aXZlKVxuY29uc3QgUkVTRVJWRURfS0VZV09SRFMgPSBuZXcgU2V0KFtcbiAgJ0FCT1JUJywgJ0FDVElPTicsICdBREQnLCAnQUZURVInLCAnQUxMJywgJ0FMVEVSJywgJ0FMV0FZUycsICdBTkFMWVpFJywgJ0FORCcsXG4gICdBUycsICdBU0MnLCAnQVRUQUNIJywgJ0FVVE9JTkNSRU1FTlQnLCAnQkVGT1JFJywgJ0JFR0lOJywgJ0JFVFdFRU4nLCAnQlknLFxuICAnQ0FTQ0FERScsICdDQVNFJywgJ0NBU1QnLCAnQ0hFQ0snLCAnQ09MTEFURScsICdDT0xVTU4nLCAnQ09NTUlUJywgJ0NPTkZMSUNUJyxcbiAgJ0NPTlNUUkFJTlQnLCAnQ1JFQVRFJywgJ0NST1NTJywgJ0NVUlJFTlQnLCAnQ1VSUkVOVF9EQVRFJywgJ0NVUlJFTlRfVElNRScsXG4gICdDVVJSRU5UX1RJTUVTVEFNUCcsICdEQVRBQkFTRScsICdERUZBVUxUJywgJ0RFRkVSUkVEJywgJ0RFRkVSUkFCTEUnLCAnREVMRVRFJyxcbiAgJ0RFU0MnLCAnREVUQUNIJywgJ0RJU1RJTkNUJywgJ0RPJywgJ0RST1AnLCAnRUFDSCcsICdFTFNFJywgJ0VORCcsICdFU0NBUEUnLFxuICAnRVhDRVBUJywgJ0VYQ0xVREUnLCAnRVhDTFVTSVZFJywgJ0VYSVNUUycsICdFWFBMQUlOJywgJ0ZBSUwnLCAnRklMVEVSJywgJ0ZJUlNUJyxcbiAgJ0ZPTExPV0lORycsICdGT1InLCAnRk9SRUlHTicsICdGUk9NJywgJ0ZVTEwnLCAnR0VORVJBVEVEJywgJ0dMT0InLCAnR1JPVVAnLFxuICAnR1JPVVBTJywgJ0hBVklORycsICdJRicsICdJR05PUkUnLCAnSU1NRURJQVRFJywgJ0lOJywgJ0lOREVYJywgJ0lOREVYRUQnLFxuICAnSU5JVElBTExZJywgJ0lOTkVSJywgJ0lOU0VSVCcsICdJTlNURUFEJywgJ0lOVEVSU0VDVCcsICdJTlRPJywgJ0lTJywgJ0lTTlVMTCcsXG4gICdKT0lOJywgJ0tFWScsICdMQVNUJywgJ0xFRlQnLCAnTElLRScsICdMSU1JVCcsICdNQVRDSCcsICdNQVRFUklBTElaRUQnLCAnTkFUVVJBTCcsXG4gICdOTycsICdOT1QnLCAnTk9USElORycsICdOT1ROVUxMJywgJ05VTEwnLCAnTlVMTFMnLCAnT0YnLCAnT0ZGU0VUJywgJ09OJywgJ09SJyxcbiAgJ09SREVSJywgJ09USEVSUycsICdPVVRFUicsICdPVkVSJywgJ1BBUlRJVElPTicsICdQTEFOJywgJ1BSQUdNQScsICdQUkVDRURJTkcnLFxuICAnUFJJTUFSWScsICdRVUVSWScsICdSQUlTRScsICdSQU5HRScsICdSRUNVUlNJVkUnLCAnUkVGRVJFTkNFUycsICdSRUdFWFAnLFxuICAnUkVJTkRFWCcsICdSRUxFQVNFJywgJ1JFTkFNRScsICdSRVBMQUNFJywgJ1JFU1RSSUNUJywgJ1JFVFVSTklORycsICdSSUdIVCcsXG4gICdST0xMQkFDSycsICdST1cnLCAnUk9XUycsICdTQVZFUE9JTlQnLCAnU0VMRUNUJywgJ1NFVCcsICdUQUJMRScsICdURU1QJyxcbiAgJ1RFTVBPUkFSWScsICdUSEVOJywgJ1RJRVMnLCAnVE8nLCAnVFJBTlNBQ1RJT04nLCAnVFJJR0dFUicsICdVTkJPVU5ERUQnLFxuICAnVU5JT04nLCAnVU5JUVVFJywgJ1VQREFURScsICdVU0lORycsICdWQUNVVU0nLCAnVkFMVUVTJywgJ1ZJRVcnLCAnVklSVFVBTCcsXG4gICdXSEVOJywgJ1dIRVJFJywgJ1dJTkRPVycsICdXSVRIJywgJ1dJVEhPVVQnXG5dKTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBxdW90ZSBpZGVudGlmaWVycywgZXNjYXBpbmcgaW5uZXIgcXVvdGVzXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVJZGVudGlmaWVyKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpZGVudGlmaWVyID09PSAnKicpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjsgLy8gRG8gbm90IHF1b3RlICcqJ1xuICB9XG5cbiAgLy8gSGFuZGxlIGRhdGFiYXNlLXF1YWxpZmllZCBpZGVudGlmaWVycyAoZS5nLiwgXCJkYXRhYmFzZS50YWJsZVwiKVxuICBpZiAoaWRlbnRpZmllci5pbmNsdWRlcygnLicpKSB7XG4gICAgY29uc3QgcGFydHMgPSBpZGVudGlmaWVyLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgLy8gUXVvdGUgZWFjaCBwYXJ0IGluZGl2aWR1YWxseSBpZiBuZWVkZWQgKGV4Y2VwdCBmb3IgYXN0ZXJpc2spLCB0aGVuIGpvaW4gd2l0aCBkb3RcbiAgICAgIGNvbnN0IHF1b3RlZFBhcnRzID0gcGFydHMubWFwKHBhcnQgPT4ge1xuICAgICAgICBpZiAocGFydCA9PT0gJyonKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnQ7IC8vIERvbid0IHF1b3RlIGFzdGVyaXNrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNob3VsZFF1b3RlSWRlbnRpZmllcihwYXJ0KSA/IGBcIiR7cGFydC5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCA6IHBhcnQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxdW90ZWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFF1b3RlSWRlbnRpZmllcihpZGVudGlmaWVyKSkge1xuICAgIC8vIEVzY2FwZSBkb3VibGUtcXVvdGVzIGJ5IGRvdWJsaW5nIHRoZW0gKGUuZy4sIFwiIGJlY29tZXMgXCJcIilcbiAgICBjb25zdCBlc2NhcGVkID0gaWRlbnRpZmllci5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xuICAgIHJldHVybiBgXCIke2VzY2FwZWR9XCJgO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVyOyAvLyBSZXR1cm4gdW5xdW90ZWQgaWYgbm8gcXVvdGluZyBpcyBuZWVkZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeVJlbmRlcmVyIGV4dGVuZHMgU3FsVHJlZU5vZGVWaXNpdG9yPHN0cmluZz4ge1xuICByZW5kZXIobm9kZTogU2VsZWN0UXVlcnkgfCBJbnNlcnRRdWVyeSk6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFF1b3RlSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2hlY2sgZm9yIGVtcHR5IG9yIGludmFsaWQgaW5wdXRcbiAgaWYgKCFpZGVudGlmaWVyIHx8IGlkZW50aWZpZXIudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybiB0cnVlOyAvLyBFbXB0eSBvciBpbnZhbGlkIGlkZW50aWZpZXJzIHNob3VsZCBiZSBxdW90ZWQgdG8gYXZvaWQgZXJyb3JzXG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpZmllciBpcyBhIHJlc2VydmVkIGtleXdvcmQgKGNhc2UtaW5zZW5zaXRpdmUpXG4gIGlmIChSRVNFUlZFRF9LRVlXT1JEUy5oYXMoaWRlbnRpZmllci50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpZmllciBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzXG4gIC8vIFZhbGlkIHVucXVvdGVkIGlkZW50aWZpZXJzOiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzOyBtdXN0IG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgY29uc3QgdmFsaWRJZGVudGlmaWVyUGF0dGVybiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvO1xuICBpZiAoIXZhbGlkSWRlbnRpZmllclBhdHRlcm4udGVzdChpZGVudGlmaWVyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgY2FzZSBzZW5zaXRpdml0eSAoaWYgaWRlbnRpZmllciBoYXMgdXBwZXJjYXNlIGxldHRlcnMpXG4gIC8vIFNRTGl0ZSBpcyBjYXNlLWluc2Vuc2l0aXZlIGJ5IGRlZmF1bHQsIGJ1dCBxdW90aW5nIHByZXNlcnZlcyBjYXNlXG4gIGNvbnN0IGhhc1VwcGVyQ2FzZSA9IC9bQS1aXS8udGVzdChpZGVudGlmaWVyKTtcbiAgaWYgKGhhc1VwcGVyQ2FzZSkge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIFF1b3RlIGlmIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgZGVzaXJlZFxuICB9XG5cbiAgLy8gTm8gcXVvdGVzIG5lZWRlZCBmb3Igc2ltcGxlLCBsb3dlcmNhc2UsIG5vbi1yZXNlcnZlZCBpZGVudGlmaWVyc1xuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlSZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW5kZXJlci9RdWVyeVJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0NBLDBDQTBCQztBQW1CRCxzREEyQkM7QUFoR0Qsb0VBQW9FO0FBQ3BFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLO0lBQzdFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJO0lBQzFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVO0lBQzdFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsY0FBYztJQUMxRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUTtJQUM5RSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVE7SUFDM0UsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU87SUFDaEYsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU87SUFDM0UsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVB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QyxnRUFBZ0U7SUFDL0UsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsd0ZBQXdGO0lBQ3hGLE1BQU0sc0JBQXNCLEdBQUcsMEJBQTBCLENBQUM7SUFDMUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsb0VBQW9FO0lBQ3BFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDLENBQUMsdUNBQXVDO0lBQ3hELENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWx0ZXJUYWJsZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9BbHRlclRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZUluZGV4UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0NyZWF0ZUluZGV4UXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0NyZWF0ZVRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpZXdRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBEZWxldGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvRGVsZXRlUXVlcnlcIjtcbmltcG9ydCB7IERyb3BJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wSW5kZXhRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcFRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wVmlld1F1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeSB9IGZyb20gXCIuLi9hc3QvSW5zZXJ0UXVlcnlcIjtcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9VcGRhdGVRdWVyeVwiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L1NlbGVjdFF1ZXJ5XCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcblxuXG4vLyBDb21wcmVoZW5zaXZlIGxpc3Qgb2YgU1FMaXRlIHJlc2VydmVkIGtleXdvcmRzIChjYXNlLWluc2Vuc2l0aXZlKVxuY29uc3QgUkVTRVJWRURfS0VZV09SRFMgPSBuZXcgU2V0KFtcbiAgJ0FCT1JUJywgJ0FDVElPTicsICdBREQnLCAnQUZURVInLCAnQUxMJywgJ0FMVEVSJywgJ0FMV0FZUycsICdBTkFMWVpFJywgJ0FORCcsXG4gICdBUycsICdBU0MnLCAnQVRUQUNIJywgJ0FVVE9JTkNSRU1FTlQnLCAnQkVGT1JFJywgJ0JFR0lOJywgJ0JFVFdFRU4nLCAnQlknLFxuICAnQ0FTQ0FERScsICdDQVNFJywgJ0NBU1QnLCAnQ0hFQ0snLCAnQ09MTEFURScsICdDT0xVTU4nLCAnQ09NTUlUJywgJ0NPTkZMSUNUJyxcbiAgJ0NPTlNUUkFJTlQnLCAnQ1JFQVRFJywgJ0NST1NTJywgJ0NVUlJFTlQnLCAnQ1VSUkVOVF9EQVRFJywgJ0NVUlJFTlRfVElNRScsXG4gICdDVVJSRU5UX1RJTUVTVEFNUCcsICdEQVRBQkFTRScsICdERUZBVUxUJywgJ0RFRkVSUkVEJywgJ0RFRkVSUkFCTEUnLCAnREVMRVRFJyxcbiAgJ0RFU0MnLCAnREVUQUNIJywgJ0RJU1RJTkNUJywgJ0RPJywgJ0RST1AnLCAnRUFDSCcsICdFTFNFJywgJ0VORCcsICdFU0NBUEUnLFxuICAnRVhDRVBUJywgJ0VYQ0xVREUnLCAnRVhDTFVTSVZFJywgJ0VYSVNUUycsICdFWFBMQUlOJywgJ0ZBSUwnLCAnRklMVEVSJywgJ0ZJUlNUJyxcbiAgJ0ZPTExPV0lORycsICdGT1InLCAnRk9SRUlHTicsICdGUk9NJywgJ0ZVTEwnLCAnR0VORVJBVEVEJywgJ0dMT0InLCAnR1JPVVAnLFxuICAnR1JPVVBTJywgJ0hBVklORycsICdJRicsICdJR05PUkUnLCAnSU1NRURJQVRFJywgJ0lOJywgJ0lOREVYJywgJ0lOREVYRUQnLFxuICAnSU5JVElBTExZJywgJ0lOTkVSJywgJ0lOU0VSVCcsICdJTlNURUFEJywgJ0lOVEVSU0VDVCcsICdJTlRPJywgJ0lTJywgJ0lTTlVMTCcsXG4gICdKT0lOJywgJ0tFWScsICdMQVNUJywgJ0xFRlQnLCAnTElLRScsICdMSU1JVCcsICdNQVRDSCcsICdNQVRFUklBTElaRUQnLCAnTkFUVVJBTCcsXG4gICdOTycsICdOT1QnLCAnTk9USElORycsICdOT1ROVUxMJywgJ05VTEwnLCAnTlVMTFMnLCAnT0YnLCAnT0ZGU0VUJywgJ09OJywgJ09SJyxcbiAgJ09SREVSJywgJ09USEVSUycsICdPVVRFUicsICdPVkVSJywgJ1BBUlRJVElPTicsICdQTEFOJywgJ1BSQUdNQScsICdQUkVDRURJTkcnLFxuICAnUFJJTUFSWScsICdRVUVSWScsICdSQUlTRScsICdSQU5HRScsICdSRUNVUlNJVkUnLCAnUkVGRVJFTkNFUycsICdSRUdFWFAnLFxuICAnUkVJTkRFWCcsICdSRUxFQVNFJywgJ1JFTkFNRScsICdSRVBMQUNFJywgJ1JFU1RSSUNUJywgJ1JFVFVSTklORycsICdSSUdIVCcsXG4gICdST0xMQkFDSycsICdST1cnLCAnUk9XUycsICdTQVZFUE9JTlQnLCAnU0VMRUNUJywgJ1NFVCcsICdUQUJMRScsICdURU1QJyxcbiAgJ1RFTVBPUkFSWScsICdUSEVOJywgJ1RJRVMnLCAnVE8nLCAnVFJBTlNBQ1RJT04nLCAnVFJJR0dFUicsICdVTkJPVU5ERUQnLFxuICAnVU5JT04nLCAnVU5JUVVFJywgJ1VQREFURScsICdVU0lORycsICdWQUNVVU0nLCAnVkFMVUVTJywgJ1ZJRVcnLCAnVklSVFVBTCcsXG4gICdXSEVOJywgJ1dIRVJFJywgJ1dJTkRPVycsICdXSVRIJywgJ1dJVEhPVVQnXG5dKTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBxdW90ZSBpZGVudGlmaWVycywgZXNjYXBpbmcgaW5uZXIgcXVvdGVzXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVJZGVudGlmaWVyKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpZGVudGlmaWVyID09PSAnKicpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjsgLy8gRG8gbm90IHF1b3RlICcqJ1xuICB9XG5cbiAgLy8gSGFuZGxlIGRhdGFiYXNlLXF1YWxpZmllZCBpZGVudGlmaWVycyAoZS5nLiwgXCJkYXRhYmFzZS50YWJsZVwiKVxuICBpZiAoaWRlbnRpZmllci5pbmNsdWRlcygnLicpKSB7XG4gICAgY29uc3QgcGFydHMgPSBpZGVudGlmaWVyLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgLy8gUXVvdGUgZWFjaCBwYXJ0IGluZGl2aWR1YWxseSBpZiBuZWVkZWQgKGV4Y2VwdCBmb3IgYXN0ZXJpc2spLCB0aGVuIGpvaW4gd2l0aCBkb3RcbiAgICAgIGNvbnN0IHF1b3RlZFBhcnRzID0gcGFydHMubWFwKHBhcnQgPT4ge1xuICAgICAgICBpZiAocGFydCA9PT0gJyonKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnQ7IC8vIERvbid0IHF1b3RlIGFzdGVyaXNrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNob3VsZFF1b3RlSWRlbnRpZmllcihwYXJ0KSA/IGBcIiR7cGFydC5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCA6IHBhcnQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxdW90ZWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFF1b3RlSWRlbnRpZmllcihpZGVudGlmaWVyKSkge1xuICAgIC8vIEVzY2FwZSBkb3VibGUtcXVvdGVzIGJ5IGRvdWJsaW5nIHRoZW0gKGUuZy4sIFwiIGJlY29tZXMgXCJcIilcbiAgICBjb25zdCBlc2NhcGVkID0gaWRlbnRpZmllci5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xuICAgIHJldHVybiBgXCIke2VzY2FwZWR9XCJgO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVyOyAvLyBSZXR1cm4gdW5xdW90ZWQgaWYgbm8gcXVvdGluZyBpcyBuZWVkZWRcbn1cblxuZXhwb3J0IHR5cGUgUmVuZGVyYWJsZVF1ZXJ5ID1cbiAgfCBTZWxlY3RRdWVyeVxuICB8IEluc2VydFF1ZXJ5XG4gIHwgVXBkYXRlUXVlcnlcbiAgfCBEZWxldGVRdWVyeVxuICB8IENyZWF0ZVRhYmxlUXVlcnlcbiAgfCBDcmVhdGVJbmRleFF1ZXJ5XG4gIHwgQ3JlYXRlVmlld1F1ZXJ5XG4gIHwgQWx0ZXJUYWJsZVF1ZXJ5XG4gIHwgRHJvcFRhYmxlUXVlcnlcbiAgfCBEcm9wSW5kZXhRdWVyeVxuICB8IERyb3BWaWV3UXVlcnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlSZW5kZXJlciBleHRlbmRzIFNxbFRyZWVOb2RlVmlzaXRvcjxzdHJpbmc+IHtcbiAgcmVuZGVyKG5vZGU6IFJlbmRlcmFibGVRdWVyeSk6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFF1b3RlSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2hlY2sgZm9yIGVtcHR5IG9yIGludmFsaWQgaW5wdXRcbiAgaWYgKCFpZGVudGlmaWVyIHx8IGlkZW50aWZpZXIudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybiB0cnVlOyAvLyBFbXB0eSBvciBpbnZhbGlkIGlkZW50aWZpZXJzIHNob3VsZCBiZSBxdW90ZWQgdG8gYXZvaWQgZXJyb3JzXG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpZmllciBpcyBhIHJlc2VydmVkIGtleXdvcmQgKGNhc2UtaW5zZW5zaXRpdmUpXG4gIGlmIChSRVNFUlZFRF9LRVlXT1JEUy5oYXMoaWRlbnRpZmllci50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpZmllciBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzXG4gIC8vIFZhbGlkIHVucXVvdGVkIGlkZW50aWZpZXJzOiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzOyBtdXN0IG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgY29uc3QgdmFsaWRJZGVudGlmaWVyUGF0dGVybiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvO1xuICBpZiAoIXZhbGlkSWRlbnRpZmllclBhdHRlcm4udGVzdChpZGVudGlmaWVyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgY2FzZSBzZW5zaXRpdml0eSAoaWYgaWRlbnRpZmllciBoYXMgdXBwZXJjYXNlIGxldHRlcnMpXG4gIC8vIFNRTGl0ZSBpcyBjYXNlLWluc2Vuc2l0aXZlIGJ5IGRlZmF1bHQsIGJ1dCBxdW90aW5nIHByZXNlcnZlcyBjYXNlXG4gIGNvbnN0IGhhc1VwcGVyQ2FzZSA9IC9bQS1aXS8udGVzdChpZGVudGlmaWVyKTtcbiAgaWYgKGhhc1VwcGVyQ2FzZSkge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIFF1b3RlIGlmIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgZGVzaXJlZFxuICB9XG5cbiAgLy8gTm8gcXVvdGVzIG5lZWRlZCBmb3Igc2ltcGxlLCBsb3dlcmNhc2UsIG5vbi1yZXNlcnZlZCBpZGVudGlmaWVyc1xuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=