@colijnit/configurator 1.0.13 → 1.0.17

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 (34) hide show
  1. package/app/builder.d.ts +12 -11
  2. package/app/components/answers/answer/answer.component.d.ts +0 -1
  3. package/app/services/configurator.service.d.ts +9 -14
  4. package/app/services/locator.service.d.ts +4 -0
  5. package/bundles/colijnit-configurator.umd.js +207 -76
  6. package/bundles/colijnit-configurator.umd.js.map +1 -1
  7. package/bundles/colijnit-configurator.umd.min.js +2 -2
  8. package/bundles/colijnit-configurator.umd.min.js.map +1 -1
  9. package/colijnit-configurator.d.ts +6 -7
  10. package/colijnit-configurator.metadata.json +1 -1
  11. package/esm2015/app/builder.js +67 -25
  12. package/esm2015/app/components/answers/answer/answer.component.js +26 -17
  13. package/esm2015/app/components/answers/answers.component.js +16 -13
  14. package/esm2015/app/components/selections/selections.component.js +45 -25
  15. package/esm2015/app/services/configurator.service.js +36 -21
  16. package/esm2015/app/services/image-cache.service.js +3 -1
  17. package/esm2015/app/services/locator.service.js +10 -0
  18. package/esm2015/colijnit-configurator.js +7 -8
  19. package/esm2015/public_api.js +2 -1
  20. package/esm5/app/builder.js +116 -34
  21. package/esm5/app/components/answers/answer/answer.component.js +20 -10
  22. package/esm5/app/components/answers/answers.component.js +3 -3
  23. package/esm5/app/components/selections/selections.component.js +4 -4
  24. package/esm5/app/services/configurator.service.js +55 -22
  25. package/esm5/app/services/image-cache.service.js +3 -1
  26. package/esm5/app/services/locator.service.js +13 -0
  27. package/esm5/colijnit-configurator.js +7 -8
  28. package/esm5/public_api.js +2 -1
  29. package/fesm2015/colijnit-configurator.js +192 -96
  30. package/fesm2015/colijnit-configurator.js.map +1 -1
  31. package/fesm5/colijnit-configurator.js +203 -68
  32. package/fesm5/colijnit-configurator.js.map +1 -1
  33. package/package.json +2 -2
  34. package/public_api.d.ts +1 -0
@@ -1,5 +1,6 @@
1
1
  import { __awaiter, __decorate, __generator } from "tslib";
2
2
  import * as THREE from "three";
3
+ import { Options } from "@colijnit/configuratorapi/build/model/options";
3
4
  import { DecoNode } from "@colijnit/configuratorapi/build/model/deco-node";
4
5
  import { BusinessObjectFactory } from "@colijnit/configuratorapi/build/service/business-object-factory";
5
6
  import { Selection } from "@colijnit/configuratorapi/build/model/selection";
@@ -10,74 +11,81 @@ import { SceneUtils } from "../utils/scene-utils";
10
11
  import { VariationHelper } from "../helper/variation-helper";
11
12
  import { Article } from "@colijnit/configuratorapi/build/model/article";
12
13
  import { ConfiguratorService } from './services/configurator.service';
14
+ import { Scene } from 'three';
13
15
  import { Injectable } from '@angular/core';
14
16
  import { BehaviorSubject } from 'rxjs';
