@coolon/angular-ui-powerups 0.0.50 → 0.0.53

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 (38) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +392 -745
  2. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  3. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  5. package/coolon-angular-ui-powerups.metadata.json +1 -1
  6. package/esm2015/coolon-angular-ui-powerups.js +2 -2
  7. package/esm2015/index.js +2 -2
  8. package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +2 -2
  9. package/esm2015/lib/place/guards/place-route.guard.js +2 -2
  10. package/esm2015/lib/place/index.js +2 -2
  11. package/esm2015/lib/place/route/parameter-definition.class.js +17 -36
  12. package/esm2015/lib/place/route/parameter-sanitiser.js +3 -4
  13. package/esm2015/lib/place/route/parameter-snapshot.js +66 -208
  14. package/esm2015/lib/place/route/route-parameter-value.js +223 -0
  15. package/esm2015/public_api.js +2 -2
  16. package/esm5/coolon-angular-ui-powerups.js +2 -2
  17. package/esm5/index.js +2 -2
  18. package/esm5/lib/place/components/place-outlet/place-outlet.component.js +2 -2
  19. package/esm5/lib/place/guards/place-route.guard.js +2 -2
  20. package/esm5/lib/place/index.js +2 -2
  21. package/esm5/lib/place/route/parameter-definition.class.js +18 -45
  22. package/esm5/lib/place/route/parameter-sanitiser.js +3 -4
  23. package/esm5/lib/place/route/parameter-snapshot.js +73 -273
  24. package/esm5/lib/place/route/route-parameter-value.js +309 -0
  25. package/esm5/public_api.js +2 -2
  26. package/fesm2015/coolon-angular-ui-powerups.js +304 -537
  27. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  28. package/fesm5/coolon-angular-ui-powerups.js +394 -746
  29. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  30. package/lib/place/index.d.ts +1 -1
  31. package/lib/place/route/parameter-definition.class.d.ts +2 -2
  32. package/lib/place/route/parameter-sanitiser.d.ts +2 -2
  33. package/lib/place/route/parameter-snapshot.d.ts +6 -27
  34. package/lib/place/route/route-parameter-value.d.ts +42 -0
  35. package/package.json +1 -1
  36. package/esm2015/lib/place/route/route-parameter-sanitiser.js +0 -296
  37. package/esm5/lib/place/route/route-parameter-sanitiser.js +0 -435
  38. package/lib/place/route/route-parameter-sanitiser.d.ts +0 -44
@@ -3,15 +3,14 @@
3
3
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
4
  */
5
5
  import * as tslib_1 from "tslib";
6
- import { Injector } from '@angular/core';
7
6
  import { Trace } from '@coolon/pectin';
8
7
  import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
9
- import _ from 'lodash';
10
8
  import { ParameterDefinition } from './parameter-definition.class';
