@ditojs/server 0.271.0 → 0.274.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 (86) hide show
  1. package/lib/app/Application.js +68 -25
  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 +14 -4
  6. package/lib/cli/db/createMigration.js +16 -4
  7. package/lib/cli/db/index.js +7 -1
  8. package/lib/cli/db/listAssetConfig.js +4 -2
  9. package/lib/cli/db/migrate.js +3 -3
  10. package/lib/cli/db/reset.js +3 -3
  11. package/lib/cli/db/rollback.js +3 -3
  12. package/lib/cli/db/seed.js +14 -6
  13. package/lib/cli/db/unlock.js +3 -3
  14. package/lib/cli/index.js +9 -5
  15. package/lib/controllers/AdminController.js +18 -6
  16. package/lib/controllers/CollectionController.js +15 -1
  17. package/lib/controllers/Controller.js +28 -4
  18. package/lib/controllers/ControllerAction.js +18 -6
  19. package/lib/controllers/RelationController.js +9 -3
  20. package/lib/controllers/UserController.js +15 -1
  21. package/lib/controllers/index.js +7 -1
  22. package/lib/decorators/index.js +7 -1
  23. package/lib/decorators/parameters.js +4 -2
  24. package/lib/decorators/returns.js +4 -2
  25. package/lib/errors/DatabaseError.js +5 -19
  26. package/lib/errors/ResponseError.js +4 -14
  27. package/lib/errors/index.js +7 -1
  28. package/lib/graph/DitoGraphProcessor.js +5 -1
  29. package/lib/graph/expression.js +5 -1
  30. package/lib/graph/graph.js +18 -2
  31. package/lib/graph/index.js +7 -1
  32. package/lib/index.js +7 -1
  33. package/lib/lib/index.js +7 -1
  34. package/lib/middleware/findRoute.js +7 -1
  35. package/lib/middleware/index.js +7 -1
  36. package/lib/middleware/logRequests.js +4 -4
  37. package/lib/mixins/AssetMixin.js +4 -4
  38. package/lib/mixins/SessionMixin.js +4 -4
  39. package/lib/mixins/TimeStampedMixin.js +4 -4
  40. package/lib/mixins/UserMixin.js +10 -4
  41. package/lib/mixins/index.js +7 -1
  42. package/lib/models/Model.js +41 -22
  43. package/lib/models/definitions/filters.js +9 -1
  44. package/lib/models/definitions/properties.js +7 -1
  45. package/lib/models/definitions/scopes.js +9 -1
  46. package/lib/models/index.js +7 -1
  47. package/lib/query/QueryBuilder.js +11 -1
  48. package/lib/query/QueryFilters.js +11 -1
  49. package/lib/query/index.js +7 -1
  50. package/lib/schema/formats/index.js +7 -1
  51. package/lib/schema/index.js +10 -2
  52. package/lib/schema/keywords/index.js +7 -1
  53. package/lib/schema/properties.js +11 -1
  54. package/lib/schema/relations.js +18 -4
  55. package/lib/services/index.js +7 -1
  56. package/lib/storage/DiskStorage.js +7 -1
  57. package/lib/storage/Storage.js +5 -1
  58. package/lib/storage/index.js +7 -1
  59. package/lib/utils/emitter.js +5 -1
  60. package/lib/utils/index.js +15 -1
  61. package/lib/utils/json.js +9 -0
  62. package/lib/utils/object.js +9 -3
  63. package/package.json +31 -31
  64. package/src/app/Application.js +40 -11
  65. package/src/app/Validator.js +2 -1
  66. package/src/cli/console.js +3 -3
  67. package/src/cli/db/createMigration.js +3 -3
  68. package/src/cli/db/listAssetConfig.js +3 -1
  69. package/src/cli/db/migrate.js +4 -4
  70. package/src/cli/db/reset.js +4 -4
  71. package/src/cli/db/rollback.js +4 -4
  72. package/src/cli/db/seed.js +6 -6
  73. package/src/cli/db/unlock.js +2 -2
  74. package/src/cli/index.js +3 -3
  75. package/src/controllers/AdminController.js +3 -2
  76. package/src/controllers/Controller.js +8 -8
  77. package/src/controllers/ControllerAction.js +7 -5
  78. package/src/controllers/RelationController.js +2 -2
  79. package/src/decorators/parameters.js +2 -2
  80. package/src/decorators/returns.js +2 -2
  81. package/src/errors/DatabaseError.js +2 -23
  82. package/src/errors/ResponseError.js +1 -8
  83. package/src/middleware/logRequests.js +9 -9
  84. package/src/models/Model.js +13 -8
  85. package/src/utils/index.js +1 -0
  86. package/src/utils/json.js +3 -0
@@ -3,8 +3,24 @@
3
3
  exports.__esModule = true;
4
4
  exports.Model = void 0;
5
5
 
6
+ require("core-js/modules/esnext.async-iterator.for-each.js");
7
+
8
+ require("core-js/modules/esnext.iterator.constructor.js");
9
+
10
+ require("core-js/modules/esnext.iterator.for-each.js");
11
+
12
+ require("core-js/modules/esnext.async-iterator.reduce.js");
13
+
14
+ require("core-js/modules/esnext.iterator.reduce.js");
15
+
16
+ require("core-js/modules/esnext.async-iterator.filter.js");
17
+
18
+ require("core-js/modules/esnext.iterator.filter.js");
19
+
6
20
  require("core-js/modules/esnext.weak-map.delete-all.js");
7
21
 
22
+ require("core-js/modules/esnext.weak-map.emplace.js");
23
+
8
24
  var _objection = _interopRequireDefault(require("objection"));
9
25
 
10
26
  var _query = require("../query");
@@ -15,9 +31,11 @@ var _schema = require("../schema");
15
31
 
16
32
  var _graph = require("../graph");
17
33
 
34
+ var _utils = require("../utils");
35
+
18
36
  var _errors = require("../errors");
19
37
 
20
- var _utils = require("@ditojs/utils");
38
+ var _utils2 = require("@ditojs/utils");
21
39
 
22
40
  var _RelationAccessor = _interopRequireDefault(require("./RelationAccessor"));
23
41
 
@@ -170,7 +188,7 @@ class Model extends _objection.default.Model {
170
188
  return shallow ? inputJson.$set(result) : result;
171
189
  };
172
190
 
173
- return (0, _utils.isPromise)(result) ? result.then(handleResult) : handleResult(result);
191
+ return (0, _utils2.isPromise)(result) ? result.then(handleResult) : handleResult(result);
174
192
  }
175
193
 
