@decaf-ts/for-nest 0.0.3 → 0.0.4

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/for-nest.cjs CHANGED
@@ -371,14 +371,6 @@
371
371
  tslib.__metadata("design:paramtypes", [Object, core$1.ModuleRef])
372
372
  ], DecafCoreModule);
373
373
 
374
- function repoForModel(model) {
375
- const m = decoratorValidation.Model.get(model);
376
- if (!m)
377
- throw new dbDecorators.InternalError(`Failed to find repository for ${model}`);
378
- const repo = core.Repository.forModel(m);
379
- return repo;
380
- }
381
-
382
374
  exports.RepoFactory = class RepoFactory {
383
375
  for(model) {
384
376
  model = typeof model === "string" ? decoratorValidation.Model.get(model) : model;
@@ -400,46 +392,90 @@
400
392
  this._logger = logging.Logging.for(DecafModelModule_1);
401
393
  return this._logger;
402
394
  }
403
- static toModelController(modelClass) {
395
+ static toModelController(ModelClazz) {
404
396
  const log = this.log.for(this.toModelController);
405
- log.debug(`Creating model controller... ${modelClass.name}`);
406
- const modelName = logging.toKebabCase(core.Repository.table(modelClass));
407
- const route = modelName;
397
+ const tableName = core.Repository.table(ModelClazz);
398
+ const routePath = logging.toKebabCase(tableName);
399
+ const modelClazzName = ModelClazz.name;
400
+ log.debug(`Creating controller for model: ${modelClazzName}`);
408
401
  let DynamicModelController = class DynamicModelController extends logging.LoggedClass {
409
402
  constructor(repoFactory) {
410
403
  super();
411
404
  this.repoFactory = repoFactory;
405
+ log.info(`Registering dynamic controller for model: ${modelClazzName} route: /${routePath}`);
412
406
  try {
413
- this.repo = this.repoFactory.for(modelClass.name);
407
+ this.repo = this.repoFactory.for(ModelClazz.name);
408
+ this.pk = this.repo.pk;
414
409
  }
415
410
  catch (e) {
416
- log.error(`Failed to get repository for ${modelClass.name}`, e);
411
+ this.log.error(`Failed to initialize repository for model "${ModelClazz.name}".`, e);
417
412
  }
418
413
  }
419
414
  async create(data) {
420
415
  const log = this.log.for(this.create);
421
- log.verbose(`creating new ${modelName}`);
422
- const r = repoForModel("Account");
423
- const created = await r.create(data);
424
- log.info(`created new ${modelName} with id ${created[r.pk]}`);
416
+ log.verbose(`creating new ${modelClazzName}`);
417
+ let created;
418
+ try {
419
+ created = await this.repo.create(data);
420
+ }
421
+ catch (e) {
422
+ log.error(`Failed to create new ${modelClazzName}`, e);
423
+ throw e;
424
+ }
425
+ log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
425
426
  return created;
426
427
  }
427
428
  async read(id) {
428
429
  const log = this.log.for(this.read);
429
- log.debug(`reading ${modelName} with ${this.repo.pk} ${id}`);
430
- const read = await this.repo.read(id);
431
- log.info(`read ${modelName} with id ${read[this.repo.pk]}`);
430
+ let read;
431
+ try {
432
+ log.debug(`reading ${modelClazzName} with ${this.pk} ${id}`);
433
+ read = await this.repo.read(id);
434
+ }
435
+ catch (e) {
436
+ log.error(`Failed to read ${modelClazzName} with id ${id}`, e);
437
+ throw e;
438
+ }
439
+ log.info(`read ${modelClazzName} with id ${read[this.pk]}`);
440
+ return read;
441
+ }
442
+ async update(data) {
443
+ const log = this.log.for(this.update);
444
+ let updated;
445
+ try {
446
+ log.info(`updating ${modelClazzName} with ${this.pk} ${data[this.pk]}`);
447
+ updated = await this.repo.create(data);
448
+ }
449
+ catch (e) {
450
+ throw e;
451
+ }
452
+ return updated;
453
+ }
454
+ async delete(id) {
455
+ const log = this.log.for(this.delete);
456
+ let read;
457
+ try {
458
+ log.debug(`deleting ${modelClazzName} with ${this.pk} ${id}`);
459
+ read = await this.repo.read(id);
460
+ }
461
+ catch (e) {
462
+ log.error(`Failed to delete ${modelClazzName} with id ${id}`, e);
463
+ throw e;
464
+ }
465
+ log.info(`deleted ${modelClazzName} with id ${read[this.pk]}`);
432
466
  return read;
433
467
  }
434
468
  };
435
469
  tslib.__decorate([
436
470
  common.Post(),
437
- swagger.ApiOperation({ summary: `Create a new ${modelName}.` }),
471
+ swagger.ApiOperation({ summary: `Create a new ${modelClazzName}.` }),
438
472
  swagger.ApiBody({
439
- description: `Payload for ${modelName}`,
440
- schema: { $ref: swagger.getSchemaPath(modelClass) },
473
+ description: `Payload for ${modelClazzName}`,
474
+ schema: { $ref: swagger.getSchemaPath(ModelClazz) },
475
+ }),
476
+ swagger.ApiCreatedResponse({
477
+ description: `${modelClazzName} created successfully.`,
441
478
  }),
442
- swagger.ApiCreatedResponse({ description: `${modelName} created successfully.` }),
443
479
  swagger.ApiBadRequestResponse({ description: "Payload validation failed." }),
444
480
  swagger.ApiUnprocessableEntityResponse({
445
481
  description: "Repository rejected the provided payload.",
@@ -451,25 +487,62 @@
451
487
  ], DynamicModelController.prototype, "create", null);
452
488
  tslib.__decorate([
453
489
  common.Get(":id"),
454
- swagger.ApiOperation({ summary: `Retrieve a ${modelName} by id.` }),
490
+ swagger.ApiOperation({ summary: `Retrieve a ${modelClazzName} record by id.` }),
491
+ swagger.ApiParam({ name: "id", description: "Primary key" }),
492
+ swagger.ApiOkResponse({
493
+ description: `${modelClazzName} retrieved successfully.`,
494
+ }),
495
+ swagger.ApiNotFoundResponse({
496
+ description: `No ${modelClazzName} record matches the provided identifier.`,
497
+ }),
498
+ tslib.__param(0, common.Param("id")),
499
+ tslib.__metadata("design:type", Function),
500
+ tslib.__metadata("design:paramtypes", [String]),
501
+ tslib.__metadata("design:returntype", Promise)
502
+ ], DynamicModelController.prototype, "read", null);
503
+ tslib.__decorate([
504
+ common.Put(":id"),
505
+ swagger.ApiOperation({
506
+ summary: `Replace an existing ${modelClazzName} record with a new payload.`,
507
+ }),
508
+ swagger.ApiBody({
509
+ description: `Payload for replace a existing record of ${modelClazzName}`,
510
+ schema: { $ref: swagger.getSchemaPath(ModelClazz) },
511
+ }),
512
+ swagger.ApiOkResponse({
513
+ description: `${ModelClazz} record replaced successfully.`,
514
+ }),
515
+ swagger.ApiNotFoundResponse({
516
+ description: `No ${modelClazzName} record matches the provided identifier.`,
517
+ }),
518
+ swagger.ApiBadRequestResponse({ description: "Payload validation failed." }),
519
+ tslib.__param(0, common.Body()),
520
+ tslib.__metadata("design:type", Function),
521
+ tslib.__metadata("design:paramtypes", [decoratorValidation.Model]),
522
+ tslib.__metadata("design:returntype", Promise)
523
+ ], DynamicModelController.prototype, "update", null);
524
+ tslib.__decorate([
525
+ common.Delete(":id"),
526
+ swagger.ApiOperation({ summary: `Delete a ${modelClazzName} record by id.` }),
455
527
  swagger.ApiParam({
456
528
  name: "id",
457
- description: "Primary key",
458
- example: "1234-5678",
529
+ description: `Primary key value of the ${modelClazzName} record to delete.`,
530
+ }),
531
+ swagger.ApiOkResponse({
532
+ description: `${modelClazzName} record deleted successfully.`,
459
533
  }),
460
- swagger.ApiOkResponse({ description: `${modelName} retrieved successfully.` }),
461
534
  swagger.ApiNotFoundResponse({
462
- description: "No record matches the provided identifier.",
535
+ description: `No ${modelClazzName} record matches the provided identifier.`,
463
536
  }),
464
537
  tslib.__param(0, common.Param("id")),
465
538
  tslib.__metadata("design:type", Function),
466
539
  tslib.__metadata("design:paramtypes", [String]),
467
540
  tslib.__metadata("design:returntype", Promise)
468
- ], DynamicModelController.prototype, "read", null);
541
+ ], DynamicModelController.prototype, "delete", null);
469
542
  DynamicModelController = tslib.__decorate([
470
- common.Controller(route),
471
- swagger.ApiTags(modelName),
472
- swagger.ApiExtraModels(modelClass),
543
+ common.Controller(routePath),
544
+ swagger.ApiTags(modelClazzName),
545
+ swagger.ApiExtraModels(ModelClazz),
473
546
  tslib.__metadata("design:paramtypes", [exports.RepoFactory])
474
547
  ], DynamicModelController);
475
548
  return DynamicModelController;
@@ -514,6 +587,14 @@
514
587
  common.Module({})
515
588
  ], exports.DecafModule);
516
589
 
590
+ function repoForModel(model) {
591
+ const m = decoratorValidation.Model.get(model);
592
+ if (!m)
593
+ throw new dbDecorators.InternalError(`Failed to find repository for ${model}`);
594
+ const repo = core.Repository.forModel(m);
595
+ return repo;
596
+ }
597
+
517
598
  /**
518
599
  * @module for-nest
519
600
  * @description This module serves as the main entry point for the ts-workspace library. It aggregates and exports
@@ -541,7 +622,7 @@
541
622
  * @constant
542
623
  * @type {string}
543
624
  */
544
- const VERSION = "0.0.2";
625
+ const VERSION = "0.0.4";
545
626
  const PACKAGE_NAME = "##PACKAGE_NAME##";
546
627
  decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
547
628
 
@@ -562,4 +643,4 @@
562
643
  exports.repoForModel = repoForModel;
563
644
 
564
645
  }));