9
+ import { RouteParameterValue } from './route-parameter-value';
11
10
  var ParameterSnapshot = /** @class */ (function () {
12
- function ParameterSnapshot(placeDefinition, resolved) {
11
+ function ParameterSnapshot(placeDefinition, parameters) {
13
12
  this.placeDefinition = placeDefinition;
14
- this.resolved = resolved;
13
+ this.parameters = parameters;
15
14
  }
16
15
  /**
17
16
  * @param {?} other
@@ -26,18 +25,18 @@ var ParameterSnapshot = /** @class */ (function () {
26
25
  function (other, debug) {
27
26
  if (debug === void 0) { debug = false; }
28
27
  /** @type {?} */
29
- var changed = this.resolved.find((/**
28
+ var changed = this.parameters.find((/**
30
29
  * @param {?} r
31
30
  * @return {?}
32
31
  */
33
32
  function (r) {
34
- return !r.isSame(other.getValueOf(r.parameterDef));
33
+ return r.hasChanged(other.getValueOf(r.definition));
35
34
  }));
36
35
  if (changed && debug) {
37
36
  console.log({
38
- name: changed.parameterDef.name,
37
+ name: changed.definition.name,
39
38
  mine: changed.value,
40
- theirs: other.getValueOf(changed.parameterDef)
39
+ theirs: other.getValueOf(changed.definition)
41
40
  });
42
41
  }
43
42
  return !!changed;
@@ -53,11 +52,11 @@ var ParameterSnapshot = /** @class */ (function () {
53
52
  * @return {?}
54
53
  */
55
54
  function (parameterDef) {
56
- return this.resolved.find((/**
55
+ return this.parameters.find((/**
57
56
  * @param {?} r
58
57
  * @return {?}
59
58
  */
60
- function (r) { return r.parameterDef === parameterDef; }));
59
+ function (r) { return r.definition === parameterDef; }));
61
60
  };
62
61
  /**
63
62
  * @template T, S
@@ -93,11 +92,11 @@ var ParameterSnapshot = /** @class */ (function () {
93
92
  */
94
93
  function (name) {
95
94
  /** @type {?} */
96
- var resolvedParameter = this.resolved.find((/**
95
+ var resolvedParameter = this.parameters.find((/**
97
96
  * @param {?} r
98
97
  * @return {?}
99
98
  */
100
- function (r) { return r.parameterDef.name === name; }));
99
+ function (r) { return r.definition.name === name; }));
101
100
  return resolvedParameter ? resolvedParameter.value : null;
102
101
  };
103
102
  /**
@@ -111,11 +110,11 @@ var ParameterSnapshot = /** @class */ (function () {
111
110
  function () {
112
111
  // RouteId's are never arrays: see parameter-decorators.ts createDefinition methods. It would be nice to
113
112
  // capture this in the type system though
114
- return (/** @type {?} */ (this.resolved.find((/**
113
+ return (/** @type {?} */ (this.parameters.find((/**
115
114
  * @param {?} p
116
115
  * @return {?}
117
116
  */
118
- function (p) { return p.parameterDef.isRouteId; }))));
117
+ function (p) { return p.definition.isRouteId; }))));
119
118
  };
120
119
  /**
121
120
  * @private
@@ -126,11 +125,11 @@ var ParameterSnapshot = /** @class */ (function () {
126
125
  * @return {?}
127
126
  */
128
127
  function () {
129
- return this.resolved.filter((/**
128
+ return this.parameters.filter((/**
130
129
  * @param {?} r
131
130
  * @return {?}
132
131
  */
133
- function (r) { return !r.parameterDef.isRouteId; }));
132
+ function (r) { return !r.definition.isRouteId; }));
134
133
  };
135
134
  /**
136
135
  * @return {?}
@@ -152,6 +151,19 @@ var ParameterSnapshot = /** @class */ (function () {
152
151
  var routeIdParam = this.getRouteIdParameter();
153
152
  return routeIdParam ? routeIdParam.formattedValue() : null;
154
153
  };
154
+ /**
155
+ * @return {?}
156
+ */
157
+ ParameterSnapshot.prototype.getNonEmptyParameters = /**
158
+ * @return {?}
159
+ */
160
+ function () {
161
+ return this.parameters.filter((/**
162
+ * @param {?} p
163
+ * @return {?}
164
+ */
165
+ function (p) { return !p.isEmpty(); }));
166
+ };
155
167
  /**
156
168
  * @return {?}
157
169
  */
@@ -162,35 +174,35 @@ var ParameterSnapshot = /** @class */ (function () {
162
174
  /** @type {?} */
163
175
  var params = {};
164
176
  /** @type {?} */
165
- var routeIdParam = this.resolved.filter((/**
177
+ var routeIdParam = this.getNonEmptyParameters()
178
+ .filter((/**
166
179
  * @param {?} p
167
180
  * @return {?}
168
181
  */
169
- function (p) { return !p.parameterDef.isRouteId; })).forEach((/**
182
+ function (p) { return !p.definition.isRouteId; }))
183
+ .forEach((/**
170
184
  * @param {?} p
171
185
  * @return {?}
172
186
  */
173
- function (p) {
174
- params[p.parameterDef.name] = p.formattedValue();
175
- }));
187
+ function (p) { return params[p.definition.name] = p.formattedValue(); }));
176
188
  return params;
177
189
  };
178
190
  /**
179
191
  * @return {?}
180
192
  */
181
- ParameterSnapshot.prototype.getAllFormattedParameters = /**
193
+ ParameterSnapshot.prototype.getAllParameters = /**
182
194
  * @return {?}
183
195
  */
184
196
  function () {
185
197
  /** @type {?} */
186
198
  var params = {};
187
199
  /** @type {?} */
188
- var routeIdParam = this.resolved.forEach((/**
200
+ var routeIdParam = this.parameters.forEach((/**
189
201
  * @param {?} p
190
202
  * @return {?}
191
203
  */
192
204
  function (p) {
193
- params[p.parameterDef.name] = p.formattedValue();
205
+ params[p.definition.name] = p.value;
194
206
  }));
195
207
  return params;
196
208
  };
@@ -207,12 +219,12 @@ var ParameterSnapshot = /** @class */ (function () {
207
219
  * @return {?}
208
220
  */
209
221
  function (parameter, value) {
210
- return new ParameterSnapshot(this.placeDefinition, this.resolved.map((/**
222
+ return new ParameterSnapshot(this.placeDefinition, this.parameters.map((/**
211
223
  * @param {?} p
212
224
  * @return {?}
213
225
  */
214
226
  function (p) {
215
- return p.parameterDef === parameter ? p.replace(value) : p;
227
+ return p.definition === parameter ? p.replace(value) : p;
216
228
  })));
217
229
  };
218
230
  /**
@@ -234,10 +246,10 @@ var ParameterSnapshot = /** @class */ (function () {
234
246
  return [4 /*yield*/, routeId.sanitise(this, injector)];
235
247
  case 1:
236
248
  sanitisedValue = _a.sent();
237
- if (!routeId.isSame(sanitisedValue)) {
249
+ if (routeId.hasChanged(sanitisedValue)) {
238
250
  // if the route id has changed we redirect immediately as other
239
251
  // parameter sanitisers might use it.
240
- return [2 /*return*/, this.replace(routeId.parameterDef, sanitisedValue)];
252
+ return [2 /*return*/, this.replace(routeId.definition, sanitisedValue)];
241
253
  }
242
254
  _a.label = 2;
243
255
  case 2:
@@ -251,8 +263,8 @@ var ParameterSnapshot = /** @class */ (function () {
251
263
  return [4 /*yield*/, routeParameter.sanitise(this, injector)];
252
264
  case 4:
253
265
  sanitisedValue = _a.sent();
254
- if (!routeParameter.isSame(sanitisedValue)) {
255
- result = this.replace(routeParameter.parameterDef, sanitisedValue);
266
+ if (routeParameter.hasChanged(sanitisedValue)) {
267
+ result = result.replace(routeParameter.definition, sanitisedValue);
256
268
  }
257
269
  _a.label = 5;
258
270
  case 5:
@@ -263,12 +275,12 @@ var ParameterSnapshot = /** @class */ (function () {
263
275
  });
264
276
  });
265
277
  };
266
- var _a, _b;
278
+ var _a;
267
279
  tslib_1.__decorate([
268
280
  Memoize(),
269
281
  tslib_1.__metadata("design:type", Function),
270
282
  tslib_1.__metadata("design:paramtypes", [ParameterDefinition]),
271
- tslib_1.__metadata("design:returntype", ParameterSnapshot.ResolvedParameter)
283
+ tslib_1.__metadata("design:returntype", RouteParameterValue)
272
284
  ], ParameterSnapshot.prototype, "getParameter", null);
273
285
  tslib_1.__decorate([
274
286
  Memoize(),
@@ -286,7 +298,7 @@ var ParameterSnapshot = /** @class */ (function () {
286
298
  Memoize(),
287
299
  tslib_1.__metadata("design:type", Function),
288
300
  tslib_1.__metadata("design:paramtypes", []),
289
- tslib_1.__metadata("design:returntype", ParameterSnapshot.ResolvedValueParameter)
301
+ tslib_1.__metadata("design:returntype", RouteParameterValue.Scalar)
290
302
  ], ParameterSnapshot.prototype, "getRouteIdParameter", null);
291
303
  tslib_1.__decorate([
292
304
  Memoize(),
@@ -297,15 +309,9 @@ var ParameterSnapshot = /** @class */ (function () {
297
309
  tslib_1.__decorate([
298
310
  Trace(),
299
311
  tslib_1.__metadata("design:type", Function),
300
- tslib_1.__metadata("design:paramtypes", [ParameterDefinition, typeof (_b = typeof S !== "undefined" && S) === "function" ? _b : Object]),
301
- tslib_1.__metadata("design:returntype", ParameterSnapshot)
302
- ], ParameterSnapshot.prototype, "replace", null);
303
- tslib_1.__decorate([
304
- Trace(),
305
- tslib_1.__metadata("design:type", Function),
306
- tslib_1.__metadata("design:paramtypes", [Injector]),
307
- tslib_1.__metadata("design:returntype", Promise)
308
- ], ParameterSnapshot.prototype, "sanitise", null);
312
+ tslib_1.__metadata("design:paramtypes", []),
313
+ tslib_1.__metadata("design:returntype", void 0)
314
+ ], ParameterSnapshot.prototype, "getFormattedParameters", null);
309
315
  return ParameterSnapshot;
310
316
  }());
311
317
  export { ParameterSnapshot };
@@ -316,7 +322,7 @@ if (false) {
316
322
  * @type {?}
317
323
  * @private
318
324
  */
319
- ParameterSnapshot.prototype.resolved;
325
+ ParameterSnapshot.prototype.parameters;
320
326
  }
321
327
  (function (ParameterSnapshot) {
322
328
  /**
@@ -329,31 +335,11 @@ if (false) {
329
335
  /** @type {?} */
330
336
  var paramMap = new ConsolidatedParameterMap(params, urlSegments);
331
337
  /** @type {?} */
332
- var resolvedParameters = placeDef.getRouteParameters()
333
- .map((/**
338
+ var resolvedParameters = placeDef.getRouteParameters().map((/**
334
339
  * @param {?} def
335
340
  * @return {?}
336
341
  */
337
- function (def) {
338
- if (def.isArray) {
339
- /** @type {?} */
340
- var value = paramMap.has(def.name) ? paramMap.getAll(def.name).filter((/**
341
- * @param {?} s
342
- * @return {?}
343
- */
344
- function (s) { return !_.isEmpty(s); })).map((/**
345
- * @param {?} raw
346
- * @return {?}
347
- */
348
- function (raw) { return def.type.parse(raw); })) : null;
349
- return new ResolvedArrayParameter(def, value);
350
- }
351
- else {
352
- /** @type {?} */
353
- var value = paramMap.has(def.name) ? def.type.parse(paramMap.get(def.name)) : null;
354
- return new ResolvedValueParameter(def, value);
355
- }
356
- }));
342
+ function (def) { return RouteParameterValue.create(def, paramMap); }));
357
343
  return new ParameterSnapshot(placeDef, resolvedParameters);
358
344
  }
359
345
  ParameterSnapshot.create = create;
@@ -362,12 +348,7 @@ if (false) {
362
348
  * include the segment params in the paramMap as well as each segment returns an empty
363
349
  * param map even when `parameter`s has content.
364
350
  */
365
- var /**
366
- * This a work around for the fact that an activated route with multiple segments doesn't
367
- * include the segment params in the paramMap as well as each segment returns an empty
368
- * param map even when `parameter`s has content.
369
- */
370
- ConsolidatedParameterMap = /** @class */ (function () {
351
+ var ConsolidatedParameterMap = /** @class */ (function () {
371
352
  function ConsolidatedParameterMap(paramMap, urlSegments) {
372
353
  this.paramMaps = [paramMap].concat((urlSegments || []).map((/**
373
354
  * @param {?} s
@@ -424,6 +405,26 @@ if (false) {
424
405
  */
425
406
  function (m) { return m.has(name); }));
426
407
  };
408
+ Object.defineProperty(ConsolidatedParameterMap.prototype, "keys", {
409
+ get: /**
410
+ * @return {?}
411
+ */
412
+ function () {
413
+ return this.paramMaps.reduce((/**
414
+ * @param {?} result
415
+ * @param {?} params
416
+ * @return {?}
417
+ */
418
+ function (result, params) { return result.concat(params.keys); }), []);
419
+ },
420
+ enumerable: true,
421
+ configurable: true
422
+ });
423
+ tslib_1.__decorate([
424
+ Memoize(),
425
+ tslib_1.__metadata("design:type", Array),
426
+ tslib_1.__metadata("design:paramtypes", [])
427
+ ], ConsolidatedParameterMap.prototype, "keys", null);
427
428
  return ConsolidatedParameterMap;
428
429
  }());
429
430
  if (false) {
@@ -491,206 +492,5 @@ if (false) {
491
492
  */
492
493
  ParamMapAdapter.prototype.params;
493
494
  }
494
- /**
495
- * @abstract
496
- * @template T, S
497
- */
498
- var /**
499
- * @abstract
500
- * @template T, S
501
- */
502
- ResolvedParameter = /** @class */ (function () {
503
- function ResolvedParameter(parameterDef, value) {
504
- this.parameterDef = parameterDef;
505
- this.value = value;
506
- }
507
- /**
508
- * @return {?}
509
- */
510
- ResolvedParameter.prototype.isRouteId = /**
511
- * @return {?}
512
- */
513
- function () {
514
- return this.parameterDef.isRouteId;
515
- };
516
- /**
517
- * @param {?} visit
518
- * @param {?} injector
519
- * @return {?}
520
- */
521
- ResolvedParameter.prototype.sanitise = /**
522
- * @param {?} visit
523
- * @param {?} injector
524
- * @return {?}
525
- */
526
- function (visit, injector) {
527
- return tslib_1.__awaiter(this, void 0, void 0, function () {
528
- var sanitiser;
529
- return tslib_1.__generator(this, function (_a) {
530
- sanitiser = this.parameterDef.getSanitiser(injector);
531
- if (sanitiser) {
532
- return [2 /*return*/, sanitiser.sanitise(this.parameterDef, this.value, visit)];
533
- }
534
- else {
535
- return [2 /*return*/, this.value];
536
- }
537
- return [2 /*return*/];
538
- });
539
- });
540
- };
541
- return ResolvedParameter;
542
- }());
543
- ParameterSnapshot.ResolvedParameter = ResolvedParameter;
544
- if (false) {
545
- /** @type {?} */
546
- ResolvedParameter.prototype.parameterDef;
547
- /** @type {?} */
548
- ResolvedParameter.prototype.value;
549
- /**
550
- * @abstract
551
- * @param {?} dest
552
- * @return {?}
553
- */
554
- ResolvedParameter.prototype.injectRouteParam = function (dest) { };
555
- /**
556
- * @abstract
557
- * @param {?} otherValue
558
- * @return {?}
559
- */
560
- ResolvedParameter.prototype.isSame = function (otherValue) { };
561
- /**
562
- * @abstract
563
- * @return {?}
564
- */
565
- ResolvedParameter.prototype.formattedValue = function () { };
566
- /**
567
- * @abstract
568
- * @param {?} value
569
- * @return {?}
570
- */
571
- ResolvedParameter.prototype.replace = function (value) { };
572
- }
573
- /**
574
- * @template T
575
- */
576
- var /**
577
- * @template T
578
- */
579
- ResolvedValueParameter = /** @class */ (function (_super) {
580
- tslib_1.__extends(ResolvedValueParameter, _super);
581
- function ResolvedValueParameter() {
582
- return _super !== null && _super.apply(this, arguments) || this;
583
- }
584
- /**
585
- * @param {?} otherValue
586
- * @return {?}
587
- */
588
- ResolvedValueParameter.prototype.isSame = /**
589
- * @param {?} otherValue
590
- * @return {?}
591
- */
592
- function (otherValue) {
593
- return this.value === otherValue;
594
- };
595
- /**
596
- * @param {?} dest
597
- * @return {?}
598
- */
599
- ResolvedValueParameter.prototype.injectRouteParam = /**
600
- * @param {?} dest
601
- * @return {?}
602
- */
603
- function (dest) {
604
- dest[this.parameterDef.name] = this.parameterDef.type.format(this.value);
605
- };
606
- /**
607
- * @param {?} value
608
- * @return {?}
609
- */
610
- ResolvedValueParameter.prototype.replace = /**
611
- * @param {?} value
612
- * @return {?}
613
- */
614
- function (value) {
615
- return new ResolvedValueParameter(this.parameterDef, value);
616
- };
617
- /**
618
- * @return {?}
619
- */
620
- ResolvedValueParameter.prototype.formattedValue = /**
621
- * @return {?}
622
- */
623
- function () {
624
- return !_.isNil(this.value) ? this.parameterDef.type.format(this.value) : null;
625
- };
626
- return ResolvedValueParameter;
627
- }(ResolvedParameter));
628
- ParameterSnapshot.ResolvedValueParameter = ResolvedValueParameter;
629
- /**
630
- * @template T
631
- */
632
- var /**
633
- * @template T
634
- */
635
- ResolvedArrayParameter = /** @class */ (function (_super) {
636
- tslib_1.__extends(ResolvedArrayParameter, _super);
637
- function ResolvedArrayParameter() {
638
- return _super !== null && _super.apply(this, arguments) || this;
639
- }
640
- /**
641
- * @param {?} otherValue
642
- * @return {?}
643
- */
644
- ResolvedArrayParameter.prototype.isSame = /**
645
- * @param {?} otherValue
646
- * @return {?}
647
- */
648
- function (otherValue) {
649
- return _.isEqual(this.value, otherValue);
650
- };
651
- /**
652
- * @param {?} dest
653
- * @return {?}
654
- */
655
- ResolvedArrayParameter.prototype.injectRouteParam = /**
656
- * @param {?} dest
657
- * @return {?}
658
- */
659
- function (dest) {
660
- var _this = this;
661
- dest[this.parameterDef.name] = this.value.map((/**
662
- * @param {?} v
663
- * @return {?}
664
- */
665
- function (v) { return _this.parameterDef.type.format(v); }));
666
- };
667
- /**
668
- * @param {?} value
669
- * @return {?}
670
- */
671
- ResolvedArrayParameter.prototype.replace = /**
672
- * @param {?} value
673
- * @return {?}
674
- */
675
- function (value) {
676
- return new ResolvedArrayParameter(this.parameterDef, value);
677
- };
678
- /**
679
- * @return {?}
680
- */
681
- ResolvedArrayParameter.prototype.formattedValue = /**
682
- * @return {?}
683
- */
684
- function () {
685
- var _this = this;
686
- return this.value ? this.value.map((/**
687
- * @param {?} v
688
- * @return {?}
689
- */
690
- function (v) { return _this.parameterDef.type.format(v); })) : [];
691
- };
692
- return ResolvedArrayParameter;
693
- }(ResolvedParameter));
694
- ParameterSnapshot.ResolvedArrayParameter = ResolvedArrayParameter;
695
495
  })(ParameterSnapshot || (ParameterSnapshot = {}));
696
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL3BhcmFtZXRlci1zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRSxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFHdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbkU7SUFFRSwyQkFBcUIsZUFBZ0MsRUFBbUIsUUFBeUQ7UUFBNUcsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQW1CLGFBQVEsR0FBUixRQUFRLENBQWlEO0lBQ2pJLENBQUM7Ozs7OztJQUVELHNDQUFVOzs7OztJQUFWLFVBQVcsS0FBd0IsRUFBRSxLQUFhO1FBQWIsc0JBQUEsRUFBQSxhQUFhOztZQUMxQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJOzs7O1FBQUMsVUFBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxFQUFDO1FBQ0YsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ1YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSTtnQkFDL0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUNuQixNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO2FBQy9DLENB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RUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzQyxDQUFDOzs7OztRQUVELGlEQUFnQjs7OztRQUFoQixVQUFpQixJQUFRO1lBQXpCLGlCQUVDO1lBREMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHOzs7O1lBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWhDLENBQWdDLEVBQUMsQ0FBQztRQUN2RixDQUFDOzs7OztRQUVELHdDQUFPOzs7O1FBQVAsVUFBUSxLQUFVO1lBQ2hCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUM7Ozs7UUFFRCwrQ0FBYzs7O1FBQWQ7WUFBQSxpQkFFQztZQURDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHOzs7O1lBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWhDLENBQWdDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pGLENBQUM7UUFFSCw2QkFBQztJQUFELENBQUMsQUFsQkQsQ0FBK0MsaUJBQWlCLEdBa0IvRDtJQWxCWSx3Q0FBc0IseUJBa0JsQyxDQUFBO0FBRUgsQ0FBQyxFQXRJZ0IsaUJBQWlCLEtBQWpCLGlCQUFpQixRQXNJakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUGFyYW1NYXAsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgeyBNZW1vaXplIH0gZnJvbSAnQHR5cGVzY3JpcHQtcGx1cy9mYXN0LW1lbW9pemUtZGVjb3JhdG9yL2Rpc3Qvc3JjJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBQbGFjZURlZmluaXRpb24gfSBmcm9tICcuLi9wbGFjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7IFZpc2l0IH0gZnJvbSAnLi4vdmlzaXQnO1xuaW1wb3J0IHsgUGFyYW1ldGVyRGVmaW5pdGlvbiB9IGZyb20gJy4vcGFyYW1ldGVyLWRlZmluaXRpb24uY2xhc3MnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyU25hcHNob3QgaW1wbGVtZW50cyBWaXNpdCB7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcGxhY2VEZWZpbml0aW9uOiBQbGFjZURlZmluaXRpb24sIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQ6IFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkUGFyYW1ldGVyPGFueSwgYW55PltdKSB7XG4gIH1cblxuICBoYXNDaGFuZ2VkKG90aGVyOiBQYXJhbWV0ZXJTbmFwc2hvdCwgZGVidWcgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLnJlc29sdmVkLmZpbmQoKHIpID0+IHtcbiAgICAgIHJldHVybiAhci5pc1NhbWUob3RoZXIuZ2V0VmFsdWVPZihyLnBhcmFtZXRlckRlZikpO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkICYmIGRlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIG5hbWU6IGNoYW5nZWQucGFyYW1ldGVyRGVmLm5hbWUsXG4gICAgICAgIG1pbmU6IGNoYW5nZWQudmFsdWUsXG4gICAgICAgIHRoZWlyczogb3RoZXIuZ2V0VmFsdWVPZihjaGFuZ2VkLnBhcmFtZXRlckRlZilcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gISFjaGFuZ2VkO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRQYXJhbWV0ZXI8VCwgUz4ocGFyYW1ldGVyRGVmOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIFM+KTogUGFyYW1ldGVyU25hcHNob3QuUmVzb2x2ZWRQYXJhbWV0ZXI8VCwgUz4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkLmZpbmQociA9PiByLnBhcmFtZXRlckRlZiA9PT0gcGFyYW1ldGVyRGVmKTtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0VmFsdWVPZjxULCBTPihwYXJhbWV0ZXJEZWY6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4pOiBTIHtcbiAgICBjb25zdCByZXNvbHZlZFBhcmFtZXRlciA9IHRoaXMuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlckRlZik7XG4gICAgcmV0dXJuIHJlc29sdmVkUGFyYW1ldGVyID8gcmVzb2x2ZWRQYXJhbWV0ZXIudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgZ2V0Um91dGVJZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlcigpID8gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCkudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRQYXJhbWV0ZXJWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkUGFyYW1ldGVyID0gdGhpcy5yZXNvbHZlZC5maW5kKHIgPT4gci5wYXJhbWV0ZXJEZWYubmFtZSA9PT0gbmFtZSk7XG4gICAgcmV0dXJuIHJlc29sdmVkUGFyYW1ldGVyID8gcmVzb2x2ZWRQYXJhbWV0ZXIudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBwcml2YXRlIGdldFJvdXRlSWRQYXJhbWV0ZXIoKTogUGFyYW1ldGVyU25hcHNob3QuUmVzb2x2ZWRWYWx1ZVBhcmFtZXRlcjxhbnk+IHtcbiAgICAvLyBSb3V0ZUlkJ3MgYXJlIG5ldmVyIGFycmF5czogc2VlIHBhcmFtZXRlci1kZWNvcmF0b3JzLnRzIGNyZWF0ZURlZmluaXRpb24gbWV0aG9kcy4gSXQgd291bGQgYmUgbmljZSB0b1xuICAgIC8vIGNhcHR1cmUgdGhpcyBpbiB0aGUgdHlwZSBzeXN0ZW0gdGhvdWdoXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWQuZmluZChwID0+IHAucGFyYW1ldGVyRGVmLmlzUm91dGVJZCkgYXMgUGFyYW1ldGVyU25hcHNob3QuUmVzb2x2ZWRWYWx1ZVBhcmFtZXRlcjxhbnk+O1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBwcml2YXRlIGdldFJvdXRlUGFyYW1ldGVycygpOiBQYXJhbWV0ZXJTbmFwc2hvdC5SZXNvbHZlZFBhcmFtZXRlcjxhbnksIGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWQuZmlsdGVyKHIgPT4gIXIucGFyYW1ldGVyRGVmLmlzUm91dGVJZCk7XG4gIH1cblxuXG4gIGhhc1JvdXRlSWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gIH1cblxuICBnZXRGb3JtYXR0ZWRSb3V0ZUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtID0gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gICAgcmV0dXJuIHJvdXRlSWRQYXJhbSA/IHJvdXRlSWRQYXJhbS5mb3JtYXR0ZWRWYWx1ZSgpIDogbnVsbDtcbiAgfVxuXG4gIGdldEZvcm1hdHRlZFBhcmFtZXRlcnMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtID0gdGhpcy5yZXNvbHZlZC5maWx0ZXIocCA9PiAhcC5wYXJhbWV0ZXJEZWYuaXNSb3V0ZUlkKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgcGFyYW1zW3AucGFyYW1ldGVyRGVmLm5hbWVdID0gcC5mb3JtYXR0ZWRWYWx1ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBnZXRBbGxGb3JtYXR0ZWRQYXJhbWV0ZXJzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIGNvbnN0IHJvdXRlSWRQYXJhbSA9IHRoaXMucmVzb2x2ZWQuZm9yRWFjaChwID0+IHtcbiAgICAgIHBhcmFtc1twLnBhcmFtZXRlckRlZi5uYW1lXSA9IHAuZm9ybWF0dGVkVmFsdWUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgQFRyYWNlKClcbiAgcmVwbGFjZTxULCBTPihwYXJhbWV0ZXI6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4sIHZhbHVlOiBTKTogUGFyYW1ldGVyU25hcHNob3Qge1xuICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU25hcHNob3QodGhpcy5wbGFjZURlZmluaXRpb24sIHRoaXMucmVzb2x2ZWQubWFwKHAgPT4ge1xuICAgICAgcmV0dXJuIHAucGFyYW1ldGVyRGVmID09PSBwYXJhbWV0ZXIgPyBwLnJlcGxhY2UodmFsdWUpIDogcDtcbiAgICB9KSk7XG4gIH1cblxuICBAVHJhY2UoKVxuICBhc3luYyBzYW5pdGlzZShpbmplY3RvcjogSW5qZWN0b3IpOiBQcm9taXNlPFBhcmFtZXRlclNuYXBzaG90PiB7XG4gICAgaWYgKHRoaXMuaGFzUm91dGVJZCgpKSB7XG4gICAgICBjb25zdCByb3V0ZUlkID0gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gICAgICBjb25zdCBzYW5pdGlzZWRWYWx1ZSA9IGF3YWl0IHJvdXRlSWQuc2FuaXRpc2UodGhpcywgaW5qZWN0b3IpO1xuICAgICAgaWYgKCFyb3V0ZUlkLmlzU2FtZShzYW5pdGlzZWRWYWx1ZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIHJvdXRlIGlkIGhhcyBjaGFuZ2VkIHdlIHJlZGlyZWN0IGltbWVkaWF0ZWx5IGFzIG90aGVyXG4gICAgICAgIC8vIHBhcmFtZXRlciBzYW5pdGlzZXJzIG1pZ2h0IHVzZSBpdC5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShyb3V0ZUlkLnBhcmFtZXRlckRlZiwgc2FuaXRpc2VkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBQYXJhbWV0ZXJTbmFwc2hvdCA9IHRoaXM7XG4gICAgY29uc3Qgcm91dGVQYXJhbWV0ZXJzID0gdGhpcy5nZXRSb3V0ZVBhcmFtZXRlcnMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm91dGVQYXJhbWV0ZXIgPSByb3V0ZVBhcmFtZXRlcnNbaV07XG4gICAgICBjb25zdCBzYW5pdGlzZWRWYWx1ZSA9IGF3YWl0IHJvdXRlUGFyYW1ldGVyLnNhbml0aXNlKHRoaXMsIGluamVjdG9yKTtcbiAgICAgIGlmICghcm91dGVQYXJhbWV0ZXIuaXNTYW1lKHNhbml0aXNlZFZhbHVlKSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnJlcGxhY2Uocm91dGVQYXJhbWV0ZXIucGFyYW1ldGVyRGVmLCBzYW5pdGlzZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFBhcmFtZXRlclNuYXBzaG90IHtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlKHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24sIHBhcmFtczogUGFyYW1NYXAsIHVybFNlZ21lbnRzOlVybFNlZ21lbnRbXSk6IFBhcmFtZXRlclNuYXBzaG90IHtcbiAgICBjb25zdCBwYXJhbU1hcCA9IG5ldyBDb25zb2xpZGF0ZWRQYXJhbWV0ZXJNYXAocGFyYW1zLCB1cmxTZWdtZW50cyk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXJhbWV0ZXJzOiBSZXNvbHZlZFBhcmFtZXRlcjxhbnksIGFueT5bXSA9IHBsYWNlRGVmLmdldFJvdXRlUGFyYW1ldGVycygpXG4gICAgICAubWFwKGRlZiA9PiB7XG4gICAgICAgIGlmIChkZWYuaXNBcnJheSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1NYXAuaGFzKGRlZi5uYW1lKSA/IHBhcmFtTWFwLmdldEFsbChkZWYubmFtZSkuZmlsdGVyKHMgPT4gIV8uaXNFbXB0eShzKSkubWFwKHJhdyA9PiBkZWYudHlwZS5wYXJzZShyYXcpKSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEFycmF5UGFyYW1ldGVyKGRlZiwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1NYXAuaGFzKGRlZi5uYW1lKSA/IGRlZi50eXBlLnBhcnNlKHBhcmFtTWFwLmdldChkZWYubmFtZSkpIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkVmFsdWVQYXJhbWV0ZXIoZGVmLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU25hcHNob3QocGxhY2VEZWYsIHJlc29sdmVkUGFyYW1ldGVycyk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBhIHdvcmsgYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IGFuIGFjdGl2YXRlZCByb3V0ZSB3aXRoIG11bHRpcGxlIHNlZ21lbnRzIGRvZXNuJ3RcbiAgICogaW5jbHVkZSB0aGUgc2VnbWVudCBwYXJhbXMgaW4gdGhlIHBhcmFtTWFwIGFzIHdlbGwgYXMgZWFjaCBzZWdtZW50IHJldHVybnMgYW4gZW1wdHlcbiAgICogcGFyYW0gbWFwIGV2ZW4gd2hlbiBgcGFyYW1ldGVyYHMgaGFzIGNvbnRlbnQuXG4gICAqL1xuICBjbGFzcyBDb25zb2xpZGF0ZWRQYXJhbWV0ZXJNYXAge1xuXG4gICAgcHJpdmF0ZSBwYXJhbU1hcHM6IFBhcmFtTWFwW107XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbU1hcDpQYXJhbU1hcCwgdXJsU2VnbWVudHM6VXJsU2VnbWVudFtdKSB7XG4gICAgICB0aGlzLnBhcmFtTWFwcyA9IFtwYXJhbU1hcF0uY29uY2F0KFxuICAgICAgICAodXJsU2VnbWVudHMgfHwgW10pLm1hcChzID0+IG5ldyBQYXJhbU1hcEFkYXB0ZXIocy5wYXJhbWV0ZXJzKSlcbiAgICAgICkuZmlsdGVyKG0gPT4gISFtKTsgLy8gdGhlIGFjdGl2YXRlZCByb3V0ZSBwYXJhbSBtYXAgY2FuIGJlIG51bGxcbiAgICB9XG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbU1hcHMuZmluZChtID0+IG0uaGFzKG5hbWUpKS5nZXQobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0QWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtTWFwcy5maW5kKG0gPT4gbS5oYXMobmFtZSkpLmdldEFsbChuYW1lKTtcbiAgICB9XG5cbiAgICBoYXMobmFtZTpzdHJpbmcpOmJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhdGhpcy5wYXJhbU1hcHMuZmluZChtID0+IG0uaGFzKG5hbWUpKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBQYXJhbU1hcEFkYXB0ZXIgaW1wbGVtZW50cyBQYXJhbU1hcCB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgfVxuXG4gICAgZ2V0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1zW25hbWVdO1xuICAgIH1cblxuICAgIGdldEFsbChuYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KG5hbWUpO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmtleXMuaW5jbHVkZXMobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0IGtleXMoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlc29sdmVkUGFyYW1ldGVyPFQsIFMgPSBUPiB7XG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgcGFyYW1ldGVyRGVmOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIFM+LCByZWFkb25seSB2YWx1ZTogUykge1xuICAgIH1cblxuICAgIGFic3RyYWN0IGluamVjdFJvdXRlUGFyYW0oZGVzdDoge30pOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaXNTYW1lKG90aGVyVmFsdWU6IFMpOiBib29sZWFuO1xuXG4gICAgaXNSb3V0ZUlkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRGVmLmlzUm91dGVJZDtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAgIGFic3RyYWN0IHJlcGxhY2UodmFsdWU6IFMpOiBSZXNvbHZlZFBhcmFtZXRlcjxULCBTPjtcblxuICAgIGFzeW5jIHNhbml0aXNlKHZpc2l0OiBWaXNpdCwgaW5qZWN0b3I6IEluamVjdG9yKTogUHJvbWlzZTxTPiB7XG4gICAgICBjb25zdCBzYW5pdGlzZXIgPSB0aGlzLnBhcmFtZXRlckRlZi5nZXRTYW5pdGlzZXIoaW5qZWN0b3IpO1xuICAgICAgaWYgKHNhbml0aXNlcikge1xuICAgICAgICByZXR1cm4gc2FuaXRpc2VyLnNhbml0aXNlKHRoaXMucGFyYW1ldGVyRGVmLCB0aGlzLnZhbHVlLCB2aXNpdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgUmVzb2x2ZWRWYWx1ZVBhcmFtZXRlcjxUPiBleHRlbmRzIFJlc29sdmVkUGFyYW1ldGVyPFQsIFQ+IHtcblxuICAgIGlzU2FtZShvdGhlclZhbHVlOiBUKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gb3RoZXJWYWx1ZTtcbiAgICB9XG5cbiAgICBpbmplY3RSb3V0ZVBhcmFtKGRlc3Q6IHt9KTogdm9pZCB7XG4gICAgICBkZXN0W3RoaXMucGFyYW1ldGVyRGVmLm5hbWVdID0gdGhpcy5wYXJhbWV0ZXJEZWYudHlwZS5mb3JtYXQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcmVwbGFjZSh2YWx1ZTogVCk6IFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkUGFyYW1ldGVyPFQsIFQ+IHtcbiAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRWYWx1ZVBhcmFtZXRlcjxUPih0aGlzLnBhcmFtZXRlckRlZiwgdmFsdWUpO1xuICAgIH1cblxuICAgIGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gIV8uaXNOaWwodGhpcy52YWx1ZSkgPyB0aGlzLnBhcmFtZXRlckRlZi50eXBlLmZvcm1hdCh0aGlzLnZhbHVlKSA6IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIFJlc29sdmVkQXJyYXlQYXJhbWV0ZXI8VD4gZXh0ZW5kcyBSZXNvbHZlZFBhcmFtZXRlcjxULCBUW10+IHtcblxuICAgIGlzU2FtZShvdGhlclZhbHVlOiBUW10pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBfLmlzRXF1YWwodGhpcy52YWx1ZSwgb3RoZXJWYWx1ZSk7XG4gICAgfVxuXG4gICAgaW5qZWN0Um91dGVQYXJhbShkZXN0OiB7fSk6IHZvaWQge1xuICAgICAgZGVzdFt0aGlzLnBhcmFtZXRlckRlZi5uYW1lXSA9IHRoaXMudmFsdWUubWFwKHYgPT4gdGhpcy5wYXJhbWV0ZXJEZWYudHlwZS5mb3JtYXQodikpO1xuICAgIH1cblxuICAgIHJlcGxhY2UodmFsdWU6IFRbXSk6IFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkUGFyYW1ldGVyPFQsIFRbXT4ge1xuICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEFycmF5UGFyYW1ldGVyPFQ+KHRoaXMucGFyYW1ldGVyRGVmLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLm1hcCh2ID0+IHRoaXMucGFyYW1ldGVyRGVmLnR5cGUuZm9ybWF0KHYpKSA6IFtdO1xuICAgIH1cblxuICB9XG5cbn1cbiJdfQ==
496
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL3BhcmFtZXRlci1zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQ7SUFFRSwyQkFBcUIsZUFBZ0MsRUFBbUIsVUFBZ0Q7UUFBbkcsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQW1CLGVBQVUsR0FBVixVQUFVLENBQXNDO0lBQ3hILENBQUM7Ozs7OztJQUVELHNDQUFVOzs7OztJQUFWLFVBQVcsS0FBd0IsRUFBRSxLQUFhO1FBQWIsc0JBQUEsRUFBQSxhQUFhOztZQUMxQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJOzs7O1FBQUMsVUFBQyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsRUFBQztRQUNGLElBQUksT0FBTyxJQUFJLEtBQUssRUFBRTtZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUNWLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUk7Z0JBQzdCLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSztnQkFDbkIsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUM3QyxDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sQ0FBQyxDQUFD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QUFyQkQsSUFxQkM7Ozs7OztRQXBCYSxpQ0FBZ0Q7O0FBdUJoRSxDQUFDLEVBakVnQixpQkFBaUIsS0FBakIsaUJBQWlCLFFBaUVqQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXJhbU1hcCwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFjZSB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IE1lbW9pemUgfSBmcm9tICdAdHlwZXNjcmlwdC1wbHVzL2Zhc3QtbWVtb2l6ZS1kZWNvcmF0b3IvZGlzdC9zcmMnO1xuaW1wb3J0IHsgUGxhY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vcGxhY2UtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4uL3Zpc2l0JztcbmltcG9ydCB7IFBhcmFtZXRlckRlZmluaXRpb24gfSBmcm9tICcuL3BhcmFtZXRlci1kZWZpbml0aW9uLmNsYXNzJztcbmltcG9ydCB7IFJvdXRlUGFyYW1ldGVyVmFsdWUgfSBmcm9tICcuL3JvdXRlLXBhcmFtZXRlci12YWx1ZSc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJTbmFwc2hvdCBpbXBsZW1lbnRzIFZpc2l0IHtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwbGFjZURlZmluaXRpb246IFBsYWNlRGVmaW5pdGlvbiwgcHJpdmF0ZSByZWFkb25seSBwYXJhbWV0ZXJzOiBSb3V0ZVBhcmFtZXRlclZhbHVlPGFueSwgYW55LCBhbnk+W10pIHtcbiAgfVxuXG4gIGhhc0NoYW5nZWQob3RoZXI6IFBhcmFtZXRlclNuYXBzaG90LCBkZWJ1ZyA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hhbmdlZCA9IHRoaXMucGFyYW1ldGVycy5maW5kKChyKSA9PiB7XG4gICAgICByZXR1cm4gci5oYXNDaGFuZ2VkKG90aGVyLmdldFZhbHVlT2Yoci5kZWZpbml0aW9uKSk7XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZWQgJiYgZGVidWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgbmFtZTogY2hhbmdlZC5kZWZpbml0aW9uLm5hbWUsXG4gICAgICAgIG1pbmU6IGNoYW5nZWQudmFsdWUsXG4gICAgICAgIHRoZWlyczogb3RoZXIuZ2V0VmFsdWVPZihjaGFuZ2VkLmRlZmluaXRpb24pXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICEhY2hhbmdlZDtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0UGFyYW1ldGVyPFQsIFM+KHBhcmFtZXRlckRlZjogUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBTPik6IFJvdXRlUGFyYW1ldGVyVmFsdWU8UywgVCwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5maW5kKHIgPT4gci5kZWZpbml0aW9uID09PSBwYXJhbWV0ZXJEZWYpO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRWYWx1ZU9mPFQsIFM+KHBhcmFtZXRlckRlZjogUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBTPik6IFMge1xuICAgIGNvbnN0IHJlc29sdmVkUGFyYW1ldGVyID0gdGhpcy5nZXRQYXJhbWV0ZXIocGFyYW1ldGVyRGVmKTtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbWV0ZXIgPyByZXNvbHZlZFBhcmFtZXRlci52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBnZXRSb3V0ZUlkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCkgPyB0aGlzLmdldFJvdXRlSWRQYXJhbWV0ZXIoKS52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIGdldFBhcmFtZXRlclZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuZmluZChyID0+IHIuZGVmaW5pdGlvbi5uYW1lID09PSBuYW1lKTtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbWV0ZXIgPyByZXNvbHZlZFBhcmFtZXRlci52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIHByaXZhdGUgZ2V0Um91dGVJZFBhcmFtZXRlcigpOiBSb3V0ZVBhcmFtZXRlclZhbHVlLlNjYWxhcjxhbnk+IHtcbiAgICAvLyBSb3V0ZUlkJ3MgYXJlIG5ldmVyIGFycmF5czogc2VlIHBhcmFtZXRlci1kZWNvcmF0b3JzLnRzIGNyZWF0ZURlZmluaXRpb24gbWV0aG9kcy4gSXQgd291bGQgYmUgbmljZSB0b1xuICAgIC8vIGNhcHR1cmUgdGhpcyBpbiB0aGUgdHlwZSBzeXN0ZW0gdGhvdWdoXG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5maW5kKHAgPT4gcC5kZWZpbml0aW9uLmlzUm91dGVJZCkgYXMgUm91dGVQYXJhbWV0ZXJWYWx1ZS5TY2FsYXI8YW55PjtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgcHJpdmF0ZSBnZXRSb3V0ZVBhcmFtZXRlcnMoKTogUm91dGVQYXJhbWV0ZXJWYWx1ZTxhbnksIGFueSwgYW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmZpbHRlcihyID0+ICFyLmRlZmluaXRpb24uaXNSb3V0ZUlkKTtcbiAgfVxuXG4gIGhhc1JvdXRlSWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gIH1cblxuICBnZXRGb3JtYXR0ZWRSb3V0ZUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtID0gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gICAgcmV0dXJuIHJvdXRlSWRQYXJhbSA/IHJvdXRlSWRQYXJhbS5mb3JtYXR0ZWRWYWx1ZSgpIDogbnVsbDtcbiAgfVxuXG4gIGdldE5vbkVtcHR5UGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmZpbHRlcihwID0+ICFwLmlzRW1wdHkoKSk7XG4gIH1cblxuICBAVHJhY2UoKVxuICBnZXRGb3JtYXR0ZWRQYXJhbWV0ZXJzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIGNvbnN0IHJvdXRlSWRQYXJhbSA9IHRoaXMuZ2V0Tm9uRW1wdHlQYXJhbWV0ZXJzKClcbiAgICAgIC5maWx0ZXIocCA9PiAhcC5kZWZpbml0aW9uLmlzUm91dGVJZClcbiAgICAgIC5mb3JFYWNoKHAgPT4gcGFyYW1zW3AuZGVmaW5pdGlvbi5uYW1lXSA9IHAuZm9ybWF0dGVkVmFsdWUoKSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIGdldEFsbFBhcmFtZXRlcnMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZvckVhY2gocCA9PiB7XG4gICAgICBwYXJhbXNbcC5kZWZpbml0aW9uLm5hbWVdID0gcC52YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcmVwbGFjZTxULCBTPihwYXJhbWV0ZXI6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4sIHZhbHVlOiBTKTogUGFyYW1ldGVyU25hcHNob3Qge1xuICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU25hcHNob3QodGhpcy5wbGFjZURlZmluaXRpb24sIHRoaXMucGFyYW1ldGVycy5tYXAocCA9PiB7XG4gICAgICByZXR1cm4gcC5kZWZpbml0aW9uID09PSBwYXJhbWV0ZXIgPyBwLnJlcGxhY2UodmFsdWUpIDogcDtcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBzYW5pdGlzZShpbmplY3RvcjogSW5qZWN0b3IpOiBQcm9taXNlPFBhcmFtZXRlclNuYXBzaG90PiB7XG4gICAgaWYgKHRoaXMuaGFzUm91dGVJZCgpKSB7XG4gICAgICBjb25zdCByb3V0ZUlkID0gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCk7XG4gICAgICBjb25zdCBzYW5pdGlzZWRWYWx1ZSA9IGF3YWl0IHJvdXRlSWQuc2FuaXRpc2UodGhpcywgaW5qZWN0b3IpO1xuICAgICAgaWYgKHJvdXRlSWQuaGFzQ2hhbmdlZChzYW5pdGlzZWRWYWx1ZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIHJvdXRlIGlkIGhhcyBjaGFuZ2VkIHdlIHJlZGlyZWN0IGltbWVkaWF0ZWx5IGFzIG90aGVyXG4gICAgICAgIC8vIHBhcmFtZXRlciBzYW5pdGlzZXJzIG1pZ2h0IHVzZSBpdC5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShyb3V0ZUlkLmRlZmluaXRpb24sIHNhbml0aXNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdDogUGFyYW1ldGVyU25hcHNob3QgPSB0aGlzO1xuICAgIGNvbnN0IHJvdXRlUGFyYW1ldGVycyA9IHRoaXMuZ2V0Um91dGVQYXJhbWV0ZXJzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1ldGVyID0gcm91dGVQYXJhbWV0ZXJzW2ldO1xuICAgICAgY29uc3Qgc2FuaXRpc2VkVmFsdWUgPSBhd2FpdCByb3V0ZVBhcmFtZXRlci5zYW5pdGlzZSh0aGlzLCBpbmplY3Rvcik7XG4gICAgICBpZiAocm91dGVQYXJhbWV0ZXIuaGFzQ2hhbmdlZChzYW5pdGlzZWRWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2Uocm91dGVQYXJhbWV0ZXIuZGVmaW5pdGlvbiwgc2FuaXRpc2VkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBQYXJhbWV0ZXJTbmFwc2hvdCB7XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShwbGFjZURlZjogUGxhY2VEZWZpbml0aW9uLCBwYXJhbXM6IFBhcmFtTWFwLCB1cmxTZWdtZW50czogVXJsU2VnbWVudFtdKTogUGFyYW1ldGVyU25hcHNob3Qge1xuICAgIGNvbnN0IHBhcmFtTWFwID0gbmV3IENvbnNvbGlkYXRlZFBhcmFtZXRlck1hcChwYXJhbXMsIHVybFNlZ21lbnRzKTtcbiAgICBjb25zdCByZXNvbHZlZFBhcmFtZXRlcnMgPSBwbGFjZURlZi5nZXRSb3V0ZVBhcmFtZXRlcnMoKS5tYXAoZGVmID0+IFJvdXRlUGFyYW1ldGVyVmFsdWUuY3JlYXRlKGRlZiwgcGFyYW1NYXApKTtcbiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclNuYXBzaG90KHBsYWNlRGVmLCByZXNvbHZlZFBhcmFtZXRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgYSB3b3JrIGFyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCBhbiBhY3RpdmF0ZWQgcm91dGUgd2l0aCBtdWx0aXBsZSBzZWdtZW50cyBkb2Vzbid0XG4gICAqIGluY2x1ZGUgdGhlIHNlZ21lbnQgcGFyYW1zIGluIHRoZSBwYXJhbU1hcCBhcyB3ZWxsIGFzIGVhY2ggc2VnbWVudCByZXR1cm5zIGFuIGVtcHR5XG4gICAqIHBhcmFtIG1hcCBldmVuIHdoZW4gYHBhcmFtZXRlcmBzIGhhcyBjb250ZW50LlxuICAgKi9cbiAgY2xhc3MgQ29uc29saWRhdGVkUGFyYW1ldGVyTWFwIGltcGxlbWVudHMgUGFyYW1NYXAge1xuXG4gICAgcHJpdmF0ZSBwYXJhbU1hcHM6IFBhcmFtTWFwW107XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbU1hcDogUGFyYW1NYXAsIHVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10pIHtcbiAgICAgIHRoaXMucGFyYW1NYXBzID0gW3BhcmFtTWFwXS5jb25jYXQoXG4gICAgICAgICh1cmxTZWdtZW50cyB8fCBbXSkubWFwKHMgPT4gbmV3IFBhcmFtTWFwQWRhcHRlcihzLnBhcmFtZXRlcnMpKVxuICAgICAgKS5maWx0ZXIobSA9PiAhIW0pOyAvLyB0aGUgYWN0aXZhdGVkIHJvdXRlIHBhcmFtIG1hcCBjYW4gYmUgbnVsbFxuICAgIH1cblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtTWFwcy5maW5kKG0gPT4gbS5oYXMobmFtZSkpLmdldChuYW1lKTtcbiAgICB9XG5cbiAgICBnZXRBbGwobmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1NYXBzLmZpbmQobSA9PiBtLmhhcyhuYW1lKSkuZ2V0QWxsKG5hbWUpO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhIXRoaXMucGFyYW1NYXBzLmZpbmQobSA9PiBtLmhhcyhuYW1lKSk7XG4gICAgfVxuXG4gICAgQE1lbW9pemUoKVxuICAgIGdldCBrZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtTWFwcy5yZWR1Y2UoKHJlc3VsdCwgcGFyYW1zKSA9PiByZXN1bHQuY29uY2F0KHBhcmFtcy5rZXlzKSwgW10pO1xuICAgIH1cbiAgfVxuXG4gIGNsYXNzIFBhcmFtTWFwQWRhcHRlciBpbXBsZW1lbnRzIFBhcmFtTWFwIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogeyBbcDogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB9XG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbXNbbmFtZV07XG4gICAgfVxuXG4gICAgZ2V0QWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQobmFtZSk7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMua2V5cy5pbmNsdWRlcyhuYW1lKTtcbiAgICB9XG5cbiAgICBnZXQga2V5cygpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIH1cblxuICB9XG5cblxufVxuIl19