@ditojs/server 0.270.0 → 0.273.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/lib/app/Application.js +59 -22
  2. package/lib/app/SessionStore.js +3 -1
  3. package/lib/app/Validator.js +16 -2
  4. package/lib/app/index.js +7 -1
  5. package/lib/cli/console.js +11 -1
  6. package/lib/cli/db/createMigration.js +13 -1
  7. package/lib/cli/db/index.js +7 -1
  8. package/lib/cli/db/listAssetConfig.js +4 -2
  9. package/lib/cli/db/seed.js +10 -2
  10. package/lib/cli/index.js +6 -2
  11. package/lib/controllers/AdminController.js +18 -6
  12. package/lib/controllers/CollectionController.js +15 -1
  13. package/lib/controllers/Controller.js +25 -1
  14. package/lib/controllers/ControllerAction.js +18 -6
  15. package/lib/controllers/RelationController.js +7 -1
  16. package/lib/controllers/UserController.js +15 -1
  17. package/lib/controllers/index.js +7 -1
  18. package/lib/decorators/index.js +7 -1
  19. package/lib/decorators/parameters.js +4 -2
  20. package/lib/decorators/returns.js +4 -2
  21. package/lib/errors/DatabaseError.js +5 -19
  22. package/lib/errors/ResponseError.js +4 -14
  23. package/lib/errors/index.js +7 -1
  24. package/lib/graph/DitoGraphProcessor.js +5 -1
  25. package/lib/graph/expression.js +5 -1
  26. package/lib/graph/graph.js +18 -2
  27. package/lib/graph/index.js +7 -1
  28. package/lib/index.js +7 -1
  29. package/lib/lib/index.js +7 -1
  30. package/lib/middleware/findRoute.js +7 -1
  31. package/lib/middleware/index.js +7 -1
  32. package/lib/mixins/AssetMixin.js +4 -4
  33. package/lib/mixins/SessionMixin.js +4 -4
  34. package/lib/mixins/TimeStampedMixin.js +4 -4
  35. package/lib/mixins/UserMixin.js +10 -4
  36. package/lib/mixins/index.js +7 -1
  37. package/lib/models/Model.js +41 -22
  38. package/lib/models/definitions/filters.js +9 -1
  39. package/lib/models/definitions/properties.js +7 -1
  40. package/lib/models/definitions/scopes.js +9 -1
  41. package/lib/models/index.js +7 -1
  42. package/lib/query/QueryBuilder.js +11 -1
  43. package/lib/query/QueryFilters.js +11 -1
  44. package/lib/query/index.js +7 -1
  45. package/lib/schema/formats/index.js +7 -1
  46. package/lib/schema/index.js +10 -2
  47. package/lib/schema/keywords/index.js +7 -1
  48. package/lib/schema/properties.js +11 -1
  49. package/lib/schema/relations.js +18 -4
  50. package/lib/services/index.js +7 -1
  51. package/lib/storage/DiskStorage.js +7 -1
  52. package/lib/storage/Storage.js +5 -1
  53. package/lib/storage/index.js +7 -1
  54. package/lib/utils/emitter.js +5 -1
  55. package/lib/utils/index.js +15 -1
  56. package/lib/utils/json.js +9 -0
  57. package/lib/utils/object.js +9 -3
  58. package/package.json +29 -29
  59. package/src/app/Application.js +28 -5
  60. package/src/app/Validator.js +2 -1
  61. package/src/cli/db/listAssetConfig.js +3 -1
  62. package/src/controllers/AdminController.js +3 -2
  63. package/src/controllers/ControllerAction.js +7 -5
  64. package/src/decorators/parameters.js +2 -2
  65. package/src/decorators/returns.js +2 -2
  66. package/src/errors/DatabaseError.js +2 -23
  67. package/src/errors/ResponseError.js +1 -8
  68. package/src/models/Model.js +13 -8
  69. package/src/utils/index.js +1 -0
  70. package/src/utils/json.js +3 -0
@@ -3,6 +3,26 @@
3
3
  exports.__esModule = true;
4
4
  exports.Application = void 0;
5
5
 
6
+ require("core-js/modules/esnext.async-iterator.filter.js");
7
+
8
+ require("core-js/modules/esnext.iterator.constructor.js");
9
+
10
+ require("core-js/modules/esnext.iterator.filter.js");
11
+
12
+ require("core-js/modules/es.error.cause.js");
13
+
14
+ require("core-js/modules/esnext.async-iterator.reduce.js");
15
+
16
+ require("core-js/modules/esnext.iterator.reduce.js");
17
+
18
+ require("core-js/modules/esnext.async-iterator.find.js");
19
+
20
+ require("core-js/modules/esnext.iterator.find.js");
21
+
22
+ require("core-js/modules/esnext.async-iterator.map.js");
23
+
24
+ require("core-js/modules/esnext.iterator.map.js");
25
+
6
26
  var _koa = _interopRequireDefault(require("koa"));
7
27
 
8
28
  var _knex2 = _interopRequireDefault(require("knex"));
@@ -53,6 +73,8 @@ var _storage = require("../storage");
53
73
 
54
74
  var _schema = require("../schema");
55
75
 
76
+ var _utils = require("../utils");
77
+
56
78
  var _errors = require("../errors");
57
79
 
58
80
  var _SessionStore = _interopRequireDefault(require("./SessionStore"));
@@ -61,7 +83,7 @@ var _Validator = require("./Validator");
61
83
 
62
84
  var _middleware = require("../middleware");
63
85
 
64
- var _utils = require("@ditojs/utils");
86
+ var _utils2 = require("@ditojs/utils");
65
87
 
66
88
  var _objection = require("objection");
67
89
 
@@ -131,7 +153,7 @@ class Application extends _koa.default {
131
153
  }
132
154
 