17
+ import { ServiceLocator } from './services/locator.service';
15
18
  var Builder = /** @class */ (function () {
16
- function Builder(_configuratorService) {
17
- var _this = this;
18
- this._configuratorService = _configuratorService;
19
+ function Builder(scene, options, useInAngular) {
19
20
  this.selectionsReceived = new BehaviorSubject([]);
20
21
  this.answersReceived = new BehaviorSubject([]);
21
- this.questionReceived = new BehaviorSubject(undefined);
22
+ this.modelLoaded = new BehaviorSubject(null);
22
23
  this._selections = [];
24
+ this._answers = [];
23
25
  this._decos = [];
24
26
  this._placedAdjustables = [];
25
27
  this._placedAddables = [];
26
28
  this._adjustables = [];
27
29
  this._addables = [];
28
30
  this._articleCache = new Map();
29
- this._subs = [];
30
31
  this._boFactory = new BusinessObjectFactory();
31
32
  this._threedUtils = new ThreedUtils();
32
33
  this._variationHelper = new VariationHelper();
33
- this._subs.push(this._configuratorService.selectionsReceived.subscribe(function (selections) { return _this.selectionsReceived.next(selections); }), this._configuratorService.answersReceived.subscribe(function (answers) { return _this.answersReceived.next(answers); }), this._configuratorService.questionReceived.subscribe(function (question) { return _this.questionReceived.next(question); }));
34
- }
35
- Builder.prototype.init = function (scene, options) {
36
34
  if (!scene) {
37
35
  throw 'No scene object provided!';
38
36
  }
39
37
  if (!options) {
40
38
  throw 'No connection options provided!';
41
39
  }
42
- if (!this._configuratorService) {
43
- this._configuratorService = new ConfiguratorService();
40
+ if (useInAngular) {
41
+ this._configuratorService = ServiceLocator.injector.get(ConfiguratorService);
42
+ }
43
+ else {
44
+ this._configuratorService = new ConfiguratorService(undefined);
44
45
  }
45
46
  this._configuratorService.initApi(options);
46
47
  this._scene = scene;
47
- };
48
- Builder.prototype.buildModel = function (instanceId, sku, goodId) {
48
+ }
49
+ Builder.prototype.buildModel = function (sku, instanceId, goodId) {
49
50
  return __awaiter(this, void 0, void 0, function () {
50
51
  var promises, e_1;
51
52
  return __generator(this, function (_a) {
52
53
  switch (_a.label) {
53
54
  case 0:
54
- if (!this._scene && !instanceId) {
55
+ if (!this._scene) {
55
56
  return [2 /*return*/];
56
57
  }
57
58
  _a.label = 1;
58
59
  case 1:
59
- _a.trys.push([1, 7, , 8]);
60
- return [4 /*yield*/, this._prepareConfiguration(sku, goodId)];
60
+ _a.trys.push([1, 8, , 9]);
61
+ return [4 /*yield*/, this._setInstanceId(sku, instanceId, goodId)];
61
62
  case 2:
62
63
  _a.sent();
63
- if (!this._source) return [3 /*break*/, 5];
64
- return [4 /*yield*/, this._configuratorService.setInstanceToConfigure(instanceId)];
64
+ return [4 /*yield*/, this._prepareConfiguration(this._sku, this._goodId)];
65
65
  case 3:
66
+ _a.sent();
67
+ if (!this._source) return [3 /*break*/, 6];
68
+ return [4 /*yield*/, this._configuratorService.setInstanceToConfigure(this._instanceId)];
69
+ case 4:
66
70
  _a.sent();
67
71
  promises = [];
68
- promises.push(this._getSelections(instanceId));
72
+ promises.push(this.getQuestionAndAnswers());
73
+ promises.push(this._getSelections(this._instanceId));
69
74
  promises.push(this._getDecos());
70
75
  return [4 /*yield*/, Promise.all(promises)];
71
- case 4:
76
+ case 5:
72
77
  _a.sent();
78
+ if (this._answers.length > 0) {
79
+ return [2 /*return*/];
80
+ }
73
81
  this._linkSelectionsAndDecos();
74
- return [2 /*return*/, this._build(instanceId)];
75
- case 5: throw 'GLB source not found!';
76
- case 6: return [3 /*break*/, 8];
77
- case 7:
82
+ return [2 /*return*/, this._build(this._instanceId)];
83
+ case 6: throw 'GLB source not found!';
84
+ case 7: return [3 /*break*/, 9];
85
+ case 8:
78
86
  e_1 = _a.sent();
79
87
  throw e_1;
80
- case 8: return [2 /*return*/];
88
+ case 9: return [2 /*return*/];
81
89
  }
82
90
  });
83
91
  });
@@ -90,17 +98,87 @@ var Builder = /** @class */ (function () {
90
98
  this._variationHelper.clearCache();
91
99
  };
92
100
  Builder.prototype.selectSelection = function (selection) {
93
- this._configuratorService.selectSelection(selection, false);
101
+ return __awaiter(this, void 0, void 0, function () {
102
+ return __generator(this, function (_a) {
103
+ switch (_a.label) {
104
+ case 0: return [4 /*yield*/, this._configuratorService.selectSelection(selection, false)];
105
+ case 1:
106
+ _a.sent();
107
+ this.getQuestionAndAnswers();
108
+ return [2 /*return*/];
109
+ }
110
+ });
111
+ });
94
112
  };
95
- Builder.prototype.getQuestionAndAnswers = function () {
113
+ Builder.prototype.getQuestionAndAnswers = function (publicationCode) {
96
114
  return __awaiter(this, void 0, void 0, function () {
115
+ var questionsAndAnswers;
97
116
  return __generator(this, function (_a) {
98
- return [2 /*return*/, this._configuratorService.getQuestionAndAnswers(false)];
117
+ switch (_a.label) {
118
+ case 0: return [4 /*yield*/, this._configuratorService.getQuestionAndAnswers(false, publicationCode)];
119
+ case 1:
120
+ questionsAndAnswers = _a.sent();
121
+ this._answers = questionsAndAnswers.answers;
122
+ this.answersReceived.next(questionsAndAnswers.answers);
123
+ return [2 /*return*/];
124
+ }
99
125
  });
100
126
  });
101
127
  };
102
128
  Builder.prototype.selectAnswer = function (answer) {
103
- this._configuratorService.selectAnswer(answer, false);
129
+ return __awaiter(this, void 0, void 0, function () {
130
+ var _a, _b;
131
+ return __generator(this, function (_c) {
132
+ switch (_c.label) {
133
+ case 0: return [4 /*yield*/, this._configuratorService.selectAnswer(answer, false)];
134
+ case 1:
135
+ _c.sent();
136
+ _b = (_a = this.modelLoaded).next;
137
+ return [4 /*yield*/, this.buildModel()];
138
+ case 2:
139
+ _b.apply(_a, [_c.sent()]);
140
+ return [2 /*return*/];
141
+ }
142
+ });
143
+ });
144
+ };
145
+ Builder.prototype._setInstanceId = function (sku, instanceId, goodId) {
146
+ return __awaiter(this, void 0, void 0, function () {
147
+ var result;
148
+ return __generator(this, function (_a) {
149
+ switch (_a.label) {
150
+ case 0:
151
+ if (!(!instanceId && !this._instanceId)) return [3 /*break*/, 4];
152
+ if (!!goodId) return [3 /*break*/, 2];
153
+ return [4 /*yield*/, this._getGoodIdFromSku(sku)];
154
+ case 1:
155
+ goodId = _a.sent();
156
+ _a.label = 2;
157
+ case 2:
158
+ this._goodId = goodId;
159
+ return [4 /*yield*/, this.initNodeInstance(this._goodId)];
160
+ case 3:
161
+ result = _a.sent();
162
+ if (result && result.resultObject) {
163
+ this._instanceId = result.resultObject;
164
+ }
165
+ else {
166
+ throw 'Failed to initialize node instance';
167
+ }
168
+ return [3 /*break*/, 5];
169
+ case 4:
170
+ if (!this._instanceId) {
171
+ this._instanceId = instanceId;
172
+ }
173
+ _a.label = 5;
174
+ case 5:
175
+ if (!this._sku) {
176
+ this._sku = sku;
177
+ }
178
+ return [2 /*return*/];
179
+ }
180
+ });
181
+ });
104
182
  };
105
183
  Builder.prototype._prepareConfiguration = function (sku, goodId) {
106
184
  return __awaiter(this, void 0, void 0, function () {
@@ -385,19 +463,21 @@ var Builder = /** @class */ (function () {
385
463
  });
386
464
  });
387
465
  };
388
- Builder.prototype._getSelections = function (instanceId) {
466
+ Builder.prototype._getSelections = function (instanceId, publicationCode) {
389
467
  return __awaiter(this, void 0, void 0, function () {
390
468
  var selectionResponse;
391
469
  return __generator(this, function (_a) {
392
470
  switch (_a.label) {
393
471
  case 0:
394
- this._selections.length = 0;
395
- return [4 /*yield*/, this._configuratorService.getSelections(false)];
472
+ this._selections = [];
473
+ return [4 /*yield*/, this._configuratorService.getSelections(false, publicationCode)];
396
474
  case 1:
397
475
  selectionResponse = _a.sent();
398
476
  if (selectionResponse.resultObjects && selectionResponse.resultObjects.length > 0) {
399
477
  this._selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, selectionResponse.resultObjects);
400
478
  this._selections.forEach(function (s) { return s.instanceId = instanceId; });
479
+ // const filtered: Selection[] = this._selections.filter(s => s.nodeType !== NodeType.Article && s.presentationLevel === 1);
480
+ this.selectionsReceived.next(this._selections);
401
481
  }
402
482
  else {
403
483
  throw 'No selections found!';
@@ -413,7 +493,7 @@ var Builder = /** @class */ (function () {
413
493
  return __generator(this, function (_a) {
414
494
  switch (_a.label) {
415
495
  case 0:
416
- this._decos.length = 0;
496
+ this._decos = [];
417
497
  return [4 /*yield*/, this._configuratorService.getDecos(false)];
418
498
  case 1:
419
499
  decosResponse = _a.sent();
@@ -498,7 +578,9 @@ var Builder = /** @class */ (function () {
498
578
  this._prepareTheSelections();
499
579
  };
500
580
  Builder.ctorParameters = function () { return [
501
- { type: ConfiguratorService }
581
+ { type: Scene },
582
+ { type: Options },
583
+ { type: Boolean }
502
584
  ]; };
503
585
  Builder = __decorate([
504
586
  Injectable()
@@ -506,4 +588,4 @@ var Builder = /** @class */ (function () {
506
588
  return Builder;
507
589
  }());
508
590
  export { Builder };
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJhcHAvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFHL0IsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlFQUFpRSxDQUFDO0FBQ3RHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUMxRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN0RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUVwRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxlQUFlLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFJbkQ7SUFxQkksaUJBQW9CLG9CQUEwQztRQUE5RCxpQkFTQztRQVRtQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBbkJ2RCx1QkFBa0IsR0FBaUMsSUFBSSxlQUFlLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDeEYsb0JBQWUsR0FBOEIsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7UUFDL0UscUJBQWdCLEdBQThCLElBQUksZUFBZSxDQUFXLFNBQVMsQ0FBQyxDQUFDO1FB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QUMsQ0FBQztRQUVuSCxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEtBQVU7WUFDNUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyx3QkFBTSxHQUFkO1FBQ0ksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakMsQ0FBQzs7Z0JBdFowQyxtQkFBbUI7O0lBckJyRCxPQUFPO1FBRG5CLFVBQVUsRUFBRTtPQUNBLE9BQU8sQ0E0YW5CO0lBQUQsY0FBQztDQUFBLEFBNWFELElBNGFDO1NBNWFZLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHtPcHRpb25zfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9vcHRpb25zXCI7XHJcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhXCI7XHJcbmltcG9ydCB7RGVjb05vZGV9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZVwiO1xyXG5pbXBvcnQge0J1c2luZXNzT2JqZWN0RmFjdG9yeX0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvc2VydmljZS9idXNpbmVzcy1vYmplY3QtZmFjdG9yeVwiO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uXCI7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2RlY28tbm9kZS10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtUaHJlZWRVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3RocmVlZC51dGlsc1wiO1xyXG5pbXBvcnQge0RlY29Ob2RlS2luZH0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUta2luZC5lbnVtXCI7XHJcbmltcG9ydCB7U2NlbmVVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3NjZW5lLXV0aWxzXCI7XHJcbmltcG9ydCB7VmFyaWF0aW9uSGVscGVyfSBmcm9tIFwiLi4vaGVscGVyL3ZhcmlhdGlvbi1oZWxwZXJcIjtcclxuaW1wb3J0IHtBcnRpY2xlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlXCI7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvcXVlc3Rpb24nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQnVpbGRlciB7XHJcblxyXG4gICAgcHVibGljIHNlbGVjdGlvbnNSZWNlaXZlZDogQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uW10+KFtdKTtcclxuICAgIHB1YmxpYyBhbnN3ZXJzUmVjZWl2ZWQ6IEJlaGF2aW9yU3ViamVjdDxBbnN3ZXJbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFuc3dlcltdPihbXSk7XHJcbiAgICBwdWJsaWMgcXVlc3Rpb25SZWNlaXZlZDogQmVoYXZpb3JTdWJqZWN0PFF1ZXN0aW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UXVlc3Rpb24+KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2NlbmU6IFRIUkVFLlNjZW5lO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBbXTtcclxuICAgIHByaXZhdGUgX2RlY29zOiBEZWNvTm9kZVtdID0gW107XHJcbiAgICBwcml2YXRlIF9wbGFjZWRBZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgX3BsYWNlZEFkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfYWRqdXN0YWJsZXM6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIF9hZGRhYmxlczogYW55W10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIF9ib0ZhY3Rvcnk6IEJ1c2luZXNzT2JqZWN0RmFjdG9yeTtcclxuICAgIHByaXZhdGUgX3NvdXJjZTogVEhSRUUuT2JqZWN0M0Q7XHJcbiAgICBwcml2YXRlIF90aHJlZWRVdGlsczogVGhyZWVkVXRpbHM7XHJcbiAgICBwcml2YXRlIF92YXJpYXRpb25IZWxwZXI6IFZhcmlhdGlvbkhlbHBlcjtcclxuICAgIHByaXZhdGUgX2FydGljbGVDYWNoZTogTWFwPHN0cmluZywgQXJ0aWNsZT4gPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbmZpZ3VyYXRvclNlcnZpY2U/OiBDb25maWd1cmF0b3JTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5fYm9GYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xyXG4gICAgICAgIHRoaXMuX3RocmVlZFV0aWxzID0gbmV3IFRocmVlZFV0aWxzKCk7XHJcbiAgICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyID0gbmV3IFZhcmlhdGlvbkhlbHBlcigpO1xyXG4gICAgICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3Rpb25zUmVjZWl2ZWQuc3Vic2NyaWJlKHNlbGVjdGlvbnMgPT4gdGhpcy5zZWxlY3Rpb25zUmVjZWl2ZWQubmV4dChzZWxlY3Rpb25zKSksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuYW5zd2Vyc1JlY2VpdmVkLnN1YnNjcmliZShhbnN3ZXJzID0+IHRoaXMuYW5zd2Vyc1JlY2VpdmVkLm5leHQoYW5zd2VycykpLFxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnF1ZXN0aW9uUmVjZWl2ZWQuc3Vic2NyaWJlKHF1ZXN0aW9uID0+IHRoaXMucXVlc3Rpb25SZWNlaXZlZC5uZXh0KHF1ZXN0aW9uKSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KHNjZW5lOiBTY2VuZSwgb3B0aW9uczogT3B0aW9ucykge1xyXG4gICAgICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIHNjZW5lIG9iamVjdCBwcm92aWRlZCEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIGNvbm5lY3Rpb24gb3B0aW9ucyBwcm92aWRlZCEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZSA9IG5ldyBDb25maWd1cmF0b3JTZXJ2aWNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuaW5pdEFwaShvcHRpb25zKTtcclxuICAgICAgICB0aGlzLl9zY2VuZSA9IHNjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsKGluc3RhbmNlSWQ6IHN0cmluZywgc2t1OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX3NjZW5lICYmICFpbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZUNvbmZpZ3VyYXRpb24oc2t1LCBnb29kSWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNldEluc3RhbmNlVG9Db25maWd1cmUoaW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZ2V0U2VsZWN0aW9ucyhpbnN0YW5jZUlkKSk7XHJcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldERlY29zKCkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkKGluc3RhbmNlSWQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgJ0dMQiBzb3VyY2Ugbm90IGZvdW5kISc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0Tm9kZUluc3RhbmNlKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5pbml0Tm9kZUluc3RhbmNlKGdvb2RJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGhyZWVkVXRpbHMuY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2Uuc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRRdWVzdGlvbkFuZEFuc3dlcnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RBbnN3ZXIoYW5zd2VyLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfcHJlcGFyZUNvbmZpZ3VyYXRpb24oc2t1OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IGFydGljbGU6IEFydGljbGUgPSBhd2FpdCB0aGlzLl9nZXRBcnRpY2xlKHNrdSwgZ29vZElkKTtcclxuICAgICAgICBpZiAoYXJ0aWNsZSAmJiBhcnRpY2xlLmFzc2V0VXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZSA9IGF3YWl0IHRoaXMuX3RocmVlZFV0aWxzLmRvd25sb2FkM0RTb3VyY2UoYXJ0aWNsZS5hc3NldFVybClcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5hc3NldFBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGFydGljbGUuY29udGVudERlbGl2ZXJ5VXJsICtcclxuICAgICAgICAgICAgICAgICAgICAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwuZW5kc1dpdGgoJy8nKSA/ICcnIDogJy8nKSArXHJcbiAgICAgICAgICAgICAgICAgICAgKGFydGljbGUuZGlzdFNjaGVtYSA/IGFydGljbGUuZGlzdFNjaGVtYSA6ICdVUF9EQkEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9idWlsZChpbnN0YW5jZUlkOiBzdHJpbmcpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlczogU2VsZWN0aW9uW10gPSB0aGlzLl9nZXRBZGp1c3RhYmxlcygpO1xyXG4gICAgICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgICAgICAgICAgb2JqLnZpc2libGUgPSBmYWxzZTsgLy8gbm8gbmVlZCB0byByZW5kZXIgdmlzdWFseVxyXG4gICAgICAgICAgICB0aGlzLl9zY2VuZS5hZGQob2JqKTtcclxuICAgICAgICAgICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuOiBudW1iZXIgPSBhZGp1c3RhYmxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0YWJsZTogVEhSRUUuT2JqZWN0M0QgPSB0aGlzLl9jcmVhdGVBZGp1c3RhYmxlKG9iaiwgYWRqdXN0YWJsZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpaSA9IDAsIGxlbmlpOiBudW1iZXIgPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGg7IGlpIDwgbGVuaWk7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNjZW5lVXRpbHMuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuX3NjZW5lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLCB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0sIGFkanVzdGFibGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RhYmxlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY29ubmVjdGVkICYmIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGNvbm5lY3Rpb24gZm91bmQgZm9yOiAnLCBhZGp1c3RhYmxlLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3BsYWNlQWRkYWJsZXMob2JqKTtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGl2b3Qob2JqKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZFZhcmlhdGlvbnMob2JqLCBpbnN0YW5jZUlkKTtcclxuICAgICAgICAgICAgdGhpcy5fc2NlbmUucmVtb3ZlKG9iaik7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIGFkanVzdGFibGVzIGZvdW5kISc7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX2J1aWxkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPUycsIGRlc2NyaXB0aW9uOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJ30pO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5idWlsZEZpbmlzaGVkLm5leHQoe2luc3RhbmNlSWQ6IHRoaXMuYWN0aXZlSW5zdGFuY2UsIHJlc3VsdFR5cGU6IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zfSk7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy5kZWNvcy5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lcnJvclNlcnZpY2UuYWRkRXJyb3IodGhpcy5hY3RpdmVJbnN0YW5jZSwge21lc3NhZ2U6ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TJywgZGVzY3JpcHRpb246ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob0RlY29Ob2Rlc30pO1xyXG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fQURKVVNUQUJMRVMnLCBkZXNjcmlwdGlvbjogJ05PX0FESlVTVEFCTEVTX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob0FkanVzdGFibGVzfSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gZ2V0IGdlbmVyaWMgdmFyaWF0aW9uc1xyXG4gICAgICAgIGNvbnN0IGdsb2JhbFZhcmlhdGlvbnM6IERlY29Ob2RlW10gPSB0aGlzLl9zZWxlY3Rpb25zXHJcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmdlbmVyaWMgJiYgKHMuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24gJiYgIXMuZGVjb05vZGUudHlwZSlcclxuICAgICAgICAgICAgLm1hcCgodmFsdWU6IFNlbGVjdGlvbiwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFNlbGVjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24uaWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5tYXRlcmlhbElkID0gdmFsdWUuaGRlY29HYW1lT2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHVzZWRWYXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgICAgICBsZXQgZ2xvYmFsVmFyaWF0aW9uc1Jld3JpdGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgICAgICBsZXQgbGFzdEFkanVzdGFibGU6IFNlbGVjdGlvbjtcclxuICAgICAgICBsZXQgbmV3UGFydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uaW5nOiBhbnk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX3NlbGVjdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWwgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA+IHByZXZpb3VzUHJlc0xldmVsKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0QWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zID0gW3NlbGVjdGlvbi5kZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucy5wdXNoKHNlbGVjdGlvbi5kZWNvTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9uc1Jld3JpdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zLnB1c2goc2VsZWN0aW9uLmRlY29Ob2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgdmFyaWF0aW9uOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYXRpb24uQnJhbmRJZCA9IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5EZXNjcmlwdGlvbiA9IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYXRpb24uTWF0ZXJpYWxJZCA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5TdXBwbGllckFydGljbGVOciA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICAgICAgICAvLyB1c2VkVmFyaWF0aW9ucy5wdXNoKHZhcmlhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdXBzZXJ0RnVybml0dXJlKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgVmFyaWF0aW9uOiBzZWxlY3Rpb24uZGVjb05vZGUuYnJhbmRJZCxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgVmFyaWF0aW9uRGVzY3JpcHRpb246IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgU3VwcGxpZXJBcnRpY2xlTnI6IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOclxyXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCBsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGp1c3RhYmxlID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RBZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCBsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZpb3VzUHJlc0xldmVsID0gc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLl91cHNlcnRGdXJuaXR1cmUodGhpcy5hY3RpdmVJbnN0YW5jZSxcclxuICAgICAgICAvLyAgIHtWYXJpYXRpb25zOiB1c2VkVmFyaWF0aW9uc30pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZUFkanVzdGFibGUocGFyZW50OiBUSFJFRS5PYmplY3QzRCwgYWRqOiBTZWxlY3Rpb24pOiBUSFJFRS5PYmplY3QzRCB7XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpIDogbnVsbDtcclxuICAgICAgICBpZiAoIW9iaikge1xyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUucmVwbGFjZSgvWy5dL2csICcnKTtcclxuICAgICAgICAgICAgb2JqID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShuYW1lKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oYE5vIG9iamVjdCB3aXRoIG5hbWUgJHthZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWV9IGZvdW5kIWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgICAgIGFkanVzdGFibGUubmFtZSA9IHRoaXMuX2NyZWF0ZVVuaXF1ZU5hbWUocGFyZW50LCBvYmopO1xyXG4gICAgICAgIGFkanVzdGFibGUudXNlckRhdGEuc2VsZWN0aW9uID0gYWRqO1xyXG4gICAgICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgICAgIGFkanVzdGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgcGFyZW50LmFkZChhZGp1c3RhYmxlKTtcclxuICAgICAgICAvLyB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIHRvIHRoZSBjdXN0b21GbG9vckdyb3VwIGlzIGJlaW5nIHJlY3JlYXRlZCBzbyB3ZSBsb29zZSB0aGUgcmVmZXJlbmNlXHJcbiAgICAgICAgLy8gdGhlcmVmb3Igd2UgbmVlZCB0byByZXRyaWV2ZSB0aGUgY3JlYXRlZCBvYmplY3QgYWdhaW5cclxuICAgICAgICAvLyBhZGp1c3RhYmxlID0gcGFyZW50LmdldE9iamVjdEJ5TmFtZShhZGp1c3RhYmxlLm5hbWUpO1xyXG4gICAgICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICAgICAgcmV0dXJuIGFkanVzdGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlQWRkYWJsZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBhZGQ6IFNlbGVjdGlvbiwgcGFydDI/OiBhbnksIHBhcnQxPzogYW55KTogVEhSRUUuT2JqZWN0M0Qge1xyXG4gICAgICAgIGNvbnN0IG9iajogYW55ID0gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgY29uc3QgYWRkYWJsZTogYW55ID0gb2JqLmNsb25lKCk7XHJcbiAgICAgICAgYWRkYWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQsIG9iaik7XHJcbiAgICAgICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICAgICAgYWRkYWJsZS5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgYWRkYWJsZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgICAgICAgcGFyZW50LmFkZChhZGRhYmxlKTtcclxuICAgICAgICAgICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMucHVzaChhZGRhYmxlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhZGRhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3BsYWNlQWRkYWJsZXMocGFyZW50OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLmhhc093blByb3BlcnR5KCdzZWxlY3Rpb24nKSAmJiB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGFibGVTZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIGlmIChhZGp1c3RhYmxlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuYTogbnVtYmVyID0gYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbkFkZGFibGU6IGFueTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpYSA9IDA7IGlhIDwgbGVuYTsgaWErKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTY2VuZVV0aWxzLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLl9zY2VuZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0sIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZCwgcGFydDI/LCBwYXJ0MT8pID0+IHRoaXMuX2NyZWF0ZUFkZGFibGUocGFyZW50LCBhZGQsIHBhcnQyLCBwYXJ0MSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uQWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NlbmVVdGlscy5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5fc2NlbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBjb25BZGRhYmxlLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkLCBwYXJ0Mj8sIHBhcnQxPykgPT4gdGhpcy5fY3JlYXRlQWRkYWJsZShwYXJlbnQsIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uQWRkYWJsZSA9IHRoaXMuX3BsYWNlZEFkZGFibGVzW3RoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVVbmlxdWVOYW1lKHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIG9iajogVEhSRUUuT2JqZWN0M0QpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgICAgIGxldCBuYW1lID0gb2JqLm5hbWU7XHJcbiAgICAgICAgbGV0IGV4aXN0aW5nT2JqID0gcGFyZW50LmdldE9iamVjdEJ5TmFtZShuYW1lKTtcclxuICAgICAgICB3aGlsZSAoZXhpc3RpbmdPYmopIHtcclxuICAgICAgICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgICAgICAgIG5hbWUgPSBvYmoubmFtZSArIChpdGVyYXRpb24gIT09IDAgPyAoJ18nICsgaXRlcmF0aW9uKSA6ICcnKTtcclxuICAgICAgICAgICAgZXhpc3RpbmdPYmogPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRHb29kSWRGcm9tU2t1KHNrdTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEdvb2RJZEZyb21Ta3Uoc2t1LCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0QXJ0aWNsZShza3U6IHN0cmluZywgZ29vZElkOiBudW1iZXIpOiBQcm9taXNlPEFydGljbGU+IHtcclxuICAgICAgICBpZiAodGhpcy5fYXJ0aWNsZUNhY2hlLmhhcyhza3UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcnRpY2xlQ2FjaGUuZ2V0KHNrdSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZ29vZElkKSB7XHJcbiAgICAgICAgICAgIGdvb2RJZCA9IGF3YWl0IHRoaXMuX2dldEdvb2RJZEZyb21Ta3Uoc2t1KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGBBcnRpY2xlIHdpdGggc2t1ICR7c2t1fSBub3QgZm91bmQhYDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgYXJ0aWNsZTogQXJ0aWNsZTtcclxuICAgICAgICBjb25zdCBhcnRpY2xlUmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGFydGljbGVSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MgJiYgYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAoYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb0FydGljbGUnKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gQXJyYXkuaXNBcnJheShhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddKSA/IGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ11bMF0gOiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddO1xyXG4gICAgICAgICAgICAgICAgYXJ0aWNsZSA9IDxBcnRpY2xlPnRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEFydGljbGUsIG9iaik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcnRpY2xlID0gPEFydGljbGU+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZSwgYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYXJ0aWNsZUNhY2hlLnNldChza3UsIGFydGljbGUpO1xyXG4gICAgICAgIHJldHVybiBhcnRpY2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2dldFNlbGVjdGlvbnMoaW5zdGFuY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0U2VsZWN0aW9ucyhmYWxzZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvblJlc3BvbnNlLnJlc3VsdE9iamVjdHMgJiYgc2VsZWN0aW9uUmVzcG9uc2UucmVzdWx0T2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnMgPSA8U2VsZWN0aW9uW10+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoU2VsZWN0aW9uLCBzZWxlY3Rpb25SZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHMgPT4gcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIHNlbGVjdGlvbnMgZm91bmQhJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVjb3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fZGVjb3MubGVuZ3RoID0gMDtcclxuICAgICAgICBjb25zdCBkZWNvc1Jlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0RGVjb3MoZmFsc2UpO1xyXG4gICAgICAgIGlmIChkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMgJiYgZGVjb3NSZXNwb25zZS5yZXN1bHRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVjb3MgPSA8RGVjb05vZGVbXT50aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShEZWNvTm9kZSwgZGVjb3NSZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyAnTm8gZGVjb25vZGVzIGZvdW5kISc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xpbmtTZWxlY3Rpb25zQW5kRGVjb3MoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpZDogc3RyaW5nID0gdGhpcy5fc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvO1xyXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5fdXNlTm9kZUlkVG9MaW5rKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBpZCA9IGAke3RoaXMuX3NlbGVjdGlvbnNbaV0ubm9kZX1fJHt0aGlzLl9zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY299YDtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICBsZXQgZGVjbzogYW55ID0gdGhpcy5fZGVjb3MuZmluZChkID0+IGQuaWQgPT09IGlkKTtcclxuICAgICAgICAgICAgaWYgKCFkZWNvKSB7XHJcbiAgICAgICAgICAgICAgICBkZWNvID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSB0aGlzLl9nZXRWYXJpYXRpb25zKCkuZmluZCh2ID0+IHYucGFyZW50SWQgPT09IHRoaXMuX3NlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgICAgIGlmICh2YXJpYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGRlY28udmFyaWF0aW9uID0gdmFyaWF0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnNbaV0uZGVjb05vZGUgPSBkZWNvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRWYXJpYXRpb25zKCk6IERlY29Ob2RlW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvcy5maWx0ZXIoKGRlY286IERlY29Ob2RlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWNvLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfbG9hZFZhcmlhdGlvbnMob2JqOiBUSFJFRS5PYmplY3QzRCwgaW5zdGFuY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRQYXJ0KG9iaiwgdGhpcy5fYWRqdXN0YWJsZXMsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5sb2FkVmFyaWF0aW9uKGluc3RhbmNlSWQsIG9iaiwgdGhpcy5fYWRqdXN0YWJsZXMsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5sb2FkVmFyaWF0aW9uKGluc3RhbmNlSWQsIG9iaiwgdGhpcy5fYWRkYWJsZXMsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldEFkanVzdGFibGVzKCk6IFNlbGVjdGlvbltdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9ucy5maWx0ZXIocyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IERlY29Ob2RlID0gcy5kZWNvTm9kZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5nYW1lT2JqZWN0TmFtZSAmJiBub2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0ICYmIG5vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlUGl2b3Qob2JqOiBUSFJFRS5PYmplY3QzRCkge1xyXG4gICAgICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iaik7XHJcbiAgICAgICAgY29uc3QgYmJDZW50ZXJQaXZvdCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGJiQ2VudGVyUGl2b3QpO1xyXG4gICAgICAgIGNvbnN0IGRlbHRhOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5zdWIoYmJDZW50ZXJQaXZvdCkuc2V0WShNYXRoLmFicyhNYXRoLm1pbihib3VuZGluZ0JveC5taW4ueSwgMCkpKTtcclxuXHJcbiAgICAgICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQucG9zaXRpb24uYWRkKGRlbHRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBvYmoudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Jlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9hZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgIH1cclxufVxyXG4iXX0=
591
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJhcHAvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBRXRFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN6RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpRUFBaUUsQ0FBQztBQUN0RyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDMUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUM1QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBSTFEO0lBeUJJLGlCQUFZLEtBQVksRUFBRSxPQUFnQixFQUFFLFlBQXFCO1FBdkIxRCx1QkFBa0IsR0FBaUMsSUFBSSxlQUFlLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDeEYsb0JBQWUsR0FBOEIsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7UUFDL0UsZ0JBQVcsR0FBb0MsSUFBSSxlQUFlLENBQWlCLElBQUksQ0FBQyxDQUFDO1FBTXhGLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQztRQUM5QixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFdBQU0sR0FBZSxFQUFFLENBQUM7UUFDeEIsdUJBQWtCLEdBQVUsRUFBRSxDQUFDO1FBQy9CLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBQzVCLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLGNBQVMsR0FBVSxFQUFFLENBQUM7UUFNdEIsa0JBQWEsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUlwRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFOUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE1BQU0sMkJBQTJCLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsTUFBTSxpQ0FBaUMsQ0FBQztTQUMzQztRQUNELElBQUksWUFBWSxFQUFFO1lBQ2QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDaEY7YUFBTTtZQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRVksNEJBQVUsR0FBdkIsVUFBd0IsR0FBWSxFQUFFLFVBQW1CLEVBQUUsTUFBZTs7Ozs7O3dCQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTs0QkFDZCxzQkFBTzt5QkFDVjs7Ozt3QkFFRyxxQkFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQUE7O3dCQUFsRCxTQUFrRCxDQUFDO3dCQUNuRCxxQkFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUE7O3dCQUF6RCxTQUF5RCxDQUFDOzZCQUN0RCxJQUFJLENBQUMsT0FBTyxFQUFaLHdCQUFZO3dCQUNaLHFCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUE7O3dCQUF4RSxTQUF3RSxDQUFDO3dCQUNuRSxRQUFRLEdBQW1CLEVBQUUsQ0FBQzt3QkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO3dCQUM1QyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQ3JELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7d0JBQ2hDLHFCQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUE7O3dCQUEzQixTQUEyQixDQUFDO3dCQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDMUIsc0JBQU87eUJBQ1Y7d0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7d0JBQy9CLHNCQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFDOzRCQUVyQyxNQUFNLHVCQUF1QixDQUFDOzs7O3dCQUdsQyxNQUFNLEdBQUMsQ0FBQzs7Ozs7S0FFZjtJQUVNLGtDQUFnQixHQUF2QixVQUF3QixNQUFjO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSx5QkFBTyxHQUFkO1FBQ0ksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVZLGlDQUFlLEdBQTVCLFVBQTZCLFNBQW9COzs7OzRCQUM3QyxxQkFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBQTs7d0JBQWpFLFNBQWlFLENBQUM7d0JBQ2xFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOzs7OztLQUNoQztJQUVZLHVDQUFxQixHQUFsQyxVQUFtQyxlQUF3Qjs7Ozs7NEJBQ1AscUJBQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBQTs7d0JBQXZILG1CQUFtQixHQUF1QixTQUE2RTt3QkFDN0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7d0JBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7OztLQUMxRDtJQUVZLDhCQUFZLEdBQXpCLFVBQTBCLE1BQWM7Ozs7OzRCQUNwQyxxQkFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBQTs7d0JBQTNELFNBQTJELENBQUM7d0JBQzVELEtBQUEsQ0FBQSxLQUFBLElBQUksQ0FBQyxXQUFXLENBQUEsQ0FBQyxJQUFJLENBQUE7d0JBQUMscUJBQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFBOzt3QkFBN0MsY0FBc0IsU0FBdUIsRUFBQyxDQUFDOzs7OztLQUNsRDtJQUVhLGdDQUFjLEdBQTVCLFVBQTZCLEdBQVcsRUFBRSxVQUFtQixFQUFFLE1BQWU7Ozs7Ozs2QkFDdEUsQ0FBQSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUEsRUFBaEMsd0JBQWdDOzZCQUM1QixDQUFDLE1BQU0sRUFBUCx3QkFBTzt3QkFDRSxxQkFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUE7O3dCQUExQyxNQUFNLEdBQUcsU0FBaUMsQ0FBQzs7O3dCQUUvQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzt3QkFDa0IscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBQTs7d0JBQTNFLE1BQU0sR0FBNEIsU0FBeUM7d0JBQ2pGLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzt5QkFDMUM7NkJBQU07NEJBQ0gsTUFBTSxvQ0FBb0MsQ0FBQzt5QkFDOUM7Ozt3QkFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTs0QkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7eUJBQ2pDOzs7d0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7NEJBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7eUJBQ25COzs7OztLQUNKO0lBRWEsdUNBQXFCLEdBQW5DLFVBQW9DLEdBQVcsRUFBRSxNQUFlOzs7Ozs0QkFDbkMscUJBQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUE7O3dCQUF0RCxPQUFPLEdBQVksU0FBbUM7NkJBQ3hELENBQUEsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUEsRUFBM0Isd0JBQTJCO3dCQUMzQixLQUFBLElBQUksQ0FBQTt3QkFBVyxxQkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7aUNBQ3BFLEtBQUssQ0FBQyxVQUFDLEtBQUs7Z0NBQ1QsTUFBTSxLQUFLLENBQUM7NEJBQ2hCLENBQUMsQ0FBQyxFQUFBOzt3QkFITixHQUFLLE9BQU8sR0FBRyxTQUdULENBQUM7d0JBQ1AsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUU7NEJBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTO2dDQUMzQixPQUFPLENBQUMsa0JBQWtCO29DQUMxQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29DQUNyRCxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUM1RDs7Ozs7O0tBRVI7SUFFYSx3QkFBTSxHQUFwQixVQUFxQixVQUFrQjs7Ozs7O3dCQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ1IsV0FBVyxHQUFnQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7NkJBQ3BELENBQUEsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBLEVBQXJDLHdCQUFxQzt3QkFDL0IsR0FBRyxHQUFtQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDakQsR0FBRyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyw0QkFBNEI7d0JBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNqQixTQUFTLEdBQUcsS0FBSyxDQUFDO3dCQUN0QixLQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFXLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDdEQsVUFBVSxHQUFtQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMvRSxJQUFJLFVBQVUsRUFBRTtnQ0FDWixLQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFXLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtvQ0FDL0UsSUFBSSxVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDNUMsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRTt3Q0FDL0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7d0NBQzNDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3dDQUMxQixTQUFTLEdBQUcsSUFBSSxDQUFDO3dDQUNqQixNQUFNO3FDQUNUO29DQUNELFNBQVMsR0FBRyxLQUFLLENBQUM7aUNBQ3JCOzZCQUNKOzRCQUNELElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUM5RDt5QkFDSjt3QkFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN2QixxQkFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBQTs7d0JBQTNDLFNBQTJDLENBQUM7d0JBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN4QixzQkFBTyxHQUFHLEVBQUM7NEJBRVgsTUFBTSx1QkFBdUIsQ0FBQzs7OztLQWFyQztJQUVPLHVDQUFxQixHQUE3QjtRQUFBLGlCQXNGQztRQXJGRyx5QkFBeUI7UUFDekIsSUFBTSxnQkFBZ0IsR0FBZSxJQUFJLENBQUMsV0FBVzthQUNoRCxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsT0FBTyxJQUFLLENBQUMsQ0FBQyxRQUFnQixDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUE5RCxDQUE4RCxDQUFDO2FBQzNFLEdBQUcsQ0FBQyxVQUFDLEtBQWdCLEVBQUUsS0FBYSxFQUFFLEtBQWtCO1lBQ3JELDhCQUE4QjtZQUM5QixJQUFNLEdBQUcsR0FBYyxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxhQUFhLEtBQU0sS0FBSyxDQUFDLFFBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBeEQsQ0FBd0QsQ0FBQyxDQUFDO1lBQzVHLElBQUksR0FBRyxFQUFFO2dCQUNKLEtBQUssQ0FBQyxRQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUM7YUFDL0U7WUFDQSxLQUFLLENBQUMsUUFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDckUsT0FBUSxLQUFLLENBQUMsUUFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFUCx1REFBdUQ7UUFDdkQsSUFBSSx1QkFBdUIsR0FBWSxJQUFJLENBQUM7UUFFNUMsSUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDNUMsSUFBSSxTQUFvQixDQUFDO1FBQ3pCLElBQUksY0FBeUIsQ0FBQztRQUM5QixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7UUFDN0IsSUFBSSxpQkFBaUIsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLFdBQWdCLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixJQUFNLFNBQVMsR0FBYyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksU0FBUyxDQUFDLGlCQUFpQixLQUFLLENBQUMsRUFBRTtnQkFDbkMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzthQUM1QztZQUNELElBQUksU0FBUyxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixFQUFFO2dCQUNqRCxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixJQUFJLFdBQVcsQ0FBQzthQUMxRTtZQUNELElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDcEIsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsU0FBUyxFQUFFO29CQUNwRCxJQUFJLFNBQVMsRUFBRTt3QkFDWCxJQUFJLE9BQU8sRUFBRTs0QkFDVCxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUMvQzs2QkFBTTs0QkFDSCxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ2pEO3dCQUNELE9BQU8sR0FBRyxLQUFLLENBQUM7cUJBQ25CO3lCQUFNO3dCQUNILElBQUksdUJBQXVCLEVBQUU7NEJBQ3pCLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7NEJBQzVCLHVCQUF1QixHQUFHLEtBQUssQ0FBQzt5QkFDbkM7d0JBQ0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDN0M7b0JBQ0QsMEVBQTBFO29CQUMxRSxrREFBa0Q7b0JBQ2xELDZEQUE2RDtvQkFDN0QsaUVBQWlFO29CQUNqRSwrRUFBK0U7b0JBQy9FLGtDQUFrQztvQkFDbEMsK0NBQStDO29CQUMvQyw2Q0FBNkM7b0JBQzdDLCtEQUErRDtvQkFDL0QsdUVBQXVFO29CQUN2RSxNQUFNO2lCQUNUO3FCQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUk7b0JBQ3BELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssUUFBUTtvQkFDckQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO29CQUMxQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxVQUFVLEVBQUU7d0JBQ3JELFNBQVMsQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNsQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRTs0QkFDckQsT0FBTyxHQUFHLElBQUksQ0FBQzt5QkFDbEI7d0JBQ0QsU0FBUyxHQUFHLFNBQVMsQ0FBQzt3QkFDdEIsY0FBYyxHQUFHLFNBQVMsQ0FBQztxQkFDOUI7eUJBQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxFQUFFO3dCQUN6RCxTQUFTLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7d0JBQ3JGLElBQUksY0FBYyxFQUFFOzRCQUNoQixjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzt5QkFDM0M7d0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQy9CLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFOzRCQUNyRCxPQUFPLEdBQUcsSUFBSSxDQUFDO3lCQUNsQjt3QkFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDO3FCQUN6QjtpQkFDSjthQUNKO1lBQ0QsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDO1NBQ25EO1FBQ0QsNkNBQTZDO1FBQzdDLG1DQUFtQztJQUN2QyxDQUFDO0lBRU8sbUNBQWlCLEdBQXpCLFVBQTBCLE1BQXNCLEVBQUUsR0FBYztRQUM1RCxJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0YsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNOLDZEQUE2RDtZQUM3RCxJQUFNLE1BQUksR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdELEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQy9ELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ04sNkVBQTZFO2dCQUM3RSxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxJQUFJLFVBQVUsR0FBUSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNwQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkIsOEZBQThGO1FBQzlGLHdEQUF3RDtRQUN4RCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRU8sZ0NBQWMsR0FBdEIsVUFBdUIsTUFBc0IsRUFBRSxHQUFjLEVBQUUsS0FBVyxFQUFFLEtBQVc7UUFDbkYsSUFBTSxHQUFHLEdBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ04sT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELDRFQUE0RTtRQUM1RSxJQUFNLE9BQU8sR0FBUSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTtZQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLE9BQU8sT0FBTyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVPLGdDQUFjLEdBQXRCLFVBQXVCLE1BQXNCO1FBQTdDLGlCQXNCQztRQXJCRyxJQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDbEgsSUFBTSxtQkFBbUIsR0FBYyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFDckYsSUFBSSxtQkFBbUIsRUFBRTtvQkFDckIsSUFBTSxJQUFJLEdBQVcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDekQsSUFBSSxVQUFVLFNBQUssQ0FBQztvQkFDcEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRTt3QkFDOUIsVUFBVSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUNwRSxVQUFDLEdBQUcsRUFBRSxLQUFNLEVBQUUsS0FBTSxJQUFLLE9BQUEsS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBOUMsQ0FBOEMsQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLFVBQVUsRUFBRTs0QkFDWixVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDeEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQ3BELFVBQUMsR0FBRyxFQUFFLEtBQU0sRUFBRSxLQUFNLElBQUssT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUE5QyxDQUE4QyxDQUFDLENBQUM7eUJBQ2hGO3dCQUNELFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUN0RTtpQkFDSjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU8sbUNBQWlCLEdBQXpCLFVBQTBCLE1BQXNCLEVBQUUsR0FBbUI7UUFDakUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxPQUFPLFdBQVcsRUFBRTtZQUNoQixTQUFTLEVBQUUsQ0FBQztZQUNaLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELFdBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVhLG1DQUFpQixHQUEvQixVQUFnQyxHQUFXOzs7Ozs0QkFDRyxxQkFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFBOzt3QkFBaEcsUUFBUSxHQUE0QixTQUE0RDt3QkFDdEcsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7NEJBQzVELHNCQUFPLFFBQVEsQ0FBQyxZQUFZLEVBQUM7eUJBQ2hDOzs7OztLQUNKO0lBRWEsNkJBQVcsR0FBekIsVUFBMEIsR0FBVyxFQUFFLE1BQWM7Ozs7Ozt3QkFDakQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDN0Isc0JBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7eUJBQ3RDOzZCQUNHLENBQUMsTUFBTSxFQUFQLHdCQUFPO3dCQUNFLHFCQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7aUNBQ3JDLEtBQUssQ0FBQyxVQUFDLEtBQUs7Z0NBQ1QsTUFBTSxzQkFBb0IsR0FBRyxnQkFBYSxDQUFDOzRCQUMvQyxDQUFDLENBQUMsRUFBQTs7d0JBSE4sTUFBTSxHQUFHLFNBR0gsQ0FBQzs7NEJBR3NDLHFCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUE7O3dCQUE1RyxlQUFlLEdBQTRCLFNBQWlFO3dCQUNsSCxJQUFJLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLFlBQVksRUFBRTs0QkFDMUUsSUFBSSxlQUFlLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQ0FDbkQsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dDQUM3SixPQUFPLEdBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7NkJBQzNFO2lDQUFNO2dDQUNILE9BQU8sR0FBWSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7NkJBQ3BHO3lCQUNKO3dCQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDckMsc0JBQU8sT0FBTyxFQUFDOzs7O0tBQ2xCO0lBRWEsZ0NBQWMsR0FBNUIsVUFBNkIsVUFBa0IsRUFBRSxlQUF3Qjs7Ozs7O3dCQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQzt3QkFDNkIscUJBQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUE7O3dCQUFsSCxpQkFBaUIsR0FBNEIsU0FBcUU7d0JBQ3hILElBQUksaUJBQWlCLENBQUMsYUFBYSxJQUFJLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUMvRSxJQUFJLENBQUMsV0FBVyxHQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDL0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBekIsQ0FBeUIsQ0FBQyxDQUFDOzRCQUN6RCw0SEFBNEg7NEJBQzVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3lCQUNsRDs2QkFBTTs0QkFDSCxNQUFNLHNCQUFzQixDQUFDO3lCQUNoQzs7Ozs7S0FDSjtJQUVhLDJCQUFTLEdBQXZCOzs7Ozs7d0JBQ0ksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7d0JBQzhCLHFCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUE7O3dCQUF4RixhQUFhLEdBQTRCLFNBQStDO3dCQUM5RixJQUFJLGFBQWEsQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUN2RSxJQUFJLENBQUMsTUFBTSxHQUFlLElBQUksQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQzt5QkFDdkg7NkJBQU07NEJBQ0gsTUFBTSxxQkFBcUIsQ0FBQzt5QkFDL0I7Ozs7O0tBQ0o7SUFFTyx5Q0FBdUIsR0FBL0I7UUFBQSxpQkFpQkM7UUFoQkcsSUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7Z0NBQ25DLENBQUM7WUFDTixJQUFJLEVBQUUsR0FBVyxPQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDbkQsK0JBQStCO1lBQy9CLCtFQUErRTtZQUMvRSxJQUFJO1lBQ0osSUFBSSxJQUFJLEdBQVEsT0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQVgsQ0FBVyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDUCxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQzthQUN6QjtZQUNELElBQU0sU0FBUyxHQUFRLE9BQUssY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsS0FBSyxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBaEQsQ0FBZ0QsQ0FBQyxDQUFDO1lBQ3pHLElBQUksU0FBUyxFQUFFO2dCQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2FBQzlCO1lBQ0QsT0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs7O1FBYnhDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFO29CQUFuQixDQUFDO1NBY1Q7SUFDTCxDQUFDO0lBRU8sZ0NBQWMsR0FBdEI7UUFDSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQUMsSUFBYztZQUNyQyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFYSxpQ0FBZSxHQUE3QixVQUE4QixHQUFtQixFQUFFLFVBQWtCOzs7OzRCQUNqRSxxQkFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFBOzt3QkFBbEUsU0FBa0UsQ0FBQzt3QkFDbkUscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUE7O3dCQUFuRixTQUFtRixDQUFDO3dCQUNwRixxQkFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBQTs7d0JBQWhGLFNBQWdGLENBQUM7Ozs7O0tBQ3BGO0lBRU8saUNBQWUsR0FBdkI7UUFDSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQztZQUM1QixJQUFNLElBQUksR0FBYSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUNuSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyw4QkFBWSxHQUFwQixVQUFxQixHQUFtQjtRQUNwQyxJQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsSUFBTSxhQUFhLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyQyxJQUFNLEtBQUssR0FBa0IsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5ILEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBVTtZQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLHdCQUFNLEdBQWQ7UUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNqQyxDQUFDOztnQkFoYmtCLEtBQUs7Z0JBQVcsT0FBTzs7O0lBekJqQyxPQUFPO1FBRG5CLFVBQVUsRUFBRTtPQUNBLE9BQU8sQ0EwY25CO0lBQUQsY0FBQztDQUFBLEFBMWNELElBMGNDO1NBMWNZLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHtPcHRpb25zfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9vcHRpb25zXCI7XHJcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhXCI7XHJcbmltcG9ydCB7RGVjb05vZGV9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZVwiO1xyXG5pbXBvcnQge0J1c2luZXNzT2JqZWN0RmFjdG9yeX0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvc2VydmljZS9idXNpbmVzcy1vYmplY3QtZmFjdG9yeVwiO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uXCI7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2RlY28tbm9kZS10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtUaHJlZWRVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3RocmVlZC51dGlsc1wiO1xyXG5pbXBvcnQge0RlY29Ob2RlS2luZH0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUta2luZC5lbnVtXCI7XHJcbmltcG9ydCB7U2NlbmVVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3NjZW5lLXV0aWxzXCI7XHJcbmltcG9ydCB7VmFyaWF0aW9uSGVscGVyfSBmcm9tIFwiLi4vaGVscGVyL3ZhcmlhdGlvbi1oZWxwZXJcIjtcclxuaW1wb3J0IHtBcnRpY2xlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlXCI7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1NlcnZpY2VMb2NhdG9yfSBmcm9tICcuL3NlcnZpY2VzL2xvY2F0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJ1aWxkZXIge1xyXG5cclxuICAgIHB1YmxpYyBzZWxlY3Rpb25zUmVjZWl2ZWQ6IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbltdPihbXSk7XHJcbiAgICBwdWJsaWMgYW5zd2Vyc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8QW5zd2VyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBbnN3ZXJbXT4oW10pO1xyXG4gICAgcHVibGljIG1vZGVsTG9hZGVkOiBCZWhhdmlvclN1YmplY3Q8VEhSRUUuT2JqZWN0M0Q+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUSFJFRS5PYmplY3QzRD4obnVsbCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2NlbmU6IFRIUkVFLlNjZW5lO1xyXG4gICAgcHJpdmF0ZSBfaW5zdGFuY2VJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2t1OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9nb29kSWQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3NlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gW107XHJcbiAgICBwcml2YXRlIF9hbnN3ZXJzOiBBbnN3ZXJbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfZGVjb3M6IERlY29Ob2RlW10gPSBbXTtcclxuICAgIHByaXZhdGUgX3BsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfcGxhY2VkQWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIF9hZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgX2FkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5O1xyXG4gICAgcHJpdmF0ZSBfc291cmNlOiBUSFJFRS5PYmplY3QzRDtcclxuICAgIHByaXZhdGUgX3RocmVlZFV0aWxzOiBUaHJlZWRVdGlscztcclxuICAgIHByaXZhdGUgX3ZhcmlhdGlvbkhlbHBlcjogVmFyaWF0aW9uSGVscGVyO1xyXG4gICAgcHJpdmF0ZSBfYXJ0aWNsZUNhY2hlOiBNYXA8c3RyaW5nLCBBcnRpY2xlPiA9IG5ldyBNYXAoKTtcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRvclNlcnZpY2U6IENvbmZpZ3VyYXRvclNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2NlbmU6IFNjZW5lLCBvcHRpb25zOiBPcHRpb25zLCB1c2VJbkFuZ3VsYXI6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9ib0ZhY3RvcnkgPSBuZXcgQnVzaW5lc3NPYmplY3RGYWN0b3J5KCk7XHJcbiAgICAgICAgdGhpcy5fdGhyZWVkVXRpbHMgPSBuZXcgVGhyZWVkVXRpbHMoKTtcclxuICAgICAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIgPSBuZXcgVmFyaWF0aW9uSGVscGVyKCk7XHJcblxyXG4gICAgICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIHNjZW5lIG9iamVjdCBwcm92aWRlZCEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIGNvbm5lY3Rpb24gb3B0aW9ucyBwcm92aWRlZCEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXNlSW5Bbmd1bGFyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoQ29uZmlndXJhdG9yU2VydmljZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZSA9IG5ldyBDb25maWd1cmF0b3JTZXJ2aWNlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuaW5pdEFwaShvcHRpb25zKTtcclxuICAgICAgICB0aGlzLl9zY2VuZSA9IHNjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsKHNrdT86IHN0cmluZywgaW5zdGFuY2VJZD86IHN0cmluZywgZ29vZElkPzogbnVtYmVyKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG4gICAgICAgIGlmICghdGhpcy5fc2NlbmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRJbnN0YW5jZUlkKHNrdSwgaW5zdGFuY2VJZCwgZ29vZElkKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZUNvbmZpZ3VyYXRpb24odGhpcy5fc2t1LCB0aGlzLl9nb29kSWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNldEluc3RhbmNlVG9Db25maWd1cmUodGhpcy5faW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5nZXRRdWVzdGlvbkFuZEFuc3dlcnMoKSk7XHJcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldFNlbGVjdGlvbnModGhpcy5faW5zdGFuY2VJZCkpO1xyXG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl9nZXREZWNvcygpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hbnN3ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGQodGhpcy5faW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyAnR0xCIHNvdXJjZSBub3QgZm91bmQhJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXROb2RlSW5zdGFuY2UoZ29vZElkOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UoZ29vZElkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90aHJlZWRVdGlscy5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmNsZWFyQ2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5nZXRRdWVzdGlvbkFuZEFuc3dlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKHB1YmxpY2F0aW9uQ29kZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uc0FuZEFuc3dlcnM6IFF1ZXN0aW9uQW5kQW5zd2VycyA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKGZhbHNlLCBwdWJsaWNhdGlvbkNvZGUpO1xyXG4gICAgICAgIHRoaXMuX2Fuc3dlcnMgPSBxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnM7XHJcbiAgICAgICAgdGhpcy5hbnN3ZXJzUmVjZWl2ZWQubmV4dChxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzZWxlY3RBbnN3ZXIoYW5zd2VyOiBBbnN3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdEFuc3dlcihhbnN3ZXIsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLm1vZGVsTG9hZGVkLm5leHQoYXdhaXQgdGhpcy5idWlsZE1vZGVsKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX3NldEluc3RhbmNlSWQoc2t1OiBzdHJpbmcsIGluc3RhbmNlSWQ/OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghaW5zdGFuY2VJZCAmJiAhdGhpcy5faW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICBpZiAoIWdvb2RJZCkge1xyXG4gICAgICAgICAgICAgICAgZ29vZElkID0gYXdhaXQgdGhpcy5fZ2V0R29vZElkRnJvbVNrdShza3UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2dvb2RJZCA9IGdvb2RJZDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuaW5pdE5vZGVJbnN0YW5jZSh0aGlzLl9nb29kSWQpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlSWQgPSByZXN1bHQucmVzdWx0T2JqZWN0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgJ0ZhaWxlZCB0byBpbml0aWFsaXplIG5vZGUgaW5zdGFuY2UnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5faW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9za3UpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2t1ID0gc2t1O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9wcmVwYXJlQ29uZmlndXJhdGlvbihza3U6IHN0cmluZywgZ29vZElkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgYXJ0aWNsZTogQXJ0aWNsZSA9IGF3YWl0IHRoaXMuX2dldEFydGljbGUoc2t1LCBnb29kSWQpO1xyXG4gICAgICAgIGlmIChhcnRpY2xlICYmIGFydGljbGUuYXNzZXRVcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlID0gYXdhaXQgdGhpcy5fdGhyZWVkVXRpbHMuZG93bmxvYWQzRFNvdXJjZShhcnRpY2xlLmFzc2V0VXJsKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmFzc2V0UGF0aCA9XHJcbiAgICAgICAgICAgICAgICAgICAgYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwgK1xyXG4gICAgICAgICAgICAgICAgICAgIChhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybC5lbmRzV2l0aCgnLycpID8gJycgOiAnLycpICtcclxuICAgICAgICAgICAgICAgICAgICAoYXJ0aWNsZS5kaXN0U2NoZW1hID8gYXJ0aWNsZS5kaXN0U2NoZW1hIDogJ1VQX0RCQScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2J1aWxkKGluc3RhbmNlSWQ6IHN0cmluZyk6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGFibGVzOiBTZWxlY3Rpb25bXSA9IHRoaXMuX2dldEFkanVzdGFibGVzKCk7XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGVzICYmIGFkanVzdGFibGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqOiBUSFJFRS5PYmplY3QzRCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgICAgICAgICBvYmoudmlzaWJsZSA9IGZhbHNlOyAvLyBubyBuZWVkIHRvIHJlbmRlciB2aXN1YWx5XHJcbiAgICAgICAgICAgIHRoaXMuX3NjZW5lLmFkZChvYmopO1xyXG4gICAgICAgICAgICBsZXQgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW46IG51bWJlciA9IGFkanVzdGFibGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RhYmxlOiBUSFJFRS5PYmplY3QzRCA9IHRoaXMuX2NyZWF0ZUFkanVzdGFibGUob2JqLCBhZGp1c3RhYmxlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWRqdXN0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gMCwgbGVuaWk6IG51bWJlciA9IHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aDsgaWkgPCBsZW5paTsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2NlbmVVdGlscy5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5fc2NlbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmosIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2lpXSwgYWRqdXN0YWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2lpXS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0ZWQgJiYgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gY29ubmVjdGlvbiBmb3VuZCBmb3I6ICcsIGFkanVzdGFibGUubmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcGxhY2VBZGRhYmxlcyhvYmopO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVQaXZvdChvYmopO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkVmFyaWF0aW9ucyhvYmosIGluc3RhbmNlSWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9zY2VuZS5yZW1vdmUob2JqKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyAnTm8gYWRqdXN0YWJsZXMgZm91bmQhJztcclxuICAgICAgICAgICAgLy8gdGhpcy5fYnVpbGRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lcnJvclNlcnZpY2UuYWRkRXJyb3IodGhpcy5hY3RpdmVJbnN0YW5jZSwge21lc3NhZ2U6ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TJywgZGVzY3JpcHRpb246ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob1NlbGVjdGlvbnN9KTtcclxuICAgICAgICAgICAgLy8gfSBlbHNlIGlmICh0aGlzLmRlY29zLnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuX2Vycm9yU2VydmljZS5hZGRFcnJvcih0aGlzLmFjdGl2ZUluc3RhbmNlLCB7bWVzc2FnZTogJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCBkZXNjcmlwdGlvbjogJ05PX1NFTEVDVElPTlNfT1JfREVDT1NfSU5GTyd9KTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHtpbnN0YW5jZUlkOiB0aGlzLmFjdGl2ZUluc3RhbmNlLCByZXN1bHRUeXBlOiBSZXN1bHRUeXBlLk5vRGVjb05vZGVzfSk7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lcnJvclNlcnZpY2UuYWRkRXJyb3IodGhpcy5hY3RpdmVJbnN0YW5jZSwge21lc3NhZ2U6ICdOT19BREpVU1RBQkxFUycsIGRlc2NyaXB0aW9uOiAnTk9fQURKVVNUQUJMRVNfSU5GTyd9KTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHtpbnN0YW5jZUlkOiB0aGlzLmFjdGl2ZUluc3RhbmNlLCByZXN1bHRUeXBlOiBSZXN1bHRUeXBlLk5vQWRqdXN0YWJsZXN9KTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcmVwYXJlVGhlU2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICAvLyBnZXQgZ2VuZXJpYyB2YXJpYXRpb25zXHJcbiAgICAgICAgY29uc3QgZ2xvYmFsVmFyaWF0aW9uczogRGVjb05vZGVbXSA9IHRoaXMuX3NlbGVjdGlvbnNcclxuICAgICAgICAgICAgLmZpbHRlcihzID0+IHMuZ2VuZXJpYyAmJiAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbiAmJiAhcy5kZWNvTm9kZS50eXBlKVxyXG4gICAgICAgICAgICAubWFwKCh2YWx1ZTogU2VsZWN0aW9uLCBpbmRleDogbnVtYmVyLCBhcnJheTogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGZpbmQgc2VsZWN0aW9uIG9mIHZhcmlhdGlvblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsOiBTZWxlY3Rpb24gPSB0aGlzLl9zZWxlY3Rpb25zLmZpbmQocyA9PiBzLmFydE5vZGVJZERlY28gPT09ICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yID0gc2VsLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB2YWx1ZS5oZGVjb0dhbWVPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gY29uc3QgdXNlZFZhcmlhdGlvbnM6IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb25bXSA9IFtdO1xyXG4gICAgICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5fc2VsZWN0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGxhc3RBZGRlZDogU2VsZWN0aW9uO1xyXG4gICAgICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgICAgIGxldCBuZXdQYXJ0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzUHJlc0xldmVsOiBudW1iZXIgPSAtMTtcclxuICAgICAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25pbmcgPSBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmcgfHwgcG9zaXRpb25pbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZS50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RBZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEFkZGVkLnZhcmlhdGlvbnMgPSBbc2VsZWN0aW9uLmRlY29Ob2RlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goc2VsZWN0aW9uLmRlY29Ob2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMucHVzaChzZWxlY3Rpb24uZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCB2YXJpYXRpb246IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24gPSBuZXcgRnVybml0dXJlUGFydFZhcmlhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5CcmFuZElkID0gc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWF0aW9uLkRlc2NyaXB0aW9uID0gc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5NYXRlcmlhbElkID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWF0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZWRWYXJpYXRpb25zLnB1c2godmFyaWF0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl91cHNlcnRGdXJuaXR1cmUodGhpcy5hY3RpdmVJbnN0YW5jZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBWYXJpYXRpb246IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBWYXJpYXRpb25EZXNjcmlwdGlvbjogc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBTdXBwbGllckFydGljbGVOcjogKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLnN1cHBsaWVyQXJ0aWNsZU5yXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZS50eXBlID09PSBEZWNvTm9kZVR5cGUuUGFydCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGp1c3RhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdEFkZGVkIHx8IGxhc3RBZGRlZC5ub2RlSWQgIT09IHNlbGVjdGlvbi5ub2RlSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZCA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEFkanVzdGFibGUgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBsYXN0QWRqdXN0YWJsZSA/IGxhc3RBZGp1c3RhYmxlLnZhcmlhdGlvbnMgOiBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGp1c3RhYmxlLmFkZGFibGVzLnB1c2goc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdEFkZGVkIHx8IGxhc3RBZGRlZC5ub2RlSWQgIT09IHNlbGVjdGlvbi5ub2RlSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZCA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJldmlvdXNQcmVzTGV2ZWwgPSBzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZSh0aGlzLmFjdGl2ZUluc3RhbmNlLFxyXG4gICAgICAgIC8vICAge1ZhcmlhdGlvbnM6IHVzZWRWYXJpYXRpb25zfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlQWRqdXN0YWJsZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBhZGo6IFNlbGVjdGlvbik6IFRIUkVFLk9iamVjdDNEIHtcclxuICAgICAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLl9zb3VyY2UgPyB0aGlzLl9zb3VyY2UuZ2V0T2JqZWN0QnlOYW1lKGFkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSkgOiBudWxsO1xyXG4gICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZ2xiIGZpbGVzLCB0aGUgaW1wb3J0ZXIgcmVtb3ZlcyBkb3RzIGZyb20gbmFtZXNcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5yZXBsYWNlKC9bLl0vZywgJycpO1xyXG4gICAgICAgICAgICBvYmogPSB0aGlzLl9zb3VyY2UgPyB0aGlzLl9zb3VyY2UuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpIDogbnVsbDtcclxuICAgICAgICAgICAgaWYgKCFvYmopIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgTm8gb2JqZWN0IHdpdGggbmFtZSAke2Fkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZX0gZm91bmQhYCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgYWRqdXN0YWJsZTogYW55ID0gb2JqLmNsb25lKCk7XHJcbiAgICAgICAgYWRqdXN0YWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQsIG9iaik7XHJcbiAgICAgICAgYWRqdXN0YWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGo7XHJcbiAgICAgICAgYWRqdXN0YWJsZS5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgYWRqdXN0YWJsZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBwYXJlbnQuYWRkKGFkanVzdGFibGUpO1xyXG4gICAgICAgIC8vIHRoZSBvYmplY3QgYmVpbmcgYWRkZWQgdG8gdGhlIGN1c3RvbUZsb29yR3JvdXAgaXMgYmVpbmcgcmVjcmVhdGVkIHNvIHdlIGxvb3NlIHRoZSByZWZlcmVuY2VcclxuICAgICAgICAvLyB0aGVyZWZvciB3ZSBuZWVkIHRvIHJldHJpZXZlIHRoZSBjcmVhdGVkIG9iamVjdCBhZ2FpblxyXG4gICAgICAgIC8vIGFkanVzdGFibGUgPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKGFkanVzdGFibGUubmFtZSk7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMucHVzaChhZGp1c3RhYmxlKTtcclxuICAgICAgICByZXR1cm4gYWRqdXN0YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVBZGRhYmxlKHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIGFkZDogU2VsZWN0aW9uLCBwYXJ0Mj86IGFueSwgcGFydDE/OiBhbnkpOiBUSFJFRS5PYmplY3QzRCB7XHJcbiAgICAgICAgY29uc3Qgb2JqOiBhbnkgPSB0aGlzLl9zb3VyY2UuZ2V0T2JqZWN0QnlOYW1lKGFkZC5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSk7XHJcbiAgICAgICAgaWYgKCFvYmopIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VsZWN0aW9uRnJvbUlkKGFkai5hcnROb2RlSWREZWNvKTtcclxuICAgICAgICBjb25zdCBhZGRhYmxlOiBhbnkgPSBvYmouY2xvbmUoKTtcclxuICAgICAgICBhZGRhYmxlLm5hbWUgPSB0aGlzLl9jcmVhdGVVbmlxdWVOYW1lKHBhcmVudCwgb2JqKTtcclxuICAgICAgICBhZGRhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkZDtcclxuICAgICAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgICAgICBhZGRhYmxlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIGlmIChwYXJ0MSAmJiBwYXJ0Mikge1xyXG4gICAgICAgICAgICBwYXJlbnQuYWRkKGFkZGFibGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5wdXNoKGFkZGFibGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWRkYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcGxhY2VBZGRhYmxlcyhwYXJlbnQ6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuaGFzT3duUHJvcGVydHkoJ3NlbGVjdGlvbicpICYmIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0YWJsZVNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFkanVzdGFibGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5hOiBudW1iZXIgPSBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29uQWRkYWJsZTogYW55O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlhID0gMDsgaWEgPCBsZW5hOyBpYSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNjZW5lVXRpbHMuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuX3NjZW5lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXSwgYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlc1tpYV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkLCBwYXJ0Mj8sIHBhcnQxPykgPT4gdGhpcy5fY3JlYXRlQWRkYWJsZShwYXJlbnQsIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2VuZVV0aWxzLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLl9zY2VuZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGNvbkFkZGFibGUsIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLl9jcmVhdGVBZGRhYmxlKHBhcmVudCwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25BZGRhYmxlID0gdGhpcy5fcGxhY2VkQWRkYWJsZXNbdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZVVuaXF1ZU5hbWUocGFyZW50OiBUSFJFRS5PYmplY3QzRCwgb2JqOiBUSFJFRS5PYmplY3QzRCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IDA7XHJcbiAgICAgICAgbGV0IG5hbWUgPSBvYmoubmFtZTtcclxuICAgICAgICBsZXQgZXhpc3RpbmdPYmogPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgICAgIHdoaWxlIChleGlzdGluZ09iaikge1xyXG4gICAgICAgICAgICBpdGVyYXRpb24rKztcclxuICAgICAgICAgICAgbmFtZSA9IG9iai5uYW1lICsgKGl0ZXJhdGlvbiAhPT0gMCA/ICgnXycgKyBpdGVyYXRpb24pIDogJycpO1xyXG4gICAgICAgICAgICBleGlzdGluZ09iaiA9IHBhcmVudC5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2dldEdvb2RJZEZyb21Ta3Uoc2t1OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0R29vZElkRnJvbVNrdShza3UsIGZhbHNlKTtcclxuICAgICAgICBpZiAocmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzICYmIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0T2JqZWN0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRBcnRpY2xlKHNrdTogc3RyaW5nLCBnb29kSWQ6IG51bWJlcik6IFByb21pc2U8QXJ0aWNsZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9hcnRpY2xlQ2FjaGUuaGFzKHNrdSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FydGljbGVDYWNoZS5nZXQoc2t1KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFnb29kSWQpIHtcclxuICAgICAgICAgICAgZ29vZElkID0gYXdhaXQgdGhpcy5fZ2V0R29vZElkRnJvbVNrdShza3UpXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgYEFydGljbGUgd2l0aCBza3UgJHtza3V9IG5vdCBmb3VuZCFgO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhcnRpY2xlOiBBcnRpY2xlO1xyXG4gICAgICAgIGNvbnN0IGFydGljbGVSZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEFydGljbGVRdWlja1NlbChnb29kSWQsIGZhbHNlKTtcclxuICAgICAgICBpZiAoYXJ0aWNsZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmIChhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0Lmhhc093blByb3BlcnR5KCdvQXJ0aWNsZScpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBBcnJheS5pc0FycmF5KGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ10pID8gYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdFsnb0FydGljbGUnXVswXSA6IGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ107XHJcbiAgICAgICAgICAgICAgICBhcnRpY2xlID0gPEFydGljbGU+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZSwgb2JqKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFydGljbGUgPSA8QXJ0aWNsZT50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlLCBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hcnRpY2xlQ2FjaGUuc2V0KHNrdSwgYXJ0aWNsZSk7XHJcbiAgICAgICAgcmV0dXJuIGFydGljbGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0U2VsZWN0aW9ucyhpbnN0YW5jZUlkOiBzdHJpbmcsIHB1YmxpY2F0aW9uQ29kZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb25SZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbnMoZmFsc2UsIHB1YmxpY2F0aW9uQ29kZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvblJlc3BvbnNlLnJlc3VsdE9iamVjdHMgJiYgc2VsZWN0aW9uUmVzcG9uc2UucmVzdWx0T2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnMgPSA8U2VsZWN0aW9uW10+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoU2VsZWN0aW9uLCBzZWxlY3Rpb25SZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHMgPT4gcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnN0IGZpbHRlcmVkOiBTZWxlY3Rpb25bXSA9IHRoaXMuX3NlbGVjdGlvbnMuZmlsdGVyKHMgPT4gcy5ub2RlVHlwZSAhPT0gTm9kZVR5cGUuQXJ0aWNsZSAmJiBzLnByZXNlbnRhdGlvbkxldmVsID09PSAxKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25zUmVjZWl2ZWQubmV4dCh0aGlzLl9zZWxlY3Rpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyAnTm8gc2VsZWN0aW9ucyBmb3VuZCEnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXREZWNvcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLl9kZWNvcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRlY29zUmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXREZWNvcyhmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRlY29zUmVzcG9uc2UucmVzdWx0T2JqZWN0cyAmJiBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWNvcyA9IDxEZWNvTm9kZVtdPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KERlY29Ob2RlLCBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93ICdObyBkZWNvbm9kZXMgZm91bmQhJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbGlua1NlbGVjdGlvbnNBbmREZWNvcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGlkOiBzdHJpbmcgPSB0aGlzLl9zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY287XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLl91c2VOb2RlSWRUb0xpbmspIHtcclxuICAgICAgICAgICAgLy8gICAgIGlkID0gYCR7dGhpcy5fc2VsZWN0aW9uc1tpXS5ub2RlfV8ke3RoaXMuX3NlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjb31gO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIGxldCBkZWNvOiBhbnkgPSB0aGlzLl9kZWNvcy5maW5kKGQgPT4gZC5pZCA9PT0gaWQpO1xyXG4gICAgICAgICAgICBpZiAoIWRlY28pIHtcclxuICAgICAgICAgICAgICAgIGRlY28gPSBuZXcgRGVjb05vZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB2YXJpYXRpb246IGFueSA9IHRoaXMuX2dldFZhcmlhdGlvbnMoKS5maW5kKHYgPT4gdi5wYXJlbnRJZCA9PT0gdGhpcy5fc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvKTtcclxuICAgICAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uc1tpXS5kZWNvTm9kZSA9IGRlY287XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldFZhcmlhdGlvbnMoKTogRGVjb05vZGVbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29zLmZpbHRlcigoZGVjbzogRGVjb05vZGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlY28udHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9sb2FkVmFyaWF0aW9ucyhvYmo6IFRIUkVFLk9iamVjdDNELCBpbnN0YW5jZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLl92YXJpYXRpb25IZWxwZXIubG9hZFBhcnQob2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24oaW5zdGFuY2VJZCwgb2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24oaW5zdGFuY2VJZCwgb2JqLCB0aGlzLl9hZGRhYmxlcywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0QWRqdXN0YWJsZXMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25zLmZpbHRlcihzID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZTogRGVjb05vZGUgPSBzLmRlY29Ob2RlO1xyXG4gICAgICAgICAgICByZXR1cm4gbm9kZSAmJiBub2RlLmdhbWVPYmplY3ROYW1lICYmIG5vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiYgbm9kZS5raW5kID09PSBEZWNvTm9kZUtpbmQuQWRqdXN0YWJsZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF91cGRhdGVQaXZvdChvYmo6IFRIUkVFLk9iamVjdDNEKSB7XHJcbiAgICAgICAgY29uc3QgYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqKTtcclxuICAgICAgICBjb25zdCBiYkNlbnRlclBpdm90ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgICAgICBib3VuZGluZ0JveC5nZXRDZW50ZXIoYmJDZW50ZXJQaXZvdCk7XHJcbiAgICAgICAgY29uc3QgZGVsdGE6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpLnN1YihiYkNlbnRlclBpdm90KS5zZXRZKE1hdGguYWJzKE1hdGgubWluKGJvdW5kaW5nQm94Lm1pbi55LCAwKSkpO1xyXG5cclxuICAgICAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjaGlsZC5wb3NpdGlvbi5hZGQoZGVsdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9iai51cGRhdGVXb3JsZE1hdHJpeChmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2FkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fYWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlVGhlU2VsZWN0aW9ucygpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -1,17 +1,20 @@
1
- import { __decorate } from "tslib";
1
+ import { __awaiter, __decorate, __generator } from "tslib";
2
2
  import { Component, Input } from '@angular/core';
3
3
  import { ImageCacheService } from '../../../services/image-cache.service';
4
4
  import { animate, state, style, transition, trigger } from '@angular/animations';
5
5
  var AnswerComponent = /** @class */ (function () {
6
6
  function AnswerComponent(_imageCacheService) {
7
7
  this._imageCacheService = _imageCacheService;
8
- this.thumbnailLoaded = false;
9
8
  }
10
9
  Object.defineProperty(AnswerComponent.prototype, "showing", {
11
10
  set: function (value) {
12
- if (value) {
11
+ this.answer.imageData = '';
12
+ if (value && this.answer.answer !== 'Skip / Cancel') {
13
13
  this._loadThumbnail(this.answer);
14
14
  }
15
+ else {
16
+ this.answer.imageData = null;
17
+ }
15
18
  },
16
19
  enumerable: true,
17
20
  configurable: true
@@ -19,10 +22,17 @@ var AnswerComponent = /** @class */ (function () {
19
22
  AnswerComponent.prototype.ngOnInit = function () {
20
23
  };
21
24
  AnswerComponent.prototype._loadThumbnail = function (answer) {
22
- var _this = this;
23
- this._imageCacheService.getImageForSelectionOrAnswer(answer).then(function (imageSrc) {
24
- answer.imageData = imageSrc;
25
- _this.thumbnailLoaded = true;
25
+ return __awaiter(this, void 0, void 0, function () {
26
+ return __generator(this, function (_a) {
27
+ switch (_a.label) {
28
+ case 0: return [4 /*yield*/, this._imageCacheService.getImageForSelectionOrAnswer(answer).then(function (imageSrc) {
29
+ answer.imageData = imageSrc === "" ? null : imageSrc;
30
+ })];
31
+ case 1:
32
+ _a.sent();
33
+ return [2 /*return*/];
34
+ }
35
+ });
26
36
  });
27
37
  };
28
38
  AnswerComponent.ctorParameters = function () { return [
@@ -37,7 +47,7 @@ var AnswerComponent = /** @class */ (function () {
37
47
  AnswerComponent = __decorate([
38
48
  Component({
39
49
  selector: 'answer',
40
- template: "\n <ng-container>\n <div class=\"selection\" @answerAppear>\n <div class=\"thumbnail\">\n <rp-loader *ngIf=\"!thumbnailLoaded\"></rp-loader>\n <img *ngIf=\"answer.imageData\" class=\"img-size\" [src]=\"answer.imageData\">\n </div>\n <div class=\"titles\">\n <div class=\"answer\" [textContent]=\"answer.commercialAnswer\"></div>\n </div>\n </div>\n </ng-container>\n ",
50
+ template: "\n <div class=\"ione-configurator\">\n <div class=\"answer-wrapper\">\n <div class=\"answer-content\" @answerAppear>\n <div class=\"answer-thumbnail\">\n <rp-loader *ngIf=\"answer.imageData === ''\"></rp-loader>\n <img *ngIf=\"answer.imageData !== '' && answer.imageData !== null\" class=\"answer-img\" [src]=\"answer.imageData\">\n </div>\n <div class=\"answer-title-wrapper\">\n <span class=\"answer-title\" [textContent]=\"answer.commercialAnswer\"></span>\n </div>\n <div class=\"price\">\n <span class=\"price-value\"></span>\n </div>\n </div>\n </div>\n </div>\n ",
41
51
  animations: [
42
52
  trigger('answerAppear', [
43
53
  state('void', style({ 'background': '#dbdbdb' })),
@@ -45,10 +55,10 @@ var AnswerComponent = /** @class */ (function () {
45
55
  transition('void <=> *', animate(500))
46
56
  ])
47
57
  ],
48
- styles: [".answer{font-size:12px;position:relative;overflow:hidden;cursor:pointer}", ".selection{position:relative;overflow:hidden;cursor:pointer;font-size:12px;border:1px solid #d3d3d3;padding:10px;display:flex;flex-direction:row;border-radius:3px;margin-bottom:3px;box-shadow:2px 1px rgba(211,211,211,.5);background:#fff}.thumbnail{width:54px;min-width:54px;height:54px;min-height:54px;border:1px solid #d3d3d3;border-radius:5px}.img-size{width:54px;min-width:54px;height:54px;min-height:54px;border-radius:5px}.unloaded{background-color:#d3d3d3}.titles{margin-left:14px;-ms-grid-row-align:center;align-self:center}"]
58
+ styles: [".ione-configurator .rp-answers-slideout{position:absolute;top:0;right:0;width:400px;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content}.ione-configurator .answers-title{margin-left:10px;color:#1a1a1a}.ione-configurator .answers-container{height:100vh;overflow-y:scroll}.ione-configurator .answer-content{position:relative;overflow:hidden;cursor:pointer;font-size:12px;border:1px solid #d3d3d3;padding:10px;display:flex;flex-direction:row;border-radius:3px;margin-bottom:3px;box-shadow:2px 1px rgba(211,211,211,.5);background:#fff}.ione-configurator .thumbnail{width:54px;min-width:54px;height:54px;min-height:54px;border:1px solid #d3d3d3;border-radius:5px}.ione-configurator .img-size{width:54px;min-width:54px;height:54px;min-height:54px;border-radius:5px}.ione-configurator .answer-wrapper{display:block}.ione-configurator .answer-title{font-size:12px;position:relative;overflow:hidden;cursor:pointer}.ione-configurator .question{font-weight:700;color:#1a1a1a}.ione-configurator .answer{font-size:12px;font-style:italic;margin-top:3px}.ione-configurator .collapse-content,.ione-configurator .collapse-wrapper{display:block}.ione-configurator .collapse-handle{position:absolute;top:10px;right:12px;border:solid #000;border-width:0 3px 3px 0;display:inline-block;padding:3px;transform:rotate(45deg);-webkit-transform:rotate(45deg)}.ione-configurator .collapse-handle.expanded{transform:rotate(-135deg);-webkit-transform:rotate(-135deg)}.ione-configurator .child-selection{margin-left:10px;display:flex;flex-direction:column;margin-top:5px}.ione-configurator .mat-title{margin-left:10px;color:#1a1a1a}.ione-configurator .drawer__header{height:48px}.ione-configurator .rp-selections-summary{height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;background:0 0;overflow:auto;position:absolute;top:0;right:0;width:400px}.ione-configurator .selections-content{overflow-y:auto}.ione-configurator .co-summary-line{position:relative;overflow:hidden;cursor:pointer;font-size:12px;border:1px solid #d3d3d3;padding:10px;display:flex;flex-direction:row;border-radius:3px;margin-bottom:3px;box-shadow:2px 1px rgba(211,211,211,.5);background:#fff}.ione-configurator .selection-thumbnail{width:54px;min-width:54px;height:54px;min-height:54px;border:1px solid #d3d3d3;border-radius:5px}.ione-configurator .selection-img{width:54px;min-width:54px;height:54px;min-height:54px;border-radius:5px}.ione-configurator .answer-thumbnail{width:54px;min-width:54px;height:54px;min-height:54px;border:1px solid #d3d3d3;border-radius:5px}.ione-configurator .answer-img{width:54px;min-width:54px;height:54px;min-height:54px;border-radius:5px}.ione-configurator .unloaded{background-color:#d3d3d3}.ione-configurator .titles{margin-left:14px;-ms-grid-row-align:center;align-self:center}.ione-configurator .title-wrapper{display:flex;flex-direction:column}.ione-configurator .answer-title-wrapper{text-align:center;-ms-grid-row-align:center;align-self:center;margin-left:14px}"]
49
59
  })
50
60
  ], AnswerComponent);
51
61
  return AnswerComponent;
52
62
  }());
53
63
  export { AnswerComponent };
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5zd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJhcHAvY29tcG9uZW50cy9hbnN3ZXJzL2Fuc3dlci9hbnN3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBNkIvRTtJQWFFLHlCQUFvQixrQkFBcUM7UUFBckMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUZsRCxvQkFBZSxHQUFHLEtBQUssQ0FBQztJQUU4QixDQUFDO0lBUjlELHNCQUFXLG9DQUFPO2FBQWxCLFVBQW1CLEtBQWM7WUFDL0IsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDOzs7T0FBQTtJQU1NLGtDQUFRLEdBQWY7SUFDQSxDQUFDO0lBRU8sd0NBQWMsR0FBdEIsVUFBdUIsTUFBYztRQUFyQyxpQkFLQztRQUpDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxRQUFnQjtZQUNqRixNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztZQUM1QixLQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2dCQVZ1QyxpQkFBaUI7O0lBWHpEO1FBREMsS0FBSyxFQUFFO21EQUNjO0lBR3RCO1FBREMsS0FBSyxFQUFFO2tEQUtQO0lBVFUsZUFBZTtRQTNCM0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLHliQVlUO1lBS0QsVUFBVSxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxjQUFjLEVBQUU7b0JBQ3RCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUMsWUFBWSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7b0JBQy9DLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUMsWUFBWSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7b0JBQzlDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN2QyxDQUFDO2FBQ0g7O1NBQ0YsQ0FBQztPQUNXLGVBQWUsQ0F3QjNCO0lBQUQsc0JBQUM7Q0FBQSxBQXhCRCxJQXdCQztTQXhCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJbWFnZUNhY2hlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaW1hZ2UtY2FjaGUuc2VydmljZSc7XG5pbXBvcnQge0Fuc3dlcn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hbnN3ZXInO1xuaW1wb3J0IHthbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbnN3ZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0aW9uXCIgQGFuc3dlckFwcGVhcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRodW1ibmFpbFwiPlxuICAgICAgICAgIDxycC1sb2FkZXIgKm5nSWY9XCIhdGh1bWJuYWlsTG9hZGVkXCI+PC9ycC1sb2FkZXI+XG4gICAgICAgICAgPGltZyAqbmdJZj1cImFuc3dlci5pbWFnZURhdGFcIiBjbGFzcz1cImltZy1zaXplXCIgW3NyY109XCJhbnN3ZXIuaW1hZ2VEYXRhXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFuc3dlclwiIFt0ZXh0Q29udGVudF09XCJhbnN3ZXIuY29tbWVyY2lhbEFuc3dlclwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICBgLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi9hbnN3ZXIuY29tcG9uZW50LnNjc3MnLFxuICAgICcuLi8uLi8uLi8uLi9zdHlsZS9zaGFyZWQuc2NzcydcbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2Fuc3dlckFwcGVhcicsIFtcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeydiYWNrZ3JvdW5kJzogJyNkYmRiZGInfSkpLFxuICAgICAgc3RhdGUoJ3doaXRlJywgc3R5bGUoeydiYWNrZ3JvdW5kJzogJ3doaXRlJ30pKSxcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPD0+IConLCBhbmltYXRlKDUwMCkpXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBbnN3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwdWJsaWMgYW5zd2VyOiBBbnN3ZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzaG93aW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9sb2FkVGh1bWJuYWlsKHRoaXMuYW5zd2VyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdGh1bWJuYWlsTG9hZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaW1hZ2VDYWNoZVNlcnZpY2U6IEltYWdlQ2FjaGVTZXJ2aWNlKSB7IH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkVGh1bWJuYWlsKGFuc3dlcjogQW5zd2VyKTogdm9pZCB7XG4gICAgdGhpcy5faW1hZ2VDYWNoZVNlcnZpY2UuZ2V0SW1hZ2VGb3JTZWxlY3Rpb25PckFuc3dlcihhbnN3ZXIpLnRoZW4oKGltYWdlU3JjOiBzdHJpbmcpID0+IHtcbiAgICAgIGFuc3dlci5pbWFnZURhdGEgPSBpbWFnZVNyYztcbiAgICAgIHRoaXMudGh1bWJuYWlsTG9hZGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxufVxuIl19
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5zd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJhcHAvY29tcG9uZW50cy9hbnN3ZXJzL2Fuc3dlci9hbnN3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBaUMvRTtJQWNFLHlCQUFvQixrQkFBcUM7UUFBckMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtJQUFJLENBQUM7SUFUOUQsc0JBQVcsb0NBQU87YUFBbEIsVUFBbUIsS0FBYztZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssZUFBZSxFQUFFO2dCQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNsQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7YUFDOUI7UUFDSCxDQUFDOzs7T0FBQTtJQUlNLGtDQUFRLEdBQWY7SUFDQSxDQUFDO0lBRWEsd0NBQWMsR0FBNUIsVUFBNkIsTUFBYzs7Ozs0QkFDekMscUJBQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLFFBQWdCOzRCQUN2RixNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO3dCQUN2RCxDQUFDLENBQUMsRUFBQTs7d0JBRkYsU0FFRSxDQUFDOzs7OztLQUNKOztnQkFUdUMsaUJBQWlCOztJQVp6RDtRQURDLEtBQUssRUFBRTttREFDYztJQUd0QjtRQURDLEtBQUssRUFBRTtrREFRUDtJQVpVLGVBQWU7UUEvQjNCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSw0ckJBaUJUO1lBSUQsVUFBVSxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxjQUFjLEVBQUU7b0JBQ3RCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUMsWUFBWSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7b0JBQy9DLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUMsWUFBWSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7b0JBQzlDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN2QyxDQUFDO2FBQ0g7O1NBQ0YsQ0FBQztPQUNXLGVBQWUsQ0F3QjNCO0lBQUQsc0JBQUM7Q0FBQSxBQXhCRCxJQXdCQztTQXhCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJbWFnZUNhY2hlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaW1hZ2UtY2FjaGUuc2VydmljZSc7XG5pbXBvcnQge0Fuc3dlcn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hbnN3ZXInO1xuaW1wb3J0IHthbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbnN3ZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJpb25lLWNvbmZpZ3VyYXRvclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImFuc3dlci13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnN3ZXItY29udGVudFwiIEBhbnN3ZXJBcHBlYXI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFuc3dlci10aHVtYm5haWxcIj5cbiAgICAgICAgICAgIDxycC1sb2FkZXIgKm5nSWY9XCJhbnN3ZXIuaW1hZ2VEYXRhID09PSAnJ1wiPjwvcnAtbG9hZGVyPlxuICAgICAgICAgICAgPGltZyAqbmdJZj1cImFuc3dlci5pbWFnZURhdGEgIT09ICcnICYmIGFuc3dlci5pbWFnZURhdGEgIT09IG51bGxcIiBjbGFzcz1cImFuc3dlci1pbWdcIiBbc3JjXT1cImFuc3dlci5pbWFnZURhdGFcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5zd2VyLXRpdGxlLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5zd2VyLXRpdGxlXCIgW3RleHRDb250ZW50XT1cImFuc3dlci5jb21tZXJjaWFsQW5zd2VyXCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljZS12YWx1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4uLy4uLy4uLy4uL3N0eWxlL3NoYXJlZC5zY3NzJ1xuICBdLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignYW5zd2VyQXBwZWFyJywgW1xuICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7J2JhY2tncm91bmQnOiAnI2RiZGJkYid9KSksXG4gICAgICBzdGF0ZSgnd2hpdGUnLCBzdHlsZSh7J2JhY2tncm91bmQnOiAnd2hpdGUnfSkpLFxuICAgICAgdHJhbnNpdGlvbigndm9pZCA8PT4gKicsIGFuaW1hdGUoNTAwKSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFuc3dlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhbnN3ZXI6IEFuc3dlcjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNob3dpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFuc3dlci5pbWFnZURhdGEgPSAnJztcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5hbnN3ZXIuYW5zd2VyICE9PSAnU2tpcCAvIENhbmNlbCcpIHtcbiAgICAgIHRoaXMuX2xvYWRUaHVtYm5haWwodGhpcy5hbnN3ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFuc3dlci5pbWFnZURhdGEgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltYWdlQ2FjaGVTZXJ2aWNlOiBJbWFnZUNhY2hlU2VydmljZSkgeyB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfbG9hZFRodW1ibmFpbChhbnN3ZXI6IEFuc3dlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2ltYWdlQ2FjaGVTZXJ2aWNlLmdldEltYWdlRm9yU2VsZWN0aW9uT3JBbnN3ZXIoYW5zd2VyKS50aGVuKChpbWFnZVNyYzogc3RyaW5nKSA9PiB7XG4gICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gaW1hZ2VTcmMgPT09IFwiXCIgPyBudWxsIDogaW1hZ2VTcmM7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==