@colijnit/homedecorator 258.1.1 → 258.1.2

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 (92) hide show
  1. package/app/core/enum/icon.enum.d.ts +1 -0
  2. package/app/core/enum/message-type.enum.d.ts +2 -1
  3. package/app/core/interface/message-with-payload.interface.d.ts +1 -0
  4. package/app/core/model/homedecorator-settings-options.d.ts +1 -1
  5. package/app/core/model/homedecorator-settings.d.ts +3 -0
  6. package/app/core/service/3dm-api.d.ts +2 -2
  7. package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
  8. package/app/core/service/homedecorator-connector-adapter.service.d.ts +9 -1
  9. package/app/core/service/homedecorator-connector.service.d.ts +15 -2
  10. package/app/core/service/utils.service.d.ts +1 -1
  11. package/app/core/utils/object.utils.d.ts +2 -0
  12. package/app/homedecorator.module.d.ts +2 -1
  13. package/app/plugins/core3d/service/wall-measurements.service.d.ts +2 -0
  14. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +3 -0
  15. package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +2 -0
  16. package/app/plugins/product-configurator/product-configurator-selector-list-of-values.component.scss +28 -0
  17. package/app/plugins/product-configurator/product-configurator-selector-option-button.component.d.ts +19 -0
  18. package/app/plugins/product-configurator/product-configurator-selector-option-button.component.scss +38 -0
  19. package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.d.ts +20 -0
  20. package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.scss +0 -0
  21. package/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.d.ts +19 -0
  22. package/app/plugins/product-configurator/product-configurator-selector-option-tile.component.scss +56 -0
  23. package/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.d.ts +20 -0
  24. package/app/plugins/product-configurator/product-configurator-selector.component.d.ts +26 -0
  25. package/app/plugins/product-configurator/product-configurator-selector.component.scss +46 -0
  26. package/app/plugins/product-configurator/product-configurator.component.d.ts +38 -0
  27. package/app/plugins/product-configurator/product-configurator.component.scss +35 -0
  28. package/app/plugins/product-configurator/product-configurator.module.d.ts +18 -0
  29. package/app/plugins/product-configurator/template_variables.scss +13 -0
  30. package/app/plugins/render/model/blender-render-settings.d.ts +10 -0
  31. package/app/plugins/render/model/blender-scene-settings.d.ts +18 -0
  32. package/app/plugins/render/render-controls/render-controls.component.d.ts +19 -7
  33. package/app/plugins/render/service/new-render.service.d.ts +21 -4
  34. package/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.scss +1 -1
  35. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +5 -0
  36. package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +4 -0
  37. package/app/plugins/threedselector/threedselector/threedselector.component.scss +17 -0
  38. package/app/plugins/threedselector/threedselector.module.d.ts +2 -1
  39. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
  40. package/assets/icons/circle_regular.svg +0 -0
  41. package/bundles/colijnit-homedecorator.umd.js +1986 -835
  42. package/bundles/colijnit-homedecorator.umd.js.map +1 -1
  43. package/esm2015/app/app.version.js +3 -3
  44. package/esm2015/app/core/enum/icon.enum.js +2 -1
  45. package/esm2015/app/core/enum/message-type.enum.js +2 -1
  46. package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
  47. package/esm2015/app/core/model/homedecorator-settings-options.js +2 -2
  48. package/esm2015/app/core/model/homedecorator-settings.js +3 -1
  49. package/esm2015/app/core/model/icon.js +2 -1
  50. package/esm2015/app/core/service/3dm-api.js +15 -22
  51. package/esm2015/app/core/service/homedecorator-app-event.service.js +3 -2
  52. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +65 -7
  53. package/esm2015/app/core/service/homedecorator-connector.service.js +150 -6
  54. package/esm2015/app/core/service/homedecorator-settings.service.js +8 -1
  55. package/esm2015/app/core/service/utils.service.js +116 -93
  56. package/esm2015/app/core/utils/object.utils.js +13 -1
  57. package/esm2015/app/homedecorator.component.js +1 -2
  58. package/esm2015/app/homedecorator.module.js +8 -4
  59. package/esm2015/app/plugins/core3d/core3d/core3d.component.js +2 -2
  60. package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +7 -1
  61. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +98 -50
  62. package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +4 -4
  63. package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +21 -11
  64. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-button.component.js +67 -0
  65. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.js +57 -0
  66. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.js +75 -0
  67. package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.js +90 -0
  68. package/esm2015/app/plugins/product-configurator/product-configurator-selector.component.js +253 -0
  69. package/esm2015/app/plugins/product-configurator/product-configurator.component.js +151 -0
  70. package/esm2015/app/plugins/product-configurator/product-configurator.module.js +115 -0
  71. package/esm2015/app/plugins/render/model/blender-render-settings.js +3 -0
  72. package/esm2015/app/plugins/render/model/blender-scene-settings.js +10 -0
  73. package/esm2015/app/plugins/render/model/render-parameters.js +3 -3
  74. package/esm2015/app/plugins/render/render-controls/render-controls.component.js +532 -446
  75. package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +6 -40
  76. package/esm2015/app/plugins/render/service/new-render.service.js +212 -44
  77. package/esm2015/app/plugins/render/service/render.service.js +6 -9
  78. package/esm2015/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.js +1 -1
  79. package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +1 -1
  80. package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +12 -10
  81. package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +2 -2
  82. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +55 -1
  83. package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +3 -3
  84. package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +64 -15
  85. package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +1 -1
  86. package/esm2015/app/plugins/threedselector/threedselector.module.js +8 -4
  87. package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +1 -1
  88. package/esm2015/app/shared/category-library/category-library.component.js +1 -1
  89. package/fesm2015/colijnit-homedecorator.js +2522 -1149
  90. package/fesm2015/colijnit-homedecorator.js.map +1 -1
  91. package/package.json +4 -4
  92. package/styles.scss +1 -1
@@ -20,6 +20,8 @@ import { ResultType } from '../../plugins/core3d/enum/result-type.enum';
20
20
  import { ErrorMessage } from '../model/error-message';
21
21
  import { FrozenArticle } from '@colijnit/configuratorapi/build/model/frozen-article';
22
22
  import { GoogleTagManagerEvent } from '../enum/google-tag-manager-event.enum';
23
+ import { SelectorWithOptions } from '@colijnit/configuratorapi/build/model/selector-with-options';
24
+ import { ConfigurationDisplayOption } from '@colijnit/configuratorapi/build/enum/refcode/configuration-display-option.enum';
23
25
  import * as i0 from "@angular/core";
24
26
  import * as i1 from "./homedecorator-connector-adapter.service";
25
27
  import * as i2 from "./json-utils.service";
@@ -60,6 +62,8 @@ export class HomedecoratorConnectorService {
60
62
  this._initializing = false;
61
63
  this._initialized = false;
62
64
  this._imageCache = new Map();
65
+ this._selectionWithAnswers = [];
66
+ this._selectedAnswers = [];
63
67
  }
64
68
  get article() {
65
69
  return this._article;
@@ -80,6 +84,18 @@ export class HomedecoratorConnectorService {
80
84
  get selections() {
81
85
  return this._selections;
82
86
  }
87
+ set selectionWithAnswers(value) {
88
+ this._selectionWithAnswers = value;
89
+ }
90
+ get selectionWithAnswers() {
91
+ return this._selectionWithAnswers;
92
+ }
93
+ set selectedAnswers(value) {
94
+ this._selectedAnswers = value;
95
+ }
96
+ get selectedAnswers() {
97
+ return this._selectedAnswers;
98
+ }
83
99
  get currentSelections() {
84
100
  return this._currentSelections;
85
101
  }
@@ -240,6 +256,7 @@ export class HomedecoratorConnectorService {
240
256
  return Promise.reject(e);
241
257
  });
242
258
  this.articleReceived.next(article);
259
+ this._article = article;
243
260
  return article;
244
261
  });
245
262
  }
@@ -280,7 +297,14 @@ export class HomedecoratorConnectorService {
280
297
  .catch(() => {
281
298
  return [];
282
299
  });
283
- this._prepareSelections(selections);
300
+ if (this.article.showFullConfiguration) {
301
+ this._messageService.emit(MessageType.ChangeArticleConfigurationType, true);
302
+ yield this._createSelectorFullConfiguration(selections);
303
+ }
304
+ else {
305
+ this._messageService.emit(MessageType.ChangeArticleConfigurationType, false);
306
+ this._prepareSelections(selections);
307
+ }
284
308
  });
285
309
  }
286
310
  getDecosAsync() {
@@ -295,6 +319,13 @@ export class HomedecoratorConnectorService {
295
319
  return this._connector.selectAnswer(answer, input);
296
320
  // this.selectAnswerCalled.next(answer);
297
321
  }
322
+ selectAnswerBySelection(selection, input) {
323
+ return this._connector.selectAnswerBySelection(selection, input);
324
+ // this.selectAnswerCalled.next(answer);
325
+ }
326
+ navigateTo(choseValue, showLoader = false) {
327
+ return this._connector.navigateTo(choseValue, showLoader);
328
+ }
298
329
  cancelAnswer(getAnswersAndQuestion = true) {
299
330
  return this._connector.cancelAnswer();
300
331
  }
@@ -358,6 +389,27 @@ export class HomedecoratorConnectorService {
358
389
  (selection.nodeType === NodeType.Answer && (((selection.answerPublicationCode & this._getPublicationCode()) > 0) ||
359
390
  isNill(selection.answerPublicationCode)))));
360
391
  }
392
+ getImageForAnswer(selectedOption, showLoader = true) {
393
+ return __awaiter(this, void 0, void 0, function* () {
394
+ if (selectedOption.artNodeId) {
395
+ if (!this._imageCache.has(selectedOption.artNodeId)) {
396
+ this._connector.getImageForSelectorStructure(selectedOption, 4, true, showLoader).then((imageData) => {
397
+ this._handleImageReceivedForSelectorStructure(selectedOption, imageData);
398
+ });
399
+ }
400
+ else {
401
+ selectedOption.imageData = this._imageCache.get(selectedOption.artNodeId);
402
+ }
403
+ }
404
+ else {
405
+ this._skipButtonInfoService.getSkipButtonImageAndText().then((textAndImage) => {
406
+ selectedOption.optionText = textAndImage.text;
407
+ selectedOption.optionText = textAndImage.text;
408
+ selectedOption.imageData = textAndImage.imageBody;
409
+ });
410
+ }
411
+ });
412
+ }
361
413
  _prepareSelections(selections) {
362
414
  this.selections = selections.slice(0);
363
415
  this._prepareSelectionsToDisplay();
@@ -438,10 +490,10 @@ export class HomedecoratorConnectorService {
438
490
  }
439
491
  _isAnswerPublished(a) {
440
492
  return (isNill(a.hierarchicalPublicationCode) || ((a.hierarchicalPublicationCode & this._getPublicationCode()) > 0)) /* &&
441
- (
442
- (a.type === NodeType.Question && (((a.optionShowOn & 2097152) > 0) || isNill(a.optionShowOn))) ||
443
- (a.type === NodeType.Answer && (((a.nodeShowOn & 2097152) > 0) || isNill(a.nodeShowOn)))
444
- )*/;
493
+ (
494
+ (a.type === NodeType.Question && (((a.optionShowOn & 2097152) > 0) || isNill(a.optionShowOn))) ||
495
+ (a.type === NodeType.Answer && (((a.nodeShowOn & 2097152) > 0) || isNill(a.nodeShowOn)))
496
+ )*/;
445
497
  }
446
498
  _preloadCachedImages(answersOrSelections) {
447
499
  answersOrSelections.forEach((answerOrSelection) => {
@@ -546,6 +598,27 @@ export class HomedecoratorConnectorService {
546
598
  this._cacheImage(answerOrSelection.nodeId, imageDataOrUrl);
547
599
  }
548
600
  }
601
+ _handleImageReceivedForSelectorStructure(option, imageData) {
602
+ let imageDataOrUrl;
603
+ if (imageData) {
604
+ if (imageData.match(/data:image/) || imageData.startsWith('http') || imageData.startsWith('www')) {
605
+ imageDataOrUrl = imageData;
606
+ }
607
+ else {
608
+ if (this.assetPath && !this.assetPath.endsWith('/')) {
609
+ this.assetPath += '/';
610
+ }
611
+ if (imageData.startsWith('/')) {
612
+ imageData = imageData.substr(1, imageData.length);
613
+ }
614
+ imageDataOrUrl = (this.assetPath ? this.assetPath : '') + imageData;
615
+ }
616
+ }
617
+ option.imageData = imageDataOrUrl === undefined ? '' : imageDataOrUrl;
618
+ if (imageDataOrUrl) {
619
+ this._cacheImage(option.artNodeId, imageDataOrUrl);
620
+ }
621
+ }
549
622
  _cacheImage(id, imageDataOrUrl) {
550
623
  this._imageCache.set(id, imageDataOrUrl);
551
624
  }
@@ -626,6 +699,77 @@ export class HomedecoratorConnectorService {
626
699
  return Promise.resolve(newInstanceId);
627
700
  });
628
701
  }
702
+ _createSelectorFullConfiguration(selections) {
703
+ return __awaiter(this, void 0, void 0, function* () {
704
+ this.selections = selections.slice(0);
705
+ this._prepareSelectionsToDisplay();
706
+ let totalPrice = 0;
707
+ if (this._selections) {
708
+ this._selections.forEach(selection => {
709
+ totalPrice += selection.artRetailPrice ? selection.artRetailPrice : 0;
710
+ });
711
+ }
712
+ this._totalPrice = Math.round((totalPrice + Number.EPSILON) * 100) / 100;
713
+ let selectorStructureList = [];
714
+ const selectorStructure = yield this._connector.getSelectorStructure();
715
+ if (selectorStructure.validationResult.success) {
716
+ if (selectorStructure.resultObjects) {
717
+ selectorStructureList = selectorStructure.resultObjects;
718
+ }
719
+ else {
720
+ selectorStructureList = selectorStructure.resultObject['structures'];
721
+ }
722
+ }
723
+ const dataList = [];
724
+ // Create a list with SelectionWithAnswers.selection = nodeType opv
725
+ for (const option of selectorStructureList) {
726
+ let optionAdded = false;
727
+ if (option.nodeType === NodeType.Answer) {
728
+ for (const parentObject of dataList) {
729
+ if (option.artNodeOptId === parentObject.selector.artNodeOptId) {
730
+ parentObject.selectorOptions.push(option);
731
+ optionAdded = true;
732
+ }
733
+ }
734
+ if (!optionAdded) {
735
+ const optionItem = new SelectorWithOptions();
736
+ optionItem.selector = option;
737
+ // TODO this should just be a bool, but it's not working
738
+ // Also, this might not be the correct way to do it.
739
+ if (option.treeOpv === 'F') {
740
+ optionItem.selectorOptions.push(option);
741
+ }
742
+ dataList.push(optionItem);
743
+ }
744
+ }
745
+ }
746
+ // Now add add the nodeType NOV to the correct 'parent'
747
+ for (const option of selectorStructureList) {
748
+ if (option.nodeType === NodeType.NextOptionValue) {
749
+ for (const parentObject of dataList) {
750
+ if (option.parentNodeId === parentObject.selector.artNodeId) {
751
+ if (option.displayOptionControl === null) {
752
+ option.displayOptionControl = ConfigurationDisplayOption.TileLarge;
753
+ }
754
+ parentObject.selectorOptions.push(option);
755
+ }
756
+ }
757
+ // TODO make sure this gets images, current testing article does not contain images
758
+ yield this.getImageForAnswer(option);
759
+ }
760
+ }
761
+ for (const option of selectorStructureList) {
762
+ if (option.nodeType === NodeType.Question) {
763
+ for (const parentObject of dataList) {
764
+ if (option.artNodeOptId === parentObject.selector.artNodeOptId) {
765
+ parentObject.selectorOptions.push(option);
766
+ }
767
+ }
768
+ }
769
+ }
770
+ this.selectionWithAnswers = dataList;
771
+ });
772
+ }
629
773
  }