565
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvZGVjb3JhdG9ycy9oZWxwZXJzLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMvQXBpUHJvcGVydHkudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvY29yZS1tb2R1bGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvUmVwb0ZhY3RvcnkudHMiLCIuLi9zcmMvbW9kZWwtbW9kdWxlLnRzIiwiLi4vc3JjL21vZHVsZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGUgKi9cblxuaW1wb3J0IHsgTUVUSE9EX01FVEFEQVRBIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNDb25zdHJ1Y3RvciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi91dGlscy9zaGFyZWQudXRpbHNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzVW5kZWZpbmVkLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXIvZGlzdC9wbHVnaW4vcGx1Z2luLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXIvZGlzdC9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgeyBvdmVycmlkZUV4aXN0aW5nIH0gPSB7IG92ZXJyaWRlRXhpc3Rpbmc6IHRydWUgfVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBrZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBtZXRhZGF0YSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIGlmIChwcmV2VmFsdWUgJiYgIW92ZXJyaWRlRXhpc3RpbmcpIHtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7IC4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGEgfSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsYXNzRGVjb3JhdG9yPFQgZXh0ZW5kcyBBcnJheTxhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCA9IFtdIGFzIHVua25vd24gYXMgVFxuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldCkgPT4ge1xuICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIFsuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhXSwgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLCB0YXJnZXQpIHx8IFtdO1xuXG4gICAgY29uc3Qga2V5ID0gYDoke3Byb3BlcnR5S2V5fWA7XG4gICAgaWYgKCFwcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksXG4gICAgICAgIFsuLi5wcm9wZXJ0aWVzLCBgOiR7cHJvcGVydHlLZXl9YF0sXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKGV4aXN0aW5nTWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IG5ld01ldGFkYXRhID0gcGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhVG9TYXZlID0gb3ZlcnJpZGVFeGlzdGluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgIH07XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFUb1NhdmUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID1cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIG92ZXJyaWRlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QgfCBGdW5jdGlvbixcbiAgICBrZXk/OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKTogYW55ID0+IHtcbiAgICBjb25zdCBwYXJhbU9wdGlvbnMgPSB7XG4gICAgICAuLi5pbml0aWFsLFxuICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICB9O1xuXG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQucHJvdG90eXBlKTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlLZXkgb2YgcHJvcGVydHlLZXlzKSB7XG4gICAgICBpZiAoaXNDb25zdHJ1Y3Rvcihwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGhvZERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICB0YXJnZXQucHJvdG90eXBlLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcblxuICAgICAgaWYgKCFtZXRob2REZXNjcmlwdG9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0FwaU1ldGhvZCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXG4gICAgICAgIE1FVEhPRF9NRVRBREFUQSxcbiAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcblxuICAgICAgaWYgKCFpc0FwaU1ldGhvZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBFbnVtQWxsb3dlZFR5cGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L2ludGVyZmFjZXMvc2NoZW1hLW9iamVjdC1tZXRhZGF0YS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEVudW1TY2hlbWFBdHRyaWJ1dGVzIH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L2ludGVyZmFjZXMvZW51bS1zY2hlbWEtYXR0cmlidXRlcy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyL2Rpc3QvZGVjb3JhdG9ycy9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBnZXRFbnVtVHlwZSxcbiAgZ2V0RW51bVZhbHVlcyxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L3V0aWxzL2VudW0udXRpbHNcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyL2Rpc3QvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVQcm9wZXJ0eURlY29yYXRvciB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlDb21tb25PcHRpb25zID0gU2NoZW1hT2JqZWN0TWV0YWRhdGEgJiB7XG4gIFwieC1lbnVtTmFtZXNcIj86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTGF6eSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAgICogY2FuIGJlIHVzZWQgYXMgYW4gaWRcbiAgICpcbiAgICogVXNlIHRvZ2V0aGVyIHdpdGggQEFwaURlZmF1bHRHZXR0ZXIgb24gdGhlIGdldHRlciByb3V0ZSBvZiB0aGUgdHlwZVxuICAgKiB0byBnZW5lcmF0ZSBPcGVuQVBJIGxpbmsgb2JqZWN0c1xuICAgKlxuICAgKiBAc2VlIFtTd2FnZ2VyIGxpbmsgb2JqZWN0c10oaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi9saW5rcy8pXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIGxpbms/OiAoKSA9PiBUeXBlPHVua25vd24+IHwgRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eU9wdGlvbnMgPVxuICB8IEFwaVByb3BlcnR5Q29tbW9uT3B0aW9uc1xuICB8IChBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgJiB7XG4gICAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgICAgZW51bVNjaGVtYT86IEVudW1TY2hlbWFBdHRyaWJ1dGVzO1xuICAgIH0pO1xuXG5jb25zdCBpc0VudW1BcnJheSA9IChcbiAgb3B0czogQXBpUHJvcGVydHlPcHRpb25zXG4pOiBvcHRzIGlzIHtcbiAgaXNBcnJheTogdHJ1ZTtcbiAgZW51bTogRW51bUFsbG93ZWRUeXBlcztcbiAgdHlwZTogYW55O1xuICBpdGVtczogYW55O1xufSA9PiAob3B0cy5pc0FycmF5ICYmIFwiZW51bVwiIGluIG9wdHMgJiYgb3B0cy5lbnVtICE9PSB1bmRlZmluZWQpIGFzIGJvb2xlYW47XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpUHJvcGVydHkoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9XG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fSxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgY29uc3QgW3R5cGUsIGlzQXJyYXldID0gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgICBvcHRpb25zLnR5cGUsXG4gICAgb3B0aW9ucy5pc0FycmF5IGFzIGJvb2xlYW5cbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IHN3YWdnZXIgb3ZlcnJpZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQXBpUHJvcGVydHlPcHRpb25hbChcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQXBpUmVzcG9uc2VQcm9wZXJ0eShcbiAgb3B0aW9uczogUGljazxcbiAgICBBcGlQcm9wZXJ0eU9wdGlvbnMsXG4gICAgXCJ0eXBlXCIgfCBcImV4YW1wbGVcIiB8IFwiZm9ybWF0XCIgfCBcImRlcHJlY2F0ZWRcIiB8IFwiZW51bVwiXG4gID4gPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVDb25maWcsXG4gIEluamVjdGFibGVzS2V5cyxcbiAgSW5qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL2RlY29yYXRvcnMvQXBpUHJvcGVydHlcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0YWJsZShcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIGNmZzogSW5qZWN0YWJsZUNvbmZpZ1xuICAgICkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXggfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5EZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbmltdW06IG1pbiB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhMZW5ndGhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heExlbmd0aDogbWF4IH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4gfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKHR5cGU6IChzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSlbXSB8IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpKSB7XG4vLyAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiB0eXBlIGFzIGFueSB9KTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoKSB7XG4vLyAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBEYXRlIH0pO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4gICAgICBjbGF6ejpcbiAgICAgICAgfCBDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pXG4gICAgICAgIHwgKENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PikpW11cbiAgICApIHtcbiAgICAgIGNvbnN0IGMgPSBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6WzBdIDogY2xheno7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBbY10gfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5PUFRJT04pXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuLy8gICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbi8vICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IGVudW06IG9wdHMgfSk7XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGF0dGVybkRlYyhwYXQ6IFJlZ0V4cCB8IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgcGF0dGVybjogdHlwZW9mIHBhdCA9PT0gXCJzdHJpbmdcIiA/IHBhdCA6IHBhdC5zb3VyY2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uRGVjKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuIiwiZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbiIsImltcG9ydCB7XG4gIER5bmFtaWNNb2R1bGUsXG4gIEdsb2JhbCxcbiAgSW5qZWN0LFxuICBNb2R1bGUsXG4gIE9uQXBwbGljYXRpb25TaHV0ZG93bixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgREVDQUZfQURBUFRFUl9JRCwgREVDQUZfTU9EVUxFX09QVElPTlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZhY3RvcnlQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL21vZHVsZXMvcHJvdmlkZXIuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxcbiAgQ09ORixcbiAgQURBUFRFUiBleHRlbmRzIEFkYXB0ZXI8Q09ORiwgYW55LCBhbnksIGFueSwgYW55Pixcbj4gaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIHN0YXRpYyBfYWRhcHRlckluc3RhbmNlOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PiB8IG51bGwgPVxuICAgIG51bGw7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmQ29yZU1vZHVsZSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfTU9EVUxFX09QVElPTlMpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnM8Q09ORiwgQURBUFRFUj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZWY6IE1vZHVsZVJlZlxuICApIHt9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUFkYXB0ZXIoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXJJbnN0YW5jZSkge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWRhcHRlcik7XG4gICAgICBsb2cuaW5mbyhcIkNyZWF0aW5nIGFkYXB0ZXIgaW5zdGFuY2UuLi5cIik7XG4gICAgICB0aGlzLl9hZGFwdGVySW5zdGFuY2UgPSBuZXcgb3B0aW9ucy5hZGFwdGVyKG9wdGlvbnMuY29uZiwgb3B0aW9ucy5hbGlhcyk7XG4gICAgICBsb2cuaW5mbyhcIkFkYXB0ZXIgaW5zdGFuY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlckluc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGdldEFkYXB0ZXJJbnN0YW5jZSgpOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVySW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCB0eXBlT3JtTW9kdWxlT3B0aW9ucyA9IHtcbiAgICAgIHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLFxuICAgICAgdXNlVmFsdWU6IG9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IGFkYXB0ZXI6IEZhY3RvcnlQcm92aWRlcjxhbnk+ID0ge1xuICAgICAgdXNlRmFjdG9yeTogYXN5bmMgKG9wdHM6IERlY2FmTW9kdWxlT3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gRGVjYWZDb3JlTW9kdWxlLmNyZWF0ZUFkYXB0ZXIob3B0cyk7XG4gICAgICB9LFxuICAgICAgcHJvdmlkZTogREVDQUZfQURBUFRFUl9JRCxcbiAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgICBzY29wZTogU2NvcGUuREVGQVVMVCxcbiAgICAgIGluamVjdDogW0RFQ0FGX01PRFVMRV9PUFRJT05TXSxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvdmlkZXJzID0gW2FkYXB0ZXIsIHR5cGVPcm1Nb2R1bGVPcHRpb25zXTtcbiAgICBjb25zdCBleHBvcnRzID0gW2FkYXB0ZXJdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZDb3JlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0cyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgb25BcHBsaWNhdGlvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IERlY2FmQ29yZU1vZHVsZS5sb2cuZm9yKHRoaXMub25BcHBsaWNhdGlvblNodXRkb3duKTtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5tb2R1bGVSZWYuZ2V0PEFEQVBURVI+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBsb2cuaW5mbyhcIlNodXR0aW5nIGRvd25cIik7XG4gICAgICAgIGF3YWl0IGFkYXB0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgRGVjYWZDb3JlTW9kdWxlLl9hZGFwdGVySW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge01vZGVsfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge0ludGVybmFsRXJyb3J9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtSZXBvc2l0b3J5fSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9Gb3JNb2RlbChtb2RlbDogc3RyaW5nKSB7XG5cdGNvbnN0IG0gPSBNb2RlbC5nZXQobW9kZWwpO1xuXHRpZiAoIW0pXG5cdFx0dGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBmaW5kIHJlcG9zaXRvcnkgZm9yICR7bW9kZWx9YClcblx0Y29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cdHJldHVybiByZXBvO1xufSIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9GYWN0b3J5IHtcbiAgZm9yPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+KTogUmVwbzxNPiB7XG4gICAgbW9kZWwgPSB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyAoTW9kZWwuZ2V0KG1vZGVsKSBhcyBhbnkpIDogbW9kZWw7XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBmaW5kIHJlcG9zaXRvcnkgZm9yICR7bW9kZWx9YCk7XG4gICAgfVxuICAgIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsIGFzIENvbnN0cnVjdG9yPE0+KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQm9keSwgQ29udHJvbGxlciwgR2V0LCBQYXJhbSwgUG9zdCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dlciwgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IHJlcG9Gb3JNb2RlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXBvRmFjdG9yeSB9IGZyb20gXCIuL1JlcG9GYWN0b3J5XCI7XG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9Nb2RlbENvbnRyb2xsZXI8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIG1vZGVsQ2xhc3M6IE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICApIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50b01vZGVsQ29udHJvbGxlcik7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBtb2RlbCBjb250cm9sbGVyLi4uICR7bW9kZWxDbGFzcy5uYW1lfWApO1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRvS2ViYWJDYXNlKFJlcG9zaXRvcnkudGFibGUobW9kZWxDbGFzcykpO1xuICAgIGNvbnN0IHJvdXRlID0gbW9kZWxOYW1lO1xuXG4gICAgQENvbnRyb2xsZXIocm91dGUpXG4gICAgQEFwaVRhZ3MobW9kZWxOYW1lKVxuICAgIEBBcGlFeHRyYU1vZGVscyhtb2RlbENsYXNzKVxuICAgIGNsYXNzIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHJlcG86IGFueTsgLy89IHRoaXMucmVwb0ZhY3RvcnkuZm9yKG1vZGVsQ2xhc3MubmFtZSk7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVwb0ZhY3Rvcnk6IFJlcG9GYWN0b3J5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5yZXBvID0gdGhpcy5yZXBvRmFjdG9yeS5mb3IobW9kZWxDbGFzcy5uYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gZ2V0IHJlcG9zaXRvcnkgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWAsXG4gICAgICAgICAgICBlIGFzIEVycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBAUG9zdCgpXG4gICAgICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsTmFtZX0uYCB9KVxuICAgICAgQEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxOYW1lfWAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKG1vZGVsQ2xhc3MpIH0sXG4gICAgICB9KVxuICAgICAgQEFwaUNyZWF0ZWRSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbE5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAgfSlcbiAgICAgIEBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pXG4gICAgICBAQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pXG4gICAgICBhc3luYyBjcmVhdGUoQEJvZHkoKSBkYXRhOiBUKTogUHJvbWlzZTxNb2RlbDxhbnk+PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZSk7XG4gICAgICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbE5hbWV9YCk7XG4gICAgICAgIGNvbnN0IHIgPSByZXBvRm9yTW9kZWwoXCJBY2NvdW50XCIpO1xuICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgci5jcmVhdGUoZGF0YSk7XG4gICAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsTmFtZX0gd2l0aCBpZCAke2NyZWF0ZWRbci5wa119YCk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgICAgfVxuXG4gICAgICBAR2V0KFwiOmlkXCIpXG4gICAgICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbE5hbWV9IGJ5IGlkLmAgfSlcbiAgICAgIEBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUHJpbWFyeSBrZXlcIixcbiAgICAgICAgZXhhbXBsZTogXCIxMjM0LTU2NzhcIixcbiAgICAgIH0pXG4gICAgICBAQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbE5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCB9KVxuICAgICAgQEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJObyByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5cIixcbiAgICAgIH0pXG4gICAgICBhc3luYyByZWFkKEBQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVhZCk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgcmVhZGluZyAke21vZGVsTmFtZX0gd2l0aCAke3RoaXMucmVwby5wayBhcyBzdHJpbmd9ICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChpZCk7XG4gICAgICAgIGxvZy5pbmZvKGByZWFkICR7bW9kZWxOYW1lfSB3aXRoIGlkICR7cmVhZFt0aGlzLnJlcG8ucGtdfWApO1xuICAgICAgICByZXR1cm4gcmVhZDtcbiAgICAgIH1cblxuICAgICAgLy8gQFBvc3QoKVxuICAgICAgLy8gQEFwaU9wZXJhdGlvbih7c3VtbWFyeTogXCJDcmVhdGUgYSBuZXcgcmVjb3JkIGZvciB0aGUgZ2l2ZW4gbW9kZWwuXCJ9KVxuICAgICAgLy8gQEFwaUNyZWF0ZWRSZXNwb25zZSh7ZGVzY3JpcHRpb246IFwiUmVjb3JkIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwifSlcbiAgICAgIC8vIEBBcGlCYWRSZXF1ZXN0UmVzcG9uc2Uoe2Rlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCJ9KVxuICAgICAgLy8gQEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7ZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIn0pXG4gICAgICAvLyBhc3luYyBjcmVhdGUoQFBhcmFtKFwibW9kZWxcIikgbW9kZWw6IHN0cmluZywgQEJvZHkoKSBkYXRhOiBhbnkpIHtcbiAgICAgIC8vICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGUpO1xuICAgICAgLy8gICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbH1gKTtcbiAgICAgIC8vICAgICBsZXQgcmVwbzogUmVwbzxNb2RlbD47XG4gICAgICAvLyAgICAgbGV0IGNyZWF0ZWQ6IE1vZGVsO1xuICAgICAgLy8gICAgIHRyeSB7XG4gICAgICAvLyAgICAgICAgIHJlcG8gPSByZXBvRm9yTW9kZWwobW9kZWwpO1xuICAgICAgLy8gICAgICAgICBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUoZGF0YSk7XG4gICAgICAvLyAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgLy8gICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3ICR7bW9kZWx9YCwgZSBhcyBFcnJvcik7XG4gICAgICAvLyAgICAgICAgIHRocm93IGU7XG4gICAgICAvLyAgICAgfVxuICAgICAgLy8gICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsfSB3aXRoIGlkICR7Y3JlYXRlZFtyZXBvLnBrXX1gKTtcbiAgICAgIC8vICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gQEdldChcIjppZFwiKVxuICAgICAgLy8gQEFwaU9wZXJhdGlvbih7c3VtbWFyeTogXCJSZXRyaWV2ZSBhIHNpbmdsZSByZWNvcmQgYnkgaWQuXCJ9KVxuICAgICAgLy8gQEFwaVBhcmFtKHtcbiAgICAgIC8vICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAvLyAgICAgLy8gZGVzY3JpcHRpb246ICdOYW1lIG9mIHRoZSBtb2RlbCByZXBvc2l0b3J5IHRvIHRhcmdldC4nICsgYFxcbiR7bW9kZWxMaXN0Lm1hcCgobTogc3RyaW5nLCBpOiBudW1iZXIpID0+IGAke219IC0gJHtNZXRhZGF0YS5kZXNjcmlwdGlvbih0cmFja2VkTW9kZWxzW2ldKX1gKS5qb2luKCdcXG4nKX1gLFxuICAgICAgLy8gICAgIGV4YW1wbGU6IFwiYWdlbnRcIixcbiAgICAgIC8vIH0pXG4gICAgICAvLyBAQXBpUGFyYW0oe1xuICAgICAgLy8gICAgIG5hbWU6IFwiaWRcIixcbiAgICAgIC8vICAgICBkZXNjcmlwdGlvbjogXCJQcmltYXJ5IGtleSB2YWx1ZSB1c2VkIHRvIGxvYWQgdGhlIHJlY29yZC5cIixcbiAgICAgIC8vICAgICBleGFtcGxlOiBcIjEyMzQtNTY3OFwiLFxuICAgICAgLy8gfSlcbiAgICAgIC8vIEBBcGlPa1Jlc3BvbnNlKHtkZXNjcmlwdGlvbjogXCJSZWNvcmQgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5cIn0pXG4gICAgICAvLyBAQXBpTm90Rm91bmRSZXNwb25zZSh7ZGVzY3JpcHRpb246IFwiTm8gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuXCJ9KVxuICAgICAgLy8gYXN5bmMgcmVhZChAUGFyYW0oXCJtb2RlbFwiKSBtb2RlbDogc3RyaW5nLCBAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nKSB7XG4gICAgICAvLyAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVhZCk7XG4gICAgICAvLyAgICAgbGV0IHJlcG86IFJlcG88TW9kZWw+O1xuICAgICAgLy8gICAgIGxldCByZWFkOiBNb2RlbDtcbiAgICAgIC8vICAgICB0cnkge1xuICAgICAgLy8gICAgICAgICByZXBvID0gcmVwb0Zvck1vZGVsKG1vZGVsKTtcbiAgICAgIC8vICAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bW9kZWx9IHdpdGggJHtyZXBvLnBrIGFzIHN0cmluZ30gJHtpZH1gKTtcbiAgICAgIC8vICAgICAgICAgcmVhZCA9IGF3YWl0IHJlcG8ucmVhZChpZCk7XG4gICAgICAvLyAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgLy8gICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byByZWFkICR7bW9kZWx9IHdpdGggaWQgJHtpZH1gLCBlIGFzIEVycm9yKTtcbiAgICAgIC8vICAgICAgICAgdGhyb3cgZTtcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgICAgbG9nLmluZm8oYHJlYWQgJHttb2RlbH0gd2l0aCBpZCAke3JlYWRbcmVwby5wa119YCk7XG4gICAgICAvLyAgICAgcmV0dXJuIHJlYWQ7XG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgcmV0dXJuIER5bmFtaWNNb2RlbENvbnRyb2xsZXI7XG4gIH1cblxuICBzdGF0aWMgZm9yUm9vdChmbGF2b3VyOiBzdHJpbmcpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBjb250cm9sbGVycyBmb3IgZmxhdm91ci4uLmApO1xuXG4gICAgY29uc3QgdHJhY2tlZE1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKGZsYXZvdXIpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gdHJhY2tlZE1vZGVscy5tYXAodGhpcy50b01vZGVsQ29udHJvbGxlci5iaW5kKHRoaXMpKTtcblxuICAgIGxvZy5pbmZvKGBHZW5lcmF0ZWQgJHtjb250cm9sbGVycy5sZW5ndGh9IGNvbnRyb2xsZXJzYCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZGVsTW9kdWxlLFxuICAgICAgY29udHJvbGxlcnMsXG4gICAgICBwcm92aWRlcnM6IFtSZXBvRmFjdG9yeV0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxNb2R1bGUgfSBmcm9tIFwiLi9tb2RlbC1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycyB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGFkYXB0ZXIgPSBhd2FpdCBEZWNhZkNvcmVNb2R1bGUuY3JlYXRlQWRhcHRlcihvcHRpb25zKTtcbiAgICBjb25zdCBmbGF2b3VyID0gYWRhcHRlci5mbGF2b3VyO1xuXG4gICAgY29uc3QgaW1wb3J0czpcbiAgICAgIHwgKFxuICAgICAgICAgIHwgRHluYW1pY01vZHVsZVxuICAgICAgICAgIHwgVHlwZTxhbnk+XG4gICAgICAgICAgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+XG4gICAgICAgICAgfCBGb3J3YXJkUmVmZXJlbmNlPGFueT5cbiAgICAgICAgKVtdXG4gICAgICB8IHVuZGVmaW5lZCA9IFtEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdChvcHRpb25zKV07XG5cbiAgICBpZiAoYXV0b0NvbnRyb2xsZXJzKSB7XG4gICAgICBpbXBvcnRzLnB1c2goRGVjYWZNb2RlbE1vZHVsZS5mb3JSb290KGZsYXZvdXIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZHVsZSxcbiAgICAgIGltcG9ydHM6IGltcG9ydHMsXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JlcG9GYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0VfTkFNRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbIkRFQ09SQVRPUlMiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIk1FVEFEQVRBX0ZBQ1RPUllfTkFNRSIsImlzQ29uc3RydWN0b3IiLCJNRVRIT0RfTUVUQURBVEEiLCJpc0FycmF5IiwiZ2V0VHlwZUlzQXJyYXlUdXBsZSIsImdldEVudW1WYWx1ZXMiLCJnZXRFbnVtVHlwZSIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJbmplY3RhYmxlIiwiU2NvcGUiLCJJbmplY3QiLCJWYWxpZGF0aW9uS2V5cyIsIlBlcnNpc3RlbmNlS2V5cyIsIkRlY29yYXRpb25LZXlzIiwiTG9nZ2luZyIsIl9fZGVjb3JhdGUiLCJHbG9iYWwiLCJNb2R1bGUiLCJfX3BhcmFtIiwiTW9kdWxlUmVmIiwiTW9kZWwiLCJJbnRlcm5hbEVycm9yIiwiUmVwb3NpdG9yeSIsIlJlcG9GYWN0b3J5IiwidG9LZWJhYkNhc2UiLCJMb2dnZWRDbGFzcyIsIlBvc3QiLCJBcGlPcGVyYXRpb24iLCJBcGlCb2R5IiwiZ2V0U2NoZW1hUGF0aCIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsIkFwaUJhZFJlcXVlc3RSZXNwb25zZSIsIkFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSIsIkJvZHkiLCJHZXQiLCJBcGlQYXJhbSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiUGFyYW0iLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwiQWRhcHRlciIsIkRlY2FmTW9kdWxlIiwiTWV0YWRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBO0lBUWdCLFNBQUEscUJBQXFCLENBQ25DLE9BQWUsRUFDZixRQUFXLEVBQ1gsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEVBQUE7SUFFakQsSUFBQSxPQUFPLENBQ0wsTUFBYyxFQUNkLEdBQW9CLEVBQ3BCLFVBQThCLEtBQzVCO0lBQ0YsUUFBQSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtJQUNoQyxZQUFBLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDaEUsWUFBQSxJQUFJLFNBQVMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO0lBQ2xDLGdCQUFBLE9BQU8sVUFBVTs7SUFFbkIsWUFBQSxPQUFPLENBQUMsY0FBYyxDQUNwQixPQUFPLEVBQ1AsRUFBRSxHQUFHLFNBQVMsRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUM3QixVQUFVLENBQUMsS0FBSyxDQUNq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
646
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvZGVjb3JhdG9ycy9oZWxwZXJzLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMvQXBpUHJvcGVydHkudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvY29yZS1tb2R1bGUudHMiLCIuLi9zcmMvUmVwb0ZhY3RvcnkudHMiLCIuLi9zcmMvbW9kZWwtbW9kdWxlLnRzIiwiLi4vc3JjL21vZHVsZS50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGUgKi9cblxuaW1wb3J0IHsgTUVUSE9EX01FVEFEQVRBIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNDb25zdHJ1Y3RvciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi91dGlscy9zaGFyZWQudXRpbHNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzVW5kZWZpbmVkLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXIvZGlzdC9wbHVnaW4vcGx1Z2luLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXIvZGlzdC9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgeyBvdmVycmlkZUV4aXN0aW5nIH0gPSB7IG92ZXJyaWRlRXhpc3Rpbmc6IHRydWUgfVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBrZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBtZXRhZGF0YSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIGlmIChwcmV2VmFsdWUgJiYgIW92ZXJyaWRlRXhpc3RpbmcpIHtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7IC4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGEgfSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsYXNzRGVjb3JhdG9yPFQgZXh0ZW5kcyBBcnJheTxhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCA9IFtdIGFzIHVua25vd24gYXMgVFxuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldCkgPT4ge1xuICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIFsuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhXSwgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLCB0YXJnZXQpIHx8IFtdO1xuXG4gICAgY29uc3Qga2V5ID0gYDoke3Byb3BlcnR5S2V5fWA7XG4gICAgaWYgKCFwcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksXG4gICAgICAgIFsuLi5wcm9wZXJ0aWVzLCBgOiR7cHJvcGVydHlLZXl9YF0sXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKGV4aXN0aW5nTWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IG5ld01ldGFkYXRhID0gcGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhVG9TYXZlID0gb3ZlcnJpZGVFeGlzdGluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgIH07XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFUb1NhdmUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID1cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIG92ZXJyaWRlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QgfCBGdW5jdGlvbixcbiAgICBrZXk/OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKTogYW55ID0+IHtcbiAgICBjb25zdCBwYXJhbU9wdGlvbnMgPSB7XG4gICAgICAuLi5pbml0aWFsLFxuICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICB9O1xuXG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQucHJvdG90eXBlKTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlLZXkgb2YgcHJvcGVydHlLZXlzKSB7XG4gICAgICBpZiAoaXNDb25zdHJ1Y3Rvcihwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGhvZERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICB0YXJnZXQucHJvdG90eXBlLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcblxuICAgICAgaWYgKCFtZXRob2REZXNjcmlwdG9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0FwaU1ldGhvZCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXG4gICAgICAgIE1FVEhPRF9NRVRBREFUQSxcbiAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcblxuICAgICAgaWYgKCFpc0FwaU1ldGhvZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBFbnVtQWxsb3dlZFR5cGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L2ludGVyZmFjZXMvc2NoZW1hLW9iamVjdC1tZXRhZGF0YS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEVudW1TY2hlbWFBdHRyaWJ1dGVzIH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L2ludGVyZmFjZXMvZW51bS1zY2hlbWEtYXR0cmlidXRlcy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyL2Rpc3QvZGVjb3JhdG9ycy9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBnZXRFbnVtVHlwZSxcbiAgZ2V0RW51bVZhbHVlcyxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L3V0aWxzL2VudW0udXRpbHNcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyL2Rpc3QvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVQcm9wZXJ0eURlY29yYXRvciB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlDb21tb25PcHRpb25zID0gU2NoZW1hT2JqZWN0TWV0YWRhdGEgJiB7XG4gIFwieC1lbnVtTmFtZXNcIj86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTGF6eSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAgICogY2FuIGJlIHVzZWQgYXMgYW4gaWRcbiAgICpcbiAgICogVXNlIHRvZ2V0aGVyIHdpdGggQEFwaURlZmF1bHRHZXR0ZXIgb24gdGhlIGdldHRlciByb3V0ZSBvZiB0aGUgdHlwZVxuICAgKiB0byBnZW5lcmF0ZSBPcGVuQVBJIGxpbmsgb2JqZWN0c1xuICAgKlxuICAgKiBAc2VlIFtTd2FnZ2VyIGxpbmsgb2JqZWN0c10oaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi9saW5rcy8pXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIGxpbms/OiAoKSA9PiBUeXBlPHVua25vd24+IHwgRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eU9wdGlvbnMgPVxuICB8IEFwaVByb3BlcnR5Q29tbW9uT3B0aW9uc1xuICB8IChBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgJiB7XG4gICAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgICAgZW51bVNjaGVtYT86IEVudW1TY2hlbWFBdHRyaWJ1dGVzO1xuICAgIH0pO1xuXG5jb25zdCBpc0VudW1BcnJheSA9IChcbiAgb3B0czogQXBpUHJvcGVydHlPcHRpb25zXG4pOiBvcHRzIGlzIHtcbiAgaXNBcnJheTogdHJ1ZTtcbiAgZW51bTogRW51bUFsbG93ZWRUeXBlcztcbiAgdHlwZTogYW55O1xuICBpdGVtczogYW55O1xufSA9PiAob3B0cy5pc0FycmF5ICYmIFwiZW51bVwiIGluIG9wdHMgJiYgb3B0cy5lbnVtICE9PSB1bmRlZmluZWQpIGFzIGJvb2xlYW47XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpUHJvcGVydHkoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9XG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fSxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgY29uc3QgW3R5cGUsIGlzQXJyYXldID0gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgICBvcHRpb25zLnR5cGUsXG4gICAgb3B0aW9ucy5pc0FycmF5IGFzIGJvb2xlYW5cbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IHN3YWdnZXIgb3ZlcnJpZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQXBpUHJvcGVydHlPcHRpb25hbChcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQXBpUmVzcG9uc2VQcm9wZXJ0eShcbiAgb3B0aW9uczogUGljazxcbiAgICBBcGlQcm9wZXJ0eU9wdGlvbnMsXG4gICAgXCJ0eXBlXCIgfCBcImV4YW1wbGVcIiB8IFwiZm9ybWF0XCIgfCBcImRlcHJlY2F0ZWRcIiB8IFwiZW51bVwiXG4gID4gPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVDb25maWcsXG4gIEluamVjdGFibGVzS2V5cyxcbiAgSW5qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL2RlY29yYXRvcnMvQXBpUHJvcGVydHlcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0YWJsZShcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIGNmZzogSW5qZWN0YWJsZUNvbmZpZ1xuICAgICkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXggfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5EZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbmltdW06IG1pbiB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhMZW5ndGhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heExlbmd0aDogbWF4IH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4gfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKHR5cGU6IChzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSlbXSB8IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpKSB7XG4vLyAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiB0eXBlIGFzIGFueSB9KTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoKSB7XG4vLyAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBEYXRlIH0pO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4gICAgICBjbGF6ejpcbiAgICAgICAgfCBDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pXG4gICAgICAgIHwgKENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PikpW11cbiAgICApIHtcbiAgICAgIGNvbnN0IGMgPSBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6WzBdIDogY2xheno7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBbY10gfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5PUFRJT04pXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuLy8gICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbi8vICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IGVudW06IG9wdHMgfSk7XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGF0dGVybkRlYyhwYXQ6IFJlZ0V4cCB8IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgcGF0dGVybjogdHlwZW9mIHBhdCA9PT0gXCJzdHJpbmdcIiA/IHBhdCA6IHBhdC5zb3VyY2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uRGVjKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuIiwiZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbiIsImltcG9ydCB7XG4gIER5bmFtaWNNb2R1bGUsXG4gIEdsb2JhbCxcbiAgSW5qZWN0LFxuICBNb2R1bGUsXG4gIE9uQXBwbGljYXRpb25TaHV0ZG93bixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgREVDQUZfQURBUFRFUl9JRCwgREVDQUZfTU9EVUxFX09QVElPTlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZhY3RvcnlQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL21vZHVsZXMvcHJvdmlkZXIuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxcbiAgQ09ORixcbiAgQURBUFRFUiBleHRlbmRzIEFkYXB0ZXI8Q09ORiwgYW55LCBhbnksIGFueSwgYW55Pixcbj4gaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIHN0YXRpYyBfYWRhcHRlckluc3RhbmNlOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PiB8IG51bGwgPVxuICAgIG51bGw7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmQ29yZU1vZHVsZSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfTU9EVUxFX09QVElPTlMpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnM8Q09ORiwgQURBUFRFUj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZWY6IE1vZHVsZVJlZlxuICApIHt9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUFkYXB0ZXIoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXJJbnN0YW5jZSkge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWRhcHRlcik7XG4gICAgICBsb2cuaW5mbyhcIkNyZWF0aW5nIGFkYXB0ZXIgaW5zdGFuY2UuLi5cIik7XG4gICAgICB0aGlzLl9hZGFwdGVySW5zdGFuY2UgPSBuZXcgb3B0aW9ucy5hZGFwdGVyKG9wdGlvbnMuY29uZiwgb3B0aW9ucy5hbGlhcyk7XG4gICAgICBsb2cuaW5mbyhcIkFkYXB0ZXIgaW5zdGFuY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlckluc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGdldEFkYXB0ZXJJbnN0YW5jZSgpOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVySW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCB0eXBlT3JtTW9kdWxlT3B0aW9ucyA9IHtcbiAgICAgIHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLFxuICAgICAgdXNlVmFsdWU6IG9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IGFkYXB0ZXI6IEZhY3RvcnlQcm92aWRlcjxhbnk+ID0ge1xuICAgICAgdXNlRmFjdG9yeTogYXN5bmMgKG9wdHM6IERlY2FmTW9kdWxlT3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gRGVjYWZDb3JlTW9kdWxlLmNyZWF0ZUFkYXB0ZXIob3B0cyk7XG4gICAgICB9LFxuICAgICAgcHJvdmlkZTogREVDQUZfQURBUFRFUl9JRCxcbiAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgICBzY29wZTogU2NvcGUuREVGQVVMVCxcbiAgICAgIGluamVjdDogW0RFQ0FGX01PRFVMRV9PUFRJT05TXSxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvdmlkZXJzID0gW2FkYXB0ZXIsIHR5cGVPcm1Nb2R1bGVPcHRpb25zXTtcbiAgICBjb25zdCBleHBvcnRzID0gW2FkYXB0ZXJdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZDb3JlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0cyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgb25BcHBsaWNhdGlvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IERlY2FmQ29yZU1vZHVsZS5sb2cuZm9yKHRoaXMub25BcHBsaWNhdGlvblNodXRkb3duKTtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5tb2R1bGVSZWYuZ2V0PEFEQVBURVI+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBsb2cuaW5mbyhcIlNodXR0aW5nIGRvd25cIik7XG4gICAgICAgIGF3YWl0IGFkYXB0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgRGVjYWZDb3JlTW9kdWxlLl9hZGFwdGVySW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvRmFjdG9yeSB7XG4gIGZvcjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPik6IFJlcG88TT4ge1xuICAgIG1vZGVsID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gKE1vZGVsLmdldChtb2RlbCkgYXMgYW55KSA6IG1vZGVsO1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApO1xuICAgIH1cbiAgICByZXR1cm4gUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbCBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJvZHksXG4gIENvbnRyb2xsZXIsXG4gIERlbGV0ZSxcbiAgRHluYW1pY01vZHVsZSxcbiAgR2V0LFxuICBNb2R1bGUsXG4gIFBhcmFtLFxuICBQb3N0LFxuICBQdXQsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dlciwgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFJlcG9GYWN0b3J5IH0gZnJvbSBcIi4vUmVwb0ZhY3RvcnlcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9Nb2RlbENvbnRyb2xsZXI8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICApIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50b01vZGVsQ29udHJvbGxlcik7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShNb2RlbENsYXp6KTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDbGF6ei5uYW1lO1xuXG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBjb250cm9sbGVyIGZvciBtb2RlbDogJHttb2RlbENsYXp6TmFtZX1gKTtcblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDbGF6eilcbiAgICBjbGFzcyBEeW5hbWljTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICAgICAgLy8gcHJpdmF0ZSByZWFkb25seSByZXBvID0gdGhpcy5yZXBvRmFjdG9yeS5mb3IoTW9kZWxDbGF6eik7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHBrITogc3RyaW5nO1xuICAgICAgcHJpdmF0ZSByZWFkb25seSByZXBvITogUmVwbzxUPjsgLy9SZXBvc2l0b3J5PE1vZGVsPGFueT4sIGFueSwgYW55LCBhbnksIGFueT47XG5cbiAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVwb0ZhY3Rvcnk6IFJlcG9GYWN0b3J5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfSByb3V0ZTogLyR7cm91dGVQYXRofWBcbiAgICAgICAgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVwbyA9IHRoaXMucmVwb0ZhY3RvcnkuZm9yKE1vZGVsQ2xhenoubmFtZSk7XG4gICAgICAgICAgdGhpcy5wayA9IHRoaXMucmVwby5wayBhcyBzdHJpbmc7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBpbml0aWFsaXplIHJlcG9zaXRvcnkgZm9yIG1vZGVsIFwiJHtNb2RlbENsYXp6Lm5hbWV9XCIuYCxcbiAgICAgICAgICAgIGVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBQb3N0KClcbiAgICAgIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSlcbiAgICAgIEBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ2xhenopIH0sXG4gICAgICB9KVxuICAgICAgQEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgIH0pXG4gICAgICBAQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KVxuICAgICAgQEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KVxuICAgICAgYXN5bmMgY3JlYXRlKEBCb2R5KCkgZGF0YTogVCk6IFByb21pc2U8TW9kZWw8YW55Pj4ge1xuICAgICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGUpO1xuICAgICAgICBsb2cudmVyYm9zZShgY3JlYXRpbmcgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIGxldCBjcmVhdGVkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjcmVhdGVkID0gYXdhaXQgdGhpcy5yZXBvLmNyZWF0ZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7Y3JlYXRlZFt0aGlzLnBrXX1gKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICB9XG5cbiAgICAgIEBHZXQoXCI6aWRcIilcbiAgICAgIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KVxuICAgICAgQEFwaVBhcmFtKHsgbmFtZTogXCJpZFwiLCBkZXNjcmlwdGlvbjogXCJQcmltYXJ5IGtleVwiIH0pXG4gICAgICBAQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIGFzeW5jIHJlYWQoQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWFkKTtcbiAgICAgICAgbGV0IHJlYWQ6IE1vZGVsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgcmVhZGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQoaWQpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLFxuICAgICAgICAgICAgZSBhcyBFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZy5pbmZvKGByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtyZWFkW3RoaXMucGtdfWApO1xuICAgICAgICByZXR1cm4gcmVhZDtcbiAgICAgIH1cblxuICAgICAgQFB1dChcIjppZFwiKVxuICAgICAgQEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGFuIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB3aXRoIGEgbmV3IHBheWxvYWQuYCxcbiAgICAgIH0pXG4gICAgICBAQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjZSBhIGV4aXN0aW5nIHJlY29yZCBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ2xhenopIH0sXG4gICAgICB9KVxuICAgICAgQEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7TW9kZWxDbGF6en0gcmVjb3JkIHJlcGxhY2VkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pXG4gICAgICBhc3luYyB1cGRhdGUoQEJvZHkoKSBkYXRhOiBNb2RlbDxhbnk+KSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZSk7XG4gICAgICAgIGxldCB1cGRhdGVkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICAgIGB1cGRhdGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtkYXRhW3RoaXMucGtdfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnJlcG8uY3JlYXRlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH1cblxuICAgICAgQERlbGV0ZShcIjppZFwiKVxuICAgICAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KVxuICAgICAgQEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgdG8gZGVsZXRlLmAsXG4gICAgICB9KVxuICAgICAgQEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIGFzeW5jIGRlbGV0ZShAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmRlbGV0ZSk7XG4gICAgICAgIGxldCByZWFkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICBgZGVsZXRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGsgYXMgc3RyaW5nfSAke2lkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlYWQgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGRlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCxcbiAgICAgICAgICAgIGUgYXMgRXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke3JlYWRbdGhpcy5wa119YCk7XG4gICAgICAgIHJldHVybiByZWFkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGZvclJvb3QoZmxhdm91cjogc3RyaW5nKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgY29udHJvbGxlcnMgZm9yIGZsYXZvdXIuLi5gKTtcblxuICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKTtcbiAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKHRoaXMudG9Nb2RlbENvbnRyb2xsZXIuYmluZCh0aGlzKSk7XG5cbiAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2RlbE1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgcHJvdmlkZXJzOiBbUmVwb0ZhY3RvcnldLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIEZvcndhcmRSZWZlcmVuY2UsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmQ29yZU1vZHVsZSB9IGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsTW9kdWxlIH0gZnJvbSBcIi4vbW9kZWwtbW9kdWxlXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kdWxlIHtcbiAgc3RhdGljIGFzeW5jIGZvclJvb3RBc3luYyhcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxEeW5hbWljTW9kdWxlPiB7XG4gICAgY29uc3QgeyBhdXRvQ29udHJvbGxlcnMgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhZGFwdGVyID0gYXdhaXQgRGVjYWZDb3JlTW9kdWxlLmNyZWF0ZUFkYXB0ZXIob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91ciA9IGFkYXB0ZXIuZmxhdm91cjtcblxuICAgIGNvbnN0IGltcG9ydHM6XG4gICAgICB8IChcbiAgICAgICAgICB8IER5bmFtaWNNb2R1bGVcbiAgICAgICAgICB8IFR5cGU8YW55PlxuICAgICAgICAgIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPlxuICAgICAgICAgIHwgRm9yd2FyZFJlZmVyZW5jZTxhbnk+XG4gICAgICAgIClbXVxuICAgICAgfCB1bmRlZmluZWQgPSBbRGVjYWZDb3JlTW9kdWxlLmZvclJvb3Qob3B0aW9ucyldO1xuXG4gICAgaWYgKGF1dG9Db250cm9sbGVycykge1xuICAgICAgaW1wb3J0cy5wdXNoKERlY2FmTW9kZWxNb2R1bGUuZm9yUm9vdChmbGF2b3VyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7TW9kZWx9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7SW50ZXJuYWxFcnJvcn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1JlcG9zaXRvcnl9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb0Zvck1vZGVsKG1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgbSA9IE1vZGVsLmdldChtb2RlbCk7XG5cdGlmICghbSlcblx0XHR0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGZpbmQgcmVwb3NpdG9yeSBmb3IgJHttb2RlbH1gKVxuXHRjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtKTtcblx0cmV0dXJuIHJlcG87XG59IiwiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JlcG9GYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0VfTkFNRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbIkRFQ09SQVRPUlMiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIk1FVEFEQVRBX0ZBQ1RPUllfTkFNRSIsImlzQ29uc3RydWN0b3IiLCJNRVRIT0RfTUVUQURBVEEiLCJpc0FycmF5IiwiZ2V0VHlwZUlzQXJyYXlUdXBsZSIsImdldEVudW1WYWx1ZXMiLCJnZXRFbnVtVHlwZSIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJbmplY3RhYmxlIiwiU2NvcGUiLCJJbmplY3QiLCJWYWxpZGF0aW9uS2V5cyIsIlBlcnNpc3RlbmNlS2V5cyIsIkRlY29yYXRpb25LZXlzIiwiTG9nZ2luZyIsIl9fZGVjb3JhdGUiLCJHbG9iYWwiLCJNb2R1bGUiLCJfX3BhcmFtIiwiTW9kdWxlUmVmIiwiUmVwb0ZhY3RvcnkiLCJNb2RlbCIsIkludGVybmFsRXJyb3IiLCJSZXBvc2l0b3J5IiwidG9LZWJhYkNhc2UiLCJMb2dnZWRDbGFzcyIsIlBvc3QiLCJBcGlPcGVyYXRpb24iLCJBcGlCb2R5IiwiZ2V0U2NoZW1hUGF0aCIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsIkFwaUJhZFJlcXVlc3RSZXNwb25zZSIsIkFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSIsIkJvZHkiLCJHZXQiLCJBcGlQYXJhbSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiUGFyYW0iLCJQdXQiLCJEZWxldGUiLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwiQWRhcHRlciIsIkRlY2FmTW9kdWxlIiwiTWV0YWRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBO0lBUWdCLFNBQUEscUJBQXFCLENBQ25DLE9BQWUsRUFD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