133
155
  addRoute(verb, path, transacted, handlers, controller = null, action = null) {
134
- handlers = (0, _utils.asArray)(handlers);
156
+ handlers = (0, _utils2.asArray)(handlers);
135
157
  const handler = handlers.length > 1 ? (0, _koaCompose.default)(handlers) : handlers[0];
136
158
  const route = {
137
159
  verb,
@@ -166,7 +188,7 @@ class Application extends _koa.default {
166
188
 
167
189
  if (log.schema || log.relations) {
168
190
  for (const modelClass of sortedModels) {
169
- const shouldLog = option => option === true || (0, _utils.asArray)(option).includes(modelClass.name);
191
+ const shouldLog = option => option === true || (0, _utils2.asArray)(option).includes(modelClass.name);
170
192
 
171
193
  const data = {};
172
194
 
@@ -175,7 +197,7 @@ class Application extends _koa.default {
175
197
  }
176
198
 
177
199
  if (shouldLog(log.relations)) {
178
- data.relations = (0, _utils.clone)(modelClass.relationMappings, value => _objection.Model.isPrototypeOf(value) ? `[Model: ${value.name}]` : value);
200
+ data.relations = (0, _utils2.clone)(modelClass.relationMappings, value => _objection.Model.isPrototypeOf(value) ? `[Model: ${value.name}]` : value);
179
201
  }
180
202
 
181
203
  if (Object.keys(data).length > 0) {
@@ -247,7 +269,7 @@ class Application extends _koa.default {
247
269
 
248
270
  addServices(services) {
249
271
  for (const [name, service] of Object.entries(services)) {
250
- if (name === 'default' && (0, _utils.isPlainObject)(service)) {
272
+ if (name === 'default' && (0, _utils2.isPlainObject)(service)) {
251
273
  this.addServices(service);
252
274
  } else {
253
275
  this.addService(service, name);
@@ -294,7 +316,7 @@ class Application extends _koa.default {
294
316
 
295
317
  addControllers(controllers, namespace) {
296
318
  for (const [key, value] of Object.entries(controllers)) {
297
- if ((0, _utils.isPlainObject)(value)) {
319
+ if ((0, _utils2.isPlainObject)(value)) {
298
320
  this.addControllers(value, namespace ? `${namespace}/${key}` : key);
299
321
  } else {
300
322
  this.addController(value, namespace);
@@ -367,7 +389,7 @@ class Application extends _koa.default {
367
389
 
368
390
  if (property && index === 0) {
369
391
  const normalizedName = normalizeDbNames ? this.normalizeIdentifier(name) : name;
370
- const dataPath = (0, _utils.normalizeDataPath)([normalizedName, ...(0, _utils.parseDataPath)(nestedDataPath)]);
392
+ const dataPath = (0, _utils2.normalizeDataPath)([normalizedName, ...(0, _utils2.parseDataPath)(nestedDataPath)]);
371
393
  const assetConfigs = convertedAssets[normalizedName] || (convertedAssets[normalizedName] = {});
372
394
  assetConfigs[dataPath] = config;
373
395
  } else {
@@ -391,7 +413,7 @@ class Application extends _koa.default {
391
413
  addStorage(config, name) {
392
414
  let storage = null;
393
415
 
394
- if ((0, _utils.isPlainObject)(config)) {
416
+ if ((0, _utils2.isPlainObject)(config)) {
395
417
  const storageClass = _storage.Storage.get(config.type);
396
418
 
397
419
  if (!storageClass) {
@@ -443,14 +465,14 @@ class Application extends _koa.default {
443
465
 
444
466
  let asObject = false;
445
467
 
446
- if ((0, _utils.isArray)(parameters)) {
468
+ if ((0, _utils2.isArray)(parameters)) {
447
469
  for (const {
448
470
  name,
449
471
  ...schema
450
472
  } of parameters) {
451
473
  addParameter(name, schema);
452
474
  }
453
- } else if ((0, _utils.isObject)(parameters)) {
475
+ } else if ((0, _utils2.isObject)(parameters)) {
454
476
  asObject = true;
455
477
 
456
478
  for (const [name, schema] of Object.entries(parameters)) {
@@ -485,12 +507,26 @@ class Application extends _koa.default {
485
507
  type,
486
508
  message,
487
509
  errors,
488
- options
510
+ options,
511
+ json
489
512
  }) {
513
+ var _this$config$log$erro;
514
+
490
515
  return new _errors.ValidationError({
491
516
  type,
492
517
  message,
493
- errors: this.validator.parseErrors(errors, options)
518
+ errors: this.validator.parseErrors(errors, options),
519
+ json: (_this$config$log$erro = this.config.log.errors) != null && _this$config$log$erro.json ? json : undefined
520
+ });
521
+ }
522
+
523
+ createDatabaseError(error) {
524
+ var _this$config$log$erro2;
525
+
526
+ const [, sql, message] = error.message.match(/^([\s\S]*) - ([\s\S]*?)$/) || [null, null, error.message];
527
+ return new _errors.DatabaseError(error, {
528
+ message,
529
+ sql: (_this$config$log$erro2 = this.config.log.errors) != null && _this$config$log$erro2.sql ? sql : undefined
494
530
  });
495
531
  }
496
532
 
@@ -500,7 +536,6 @@ class Application extends _koa.default {
500
536
  log
501
537
  } = this.config;
502
538
  this.use((0, _middleware.attachLogger)(this.logger));
503
- this.use((0, _middleware.handleError)());
504
539
 
505
540
  if (app.responseTime !== false) {
506
541
  this.use((0, _koaResponseTime.default)(getOptions(app.responseTime)));
@@ -510,6 +545,8 @@ class Application extends _koa.default {
510
545
  this.use((0, _middleware.logRequests)());
511
546
  }
512
547
 
548
+ this.use((0, _middleware.handleError)());
549
+
513
550
  if (app.helmet !== false) {
514
551
  this.use((0, _koaHelmet.default)(getOptions(app.helmet)));
515
552
  }
@@ -519,7 +556,7 @@ class Application extends _koa.default {
519
556
  }
520
557
 
521
558
  if (app.compress !== false) {
522
- this.use((0, _koaCompress.default)((0, _utils.merge)({
559
+ this.use((0, _koaCompress.default)((0, _utils2.merge)({
523
560
  br: {
524
561
  params: {
525
562
  [_zlib.default.constants.BROTLI_PARAM_QUALITY]: 4
@@ -588,7 +625,7 @@ class Application extends _koa.default {
588
625
  res,
589
626
  user
590
627
  };
591
- const logger = (0, _pino.default)((0, _utils.merge)({
628
+ const logger = (0, _pino.default)((0, _utils2.merge)({
592
629
  level: 'info',
593
630
  serializers,
594
631
  prettyPrint: {
@@ -680,15 +717,15 @@ class Application extends _koa.default {
680
717
  }
681
718
 
682
719
  normalizePath(path) {
683
- return this.config.app.normalizePaths ? (0, _utils.hyphenate)(path) : path;
720
+ return this.config.app.normalizePaths ? (0, _utils2.hyphenate)(path) : path;
684
721
  }
685
722
 
686
723
  formatError(err) {
687
- var _this$config$log$erro;
724
+ var _this$config$log$erro3;
688
725
 
689
- const message = err.toJSON ? JSON.stringify(err.toJSON(), null, 2) : err.message || err;
726
+ const message = err.toJSON ? (0, _utils.formatJson)(err.toJSON()) : err.message || err;
690
727
  const str = `${err.name}: ${message}`;
691
- return err.stack && ((_this$config$log$erro = this.config.log.errors) == null ? void 0 : _this$config$log$erro.stack) !== false ? `${str}\n${err.stack.split(/\n|\r\n|\r/).slice(1).join(_os.default.EOL)}` : str;
728
+ return err.stack && ((_this$config$log$erro3 = this.config.log.errors) == null ? void 0 : _this$config$log$erro3.stack) !== false ? `${str}\n${err.stack.split(/\n|\r\n|\r/).slice(1).join(_os.default.EOL)}` : str;
692
729
  }
693
730
 
694
731
  logError(err, ctx) {
@@ -793,7 +830,7 @@ class Application extends _koa.default {
793
830
  cleanupTimeThreshold = 0
794
831
  } = {}
795
832
  } = this.config;
796
- const timeThreshold = (0, _utils.isString)(cleanupTimeThreshold) ? (0, _parseDuration.default)(cleanupTimeThreshold) : cleanupTimeThreshold;
833
+ const timeThreshold = (0, _utils2.isString)(cleanupTimeThreshold) ? (0, _parseDuration.default)(cleanupTimeThreshold) : cleanupTimeThreshold;
797
834
  const importedFiles = [];
798
835
  const AssetModel = this.getModel('Asset');
799
836
 
@@ -913,6 +950,6 @@ exports.Application = Application;
913
950
  _lib.EventEmitter.mixin(Application.prototype);
914
951
 
915
952
  function getOptions(options) {
916
- return (0, _utils.isObject)(options) ? options : {};
953
+ return (0, _utils2.isObject)(options) ? options : {};
917
954
  }
918
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsImNoYWxrIiwieWVsbG93IiwiYm9sZCIsInV0aWwiLCJpbnNwZWN0IiwiY29sb3JzIiwiZGVwdGgiLCJtYXhBcnJheUxlbmd0aCIsIkVycm9yIiwic29ydEJ5UmVsYXRpb25zIiwibGlzdCIsImNvbGxlY3RlZCIsImV4Y2x1ZGVkIiwicmVsYXRpb24iLCJnZXRSZWxhdGlvbnMiLCJCZWxvbmdzVG9PbmVSZWxhdGlvbiIsInJlbGF0ZWRNb2RlbENsYXNzIiwiam9pblRhYmxlTW9kZWxDbGFzcyIsInJlbGF0ZWQiLCJyZXZlcnNlIiwicmVkdWNlIiwiZ2V0TW9kZWwiLCJlbmRzV2l0aCIsImZpbmRNb2RlbCIsImNhbGxiYWNrIiwiZmluZCIsInNlcnZpY2UiLCJlbnRyaWVzIiwiYWRkU2VydmljZSIsIlNlcnZpY2UiLCJ1bmRlZmluZWQiLCJnZXRTZXJ2aWNlIiwiZmluZFNlcnZpY2UiLCJmb3JFYWNoU2VydmljZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJuYW1lc3BhY2UiLCJrZXkiLCJhZGRDb250cm9sbGVyIiwic2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSIsIkNvbnRyb2xsZXIiLCJ1cmwiLCJjb21wb3NlIiwiZ2V0Q29udHJvbGxlciIsImZpbmRDb250cm9sbGVyIiwiZ2V0QWRtaW5Db250cm9sbGVyIiwiQWRtaW5Db250cm9sbGVyIiwiZ2V0QWRtaW5WdWVDb25maWciLCJnZXRWdWVDb25maWciLCJnZXRBc3NldENvbmZpZyIsIm5vcm1hbGl6ZURiTmFtZXMiLCJhc3NldENvbmZpZyIsIm1vZGVsTmFtZSIsImFzc2V0cyIsImRlZmluaXRpb24iLCJub3JtYWxpemVkTW9kZWxOYW1lIiwibm9ybWFsaXplSWRlbnRpZmllciIsImNvbnZlcnRlZEFzc2V0cyIsImFzc2V0RGF0YVBhdGgiLCJwcm9wZXJ0eSIsIm5lc3RlZERhdGFQYXRoIiwiaW5kZXgiLCJnZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoIiwibm9ybWFsaXplZE5hbWUiLCJkYXRhUGF0aCIsImFzc2V0Q29uZmlncyIsImFkZFN0b3JhZ2UiLCJzdG9yYWdlIiwic3RvcmFnZUNsYXNzIiwiU3RvcmFnZSIsImdldCIsInR5cGUiLCJnZXRTdG9yYWdlIiwiY29tcGlsZVZhbGlkYXRvciIsImpzb25TY2hlbWEiLCJvcHRpb25zIiwiY29tcGlsZSIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwicGFyYW1ldGVycyIsImRhdGFOYW1lIiwicHJvcGVydGllcyIsImFkZFBhcmFtZXRlciIsInB1c2giLCJtZW1iZXIiLCJhc09iamVjdCIsInZhbGlkYXRlIiwiY29lcmNlVHlwZXMiLCJjdHgiLCJjYWxsIiwiY3JlYXRlVmFsaWRhdGlvbkVycm9yIiwibWVzc2FnZSIsImVycm9ycyIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwic3FsIiwic2V0dXBLbmV4TG9nZ2luZyIsInN0YXJ0VGltZXMiLCJlbmQiLCJxdWVyeSIsInJlc3BvbnNlIiwiZXJyb3IiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0ciIsInN0YWNrIiwic3BsaXQiLCJzbGljZSIsImpvaW4iLCJvcyIsIkVPTCIsImxvZ0Vycm9yIiwiZXhwb3NlIiwidGV4dCIsIlJlc3BvbnNlRXJyb3IiLCJzdGF0dXMiLCJlIiwic3RhcnQiLCJlbWl0Iiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJyZXNvbHZlIiwicmVqZWN0IiwibGlzdGVuIiwiYWRkcmVzcyIsInN0b3AiLCJjbG9zZSIsInNldEltbWVkaWF0ZSIsIm9mZiIsInN0YXJ0T3JFeGl0IiwiZXhpdCIsImNyZWF0ZUFzc2V0cyIsImZpbGVzIiwiY291bnQiLCJ0cngiLCJBc3NldE1vZGVsIiwiZmlsZSIsImluc2VydCIsImhhbmRsZUFkZGRlZEFuZFJlbW92ZWRBc3NldHMiLCJhZGRlZEZpbGVzIiwicmVtb3ZlZEZpbGVzIiwiY2xlYW51cFRpbWVUaHJlc2hvbGQiLCJ0aW1lVGhyZXNob2xkIiwiaW1wb3J0ZWRGaWxlcyIsImFkZEZvcmVpZ25Bc3NldHMiLCJjaGFuZ2VDb3VudCIsImluY3JlbWVudCIsIndoZXJlSW4iLCJzZXRUaW1lb3V0IiwicmVsZWFzZVVudXNlZEFzc2V0cyIsImFzc2V0IiwiZmluZE9uZSIsInJlZCIsImdyZWVuIiwiYXhpb3MiLCJyZXF1ZXN0IiwibWV0aG9kIiwicmVzcG9uc2VUeXBlIiwiaW1wb3J0ZWRGaWxlIiwiYWRkRmlsZSIsImFzc2lnbiIsIkFzc2V0RXJyb3IiLCJoYW5kbGVNb2RpZmllZEFzc2V0cyIsIm1vZGlmaWVkRmlsZXMiLCJjaGFuZ2VkRmlsZSIsInRyYW5zYWN0aW9uIiwiZGF0ZSIsIkRhdGUiLCJzZXRNaWxsaXNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJvcnBoYW5lZEFzc2V0cyIsIndoZXJlIiwiYW5kV2hlcmUiLCJvcnBoYW5lZEtleXMiLCJyZW1vdmVGaWxlIiwiZGVsZXRlIiwiRXZlbnRFbWl0dGVyIiwibWl4aW4iLCJwcm90b3R5cGUiXSwi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V0FOaUIsRUFNSixHQU5JLEVBTUMsb0JBQUksV0FBSixDQU5ELENBQTdCOztBQU9BLFlBQUlGLGNBQWMsQ0FBQ3pQLE1BQWYsR0FBd0IsQ0FBNUIsRUFBK0I7QUFDN0IsZ0JBQU00UCxZQUFZLEdBQUcsTUFBTWhNLE9BQU8sQ0FBQ0MsR0FBUixDQUN6QjRMLGNBQWMsQ0FBQzNMLEdBQWYsQ0FBbUIsTUFBTXVLLEtBQU4sSUFBZTtBQUNoQyxnQkFBSTtBQUNGLG9CQUFNLEtBQUtsSSxVQUFMLENBQWdCa0ksS0FBSyxDQUFDdkksT0FBdEIsRUFBK0IrSixVQUEvQixDQUEwQ3hCLEtBQUssQ0FBQ2QsSUFBaEQsQ0FBTjtBQUNELGFBRkQsQ0FFRSxPQUFPdEQsS0FBUCxFQUFjO0FBQ2QsbUJBQUttQyxJQUFMLENBQVUsT0FBVixFQUFtQm5DLEtBQW5CO0FBQ0FvRSxjQUFBQSxLQUFLLENBQUNwRSxLQUFOLEdBQWNBLEtBQWQ7QUFDRDs7QUFDRCxtQkFBT29FLEtBQUssQ0FBQ3JLLEdBQWI7QUFDRCxXQVJELENBRHlCLENBQTNCO0FBV0EsZ0JBQU1zSixVQUFVLENBQ2J2RCxLQURHLENBQ0dzRCxHQURILEVBRUh5QyxNQUZHLEdBR0g1QixPQUhHLENBR0ssS0FITCxFQUdZMEIsWUFIWixDQUFOO0FBSUQ7O0FBQ0QsZUFBT0gsY0FBUDtBQUNELE9BOUJNLENBQVA7QUErQkQ7QUFDRjs7QUF4M0JrQzs7OztBQTYzQnJDTSxrQkFBYUMsS0FBYixDQUFtQjNTLFdBQVcsQ0FBQzRTLFNBQS9COztBQUVBLFNBQVN0SSxVQUFULENBQW9CckIsT0FBcEIsRUFBNkI7QUFDM0IsU0FBTyxxQkFBU0EsT0FBVCxJQUFvQkEsT0FBcEIsR0FBOEIsRUFBckM7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBLb2EgZnJvbSAna29hJ1xuaW1wb3J0IEtuZXggZnJvbSAna25leCdcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgemxpYiBmcm9tICd6bGliJ1xuaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBvcyBmcm9tICdvcydcbmltcG9ydCBwYXJzZUR1cmF0aW9uIGZyb20gJ3BhcnNlLWR1cmF0aW9uJ1xuaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAna29hLWJvZHlwYXJzZXInXG5pbXBvcnQgY29ycyBmcm9tICdAa29hL2NvcnMnXG5pbXBvcnQgY29tcG9zZSBmcm9tICdrb2EtY29tcG9zZSdcbmltcG9ydCBjb21wcmVzcyBmcm9tICdrb2EtY29tcHJlc3MnXG5pbXBvcnQgY29uZGl0aW9uYWwgZnJvbSAna29hLWNvbmRpdGlvbmFsLWdldCdcbmltcG9ydCBwYXNzcG9ydCBmcm9tICdrb2EtcGFzc3BvcnQnXG5pbXBvcnQgc2Vzc2lvbiBmcm9tICdrb2Etc2Vzc2lvbidcbmltcG9ydCBldGFnIGZyb20gJ2tvYS1ldGFnJ1xuaW1wb3J0IGhlbG1ldCBmcm9tICdrb2EtaGVsbWV0J1xuaW1wb3J0IHJlc3BvbnNlVGltZSBmcm9tICdrb2EtcmVzcG9uc2UtdGltZSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGRpdG9qcy9yb3V0ZXInXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAL2xpYidcbmltcG9ydCB7IENvbnRyb2xsZXIsIEFkbWluQ29udHJvbGxlciB9IGZyb20gJ0AvY29udHJvbGxlcnMnXG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnQC9zZXJ2aWNlcydcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAL3N0b3JhZ2UnXG5pbXBvcnQgeyBjb252ZXJ0U2NoZW1hIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBSZXNwb25zZUVycm9yLCBWYWxpZGF0aW9uRXJyb3IsIEFzc2V0RXJyb3IgfSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93LmJvbGQoYFxcbiR7bW9kZWxDbGFzcy5uYW1lfTpcXG5gKSxcbiAgICAgICAgICAgIHV0aWwuaW5zcGVjdChkYXRhLCB7XG4gICAgICAgICAgICAgIGNvbG9yczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IG51bGwsXG4gICAgICAgICAgICAgIG1heEFycmF5TGVuZ3RoOiBudWxsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZE1vZGVsKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoTW9kZWwuaXNQcm90b3R5cGVPZihtb2RlbENsYXNzKSkge1xuICAgICAgbW9kZWxDbGFzcy5hcHAgPSB0aGlzXG4gICAgICB0aGlzLm1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7bW9kZWxDbGFzc31gKVxuICAgIH1cbiAgfVxuXG4gIHNvcnRNb2RlbHMobW9kZWxzKSB7XG4gICAgY29uc3Qgc29ydEJ5UmVsYXRpb25zID0gKGxpc3QsIGNvbGxlY3RlZCA9IHt9LCBleGNsdWRlZCA9IHt9KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgaWYgKCFjb2xsZWN0ZWRbbmFtZV0gJiYgIWV4Y2x1ZGVkW25hbWVdKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zKCkpKSB7XG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbiBpbnN0YW5jZW9mIEJlbG9uZ3NUb09uZVJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IHJlbGF0ZWRNb2RlbENsYXNzLCBqb2luVGFibGVNb2RlbENsYXNzIH0gPSByZWxhdGlvblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgW2pvaW5UYWJsZU1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbENsYXNzXSkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc2VsZi1yZWZlcmVuY2VzIGFuZCBnZW5lcmF0ZWQgam9pbiBtb2RlbHM6XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWQgJiYgcmVsYXRlZCAhPT0gbW9kZWxDbGFzcyAmJiBtb2RlbHNbcmVsYXRlZC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgc29ydEJ5UmVsYXRpb25zKFtyZWxhdGVkXSwgY29sbGVjdGVkLCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgbW9kZWxDbGFzcyB0byBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uczpcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdOiBtb2RlbENsYXNzLFxuICAgICAgICAgICAgICAgICAgICAuLi5leGNsdWRlZFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdGVkW25hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb2xsZWN0ZWQpXG4gICAgfVxuICAgIC8vIFJldHVybiBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc29ydGVkIG1vZGVscyBhcyBpdHMga2V5L3ZhbHVlIHBhaXJzLlxuICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gcmV2ZXJzZSBmb3IgdGhlIGFib3ZlIGFsZ29yaXRobSB0byBzb3J0IHByb3Blcmx5LFxuICAgIC8vIGFuZCB0aGVuIHJldmVyc2UgdGhlIHJlc3VsdCBiYWNrLlxuICAgIHJldHVybiBzb3J0QnlSZWxhdGlvbnMoT2JqZWN0LnZhbHVlcyhtb2RlbHMpLnJldmVyc2UoKSkucmV2ZXJzZSgpLnJlZHVjZShcbiAgICAgIChtb2RlbHMsIG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIHJldHVybiBtb2RlbHNcbiAgICAgIH0sXG4gICAgICBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgKVxuICB9XG5cbiAgZ2V0TW9kZWwobmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGVsc1tuYW1lXSB8fFxuICAgICAgIW5hbWUuZW5kc1dpdGgoJ01vZGVsJykgJiYgdGhpcy5tb2RlbHNbYCR7bmFtZX1Nb2RlbGBdIHx8XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZmluZE1vZGVsKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBhZGRTZXJ2aWNlcyhzZXJ2aWNlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHNlcnZpY2VdIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgICAgLy8gSGFuZGxlIEVTNiBtb2R1bGUgd2VpcmRuZXNzIHRoYXQgY2FuIGhhcHBlbiwgYXBwYXJlbnRseTpcbiAgICAgIGlmIChuYW1lID09PSAnZGVmYXVsdCcgJiYgaXNQbGFpbk9iamVjdChzZXJ2aWNlKSkge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoU2VydmljZS5pc1Byb3RvdHlwZU9mKHNlcnZpY2UpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc2VydmljZSA9IG5ldyBzZXJ2aWNlKHRoaXMsIG5hbWUpXG4gICAgfVxuICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2U6ICR7c2VydmljZX1gKVxuICAgIH1cbiAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIGBzZXJ2aWNlLm5hbWVgIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgICAvLyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGUuZy4gd2l0aCBhbiBhZnRlci1jb25zdHJ1Y3RvciBjbGFzcyBwcm9wZXJ0eS5cbiAgICAoeyBuYW1lIH0gPSBzZXJ2aWNlKVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZpY2VzW25hbWVdXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gbWlzc2luZyBmb3Igc2VydmljZSAnJHtuYW1lfSdgKVxuICAgIH1cbiAgICAvLyBBcyBhIGNvbnZlbnRpb24sIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgc2VydmljZSBjYW4gYmUgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyBpbiBvcmRlciB0byBlbnRpcmVseSBkZWFjdGl2YXRlIHRoZSBzZXJ2aWNlLlxuICAgIGlmIChjb25maWcgIT09IGZhbHNlKSB7XG4gICAgICBzZXJ2aWNlLnNldHVwKGNvbmZpZylcbiAgICAgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBzZXJ2aWNlXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgc2VydmljZSBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgICAvLyBvdmVycmlkZGVuIGJ5IHNlcnZpY2VzLlxuICAgICAgc2VydmljZS5pbml0aWFsaXplKClcbiAgICB9XG4gIH1cblxuICBnZXRTZXJ2aWNlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBmaW5kU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBmb3JFYWNoU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLm1hcChjYWxsYmFjaykpXG4gIH1cblxuICBhZGRDb250cm9sbGVycyhjb250cm9sbGVycywgbmFtZXNwYWNlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udHJvbGxlcnMpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVycyh2YWx1ZSwgbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfS8ke2tleX1gIDoga2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVyKHZhbHVlLCBuYW1lc3BhY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyLCBuYW1lc3BhY2UpIHtcbiAgICAvLyBDb250cm9sbGVycyByZXF1aXJlIGFkZGl0aW9uYWwgbWlkZGxld2FyZSB0byBiZSBpbnN0YWxsZWQgb25jZS5cbiAgICB0aGlzLnNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKVxuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChDb250cm9sbGVyLmlzUHJvdG90eXBlT2YoY29udHJvbGxlcikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBjb250cm9sbGVyID0gbmV3IGNvbnRyb2xsZXIodGhpcywgbmFtZXNwYWNlKVxuICAgIH1cbiAgICBpZiAoIShjb250cm9sbGVyIGluc3RhbmNlb2YgQ29udHJvbGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9YClcbiAgICB9XG4gICAgLy8gSW5oZXJpdGFuY2Ugb2YgYWN0aW9uIG1ldGhvZHMgY2Fubm90IGhhcHBlbiBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmLFxuICAgIC8vIHNvIGNhbGwgc2VwYXJhdGUgYHNldHVwKClgIG1ldGhvZCBhZnRlciBpbiBvcmRlciB0byB0YWtlIGNhcmUgb2YgaXQuXG4gICAgY29udHJvbGxlci5zZXR1cCgpXG4gICAgdGhpcy5jb250cm9sbGVyc1tjb250cm9sbGVyLnVybF0gPSBjb250cm9sbGVyXG4gICAgLy8gTm93IHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgIC8vIG92ZXJyaWRkZW4gYnkgY29udHJvbGxlcnMuXG4gICAgY29udHJvbGxlci5pbml0aWFsaXplKClcbiAgICAvLyBFYWNoIGNvbnRyb2xsZXIgY2FuIGFsc28gcHJvdmlkZSBmdXJ0aGVyIG1pZGRsZXdhcmUsIGUuZy5cbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYDpcbiAgICBjb25zdCBtaWRkbGV3YXJlID0gY29udHJvbGxlci5jb21wb3NlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gIH1cblxuICBnZXRDb250cm9sbGVyKHVybCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzW3VybF0gfHwgbnVsbFxuICB9XG5cbiAgZmluZENvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbnRyb2xsZXJzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZ2V0QWRtaW5Db250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmRDb250cm9sbGVyKFxuICAgICAgY29udHJvbGxlciA9PiBjb250cm9sbGVyIGluc3RhbmNlb2YgQWRtaW5Db250cm9sbGVyXG4gICAgKVxuICB9XG5cbiAgZ2V0QWRtaW5WdWVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWRtaW5Db250cm9sbGVyKCk/LmdldFZ1ZUNvbmZpZygpIHx8IG51bGxcbiAgfVxuXG4gIGdldEFzc2V0Q29uZmlnKHtcbiAgICBtb2RlbHMgPSBPYmplY3Qua2V5cyh0aGlzLm1vZGVscyksXG4gICAgbm9ybWFsaXplRGJOYW1lcyA9IHRoaXMuY29uZmlnLmtuZXgubm9ybWFsaXplRGJOYW1lc1xuICB9ID0ge30pIHtcbiAgICBjb25zdCBhc3NldENvbmZpZyA9IHt9XG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgb2YgbW9kZWxzKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5tb2RlbHNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgeyBhc3NldHMgfSA9IG1vZGVsQ2xhc3MuZGVmaW5pdGlvblxuICAgICAgaWYgKGFzc2V0cykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTW9kZWxOYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG1vZGVsTmFtZSlcbiAgICAgICAgICA6IG1vZGVsTmFtZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRBc3NldHMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFthc3NldERhdGFQYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfSA9IG1vZGVsQ2xhc3MuZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aChhc3NldERhdGFQYXRoKVxuICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG5hbWUpXG4gICAgICAgICAgICAgIDogbmFtZVxuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBub3JtYWxpemVEYXRhUGF0aChbXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAuLi5wYXJzZURhdGFQYXRoKG5lc3RlZERhdGFQYXRoKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0Q29uZmlncyA9IGNvbnZlcnRlZEFzc2V0c1tub3JtYWxpemVkTmFtZV0gfHw9IHt9XG4gICAgICAgICAgICBhc3NldENvbmZpZ3NbZGF0YVBhdGhdID0gY29uZmlnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGVkIGdyYXBoIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXRDb25maWdbbm9ybWFsaXplZE1vZGVsTmFtZV0gPSBjb252ZXJ0ZWRBc3NldHNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0Q29uZmlnXG4gIH1cblxuICBhZGRTdG9yYWdlcyhzdG9yYWdlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmFnZXMpKSB7XG4gICAgICB0aGlzLmFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKSB7XG4gICAgbGV0IHN0b3JhZ2UgPSBudWxsXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3RvcmFnZUNsYXNzID0gU3RvcmFnZS5nZXQoY29uZmlnLnR5cGUpXG4gICAgICBpZiAoIXN0b3JhZ2VDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN0b3JhZ2U6ICR7Y29uZmlnfWApXG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc3RvcmFnZSA9IG5ldyBzdG9yYWdlQ2xhc3ModGhpcywgY29uZmlnKVxuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RvcmFnZSkge1xuICAgICAgc3RvcmFnZSA9IGNvbmZpZ1xuICAgIH1cbiAgICBpZiAoc3RvcmFnZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc3RvcmFnZS5uYW1lID0gbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlc1tzdG9yYWdlLm5hbWVdID0gc3RvcmFnZVxuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZVxuICB9XG5cbiAgZ2V0U3RvcmFnZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgY29tcGlsZVZhbGlkYXRvcihqc29uU2NoZW1hLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGpzb25TY2hlbWFcbiAgICAgID8gdGhpcy52YWxpZGF0b3IuY29tcGlsZShqc29uU2NoZW1hLCBvcHRpb25zKVxuICAgICAgOiBudWxsXG4gIH1cblxuICBjb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBsaXN0ID0gW11cbiAgICBjb25zdCB7IGRhdGFOYW1lID0gJ2RhdGEnIH0gPSBvcHRpb25zXG5cbiAgICBsZXQgcHJvcGVydGllcyA9IG51bGxcbiAgICBjb25zdCBhZGRQYXJhbWV0ZXIgPSAobmFtZSwgc2NoZW1hKSA9PiB7XG4gICAgICBsaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lID8/IG51bGwsXG4gICAgICAgIC4uLnNjaGVtYVxuICAgICAgfSlcbiAgICAgIGlmICghc2NoZW1hLm1lbWJlcikge1xuICAgICAgICBwcm9wZXJ0aWVzIHx8PSB7fVxuICAgICAgICBwcm9wZXJ0aWVzW25hbWUgfHwgZGF0YU5hbWVdID0gc2NoZW1hXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydCB0d28gZm9ybWF0cyBvZiBwYXJhbWV0ZXJzIGRlZmluaXRpb25zOlxuICAgIC8vIC0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZWlyIGBuYW1lYCBrZXkuXG4gICAgLy8gLSBBbiBvYmplY3Qgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZSBrZXkgdW5kZXIgd2hpY2ggZWFjaFxuICAgIC8vICAgc2NoZW1hIGlzIHN0b3JlZCBpbiB0aGUgcm9vdCBvYmplY3QuXG4gICAgLy8gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBjb250cm9sbGVyIGFjdGlvbnMgcmVjZWl2ZXMgdGhlXG4gICAgLy8gcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBhcmd1bWVudHMuIElmIGFuIG9iamVjdCBpcyBwYXNzZWQsIHRoZW4gdGhlXG4gICAgLy8gYWN0aW9ucyByZWNlaXZlcyBvbmUgcGFyYW1ldGVyIG9iamVjdCB3aGVyZSB1bmRlciB0aGUgc2FtZSBrZXlzIHRoZVxuICAgIC8vIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBzdG9yZWQuXG4gICAgbGV0IGFzT2JqZWN0ID0gZmFsc2VcbiAgICBpZiAoaXNBcnJheShwYXJhbWV0ZXJzKSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIC4uLnNjaGVtYSB9IG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBhcmFtZXRlcnMpKSB7XG4gICAgICBhc09iamVjdCA9IHRydWVcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXJzIGRlZmluaXRpb246ICR7cGFyYW1ldGVyc31gKVxuICAgIH1cbiAgICAvLyBOT1RFOiBJZiBwcm9wZXJ0aWVzIGlzIG51bGwsIHNjaGVtYSBhbmQgdmFsaWRhdGUgd2lsbCBiZWNvbWUgbnVsbCB0b28uXG4gICAgLy8gTk9URTogSWYgaXQgaXMgbm90IG51bGwsIGl0IHdpbGwgZ2V0IGV4cGFuZGVkIHRvIGFuIG9iamVjdCBzY2hlbWEuXG4gICAgY29uc3Qgc2NoZW1hID0gY29udmVydFNjaGVtYShwcm9wZXJ0aWVzLCBvcHRpb25zKVxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5jb21waWxlVmFsaWRhdG9yKHNjaGVtYSwge1xuICAgICAgLy8gRm9yIHBhcmFtZXRlcnMsIGFsd2F5cyBjb2VyY2UgdHlwZXMsIGluY2x1ZGluZyBhcnJheXMuXG4gICAgICBjb2VyY2VUeXBlczogJ2FycmF5JyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgIGFwcDogdGhpcyxcbiAgICAgIHZhbGlkYXRvcjogdGhpcy52YWxpZGF0b3IsXG4gICAgICBvcHRpb25zXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsaXN0LFxuICAgICAgc2NoZW1hLFxuICAgICAgYXNPYmplY3QsXG4gICAgICBkYXRhTmFtZSxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxuICAgICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBjdHggYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgICAgPyBkYXRhID0+IHZhbGlkYXRlLmNhbGwoY3R4LCBkYXRhKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMsIG9wdGlvbnMgfSkge1xuICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZXJyb3JzOiB0aGlzLnZhbGlkYXRvci5wYXJzZUVycm9ycyhlcnJvcnMsIG9wdGlvbnMpXG4gICAgfSlcbiAgfVxuXG4gIHNldHVwR2xvYmFsTWlkZGxld2FyZSgpIHtcbiAgICBjb25zdCB7IGFwcCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgdGhpcy51c2UoYXR0YWNoTG9nZ2VyKHRoaXMubG9nZ2VyKSlcblxuICAgIHRoaXMudXNlKGhhbmRsZUVycm9yKCkpXG4gICAgaWYgKGFwcC5yZXNwb25zZVRpbWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShyZXNwb25zZVRpbWUoZ2V0T3B0aW9ucyhhcHAucmVzcG9uc2VUaW1lKSkpXG4gICAgfVxuICAgIGlmIChsb2cucmVxdWVzdHMpIHtcbiAgICAgIHRoaXMudXNlKGxvZ1JlcXVlc3RzKCkpXG4gICAgfVxuICAgIGlmIChhcHAuaGVsbWV0ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoaGVsbWV0KGdldE9wdGlvbnMoYXBwLmhlbG1ldCkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmNvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb3JzKGdldE9wdGlvbnMoYXBwLmNvcnMpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb21wcmVzcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvbXByZXNzKG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgLy8gVXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGZvciBCcm90bGkgY29tcHJlc3Npb24uXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rb2Fqcy9jb21wcmVzcy9pc3N1ZXMvMTI2XG4gICAgICAgICAgYnI6IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBbemxpYi5jb25zdGFudHMuQlJPVExJX1BBUkFNX1FVQUxJVFldOiA0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRPcHRpb25zKGFwcC5jb21wcmVzcylcbiAgICAgICkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmV0YWcgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb25kaXRpb25hbCgpKVxuICAgICAgdGhpcy51c2UoZXRhZygpKVxuICAgIH1cbiAgfVxuXG4gIHNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKSB7XG4gICAgLy8gTk9URTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgYXV0b21hdGljIGBzZXR1cEdsb2JhbE1pZGRsZXdhcmUoKWAgc28gdGhhdFxuICAgIC8vIGFwcHMgY2FuIHNldCB1cCB0aGUgc3RhdGljIHNlcnZpbmcgb2YgYXNzZXRzIGJlZm9yZSBpbnN0YWxsaW5nIHRoZVxuICAgIC8vIHNlc3Npb24gYW5kIHBhc3Nwb3J0IG1pZGRsZXdhcmUuIEl0IGlzIGNhbGxlZCBmcm9tIGBhZGRDb250cm9sbGVyKClgLlxuICAgIC8vIFVzZSBhIGZsYWcgdG8gb25seSBpbnN0YWxsIHRoZSBtaWRkbGV3YXJlIG9uY2U6XG4gICAgaWYgKCF0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlKSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gdGhpcy5jb25maWdcbiAgICAgIC8vIFNlcXVlbmNlIGlzIGltcG9ydGFudDpcbiAgICAgIC8vIDEuIGJvZHkgcGFyc2VyXG4gICAgICB0aGlzLnVzZShib2R5UGFyc2VyKGdldE9wdGlvbnMoYXBwLmJvZHlQYXJzZXIpKSlcbiAgICAgIC8vIDIuIGZpbmQgcm91dGUgZnJvbSByb3V0ZXMgaW5zdGFsbGVkIGJ5IGNvbnRyb2xsZXJzLlxuICAgICAgdGhpcy51c2UoZmluZFJvdXRlKHRoaXMucm91dGVyKSlcbiAgICAgIC8vIDMuIHJlc3BlY3QgdHJhbnNhY3RlZCBzZXR0aW5ncywgY3JlYXRlIGFuZCBoYW5kbGUgdHJhbnNhY3Rpb25zLlxuICAgICAgdGhpcy51c2UoY3JlYXRlVHJhbnNhY3Rpb24oKSlcbiAgICAgIC8vIDQuIHNlc3Npb25cbiAgICAgIGlmIChhcHAuc2Vzc2lvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0gPSBnZXRPcHRpb25zKGFwcC5zZXNzaW9uKVxuICAgICAgICBpZiAobW9kZWxDbGFzcykge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIENvbnRleHRTdG9yZSB0aGF0IHJlc29sdmVkIHRoZSBzcGVjaWZpZWQgbW9kZWwgY2xhc3MsXG4gICAgICAgICAgLy8gdXNlcyBpdCB0byBwZXJzaXN0IGFuZCByZXRyaWV2ZSB0aGUgc2Vzc2lvbiwgYW5kIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAvLyBiaW5kcyBhbGwgZGIgb3BlcmF0aW9ucyB0byBgY3R4LnRyYW5zYWN0aW9uYCwgaWYgaXQgaXMgc2V0LlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICAgICAgb3B0aW9ucy5Db250ZXh0U3RvcmUgPSBTZXNzaW9uU3RvcmUobW9kZWxDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZShzZXNzaW9uKG9wdGlvbnMsIHRoaXMpKVxuICAgICAgfVxuICAgICAgLy8gNS4gcGFzc3BvcnRcbiAgICAgIGlmIChhcHAucGFzc3BvcnQpIHtcbiAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuaW5pdGlhbGl6ZSgpKVxuICAgICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgICB0aGlzLnVzZShwYXNzcG9ydC5zZXNzaW9uKCkpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2UoaGFuZGxlVXNlcigpKVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBmaW5hbGx5IGhhbmRsZSB0aGUgZm91bmQgcm91dGUsIG9yIHNldCBzdGF0dXMgLyBhbGxvdyBhY2NvcmRpbmdseS5cbiAgICAgIHRoaXMudXNlKGhhbmRsZVJvdXRlKCkpXG4gICAgICB0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHNldHVwTG9nZ2VyKCkge1xuICAgIGNvbnN0IHsgZXJyLCByZXEsIHJlcyB9ID0gcGluby5zdGRTZXJpYWxpemVyc1xuICAgIC8vIE9ubHkgaW5jbHVkZSBgaWRgIGZyb20gdGhlIHVzZXIsIHRvIG5vdCBpbmFkdmVydGVudGx5IGxvZyBQSUkuXG4gICAgY29uc3QgdXNlciA9IHVzZXIgPT4gKHsgaWQ6IHVzZXIuaWQgfSlcbiAgICBjb25zdCBzZXJpYWxpemVycyA9IHsgZXJyLCByZXEsIHJlcywgdXNlciB9XG5cbiAgICBjb25zdCBsb2dnZXIgPSBwaW5vKG1lcmdlKFxuICAgICAge1xuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBzZXJpYWxpemVycyxcbiAgICAgICAgcHJldHR5UHJpbnQ6IHtcbiAgICAgICAgICAvLyBMaXN0IG9mIGtleXMgdG8gaWdub3JlIGluIHByZXR0eSBtb2RlLlxuICAgICAgICAgIGlnbm9yZTogJ3JlcSxyZXMsZHVyYXRpb25Ncyx1c2VyLHJlcXVlc3RJZCcsXG4gICAgICAgICAgLy8gU1lTIHRvIHVzZSBzeXN0ZW0gdGltZSBhbmQgbm90IFVUQy5cbiAgICAgICAgICB0cmFuc2xhdGVUaW1lOiAnU1lTOkhIOk1NOnNzLmwnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlZGFjdCBjb21tb24gc2Vuc2l0aXZlIGhlYWRlcnMuXG4gICAgICAgIHJlZGFjdDogW1xuICAgICAgICAgICcqLmhlYWRlcnNbXCJjb29raWVcIl0nLFxuICAgICAgICAgICcqLmhlYWRlcnNbXCJzZXQtY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXSdcbiAgICAgICAgXSxcbiAgICAgICAgYmFzZTogbnVsbCAvLyBubyBwaWQsaG9zdG5hbWUsbmFtZVxuICAgICAgfSxcbiAgICAgIGdldE9wdGlvbnModGhpcy5jb25maWcubG9nZ2VyKVxuICAgICkpXG5cbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlci5jaGlsZCh7IG5hbWU6ICdhcHAnIH0pXG4gIH1cblxuICBzZXR1cEtuZXgoKSB7XG4gICAgbGV0IHsga25leCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmIChrbmV4Py5jbGllbnQpIHtcbiAgICAgIGNvbnN0IHNuYWtlQ2FzZU9wdGlvbnMgPSBrbmV4Lm5vcm1hbGl6ZURiTmFtZXMgPT09IHRydWVcbiAgICAgICAgPyB7fVxuICAgICAgICA6IGtuZXgubm9ybWFsaXplRGJOYW1lc1xuICAgICAgaWYgKHNuYWtlQ2FzZU9wdGlvbnMpIHtcbiAgICAgICAga25leCA9IHtcbiAgICAgICAgICAuLi5rbmV4LFxuICAgICAgICAgIC4uLmtuZXhTbmFrZUNhc2VNYXBwZXJzKHNuYWtlQ2FzZU9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leCA9IEtuZXgoa25leClcbiAgICAgIGlmIChsb2cuc3FsKSB7XG4gICAgICAgIHRoaXMuc2V0dXBLbmV4TG9nZ2luZygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBLbmV4TG9nZ2luZygpIHtcbiAgICBjb25zdCBzdGFydFRpbWVzID0ge31cbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5jaGlsZCh7IG5hbWU6ICdzcWwnIH0pXG4gICAgZnVuY3Rpb24gZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlLCBlcnJvciB9KSB7XG4gICAgICBjb25zdCBpZCA9IHF1ZXJ5Ll9fa25leFF1ZXJ5VWlkXG4gICAgICBjb25zdCBkaWZmID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnRUaW1lc1tpZF0pXG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGRpZmZbMF0gKiAxZTMgKyBkaWZmWzFdIC8gMWU2XG4gICAgICBkZWxldGUgc3RhcnRUaW1lc1tpZF1cbiAgICAgIGNvbnN0IHsgc3FsLCBiaW5kaW5ncyB9ID0gcXVlcnlcbiAgICAgIHJlc3BvbnNlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZmlsdGVyKFxuICAgICAgICAgIChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdfJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgbG9nZ2VyLmluZm8oeyBkdXJhdGlvbiwgYmluZGluZ3MsIHJlc3BvbnNlLCBlcnJvciB9LCBzcWwpXG4gICAgfVxuXG4gICAgdGhpcy5rbmV4XG4gICAgICAub24oJ3F1ZXJ5JywgcXVlcnkgPT4ge1xuICAgICAgICBzdGFydFRpbWVzW3F1ZXJ5Ll9fa25leFF1ZXJ5VWlkXSA9IHByb2Nlc3MuaHJ0aW1lKClcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LXJlc3BvbnNlJywgKHJlc3BvbnNlLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgcmVzcG9uc2UgfSlcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LWVycm9yJywgKGVycm9yLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgZXJyb3IgfSlcbiAgICAgIH0pXG4gIH1cblxuICBub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LmNsaWVudC53cmFwSWRlbnRpZmllcihpZGVudGlmaWVyKS5yZXBsYWNlKC9bJ2BcIl0vZywgJycpXG4gIH1cblxuICBkZW5vcm1hbGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMua25leC5jbGllbnQucG9zdFByb2Nlc3NSZXNwb25zZSh7IFtpZGVudGlmaWVyXTogMSB9KVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopWzBdXG4gIH1cblxuICBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBwLm5vcm1hbGl6ZVBhdGhzID8gaHlwaGVuYXRlKHBhdGgpIDogcGF0aFxuICB9XG5cbiAgZm9ybWF0RXJyb3IoZXJyKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVyci50b0pTT05cbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZXJyLnRvSlNPTigpLCBudWxsLCAyKVxuICAgICAgOiBlcnIubWVzc2FnZSB8fCBlcnJcbiAgICBjb25zdCBzdHIgPSBgJHtlcnIubmFtZX06ICR7bWVzc2FnZX1gXG4gICAgcmV0dXJuIGVyci5zdGFjayAmJiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zdGFjayAhPT0gZmFsc2VcbiAgICAgID8gYCR7c3RyfVxcbiR7ZXJyLnN0YWNrLnNwbGl0KC9cXG58XFxyXFxufFxcci8pLnNsaWNlKDEpLmpvaW4ob3MuRU9MKX1gXG4gICAgICA6IHN0clxuICB9XG5cbiAgbG9nRXJyb3IoZXJyLCBjdHgpIHtcbiAgICBpZiAoIWVyci5leHBvc2UgJiYgIXRoaXMuc2lsZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5mb3JtYXRFcnJvcihlcnIpXG4gICAgICAgIGNvbnN0IGxldmVsID1cbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yICYmIGVyci5zdGF0dXMgPCA1MDAgPyAnaW5mbycgOiAnZXJyb3InXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGN0eD8ubG9nZ2VyIHx8IHRoaXMubG9nZ2VyXG4gICAgICAgIGxvZ2dlcltsZXZlbF0odGV4dClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGxvZyBlcnJvcicsIGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0YXJ0JylcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdGFydCgpKVxuICAgIGNvbnN0IHtcbiAgICAgIHNlcnZlcjogeyBob3N0LCBwb3J0IH0sXG4gICAgICBlbnZcbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMubGlzdGVuKHBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBwb3J0IH0gPSBzZXJ2ZXIuYWRkcmVzcygpXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJHtlbnZ9IHNlcnZlciBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gXG4gICAgICAgIClcbiAgICAgICAgcmVzb2x2ZShzZXJ2ZXIpXG4gICAgICB9KVxuICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHN0YXJ0IHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0YXJ0JylcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RvcCcpXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB7IHNlcnZlciB9ID0gdGhpc1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBIYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNsb3NlIHRoZSBzZXJ2ZXIsXG4gICAgICAgIC8vICBldmVuIGlmIHNvY2tldHMgYXJlIHN0aWxsIG9wZW4uXG4gICAgICAgIC8vICBUYWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjgzMDA3Mi5cbiAgICAgICAgLy8gIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBhIGxpYnJhcnksIGV4OiBodHRwczovL2dpdGh1Yi5jb20vZ29kYWRkeS90ZXJtaW51c1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gc2VydmVyLmVtaXQoJ2Nsb3NlJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0b3AoKSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0b3AnKVxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE9yRXhpdCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKGVycilcbiAgICAgIHByb2Nlc3MuZXhpdCgtMSlcbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBhc3luYyBjcmVhdGVBc3NldHMoc3RvcmFnZSwgZmlsZXMsIGNvdW50ID0gMCwgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGNvbnN0IGFzc2V0cyA9IGZpbGVzLm1hcChmaWxlID0+ICh7XG4gICAgICAgIGtleTogZmlsZS5rZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UubmFtZSxcbiAgICAgICAgY291bnRcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIEFzc2V0TW9kZWxcbiAgICAgICAgLnF1ZXJ5KHRyeClcbiAgICAgICAgLmluc2VydChhc3NldHMpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgIHN0b3JhZ2UsXG4gICAgYWRkZWRGaWxlcyxcbiAgICByZW1vdmVkRmlsZXMsXG4gICAgdHJ4ID0gbnVsbFxuICApIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3NldHM6IHtcbiAgICAgICAgY2xlYW51cFRpbWVUaHJlc2hvbGQgPSAwXG4gICAgICB9ID0ge31cbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICAvLyBPbmx5IHJlbW92ZSB1bnVzZWQgYXNzZXRzIHRoYXQgaGF2ZW4ndCBzZWVuIGNoYW5nZXMgZm9yIGdpdmVuIHRpbWVmcmFtZS5cbiAgICBjb25zdCB0aW1lVGhyZXNob2xkID0gaXNTdHJpbmcoY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA/IHBhcnNlRHVyYXRpb24oY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA6IGNsZWFudXBUaW1lVGhyZXNob2xkXG5cbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBpbXBvcnRlZEZpbGVzLnB1c2goXG4gICAgICAgIC4uLmF3YWl0IHRoaXMuYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBhZGRlZEZpbGVzLCB0cngpXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZUNvdW50ID0gKGZpbGVzLCBpbmNyZW1lbnQpID0+IChcbiAgICAgICAgICBmaWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgQXNzZXRNb2RlbC5xdWVyeSh0cngpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5JywgZmlsZXMubWFwKGZpbGUgPT4gZmlsZS5rZXkpKVxuICAgICAgICAgICAgLmluY3JlbWVudCgnY291bnQnLCBpbmNyZW1lbnQpXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGNoYW5nZUNvdW50KGFkZGVkRmlsZXMsIDEpLFxuICAgICAgICAgIGNoYW5nZUNvdW50KHJlbW92ZWRGaWxlcywgLTEpXG4gICAgICAgIF0pXG4gICAgICAgIGlmICh0aW1lVGhyZXNob2xkID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAvLyBEb24ndCBwYXNzIGB0cnhgIGhlcmUsIGFzIHdlIHdhbnQgdGhpcyBkZWxheWVkIGV4ZWN1dGlvbiB0b1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0cyBvd24gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCksXG4gICAgICAgICAgICB0aW1lVGhyZXNob2xkXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGV4ZWN1dGUgcmVsZWFzZVVudXNlZEFzc2V0cygpIGltbWVkaWF0ZWx5IGluIHRoZSBzYW1lXG4gICAgICAvLyB0cmFuc2FjdGlvbiwgdG8gcG90ZW50aWFsbHkgY2xlYW4gdXAgb3RoZXIgcGVuZGluZyBhc3NldHMuXG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCwgdHJ4KVxuICAgICAgcmV0dXJuIGltcG9ydGVkRmlsZXNcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgLy8gRmluZCBtaXNzaW5nIGFzc2V0cyAoY29waWVkIGZyb20gYW5vdGhlciBzeXN0ZW0pLCBhbmQgYWRkIHRoZW0uXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmRhdGEgfHwgZmlsZS51cmwpIHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YSB9ID0gZmlsZVxuICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgICAgICBgJHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbGsucmVkKCdJTkZPOicpXG4gICAgICAgICAgICAgICAgICB9IEFzc2V0ICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtmaWxlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgZmV0Y2hpbmcgZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7ZmlsZS51cmx9J2ApXG4gICAgICAgICAgICAgICAgICB9IGFuZCBhZGRpbmcgdG8gc3RvcmFnZSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7c3RvcmFnZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfS4uLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkRmlsZSA9IGF3YWl0IHN0b3JhZ2UuYWRkRmlsZShmaWxlLCBkYXRhKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBbaW1wb3J0ZWRGaWxlXSwgMCwgdHJ4KVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgICBpbXBvcnRlZEZpbGVzLnB1c2goaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBpbXBvcnQgYXNzZXQgZnJvbSBmb3JlaWduIHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBc3NldCBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGJ1dCB3YXMgYWxyZWFkeSBpbXBvcnRlZCBhbmQgY2FuXG4gICAgICAgICAgICAvLyBiZSByZXVzZWQuIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyBtZXJnZS5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgYXNzZXQuZmlsZSlcbiAgICAgICAgICAgIC8vIE5PVEU6IE5vIG5lZWQgdG8gYWRkIGBmaWxlYCB0byBgaW1wb3J0ZWRGaWxlc2AsIHNpbmNlIGl0J3NcbiAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBpbXBvcnRlZCB0byB0aGUgc3RvcmFnZSBiZWZvcmUuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kaWZpZWRBc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgICAgaWYgKGFzc2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGZpbGUuZGF0YSlcbiAgICAgICAgICAgICAgLy8gTWVyZ2UgYmFjayB0aGUgY2hhbmdlZCBmaWxlIHByb3BlcnRpZXMgaW50byB0aGUgYWN0dWFsIGZpbGVzXG4gICAgICAgICAgICAgIC8vIG9iamVjdCwgc28gdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBzdGF0aWMgbW9kZWwgaG9vayBjYW4gYmUgdXNlZFxuICAgICAgICAgICAgICAvLyBkaXJlY3RseSBmb3IgdGhlIGFjdHVhbCBydW5uaW5nIHF1ZXJ5LlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGZpbGUsIGNoYW5nZWRGaWxlKVxuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHVwZGF0ZSBtb2RpZmllZCBhc3NldCBmcm9tIG1lbW9yeSBzb3VyY2U6ICcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5uYW1lXG4gICAgICAgICAgICAgICAgfScgKCcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5rZXlcbiAgICAgICAgICAgICAgICB9JylgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllZEZpbGVzXG4gIH1cblxuICBhc3luYyByZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgcmV0dXJuIEFzc2V0TW9kZWwudHJhbnNhY3Rpb24odHJ4LCBhc3luYyB0cnggPT4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHRpbWUgdGhyZXNob2xkIGluIEpTIGluc3RlYWQgb2YgU1FMLCBhcyB0aGVyZSBpcyBub1xuICAgICAgICAvLyBlYXN5IGNyb3NzLVNRTCB3YXkgdG8gZG8gYG5vdygpIC0gaW50ZXJ2YWwgWCBob3Vyc2A6XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSB0aW1lVGhyZXNob2xkKVxuICAgICAgICBjb25zdCBvcnBoYW5lZEFzc2V0cyA9IGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgIC53aGVyZSgnY291bnQnLCAwKVxuICAgICAgICAgIC5hbmRXaGVyZSgndXBkYXRlZEF0JywgJzw9JywgZGF0ZSlcbiAgICAgICAgICAvLyBQcm90ZWN0IGZyZXNobHkgY3JlYXRlZCBhc3NldHMgZnJvbSBiZWluZyBkZWxldGVkIGFnYWluIHJpZ2h0IGF3YXksXG4gICAgICAgICAgLy8gLmUuZy4gd2hlbiBgY29uZmlnLmFzc2V0cy5jbGVhbnVwVGltZVRocmVzaG9sZCA9IDBgXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPicsIHJlZignY3JlYXRlZEF0JykpXG4gICAgICAgIGlmIChvcnBoYW5lZEFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgb3JwaGFuZWRLZXlzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBvcnBoYW5lZEFzc2V0cy5tYXAoYXN5bmMgYXNzZXQgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmFnZShhc3NldC5zdG9yYWdlKS5yZW1vdmVGaWxlKGFzc2V0LmZpbGUpXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICAgICAgICAgICAgICAgIGFzc2V0LmVycm9yID0gZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXNzZXQua2V5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBBc3NldE1vZGVsXG4gICAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5Jywgb3JwaGFuZWRLZXlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcnBoYW5lZEFzc2V0c1xuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3ZlcnJpZGUgS29hJ3MgZXZlbnRzIHdpdGggb3VyIG93biBFdmVudEVtaXR0ZXIgdGhhdCBhZGRzIHN1cHBvcnQgZm9yXG4vLyBhc3luY2hyb25vdXMgZXZlbnRzLlxuRXZlbnRFbWl0dGVyLm1peGluKEFwcGxpY2F0aW9uLnByb3RvdHlwZSlcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBpc09iamVjdChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fVxufVxuIl19
955
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsImNoYWxrIiwieWVsbG93IiwiYm9sZCIsInV0aWwiLCJpbnNwZWN0IiwiY29sb3JzIiwiZGVwdGgiLCJtYXhBcnJheUxlbmd0aCIsIkVycm9yIiwic29ydEJ5UmVsYXRpb25zIiwibGlzdCIsImNvbGxlY3RlZCIsImV4Y2x1ZGVkIiwicmVsYXRpb24iLCJnZXRSZWxhdGlvbnMiLCJCZWxvbmdzVG9PbmVSZWxhdGlvbiIsInJlbGF0ZWRNb2RlbENsYXNzIiwiam9pblRhYmxlTW9kZWxDbGFzcyIsInJlbGF0ZWQiLCJyZXZlcnNlIiwicmVkdWNlIiwiZ2V0TW9kZWwiLCJlbmRzV2l0aCIsImZpbmRNb2RlbCIsImNhbGxiYWNrIiwiZmluZCIsInNlcnZpY2UiLCJlbnRyaWVzIiwiYWRkU2VydmljZSIsIlNlcnZpY2UiLCJ1bmRlZmluZWQiLCJnZXRTZXJ2aWNlIiwiZmluZFNlcnZpY2UiLCJmb3JFYWNoU2VydmljZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJuYW1lc3BhY2UiLCJrZXkiLCJhZGRDb250cm9sbGVyIiwic2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSIsIkNvbnRyb2xsZXIiLCJ1cmwiLCJjb21wb3NlIiwiZ2V0Q29udHJvbGxlciIsImZpbmRDb250cm9sbGVyIiwiZ2V0QWRtaW5Db250cm9sbGVyIiwiQWRtaW5Db250cm9sbGVyIiwiZ2V0QWRtaW5WdWVDb25maWciLCJnZXRWdWVDb25maWciLCJnZXRBc3NldENvbmZpZyIsIm5vcm1hbGl6ZURiTmFtZXMiLCJhc3NldENvbmZpZyIsIm1vZGVsTmFtZSIsImFzc2V0cyIsImRlZmluaXRpb24iLCJub3JtYWxpemVkTW9kZWxOYW1lIiwibm9ybWFsaXplSWRlbnRpZmllciIsImNvbnZlcnRlZEFzc2V0cyIsImFzc2V0RGF0YVBhdGgiLCJwcm9wZXJ0eSIsIm5lc3RlZERhdGFQYXRoIiwiaW5kZXgiLCJnZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoIiwibm9ybWFsaXplZE5hbWUiLCJkYXRhUGF0aCIsImFzc2V0Q29uZmlncyIsImFkZFN0b3JhZ2UiLCJzdG9yYWdlIiwic3RvcmFnZUNsYXNzIiwiU3RvcmFnZSIsImdldCIsInR5cGUiLCJnZXRTdG9yYWdlIiwiY29tcGlsZVZhbGlkYXRvciIsImpzb25TY2hlbWEiLCJvcHRpb25zIiwiY29tcGlsZSIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwicGFyYW1ldGVycyIsImRhdGFOYW1lIiwicHJvcGVydGllcyIsImFkZFBhcmFtZXRlciIsInB1c2giLCJtZW1iZXIiLCJhc09iamVjdCIsInZhbGlkYXRlIiwiY29lcmNlVHlwZXMiLCJjdHgiLCJjYWxsIiwiY3JlYXRlVmFsaWRhdGlvbkVycm9yIiwibWVzc2FnZSIsImVycm9ycyIsImpzb24iLCJWYWxpZGF0aW9uRXJyb3IiLCJwYXJzZUVycm9ycyIsImNyZWF0ZURhdGFiYXNlRXJyb3IiLCJlcnJvciIsInNxbCIsIm1hdGNoIiwiRGF0YWJhc2VFcnJvciIsImxvZ2dlciIsInJlc3BvbnNlVGltZSIsImdldE9wdGlvbnMiLCJyZXF1ZXN0cyIsImhlbG1ldCIsImNvcnMiLCJjb21wcmVzcyIsImJyIiwicGFyYW1zIiwiemxpYiIsImNvbnN0YW50cyIsIkJST1RMSV9QQVJBTV9RVUFMSVRZIiwiZXRhZyIsImJvZHlQYXJzZXIiLCJzZXNzaW9uIiwiQ29udGV4dFN0b3JlIiwicGFzc3BvcnQiLCJlcnIiLCJyZXEiLCJyZXMiLCJwaW5vIiwic3RkU2VyaWFsaXplcnMiLCJ1c2VyIiwiaWQiLCJzZXJpYWxpemVycyIsImxldmVsIiwicHJldHR5UHJpbnQiLCJpZ25vcmUiLCJ0cmFuc2xhdGVUaW1lIiwicmVkYWN0IiwiYmFzZSIsImNoaWxkIiwiY2xpZW50Iiwic25ha2VDYXNlT3B0aW9ucyIsInNldHVwS25leExvZ2dpbmciLCJzdGFydFRpbWVzIiwiZW5kIiwicXVlcnkiLCJyZXNwb25zZSIsIl9fa25leFF1ZXJ5VWlkIiwiZGlmZiIsImhydGltZSIsImR1cmF0aW9uIiwiYmluZGluZ3MiLCJmcm9tRW50cmllcyIsInN0YXJ0c1dpdGgiLCJvbiIsImlkZW50aWZpZXIiLCJ3cmFwSWRlbnRpZmllciIsInJlcGxhY2UiLCJkZW5vcm1hbGl6ZUlkZW50aWZpZXIiLCJvYmoiLCJwb3N0UHJvY2Vzc1Jlc3BvbnNlIiwibm9ybWFsaXplUGF0aCIsIm5vcm1hbGl6ZVBhdGhzIiwiZm9ybWF0RXJyb3IiLCJ0b0pTT04iLCJzdHIiLCJzdGFjayIsInNwbGl0Iiwic2xpY2UiLCJqb2luIiwib3MiLCJFT0wiLCJsb2dFcnJvciIsImV4cG9zZSIsInRleHQiLCJSZXNwb25zZUVycm9yIiwic3RhdHVzIiwiZSIsInN0YXJ0IiwiZW1pdCIsInNlcnZlciIsImhvc3QiLCJwb3J0IiwicmVzb2x2ZSIsInJlamVjdCIsImxpc3RlbiIsImFkZHJlc3MiLCJzdG9wIiwiY2xvc2UiLCJzZXRJbW1lZGlhdGUiLCJvZmYiLCJzdGFydE9yRXhpdCIsImV4aXQiLCJjcmVhdGVBc3NldHMiLCJmaWxlcyIsImNvdW50IiwidHJ4IiwiQXNzZXRNb2RlbCIsImZpbGUiLCJpbnNlcnQiLCJoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzIiwiYWRkZWRGaWxlcyIsInJlbW92ZWRGaWxlcyIsImNsZWFudXBUaW1lVGhyZXNob2xkIiwidGltZVRocmVzaG9sZCIsImltcG9ydGVkRmlsZXMiLCJhZGRGb3JlaWduQXNzZXRzIiwiY2hhbmdlQ291bnQiLCJpbmNyZW1lbnQiLCJ3aGVyZUluIiwic2V0VGltZW91dCIsInJlbGVhc2VVbnVzZWRBc3NldHMiLCJhc3NldCIsImZpbmRPbmUiLCJyZWQiLCJncmVlbiIsImF4aW9zIiwicmVxdWVzdCIsIm1ldGhvZCIsInJlc3BvbnNlVHlwZSIsImltcG9ydGVkRmlsZSIsImFkZEZpbGUiLCJhc3NpZ24iLCJBc3NldEVycm9yIiwiaGFuZGxlTW9kaWZpZWRBc3NldHMiLCJtb2RpZmllZEZpbGVzIiwiY2hhbmdlZEZpbGUiLCJ0cmFuc2FjdGlvbiIsImRhdGUiLCJEYXRlIiwic2V0TWlsbGlzZWNvbmRzIiwiZ2V0TWlsbGlzZWNvbmRzIiwib3JwaGFuZWRBc3NldHMiLCJ3aGVyZSIsImFuZFdoZXJlIiwib3JwaGFuZWRLZXlzIiwicmVtb3ZlRmlsZSIsImRlbGV0ZSIsIkV2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QUFOLEdBQWNBLEtBQWQ7QUFDRDs7QUFDRCxtQkFBTzRHLEtBQUssQ0FBQ3ZLLEdBQWI7QUFDRCxXQVJELENBRHlCLENBQTNCO0FBV0EsZ0JBQU13SixVQUFVLENBQ2JwRCxLQURHLENBQ0dtRCxHQURILEVBRUh5QyxNQUZHLEdBR0g1QixPQUhHLENBR0ssS0FITCxFQUdZMEIsWUFIWixDQUFOO0FBSUQ7O0FBQ0QsZUFBT0gsY0FBUDtBQUNELE9BOUJNLENBQVA7QUErQkQ7QUFDRjs7QUF6NEJrQzs7OztBQTg0QnJDTSxrQkFBYUMsS0FBYixDQUFtQjdTLFdBQVcsQ0FBQzhTLFNBQS9COztBQUVBLFNBQVNsSSxVQUFULENBQW9CM0IsT0FBcEIsRUFBNkI7QUFDM0IsU0FBTyxzQkFBU0EsT0FBVCxJQUFvQkEsT0FBcEIsR0FBOEIsRUFBckM7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBLb2EgZnJvbSAna29hJ1xuaW1wb3J0IEtuZXggZnJvbSAna25leCdcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgemxpYiBmcm9tICd6bGliJ1xuaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBvcyBmcm9tICdvcydcbmltcG9ydCBwYXJzZUR1cmF0aW9uIGZyb20gJ3BhcnNlLWR1cmF0aW9uJ1xuaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAna29hLWJvZHlwYXJzZXInXG5pbXBvcnQgY29ycyBmcm9tICdAa29hL2NvcnMnXG5pbXBvcnQgY29tcG9zZSBmcm9tICdrb2EtY29tcG9zZSdcbmltcG9ydCBjb21wcmVzcyBmcm9tICdrb2EtY29tcHJlc3MnXG5pbXBvcnQgY29uZGl0aW9uYWwgZnJvbSAna29hLWNvbmRpdGlvbmFsLWdldCdcbmltcG9ydCBwYXNzcG9ydCBmcm9tICdrb2EtcGFzc3BvcnQnXG5pbXBvcnQgc2Vzc2lvbiBmcm9tICdrb2Etc2Vzc2lvbidcbmltcG9ydCBldGFnIGZyb20gJ2tvYS1ldGFnJ1xuaW1wb3J0IGhlbG1ldCBmcm9tICdrb2EtaGVsbWV0J1xuaW1wb3J0IHJlc3BvbnNlVGltZSBmcm9tICdrb2EtcmVzcG9uc2UtdGltZSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGRpdG9qcy9yb3V0ZXInXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAL2xpYidcbmltcG9ydCB7IENvbnRyb2xsZXIsIEFkbWluQ29udHJvbGxlciB9IGZyb20gJ0AvY29udHJvbGxlcnMnXG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnQC9zZXJ2aWNlcydcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAL3N0b3JhZ2UnXG5pbXBvcnQgeyBjb252ZXJ0U2NoZW1hIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBmb3JtYXRKc29uIH0gZnJvbSAnQC91dGlscydcbmltcG9ydCB7XG4gIFJlc3BvbnNlRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbiAgQXNzZXRFcnJvclxufSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93LmJvbGQoYFxcbiR7bW9kZWxDbGFzcy5uYW1lfTpcXG5gKSxcbiAgICAgICAgICAgIHV0aWwuaW5zcGVjdChkYXRhLCB7XG4gICAgICAgICAgICAgIGNvbG9yczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IG51bGwsXG4gICAgICAgICAgICAgIG1heEFycmF5TGVuZ3RoOiBudWxsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZE1vZGVsKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoTW9kZWwuaXNQcm90b3R5cGVPZihtb2RlbENsYXNzKSkge1xuICAgICAgbW9kZWxDbGFzcy5hcHAgPSB0aGlzXG4gICAgICB0aGlzLm1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7bW9kZWxDbGFzc31gKVxuICAgIH1cbiAgfVxuXG4gIHNvcnRNb2RlbHMobW9kZWxzKSB7XG4gICAgY29uc3Qgc29ydEJ5UmVsYXRpb25zID0gKGxpc3QsIGNvbGxlY3RlZCA9IHt9LCBleGNsdWRlZCA9IHt9KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgaWYgKCFjb2xsZWN0ZWRbbmFtZV0gJiYgIWV4Y2x1ZGVkW25hbWVdKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zKCkpKSB7XG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbiBpbnN0YW5jZW9mIEJlbG9uZ3NUb09uZVJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IHJlbGF0ZWRNb2RlbENsYXNzLCBqb2luVGFibGVNb2RlbENsYXNzIH0gPSByZWxhdGlvblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgW2pvaW5UYWJsZU1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbENsYXNzXSkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc2VsZi1yZWZlcmVuY2VzIGFuZCBnZW5lcmF0ZWQgam9pbiBtb2RlbHM6XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWQgJiYgcmVsYXRlZCAhPT0gbW9kZWxDbGFzcyAmJiBtb2RlbHNbcmVsYXRlZC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgc29ydEJ5UmVsYXRpb25zKFtyZWxhdGVkXSwgY29sbGVjdGVkLCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgbW9kZWxDbGFzcyB0byBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uczpcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdOiBtb2RlbENsYXNzLFxuICAgICAgICAgICAgICAgICAgICAuLi5leGNsdWRlZFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdGVkW25hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb2xsZWN0ZWQpXG4gICAgfVxuICAgIC8vIFJldHVybiBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc29ydGVkIG1vZGVscyBhcyBpdHMga2V5L3ZhbHVlIHBhaXJzLlxuICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gcmV2ZXJzZSBmb3IgdGhlIGFib3ZlIGFsZ29yaXRobSB0byBzb3J0IHByb3Blcmx5LFxuICAgIC8vIGFuZCB0aGVuIHJldmVyc2UgdGhlIHJlc3VsdCBiYWNrLlxuICAgIHJldHVybiBzb3J0QnlSZWxhdGlvbnMoT2JqZWN0LnZhbHVlcyhtb2RlbHMpLnJldmVyc2UoKSkucmV2ZXJzZSgpLnJlZHVjZShcbiAgICAgIChtb2RlbHMsIG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIHJldHVybiBtb2RlbHNcbiAgICAgIH0sXG4gICAgICBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgKVxuICB9XG5cbiAgZ2V0TW9kZWwobmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGVsc1tuYW1lXSB8fFxuICAgICAgIW5hbWUuZW5kc1dpdGgoJ01vZGVsJykgJiYgdGhpcy5tb2RlbHNbYCR7bmFtZX1Nb2RlbGBdIHx8XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZmluZE1vZGVsKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBhZGRTZXJ2aWNlcyhzZXJ2aWNlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHNlcnZpY2VdIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgICAgLy8gSGFuZGxlIEVTNiBtb2R1bGUgd2VpcmRuZXNzIHRoYXQgY2FuIGhhcHBlbiwgYXBwYXJlbnRseTpcbiAgICAgIGlmIChuYW1lID09PSAnZGVmYXVsdCcgJiYgaXNQbGFpbk9iamVjdChzZXJ2aWNlKSkge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoU2VydmljZS5pc1Byb3RvdHlwZU9mKHNlcnZpY2UpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc2VydmljZSA9IG5ldyBzZXJ2aWNlKHRoaXMsIG5hbWUpXG4gICAgfVxuICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2U6ICR7c2VydmljZX1gKVxuICAgIH1cbiAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIGBzZXJ2aWNlLm5hbWVgIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgICAvLyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGUuZy4gd2l0aCBhbiBhZnRlci1jb25zdHJ1Y3RvciBjbGFzcyBwcm9wZXJ0eS5cbiAgICAoeyBuYW1lIH0gPSBzZXJ2aWNlKVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZpY2VzW25hbWVdXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gbWlzc2luZyBmb3Igc2VydmljZSAnJHtuYW1lfSdgKVxuICAgIH1cbiAgICAvLyBBcyBhIGNvbnZlbnRpb24sIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgc2VydmljZSBjYW4gYmUgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyBpbiBvcmRlciB0byBlbnRpcmVseSBkZWFjdGl2YXRlIHRoZSBzZXJ2aWNlLlxuICAgIGlmIChjb25maWcgIT09IGZhbHNlKSB7XG4gICAgICBzZXJ2aWNlLnNldHVwKGNvbmZpZylcbiAgICAgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBzZXJ2aWNlXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgc2VydmljZSBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgICAvLyBvdmVycmlkZGVuIGJ5IHNlcnZpY2VzLlxuICAgICAgc2VydmljZS5pbml0aWFsaXplKClcbiAgICB9XG4gIH1cblxuICBnZXRTZXJ2aWNlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBmaW5kU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBmb3JFYWNoU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLm1hcChjYWxsYmFjaykpXG4gIH1cblxuICBhZGRDb250cm9sbGVycyhjb250cm9sbGVycywgbmFtZXNwYWNlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udHJvbGxlcnMpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVycyh2YWx1ZSwgbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfS8ke2tleX1gIDoga2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVyKHZhbHVlLCBuYW1lc3BhY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyLCBuYW1lc3BhY2UpIHtcbiAgICAvLyBDb250cm9sbGVycyByZXF1aXJlIGFkZGl0aW9uYWwgbWlkZGxld2FyZSB0byBiZSBpbnN0YWxsZWQgb25jZS5cbiAgICB0aGlzLnNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKVxuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChDb250cm9sbGVyLmlzUHJvdG90eXBlT2YoY29udHJvbGxlcikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBjb250cm9sbGVyID0gbmV3IGNvbnRyb2xsZXIodGhpcywgbmFtZXNwYWNlKVxuICAgIH1cbiAgICBpZiAoIShjb250cm9sbGVyIGluc3RhbmNlb2YgQ29udHJvbGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9YClcbiAgICB9XG4gICAgLy8gSW5oZXJpdGFuY2Ugb2YgYWN0aW9uIG1ldGhvZHMgY2Fubm90IGhhcHBlbiBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmLFxuICAgIC8vIHNvIGNhbGwgc2VwYXJhdGUgYHNldHVwKClgIG1ldGhvZCBhZnRlciBpbiBvcmRlciB0byB0YWtlIGNhcmUgb2YgaXQuXG4gICAgY29udHJvbGxlci5zZXR1cCgpXG4gICAgdGhpcy5jb250cm9sbGVyc1tjb250cm9sbGVyLnVybF0gPSBjb250cm9sbGVyXG4gICAgLy8gTm93IHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgIC8vIG92ZXJyaWRkZW4gYnkgY29udHJvbGxlcnMuXG4gICAgY29udHJvbGxlci5pbml0aWFsaXplKClcbiAgICAvLyBFYWNoIGNvbnRyb2xsZXIgY2FuIGFsc28gcHJvdmlkZSBmdXJ0aGVyIG1pZGRsZXdhcmUsIGUuZy5cbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYDpcbiAgICBjb25zdCBtaWRkbGV3YXJlID0gY29udHJvbGxlci5jb21wb3NlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gIH1cblxuICBnZXRDb250cm9sbGVyKHVybCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzW3VybF0gfHwgbnVsbFxuICB9XG5cbiAgZmluZENvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbnRyb2xsZXJzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZ2V0QWRtaW5Db250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmRDb250cm9sbGVyKFxuICAgICAgY29udHJvbGxlciA9PiBjb250cm9sbGVyIGluc3RhbmNlb2YgQWRtaW5Db250cm9sbGVyXG4gICAgKVxuICB9XG5cbiAgZ2V0QWRtaW5WdWVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWRtaW5Db250cm9sbGVyKCk/LmdldFZ1ZUNvbmZpZygpIHx8IG51bGxcbiAgfVxuXG4gIGdldEFzc2V0Q29uZmlnKHtcbiAgICBtb2RlbHMgPSBPYmplY3Qua2V5cyh0aGlzLm1vZGVscyksXG4gICAgbm9ybWFsaXplRGJOYW1lcyA9IHRoaXMuY29uZmlnLmtuZXgubm9ybWFsaXplRGJOYW1lc1xuICB9ID0ge30pIHtcbiAgICBjb25zdCBhc3NldENvbmZpZyA9IHt9XG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgb2YgbW9kZWxzKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5tb2RlbHNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgeyBhc3NldHMgfSA9IG1vZGVsQ2xhc3MuZGVmaW5pdGlvblxuICAgICAgaWYgKGFzc2V0cykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTW9kZWxOYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG1vZGVsTmFtZSlcbiAgICAgICAgICA6IG1vZGVsTmFtZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRBc3NldHMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFthc3NldERhdGFQYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfSA9IG1vZGVsQ2xhc3MuZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aChhc3NldERhdGFQYXRoKVxuICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG5hbWUpXG4gICAgICAgICAgICAgIDogbmFtZVxuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBub3JtYWxpemVEYXRhUGF0aChbXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAuLi5wYXJzZURhdGFQYXRoKG5lc3RlZERhdGFQYXRoKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0Q29uZmlncyA9IGNvbnZlcnRlZEFzc2V0c1tub3JtYWxpemVkTmFtZV0gfHw9IHt9XG4gICAgICAgICAgICBhc3NldENvbmZpZ3NbZGF0YVBhdGhdID0gY29uZmlnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGVkIGdyYXBoIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXRDb25maWdbbm9ybWFsaXplZE1vZGVsTmFtZV0gPSBjb252ZXJ0ZWRBc3NldHNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0Q29uZmlnXG4gIH1cblxuICBhZGRTdG9yYWdlcyhzdG9yYWdlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmFnZXMpKSB7XG4gICAgICB0aGlzLmFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKSB7XG4gICAgbGV0IHN0b3JhZ2UgPSBudWxsXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3RvcmFnZUNsYXNzID0gU3RvcmFnZS5nZXQoY29uZmlnLnR5cGUpXG4gICAgICBpZiAoIXN0b3JhZ2VDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN0b3JhZ2U6ICR7Y29uZmlnfWApXG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc3RvcmFnZSA9IG5ldyBzdG9yYWdlQ2xhc3ModGhpcywgY29uZmlnKVxuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RvcmFnZSkge1xuICAgICAgc3RvcmFnZSA9IGNvbmZpZ1xuICAgIH1cbiAgICBpZiAoc3RvcmFnZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc3RvcmFnZS5uYW1lID0gbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlc1tzdG9yYWdlLm5hbWVdID0gc3RvcmFnZVxuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZVxuICB9XG5cbiAgZ2V0U3RvcmFnZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgY29tcGlsZVZhbGlkYXRvcihqc29uU2NoZW1hLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGpzb25TY2hlbWFcbiAgICAgID8gdGhpcy52YWxpZGF0b3IuY29tcGlsZShqc29uU2NoZW1hLCBvcHRpb25zKVxuICAgICAgOiBudWxsXG4gIH1cblxuICBjb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBsaXN0ID0gW11cbiAgICBjb25zdCB7IGRhdGFOYW1lID0gJ2RhdGEnIH0gPSBvcHRpb25zXG5cbiAgICBsZXQgcHJvcGVydGllcyA9IG51bGxcbiAgICBjb25zdCBhZGRQYXJhbWV0ZXIgPSAobmFtZSwgc2NoZW1hKSA9PiB7XG4gICAgICBsaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lID8/IG51bGwsXG4gICAgICAgIC4uLnNjaGVtYVxuICAgICAgfSlcbiAgICAgIGlmICghc2NoZW1hLm1lbWJlcikge1xuICAgICAgICBwcm9wZXJ0aWVzIHx8PSB7fVxuICAgICAgICBwcm9wZXJ0aWVzW25hbWUgfHwgZGF0YU5hbWVdID0gc2NoZW1hXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydCB0d28gZm9ybWF0cyBvZiBwYXJhbWV0ZXJzIGRlZmluaXRpb25zOlxuICAgIC8vIC0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZWlyIGBuYW1lYCBrZXkuXG4gICAgLy8gLSBBbiBvYmplY3Qgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZSBrZXkgdW5kZXIgd2hpY2ggZWFjaFxuICAgIC8vICAgc2NoZW1hIGlzIHN0b3JlZCBpbiB0aGUgcm9vdCBvYmplY3QuXG4gICAgLy8gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBjb250cm9sbGVyIGFjdGlvbnMgcmVjZWl2ZXMgdGhlXG4gICAgLy8gcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBhcmd1bWVudHMuIElmIGFuIG9iamVjdCBpcyBwYXNzZWQsIHRoZW4gdGhlXG4gICAgLy8gYWN0aW9ucyByZWNlaXZlcyBvbmUgcGFyYW1ldGVyIG9iamVjdCB3aGVyZSB1bmRlciB0aGUgc2FtZSBrZXlzIHRoZVxuICAgIC8vIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBzdG9yZWQuXG4gICAgbGV0IGFzT2JqZWN0ID0gZmFsc2VcbiAgICBpZiAoaXNBcnJheShwYXJhbWV0ZXJzKSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIC4uLnNjaGVtYSB9IG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBhcmFtZXRlcnMpKSB7XG4gICAgICBhc09iamVjdCA9IHRydWVcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXJzIGRlZmluaXRpb246ICR7cGFyYW1ldGVyc31gKVxuICAgIH1cbiAgICAvLyBOT1RFOiBJZiBwcm9wZXJ0aWVzIGlzIG51bGwsIHNjaGVtYSBhbmQgdmFsaWRhdGUgd2lsbCBiZWNvbWUgbnVsbCB0b28uXG4gICAgLy8gTk9URTogSWYgaXQgaXMgbm90IG51bGwsIGl0IHdpbGwgZ2V0IGV4cGFuZGVkIHRvIGFuIG9iamVjdCBzY2hlbWEuXG4gICAgY29uc3Qgc2NoZW1hID0gY29udmVydFNjaGVtYShwcm9wZXJ0aWVzLCBvcHRpb25zKVxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5jb21waWxlVmFsaWRhdG9yKHNjaGVtYSwge1xuICAgICAgLy8gRm9yIHBhcmFtZXRlcnMsIGFsd2F5cyBjb2VyY2UgdHlwZXMsIGluY2x1ZGluZyBhcnJheXMuXG4gICAgICBjb2VyY2VUeXBlczogJ2FycmF5JyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgIGFwcDogdGhpcyxcbiAgICAgIHZhbGlkYXRvcjogdGhpcy52YWxpZGF0b3IsXG4gICAgICBvcHRpb25zXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsaXN0LFxuICAgICAgc2NoZW1hLFxuICAgICAgYXNPYmplY3QsXG4gICAgICBkYXRhTmFtZSxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxuICAgICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBjdHggYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgICAgPyBkYXRhID0+IHZhbGlkYXRlLmNhbGwoY3R4LCBkYXRhKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMsIG9wdGlvbnMsIGpzb24gfSkge1xuICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZXJyb3JzOiB0aGlzLnZhbGlkYXRvci5wYXJzZUVycm9ycyhlcnJvcnMsIG9wdGlvbnMpLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHRoZSBKU09OIGRhdGEgaW4gdGhlIGVycm9yIGlmIGBsb2cuZXJyb3JzLmpzb25gaXMgc2V0LlxuICAgICAganNvbjogdGhpcy5jb25maWcubG9nLmVycm9ycz8uanNvbiA/IGpzb24gOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgY3JlYXRlRGF0YWJhc2VFcnJvcihlcnJvcikge1xuICAgIC8vIFJlbW92ZSBrbmV4IFNRTCBxdWVyeSBhbmQgbW92ZSB0byBzZXBhcmF0ZSBgc3FsYCBwcm9wZXJ0eS5cbiAgICAvLyBUT0RPOiBGaXggdGhpcyBwcm9wZXJseSBpbiBLbmV4IC8gT2JqZWN0aW9uIGluc3RlYWQsIHNlZTpcbiAgICAvLyBodHRwczovL2dpdHRlci5pbS9WaW5jaXQvb2JqZWN0aW9uLmpzP2F0PTVhNjg3MjhmNWE5ZWJlNGY3NWNhNDBiMFxuICAgIGNvbnN0IFssIHNxbCwgbWVzc2FnZV0gPSBlcnJvci5tZXNzYWdlLm1hdGNoKC9eKFtcXHNcXFNdKikgLSAoW1xcc1xcU10qPykkLykgfHxcbiAgICAgIFtudWxsLCBudWxsLCBlcnJvci5tZXNzYWdlXVxuICAgIHJldHVybiBuZXcgRGF0YWJhc2VFcnJvcihlcnJvciwge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSB0aGUgU1FMIHF1ZXJ5IGluIHRoZSBlcnJvciBpZiBgbG9nLmVycm9ycy5zcWxgaXMgc2V0LlxuICAgICAgc3FsOiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zcWwgPyBzcWwgOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgc2V0dXBHbG9iYWxNaWRkbGV3YXJlKCkge1xuICAgIGNvbnN0IHsgYXBwLCBsb2cgfSA9IHRoaXMuY29uZmlnXG5cbiAgICB0aGlzLnVzZShhdHRhY2hMb2dnZXIodGhpcy5sb2dnZXIpKVxuXG4gICAgaWYgKGFwcC5yZXNwb25zZVRpbWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShyZXNwb25zZVRpbWUoZ2V0T3B0aW9ucyhhcHAucmVzcG9uc2VUaW1lKSkpXG4gICAgfVxuICAgIGlmIChsb2cucmVxdWVzdHMpIHtcbiAgICAgIHRoaXMudXNlKGxvZ1JlcXVlc3RzKCkpXG4gICAgfVxuICAgIC8vIE5lZWRzIHRvIGJlIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgbG9nZ2VyIHRvIGxvZyB0aGUgY29ycmVjdFxuICAgIC8vIHJlc3BvbnNlIHN0YXR1cy5cbiAgICB0aGlzLnVzZShoYW5kbGVFcnJvcigpKVxuICAgIGlmIChhcHAuaGVsbWV0ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoaGVsbWV0KGdldE9wdGlvbnMoYXBwLmhlbG1ldCkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmNvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb3JzKGdldE9wdGlvbnMoYXBwLmNvcnMpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb21wcmVzcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvbXByZXNzKG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgLy8gVXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGZvciBCcm90bGkgY29tcHJlc3Npb24uXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rb2Fqcy9jb21wcmVzcy9pc3N1ZXMvMTI2XG4gICAgICAgICAgYnI6IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBbemxpYi5jb25zdGFudHMuQlJPVExJX1BBUkFNX1FVQUxJVFldOiA0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRPcHRpb25zKGFwcC5jb21wcmVzcylcbiAgICAgICkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmV0YWcgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb25kaXRpb25hbCgpKVxuICAgICAgdGhpcy51c2UoZXRhZygpKVxuICAgIH1cbiAgfVxuXG4gIHNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKSB7XG4gICAgLy8gTk9URTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgYXV0b21hdGljIGBzZXR1cEdsb2JhbE1pZGRsZXdhcmUoKWAgc28gdGhhdFxuICAgIC8vIGFwcHMgY2FuIHNldCB1cCB0aGUgc3RhdGljIHNlcnZpbmcgb2YgYXNzZXRzIGJlZm9yZSBpbnN0YWxsaW5nIHRoZVxuICAgIC8vIHNlc3Npb24gYW5kIHBhc3Nwb3J0IG1pZGRsZXdhcmUuIEl0IGlzIGNhbGxlZCBmcm9tIGBhZGRDb250cm9sbGVyKClgLlxuICAgIC8vIFVzZSBhIGZsYWcgdG8gb25seSBpbnN0YWxsIHRoZSBtaWRkbGV3YXJlIG9uY2U6XG4gICAgaWYgKCF0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlKSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gdGhpcy5jb25maWdcbiAgICAgIC8vIFNlcXVlbmNlIGlzIGltcG9ydGFudDpcbiAgICAgIC8vIDEuIGJvZHkgcGFyc2VyXG4gICAgICB0aGlzLnVzZShib2R5UGFyc2VyKGdldE9wdGlvbnMoYXBwLmJvZHlQYXJzZXIpKSlcbiAgICAgIC8vIDIuIGZpbmQgcm91dGUgZnJvbSByb3V0ZXMgaW5zdGFsbGVkIGJ5IGNvbnRyb2xsZXJzLlxuICAgICAgdGhpcy51c2UoZmluZFJvdXRlKHRoaXMucm91dGVyKSlcbiAgICAgIC8vIDMuIHJlc3BlY3QgdHJhbnNhY3RlZCBzZXR0aW5ncywgY3JlYXRlIGFuZCBoYW5kbGUgdHJhbnNhY3Rpb25zLlxuICAgICAgdGhpcy51c2UoY3JlYXRlVHJhbnNhY3Rpb24oKSlcbiAgICAgIC8vIDQuIHNlc3Npb25cbiAgICAgIGlmIChhcHAuc2Vzc2lvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0gPSBnZXRPcHRpb25zKGFwcC5zZXNzaW9uKVxuICAgICAgICBpZiAobW9kZWxDbGFzcykge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIENvbnRleHRTdG9yZSB0aGF0IHJlc29sdmVkIHRoZSBzcGVjaWZpZWQgbW9kZWwgY2xhc3MsXG4gICAgICAgICAgLy8gdXNlcyBpdCB0byBwZXJzaXN0IGFuZCByZXRyaWV2ZSB0aGUgc2Vzc2lvbiwgYW5kIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAvLyBiaW5kcyBhbGwgZGIgb3BlcmF0aW9ucyB0byBgY3R4LnRyYW5zYWN0aW9uYCwgaWYgaXQgaXMgc2V0LlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICAgICAgb3B0aW9ucy5Db250ZXh0U3RvcmUgPSBTZXNzaW9uU3RvcmUobW9kZWxDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZShzZXNzaW9uKG9wdGlvbnMsIHRoaXMpKVxuICAgICAgfVxuICAgICAgLy8gNS4gcGFzc3BvcnRcbiAgICAgIGlmIChhcHAucGFzc3BvcnQpIHtcbiAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuaW5pdGlhbGl6ZSgpKVxuICAgICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgICB0aGlzLnVzZShwYXNzcG9ydC5zZXNzaW9uKCkpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2UoaGFuZGxlVXNlcigpKVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBmaW5hbGx5IGhhbmRsZSB0aGUgZm91bmQgcm91dGUsIG9yIHNldCBzdGF0dXMgLyBhbGxvdyBhY2NvcmRpbmdseS5cbiAgICAgIHRoaXMudXNlKGhhbmRsZVJvdXRlKCkpXG4gICAgICB0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHNldHVwTG9nZ2VyKCkge1xuICAgIGNvbnN0IHsgZXJyLCByZXEsIHJlcyB9ID0gcGluby5zdGRTZXJpYWxpemVyc1xuICAgIC8vIE9ubHkgaW5jbHVkZSBgaWRgIGZyb20gdGhlIHVzZXIsIHRvIG5vdCBpbmFkdmVydGVudGx5IGxvZyBQSUkuXG4gICAgY29uc3QgdXNlciA9IHVzZXIgPT4gKHsgaWQ6IHVzZXIuaWQgfSlcbiAgICBjb25zdCBzZXJpYWxpemVycyA9IHsgZXJyLCByZXEsIHJlcywgdXNlciB9XG5cbiAgICBjb25zdCBsb2dnZXIgPSBwaW5vKG1lcmdlKFxuICAgICAge1xuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBzZXJpYWxpemVycyxcbiAgICAgICAgcHJldHR5UHJpbnQ6IHtcbiAgICAgICAgICAvLyBMaXN0IG9mIGtleXMgdG8gaWdub3JlIGluIHByZXR0eSBtb2RlLlxuICAgICAgICAgIGlnbm9yZTogJ3JlcSxyZXMsZHVyYXRpb25Ncyx1c2VyLHJlcXVlc3RJZCcsXG4gICAgICAgICAgLy8gU1lTIHRvIHVzZSBzeXN0ZW0gdGltZSBhbmQgbm90IFVUQy5cbiAgICAgICAgICB0cmFuc2xhdGVUaW1lOiAnU1lTOkhIOk1NOnNzLmwnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlZGFjdCBjb21tb24gc2Vuc2l0aXZlIGhlYWRlcnMuXG4gICAgICAgIHJlZGFjdDogW1xuICAgICAgICAgICcqLmhlYWRlcnNbXCJjb29raWVcIl0nLFxuICAgICAgICAgICcqLmhlYWRlcnNbXCJzZXQtY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXSdcbiAgICAgICAgXSxcbiAgICAgICAgYmFzZTogbnVsbCAvLyBubyBwaWQsaG9zdG5hbWUsbmFtZVxuICAgICAgfSxcbiAgICAgIGdldE9wdGlvbnModGhpcy5jb25maWcubG9nZ2VyKVxuICAgICkpXG5cbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlci5jaGlsZCh7IG5hbWU6ICdhcHAnIH0pXG4gIH1cblxuICBzZXR1cEtuZXgoKSB7XG4gICAgbGV0IHsga25leCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmIChrbmV4Py5jbGllbnQpIHtcbiAgICAgIGNvbnN0IHNuYWtlQ2FzZU9wdGlvbnMgPSBrbmV4Lm5vcm1hbGl6ZURiTmFtZXMgPT09IHRydWVcbiAgICAgICAgPyB7fVxuICAgICAgICA6IGtuZXgubm9ybWFsaXplRGJOYW1lc1xuICAgICAgaWYgKHNuYWtlQ2FzZU9wdGlvbnMpIHtcbiAgICAgICAga25leCA9IHtcbiAgICAgICAgICAuLi5rbmV4LFxuICAgICAgICAgIC4uLmtuZXhTbmFrZUNhc2VNYXBwZXJzKHNuYWtlQ2FzZU9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leCA9IEtuZXgoa25leClcbiAgICAgIGlmIChsb2cuc3FsKSB7XG4gICAgICAgIHRoaXMuc2V0dXBLbmV4TG9nZ2luZygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBLbmV4TG9nZ2luZygpIHtcbiAgICBjb25zdCBzdGFydFRpbWVzID0ge31cbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5jaGlsZCh7IG5hbWU6ICdzcWwnIH0pXG4gICAgZnVuY3Rpb24gZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlLCBlcnJvciB9KSB7XG4gICAgICBjb25zdCBpZCA9IHF1ZXJ5Ll9fa25leFF1ZXJ5VWlkXG4gICAgICBjb25zdCBkaWZmID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnRUaW1lc1tpZF0pXG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGRpZmZbMF0gKiAxZTMgKyBkaWZmWzFdIC8gMWU2XG4gICAgICBkZWxldGUgc3RhcnRUaW1lc1tpZF1cbiAgICAgIGNvbnN0IHsgc3FsLCBiaW5kaW5ncyB9ID0gcXVlcnlcbiAgICAgIHJlc3BvbnNlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZmlsdGVyKFxuICAgICAgICAgIChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdfJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgbG9nZ2VyLmluZm8oeyBkdXJhdGlvbiwgYmluZGluZ3MsIHJlc3BvbnNlLCBlcnJvciB9LCBzcWwpXG4gICAgfVxuXG4gICAgdGhpcy5rbmV4XG4gICAgICAub24oJ3F1ZXJ5JywgcXVlcnkgPT4ge1xuICAgICAgICBzdGFydFRpbWVzW3F1ZXJ5Ll9fa25leFF1ZXJ5VWlkXSA9IHByb2Nlc3MuaHJ0aW1lKClcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LXJlc3BvbnNlJywgKHJlc3BvbnNlLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgcmVzcG9uc2UgfSlcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LWVycm9yJywgKGVycm9yLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgZXJyb3IgfSlcbiAgICAgIH0pXG4gIH1cblxuICBub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LmNsaWVudC53cmFwSWRlbnRpZmllcihpZGVudGlmaWVyKS5yZXBsYWNlKC9bJ2BcIl0vZywgJycpXG4gIH1cblxuICBkZW5vcm1hbGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMua25leC5jbGllbnQucG9zdFByb2Nlc3NSZXNwb25zZSh7IFtpZGVudGlmaWVyXTogMSB9KVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopWzBdXG4gIH1cblxuICBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBwLm5vcm1hbGl6ZVBhdGhzID8gaHlwaGVuYXRlKHBhdGgpIDogcGF0aFxuICB9XG5cbiAgZm9ybWF0RXJyb3IoZXJyKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVyci50b0pTT05cbiAgICAgID8gZm9ybWF0SnNvbihlcnIudG9KU09OKCkpXG4gICAgICA6IGVyci5tZXNzYWdlIHx8IGVyclxuICAgIGNvbnN0IHN0ciA9IGAke2Vyci5uYW1lfTogJHttZXNzYWdlfWBcbiAgICByZXR1cm4gZXJyLnN0YWNrICYmIHRoaXMuY29uZmlnLmxvZy5lcnJvcnM/LnN0YWNrICE9PSBmYWxzZVxuICAgICAgPyBgJHtzdHJ9XFxuJHtlcnIuc3RhY2suc3BsaXQoL1xcbnxcXHJcXG58XFxyLykuc2xpY2UoMSkuam9pbihvcy5FT0wpfWBcbiAgICAgIDogc3RyXG4gIH1cblxuICBsb2dFcnJvcihlcnIsIGN0eCkge1xuICAgIGlmICghZXJyLmV4cG9zZSAmJiAhdGhpcy5zaWxlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmZvcm1hdEVycm9yKGVycilcbiAgICAgICAgY29uc3QgbGV2ZWwgPVxuICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFJlc3BvbnNlRXJyb3IgJiYgZXJyLnN0YXR1cyA8IDUwMCA/ICdpbmZvJyA6ICdlcnJvcidcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY3R4Py5sb2dnZXIgfHwgdGhpcy5sb2dnZXJcbiAgICAgICAgbG9nZ2VyW2xldmVsXSh0ZXh0KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgbG9nIGVycm9yJywgZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5jb25maWcubG9nLmVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMub24oJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RhcnQnKVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0YXJ0KCkpXG4gICAgY29uc3Qge1xuICAgICAgc2VydmVyOiB7IGhvc3QsIHBvcnQgfSxcbiAgICAgIGVudlxuICAgIH0gPSB0aGlzLmNvbmZpZ1xuICAgIHRoaXMuc2VydmVyID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5saXN0ZW4ocG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHBvcnQgfSA9IHNlcnZlci5hZGRyZXNzKClcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGAke2Vudn0gc2VydmVyIHN0YXJ0ZWQgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fWBcbiAgICAgICAgKVxuICAgICAgICByZXNvbHZlKHNlcnZlcilcbiAgICAgIH0pXG4gICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gc3RhcnQgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYWZ0ZXI6c3RhcnQnKVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2JlZm9yZTpzdG9wJylcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHsgc2VydmVyIH0gPSB0aGlzXG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHNlcnZlci5jbG9zZShlcnIgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC8vIEhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2xvc2UgdGhlIHNlcnZlcixcbiAgICAgICAgLy8gIGV2ZW4gaWYgc29ja2V0cyBhcmUgc3RpbGwgb3Blbi5cbiAgICAgICAgLy8gIFRha2VuIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM2ODMwMDcyLlxuICAgICAgICAvLyAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgYmUgdG8gdXNlIGEgbGlicmFyeSwgZXg6IGh0dHBzOi8vZ2l0aHViLmNvbS9nb2RhZGR5L3Rlcm1pbnVzXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiBzZXJ2ZXIuZW1pdCgnY2xvc2UnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1NlcnZlciBpcyBub3QgcnVubmluZycpKVxuICAgICAgfVxuICAgIH0pXG4gICAgYXdhaXQgdGhpcy5mb3JFYWNoU2VydmljZShzZXJ2aWNlID0+IHNlcnZpY2Uuc3RvcCgpKVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYWZ0ZXI6c3RvcCcpXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9mZignZXJyb3InLCB0aGlzLmxvZ0Vycm9yKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0T3JFeGl0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0KClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoZXJyKVxuICAgICAgcHJvY2Vzcy5leGl0KC0xKVxuICAgIH1cbiAgfVxuXG4gIC8vIEFzc2V0cyBoYW5kbGluZ1xuXG4gIGFzeW5jIGNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBmaWxlcywgY291bnQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgY29uc3QgYXNzZXRzID0gZmlsZXMubWFwKGZpbGUgPT4gKHtcbiAgICAgICAga2V5OiBmaWxlLmtleSxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgc3RvcmFnZTogc3RvcmFnZS5uYW1lLFxuICAgICAgICBjb3VudFxuICAgICAgfSkpXG4gICAgICByZXR1cm4gQXNzZXRNb2RlbFxuICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAuaW5zZXJ0KGFzc2V0cylcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUFkZGRlZEFuZFJlbW92ZWRBc3NldHMoXG4gICAgc3RvcmFnZSxcbiAgICBhZGRlZEZpbGVzLFxuICAgIHJlbW92ZWRGaWxlcyxcbiAgICB0cnggPSBudWxsXG4gICkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFzc2V0czoge1xuICAgICAgICBjbGVhbnVwVGltZVRocmVzaG9sZCA9IDBcbiAgICAgIH0gPSB7fVxuICAgIH0gPSB0aGlzLmNvbmZpZ1xuICAgIC8vIE9ubHkgcmVtb3ZlIHVudXNlZCBhc3NldHMgdGhhdCBoYXZlbid0IHNlZW4gY2hhbmdlcyBmb3IgZ2l2ZW4gdGltZWZyYW1lLlxuICAgIGNvbnN0IHRpbWVUaHJlc2hvbGQgPSBpc1N0cmluZyhjbGVhbnVwVGltZVRocmVzaG9sZClcbiAgICAgID8gcGFyc2VEdXJhdGlvbihjbGVhbnVwVGltZVRocmVzaG9sZClcbiAgICAgIDogY2xlYW51cFRpbWVUaHJlc2hvbGRcblxuICAgIGNvbnN0IGltcG9ydGVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGltcG9ydGVkRmlsZXMucHVzaChcbiAgICAgICAgLi4uYXdhaXQgdGhpcy5hZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGFkZGVkRmlsZXMsIHRyeClcbiAgICAgIClcbiAgICAgIGlmIChcbiAgICAgICAgYWRkZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgIHJlbW92ZWRGaWxlcy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY2hhbmdlQ291bnQgPSAoZmlsZXMsIGluY3JlbWVudCkgPT4gKFxuICAgICAgICAgIGZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBBc3NldE1vZGVsLnF1ZXJ5KHRyeClcbiAgICAgICAgICAgIC53aGVyZUluKCdrZXknLCBmaWxlcy5tYXAoZmlsZSA9PiBmaWxlLmtleSkpXG4gICAgICAgICAgICAuaW5jcmVtZW50KCdjb3VudCcsIGluY3JlbWVudClcbiAgICAgICAgKVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgY2hhbmdlQ291bnQoYWRkZWRGaWxlcywgMSksXG4gICAgICAgICAgY2hhbmdlQ291bnQocmVtb3ZlZEZpbGVzLCAtMSlcbiAgICAgICAgXSlcbiAgICAgICAgaWYgKHRpbWVUaHJlc2hvbGQgPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgIC8vIERvbid0IHBhc3MgYHRyeGAgaGVyZSwgYXMgd2Ugd2FudCB0aGlzIGRlbGF5ZWQgZXhlY3V0aW9uIHRvXG4gICAgICAgICAgICAvLyBjcmVhdGUgaXRzIG93biB0cmFuc2FjdGlvbi5cbiAgICAgICAgICAgICgpID0+IHRoaXMucmVsZWFzZVVudXNlZEFzc2V0cyh0aW1lVGhyZXNob2xkKSxcbiAgICAgICAgICAgIHRpbWVUaHJlc2hvbGRcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFsc28gZXhlY3V0ZSByZWxlYXNlVW51c2VkQXNzZXRzKCkgaW1tZWRpYXRlbHkgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHRyYW5zYWN0aW9uLCB0byBwb3RlbnRpYWxseSBjbGVhbiB1cCBvdGhlciBwZW5kaW5nIGFzc2V0cy5cbiAgICAgIGF3YWl0IHRoaXMucmVsZWFzZVVudXNlZEFzc2V0cyh0aW1lVGhyZXNob2xkLCB0cngpXG4gICAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZEZvcmVpZ25Bc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICAvLyBGaW5kIG1pc3NpbmcgYXNzZXRzIChjb3BpZWQgZnJvbSBhbm90aGVyIHN5c3RlbSksIGFuZCBhZGQgdGhlbS5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBBc3NldE1vZGVsLnF1ZXJ5KHRyeCkuZmluZE9uZSgna2V5JywgZmlsZS5rZXkpXG4gICAgICAgICAgaWYgKCFhc3NldCkge1xuICAgICAgICAgICAgaWYgKGZpbGUuZGF0YSB8fCBmaWxlLnVybCkge1xuICAgICAgICAgICAgICBsZXQgeyBkYXRhIH0gPSBmaWxlXG4gICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgICAgIGAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5yZWQoJ0lORk86JylcbiAgICAgICAgICAgICAgICAgIH0gQXNzZXQgJHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oYCcke2ZpbGUubmFtZX0nYClcbiAgICAgICAgICAgICAgICAgIH0gaXMgZnJvbSBhIGZvcmVpZ24gc291cmNlLCBmZXRjaGluZyBmcm9tICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtmaWxlLnVybH0nYClcbiAgICAgICAgICAgICAgICAgIH0gYW5kIGFkZGluZyB0byBzdG9yYWdlICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtzdG9yYWdlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9Li4uYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgICAgICAgICAgIHVybDogZmlsZS51cmwsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgaW1wb3J0ZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGRhdGEpXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQXNzZXRzKHN0b3JhZ2UsIFtpbXBvcnRlZEZpbGVdLCAwLCB0cngpXG4gICAgICAgICAgICAgIC8vIE1lcmdlIGJhY2sgdGhlIGNoYW5nZWQgZmlsZSBwcm9wZXJ0aWVzIGludG8gdGhlIGFjdHVhbCBmaWxlc1xuICAgICAgICAgICAgICAvLyBvYmplY3QsIHNvIHRoYXQgdGhlIGRhdGEgZnJvbSB0aGUgc3RhdGljIG1vZGVsIGhvb2sgY2FuIGJlIHVzZWRcbiAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgZm9yIHRoZSBhY3R1YWwgcnVubmluZyBxdWVyeS5cbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICAgIGltcG9ydGVkRmlsZXMucHVzaChpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGltcG9ydCBhc3NldCBmcm9tIGZvcmVpZ24gc291cmNlOiAnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUubmFtZVxuICAgICAgICAgICAgICAgIH0nICgnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUua2V5XG4gICAgICAgICAgICAgICAgfScpYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFzc2V0IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgYnV0IHdhcyBhbHJlYWR5IGltcG9ydGVkIGFuZCBjYW5cbiAgICAgICAgICAgIC8vIGJlIHJldXNlZC4gU2VlIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIG1lcmdlLlxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBhc3NldC5maWxlKVxuICAgICAgICAgICAgLy8gTk9URTogTm8gbmVlZCB0byBhZGQgYGZpbGVgIHRvIGBpbXBvcnRlZEZpbGVzYCwgc2luY2UgaXQnc1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBiZWVuIGltcG9ydGVkIHRvIHRoZSBzdG9yYWdlIGJlZm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRlZEZpbGVzXG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RpZmllZEFzc2V0cyhzdG9yYWdlLCBmaWxlcywgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IG1vZGlmaWVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgICAgaWYgKGZpbGUuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBBc3NldE1vZGVsLnF1ZXJ5KHRyeCkuZmluZE9uZSgna2V5JywgZmlsZS5rZXkpXG4gICAgICAgICAgICBpZiAoYXNzZXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpbGUgPSBhd2FpdCBzdG9yYWdlLmFkZEZpbGUoZmlsZSwgZmlsZS5kYXRhKVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICAgIG1vZGlmaWVkRmlsZXMucHVzaChjaGFuZ2VkRmlsZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gdXBkYXRlIG1vZGlmaWVkIGFzc2V0IGZyb20gbWVtb3J5IHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIG1vZGlmaWVkRmlsZXNcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCA9IDAsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICByZXR1cm4gQXNzZXRNb2RlbC50cmFuc2FjdGlvbih0cngsIGFzeW5jIHRyeCA9PiB7XG4gICAgICAgIC8vIERldGVybWluZSB0aGUgdGltZSB0aHJlc2hvbGQgaW4gSlMgaW5zdGVhZCBvZiBTUUwsIGFzIHRoZXJlIGlzIG5vXG4gICAgICAgIC8vIGVhc3kgY3Jvc3MtU1FMIHdheSB0byBkbyBgbm93KCkgLSBpbnRlcnZhbCBYIGhvdXJzYDpcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIHRpbWVUaHJlc2hvbGQpXG4gICAgICAgIGNvbnN0IG9ycGhhbmVkQXNzZXRzID0gYXdhaXQgQXNzZXRNb2RlbFxuICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgLndoZXJlKCdjb3VudCcsIDApXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPD0nLCBkYXRlKVxuICAgICAgICAgIC8vIFByb3RlY3QgZnJlc2hseSBjcmVhdGVkIGFzc2V0cyBmcm9tIGJlaW5nIGRlbGV0ZWQgYWdhaW4gcmlnaHQgYXdheSxcbiAgICAgICAgICAvLyAuZS5nLiB3aGVuIGBjb25maWcuYXNzZXRzLmNsZWFudXBUaW1lVGhyZXNob2xkID0gMGBcbiAgICAgICAgICAuYW5kV2hlcmUoJ3VwZGF0ZWRBdCcsICc+JywgcmVmKCdjcmVhdGVkQXQnKSlcbiAgICAgICAgaWYgKG9ycGhhbmVkQXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBvcnBoYW5lZEtleXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIG9ycGhhbmVkQXNzZXRzLm1hcChhc3luYyBhc3NldCA9PiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRTdG9yYWdlKGFzc2V0LnN0b3JhZ2UpLnJlbW92ZUZpbGUoYXNzZXQuZmlsZSlcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgICAgICAgYXNzZXQuZXJyb3IgPSBlcnJvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhc3NldC5rZXlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICAgIGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgIC53aGVyZUluKCdrZXknLCBvcnBoYW5lZEtleXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ycGhhbmVkQXNzZXRzXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vLyBPdmVycmlkZSBLb2EncyBldmVudHMgd2l0aCBvdXIgb3duIEV2ZW50RW1pdHRlciB0aGF0IGFkZHMgc3VwcG9ydCBmb3Jcbi8vIGFzeW5jaHJvbm91cyBldmVudHMuXG5FdmVudEVtaXR0ZXIubWl4aW4oQXBwbGljYXRpb24ucHJvdG90eXBlKVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHt9XG59XG4iXX0=
@@ -3,6 +3,8 @@
3
3
  exports.__esModule = true;
4
4
  exports.default = void 0;
5
5
 
6
+ require("core-js/modules/es.error.cause.js");
7
+
6
8
  var _default = modelName => class SessionStore {
7
9
  constructor(ctx) {
8
10
  this.ctx = ctx;
@@ -35,4 +37,4 @@ var _default = modelName => class SessionStore {
35
37
  };
36
38
 
37
39
  exports.default = _default;
38
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvU2Vzc2lvblN0b3JlLmpzIl0sIm5hbWVzIjpbIm1vZGVsTmFtZSIsIlNlc3Npb25TdG9yZSIsImNvbnN0cnVjdG9yIiwiY3R4IiwibW9kZWxDbGFzcyIsImFwcCIsIm1vZGVscyIsIkVycm9yIiwicXVlcnkiLCJ0cmFuc2FjdGlvbiIsImdldCIsImlkIiwic2Vzc2lvbiIsImZpbmRCeUlkIiwidmFsdWUiLCJzZXQiLCJ1cHNlcnQiLCJnZXRSZWZlcmVuY2UiLCJkZXN0cm95Iiwia2V5IiwiZGVsZXRlQnlJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7ZUFBZUEsU0FBUyxJQUFJLE1BQU1DLFlBQU4sQ0FBbUI7QUFDN0NDLEVBQUFBLFdBQVcsQ0FBQ0MsR0FBRCxFQUFNO0FBQ2YsU0FBS0EsR0FBTCxHQUFXQSxHQUFYO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQkQsR0FBRyxDQUFDRSxHQUFKLENBQVFDLE1BQVIsQ0FBZU4sU0FBZixDQUFsQjs7QUFDQSxRQUFJLENBQUMsS0FBS0ksVUFBVixFQUFzQjtBQUNwQixZQUFNLElBQUlHLEtBQUosQ0FBVyxnQ0FBK0JQLFNBQVUsR0FBcEQsQ0FBTjtBQUNEO0FBQ0Y7O0FBRURRLEVBQUFBLEtBQUssR0FBRztBQUNOLFdBQU8sS0FBS0osVUFBTCxDQUFnQkksS0FBaEIsQ0FBc0IsS0FBS0wsR0FBTCxDQUFTTSxXQUEvQixDQUFQO0FBQ0Q7O0FBRVEsUUFBSEMsR0FBRyxDQUFDQyxFQUFELEVBQUs7QUFDWixVQUFNQyxPQUFPLEdBQUcsTUFBTSxLQUFLSixLQUFMLEdBQWFLLFFBQWIsQ0FBc0JGLEVBQXRCLENBQXRCO0FBQ0EsV0FBTyxDQUFBQyxPQUFPLFFBQVAsWUFBQUEsT0FBTyxDQUFFRSxLQUFULEtBQWtCLEVBQXpCO0FBQ0Q7O0FBRVEsUUFBSEMsR0FBRyxDQUFDSixFQUFELEVBQUtHLEtBQUwsRUFBWTtBQUNuQixVQUFNLEtBQUtOLEtBQUwsR0FDSEssUUFERyxDQUNNRixFQUROLEVBRUhLLE1BRkcsQ0FFSSxFQUNOLEdBQUcsS0FBS1osVUFBTCxDQUFnQmEsWUFBaEIsQ0FBNkJOLEVBQTdCLENBREc7QUFFTkcsTUFBQUE7QUFGTSxLQUZKLENBQU47QUFNRDs7QUFFWSxRQUFQSSxPQUFPLENBQUNDLEdBQUQsRUFBTTtBQUNqQixXQUFPLEtBQUtYLEtBQUwsR0FBYVksVUFBYixDQUF3QkQsR0FBeEIsQ0FBUDtBQUNEOztBQTdCNEMsQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IG1vZGVsTmFtZSA9PiBjbGFzcyBTZXNzaW9uU3RvcmUge1xuICBjb25zdHJ1Y3RvcihjdHgpIHtcbiAgICB0aGlzLmN0eCA9IGN0eFxuICAgIHRoaXMubW9kZWxDbGFzcyA9IGN0eC5hcHAubW9kZWxzW21vZGVsTmFtZV1cbiAgICBpZiAoIXRoaXMubW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBtb2RlbCBjbGFzczogJyR7bW9kZWxOYW1lfSdgKVxuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsQ2xhc3MucXVlcnkodGhpcy5jdHgudHJhbnNhY3Rpb24pXG4gIH1cblxuICBhc3luYyBnZXQoaWQpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5xdWVyeSgpLmZpbmRCeUlkKGlkKVxuICAgIHJldHVybiBzZXNzaW9uPy52YWx1ZSB8fCB7fVxuICB9XG5cbiAgYXN5bmMgc2V0KGlkLCB2YWx1ZSkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoKVxuICAgICAgLmZpbmRCeUlkKGlkKVxuICAgICAgLnVwc2VydCh7XG4gICAgICAgIC4uLnRoaXMubW9kZWxDbGFzcy5nZXRSZWZlcmVuY2UoaWQpLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5kZWxldGVCeUlkKGtleSlcbiAgfVxufVxuIl19
40
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvU2Vzc2lvblN0b3JlLmpzIl0sIm5hbWVzIjpbIm1vZGVsTmFtZSIsIlNlc3Npb25TdG9yZSIsImNvbnN0cnVjdG9yIiwiY3R4IiwibW9kZWxDbGFzcyIsImFwcCIsIm1vZGVscyIsIkVycm9yIiwicXVlcnkiLCJ0cmFuc2FjdGlvbiIsImdldCIsImlkIiwic2Vzc2lvbiIsImZpbmRCeUlkIiwidmFsdWUiLCJzZXQiLCJ1cHNlcnQiLCJnZXRSZWZlcmVuY2UiLCJkZXN0cm95Iiwia2V5IiwiZGVsZXRlQnlJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztlQUFlQSxTQUFTLElBQUksTUFBTUMsWUFBTixDQUFtQjtBQUM3Q0MsRUFBQUEsV0FBVyxDQUFDQyxHQUFELEVBQU07QUFDZixTQUFLQSxHQUFMLEdBQVdBLEdBQVg7QUFDQSxTQUFLQyxVQUFMLEdBQWtCRCxHQUFHLENBQUNFLEdBQUosQ0FBUUMsTUFBUixDQUFlTixTQUFmLENBQWxCOztBQUNBLFFBQUksQ0FBQyxLQUFLSSxVQUFWLEVBQXNCO0FBQ3BCLFlBQU0sSUFBSUcsS0FBSixDQUFXLGdDQUErQlAsU0FBVSxHQUFwRCxDQUFOO0FBQ0Q7QUFDRjs7QUFFRFEsRUFBQUEsS0FBSyxHQUFHO0FBQ04sV0FBTyxLQUFLSixVQUFMLENBQWdCSSxLQUFoQixDQUFzQixLQUFLTCxHQUFMLENBQVNNLFdBQS9CLENBQVA7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNDLEVBQUQsRUFBSztBQUNaLFVBQU1DLE9BQU8sR0FBRyxNQUFNLEtBQUtKLEtBQUwsR0FBYUssUUFBYixDQUFzQkYsRUFBdEIsQ0FBdEI7QUFDQSxXQUFPLENBQUFDLE9BQU8sUUFBUCxZQUFBQSxPQUFPLENBQUVFLEtBQVQsS0FBa0IsRUFBekI7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNKLEVBQUQsRUFBS0csS0FBTCxFQUFZO0FBQ25CLFVBQU0sS0FBS04sS0FBTCxHQUNISyxRQURHLENBQ01GLEVBRE4sRUFFSEssTUFGRyxDQUVJLEVBQ04sR0FBRyxLQUFLWixVQUFMLENBQWdCYSxZQUFoQixDQUE2Qk4sRUFBN0IsQ0FERztBQUVORyxNQUFBQTtBQUZNLEtBRkosQ0FBTjtBQU1EOztBQUVZLFFBQVBJLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNO0FBQ2pCLFdBQU8sS0FBS1gsS0FBTCxHQUFhWSxVQUFiLENBQXdCRCxHQUF4QixDQUFQO0FBQ0Q7O0FBN0I0QyxDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgbW9kZWxOYW1lID0+IGNsYXNzIFNlc3Npb25TdG9yZSB7XG4gIGNvbnN0cnVjdG9yKGN0eCkge1xuICAgIHRoaXMuY3R4ID0gY3R4XG4gICAgdGhpcy5tb2RlbENsYXNzID0gY3R4LmFwcC5tb2RlbHNbbW9kZWxOYW1lXVxuICAgIGlmICghdGhpcy5tb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIG1vZGVsIGNsYXNzOiAnJHttb2RlbE5hbWV9J2ApXG4gICAgfVxuICB9XG5cbiAgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxDbGFzcy5xdWVyeSh0aGlzLmN0eC50cmFuc2FjdGlvbilcbiAgfVxuXG4gIGFzeW5jIGdldChpZCkge1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpXG4gICAgcmV0dXJuIHNlc3Npb24/LnZhbHVlIHx8IHt9XG4gIH1cblxuICBhc3luYyBzZXQoaWQsIHZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeSgpXG4gICAgICAuZmluZEJ5SWQoaWQpXG4gICAgICAudXBzZXJ0KHtcbiAgICAgICAgLi4udGhpcy5tb2RlbENsYXNzLmdldFJlZmVyZW5jZShpZCksXG4gICAgICAgIHZhbHVlXG4gICAgICB9KVxuICB9XG5cbiAgYXN5bmMgZGVzdHJveShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLmRlbGV0ZUJ5SWQoa2V5KVxuICB9XG59XG4iXX0=