630
774
  HomedecoratorConnectorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: HomedecoratorConnectorService, deps: [{ token: i1.HomedecoratorConnectorAdapterService }, { token: i2.JsonUtilsService }, { token: i3.HomedecoratorSettingsService }, { token: i4.SkipButtonInfoService }, { token: i5.MessageBusService }, { token: i6.HomedecoratorAppEventService }, { token: i7.GoogleTagManagerService }], target: i0.ɵɵFactoryTarget.Injectable });
631
775
  HomedecoratorConnectorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: HomedecoratorConnectorService, providedIn: 'root' });
@@ -635,4 +779,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
635
779
  providedIn: 'root'
636
780
  }]
637
781
  }], ctorParameters: function () { return [{ type: i1.HomedecoratorConnectorAdapterService }, { type: i2.JsonUtilsService }, { type: i3.HomedecoratorSettingsService }, { type: i4.SkipButtonInfoService }, { type: i5.MessageBusService }, { type: i6.HomedecoratorAppEventService }, { type: i7.GoogleTagManagerService }]; } });
638
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZWRlY29yYXRvci1jb25uZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFLNUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUsxRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0scURBQXFELENBQUM7QUFJN0UsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkVBQTJFLENBQUM7QUFDNUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBSXZHLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQzVGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFLcEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQ25GLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7QUFJNUUsZ0hBQWdIO0FBSWhILE1BQU0sT0FBTyw2QkFBNkI7SUF5RnhDLFlBQ1UsVUFBZ0QsRUFDaEQsVUFBNEIsRUFDNUIsZ0JBQThDLEVBQzlDLHNCQUE2QyxFQUM3QyxlQUFrQyxFQUNsQyxnQkFBOEMsRUFD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QztZQUNMLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xELElBQUksb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQ3ZHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixDQUFDO29CQUNyRCxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUN6RCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDekQsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUMvQjtxQkFBTTtvQkFDTCxNQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQztpQkFDNUQ7YUFDRjtZQUNELE1BQU0sYUFBYSxHQUFXLG9CQUFvQixDQUFDLFlBQVksQ0FBQztZQUNoRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEMsQ0FBQztLQUFBOzsySEE1b0JVLDZCQUE2QjsrSEFBN0IsNkJBQTZCLGNBRjVCLE1BQU07NEZBRVAsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7SnNvblV0aWxzU2VydmljZX0gZnJvbSAnLi9qc29uLXV0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZX0gZnJvbSAnLi9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NraXBCdXR0b25JbmZvU2VydmljZX0gZnJvbSAnLi9za2lwLWJ1dHRvbi1pbmZvLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VUeXBlfSBmcm9tICcuLi9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtpc05pbGx9IGZyb20gJy4uL3V0aWxzL2Z1bmN0aW9uL2lzLW5pbGwuZnVuY3Rpb24nO1xyXG5pbXBvcnQge0FydGljbGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZSc7XHJcbmltcG9ydCB7RGVjb05vZGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZGVjby1ub2RlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtJbnRlcm5hbFBhcmFtfSBmcm9tICdAY29saWpuaXQvbWFpbmFwaS9idWlsZC9lbnVtL2ludGVybmFsLXBhcmFtLmVudW0nO1xyXG5pbXBvcnQge05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vbm9kZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge0Fuc3dlclByaWNlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2Fuc3dlci1wcmljZSc7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdGlvbic7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JTdGF0aXN0aWNzRW52aXJvbm1lbnR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvY29uZmlndXJhdG9yLXN0YXRpc3RpY3MtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge09wdGlvbnN9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL29wdGlvbnMnO1xyXG5pbXBvcnQge0RhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhfSBmcm9tICdAY29saWpuaXQvaW9uZWNvbm5lY3Rvci9idWlsZC9tb2RlbC9kYXRhLXNlcnZpY2UtcmVzcG9uc2UtZGF0YSc7XHJcbmltcG9ydCB7QXJ0aWNsZVRleHR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZS10ZXh0LmJvJztcclxuaW1wb3J0IHtFeHRlcm5hbENhdGFsb2dTdGFydHVwSW5mb30gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvZXh0ZXJuYWwtY2F0YWxvZy1zdGFydHVwLWluZm8nO1xyXG5pbXBvcnQge0V4dGVybmFsQ2F0YWxvZ1N0YXJ0dXBJbmZvUmVxdWVzdH0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvZXh0ZXJuYWwtY2F0YWxvZy1zdGFydHVwLWluZm8tcmVxdWVzdCc7XHJcbmltcG9ydCB7Q3VzdG9tRmxvb3JHcm91cFJlc3VsdH0gZnJvbSAnLi4vLi4vcGx1Z2lucy9jb3JlM2QvbW9kZWwvY3VzdG9tLWZsb29yLWdyb3VwLXJlc3VsdCc7XHJcbmltcG9ydCB7UmVzdWx0VHlwZX0gZnJvbSAnLi4vLi4vcGx1Z2lucy9jb3JlM2QvZW51bS9yZXN1bHQtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtFcnJvck1lc3NhZ2V9IGZyb20gJy4uL21vZGVsL2Vycm9yLW1lc3NhZ2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4vaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuL2hvbWVkZWNvcmF0b3ItYXBwLWV2ZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc30gZnJvbSAnLi4vbW9kZWwvaG9tZWRlY29yYXRvci1zZXR0aW5ncyc7XHJcbmltcG9ydCB7RnJvemVuQXJ0aWNsZVNpbXBsZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9mcm96ZW4tYXJ0aWNsZS1zaW1wbGUnO1xyXG5pbXBvcnQge0Zyb3plbkFydGljbGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZnJvemVuLWFydGljbGUnO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJFdmVudH0gZnJvbSAnLi4vZW51bS9nb29nbGUtdGFnLW1hbmFnZXItZXZlbnQuZW51bSc7XHJcbmltcG9ydCB7R29vZ2xlVGFnTWFuYWdlclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2UvZ29vZ2xlLXRhZy1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uJztcclxuXHJcbi8vIEhvbGRzIGFsbCBpT05FIGJhY2tlbmQgcmVsYXRlZCBzdGF0ZSBhbmQgbWV0aG9kcyBmb3IgYSBydW5uaW5nIEhvbWVEZWNvcmF0b3IuIFRvIGJlIHVzZWQgYW55d2hlcmUgaW50ZXJuYWxseS5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgSG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBwdWJsaWMgZ2V0IGFydGljbGUoKTogQXJ0aWNsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXJ0aWNsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGVjb05vZGVzKCk6IERlY29Ob2RlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY29Ob2RlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0aW9ucyh2YWx1ZTogU2VsZWN0aW9uW10pIHtcclxuICAgIC8vIHRlbXAgZml4IGZvciBwcmljZXMgdW50aWwgYmFja2VuZCBpcyByZWFkeVxyXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5fYXJ0aWNsZVByaWNlID0gdmFsdWVbMF0uYXJ0UmV0YWlsUHJpY2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9hcnRpY2xlUHJpY2UgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2VsZWN0aW9ucyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3Rpb25zKCk6IFNlbGVjdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50U2VsZWN0aW9ucygpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFjdGl2ZVNlbGVjdGlvbigpOiBTZWxlY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdG90YWxQcmljZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUHJpY2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNob3VsZFNob3dMb2FkZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2hvdWxkU2hvd0xvYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc2hvdWxkU2hvd0xvYWRlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9oaWRlTG9hZGVyVGltZW91dCk7XHJcbiAgICAgIHRoaXMuX3Nob3VsZFNob3dMb2FkZXIgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5faGlkZUxvYWRlclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLl9zaG91bGRTaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH0sIHRoaXMuX2hpZGVMb2FkZXJUaW1lclRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnRyb2xsZXJJbml0aWFsaXplZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFydGljbGVSZWNlaXZlZDogU3ViamVjdDxBcnRpY2xlPiA9IG5ldyBTdWJqZWN0PEFydGljbGU+KCk7XHJcbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvbnNSZWNlaXZlZDogU3ViamVjdDxTZWxlY3Rpb25bXT4gPSBuZXcgU3ViamVjdDxTZWxlY3Rpb25bXT4oKTtcclxuICAvLyBwdWJsaWMgcmVhZG9ubHkgZGVjb05vZGVzUmVjZWl2ZWQ6IFN1YmplY3Q8RGVjb05vZGVbXT4gPSBuZXcgU3ViamVjdDxEZWNvTm9kZVtdPigpO1xyXG4gIHB1YmxpYyByZWFkb25seSBhbnN3ZXJzUmVjZWl2ZWQ6IFN1YmplY3Q8QW5zd2VyW10+ID0gbmV3IFN1YmplY3Q8QW5zd2VyW10+KCk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGV4dHJhQW5zd2VyRGF0YUxvYWRlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgLy8gcHVibGljIHJlYWRvbmx5IG1vb2RJbWFnZXNSZWNlaXZlZDogU3ViamVjdDx7IGFuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXIgfCBTZWxlY3Rpb24sIGltYWdlRGF0YTogc3RyaW5nIH0+ID1cclxuICAvLyAgIG5ldyBTdWJqZWN0PHthbnN3ZXJPclNlbGVjdGlvbjogQW5zd2VyfFNlbGVjdGlvbiwgaW1hZ2VEYXRhOiBzdHJpbmd9PigpO1xyXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25zQW5kRGVjb3NMaW5rZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uUmVzZXQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMgYXNzZXRQYXRoOiBzdHJpbmc7XHJcbiAgcHVibGljIHNlbGVjdGlvbnNUb0Rpc3BsYXk6IFNlbGVjdGlvbltdID0gW107XHJcbiAgcHVibGljIGFjdGl2ZVF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICBwdWJsaWMgYWN0aXZlQW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfaGlkZUxvYWRlclRpbWVvdXQ6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9oaWRlTG9hZGVyVGltZXJUaW1lb3V0OiBudW1iZXIgPSA1MDA7XHJcbiAgcHJpdmF0ZSBfYXJ0aWNsZTogQXJ0aWNsZTtcclxuICBwcml2YXRlIF9zZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RlY29Ob2RlczogRGVjb05vZGVbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FjdGl2ZVNlbGVjdGlvbjogU2VsZWN0aW9uO1xyXG4gIHByaXZhdGUgX2FydGljbGVQcmljZTogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSBfdG90YWxQcmljZTogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIF9zaG91bGRTaG93TG9hZGVyOiBib29sZWFuO1xyXG5cclxuICBwcml2YXRlIF9jb25uZWN0b3JPcHRpb25zOiBPcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfaW1hZ2VDYWNoZTogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9jb25uZWN0b3I6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2pzb25VdGlsczogSnNvblV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NraXBCdXR0b25JbmZvU2VydmljZTogU2tpcEJ1dHRvbkluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VCdXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYXBwRXZlbnRTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZ29vZ2xlVGFnTWFuYWdlcjogR29vZ2xlVGFnTWFuYWdlclNlcnZpY2VcclxuICApIHtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3Vicy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLl9pbWFnZUNhY2hlLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0V2ViVmlld1N0YXJ0dXBJbmZvKHJlcXVlc3Q6IEV4dGVybmFsQ2F0YWxvZ1N0YXJ0dXBJbmZvUmVxdWVzdCk6IFByb21pc2U8RXh0ZXJuYWxDYXRhbG9nU3RhcnR1cEluZm8+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3IuZ2V0V2ViVmlld1N0YXJ0dXBJbmZvKHJlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGluaXROb2RlSW5zdGFuY2Uoc2t1OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICBjb25zdCBnb29kSWQ6IG51bWJlciA9IGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5nZXRHb29kSWRGcm9tQXJ0aWNsZU5yKHNrdSk7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25uZWN0b3IuaW5pdE5vZGVJbnN0YW5jZShnb29kSWQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNoYW5nZUNvbm5lY3Rpb24oaW5zdGFuY2VJZDogc3RyaW5nLCBvbGRDb25uZWN0aW9uOiBzdHJpbmcsIG5ld0Nvbm5lY3Rpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmNoYW5nZUNvbm5lY3Rpb24oaW5zdGFuY2VJZCwgb2xkQ29ubmVjdGlvbiwgbmV3Q29ubmVjdGlvbik7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1wdHlTZWxlY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLnNlbGVjdGlvbnNUb0Rpc3BsYXkubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuZGVjb05vZGVzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1wdHlBbnN3ZXJzQW5kUXVlc3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUFuc3dlcnMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuYWN0aXZlUXVlc3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGZvciBvYnNvbGV0ZSBmdXJuaXR1cmVcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9uc1xyXG4gICAqIEBwYXJhbSBleHRyYUluZm9cclxuICAgKi9cclxuICBwdWJsaWMgc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSwgZXh0cmFJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgLy8gdGhpcy5fb25TZWxlY3Rpb25zUmVjZWl2ZWQoc2VsZWN0aW9ucywgZXh0cmFJbmZvKTtcclxuICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCBmb3Igb2Jzb2xldGUgZnVybml0dXJlXHJcbiAgICogQHBhcmFtIGRlY29Ob2Rlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXREZWNvTm9kZXMoZGVjb05vZGVzOiBEZWNvTm9kZVtdKSB7XHJcbiAgICB0aGlzLl9kZWNvTm9kZXMgPSBkZWNvTm9kZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW1hZ2VDYWNoZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW1hZ2VCeUlkKGlkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBiZWZvcmVMb2FkUHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgKCh0aGlzLl9jb25uZWN0b3JPcHRpb25zIGFzIEhvbWVkZWNvcmF0b3JTZXR0aW5ncykucHJvamVjdFNldHRpbmdzKSB7XHJcbiAgICAvLyAgIHRoaXMuX2Nvbm5lY3Rvci5zYXZlRXh0ZXJuYWxTb3VyY2VzKCk7XHJcbiAgICAvLyAgIC8vIEB0cy1pZ25vcmVcclxuICAgIC8vICAgYXdhaXQgdGhpcy5fY29ubmVjdG9yLmluaXRDb25uZWN0b3IoKHRoaXMuX2Nvbm5lY3Rvck9wdGlvbnMgYXMgSG9tZWRlY29yYXRvclNldHRpbmdzKS5wcm9qZWN0U2V0dGluZ3MsIHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAvLyAgIGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5wcmVwYXJlRXh0ZXJuYWxTb3VyY2VzKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWZ0ZXJMb2FkUHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgKCh0aGlzLl9jb25uZWN0b3JPcHRpb25zIGFzIEhvbWVkZWNvcmF0b3JTZXR0aW5ncykucHJvamVjdFNldHRpbmdzKSB7XHJcbiAgICAvLyAgIHRoaXMuX2Nvbm5lY3Rvci5yZXNldEV4dGVybmFsU291cmNlcygpO1xyXG4gICAgLy8gICBhd2FpdCB0aGlzLl9jb25uZWN0b3IuaW5pdENvbm5lY3Rvcih0aGlzLl9jb25uZWN0b3JPcHRpb25zLCB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGluaXRDb25uZWN0aW9uKGZvcmNlUmVsb2FkPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCh0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9pbml0aWFsaXppbmcpICYmICFmb3JjZVJlbG9hZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0aWFsaXppbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2V0dGluZ3M6IEhvbWVkZWNvcmF0b3JTZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncztcclxuICAgICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICAgIHRocm93IEVycm9yKCdTZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY29ubmVjdG9yT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24obmV3IE9wdGlvbnMoKSwgc2V0dGluZ3MpO1xyXG5cclxuICAgICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rvci5zaG93TG9hZGVyLnN1YnNjcmliZShzaG93TG9hZGVyID0+IHRoaXMub25TaG93TG9hZGVyQ2hhbmdlKHNob3dMb2FkZXIpKSxcclxuICAgICAgICB0aGlzLl9jb25uZWN0b3IuY29ubmVjdGlvblJlc2V0LnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uQ29ubmVjdGlvblJlc2V0KCkpLFxyXG4gICAgICAgIC8vIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5BZGRUb0NhcnQsICgpID0+IHRoaXMuYWRkVG9DYXJ0KCkpXHJcbiAgICAgICk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5pbml0Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvck9wdGlvbnMsIHVuZGVmaW5lZCwgZm9yY2VSZWxvYWQpO1xyXG4gICAgICAvLyB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2Vzc2lvbiA9IHRoaXMuX2Nvbm5lY3Rvck9wdGlvbnMuc2Vzc2lvbjtcclxuICAgICAgdGhpcy5fY29ubmVjdG9yLnByZXBhcmVFeHRlcm5hbFNvdXJjZXMoKTtcclxuICAgICAgdGhpcy5jb250cm9sbGVySW5pdGlhbGl6ZWQubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9pbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5faW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW50ZXJuYWxQYXJhbWV0ZXIocGFyYW06IEludGVybmFsUGFyYW0pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5nZXRJbnRlcm5hbFBhcmFtZXRlcihwYXJhbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SnNvbkNvbmZpZ3VyZWRBcnRpY2xlcyhnb29kSWQ6IG51bWJlciwgZ29vZFR5cGU6IHN0cmluZywgcXVhbnRpdHk6IG51bWJlciwgZXh0ZXJuYWxTb3VyY2U6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgICAgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUsIGluc3RhbmNlSWQ/OiBudW1iZXIsIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3M/OiBDb25maWd1cmF0b3JTdGF0aXN0aWNzRW52aXJvbm1lbnQpOiBQcm9taXNlPGFueT4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3IuZ2V0SnNvbkNvbmZpZ3VyZWRBcnRpY2xlcyhnb29kSWQsIGdvb2RUeXBlLCBxdWFudGl0eSwgZXh0ZXJuYWxTb3VyY2UsIHNob3dMb2FkZXIsIGluc3RhbmNlSWQsIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3MpO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIGdldEpzb25NYXRjaFRhYmxlQXJ0aWNsZXMoKTogUHJvbWlzZTxhbnk+IHtcclxuICAvLyAgIHJldHVybiB0aGlzLl9jb25uZWN0b3IuZ2V0SnNvbk1hdGNoVGFibGVBcnRpY2xlcygpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldEluc3RhbmNlKGlkOiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25uZWN0b3Iuc2V0SW5zdGFuY2VUb0NvbmZpZ3VyZShpZCkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIHJldHVybiBuZXcgRGF0YVNlcnZpY2VSZXNwb25zZURhdGEoKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvcHlJbnN0YW5jZUFuZFNhdmVPcmlnaW5hbENvbmZpZ3VyYXRpb24oaW5zdGFuY2VJZDogc3RyaW5nLCByZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvcHlJbnN0YW5jZShpbnN0YW5jZUlkLCB0cnVlLCByZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvcHlJbnN0YW5jZUFuZExvc2VPcmlnaW5hbENvbmZpZ3VyYXRpb24oaW5zdGFuY2VJZDogc3RyaW5nLCByZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvcHlJbnN0YW5jZShpbnN0YW5jZUlkLCBmYWxzZSwgcmVzdWx0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzYXZlQ29uZmlndXJhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLnNhdmVDb25maWd1cmF0aW9ucygpO1xyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHNhdmluZyBjb25maWd1cmF0aW9ucycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGUoc2t1OiBzdHJpbmcsIGJyYW5jaDogc3RyaW5nKTogUHJvbWlzZTxBcnRpY2xlPiB7XHJcbiAgICB0aGlzLmVtcHR5U2VsZWN0aW9ucygpO1xyXG4gICAgdGhpcy5lbXB0eUFuc3dlcnNBbmRRdWVzdGlvbigpO1xyXG4gICAgY29uc3QgYXJ0aWNsZTogQXJ0aWNsZSA9IGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5nZXRBcnRpY2xlKHNrdSwgYnJhbmNoKVxyXG4gICAgICAuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuYXJ0aWNsZVJlY2VpdmVkLm5leHQoYXJ0aWNsZSk7XHJcbiAgICByZXR1cm4gYXJ0aWNsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNb29kSW1hZ2VGb3JBbnN3ZXJTZWxlY3Rpb24oYW5zd2VyT3JTZWxlY3Rpb246IEFuc3dlciB8IFNlbGVjdGlvbiwgdGh1bWJOYWlsOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29ubmVjdG9yLmdldE1vb2RJbWFnZUZvckFuc3dlclNlbGVjdGlvbihhbnN3ZXJPclNlbGVjdGlvbiwgdGh1bWJOYWlsKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBsb2FkU2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPSAwO1xyXG4gIC8vICAgdGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5Lmxlbmd0aCA9IDA7XHJcbiAgLy8gICB0aGlzLl9jb25uZWN0b3IubG9hZFNlbGVjdGlvbnMoKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHB1YmxpYyBnZXRRdWVzdGlvbkFuZEFuc3dlcnMoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLl9jb25uZWN0b3IuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzQXN5bmMoKTogUHJvbWlzZTxRdWVzdGlvbkFuZEFuc3dlcnM+IHtcclxuICAgIGNvbnN0IHF1ZXN0aW9uQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk7XHJcbiAgICBxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2VycyA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzLmZpbHRlcihhID0+IHRoaXMuX2lzQW5zd2VyUHVibGlzaGVkKGEpKTtcclxuICAgIC8vIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMucXVlc3Rpb24gJiYgIXF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbi5ncm91cGVkKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlQW5zd2Vyc1JlY2VpdmVkKHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzKTtcclxuICAgIC8vIH1cclxuICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5lbXB0eUFuc3dlcnNBbmRRdWVzdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVRdWVzdGlvbiA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbjtcclxuICAgICAgdGhpcy5hY3RpdmVBbnN3ZXJzID0gcXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcXVlc3Rpb25BbmRBbnN3ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFNlbGVjdGlvbnNBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9IDA7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5nZXRTZWxlY3Rpb25zQXN5bmMoKVxyXG4gICAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWNvc0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fZGVjb05vZGVzID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmdldERlY29zQXN5bmMoKVxyXG4gICAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyLCBpbnB1dD86IHN0cmluZyk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3Iuc2VsZWN0QW5zd2VyKGFuc3dlciwgaW5wdXQpO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RBbnN3ZXJDYWxsZWQubmV4dChhbnN3ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbEFuc3dlcihnZXRBbnN3ZXJzQW5kUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5jYW5jZWxBbnN3ZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RTZWxlY3Rpb24oXHJcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbiwgZm9yY2VCYWNrVG9Ob2RlPzogYm9vbGVhbiwgYWZ0ZXI/OiBib29sZWFuLCBjb25uZWN0b3I/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yLnNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb24sIGZvcmNlQmFja1RvTm9kZSwgYWZ0ZXIsIGNvbm5lY3Rvcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5kZWxldGVTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5yZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QW5zd2VySW5mbyhhbnN3ZXI6IEFuc3dlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYXJ0aWNsZVRleHRzOiBBcnRpY2xlVGV4dFtdID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmdldEFuc3dlckluZm8oYW5zd2VyKTtcclxuICAgIHRoaXMuX29uQW5zd2VySW5mb1JlY2VpdmVkKHthbnN3ZXI6IGFuc3dlciwgaW5mbzogYXJ0aWNsZVRleHRzfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZXh0ZW5kV2l0aEFuc3dlclRleHRBbmRJbWFnZShhbnN3ZXI6IEFuc3dlciwgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChhbnN3ZXIubm9kZUlkKSB7XHJcbiAgICAgIGlmICghdGhpcy5faW1hZ2VDYWNoZS5oYXMoYW5zd2VyLm5vZGVJZCkpIHtcclxuICAgICAgICB0aGlzLl9jb25uZWN0b3IuZ2V0SW1hZ2VGb3JBbnN3ZXJPclNlbGVjdGlvbihhbnN3ZXIsIDQsIHRydWUsIHNob3dMb2FkZXIpLnRoZW4oKGltYWdlRGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVJbWFnZVJlY2VpdmVkKGFuc3dlciwgaW1hZ2VEYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQoYW5zd2VyLm5vZGVJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NraXBCdXR0b25JbmZvU2VydmljZS5nZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KGFuc3dlci5nb29kSWQpLnRoZW4oKHRleHRBbmRJbWFnZSkgPT4ge1xyXG4gICAgICAgIGFuc3dlci5hbnN3ZXIgPSB0ZXh0QW5kSW1hZ2UudGV4dDtcclxuICAgICAgICBhbnN3ZXIuY29tbWVyY2lhbEFuc3dlciA9IHRleHRBbmRJbWFnZS50ZXh0O1xyXG4gICAgICAgIGFuc3dlci5pbWFnZURhdGEgPSB0ZXh0QW5kSW1hZ2UuaW1hZ2VCb2R5O1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBleHRlbmRXaXRoU2VsZWN0aW9uSW1hZ2Uoc2VsZWN0aW9uOiBTZWxlY3Rpb24sIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2VsZWN0aW9uLm5vZGVJZCkge1xyXG4gICAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHNlbGVjdGlvbi5ub2RlSWQpKSB7XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdG9yLmdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oc2VsZWN0aW9uLCA0LCB0cnVlLCBzaG93TG9hZGVyKS50aGVuKChpbWFnZURhdGE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5faGFuZGxlSW1hZ2VSZWNlaXZlZChzZWxlY3Rpb24sIGltYWdlRGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLmltYWdlRGF0YSA9IHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHNlbGVjdGlvbi5ub2RlSWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zVG9EaXNwbGF5SW1hZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNTZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRQdWJsaWNhdGlvbkNvZGUoKSA9PT0gMiB8fFxyXG4gICAgICAoKGlzTmlsbChzZWxlY3Rpb24uaGllcmFyY2hpY2FsUHVibGljYXRpb25Db2RlKSB8fCAoKHNlbGVjdGlvbi5oaWVyYXJjaGljYWxQdWJsaWNhdGlvbkNvZGUgJiB0aGlzLl9nZXRQdWJsaWNhdGlvbkNvZGUoKSkgPiAwKSkgJiZcclxuICAgICAgKFxyXG4gICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKHNlbGVjdGlvbi5xdWVzdGlvblB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApIHx8XHJcbiAgICAgICAgICBpc05pbGwoc2VsZWN0aW9uLnF1ZXN0aW9uUHVibGljYXRpb25Db2RlKSkpIHx8XHJcbiAgICAgICAgKHNlbGVjdGlvbi5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQW5zd2VyICYmICgoKHNlbGVjdGlvbi5hbnN3ZXJQdWJsaWNhdGlvbkNvZGUgJiB0aGlzLl9nZXRQdWJsaWNhdGlvbkNvZGUoKSkgPiAwKSB8fFxyXG4gICAgICAgICAgaXNOaWxsKHNlbGVjdGlvbi5hbnN3ZXJQdWJsaWNhdGlvbkNvZGUpKSlcclxuICAgICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25zID0gc2VsZWN0aW9ucy5zbGljZSgwKTtcclxuICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zVG9EaXNwbGF5KCk7XHJcbiAgICBsZXQgdG90YWxQcmljZSA9IDA7XHJcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9ucykge1xyXG4gICAgICB0aGlzLl9zZWxlY3Rpb25zLmZvckVhY2goc2VsZWN0aW9uID0+IHtcclxuICAgICAgICB0b3RhbFByaWNlICs9IHNlbGVjdGlvbi5hcnRSZXRhaWxQcmljZSA/IHNlbGVjdGlvbi5hcnRSZXRhaWxQcmljZSA6IDA7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdG90YWxQcmljZSA9IE1hdGgucm91bmQoKHRvdGFsUHJpY2UgKyBOdW1iZXIuRVBTSUxPTikgKiAxMDApIC8gMTAwO1xyXG4gICAgdGhpcy5fY3VycmVudFNlbGVjdGlvbnMgPSB0aGlzLnNlbGVjdGlvbnMuc2xpY2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVTZWxlY3Rpb25zVG9EaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJlcGFyZUFuc3dlcnNBbmRJbWFnZXModGhpcy5zZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IGFsbFNlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gdGhpcy5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHRoaXMuX2lzU2VsZWN0aW9uUHVibGlzaGVkKHMpKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheSA9IGFsbFNlbGVjdGlvbnMuZmlsdGVyKHMgPT4gcy5ub2RlVHlwZSAhPT0gTm9kZVR5cGUuQXJ0aWNsZSAmJiBzLnByZXNlbnRhdGlvbkxldmVsID09PSAxKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uc1JlY2VpdmVkLm5leHQodGhpcy5zZWxlY3Rpb25zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVBbnN3ZXJzQW5kSW1hZ2VzKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID09PSAxKSB7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0aW9uQW5zd2VycyhzZWxlY3Rpb24sIHNlbGVjdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcmVsb2FkQ2FjaGVkSW1hZ2VzKHRoaXMuc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVTZWxlY3Rpb25BbnN3ZXJzKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgY29uc3QgYW5zd2Vyc0Zyb21TZWxlY3Rpb246IFNlbGVjdGlvbltdID0gc2VsZWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgcyA9PiBzLnBhcmVudEFydE5vZGVJZERlY28gJiYgc2VsZWN0aW9uLm5vZGVJZCAmJiBzLnBhcmVudEFydE5vZGVJZERlY28udG9TdHJpbmcoKSA9PT0gc2VsZWN0aW9uLm5vZGVJZC50b1N0cmluZygpKTtcclxuICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zTmV4dE9wdGlvblZhbHVlcyhhbnN3ZXJzRnJvbVNlbGVjdGlvbik7XHJcbiAgICBzZWxlY3Rpb24ubGFzdEFuc3dlciA9IChhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwKSAmJiBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIgP1xyXG4gICAgICBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIudHJpbSgpIDpcclxuICAgICAgJyc7XHJcbiAgICBzZWxlY3Rpb24ubGFzdEFuc3dlck5vZGVJZCA9IGFuc3dlcnNGcm9tU2VsZWN0aW9uLmxlbmd0aCA+IDAgPyBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5ub2RlSWQgOiB1bmRlZmluZWQ7XHJcbiAgICBsZXQgYW5zd2VyVHJlZTogYW55O1xyXG4gICAgbGV0IGFuc3dlclRyZWVTdHJpbmc6IHN0cmluZztcclxuICAgIGlmIChhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFuc3dlclRyZWUgPSBhbnN3ZXJzRnJvbVNlbGVjdGlvblxyXG4gICAgICAgIC5maWx0ZXIocyA9PiB0aGlzLl9pc1NlbGVjdGlvblB1Ymxpc2hlZChzKSB8fCBzLnVzZXJJbnB1dClcclxuICAgICAgICAubWFwKChzOiBTZWxlY3Rpb24sIGlkeDogbnVtYmVyLCBhcnI6IFNlbGVjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aXRsZTogcy51c2VySW5wdXQgPyAocy5hbnN3ZXIgPyBzLmFuc3dlci50cmltKCkgOiAnJykgOiAocy5xdWVzdGlvbiA/IHMucXVlc3Rpb24udHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcy51c2VySW5wdXQgPyAocy51c2VySW5wdXRWYWx1ZSA/IHMudXNlcklucHV0VmFsdWUudHJpbSgpIDogJycpIDogKHMuYW5zd2VyID8gcy5hbnN3ZXIudHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICBwcmljZTogcy5hcnRSZXRhaWxQcmljZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgYW5zd2VyVHJlZVN0cmluZyA9IGFuc3dlcnNGcm9tU2VsZWN0aW9uXHJcbiAgICAgICAgLmZpbHRlcihzID0+IHRoaXMuX2lzQWxsU2VsZWN0aW9uUHVibGlzaGVkKHMpIHx8IHMudXNlcklucHV0KVxyXG4gICAgICAgIC5tYXAoKHM6IFNlbGVjdGlvbiwgaWR4OiBudW1iZXIsIGFycjogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHMudXNlcklucHV0ID8gKHMudXNlcklucHV0VmFsdWUgPyBzLnVzZXJJbnB1dFZhbHVlLnRyaW0oKSA6ICcnKSA6IChzLmFuc3dlciA/IHMuYW5zd2VyLnRyaW0oKSA6ICcnKVxyXG4gICAgICAgIH0pLmpvaW4oJyAtICcpO1xyXG4gICAgfVxyXG4gICAgc2VsZWN0aW9uLmFuc3dlclRyZWVTdHJpbmcgPSBhbnN3ZXJUcmVlU3RyaW5nO1xyXG4gICAgaWYgKGFuc3dlclRyZWUpIHtcclxuICAgICAgc2VsZWN0aW9uLmFuc3dlclRyZWUgPSBKU09OLnN0cmluZ2lmeShhbnN3ZXJUcmVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGlvbi5hbnN3ZXJUcmVlID0gSlNPTi5zdHJpbmdpZnkoW3tcclxuICAgICAgICB0aXRsZTogc2VsZWN0aW9uLnVzZXJJbnB1dCA/IChzZWxlY3Rpb24uYW5zd2VyID8gc2VsZWN0aW9uLmFuc3dlci50cmltKCkgOiAnJykgOiAoc2VsZWN0aW9uLnF1ZXN0aW9uID8gc2VsZWN0aW9uLnF1ZXN0aW9uLnRyaW0oKSA6ICcnKSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogc2VsZWN0aW9uLnVzZXJJbnB1dCA/IChzZWxlY3Rpb24udXNlcklucHV0VmFsdWUgPyBzZWxlY3Rpb24udXNlcklucHV0VmFsdWUudHJpbSgpIDogJycpIDogKHNlbGVjdGlvbi5hbnN3ZXIgPyBzZWxlY3Rpb24uYW5zd2VyLnRyaW0oKSA6ICcnKSxcclxuICAgICAgICBwcmljZTogc2VsZWN0aW9uLmFydFJldGFpbFByaWNlXHJcbiAgICAgIH1dKTtcclxuICAgIH1cclxuICAgIGxldCB0b3RhbFByaWNlOiBudW1iZXIgPSAwOyAvLyB0ZW1wIGZpeCB1bnRpbCBiYWNrZW5kIGlzIHJlYWR5XHJcbiAgICBhbnN3ZXJzRnJvbVNlbGVjdGlvbi5mb3JFYWNoKChzOiBTZWxlY3Rpb24pID0+IHtcclxuICAgICAgdG90YWxQcmljZSArPSBzLmFydFJldGFpbFByaWNlID8gcy5hcnRSZXRhaWxQcmljZSA6IDA7IC8vIHRlbXAgZml4IHVudGlsIGJhY2tlbmQgaXMgcmVhZHlcclxuICAgIH0pO1xyXG4gICAgKHNlbGVjdGlvbiBhcyBhbnkpLnRvdGFsUHJpY2UgPSB0b3RhbFByaWNlOyAvLyB0ZW1wIGZpeCB1bnRpbCBiYWNrZW5kIGlzIHJlYWR5XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1NlbGVjdGlvblB1Ymxpc2hlZChzOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiAocy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuUXVlc3Rpb24gJiYgKCgocy5vcHRpb25TaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChzLm9wdGlvblNob3dPbikpKSB8fFxyXG4gICAgICAgIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BbnN3ZXIgJiYgKCgocy5ub2RlU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5ub2RlU2hvd09uKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNBbGxTZWxlY3Rpb25QdWJsaXNoZWQoczogU2VsZWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHMubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKHMub3B0aW9uU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5vcHRpb25TaG93T24pKSkgfHxcclxuICAgICAgICAocy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuTmV4dE9wdGlvblZhbHVlICYmICgoKHMubm9kZVNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKHMubm9kZVNob3dPbikpKSB8fFxyXG4gICAgICAgIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BbnN3ZXIgJiYgKCgocy5ub2RlU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5ub2RlU2hvd09uKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNBbnN3ZXJQdWJsaXNoZWQoYTogQW5zd2VyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKGlzTmlsbChhLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSkgfHwgKChhLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApKS8qICYmXHJcbiAgICAgICAgKFxyXG4gICAgICAgICAgICAoYS50eXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJiAoKChhLm9wdGlvblNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKGEub3B0aW9uU2hvd09uKSkpIHx8XHJcbiAgICAgICAgICAgIChhLnR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJiAoKChhLm5vZGVTaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChhLm5vZGVTaG93T24pKSlcclxuICAgICAgICApKi87XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVsb2FkQ2FjaGVkSW1hZ2VzKGFuc3dlcnNPclNlbGVjdGlvbnM6IEFuc3dlcltdIHwgU2VsZWN0aW9uW10pOiB2b2lkIHtcclxuICAgIGFuc3dlcnNPclNlbGVjdGlvbnMuZm9yRWFjaCgoYW5zd2VyT3JTZWxlY3Rpb246IEFuc3dlciB8IFNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBpZiAoYW5zd2VyT3JTZWxlY3Rpb24ubm9kZUlkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCkpIHtcclxuICAgICAgICAgIGFuc3dlck9yU2VsZWN0aW9uLmltYWdlRGF0YSA9IHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhZGRUb0NhcnQoZ29vZElkOiBudW1iZXIsIGdvb2RUeXBlOiBzdHJpbmcsIHF1YW50aXR5OiBudW1iZXIsIGluc3RhbmNlSWQ6IG51bWJlciwgZXh0ZXJuYWxTb3VyY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IGpzb246IHN0cmluZztcclxuICAgIGNvbnN0IHN0YXRpc3RpY3M6IENvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudCA9IG5ldyBDb25maWd1cmF0b3JTdGF0aXN0aWNzRW52aXJvbm1lbnQoKTtcclxuICAgIHN0YXRpc3RpY3MudXNlclR5cGUgPSAnSG9tZWRlY29yYXRvcic7XHJcbiAgICBzdGF0aXN0aWNzLnRyYW5zYWN0aW9uVHlwZSA9ICdTYWxlcyc7XHJcbiAgICBzdGF0aXN0aWNzLmFjdGlvbkRvbWFpbiA9ICdIb21lZGVjb3JhdG9yJztcclxuICAgIHN0YXRpc3RpY3Muc2Vzc2lvbklkID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNlc3Npb24gPyB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2Vzc2lvbi5zZXNzaW9uSWQgOiAndW5rbm93bic7XHJcbiAgICBzdGF0aXN0aWNzLndlYkhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDtcclxuICAgIHN0YXRpc3RpY3MuYnVuZGxlSG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xyXG4gICAganNvbiA9IGF3YWl0IHRoaXMuZ2V0SnNvbkNvbmZpZ3VyZWRBcnRpY2xlcyhnb29kSWQsIGdvb2RUeXBlLCBxdWFudGl0eSwgZXh0ZXJuYWxTb3VyY2UsIHRydWUsIGluc3RhbmNlSWQsIHN0YXRpc3RpY3MpO1xyXG4gICAgY29uc3QgZnJvemVuQXJ0aWNsZTogRnJvemVuQXJ0aWNsZVNpbXBsZSB8IEZyb3plbkFydGljbGUgPSBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgdGhpcy5fZ29vZ2xlVGFnTWFuYWdlci5zZW5kRXZlbnQoR29vZ2xlVGFnTWFuYWdlckV2ZW50LkFkZFRvQ2FydCwge1xyXG4gICAgICAnYXJ0aWNsZU5yJzogZnJvemVuQXJ0aWNsZS5hcnRpY2xlTnIsXHJcbiAgICAgICdwcm9kdWN0JzogZnJvemVuQXJ0aWNsZS5hcnRpY2xlTmFtZSxcclxuICAgICAgJ2NvbXBvc2l0aW9uJzogZnJvemVuQXJ0aWNsZSBpbnN0YW5jZW9mIEZyb3plbkFydGljbGUgPyBmcm96ZW5BcnRpY2xlLmNvbXBvc2l0aW9ucyA6IGZyb3plbkFydGljbGUuY29uZmlndXJhdGlvblRleHRcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQXJ0aWNsZUNyZWF0ZWQsIGpzb24pO1xyXG4gICAgcmV0dXJuIGpzb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlQW5zd2Vyc1JlY2VpdmVkKGFuc3dlcnM6IEFuc3dlcltdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmVsb2FkQ2FjaGVkSW1hZ2VzKGFuc3dlcnMpO1xyXG4gICAgdGhpcy5hbnN3ZXJzUmVjZWl2ZWQubmV4dChhbnN3ZXJzKTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZUFuc3dlcnMgJiYgdGhpcy5hY3RpdmVBbnN3ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5fbG9hZFByaWNlc09mQWN0aXZlQW5zd2VycygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlcGFyZVNlbGVjdGlvbnNUb0Rpc3BsYXlJbWFnZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5ICYmIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbnNUb0Rpc3BsYXlbaV07XHJcbiAgICAgICAgY29uc3QgbGFzdEFuc3dlclNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlSWQgPT09IHNlbGVjdGlvbi5sYXN0QW5zd2VyTm9kZUlkKTtcclxuICAgICAgICBpZiAobGFzdEFuc3dlclNlbGVjdGlvbiAmJiAoc2VsZWN0aW9uLmdlbmVyaWMgfHwgc2VsZWN0aW9uLmdyb3VwZWQpKSB7XHJcbiAgICAgICAgICBpZiAoIWxhc3RBbnN3ZXJTZWxlY3Rpb24uaW1hZ2VEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rvci5nZXRJbWFnZUZvckFuc3dlck9yU2VsZWN0aW9uKGxhc3RBbnN3ZXJTZWxlY3Rpb24sIDQsIHRydWUsIGZhbHNlKS50aGVuKChpbWFnZURhdGE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWQobGFzdEFuc3dlclNlbGVjdGlvbiwgaW1hZ2VEYXRhKTtcclxuICAgICAgICAgICAgICBzZWxlY3Rpb24uaW1hZ2VEYXRhTGFzdEFuc3dlciA9IGxhc3RBbnN3ZXJTZWxlY3Rpb24uaW1hZ2VEYXRhO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5pbWFnZURhdGFMYXN0QW5zd2VyID0gbGFzdEFuc3dlclNlbGVjdGlvbi5pbWFnZURhdGE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9uc05leHRPcHRpb25WYWx1ZXMoc2VsZWN0aW9uczogU2VsZWN0aW9uW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gc2VsZWN0aW9ucy5sZW5ndGggLSAxO1xyXG4gICAgbGV0IG5vdlRleHQ6IHN0cmluZyA9ICcnO1xyXG4gICAgZm9yIChsZXQgaSA9IGxlbjsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5OZXh0T3B0aW9uVmFsdWUpIHtcclxuICAgICAgICBub3ZUZXh0ID0gc2VsZWN0aW9uLmFuc3dlciArIChub3ZUZXh0ID8gYCAtICR7bm92VGV4dH1gIDogJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChub3ZUZXh0KSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZVN0cmluZyA9IGAke3NlbGVjdGlvbi5hbnN3ZXJ9IC0gJHtub3ZUZXh0fWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vdlRleHQgPSAnJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UHVibGljYXRpb25Db2RlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yLmdldFB1YmxpY2F0aW9uQ29kZUJhc2VkT25Mb2dpbigpO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBfb25EZWNvTm9kZXNSZWNlaXZlZChkZWNvTm9kZXM6IERlY29Ob2RlW10pOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuX2RlY29Ob2RlcyA9IGRlY29Ob2RlcztcclxuICAvLyAgIHRoaXMuZGVjb05vZGVzUmVjZWl2ZWQubmV4dChkZWNvTm9kZXMpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBfb25RdWVzdGlvblJlY2VpdmVkKHF1ZXN0aW9uOiBRdWVzdGlvbik6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5fYWN0aXZlUXVlc3Rpb24gPSBxdWVzdGlvbjtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUltYWdlUmVjZWl2ZWQoYW5zd2VyT3JTZWxlY3Rpb246IEFuc3dlciB8IFNlbGVjdGlvbiwgaW1hZ2VEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbWFnZURhdGFPclVybDogc3RyaW5nO1xyXG4gICAgaWYgKGltYWdlRGF0YSkge1xyXG4gICAgICBpZiAoaW1hZ2VEYXRhLm1hdGNoKC9kYXRhOmltYWdlLykgfHwgaW1hZ2VEYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCBpbWFnZURhdGEuc3RhcnRzV2l0aCgnd3d3JykpIHtcclxuICAgICAgICBpbWFnZURhdGFPclVybCA9IGltYWdlRGF0YTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5hc3NldFBhdGggJiYgIXRoaXMuYXNzZXRQYXRoLmVuZHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgIHRoaXMuYXNzZXRQYXRoICs9ICcvJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGltYWdlRGF0YS5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgIGltYWdlRGF0YSA9IGltYWdlRGF0YS5zdWJzdHIoMSwgaW1hZ2VEYXRhLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGltYWdlRGF0YU9yVXJsID0gKHRoaXMuYXNzZXRQYXRoID8gdGhpcy5hc3NldFBhdGggOiAnJykgKyBpbWFnZURhdGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICg8YW55PmFuc3dlck9yU2VsZWN0aW9uKS5pbWFnZURhdGEgPSBpbWFnZURhdGFPclVybCA9PT0gdW5kZWZpbmVkID8gJycgOiBpbWFnZURhdGFPclVybDtcclxuICAgIGlmIChpbWFnZURhdGFPclVybCkge1xyXG4gICAgICB0aGlzLl9jYWNoZUltYWdlKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCwgaW1hZ2VEYXRhT3JVcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FjaGVJbWFnZShpZDogbnVtYmVyLCBpbWFnZURhdGFPclVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbWFnZUNhY2hlLnNldChpZCwgaW1hZ2VEYXRhT3JVcmwpO1xyXG4gIH1cclxuXHJcbiAgLy8gd2lsbCBiZSB1c2VkL2ltcGxlbWVudGVkIGxhdGVyIG9uLCBvbiB0aGUgcHJvZHVjdCBkZXRhaWwgcGFnZVxyXG4gIC8vIHByaXZhdGUgX29uTW9vZEltYWdlUmVjZWl2ZWQobW9vZEltYWdlRGF0YTogYW55KTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLm1vb2RJbWFnZXNSZWNlaXZlZC5uZXh0KG1vb2RJbWFnZURhdGEpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBfb25BbnN3ZXJJbmZvUmVjZWl2ZWQoZGF0YTogeyBhbnN3ZXI6IEFuc3dlciwgaW5mbzogQXJ0aWNsZVRleHRbXSB9KTogdm9pZCB7XHJcbiAgICAvLyBAdG9kbyBjaGVjayB0aGlzXHJcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmFuc3dlciAmJiBkYXRhLmluZm8pIHtcclxuICAgICAgbGV0IGluZm9NZXNzYWdlID0gJyc7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW46IG51bWJlciA9IGRhdGEuaW5mby5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGluZm86IEFydGljbGVUZXh0ID0gZGF0YS5pbmZvW2ldO1xyXG4gICAgICAgIGluZm9NZXNzYWdlICs9IGluZm8uZGVzY3JpcHRpb24gKyAnXFxuXFxuJyArIGluZm8udGV4dDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuYXJ0aWNsZUluZm9SZWNlaXZlZC5uZXh0KGluZm9NZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNob3dMb2FkZXJDaGFuZ2Uoc2hvd0xvYWRlcjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2hvdWxkU2hvd0xvYWRlciA9IHNob3dMb2FkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Db25uZWN0aW9uUmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbm5lY3Rpb25SZXNldC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVJbnN0YW5jZVJlc3BvbnNlKHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSk6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhIHtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuaW5zdGFuY2VTZXQubmV4dChyZXNwb25zZS5yZXN1bHRPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgLy8gUE9TVENPTkRJVElPTjogY3VycmVudCBhY3RpdmVBbnN3ZXJzIGhhdmUgcHJpY2UgdmFsdWVzLlxyXG4gIHByaXZhdGUgYXN5bmMgX2xvYWRQcmljZXNPZkFjdGl2ZUFuc3dlcnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhbnN3ZXJQcmljZXM6IEFuc3dlclByaWNlW10gPSBhd2FpdCB0aGlzLl9jb25uZWN0b3IuZ2V0QW5zd2VyUHJpY2VzKCk7XHJcbiAgICBpZiAoYW5zd2VyUHJpY2VzKSB7XHJcbiAgICAgIC8vIHBhc3RlIHByaWNlIGRhdGEgb250byBvdXIgY3VycmVudCBhbnN3ZXIgb2JqZWN0czsgQW5zd2VyUHJpY2Uuc2VsSWQgY29ycmVzcG9uZHMgdG8gQW5zd2VyLm5vZGVcclxuICAgICAgYW5zd2VyUHJpY2VzLmZvckVhY2goYW5zd2VyUHJpY2UgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFuc3dlck1hdGNoOiBBbnN3ZXIgPSB0aGlzLmFjdGl2ZUFuc3dlcnMuZmluZChhbnMgPT4gYW5zLm5vZGUgPT09IGFuc3dlclByaWNlLnNlbElkKTtcclxuICAgICAgICBpZiAoYW5zd2VyTWF0Y2gpIHtcclxuICAgICAgICAgICg8YW55PmFuc3dlck1hdGNoKS5wcmljZSA9IC8vIHRlbXAgZml4IGZvciBwcmljZSB1bnRpbCBiYWNrZW5kIGlzIHJlYWR5XHJcbiAgICAgICAgICAgICg8YW55PmFuc3dlck1hdGNoKS5ub2RlTGV2ZWwgPT09IDAgJiYgYW5zd2VyUHJpY2UuYWRkUmV0YWlsUHJpY2UgJiYgKDxhbnk+YW5zd2VyTWF0Y2gpLnNlcU8gPT09IDEgP1xyXG4gICAgICAgICAgICAgIGFuc3dlclByaWNlLmFkZFJldGFpbFByaWNlIC0gdGhpcy5fYXJ0aWNsZVByaWNlIDpcclxuICAgICAgICAgICAgICBhbnN3ZXJQcmljZS5hZGRSZXRhaWxQcmljZTtcclxuICAgICAgICAgIHRoaXMuZXh0cmFBbnN3ZXJEYXRhTG9hZGVkLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY29weUluc3RhbmNlKFxyXG4gICAgb3JpZ2luYWxJbnN0YW5jZUlkOiBzdHJpbmcsXHJcbiAgICBzaG91bGRTYXZlQ3VycmVudEluc3RhbmNlSWQ6IGJvb2xlYW4sXHJcbiAgICByZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHRcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvcHlJbnN0YW5jZVJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5jb3B5SW5zdGFuY2Uob3JpZ2luYWxJbnN0YW5jZUlkLCBzaG91bGRTYXZlQ3VycmVudEluc3RhbmNlSWQpLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUgPT09ICdFQ09OTkFCT1JURUQnIHx8IGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLlRpbWVvdXQ7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLlVua25vd247XHJcbiAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgRXJyb3JNZXNzYWdlKGNvcHlJbnN0YW5jZVJlc3BvbnNlLnJlc3VsdE9iamVjdC5kYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKCFjb3B5SW5zdGFuY2VSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgaWYgKGNvcHlJbnN0YW5jZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQubWVzc2FnZXMubWFwKChtOiBhbnkpID0+IG0ubWVzc2FnZVR5cGUgPT09ICdFJykgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uTm90Rml4ZWQ7XHJcbiAgICAgICAgY29weUluc3RhbmNlUmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5tZXNzYWdlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgRXJyb3JNZXNzYWdlKG0ubWVzc2FnZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uUGFydGlhbGx5Rml4ZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0luc3RhbmNlSWQ6IHN0cmluZyA9IGNvcHlJbnN0YW5jZVJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UoY29weUluc3RhbmNlUmVzcG9uc2UpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdJbnN0YW5jZUlkKTtcclxuICB9XHJcbn1cclxuIl19
782
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZWRlY29yYXRvci1jb25uZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFLNUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUsxRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0scURBQXFELENBQUM7QUFJN0UsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkVBQTJFLENBQUM7QUFDNUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBSXZHLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQzVGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFLcEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQ25GLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBSTVFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDZEQUE2RCxDQUFDO0FBQ2hHLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGdGQUFnRixDQUFDOzs7Ozs7Ozs7QUFHMUgsZ0hBQWdIO0FBSWhILE1BQU0sT0FBTyw2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YmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtKc29uVXRpbHNTZXJ2aWNlfSBmcm9tICcuL2pzb24tdXRpbHMuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlfSBmcm9tICcuL2hvbWVkZWNvcmF0b3ItY29ubmVjdG9yLWFkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7U2tpcEJ1dHRvbkluZm9TZXJ2aWNlfSBmcm9tICcuL3NraXAtYnV0dG9uLWluZm8uc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZUJ1c1NlcnZpY2V9IGZyb20gJy4vbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZVR5cGV9IGZyb20gJy4uL2VudW0vbWVzc2FnZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb24vaXMtbmlsbC5mdW5jdGlvbic7XHJcbmltcG9ydCB7QXJ0aWNsZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlJztcclxuaW1wb3J0IHtEZWNvTm9kZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9kZWNvLW5vZGUnO1xyXG5pbXBvcnQge0Fuc3dlcn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hbnN3ZXInO1xyXG5pbXBvcnQge0ludGVybmFsUGFyYW19IGZyb20gJ0Bjb2xpam5pdC9tYWluYXBpL2J1aWxkL2VudW0vaW50ZXJuYWwtcGFyYW0uZW51bSc7XHJcbmltcG9ydCB7Tm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7QW5zd2VyUHJpY2V9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyLXByaWNlJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuaW1wb3J0IHtRdWVzdGlvbkFuZEFuc3dlcnN9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvcXVlc3Rpb24tYW5kLWFuc3dlcnMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudH0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9jb25maWd1cmF0b3Itc3RhdGlzdGljcy1lbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7T3B0aW9uc30gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvb3B0aW9ucyc7XHJcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhJztcclxuaW1wb3J0IHtBcnRpY2xlVGV4dH0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlLXRleHQuYm8nO1xyXG5pbXBvcnQge0V4dGVybmFsQ2F0YWxvZ1N0YXJ0dXBJbmZvfSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9leHRlcm5hbC1jYXRhbG9nLXN0YXJ0dXAtaW5mbyc7XHJcbmltcG9ydCB7RXh0ZXJuYWxDYXRhbG9nU3RhcnR1cEluZm9SZXF1ZXN0fSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9leHRlcm5hbC1jYXRhbG9nLXN0YXJ0dXAtaW5mby1yZXF1ZXN0JztcclxuaW1wb3J0IHtDdXN0b21GbG9vckdyb3VwUmVzdWx0fSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvcmUzZC9tb2RlbC9jdXN0b20tZmxvb3ItZ3JvdXAtcmVzdWx0JztcclxuaW1wb3J0IHtSZXN1bHRUeXBlfSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvcmUzZC9lbnVtL3Jlc3VsdC10eXBlLmVudW0nO1xyXG5pbXBvcnQge0Vycm9yTWVzc2FnZX0gZnJvbSAnLi4vbW9kZWwvZXJyb3ItbWVzc2FnZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZX0gZnJvbSAnLi9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2V9IGZyb20gJy4vaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzfSBmcm9tICcuLi9tb2RlbC9ob21lZGVjb3JhdG9yLXNldHRpbmdzJztcclxuaW1wb3J0IHtGcm96ZW5BcnRpY2xlU2ltcGxlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2Zyb3plbi1hcnRpY2xlLXNpbXBsZSc7XHJcbmltcG9ydCB7RnJvemVuQXJ0aWNsZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9mcm96ZW4tYXJ0aWNsZSc7XHJcbmltcG9ydCB7R29vZ2xlVGFnTWFuYWdlckV2ZW50fSBmcm9tICcuLi9lbnVtL2dvb2dsZS10YWctbWFuYWdlci1ldmVudC5lbnVtJztcclxuaW1wb3J0IHtHb29nbGVUYWdNYW5hZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZS9nb29nbGUtdGFnLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvcXVlc3Rpb24nO1xyXG5pbXBvcnQge1NlbGVjdG9yU3RydWN0dXJlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdG9yLXN0cnVjdHVyZS5ibyc7XHJcbmltcG9ydCB7U2VsZWN0b3JXaXRoT3B0aW9uc30gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rvci13aXRoLW9wdGlvbnMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25EaXNwbGF5T3B0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vcmVmY29kZS9jb25maWd1cmF0aW9uLWRpc3BsYXktb3B0aW9uLmVudW0nO1xyXG5pbXBvcnQge0ltYWdlVXRpbHN9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL3V0aWxzL2ltYWdlLXV0aWxzJztcclxuXHJcbi8vIEhvbGRzIGFsbCBpT05FIGJhY2tlbmQgcmVsYXRlZCBzdGF0ZSBhbmQgbWV0aG9kcyBmb3IgYSBydW5uaW5nIEhvbWVEZWNvcmF0b3IuIFRvIGJlIHVzZWQgYW55d2hlcmUgaW50ZXJuYWxseS5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIb21lZGVjb3JhdG9yQ29ubmVjdG9yU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gICAgcHVibGljIGdldCBhcnRpY2xlKCk6IEFydGljbGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcnRpY2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZGVjb05vZGVzKCk6IERlY29Ob2RlW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvTm9kZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb25zKHZhbHVlOiBTZWxlY3Rpb25bXSkge1xyXG4gICAgICAgIC8vIHRlbXAgZml4IGZvciBwcmljZXMgdW50aWwgYmFja2VuZCBpcyByZWFkeVxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FydGljbGVQcmljZSA9IHZhbHVlWzBdLmFydFJldGFpbFByaWNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FydGljbGVQcmljZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbnMgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2VsZWN0aW9uV2l0aEFuc3dlcnModmFsdWU6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbldpdGhBbnN3ZXJzID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb25XaXRoQW5zd2VycygpOiBTZWxlY3RvcldpdGhPcHRpb25zW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25XaXRoQW5zd2VycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkQW5zd2Vycyh2YWx1ZTogU2VsZWN0b3JXaXRoT3B0aW9uc1tdKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRBbnN3ZXJzID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzZWxlY3RlZEFuc3dlcnMoKTogU2VsZWN0b3JXaXRoT3B0aW9uc1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBbnN3ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudFNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2VsZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZVNlbGVjdGlvbigpOiBTZWxlY3Rpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVTZWxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0b3RhbFByaWNlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUHJpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzaG91bGRTaG93TG9hZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaG91bGRTaG93TG9hZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2hvdWxkU2hvd0xvYWRlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5faGlkZUxvYWRlclRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl9zaG91bGRTaG93TG9hZGVyID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9oaWRlTG9hZGVyVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvdWxkU2hvd0xvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LCB0aGlzLl9oaWRlTG9hZGVyVGltZXJUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbnRyb2xsZXJJbml0aWFsaXplZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXJ0aWNsZVJlY2VpdmVkOiBTdWJqZWN0PEFydGljbGU+ID0gbmV3IFN1YmplY3Q8QXJ0aWNsZT4oKTtcclxuICAgIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25zUmVjZWl2ZWQ6IFN1YmplY3Q8U2VsZWN0aW9uW10+ID0gbmV3IFN1YmplY3Q8U2VsZWN0aW9uW10+KCk7XHJcbiAgICAvLyBwdWJsaWMgcmVhZG9ubHkgZGVjb05vZGVzUmVjZWl2ZWQ6IFN1YmplY3Q8RGVjb05vZGVbXT4gPSBuZXcgU3ViamVjdDxEZWNvTm9kZVtdPigpO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGFuc3dlcnNSZWNlaXZlZDogU3ViamVjdDxBbnN3ZXJbXT4gPSBuZXcgU3ViamVjdDxBbnN3ZXJbXT4oKTtcclxuICAgIHB1YmxpYyByZWFkb25seSBleHRyYUFuc3dlckRhdGFMb2FkZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgLy8gcHVibGljIHJlYWRvbmx5IG1vb2RJbWFnZXNSZWNlaXZlZDogU3ViamVjdDx7IGFuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXIgfCBTZWxlY3Rpb24sIGltYWdlRGF0YTogc3RyaW5nIH0+ID1cclxuICAgIC8vICAgbmV3IFN1YmplY3Q8e2Fuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXJ8U2VsZWN0aW9uLCBpbWFnZURhdGE6IHN0cmluZ30+KCk7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uc0FuZERlY29zTGlua2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uUmVzZXQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIHB1YmxpYyBhc3NldFBhdGg6IHN0cmluZztcclxuICAgIHB1YmxpYyBzZWxlY3Rpb25zVG9EaXNwbGF5OiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgcHVibGljIGFjdGl2ZVF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICAgIHB1YmxpYyBhY3RpdmVBbnN3ZXJzOiBBbnN3ZXJbXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgX2hpZGVMb2FkZXJUaW1lb3V0OiBhbnk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oaWRlTG9hZGVyVGltZXJUaW1lb3V0OiBudW1iZXIgPSA1MDA7XHJcbiAgICBwcml2YXRlIF9hcnRpY2xlOiBBcnRpY2xlO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBbXTtcclxuICAgIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfZGVjb05vZGVzOiBEZWNvTm9kZVtdID0gW107XHJcbiAgICBwcml2YXRlIF9hY3RpdmVTZWxlY3Rpb246IFNlbGVjdGlvbjtcclxuICAgIHByaXZhdGUgX2FydGljbGVQcmljZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX3RvdGFsUHJpY2U6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3Nob3VsZFNob3dMb2FkZXI6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9jb25uZWN0b3JPcHRpb25zOiBPcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgICBwcml2YXRlIF9pbml0aWFsaXppbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pbWFnZUNhY2hlOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uV2l0aEFuc3dlcnM6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRBbnN3ZXJzOiBTZWxlY3RvcldpdGhPcHRpb25zW10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9jb25uZWN0b3I6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9qc29uVXRpbHM6IEpzb25VdGlsc1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfc2V0dGluZ3NTZXJ2aWNlOiBIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3NraXBCdXR0b25JbmZvU2VydmljZTogU2tpcEJ1dHRvbkluZm9TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hcHBFdmVudFNlcnZpY2U6IEhvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfZ29vZ2xlVGFnTWFuYWdlcjogR29vZ2xlVGFnTWFuYWdlclNlcnZpY2VcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N1YnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgICAgIHRoaXMuX2ltYWdlQ2FjaGUuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0V2ViVmlld1N0YXJ0dXBJbmZvKHJlcXVlc3Q6IEV4dGVybmFsQ2F0YWxvZ1N0YXJ0dXBJbmZvUmVxdWVzdCk6IFByb21pc2U8RXh0ZXJuYWxDYXRhbG9nU3RhcnR1cEluZm8+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yLmdldFdlYlZpZXdTdGFydHVwSW5mbyhyZXF1ZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaW5pdE5vZGVJbnN0YW5jZShza3U6IHN0cmluZyk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgICAgICBjb25zdCBnb29kSWQ6IG51bWJlciA9IGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5nZXRHb29kSWRGcm9tQXJ0aWNsZU5yKHNrdSk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmluaXROb2RlSW5zdGFuY2UoZ29vZElkLCB0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlSW5zdGFuY2VSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGNoYW5nZUNvbm5lY3Rpb24oaW5zdGFuY2VJZDogc3RyaW5nLCBvbGRDb25uZWN0aW9uOiBzdHJpbmcsIG5ld0Nvbm5lY3Rpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5jaGFuZ2VDb25uZWN0aW9uKGluc3RhbmNlSWQsIG9sZENvbm5lY3Rpb24sIG5ld0Nvbm5lY3Rpb24pO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW1wdHlTZWxlY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuZGVjb05vZGVzLmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVtcHR5QW5zd2Vyc0FuZFF1ZXN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlQW5zd2Vycy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlUXVlc3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIGZvciBvYnNvbGV0ZSBmdXJuaXR1cmVcclxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25zXHJcbiAgICAgKiBAcGFyYW0gZXh0cmFJbmZvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb25zKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdLCBleHRyYUluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgLy8gdGhpcy5fb25TZWxlY3Rpb25zUmVjZWl2ZWQoc2VsZWN0aW9ucywgZXh0cmFJbmZvKTtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgZm9yIG9ic29sZXRlIGZ1cm5pdHVyZVxyXG4gICAgICogQHBhcmFtIGRlY29Ob2Rlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RGVjb05vZGVzKGRlY29Ob2RlczogRGVjb05vZGVbXSkge1xyXG4gICAgICAgIHRoaXMuX2RlY29Ob2RlcyA9IGRlY29Ob2RlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW1hZ2VDYWNoZSgpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbWFnZUNhY2hlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbWFnZUJ5SWQoaWQ6IG51bWJlcik6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgYmVmb3JlTG9hZFByZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICAvLyBpZiAoKHRoaXMuX2Nvbm5lY3Rvck9wdGlvbnMgYXMgSG9tZWRlY29yYXRvclNldHRpbmdzKS5wcm9qZWN0U2V0dGluZ3MpIHtcclxuICAgICAgICAvLyAgIHRoaXMuX2Nvbm5lY3Rvci5zYXZlRXh0ZXJuYWxTb3VyY2VzKCk7XHJcbiAgICAgICAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgLy8gICBhd2FpdCB0aGlzLl9jb25uZWN0b3IuaW5pdENvbm5lY3RvcigodGhpcy5fY29ubmVjdG9yT3B0aW9ucyBhcyBIb21lZGVjb3JhdG9yU2V0dGluZ3MpLnByb2plY3RTZXR0aW5ncywgdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICAvLyAgIGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5wcmVwYXJlRXh0ZXJuYWxTb3VyY2VzKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZnRlckxvYWRQcmVzZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy8gaWYgKCh0aGlzLl9jb25uZWN0b3JPcHRpb25zIGFzIEhvbWVkZWNvcmF0b3JTZXR0aW5ncykucHJvamVjdFNldHRpbmdzKSB7XHJcbiAgICAgICAgLy8gICB0aGlzLl9jb25uZWN0b3IucmVzZXRFeHRlcm5hbFNvdXJjZXMoKTtcclxuICAgICAgICAvLyAgIGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5pbml0Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvck9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBpbml0Q29ubmVjdGlvbihmb3JjZVJlbG9hZD86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoKHRoaXMuX2luaXRpYWxpemVkIHx8IHRoaXMuX2luaXRpYWxpemluZykgJiYgIWZvcmNlUmVsb2FkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6aW5nID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nczogSG9tZWRlY29yYXRvclNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzO1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignU2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rvck9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG5ldyBPcHRpb25zKCksIHNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rvci5zaG93TG9hZGVyLnN1YnNjcmliZShzaG93TG9hZGVyID0+IHRoaXMub25TaG93TG9hZGVyQ2hhbmdlKHNob3dMb2FkZXIpKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rvci5jb25uZWN0aW9uUmVzZXQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Db25uZWN0aW9uUmVzZXQoKSksXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuQWRkVG9DYXJ0LCAoKSA9PiB0aGlzLmFkZFRvQ2FydCgpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9jb25uZWN0b3IuaW5pdENvbm5lY3Rvcih0aGlzLl9jb25uZWN0b3JPcHRpb25zLCB1bmRlZmluZWQsIGZvcmNlUmVsb2FkKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNlc3Npb24gPSB0aGlzLl9jb25uZWN0b3JPcHRpb25zLnNlc3Npb247XHJcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rvci5wcmVwYXJlRXh0ZXJuYWxTb3VyY2VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlckluaXRpYWxpemVkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEludGVybmFsUGFyYW1ldGVyKHBhcmFtOiBJbnRlcm5hbFBhcmFtKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yLmdldEludGVybmFsUGFyYW1ldGVyKHBhcmFtKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SnNvbkNvbmZpZ3VyZWRBcnRpY2xlcyhnb29kSWQ6IG51bWJlciwgZ29vZFR5cGU6IHN0cmluZywgcXVhbnRpdHk6IG51bWJlciwgZXh0ZXJuYWxTb3VyY2U6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlLCBpbnN0YW5jZUlkPzogc3RyaW5nLCBjb25maWd1cmF0b3JTdGF0aXN0aWNzPzogQ29uZmlndXJhdG9yU3RhdGlzdGljc0Vudmlyb25tZW50KTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5nZXRKc29uQ29uZmlndXJlZEFydGljbGVzKGdvb2RJZCwgZ29vZFR5cGUsIHF1YW50aXR5LCBleHRlcm5hbFNvdXJjZSwgc2hvd0xvYWRlciwgaW5zdGFuY2VJZCwgY29uZmlndXJhdG9yU3RhdGlzdGljcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIGdldEpzb25NYXRjaFRhYmxlQXJ0aWNsZXMoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5nZXRKc29uTWF0Y2hUYWJsZUFydGljbGVzKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNldEluc3RhbmNlKGlkOiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLnNldEluc3RhbmNlVG9Db25maWd1cmUoaWQpLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb3B5SW5zdGFuY2VBbmRTYXZlT3JpZ2luYWxDb25maWd1cmF0aW9uKGluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29weUluc3RhbmNlKGluc3RhbmNlSWQsIHRydWUsIHJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvcHlJbnN0YW5jZUFuZExvc2VPcmlnaW5hbENvbmZpZ3VyYXRpb24oaW5zdGFuY2VJZDogc3RyaW5nLCByZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb3B5SW5zdGFuY2UoaW5zdGFuY2VJZCwgZmFsc2UsIHJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNhdmVDb25maWd1cmF0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLnNhdmVDb25maWd1cmF0aW9ucygpO1xyXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBzYXZpbmcgY29uZmlndXJhdGlvbnMnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEFydGljbGUoc2t1OiBzdHJpbmcsIGJyYW5jaDogc3RyaW5nKTogUHJvbWlzZTxBcnRpY2xlPiB7XHJcbiAgICAgICAgdGhpcy5lbXB0eVNlbGVjdGlvbnMoKTtcclxuICAgICAgICB0aGlzLmVtcHR5QW5zd2Vyc0FuZFF1ZXN0aW9uKCk7XHJcbiAgICAgICAgY29uc3QgYXJ0aWNsZTogQXJ0aWNsZSA9IGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5nZXRBcnRpY2xlKHNrdSwgYnJhbmNoKVxyXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYXJ0aWNsZVJlY2VpdmVkLm5leHQoYXJ0aWNsZSk7XHJcbiAgICAgICAgdGhpcy5fYXJ0aWNsZSA9IGFydGljbGU7XHJcbiAgICAgICAgcmV0dXJuIGFydGljbGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE1vb2RJbWFnZUZvckFuc3dlclNlbGVjdGlvbihhbnN3ZXJPclNlbGVjdGlvbjogQW5zd2VyIHwgU2VsZWN0aW9uLCB0aHVtYk5haWw6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdG9yLmdldE1vb2RJbWFnZUZvckFuc3dlclNlbGVjdGlvbihhbnN3ZXJPclNlbGVjdGlvbiwgdGh1bWJOYWlsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgbG9hZFNlbGVjdGlvbnMoKTogdm9pZCB7XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgLy8gICB0aGlzLnNlbGVjdGlvbnNUb0Rpc3BsYXkubGVuZ3RoID0gMDtcclxuICAgIC8vICAgdGhpcy5fY29ubmVjdG9yLmxvYWRTZWxlY3Rpb25zKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gcHVibGljIGdldFF1ZXN0aW9uQW5kQW5zd2VycygpOiB2b2lkIHtcclxuICAgIC8vICAgdGhpcy5fY29ubmVjdG9yLmdldFF1ZXN0aW9uQW5kQW5zd2VycygpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRRdWVzdGlvbkFuZEFuc3dlcnNBc3luYygpOiBQcm9taXNlPFF1ZXN0aW9uQW5kQW5zd2Vycz4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk7XHJcbiAgICAgICAgcXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMgPSBxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycy5maWx0ZXIoYSA9PiB0aGlzLl9pc0Fuc3dlclB1Ymxpc2hlZChhKSk7XHJcbiAgICAgICAgLy8gaWYgKHF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbiAmJiAhcXVlc3Rpb25BbmRBbnN3ZXJzLnF1ZXN0aW9uLmdyb3VwZWQpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUFuc3dlcnNSZWNlaXZlZChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycyk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgICAgICBpZiAocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQW5kUXVlc3Rpb24oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVF1ZXN0aW9uID0gcXVlc3Rpb25BbmRBbnN3ZXJzLnF1ZXN0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUFuc3dlcnMgPSBxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2VycztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uQW5kQW5zd2VycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2VsZWN0aW9uc0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIC8vIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmdldFNlbGVjdGlvbnNBc3luYygpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmFydGljbGUuc2hvd0Z1bGxDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ2hhbmdlQXJ0aWNsZUNvbmZpZ3VyYXRpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlU2VsZWN0b3JGdWxsQ29uZmlndXJhdGlvbihzZWxlY3Rpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkNoYW5nZUFydGljbGVDb25maWd1cmF0aW9uVHlwZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldERlY29zQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fZGVjb05vZGVzID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmdldERlY29zQXN5bmMoKVxyXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyLCBpbnB1dD86IHN0cmluZyk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yLnNlbGVjdEFuc3dlcihhbnN3ZXIsIGlucHV0KTtcclxuICAgICAgICAvLyB0aGlzLnNlbGVjdEFuc3dlckNhbGxlZC5uZXh0KGFuc3dlcik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBzZWxlY3RBbnN3ZXJCeVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbiwgaW5wdXQ/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5zZWxlY3RBbnN3ZXJCeVNlbGVjdGlvbihzZWxlY3Rpb24sIGlucHV0KTtcclxuICAgICAgICAvLyB0aGlzLnNlbGVjdEFuc3dlckNhbGxlZC5uZXh0KGFuc3dlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5hdmlnYXRlVG8oY2hvc2VWYWx1ZTogU2VsZWN0b3JTdHJ1Y3R1cmUsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yLm5hdmlnYXRlVG8oY2hvc2VWYWx1ZSwgc2hvd0xvYWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbmNlbEFuc3dlcihnZXRBbnN3ZXJzQW5kUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3IuY2FuY2VsQW5zd2VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdFNlbGVjdGlvbihcclxuICAgICAgICBzZWxlY3Rpb246IFNlbGVjdGlvbiwgZm9yY2VCYWNrVG9Ob2RlPzogYm9vbGVhbiwgYWZ0ZXI/OiBib29sZWFuLCBjb25uZWN0b3I/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlU2VsZWN0aW9uID0gc2VsZWN0aW9uO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3Iuc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZm9yY2VCYWNrVG9Ob2RlLCBhZnRlciwgY29ubmVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3IuZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rvci5yZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEFuc3dlckluZm8oYW5zd2VyOiBBbnN3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBhcnRpY2xlVGV4dHM6IEFydGljbGVUZXh0W10gPSBhd2FpdCB0aGlzLl9jb25uZWN0b3IuZ2V0QW5zd2VySW5mbyhhbnN3ZXIpO1xyXG4gICAgICAgIHRoaXMuX29uQW5zd2VySW5mb1JlY2VpdmVkKHthbnN3ZXI6IGFuc3dlciwgaW5mbzogYXJ0aWNsZVRleHRzfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGV4dGVuZFdpdGhBbnN3ZXJUZXh0QW5kSW1hZ2UoYW5zd2VyOiBBbnN3ZXIsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKGFuc3dlci5ub2RlSWQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhhbnN3ZXIubm9kZUlkKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdG9yLmdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oYW5zd2VyLCA0LCB0cnVlLCBzaG93TG9hZGVyKS50aGVuKChpbWFnZURhdGE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWQoYW5zd2VyLCBpbWFnZURhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQoYW5zd2VyLm5vZGVJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9za2lwQnV0dG9uSW5mb1NlcnZpY2UuZ2V0U2tpcEJ1dHRvbkltYWdlQW5kVGV4dChhbnN3ZXIuZ29vZElkKS50aGVuKCh0ZXh0QW5kSW1hZ2UpID0+IHtcclxuICAgICAgICAgICAgICAgIGFuc3dlci5hbnN3ZXIgPSB0ZXh0QW5kSW1hZ2UudGV4dDtcclxuICAgICAgICAgICAgICAgIGFuc3dlci5jb21tZXJjaWFsQW5zd2VyID0gdGV4dEFuZEltYWdlLnRleHQ7XHJcbiAgICAgICAgICAgICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gdGV4dEFuZEltYWdlLmltYWdlQm9keTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBleHRlbmRXaXRoU2VsZWN0aW9uSW1hZ2Uoc2VsZWN0aW9uOiBTZWxlY3Rpb24sIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5ub2RlSWQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhzZWxlY3Rpb24ubm9kZUlkKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdG9yLmdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oc2VsZWN0aW9uLCA0LCB0cnVlLCBzaG93TG9hZGVyKS50aGVuKChpbWFnZURhdGE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWQoc2VsZWN0aW9uLCBpbWFnZURhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQoc2VsZWN0aW9uLm5vZGVJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnNUb0Rpc3BsYXlJbWFnZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzU2VsZWN0aW9uUHVibGlzaGVkKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpID09PSAyIHx8XHJcbiAgICAgICAgICAgICgoaXNOaWxsKHNlbGVjdGlvbi5oaWVyYXJjaGljYWxQdWJsaWNhdGlvbkNvZGUpIHx8ICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApKSAmJlxyXG4gICAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKHNlbGVjdGlvbi5xdWVzdGlvblB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmlsbChzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUpKSkgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BbnN3ZXIgJiYgKCgoc2VsZWN0aW9uLmFuc3dlclB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmlsbChzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlKSkpXHJcbiAgICAgICAgICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW1hZ2VGb3JBbnN3ZXIoc2VsZWN0ZWRPcHRpb246IFNlbGVjdG9yU3RydWN0dXJlLCBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbi5hcnROb2RlSWQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhzZWxlY3RlZE9wdGlvbi5hcnROb2RlSWQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0b3IuZ2V0SW1hZ2VGb3JTZWxlY3RvclN0cnVjdHVyZShzZWxlY3RlZE9wdGlvbiwgNCwgdHJ1ZSwgc2hvd0xvYWRlcikudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVJbWFnZVJlY2VpdmVkRm9yU2VsZWN0b3JTdHJ1Y3R1cmUoc2VsZWN0ZWRPcHRpb24sIGltYWdlRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uLmltYWdlRGF0YSA9IHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHNlbGVjdGVkT3B0aW9uLmFydE5vZGVJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9za2lwQnV0dG9uSW5mb1NlcnZpY2UuZ2V0U2tpcEJ1dHRvbkltYWdlQW5kVGV4dCgpLnRoZW4oKHRleHRBbmRJbWFnZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24ub3B0aW9uVGV4dCA9IHRleHRBbmRJbWFnZS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24ub3B0aW9uVGV4dCA9IHRleHRBbmRJbWFnZS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24uaW1hZ2VEYXRhID0gdGV4dEFuZEltYWdlLmltYWdlQm9keTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3ByZXBhcmVTZWxlY3Rpb25zKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gc2VsZWN0aW9ucy5zbGljZSgwKTtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheSgpO1xyXG4gICAgICAgIGxldCB0b3RhbFByaWNlID0gMDtcclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25zLmZvckVhY2goc2VsZWN0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIHRvdGFsUHJpY2UgKz0gc2VsZWN0aW9uLmFydFJldGFpbFByaWNlID8gc2VsZWN0aW9uLmFydFJldGFpbFByaWNlIDogMDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3RvdGFsUHJpY2UgPSBNYXRoLnJvdW5kKCh0b3RhbFByaWNlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcclxuICAgICAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9ucyA9IHRoaXMuc2VsZWN0aW9ucy5zbGljZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3ByZXBhcmVTZWxlY3Rpb25zVG9EaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVBbnN3ZXJzQW5kSW1hZ2VzKHRoaXMuc2VsZWN0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgYWxsU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSB0aGlzLnNlbGVjdGlvbnMuZmlsdGVyKHMgPT4gdGhpcy5faXNTZWxlY3Rpb25QdWJsaXNoZWQocykpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheSA9IGFsbFNlbGVjdGlvbnMuZmlsdGVyKHMgPT4gcy5ub2RlVHlwZSAhPT0gTm9kZVR5cGUuQXJ0aWNsZSAmJiBzLnByZXNlbnRhdGlvbkxldmVsID09PSAxKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbnNSZWNlaXZlZC5uZXh0KHRoaXMuc2VsZWN0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlcGFyZUFuc3dlcnNBbmRJbWFnZXMoc2VsZWN0aW9uczogU2VsZWN0aW9uW10pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVTZWxlY3Rpb25BbnN3ZXJzKHNlbGVjdGlvbiwgc2VsZWN0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcHJlbG9hZENhY2hlZEltYWdlcyh0aGlzLnNlbGVjdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2hhbmRsZVNlbGVjdGlvbkFuc3dlcnMoc2VsZWN0aW9uOiBTZWxlY3Rpb24sIHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYW5zd2Vyc0Zyb21TZWxlY3Rpb246IFNlbGVjdGlvbltdID0gc2VsZWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgICAgIHMgPT4gcy5wYXJlbnRBcnROb2RlSWREZWNvICYmIHNlbGVjdGlvbi5ub2RlSWQgJiYgcy5wYXJlbnRBcnROb2RlSWREZWNvLnRvU3RyaW5nKCkgPT09IHNlbGVjdGlvbi5ub2RlSWQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnNOZXh0T3B0aW9uVmFsdWVzKGFuc3dlcnNGcm9tU2VsZWN0aW9uKTtcclxuICAgICAgICBzZWxlY3Rpb24ubGFzdEFuc3dlciA9IChhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwKSAmJiBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIgP1xyXG4gICAgICAgICAgICBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIudHJpbSgpIDpcclxuICAgICAgICAgICAgJyc7XHJcbiAgICAgICAgc2VsZWN0aW9uLmxhc3RBbnN3ZXJOb2RlSWQgPSBhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwID8gYW5zd2Vyc0Zyb21TZWxlY3Rpb25bYW5zd2Vyc0Zyb21TZWxlY3Rpb24ubGVuZ3RoIC0gMV0ubm9kZUlkIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBhbnN3ZXJUcmVlOiBhbnk7XHJcbiAgICAgICAgbGV0IGFuc3dlclRyZWVTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAoYW5zd2Vyc0Zyb21TZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhbnN3ZXJUcmVlID0gYW5zd2Vyc0Zyb21TZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgIC5maWx0ZXIocyA9PiB0aGlzLl9pc1NlbGVjdGlvblB1Ymxpc2hlZChzKSB8fCBzLnVzZXJJbnB1dClcclxuICAgICAgICAgICAgICAgIC5tYXAoKHM6IFNlbGVjdGlvbiwgaWR4OiBudW1iZXIsIGFycjogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcy51c2VySW5wdXQgPyAocy5hbnN3ZXIgPyBzLmFuc3dlci50cmltKCkgOiAnJykgOiAocy5xdWVzdGlvbiA/IHMucXVlc3Rpb24udHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcy51c2VySW5wdXQgPyAocy51c2VySW5wdXRWYWx1ZSA/IHMudXNlcklucHV0VmFsdWUudHJpbSgpIDogJycpIDogKHMuYW5zd2VyID8gcy5hbnN3ZXIudHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogcy5hcnRSZXRhaWxQcmljZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgYW5zd2VyVHJlZVN0cmluZyA9IGFuc3dlcnNGcm9tU2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5faXNBbGxTZWxlY3Rpb25QdWJsaXNoZWQocykgfHwgcy51c2VySW5wdXQpXHJcbiAgICAgICAgICAgICAgICAubWFwKChzOiBTZWxlY3Rpb24sIGlkeDogbnVtYmVyLCBhcnI6IFNlbGVjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMudXNlcklucHV0ID8gKHMudXNlcklucHV0VmFsdWUgPyBzLnVzZXJJbnB1dFZhbHVlLnRyaW0oKSA6ICcnKSA6IChzLmFuc3dlciA/IHMuYW5zd2VyLnRyaW0oKSA6ICcnKTtcclxuICAgICAgICAgICAgICAgIH0pLmpvaW4oJyAtICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZVN0cmluZyA9IGFuc3dlclRyZWVTdHJpbmc7XHJcbiAgICAgICAgaWYgKGFuc3dlclRyZWUpIHtcclxuICAgICAgICAgICAgc2VsZWN0aW9uLmFuc3dlclRyZWUgPSBKU09OLnN0cmluZ2lmeShhbnN3ZXJUcmVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZSA9IEpTT04uc3RyaW5naWZ5KFt7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogc2VsZWN0aW9uLnVzZXJJbnB1dCA/IChzZWxlY3Rpb24uYW5zd2VyID8gc2VsZWN0aW9uLmFuc3dlci50cmltKCkgOiAnJykgOiAoc2VsZWN0aW9uLnF1ZXN0aW9uID8gc2VsZWN0aW9uLnF1ZXN0aW9uLnRyaW0oKSA6ICcnKSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzZWxlY3Rpb24udXNlcklucHV0ID8gKHNlbGVjdGlvbi51c2VySW5wdXRWYWx1ZSA/IHNlbGVjdGlvbi51c2VySW5wdXRWYWx1ZS50cmltKCkgOiAnJykgOiAoc2VsZWN0aW9uLmFuc3dlciA/IHNlbGVjdGlvbi5hbnN3ZXIudHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHNlbGVjdGlvbi5hcnRSZXRhaWxQcmljZVxyXG4gICAgICAgICAgICB9XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0b3RhbFByaWNlOiBudW1iZXIgPSAwOyAvLyB0ZW1wIGZpeCB1bnRpbCBiYWNrZW5kIGlzIHJlYWR5XHJcbiAgICAgICAgYW5zd2Vyc0Zyb21TZWxlY3Rpb24uZm9yRWFjaCgoczogU2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRvdGFsUHJpY2UgKz0gcy5hcnRSZXRhaWxQcmljZSA/IHMuYXJ0UmV0YWlsUHJpY2UgOiAwOyAvLyB0ZW1wIGZpeCB1bnRpbCBiYWNrZW5kIGlzIHJlYWR5XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgKHNlbGVjdGlvbiBhcyBhbnkpLnRvdGFsUHJpY2UgPSB0b3RhbFByaWNlOyAvLyB0ZW1wIGZpeCB1bnRpbCBiYWNrZW5kIGlzIHJlYWR5XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNTZWxlY3Rpb25QdWJsaXNoZWQoczogU2VsZWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJiAoKChzLm9wdGlvblNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKHMub3B0aW9uU2hvd09uKSkpIHx8XHJcbiAgICAgICAgICAgIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BbnN3ZXIgJiYgKCgocy5ub2RlU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5ub2RlU2hvd09uKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0aW9uUHVibGlzaGVkKHM6IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAocy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuUXVlc3Rpb24gJiYgKCgocy5vcHRpb25TaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChzLm9wdGlvblNob3dPbikpKSB8fFxyXG4gICAgICAgICAgICAocy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuTmV4dE9wdGlvblZhbHVlICYmICgoKHMubm9kZVNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKHMubm9kZVNob3dPbikpKSB8fFxyXG4gICAgICAgICAgICAocy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQW5zd2VyICYmICgoKHMubm9kZVNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKHMubm9kZVNob3dPbikpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pc0Fuc3dlclB1Ymxpc2hlZChhOiBBbnN3ZXIpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKGlzTmlsbChhLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSkgfHwgKChhLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApKS8qICYmXHJcbiAgICAgICAgKFxyXG4gICAgICAgICAgICAoYS50eXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJiAoKChhLm9wdGlvblNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKGEub3B0aW9uU2hvd09uKSkpIHx8XHJcbiAgICAgICAgICAgIChhLnR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJiAoKChhLm5vZGVTaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChhLm5vZGVTaG93T24pKSlcclxuICAgICAgICApKi87XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlbG9hZENhY2hlZEltYWdlcyhhbnN3ZXJzT3JTZWxlY3Rpb25zOiBBbnN3ZXJbXSB8IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICAgICAgYW5zd2Vyc09yU2VsZWN0aW9ucy5mb3JFYWNoKChhbnN3ZXJPclNlbGVjdGlvbjogQW5zd2VyIHwgU2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhbnN3ZXJPclNlbGVjdGlvbi5ub2RlSWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhhbnN3ZXJPclNlbGVjdGlvbi5ub2RlSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYW5zd2VyT3JTZWxlY3Rpb24uaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQoYW5zd2VyT3JTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGRUb0NhcnQoZ29vZElkOiBudW1iZXIsIGdvb2RUeXBlOiBzdHJpbmcsIHF1YW50aXR5OiBudW1iZXIsIGluc3RhbmNlSWQ6IHN0cmluZywgZXh0ZXJuYWxTb3VyY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGxldCBqc29uOiBzdHJpbmc7XHJcbiAgICAgICAgY29uc3Qgc3RhdGlzdGljczogQ29uZmlndXJhdG9yU3RhdGlzdGljc0Vudmlyb25tZW50ID0gbmV3IENvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIHN0YXRpc3RpY3MudXNlclR5cGUgPSAnSG9tZWRlY29yYXRvcic7XHJcbiAgICAgICAgc3RhdGlzdGljcy50cmFuc2FjdGlvblR5cGUgPSAnU2FsZXMnO1xyXG4gICAgICAgIHN0YXRpc3RpY3MuYWN0aW9uRG9tYWluID0gJ0hvbWVkZWNvcmF0b3InO1xyXG4gICAgICAgIHN0YXRpc3RpY3Muc2Vzc2lvbklkID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNlc3Npb24gPyB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2Vzc2lvbi5zZXNzaW9uSWQgOiAndW5rbm93bic7XHJcbiAgICAgICAgc3RhdGlzdGljcy53ZWJIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XHJcbiAgICAgICAgc3RhdGlzdGljcy5idW5kbGVIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XHJcbiAgICAgICAganNvbiA9IGF3YWl0IHRoaXMuZ2V0SnNvbkNvbmZpZ3VyZWRBcnRpY2xlcyhnb29kSWQsIGdvb2RUeXBlLCBxdWFudGl0eSwgZXh0ZXJuYWxTb3VyY2UsIHRydWUsIGluc3RhbmNlSWQsIHN0YXRpc3RpY3MpO1xyXG4gICAgICAgIGNvbnN0IGZyb3plbkFydGljbGU6IEZyb3plbkFydGljbGVTaW1wbGUgfCBGcm96ZW5BcnRpY2xlID0gSlNPTi5wYXJzZShqc29uKTtcclxuICAgICAgICB0aGlzLl9nb29nbGVUYWdNYW5hZ2VyLnNlbmRFdmVudChHb29nbGVUYWdNYW5hZ2VyRXZlbnQuQWRkVG9DYXJ0LCB7XHJcbiAgICAgICAgICAgICdhcnRpY2xlTnInOiBmcm96ZW5BcnRpY2xlLmFydGljbGVOcixcclxuICAgICAgICAgICAgJ3Byb2R1Y3QnOiBmcm96ZW5BcnRpY2xlLmFydGljbGVOYW1lLFxyXG4gICAgICAgICAgICAnY29tcG9zaXRpb24nOiBmcm96ZW5BcnRpY2xlIGluc3RhbmNlb2YgRnJvemVuQXJ0aWNsZSA/IGZyb3plbkFydGljbGUuY29tcG9zaXRpb25zIDogZnJvemVuQXJ0aWNsZS5jb25maWd1cmF0aW9uVGV4dFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkFydGljbGVDcmVhdGVkLCBqc29uKTtcclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQW5zd2Vyc1JlY2VpdmVkKGFuc3dlcnM6IEFuc3dlcltdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcHJlbG9hZENhY2hlZEltYWdlcyhhbnN3ZXJzKTtcclxuICAgICAgICB0aGlzLmFuc3dlcnNSZWNlaXZlZC5uZXh0KGFuc3dlcnMpO1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUFuc3dlcnMgJiYgdGhpcy5hY3RpdmVBbnN3ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZFByaWNlc09mQWN0aXZlQW5zd2VycygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheUltYWdlcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5ICYmIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheVtpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RBbnN3ZXJTZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX3NlbGVjdGlvbnMuZmluZChzID0+IHMubm9kZUlkID09PSBzZWxlY3Rpb24ubGFzdEFuc3dlck5vZGVJZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobGFzdEFuc3dlclNlbGVjdGlvbiAmJiAoc2VsZWN0aW9uLmdlbmVyaWMgfHwgc2VsZWN0aW9uLmdyb3VwZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXN0QW5zd2VyU2VsZWN0aW9uLmltYWdlRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0b3IuZ2V0SW1hZ2VGb3JBbnN3ZXJPclNlbGVjdGlvbihsYXN0QW5zd2VyU2VsZWN0aW9uLCA0LCB0cnVlLCBmYWxzZSkudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWQobGFzdEFuc3dlclNlbGVjdGlvbiwgaW1hZ2VEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5pbWFnZURhdGFMYXN0QW5zd2VyID0gbGFzdEFuc3dlclNlbGVjdGlvbi5pbWFnZURhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5pbWFnZURhdGFMYXN0QW5zd2VyID0gbGFzdEFuc3dlclNlbGVjdGlvbi5pbWFnZURhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3ByZXBhcmVTZWxlY3Rpb25zTmV4dE9wdGlvblZhbHVlcyhzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gc2VsZWN0aW9ucy5sZW5ndGggLSAxO1xyXG4gICAgICAgIGxldCBub3ZUZXh0OiBzdHJpbmcgPSAnJztcclxuICAgICAgICBmb3IgKGxldCBpID0gbGVuOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHNlbGVjdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLk5leHRPcHRpb25WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgbm92VGV4dCA9IHNlbGVjdGlvbi5hbnN3ZXIgKyAobm92VGV4dCA/IGAgLSAke25vdlRleHR9YCA6ICcnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChub3ZUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFuc3dlclRyZWVTdHJpbmcgPSBgJHtzZWxlY3Rpb24uYW5zd2VyfSAtICR7bm92VGV4dH1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbm92VGV4dCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldFB1YmxpY2F0aW9uQ29kZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3IuZ2V0UHVibGljYXRpb25Db2RlQmFzZWRPbkxvZ2luKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBfb25EZWNvTm9kZXNSZWNlaXZlZChkZWNvTm9kZXM6IERlY29Ob2RlW10pOiB2b2lkIHtcclxuICAgIC8vICAgdGhpcy5fZGVjb05vZGVzID0gZGVjb05vZGVzO1xyXG4gICAgLy8gICB0aGlzLmRlY29Ob2Rlc1JlY2VpdmVkLm5leHQoZGVjb05vZGVzKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIF9vblF1ZXN0aW9uUmVjZWl2ZWQocXVlc3Rpb246IFF1ZXN0aW9uKTogdm9pZCB7XHJcbiAgICAvLyAgIHRoaXMuX2FjdGl2ZVF1ZXN0aW9uID0gcXVlc3Rpb247XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaGFuZGxlSW1hZ2VSZWNlaXZlZChhbnN3ZXJPclNlbGVjdGlvbjogQW5zd2VyIHwgU2VsZWN0aW9uLCBpbWFnZURhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGxldCBpbWFnZURhdGFPclVybDogc3RyaW5nO1xyXG4gICAgICAgIGlmIChpbWFnZURhdGEpIHtcclxuICAgICAgICAgICAgaWYgKGltYWdlRGF0YS5tYXRjaCgvZGF0YTppbWFnZS8pIHx8IGltYWdlRGF0YS5zdGFydHNXaXRoKCdodHRwJykgfHwgaW1hZ2VEYXRhLnN0YXJ0c1dpdGgoJ3d3dycpKSB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZURhdGFPclVybCA9IGltYWdlRGF0YTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFzc2V0UGF0aCAmJiAhdGhpcy5hc3NldFBhdGguZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXRQYXRoICs9ICcvJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGEuc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnN1YnN0cigxLCBpbWFnZURhdGEubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGltYWdlRGF0YU9yVXJsID0gKHRoaXMuYXNzZXRQYXRoID8gdGhpcy5hc3NldFBhdGggOiAnJykgKyBpbWFnZURhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKDxhbnk+YW5zd2VyT3JTZWxlY3Rpb24pLmltYWdlRGF0YSA9IGltYWdlRGF0YU9yVXJsID09PSB1bmRlZmluZWQgPyAnJyA6IGltYWdlRGF0YU9yVXJsO1xyXG4gICAgICAgIGlmIChpbWFnZURhdGFPclVybCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZUltYWdlKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCwgaW1hZ2VEYXRhT3JVcmwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfaGFuZGxlSW1hZ2VSZWNlaXZlZEZvclNlbGVjdG9yU3RydWN0dXJlKG9wdGlvbjogU2VsZWN0b3JTdHJ1Y3R1cmUsIGltYWdlRGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGltYWdlRGF0YU9yVXJsOiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKGltYWdlRGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoaW1hZ2VEYXRhLm1hdGNoKC9kYXRhOmltYWdlLykgfHwgaW1hZ2VEYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCBpbWFnZURhdGEuc3RhcnRzV2l0aCgnd3d3JykpIHtcclxuICAgICAgICAgICAgICAgIGltYWdlRGF0YU9yVXJsID0gaW1hZ2VEYXRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXNzZXRQYXRoICYmICF0aGlzLmFzc2V0UGF0aC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NldFBhdGggKz0gJy8nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGltYWdlRGF0YS5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSBpbWFnZURhdGEuc3Vic3RyKDEsIGltYWdlRGF0YS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1hZ2VEYXRhT3JVcmwgPSAodGhpcy5hc3NldFBhdGggPyB0aGlzLmFzc2V0UGF0aCA6ICcnKSArIGltYWdlRGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAoPGFueT5vcHRpb24pLmltYWdlRGF0YSA9IGltYWdlRGF0YU9yVXJsID09PSB1bmRlZmluZWQgPyAnJyA6IGltYWdlRGF0YU9yVXJsO1xyXG4gICAgICAgIGlmIChpbWFnZURhdGFPclVybCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZUltYWdlKG9wdGlvbi5hcnROb2RlSWQsIGltYWdlRGF0YU9yVXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2NhY2hlSW1hZ2UoaWQ6IG51bWJlciwgaW1hZ2VEYXRhT3JVcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ltYWdlQ2FjaGUuc2V0KGlkLCBpbWFnZURhdGFPclVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2lsbCBiZSB1c2VkL2ltcGxlbWVudGVkIGxhdGVyIG9uLCBvbiB0aGUgcHJvZHVjdCBkZXRhaWwgcGFnZVxyXG4gICAgLy8gcHJpdmF0ZSBfb25Nb29kSW1hZ2VSZWNlaXZlZChtb29kSW1hZ2VEYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vICAgdGhpcy5tb29kSW1hZ2VzUmVjZWl2ZWQubmV4dChtb29kSW1hZ2VEYXRhKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIF9vbkFuc3dlckluZm9SZWNlaXZlZChkYXRhOiB7IGFuc3dlcjogQW5zd2VyLCBpbmZvOiBBcnRpY2xlVGV4dFtdIH0pOiB2b2lkIHtcclxuICAgICAgICAvLyBAdG9kbyBjaGVjayB0aGlzXHJcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5hbnN3ZXIgJiYgZGF0YS5pbmZvKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmZvTWVzc2FnZSA9ICcnO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuOiBudW1iZXIgPSBkYXRhLmluZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZm86IEFydGljbGVUZXh0ID0gZGF0YS5pbmZvW2ldO1xyXG4gICAgICAgICAgICAgICAgaW5mb01lc3NhZ2UgKz0gaW5mby5kZXNjcmlwdGlvbiArICdcXG5cXG4nICsgaW5mby50ZXh0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hcnRpY2xlSW5mb1JlY2VpdmVkLm5leHQoaW5mb01lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TaG93TG9hZGVyQ2hhbmdlKHNob3dMb2FkZXI6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaG91bGRTaG93TG9hZGVyID0gc2hvd0xvYWRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db25uZWN0aW9uUmVzZXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uUmVzZXQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UocmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuaW5zdGFuY2VTZXQubmV4dChyZXNwb25zZS5yZXN1bHRPYmplY3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUE9TVENPTkRJVElPTjogY3VycmVudCBhY3RpdmVBbnN3ZXJzIGhhdmUgcHJpY2UgdmFsdWVzLlxyXG4gICAgcHJpdmF0ZSBhc3luYyBfbG9hZFByaWNlc09mQWN0aXZlQW5zd2VycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBhbnN3ZXJQcmljZXM6IEFuc3dlclByaWNlW10gPSBhd2FpdCB0aGlzLl9jb25uZWN0b3IuZ2V0QW5zd2VyUHJpY2VzKCk7XHJcbiAgICAgICAgaWYgKGFuc3dlclByaWNlcykge1xyXG4gICAgICAgICAgICAvLyBwYXN0ZSBwcmljZSBkYXRhIG9udG8gb3VyIGN1cnJlbnQgYW5zd2VyIG9iamVjdHM7IEFuc3dlclByaWNlLnNlbElkIGNvcnJlc3BvbmRzIHRvIEFuc3dlci5ub2RlXHJcbiAgICAgICAgICAgIGFuc3dlclByaWNlcy5mb3JFYWNoKGFuc3dlclByaWNlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlck1hdGNoOiBBbnN3ZXIgPSB0aGlzLmFjdGl2ZUFuc3dlcnMuZmluZChhbnMgPT4gYW5zLm5vZGUgPT09IGFuc3dlclByaWNlLnNlbElkKTtcclxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXJNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICg8YW55PmFuc3dlck1hdGNoKS5wcmljZSA9IC8vIHRlbXAgZml4IGZvciBwcmljZSB1bnRpbCBiYWNrZW5kIGlzIHJlYWR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PmFuc3dlck1hdGNoKS5ub2RlTGV2ZWwgPT09IDAgJiYgYW5zd2VyUHJpY2UuYWRkUmV0YWlsUHJpY2UgJiYgKDxhbnk+YW5zd2VyTWF0Y2gpLnNlcU8gPT09IDEgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyUHJpY2UuYWRkUmV0YWlsUHJpY2UgLSB0aGlzLl9hcnRpY2xlUHJpY2UgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyUHJpY2UuYWRkUmV0YWlsUHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHRyYUFuc3dlckRhdGFMb2FkZWQubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfY29weUluc3RhbmNlKFxyXG4gICAgICAgIG9yaWdpbmFsSW5zdGFuY2VJZDogc3RyaW5nLFxyXG4gICAgICAgIHNob3VsZFNhdmVDdXJyZW50SW5zdGFuY2VJZDogYm9vbGVhbixcclxuICAgICAgICByZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHRcclxuICAgICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29weUluc3RhbmNlUmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY29ubmVjdG9yLmNvcHlJbnN0YW5jZShvcmlnaW5hbEluc3RhbmNlSWQsIHNob3VsZFNhdmVDdXJyZW50SW5zdGFuY2VJZCkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlID09PSAnRUNPTk5BQk9SVEVEJyB8fCBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuVGltZW91dDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Vbmtub3duO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgRXJyb3JNZXNzYWdlKGNvcHlJbnN0YW5jZVJlc3BvbnNlLnJlc3VsdE9iamVjdC5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFjb3B5SW5zdGFuY2VSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgaWYgKGNvcHlJbnN0YW5jZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQubWVzc2FnZXMubWFwKChtOiBhbnkpID0+IG0ubWVzc2FnZVR5cGUgPT09ICdFJykgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25Ob3RGaXhlZDtcclxuICAgICAgICAgICAgICAgIGNvcHlJbnN0YW5jZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQubWVzc2FnZXMuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBFcnJvck1lc3NhZ2UobS5tZXNzYWdlKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25QYXJ0aWFsbHlGaXhlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZUlkOiBzdHJpbmcgPSBjb3B5SW5zdGFuY2VSZXNwb25zZS5yZXN1bHRPYmplY3Q7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlSW5zdGFuY2VSZXNwb25zZShjb3B5SW5zdGFuY2VSZXNwb25zZSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdJbnN0YW5jZUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9jcmVhdGVTZWxlY3RvckZ1bGxDb25maWd1cmF0aW9uKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gc2VsZWN0aW9ucy5zbGljZSgwKTtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheSgpO1xyXG5cclxuICAgICAgICBsZXQgdG90YWxQcmljZSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbFByaWNlICs9IHNlbGVjdGlvbi5hcnRSZXRhaWxQcmljZSA/IHNlbGVjdGlvbi5hcnRSZXRhaWxQcmljZSA6IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl90b3RhbFByaWNlID0gTWF0aC5yb3VuZCgodG90YWxQcmljZSArIE51bWJlci5FUFNJTE9OKSAqIDEwMCkgLyAxMDA7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RvclN0cnVjdHVyZUxpc3Q6IFNlbGVjdG9yU3RydWN0dXJlW10gPSBbXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RvclN0cnVjdHVyZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25uZWN0b3IuZ2V0U2VsZWN0b3JTdHJ1Y3R1cmUoKTtcclxuICAgICAgICBpZiAoc2VsZWN0b3JTdHJ1Y3R1cmUudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RvclN0cnVjdHVyZS5yZXN1bHRPYmplY3RzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvclN0cnVjdHVyZUxpc3QgPSBzZWxlY3RvclN0cnVjdHVyZS5yZXN1bHRPYmplY3RzO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JTdHJ1Y3R1cmVMaXN0ID0gc2VsZWN0b3JTdHJ1Y3R1cmUucmVzdWx0T2JqZWN0WydzdHJ1Y3R1cmVzJ107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGFMaXN0OiBTZWxlY3RvcldpdGhPcHRpb25zW10gPSBbXTtcclxuICAgICAgICAvLyBDcmVhdGUgYSBsaXN0IHdpdGggU2VsZWN0aW9uV2l0aEFuc3dlcnMuc2VsZWN0aW9uID0gbm9kZVR5cGUgb3B2XHJcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0b3JTdHJ1Y3R1cmVMaXN0KSB7XHJcbiAgICAgICAgICAgIGxldCBvcHRpb25BZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BbnN3ZXIpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFyZW50T2JqZWN0IG9mIGRhdGFMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5hcnROb2RlT3B0SWQgPT09IHBhcmVudE9iamVjdC5zZWxlY3Rvci5hcnROb2RlT3B0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0LnNlbGVjdG9yT3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkFkZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uSXRlbTogU2VsZWN0b3JXaXRoT3B0aW9ucyA9IG5ldyBTZWxlY3RvcldpdGhPcHRpb25zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uSXRlbS5zZWxlY3RvciA9IG9wdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGp1c3QgYmUgYSBib29sLCBidXQgaXQncyBub3Qgd29ya2luZ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsc28sIHRoaXMgbWlnaHQgbm90IGJlIHRoZSBjb3JyZWN0IHdheSB0byBkbyBpdC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnRyZWVPcHYgPT09ICdGJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25JdGVtLnNlbGVjdG9yT3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFMaXN0LnB1c2gob3B0aW9uSXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5vdyBhZGQgYWRkIHRoZSBub2RlVHlwZSBOT1YgdG8gdGhlIGNvcnJlY3QgJ3BhcmVudCdcclxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWxlY3RvclN0cnVjdHVyZUxpc3QpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbi5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuTmV4dE9wdGlvblZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmVudE9iamVjdCBvZiBkYXRhTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24ucGFyZW50Tm9kZUlkID09PSBwYXJlbnRPYmplY3Quc2VsZWN0b3IuYXJ0Tm9kZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uZGlzcGxheU9wdGlvbkNvbnRyb2wgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi5kaXNwbGF5T3B0aW9uQ29udHJvbCA9IENvbmZpZ3VyYXRpb25EaXNwbGF5T3B0aW9uLlRpbGVMYXJnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3Quc2VsZWN0b3JPcHRpb25zLnB1c2gob3B0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPIG1ha2Ugc3VyZSB0aGlzIGdldHMgaW1hZ2VzLCBjdXJyZW50IHRlc3RpbmcgYXJ0aWNsZSBkb2VzIG5vdCBjb250YWluIGltYWdlc1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRJbWFnZUZvckFuc3dlcihvcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWxlY3RvclN0cnVjdHVyZUxpc3QpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbi5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuUXVlc3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFyZW50T2JqZWN0IG9mIGRhdGFMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5hcnROb2RlT3B0SWQgPT09IHBhcmVudE9iamVjdC5zZWxlY3Rvci5hcnROb2RlT3B0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0LnNlbGVjdG9yT3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uV2l0aEFuc3dlcnMgPSBkYXRhTGlzdDtcclxuICAgIH1cclxufVxyXG4iXX0=