176
194
  async $validateGraph(options = {}) {
@@ -194,7 +212,7 @@ class Model extends _objection.default.Model {
194
212
 
195
213
  static query(trx) {
196
214
  return super.query(trx).onError(err => {
197
- err = err instanceof _errors.ResponseError ? err : err instanceof _objection.default.DBError ? new _errors.DatabaseError(err) : new _errors.WrappedError(err);
215
+ err = err instanceof _errors.ResponseError ? err : err instanceof _objection.default.DBError ? this.app.createDatabaseError(err) : new _errors.WrappedError(err);
198
216
  return Promise.reject(err);
199
217
  });
200
218
  }
@@ -232,7 +250,7 @@ class Model extends _objection.default.Model {
232
250
  const ref = new this();
233
251
  const idProperties = this.getIdPropertyArray();
234
252
 
235
- if ((0, _utils.isObject)(modelOrId)) {
253
+ if ((0, _utils2.isObject)(modelOrId)) {
236
254
  const addProperty = key => {
237
255
  const value = modelOrId[key];
238
256
 
@@ -245,10 +263,10 @@ class Model extends _objection.default.Model {
245
263
  idProperties.forEach(addProperty);
246
264
  includeProperties == null ? void 0 : includeProperties.forEach(addProperty);
247
265
  } else {
248
- const ids = (0, _utils.asArray)(modelOrId);
266
+ const ids = (0, _utils2.asArray)(modelOrId);
249
267
 
250
268
  if (ids.length !== idProperties.length) {
251
- throw new _errors.ModelError(this, `Invalid amount of id values provided for reference: Unable to map ${JSON.stringify(modelOrId)} to ${JSON.stringify(idProperties)}.`);
269
+ throw new _errors.ModelError(this, `Invalid amount of id values provided for reference: Unable to map ${(0, _utils.formatJson)(modelOrId, false)} to ${(0, _utils.formatJson)(idProperties, false)}.`);
252
270
  }
253
271
 
254
272
  idProperties.forEach((key, index) => {
@@ -310,7 +328,7 @@ class Model extends _objection.default.Model {
310
328
  return this._getCached('jsonSchema', () => {
311
329
  const schema = (0, _schema.convertSchema)(this.definition.properties);
312
330
  (0, _schema.addRelationSchemas)(this, schema.properties);
313
- (0, _utils.merge)(schema, this.definition.schema);
331
+ (0, _utils2.merge)(schema, this.definition.schema);
314
332
  return {
315
333
  $id: this.name,
316
334
  $schema: 'http://json-schema.org/draft-07/schema',
@@ -486,7 +504,7 @@ class Model extends _objection.default.Model {
486
504
  const date = json[key];
487
505
 
488
506
  if (date !== undefined) {
489
- json[key] = (0, _utils.isString)(date) ? new Date(date) : date;
507
+ json[key] = (0, _utils2.isString)(date) ? new Date(date) : date;
490
508
  }
491
509
  }
492
510
 
@@ -497,12 +515,12 @@ class Model extends _objection.default.Model {
497
515
  if (assets) {
498
516
  for (const dataPath in assets) {
499
517
  const storage = constructor.app.getStorage(assets[dataPath].storage);
500
- const data = (0, _utils.getValueAtDataPath)(json, dataPath, () => null);
518
+ const data = (0, _utils2.getValueAtDataPath)(json, dataPath, () => null);
501
519
 
502
520
  if (data) {
503
521
  const convertToAssetFiles = data => {
504
522
  if (data) {
505
- if ((0, _utils.isArray)(data)) {
523
+ if ((0, _utils2.isArray)(data)) {
506
524
  data.forEach(convertToAssetFiles);
507
525
  } else {
508
526
  storage.convertAssetFile(data);
@@ -557,15 +575,15 @@ class Model extends _objection.default.Model {
557
575
  }
558
576
 
559
577
  static getPropertyOrRelationAtDataPath(dataPath) {
560
- const parsedDataPath = (0, _utils.parseDataPath)(dataPath);
578
+ const parsedDataPath = (0, _utils2.parseDataPath)(dataPath);
561
579
  let index = 0;
562
580
 
563
581
  const getResult = (property = null, relation = null) => {
564
582
  const found = property || relation;
565
583
  const name = parsedDataPath[index];
566
584
  const next = index + 1;
567
- const dataPath = found ? (0, _utils.normalizeDataPath)(parsedDataPath.slice(0, next)) : null;
568
- const nestedDataPath = found ? (0, _utils.normalizeDataPath)(parsedDataPath.slice(next)) : null;
585
+ const dataPath = found ? (0, _utils2.normalizeDataPath)(parsedDataPath.slice(0, next)) : null;
586
+ const nestedDataPath = found ? (0, _utils2.normalizeDataPath)(parsedDataPath.slice(next)) : null;
569
587
  const expression = found ? parsedDataPath.slice(0, relation ? next : index).join('.') + (property ? `(#${name})` : '') : null;
570
588
  return {
571
589
  property,
@@ -628,7 +646,7 @@ class Model extends _objection.default.Model {
628
646
  }
629
647
 
630
648
  static modifierNotFound(query, modifier) {
631
- if ((0, _utils.isString)(modifier)) {
649
+ if ((0, _utils2.isString)(modifier)) {
632
650
  if (query.modelClass().hasScope(modifier)) {
633
651
  return query.applyScope(modifier);
634
652
  }
@@ -667,9 +685,10 @@ class Model extends _objection.default.Model {
667
685
  case 'ModelValidation':
668
686
  return this.app.createValidationError({
669
687
  type,
670
- message: message || `The provided data for the ${this.name} model is not valid: ${JSON.stringify(json)}`,
688
+ message: message || `The provided data for the ${this.name} model is not valid`,
671
689
  errors,
672
- options
690
+ options,
691
+ json
673
692
  });
674
693
 
675
694
  case 'RelationExpression':
@@ -900,7 +919,7 @@ function getMeta(modelClass, key, value) {
900
919
  }
901
920
 
902
921
  if (!(key in meta)) {
903
- meta[key] = (0, _utils.isFunction)(value) ? value() : value;
922
+ meta[key] = (0, _utils2.isFunction)(value) ? value() : value;
904
923
  }
905
924
 
906
925
  return meta[key];
@@ -911,14 +930,14 @@ function loadAssetDataPaths(query, dataPaths) {
911
930
  }
912
931
 
913
932
  function getValueAtAssetDataPath(item, path) {
914
- return (0, _utils.getValueAtDataPath)(item, path, () => undefined);
933
+ return (0, _utils2.getValueAtDataPath)(item, path, () => undefined);
915
934
  }
916
935
 
917
936
  function getFilesPerAssetDataPath(items, dataPaths) {
918
937
  return dataPaths.reduce((allFiles, dataPath) => {
919
- allFiles[dataPath] = (0, _utils.asArray)(items).reduce((files, item) => {
920
- const data = (0, _utils.asArray)(getValueAtAssetDataPath(item, dataPath));
921
- files.push(...(0, _utils.flatten)(data).filter(file => !!file));
938
+ allFiles[dataPath] = (0, _utils2.asArray)(items).reduce((files, item) => {
939
+ const data = (0, _utils2.asArray)(getValueAtAssetDataPath(item, dataPath));
940
+ files.push(...(0, _utils2.flatten)(data).filter(file => !!file));
922
941
  return files;
923
942
  }, []);
924
943
  return allFiles;
@@ -931,4 +950,4 @@ function mapFilesByKey(files) {
931
950
  return map;
932
951
  }, {});
933
952
  }
934
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbHMvTW9kZWwuanMiXSwibmFtZXMiOlsiTW9kZWwiLCJvYmplY3Rpb24iLCJjb25zdHJ1Y3RvciIsImpzb24iLCIkc2V0SnNvbiIsInNldHVwIiwia25leCIsInJlbGF0aW9uIiwiT2JqZWN0IiwidmFsdWVzIiwiZ2V0UmVsYXRpb25zIiwic2V0dXBSZWxhdGlvbiIsImVycm9yIiwiUmVsYXRpb25FcnJvciIsInJlZmVyZW5jZVZhbGlkYXRvciIsInJlbGF0ZWRNb2RlbENsYXNzIiwiZ2V0UmVsYXRlZFJlbGF0aW9ucyIsInB1c2giLCJhY2Nlc3NvciIsIm5hbWUiLCJwcm90b3R5cGUiLCJkZWZpbmVBY2Nlc3NvciIsInRhcmdldCIsImlzQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsInZhbHVlIiwiUmVsYXRpb25BY2Nlc3NvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJpbml0aWFsaXplIiwiaG9va3MiLCJhc3NldHMiLCJkZWZpbml0aW9uIiwiX3NldHVwRW1pdHRlciIsIl9zZXR1cEFzc2V0c0V2ZW50cyIsIiRpbml0aWFsaXplIiwiJGFwcCIsImFwcCIsIiRpcyIsIm1vZGVsIiwiaWQiLCIkaGFzIiwicHJvcGVydGllcyIsInByb3BlcnR5IiwiJHVwZGF0ZSIsInRyeCIsIiRxdWVyeSIsInVwZGF0ZSIsInJ1bkFmdGVyIiwicmVzdWx0IiwicXVlcnkiLCJoYXMiLCIkc2V0IiwiJHBhdGNoIiwicGF0Y2giLCIkdHJhbnNhY3Rpb24iLCJoYW5kbGVyIiwidHJhbnNhY3Rpb24iLCIkdmFsaWRhdGUiLCJvcHRpb25zIiwic2tpcFZhbGlkYXRpb24iLCJncmFwaCIsImFzeW5jIiwiaW5wdXRKc29uIiwic2hhbGxvdyIsIiRpc09iamVjdGlvbk1vZGVsIiwiY2xvbmUiLCJtdXRhYmxlIiwidmFsaWRhdG9yIiwiZ2V0VmFsaWRhdG9yIiwiYXJncyIsImN0eCIsImNyZWF0ZSIsImJlZm9yZVZhbGlkYXRlIiwidmFsaWRhdGUiLCJoYW5kbGVSZXN1bHQiLCJhZnRlclZhbGlkYXRlIiwidGhlbiIsIiR2YWxpZGF0ZUdyYXBoIiwiZnJvbUpzb24iLCJvbkVycm9yIiwiZXJyIiwiUmVzcG9uc2VFcnJvciIsIkRCRXJyb3IiLCJEYXRhYmFzZUVycm9yIiwiV3JhcHBlZEVycm9yIiwiUHJvbWlzZSIsInJlamVjdCIsImNvdW50IiwiZmlyc3QiLCJ0YWJsZU5hbWUiLCJtYXRjaCIsImlkQ29sdW1uIiwiaWRzIiwiZW50cmllcyIsInByaW1hcnkiLCJsZW5ndGgiLCJnZXRSZWZlcmVuY2UiLCJtb2RlbE9ySWQiLCJpbmNsdWRlUHJvcGVydGllcyIsInJlZiIsImlkUHJvcGVydGllcyIsImdldElkUHJvcGVydHlBcnJheSIsImFkZFByb3BlcnR5Iiwia2V5IiwidW5kZWZpbmVkIiwidWlkUmVmUHJvcCIsImZvckVhY2giLCJNb2RlbEVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImluZGV4IiwiaXNSZWZlcmVuY2UiLCJvYmoiLCJjb21waWxlVmFsaWRhdG9yIiwib25lT2YiLCJ0eXBlIiwicmVkdWNlIiwiaWRQcm9wZXJ0eSIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwidGhyb3ciLCJnZXRTY29wZSIsInNjb3BlcyIsImhhc1Njb3BlIiwiZ2V0TW9kaWZpZXJzIiwibW9kaWZpZXJzIiwicmVsYXRpb25NYXBwaW5ncyIsIl9nZXRDYWNoZWQiLCJyZWxhdGlvbnMiLCJtb2RlbHMiLCJqc29uU2NoZW1hIiwic2NoZW1hIiwiJGlkIiwiJHNjaGVtYSIsInZpcnR1YWxBdHRyaWJ1dGVzIiwiY29tcHV0ZWRBdHRyaWJ1dGVzIiwianNvbkF0dHJpYnV0ZXMiLCJnZXRBdHRyaWJ1dGVzIiwic3BlY2lmaWNUeXBlIiwiY29tcHV0ZWQiLCJib29sZWFuQXR0cmlidXRlcyIsImRhdGVBdHRyaWJ1dGVzIiwiaW5jbHVkZXMiLCJoaWRkZW5BdHRyaWJ1dGVzIiwiaGlkZGVuIiwiZmlsdGVyIiwiYXR0cmlidXRlcyIsImlkZW50aWZpZXIiLCJjYWxjdWxhdGUiLCJlbXB0eSIsImNhY2hlIiwiZ2V0TWV0YSIsImVudHJ5IiwicGFydCIsInNwbGl0IiwicHJvcGVydHlOYW1lVG9Db2x1bW5OYW1lIiwicHJvcGVydHlOYW1lIiwiY29sdW1uTmFtZVRvUHJvcGVydHlOYW1lIiwiY29sdW1uTmFtZSIsImNhbGxJbml0aWFsaXplIiwiJGZvcm1hdERhdGFiYXNlSnNvbiIsImRhdGUiLCJ0b0lTT1N0cmluZyIsImlzU1FMaXRlIiwiYm9vbCIsIiRwYXJzZURhdGFiYXNlSnNvbiIsIiRwYXJzZUpzb24iLCJEYXRlIiwiZGF0YVBhdGgiLCJzdG9yYWdlIiwiZ2V0U3RvcmFnZSIsImRhdGEiLCJjb252ZXJ0VG9Bc3NldEZpbGVzIiwiY29udmVydEFzc2V0RmlsZSIsIiRmb3JtYXRKc29uIiwiJGZpbHRlckdyYXBoIiwibW9kZWxHcmFwaCIsImV4cHIiLCIkcG9wdWxhdGVHcmFwaCIsImZpbHRlckdyYXBoIiwicG9wdWxhdGVHcmFwaCIsImdldFByb3BlcnR5T3JSZWxhdGlvbkF0RGF0YVBhdGgiLCJwYXJzZWREYXRhUGF0aCIsImdldFJlc3VsdCIsImZvdW5kIiwibmV4dCIsInNsaWNlIiwibmVzdGVkRGF0YVBhdGgiLCJleHByZXNzaW9uIiwiam9pbiIsImZpcnN0VG9rZW4iLCJvdGhlclRva2VucyIsInRva2VuIiwiaXNPbmVUb09uZSIsInJlbGF0ZWRRdWVyeSIsInJlbGF0aW9uTmFtZSIsImFsaWFzIiwibW9kaWZpZXJOb3RGb3VuZCIsIm1vZGlmaWVyIiwibW9kZWxDbGFzcyIsImFwcGx5U2NvcGUiLCJpZ25vcmVTY29wZSIsInNlbGVjdCIsImNyZWF0ZU5vdEZvdW5kRXJyb3IiLCJOb3RGb3VuZEVycm9yIiwiYnlJZCIsImNyZWF0ZVZhbGlkYXRvciIsImNyZWF0ZVZhbGlkYXRpb25FcnJvciIsIm1lc3NhZ2UiLCJlcnJvcnMiLCJHcmFwaEVycm9yIiwic2V0RGVmaW5pdGlvbiIsImdldERlZmluaXRpb24iLCJkZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiY2FsbCIsImdldFByb3RvdHlwZU9mIiwibWVyZ2VkIiwiZGVmaW5pdGlvbnMiLCIkZW1pdCIsImV2ZW50IiwiZW1pdCIsImJlZm9yZUZpbmQiLCJfZW1pdFN0YXRpY0hvb2siLCJhZnRlckZpbmQiLCJiZWZvcmVJbnNlcnQiLCJhZnRlckluc2VydCIsImJlZm9yZVVwZGF0ZSIsImFmdGVyVXBkYXRlIiwiYmVmb3JlRGVsZXRlIiwiYWZ0ZXJEZWxldGUiLCJvcmlnaW5hbEFyZ3MiLCJsaXN0ZW5lcnMiLCJsaXN0ZW5lciIsInJlcyIsImFzc2V0RGF0YVBhdGhzIiwia2V5cyIsIm9uIiwiaW5wdXRJdGVtcyIsImFzRmluZFF1ZXJ5IiwiYWZ0ZXJJdGVtcyIsImRhdGFQYXRocyIsInBhdGgiLCJnZXRWYWx1ZUF0QXNzZXREYXRhUGF0aCIsImJlZm9yZUl0ZW1zIiwibG9hZEFzc2V0RGF0YVBhdGhzIiwiYmVmb3JlRmlsZXNQZXJEYXRhUGF0aCIsImdldEZpbGVzUGVyQXNzZXREYXRhUGF0aCIsImFmdGVyRmlsZXNQZXJEYXRhUGF0aCIsImltcG9ydGVkRmlsZXMiLCJtb2RpZmllZEZpbGVzIiwicm9sbGJhY2siLCJzZXRNYXhMaXN0ZW5lcnMiLCJjb25zb2xlIiwiaW5mbyIsIm1hcCIsImZpbGUiLCJhbGwiLCJyZW1vdmVGaWxlIiwiYmVmb3JlRmlsZXMiLCJhZnRlckZpbGVzIiwiYmVmb3JlQnlLZXkiLCJtYXBGaWxlc0J5S2V5IiwiYWZ0ZXJCeUtleSIsInJlbW92ZWRGaWxlcyIsImFkZGVkRmlsZXMiLCJoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzIiwiaGFuZGxlTW9kaWZpZWRBc3NldHMiLCJRdWVyeUJ1aWxkZXIiLCJjbG9uZU9iamVjdEF0dHJpYnV0ZXMiLCJwaWNrSnNvblNjaGVtYVByb3BlcnRpZXMiLCJ1c2VMaW1pdEluRmlyc3QiLCJFdmVudEVtaXR0ZXIiLCJtaXhpbiIsIktuZXhIZWxwZXIiLCJtZXRhTWFwIiwiV2Vha01hcCIsIm1ldGEiLCJzZXQiLCJsb2Fk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Z0JEOztBQUVELFNBQVNwQixhQUFULENBQXVCcUIsS0FBdkIsRUFBOEI7QUFDNUIsU0FBT0EsS0FBSyxDQUFDdEssTUFBTixDQUNMLENBQUMwSSxHQUFELEVBQU1DLElBQU4sS0FBZTtBQUNiRCxJQUFBQSxHQUFHLENBQUNDLElBQUksQ0FBQ3hKLEdBQU4sQ0FBSCxHQUFnQndKLElBQWhCO0FBQ0EsV0FBT0QsR0FBUDtBQUNELEdBSkksRUFLTCxFQUxLLENBQVA7QUFPRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvYmplY3Rpb24gZnJvbSAnb2JqZWN0aW9uJ1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSAnQC9xdWVyeSdcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgS25leEhlbHBlciB9IGZyb20gJ0AvbGliJ1xuaW1wb3J0IHsgY29udmVydFNjaGVtYSwgYWRkUmVsYXRpb25TY2hlbWFzLCBjb252ZXJ0UmVsYXRpb25zIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBwb3B1bGF0ZUdyYXBoLCBmaWx0ZXJHcmFwaCB9IGZyb20gJ0AvZ3JhcGgnXG5pbXBvcnQge1xuICBSZXNwb25zZUVycm9yLCBEYXRhYmFzZUVycm9yLCBHcmFwaEVycm9yLCBNb2RlbEVycm9yLCBOb3RGb3VuZEVycm9yLFxuICBSZWxhdGlvbkVycm9yLCBXcmFwcGVkRXJyb3Jcbn0gZnJvbSAnQC9lcnJvcnMnXG5pbXBvcnQge1xuICBpc1N0cmluZywgaXNPYmplY3QsIGlzQXJyYXksIGlzRnVuY3Rpb24sIGlzUHJvbWlzZSwgYXNBcnJheSwgbWVyZ2UsIGZsYXR0ZW4sXG4gIHBhcnNlRGF0YVBhdGgsIG5vcm1hbGl6ZURhdGFQYXRoLCBnZXRWYWx1ZUF0RGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBSZWxhdGlvbkFjY2Vzc29yIGZyb20gJy4vUmVsYXRpb25BY2Nlc3NvcidcbmltcG9ydCBkZWZpbml0aW9ucyBmcm9tICcuL2RlZmluaXRpb25zJ1xuXG5leHBvcnQgY2xhc3MgTW9kZWwgZXh0ZW5kcyBvYmplY3Rpb24uTW9kZWwge1xuICAvLyBEZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIHRvIGFsbG93IG5ldyBNb2RlbChqc29uKSBhcyBhIHNob3J0LWN1dCB0b1xuICAvLyBgTW9kZWwuZnJvbUpzb24oanNvbiwgeyBza2lwVmFsaWRhdGlvbjogdHJ1ZSB9KWBcbiAgY29uc3RydWN0b3IoanNvbikge1xuICAgIHN1cGVyKClcbiAgICBpZiAoanNvbikge1xuICAgICAgdGhpcy4kc2V0SnNvbihqc29uKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXR1cChrbmV4KSB7XG4gICAgdGhpcy5rbmV4KGtuZXgpXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb24gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmdldFJlbGF0aW9ucygpKSkge1xuICAgICAgICB0aGlzLnNldHVwUmVsYXRpb24ocmVsYXRpb24pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yIGluc3RhbmNlb2YgUmVsYXRpb25FcnJvciA/IGVycm9yIDogbmV3IFJlbGF0aW9uRXJyb3IoZXJyb3IpXG4gICAgfVxuICAgIHRoaXMucmVmZXJlbmNlVmFsaWRhdG9yID0gbnVsbFxuICB9XG5cbiAgc3RhdGljIHNldHVwUmVsYXRpb24ocmVsYXRpb24pIHtcbiAgICAvLyBBZGQgdGhpcyByZWxhdGlvbiB0byB0aGUgcmVsYXRlZCBtb2RlbCdzIHJlbGF0ZWRSZWxhdGlvbnMsIHNvIGl0IGNhblxuICAgIC8vIHJlZ2lzdGVyIGFsbCByZXF1aXJlZCBmb3JlaWduIGtleXMgaW4gaXRzIHByb3BlcnRpZXMuXG4gICAgcmVsYXRpb24ucmVsYXRlZE1vZGVsQ2xhc3MuZ2V0UmVsYXRlZFJlbGF0aW9ucygpLnB1c2gocmVsYXRpb24pXG4gICAgLy8gVE9ETzogQ2hlY2sgYHRocm91Z2hgIHNldHRpbmdzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3Q/XG5cbiAgICAvLyBFeHBvc2UgUmVsYXRpb25BY2Nlc3NvciBpbnN0YW5jZXMgZm9yIGVhY2ggcmVsYXRpb24gdW5kZXIgc2hvcnQtY3V0ICRuYW1lXG4gICAgLy8gZm9yIGFjY2VzcyB0byByZWxhdGlvbnMgYW5kIGltcGxpY2l0IGNhbGxzIHRvICRyZWxhdGVkUXVlcnkobmFtZSkuXG4gICAgY29uc3QgYWNjZXNzb3IgPSBgJCR7cmVsYXRpb24ubmFtZX1gXG4gICAgaWYgKGFjY2Vzc29yIGluIHRoaXMucHJvdG90eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgUmVsYXRpb25FcnJvcihcbiAgICAgICAgYE1vZGVsICcke3RoaXMubmFtZX0nIGFscmVhZHkgZGVmaW5lcyBhIHByb3BlcnR5IHdpdGggbmFtZSBgICtcbiAgICAgICAgYCcke2FjY2Vzc29yfScgdGhhdCBjbGFzaGVzIHdpdGggdGhlIHJlbGF0aW9uIGFjY2Vzc29yLmApXG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIGFuIGFjY2Vzc29yIG9uIHRoZSBjbGFzcyBhcyB3ZWxsIGFzIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3aGVuXG4gICAgLy8gZmlyc3QgY2FsbGVkIGNyZWF0ZXMgYSBSZWxhdGlvbkFjY2Vzc29yIGluc3RhbmNlIGFuZCB0aGVuIG92ZXJyaWRlcyB0aGVcbiAgICAvLyBhY2Nlc3NvciB3aXRoIG9uZSB0aGF0IHRoZW4ganVzdCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFmdGVyd2FyZHMuXG4gICAgY29uc3QgZGVmaW5lQWNjZXNzb3IgPSAodGFyZ2V0LCBpc0NsYXNzKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBhY2Nlc3Nvciwge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgUmVsYXRpb25BY2Nlc3NvcihcbiAgICAgICAgICAgIHJlbGF0aW9uLFxuICAgICAgICAgICAgaXNDbGFzcyA/IHRoaXMgOiBudWxsLCAvLyBtb2RlbENsYXNzXG4gICAgICAgICAgICBpc0NsYXNzID8gbnVsbCA6IHRoaXMgLy8gbW9kZWxcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gT3ZlcnJpZGUgYWNjZXNzb3Igd2l0aCB2YWx1ZSBvbiBmaXJzdCBjYWxsIGZvciBjYWNoaW5nLlxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhY2Nlc3Nvciwge1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZGVmaW5lQWNjZXNzb3IodGhpcywgdHJ1ZSlcbiAgICBkZWZpbmVBY2Nlc3Nvcih0aGlzLnByb3RvdHlwZSwgZmFsc2UpXG4gIH1cblxuICAvLyBAb3ZlcnJpZGFibGVcbiAgc3RhdGljIGluaXRpYWxpemUoKSB7XG4gICAgY29uc3QgeyBob29rcywgYXNzZXRzIH0gPSB0aGlzLmRlZmluaXRpb25cbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoaG9va3MpXG4gICAgaWYgKGFzc2V0cykge1xuICAgICAgdGhpcy5fc2V0dXBBc3NldHNFdmVudHMoYXNzZXRzKVxuICAgIH1cbiAgfVxuXG4gIC8vIEBvdmVycmlkYWJsZVxuICAkaW5pdGlhbGl6ZSgpIHtcbiAgfVxuXG4gIGdldCAkYXBwKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmFwcFxuICB9XG5cbiAgJGlzKG1vZGVsKSB7XG4gICAgcmV0dXJuIG1vZGVsPy5jb25zdHJ1Y3RvciA9PT0gdGhpcy5jb25zdHJ1Y3RvciAmJiBtb2RlbD8uaWQgPT09IHRoaXMuaWRcbiAgfVxuXG4gICRoYXMoLi4ucHJvcGVydGllcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKCEocHJvcGVydHkgaW4gdGhpcykpIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgJHVwZGF0ZShwcm9wZXJ0aWVzLCB0cngpIHtcbiAgICByZXR1cm4gdGhpcy4kcXVlcnkodHJ4KVxuICAgICAgLnVwZGF0ZShwcm9wZXJ0aWVzKVxuICAgICAgLnJ1bkFmdGVyKChyZXN1bHQsIHF1ZXJ5KSA9PlxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gYCRzZXQoKWAgYW5kIHJldHVybiBgdGhpc2AgaWYgdGhlIHF1ZXJ5IHdhc24ndCBtb2RpZmllZFxuICAgICAgICAvLyBpbiBhIHdheSB0aGF0IHdvdWxkIHJlbW92ZSB0aGUgYHVwZGF0ZSgpYCBjb21tYW5kLCBlLmcuIHRvRmluZFF1ZXJ5KClcbiAgICAgICAgcXVlcnkuaGFzKCd1cGRhdGUnKSA/IHRoaXMuJHNldChyZXN1bHQpIDogcmVzdWx0XG4gICAgICApXG4gIH1cblxuICAkcGF0Y2gocHJvcGVydGllcywgdHJ4KSB7XG4gICAgcmV0dXJuIHRoaXMuJHF1ZXJ5KHRyeClcbiAgICAgIC5wYXRjaChwcm9wZXJ0aWVzKVxuICAgICAgLnJ1bkFmdGVyKChyZXN1bHQsIHF1ZXJ5KSA9PlxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gYCRzZXQoKWAgYW5kIHJldHVybiBgdGhpc2AgaWYgdGhlIHF1ZXJ5IHdhc24ndCBtb2RpZmllZFxuICAgICAgICAvLyBpbiBhIHdheSB0aGF0IHdvdWxkIHJlbW92ZSB0aGUgYHBhdGNoKClgIGNvbW1hbmQsIGUuZy4gdG9GaW5kUXVlcnkoKVxuICAgICAgICBxdWVyeS5oYXMoJ3BhdGNoJykgPyB0aGlzLiRzZXQocmVzdWx0KSA6IHJlc3VsdFxuICAgICAgKVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gICR0cmFuc2FjdGlvbih0cngsIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50cmFuc2FjdGlvbih0cngsIGhhbmRsZXIpXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIHRyYW5zYWN0aW9uKHRyeCwgaGFuZGxlcikge1xuICAgIC8vIFN1cHBvcnQgYm90aCBgdHJhbnNhY3Rpb24odHJ4LCBoYW5kbGVyKWAgJiBgdHJhbnNhY3Rpb24oaGFuZGxlcilgXG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICBoYW5kbGVyID0gdHJ4XG4gICAgICB0cnggPSBudWxsXG4gICAgfVxuICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAvLyBVc2UgZXhpc3RpbmcgdHJhbnNhY3Rpb24sIG9yIGNyZWF0ZSBuZXcgb25lLCB0byBleGVjdXRlIGhhbmRsZXIgd2l0aDpcbiAgICAgIHJldHVybiB0cnhcbiAgICAgICAgPyBoYW5kbGVyKHRyeClcbiAgICAgICAgOiB0aGlzLmtuZXgoKS50cmFuc2FjdGlvbihoYW5kbGVyKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBhcmd1bWVudHMsIHNpbXBseSBkZWxlZ2F0ZSB0byBvYmplY3Rpb24ncyB0cmFuc2FjdGlvbigpXG4gICAgICByZXR1cm4gc3VwZXIudHJhbnNhY3Rpb24oKVxuICAgIH1cbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICAkdmFsaWRhdGUoanNvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKG9wdGlvbnMuc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHJldHVybiBqc29uXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5ncmFwaCAmJiAhb3B0aW9ucy5hc3luYykge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIE9iamVjdGlvbidzICR2YWxpZGF0ZSgpIGlmIHdlIGRvbid0IG5lZWQgYW55IG9mIG91clxuICAgICAgLy8gZXh0ZW5zaW9ucyAoYXN5bmMgYW5kIGdyYXBoIGZvciBub3cpOlxuICAgICAgcmV0dXJuIHN1cGVyLiR2YWxpZGF0ZShqc29uLCBvcHRpb25zKVxuICAgIH1cbiAgICBqc29uID0ganNvbiB8fCB0aGlzXG4gICAgY29uc3QgaW5wdXRKc29uID0ganNvblxuICAgIGNvbnN0IHNoYWxsb3cgPSBqc29uLiRpc09iamVjdGlvbk1vZGVsICYmICFvcHRpb25zLmdyYXBoXG4gICAgaWYgKHNoYWxsb3cpIHtcbiAgICAgIC8vIFN0cmlwIGF3YXkgcmVsYXRpb25zIGFuZCBvdGhlciBpbnRlcm5hbCBzdHVmZi5cbiAgICAgIGpzb24gPSBqc29uLmNsb25lKHsgc2hhbGxvdzogdHJ1ZSB9KVxuICAgICAgLy8gV2UgY2FuIG11dGF0ZSBganNvbmAgbm93IHRoYXQgd2UgdG9vayBhIGNvcHkgb2YgaXQuXG4gICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCBtdXRhYmxlOiB0cnVlIH1cbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLmNvbnN0cnVjdG9yLmdldFZhbGlkYXRvcigpXG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIG9wdGlvbnMsXG4gICAgICBtb2RlbDogdGhpcyxcbiAgICAgIGpzb24sXG4gICAgICBjdHg6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB9XG5cbiAgICB2YWxpZGF0b3IuYmVmb3JlVmFsaWRhdGUoYXJncylcbiAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUoYXJncylcbiAgICBjb25zdCBoYW5kbGVSZXN1bHQgPSByZXN1bHQgPT4ge1xuICAgICAgdmFsaWRhdG9yLmFmdGVyVmFsaWRhdGUoYXJncylcbiAgICAgIC8vIElmIGBqc29uYCB3YXMgc2hhbGxvdy1jbG9uZWQsIGNvcHkgb3ZlciB0aGUgcG9zc2libGUgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICByZXR1cm4gc2hhbGxvdyA/IGlucHV0SnNvbi4kc2V0KHJlc3VsdCkgOiByZXN1bHRcbiAgICB9XG4gICAgLy8gSGFuZGxlIGJvdGggYXN5bmMgYW5kIHN5bmMgdmFsaWRhdGlvbiBoZXJlOlxuICAgIHJldHVybiBpc1Byb21pc2UocmVzdWx0KVxuICAgICAgPyByZXN1bHQudGhlbihoYW5kbGVSZXN1bHQpXG4gICAgICA6IGhhbmRsZVJlc3VsdChyZXN1bHQpXG4gIH1cblxuICBhc3luYyAkdmFsaWRhdGVHcmFwaChvcHRpb25zID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLiR2YWxpZGF0ZShudWxsLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZ3JhcGg6IHRydWUsXG4gICAgICAvLyBBbHdheXMgdXNlIGBhc3luYzogdHJ1ZWAgb3B0aW9uIGhlcmUgZm9yIHNpbXBsaWNpdHk6XG4gICAgICBhc3luYzogdHJ1ZVxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgZnJvbUpzb24oanNvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKG9wdGlvbnMuYXN5bmMgJiYgIW9wdGlvbnMuc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIC8vIEhhbmRsZSBhc3luYyB2YWxpZGF0aW9uLCBhcyBzdXBwb3J0ZWQgYnkgRGl0bzpcbiAgICAgIGNvbnN0IG1vZGVsID0gbmV3IHRoaXMoKVxuICAgICAgcmV0dXJuIG1vZGVsLiR2YWxpZGF0ZShqc29uLCBvcHRpb25zKS50aGVuKFxuICAgICAgICBqc29uID0+IG1vZGVsLiRzZXRKc29uKGpzb24sIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHNraXBWYWxpZGF0aW9uOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIC8vIEZhbGwgYmFjayB0byBPYmplY3Rpb24ncyBmcm9tSnNvbigpIGlmIHdlIGRvbid0IG5lZWQgYXN5bmMgaGFuZGxpbmc6XG4gICAgcmV0dXJuIHN1cGVyLmZyb21Kc29uKGpzb24sIG9wdGlvbnMpXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIHF1ZXJ5KHRyeCkge1xuICAgIHJldHVybiBzdXBlci5xdWVyeSh0cngpLm9uRXJyb3IoZXJyID0+IHtcbiAgICAgIC8vIFRPRE86IFNob3VsZG4ndCB0aGlzIHdyYXBwaW5nIGhhcHBlbiBvbiB0aGUgQ29udHJvbGxlciBsZXZlbD9cbiAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIFJlc3BvbnNlRXJyb3IgPyBlcnJcbiAgICAgICAgOiBlcnIgaW5zdGFuY2VvZiBvYmplY3Rpb24uREJFcnJvciA/IG5ldyBEYXRhYmFzZUVycm9yKGVycilcbiAgICAgICAgOiBuZXcgV3JhcHBlZEVycm9yKGVycilcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjb3VudCguLi5hcmdzKSB7XG4gICAgY29uc3QgeyBjb3VudCB9ID0gYXdhaXQgdGhpcy5xdWVyeSgpLmNvdW50KC4uLmFyZ3MpLmZpcnN0KCkgfHwge31cbiAgICByZXR1cm4gK2NvdW50IHx8IDBcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICAvLyBJZiB0aGUgY2xhc3MgbmFtZSBlbmRzIGluICdNb2RlbCcsIHJlbW92ZSB0aGF0IGZyb20gdGhlIHRhYmxlIG5hbWUuXG4gICAgcmV0dXJuIHRoaXMubmFtZS5tYXRjaCgvXiguKj8pKD86TW9kZWx8KSQvKVsxXVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gIHN0YXRpYyBnZXQgaWRDb2x1bW4oKSB7XG4gICAgLy8gVHJ5IGV4dHJhY3RpbmcgdGhlIGlkIGNvbHVtbiBuYW1lIGZyb20gdGhlIHJhdyBwcm9wZXJ0aWVzIGRlZmluaXRpb25zLFxuICAgIC8vIG5vdCB0aGUgcmVzb2x2ZWQgYGRlZmluaXRpb24ucHJvcGVydGllc2Agd2hpY2ggYXJlbid0IHJlYWR5IGF0IHRoaXMgcG9pbnRcbiAgICAvLyB3aXRoIGZhbGwtYmFjayBvbnRvIGRlZmF1bHQgT2JqZWN0aW9uLmpzIGJlaGF2aW9yLlxuICAgIGNvbnN0IHsgcHJvcGVydGllcyB9ID0gdGhpc1xuICAgIGNvbnN0IGlkcyA9IFtdXG4gICAgZm9yIChjb25zdCBbbmFtZSwgcHJvcGVydHldIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMgfHwge30pKSB7XG4gICAgICBpZiAocHJvcGVydHk/LnByaW1hcnkpIHtcbiAgICAgICAgaWRzLnB1c2gobmFtZSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGlkc1xuICAgIHJldHVybiBsZW5ndGggPiAxID8gaWRzIDogbGVuZ3RoID4gMCA/IGlkc1swXSA6IHN1cGVyLmlkQ29sdW1uXG4gIH1cblxuICBzdGF0aWMgZ2V0UmVmZXJlbmNlKG1vZGVsT3JJZCwgaW5jbHVkZVByb3BlcnRpZXMpIHtcbiAgICAvLyBDcmVhdGVzIGEgcmVmZXJlbmNlIG1vZGVsIHRoYXQgdGFrZXMgb3ZlciB0aGUgaWQgLyAjcmVmIHByb3BlcnRpZXMgZnJvbVxuICAgIC8vIHRoZSBwYXNzZWQgbW9kZWwgb3IgaWQgdmFsdWUvYXJyYXksIG9taXR0aW5nIGFueSBvdGhlciBwcm9wZXJ0aWVzIGluIGl0LFxuICAgIC8vIGV4Y2VwdCBmb3IgYW55dGhpbmcgbWVudGlvbmVkIGluIHRoZSBvcHRpb25hbCBgaW5jbHVkZVByb3BlcnRpZXNgIGFyZy5cbiAgICBjb25zdCByZWYgPSBuZXcgdGhpcygpXG4gICAgY29uc3QgaWRQcm9wZXJ0aWVzID0gdGhpcy5nZXRJZFByb3BlcnR5QXJyYXkoKVxuICAgIGlmIChpc09iamVjdChtb2RlbE9ySWQpKSB7XG4gICAgICBjb25zdCBhZGRQcm9wZXJ0eSA9IGtleSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbW9kZWxPcklkW2tleV1cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWZba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc3VwcG9ydCBPYmplY3Rpb24ncyAjcmVmIHR5cGUgcmVmZXJlbmNlcyBuZXh0IHRvIGlkIHByb3BlcnRpZXMuXG4gICAgICBhZGRQcm9wZXJ0eSh0aGlzLnVpZFJlZlByb3ApXG4gICAgICBpZFByb3BlcnRpZXMuZm9yRWFjaChhZGRQcm9wZXJ0eSlcbiAgICAgIGluY2x1ZGVQcm9wZXJ0aWVzPy5mb3JFYWNoKGFkZFByb3BlcnR5KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbiBpZCB2YWx1ZS9hcnJheTogTWFwIGl0IHRvIHRoZSBwcm9wZXJ0aWVzIGluIGBnZXRJZFByb3BlcnR5QXJyYXkoKWA6XG4gICAgICBjb25zdCBpZHMgPSBhc0FycmF5KG1vZGVsT3JJZClcbiAgICAgIGlmIChpZHMubGVuZ3RoICE9PSBpZFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBNb2RlbEVycm9yKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYEludmFsaWQgYW1vdW50IG9mIGlkIHZhbHVlcyBwcm92aWRlZCBmb3IgcmVmZXJlbmNlOiBVbmFibGUgdG8gbWFwICR7XG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShtb2RlbE9ySWQpXG4gICAgICAgICAgfSB0byAke1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaWRQcm9wZXJ0aWVzKVxuICAgICAgICAgIH0uYFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZFByb3BlcnRpZXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgICByZWZba2V5XSA9IGlkc1tpbmRleF1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIHN0YXRpYyBpc1JlZmVyZW5jZShvYmopIHtcbiAgICBsZXQgdmFsaWRhdG9yID0gdGhpcy5yZWZlcmVuY2VWYWxpZGF0b3JcbiAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgLy8gRm9yIGBkYXRhYCB0byBiZSBjb25zaWRlcmVkIGEgcmVmZXJlbmNlLCBpdCBuZWVkcyB0byBob2xkIG9ubHkgb25lXG4gICAgICAvLyB2YWx1ZSB0aGF0IGlzIGVpdGhlciB0aGUgdGFyZ2V0J3MgaWQsIG9yIGFuIE9iamVjdGlvbi5qcyAjcmVmIHZhbHVlOlxuICAgICAgdmFsaWRhdG9yID0gdGhpcy5yZWZlcmVuY2VWYWxpZGF0b3IgPSB0aGlzLmFwcC5jb21waWxlVmFsaWRhdG9yKFxuICAgICAgICB7XG4gICAgICAgICAgb25lT2Y6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgIC8vIFN1cHBvcnQgY29tcG9zaXRlIGtleXMgYW5kIGFkZCBhIHByb3BlcnR5IGZvciBlYWNoIGtleTpcbiAgICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5nZXRJZFByb3BlcnR5QXJyYXkoKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGlkUHJvcGVydGllcywgaWRQcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWRQcm9wZXJ0aWVzW2lkUHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmRlZmluaXRpb24ucHJvcGVydGllc1tpZFByb3BlcnR5XS50eXBlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaWRQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgW3RoaXMudWlkUmVmUHJvcF06IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlY2VpdmUgYGZhbHNlYCBpbnN0ZWFkIG9mIHRocm93biBleGNlcHRpb25zIHdoZW4gdmFsaWRhdGlvbiBmYWlsczpcbiAgICAgICAgeyB0aHJvdzogZmFsc2UgfVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9yKG9iailcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY29wZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbi5zY29wZXNbbmFtZV1cbiAgfVxuXG4gIHN0YXRpYyBoYXNTY29wZShuYW1lKSB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRTY29wZShuYW1lKVxuICB9XG5cbiAgc3RhdGljIGdldE1vZGlmaWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLm1vZGlmaWVyc1xuICB9XG5cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYWNoZWQoJ3JlbGF0aW9uTWFwcGluZ3MnLCAoKSA9PiAoXG4gICAgICBjb252ZXJ0UmVsYXRpb25zKHRoaXMsIHRoaXMuZGVmaW5pdGlvbi5yZWxhdGlvbnMsIHRoaXMuYXBwLm1vZGVscylcbiAgICApLCB7fSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQganNvblNjaGVtYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2FjaGVkKCdqc29uU2NoZW1hJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gY29udmVydFNjaGVtYSh0aGlzLmRlZmluaXRpb24ucHJvcGVydGllcylcbiAgICAgIGFkZFJlbGF0aW9uU2NoZW1hcyh0aGlzLCBzY2hlbWEucHJvcGVydGllcylcbiAgICAgIC8vIE1lcmdlIGluIHJvb3QtbGV2ZWwgc2NoZW1hIGFkZGl0aW9uc1xuICAgICAgbWVyZ2Uoc2NoZW1hLCB0aGlzLmRlZmluaXRpb24uc2NoZW1hKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJGlkOiB0aGlzLm5hbWUsXG4gICAgICAgICRzY2hlbWE6ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYScsXG4gICAgICAgIC4uLnNjaGVtYVxuICAgICAgfVxuICAgIH0sIHt9KVxuICB9XG5cbiAgc3RhdGljIGdldCB2aXJ0dWFsQXR0cmlidXRlcygpIHtcbiAgICAvLyBMZXZlcmFnZSBPYmplY3Rpb24ncyBvd24gbWVjaGFuaXNtIGNhbGxlZCBgdmlydHVhbEF0dHJpYnV0ZXNgIHRvIGhhbmRsZVxuICAgIC8vIGBjb21wdXRlZEF0dHJpYnV0ZXNgIHdoZW4gc2V0dGluZyBKU09OIGRhdGEuXG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRBdHRyaWJ1dGVzXG4gIH1cblxuICBzdGF0aWMgZ2V0IGpzb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYWNoZWQoJ2pzb25TY2hlbWE6anNvbkF0dHJpYnV0ZXMnLCAoKSA9PiAoXG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZXMoKHsgdHlwZSwgc3BlY2lmaWNUeXBlLCBjb21wdXRlZCB9KSA9PlxuICAgICAgICAhY29tcHV0ZWQgJiYgIXNwZWNpZmljVHlwZSAmJiAodHlwZSA9PT0gJ29iamVjdCcgfHwgdHlwZSA9PT0gJ2FycmF5JykpXG4gICAgKSwgW10pXG4gIH1cblxuICBzdGF0aWMgZ2V0IGJvb2xlYW5BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYWNoZWQoJ2pzb25TY2hlbWE6Ym9vbGVhbkF0dHJpYnV0ZXMnLCAoKSA9PiAoXG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZXMoKHsgdHlwZSwgY29tcHV0ZWQgfSkgPT5cbiAgICAgICAgIWNvbXB1dGVkICYmIHR5cGUgPT09ICdib29sZWFuJylcbiAgICApLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGF0ZUF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhY2hlZCgnanNvblNjaGVtYTpkYXRlQXR0cmlidXRlcycsICgpID0+IChcbiAgICAgIHRoaXMuZ2V0QXR0cmlidXRlcygoeyB0eXBlLCBjb21wdXRlZCB9KSA9PlxuICAgICAgICAhY29tcHV0ZWQgJiYgWydkYXRlJywgJ2RhdGV0aW1lJywgJ3RpbWVzdGFtcCddLmluY2x1ZGVzKHR5cGUpKVxuICAgICksIFtdKVxuICB9XG5cbiAgc3RhdGljIGdldCBjb21wdXRlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhY2hlZCgnanNvblNjaGVtYTpjb21wdXRlZEF0dHJpYnV0ZXMnLCAoKSA9PiAoXG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZXMoKHsgY29tcHV0ZWQgfSkgPT4gY29tcHV0ZWQpXG4gICAgKSwgW10pXG4gIH1cblxuICBzdGF0aWMgZ2V0IGhpZGRlbkF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhY2hlZCgnanNvblNjaGVtYTpoaWRkZW5BdHRyaWJ1dGVzJywgKCkgPT4gKFxuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVzKCh7IGhpZGRlbiB9KSA9PiBoaWRkZW4pXG4gICAgKSwgW10pXG4gIH1cblxuICBzdGF0aWMgZ2V0QXR0cmlidXRlcyhmaWx0ZXIpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gW11cbiAgICBjb25zdCB7IHByb3BlcnRpZXMgfSA9IHRoaXMuZGVmaW5pdGlvblxuICAgIGZvciAoY29uc3QgW25hbWUsIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgICAgaWYgKGZpbHRlcihwcm9wZXJ0eSkpIHtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKG5hbWUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gIH1cblxuICBzdGF0aWMgX2dldENhY2hlZChpZGVudGlmaWVyLCBjYWxjdWxhdGUsIGVtcHR5ID0ge30pIHtcbiAgICBsZXQgY2FjaGUgPSBnZXRNZXRhKHRoaXMsICdjYWNoZScsIHt9KVxuICAgIC8vIFVzZSBhIHNpbXBsZSBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbSB3aXRoIGNhY2hlIGlkZW50aWZpZXJzIHRoYXRcbiAgICAvLyBjYW4gYmUgY2hpbGRyZW4gb2Ygb3RoZXIgY2FjaGVkIHZhbHVlcywgZS5nLjpcbiAgICAvLyAnanNvblNjaGVtYTpqc29uQXR0cmlidXRlcycgYXMgYSBjaGlsZCBvZiAnanNvblNjaGVtYScsIHNvIHRoYXQgd2hlbmV2ZXJcbiAgICAvLyAnanNvblNjaGVtYScgY2hhbmdlcywgYWxsIGNhY2hlZCBjaGlsZCB2YWx1ZXMgIGFyZSBpbnZhbGlkYXRlZC5cbiAgICBsZXQgZW50cnlcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgaWRlbnRpZmllci5zcGxpdCgnOicpKSB7XG4gICAgICBlbnRyeSA9IGNhY2hlW3BhcnRdID0gY2FjaGVbcGFydF0gfHwge1xuICAgICAgICBjYWNoZToge30sXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIGNhY2hlID0gZW50cnkuY2FjaGVcbiAgICB9XG4gICAgaWYgKGVudHJ5Py52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUZW1wb3JhcmlseSBzZXQgY2FjaGUgdG8gYW4gZW1wdHkgb2JqZWN0IHRvIHByZXZlbnQgZW5kbGVzc1xuICAgICAgLy8gcmVjdXJzaW9uIHdpdGggaW50ZXJkZXBlbmRlbnQganNvblNjaGVtYSByZWxhdGVkIGNhbGxzLi4uXG4gICAgICBlbnRyeS52YWx1ZSA9IGVtcHR5XG4gICAgICBlbnRyeS52YWx1ZSA9IGNhbGN1bGF0ZSgpXG4gICAgICAvLyBDbGVhciBjaGlsZCBkZXBlbmRlbmNpZXMgb25jZSBwYXJlbnQgdmFsdWUgaGFzIGNoYW5nZWQ6XG4gICAgICBlbnRyeS5jYWNoZSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBlbnRyeT8udmFsdWVcbiAgfVxuXG4gIHN0YXRpYyBnZXRSZWxhdGVkUmVsYXRpb25zKCkge1xuICAgIHJldHVybiBnZXRNZXRhKHRoaXMsICdyZWxhdGVkUmVsYXRpb25zJywgW10pXG4gIH1cblxuICAvLyBPdmVycmlkZSBwcm9wZXJ0eU5hbWVUb0NvbHVtbk5hbWUoKSAvIGNvbHVtbk5hbWVUb1Byb3BlcnR5TmFtZSgpIHRvIG5vdFxuICAvLyByZWx5IG9uICRmb3JtYXREYXRhYmFzZUpzb24oKSAvICAkcGFyc2VEYXRhYmFzZUpzb24oKSBkbyBkZXRlY3QgbmFtaW5nXG4gIC8vIGNvbnZlbnRpb25zIGJ1dCBhc3N1bWUgc2ltcGx5IHRoYXQgdGhleSdyZSBhbHdheXMgdGhlIHNhbWUuXG4gIC8vIFRoaXMgaXMgZmluZSBzaW5jZSB3ZSBjYW4gbm93IGNoYW5nZSBuYW1pbmcgYXQgS25leCBsZXZlbC5cbiAgLy8gU2VlIGtuZXhTbmFrZUNhc2VNYXBwZXJzKClcblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIHByb3BlcnR5TmFtZVRvQ29sdW1uTmFtZShwcm9wZXJ0eU5hbWUpIHtcbiAgICByZXR1cm4gcHJvcGVydHlOYW1lXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIGNvbHVtbk5hbWVUb1Byb3BlcnR5TmFtZShjb2x1bW5OYW1lKSB7XG4gICAgcmV0dXJuIGNvbHVtbk5hbWVcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICAkc2V0SnNvbihqc29uLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICBjb25zdCBjYWxsSW5pdGlhbGl6ZSA9IChcbiAgICAgIC8vIE9ubHkgY2FsbCBpbml0aWFsaXplIHdoZW46XG4gICAgICAvLyAxLiB3ZSdyZSBub3QgcGFydGlhbGx5IHBhdGNoaW5nOlxuICAgICAgIW9wdGlvbnMucGF0Y2ggJiZcbiAgICAgIC8vIDIuICRpbml0aWFsaXplKCkgaXMgYWN0dWFsbHkgZG9pbmcgc29tZXRoaW5nOlxuICAgICAgdGhpcy4kaW5pdGlhbGl6ZSAhPT0gTW9kZWwucHJvdG90eXBlLiRpbml0aWFsaXplICYmXG4gICAgICAvLyAzLiB0aGUgZGF0YSBpcyBub3QganVzdCBhIHJlZmVyZW5jZTpcbiAgICAgICF0aGlzLmNvbnN0cnVjdG9yLmlzUmVmZXJlbmNlKGpzb24pXG4gICAgKVxuICAgIGlmICghY2FsbEluaXRpYWxpemUgfHwgb3B0aW9ucy5za2lwVmFsaWRhdGlvbikge1xuICAgICAgc3VwZXIuJHNldEpzb24oanNvbiwgb3B0aW9ucylcbiAgICAgIGlmIChjYWxsSW5pdGlhbGl6ZSkge1xuICAgICAgICB0aGlzLiRpbml0aWFsaXplKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdmFsaWRhdGlvbiBpc24ndCBza2lwcGVkIG9yIHRoZSBtb2RlbCBwcm92aWRlcyBpdHMgb3duICRpbml0aWFsaXplKClcbiAgICAgIC8vIG1ldGhvZCwgY2FsbCAkc2V0SnNvbigpIHdpdGggcGF0Y2ggdmFsaWRhdGlvbiBmaXJzdCB0byBub3QgY29tcGxhaW5cbiAgICAgIC8vIGFib3V0IG1pc3NpbmcgZmllbGRzLCB0aGVuIHBlcmZvcm0gYSBmdWxsIHZhbGlkYXRpb24gYWZ0ZXIgY2FsbGluZ1xuICAgICAgLy8gJGluaXRpYWxpemUoKSwgdG8gZ2l2ZSB0aGUgbW9kZWwgYSBjaGFuY2UgdG8gY29uZmlndXJlIGl0c2VsZi5cbiAgICAgIHN1cGVyLiRzZXRKc29uKGpzb24sIHsgLi4ub3B0aW9ucywgcGF0Y2g6IHRydWUgfSlcbiAgICAgIHRoaXMuJGluaXRpYWxpemUoKVxuICAgICAgdGhpcy4kdmFsaWRhdGUodGhpcywgb3B0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICAkZm9ybWF0RGF0YWJhc2VKc29uKGpzb24pIHtcbiAgICBjb25zdCB7IGNvbnN0cnVjdG9yIH0gPSB0aGlzXG4gICAgZm9yIChjb25zdCBrZXkgb2YgY29uc3RydWN0b3IuZGF0ZUF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBqc29uW2tleV1cbiAgICAgIGlmIChkYXRlPy50b0lTT1N0cmluZykge1xuICAgICAgICBqc29uW2tleV0gPSBkYXRlLnRvSVNPU3RyaW5nKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnN0cnVjdG9yLmlzU1FMaXRlKCkpIHtcbiAgICAgIC8vIFNRTGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGJvb2xlYW4gbmF0aXZlbHkgYW5kIG5lZWRzIGNvbnZlcnNpb24uLi5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbnN0cnVjdG9yLmJvb2xlYW5BdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IGJvb2wgPSBqc29uW2tleV1cbiAgICAgICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGpzb25ba2V5XSA9IGJvb2wgPyAxIDogMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSB0aGUgY29tcHV0ZWQgcHJvcGVydGllcyBzbyB0aGV5IGRvbid0IGF0dGVtcHQgdG8gZ2V0IHNldC5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjb25zdHJ1Y3Rvci5jb21wdXRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGRlbGV0ZSBqc29uW2tleV1cbiAgICB9XG4gICAgLy8gTk9URTogTm8gbmVlZCB0byBub3JtYWxpemUgdGhlIGlkZW50aWZpZXJzIGluIHRoZSBKU09OIGluIGNhc2Ugb2ZcbiAgICAvLyBub3JtYWxpemVEYk5hbWVzLCBhcyB0aGlzIGFscmVhZHkgaGFwcGVucyB0aHJvdWdoXG4gICAgLy8ga25leC5jb25maWcud3JhcElkZW50aWZpZXIoKSwgc2VlIEFwcGxpY2F0aW9uLmpzXG4gICAgcmV0dXJuIHN1cGVyLiRmb3JtYXREYXRhYmFzZUpzb24oanNvbilcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICAkcGFyc2VEYXRhYmFzZUpzb24oanNvbikge1xuICAgIGNvbnN0IHsgY29uc3RydWN0b3IgfSA9IHRoaXNcbiAgICBqc29uID0gc3VwZXIuJHBhcnNlRGF0YWJhc2VKc29uKGpzb24pXG4gICAgaWYgKGNvbnN0cnVjdG9yLmlzU1FMaXRlKCkpIHtcbiAgICAgIC8vIFNRTGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGJvb2xlYW4gbmF0aXZlbHkgYW5kIG5lZWRzIGNvbnZlcnNpb24uLi5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbnN0cnVjdG9yLmJvb2xlYW5BdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IGJvb2wgPSBqc29uW2tleV1cbiAgICAgICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGpzb25ba2V5XSA9ICEhYm9vbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFsc28gcnVuIHRocm91Z2ggbm9ybWFsICRwYXJzZUpzb24oKSwgZm9yIGhhbmRsaW5nIG9mIGBEYXRlYCBhbmRcbiAgICAvLyBgQXNzZXRGaWxlYC5cbiAgICByZXR1cm4gdGhpcy4kcGFyc2VKc29uKGpzb24pXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgJHBhcnNlSnNvbihqc29uKSB7XG4gICAgY29uc3QgeyBjb25zdHJ1Y3RvciB9ID0gdGhpc1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbnN0cnVjdG9yLmRhdGVBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBkYXRlID0ganNvbltrZXldXG4gICAgICBpZiAoZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGpzb25ba2V5XSA9IGlzU3RyaW5nKGRhdGUpID8gbmV3IERhdGUoZGF0ZSkgOiBkYXRlXG4gICAgICB9XG4gICAgfVxuICAgIC8vIENvbnZlcnQgcGxhaW4gYXNzZXQgZmlsZXMgb2JqZWN0cyB0byBBc3NldEZpbGUgaW5zdGFuY2VzIHdpdGggcmVmZXJlbmNlc1xuICAgIC8vIHRvIHRoZSBsaW5rZWQgc3RvcmFnZS5cbiAgICBjb25zdCB7IGFzc2V0cyB9ID0gY29uc3RydWN0b3IuZGVmaW5pdGlvblxuICAgIGlmIChhc3NldHMpIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YVBhdGggaW4gYXNzZXRzKSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBjb25zdHJ1Y3Rvci5hcHAuZ2V0U3RvcmFnZShhc3NldHNbZGF0YVBhdGhdLnN0b3JhZ2UpXG4gICAgICAgIGNvbnN0IGRhdGEgPSBnZXRWYWx1ZUF0RGF0YVBhdGgoanNvbiwgZGF0YVBhdGgsICgpID0+IG51bGwpXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgY29uc3QgY29udmVydFRvQXNzZXRGaWxlcyA9IGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgaWYgKGlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goY29udmVydFRvQXNzZXRGaWxlcylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yYWdlLmNvbnZlcnRBc3NldEZpbGUoZGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb252ZXJ0VG9Bc3NldEZpbGVzKGRhdGEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGpzb25cbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICAkZm9ybWF0SnNvbihqc29uKSB7XG4gICAgY29uc3QgeyBjb25zdHJ1Y3RvciB9ID0gdGhpc1xuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IHRoZSBjb21wdXRlZCBwcm9wZXJ0aWVzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbnN0cnVjdG9yLmNvbXB1dGVkQXR0cmlidXRlcykge1xuICAgICAgLy8gUGVyaGFwcyB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgcHJvZHVjZWQgaW4gdGhlIFNRTCBzdGF0ZW1lbnQsXG4gICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgYW55bW9yZSBoZXJlLlxuICAgICAgaWYgKCEoa2V5IGluIGpzb24pKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAganNvbltrZXldID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgaGlkZGVuIGF0dHJpYnV0ZXMuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgY29uc3RydWN0b3IuaGlkZGVuQXR0cmlidXRlcykge1xuICAgICAgZGVsZXRlIGpzb25ba2V5XVxuICAgIH1cbiAgICByZXR1cm4ganNvblxuICB9XG5cbiAgLy8gR3JhcGggaGFuZGxpbmdcblxuICAkZmlsdGVyR3JhcGgobW9kZWxHcmFwaCwgZXhwcikge1xuICAgIHJldHVybiBmaWx0ZXJHcmFwaCh0aGlzLmNvbnN0cnVjdG9yLCBtb2RlbEdyYXBoLCBleHByKVxuICB9XG5cbiAgYXN5bmMgJHBvcHVsYXRlR3JhcGgobW9kZWxHcmFwaCwgZXhwciwgdHJ4KSB7XG4gICAgcmV0dXJuIHBvcHVsYXRlR3JhcGgodGhpcy5jb25zdHJ1Y3RvciwgbW9kZWxHcmFwaCwgZXhwciwgdHJ4KVxuICB9XG5cbiAgc3RhdGljIGZpbHRlckdyYXBoKG1vZGVsR3JhcGgsIGV4cHIpIHtcbiAgICByZXR1cm4gZmlsdGVyR3JhcGgodGhpcywgbW9kZWxHcmFwaCwgZXhwcilcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwb3B1bGF0ZUdyYXBoKG1vZGVsR3JhcGgsIGV4cHIsIHRyeCkge1xuICAgIHJldHVybiBwb3B1bGF0ZUdyYXBoKHRoaXMsIG1vZGVsR3JhcGgsIGV4cHIsIHRyeClcbiAgfVxuXG4gIHN0YXRpYyBnZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gICAgLy8gRmluZHMgdGhlIHByb3BlcnR5IG9yIHJlbGF0aW9uIGF0IHRoZSBnaXZlbiB0aGUgZGF0YVBhdGggb2YgdGhlIG1vZGVsIGJ5XG4gICAgLy8gcGFyc2luZyB0aGUgZGF0YVBhdGggYW5kIG1hdGNoaW5nIGl0IHRvIGl0cyByZWxhdGlvbnMgYW5kIHByb3BlcnRpZXMuXG4gICAgY29uc3QgcGFyc2VkRGF0YVBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgIGxldCBpbmRleCA9IDBcblxuICAgIGNvbnN0IGdldFJlc3VsdCA9IChwcm9wZXJ0eSA9IG51bGwsIHJlbGF0aW9uID0gbnVsbCkgPT4ge1xuICAgICAgY29uc3QgZm91bmQgPSBwcm9wZXJ0eSB8fCByZWxhdGlvblxuICAgICAgY29uc3QgbmFtZSA9IHBhcnNlZERhdGFQYXRoW2luZGV4XVxuICAgICAgY29uc3QgbmV4dCA9IGluZGV4ICsgMVxuICAgICAgY29uc3QgZGF0YVBhdGggPSBmb3VuZFxuICAgICAgICA/IG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlZERhdGFQYXRoLnNsaWNlKDAsIG5leHQpKVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IG5lc3RlZERhdGFQYXRoID0gZm91bmRcbiAgICAgICAgPyBub3JtYWxpemVEYXRhUGF0aChwYXJzZWREYXRhUGF0aC5zbGljZShuZXh0KSlcbiAgICAgICAgOiBudWxsXG4gICAgICBjb25zdCBleHByZXNzaW9uID0gZm91bmRcbiAgICAgICAgPyBwYXJzZWREYXRhUGF0aC5zbGljZSgwLCByZWxhdGlvbiA/IG5leHQgOiBpbmRleCkuam9pbignLicpICtcbiAgICAgICAgICAocHJvcGVydHkgPyBgKCMke25hbWV9KWAgOiAnJylcbiAgICAgICAgOiBudWxsXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIGRhdGFQYXRoLFxuICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgaW5kZXhcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3RUb2tlbiwgLi4ub3RoZXJUb2tlbnNdID0gcGFyc2VkRGF0YVBhdGhcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZGVmaW5pdGlvbi5wcm9wZXJ0aWVzW2ZpcnN0VG9rZW5dXG4gICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gZ2V0UmVzdWx0KHByb3BlcnR5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVsYXRpb24gPSB0aGlzLmdldFJlbGF0aW9ucygpW2ZpcnN0VG9rZW5dXG4gICAgICBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgbGV0IHsgcmVsYXRlZE1vZGVsQ2xhc3MgfSA9IHJlbGF0aW9uXG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2Ygb3RoZXJUb2tlbnMpIHtcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSByZWxhdGVkTW9kZWxDbGFzcy5kZWZpbml0aW9uLnByb3BlcnRpZXNbdG9rZW5dXG4gICAgICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0UmVzdWx0KHByb3BlcnR5KVxuICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICcqJykge1xuICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzT25lVG9PbmUoKSkge1xuICAgICAgICAgICAgICAvLyBEbyBub3Qgc3VwcG9ydCB3aWxkY2FyZHMgb24gb25lLXRvLW9uZSByZWxhdGlvbnM6XG4gICAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHQoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm91bmQgYSByZWxhdGlvbj8gS2VlcCBpdGVyYXRpbmcuXG4gICAgICAgICAgICByZWxhdGlvbiA9IHJlbGF0ZWRNb2RlbENsYXNzLmdldFJlbGF0aW9ucygpW3Rva2VuXVxuICAgICAgICAgICAgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgIHJlbGF0ZWRNb2RlbENsYXNzID0gcmVsYXRpb24ucmVsYXRlZE1vZGVsQ2xhc3NcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgICAvLyBTdGlsbCBoZXJlPyBGb3VuZCBhIHJlbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEtcGF0aC5cbiAgICAgICAgICByZXR1cm4gZ2V0UmVzdWx0KG51bGwsIHJlbGF0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRSZXN1bHQoKVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gIHN0YXRpYyByZWxhdGVkUXVlcnkocmVsYXRpb25OYW1lLCB0cngpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vVmluY2l0L29iamVjdGlvbi5qcy9pc3N1ZXMvMTcyMFxuICAgIHJldHVybiBzdXBlci5yZWxhdGVkUXVlcnkocmVsYXRpb25OYW1lLCB0cngpLmFsaWFzKHJlbGF0aW9uTmFtZSlcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgbW9kaWZpZXJOb3RGb3VuZChxdWVyeSwgbW9kaWZpZXIpIHtcbiAgICBpZiAoaXNTdHJpbmcobW9kaWZpZXIpKSB7XG4gICAgICBpZiAocXVlcnkubW9kZWxDbGFzcygpLmhhc1Njb3BlKG1vZGlmaWVyKSkge1xuICAgICAgICByZXR1cm4gcXVlcnkuYXBwbHlTY29wZShtb2RpZmllcilcbiAgICAgIH1cbiAgICAgIC8vIE5vdyBjaGVjayBwb3NzaWJsZSBzY29wZSBwcmVmaXhlcyBhbmQgaGFuZGxlIHRoZW06XG4gICAgICBzd2l0Y2ggKG1vZGlmaWVyWzBdKSB7XG4gICAgICBjYXNlICdeJzogLy8gRWFnZXItYXBwbGllZCBzY29wZTpcbiAgICAgICAgLy8gQWx3YXlzIGFwcGx5IGVhZ2VyLXNjb3BlcywgZXZlbiBpZiB0aGUgbW9kZWwgaXRzZWxmIGRvZXNuJ3Qga25vdyBpdC5cbiAgICAgICAgLy8gVGhlIHNjb3BlIG1heSBzdGlsbCBiZSBrbm93biBpbiBlYWdlci1sb2FkZWQgcmVsYXRpb25zLlxuICAgICAgICAvLyBOb3RlOiBgYXBwbHlTY29wZSgpYCB3aWxsIGhhbmRsZSB0aGUgJ14nIHNpZ24uXG4gICAgICAgIHJldHVybiBxdWVyeS5hcHBseVNjb3BlKG1vZGlmaWVyKVxuICAgICAgY2FzZSAnLSc6IC8vIElnbm9yZSBzY29wZTpcbiAgICAgICAgcmV0dXJuIHF1ZXJ5Lmlnbm9yZVNjb3BlKG1vZGlmaWVyLnNsaWNlKDEpKVxuICAgICAgY2FzZSAnIyc6IC8vIFNlbGVjdCBjb2x1bW46XG4gICAgICAgIHJldHVybiBxdWVyeS5zZWxlY3QobW9kaWZpZXIuc2xpY2UoMSkpXG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLm1vZGlmaWVyTm90Rm91bmQocXVlcnksIG1vZGlmaWVyKVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gIHN0YXRpYyBjcmVhdGVOb3RGb3VuZEVycm9yKGN0eCwgZXJyb3IpIHtcbiAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICBlcnJvciB8fCAoXG4gICAgICAgIGN0eC5ieUlkXG4gICAgICAgICAgPyBgJyR7dGhpcy5uYW1lfScgbW9kZWwgd2l0aCBpZCAke2N0eC5ieUlkfSBub3QgZm91bmRgXG4gICAgICAgICAgOiBgJyR7dGhpcy5uYW1lfScgbW9kZWwgbm90IGZvdW5kYFxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgY3JlYXRlVmFsaWRhdG9yKCkge1xuICAgIC8vIFVzZSBhIHNoYXJlZCB2YWxpZGF0b3IgcGVyIGFwcCwgc28gbW9kZWwgc2NoZW1hIGNhbiByZWZlcmVuY2UgZWFjaCBvdGhlci5cbiAgICAvLyBOT1RFOiBUaGUgRGl0byBWYWxpZGF0b3IgY2xhc3MgY3JlYXRlcyBhbmQgbWFuYWdlcyB0aGlzIHNoYXJlZCBPYmplY3Rpb25cbiAgICAvLyBWYWxpZGF0b3IgaW5zdGFuY2UgZm9yIHVzLCB3ZSBqdXN0IG5lZWQgdG8gcmV0dXJuIGl0IGhlcmU6XG4gICAgcmV0dXJuIHRoaXMuYXBwLnZhbGlkYXRvclxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gIHN0YXRpYyBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMsIG9wdGlvbnMsIGpzb24gfSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ01vZGVsVmFsaWRhdGlvbic6XG4gICAgICByZXR1cm4gdGhpcy5hcHAuY3JlYXRlVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fFxuICAgICAgICAgIGBUaGUgcHJvdmlkZWQgZGF0YSBmb3IgdGhlICR7dGhpcy5uYW1lfSBtb2RlbCBpcyBub3QgdmFsaWQ6ICR7SlNPTi5zdHJpbmdpZnkoanNvbil9YCxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9KVxuICAgIGNhc2UgJ1JlbGF0aW9uRXhwcmVzc2lvbic6XG4gICAgY2FzZSAnVW5hbGxvd2VkUmVsYXRpb24nOlxuICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkVycm9yKHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzIH0pXG4gICAgY2FzZSAnSW52YWxpZEdyYXBoJzpcbiAgICAgIHJldHVybiBuZXcgR3JhcGhFcnJvcih7IHR5cGUsIG1lc3NhZ2UsIGVycm9ycyB9KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMgfSlcbiAgICB9XG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIFF1ZXJ5QnVpbGRlciA9IFF1ZXJ5QnVpbGRlclxuXG4gIC8vIGh0dHBzOi8vdmluY2l0LmdpdGh1Yi5pby9vYmplY3Rpb24uanMvYXBpL21vZGVsL3N0YXRpYy1wcm9wZXJ0aWVzLmh0bWwjc3RhdGljLWNsb25lb2JqZWN0YXR0cmlidXRlc1xuICBzdGF0aWMgY2xvbmVPYmplY3RBdHRyaWJ1dGVzID0gZmFsc2VcblxuICAvLyBPbmx5IHBpY2sgcHJvcGVydGllcyBmb3IgZGF0YWJhc2UgSlNPTiB0aGF0IGlzIG1lbnRpb25lZCBpbiB0aGUgc2NoZW1hLlxuICBzdGF0aWMgcGlja0pzb25TY2hlbWFQcm9wZXJ0aWVzID0gdHJ1ZVxuXG4gIC8vIFNlZSBodHRwczovL2dpdHRlci5pbS9WaW5jaXQvb2JqZWN0aW9uLmpzP2F0PTVhODFmODU5Y2U2OGMzYmM3NDc5ZDY1YVxuICBzdGF0aWMgdXNlTGltaXRJbkZpcnN0ID0gdHJ1ZVxuXG4gIHN0YXRpYyBnZXQgZGVmaW5pdGlvbigpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uIG9iamVjdCBmb3IgdGhpcyBjbGFzcyBhbmQgcmV0dXJuIGl0XG4gICAgcmV0dXJuIGdldE1ldGEodGhpcywgJ2RlZmluaXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0ge31cblxuICAgICAgY29uc3Qgc2V0RGVmaW5pdGlvbiA9IChuYW1lLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVmaW5pdGlvbiwgbmFtZSwge1xuICAgICAgICAgIC4uLnByb3BlcnR5LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2V0RGVmaW5pdGlvbiA9IG5hbWUgPT4ge1xuICAgICAgICBsZXQgbW9kZWxDbGFzcyA9IHRoaXNcbiAgICAgICAgLy8gQ29sbGVjdCBhbmNlc3RvciB2YWx1ZXMgZm9yIHByb3BlciBpbmhlcml0YW5jZS5cbiAgICAgICAgLy8gTk9URTogdmFsdWVzIGFyZSBjb2xsZWN0ZWQgaW4gc2VxdWVuY2Ugb2YgaW5oZXJpdGFuY2UsIGZyb20gc3ViLWNsYXNzXG4gICAgICAgIC8vIHRvIHN1cGVyLWNsYXNzLiBUbyBnbyBmcm9tIHN1cGVyLWNsYXNzIHRvIHN1Yi1jbGFzcyB3aGVuIG1lcmdpbmcsXG4gICAgICAgIC8vIGBtZXJnZVJldmVyc2VkKClgIGlzIHVzZWQgdG8gcHJldmVudCB3cm9uZyBvdmVycmlkZXMuXG4gICAgICAgIC8vIGBtZXJnZUFzUmV2ZXJzZWRBcnJheXMoKWAgY2FuIGJlIHVzZWQgdG8ga2VlcCBhcnJheXMgb2YgaW5oZXJpdGVkXG4gICAgICAgIC8vIHZhbHVlcyBwZXIga2V5LCBzZWUgYGRlZmluaXRpb25zLmhvb2tzYC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW11cbiAgICAgICAgd2hpbGUgKG1vZGVsQ2xhc3MgIT09IG9iamVjdGlvbi5Nb2RlbCkge1xuICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgbW9kZWwgY2xhc3NlcyB0aGF0IGFjdHVhbGx5IGRlZmluZSBgbmFtZWAgcHJvcGVydHkuXG4gICAgICAgICAgaWYgKG5hbWUgaW4gbW9kZWxDbGFzcykge1xuICAgICAgICAgICAgLy8gVXNlIHJlZmxlY3Rpb24gdGhyb3VnaCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKSB0byBiZSBhYmxlIHRvXG4gICAgICAgICAgICAvLyBjYWxsIHRoZSBnZXR0ZXIgb24gYHRoaXNgIHJhdGhlciB0aGFuIG9uIGBtb2RlbENsYXNzYC4gVGhpcyBjYW5cbiAgICAgICAgICAgIC8vIGJlIHVzZWQgdG8gcHJvdmlkZSBhYnN0cmFjdCBiYXNlLWNsYXNzZXMgYW5kIGhhdmUgdGhlbSBjcmVhdGVcbiAgICAgICAgICAgIC8vIHRoZWlyIHJlbGF0aW9ucyBmb3IgYHRoaXNgIGluc2lkZSBgZ2V0IHJlbGF0aW9ucygpYCBhY2Nlc3NvcnMuXG4gICAgICAgICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtb2RlbENsYXNzLCBuYW1lKVxuICAgICAgICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZXNjLmdldD8uY2FsbCh0aGlzKSB8fCBkZXNjLnZhbHVlXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vZGVsQ2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWxDbGFzcylcbiAgICAgICAgfVxuICAgICAgICAvLyBUbyBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uIHdpdGggaW50ZXJkZXBlbmRlbnQgY2FsbHMgcmVsYXRlZCB0b1xuICAgICAgICAvLyBwcm9wZXJ0aWVzLCBvdmVycmlkZSBkZWZpbml0aW9uIGJlZm9yZSBjYWxsaW5nIGhhbmRsZXIoKTpcbiAgICAgICAgc2V0RGVmaW5pdGlvbihuYW1lLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB7fVxuICAgICAgICB9KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IGRlZmluaXRpb25zW25hbWVdLmNhbGwodGhpcywgdmFsdWVzKVxuICAgICAgICAgIC8vIE9uY2UgY2FsY3VsYXRlZCwgb3ZlcnJpZGUgZ2V0dGVyIHdpdGggZmluYWwgbWVyZ2VkIHZhbHVlLlxuICAgICAgICAgIHNldERlZmluaXRpb24obmFtZSwge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXJnZWRcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiBtZXJnZWRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxFcnJvcih0aGlzLCBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGRlZmluaXRpb24gb2JqZWN0IHdhcyBkZWZpbmVkIHlldCwgY3JlYXRlIG9uZSB3aXRoIGFjY2Vzc29ycyBmb3JcbiAgICAgIC8vIGVhY2ggZW50cnkgaW4gYGRlZmluaXRpb25zYC4gRWFjaCBvZiB0aGVzZSBnZXR0ZXJzIHdoZW4gY2FsbGVkIG1lcmdlXG4gICAgICAvLyBkZWZpbml0aW9ucyB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gYW5kIHN0b3JlIHRoZSBtZXJnZWQgcmVzdWx0IGluXG4gICAgICAvLyBgbW9kZWxDbGFzcy5kZWZpbml0aW9uW25hbWVdYCBmb3IgZnVydGhlciBjYWNoaW5nLlxuICAgICAgZm9yIChjb25zdCBuYW1lIGluIGRlZmluaXRpb25zKSB7XG4gICAgICAgIHNldERlZmluaXRpb24obmFtZSwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IGdldERlZmluaXRpb24obmFtZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbml0aW9uXG4gICAgfSlcbiAgfVxuXG4gIC8vIEhvb2tzXG5cbiAgJGVtaXQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5lbWl0KGV2ZW50LCB0aGlzLCAuLi5hcmdzKVxuICB9XG5cbiAgc3RhdGljIGJlZm9yZUZpbmQoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOmZpbmQnLCBhcmdzKVxuICB9XG5cbiAgc3RhdGljIGFmdGVyRmluZChhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VtaXRTdGF0aWNIb29rKCdhZnRlcjpmaW5kJywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBiZWZvcmVJbnNlcnQoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOmluc2VydCcsIGFyZ3MpXG4gIH1cblxuICBzdGF0aWMgYWZ0ZXJJbnNlcnQoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYWZ0ZXI6aW5zZXJ0JywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBiZWZvcmVVcGRhdGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOnVwZGF0ZScsIGFyZ3MpXG4gIH1cblxuICBzdGF0aWMgYWZ0ZXJVcGRhdGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYWZ0ZXI6dXBkYXRlJywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBiZWZvcmVEZWxldGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOmRlbGV0ZScsIGFyZ3MpXG4gIH1cblxuICBzdGF0aWMgYWZ0ZXJEZWxldGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYWZ0ZXI6ZGVsZXRlJywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfZW1pdFN0YXRpY0hvb2soZXZlbnQsIG9yaWdpbmFsQXJncykge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzKGV2ZW50KVxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU3RhdGljIGhvb2tzIGFyZSBlbWl0dGVkIGluIHNlcXVlbmNlIChidXQgZWFjaCBldmVudCBjYW4gYmUgYXN5bmMpLCBhbmRcbiAgICAgIC8vIHJlc3VsdHMgYXJlIHBhc3NlZCB0aHJvdWdoIGFuZCByZXR1cm5lZCBpbiB0aGUgZW5kLlxuICAgICAgbGV0IHsgcmVzdWx0IH0gPSBvcmlnaW5hbEFyZ3NcbiAgICAgIC8vIFRoZSByZXN1bHQgb2YgYW55IGV2ZW50IGhhbmRsZXIgd2lsbCBvdmVycmlkZSBgYXJncy5yZXN1bHRgIGluIHRoZSBjYWxsXG4gICAgICAvLyBvZiB0aGUgbmV4dCBoYW5kbGVyIGluIHNlcXVlbmNlLiBBcyBgU3RhdGljSG9va0FyZ3VtZW50c2AgaW4gT2JqZWN0aW9uXG4gICAgICAvLyBpcyBwcml2YXRlLCB1c2UgYSBKUyBpbmhlcml0YW5jZSB0cmljayBoZXJlIHRvIG92ZXJyaWRlIGBhcmdzLnJlc3VsdGA6XG4gICAgICBjb25zdCBhcmdzID0gT2JqZWN0LmNyZWF0ZShvcmlnaW5hbEFyZ3MsIHtcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIHZhbHVlOiBldmVudFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbGlzdGVuZXIuY2FsbCh0aGlzLCBhcmdzKVxuICAgICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVW5mb3J0dW5hdGVseSBgcmVzdWx0YCBpcyBhbHdheXMgYW4gYXJyYXksIGV2ZW4gd2hlbiB0aGUgYWN0dWFsIHJlc3VsdFxuICAgICAgLy8gaXMgYSBtb2RlbCBvYmplY3QuIEF2b2lkIHJldHVybmluZyBpdCB3aGVuIGl0J3Mgbm90IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9WaW5jaXQvb2JqZWN0aW9uLmpzL2lzc3Vlcy8xODQyXG4gICAgICBpZiAocmVzdWx0ICE9PSBvcmlnaW5hbEFyZ3MucmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBzdGF0aWMgX3NldHVwQXNzZXRzRXZlbnRzKGFzc2V0cykge1xuICAgIGNvbnN0IGFzc2V0RGF0YVBhdGhzID0gT2JqZWN0LmtleXMoYXNzZXRzKVxuXG4gICAgdGhpcy5vbihbXG4gICAgICAnYmVmb3JlOmluc2VydCcsXG4gICAgICAnYmVmb3JlOnVwZGF0ZScsXG4gICAgICAnYmVmb3JlOmRlbGV0ZSdcbiAgICBdLCBhc3luYyAoeyB0eXBlLCB0cmFuc2FjdGlvbiwgaW5wdXRJdGVtcywgYXNGaW5kUXVlcnkgfSkgPT4ge1xuICAgICAgY29uc3QgYWZ0ZXJJdGVtcyA9IHR5cGUgPT09ICdiZWZvcmU6ZGVsZXRlJ1xuICAgICAgICA/IFtdXG4gICAgICAgIDogaW5wdXRJdGVtc1xuICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBhc3NldCBkYXRhIHBhdGhzIHdoZXJlIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlXG4gICAgICAvLyBzdWJtaXR0ZWQgZGF0YSwgYW5kIG9ubHkgY29tcGFyZSB0aGVzZS4gQnV0IHdoZW4gZGVsZXRpbmcsIHVzZSBhbGwuXG4gICAgICBjb25zdCBkYXRhUGF0aHMgPSBhZnRlckl0ZW1zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhc3NldERhdGFQYXRocy5maWx0ZXIoXG4gICAgICAgICAgcGF0aCA9PiBnZXRWYWx1ZUF0QXNzZXREYXRhUGF0aChhZnRlckl0ZW1zWzBdLCBwYXRoKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgOiBhc3NldERhdGFQYXRoc1xuXG4gICAgICAvLyBgZGF0YVBhdGhzYCB3aWxsIGJlIGVtcHR5IGluIHRoZSBjYXNlIG9mIGFuIHVwZGF0ZS9pbnNlcnQgdGhhdCBkbyBub3RcbiAgICAgIC8vIGFmZmVjdCB0aGUgYXNzZXRzLlxuICAgICAgaWYgKGRhdGFQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgdGhlIG1vZGVsJ3MgYXNzZXQgZmlsZXMgaW4gdGhlaXIgY3VycmVudCBzdGF0ZSBiZWZvcmUgdGhlIHF1ZXJ5IGlzXG4gICAgICAvLyBleGVjdXRlZC5cbiAgICAgIGNvbnN0IGJlZm9yZUl0ZW1zID0gdHlwZSA9PT0gJ2JlZm9yZTppbnNlcnQnXG4gICAgICAgID8gW11cbiAgICAgICAgOiBhd2FpdCBsb2FkQXNzZXREYXRhUGF0aHMoYXNGaW5kUXVlcnkoKSwgZGF0YVBhdGhzKVxuICAgICAgY29uc3QgYmVmb3JlRmlsZXNQZXJEYXRhUGF0aCA9IGdldEZpbGVzUGVyQXNzZXREYXRhUGF0aChcbiAgICAgICAgYmVmb3JlSXRlbXMsXG4gICAgICAgIGRhdGFQYXRoc1xuICAgICAgKVxuICAgICAgY29uc3QgYWZ0ZXJGaWxlc1BlckRhdGFQYXRoID0gZ2V0RmlsZXNQZXJBc3NldERhdGFQYXRoKFxuICAgICAgICBhZnRlckl0ZW1zLFxuICAgICAgICBkYXRhUGF0aHNcbiAgICAgIClcblxuICAgICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cblxuICAgICAgaWYgKHRyYW5zYWN0aW9uLnJvbGxiYWNrKSB7XG4gICAgICAgIC8vIFByZXZlbnQgd3JvbmcgbWVtb3J5IGxlYWsgZXJyb3IgbWVzc2FnZXMgd2hlbiBpbnN0YWxsaW5nIG1vcmUgdGhhbiAxMFxuICAgICAgICAvLyAncm9sbGJhY2snIGhhbmRsZXJzLCB3aGljaCBjYW4gaGFwcGVuIHdpdGggbW9yZSBjb21wbGV4IHF1ZXJpZXMuXG4gICAgICAgIHRyYW5zYWN0aW9uLnNldE1heExpc3RlbmVycygwKVxuICAgICAgICB0cmFuc2FjdGlvbi5vbigncm9sbGJhY2snLCBhc3luYyBlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKGltcG9ydGVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICBgUmVjZWl2ZWQgJyR7ZXJyb3J9JywgcmVtb3ZpbmcgaW1wb3J0ZWQgZmlsZXMgYWdhaW46ICR7XG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRGaWxlcy5tYXAoZmlsZSA9PiBgJyR7ZmlsZS5uYW1lfSdgKVxuICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGltcG9ydGVkRmlsZXMubWFwKFxuICAgICAgICAgICAgICAgIGZpbGUgPT4gZmlsZS5zdG9yYWdlLnJlbW92ZUZpbGUoZmlsZSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobW9kaWZpZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBgbW9kaWZpZWRGaWxlc2Agc2hvdWxkIGJlIHJlc3RvcmVkIGFzIHdlbGwsIGJ1dCB0aGF0J3MgZmFyXG4gICAgICAgICAgICAvLyBmcm9tIHRyaXZpYWwgc2luY2Ugbm8gYmFja3VwIGlzIGtlcHQgaW4gYGhhbmRsZU1vZGlmaWVkQXNzZXRzYFxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIHJlc3RvcmUgdGhlc2UgYWxyZWFkeSBtb2RpZmllZCBmaWxlczogJHtcbiAgICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLm1hcChmaWxlID0+IGAnJHtmaWxlLm5hbWV9J2ApXG4gICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRhdGFQYXRoIG9mIGRhdGFQYXRocykge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hcHAuZ2V0U3RvcmFnZShhc3NldHNbZGF0YVBhdGhdLnN0b3JhZ2UpXG4gICAgICAgIGNvbnN0IGJlZm9yZUZpbGVzID0gYmVmb3JlRmlsZXNQZXJEYXRhUGF0aFtkYXRhUGF0aF0gfHwgW11cbiAgICAgICAgY29uc3QgYWZ0ZXJGaWxlcyA9IGFmdGVyRmlsZXNQZXJEYXRhUGF0aFtkYXRhUGF0aF0gfHwgW11cbiAgICAgICAgY29uc3QgYmVmb3JlQnlLZXkgPSBtYXBGaWxlc0J5S2V5KGJlZm9yZUZpbGVzKVxuICAgICAgICBjb25zdCBhZnRlckJ5S2V5ID0gbWFwRmlsZXNCeUtleShhZnRlckZpbGVzKVxuICAgICAgICBjb25zdCByZW1vdmVkRmlsZXMgPSBiZWZvcmVGaWxlcy5maWx0ZXIoZmlsZSA9PiAhYWZ0ZXJCeUtleVtmaWxlLmtleV0pXG4gICAgICAgIGNvbnN0IGFkZGVkRmlsZXMgPSBhZnRlckZpbGVzLmZpbHRlcihmaWxlID0+ICFiZWZvcmVCeUtleVtmaWxlLmtleV0pXG4gICAgICAgIC8vIEFsc28gaGFuZGxlIG1vZGlmaWVkIGZpbGVzLCB3aGljaCBhcmUgZmlsZXMgd2hlcmUgdGhlIGRhdGEgcHJvcGVydHlcbiAgICAgICAgLy8gaXMgY2hhbmdlZCBiZWZvcmUgdXBkYXRlIC8gcGF0Y2gsIG1lYW50aW5nIHRoZSBmaWxlIGlzIGNoYW5nZWQuXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGNvbnRlbnQgZm9yIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBpdCxcbiAgICAgICAgLy8gYW5kIHRodXMgc2hvdWxkIG9ubHkgcmVhbGx5IGJlIHVzZWQgd2hlbiB0aGVyZSdzIG9ubHkgb25lIHJlZmVyZW5jZS5cbiAgICAgICAgY29uc3QgbW9kaWZpZWRGaWxlcyA9IGFmdGVyRmlsZXMuZmlsdGVyKFxuICAgICAgICAgIGZpbGUgPT4gZmlsZS5kYXRhICYmIGJlZm9yZUJ5S2V5W2ZpbGUua2V5XVxuICAgICAgICApXG4gICAgICAgIGltcG9ydGVkRmlsZXMucHVzaChcbiAgICAgICAgICAuLi5hd2FpdCB0aGlzLmFwcC5oYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgIGFkZGVkRmlsZXMsXG4gICAgICAgICAgICByZW1vdmVkRmlsZXMsXG4gICAgICAgICAgICB0cmFuc2FjdGlvblxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goXG4gICAgICAgICAgLi4uYXdhaXQgdGhpcy5hcHAuaGFuZGxlTW9kaWZpZWRBc3NldHMoXG4gICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgbW9kaWZpZWRGaWxlcyxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5FdmVudEVtaXR0ZXIubWl4aW4oTW9kZWwpXG5LbmV4SGVscGVyLm1peGluKE1vZGVsKVxuLy8gRXhwb3NlIGEgc2VsZWN0aW9uIG9mIFF1ZXJ5QnVpbGRlciBtZXRob2RzIGFzIHN0YXRpYyBtZXRob2RzIG9uIG1vZGVsIGNsYXNzZXNcblF1ZXJ5QnVpbGRlci5taXhpbihNb2RlbClcblxuY29uc3QgbWV0YU1hcCA9IG5ldyBXZWFrTWFwKClcblxuZnVuY3Rpb24gZ2V0TWV0YShtb2RlbENsYXNzLCBrZXksIHZhbHVlKSB7XG4gIGxldCBtZXRhID0gbWV0YU1hcC5nZXQobW9kZWxDbGFzcylcbiAgaWYgKCFtZXRhKSB7XG4gICAgbWV0YU1hcC5zZXQobW9kZWxDbGFzcywgbWV0YSA9IHt9KVxuICB9XG4gIGlmICghKGtleSBpbiBtZXRhKSkge1xuICAgIG1ldGFba2V5XSA9IGlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlXG4gIH1cbiAgcmV0dXJuIG1ldGFba2V5XVxufVxuXG5mdW5jdGlvbiBsb2FkQXNzZXREYXRhUGF0aHMocXVlcnksIGRhdGFQYXRocykge1xuICByZXR1cm4gZGF0YVBhdGhzLnJlZHVjZShcbiAgICAocXVlcnksIGRhdGFQYXRoKSA9PiBxdWVyeS5sb2FkRGF0YVBhdGgoZGF0YVBhdGgpLFxuICAgIHF1ZXJ5XG4gIClcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVBdEFzc2V0RGF0YVBhdGgoaXRlbSwgcGF0aCkge1xuICByZXR1cm4gZ2V0VmFsdWVBdERhdGFQYXRoKGl0ZW0sIHBhdGgsICgpID0+IHVuZGVmaW5lZClcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZXNQZXJBc3NldERhdGFQYXRoKGl0ZW1zLCBkYXRhUGF0aHMpIHtcbiAgcmV0dXJuIGRhdGFQYXRocy5yZWR1Y2UoXG4gICAgKGFsbEZpbGVzLCBkYXRhUGF0aCkgPT4ge1xuICAgICAgYWxsRmlsZXNbZGF0YVBhdGhdID0gYXNBcnJheShpdGVtcykucmVkdWNlKFxuICAgICAgICAoZmlsZXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXNBcnJheShnZXRWYWx1ZUF0QXNzZXREYXRhUGF0aChpdGVtLCBkYXRhUGF0aCkpXG4gICAgICAgICAgLy8gVXNlIGZsYXR0ZW4oKSBhcyBkYXRhUGF0aCBtYXkgY29udGFpbiB3aWxkY2FyZHMsIHJlc3VsdGluZyBpblxuICAgICAgICAgIC8vIG5lc3RlZCBmaWxlcyBhcnJheXMuXG4gICAgICAgICAgZmlsZXMucHVzaCguLi5mbGF0dGVuKGRhdGEpLmZpbHRlcihmaWxlID0+ICEhZmlsZSkpXG4gICAgICAgICAgcmV0dXJuIGZpbGVzXG4gICAgICAgIH0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgICByZXR1cm4gYWxsRmlsZXNcbiAgICB9LFxuICAgIHt9XG4gIClcbn1cblxuZnVuY3Rpb24gbWFwRmlsZXNCeUtleShmaWxlcykge1xuICByZXR1cm4gZmlsZXMucmVkdWNlKFxuICAgIChtYXAsIGZpbGUpID0+IHtcbiAgICAgIG1hcFtmaWxlLmtleV0gPSBmaWxlXG4gICAgICByZXR1cm4gbWFwXG4gICAgfSxcbiAgICB7fVxuICApXG59XG4iXX0=
953
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbHMvTW9kZWwuanMiXSwibmFtZXMiOlsiTW9kZWwiLCJvYmplY3Rpb24iLCJjb25zdHJ1Y3RvciIsImpzb24iLCIkc2V0SnNvbiIsInNldHVwIiwia25leCIsInJlbGF0aW9uIiwiT2JqZWN0IiwidmFsdWVzIiwiZ2V0UmVsYXRpb25zIiwic2V0dXBSZWxhdGlvbiIsImVycm9yIiwiUmVsYXRpb25FcnJvciIsInJlZmVyZW5jZVZhbGlkYXRvciIsInJlbGF0ZWRNb2RlbENsYXNzIiwiZ2V0UmVsYXRlZFJlbGF0aW9ucyIsInB1c2giLCJhY2Nlc3NvciIsIm5hbWUiLCJwcm90b3R5cGUiLCJkZWZpbmVBY2Nlc3NvciIsInRhcmdldCIsImlzQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsInZhbHVlIiwiUmVsYXRpb25BY2Nlc3NvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJpbml0aWFsaXplIiwiaG9va3MiLCJhc3NldHMiLCJkZWZpbml0aW9uIiwiX3NldHVwRW1pdHRlciIsIl9zZXR1cEFzc2V0c0V2ZW50cyIsIiRpbml0aWFsaXplIiwiJGFwcCIsImFwcCIsIiRpcyIsIm1vZGVsIiwiaWQiLCIkaGFzIiwicHJvcGVydGllcyIsInByb3BlcnR5IiwiJHVwZGF0ZSIsInRyeCIsIiRxdWVyeSIsInVwZGF0ZSIsInJ1bkFmdGVyIiwicmVzdWx0IiwicXVlcnkiLCJoYXMiLCIkc2V0IiwiJHBhdGNoIiwicGF0Y2giLCIkdHJhbnNhY3Rpb24iLCJoYW5kbGVyIiwidHJhbnNhY3Rpb24iLCIkdmFsaWRhdGUiLCJvcHRpb25zIiwic2tpcFZhbGlkYXRpb24iLCJncmFwaCIsImFzeW5jIiwiaW5wdXRKc29uIiwic2hhbGxvdyIsIiRpc09iamVjdGlvbk1vZGVsIiwiY2xvbmUiLCJtdXRhYmxlIiwidmFsaWRhdG9yIiwiZ2V0VmFsaWRhdG9yIiwiYXJncyIsImN0eCIsImNyZWF0ZSIsImJlZm9yZVZhbGlkYXRlIiwidmFsaWRhdGUiLCJoYW5kbGVSZXN1bHQiLCJhZnRlclZhbGlkYXRlIiwidGhlbiIsIiR2YWxpZGF0ZUdyYXBoIiwiZnJvbUpzb24iLCJvbkVycm9yIiwiZXJyIiwiUmVzcG9uc2VFcnJvciIsIkRCRXJyb3IiLCJjcmVhdGVEYXRhYmFzZUVycm9yIiwiV3JhcHBlZEVycm9yIiwiUHJvbWlzZSIsInJlamVjdCIsImNvdW50IiwiZmlyc3QiLCJ0YWJsZU5hbWUiLCJtYXRjaCIsImlkQ29sdW1uIiwiaWRzIiwiZW50cmllcyIsInByaW1hcnkiLCJsZW5ndGgiLCJnZXRSZWZlcmVuY2UiLCJtb2RlbE9ySWQiLCJpbmNsdWRlUHJvcGVydGllcyIsInJlZiIsImlkUHJvcGVydGllcyIsImdldElkUHJvcGVydHlBcnJheSIsImFkZFByb3BlcnR5Iiwia2V5IiwidW5kZWZpbmVkIiwidWlkUmVmUHJvcCIsImZvckVhY2giLCJNb2RlbEVycm9yIiwiaW5kZXgiLCJpc1JlZmVyZW5jZSIsIm9iaiIsImNvbXBpbGVWYWxpZGF0b3IiLCJvbmVPZiIsInR5cGUiLCJyZWR1Y2UiLCJpZFByb3BlcnR5IiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJ0aHJvdyIsImdldFNjb3BlIiwic2NvcGVzIiwiaGFzU2NvcGUiLCJnZXRNb2RpZmllcnMiLCJtb2RpZmllcnMiLCJyZWxhdGlvbk1hcHBpbmdzIiwiX2dldENhY2hlZCIsInJlbGF0aW9ucyIsIm1vZGVscyIsImpzb25TY2hlbWEiLCJzY2hlbWEiLCIkaWQiLCIkc2NoZW1hIiwidmlydHVhbEF0dHJpYnV0ZXMiLCJjb21wdXRlZEF0dHJpYnV0ZXMiLCJqc29uQXR0cmlidXRlcyIsImdldEF0dHJpYnV0ZXMiLCJzcGVjaWZpY1R5cGUiLCJjb21wdXRlZCIsImJvb2xlYW5BdHRyaWJ1dGVzIiwiZGF0ZUF0dHJpYnV0ZXMiLCJpbmNsdWRlcyIsImhpZGRlbkF0dHJpYnV0ZXMiLCJoaWRkZW4iLCJmaWx0ZXIiLCJhdHRyaWJ1dGVzIiwiaWRlbnRpZmllciIsImNhbGN1bGF0ZSIsImVtcHR5IiwiY2FjaGUiLCJnZXRNZXRhIiwiZW50cnkiLCJwYXJ0Iiwic3BsaXQiLCJwcm9wZXJ0eU5hbWVUb0NvbHVtbk5hbWUiLCJwcm9wZXJ0eU5hbWUiLCJjb2x1bW5OYW1lVG9Qcm9wZXJ0eU5hbWUiLCJjb2x1bW5OYW1lIiwiY2FsbEluaXRpYWxpemUiLCIkZm9ybWF0RGF0YWJhc2VKc29uIiwiZGF0ZSIsInRvSVNPU3RyaW5nIiwiaXNTUUxpdGUiLCJib29sIiwiJHBhcnNlRGF0YWJhc2VKc29uIiwiJHBhcnNlSnNvbiIsIkRhdGUiLCJkYXRhUGF0aCIsInN0b3JhZ2UiLCJnZXRTdG9yYWdlIiwiZGF0YSIsImNvbnZlcnRUb0Fzc2V0RmlsZXMiLCJjb252ZXJ0QXNzZXRGaWxlIiwiJGZvcm1hdEpzb24iLCIkZmlsdGVyR3JhcGgiLCJtb2RlbEdyYXBoIiwiZXhwciIsIiRwb3B1bGF0ZUdyYXBoIiwiZmlsdGVyR3JhcGgiLCJwb3B1bGF0ZUdyYXBoIiwiZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aCIsInBhcnNlZERhdGFQYXRoIiwiZ2V0UmVzdWx0IiwiZm91bmQiLCJuZXh0Iiwic2xpY2UiLCJuZXN0ZWREYXRhUGF0aCIsImV4cHJlc3Npb24iLCJqb2luIiwiZmlyc3RUb2tlbiIsIm90aGVyVG9rZW5zIiwidG9rZW4iLCJpc09uZVRvT25lIiwicmVsYXRlZFF1ZXJ5IiwicmVsYXRpb25OYW1lIiwiYWxpYXMiLCJtb2RpZmllck5vdEZvdW5kIiwibW9kaWZpZXIiLCJtb2RlbENsYXNzIiwiYXBwbHlTY29wZSIsImlnbm9yZVNjb3BlIiwic2VsZWN0IiwiY3JlYXRlTm90Rm91bmRFcnJvciIsIk5vdEZvdW5kRXJyb3IiLCJieUlkIiwiY3JlYXRlVmFsaWRhdG9yIiwiY3JlYXRlVmFsaWRhdGlvbkVycm9yIiwibWVzc2FnZSIsImVycm9ycyIsIkdyYXBoRXJyb3IiLCJzZXREZWZpbml0aW9uIiwiZ2V0RGVmaW5pdGlvbiIsImRlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJjYWxsIiwiZ2V0UHJvdG90eXBlT2YiLCJtZXJnZWQiLCJkZWZpbml0aW9ucyIsIiRlbWl0IiwiZXZlbnQiLCJlbWl0IiwiYmVmb3JlRmluZCIsIl9lbWl0U3RhdGljSG9vayIsImFmdGVyRmluZCIsImJlZm9yZUluc2VydCIsImFmdGVySW5zZXJ0IiwiYmVmb3JlVXBkYXRlIiwiYWZ0ZXJVcGRhdGUiLCJiZWZvcmVEZWxldGUiLCJhZnRlckRlbGV0ZSIsIm9yaWdpbmFsQXJncyIsImxpc3RlbmVycyIsImxpc3RlbmVyIiwicmVzIiwiYXNzZXREYXRhUGF0aHMiLCJrZXlzIiwib24iLCJpbnB1dEl0ZW1zIiwiYXNGaW5kUXVlcnkiLCJhZnRlckl0ZW1zIiwiZGF0YVBhdGhzIiwicGF0aCIsImdldFZhbHVlQXRBc3NldERhdGFQYXRoIiwiYmVmb3JlSXRlbXMiLCJsb2FkQXNzZXREYXRhUGF0aHMiLCJiZWZvcmVGaWxlc1BlckRhdGFQYXRoIiwiZ2V0RmlsZXNQZXJBc3NldERhdGFQYXRoIiwiYWZ0ZXJGaWxlc1BlckRhdGFQYXRoIiwiaW1wb3J0ZWRGaWxlcyIsIm1vZGlmaWVkRmlsZXMiLCJyb2xsYmFjayIsInNldE1heExpc3RlbmVycyIsImNvbnNvbGUiLCJpbmZvIiwibWFwIiwiZmlsZSIsImFsbCIsInJlbW92ZUZpbGUiLCJiZWZvcmVGaWxlcyIsImFmdGVyRmlsZXMiLCJiZWZvcmVCeUtleSIsIm1hcEZpbGVzQnlLZXkiLCJhZnRlckJ5S2V5IiwicmVtb3ZlZEZpbGVzIiwiYWRkZWRGaWxlcyIsImhhbmRsZUFkZGRlZEFuZFJlbW92ZWRBc3NldHMiLCJoYW5kbGVNb2RpZmllZEFzc2V0cyIsIlF1ZXJ5QnVpbGRlciIsImNsb25lT2JqZWN0QXR0cmlidXRlcyIsInBpY2tKc29uU2NoZW1hUHJvcGVydGllcyIsInVzZUxpbWl0SW5GaXJzdCIsIkV2ZW50RW1pdHRlciIsIm1peGluIiwiS25leEhlbHBlciIsIm1ldGFNYXAiLCJXZWFrTWFwIiwibWV0YSIsInNldCIsImxvYWREYXRhUGF0aCIsIml0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QVNwQixhQUFULENBQXVCcUIsS0FBdkIsRUFBOEI7QUFDNUIsU0FBT0EsS0FBSyxDQUFDdEssTUFBTixDQUNMLENBQUMwSSxHQUFELEVBQU1DLElBQU4sS0FBZTtBQUNiRCxJQUFBQSxHQUFHLENBQUNDLElBQUksQ0FBQ3RKLEdBQU4sQ0FBSCxHQUFnQnNKLElBQWhCO0FBQ0EsV0FBT0QsR0FBUDtBQUNELEdBSkksRUFLTCxFQUxLLENBQVA7QUFPRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvYmplY3Rpb24gZnJvbSAnb2JqZWN0aW9uJ1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSAnQC9xdWVyeSdcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgS25leEhlbHBlciB9IGZyb20gJ0AvbGliJ1xuaW1wb3J0IHsgY29udmVydFNjaGVtYSwgYWRkUmVsYXRpb25TY2hlbWFzLCBjb252ZXJ0UmVsYXRpb25zIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBwb3B1bGF0ZUdyYXBoLCBmaWx0ZXJHcmFwaCB9IGZyb20gJ0AvZ3JhcGgnXG5pbXBvcnQgeyBmb3JtYXRKc29uIH0gZnJvbSAnQC91dGlscydcbmltcG9ydCB7XG4gIFJlc3BvbnNlRXJyb3IsXG4gIEdyYXBoRXJyb3IsIE1vZGVsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIFJlbGF0aW9uRXJyb3IsXG4gIFdyYXBwZWRFcnJvclxufSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCB7XG4gIGlzU3RyaW5nLCBpc09iamVjdCwgaXNBcnJheSwgaXNGdW5jdGlvbiwgaXNQcm9taXNlLCBhc0FycmF5LCBtZXJnZSwgZmxhdHRlbixcbiAgcGFyc2VEYXRhUGF0aCwgbm9ybWFsaXplRGF0YVBhdGgsIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFJlbGF0aW9uQWNjZXNzb3IgZnJvbSAnLi9SZWxhdGlvbkFjY2Vzc29yJ1xuaW1wb3J0IGRlZmluaXRpb25zIGZyb20gJy4vZGVmaW5pdGlvbnMnXG5cbmV4cG9ydCBjbGFzcyBNb2RlbCBleHRlbmRzIG9iamVjdGlvbi5Nb2RlbCB7XG4gIC8vIERlZmluZSBhIGRlZmF1bHQgY29uc3RydWN0b3IgdG8gYWxsb3cgbmV3IE1vZGVsKGpzb24pIGFzIGEgc2hvcnQtY3V0IHRvXG4gIC8vIGBNb2RlbC5mcm9tSnNvbihqc29uLCB7IHNraXBWYWxpZGF0aW9uOiB0cnVlIH0pYFxuICBjb25zdHJ1Y3Rvcihqc29uKSB7XG4gICAgc3VwZXIoKVxuICAgIGlmIChqc29uKSB7XG4gICAgICB0aGlzLiRzZXRKc29uKGpzb24pXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHNldHVwKGtuZXgpIHtcbiAgICB0aGlzLmtuZXgoa25leClcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuZ2V0UmVsYXRpb25zKCkpKSB7XG4gICAgICAgIHRoaXMuc2V0dXBSZWxhdGlvbihyZWxhdGlvbilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBSZWxhdGlvbkVycm9yID8gZXJyb3IgOiBuZXcgUmVsYXRpb25FcnJvcihlcnJvcilcbiAgICB9XG4gICAgdGhpcy5yZWZlcmVuY2VWYWxpZGF0b3IgPSBudWxsXG4gIH1cblxuICBzdGF0aWMgc2V0dXBSZWxhdGlvbihyZWxhdGlvbikge1xuICAgIC8vIEFkZCB0aGlzIHJlbGF0aW9uIHRvIHRoZSByZWxhdGVkIG1vZGVsJ3MgcmVsYXRlZFJlbGF0aW9ucywgc28gaXQgY2FuXG4gICAgLy8gcmVnaXN0ZXIgYWxsIHJlcXVpcmVkIGZvcmVpZ24ga2V5cyBpbiBpdHMgcHJvcGVydGllcy5cbiAgICByZWxhdGlvbi5yZWxhdGVkTW9kZWxDbGFzcy5nZXRSZWxhdGVkUmVsYXRpb25zKCkucHVzaChyZWxhdGlvbilcbiAgICAvLyBUT0RPOiBDaGVjayBgdGhyb3VnaGAgc2V0dGluZ3MgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdD9cblxuICAgIC8vIEV4cG9zZSBSZWxhdGlvbkFjY2Vzc29yIGluc3RhbmNlcyBmb3IgZWFjaCByZWxhdGlvbiB1bmRlciBzaG9ydC1jdXQgJG5hbWVcbiAgICAvLyBmb3IgYWNjZXNzIHRvIHJlbGF0aW9ucyBhbmQgaW1wbGljaXQgY2FsbHMgdG8gJHJlbGF0ZWRRdWVyeShuYW1lKS5cbiAgICBjb25zdCBhY2Nlc3NvciA9IGAkJHtyZWxhdGlvbi5uYW1lfWBcbiAgICBpZiAoYWNjZXNzb3IgaW4gdGhpcy5wcm90b3R5cGUpIHtcbiAgICAgIHRocm93IG5ldyBSZWxhdGlvbkVycm9yKFxuICAgICAgICBgTW9kZWwgJyR7dGhpcy5uYW1lfScgYWxyZWFkeSBkZWZpbmVzIGEgcHJvcGVydHkgd2l0aCBuYW1lIGAgK1xuICAgICAgICBgJyR7YWNjZXNzb3J9JyB0aGF0IGNsYXNoZXMgd2l0aCB0aGUgcmVsYXRpb24gYWNjZXNzb3IuYClcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgYW4gYWNjZXNzb3Igb24gdGhlIGNsYXNzIGFzIHdlbGwgYXMgb24gdGhlIHByb3RvdHlwZSB0aGF0IHdoZW5cbiAgICAvLyBmaXJzdCBjYWxsZWQgY3JlYXRlcyBhIFJlbGF0aW9uQWNjZXNzb3IgaW5zdGFuY2UgYW5kIHRoZW4gb3ZlcnJpZGVzIHRoZVxuICAgIC8vIGFjY2Vzc29yIHdpdGggb25lIHRoYXQgdGhlbiBqdXN0IHJldHVybnMgdGhlIHNhbWUgdmFsdWUgYWZ0ZXJ3YXJkcy5cbiAgICBjb25zdCBkZWZpbmVBY2Nlc3NvciA9ICh0YXJnZXQsIGlzQ2xhc3MpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGFjY2Vzc29yLCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBSZWxhdGlvbkFjY2Vzc29yKFxuICAgICAgICAgICAgcmVsYXRpb24sXG4gICAgICAgICAgICBpc0NsYXNzID8gdGhpcyA6IG51bGwsIC8vIG1vZGVsQ2xhc3NcbiAgICAgICAgICAgIGlzQ2xhc3MgPyBudWxsIDogdGhpcyAvLyBtb2RlbFxuICAgICAgICAgIClcbiAgICAgICAgICAvLyBPdmVycmlkZSBhY2Nlc3NvciB3aXRoIHZhbHVlIG9uIGZpcnN0IGNhbGwgZm9yIGNhY2hpbmcuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGFjY2Vzc29yLCB7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBkZWZpbmVBY2Nlc3Nvcih0aGlzLCB0cnVlKVxuICAgIGRlZmluZUFjY2Vzc29yKHRoaXMucHJvdG90eXBlLCBmYWxzZSlcbiAgfVxuXG4gIC8vIEBvdmVycmlkYWJsZVxuICBzdGF0aWMgaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCB7IGhvb2tzLCBhc3NldHMgfSA9IHRoaXMuZGVmaW5pdGlvblxuICAgIHRoaXMuX3NldHVwRW1pdHRlcihob29rcylcbiAgICBpZiAoYXNzZXRzKSB7XG4gICAgICB0aGlzLl9zZXR1cEFzc2V0c0V2ZW50cyhhc3NldHMpXG4gICAgfVxuICB9XG5cbiAgLy8gQG92ZXJyaWRhYmxlXG4gICRpbml0aWFsaXplKCkge1xuICB9XG5cbiAgZ2V0ICRhcHAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuYXBwXG4gIH1cblxuICAkaXMobW9kZWwpIHtcbiAgICByZXR1cm4gbW9kZWw/LmNvbnN0cnVjdG9yID09PSB0aGlzLmNvbnN0cnVjdG9yICYmIG1vZGVsPy5pZCA9PT0gdGhpcy5pZFxuICB9XG5cbiAgJGhhcyguLi5wcm9wZXJ0aWVzKSB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzKSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAkdXBkYXRlKHByb3BlcnRpZXMsIHRyeCkge1xuICAgIHJldHVybiB0aGlzLiRxdWVyeSh0cngpXG4gICAgICAudXBkYXRlKHByb3BlcnRpZXMpXG4gICAgICAucnVuQWZ0ZXIoKHJlc3VsdCwgcXVlcnkpID0+XG4gICAgICAgIC8vIE9ubHkgcGVyZm9ybSBgJHNldCgpYCBhbmQgcmV0dXJuIGB0aGlzYCBpZiB0aGUgcXVlcnkgd2Fzbid0IG1vZGlmaWVkXG4gICAgICAgIC8vIGluIGEgd2F5IHRoYXQgd291bGQgcmVtb3ZlIHRoZSBgdXBkYXRlKClgIGNvbW1hbmQsIGUuZy4gdG9GaW5kUXVlcnkoKVxuICAgICAgICBxdWVyeS5oYXMoJ3VwZGF0ZScpID8gdGhpcy4kc2V0KHJlc3VsdCkgOiByZXN1bHRcbiAgICAgIClcbiAgfVxuXG4gICRwYXRjaChwcm9wZXJ0aWVzLCB0cngpIHtcbiAgICByZXR1cm4gdGhpcy4kcXVlcnkodHJ4KVxuICAgICAgLnBhdGNoKHByb3BlcnRpZXMpXG4gICAgICAucnVuQWZ0ZXIoKHJlc3VsdCwgcXVlcnkpID0+XG4gICAgICAgIC8vIE9ubHkgcGVyZm9ybSBgJHNldCgpYCBhbmQgcmV0dXJuIGB0aGlzYCBpZiB0aGUgcXVlcnkgd2Fzbid0IG1vZGlmaWVkXG4gICAgICAgIC8vIGluIGEgd2F5IHRoYXQgd291bGQgcmVtb3ZlIHRoZSBgcGF0Y2goKWAgY29tbWFuZCwgZS5nLiB0b0ZpbmRRdWVyeSgpXG4gICAgICAgIHF1ZXJ5LmhhcygncGF0Y2gnKSA/IHRoaXMuJHNldChyZXN1bHQpIDogcmVzdWx0XG4gICAgICApXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgJHRyYW5zYWN0aW9uKHRyeCwgaGFuZGxlcikge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRyYW5zYWN0aW9uKHRyeCwgaGFuZGxlcilcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgdHJhbnNhY3Rpb24odHJ4LCBoYW5kbGVyKSB7XG4gICAgLy8gU3VwcG9ydCBib3RoIGB0cmFuc2FjdGlvbih0cngsIGhhbmRsZXIpYCAmIGB0cmFuc2FjdGlvbihoYW5kbGVyKWBcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXIgPSB0cnhcbiAgICAgIHRyeCA9IG51bGxcbiAgICB9XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIC8vIFVzZSBleGlzdGluZyB0cmFuc2FjdGlvbiwgb3IgY3JlYXRlIG5ldyBvbmUsIHRvIGV4ZWN1dGUgaGFuZGxlciB3aXRoOlxuICAgICAgcmV0dXJuIHRyeFxuICAgICAgICA/IGhhbmRsZXIodHJ4KVxuICAgICAgICA6IHRoaXMua25leCgpLnRyYW5zYWN0aW9uKGhhbmRsZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGFyZ3VtZW50cywgc2ltcGx5IGRlbGVnYXRlIHRvIG9iamVjdGlvbidzIHRyYW5zYWN0aW9uKClcbiAgICAgIHJldHVybiBzdXBlci50cmFuc2FjdGlvbigpXG4gICAgfVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gICR2YWxpZGF0ZShqc29uLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy5za2lwVmFsaWRhdGlvbikge1xuICAgICAgcmV0dXJuIGpzb25cbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmdyYXBoICYmICFvcHRpb25zLmFzeW5jKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gT2JqZWN0aW9uJ3MgJHZhbGlkYXRlKCkgaWYgd2UgZG9uJ3QgbmVlZCBhbnkgb2Ygb3VyXG4gICAgICAvLyBleHRlbnNpb25zIChhc3luYyBhbmQgZ3JhcGggZm9yIG5vdyk6XG4gICAgICByZXR1cm4gc3VwZXIuJHZhbGlkYXRlKGpzb24sIG9wdGlvbnMpXG4gICAgfVxuICAgIGpzb24gPSBqc29uIHx8IHRoaXNcbiAgICBjb25zdCBpbnB1dEpzb24gPSBqc29uXG4gICAgY29uc3Qgc2hhbGxvdyA9IGpzb24uJGlzT2JqZWN0aW9uTW9kZWwgJiYgIW9wdGlvbnMuZ3JhcGhcbiAgICBpZiAoc2hhbGxvdykge1xuICAgICAgLy8gU3RyaXAgYXdheSByZWxhdGlvbnMgYW5kIG90aGVyIGludGVybmFsIHN0dWZmLlxuICAgICAganNvbiA9IGpzb24uY2xvbmUoeyBzaGFsbG93OiB0cnVlIH0pXG4gICAgICAvLyBXZSBjYW4gbXV0YXRlIGBqc29uYCBub3cgdGhhdCB3ZSB0b29rIGEgY29weSBvZiBpdC5cbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIG11dGFibGU6IHRydWUgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuY29uc3RydWN0b3IuZ2V0VmFsaWRhdG9yKClcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgb3B0aW9ucyxcbiAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAganNvbixcbiAgICAgIGN0eDogT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIH1cblxuICAgIHZhbGlkYXRvci5iZWZvcmVWYWxpZGF0ZShhcmdzKVxuICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZShhcmdzKVxuICAgIGNvbnN0IGhhbmRsZVJlc3VsdCA9IHJlc3VsdCA9PiB7XG4gICAgICB2YWxpZGF0b3IuYWZ0ZXJWYWxpZGF0ZShhcmdzKVxuICAgICAgLy8gSWYgYGpzb25gIHdhcyBzaGFsbG93LWNsb25lZCwgY29weSBvdmVyIHRoZSBwb3NzaWJsZSBkZWZhdWx0IHZhbHVlcy5cbiAgICAgIHJldHVybiBzaGFsbG93ID8gaW5wdXRKc29uLiRzZXQocmVzdWx0KSA6IHJlc3VsdFxuICAgIH1cbiAgICAvLyBIYW5kbGUgYm90aCBhc3luYyBhbmQgc3luYyB2YWxpZGF0aW9uIGhlcmU6XG4gICAgcmV0dXJuIGlzUHJvbWlzZShyZXN1bHQpXG4gICAgICA/IHJlc3VsdC50aGVuKGhhbmRsZVJlc3VsdClcbiAgICAgIDogaGFuZGxlUmVzdWx0KHJlc3VsdClcbiAgfVxuXG4gIGFzeW5jICR2YWxpZGF0ZUdyYXBoKG9wdGlvbnMgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuJHZhbGlkYXRlKG51bGwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBncmFwaDogdHJ1ZSxcbiAgICAgIC8vIEFsd2F5cyB1c2UgYGFzeW5jOiB0cnVlYCBvcHRpb24gaGVyZSBmb3Igc2ltcGxpY2l0eTpcbiAgICAgIGFzeW5jOiB0cnVlXG4gICAgfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gIHN0YXRpYyBmcm9tSnNvbihqc29uLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy5hc3luYyAmJiAhb3B0aW9ucy5za2lwVmFsaWRhdGlvbikge1xuICAgICAgLy8gSGFuZGxlIGFzeW5jIHZhbGlkYXRpb24sIGFzIHN1cHBvcnRlZCBieSBEaXRvOlxuICAgICAgY29uc3QgbW9kZWwgPSBuZXcgdGhpcygpXG4gICAgICByZXR1cm4gbW9kZWwuJHZhbGlkYXRlKGpzb24sIG9wdGlvbnMpLnRoZW4oXG4gICAgICAgIGpzb24gPT4gbW9kZWwuJHNldEpzb24oanNvbiwge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgc2tpcFZhbGlkYXRpb246IHRydWVcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gICAgLy8gRmFsbCBiYWNrIHRvIE9iamVjdGlvbidzIGZyb21Kc29uKCkgaWYgd2UgZG9uJ3QgbmVlZCBhc3luYyBoYW5kbGluZzpcbiAgICByZXR1cm4gc3VwZXIuZnJvbUpzb24oanNvbiwgb3B0aW9ucylcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgcXVlcnkodHJ4KSB7XG4gICAgcmV0dXJuIHN1cGVyLnF1ZXJ5KHRyeCkub25FcnJvcihlcnIgPT4ge1xuICAgICAgLy8gVE9ETzogU2hvdWxkbid0IHRoaXMgd3JhcHBpbmcgaGFwcGVuIG9uIHRoZSBDb250cm9sbGVyIGxldmVsP1xuICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgUmVzcG9uc2VFcnJvciA/IGVyclxuICAgICAgICA6IGVyciBpbnN0YW5jZW9mIG9iamVjdGlvbi5EQkVycm9yID8gdGhpcy5hcHAuY3JlYXRlRGF0YWJhc2VFcnJvcihlcnIpXG4gICAgICAgIDogbmV3IFdyYXBwZWRFcnJvcihlcnIpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY291bnQoLi4uYXJncykge1xuICAgIGNvbnN0IHsgY291bnQgfSA9IGF3YWl0IHRoaXMucXVlcnkoKS5jb3VudCguLi5hcmdzKS5maXJzdCgpIHx8IHt9XG4gICAgcmV0dXJuICtjb3VudCB8fCAwXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgLy8gSWYgdGhlIGNsYXNzIG5hbWUgZW5kcyBpbiAnTW9kZWwnLCByZW1vdmUgdGhhdCBmcm9tIHRoZSB0YWJsZSBuYW1lLlxuICAgIHJldHVybiB0aGlzLm5hbWUubWF0Y2goL14oLio/KSg/Ok1vZGVsfCkkLylbMV1cbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgZ2V0IGlkQ29sdW1uKCkge1xuICAgIC8vIFRyeSBleHRyYWN0aW5nIHRoZSBpZCBjb2x1bW4gbmFtZSBmcm9tIHRoZSByYXcgcHJvcGVydGllcyBkZWZpbml0aW9ucyxcbiAgICAvLyBub3QgdGhlIHJlc29sdmVkIGBkZWZpbml0aW9uLnByb3BlcnRpZXNgIHdoaWNoIGFyZW4ndCByZWFkeSBhdCB0aGlzIHBvaW50XG4gICAgLy8gd2l0aCBmYWxsLWJhY2sgb250byBkZWZhdWx0IE9iamVjdGlvbi5qcyBiZWhhdmlvci5cbiAgICBjb25zdCB7IHByb3BlcnRpZXMgfSA9IHRoaXNcbiAgICBjb25zdCBpZHMgPSBbXVxuICAgIGZvciAoY29uc3QgW25hbWUsIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzIHx8IHt9KSkge1xuICAgICAgaWYgKHByb3BlcnR5Py5wcmltYXJ5KSB7XG4gICAgICAgIGlkcy5wdXNoKG5hbWUpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBpZHNcbiAgICByZXR1cm4gbGVuZ3RoID4gMSA/IGlkcyA6IGxlbmd0aCA+IDAgPyBpZHNbMF0gOiBzdXBlci5pZENvbHVtblxuICB9XG5cbiAgc3RhdGljIGdldFJlZmVyZW5jZShtb2RlbE9ySWQsIGluY2x1ZGVQcm9wZXJ0aWVzKSB7XG4gICAgLy8gQ3JlYXRlcyBhIHJlZmVyZW5jZSBtb2RlbCB0aGF0IHRha2VzIG92ZXIgdGhlIGlkIC8gI3JlZiBwcm9wZXJ0aWVzIGZyb21cbiAgICAvLyB0aGUgcGFzc2VkIG1vZGVsIG9yIGlkIHZhbHVlL2FycmF5LCBvbWl0dGluZyBhbnkgb3RoZXIgcHJvcGVydGllcyBpbiBpdCxcbiAgICAvLyBleGNlcHQgZm9yIGFueXRoaW5nIG1lbnRpb25lZCBpbiB0aGUgb3B0aW9uYWwgYGluY2x1ZGVQcm9wZXJ0aWVzYCBhcmcuXG4gICAgY29uc3QgcmVmID0gbmV3IHRoaXMoKVxuICAgIGNvbnN0IGlkUHJvcGVydGllcyA9IHRoaXMuZ2V0SWRQcm9wZXJ0eUFycmF5KClcbiAgICBpZiAoaXNPYmplY3QobW9kZWxPcklkKSkge1xuICAgICAgY29uc3QgYWRkUHJvcGVydHkgPSBrZXkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1vZGVsT3JJZFtrZXldXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVmW2tleV0gPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN1cHBvcnQgT2JqZWN0aW9uJ3MgI3JlZiB0eXBlIHJlZmVyZW5jZXMgbmV4dCB0byBpZCBwcm9wZXJ0aWVzLlxuICAgICAgYWRkUHJvcGVydHkodGhpcy51aWRSZWZQcm9wKVxuICAgICAgaWRQcm9wZXJ0aWVzLmZvckVhY2goYWRkUHJvcGVydHkpXG4gICAgICBpbmNsdWRlUHJvcGVydGllcz8uZm9yRWFjaChhZGRQcm9wZXJ0eSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQW4gaWQgdmFsdWUvYXJyYXk6IE1hcCBpdCB0byB0aGUgcHJvcGVydGllcyBpbiBgZ2V0SWRQcm9wZXJ0eUFycmF5KClgOlxuICAgICAgY29uc3QgaWRzID0gYXNBcnJheShtb2RlbE9ySWQpXG4gICAgICBpZiAoaWRzLmxlbmd0aCAhPT0gaWRQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgTW9kZWxFcnJvcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBJbnZhbGlkIGFtb3VudCBvZiBpZCB2YWx1ZXMgcHJvdmlkZWQgZm9yIHJlZmVyZW5jZTogVW5hYmxlIHRvIG1hcCAke1xuICAgICAgICAgICAgZm9ybWF0SnNvbihtb2RlbE9ySWQsIGZhbHNlKVxuICAgICAgICAgIH0gdG8gJHtcbiAgICAgICAgICAgIGZvcm1hdEpzb24oaWRQcm9wZXJ0aWVzLCBmYWxzZSlcbiAgICAgICAgICB9LmBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWRQcm9wZXJ0aWVzLmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmVmW2tleV0gPSBpZHNbaW5kZXhdXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICBzdGF0aWMgaXNSZWZlcmVuY2Uob2JqKSB7XG4gICAgbGV0IHZhbGlkYXRvciA9IHRoaXMucmVmZXJlbmNlVmFsaWRhdG9yXG4gICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgIC8vIEZvciBgZGF0YWAgdG8gYmUgY29uc2lkZXJlZCBhIHJlZmVyZW5jZSwgaXQgbmVlZHMgdG8gaG9sZCBvbmx5IG9uZVxuICAgICAgLy8gdmFsdWUgdGhhdCBpcyBlaXRoZXIgdGhlIHRhcmdldCdzIGlkLCBvciBhbiBPYmplY3Rpb24uanMgI3JlZiB2YWx1ZTpcbiAgICAgIHZhbGlkYXRvciA9IHRoaXMucmVmZXJlbmNlVmFsaWRhdG9yID0gdGhpcy5hcHAuY29tcGlsZVZhbGlkYXRvcihcbiAgICAgICAge1xuICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICAvLyBTdXBwb3J0IGNvbXBvc2l0ZSBrZXlzIGFuZCBhZGQgYSBwcm9wZXJ0eSBmb3IgZWFjaCBrZXk6XG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZ2V0SWRQcm9wZXJ0eUFycmF5KCkucmVkdWNlKFxuICAgICAgICAgICAgICAgIChpZFByb3BlcnRpZXMsIGlkUHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlkUHJvcGVydGllc1tpZFByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5kZWZpbml0aW9uLnByb3BlcnRpZXNbaWRQcm9wZXJ0eV0udHlwZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkUHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIFt0aGlzLnVpZFJlZlByb3BdOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICAvLyBSZWNlaXZlIGBmYWxzZWAgaW5zdGVhZCBvZiB0aHJvd24gZXhjZXB0aW9ucyB3aGVuIHZhbGlkYXRpb24gZmFpbHM6XG4gICAgICAgIHsgdGhyb3c6IGZhbHNlIH1cbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcihvYmopXG4gIH1cblxuICBzdGF0aWMgZ2V0U2NvcGUobmFtZSkge1xuICAgIHJldHVybiB0aGlzLmRlZmluaXRpb24uc2NvcGVzW25hbWVdXG4gIH1cblxuICBzdGF0aWMgaGFzU2NvcGUobmFtZSkge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0U2NvcGUobmFtZSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb2RpZmllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbi5tb2RpZmllcnNcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2FjaGVkKCdyZWxhdGlvbk1hcHBpbmdzJywgKCkgPT4gKFxuICAgICAgY29udmVydFJlbGF0aW9ucyh0aGlzLCB0aGlzLmRlZmluaXRpb24ucmVsYXRpb25zLCB0aGlzLmFwcC5tb2RlbHMpXG4gICAgKSwge30pXG4gIH1cblxuICBzdGF0aWMgZ2V0IGpzb25TY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhY2hlZCgnanNvblNjaGVtYScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGNvbnZlcnRTY2hlbWEodGhpcy5kZWZpbml0aW9uLnByb3BlcnRpZXMpXG4gICAgICBhZGRSZWxhdGlvblNjaGVtYXModGhpcywgc2NoZW1hLnByb3BlcnRpZXMpXG4gICAgICAvLyBNZXJnZSBpbiByb290LWxldmVsIHNjaGVtYSBhZGRpdGlvbnNcbiAgICAgIG1lcmdlKHNjaGVtYSwgdGhpcy5kZWZpbml0aW9uLnNjaGVtYSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgICRpZDogdGhpcy5uYW1lLFxuICAgICAgICAkc2NoZW1hOiAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEnLFxuICAgICAgICAuLi5zY2hlbWFcbiAgICAgIH1cbiAgICB9LCB7fSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgLy8gTGV2ZXJhZ2UgT2JqZWN0aW9uJ3Mgb3duIG1lY2hhbmlzbSBjYWxsZWQgYHZpcnR1YWxBdHRyaWJ1dGVzYCB0byBoYW5kbGVcbiAgICAvLyBgY29tcHV0ZWRBdHRyaWJ1dGVzYCB3aGVuIHNldHRpbmcgSlNPTiBkYXRhLlxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVkQXR0cmlidXRlc1xuICB9XG5cbiAgc3RhdGljIGdldCBqc29uQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2FjaGVkKCdqc29uU2NoZW1hOmpzb25BdHRyaWJ1dGVzJywgKCkgPT4gKFxuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVzKCh7IHR5cGUsIHNwZWNpZmljVHlwZSwgY29tcHV0ZWQgfSkgPT5cbiAgICAgICAgIWNvbXB1dGVkICYmICFzcGVjaWZpY1R5cGUgJiYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdhcnJheScpKVxuICAgICksIFtdKVxuICB9XG5cbiAgc3RhdGljIGdldCBib29sZWFuQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2FjaGVkKCdqc29uU2NoZW1hOmJvb2xlYW5BdHRyaWJ1dGVzJywgKCkgPT4gKFxuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVzKCh7IHR5cGUsIGNvbXB1dGVkIH0pID0+XG4gICAgICAgICFjb21wdXRlZCAmJiB0eXBlID09PSAnYm9vbGVhbicpXG4gICAgKSwgW10pXG4gIH1cblxuICBzdGF0aWMgZ2V0IGRhdGVBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYWNoZWQoJ2pzb25TY2hlbWE6ZGF0ZUF0dHJpYnV0ZXMnLCAoKSA9PiAoXG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZXMoKHsgdHlwZSwgY29tcHV0ZWQgfSkgPT5cbiAgICAgICAgIWNvbXB1dGVkICYmIFsnZGF0ZScsICdkYXRldGltZScsICd0aW1lc3RhbXAnXS5pbmNsdWRlcyh0eXBlKSlcbiAgICApLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcHV0ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYWNoZWQoJ2pzb25TY2hlbWE6Y29tcHV0ZWRBdHRyaWJ1dGVzJywgKCkgPT4gKFxuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVzKCh7IGNvbXB1dGVkIH0pID0+IGNvbXB1dGVkKVxuICAgICksIFtdKVxuICB9XG5cbiAgc3RhdGljIGdldCBoaWRkZW5BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYWNoZWQoJ2pzb25TY2hlbWE6aGlkZGVuQXR0cmlidXRlcycsICgpID0+IChcbiAgICAgIHRoaXMuZ2V0QXR0cmlidXRlcygoeyBoaWRkZW4gfSkgPT4gaGlkZGVuKVxuICAgICksIFtdKVxuICB9XG5cbiAgc3RhdGljIGdldEF0dHJpYnV0ZXMoZmlsdGVyKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IFtdXG4gICAgY29uc3QgeyBwcm9wZXJ0aWVzIH0gPSB0aGlzLmRlZmluaXRpb25cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wZXJ0eV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykpIHtcbiAgICAgIGlmIChmaWx0ZXIocHJvcGVydHkpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChuYW1lKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlc1xuICB9XG5cbiAgc3RhdGljIF9nZXRDYWNoZWQoaWRlbnRpZmllciwgY2FsY3VsYXRlLCBlbXB0eSA9IHt9KSB7XG4gICAgbGV0IGNhY2hlID0gZ2V0TWV0YSh0aGlzLCAnY2FjaGUnLCB7fSlcbiAgICAvLyBVc2UgYSBzaW1wbGUgZGVwZW5kZW5jeSB0cmFja2luZyBtZWNoYW5pc20gd2l0aCBjYWNoZSBpZGVudGlmaWVycyB0aGF0XG4gICAgLy8gY2FuIGJlIGNoaWxkcmVuIG9mIG90aGVyIGNhY2hlZCB2YWx1ZXMsIGUuZy46XG4gICAgLy8gJ2pzb25TY2hlbWE6anNvbkF0dHJpYnV0ZXMnIGFzIGEgY2hpbGQgb2YgJ2pzb25TY2hlbWEnLCBzbyB0aGF0IHdoZW5ldmVyXG4gICAgLy8gJ2pzb25TY2hlbWEnIGNoYW5nZXMsIGFsbCBjYWNoZWQgY2hpbGQgdmFsdWVzICBhcmUgaW52YWxpZGF0ZWQuXG4gICAgbGV0IGVudHJ5XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGlkZW50aWZpZXIuc3BsaXQoJzonKSkge1xuICAgICAgZW50cnkgPSBjYWNoZVtwYXJ0XSA9IGNhY2hlW3BhcnRdIHx8IHtcbiAgICAgICAgY2FjaGU6IHt9LFxuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICBjYWNoZSA9IGVudHJ5LmNhY2hlXG4gICAgfVxuICAgIGlmIChlbnRyeT8udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGVtcG9yYXJpbHkgc2V0IGNhY2hlIHRvIGFuIGVtcHR5IG9iamVjdCB0byBwcmV2ZW50IGVuZGxlc3NcbiAgICAgIC8vIHJlY3Vyc2lvbiB3aXRoIGludGVyZGVwZW5kZW50IGpzb25TY2hlbWEgcmVsYXRlZCBjYWxscy4uLlxuICAgICAgZW50cnkudmFsdWUgPSBlbXB0eVxuICAgICAgZW50cnkudmFsdWUgPSBjYWxjdWxhdGUoKVxuICAgICAgLy8gQ2xlYXIgY2hpbGQgZGVwZW5kZW5jaWVzIG9uY2UgcGFyZW50IHZhbHVlIGhhcyBjaGFuZ2VkOlxuICAgICAgZW50cnkuY2FjaGUgPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZW50cnk/LnZhbHVlXG4gIH1cblxuICBzdGF0aWMgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHtcbiAgICByZXR1cm4gZ2V0TWV0YSh0aGlzLCAncmVsYXRlZFJlbGF0aW9ucycsIFtdKVxuICB9XG5cbiAgLy8gT3ZlcnJpZGUgcHJvcGVydHlOYW1lVG9Db2x1bW5OYW1lKCkgLyBjb2x1bW5OYW1lVG9Qcm9wZXJ0eU5hbWUoKSB0byBub3RcbiAgLy8gcmVseSBvbiAkZm9ybWF0RGF0YWJhc2VKc29uKCkgLyAgJHBhcnNlRGF0YWJhc2VKc29uKCkgZG8gZGV0ZWN0IG5hbWluZ1xuICAvLyBjb252ZW50aW9ucyBidXQgYXNzdW1lIHNpbXBseSB0aGF0IHRoZXkncmUgYWx3YXlzIHRoZSBzYW1lLlxuICAvLyBUaGlzIGlzIGZpbmUgc2luY2Ugd2UgY2FuIG5vdyBjaGFuZ2UgbmFtaW5nIGF0IEtuZXggbGV2ZWwuXG4gIC8vIFNlZSBrbmV4U25ha2VDYXNlTWFwcGVycygpXG5cbiAgLy8gQG92ZXJyaWRlXG4gIHN0YXRpYyBwcm9wZXJ0eU5hbWVUb0NvbHVtbk5hbWUocHJvcGVydHlOYW1lKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5TmFtZVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gIHN0YXRpYyBjb2x1bW5OYW1lVG9Qcm9wZXJ0eU5hbWUoY29sdW1uTmFtZSkge1xuICAgIHJldHVybiBjb2x1bW5OYW1lXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgJHNldEpzb24oanNvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgY29uc3QgY2FsbEluaXRpYWxpemUgPSAoXG4gICAgICAvLyBPbmx5IGNhbGwgaW5pdGlhbGl6ZSB3aGVuOlxuICAgICAgLy8gMS4gd2UncmUgbm90IHBhcnRpYWxseSBwYXRjaGluZzpcbiAgICAgICFvcHRpb25zLnBhdGNoICYmXG4gICAgICAvLyAyLiAkaW5pdGlhbGl6ZSgpIGlzIGFjdHVhbGx5IGRvaW5nIHNvbWV0aGluZzpcbiAgICAgIHRoaXMuJGluaXRpYWxpemUgIT09IE1vZGVsLnByb3RvdHlwZS4kaW5pdGlhbGl6ZSAmJlxuICAgICAgLy8gMy4gdGhlIGRhdGEgaXMgbm90IGp1c3QgYSByZWZlcmVuY2U6XG4gICAgICAhdGhpcy5jb25zdHJ1Y3Rvci5pc1JlZmVyZW5jZShqc29uKVxuICAgIClcbiAgICBpZiAoIWNhbGxJbml0aWFsaXplIHx8IG9wdGlvbnMuc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHN1cGVyLiRzZXRKc29uKGpzb24sIG9wdGlvbnMpXG4gICAgICBpZiAoY2FsbEluaXRpYWxpemUpIHtcbiAgICAgICAgdGhpcy4kaW5pdGlhbGl6ZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHZhbGlkYXRpb24gaXNuJ3Qgc2tpcHBlZCBvciB0aGUgbW9kZWwgcHJvdmlkZXMgaXRzIG93biAkaW5pdGlhbGl6ZSgpXG4gICAgICAvLyBtZXRob2QsIGNhbGwgJHNldEpzb24oKSB3aXRoIHBhdGNoIHZhbGlkYXRpb24gZmlyc3QgdG8gbm90IGNvbXBsYWluXG4gICAgICAvLyBhYm91dCBtaXNzaW5nIGZpZWxkcywgdGhlbiBwZXJmb3JtIGEgZnVsbCB2YWxpZGF0aW9uIGFmdGVyIGNhbGxpbmdcbiAgICAgIC8vICRpbml0aWFsaXplKCksIHRvIGdpdmUgdGhlIG1vZGVsIGEgY2hhbmNlIHRvIGNvbmZpZ3VyZSBpdHNlbGYuXG4gICAgICBzdXBlci4kc2V0SnNvbihqc29uLCB7IC4uLm9wdGlvbnMsIHBhdGNoOiB0cnVlIH0pXG4gICAgICB0aGlzLiRpbml0aWFsaXplKClcbiAgICAgIHRoaXMuJHZhbGlkYXRlKHRoaXMsIG9wdGlvbnMpXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgJGZvcm1hdERhdGFiYXNlSnNvbihqc29uKSB7XG4gICAgY29uc3QgeyBjb25zdHJ1Y3RvciB9ID0gdGhpc1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbnN0cnVjdG9yLmRhdGVBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBkYXRlID0ganNvbltrZXldXG4gICAgICBpZiAoZGF0ZT8udG9JU09TdHJpbmcpIHtcbiAgICAgICAganNvbltrZXldID0gZGF0ZS50b0lTT1N0cmluZygpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb25zdHJ1Y3Rvci5pc1NRTGl0ZSgpKSB7XG4gICAgICAvLyBTUUxpdGUgZG9lcyBub3Qgc3VwcG9ydCBib29sZWFuIG5hdGl2ZWx5IGFuZCBuZWVkcyBjb252ZXJzaW9uLi4uXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb25zdHJ1Y3Rvci5ib29sZWFuQXR0cmlidXRlcykge1xuICAgICAgICBjb25zdCBib29sID0ganNvbltrZXldXG4gICAgICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBqc29uW2tleV0gPSBib29sID8gMSA6IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGNvbXB1dGVkIHByb3BlcnRpZXMgc28gdGhleSBkb24ndCBhdHRlbXB0IHRvIGdldCBzZXQuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgY29uc3RydWN0b3IuY29tcHV0ZWRBdHRyaWJ1dGVzKSB7XG4gICAgICBkZWxldGUganNvbltrZXldXG4gICAgfVxuICAgIC8vIE5PVEU6IE5vIG5lZWQgdG8gbm9ybWFsaXplIHRoZSBpZGVudGlmaWVycyBpbiB0aGUgSlNPTiBpbiBjYXNlIG9mXG4gICAgLy8gbm9ybWFsaXplRGJOYW1lcywgYXMgdGhpcyBhbHJlYWR5IGhhcHBlbnMgdGhyb3VnaFxuICAgIC8vIGtuZXguY29uZmlnLndyYXBJZGVudGlmaWVyKCksIHNlZSBBcHBsaWNhdGlvbi5qc1xuICAgIHJldHVybiBzdXBlci4kZm9ybWF0RGF0YWJhc2VKc29uKGpzb24pXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgJHBhcnNlRGF0YWJhc2VKc29uKGpzb24pIHtcbiAgICBjb25zdCB7IGNvbnN0cnVjdG9yIH0gPSB0aGlzXG4gICAganNvbiA9IHN1cGVyLiRwYXJzZURhdGFiYXNlSnNvbihqc29uKVxuICAgIGlmIChjb25zdHJ1Y3Rvci5pc1NRTGl0ZSgpKSB7XG4gICAgICAvLyBTUUxpdGUgZG9lcyBub3Qgc3VwcG9ydCBib29sZWFuIG5hdGl2ZWx5IGFuZCBuZWVkcyBjb252ZXJzaW9uLi4uXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb25zdHJ1Y3Rvci5ib29sZWFuQXR0cmlidXRlcykge1xuICAgICAgICBjb25zdCBib29sID0ganNvbltrZXldXG4gICAgICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBqc29uW2tleV0gPSAhIWJvb2xcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBBbHNvIHJ1biB0aHJvdWdoIG5vcm1hbCAkcGFyc2VKc29uKCksIGZvciBoYW5kbGluZyBvZiBgRGF0ZWAgYW5kXG4gICAgLy8gYEFzc2V0RmlsZWAuXG4gICAgcmV0dXJuIHRoaXMuJHBhcnNlSnNvbihqc29uKVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gICRwYXJzZUpzb24oanNvbikge1xuICAgIGNvbnN0IHsgY29uc3RydWN0b3IgfSA9IHRoaXNcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjb25zdHJ1Y3Rvci5kYXRlQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgZGF0ZSA9IGpzb25ba2V5XVxuICAgICAgaWYgKGRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc29uW2tleV0gPSBpc1N0cmluZyhkYXRlKSA/IG5ldyBEYXRlKGRhdGUpIDogZGF0ZVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDb252ZXJ0IHBsYWluIGFzc2V0IGZpbGVzIG9iamVjdHMgdG8gQXNzZXRGaWxlIGluc3RhbmNlcyB3aXRoIHJlZmVyZW5jZXNcbiAgICAvLyB0byB0aGUgbGlua2VkIHN0b3JhZ2UuXG4gICAgY29uc3QgeyBhc3NldHMgfSA9IGNvbnN0cnVjdG9yLmRlZmluaXRpb25cbiAgICBpZiAoYXNzZXRzKSB7XG4gICAgICBmb3IgKGNvbnN0IGRhdGFQYXRoIGluIGFzc2V0cykge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gY29uc3RydWN0b3IuYXBwLmdldFN0b3JhZ2UoYXNzZXRzW2RhdGFQYXRoXS5zdG9yYWdlKVxuICAgICAgICBjb25zdCBkYXRhID0gZ2V0VmFsdWVBdERhdGFQYXRoKGpzb24sIGRhdGFQYXRoLCAoKSA9PiBudWxsKVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnRUb0Fzc2V0RmlsZXMgPSBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgIGlmIChpc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGNvbnZlcnRUb0Fzc2V0RmlsZXMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5jb252ZXJ0QXNzZXRGaWxlKGRhdGEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udmVydFRvQXNzZXRGaWxlcyhkYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqc29uXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgJGZvcm1hdEpzb24oanNvbikge1xuICAgIGNvbnN0IHsgY29uc3RydWN0b3IgfSA9IHRoaXNcbiAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCB0aGUgY29tcHV0ZWQgcHJvcGVydGllcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjb25zdHJ1Y3Rvci5jb21wdXRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIFBlcmhhcHMgdGhlIGNvbXB1dGVkIHByb3BlcnR5IGlzIHByb2R1Y2VkIGluIHRoZSBTUUwgc3RhdGVtZW50LFxuICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGFueW1vcmUgaGVyZS5cbiAgICAgIGlmICghKGtleSBpbiBqc29uKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XVxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGpzb25ba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVtb3ZlIGhpZGRlbiBhdHRyaWJ1dGVzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbnN0cnVjdG9yLmhpZGRlbkF0dHJpYnV0ZXMpIHtcbiAgICAgIGRlbGV0ZSBqc29uW2tleV1cbiAgICB9XG4gICAgcmV0dXJuIGpzb25cbiAgfVxuXG4gIC8vIEdyYXBoIGhhbmRsaW5nXG5cbiAgJGZpbHRlckdyYXBoKG1vZGVsR3JhcGgsIGV4cHIpIHtcbiAgICByZXR1cm4gZmlsdGVyR3JhcGgodGhpcy5jb25zdHJ1Y3RvciwgbW9kZWxHcmFwaCwgZXhwcilcbiAgfVxuXG4gIGFzeW5jICRwb3B1bGF0ZUdyYXBoKG1vZGVsR3JhcGgsIGV4cHIsIHRyeCkge1xuICAgIHJldHVybiBwb3B1bGF0ZUdyYXBoKHRoaXMuY29uc3RydWN0b3IsIG1vZGVsR3JhcGgsIGV4cHIsIHRyeClcbiAgfVxuXG4gIHN0YXRpYyBmaWx0ZXJHcmFwaChtb2RlbEdyYXBoLCBleHByKSB7XG4gICAgcmV0dXJuIGZpbHRlckdyYXBoKHRoaXMsIG1vZGVsR3JhcGgsIGV4cHIpXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcG9wdWxhdGVHcmFwaChtb2RlbEdyYXBoLCBleHByLCB0cngpIHtcbiAgICByZXR1cm4gcG9wdWxhdGVHcmFwaCh0aGlzLCBtb2RlbEdyYXBoLCBleHByLCB0cngpXG4gIH1cblxuICBzdGF0aWMgZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aChkYXRhUGF0aCkge1xuICAgIC8vIEZpbmRzIHRoZSBwcm9wZXJ0eSBvciByZWxhdGlvbiBhdCB0aGUgZ2l2ZW4gdGhlIGRhdGFQYXRoIG9mIHRoZSBtb2RlbCBieVxuICAgIC8vIHBhcnNpbmcgdGhlIGRhdGFQYXRoIGFuZCBtYXRjaGluZyBpdCB0byBpdHMgcmVsYXRpb25zIGFuZCBwcm9wZXJ0aWVzLlxuICAgIGNvbnN0IHBhcnNlZERhdGFQYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICBjb25zdCBnZXRSZXN1bHQgPSAocHJvcGVydHkgPSBudWxsLCByZWxhdGlvbiA9IG51bGwpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kID0gcHJvcGVydHkgfHwgcmVsYXRpb25cbiAgICAgIGNvbnN0IG5hbWUgPSBwYXJzZWREYXRhUGF0aFtpbmRleF1cbiAgICAgIGNvbnN0IG5leHQgPSBpbmRleCArIDFcbiAgICAgIGNvbnN0IGRhdGFQYXRoID0gZm91bmRcbiAgICAgICAgPyBub3JtYWxpemVEYXRhUGF0aChwYXJzZWREYXRhUGF0aC5zbGljZSgwLCBuZXh0KSlcbiAgICAgICAgOiBudWxsXG4gICAgICBjb25zdCBuZXN0ZWREYXRhUGF0aCA9IGZvdW5kXG4gICAgICAgID8gbm9ybWFsaXplRGF0YVBhdGgocGFyc2VkRGF0YVBhdGguc2xpY2UobmV4dCkpXG4gICAgICAgIDogbnVsbFxuICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGZvdW5kXG4gICAgICAgID8gcGFyc2VkRGF0YVBhdGguc2xpY2UoMCwgcmVsYXRpb24gPyBuZXh0IDogaW5kZXgpLmpvaW4oJy4nKSArXG4gICAgICAgICAgKHByb3BlcnR5ID8gYCgjJHtuYW1lfSlgIDogJycpXG4gICAgICAgIDogbnVsbFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcGVydHksXG4gICAgICAgIHJlbGF0aW9uLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgbmVzdGVkRGF0YVBhdGgsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIGluZGV4XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0VG9rZW4sIC4uLm90aGVyVG9rZW5zXSA9IHBhcnNlZERhdGFQYXRoXG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmRlZmluaXRpb24ucHJvcGVydGllc1tmaXJzdFRva2VuXVxuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIGdldFJlc3VsdChwcm9wZXJ0eSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlbGF0aW9uID0gdGhpcy5nZXRSZWxhdGlvbnMoKVtmaXJzdFRva2VuXVxuICAgICAgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgIGxldCB7IHJlbGF0ZWRNb2RlbENsYXNzIH0gPSByZWxhdGlvblxuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIG90aGVyVG9rZW5zKSB7XG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gcmVsYXRlZE1vZGVsQ2xhc3MuZGVmaW5pdGlvbi5wcm9wZXJ0aWVzW3Rva2VuXVxuICAgICAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldFJlc3VsdChwcm9wZXJ0eSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnKicpIHtcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc09uZVRvT25lKCkpIHtcbiAgICAgICAgICAgICAgLy8gRG8gbm90IHN1cHBvcnQgd2lsZGNhcmRzIG9uIG9uZS10by1vbmUgcmVsYXRpb25zOlxuICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVzdWx0KClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvdW5kIGEgcmVsYXRpb24/IEtlZXAgaXRlcmF0aW5nLlxuICAgICAgICAgICAgcmVsYXRpb24gPSByZWxhdGVkTW9kZWxDbGFzcy5nZXRSZWxhdGlvbnMoKVt0b2tlbl1cbiAgICAgICAgICAgIGlmIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICByZWxhdGVkTW9kZWxDbGFzcyA9IHJlbGF0aW9uLnJlbGF0ZWRNb2RlbENsYXNzXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVzdWx0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgICAgLy8gU3RpbGwgaGVyZT8gRm91bmQgYSByZWxhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhLXBhdGguXG4gICAgICAgICAgcmV0dXJuIGdldFJlc3VsdChudWxsLCByZWxhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0UmVzdWx0KClcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgcmVsYXRlZFF1ZXJ5KHJlbGF0aW9uTmFtZSwgdHJ4KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1ZpbmNpdC9vYmplY3Rpb24uanMvaXNzdWVzLzE3MjBcbiAgICByZXR1cm4gc3VwZXIucmVsYXRlZFF1ZXJ5KHJlbGF0aW9uTmFtZSwgdHJ4KS5hbGlhcyhyZWxhdGlvbk5hbWUpXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIG1vZGlmaWVyTm90Rm91bmQocXVlcnksIG1vZGlmaWVyKSB7XG4gICAgaWYgKGlzU3RyaW5nKG1vZGlmaWVyKSkge1xuICAgICAgaWYgKHF1ZXJ5Lm1vZGVsQ2xhc3MoKS5oYXNTY29wZShtb2RpZmllcikpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5LmFwcGx5U2NvcGUobW9kaWZpZXIpXG4gICAgICB9XG4gICAgICAvLyBOb3cgY2hlY2sgcG9zc2libGUgc2NvcGUgcHJlZml4ZXMgYW5kIGhhbmRsZSB0aGVtOlxuICAgICAgc3dpdGNoIChtb2RpZmllclswXSkge1xuICAgICAgY2FzZSAnXic6IC8vIEVhZ2VyLWFwcGxpZWQgc2NvcGU6XG4gICAgICAgIC8vIEFsd2F5cyBhcHBseSBlYWdlci1zY29wZXMsIGV2ZW4gaWYgdGhlIG1vZGVsIGl0c2VsZiBkb2Vzbid0IGtub3cgaXQuXG4gICAgICAgIC8vIFRoZSBzY29wZSBtYXkgc3RpbGwgYmUga25vd24gaW4gZWFnZXItbG9hZGVkIHJlbGF0aW9ucy5cbiAgICAgICAgLy8gTm90ZTogYGFwcGx5U2NvcGUoKWAgd2lsbCBoYW5kbGUgdGhlICdeJyBzaWduLlxuICAgICAgICByZXR1cm4gcXVlcnkuYXBwbHlTY29wZShtb2RpZmllcilcbiAgICAgIGNhc2UgJy0nOiAvLyBJZ25vcmUgc2NvcGU6XG4gICAgICAgIHJldHVybiBxdWVyeS5pZ25vcmVTY29wZShtb2RpZmllci5zbGljZSgxKSlcbiAgICAgIGNhc2UgJyMnOiAvLyBTZWxlY3QgY29sdW1uOlxuICAgICAgICByZXR1cm4gcXVlcnkuc2VsZWN0KG1vZGlmaWVyLnNsaWNlKDEpKVxuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5tb2RpZmllck5vdEZvdW5kKHF1ZXJ5LCBtb2RpZmllcilcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgY3JlYXRlTm90Rm91bmRFcnJvcihjdHgsIGVycm9yKSB7XG4gICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgZXJyb3IgfHwgKFxuICAgICAgICBjdHguYnlJZFxuICAgICAgICAgID8gYCcke3RoaXMubmFtZX0nIG1vZGVsIHdpdGggaWQgJHtjdHguYnlJZH0gbm90IGZvdW5kYFxuICAgICAgICAgIDogYCcke3RoaXMubmFtZX0nIG1vZGVsIG5vdCBmb3VuZGBcbiAgICAgIClcbiAgICApXG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIGNyZWF0ZVZhbGlkYXRvcigpIHtcbiAgICAvLyBVc2UgYSBzaGFyZWQgdmFsaWRhdG9yIHBlciBhcHAsIHNvIG1vZGVsIHNjaGVtYSBjYW4gcmVmZXJlbmNlIGVhY2ggb3RoZXIuXG4gICAgLy8gTk9URTogVGhlIERpdG8gVmFsaWRhdG9yIGNsYXNzIGNyZWF0ZXMgYW5kIG1hbmFnZXMgdGhpcyBzaGFyZWQgT2JqZWN0aW9uXG4gICAgLy8gVmFsaWRhdG9yIGluc3RhbmNlIGZvciB1cywgd2UganVzdCBuZWVkIHRvIHJldHVybiBpdCBoZXJlOlxuICAgIHJldHVybiB0aGlzLmFwcC52YWxpZGF0b3JcbiAgfVxuXG4gIC8vIEBvdmVycmlkZVxuICBzdGF0aWMgY3JlYXRlVmFsaWRhdGlvbkVycm9yKHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzLCBvcHRpb25zLCBqc29uIH0pIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdNb2RlbFZhbGlkYXRpb24nOlxuICAgICAgcmV0dXJuIHRoaXMuYXBwLmNyZWF0ZVZhbGlkYXRpb25FcnJvcih7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgbWVzc2FnZSB8fCBgVGhlIHByb3ZpZGVkIGRhdGEgZm9yIHRoZSAke3RoaXMubmFtZX0gbW9kZWwgaXMgbm90IHZhbGlkYCxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBqc29uXG4gICAgICB9KVxuICAgIGNhc2UgJ1JlbGF0aW9uRXhwcmVzc2lvbic6XG4gICAgY2FzZSAnVW5hbGxvd2VkUmVsYXRpb24nOlxuICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkVycm9yKHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzIH0pXG4gICAgY2FzZSAnSW52YWxpZEdyYXBoJzpcbiAgICAgIHJldHVybiBuZXcgR3JhcGhFcnJvcih7IHR5cGUsIG1lc3NhZ2UsIGVycm9ycyB9KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMgfSlcbiAgICB9XG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgc3RhdGljIFF1ZXJ5QnVpbGRlciA9IFF1ZXJ5QnVpbGRlclxuXG4gIC8vIGh0dHBzOi8vdmluY2l0LmdpdGh1Yi5pby9vYmplY3Rpb24uanMvYXBpL21vZGVsL3N0YXRpYy1wcm9wZXJ0aWVzLmh0bWwjc3RhdGljLWNsb25lb2JqZWN0YXR0cmlidXRlc1xuICBzdGF0aWMgY2xvbmVPYmplY3RBdHRyaWJ1dGVzID0gZmFsc2VcblxuICAvLyBPbmx5IHBpY2sgcHJvcGVydGllcyBmb3IgZGF0YWJhc2UgSlNPTiB0aGF0IGlzIG1lbnRpb25lZCBpbiB0aGUgc2NoZW1hLlxuICBzdGF0aWMgcGlja0pzb25TY2hlbWFQcm9wZXJ0aWVzID0gdHJ1ZVxuXG4gIC8vIFNlZSBodHRwczovL2dpdHRlci5pbS9WaW5jaXQvb2JqZWN0aW9uLmpzP2F0PTVhODFmODU5Y2U2OGMzYmM3NDc5ZDY1YVxuICBzdGF0aWMgdXNlTGltaXRJbkZpcnN0ID0gdHJ1ZVxuXG4gIHN0YXRpYyBnZXQgZGVmaW5pdGlvbigpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uIG9iamVjdCBmb3IgdGhpcyBjbGFzcyBhbmQgcmV0dXJuIGl0XG4gICAgcmV0dXJuIGdldE1ldGEodGhpcywgJ2RlZmluaXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0ge31cblxuICAgICAgY29uc3Qgc2V0RGVmaW5pdGlvbiA9IChuYW1lLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVmaW5pdGlvbiwgbmFtZSwge1xuICAgICAgICAgIC4uLnByb3BlcnR5LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2V0RGVmaW5pdGlvbiA9IG5hbWUgPT4ge1xuICAgICAgICBsZXQgbW9kZWxDbGFzcyA9IHRoaXNcbiAgICAgICAgLy8gQ29sbGVjdCBhbmNlc3RvciB2YWx1ZXMgZm9yIHByb3BlciBpbmhlcml0YW5jZS5cbiAgICAgICAgLy8gTk9URTogdmFsdWVzIGFyZSBjb2xsZWN0ZWQgaW4gc2VxdWVuY2Ugb2YgaW5oZXJpdGFuY2UsIGZyb20gc3ViLWNsYXNzXG4gICAgICAgIC8vIHRvIHN1cGVyLWNsYXNzLiBUbyBnbyBmcm9tIHN1cGVyLWNsYXNzIHRvIHN1Yi1jbGFzcyB3aGVuIG1lcmdpbmcsXG4gICAgICAgIC8vIGBtZXJnZVJldmVyc2VkKClgIGlzIHVzZWQgdG8gcHJldmVudCB3cm9uZyBvdmVycmlkZXMuXG4gICAgICAgIC8vIGBtZXJnZUFzUmV2ZXJzZWRBcnJheXMoKWAgY2FuIGJlIHVzZWQgdG8ga2VlcCBhcnJheXMgb2YgaW5oZXJpdGVkXG4gICAgICAgIC8vIHZhbHVlcyBwZXIga2V5LCBzZWUgYGRlZmluaXRpb25zLmhvb2tzYC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW11cbiAgICAgICAgd2hpbGUgKG1vZGVsQ2xhc3MgIT09IG9iamVjdGlvbi5Nb2RlbCkge1xuICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgbW9kZWwgY2xhc3NlcyB0aGF0IGFjdHVhbGx5IGRlZmluZSBgbmFtZWAgcHJvcGVydHkuXG4gICAgICAgICAgaWYgKG5hbWUgaW4gbW9kZWxDbGFzcykge1xuICAgICAgICAgICAgLy8gVXNlIHJlZmxlY3Rpb24gdGhyb3VnaCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKSB0byBiZSBhYmxlIHRvXG4gICAgICAgICAgICAvLyBjYWxsIHRoZSBnZXR0ZXIgb24gYHRoaXNgIHJhdGhlciB0aGFuIG9uIGBtb2RlbENsYXNzYC4gVGhpcyBjYW5cbiAgICAgICAgICAgIC8vIGJlIHVzZWQgdG8gcHJvdmlkZSBhYnN0cmFjdCBiYXNlLWNsYXNzZXMgYW5kIGhhdmUgdGhlbSBjcmVhdGVcbiAgICAgICAgICAgIC8vIHRoZWlyIHJlbGF0aW9ucyBmb3IgYHRoaXNgIGluc2lkZSBgZ2V0IHJlbGF0aW9ucygpYCBhY2Nlc3NvcnMuXG4gICAgICAgICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtb2RlbENsYXNzLCBuYW1lKVxuICAgICAgICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZXNjLmdldD8uY2FsbCh0aGlzKSB8fCBkZXNjLnZhbHVlXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vZGVsQ2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWxDbGFzcylcbiAgICAgICAgfVxuICAgICAgICAvLyBUbyBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uIHdpdGggaW50ZXJkZXBlbmRlbnQgY2FsbHMgcmVsYXRlZCB0b1xuICAgICAgICAvLyBwcm9wZXJ0aWVzLCBvdmVycmlkZSBkZWZpbml0aW9uIGJlZm9yZSBjYWxsaW5nIGhhbmRsZXIoKTpcbiAgICAgICAgc2V0RGVmaW5pdGlvbihuYW1lLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB7fVxuICAgICAgICB9KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IGRlZmluaXRpb25zW25hbWVdLmNhbGwodGhpcywgdmFsdWVzKVxuICAgICAgICAgIC8vIE9uY2UgY2FsY3VsYXRlZCwgb3ZlcnJpZGUgZ2V0dGVyIHdpdGggZmluYWwgbWVyZ2VkIHZhbHVlLlxuICAgICAgICAgIHNldERlZmluaXRpb24obmFtZSwge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXJnZWRcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiBtZXJnZWRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxFcnJvcih0aGlzLCBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGRlZmluaXRpb24gb2JqZWN0IHdhcyBkZWZpbmVkIHlldCwgY3JlYXRlIG9uZSB3aXRoIGFjY2Vzc29ycyBmb3JcbiAgICAgIC8vIGVhY2ggZW50cnkgaW4gYGRlZmluaXRpb25zYC4gRWFjaCBvZiB0aGVzZSBnZXR0ZXJzIHdoZW4gY2FsbGVkIG1lcmdlXG4gICAgICAvLyBkZWZpbml0aW9ucyB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gYW5kIHN0b3JlIHRoZSBtZXJnZWQgcmVzdWx0IGluXG4gICAgICAvLyBgbW9kZWxDbGFzcy5kZWZpbml0aW9uW25hbWVdYCBmb3IgZnVydGhlciBjYWNoaW5nLlxuICAgICAgZm9yIChjb25zdCBuYW1lIGluIGRlZmluaXRpb25zKSB7XG4gICAgICAgIHNldERlZmluaXRpb24obmFtZSwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IGdldERlZmluaXRpb24obmFtZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbml0aW9uXG4gICAgfSlcbiAgfVxuXG4gIC8vIEhvb2tzXG5cbiAgJGVtaXQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5lbWl0KGV2ZW50LCB0aGlzLCAuLi5hcmdzKVxuICB9XG5cbiAgc3RhdGljIGJlZm9yZUZpbmQoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOmZpbmQnLCBhcmdzKVxuICB9XG5cbiAgc3RhdGljIGFmdGVyRmluZChhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VtaXRTdGF0aWNIb29rKCdhZnRlcjpmaW5kJywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBiZWZvcmVJbnNlcnQoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOmluc2VydCcsIGFyZ3MpXG4gIH1cblxuICBzdGF0aWMgYWZ0ZXJJbnNlcnQoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYWZ0ZXI6aW5zZXJ0JywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBiZWZvcmVVcGRhdGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOnVwZGF0ZScsIGFyZ3MpXG4gIH1cblxuICBzdGF0aWMgYWZ0ZXJVcGRhdGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYWZ0ZXI6dXBkYXRlJywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBiZWZvcmVEZWxldGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYmVmb3JlOmRlbGV0ZScsIGFyZ3MpXG4gIH1cblxuICBzdGF0aWMgYWZ0ZXJEZWxldGUoYXJncykge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdGljSG9vaygnYWZ0ZXI6ZGVsZXRlJywgYXJncylcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfZW1pdFN0YXRpY0hvb2soZXZlbnQsIG9yaWdpbmFsQXJncykge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzKGV2ZW50KVxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU3RhdGljIGhvb2tzIGFyZSBlbWl0dGVkIGluIHNlcXVlbmNlIChidXQgZWFjaCBldmVudCBjYW4gYmUgYXN5bmMpLCBhbmRcbiAgICAgIC8vIHJlc3VsdHMgYXJlIHBhc3NlZCB0aHJvdWdoIGFuZCByZXR1cm5lZCBpbiB0aGUgZW5kLlxuICAgICAgbGV0IHsgcmVzdWx0IH0gPSBvcmlnaW5hbEFyZ3NcbiAgICAgIC8vIFRoZSByZXN1bHQgb2YgYW55IGV2ZW50IGhhbmRsZXIgd2lsbCBvdmVycmlkZSBgYXJncy5yZXN1bHRgIGluIHRoZSBjYWxsXG4gICAgICAvLyBvZiB0aGUgbmV4dCBoYW5kbGVyIGluIHNlcXVlbmNlLiBBcyBgU3RhdGljSG9va0FyZ3VtZW50c2AgaW4gT2JqZWN0aW9uXG4gICAgICAvLyBpcyBwcml2YXRlLCB1c2UgYSBKUyBpbmhlcml0YW5jZSB0cmljayBoZXJlIHRvIG92ZXJyaWRlIGBhcmdzLnJlc3VsdGA6XG4gICAgICBjb25zdCBhcmdzID0gT2JqZWN0LmNyZWF0ZShvcmlnaW5hbEFyZ3MsIHtcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIHZhbHVlOiBldmVudFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbGlzdGVuZXIuY2FsbCh0aGlzLCBhcmdzKVxuICAgICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVW5mb3J0dW5hdGVseSBgcmVzdWx0YCBpcyBhbHdheXMgYW4gYXJyYXksIGV2ZW4gd2hlbiB0aGUgYWN0dWFsIHJlc3VsdFxuICAgICAgLy8gaXMgYSBtb2RlbCBvYmplY3QuIEF2b2lkIHJldHVybmluZyBpdCB3aGVuIGl0J3Mgbm90IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9WaW5jaXQvb2JqZWN0aW9uLmpzL2lzc3Vlcy8xODQyXG4gICAgICBpZiAocmVzdWx0ICE9PSBvcmlnaW5hbEFyZ3MucmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBzdGF0aWMgX3NldHVwQXNzZXRzRXZlbnRzKGFzc2V0cykge1xuICAgIGNvbnN0IGFzc2V0RGF0YVBhdGhzID0gT2JqZWN0LmtleXMoYXNzZXRzKVxuXG4gICAgdGhpcy5vbihbXG4gICAgICAnYmVmb3JlOmluc2VydCcsXG4gICAgICAnYmVmb3JlOnVwZGF0ZScsXG4gICAgICAnYmVmb3JlOmRlbGV0ZSdcbiAgICBdLCBhc3luYyAoeyB0eXBlLCB0cmFuc2FjdGlvbiwgaW5wdXRJdGVtcywgYXNGaW5kUXVlcnkgfSkgPT4ge1xuICAgICAgY29uc3QgYWZ0ZXJJdGVtcyA9IHR5cGUgPT09ICdiZWZvcmU6ZGVsZXRlJ1xuICAgICAgICA/IFtdXG4gICAgICAgIDogaW5wdXRJdGVtc1xuICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBhc3NldCBkYXRhIHBhdGhzIHdoZXJlIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlXG4gICAgICAvLyBzdWJtaXR0ZWQgZGF0YSwgYW5kIG9ubHkgY29tcGFyZSB0aGVzZS4gQnV0IHdoZW4gZGVsZXRpbmcsIHVzZSBhbGwuXG4gICAgICBjb25zdCBkYXRhUGF0aHMgPSBhZnRlckl0ZW1zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhc3NldERhdGFQYXRocy5maWx0ZXIoXG4gICAgICAgICAgcGF0aCA9PiBnZXRWYWx1ZUF0QXNzZXREYXRhUGF0aChhZnRlckl0ZW1zWzBdLCBwYXRoKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgOiBhc3NldERhdGFQYXRoc1xuXG4gICAgICAvLyBgZGF0YVBhdGhzYCB3aWxsIGJlIGVtcHR5IGluIHRoZSBjYXNlIG9mIGFuIHVwZGF0ZS9pbnNlcnQgdGhhdCBkbyBub3RcbiAgICAgIC8vIGFmZmVjdCB0aGUgYXNzZXRzLlxuICAgICAgaWYgKGRhdGFQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgdGhlIG1vZGVsJ3MgYXNzZXQgZmlsZXMgaW4gdGhlaXIgY3VycmVudCBzdGF0ZSBiZWZvcmUgdGhlIHF1ZXJ5IGlzXG4gICAgICAvLyBleGVjdXRlZC5cbiAgICAgIGNvbnN0IGJlZm9yZUl0ZW1zID0gdHlwZSA9PT0gJ2JlZm9yZTppbnNlcnQnXG4gICAgICAgID8gW11cbiAgICAgICAgOiBhd2FpdCBsb2FkQXNzZXREYXRhUGF0aHMoYXNGaW5kUXVlcnkoKSwgZGF0YVBhdGhzKVxuICAgICAgY29uc3QgYmVmb3JlRmlsZXNQZXJEYXRhUGF0aCA9IGdldEZpbGVzUGVyQXNzZXREYXRhUGF0aChcbiAgICAgICAgYmVmb3JlSXRlbXMsXG4gICAgICAgIGRhdGFQYXRoc1xuICAgICAgKVxuICAgICAgY29uc3QgYWZ0ZXJGaWxlc1BlckRhdGFQYXRoID0gZ2V0RmlsZXNQZXJBc3NldERhdGFQYXRoKFxuICAgICAgICBhZnRlckl0ZW1zLFxuICAgICAgICBkYXRhUGF0aHNcbiAgICAgIClcblxuICAgICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cblxuICAgICAgaWYgKHRyYW5zYWN0aW9uLnJvbGxiYWNrKSB7XG4gICAgICAgIC8vIFByZXZlbnQgd3JvbmcgbWVtb3J5IGxlYWsgZXJyb3IgbWVzc2FnZXMgd2hlbiBpbnN0YWxsaW5nIG1vcmUgdGhhbiAxMFxuICAgICAgICAvLyAncm9sbGJhY2snIGhhbmRsZXJzLCB3aGljaCBjYW4gaGFwcGVuIHdpdGggbW9yZSBjb21wbGV4IHF1ZXJpZXMuXG4gICAgICAgIHRyYW5zYWN0aW9uLnNldE1heExpc3RlbmVycygwKVxuICAgICAgICB0cmFuc2FjdGlvbi5vbigncm9sbGJhY2snLCBhc3luYyBlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKGltcG9ydGVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICBgUmVjZWl2ZWQgJyR7ZXJyb3J9JywgcmVtb3ZpbmcgaW1wb3J0ZWQgZmlsZXMgYWdhaW46ICR7XG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRGaWxlcy5tYXAoZmlsZSA9PiBgJyR7ZmlsZS5uYW1lfSdgKVxuICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGltcG9ydGVkRmlsZXMubWFwKFxuICAgICAgICAgICAgICAgIGZpbGUgPT4gZmlsZS5zdG9yYWdlLnJlbW92ZUZpbGUoZmlsZSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobW9kaWZpZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBgbW9kaWZpZWRGaWxlc2Agc2hvdWxkIGJlIHJlc3RvcmVkIGFzIHdlbGwsIGJ1dCB0aGF0J3MgZmFyXG4gICAgICAgICAgICAvLyBmcm9tIHRyaXZpYWwgc2luY2Ugbm8gYmFja3VwIGlzIGtlcHQgaW4gYGhhbmRsZU1vZGlmaWVkQXNzZXRzYFxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIHJlc3RvcmUgdGhlc2UgYWxyZWFkeSBtb2RpZmllZCBmaWxlczogJHtcbiAgICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLm1hcChmaWxlID0+IGAnJHtmaWxlLm5hbWV9J2ApXG4gICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRhdGFQYXRoIG9mIGRhdGFQYXRocykge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hcHAuZ2V0U3RvcmFnZShhc3NldHNbZGF0YVBhdGhdLnN0b3JhZ2UpXG4gICAgICAgIGNvbnN0IGJlZm9yZUZpbGVzID0gYmVmb3JlRmlsZXNQZXJEYXRhUGF0aFtkYXRhUGF0aF0gfHwgW11cbiAgICAgICAgY29uc3QgYWZ0ZXJGaWxlcyA9IGFmdGVyRmlsZXNQZXJEYXRhUGF0aFtkYXRhUGF0aF0gfHwgW11cbiAgICAgICAgY29uc3QgYmVmb3JlQnlLZXkgPSBtYXBGaWxlc0J5S2V5KGJlZm9yZUZpbGVzKVxuICAgICAgICBjb25zdCBhZnRlckJ5S2V5ID0gbWFwRmlsZXNCeUtleShhZnRlckZpbGVzKVxuICAgICAgICBjb25zdCByZW1vdmVkRmlsZXMgPSBiZWZvcmVGaWxlcy5maWx0ZXIoZmlsZSA9PiAhYWZ0ZXJCeUtleVtmaWxlLmtleV0pXG4gICAgICAgIGNvbnN0IGFkZGVkRmlsZXMgPSBhZnRlckZpbGVzLmZpbHRlcihmaWxlID0+ICFiZWZvcmVCeUtleVtmaWxlLmtleV0pXG4gICAgICAgIC8vIEFsc28gaGFuZGxlIG1vZGlmaWVkIGZpbGVzLCB3aGljaCBhcmUgZmlsZXMgd2hlcmUgdGhlIGRhdGEgcHJvcGVydHlcbiAgICAgICAgLy8gaXMgY2hhbmdlZCBiZWZvcmUgdXBkYXRlIC8gcGF0Y2gsIG1lYW50aW5nIHRoZSBmaWxlIGlzIGNoYW5nZWQuXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGNvbnRlbnQgZm9yIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBpdCxcbiAgICAgICAgLy8gYW5kIHRodXMgc2hvdWxkIG9ubHkgcmVhbGx5IGJlIHVzZWQgd2hlbiB0aGVyZSdzIG9ubHkgb25lIHJlZmVyZW5jZS5cbiAgICAgICAgY29uc3QgbW9kaWZpZWRGaWxlcyA9IGFmdGVyRmlsZXMuZmlsdGVyKFxuICAgICAgICAgIGZpbGUgPT4gZmlsZS5kYXRhICYmIGJlZm9yZUJ5S2V5W2ZpbGUua2V5XVxuICAgICAgICApXG4gICAgICAgIGltcG9ydGVkRmlsZXMucHVzaChcbiAgICAgICAgICAuLi5hd2FpdCB0aGlzLmFwcC5oYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgIGFkZGVkRmlsZXMsXG4gICAgICAgICAgICByZW1vdmVkRmlsZXMsXG4gICAgICAgICAgICB0cmFuc2FjdGlvblxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goXG4gICAgICAgICAgLi4uYXdhaXQgdGhpcy5hcHAuaGFuZGxlTW9kaWZpZWRBc3NldHMoXG4gICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgbW9kaWZpZWRGaWxlcyxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5FdmVudEVtaXR0ZXIubWl4aW4oTW9kZWwpXG5LbmV4SGVscGVyLm1peGluKE1vZGVsKVxuLy8gRXhwb3NlIGEgc2VsZWN0aW9uIG9mIFF1ZXJ5QnVpbGRlciBtZXRob2RzIGFzIHN0YXRpYyBtZXRob2RzIG9uIG1vZGVsIGNsYXNzZXNcblF1ZXJ5QnVpbGRlci5taXhpbihNb2RlbClcblxuY29uc3QgbWV0YU1hcCA9IG5ldyBXZWFrTWFwKClcblxuZnVuY3Rpb24gZ2V0TWV0YShtb2RlbENsYXNzLCBrZXksIHZhbHVlKSB7XG4gIGxldCBtZXRhID0gbWV0YU1hcC5nZXQobW9kZWxDbGFzcylcbiAgaWYgKCFtZXRhKSB7XG4gICAgbWV0YU1hcC5zZXQobW9kZWxDbGFzcywgbWV0YSA9IHt9KVxuICB9XG4gIGlmICghKGtleSBpbiBtZXRhKSkge1xuICAgIG1ldGFba2V5XSA9IGlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlXG4gIH1cbiAgcmV0dXJuIG1ldGFba2V5XVxufVxuXG5mdW5jdGlvbiBsb2FkQXNzZXREYXRhUGF0aHMocXVlcnksIGRhdGFQYXRocykge1xuICByZXR1cm4gZGF0YVBhdGhzLnJlZHVjZShcbiAgICAocXVlcnksIGRhdGFQYXRoKSA9PiBxdWVyeS5sb2FkRGF0YVBhdGgoZGF0YVBhdGgpLFxuICAgIHF1ZXJ5XG4gIClcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVBdEFzc2V0RGF0YVBhdGgoaXRlbSwgcGF0aCkge1xuICByZXR1cm4gZ2V0VmFsdWVBdERhdGFQYXRoKGl0ZW0sIHBhdGgsICgpID0+IHVuZGVmaW5lZClcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZXNQZXJBc3NldERhdGFQYXRoKGl0ZW1zLCBkYXRhUGF0aHMpIHtcbiAgcmV0dXJuIGRhdGFQYXRocy5yZWR1Y2UoXG4gICAgKGFsbEZpbGVzLCBkYXRhUGF0aCkgPT4ge1xuICAgICAgYWxsRmlsZXNbZGF0YVBhdGhdID0gYXNBcnJheShpdGVtcykucmVkdWNlKFxuICAgICAgICAoZmlsZXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXNBcnJheShnZXRWYWx1ZUF0QXNzZXREYXRhUGF0aChpdGVtLCBkYXRhUGF0aCkpXG4gICAgICAgICAgLy8gVXNlIGZsYXR0ZW4oKSBhcyBkYXRhUGF0aCBtYXkgY29udGFpbiB3aWxkY2FyZHMsIHJlc3VsdGluZyBpblxuICAgICAgICAgIC8vIG5lc3RlZCBmaWxlcyBhcnJheXMuXG4gICAgICAgICAgZmlsZXMucHVzaCguLi5mbGF0dGVuKGRhdGEpLmZpbHRlcihmaWxlID0+ICEhZmlsZSkpXG4gICAgICAgICAgcmV0dXJuIGZpbGVzXG4gICAgICAgIH0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgICByZXR1cm4gYWxsRmlsZXNcbiAgICB9LFxuICAgIHt9XG4gIClcbn1cblxuZnVuY3Rpb24gbWFwRmlsZXNCeUtleShmaWxlcykge1xuICByZXR1cm4gZmlsZXMucmVkdWNlKFxuICAgIChtYXAsIGZpbGUpID0+IHtcbiAgICAgIG1hcFtmaWxlLmtleV0gPSBmaWxlXG4gICAgICByZXR1cm4gbWFwXG4gICAgfSxcbiAgICB7fVxuICApXG59XG4iXX0=
@@ -3,6 +3,14 @@
3
3
  exports.__esModule = true;
4
4
  exports.default = filters;
5
5
 
6
+ require("core-js/modules/es.error.cause.js");
7
+
8
+ require("core-js/modules/esnext.async-iterator.filter.js");
9
+
10
+ require("core-js/modules/esnext.iterator.constructor.js");
11
+
12
+ require("core-js/modules/esnext.iterator.filter.js");
13
+
6
14
  var _utils = require("@ditojs/utils");
7
15
 
8
16
  var _query = require("../../query");
@@ -90,4 +98,4 @@ function wrapWithValidation(filter, name, app) {
90
98
 
91
99
  return filter;
92
100
  }
93
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZGVmaW5pdGlvbnMvZmlsdGVycy5qcyJdLCJuYW1lcyI6WyJmaWx0ZXJzIiwidmFsdWVzIiwibmFtZSIsImRlZmluaXRpb24iLCJPYmplY3QiLCJlbnRyaWVzIiwiZmlsdGVyIiwiY29udmVydE9iamVjdEZpbHRlciIsIkVycm9yIiwid3JhcFdpdGhWYWxpZGF0aW9uIiwiYXBwIiwicHJvcGVydGllcyIsImFkZEZ1bmN0aW9uU2V0dGluZ3MiLCJxdWVyeUZpbHRlciIsIlF1ZXJ5RmlsdGVycyIsImdldCIsImZ1bmMiLCJxdWVyeSIsImFyZ3MiLCJwcm9wZXJ0eSIsIm9yV2hlcmUiLCJwYXJhbWV0ZXJzIiwidmFsaWRhdGUiLCJkYXRhTmFtZSIsInZhbGlkYXRvciIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwib2JqZWN0IiwiaW5kZXgiLCJsaXN0IiwiZXJyb3IiLCJjcmVhdGVWYWxpZGF0aW9uRXJyb3IiLCJ0eXBlIiwibWVzc2FnZSIsImVycm9ycyIsInByZWZpeERhdGFQYXRocyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFZSxTQUFTQSxPQUFULENBQWlCQyxNQUFqQixFQUF5QjtBQUN0QyxRQUFNRCxPQUFPLEdBQUcsRUFBaEI7O0FBQ0EsT0FBSyxNQUFNLENBQUNFLElBQUQsRUFBT0MsVUFBUCxDQUFYLElBQWlDQyxNQUFNLENBQUNDLE9BQVAsQ0FBZSwyQkFBY0osTUFBZCxDQUFmLENBQWpDLEVBQXdFO0FBQ3RFLFVBQU1LLE1BQU0sR0FBRyx1QkFBV0gsVUFBWCxJQUNYQSxVQURXLEdBRVgscUJBQVNBLFVBQVQsSUFDRUksbUJBQW1CLENBQUNKLFVBQUQsRUFBYUQsSUFBYixDQURyQixHQUVFLElBSk47O0FBS0EsUUFBSSxDQUFDSSxNQUFMLEVBQWE7QUFDWCxZQUFNLElBQUlFLEtBQUosQ0FDSCxtQkFBa0JOLElBQUssK0JBQThCQyxVQUFXLEdBRDdELENBQU47QUFHRDs7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QUNjLFNBQUosQ0FBY1UsZUFBZCxDQUNOTCxLQUFLLENBQUNJLE1BREEsRUFFTCxJQUFHL0IsSUFBSyxFQUZIO0FBSnNCLFNBQTFCLENBQU47QUFTRDs7QUFDRCxhQUFPSSxNQUFNLENBQUNXLEtBQUQsRUFBUSxHQUFHQyxJQUFYLENBQWI7QUFDRCxLQXZCRDtBQXdCRDs7QUFFRCxTQUFPWixNQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc09iamVjdCwgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBRdWVyeUZpbHRlcnMgfSBmcm9tICdAL3F1ZXJ5J1xuaW1wb3J0IHsgbWVyZ2VSZXZlcnNlZCB9IGZyb20gJ0AvdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbHRlcnModmFsdWVzKSB7XG4gIGNvbnN0IGZpbHRlcnMgPSB7fVxuICBmb3IgKGNvbnN0IFtuYW1lLCBkZWZpbml0aW9uXSBvZiBPYmplY3QuZW50cmllcyhtZXJnZVJldmVyc2VkKHZhbHVlcykpKSB7XG4gICAgY29uc3QgZmlsdGVyID0gaXNGdW5jdGlvbihkZWZpbml0aW9uKVxuICAgICAgPyBkZWZpbml0aW9uXG4gICAgICA6IGlzT2JqZWN0KGRlZmluaXRpb24pXG4gICAgICAgID8gY29udmVydE9iamVjdEZpbHRlcihkZWZpbml0aW9uLCBuYW1lKVxuICAgICAgICA6IG51bGxcbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBmaWx0ZXIgJyR7bmFtZX0nOiBVbnJlY29nbml6ZWQgZGVmaW5pdGlvbjogJHtkZWZpbml0aW9ufS5gXG4gICAgICApXG4gICAgfVxuICAgIGZpbHRlcnNbbmFtZV0gPSB3cmFwV2l0aFZhbGlkYXRpb24oZmlsdGVyLCBuYW1lLCB0aGlzLmFwcClcbiAgfVxuICByZXR1cm4gZmlsdGVyc1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2JqZWN0RmlsdGVyKGRlZmluaXRpb24sIG5hbWUpIHtcbiAgY29uc3QgeyBmaWx0ZXIsIHByb3BlcnRpZXMgfSA9IGRlZmluaXRpb25cbiAgaWYgKGlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBhZGRGdW5jdGlvblNldHRpbmdzKGZpbHRlciwgZGVmaW5pdGlvbilcbiAgfSBlbHNlIHtcbiAgICAvLyBDb252ZXJ0IFF1ZXJ5RmlsdGVycyB0byBub3JtYWwgZmlsdGVyIGZ1bmN0aW9uc1xuICAgIGNvbnN0IHF1ZXJ5RmlsdGVyID0gUXVlcnlGaWx0ZXJzLmdldChmaWx0ZXIpXG4gICAgaWYgKCFxdWVyeUZpbHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBmaWx0ZXIgJyR7bmFtZX0nOiBVbmtub3duIGZpbHRlciB0eXBlICcke2ZpbHRlcn0nLmBcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3QgZnVuYyA9IHByb3BlcnRpZXNcbiAgICAgID8gKHF1ZXJ5LCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGZpbHRlciBwcm92aWRlcyBtdWx0aXBsZSBwcm9wZXJ0aWVzLCBtYXRjaCB0aGVtXG4gICAgICAgIC8vIGFsbCwgYnV0IGNvbWJpbmUgdGhlIGV4cHJlc3Npb25zIHdpdGggT1IuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgICAgICAgIHF1ZXJ5Lm9yV2hlcmUocXVlcnkgPT4gcXVlcnlGaWx0ZXIocXVlcnksIHByb3BlcnR5LCAuLi5hcmdzKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgOiAocXVlcnksIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcXVlcnlGaWx0ZXIocXVlcnksIG5hbWUsIC4uLmFyZ3MpXG4gICAgICB9XG4gICAgcmV0dXJuIGFkZEZ1bmN0aW9uU2V0dGluZ3MoZnVuYywgcXVlcnlGaWx0ZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRnVuY3Rpb25TZXR0aW5ncyhmaWx0ZXIsIGRlZmluaXRpb24pIHtcbiAgLy8gQ29weSBvdmVyIEBwYXJhbWV0ZXJzKCkgYW5kIEB2YWxpZGF0ZSgpIHNldHRpbmdzXG4gIGZpbHRlci5wYXJhbWV0ZXJzID0gZGVmaW5pdGlvbi5wYXJhbWV0ZXJzXG4gIGZpbHRlci52YWxpZGF0ZSA9IGRlZmluaXRpb24udmFsaWRhdGVcbiAgcmV0dXJuIGZpbHRlclxufVxuXG5mdW5jdGlvbiB3cmFwV2l0aFZhbGlkYXRpb24oZmlsdGVyLCBuYW1lLCBhcHApIHtcbiAgLy8gSWYgcGFyYW1ldGVycyBhcmUgZGVmaW5lZCwgd3JhcCB0aGUgZnVuY3Rpb24gaW4gYSBjbG9zdXJlIHRoYXRcbiAgLy8gcGVyZm9ybXMgcGFyYW1ldGVyIHZhbGlkYXRpb24uLi5cbiAgY29uc3QgZGF0YU5hbWUgPSAncXVlcnknXG4gIGNvbnN0IHZhbGlkYXRvciA9IGZpbHRlciAmJiBhcHAuY29tcGlsZVBhcmFtZXRlcnNWYWxpZGF0b3IoXG4gICAgZmlsdGVyLnBhcmFtZXRlcnMsXG4gICAgeyAuLi5maWx0ZXIudmFsaWRhdGUsIGRhdGFOYW1lIH1cbiAgKVxuICBpZiAodmFsaWRhdG9yPy52YWxpZGF0ZSkge1xuICAgIHJldHVybiAocXVlcnksIC4uLmFyZ3MpID0+IHtcbiAgICAgIC8vIENvbnZlcnQgYXJncyB0byBvYmplY3QgZm9yIHZhbGlkYXRpb246XG4gICAgICBjb25zdCBvYmplY3QgPSB7fVxuICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgZm9yIChjb25zdCB7IG5hbWUgfSBvZiB2YWxpZGF0b3IubGlzdCkge1xuICAgICAgICAvLyBVc2UgZGF0YU5hbWUgaWYgbm8gbmFtZSBpcyBnaXZlbiwgc2VlOlxuICAgICAgICAvLyBBcHBsaWNhdGlvbi5jb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcigpXG4gICAgICAgIG9iamVjdFtuYW1lIHx8IGRhdGFOYW1lXSA9IGFyZ3NbaW5kZXgrK11cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShvYmplY3QpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBhcHAuY3JlYXRlVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgICAgICB0eXBlOiAnRmlsdGVyVmFsaWRhdGlvbicsXG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgIGBUaGUgcHJvdmlkZWQgZGF0YSBmb3IgcXVlcnkgZmlsdGVyICcke25hbWV9JyBpcyBub3QgdmFsaWRgLFxuICAgICAgICAgIGVycm9yczogYXBwLnZhbGlkYXRvci5wcmVmaXhEYXRhUGF0aHMoXG4gICAgICAgICAgICBlcnJvci5lcnJvcnMsXG4gICAgICAgICAgICBgLiR7bmFtZX1gXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbHRlcihxdWVyeSwgLi4uYXJncylcbiAgICB9XG4gIH1cbiAgLy8gLi4ub3RoZXJ3aXNlIHVzZSB0aGUgZGVmaW5lZCBmaWx0ZXIgZnVuY3Rpb24gdW5tb2RpZmllZC5cbiAgcmV0dXJuIGZpbHRlclxufVxuIl19
101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZGVmaW5pdGlvbnMvZmlsdGVycy5qcyJdLCJuYW1lcyI6WyJmaWx0ZXJzIiwidmFsdWVzIiwibmFtZSIsImRlZmluaXRpb24iLCJPYmplY3QiLCJlbnRyaWVzIiwiZmlsdGVyIiwiY29udmVydE9iamVjdEZpbHRlciIsIkVycm9yIiwid3JhcFdpdGhWYWxpZGF0aW9uIiwiYXBwIiwicHJvcGVydGllcyIsImFkZEZ1bmN0aW9uU2V0dGluZ3MiLCJxdWVyeUZpbHRlciIsIlF1ZXJ5RmlsdGVycyIsImdldCIsImZ1bmMiLCJxdWVyeSIsImFyZ3MiLCJwcm9wZXJ0eSIsIm9yV2hlcmUiLCJwYXJhbWV0ZXJzIiwidmFsaWRhdGUiLCJkYXRhTmFtZSIsInZhbGlkYXRvciIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwib2JqZWN0IiwiaW5kZXgiLCJsaXN0IiwiZXJyb3IiLCJjcmVhdGVWYWxpZGF0aW9uRXJyb3IiLCJ0eXBlIiwibWVzc2FnZSIsImVycm9ycyIsInByZWZpeERhdGFQYXRocyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUVlLFNBQVNBLE9BQVQsQ0FBaUJDLE1BQWpCLEVBQXlCO0FBQ3RDLFFBQU1ELE9BQU8sR0FBRyxFQUFoQjs7QUFDQSxPQUFLLE1BQU0sQ0FBQ0UsSUFBRCxFQUFPQyxVQUFQLENBQVgsSUFBaUNDLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlLDJCQUFjSixNQUFkLENBQWYsQ0FBakMsRUFBd0U7QUFDdEUsVUFBTUssTUFBTSxHQUFHLHVCQUFXSCxVQUFYLElBQ1hBLFVBRFcsR0FFWCxxQkFBU0EsVUFBVCxJQUNFSSxtQkFBbUIsQ0FBQ0osVUFBRCxFQUFhRCxJQUFiLENBRHJCLEdBRUUsSUFKTjs7QUFLQSxRQUFJLENBQUNJLE1BQUwsRUFBYTtBQUNYLFlBQU0sSUFBSUUsS0FBSixDQUNILG1CQUFrQk4sSUFBSywrQkFBOEJDLFVBQVcsR0FEN0QsQ0FB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LEdBQUcsQ0FBQ2MsU0FBSixDQUFjVSxlQUFkLENBQ05MLEtBQUssQ0FBQ0ksTUFEQSxFQUVMLElBQUcvQixJQUFLLEVBRkg7QUFKc0IsU0FBMUIsQ0FBTjtBQVNEOztBQUNELGFBQU9JLE1BQU0sQ0FBQ1csS0FBRCxFQUFRLEdBQUdDLElBQVgsQ0FBYjtBQUNELEtBdkJEO0FBd0JEOztBQUVELFNBQU9aLE1BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzT2JqZWN0LCBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IFF1ZXJ5RmlsdGVycyB9IGZyb20gJ0AvcXVlcnknXG5pbXBvcnQgeyBtZXJnZVJldmVyc2VkIH0gZnJvbSAnQC91dGlscydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmlsdGVycyh2YWx1ZXMpIHtcbiAgY29uc3QgZmlsdGVycyA9IHt9XG4gIGZvciAoY29uc3QgW25hbWUsIGRlZmluaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKG1lcmdlUmV2ZXJzZWQodmFsdWVzKSkpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSBpc0Z1bmN0aW9uKGRlZmluaXRpb24pXG4gICAgICA/IGRlZmluaXRpb25cbiAgICAgIDogaXNPYmplY3QoZGVmaW5pdGlvbilcbiAgICAgICAgPyBjb252ZXJ0T2JqZWN0RmlsdGVyKGRlZmluaXRpb24sIG5hbWUpXG4gICAgICAgIDogbnVsbFxuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGZpbHRlciAnJHtuYW1lfSc6IFVucmVjb2duaXplZCBkZWZpbml0aW9uOiAke2RlZmluaXRpb259LmBcbiAgICAgIClcbiAgICB9XG4gICAgZmlsdGVyc1tuYW1lXSA9IHdyYXBXaXRoVmFsaWRhdGlvbihmaWx0ZXIsIG5hbWUsIHRoaXMuYXBwKVxuICB9XG4gIHJldHVybiBmaWx0ZXJzXG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRPYmplY3RGaWx0ZXIoZGVmaW5pdGlvbiwgbmFtZSkge1xuICBjb25zdCB7IGZpbHRlciwgcHJvcGVydGllcyB9ID0gZGVmaW5pdGlvblxuICBpZiAoaXNGdW5jdGlvbihmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGFkZEZ1bmN0aW9uU2V0dGluZ3MoZmlsdGVyLCBkZWZpbml0aW9uKVxuICB9IGVsc2Uge1xuICAgIC8vIENvbnZlcnQgUXVlcnlGaWx0ZXJzIHRvIG5vcm1hbCBmaWx0ZXIgZnVuY3Rpb25zXG4gICAgY29uc3QgcXVlcnlGaWx0ZXIgPSBRdWVyeUZpbHRlcnMuZ2V0KGZpbHRlcilcbiAgICBpZiAoIXF1ZXJ5RmlsdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGZpbHRlciAnJHtuYW1lfSc6IFVua25vd24gZmlsdGVyIHR5cGUgJyR7ZmlsdGVyfScuYFxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBmdW5jID0gcHJvcGVydGllc1xuICAgICAgPyAocXVlcnksIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgLy8gV2hlbiB0aGUgZmlsdGVyIHByb3ZpZGVzIG11bHRpcGxlIHByb3BlcnRpZXMsIG1hdGNoIHRoZW1cbiAgICAgICAgLy8gYWxsLCBidXQgY29tYmluZSB0aGUgZXhwcmVzc2lvbnMgd2l0aCBPUi5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgcXVlcnkub3JXaGVyZShxdWVyeSA9PiBxdWVyeUZpbHRlcihxdWVyeSwgcHJvcGVydHksIC4uLmFyZ3MpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICA6IChxdWVyeSwgLi4uYXJncykgPT4ge1xuICAgICAgICBxdWVyeUZpbHRlcihxdWVyeSwgbmFtZSwgLi4uYXJncylcbiAgICAgIH1cbiAgICByZXR1cm4gYWRkRnVuY3Rpb25TZXR0aW5ncyhmdW5jLCBxdWVyeUZpbHRlcilcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRGdW5jdGlvblNldHRpbmdzKGZpbHRlciwgZGVmaW5pdGlvbikge1xuICAvLyBDb3B5IG92ZXIgQHBhcmFtZXRlcnMoKSBhbmQgQHZhbGlkYXRlKCkgc2V0dGluZ3NcbiAgZmlsdGVyLnBhcmFtZXRlcnMgPSBkZWZpbml0aW9uLnBhcmFtZXRlcnNcbiAgZmlsdGVyLnZhbGlkYXRlID0gZGVmaW5pdGlvbi52YWxpZGF0ZVxuICByZXR1cm4gZmlsdGVyXG59XG5cbmZ1bmN0aW9uIHdyYXBXaXRoVmFsaWRhdGlvbihmaWx0ZXIsIG5hbWUsIGFwcCkge1xuICAvLyBJZiBwYXJhbWV0ZXJzIGFyZSBkZWZpbmVkLCB3cmFwIHRoZSBmdW5jdGlvbiBpbiBhIGNsb3N1cmUgdGhhdFxuICAvLyBwZXJmb3JtcyBwYXJhbWV0ZXIgdmFsaWRhdGlvbi4uLlxuICBjb25zdCBkYXRhTmFtZSA9ICdxdWVyeSdcbiAgY29uc3QgdmFsaWRhdG9yID0gZmlsdGVyICYmIGFwcC5jb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcihcbiAgICBmaWx0ZXIucGFyYW1ldGVycyxcbiAgICB7IC4uLmZpbHRlci52YWxpZGF0ZSwgZGF0YU5hbWUgfVxuICApXG4gIGlmICh2YWxpZGF0b3I/LnZhbGlkYXRlKSB7XG4gICAgcmV0dXJuIChxdWVyeSwgLi4uYXJncykgPT4ge1xuICAgICAgLy8gQ29udmVydCBhcmdzIHRvIG9iamVjdCBmb3IgdmFsaWRhdGlvbjpcbiAgICAgIGNvbnN0IG9iamVjdCA9IHt9XG4gICAgICBsZXQgaW5kZXggPSAwXG4gICAgICBmb3IgKGNvbnN0IHsgbmFtZSB9IG9mIHZhbGlkYXRvci5saXN0KSB7XG4gICAgICAgIC8vIFVzZSBkYXRhTmFtZSBpZiBubyBuYW1lIGlzIGdpdmVuLCBzZWU6XG4gICAgICAgIC8vIEFwcGxpY2F0aW9uLmNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yKClcbiAgICAgICAgb2JqZWN0W25hbWUgfHwgZGF0YU5hbWVdID0gYXJnc1tpbmRleCsrXVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKG9iamVjdClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGFwcC5jcmVhdGVWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgICAgIHR5cGU6ICdGaWx0ZXJWYWxpZGF0aW9uJyxcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgYFRoZSBwcm92aWRlZCBkYXRhIGZvciBxdWVyeSBmaWx0ZXIgJyR7bmFtZX0nIGlzIG5vdCB2YWxpZGAsXG4gICAgICAgICAgZXJyb3JzOiBhcHAudmFsaWRhdG9yLnByZWZpeERhdGFQYXRocyhcbiAgICAgICAgICAgIGVycm9yLmVycm9ycyxcbiAgICAgICAgICAgIGAuJHtuYW1lfWBcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyKHF1ZXJ5LCAuLi5hcmdzKVxuICAgIH1cbiAgfVxuICAvLyAuLi5vdGhlcndpc2UgdXNlIHRoZSBkZWZpbmVkIGZpbHRlciBmdW5jdGlvbiB1bm1vZGlmaWVkLlxuICByZXR1cm4gZmlsdGVyXG59XG4iXX0=