@rosen-bridge/config 1.2.0 → 2.0.0-483fe316

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/dist/config.js CHANGED
@@ -1,23 +1,56 @@
1
+ import config from 'config';
1
2
  import * as fs from 'fs';
2
3
  import * as yaml from 'js-yaml';
3
4
  import path from 'path';
5
+ import JsonBigInt, { JsonBigIntFactory } from '@rosen-bridge/json-bigint';
4
6
  import { propertyValidators, supportedTypes, } from './schema/Validators/fieldProperties';
5
7
  import { getSourceName, getValueFromConfigSources, toPascalCase, } from './utils';
6
8
  import { valueValidations, valueValidators } from './value/validators';
7
- import JsonBigInt from '@rosen-bridge/json-bigint';
8
9
  export class ConfigValidator {
9
10
  schema;
10
11
  constructor(schema) {
11
12
  this.schema = schema;
12
13
  this.validateSchema();
13
14
  }
15
+ /**
16
+ * Builds and returns the final configuration object by transforming and validating
17
+ *
18
+ * T - The type of the final normalized configuration object.
19
+ * @returns {T} The normalized configuration object
20
+ */
21
+ buildConfigs = () => {
22
+ const raw = config.util.toObject();
23
+ this.validateConfig(raw);
24
+ return raw;
25
+ };
26
+ /**
27
+ * create ConfigValidator from schema file path
28
+ */
29
+ static fromFile = (schemaPath) => {
30
+ const rawSchemaData = fs.readFileSync(schemaPath, 'utf-8');
31
+ const jsonBigInt = JsonBigIntFactory({
32
+ alwaysParseAsBig: false,
33
+ useNativeBigInt: true,
34
+ });
35
+ const schema = jsonBigInt.parse(rawSchemaData);
36
+ return new ConfigValidator(schema);
37
+ };
38
+ /**
39
+ * create ConfigValidator from schema
40
+ *
41
+ * @param {ConfigSchema} schema
42
+ */
43
+ static fromSchema = (schema) => {
44
+ return new ConfigValidator(schema);
45
+ };
14
46
  /**
15
47
  * validates the passed config against the instance's schema
16
48
  *
17
49
  * @param {Record<string, any>} config
18
50
  */
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
52
  validateConfig(config) {
20
- this.validateValue(config, { type: 'object', children: this.schema }, config);
53
+ this.validateValue(config, { type: 'object', children: this.schema }, config, []);
21
54
  this.validateSubConfig(config, config, this.schema, []);
22
55
  }
23
56
  /**
@@ -30,7 +63,13 @@ export class ConfigValidator {
30
63
  * @param {string[]} path
31
64
  * @memberof ConfigValidator
32
65
  */
33
- validateSubConfig(config, subConfig, subSchema, path) {
66
+ validateSubConfig(
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ config,
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ subConfig, subSchema, path,
71
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ context) {
34
73
  const errorPreamble = (path) => `config validation failed for "${path.join('.')}" field`;
35
74
  for (const name of Object.keys(subSchema)) {
36
75
  const childPath = path.concat([name]);
@@ -40,26 +79,125 @@ export class ConfigValidator {
40
79
  if (subConfig != undefined && Object.hasOwn(subConfig, name)) {
41
80
  value = subConfig[name];
42
81
  }
43
- this.validateValue(value, field, config);
82
+ this.validateValue(value, field, config, childPath, context);
44
83
  // if a node/field is of type object and thus is a subtree, traverse it
45
84
  if (field.type === 'object') {
46
- this.validateSubConfig(config, value, field.children, childPath);
85
+ this.validateSubConfig(config, value, field.children, childPath, context);
47
86
  }
48
87
  else if (field.type === 'array') {
49
88
  if (Array.isArray(value)) {
50
- for (const item of value) {
51
- ConfigValidator.modifyObject(config, item, childPath);
52
- this.validateSubConfig(config, { [name]: item }, { [name]: field.items }, childPath);
53
- ConfigValidator.modifyObject(config, value, childPath);
89
+ for (let i = 0; i < value.length; i++) {
90
+ const item = value[i];
91
+ const itemPath = childPath.concat([String(i)]);
92
+ if (field.items.type === 'object') {
93
+ this.validateSubConfig(config, item, field.items.children, itemPath, { [name]: item });
94
+ }
95
+ else if (field.items.type === 'array') {
96
+ this.validateSubConfig(config, { [name]: item }, { [name]: field.items }, childPath);
97
+ }
98
+ else if (field.items.type === 'union') {
99
+ this.validateUnionValue(item, field.items, config, itemPath, name, { [name]: item });
100
+ }
101
+ else {
102
+ // for primitive fields
103
+ this.validateValue(item, field.items, config, itemPath);
104
+ }
54
105
  }
106
+ ConfigValidator.modifyObject(config, value, childPath);
55
107
  }
56
108
  }
109
+ else if (field.type === 'union') {
110
+ value = subConfig[name];
111
+ this.validateUnionValue(value, field, config, childPath, name);
112
+ }
57
113
  }
58
114
  catch (error) {
59
- throw new Error(`${errorPreamble(childPath)}: ${error.message}`);
115
+ throw new Error(`${errorPreamble(childPath)}: ${error instanceof Error ? error.message : error}`);
60
116
  }
61
117
  }
62
118
  }
119
+ /**
120
+ * traverses and validates a union subconfig using the subschema
121
+ *
122
+ * @private
123
+ * @param {any} value
124
+ * @param {UnionField} field
125
+ * @param {Record<string, any>} config
126
+ * @param {ConfigSchema} subSchema
127
+ * @param {string[]} childPath
128
+ * @param {string} name
129
+ */
130
+ validateUnionValue(
131
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
+ value, field,
133
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
134
+ config, childPath, name,
135
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
+ context) {
137
+ let isMatched = false;
138
+ let errorMessage = '';
139
+ for (const activeField of field.children) {
140
+ try {
141
+ if (activeField.type === 'object') {
142
+ this.validateSubConfig(config, value, activeField.children, childPath, context);
143
+ isMatched = true;
144
+ }
145
+ else if (activeField.type === 'array' && Array.isArray(value)) {
146
+ for (let i = 0; i < value.length; i++) {
147
+ const item = value[i];
148
+ const itemPath = childPath.concat([String(i)]);
149
+ if (activeField.items.type === 'object') {
150
+ this.validateSubConfig(config, item, activeField.items.children, itemPath, item);
151
+ }
152
+ else if (activeField.items.type === 'union') {
153
+ this.validateUnionValue(item, activeField.items, config, itemPath, name, item);
154
+ }
155
+ else {
156
+ this.validateValue(item, activeField.items, config, itemPath, item);
157
+ }
158
+ }
159
+ ConfigValidator.modifyObject(config, value, childPath);
160
+ isMatched = true;
161
+ }
162
+ else if (activeField.type === 'union') {
163
+ this.validateUnionValue(value, activeField, config, childPath, name, context);
164
+ isMatched = true;
165
+ }
166
+ else {
167
+ this.validateValue(value, activeField, config, childPath, context);
168
+ isMatched = true;
169
+ }
170
+ if (isMatched)
171
+ break;
172
+ }
173
+ catch (e) {
174
+ errorMessage = `${e instanceof Error ? e.message : e}`;
175
+ console.debug(`Value for "${childPath.join('.')}" has this error: ${errorMessage}.`);
176
+ isMatched = isMatched === true;
177
+ }
178
+ }
179
+ if (field.validations) {
180
+ value =
181
+ value != undefined ? value : ConfigValidator.valueAt(config, childPath);
182
+ for (const validation of field.validations) {
183
+ const name = Object.keys(validation).filter((key) => key !== 'when' && key !== 'error')[0];
184
+ if (Object.hasOwn(valueValidations[field.type], name)) {
185
+ try {
186
+ valueValidations[field.type][name](value, validation, config, this, context);
187
+ }
188
+ catch (error) {
189
+ if (validation.error != undefined) {
190
+ throw new Error(validation.error);
191
+ }
192
+ throw error;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ if (!isMatched) {
198
+ throw new Error(`Value for "${childPath.join('.')}" does not match any of the union types for this error: ${errorMessage}. Please provide a valid value.`);
199
+ }
200
+ }
63
201
  /**
64
202
  * sets an object's specific subtree to the specified value
65
203
  *
@@ -70,20 +208,23 @@ export class ConfigValidator {
70
208
  * @return {*}
71
209
  * @memberof ConfigValidator
72
210
  */
73
- static modifyObject(obj, newValue, path) {
74
- let value = obj;
75
- for (const key of path.slice(0, -1)) {
76
- if (value != undefined && Object.hasOwn(value, key)) {
77
- value = value[key];
211
+ static modifyObject(
212
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
213
+ obj, newValue, path) {
214
+ let current = obj;
215
+ for (let i = 0; i < path.length; i++) {
216
+ const key = path[i];
217
+ const isLast = i === path.length - 1;
218
+ if (isLast) {
219
+ current[key] = newValue;
78
220
  }
79
221
  else {
80
- return;
222
+ if (current[key] === undefined || current[key] === null) {
223
+ current[key] = {};
224
+ }
225
+ current = current[key];
81
226
  }
82
227
  }
83
- const lastKey = path.at(-1);
84
- if (lastKey != undefined) {
85
- value[lastKey] = newValue;
86
- }
87
228
  }
88
229
  /**
89
230
  * validates a value in config object
@@ -93,24 +234,57 @@ export class ConfigValidator {
93
234
  * @param {ConfigField} field the field specification in schema
94
235
  * @param {Record<string, any>} config the config object
95
236
  */
96
- validateValue = (value, field, config) => {
237
+ validateValue = (
238
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
239
+ value, field,
240
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
241
+ config, path,
242
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
243
+ context) => {
97
244
  if (value != undefined) {
98
245
  if (field.type === 'bigint') {
99
- value = BigInt(value);
246
+ if (typeof value === 'number' &&
247
+ (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER)) {
248
+ throw new Error(`Field "${path.join('.')}" is declared as a BigInt, but a Number was provided with insufficient precision. Values exceeding 9007199254740991 must be supplied as a string to ensure accuracy.`);
249
+ }
250
+ try {
251
+ value = BigInt(value);
252
+ ConfigValidator.modifyObject(config, value, path);
253
+ }
254
+ catch {
255
+ throw new Error(`Cannot convert ${value} to a BigInt for field "${path.join('.')}"`);
256
+ }
100
257
  }
101
- else if (field.type === 'number' && value && !isNaN(value)) {
258
+ if (field.type === 'number') {
259
+ if (isNaN(Number(value))) {
260
+ throw new Error(`Field "${path.join('.')}" must be a valid number. Please provide a suitable format.`);
261
+ }
102
262
  value = Number(value);
263
+ if (value > Number.MAX_SAFE_INTEGER ||
264
+ value < Number.MIN_SAFE_INTEGER) {
265
+ throw new Error(`Value for "${path.join('.')}" is too large or too small. Please enter a valid number.`);
266
+ }
267
+ ConfigValidator.modifyObject(config, value, path);
103
268
  }
104
269
  valueValidators[field.type](value, field);
105
270
  }
271
+ if (value == undefined &&
272
+ field.type !== 'object' &&
273
+ field.type !== 'array' &&
274
+ field.type !== 'union' &&
275
+ field.default) {
276
+ value = field.default;
277
+ ConfigValidator.modifyObject(config, field.default, path);
278
+ }
106
279
  if (field.type !== 'object' &&
107
280
  field.type !== 'array' &&
281
+ field.type !== 'union' &&
108
282
  field.validations) {
109
283
  for (const validation of field.validations) {
110
284
  const name = Object.keys(validation).filter((key) => key !== 'when' && key !== 'error')[0];
111
285
  if (Object.hasOwn(valueValidations[field.type], name)) {
112
286
  try {
113
- valueValidations[field.type][name](value, validation, config, this);
287
+ valueValidations[field.type][name](value, validation, config, this, context);
114
288
  }
115
289
  catch (error) {
116
290
  if (validation.error != undefined) {
@@ -130,8 +304,18 @@ export class ConfigValidator {
130
304
  * @param {Record<string, any>} config
131
305
  * @return {boolean}
132
306
  */
133
- isWhenTrue = (when, config) => {
134
- const pathParts = when.path.split('.');
307
+ isWhenTrue = (when,
308
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
309
+ config,
310
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
311
+ context) => {
312
+ let pathParts = when.path.split('.');
313
+ if (context != undefined) {
314
+ const localValue = ConfigValidator.valueAt(context, pathParts);
315
+ if (localValue !== undefined) {
316
+ return localValue === when.value;
317
+ }
318
+ }
135
319
  const value = ConfigValidator.valueAt(config, pathParts);
136
320
  return value != undefined && value === when.value;
137
321
  };
@@ -143,10 +327,20 @@ export class ConfigValidator {
143
327
  * @param {string[]} path
144
328
  * @return {*}
145
329
  */
330
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
331
  static valueAt = (config, path) => {
147
332
  let value = config;
148
333
  for (const key of path) {
149
- if (value != undefined && Object.hasOwn(value, key)) {
334
+ if (Array.isArray(value)) {
335
+ if (isNaN(Number(key))) {
336
+ value = value.map((item) => item?.[key]).find((v) => v !== undefined);
337
+ }
338
+ else {
339
+ const index = Number(key);
340
+ value = value[index];
341
+ }
342
+ }
343
+ else if (value != undefined && Object.hasOwn(value, key)) {
150
344
  value = value[key];
151
345
  }
152
346
  else {
@@ -196,9 +390,17 @@ export class ConfigValidator {
196
390
  parentPath: path,
197
391
  });
198
392
  }
393
+ else if (field.type === 'union') {
394
+ field.children.forEach((unionChild, index) => {
395
+ stack.push({
396
+ subSchema: { [`${name}_union_${index}`]: unionChild },
397
+ parentPath: path,
398
+ });
399
+ });
400
+ }
199
401
  }
200
402
  catch (error) {
201
- throw new Error(`${errorPreamble(path)}: ${error.message}`);
403
+ throw new Error(`${errorPreamble(path)}: ${error instanceof Error ? error.message : error}`);
202
404
  }
203
405
  }
204
406
  }
@@ -221,8 +423,7 @@ export class ConfigValidator {
221
423
  validateSchemaField = (field) => {
222
424
  for (const key of Object.keys(field)) {
223
425
  if (!Object.hasOwn(propertyValidators.all, key) &&
224
- !(!['object', 'array'].includes(field.type) &&
225
- Object.hasOwn(propertyValidators.primitive, key)) &&
426
+ !Object.hasOwn(propertyValidators.primitive, key) &&
226
427
  !Object.hasOwn(propertyValidators[field.type], key)) {
227
428
  throw new Error(`schema field has unknown property "${key}"`);
228
429
  }
@@ -230,7 +431,9 @@ export class ConfigValidator {
230
431
  for (const validator of Object.values(propertyValidators.all)) {
231
432
  validator(field, this);
232
433
  }
233
- if (field.type !== 'object' && field.type !== 'array') {
434
+ if (field.type !== 'object' &&
435
+ field.type !== 'array' &&
436
+ field.type !== 'union') {
234
437
  for (const validator of Object.values(propertyValidators.primitive)) {
235
438
  validator(field, this);
236
439
  }
@@ -249,17 +452,81 @@ export class ConfigValidator {
249
452
  let subTree = this.schema;
250
453
  let field = undefined;
251
454
  for (const part of path) {
252
- if (subTree != undefined && Object.hasOwn(subTree, part)) {
455
+ if (!subTree) {
456
+ if (field?.type === 'union') {
457
+ let found;
458
+ for (const child of field.children) {
459
+ if (child.type === 'object' &&
460
+ Object.hasOwn(child.children, part)) {
461
+ found = child.children[part];
462
+ break;
463
+ }
464
+ }
465
+ if (!found)
466
+ return undefined;
467
+ field = found;
468
+ if (field.type === 'object') {
469
+ subTree = field.children;
470
+ }
471
+ else if (field.type === 'array' &&
472
+ (field.items.type === 'object' || field.items.type === 'union')) {
473
+ subTree =
474
+ field.items.type === 'object' ? field.items.children : undefined;
475
+ }
476
+ else {
477
+ subTree = undefined;
478
+ }
479
+ continue;
480
+ }
481
+ return undefined;
482
+ }
483
+ if (Object.hasOwn(subTree, part)) {
253
484
  field = subTree[part];
254
- subTree =
255
- 'children' in field
256
- ? field.children
257
- : 'items' in field && 'children' in field.items
258
- ? field.items.children
259
- : undefined;
485
+ if (field.type === 'object') {
486
+ subTree = field.children;
487
+ }
488
+ else if (field.type === 'array') {
489
+ if (field.items.type === 'object') {
490
+ subTree = field.items.children;
491
+ }
492
+ else if (field.items.type === 'union') {
493
+ subTree = undefined;
494
+ field = field.items;
495
+ }
496
+ else {
497
+ subTree = undefined;
498
+ }
499
+ }
500
+ else if (field.type === 'union') {
501
+ subTree = undefined;
502
+ }
503
+ else {
504
+ subTree = undefined;
505
+ }
260
506
  }
261
507
  else {
262
- return undefined;
508
+ if (field?.type === 'union') {
509
+ let found;
510
+ for (const child of field.children) {
511
+ if (child.type === 'object' &&
512
+ Object.hasOwn(child.children, part)) {
513
+ found = child.children[part];
514
+ break;
515
+ }
516
+ }
517
+ if (!found)
518
+ return undefined;
519
+ field = found;
520
+ if (field.type === 'object') {
521
+ subTree = field.children;
522
+ }
523
+ else {
524
+ subTree = undefined;
525
+ }
526
+ }
527
+ else {
528
+ return undefined;
529
+ }
263
530
  }
264
531
  }
265
532
  return field;
@@ -269,6 +536,7 @@ export class ConfigValidator {
269
536
  *
270
537
  * @return {Record<string, any>} object of default values
271
538
  */
539
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
272
540
  generateDefault = (options) => {
273
541
  const valueTree = this.buildDefaultsForSchema(this.schema);
274
542
  if (options?.validate) {
@@ -278,6 +546,7 @@ export class ConfigValidator {
278
546
  };
279
547
  // Builds default values for a schema subtree (objects and arrays), recursively
280
548
  buildDefaultsForSchema = (schema) => {
549
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
281
550
  const defaults = Object.create(null);
282
551
  for (const key of Object.keys(schema)) {
283
552
  const field = schema[key];
@@ -305,10 +574,8 @@ export class ConfigValidator {
305
574
  }
306
575
  }
307
576
  }
308
- else {
309
- if (field.default != undefined) {
310
- defaults[key] = field.default;
311
- }
577
+ else if (field.type !== 'union' && field.default != undefined) {
578
+ defaults[key] = field.default;
312
579
  }
313
580
  }
314
581
  return defaults;
@@ -320,7 +587,6 @@ export class ConfigValidator {
320
587
  * @return {string}
321
588
  */
322
589
  generateTSTypes = (name) => {
323
- const errorPreamble = (path) => `TypeScript type generation failed for "${path.join('.')}" field`;
324
590
  const types = [];
325
591
  const emittedTypeNames = new Set();
326
592
  const stack = [
@@ -334,73 +600,159 @@ export class ConfigValidator {
334
600
  ];
335
601
  // Traverses the schema object tree depth first
336
602
  while (stack.length > 0) {
337
- const { subSchema, children, parentPath, typeName, attributes } = stack.at(-1);
338
- let path = parentPath;
339
- try {
340
- // if a subtree's processing is finished go to the previous level
341
- if (children.length == 0) {
342
- if (!emittedTypeNames.has(typeName)) {
343
- types.push(this.genTSInterface(typeName, attributes));
344
- emittedTypeNames.add(typeName);
345
- }
346
- stack.pop();
347
- continue;
603
+ const current = stack[stack.length - 1];
604
+ const { subSchema, children, parentPath, typeName, attributes } = current;
605
+ if (children.length === 0) {
606
+ if (!emittedTypeNames.has(typeName)) {
607
+ types.push(this.genTSInterface(typeName, attributes));
608
+ emittedTypeNames.add(typeName);
348
609
  }
349
- const childName = children.pop();
350
- path = parentPath.concat([childName]);
351
- const field = subSchema[childName];
352
- // if a node/field is of type object and thus is a subtree, add it to
353
- // the stack to be traversed later. Otherwise it's a leaf and needs no
354
- // traversal.
355
- const childNameQuoted = childName.includes('-')
356
- ? `"${childName}"`
357
- : childName;
358
- if (field.type === 'object' ||
359
- (field.type === 'array' && field.items.type === 'object')) {
360
- // Create unique type name from schema path (supports hyphens: bitcoin-runes -> BitcoinRunes)
361
- const pathParts = path;
362
- const childTypeName = pathParts
363
- .map((part) => toPascalCase(part))
364
- .join('');
365
- const children = field.type === 'array' && field.items.type === 'object'
366
- ? field.items.children
367
- : field.type === 'object'
368
- ? field.children
369
- : {};
610
+ stack.pop();
611
+ continue;
612
+ }
613
+ const childName = children.pop();
614
+ const field = subSchema[childName];
615
+ const path = parentPath.concat(childName);
616
+ // if a node/field is of type object and thus is a subtree, add it to
617
+ // the stack to be traversed later. Otherwise it's a leaf and needs no
618
+ // traversal.
619
+ const childNameQuoted = childName.includes('-')
620
+ ? `"${childName}"`
621
+ : childName;
622
+ if (field.type === 'union') {
623
+ const unionTypes = [];
624
+ field.children.forEach((child, index) => {
625
+ if (child.type === 'union') {
626
+ child.children.forEach((nestedChild) => {
627
+ unionTypes.push(nestedChild.type);
628
+ });
629
+ return;
630
+ }
631
+ if (child.type === 'object') {
632
+ const optionPath = path.concat([`Option${index}`]);
633
+ const typeName = optionPath.map(toPascalCase).join('');
634
+ stack.push({
635
+ subSchema: child.children,
636
+ children: Object.keys(child.children).reverse(),
637
+ parentPath: optionPath,
638
+ typeName,
639
+ attributes: [],
640
+ });
641
+ unionTypes.push(typeName);
642
+ return;
643
+ }
644
+ if (child.type === 'array') {
645
+ if (child.items.type === 'object') {
646
+ const itemPath = path.concat([`Item${index}`]);
647
+ const typeName = itemPath.map(toPascalCase).join('');
648
+ stack.push({
649
+ subSchema: child.items.children,
650
+ children: Object.keys(child.items.children).reverse(),
651
+ parentPath: itemPath,
652
+ typeName,
653
+ attributes: [],
654
+ });
655
+ unionTypes.push(`${typeName}[]`);
656
+ }
657
+ else {
658
+ unionTypes.push(`${child.items.type}[]`);
659
+ }
660
+ return;
661
+ }
662
+ unionTypes.push(child.type);
663
+ });
664
+ attributes.push([childNameQuoted, unionTypes.join(' | ')]);
665
+ continue;
666
+ }
667
+ if (field.type === 'object') {
668
+ const typeName = path.map(toPascalCase).join('');
669
+ stack.push({
670
+ subSchema: field.children,
671
+ children: Object.keys(field.children).reverse(),
672
+ parentPath: path,
673
+ typeName,
674
+ attributes: [],
675
+ });
676
+ attributes.push([childNameQuoted, typeName]);
677
+ continue;
678
+ }
679
+ if (field.type === 'array') {
680
+ if (field.items.type === 'object') {
681
+ const typeName = path.map(toPascalCase).join('');
370
682
  stack.push({
371
- subSchema: children,
372
- children: Object.keys(children).reverse(),
683
+ subSchema: field.items.children,
684
+ children: Object.keys(field.items.children).reverse(),
373
685
  parentPath: path,
374
- typeName: childTypeName,
686
+ typeName,
375
687
  attributes: [],
376
688
  });
377
- attributes.push([
378
- childNameQuoted,
379
- field.type === 'array' ? `${childTypeName}[]` : childTypeName,
380
- ]);
689
+ attributes.push([childNameQuoted, `${typeName}[]`]);
381
690
  }
382
- else {
383
- let fieldType = field.type === 'array' ? field.items.type : field.type;
384
- let isOptional = true;
385
- if (field.type !== 'array' && field.validations != undefined) {
386
- for (const validation of field.validations) {
387
- if (field.type === 'string' && 'choices' in validation) {
388
- fieldType = validation.choices.map((c) => `'${c}'`).join(' | ');
691
+ else if (field.items.type === 'union') {
692
+ const unionTypes = [];
693
+ field.items.children.forEach((child, index) => {
694
+ if (child.type === 'string' ||
695
+ child.type === 'number' ||
696
+ child.type === 'boolean') {
697
+ unionTypes.push(child.type);
698
+ return;
699
+ }
700
+ if (child.type === 'object') {
701
+ const optionPath = path.concat([`Option${index}`]);
702
+ const typeName = optionPath.map(toPascalCase).join('');
703
+ stack.push({
704
+ subSchema: child.children,
705
+ children: Object.keys(child.children).reverse(),
706
+ parentPath: optionPath,
707
+ typeName,
708
+ attributes: [],
709
+ });
710
+ unionTypes.push(typeName);
711
+ return;
712
+ }
713
+ if (child.type === 'array') {
714
+ if (child.items.type === 'object') {
715
+ const itemPath = path.concat([`Option${index}Item`]);
716
+ const typeName = itemPath.map(toPascalCase).join('');
717
+ stack.push({
718
+ subSchema: child.items.children,
719
+ children: Object.keys(child.items.children).reverse(),
720
+ parentPath: itemPath,
721
+ typeName,
722
+ attributes: [],
723
+ });
724
+ unionTypes.push(`${typeName}[]`);
389
725
  }
390
- if ('required' in validation && !('when' in validation)) {
391
- isOptional = false;
726
+ else {
727
+ unionTypes.push(`${child.items.type}[]`);
392
728
  }
729
+ return;
393
730
  }
394
- }
395
- attributes.push([
396
- isOptional ? `${childNameQuoted}?` : childNameQuoted,
397
- field.type === 'array' ? `${fieldType}[]` : fieldType,
398
- ]);
731
+ unionTypes.push(child.type);
732
+ });
733
+ attributes.push([childNameQuoted, `(${unionTypes.join(' | ')})[]`]);
734
+ }
735
+ else {
736
+ attributes.push([childNameQuoted, `${field.items.type}[]`]);
399
737
  }
738
+ continue;
400
739
  }
401
- catch (error) {
402
- throw new Error(`${errorPreamble(path)}: ${error.message}`);
740
+ let fieldType = field.type;
741
+ let isOptional = true;
742
+ if (field.validations) {
743
+ for (const validation of field.validations) {
744
+ if (field.type === 'string' && 'choices' in validation) {
745
+ fieldType = validation.choices.map((c) => `'${c}'`).join(' | ');
746
+ }
747
+ if ('required' in validation && !('when' in validation)) {
748
+ isOptional = false;
749
+ }
750
+ }
403
751
  }
752
+ attributes.push([
753
+ isOptional ? `${childNameQuoted}?` : childNameQuoted,
754
+ fieldType,
755
+ ]);
404
756
  }
405
757
  return types.reverse().join('\n\n') + '\n';
406
758
  };
@@ -423,6 +775,7 @@ export class ConfigValidator {
423
775
  * @param {string} level
424
776
  * @return {Record<string, any>}
425
777
  */
778
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
426
779
  getConfigForLevel(config, level) {
427
780
  const confLevels = ConfigValidator.getNodeConfigLevels(config);
428
781
  const levelIndex = confLevels.indexOf(level);
@@ -544,7 +897,9 @@ export class ConfigValidator {
544
897
  * @param {string} level output node-config file level
545
898
  * @param {string} format the format of the output file
546
899
  */
547
- validateAndWriteConfig = (configObj, config, level, format) => {
900
+ validateAndWriteConfig = (
901
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
902
+ configObj, config, level, format) => {
548
903
  const confLevels = ConfigValidator.getNodeConfigLevels(config).filter((l) => l !== 'custom-environment-variables');
549
904
  const levelIndex = confLevels.indexOf(level);
550
905
  if (levelIndex === -1) {
@@ -590,4 +945,4 @@ export class ConfigValidator {
590
945
  }
591
946
  };
592
947
  }
593
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSxxQ0FBcUMsQ0FBQztBQUc3QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLHlCQUF5QixFQUN6QixZQUFZLEdBQ2IsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBRW5ELE1BQU0sT0FBTyxlQUFlO0lBQ047SUFBcEIsWUFBb0IsTUFBb0I7UUFBcEIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUN0QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjLENBQUMsTUFBMkI7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsTUFBTSxFQUNOLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUN6QyxNQUFNLENBQ1AsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLGlCQUFpQixDQUN2QixNQUEyQixFQUMzQixTQUE4QixFQUM5QixTQUF1QixFQUN2QixJQUFjO1FBRWQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFtQixFQUFFLEVBQUUsQ0FDNUMsaUNBQWlDLElBQUks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LEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEtBQUssV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVyRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ29uZmlnLCBJQ29uZmlnU291cmNlIH0gZnJvbSAnY29uZmlnJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIHByb3BlcnR5VmFsaWRhdG9ycyxcbiAgc3VwcG9ydGVkVHlwZXMsXG59IGZyb20gJy4vc2NoZW1hL1ZhbGlkYXRvcnMvZmllbGRQcm9wZXJ0aWVzJztcbmltcG9ydCB7IENvbmZpZ0ZpZWxkLCBDb25maWdTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS90eXBlcy9maWVsZHMnO1xuaW1wb3J0IHsgV2hlbiB9IGZyb20gJy4vc2NoZW1hL3R5cGVzL3ZhbGlkYXRpb25zJztcbmltcG9ydCB7XG4gIGdldFNvdXJjZU5hbWUsXG4gIGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMsXG4gIHRvUGFzY2FsQ2FzZSxcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB2YWx1ZVZhbGlkYXRpb25zLCB2YWx1ZVZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbHVlL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IEpzb25CaWdJbnQgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNjaGVtYTogQ29uZmlnU2NoZW1hKSB7XG4gICAgdGhpcy52YWxpZGF0ZVNjaGVtYSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGUgcGFzc2VkIGNvbmZpZyBhZ2FpbnN0IHRoZSBpbnN0YW5jZSdzIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHsgdHlwZTogJ29iamVjdCcsIGNoaWxkcmVuOiB0aGlzLnNjaGVtYSB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgY29uZmlnLCB0aGlzLnNjaGVtYSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYXZlcnNlcyBhbmQgdmFsaWRhdGVzIGEgc3ViY29uZmlnIHVzaW5nIHRoZSBzdWJzY2hlbWFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzdWJDb25maWdcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHN1YlNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBtZW1iZXJvZiBDb25maWdWYWxpZGF0b3JcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTdWJDb25maWcoXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHN1YkNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYGNvbmZpZyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKSkge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5jb25jYXQoW25hbWVdKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdWJDb25maWcgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViQ29uZmlnLCBuYW1lKSkge1xuICAgICAgICAgIHZhbHVlID0gc3ViQ29uZmlnW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKHZhbHVlLCBmaWVsZCwgY29uZmlnKTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCB0cmF2ZXJzZSBpdFxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgdmFsdWUsIGZpZWxkLmNoaWxkcmVuLCBjaGlsZFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgaXRlbSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICB7IFtuYW1lXTogZmllbGQuaXRlbXMgfSxcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yUHJlYW1ibGUoY2hpbGRQYXRoKX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0cyBhbiBvYmplY3QncyBzcGVjaWZpYyBzdWJ0cmVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKiBAcGFyYW0geyp9IG5ld1ZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHJldHVybiB7Kn1cbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgc3RhdGljIG1vZGlmeU9iamVjdChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5ld1ZhbHVlOiBhbnksIHBhdGg6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHZhbHVlOiBhbnkgPSBvYmo7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGF0aC5zbGljZSgwLCAtMSkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEtleSA9IHBhdGguYXQoLTEpO1xuICAgIGlmIChsYXN0S2V5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVbbGFzdEtleV0gPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdmFsaWRhdGVzIGEgdmFsdWUgaW4gY29uZmlnIG9iamVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29uZmlnRmllbGR9IGZpZWxkIHRoZSBmaWVsZCBzcGVjaWZpY2F0aW9uIGluIHNjaGVtYVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZyB0aGUgY29uZmlnIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZhbHVlID0gKFxuICAgIHZhbHVlOiBhbnksXG4gICAgZmllbGQ6IENvbmZpZ0ZpZWxkLFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSA9PiB7XG4gICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHZhbHVlID0gQmlnSW50KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YWx1ZVZhbGlkYXRvcnNbZmllbGQudHlwZV0odmFsdWUsIGZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC50eXBlICE9PSAnb2JqZWN0JyAmJlxuICAgICAgZmllbGQudHlwZSAhPT0gJ2FycmF5JyAmJlxuICAgICAgZmllbGQudmFsaWRhdGlvbnNcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmtleXModmFsaWRhdGlvbikuZmlsdGVyKFxuICAgICAgICAgIChrZXkpID0+IGtleSAhPT0gJ3doZW4nICYmIGtleSAhPT0gJ2Vycm9yJyxcbiAgICAgICAgKVswXTtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXSwgbmFtZSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXVtuYW1lXSh2YWx1ZSwgdmFsaWRhdGlvbiwgY29uZmlnLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbi5lcnJvciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHZhbGlkYXRpb24uZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBkZXRlcm1pbmVzIGlmIGEgd2hlbiBjbGF1c2UgaW4gdmFsaWRhdGlvbnMgc2VjdGlvbiBvZiBhIHNjaGVtYSBmaWVsZCBpc1xuICAgKiBzYXRpc2ZpZWRcbiAgICpcbiAgICogQHBhcmFtIHtXaGVufSB3aGVuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBwdWJsaWMgaXNXaGVuVHJ1ZSA9ICh3aGVuOiBXaGVuLCBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBwYXRoUGFydHMgPSB3aGVuLnBhdGguc3BsaXQoJy4nKTtcbiAgICBjb25zdCB2YWx1ZSA9IENvbmZpZ1ZhbGlkYXRvci52YWx1ZUF0KGNvbmZpZywgcGF0aFBhcnRzKTtcbiAgICByZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB3aGVuLnZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSB2YWx1ZSBhdCBzcGVjaWZpZWQgcGF0aCBpbiBjb25maWcgb2JqZWN0XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgc3RhdGljIHZhbHVlQXQgPSAoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmdbXSkgPT4ge1xuICAgIGxldCB2YWx1ZTogYW55ID0gY29uZmlnO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHRoaXMuc2NoZW1hIGFuZCB0aHJvd3MgZXhjZXB0aW9uIGlmIGFueSBlcnJvcnMgZm91bmRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWEgPSAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYFNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcblxuICAgIGNvbnN0IHN0YWNrOiBBcnJheTx7XG4gICAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYTtcbiAgICAgIHBhcmVudFBhdGg6IEFycmF5PHN0cmluZz47XG4gICAgfT4gPSBbXG4gICAgICB7XG4gICAgICAgIHN1YlNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgIHBhcmVudFBhdGg6IFtdLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gVHJhdmVyc2VzIHRoZSBzY2hlbWEgb2JqZWN0IHRyZWUgZGVwdGggZmlyc3QgYW5kIHZhbGlkYXRlIGZpZWxkc1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IHN1YlNjaGVtYSwgcGFyZW50UGF0aCB9ID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICAvLyBwcm9jZXNzIGNoaWxkcmVuIG9mIGN1cnJlbnQgb2JqZWN0IGZpZWxkXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KFtuYW1lXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZ05hbWUobmFtZSk7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbbmFtZV07XG5cbiAgICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd0eXBlJykgfHwgdHlwZW9mIGZpZWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBldmVyeSBzY2hlbWEgZmllbGQgbXVzdCBoYXZlIGEgXCJ0eXBlXCIgcHJvcGVydHkgb2YgdHlwZSBcInN0cmluZ1wiYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIFwiJHtmaWVsZC50eXBlfVwiYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVNjaGVtYUZpZWxkKGZpZWxkKTtcblxuICAgICAgICAgIC8vIGlmIHRoZSBjaGlsZCBpcyBhbiBvYmplY3QgZmllbGQgaXRzZWxmIGFkZCBpdCB0byBzdGFjayBmb3JcbiAgICAgICAgICAvLyBwcm9jZXNzaW5nXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogeyBbbmFtZV06IGZpZWxkLml0ZW1zIH0sXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JQcmVhbWJsZShwYXRoKX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIGNvbmZpZyBrZXkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ05hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb25maWcga2V5IG5hbWUgY2FuIG5vdCBjb250YWluIHRoZSAnLicgY2hhcmFjdGVyYCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgcGFzc2VkIHNjaGVtYSBmaWVsZCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdGaWVsZH0gZmllbGRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWFGaWVsZCA9IChmaWVsZDogQ29uZmlnRmllbGQpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzLmFsbCwga2V5KSAmJlxuICAgICAgICAhKFxuICAgICAgICAgICFbJ29iamVjdCcsICdhcnJheSddLmluY2x1ZGVzKGZpZWxkLnR5cGUpICYmXG4gICAgICAgICAgT2JqZWN0Lmhhc093bihwcm9wZXJ0eVZhbGlkYXRvcnMucHJpbWl0aXZlLCBrZXkpXG4gICAgICAgICkgJiZcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzW2ZpZWxkLnR5cGVdLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgZmllbGQgaGFzIHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLmFsbCkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLnR5cGUgIT09ICdvYmplY3QnICYmIGZpZWxkLnR5cGUgIT09ICdhcnJheScpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLnByaW1pdGl2ZSkpIHtcbiAgICAgICAgdmFsaWRhdG9yKGZpZWxkLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9yc1tmaWVsZC50eXBlXSkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgZmllbGQgY29ycmVzcG9uZGluZyB0byBhIHBhdGggaW4gc2NoZW1hIHRyZWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsoQ29uZmlnRmllbGQgfCB1bmRlZmluZWQpfSByZXR1cm5zIHVuZGVmaW5lZCBpZiBmaWVsZCBpcyBub3QgZm91bmRcbiAgICovXG4gIGdldFNjaGVtYUZpZWxkID0gKHBhdGg6IHN0cmluZ1tdKTogQ29uZmlnRmllbGQgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBzdWJUcmVlOiBDb25maWdTY2hlbWEgfCB1bmRlZmluZWQgPSB0aGlzLnNjaGVtYTtcbiAgICBsZXQgZmllbGQ6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoKSB7XG4gICAgICBpZiAoc3ViVHJlZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bihzdWJUcmVlLCBwYXJ0KSkge1xuICAgICAgICBmaWVsZCA9IHN1YlRyZWVbcGFydF07XG4gICAgICAgIHN1YlRyZWUgPVxuICAgICAgICAgICdjaGlsZHJlbicgaW4gZmllbGRcbiAgICAgICAgICAgID8gZmllbGQuY2hpbGRyZW5cbiAgICAgICAgICAgIDogJ2l0ZW1zJyBpbiBmaWVsZCAmJiAnY2hpbGRyZW4nIGluIGZpZWxkLml0ZW1zXG4gICAgICAgICAgICAgID8gZmllbGQuaXRlbXMuY2hpbGRyZW5cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIGRlZmF1bHQgdmFsdWVzIGZyb20gYSBzY2hlbWFcbiAgICpcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqZWN0IG9mIGRlZmF1bHQgdmFsdWVzXG4gICAqL1xuICBnZW5lcmF0ZURlZmF1bHQgPSAob3B0aW9ucz86IHsgdmFsaWRhdGU/OiBib29sZWFuIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICBjb25zdCB2YWx1ZVRyZWUgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEodGhpcy5zY2hlbWEpO1xuICAgIGlmIChvcHRpb25zPy52YWxpZGF0ZSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZyh2YWx1ZVRyZWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9O1xuXG4gIC8vIEJ1aWxkcyBkZWZhdWx0IHZhbHVlcyBmb3IgYSBzY2hlbWEgc3VidHJlZSAob2JqZWN0cyBhbmQgYXJyYXlzKSwgcmVjdXJzaXZlbHlcbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRzRm9yU2NoZW1hID0gKFxuICAgIHNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICBjb25zdCBkZWZhdWx0czogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKSkge1xuICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjaGlsZERlZmF1bHRzID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKGZpZWxkLmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNoaWxkRGVmYXVsdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZWZhdWx0c1trZXldID0gY2hpbGREZWZhdWx0cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmICgoZmllbGQgYXMgYW55KS5kZWZhdWx0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgaXRlbURlZmF1bHRzID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKFxuICAgICAgICAgICAgICBmaWVsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gKGZpZWxkIGFzIGFueSkuZGVmYXVsdC5tYXAoKGVsZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZWxlbSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGVsZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZWxlbSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbURlZmF1bHRzLCAuLi5lbGVtIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IChmaWVsZCBhcyBhbnkpLmRlZmF1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGZpZWxkIGFzIGFueSkuZGVmYXVsdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWZhdWx0c1trZXldID0gKGZpZWxkIGFzIGFueSkuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlcyBjb21wYXRpYmxlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZvciB0aGlzIGluc3RhbmNlJ3Mgc2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHJvb3QgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZW5lcmF0ZVRTVHlwZXMgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBlcnJvclByZWFtYmxlID0gKHBhdGg6IEFycmF5PHN0cmluZz4pID0+XG4gICAgICBgVHlwZVNjcmlwdCB0eXBlIGdlbmVyYXRpb24gZmFpbGVkIGZvciBcIiR7cGF0aC5qb2luKCcuJyl9XCIgZmllbGRgO1xuXG4gICAgY29uc3QgdHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBlbWl0dGVkVHlwZU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PHtcbiAgICAgIHN1YlNjaGVtYTogQ29uZmlnU2NoZW1hO1xuICAgICAgY2hpbGRyZW46IHN0cmluZ1tdO1xuICAgICAgcGFyZW50UGF0aDogQXJyYXk8c3RyaW5nPjtcbiAgICAgIHR5cGVOYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPjtcbiAgICB9PiA9IFtcbiAgICAgIHtcbiAgICAgICAgc3ViU2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgcGFyZW50UGF0aDogW10sXG4gICAgICAgIHR5cGVOYW1lOiBuYW1lLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgc3ViU2NoZW1hLCBjaGlsZHJlbiwgcGFyZW50UGF0aCwgdHlwZU5hbWUsIGF0dHJpYnV0ZXMgfSA9XG4gICAgICAgIHN0YWNrLmF0KC0xKSE7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nW10gPSBwYXJlbnRQYXRoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWYgYSBzdWJ0cmVlJ3MgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZCBnbyB0byB0aGUgcHJldmlvdXMgbGV2ZWxcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKCFlbWl0dGVkVHlwZU5hbWVzLmhhcyh0eXBlTmFtZSkpIHtcbiAgICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5nZW5UU0ludGVyZmFjZSh0eXBlTmFtZSwgYXR0cmlidXRlcykpO1xuICAgICAgICAgICAgZW1pdHRlZFR5cGVOYW1lcy5hZGQodHlwZU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZSA9IGNoaWxkcmVuLnBvcCgpITtcbiAgICAgICAgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbY2hpbGROYW1lXTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCBhZGQgaXQgdG9cbiAgICAgICAgLy8gdGhlIHN0YWNrIHRvIGJlIHRyYXZlcnNlZCBsYXRlci4gT3RoZXJ3aXNlIGl0J3MgYSBsZWFmIGFuZCBuZWVkcyBub1xuICAgICAgICAvLyB0cmF2ZXJzYWwuXG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZVF1b3RlZCA9IGNoaWxkTmFtZS5pbmNsdWRlcygnLScpXG4gICAgICAgICAgPyBgXCIke2NoaWxkTmFtZX1cImBcbiAgICAgICAgICA6IGNoaWxkTmFtZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgKGZpZWxkLnR5cGUgPT09ICdhcnJheScgJiYgZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENyZWF0ZSB1bmlxdWUgdHlwZSBuYW1lIGZyb20gc2NoZW1hIHBhdGggKHN1cHBvcnRzIGh5cGhlbnM6IGJpdGNvaW4tcnVuZXMgLT4gQml0Y29pblJ1bmVzKVxuICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGg7XG4gICAgICAgICAgY29uc3QgY2hpbGRUeXBlTmFtZSA9IHBhdGhQYXJ0c1xuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gdG9QYXNjYWxDYXNlKHBhcnQpKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPVxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyAmJiBmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICA/IGZpZWxkLml0ZW1zLmNoaWxkcmVuXG4gICAgICAgICAgICAgIDogZmllbGQudHlwZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICA/IGZpZWxkLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgOiB7fTtcblxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhjaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBjaGlsZFR5cGVOYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW1xuICAgICAgICAgICAgY2hpbGROYW1lUXVvdGVkLFxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyA/IGAke2NoaWxkVHlwZU5hbWV9W11gIDogY2hpbGRUeXBlTmFtZSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZmllbGRUeXBlOiBzdHJpbmcgPVxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyA/IGZpZWxkLml0ZW1zLnR5cGUgOiBmaWVsZC50eXBlO1xuICAgICAgICAgIGxldCBpc09wdGlvbmFsID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZmllbGQudHlwZSAhPT0gJ2FycmF5JyAmJiBmaWVsZC52YWxpZGF0aW9ucyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0cmluZycgJiYgJ2Nob2ljZXMnIGluIHZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSB2YWxpZGF0aW9uLmNob2ljZXMubWFwKChjKSA9PiBgJyR7Y30nYCkuam9pbignIHwgJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJ3JlcXVpcmVkJyBpbiB2YWxpZGF0aW9uICYmICEoJ3doZW4nIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChbXG4gICAgICAgICAgICBpc09wdGlvbmFsID8gYCR7Y2hpbGROYW1lUXVvdGVkfT9gIDogY2hpbGROYW1lUXVvdGVkLFxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyA/IGAke2ZpZWxkVHlwZX1bXWAgOiBmaWVsZFR5cGUsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yUHJlYW1ibGUocGF0aCl9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzLnJldmVyc2UoKS5qb2luKCdcXG5cXG4nKSArICdcXG4nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZXMgYSBUeXBlU2NyaXB0IGludGVyZmFjZSBkZWZpbml0aW9uIGZvciBwYXNzZWQgbmFtZSBhbmQgYXR0cmlidXRlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5PFtzdHJpbmcsIHN0cmluZ10+fSBhdHRyaWJ1dGVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHByaXZhdGUgZ2VuVFNJbnRlcmZhY2UgPSAoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGF0dHJpYnV0ZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+LFxuICApOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBgZXhwb3J0IGludGVyZmFjZSAke25hbWV9IHtcbiAgJHthdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gYCR7YXR0clswXX06ICR7YXR0clsxXX07YCkuam9pbignXFxuICAnKX1cbn1gO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgY2hhcmFjdGVyaXN0aWMgb2JqZWN0IGZvciB2YWx1ZXMgYXQgYSBzcGVjaWZpYyBub2RlIGNvbmZpZyBsZXZlbFxuICAgKlxuICAgKiBAcGFyYW0ge0lDb25maWd9IGNvbmZpZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICovXG4gIGdldENvbmZpZ0ZvckxldmVsKGNvbmZpZzogSUNvbmZpZywgbGV2ZWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IGNvbmZMZXZlbHMgPSBDb25maWdWYWxpZGF0b3IuZ2V0Tm9kZUNvbmZpZ0xldmVscyhjb25maWcpO1xuICAgIGNvbnN0IGxldmVsSW5kZXggPSBjb25mTGV2ZWxzLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChsZXZlbEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIFwiJHtsZXZlbH1cIiBsZXZlbCBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gbGV2ZWxzYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGhpZ2hlckxldmVsU291cmNlcyA9IGNvbmZpZy51dGlsXG4gICAgICAuZ2V0Q29uZmlnU291cmNlcygpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoc291cmNlKSA9PiBjb25mTGV2ZWxzLmluZGV4T2YoZ2V0U291cmNlTmFtZShzb3VyY2UpKSA+IGxldmVsSW5kZXgsXG4gICAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbFNvdXJjZSA9IGNvbmZpZy51dGlsXG4gICAgICAuZ2V0Q29uZmlnU291cmNlcygpXG4gICAgICAuZmlsdGVyKChzb3VyY2UpID0+IGdldFNvdXJjZU5hbWUoc291cmNlKSA9PT0gbGV2ZWwpXG4gICAgICAuYXQoMCk7XG4gICAgY29uc3QgbG93ZXJMZXZlbFNvdXJjZXMgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNvdXJjZSkgPT4gY29uZkxldmVscy5pbmRleE9mKGdldFNvdXJjZU5hbWUoc291cmNlKSkgPCBsZXZlbEluZGV4LFxuICAgICAgKTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0XG4gICAgY29uc3QgdmFsdWVUcmVlID0gQ29uZmlnVmFsaWRhdG9yLnByb2Nlc3NDb25maWdGb3JMZXZlbE5vZGUoXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIFtdLFxuICAgICAgaGlnaGVyTGV2ZWxTb3VyY2VzLFxuICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgKTtcblxuICAgIHJldHVybiB2YWx1ZVRyZWU7XG4gIH1cblxuICAvKipcbiAgICp0cmF2ZXJzZXMgdGhlIGNvbmZpZyBzY2hlbWEgZGVwdGggZmlyc3QgdG8gcHJvZHVjZSBjaGFyYWN0ZXJpc3RpYyBvYmplY3RcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge0NvbmZpZ1NjaGVtYX0gc2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHBhcmFtIHtJQ29uZmlnU291cmNlW119IGhpZ2hlckxldmVsU291cmNlc1xuICAgKiBAcGFyYW0geyhJQ29uZmlnU291cmNlIHwgdW5kZWZpbmVkKX0gY3VycmVudExldmVsU291cmNlXG4gICAqIEBwYXJhbSB7SUNvbmZpZ1NvdXJjZVtdfSBsb3dlckxldmVsU291cmNlc1xuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKiBAbWVtYmVyb2YgQ29uZmlnVmFsaWRhdG9yXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgIHNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGhpZ2hlckxldmVsU291cmNlczogSUNvbmZpZ1NvdXJjZVtdLFxuICAgIGN1cnJlbnRMZXZlbFNvdXJjZTogSUNvbmZpZ1NvdXJjZSB8IHVuZGVmaW5lZCxcbiAgICBsb3dlckxldmVsU291cmNlczogSUNvbmZpZ1NvdXJjZVtdLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBjaGlsZE5hbWUgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2NoaWxkTmFtZV07XG4gICAgICAvLyBpZiBhIGZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGFuZCB0aHVzIGlzIGEgc3VidHJlZSwgcmVjdXJzZSBvbiBpdC5cbiAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgbGVhZiBhbmQgbmVlZHMgbm8gdHJhdmVyc2FsLlxuICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgICAgIGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnbGFiZWwnXSA9XG4gICAgICAgICAgZmllbGQubGFiZWwgIT0gdW5kZWZpbmVkID8gZmllbGQubGFiZWwgOiBudWxsO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydkZXNjcmlwdGlvbiddID1cbiAgICAgICAgICBmaWVsZC5kZXNjcmlwdGlvbiAhPSB1bmRlZmluZWQgPyBmaWVsZC5kZXNjcmlwdGlvbiA6IG51bGw7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ2RlZmF1bHQnXSA9IGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMoXG4gICAgICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWyd2YWx1ZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBbLi4uKGN1cnJlbnRMZXZlbFNvdXJjZSAhPSB1bmRlZmluZWQgPyBbY3VycmVudExldmVsU291cmNlXSA6IFtdKV0sXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydvdmVycmlkZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgbGlzdCBvZiBjb25maWcgc291cmNlcyB1c2VkIGJ5IG5vZGUgY29uZmlnIHBhY2thZ2UsIG9yZGVyZWQgZnJvbVxuICAgKiB0aGUgbG93ZXN0IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHJldHVybiAge3N0cmluZ1tdfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Tm9kZUNvbmZpZ0xldmVscyA9IChjb25maWc6IElDb25maWcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfQVBQX0lOU1RBTkNFJyk7XG4gICAgbGV0IGRlcGxveW1lbnQgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfRU5WJyk7XG4gICAgZGVwbG95bWVudCA9IGNvbmZpZy51dGlsLmdldEVudignTk9ERV9DT05GSUdfRU5WJyk7XG4gICAgY29uc3QgZnVsbEhvc3RuYW1lID0gY29uZmlnLnV0aWwuZ2V0RW52KCdIT1NUTkFNRScpO1xuICAgIGNvbnN0IHNob3J0SG9zdG5hbWUgPVxuICAgICAgZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCA/IGZ1bGxIb3N0bmFtZS5zcGxpdCgnLicpWzBdIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29uZmlnTGV2ZWxzID0gW1xuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgZGVmYXVsdC0ke2luc3RhbmNlfWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkID8gW2Ake2RlcGxveW1lbnR9YF0gOiBbXSksXG4gICAgICAuLi4oaW5zdGFuY2UgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7c2hvcnRIb3N0bmFtZX1gXSA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtzaG9ydEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7ZnVsbEhvc3RuYW1lfWBdIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtkZXBsb3ltZW50fWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZnVsbEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICBgbG9jYWxgLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtpbnN0YW5jZX1gXSA6IFtdKSxcbiAgICAgIC4uLihkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgJyROT0RFX0NPTkZJRycsXG4gICAgICAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgXTtcblxuICAgIHJldHVybiBjb25maWdMZXZlbHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIGNvbmZpZyBvYmplY3QgYW5kIHdyaXRlcyBpdCB0byB0aGUgbm9kZS1jb25maWcgZmlsZVxuICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdPYmpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsIG91dHB1dCBub2RlLWNvbmZpZyBmaWxlIGxldmVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGVcbiAgICovXG4gIHZhbGlkYXRlQW5kV3JpdGVDb25maWcgPSAoXG4gICAgY29uZmlnT2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbmZpZzogSUNvbmZpZyxcbiAgICBsZXZlbDogc3RyaW5nLFxuICAgIGZvcm1hdDogc3RyaW5nLFxuICApID0+IHtcbiAgICBjb25zdCBjb25mTGV2ZWxzID0gQ29uZmlnVmFsaWRhdG9yLmdldE5vZGVDb25maWdMZXZlbHMoY29uZmlnKS5maWx0ZXIoXG4gICAgICAobCkgPT4gbCAhPT0gJ2N1c3RvbS1lbnZpcm9ubWVudC12YXJpYWJsZXMnLFxuICAgICk7XG4gICAgY29uc3QgbGV2ZWxJbmRleCA9IGNvbmZMZXZlbHMuaW5kZXhPZihsZXZlbCk7XG4gICAgaWYgKGxldmVsSW5kZXggPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgWyR7bGV2ZWx9XSBsZXZlbCBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBsZXZlbHNgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdEaXIgPVxuICAgICAgcHJvY2Vzcy5lbnZbJ05PREVfQ09ORklHX0RJUiddICE9IHVuZGVmaW5lZFxuICAgICAgICA/IHByb2Nlc3MuZW52WydOT0RFX0NPTkZJR19ESVInXVxuICAgICAgICA6ICcuL2NvbmZpZyc7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGxldCBleHQgPSAnJztcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAnanNvbic6IHtcbiAgICAgICAgb3V0cHV0ID0gSnNvbkJpZ0ludC5zdHJpbmdpZnkoY29uZmlnT2JqKTtcbiAgICAgICAgZXh0ID0gJ2pzb24nO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3lhbWwnOiB7XG4gICAgICAgIG91dHB1dCA9IHlhbWwuZHVtcChjb25maWdPYmopO1xuICAgICAgICBleHQgPSAneWFtbCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgYCR7bGV2ZWx9LiR7ZXh0fWApO1xuICAgIGNvbnN0IGJhY2t1cFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBgJHtsZXZlbH0tYmFja3VwLiR7ZXh0fWApO1xuICAgIGNvbnN0IGNvbmZGaWxlRXhpc3RzID0gZnMuZXhpc3RzU3luYyhvdXRwdXRQYXRoKTtcbiAgICBpZiAoY29uZkZpbGVFeGlzdHMpIHtcbiAgICAgIGZzLnJlbmFtZVN5bmMob3V0cHV0UGF0aCwgYmFja3VwUGF0aCk7XG4gICAgfVxuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgb3V0cHV0KTtcblxuICAgIGNvbnN0IHVwZGF0ZWRDb25mT2JqID0gY29uZmlnLnV0aWwubG9hZEZpbGVDb25maWdzKCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZk9iaik7XG4gICAgICBmcy51bmxpbmtTeW5jKGJhY2t1cFBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKG91dHB1dFBhdGgpO1xuICAgICAgaWYgKGNvbmZGaWxlRXhpc3RzKSB7XG4gICAgICAgIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgb3V0cHV0UGF0aCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59XG4iXX0=
948
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sVUFBVSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVMxRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLFlBQVksR0FDYixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkUsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFlO0lBRTdCLFlBQW9CLE1BQW9CO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsR0FBUyxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLFVBQWtCLEVBQW1CLEVBQUU7UUFDeEQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFM0Qs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V0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVyRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ29uZmlnLCBJQ29uZmlnU291cmNlIH0gZnJvbSAnY29uZmlnJztcbmltcG9ydCBjb25maWcgZnJvbSAnY29uZmlnJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IEpzb25CaWdJbnQsIHsgSnNvbkJpZ0ludEZhY3RvcnkgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcblxuaW1wb3J0IHtcbiAgQ29uZmlnRmllbGQsXG4gIENvbmZpZ1NjaGVtYSxcbiAgVW5pb25GaWVsZCxcbiAgVmFsdWVUeXBlLFxufSBmcm9tICcuL3NjaGVtYS90eXBlcy9maWVsZHMnO1xuaW1wb3J0IHsgV2hlbiB9IGZyb20gJy4vc2NoZW1hL3R5cGVzL3ZhbGlkYXRpb25zJztcbmltcG9ydCB7XG4gIHByb3BlcnR5VmFsaWRhdG9ycyxcbiAgc3VwcG9ydGVkVHlwZXMsXG59IGZyb20gJy4vc2NoZW1hL1ZhbGlkYXRvcnMvZmllbGRQcm9wZXJ0aWVzJztcbmltcG9ydCB7XG4gIGdldFNvdXJjZU5hbWUsXG4gIGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMsXG4gIHRvUGFzY2FsQ2FzZSxcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB2YWx1ZVZhbGlkYXRpb25zLCB2YWx1ZVZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbHVlL3ZhbGlkYXRvcnMnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBzY2hlbWE6IENvbmZpZ1NjaGVtYTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNjaGVtYTogQ29uZmlnU2NoZW1hKSB7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy52YWxpZGF0ZVNjaGVtYSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgZmluYWwgY29uZmlndXJhdGlvbiBvYmplY3QgYnkgdHJhbnNmb3JtaW5nIGFuZCB2YWxpZGF0aW5nXG4gICAqXG4gICAqICBUIC0gVGhlIHR5cGUgb2YgdGhlIGZpbmFsIG5vcm1hbGl6ZWQgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgbm9ybWFsaXplZCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgYnVpbGRDb25maWdzID0gPFQ+KCk6IFQgPT4ge1xuICAgIGNvbnN0IHJhdyA9IGNvbmZpZy51dGlsLnRvT2JqZWN0KCk7XG4gICAgdGhpcy52YWxpZGF0ZUNvbmZpZyhyYXcpO1xuICAgIHJldHVybiByYXc7XG4gIH07XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBDb25maWdWYWxpZGF0b3IgZnJvbSBzY2hlbWEgZmlsZSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZnJvbUZpbGUgPSAoc2NoZW1hUGF0aDogc3RyaW5nKTogQ29uZmlnVmFsaWRhdG9yID0+IHtcbiAgICBjb25zdCByYXdTY2hlbWFEYXRhID0gZnMucmVhZEZpbGVTeW5jKHNjaGVtYVBhdGgsICd1dGYtOCcpO1xuXG4gICAgY29uc3QganNvbkJpZ0ludCA9IEpzb25CaWdJbnRGYWN0b3J5KHtcbiAgICAgIGFsd2F5c1BhcnNlQXNCaWc6IGZhbHNlLFxuICAgICAgdXNlTmF0aXZlQmlnSW50OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2NoZW1hID0ganNvbkJpZ0ludC5wYXJzZShyYXdTY2hlbWFEYXRhKTtcbiAgICByZXR1cm4gbmV3IENvbmZpZ1ZhbGlkYXRvcihzY2hlbWEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjcmVhdGUgQ29uZmlnVmFsaWRhdG9yIGZyb20gc2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7Q29uZmlnU2NoZW1hfSBzY2hlbWFcbiAgICovXG4gIHN0YXRpYyBmcm9tU2NoZW1hID0gKHNjaGVtYTogQ29uZmlnU2NoZW1hKTogQ29uZmlnVmFsaWRhdG9yID0+IHtcbiAgICByZXR1cm4gbmV3IENvbmZpZ1ZhbGlkYXRvcihzY2hlbWEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgdGhlIHBhc3NlZCBjb25maWcgYWdhaW5zdCB0aGUgaW5zdGFuY2UncyBzY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUoXG4gICAgICBjb25maWcsXG4gICAgICB7IHR5cGU6ICdvYmplY3QnLCBjaGlsZHJlbjogdGhpcy5zY2hlbWEgfSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIFtdLFxuICAgICk7XG5cbiAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgY29uZmlnLCB0aGlzLnNjaGVtYSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYXZlcnNlcyBhbmQgdmFsaWRhdGVzIGEgc3ViY29uZmlnIHVzaW5nIHRoZSBzdWJzY2hlbWFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzdWJDb25maWdcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHN1YlNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBtZW1iZXJvZiBDb25maWdWYWxpZGF0b3JcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTdWJDb25maWcoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdWJDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgc3ViU2NoZW1hOiBDb25maWdTY2hlbWEsXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYGNvbmZpZyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcblxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhzdWJTY2hlbWEpKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoLmNvbmNhdChbbmFtZV0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbbmFtZV07XG4gICAgICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHN1YkNvbmZpZyAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bihzdWJDb25maWcsIG5hbWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSBzdWJDb25maWdbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKHZhbHVlLCBmaWVsZCwgY29uZmlnLCBjaGlsZFBhdGgsIGNvbnRleHQpO1xuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCB0cmF2ZXJzZSBpdFxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBmaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbVBhdGggPSBjaGlsZFBhdGguY29uY2F0KFtTdHJpbmcoaSldKTtcblxuICAgICAgICAgICAgICBpZiAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKFxuICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgIGZpZWxkLml0ZW1zLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgaXRlbVBhdGgsXG4gICAgICAgICAgICAgICAgICB7IFtuYW1lXTogaXRlbSB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVTdWJDb25maWcoXG4gICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgICB7IFtuYW1lXTogaXRlbSB9LFxuICAgICAgICAgICAgICAgICAgeyBbbmFtZV06IGZpZWxkLml0ZW1zIH0sXG4gICAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVuaW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgZmllbGQuaXRlbXMsXG4gICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgICBpdGVtUGF0aCxcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICB7IFtuYW1lXTogaXRlbSB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIHByaW1pdGl2ZSBmaWVsZHNcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVmFsdWUoaXRlbSwgZmllbGQuaXRlbXMsIGNvbmZpZywgaXRlbVBhdGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgdmFsdWUsIGNoaWxkUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICB2YWx1ZSA9IHN1YkNvbmZpZ1tuYW1lXTtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlVW5pb25WYWx1ZSh2YWx1ZSwgZmllbGQsIGNvbmZpZywgY2hpbGRQYXRoLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke2Vycm9yUHJlYW1ibGUoY2hpbGRQYXRoKX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmF2ZXJzZXMgYW5kIHZhbGlkYXRlcyBhIHVuaW9uIHN1YmNvbmZpZyB1c2luZyB0aGUgc3Vic2NoZW1hXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge1VuaW9uRmllbGR9IGZpZWxkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnXG4gICAqIEBwYXJhbSB7Q29uZmlnU2NoZW1hfSBzdWJTY2hlbWFcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2hpbGRQYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVW5pb25WYWx1ZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHZhbHVlOiBhbnksXG4gICAgZmllbGQ6IFVuaW9uRmllbGQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2hpbGRQYXRoOiBzdHJpbmdbXSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSB7XG4gICAgbGV0IGlzTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUZpZWxkIG9mIGZpZWxkLmNoaWxkcmVuKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoYWN0aXZlRmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBhY3RpdmVGaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpc01hdGNoZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUZpZWxkLnR5cGUgPT09ICdhcnJheScgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdmFsdWVbaV07XG4gICAgICAgICAgICBjb25zdCBpdGVtUGF0aCA9IGNoaWxkUGF0aC5jb25jYXQoW1N0cmluZyhpKV0pO1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVTdWJDb25maWcoXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgYWN0aXZlRmllbGQuaXRlbXMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgaXRlbVBhdGgsXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlRmllbGQuaXRlbXMudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVW5pb25WYWx1ZShcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIGFjdGl2ZUZpZWxkLml0ZW1zLFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICBpdGVtUGF0aCxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVmFsdWUoXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBhY3RpdmVGaWVsZC5pdGVtcyxcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgaXRlbVBhdGgsXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQ29uZmlnVmFsaWRhdG9yLm1vZGlmeU9iamVjdChjb25maWcsIHZhbHVlLCBjaGlsZFBhdGgpO1xuICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlRmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVVbmlvblZhbHVlKFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBhY3RpdmVGaWVsZCxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaXNNYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlVmFsdWUodmFsdWUsIGFjdGl2ZUZpZWxkLCBjb25maWcsIGNoaWxkUGF0aCwgY29udGV4dCk7XG4gICAgICAgICAgaXNNYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNNYXRjaGVkKSBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gO1xuICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgIGBWYWx1ZSBmb3IgXCIke2NoaWxkUGF0aC5qb2luKCcuJyl9XCIgaGFzIHRoaXMgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfS5gLFxuICAgICAgICApO1xuICAgICAgICBpc01hdGNoZWQgPSBpc01hdGNoZWQgPT09IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgdmFsdWUgPVxuICAgICAgICB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IENvbmZpZ1ZhbGlkYXRvci52YWx1ZUF0KGNvbmZpZywgY2hpbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmtleXModmFsaWRhdGlvbikuZmlsdGVyKFxuICAgICAgICAgIChrZXkpID0+IGtleSAhPT0gJ3doZW4nICYmIGtleSAhPT0gJ2Vycm9yJyxcbiAgICAgICAgKVswXTtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXSwgbmFtZSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXVtuYW1lXShcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uLmVycm9yICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsaWRhdGlvbi5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc01hdGNoZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhbHVlIGZvciBcIiR7Y2hpbGRQYXRoLmpvaW4oJy4nKX1cIiBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHVuaW9uIHR5cGVzIGZvciB0aGlzIGVycm9yOiAke2Vycm9yTWVzc2FnZX0uIFBsZWFzZSBwcm92aWRlIGEgdmFsaWQgdmFsdWUuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldHMgYW4gb2JqZWN0J3Mgc3BlY2lmaWMgc3VidHJlZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHsqfSBuZXdWYWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEByZXR1cm4geyp9XG4gICAqIEBtZW1iZXJvZiBDb25maWdWYWxpZGF0b3JcbiAgICovXG4gIHN0YXRpYyBtb2RpZnlPYmplY3QoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgbmV3VmFsdWU6IFZhbHVlVHlwZSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGhbaV07XG4gICAgICBjb25zdCBpc0xhc3QgPSBpID09PSBwYXRoLmxlbmd0aCAtIDE7XG5cbiAgICAgIGlmIChpc0xhc3QpIHtcbiAgICAgICAgY3VycmVudFtrZXldID0gbmV3VmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY3VycmVudFtrZXldID09PSB1bmRlZmluZWQgfHwgY3VycmVudFtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdmFsaWRhdGVzIGEgdmFsdWUgaW4gY29uZmlnIG9iamVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29uZmlnRmllbGR9IGZpZWxkIHRoZSBmaWVsZCBzcGVjaWZpY2F0aW9uIGluIHNjaGVtYVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZyB0aGUgY29uZmlnIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZhbHVlID0gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdmFsdWU6IGFueSxcbiAgICBmaWVsZDogQ29uZmlnRmllbGQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSA9PiB7XG4gICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgKHZhbHVlID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgdmFsdWUgPCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZpZWxkIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBpcyBkZWNsYXJlZCBhcyBhIEJpZ0ludCwgYnV0IGEgTnVtYmVyIHdhcyBwcm92aWRlZCB3aXRoIGluc3VmZmljaWVudCBwcmVjaXNpb24uIFZhbHVlcyBleGNlZWRpbmcgOTAwNzE5OTI1NDc0MDk5MSBtdXN0IGJlIHN1cHBsaWVkIGFzIGEgc3RyaW5nIHRvIGVuc3VyZSBhY2N1cmFjeS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IEJpZ0ludCh2YWx1ZSk7XG4gICAgICAgICAgQ29uZmlnVmFsaWRhdG9yLm1vZGlmeU9iamVjdChjb25maWcsIHZhbHVlLCBwYXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBjb252ZXJ0ICR7dmFsdWV9IHRvIGEgQmlnSW50IGZvciBmaWVsZCBcIiR7cGF0aC5qb2luKCcuJyl9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRmllbGQgXCIke3BhdGguam9pbignLicpfVwiIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgc3VpdGFibGUgZm9ybWF0LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB2YWx1ZSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4gICAgICAgICAgdmFsdWUgPCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVmFsdWUgZm9yIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBpcyB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiBQbGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXIuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgcGF0aCk7XG4gICAgICB9XG4gICAgICB2YWx1ZVZhbGlkYXRvcnNbZmllbGQudHlwZV0odmFsdWUsIGZpZWxkKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAnb2JqZWN0JyAmJlxuICAgICAgZmllbGQudHlwZSAhPT0gJ2FycmF5JyAmJlxuICAgICAgZmllbGQudHlwZSAhPT0gJ3VuaW9uJyAmJlxuICAgICAgZmllbGQuZGVmYXVsdFxuICAgICkge1xuICAgICAgdmFsdWUgPSBmaWVsZC5kZWZhdWx0O1xuICAgICAgQ29uZmlnVmFsaWRhdG9yLm1vZGlmeU9iamVjdChjb25maWcsIGZpZWxkLmRlZmF1bHQsIHBhdGgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBmaWVsZC50eXBlICE9PSAnb2JqZWN0JyAmJlxuICAgICAgZmllbGQudHlwZSAhPT0gJ2FycmF5JyAmJlxuICAgICAgZmllbGQudHlwZSAhPT0gJ3VuaW9uJyAmJlxuICAgICAgZmllbGQudmFsaWRhdGlvbnNcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmtleXModmFsaWRhdGlvbikuZmlsdGVyKFxuICAgICAgICAgIChrZXkpID0+IGtleSAhPT0gJ3doZW4nICYmIGtleSAhPT0gJ2Vycm9yJyxcbiAgICAgICAgKVswXTtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXSwgbmFtZSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXVtuYW1lXShcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uLmVycm9yICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsaWRhdGlvbi5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGRldGVybWluZXMgaWYgYSB3aGVuIGNsYXVzZSBpbiB2YWxpZGF0aW9ucyBzZWN0aW9uIG9mIGEgc2NoZW1hIGZpZWxkIGlzXG4gICAqIHNhdGlzZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge1doZW59IHdoZW5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHB1YmxpYyBpc1doZW5UcnVlID0gKFxuICAgIHdoZW46IFdoZW4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgbGV0IHBhdGhQYXJ0cyA9IHdoZW4ucGF0aC5zcGxpdCgnLicpO1xuICAgIGlmIChjb250ZXh0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbG9jYWxWYWx1ZSA9IENvbmZpZ1ZhbGlkYXRvci52YWx1ZUF0KGNvbnRleHQsIHBhdGhQYXJ0cyk7XG4gICAgICBpZiAobG9jYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFZhbHVlID09PSB3aGVuLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IENvbmZpZ1ZhbGlkYXRvci52YWx1ZUF0KGNvbmZpZywgcGF0aFBhcnRzKTtcbiAgICByZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB3aGVuLnZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSB2YWx1ZSBhdCBzcGVjaWZpZWQgcGF0aCBpbiBjb25maWcgb2JqZWN0XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RhdGljIHZhbHVlQXQgPSAoY29uZmlnOiBhbnksIHBhdGg6IHN0cmluZ1tdKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gY29uZmlnO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKGtleSkpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IGl0ZW0/LltrZXldKS5maW5kKCh2KSA9PiB2ICE9PSB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKGtleSk7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZVtpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGlzLnNjaGVtYSBhbmQgdGhyb3dzIGV4Y2VwdGlvbiBpZiBhbnkgZXJyb3JzIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2NoZW1hID0gKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yUHJlYW1ibGUgPSAocGF0aDogQXJyYXk8c3RyaW5nPikgPT5cbiAgICAgIGBTY2hlbWEgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBmaWVsZGA7XG5cbiAgICBjb25zdCBzdGFjazogQXJyYXk8e1xuICAgICAgc3ViU2NoZW1hOiBDb25maWdTY2hlbWE7XG4gICAgICBwYXJlbnRQYXRoOiBBcnJheTxzdHJpbmc+O1xuICAgIH0+ID0gW1xuICAgICAge1xuICAgICAgICBzdWJTY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICBwYXJlbnRQYXRoOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0IGFuZCB2YWxpZGF0ZSBmaWVsZHNcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBzdWJTY2hlbWEsIHBhcmVudFBhdGggfSA9IHN0YWNrLnBvcCgpITtcblxuICAgICAgLy8gcHJvY2VzcyBjaGlsZHJlbiBvZiBjdXJyZW50IG9iamVjdCBmaWVsZFxuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHN1YlNjaGVtYSkucmV2ZXJzZSgpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBwYXJlbnRQYXRoLmNvbmNhdChbbmFtZV0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVDb25maWdOYW1lKG5hbWUpO1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuXG4gICAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGZpZWxkLCAndHlwZScpIHx8IHR5cGVvZiBmaWVsZC50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXZlcnkgc2NoZW1hIGZpZWxkIG11c3QgaGF2ZSBhIFwidHlwZVwiIHByb3BlcnR5IG9mIHR5cGUgXCJzdHJpbmdcImAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZmllbGQgdHlwZSBcIiR7ZmllbGQudHlwZX1cImApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudmFsaWRhdGVTY2hlbWFGaWVsZChmaWVsZCk7XG5cbiAgICAgICAgICAvLyBpZiB0aGUgY2hpbGQgaXMgYW4gb2JqZWN0IGZpZWxkIGl0c2VsZiBhZGQgaXQgdG8gc3RhY2sgZm9yXG4gICAgICAgICAgLy8gcHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogZmllbGQuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICBzdWJTY2hlbWE6IHsgW25hbWVdOiBmaWVsZC5pdGVtcyB9LFxuICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgICBmaWVsZC5jaGlsZHJlbi5mb3JFYWNoKCh1bmlvbkNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdWJTY2hlbWE6IHsgW2Ake25hbWV9X3VuaW9uXyR7aW5kZXh9YF06IHVuaW9uQ2hpbGQgfSxcbiAgICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtlcnJvclByZWFtYmxlKHBhdGgpfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIGNvbmZpZyBrZXkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ05hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb25maWcga2V5IG5hbWUgY2FuIG5vdCBjb250YWluIHRoZSAnLicgY2hhcmFjdGVyYCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgcGFzc2VkIHNjaGVtYSBmaWVsZCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdGaWVsZH0gZmllbGRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWFGaWVsZCA9IChmaWVsZDogQ29uZmlnRmllbGQpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzLmFsbCwga2V5KSAmJlxuICAgICAgICAhT2JqZWN0Lmhhc093bihwcm9wZXJ0eVZhbGlkYXRvcnMucHJpbWl0aXZlLCBrZXkpICYmXG4gICAgICAgICFPYmplY3QuaGFzT3duKHByb3BlcnR5VmFsaWRhdG9yc1tmaWVsZC50eXBlXSwga2V5KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2NoZW1hIGZpZWxkIGhhcyB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9ycy5hbGwpKSB7XG4gICAgICB2YWxpZGF0b3IoZmllbGQsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpZWxkLnR5cGUgIT09ICdvYmplY3QnICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAnYXJyYXknICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAndW5pb24nXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9ycy5wcmltaXRpdmUpKSB7XG4gICAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2YgT2JqZWN0LnZhbHVlcyhwcm9wZXJ0eVZhbGlkYXRvcnNbZmllbGQudHlwZV0pKSB7XG4gICAgICB2YWxpZGF0b3IoZmllbGQsIHRoaXMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXRoIGluIHNjaGVtYSB0cmVlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHJldHVybiB7KENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkKX0gcmV0dXJucyB1bmRlZmluZWQgaWYgZmllbGQgaXMgbm90IGZvdW5kXG4gICAqL1xuICBnZXRTY2hlbWFGaWVsZCA9IChwYXRoOiBzdHJpbmdbXSk6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkID0+IHtcbiAgICBsZXQgc3ViVHJlZTogQ29uZmlnU2NoZW1hIHwgdW5kZWZpbmVkID0gdGhpcy5zY2hlbWE7XG4gICAgbGV0IGZpZWxkOiBDb25maWdGaWVsZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoKSB7XG4gICAgICBpZiAoIXN1YlRyZWUpIHtcbiAgICAgICAgaWYgKGZpZWxkPy50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgbGV0IGZvdW5kOiBDb25maWdGaWVsZCB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZmllbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgT2JqZWN0Lmhhc093bihjaGlsZC5jaGlsZHJlbiwgcGFydClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3VuZCA9IGNoaWxkLmNoaWxkcmVuW3BhcnRdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWZvdW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgZmllbGQgPSBmb3VuZDtcblxuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc3ViVHJlZSA9IGZpZWxkLmNoaWxkcmVuO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBmaWVsZC50eXBlID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcgfHwgZmllbGQuaXRlbXMudHlwZSA9PT0gJ3VuaW9uJylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHN1YlRyZWUgPVxuICAgICAgICAgICAgICBmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0JyA/IGZpZWxkLml0ZW1zLmNoaWxkcmVuIDogdW5kZWZpbmVkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKE9iamVjdC5oYXNPd24oc3ViVHJlZSwgcGFydCkpIHtcbiAgICAgICAgZmllbGQgPSBzdWJUcmVlW3BhcnRdO1xuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHN1YlRyZWUgPSBmaWVsZC5jaGlsZHJlbjtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzdWJUcmVlID0gZmllbGQuaXRlbXMuY2hpbGRyZW47XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgICBzdWJUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZmllbGQgPSBmaWVsZC5pdGVtcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViVHJlZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgIHN1YlRyZWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3ViVHJlZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkPy50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgbGV0IGZvdW5kOiBDb25maWdGaWVsZCB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZmllbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgT2JqZWN0Lmhhc093bihjaGlsZC5jaGlsZHJlbiwgcGFydClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3VuZCA9IGNoaWxkLmNoaWxkcmVuW3BhcnRdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWZvdW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgZmllbGQgPSBmb3VuZDtcblxuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc3ViVHJlZSA9IGZpZWxkLmNoaWxkcmVuO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBkZWZhdWx0IHZhbHVlcyBmcm9tIGEgc2NoZW1hXG4gICAqXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iamVjdCBvZiBkZWZhdWx0IHZhbHVlc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZ2VuZXJhdGVEZWZhdWx0ID0gKG9wdGlvbnM/OiB7IHZhbGlkYXRlPzogYm9vbGVhbiB9KTogUmVjb3JkPHN0cmluZywgYW55PiA9PiB7XG4gICAgY29uc3QgdmFsdWVUcmVlID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKHRoaXMuc2NoZW1hKTtcbiAgICBpZiAob3B0aW9ucz8udmFsaWRhdGUpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb25maWcodmFsdWVUcmVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlVHJlZTtcbiAgfTtcblxuICAvLyBCdWlsZHMgZGVmYXVsdCB2YWx1ZXMgZm9yIGEgc2NoZW1hIHN1YnRyZWUgKG9iamVjdHMgYW5kIGFycmF5cyksIHJlY3Vyc2l2ZWx5XG4gIHByaXZhdGUgYnVpbGREZWZhdWx0c0ZvclNjaGVtYSA9IChcbiAgICBzY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGRlZmF1bHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRGVmYXVsdHMgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEoZmllbGQuY2hpbGRyZW4pO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hpbGREZWZhdWx0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBjaGlsZERlZmF1bHRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaWYgKGZpZWxkLmRlZmF1bHQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRGVmYXVsdHMgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEoXG4gICAgICAgICAgICAgIGZpZWxkLml0ZW1zLmNoaWxkcmVuLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBmaWVsZC5kZWZhdWx0Lm1hcCgoZWxlbTogVmFsdWVUeXBlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbGVtICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZWxlbSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShlbGVtKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtRGVmYXVsdHMsIC4uLmVsZW0gfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gZmllbGQuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSAhPT0gJ3VuaW9uJyAmJiBmaWVsZC5kZWZhdWx0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZhdWx0c1trZXldID0gZmllbGQuZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZXMgY29tcGF0aWJsZSBUeXBlU2NyaXB0IGludGVyZmFjZSBmb3IgdGhpcyBpbnN0YW5jZSdzIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiByb290IHR5cGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2VuZXJhdGVUU1R5cGVzID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgdHlwZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZW1pdHRlZFR5cGVOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBzdGFjazogQXJyYXk8e1xuICAgICAgc3ViU2NoZW1hOiBDb25maWdTY2hlbWE7XG4gICAgICBjaGlsZHJlbjogc3RyaW5nW107XG4gICAgICBwYXJlbnRQYXRoOiBzdHJpbmdbXTtcbiAgICAgIHR5cGVOYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPjtcbiAgICB9PiA9IFtcbiAgICAgIHtcbiAgICAgICAgc3ViU2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgcGFyZW50UGF0aDogW10sXG4gICAgICAgIHR5cGVOYW1lOiBuYW1lLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHNjaGVtYSBvYmplY3QgdHJlZSBkZXB0aCBmaXJzdFxuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCB7IHN1YlNjaGVtYSwgY2hpbGRyZW4sIHBhcmVudFBhdGgsIHR5cGVOYW1lLCBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50O1xuXG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmICghZW1pdHRlZFR5cGVOYW1lcy5oYXModHlwZU5hbWUpKSB7XG4gICAgICAgICAgdHlwZXMucHVzaCh0aGlzLmdlblRTSW50ZXJmYWNlKHR5cGVOYW1lLCBhdHRyaWJ1dGVzKSk7XG4gICAgICAgICAgZW1pdHRlZFR5cGVOYW1lcy5hZGQodHlwZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGROYW1lID0gY2hpbGRyZW4ucG9wKCkhO1xuICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbY2hpbGROYW1lXTtcbiAgICAgIGNvbnN0IHBhdGggPSBwYXJlbnRQYXRoLmNvbmNhdChjaGlsZE5hbWUpO1xuICAgICAgLy8gaWYgYSBub2RlL2ZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGFuZCB0aHVzIGlzIGEgc3VidHJlZSwgYWRkIGl0IHRvXG4gICAgICAvLyB0aGUgc3RhY2sgdG8gYmUgdHJhdmVyc2VkIGxhdGVyLiBPdGhlcndpc2UgaXQncyBhIGxlYWYgYW5kIG5lZWRzIG5vXG4gICAgICAvLyB0cmF2ZXJzYWwuXG4gICAgICBjb25zdCBjaGlsZE5hbWVRdW90ZWQgPSBjaGlsZE5hbWUuaW5jbHVkZXMoJy0nKVxuICAgICAgICA/IGBcIiR7Y2hpbGROYW1lfVwiYFxuICAgICAgICA6IGNoaWxkTmFtZTtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgIGNvbnN0IHVuaW9uVHlwZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZmllbGQuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goKG5lc3RlZENoaWxkKSA9PiB7XG4gICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChuZXN0ZWRDaGlsZC50eXBlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25QYXRoID0gcGF0aC5jb25jYXQoW2BPcHRpb24ke2luZGV4fWBdKTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gb3B0aW9uUGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogY2hpbGQuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhjaGlsZC5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBvcHRpb25QYXRoLFxuICAgICAgICAgICAgICB0eXBlTmFtZSxcbiAgICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdW5pb25UeXBlcy5wdXNoKHR5cGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgaWYgKGNoaWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1QYXRoID0gcGF0aC5jb25jYXQoW2BJdGVtJHtpbmRleH1gXSk7XG4gICAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gaXRlbVBhdGgubWFwKHRvUGFzY2FsQ2FzZSkuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXMoY2hpbGQuaXRlbXMuY2hpbGRyZW4pLnJldmVyc2UoKSxcbiAgICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBpdGVtUGF0aCxcbiAgICAgICAgICAgICAgICB0eXBlTmFtZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgdW5pb25UeXBlcy5wdXNoKGAke3R5cGVOYW1lfVtdYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmlvblR5cGVzLnB1c2goYCR7Y2hpbGQuaXRlbXMudHlwZX1bXWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdW5pb25UeXBlcy5wdXNoKGNoaWxkLnR5cGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW2NoaWxkTmFtZVF1b3RlZCwgdW5pb25UeXBlcy5qb2luKCcgfCAnKV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IHBhdGgubWFwKHRvUGFzY2FsQ2FzZSkuam9pbignJyk7XG5cbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXMoZmllbGQuY2hpbGRyZW4pLnJldmVyc2UoKSxcbiAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgICB9KTtcblxuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW2NoaWxkTmFtZVF1b3RlZCwgdHlwZU5hbWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBpZiAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCB0eXBlTmFtZSA9IHBhdGgubWFwKHRvUGFzY2FsQ2FzZSkuam9pbignJyk7XG5cbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHN1YlNjaGVtYTogZmllbGQuaXRlbXMuY2hpbGRyZW4sXG4gICAgICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXMoZmllbGQuaXRlbXMuY2hpbGRyZW4pLnJldmVyc2UoKSxcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB0eXBlTmFtZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFtjaGlsZE5hbWVRdW90ZWQsIGAke3R5cGVOYW1lfVtdYF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICBjb25zdCB1bmlvblR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgZmllbGQuaXRlbXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNoaWxkLnR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgIGNoaWxkLnR5cGUgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgIGNoaWxkLnR5cGUgPT09ICdib29sZWFuJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChjaGlsZC50eXBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uUGF0aCA9IHBhdGguY29uY2F0KFtgT3B0aW9uJHtpbmRleH1gXSk7XG4gICAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gb3B0aW9uUGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdWJTY2hlbWE6IGNoaWxkLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhjaGlsZC5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgICAgIHBhcmVudFBhdGg6IG9wdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgdHlwZU5hbWUsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaCh0eXBlTmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVBhdGggPSBwYXRoLmNvbmNhdChbYE9wdGlvbiR7aW5kZXh9SXRlbWBdKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlTmFtZSA9IGl0ZW1QYXRoLm1hcCh0b1Bhc2NhbENhc2UpLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICBzdWJTY2hlbWE6IGNoaWxkLml0ZW1zLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKGNoaWxkLml0ZW1zLmNoaWxkcmVuKS5yZXZlcnNlKCksXG4gICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBpdGVtUGF0aCxcbiAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB1bmlvblR5cGVzLnB1c2goYCR7dHlwZU5hbWV9W11gKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1bmlvblR5cGVzLnB1c2goYCR7Y2hpbGQuaXRlbXMudHlwZX1bXWApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1bmlvblR5cGVzLnB1c2goY2hpbGQudHlwZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW2NoaWxkTmFtZVF1b3RlZCwgYCgke3VuaW9uVHlwZXMuam9pbignIHwgJyl9KVtdYF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCBgJHtmaWVsZC5pdGVtcy50eXBlfVtdYF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgZmllbGRUeXBlOiBzdHJpbmcgPSBmaWVsZC50eXBlO1xuICAgICAgbGV0IGlzT3B0aW9uYWwgPSB0cnVlO1xuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnc3RyaW5nJyAmJiAnY2hvaWNlcycgaW4gdmFsaWRhdGlvbikge1xuICAgICAgICAgICAgZmllbGRUeXBlID0gdmFsaWRhdGlvbi5jaG9pY2VzLm1hcCgoYykgPT4gYCcke2N9J2ApLmpvaW4oJyB8ICcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgncmVxdWlyZWQnIGluIHZhbGlkYXRpb24gJiYgISgnd2hlbicgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgICAgIGlzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMucHVzaChbXG4gICAgICAgIGlzT3B0aW9uYWwgPyBgJHtjaGlsZE5hbWVRdW90ZWR9P2AgOiBjaGlsZE5hbWVRdW90ZWQsXG4gICAgICAgIGZpZWxkVHlwZSxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlcy5yZXZlcnNlKCkuam9pbignXFxuXFxuJykgKyAnXFxuJztcbiAgfTtcblxuICAvKipcbiAgICogZ2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgcGFzc2VkIG5hbWUgYW5kIGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheTxbc3RyaW5nLCBzdHJpbmddPn0gYXR0cmlidXRlc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBwcml2YXRlIGdlblRTSW50ZXJmYWNlID0gKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPixcbiAgKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gYGV4cG9ydCBpbnRlcmZhY2UgJHtuYW1lfSB7XG4gICR7YXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGAke2F0dHJbMF19OiAke2F0dHJbMV19O2ApLmpvaW4oJ1xcbiAgJyl9XG59YDtcbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIGNoYXJhY3RlcmlzdGljIG9iamVjdCBmb3IgdmFsdWVzIGF0IGEgc3BlY2lmaWMgbm9kZSBjb25maWcgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBnZXRDb25maWdGb3JMZXZlbChjb25maWc6IElDb25maWcsIGxldmVsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBjb25mTGV2ZWxzID0gQ29uZmlnVmFsaWRhdG9yLmdldE5vZGVDb25maWdMZXZlbHMoY29uZmlnKTtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gY29uZkxldmVscy5pbmRleE9mKGxldmVsKTtcbiAgICBpZiAobGV2ZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBcIiR7bGV2ZWx9XCIgbGV2ZWwgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IHN5c3RlbSBjb25maWd1cmF0aW9uIGxldmVsc2AsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBoaWdoZXJMZXZlbFNvdXJjZXMgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNvdXJjZSkgPT4gY29uZkxldmVscy5pbmRleE9mKGdldFNvdXJjZU5hbWUoc291cmNlKSkgPiBsZXZlbEluZGV4LFxuICAgICAgKTtcbiAgICBjb25zdCBjdXJyZW50TGV2ZWxTb3VyY2UgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcigoc291cmNlKSA9PiBnZXRTb3VyY2VOYW1lKHNvdXJjZSkgPT09IGxldmVsKVxuICAgICAgLmF0KDApO1xuICAgIGNvbnN0IGxvd2VyTGV2ZWxTb3VyY2VzID0gY29uZmlnLnV0aWxcbiAgICAgIC5nZXRDb25maWdTb3VyY2VzKClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChzb3VyY2UpID0+IGNvbmZMZXZlbHMuaW5kZXhPZihnZXRTb3VyY2VOYW1lKHNvdXJjZSkpIDwgbGV2ZWxJbmRleCxcbiAgICAgICk7XG5cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHNjaGVtYSBvYmplY3QgdHJlZSBkZXB0aCBmaXJzdFxuICAgIGNvbnN0IHZhbHVlVHJlZSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICBbXSxcbiAgICAgIGhpZ2hlckxldmVsU291cmNlcyxcbiAgICAgIGN1cnJlbnRMZXZlbFNvdXJjZSxcbiAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICk7XG5cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9XG5cbiAgLyoqXG4gICAqdHJhdmVyc2VzIHRoZSBjb25maWcgc2NoZW1hIGRlcHRoIGZpcnN0IHRvIHByb2R1Y2UgY2hhcmFjdGVyaXN0aWMgb2JqZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBwYXJhbSB7SUNvbmZpZ1NvdXJjZVtdfSBoaWdoZXJMZXZlbFNvdXJjZXNcbiAgICogQHBhcmFtIHsoSUNvbmZpZ1NvdXJjZSB8IHVuZGVmaW5lZCl9IGN1cnJlbnRMZXZlbFNvdXJjZVxuICAgKiBAcGFyYW0ge0lDb25maWdTb3VyY2VbXX0gbG93ZXJMZXZlbFNvdXJjZXNcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcHJvY2Vzc0NvbmZpZ0ZvckxldmVsTm9kZShcbiAgICBzY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBoaWdoZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgICBjdXJyZW50TGV2ZWxTb3VyY2U6IElDb25maWdTb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgbG93ZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBjaGlsZE5hbWUgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2NoaWxkTmFtZV07XG4gICAgICAvLyBpZiBhIGZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGFuZCB0aHVzIGlzIGEgc3VidHJlZSwgcmVjdXJzZSBvbiBpdC5cbiAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgbGVhZiBhbmQgbmVlZHMgbm8gdHJhdmVyc2FsLlxuICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgICAgIGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnbGFiZWwnXSA9XG4gICAgICAgICAgZmllbGQubGFiZWwgIT0gdW5kZWZpbmVkID8gZmllbGQubGFiZWwgOiBudWxsO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydkZXNjcmlwdGlvbiddID1cbiAgICAgICAgICBmaWVsZC5kZXNjcmlwdGlvbiAhPSB1bmRlZmluZWQgPyBmaWVsZC5kZXNjcmlwdGlvbiA6IG51bGw7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ2RlZmF1bHQnXSA9IGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMoXG4gICAgICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWyd2YWx1ZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBbLi4uKGN1cnJlbnRMZXZlbFNvdXJjZSAhPSB1bmRlZmluZWQgPyBbY3VycmVudExldmVsU291cmNlXSA6IFtdKV0sXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydvdmVycmlkZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgbGlzdCBvZiBjb25maWcgc291cmNlcyB1c2VkIGJ5IG5vZGUgY29uZmlnIHBhY2thZ2UsIG9yZGVyZWQgZnJvbVxuICAgKiB0aGUgbG93ZXN0IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHJldHVybiAge3N0cmluZ1tdfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Tm9kZUNvbmZpZ0xldmVscyA9IChjb25maWc6IElDb25maWcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfQVBQX0lOU1RBTkNFJyk7XG4gICAgbGV0IGRlcGxveW1lbnQgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfRU5WJyk7XG4gICAgZGVwbG95bWVudCA9IGNvbmZpZy51dGlsLmdldEVudignTk9ERV9DT05GSUdfRU5WJyk7XG4gICAgY29uc3QgZnVsbEhvc3RuYW1lID0gY29uZmlnLnV0aWwuZ2V0RW52KCdIT1NUTkFNRScpO1xuICAgIGNvbnN0IHNob3J0SG9zdG5hbWUgPVxuICAgICAgZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCA/IGZ1bGxIb3N0bmFtZS5zcGxpdCgnLicpWzBdIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29uZmlnTGV2ZWxzID0gW1xuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgZGVmYXVsdC0ke2luc3RhbmNlfWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkID8gW2Ake2RlcGxveW1lbnR9YF0gOiBbXSksXG4gICAgICAuLi4oaW5zdGFuY2UgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7c2hvcnRIb3N0bmFtZX1gXSA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtzaG9ydEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7ZnVsbEhvc3RuYW1lfWBdIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtkZXBsb3ltZW50fWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZnVsbEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICBgbG9jYWxgLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtpbnN0YW5jZX1gXSA6IFtdKSxcbiAgICAgIC4uLihkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgJyROT0RFX0NPTkZJRycsXG4gICAgICAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgXTtcblxuICAgIHJldHVybiBjb25maWdMZXZlbHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIGNvbmZpZyBvYmplY3QgYW5kIHdyaXRlcyBpdCB0byB0aGUgbm9kZS1jb25maWcgZmlsZVxuICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdPYmpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsIG91dHB1dCBub2RlLWNvbmZpZyBmaWxlIGxldmVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGVcbiAgICovXG4gIHZhbGlkYXRlQW5kV3JpdGVDb25maWcgPSAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWdPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY29uZmlnOiBJQ29uZmlnLFxuICAgIGxldmVsOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBzdHJpbmcsXG4gICkgPT4ge1xuICAgIGNvbnN0IGNvbmZMZXZlbHMgPSBDb25maWdWYWxpZGF0b3IuZ2V0Tm9kZUNvbmZpZ0xldmVscyhjb25maWcpLmZpbHRlcihcbiAgICAgIChsKSA9PiBsICE9PSAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgKTtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gY29uZkxldmVscy5pbmRleE9mKGxldmVsKTtcbiAgICBpZiAobGV2ZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBbJHtsZXZlbH1dIGxldmVsIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBzeXN0ZW0ncyBjb25maWd1cmF0aW9uIGxldmVsc2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ0RpciA9XG4gICAgICBwcm9jZXNzLmVudlsnTk9ERV9DT05GSUdfRElSJ10gIT0gdW5kZWZpbmVkXG4gICAgICAgID8gcHJvY2Vzcy5lbnZbJ05PREVfQ09ORklHX0RJUiddXG4gICAgICAgIDogJy4vY29uZmlnJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgbGV0IGV4dCA9ICcnO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlICdqc29uJzoge1xuICAgICAgICBvdXRwdXQgPSBKc29uQmlnSW50LnN0cmluZ2lmeShjb25maWdPYmopO1xuICAgICAgICBleHQgPSAnanNvbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAneWFtbCc6IHtcbiAgICAgICAgb3V0cHV0ID0geWFtbC5kdW1wKGNvbmZpZ09iaik7XG4gICAgICAgIGV4dCA9ICd5YW1sJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBgJHtsZXZlbH0uJHtleHR9YCk7XG4gICAgY29uc3QgYmFja3VwUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIGAke2xldmVsfS1iYWNrdXAuJHtleHR9YCk7XG4gICAgY29uc3QgY29uZkZpbGVFeGlzdHMgPSBmcy5leGlzdHNTeW5jKG91dHB1dFBhdGgpO1xuICAgIGlmIChjb25mRmlsZUV4aXN0cykge1xuICAgICAgZnMucmVuYW1lU3luYyhvdXRwdXRQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBvdXRwdXQpO1xuXG4gICAgY29uc3QgdXBkYXRlZENvbmZPYmogPSBjb25maWcudXRpbC5sb2FkRmlsZUNvbmZpZ3MoKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ29uZmlnKHVwZGF0ZWRDb25mT2JqKTtcbiAgICAgIGZzLnVubGlua1N5bmMoYmFja3VwUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZzLnVubGlua1N5bmMob3V0cHV0UGF0aCk7XG4gICAgICBpZiAoY29uZkZpbGVFeGlzdHMpIHtcbiAgICAgICAgZnMucmVuYW1lU3luYyhiYWNrdXBQYXRoLCBvdXRwdXRQYXRoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==