@po-ui/ng-templates 15.12.0 → 15.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -100,6 +100,11 @@ const PAGE_SIZE_DEFAULT = 10;
100
100
  * <file name="sample-po-page-dynamic-table-hotels/sample-po-page-dynamic-table-hotels.component.html"> </file>
101
101
  * <file name="sample-po-page-dynamic-table-hotels/sample-po-page-dynamic-table-hotels.component.ts"> </file>
102
102
  * </example>
103
+ *
104
+ * <example name="po-page-dynamic-table-drag-and-drop" title="PO Page Dynamic Table - Drag and Drop">
105
+ * <file name="sample-po-page-dynamic-table-drag-and-drop/sample-po-page-dynamic-table-drag-and-drop.component.html"> </file>
106
+ * <file name="sample-po-page-dynamic-table-drag-and-drop/sample-po-page-dynamic-table-drag-and-drop.component.ts"> </file>
107
+ * </example>
103
108
  */
104
109
  export class PoPageDynamicTableComponent extends PoPageDynamicListBaseComponent {
105
110
  constructor(router, activatedRoute, poDialogService, poNotification, poPageDynamicService, poPageCustomizationService, poPageDynamicTableActionsService, languageService) {
@@ -198,6 +203,7 @@ export class PoPageDynamicTableComponent extends PoPageDynamicListBaseComponent
198
203
  this._defaultPageActions = [];
199
204
  this._defaultTableActions = [];
200
205
  this._hideCloseDisclaimers = [];
206
+ this._draggable = false;
201
207
  const language = languageService.getShortLanguage();
202
208
  this.literals = {
203
209
  ...poPageDynamicTableLiteralsDefault[poLocaleDefault],
@@ -363,6 +369,20 @@ export class PoPageDynamicTableComponent extends PoPageDynamicListBaseComponent
363
369
  get quickSearchValue() {
364
370
  return this._quickSearchValue;
365
371
  }
372
+ /**
373
+ * @optional
374
+ *
375
+ * @description
376
+ *
377
+ * Habilita o modo drag and drop para as colunas da tabela.
378
+ *
379
+ */
380
+ set draggable(value) {
381
+ this._draggable = value;
382
+ }
383
+ get draggable() {
384
+ return this._draggable;
385
+ }
366
386
  ngOnInit() {
367
387
  this.loadDataFromAPI();
368
388
  }
@@ -975,7 +995,7 @@ export class PoPageDynamicTableComponent extends PoPageDynamicListBaseComponent
975
995
  }
976
996
  }
977
997
  PoPageDynamicTableComponent.ɵfac = function PoPageDynamicTableComponent_Factory(t) { return new (t || PoPageDynamicTableComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.PoDialogService), i0.ɵɵdirectiveInject(i2.PoNotificationService), i0.ɵɵdirectiveInject(i3.PoPageDynamicService), i0.ɵɵdirectiveInject(i4.PoPageCustomizationService), i0.ɵɵdirectiveInject(i5.PoPageDynamicTableActionsService), i0.ɵɵdirectiveInject(i2.PoLanguageService)); };
978
- PoPageDynamicTableComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PoPageDynamicTableComponent, selectors: [["po-page-dynamic-table"]], inputs: { onLoad: ["p-load", "onLoad"], keepFilters: ["p-keep-filters", "keepFilters"], actionRight: ["p-actions-right", "actionRight"], concatFilters: ["p-concat-filters", "concatFilters"], hideRemoveAllDisclaimer: ["p-hide-remove-all-disclaimer", "hideRemoveAllDisclaimer"], infiniteScroll: ["p-infinite-scroll", "infiniteScroll"], actions: ["p-actions", "actions"], pageCustomActions: ["p-page-custom-actions", "pageCustomActions"], tableCustomActions: ["p-table-custom-actions", "tableCustomActions"], quickSearchWidth: ["p-quick-search-width", "quickSearchWidth"], height: ["p-height", "height"], hideCloseDisclaimers: ["p-hide-close-disclaimers", "hideCloseDisclaimers"], quickSearchParam: ["p-quick-search-param", "quickSearchParam"], quickSearchValue: ["p-quick-search-value", "quickSearchValue"], searchLiterals: ["p-literals", "searchLiterals"] }, features: [i0.ɵɵProvidersFeature([PoPageDynamicService]), i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 20, consts: [[3, "p-actions", "p-breadcrumb", "p-hide-close-disclaimers", "p-filters", "p-keep-filters", "p-literals", "p-concat-filters", "p-hide-remove-all-disclaimer", "p-quick-search-width", "p-title", "p-quick-search-value", "p-advanced-search", "p-change-disclaimers", "p-quick-search"], [3, "p-sort", "p-actions", "p-actions-right", "p-selectable", "p-columns", "p-items", "p-height", "p-infinite-scroll", "p-show-more-disabled", "p-show-more", "p-sort-by", "p-change-visible-columns", "p-restore-column-manager"]], template: function PoPageDynamicTableComponent_Template(rf, ctx) { if (rf & 1) {
998
+ PoPageDynamicTableComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PoPageDynamicTableComponent, selectors: [["po-page-dynamic-table"]], inputs: { onLoad: ["p-load", "onLoad"], keepFilters: ["p-keep-filters", "keepFilters"], actionRight: ["p-actions-right", "actionRight"], concatFilters: ["p-concat-filters", "concatFilters"], hideRemoveAllDisclaimer: ["p-hide-remove-all-disclaimer", "hideRemoveAllDisclaimer"], infiniteScroll: ["p-infinite-scroll", "infiniteScroll"], actions: ["p-actions", "actions"], pageCustomActions: ["p-page-custom-actions", "pageCustomActions"], tableCustomActions: ["p-table-custom-actions", "tableCustomActions"], quickSearchWidth: ["p-quick-search-width", "quickSearchWidth"], height: ["p-height", "height"], hideCloseDisclaimers: ["p-hide-close-disclaimers", "hideCloseDisclaimers"], quickSearchParam: ["p-quick-search-param", "quickSearchParam"], quickSearchValue: ["p-quick-search-value", "quickSearchValue"], searchLiterals: ["p-literals", "searchLiterals"], draggable: ["p-draggable", "draggable"] }, features: [i0.ɵɵProvidersFeature([PoPageDynamicService]), i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 22, consts: [[3, "p-actions", "p-breadcrumb", "p-hide-close-disclaimers", "p-filters", "p-keep-filters", "p-literals", "p-concat-filters", "p-hide-remove-all-disclaimer", "p-quick-search-width", "p-title", "p-quick-search-value", "p-advanced-search", "p-change-disclaimers", "p-quick-search"], [3, "p-sort", "p-actions", "p-actions-right", "p-selectable", "p-columns", "p-items", "p-height", "p-hide-batch-actions", "p-infinite-scroll", "p-show-more-disabled", "p-draggable", "p-show-more", "p-sort-by", "p-change-visible-columns", "p-restore-column-manager"]], template: function PoPageDynamicTableComponent_Template(rf, ctx) { if (rf & 1) {
979
999
  i0.ɵɵelementStart(0, "po-page-dynamic-search", 0);
980
1000
  i0.ɵɵlistener("p-advanced-search", function PoPageDynamicTableComponent_Template_po_page_dynamic_search_p_advanced_search_0_listener($event) { return ctx.onAdvancedSearch($event); })("p-change-disclaimers", function PoPageDynamicTableComponent_Template_po_page_dynamic_search_p_change_disclaimers_0_listener($event) { return ctx.onChangeDisclaimers($event); })("p-quick-search", function PoPageDynamicTableComponent_Template_po_page_dynamic_search_p_quick_search_0_listener($event) { return ctx.onQuickSearch($event); });
981
1001
  i0.ɵɵelementStart(1, "po-table", 1);
@@ -984,7 +1004,7 @@ PoPageDynamicTableComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
984
1004
  } if (rf & 2) {
985
1005
  i0.ɵɵproperty("p-actions", ctx.pageActions)("p-breadcrumb", ctx.breadcrumb)("p-hide-close-disclaimers", ctx.hideCloseDisclaimers)("p-filters", ctx.filters)("p-keep-filters", ctx.keepFilters)("p-literals", ctx.searchLiterals)("p-concat-filters", ctx.concatFilters)("p-hide-remove-all-disclaimer", ctx.hideRemoveAllDisclaimer)("p-quick-search-width", ctx.quickSearchWidth)("p-title", ctx.title)("p-quick-search-value", ctx.quickSearchValue || "");
986
1006
  i0.ɵɵadvance(1);
987
- i0.ɵɵproperty("p-sort", true)("p-actions", ctx.tableActions)("p-actions-right", ctx.actionRight)("p-selectable", ctx.enableSelectionTable)("p-columns", ctx.columns)("p-items", ctx.items)("p-height", ctx.height)("p-infinite-scroll", ctx.infiniteScroll)("p-show-more-disabled", !ctx.hasNext);
1007
+ i0.ɵɵproperty("p-sort", true)("p-actions", ctx.tableActions)("p-actions-right", ctx.actionRight)("p-selectable", ctx.enableSelectionTable)("p-columns", ctx.columns)("p-items", ctx.items)("p-height", ctx.height)("p-hide-batch-actions", true)("p-infinite-scroll", ctx.infiniteScroll)("p-show-more-disabled", !ctx.hasNext)("p-draggable", ctx.draggable);
988
1008
  } }, dependencies: [i2.PoTableComponent, i6.PoPageDynamicSearchComponent], encapsulation: 2 });
989
1009
  __decorate([
990
1010
  InputBoolean()
@@ -1003,7 +1023,7 @@ __decorate([
1003
1023
  ], PoPageDynamicTableComponent.prototype, "infiniteScroll", void 0);
1004
1024
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageDynamicTableComponent, [{
1005
1025
  type: Component,
1006
- args: [{ selector: 'po-page-dynamic-table', providers: [PoPageDynamicService], template: "<po-page-dynamic-search\r\n [p-actions]=\"pageActions\"\r\n [p-breadcrumb]=\"breadcrumb\"\r\n [p-hide-close-disclaimers]=\"hideCloseDisclaimers\"\r\n [p-filters]=\"filters\"\r\n [p-keep-filters]=\"keepFilters\"\r\n [p-literals]=\"searchLiterals\"\r\n [p-concat-filters]=\"concatFilters\"\r\n [p-hide-remove-all-disclaimer]=\"hideRemoveAllDisclaimer\"\r\n [p-quick-search-width]=\"quickSearchWidth\"\r\n [p-title]=\"title\"\r\n (p-advanced-search)=\"onAdvancedSearch($event)\"\r\n (p-change-disclaimers)=\"onChangeDisclaimers($event)\"\r\n (p-quick-search)=\"onQuickSearch($event)\"\r\n [p-quick-search-value]=\"quickSearchValue || ''\"\r\n>\r\n <po-table\r\n [p-sort]=\"true\"\r\n [p-actions]=\"tableActions\"\r\n [p-actions-right]=\"actionRight\"\r\n [p-selectable]=\"enableSelectionTable\"\r\n [p-columns]=\"columns\"\r\n [p-items]=\"items\"\r\n [p-height]=\"height\"\r\n [p-infinite-scroll]=\"infiniteScroll\"\r\n [p-show-more-disabled]=\"!hasNext\"\r\n (p-show-more)=\"showMore()\"\r\n (p-sort-by)=\"onSort($event)\"\r\n (p-change-visible-columns)=\"onChangeVisibleColumns($event)\"\r\n (p-restore-column-manager)=\"onColumnRestoreManager($event)\"\r\n (p-sort-by)=\"onSortBy($event)\"\r\n >\r\n </po-table>\r\n</po-page-dynamic-search>\r\n" }]
1026
+ args: [{ selector: 'po-page-dynamic-table', providers: [PoPageDynamicService], template: "<po-page-dynamic-search\r\n [p-actions]=\"pageActions\"\r\n [p-breadcrumb]=\"breadcrumb\"\r\n [p-hide-close-disclaimers]=\"hideCloseDisclaimers\"\r\n [p-filters]=\"filters\"\r\n [p-keep-filters]=\"keepFilters\"\r\n [p-literals]=\"searchLiterals\"\r\n [p-concat-filters]=\"concatFilters\"\r\n [p-hide-remove-all-disclaimer]=\"hideRemoveAllDisclaimer\"\r\n [p-quick-search-width]=\"quickSearchWidth\"\r\n [p-title]=\"title\"\r\n (p-advanced-search)=\"onAdvancedSearch($event)\"\r\n (p-change-disclaimers)=\"onChangeDisclaimers($event)\"\r\n (p-quick-search)=\"onQuickSearch($event)\"\r\n [p-quick-search-value]=\"quickSearchValue || ''\"\r\n>\r\n <po-table\r\n [p-sort]=\"true\"\r\n [p-actions]=\"tableActions\"\r\n [p-actions-right]=\"actionRight\"\r\n [p-selectable]=\"enableSelectionTable\"\r\n [p-columns]=\"columns\"\r\n [p-items]=\"items\"\r\n [p-height]=\"height\"\r\n [p-hide-batch-actions]=\"true\"\r\n [p-infinite-scroll]=\"infiniteScroll\"\r\n [p-show-more-disabled]=\"!hasNext\"\r\n (p-show-more)=\"showMore()\"\r\n (p-sort-by)=\"onSort($event)\"\r\n (p-change-visible-columns)=\"onChangeVisibleColumns($event)\"\r\n (p-restore-column-manager)=\"onColumnRestoreManager($event)\"\r\n (p-sort-by)=\"onSortBy($event)\"\r\n [p-draggable]=\"draggable\"\r\n >\r\n </po-table>\r\n</po-page-dynamic-search>\r\n" }]
1007
1027
  }], function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.PoDialogService }, { type: i2.PoNotificationService }, { type: i3.PoPageDynamicService }, { type: i4.PoPageCustomizationService }, { type: i5.PoPageDynamicTableActionsService }, { type: i2.PoLanguageService }]; }, { onLoad: [{
1008
1028
  type: Input,
1009
1029
  args: ['p-load']
@@ -1049,5 +1069,8 @@ __decorate([
1049
1069
  }], searchLiterals: [{
1050
1070
  type: Input,
1051
1071
  args: ['p-literals']
1072
+ }], draggable: [{
1073
+ type: Input,
1074
+ args: ['p-draggable']
1052
1075
  }] }); })();
1053
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1keW5hbWljLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1keW5hbWljLXRhYmxlL3BvLXBhZ2UtZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZW1wbGF0ZXMvc3JjL2xpYi9jb21wb25lbnRzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS9wby1wYWdlLWR5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsWUFBWSxFQUFjLEtBQUssRUFBVSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUNMLFlBQVksRUFRWixxQkFBcUIsRUFDckIsZUFBZSxFQUNoQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFFekMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFFMUcsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFlOUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7OztBQUd0RyxNQUFNLGlCQUFpQixHQUFHLEVB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YztrQkFBbEMsS0FBSzttQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBPYnNlcnZhYmxlLCBFTVBUWSwgY29uY2F0LCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBJbnB1dEJvb2xlYW4sXHJcbiAgUG9EaWFsb2dDb25maXJtT3B0aW9ucyxcclxuICBQb0RpYWxvZ1NlcnZpY2UsXHJcbiAgUG9MYW5ndWFnZVNlcnZpY2UsXHJcbiAgUG9Ob3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gIFBvUGFnZUFjdGlvbixcclxuICBQb1RhYmxlQWN0aW9uLFxyXG4gIFBvVGFibGVDb2x1bW5Tb3J0LFxyXG4gIFBvVGFibGVDb2x1bW5Tb3J0VHlwZSxcclxuICBwb0xvY2FsZURlZmF1bHRcclxufSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XHJcblxyXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWxzL3V0aWwnO1xyXG5cclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0RldGFpbENvbXBvbmVudCB9IGZyb20gJy4uL3BvLXBhZ2UtZHluYW1pYy1kZXRhaWwvcG8tcGFnZS1keW5hbWljLWRldGFpbC5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHsgcG9QYWdlRHluYW1pY1RhYmxlTGl0ZXJhbHNEZWZhdWx0IH0gZnJvbSAnLi9wby1wYWdlLWR5bmFtaWMtdGFibGUtbGl0ZXJhbHMnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljTGlzdEJhc2VDb21wb25lbnQgfSBmcm9tICcuL3BvLXBhZ2UtZHluYW1pYy1saXN0LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wby1wYWdlLWR5bmFtaWMvcG8tcGFnZS1keW5hbWljLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1hY3Rpb25zLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLW9wdGlvbnMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL3BvLXBhZ2UtY3VzdG9taXphdGlvbi9wby1wYWdlLWN1c3RvbWl6YXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9wby1wYWdlLWN1c3RvbWl6YXRpb24vcG8tcGFnZS1keW5hbWljLW9wdGlvbnMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlTWV0YURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLW1ldGFkYXRhLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9wby1wYWdlLWR5bmFtaWMtdGFibGUtYWN0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRWRpdCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtYmVmb3JlLWVkaXQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1iZWZvcmUtbmV3LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZVJlbW92ZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtYmVmb3JlLXJlbW92ZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVEZXRhaWwgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWJlZm9yZS1kZXRhaWwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRHVwbGljYXRlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1iZWZvcmUtZHVwbGljYXRlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZVJlbW92ZUFsbCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtYmVmb3JlLXJlbW92ZS1hbGwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tQWN0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1jdXN0b20tYWN0aW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbVRhYmxlQWN0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1jdXN0b20tdGFibGUtYWN0aW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IGlzRXh0ZXJuYWxMaW5rLCBvcGVuRXh0ZXJuYWxMaW5rLCByZW1vdmVEdXBsaWNhdGVJdGVtc1dpdGhBcnJheUtleSB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWwnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljU2VhcmNoTGl0ZXJhbHMgfSBmcm9tICcuLi9wby1wYWdlLWR5bmFtaWMtc2VhcmNoL3BvLXBhZ2UtZHluYW1pYy1zZWFyY2gtbGl0ZXJhbHMuaW50ZXJmYWNlJztcclxuXHJcbmNvbnN0IFBBR0VfU0laRV9ERUZBVUxUID0gMTA7XHJcblxyXG50eXBlIFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24gPSBzdHJpbmcgfCAoKCkgPT4gUG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucyk7XHJcblxyXG4vKipcclxuICogQGRvY3NFeHRlbmRzIFBvUGFnZUR5bmFtaWNMaXN0QmFzZUNvbXBvbmVudFxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICpcclxuICogTyBgcG8tcGFnZS1keW5hbWljLXRhYmxlYCDDqSB1bWEgcMOhZ2luYSBxdWUgZXhpYmUgdW1hIGxpc3RhIGRlIHJlZ2lzdHJvcyBlbSB1bWEgdGFiZWxhIGJhc2VhZG8gZW0gdW1hIGxpc3RhIGRlIGZpZWxkcyxcclxuICogbyBtZXNtbyB0YW1iw6ltIHN1cG9ydGEgbWV0YWRhZG9zIGNvbmZvcm1lIGVzcGVjaWZpY2FkbyBuYSBkb2N1bWVudGHDp8Ojby5cclxuICpcclxuICogIyMjIFV0aWxpemHDp8OjbyB2aWEgcm90YVxyXG4gKlxyXG4gKiBBbyB1dGlsaXphciBhcyByb3RhcyBwYXJhIGNhcnJlZ2FyIG8gdGVtcGxhdGUsIG8gYHBhZ2UtZHluYW1pYy10YWJsZWAgZGlzcG9uaWJpbGl6YSBwcm9wcmllZGFkZXMgcGFyYVxyXG4gKiBwb2RlciBlc3BlY2lmaWNhciBvIGVuZHBvaW50IGRvcyBkYWRvcyBlIGRvcyBtZXRhZGFkb3MuIEV4ZW1wbG8gZGUgdXRpbGl6YcOnw6NvOlxyXG4gKlxyXG4gKiBPIGNvbXBvbmVudGUgcHJpbWVpcm8gaXLDoSBjYXJyZWdhciBvIG1ldGFkYWRvIGRhIHJvdGEgZGVmaW5pZGEgbmEgcHJvcHJpZWRhZGUgc2VydmljZU1ldGFkYXRhQXBpXHJcbiAqIGUgZGVwb2lzIGlyw6EgYnVzY2FyIGRhIHJvdGEgZGVmaW5pZGEgbmEgcHJvcHJpZWRhZGUgc2VydmljZUxvYWRBcGlcclxuICpcclxuICogPiBDYXNvIG8gc2Vydmlkb3IgcmV0b3JuYXIgdW0gZXJybyBhbyByZWN1cGVyYXIgbyBtZXRhZGFkb3MsIHNlcsOhIHJlcGFzc2FkbyBvIG1ldGFkYWRvcyBzYWx2byBlbSBjYWNoZSxcclxuICogc2UgbyBjYWNoZSBuw6NvIGV4aXN0ZSBzZXLDoSBkaXNwYXJhZG8gdW1hIG5vdGlmaWNhw6fDo28uXHJcbiAqXHJcbiAqIGBgYFxyXG4gKiB7XHJcbiAqICAgcGF0aDogJ3Blb3BsZScsXHJcbiAqICAgY29tcG9uZW50OiBQb1BhZ2VEeW5hbWljVGFibGVDb21wb25lbnQsXHJcbiAqICAgZGF0YToge1xyXG4gKiAgICAgc2VydmljZUFwaTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC92MS9wZW9wbGUnLCAvLyBlbmRwb2ludCBkb3MgZGFkb3NcclxuICogICAgIHNlcnZpY2VNZXRhZGF0YUFwaTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC92MS9tZXRhZGF0YScsIC8vIGVuZHBvaW50IGRvcyBtZXRhZGFkb3MgdXRpbGl6YW5kbyBvIG3DqXRvZG8gSFRUUCBHZXRcclxuICogICAgIHNlcnZpY2VMb2FkQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2xvYWQtbWV0YWRhdGEnIC8vIGVuZHBvaW50IGRlIGN1c3RvbWl6YcOnw7VlcyBkb3MgbWV0YWRhZG9zIHV0aWxpemFuZG8gbyBtw6l0b2RvIEhUVFAgUG9zdFxyXG4gKiAgIH1cclxuICogfVxyXG4gKlxyXG4gKiBgYGBcclxuICpcclxuICogQSByZXF1aXNpw6fDo28gZG9zIG1ldGFkYWRvcyDDqSBmZWl0YSBuYSBpbmljaWFsaXphw6fDo28gZG8gdGVtcGxhdGUgcGFyYSBidXNjYXIgb3MgbWV0YWRhZG9zIGRhIHDDoWdpbmEgcGFzc2FuZG8gb1xyXG4gKiB0aXBvIGRvIG1ldGFkYWRvIGVzcGVyYWRvIGUgYSB2ZXJzw6NvIGNhY2hlYWRhIHBlbG8gYnJvd3Nlci5cclxuICpcclxuICogTyBmb3JtYXRvIGVzcGVyYWRvIG5hIHJlc3Bvc3RhIGRhIHJlcXVpc2nDp8OjbyBlc3TDoSBlc3BlY2lmaWNhZG8gbmEgaW50ZXJmYWNlXHJcbiAqIFtQb1BhZ2VEeW5hbWljVGFibGVNZXRhZGF0YV0oL2RvY3VtZW50YXRpb24vcG8tcGFnZS1keW5hbWljLXRhYmxlI3BvLXBhZ2UtZHluYW1pYy10YWJsZS1tZXRhZGF0YSkuIFBvciBleGVtcGxvOlxyXG4gKlxyXG4gKiBgYGBcclxuICogIHtcclxuICogICB2ZXJzaW9uOiAxLFxyXG4gKiAgIHRpdGxlOiAnUGVyc29uIFRhYmxlJyxcclxuICogICBmaWVsZHM6IFtcclxuICogICAgIHsgcHJvcGVydHk6ICdpZCcsIGtleTogdHJ1ZSwgZGlzYWJsZWQ6IHRydWUgfSxcclxuICogICAgIHsgcHJvcGVydHk6ICdzdGF0dXMnIH0sXHJcbiAqICAgICB7IHByb3BlcnR5OiAnbmFtZScgfSxcclxuICogICAgIHsgcHJvcGVydHk6ICduaWNrbmFtZScgfSxcclxuICogICAgIHsgcHJvcGVydHk6ICdiaXJ0aGRhdGUnLCBsYWJlbDogJ0JpcnRoIGRhdGUnIH0sXHJcbiAqICAgICB7IHByb3BlcnR5OiAnZ2VucmUnIH0sXHJcbiAqICAgICB7IHByb3BlcnR5OiAnY2l0eScgfSxcclxuICogICAgIHsgcHJvcGVydHk6ICdjb3VudHJ5JyB9XHJcbiAqICAgXSxcclxuICogICBrZWVwRmlsdGVyczogdHJ1ZVxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiA+IENhc28gbyBlbmRwb2ludCBkb3MgbWV0YWRhZG9zIG7Do28gc2VqYSBlc3BlY2lmaWNhZG8sIHNlcsOhIGZlaXRvIHVtYSByZXF1aXNpw6fDo28gdXRpbGl6YW5kbyBvIGBzZXJ2aWNlQXBpYCBkYSBzZWd1aW50ZSBmb3JtYTpcclxuICogYGBgXHJcbiAqIEdFVCB7ZW5kLXBvaW50fS9tZXRhZGF0YT90eXBlPWxpc3QmdmVyc2lvbj17dmVyc2lvbn1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1wYWdlLWR5bmFtaWMtdGFibGUtYmFzaWNcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBUYWJsZSBCYXNpY1wiPlxyXG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtYmFzaWMvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1iYXNpYy5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XHJcbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1iYXNpYy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWJhc2ljLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XHJcbiAqIDwvZXhhbXBsZT5cclxuICpcclxuICogPGV4YW1wbGUgbmFtZT1cInBvLXBhZ2UtZHluYW1pYy10YWJsZS1wZW9wbGVcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBUYWJsZSAtIFBlb3BsZVwiPlxyXG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtcGVvcGxlL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtcGVvcGxlLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXBlb3BsZS9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXBlb3BsZS5jb21wb25lbnQudHNcIj4gPC9maWxlPlxyXG4gKiA8L2V4YW1wbGU+XHJcbiAqXHJcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1wYWdlLWR5bmFtaWMtdGFibGUtdXNlcnNcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBUYWJsZSAtIFVzZXJzXCI+XHJcbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS11c2Vycy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtdXNlcnMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtdXNlcnMuc2VydmljZS50c1wiPiA8L2ZpbGU+XHJcbiAqIDwvZXhhbXBsZT5cclxuICpcclxuICogPGV4YW1wbGUgbmFtZT1cInBvLXBhZ2UtZHluYW1pYy10YWJsZS1ob3RlbHNcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBUYWJsZSAtIEhvdGVsc1wiPlxyXG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtaG90ZWxzL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtaG90ZWxzLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWhvdGVscy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWhvdGVscy5jb21wb25lbnQudHNcIj4gPC9maWxlPlxyXG4gKiA8L2V4YW1wbGU+XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BvLXBhZ2UtZHluYW1pYy10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BvLXBhZ2UtZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgcHJvdmlkZXJzOiBbUG9QYWdlRHluYW1pY1NlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb1BhZ2VEeW5hbWljVGFibGVDb21wb25lbnQgZXh0ZW5kcyBQb1BhZ2VEeW5hbWljTGlzdEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqXHJcbiAgICogRnVuw6fDo28gb3Ugc2VydmnDp28gcXVlIHNlcsOhIGV4ZWN1dGFkbyBuYSBpbmljaWFsaXphw6fDo28gZG8gY29tcG9uZW50ZS5cclxuICAgKlxyXG4gICAqIEEgcHJvcHJpZWRhZGUgYWNlaXRhIG9zIHNlZ3VpbnRlcyB0aXBvczpcclxuICAgKiAtIGBzdHJpbmdgOiAqRW5kcG9pbnQqIHVzYWRvIHBlbG8gY29tcG9uZW50ZSBwYXJhIHJlcXVpc2nDp8OjbyB2aWEgYFBPU1RgLlxyXG4gICAqIC0gYGZ1bmN0aW9uYDogTcOpdG9kbyBxdWUgc2Vyw6EgZXhlY3V0YWRvLlxyXG4gICAqXHJcbiAgICogTyByZXRvcm5vIGRlc3RhIGZ1bsOnw6NvIGRldmUgc2VyIGRvIHRpcG8gYFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnNgLFxyXG4gICAqIG9uZGUgbyB1c3XDoXJpbyBwb2RlcsOhIGN1c3RvbWl6YXIgbm92b3MgY2FtcG9zLCBicmVhZGNydW1iLCB0aXRsZSBlIGFjdGlvbnNcclxuICAgKlxyXG4gICAqIFBvciBleGVtcGxvOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogZ2V0UGFnZU9wdGlvbnMoKTogUG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucyB7XHJcbiAgICogcmV0dXJuIHtcclxuICAgKiAgIGFjdGlvbnM6XHJcbiAgICogICAgIHsgbmV3OiAnbmV3JywgZWRpdDogJ2VkaXQvOmlkJywgcmVtb3ZlOiB0cnVlIH0sXHJcbiAgICogICBmaWVsZHM6IFtcclxuICAgKiAgICAgeyBwcm9wZXJ0eTogJ2lkQ2FyZCcsIGdyaWRDb2x1bW5zOiA2IH1cclxuICAgKiAgIF1cclxuICAgKiB9O1xyXG4gICAqIH1cclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIFBhcmEgcmVmZXJlbmNpYXIgYSBzdWEgZnVuw6fDo28gdXRpbGl6ZSBhIHByb3ByaWVkYWRlIGBiaW5kYCwgcG9yIGV4ZW1wbG86XHJcbiAgICogYGBgXHJcbiAgICogIFtwLWxvYWRdPVwib25Mb2FkT3B0aW9ucy5iaW5kKHRoaXMpXCJcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBASW5wdXQoJ3AtbG9hZCcpIG9uTG9hZDogc3RyaW5nIHwgKCgpID0+IFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnMpO1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogTWFudMOpbSBuYSBtb2RhbCBkZSBgQnVzY2EgQXZhbsOnYWRhYCBvcyB2YWxvcmVzIHByZWVuY2hpZG9zIGRvIMO6bHRpbW8gZmlsdHJvIHJlYWxpemFkbyBwZWxvIHVzdcOhcmlvLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dEJvb2xlYW4oKVxyXG4gIEBJbnB1dCgncC1rZWVwLWZpbHRlcnMnKVxyXG4gIGtlZXBGaWx0ZXJzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBEZWZpbmUgcXVlIGEgY29sdW5hIGRlIGHDp8O1ZXMgZmljYXLDoSBubyBsYWRvIGRpcmVpdG8gZGEgdGFiZWxhLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dEJvb2xlYW4oKVxyXG4gIEBJbnB1dCgncC1hY3Rpb25zLXJpZ2h0JylcclxuICBhY3Rpb25SaWdodD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgYSB1dGlsaXphw6fDo28gZGEgcGVzcXVpc2EgcsOhcGlkYSBqdW50byBjb20gYSBwZXNxdWlzYSBhdmFuw6dhZGEuXHJcbiAgICpcclxuICAgKiBEZXN0YSBmb3JtYSwgYW8gdGVyIHVtYSBwZXNxdWlzYSBhdmFuw6dhZGEgZXN0YWJlbGVjaWRhIGUgc2VyXHJcbiAgICogcHJlZW5jaGlkbyBhIHBlc3F1aXNhIHLDoXBpZGEsIG8gZmlsdHJvIHNlcsOhIGNvbmNhdGVuYWRvIGFkaWNpb25hbmRvIGEgcGVzcXVpc2FcclxuICAgKiByw6FwaWRhIHRhbWLDqW0gbmEgbGlzdGEgZGUgYGRpc2NsYWltZXJzYCBhIGFwbGljYW5kbyB1bWEgbm92YSBidXNjYSBjb20gYSBjb25jYXRlbmHDp8Ojby5cclxuICAgKlxyXG4gICAqIFBvciBleGVtcGxvLCBjb20gb3Mgc2VndWludGVzIGZpbHRyb3MgYXBsaWNhZG9zOlxyXG4gICAqICAgLSBmaWx0cm8gYXZhbsOnYWRvOiBgeyBuYW1lOiAnTWlrZScsIGFnZTogJzEyJyB9YFxyXG4gICAqICAgLSBmaWx0cm8gcsOhcGlkbzogYHsgc2VhcmNoOiAncGFwZXInIH1gXHJcbiAgICpcclxuICAgKiBBIHJlcXVpc2nDp8OjbyBkb3MgZGFkb3MgbmEgQVBJIGZpY2Fyw6EgY29tIG9zIHBhcsOibWV0cm9zOlxyXG4gICAqIGBgYFxyXG4gICAqIHBhZ2U9MSZwYWdlU2l6ZT0xMCZuYW1lPU1pa2UmYWdlPTEyJnNlYXJjaD1wYXBlclxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dEJvb2xlYW4oKVxyXG4gIEBJbnB1dCgncC1jb25jYXQtZmlsdGVycycpXHJcbiAgY29uY2F0RmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogT2N1bHRhIG8gYm90w6NvIHBhcmEgcmVtb3ZlciB0b2RvcyBvcyAqZGlzY2xhaW1lcnMqIGRvIGdydXBvLlxyXG4gICAqXHJcbiAgICogPiBQb3IgcGFkcsOjbywgbyBtZXNtbyDDqSBleGliaWRvIMOgIHBhcnRpciBkZSBkb2lzIG91IG1haXMgKmRpc2NsYWltZXJzKiBjb20gYSBvcMOnw6NvIGBoaWRlQ2xvc2VgIGhhYmlsaXRhZGEuXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXHJcbiAgICovXHJcbiAgQElucHV0Qm9vbGVhbigpXHJcbiAgQElucHV0KCdwLWhpZGUtcmVtb3ZlLWFsbC1kaXNjbGFpbWVyJylcclxuICBoaWRlUmVtb3ZlQWxsRGlzY2xhaW1lcj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIFNlIHZlcmRhZGVpcm8sIGF0aXZhIGEgZnVuY2lvbmFsaWRhZGUgZGUgc2Nyb2xsIGluZmluaXRvIHBhcmEgYSB0YWJlbGEgZSBvIGJvdMOjbyBcIkNhcnJlZ2FyIE1haXNcIiBkZWl4YXLDoSBkZSBzZXIgZXhpYmlkby4gQW8gY2hlZ2FyIG5vIGZpbSBkYSB0YWJlbGFcclxuICAgKiBleGVjdXRhcsOhIGEgZnVuw6fDo28gYHAtc2hvdy1tb3JlYC5cclxuICAgKlxyXG4gICAqICoqUmVncmFzIGRlIHV0aWxpemHDp8OjbzoqKlxyXG4gICAqICAtIE8gc2Nyb2xsIGluZmluaXRvIHPDsyBmdW5jaW9uYSBwYXJhIHRhYmVsYXMgcXVlIHV0aWxpemFtIGEgcHJvcHJpZWRhZGUgYHAtaGVpZ2h0YCBlIHF1ZSBwb3NzdWVtIG8gc2Nyb2xsIGrDoSBuYSBjYXJnYSBpbmljaWFsIGRvcyBkYWRvcy5cclxuICAgKlxyXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcclxuICAgKi9cclxuICBASW5wdXRCb29sZWFuKClcclxuICBASW5wdXQoJ3AtaW5maW5pdGUtc2Nyb2xsJylcclxuICBpbmZpbml0ZVNjcm9sbD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgaGFzTmV4dCA9IGZhbHNlO1xyXG4gIGl0ZW1zID0gW107XHJcbiAgbGl0ZXJhbHM7XHJcbiAgcGFnZUFjdGlvbnM6IEFycmF5PFBvUGFnZUFjdGlvbj4gPSBbXTtcclxuICB0YWJsZUFjdGlvbnM6IEFycmF5PFBvVGFibGVBY3Rpb24+ID0gW107XHJcblxyXG4gIHByaXZhdGUgX2FjdGlvbnM6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnMgPSB7fTtcclxuICBwcml2YXRlIF9wYWdlQ3VzdG9tQWN0aW9uczogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tQWN0aW9uPiA9IFtdO1xyXG4gIHByaXZhdGUgX2hlaWdodDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX29sZFF1aWNrU2VhcmNoUGFyYW06IHN0cmluZztcclxuICBwcml2YXRlIF9xdWlja1NlYXJjaFBhcmFtOiBzdHJpbmcgPSAnc2VhcmNoJztcclxuICBwcml2YXRlIF9xdWlja1NlYXJjaFZhbHVlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcXVpY2tTZWFyY2hXaWR0aDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3RhYmxlQ3VzdG9tQWN0aW9uczogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24+ID0gW107XHJcblxyXG4gIHByaXZhdGUgcGFnZTogbnVtYmVyID0gMTtcclxuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAxO1xyXG4gIHByaXZhdGUgaXRlbVNlbGVjdGVkQWN0aW9uO1xyXG4gIHByaXZhdGUgcGFyYW1zID0ge307XHJcbiAgcHJpdmF0ZSBzb3J0ZWRDb2x1bW46IFBvVGFibGVDb2x1bW5Tb3J0O1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcml2YXRlIGhhc0N1c3RvbUFjdGlvbldpdGhTZWxlY3RhYmxlID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2N1c3RvbVBhZ2VMaXN0QWN0aW9uczogQXJyYXk8UG9QYWdlQWN0aW9uPiA9IFtdO1xyXG4gIHByaXZhdGUgX2N1c3RvbVRhYmxlQWN0aW9uczogQXJyYXk8UG9UYWJsZUFjdGlvbj4gPSBbXTtcclxuICBwcml2YXRlIF9kZWZhdWx0UGFnZUFjdGlvbnM6IEFycmF5PFBvUGFnZUFjdGlvbj4gPSBbXTtcclxuICBwcml2YXRlIF9kZWZhdWx0VGFibGVBY3Rpb25zOiBBcnJheTxQb1RhYmxlQWN0aW9uPiA9IFtdO1xyXG4gIHByaXZhdGUgX2hpZGVDbG9zZURpc2NsYWltZXJzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gIHByaXZhdGUgc2V0IGRlZmF1bHRQYWdlQWN0aW9ucyh2YWx1ZTogQXJyYXk8UG9QYWdlQWN0aW9uPikge1xyXG4gICAgdGhpcy5fZGVmYXVsdFBhZ2VBY3Rpb25zID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVBhZ2VBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldCBkZWZhdWx0VGFibGVBY3Rpb25zKHZhbHVlOiBBcnJheTxQb1RhYmxlQWN0aW9uPikge1xyXG4gICAgdGhpcy5fZGVmYXVsdFRhYmxlQWN0aW9ucyA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0IGN1c3RvbVBhZ2VMaXN0QWN0aW9ucyh2YWx1ZTogQXJyYXk8UG9QYWdlQWN0aW9uPikge1xyXG4gICAgdGhpcy5fY3VzdG9tUGFnZUxpc3RBY3Rpb25zID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVBhZ2VBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldCBjdXN0b21UYWJsZUFjdGlvbnModmFsdWU6IEFycmF5PFBvVGFibGVBY3Rpb24+KSB7XHJcbiAgICB0aGlzLl9jdXN0b21UYWJsZUFjdGlvbnMgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlVGFibGVBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogQcOnw7VlcyBkYSBww6FnaW5hIGUgZGEgdGFiZWxhLlxyXG4gICAqID4gQ2FzbyB1dGlsaXphciBhIGHDp8OjbyBwYWRyw6NvIGRlIGV4Y2x1aXIsIGEgbWVzbWEgc2Vyw6EgZXhpYmlkYSBwb3Igw7psdGltbyBuYSB0YWJlbGEuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWFjdGlvbnMnKSBzZXQgYWN0aW9ucyh2YWx1ZTogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucykge1xyXG4gICAgdGhpcy5fYWN0aW9ucyA9IHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDAgPyB2YWx1ZSA6IHt9O1xyXG5cclxuICAgIHRoaXMuc2V0UGFnZUFjdGlvbnModGhpcy5hY3Rpb25zKTtcclxuICAgIHRoaXMuc2V0UmVtb3ZlQWxsQWN0aW9uKCk7XHJcbiAgICB0aGlzLnNldFRhYmxlQWN0aW9ucyh0aGlzLmFjdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFjdGlvbnMoKTogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBMaXN0YSBkZSBhw6fDtWVzIGN1c3RvbWl6YWRhcyBkYSBww6FnaW5hIHF1ZSBzZXLDo28gaW5jb3Jwb3JhZGFzIMOgcyBhw6fDtWVzXHJcbiAgICogaW5mb3JtYWRhcyBhdHJhdsOpcyBkYSBwcm9wcmllZGFkZSBgcC1hY3Rpb25zYC5cclxuICAgKlxyXG4gICAqIEVzc2FzIGHDp8O1ZXMgZmljYW0gbG9jYWxpemFkYXMgbmEgcGFydGUgc3VwZXJpb3IgZGEgcMOhZ2luYSBlbSBib3TDtWVzIGNvbSBhw6fDtWVzLlxyXG4gICAqXHJcbiAgICogRXhlbXBsbyBkZSB1dGlsaXphw6fDo286XHJcbiAgICogYGBgXHJcbiAgICogW1xyXG4gICAqICB7IGxhYmVsOiAnRXhwb3J0JywgYWN0aW9uOiB0aGlzLmV4cG9ydC5iaW5kKHRoaXMpIH0sXHJcbiAgICogIHsgbGFiZWw6ICdQcmludCcsIGFjdGlvbjogdGhpcy5wcmludC5iaW5kKHRoaXMpIH1cclxuICAgKiBdO1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1wYWdlLWN1c3RvbS1hY3Rpb25zJykgc2V0IHBhZ2VDdXN0b21BY3Rpb25zKHZhbHVlOiBBcnJheTxQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21BY3Rpb24+KSB7XHJcbiAgICB0aGlzLl9wYWdlQ3VzdG9tQWN0aW9ucyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcclxuXHJcbiAgICB0aGlzLmN1c3RvbVBhZ2VMaXN0QWN0aW9ucyA9IHRoaXMudHJhbnNmb3JtQ3VzdG9tQWN0aW9uc1RvUGFnZUxpc3RBY3Rpb24odGhpcy5wYWdlQ3VzdG9tQWN0aW9ucyk7XHJcbiAgICB0aGlzLmhhc0N1c3RvbUFjdGlvbldpdGhTZWxlY3RhYmxlID0gdGhpcy5wYWdlQ3VzdG9tQWN0aW9ucy5zb21lKGN1c3RvbUFjdGlvbiA9PiBjdXN0b21BY3Rpb24uc2VsZWN0YWJsZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFnZUN1c3RvbUFjdGlvbnMoKTogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tQWN0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZUN1c3RvbUFjdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogTGlzdGEgZGUgYcOnw7VlcyBjdXN0b21pemFkYXMgbmEgdGFiZWxhIGRhIHDDoWdpbmEgcXVlIHNlcsOjbyBpbmNvcnBvcmFkYXMgw6BzIGHDp8O1ZXNcclxuICAgKiBpbmZvcm1hZGFzIGF0cmF2w6lzIGRhIHByb3ByaWVkYWRlIGBwLWFjdGlvbnNgLlxyXG4gICAqXHJcbiAgICogRXhlbXBsbyBkZSB1dGlsaXphw6fDo286XHJcbiAgICogYGBgXHJcbiAgICogW1xyXG4gICAqICB7IGxhYmVsOiAnQXBwbHkgZGlzY291bnQnLCBhY3Rpb246IHRoaXMuYXBwbHlEaXNjb3VudC5iaW5kKHRoaXMpIH0sXHJcbiAgICogIHsgbGFiZWw6ICdEZXRhaWxzJywgYWN0aW9uOiB0aGlzLmRldGFpbHMuYmluZCh0aGlzKSB9XHJcbiAgICogXTtcclxuICAgKiBgYGBcclxuICAgKiA+IENhc28gdXRpbGl6YXIgYSBhw6fDo28gcGFkcsOjbyBkZSBleGNsdWlyLCBhIG1lc21hIHNlcsOhIGV4aWJpZGEgcG9yIMO6bHRpbW8gbmEgdGFiZWxhLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC10YWJsZS1jdXN0b20tYWN0aW9ucycpIHNldCB0YWJsZUN1c3RvbUFjdGlvbnModmFsdWU6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbVRhYmxlQWN0aW9uPikge1xyXG4gICAgdGhpcy5fdGFibGVDdXN0b21BY3Rpb25zID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xyXG5cclxuICAgIHRoaXMuY3VzdG9tVGFibGVBY3Rpb25zID0gdGhpcy50cmFuc2Zvcm1UYWJsZUN1c3RvbUFjdGlvbnNUb1RhYmxlQWN0aW9ucyh0aGlzLnRhYmxlQ3VzdG9tQWN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGFibGVDdXN0b21BY3Rpb25zKCk6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbVRhYmxlQWN0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVDdXN0b21BY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIExhcmd1cmEgZG8gY2FtcG8gZGUgYnVzY2EsIHV0aWxpemFuZG8gbyAqR3JpZCBTeXN0ZW0qLFxyXG4gICAqIGUgbGltaXRhZG8gYW8gbcOheGltbyBkZSA2IGNvbHVuYXMuIE8gdGFtYW5obyBtw61uaW1vIMOpIGNvbnRyb2xhZG9cclxuICAgKiBjb25mb3JtZSByZXNvbHXDp8OjbyBkZSB0ZWxhIHBhcmEgbWFudGVyIGEgY29uc2lzdMOqbmNpYSBkbyBsYXlvdXQuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXF1aWNrLXNlYXJjaC13aWR0aCcpIHNldCBxdWlja1NlYXJjaFdpZHRoKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3F1aWNrU2VhcmNoV2lkdGggPSB1dGlsLmNvbnZlcnRUb0ludCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgcXVpY2tTZWFyY2hXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3F1aWNrU2VhcmNoV2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogRGVmaW5lIGEgYWx0dXJhIGRhIHRhYmVsYSBlbSAqcGl4ZWxzKiBlIGZpeGEgbyBjYWJlw6dhbGhvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1oZWlnaHQnKSBzZXQgaGVpZ2h0KHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2hlaWdodCA9IHV0aWwuY29udmVydFRvSW50KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogTGlzdGEgZGUgZmlsdHJvcyBxdWUgdGVyw6NvIGEgb3DDp8OjbyBkZSBmZWNoYXIgb2N1bHRhZGFcclxuICAgKiBlbSBzZXUgcmVzcGVjdGl2byBkaXNjbGFpbWVyLiBVdGlsaXphciBvIGF0cmlidXRvIGBwcm9wZXJ0eWAgZG8gY2FtcG8uXHJcbiAgICpcclxuICAgKiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcclxuICAgKiBgYGBcclxuICAgKiBbJ2NpdHknLCduYW1lJ107XHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWhpZGUtY2xvc2UtZGlzY2xhaW1lcnMnKSBzZXQgaGlkZUNsb3NlRGlzY2xhaW1lcnModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcclxuICAgIHRoaXMuX2hpZGVDbG9zZURpc2NsYWltZXJzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhpZGVDbG9zZURpc2NsYWltZXJzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZGVDbG9zZURpc2NsYWltZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIElkZW50aWZpY2Fkb3IgZG8gcGFyw6JtZXRybyBlbnZpYWRvIGFvIHNlcnZpw6dvIGFvIHJlYWxpemFyIHVtYSBidXNjYSByw6FwaWRhLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgJ3NlYXJjaCdcclxuICAgKi9cclxuICBASW5wdXQoJ3AtcXVpY2stc2VhcmNoLXBhcmFtJykgc2V0IHF1aWNrU2VhcmNoUGFyYW0odmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcXVpY2tTZWFyY2hQYXJhbSA9IHZhbHVlID8/ICdzZWFyY2gnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHF1aWNrU2VhcmNoUGFyYW0oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9xdWlja1NlYXJjaFBhcmFtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIFZhbG9yIHBhZHLDo28gbmEgYnVzY2EgcsOhcGlkYSBhbyBpbmljaWFsaXphciBvIGNvbXBvbmVudGVcclxuICAgKlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1xdWljay1zZWFyY2gtdmFsdWUnKSBzZXQgcXVpY2tTZWFyY2hWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9xdWlja1NlYXJjaFZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgcXVpY2tTZWFyY2hWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3F1aWNrU2VhcmNoVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogT2JqZXRvIGNvbSBhcyBsaXRlcmFpcyB1c2FkYXMgbm8gYHBvLXBhZ2UtZHluYW1pYy10YWJsZWAuXHJcbiAgICpcclxuICAgKiBFeGlzdGVtIGR1YXMgbWFuZWlyYXMgZGUgY3VzdG9taXphciBvIGNvbXBvbmVudGUsIHBhc3NhbmRvIHVtIG9iamV0byBjb20gdG9kYXMgYXMgbGl0ZXJhaXMgZGlzcG9uw612ZWlzOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogIGNvbnN0IGN1c3RvbUxpdGVyYWxzOiBQb1BhZ2VEeW5hbWljU2VhcmNoTGl0ZXJhbHMgPSB7XHJcbiAgICogICAgZGlzY2xhaW1lckdyb3VwVGl0bGU6ICdGaWx0cm9zIGFwbGljYWRvczonLFxyXG4gICAqICAgIGZpbHRlclRpdGxlOiAnRmlsdHJvIGF2YW7Dp2FkbycsXHJcbiAgICogICAgZmlsdGVyQ2FuY2VsTGFiZWw6ICdGZWNoYXInLFxyXG4gICAqICAgIGZpbHRlckNvbmZpcm1MYWJlbDogJ0FwbGljYXInLFxyXG4gICAqICAgIHF1aWNrU2VhcmNoTGFiZWw6ICdWYWxvciBwZXNxdWlzYWRvOicsXHJcbiAgICogICAgc2VhcmNoUGxhY2Vob2xkZXI6ICdQZXNxdWlzZSBhcXVpJ1xyXG4gICAqICB9O1xyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogT3UgcGFzc2FuZG8gYXBlbmFzIGFzIGxpdGVyYWlzIHF1ZSBkZXNlamEgY3VzdG9taXphcjpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlRHluYW1pY1NlYXJjaExpdGVyYWxzID0ge1xyXG4gICAqICAgIGZpbHRlclRpdGxlOiAnRmlsdHJvIGF2YW7Dp2FkbydcclxuICAgKiAgfTtcclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIEUgcGFyYSBjYXJyZWdhciBhcyBsaXRlcmFpcyBjdXN0b21pemFkYXMsIGJhc3RhIGFwZW5hcyBwYXNzYXIgbyBvYmpldG8gcGFyYSBvIGNvbXBvbmVudGUuXHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiA8cG8tcGFnZS1keW5hbWljLXRhYmxlXHJcbiAgICogICBbcC1saXRlcmFsc109XCJjdXN0b21MaXRlcmFsc1wiPlxyXG4gICAqIDwvcG8tcGFnZS1keW5hbWljLXRhYmxlPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogPiBPIHZhbG9yIHBhZHLDo28gc2Vyw6EgdHJhZHV6aWRvIGRlIGFjb3JkbyBjb20gbyBpZGlvbWEgY29uZmlndXJhZG8gbm8gW2BQb0kxOG5TZXJ2aWNlYF0oL2RvY3VtZW50YXRpb24vcG8taTE4bikgb3UgKmJyb3dzZXIqLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1saXRlcmFscycpIHNlYXJjaExpdGVyYWxzOiBQb1BhZ2VEeW5hbWljU2VhcmNoTGl0ZXJhbHM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBwb0RpYWxvZ1NlcnZpY2U6IFBvRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9Ob3RpZmljYXRpb246IFBvTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9QYWdlRHluYW1pY1NlcnZpY2U6IFBvUGFnZUR5bmFtaWNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZTogUG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZSxcclxuICAgIGxhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xyXG5cclxuICAgIHRoaXMubGl0ZXJhbHMgPSB7XHJcbiAgICAgIC4uLnBvUGFnZUR5bmFtaWNUYWJsZUxpdGVyYWxzRGVmYXVsdFtwb0xvY2FsZURlZmF1bHRdLFxyXG4gICAgICAuLi5wb1BhZ2VEeW5hbWljVGFibGVMaXRlcmFsc0RlZmF1bHRbbGFuZ3VhZ2VdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWREYXRhRnJvbUFQSSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG9uQWR2YW5jZWRTZWFyY2goZmlsdGVyKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoeyBwYWdlOiAxLCAuLi5maWx0ZXIgfSkuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5wYXJhbXMgPSBmaWx0ZXI7XHJcblxyXG4gICAgaWYgKHRoaXMua2VlcEZpbHRlcnMpIHtcclxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VEaXNjbGFpbWVycyhkaXNjbGFpbWVycykge1xyXG4gICAgY29uc3QgZmlsdGVyID0ge307XHJcblxyXG4gICAgZGlzY2xhaW1lcnMuZm9yRWFjaChkaXNjbGFpbWVyID0+IHtcclxuICAgICAgZmlsdGVyW2Rpc2NsYWltZXIucHJvcGVydHldID0gZGlzY2xhaW1lci52YWx1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMub25BZHZhbmNlZFNlYXJjaChmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgb25RdWlja1NlYXJjaCh0ZXJtVHlwZWRJblF1aWNrU2VhcmNoKSB7XHJcbiAgICBjb25zdCBxdWlja1NlYXJjaFBhcmFtID0gdGVybVR5cGVkSW5RdWlja1NlYXJjaCA/IHsgW3RoaXMucXVpY2tTZWFyY2hQYXJhbV06IHRlcm1UeXBlZEluUXVpY2tTZWFyY2ggfSA6IHt9O1xyXG4gICAgdGhpcy5wYXJhbXMgPSB0aGlzLmNvbmNhdEZpbHRlcnMgPyB7IC4uLnRoaXMucGFyYW1zLCAuLi5xdWlja1NlYXJjaFBhcmFtIH0gOiB7IC4uLnF1aWNrU2VhcmNoUGFyYW0gfTtcclxuXHJcbiAgICBpZiAodGhpcy5fb2xkUXVpY2tTZWFyY2hQYXJhbSBpbiB0aGlzLnBhcmFtcyAmJiB0aGlzLl9vbGRRdWlja1NlYXJjaFBhcmFtICE9PSB0aGlzLnF1aWNrU2VhcmNoUGFyYW0pIHtcclxuICAgICAgZGVsZXRlIHRoaXMucGFyYW1zW3RoaXMuX29sZFF1aWNrU2VhcmNoUGFyYW1dO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX29sZFF1aWNrU2VhcmNoUGFyYW0gPSB0aGlzLnF1aWNrU2VhcmNoUGFyYW07XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEodGVybVR5cGVkSW5RdWlja1NlYXJjaCA/IHsgcGFnZTogMSwgLi4udGhpcy5wYXJhbXMgfSA6IHVuZGVmaW5lZCkuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgb25Tb3J0KHNvcnRlZENvbHVtbjogUG9UYWJsZUNvbHVtblNvcnQpIHtcclxuICAgIGlmICh0aGlzLmhlaWdodCkge1xyXG4gICAgICBjb25zdCBvcmRlciA9IHNvcnRlZENvbHVtbi50eXBlID09PSAnYXNjZW5kaW5nJyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgdXRpbC5zb3J0QXJyYXlPZk9iamVjdHModGhpcy5pdGVtcywgc29ydGVkQ29sdW1uLmNvbHVtbi5wcm9wZXJ0eSwgb3JkZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSBzb3J0ZWRDb2x1bW47XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVZpc2libGVDb2x1bW5zKHZhbHVlKSB7XHJcbiAgICB0aGlzLmNoYW5nZVZpc2libGVDb2x1bW5zLmVtaXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25Db2x1bW5SZXN0b3JlTWFuYWdlcih2YWx1ZTogQXJyYXk8U3RyaW5nPikge1xyXG4gICAgdGhpcy5jb2x1bW5SZXN0b3JlTWFuYWdlci5lbWl0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uU29ydEJ5KHNvcnRlZENvbHVtbjogUG9UYWJsZUNvbHVtblNvcnQpIHtcclxuICAgIHRoaXMuc29ydEJ5LmVtaXQoc29ydGVkQ29sdW1uKTtcclxuICB9XHJcblxyXG4gIHNob3dNb3JlKCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmxvYWREYXRhKHsgcGFnZTogKyt0aGlzLnBhZ2UsIC4uLnRoaXMucGFyYW1zIH0pLnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIGdldCBlbmFibGVTZWxlY3Rpb25UYWJsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0FjdGlvblJlbW92ZUFsbCB8fCB0aGlzLmhhc0N1c3RvbUFjdGlvbldpdGhTZWxlY3RhYmxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0FjdGlvblJlbW92ZUFsbCgpIHtcclxuICAgIHJldHVybiAhIXRoaXMuYWN0aW9ucy5yZW1vdmVBbGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW7Dp8OjbyBxdWUgcmVhbGl6YSBhIGF0dWFsaXphw6fDo28gZG9zIGRhZG9zIGRhIHRhYmVsYS5cclxuICAgKlxyXG4gICAqIFBhcmEgdXRpbGl6w6EtbGEgw6kgbmVjZXNzw6FyaW8gY2FwdHVyYXIgYSBpbnN0w6JuY2lhIGRvIGBwYWdlIGR5bmFtaWMgdGFibGVgLCBjb21vIHBvciBleGVtcGxvOlxyXG4gICAqXHJcbiAgICogYGBgIGh0bWxcclxuICAgKiA8cG8tcGFnZS1keW5hbWljLXRhYmxlICNkeW5hbWljVGFibGUgW3Atc2VydmljZS1hcGldPVwic2VydmljZUFwaVwiPjwvcG8tcGFnZS1keW5hbWljLXRhYmxlPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogYGBgIGphdmFzY3JpcHRcclxuICAgKiBpbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVDb21wb25lbnQsIFBvRHluYW1pY0Zvcm1GaWVsZCB9IGZyb20gJ0Bwby11aS9uZy1jb21wb25lbnRzJztcclxuICAgKlxyXG4gICAqIC4uLlxyXG4gICAqXHJcbiAgICogQFZpZXdDaGlsZCgnZHluYW1pY1RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgZHluYW1pY1RhYmxlOiBQb1BhZ2VEeW5hbWljVGFibGVDb21wb25lbnQ7XHJcbiAgICpcclxuICAgKiBwYWdlQ3VzdG9tQWN0aW9uczogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tQWN0aW9uPiA9IFtcclxuICAgKiB7XHJcbiAgICogICBsYWJlbDogJ1VwZGF0ZScsXHJcbiAgICogICBhY3Rpb246IHRoaXMudXBkYXRlVGFibGUuYmluZCh0aGlzKSxcclxuICAgKiAgIGljb246ICdwby1pY29uLXJlZnJlc2gnXHJcbiAgICogfV1cclxuICAgKlxyXG4gICAqIHVwZGF0ZVRhYmxlKCkge1xyXG4gICAqICAgdGhpcy5keW5hbWljVGFibGUudXBkYXRlRGF0YVRhYmxlKCk7XHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3twYWdlOiBudW1iZXIsIGtleTogdmFsdWUgfX0gZmlsdGVyIFByb3ByaWVkYWRlIHBhcmEgZW52aW8gZGUgdW0gZmlsdHJvIGN1c3RvbWl6YWRvLlxyXG4gICAqIEV4ZW1wbG8gZGUgZW52aW86XHJcbiAgICpcclxuICAgKmBgYFxyXG4gICAqIHRoaXMuZHluYW1pY1RhYmxlLnVwZGF0ZURhdGFUYWJsZSh7cGFnZTogMywgc2VhcmNoOiAnQnJhc2lsJ30pO1xyXG4gICAqIGBgYFxyXG4gICAqIENhc28gbsOjbyBzZWphIHBhc3NhZG8gdW0gZmlsdHJvIGN1c3RvbWl6YWRvIHBhcmEgbyBtw6l0b2RvIGB1cGRhdGVEYXRhVGFibGVgIGEgdGFiZWxhIHNlcsOhIGF0dWFsaXphZGEgY29uZm9ybWUgYSBww6FnaW5hIGRvIHVsdGltbyBpdGVtIG1vZGlmaWNhZG8uXHJcbiAgICovXHJcbiAgcHVibGljIHVwZGF0ZURhdGFUYWJsZShmaWx0ZXI/OiBhbnkpIHtcclxuICAgIGNvbnN0IGluZGV4SXRlbVNlbGVjdGVkID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSB0aGlzLml0ZW1TZWxlY3RlZEFjdGlvbik7XHJcbiAgICBjb25zdCBwYWdlTnVtYmVyID0gTWF0aC5mbG9vcihpbmRleEl0ZW1TZWxlY3RlZCAvIFBBR0VfU0laRV9ERUZBVUxUKTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyIDwgMCA/IHRoaXMuY3VycmVudFBhZ2UgOiBwYWdlTnVtYmVyICsgMTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbHRlcikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoZmlsdGVyKS5zdWJzY3JpYmUoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoeyBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLCAuLi50aGlzLnBhcmFtcyB9KS5zdWJzY3JpYmUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpcm1SZW1vdmUoXHJcbiAgICBhY3Rpb25SZW1vdmU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ3JlbW92ZSddLFxyXG4gICAgYWN0aW9uQmVmb3JlUmVtb3ZlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydiZWZvcmVSZW1vdmUnXSxcclxuICAgIGl0ZW1cclxuICApIHtcclxuICAgIGNvbnN0IGNvbmZpcm1PcHRpb25zOiBQb0RpYWxvZ0NvbmZpcm1PcHRpb25zID0ge1xyXG4gICAgICB0aXRsZTogdGhpcy5saXRlcmFscy5jb25maXJtUmVtb3ZlVGl0bGUsXHJcbiAgICAgIG1lc3NhZ2U6IHRoaXMubGl0ZXJhbHMuY29uZmlybVJlbW92ZU1lc3NhZ2UsXHJcbiAgICAgIGNvbmZpcm06IHRoaXMucmVtb3ZlLmJpbmQodGhpcywgaXRlbSwgYWN0aW9uUmVtb3ZlLCBhY3Rpb25CZWZvcmVSZW1vdmUpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucG9EaWFsb2dTZXJ2aWNlLmNvbmZpcm0oY29uZmlybU9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maXJtUmVtb3ZlQWxsKFxyXG4gICAgYWN0aW9uUmVtb3ZlQWxsOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmUnXSxcclxuICAgIGFjdGlvbkJlZm9yZVJlbW92ZUFsbDogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snYmVmb3JlUmVtb3ZlJ11cclxuICApIHtcclxuICAgIGNvbnN0IGNvbmZpcm1PcHRpb25zOiBQb0RpYWxvZ0NvbmZpcm1PcHRpb25zID0ge1xyXG4gICAgICB0aXRsZTogdGhpcy5saXRlcmFscy5jb25maXJtUmVtb3ZlQWxsVGl0bGUsXHJcbiAgICAgIG1lc3NhZ2U6IHRoaXMubGl0ZXJhbHMuY29uZmlybVJlbW92ZUFsbE1lc3NhZ2UsXHJcbiAgICAgIGNvbmZpcm06IHRoaXMucmVtb3ZlQWxsLmJpbmQodGhpcywgYWN0aW9uUmVtb3ZlQWxsLCBhY3Rpb25CZWZvcmVSZW1vdmVBbGwpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucG9EaWFsb2dTZXJ2aWNlLmNvbmZpcm0oY29uZmlybU9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRVbmlxdWVLZXkoaXRlbSkge1xyXG4gICAgY29uc3Qga2V5cyA9IHV0aWwubWFwT2JqZWN0QnlQcm9wZXJ0aWVzKGl0ZW0sIHRoaXMua2V5cyk7XHJcblxyXG4gICAgcmV0dXJuIHV0aWwudmFsdWVzRnJvbU9iamVjdChrZXlzKS5qb2luKCd8Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE9yZGVyUGFyYW0oc29ydGVkQ29sdW1uOiBQb1RhYmxlQ29sdW1uU29ydCA9IHsgdHlwZTogdW5kZWZpbmVkIH0pIHtcclxuICAgIGNvbnN0IHsgY29sdW1uLCB0eXBlIH0gPSBzb3J0ZWRDb2x1bW47XHJcblxyXG4gICAgaWYgKCFjb2x1bW4pIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlID09PSBQb1RhYmxlQ29sdW1uU29ydFR5cGUuRGVzY2VuZGluZykge1xyXG4gICAgICByZXR1cm4geyBvcmRlcjogYC0ke2NvbHVtbi5wcm9wZXJ0eX1gIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgb3JkZXI6IGAke2NvbHVtbi5wcm9wZXJ0eX1gIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWREYXRhKHBhcmFtczogeyBwYWdlPzogbnVtYmVyOyBzZWFyY2g/OiBzdHJpbmcgfSA9IHt9KSB7XHJcbiAgICBpZiAoIXRoaXMuc2VydmljZUFwaSkge1xyXG4gICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHRoaXMubGl0ZXJhbHMubG9hZERhdGFFcnJvck5vdGlmaWNhdGlvbik7XHJcbiAgICAgIHJldHVybiBFTVBUWTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvcmRlclBhcmFtID0gdGhpcy5nZXRPcmRlclBhcmFtKHRoaXMuc29ydGVkQ29sdW1uKTtcclxuICAgIGNvbnN0IGRlZmF1bHRQYXJhbXM6IGFueSA9IHsgcGFnZTogMSwgcGFnZVNpemU6IFBBR0VfU0laRV9ERUZBVUxUIH07XHJcbiAgICBjb25zdCBmdWxsUGFyYW1zOiBhbnkgPSB7IC4uLmRlZmF1bHRQYXJhbXMsIC4uLnBhcmFtcywgLi4ub3JkZXJQYXJhbSB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmdldFJlc291cmNlcyhmdWxsUGFyYW1zKS5waXBlKFxyXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIGxldCBuZXdBcnJheTtcclxuICAgICAgICBpZiAoZnVsbFBhcmFtcy5wYWdlID09PSAxKSB7XHJcbiAgICAgICAgICBuZXdBcnJheSA9IHJlbW92ZUR1cGxpY2F0ZUl0ZW1zV2l0aEFycmF5S2V5KHJlc3BvbnNlLml0ZW1zLCByZXNwb25zZS5pdGVtcywgdGhpcy5rZXlzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3QXJyYXkgPSByZW1vdmVEdXBsaWNhdGVJdGVtc1dpdGhBcnJheUtleSh0aGlzLml0ZW1zLCByZXNwb25zZS5pdGVtcywgdGhpcy5rZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IG5ld0FycmF5ID8gWy4uLm5ld0FycmF5XSA6IHRoaXMuaXRlbXM7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gZnVsbFBhcmFtcy5wYWdlO1xyXG4gICAgICAgIHRoaXMuaGFzTmV4dCA9IHJlc3BvbnNlLmhhc05leHQ7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNZXRhZGF0YShcclxuICAgIHNlcnZpY2VBcGlGcm9tUm91dGU6IHN0cmluZyxcclxuICAgIG9uTG9hZDogVXJsT3JQb0N1c3RvbWl6YXRpb25GdW5jdGlvblxyXG4gICk6IE9ic2VydmFibGU8UG9QYWdlRHluYW1pY1RhYmxlTWV0YURhdGE+IHtcclxuICAgIGlmIChzZXJ2aWNlQXBpRnJvbVJvdXRlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmdldE1ldGFkYXRhPFBvUGFnZUR5bmFtaWNUYWJsZU1ldGFEYXRhPigpLnBpcGUoXHJcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIHRoaXMuYXV0b1JvdXRlciA9IHJlc3BvbnNlLmF1dG9Sb3V0ZXIgfHwgdGhpcy5hdXRvUm91dGVyO1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25zID0gcmVzcG9uc2UuYWN0aW9ucyB8fCB0aGlzLmFjdGlvbnM7XHJcbiAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSByZXNwb25zZS5icmVhZGNydW1iIHx8IHRoaXMuYnJlYWRjcnVtYjtcclxuICAgICAgICAgIHRoaXMuZmllbGRzID0gcmVzcG9uc2UuZmllbGRzIHx8IHRoaXMuZmllbGRzO1xyXG4gICAgICAgICAgdGhpcy50aXRsZSA9IHJlc3BvbnNlLnRpdGxlIHx8IHRoaXMudGl0bGU7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VDdXN0b21BY3Rpb25zID0gcmVzcG9uc2UucGFnZUN1c3RvbUFjdGlvbnMgfHwgdGhpcy5wYWdlQ3VzdG9tQWN0aW9ucztcclxuICAgICAgICAgIHRoaXMudGFibGVDdXN0b21BY3Rpb25zID0gcmVzcG9uc2UudGFibGVDdXN0b21BY3Rpb25zIHx8IHRoaXMudGFibGVDdXN0b21BY3Rpb25zO1xyXG4gICAgICAgICAgdGhpcy5rZWVwRmlsdGVycyA9IHJlc3BvbnNlLmtlZXBGaWx0ZXJzIHx8IHRoaXMua2VlcEZpbHRlcnM7XHJcbiAgICAgICAgICB0aGlzLmNvbmNhdEZpbHRlcnMgPSByZXNwb25zZS5jb25jYXRGaWx0ZXJzIHx8IHRoaXMuY29uY2F0RmlsdGVycztcclxuICAgICAgICAgIHRoaXMuaGlkZVJlbW92ZUFsbERpc2NsYWltZXIgPSByZXNwb25zZS5oaWRlUmVtb3ZlQWxsRGlzY2xhaW1lciB8fCB0aGlzLmhpZGVSZW1vdmVBbGxEaXNjbGFpbWVyO1xyXG4gICAgICAgICAgdGhpcy5oaWRlQ2xvc2VEaXNjbGFpbWVycyA9IHJlc3BvbnNlLmhpZGVDbG9zZURpc2NsYWltZXJzIHx8IHRoaXMuaGlkZUNsb3NlRGlzY2xhaW1lcnM7XHJcbiAgICAgICAgICB0aGlzLnF1aWNrU2VhcmNoV2lkdGggPSByZXNwb25zZS5xdWlja1NlYXJjaFdpZHRoIHx8IHRoaXMucXVpY2tTZWFyY2hXaWR0aDtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5sb2FkT3B0aW9uc09uSW5pdGlhbGl6ZShvbkxvYWQpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCk7XHJcbiAgfVxyXG5cclxuICAvLyBAdG9kbyBWYWxpZGFyIHJvdGFzIG5hIG3Do28gcG9pcyBzZSBleGlzdGlyIHVtYSByb3RhICcqKicgbyBjYXRjaCBkbyBuYXZpZ2F0aW9uIG7Do28gZnVuY2lvbmEuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvKFxyXG4gICAgcm91dGU6IHsgcGF0aDogc3RyaW5nOyBjb21wb25lbnQ/OyB1cmw/OiBzdHJpbmc7IHBhcmFtcz86IGFueSB9LFxyXG4gICAgZm9yY2VTdG9wQXV0b1JvdXRlcjogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcm91dGUudXJsIHx8IHJvdXRlLnBhdGhdLCB7IHF1ZXJ5UGFyYW1zOiByb3V0ZS5wYXJhbXMgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICBpZiAoZm9yY2VTdG9wQXV0b1JvdXRlciB8fCAhdGhpcy5hdXRvUm91dGVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5jb25maWcudW5zaGlmdCg8Um91dGU+e1xyXG4gICAgICAgIHBhdGg6IHJvdXRlLnBhdGgsXHJcbiAgICAgICAgY29tcG9uZW50OiByb3V0ZS5jb21wb25lbnQsXHJcbiAgICAgICAgZGF0YTogeyBzZXJ2aWNlQXBpOiB0aGlzLnNlcnZpY2VBcGksIGF1dG9Sb3V0ZXI6IHRydWUgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMubmF2aWdhdGVUbyhyb3V0ZSwgdHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ29uY2F0ZW5hdGVkVXJsKGNvbmNhdEtleXM6IGJvb2xlYW4sIHVybDogc3RyaW5nLCBzZWxlY3RlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5cyA9IHRoaXMua2V5cy5tYXAoa2V5ID0+IGVuY29kZVVSSUNvbXBvbmVudChzZWxlY3RlZEl0ZW1ba2V5XSkpLmpvaW4oKTtcclxuICAgIHJldHVybiBjb25jYXRLZXlzID8gYCR7dXJsfS8ke2tleXN9YCA6IHVybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkRldGFpbChhY3Rpb246IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2RldGFpbCddLCBpdGVtKSB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMuZm9ybWF0VW5pcXVlS2V5KGl0ZW0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5iZWZvcmVEZXRhaWwodGhpcy5hY3Rpb25zLmJlZm9yZURldGFpbCwgaWQsIGl0ZW0pXHJcbiAgICAgICAgLnN1YnNjcmliZSgoYmVmb3JlRGV0YWlsUmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVEZXRhaWwpID0+XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVEZXRhaWwoYWN0aW9uLCBiZWZvcmVEZXRhaWxSZXN1bHQsIGlkLCBpdGVtKVxyXG4gICAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4ZWN1dGVEZXRhaWwoXHJcbiAgICBhY3Rpb246IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2RldGFpbCddLFxyXG4gICAgYmVmb3JlRGV0YWlsUmVzdWx0PzogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlTmV3LFxyXG4gICAgaWQ/OiBzdHJpbmcsXHJcbiAgICBpdGVtPzogYW55XHJcbiAgKSB7XHJcbiAgICBjb25zdCBiZWZvcmUgPSBiZWZvcmVEZXRhaWxSZXN1bHQgPz8ge307XHJcbiAgICBjb25zdCBhbGxvd0FjdGlvbiA9IHR5cGVvZiBiZWZvcmUuYWxsb3dBY3Rpb24gPT09ICdib29sZWFuJyA/IGJlZm9yZS5hbGxvd0FjdGlvbiA6IHRydWU7XHJcbiAgICBjb25zdCB7IG5ld1VybCB9ID0gYmVmb3JlO1xyXG5cclxuICAgIGlmIChhbGxvd0FjdGlvbiAmJiBhY3Rpb24pIHtcclxuICAgICAgaWYgKG5ld1VybCkge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldFBhdGhGcm9tTmV3VXJsKG5ld1VybCwgaWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLnJlc29sdmVVcmwoaXRlbSwgYWN0aW9uKTtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoOiBhY3Rpb24sIHVybCwgY29tcG9uZW50OiBQb1BhZ2VEeW5hbWljRGV0YWlsQ29tcG9uZW50IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFjdGlvbihpZCwgaXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGF0aEZyb21OZXdVcmwobmV3VXJsOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKG5ld1VybC5pbmNsdWRlcygnOmlkJykpIHtcclxuICAgICAgcmV0dXJuIG5ld1VybC5yZXBsYWNlKC86aWQvZywgaWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1VybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkR1cGxpY2F0ZShhY3Rpb25EdXBsaWNhdGU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2R1cGxpY2F0ZSddLCBpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSk7XHJcbiAgICBjb25zdCBkdXBsaWNhdGVzID0gdXRpbC5yZW1vdmVLZXlzUHJvcGVydGllcyh0aGlzLmtleXMsIHV0aWwubWFwT2JqZWN0QnlQcm9wZXJ0aWVzKGl0ZW0sIHRoaXMuZHVwbGljYXRlcykpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXHJcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2VcclxuICAgICAgICAuYmVmb3JlRHVwbGljYXRlKHRoaXMuYWN0aW9ucy5iZWZvcmVEdXBsaWNhdGUsIGlkLCBkdXBsaWNhdGVzKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGJlZm9yZUR1cGxpY2F0ZVJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRHVwbGljYXRlKSA9PlxyXG4gICAgICAgICAgdGhpcy5leGVjdXRlRHVwbGljYXRlKGFjdGlvbkR1cGxpY2F0ZSwgYmVmb3JlRHVwbGljYXRlUmVzdWx0LCBkdXBsaWNhdGVzKVxyXG4gICAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4ZWN1dGVEdXBsaWNhdGUoXHJcbiAgICBhY3Rpb25EdXBsaWNhdGU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2R1cGxpY2F0ZSddLFxyXG4gICAgYmVmb3JlRHVwbGljYXRlUmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVEdXBsaWNhdGUsXHJcbiAgICBkdXBsaWNhdGVzOiBhbnlcclxuICApIHtcclxuICAgIGNvbnN0IGJlZm9yZSA9IGJlZm9yZUR1cGxpY2F0ZVJlc3VsdCA/PyB7fTtcclxuICAgIGNvbnN0IGFsbG93QWN0aW9uID0gdHlwZW9mIGJlZm9yZS5hbGxvd0FjdGlvbiA9PT0gJ2Jvb2xlYW4nID8gYmVmb3JlLmFsbG93QWN0aW9uIDogdHJ1ZTtcclxuICAgIGNvbnN0IGJlZm9yZUR1cGxpY2F0ZVJlc291cmNlID0gYmVmb3JlLnJlc291cmNlO1xyXG4gICAgY29uc3QgbmV3QWN0aW9uID0gYmVmb3JlLm5ld1VybCA/PyBhY3Rpb25EdXBsaWNhdGU7XHJcblxyXG4gICAgaWYgKGFsbG93QWN0aW9uICYmIGFjdGlvbkR1cGxpY2F0ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIGJlZm9yZUR1cGxpY2F0ZVJlc291cmNlID09PSAnb2JqZWN0JyAmJiBiZWZvcmVEdXBsaWNhdGVSZXNvdXJjZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGR1cGxpY2F0ZXMgPSB1dGlsLnJlbW92ZUtleXNQcm9wZXJ0aWVzKHRoaXMua2V5cywgYmVmb3JlRHVwbGljYXRlUmVzb3VyY2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIG5ld0FjdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogbmV3QWN0aW9uLCBwYXJhbXM6IHsgZHVwbGljYXRlOiBKU09OLnN0cmluZ2lmeShkdXBsaWNhdGVzKSB9IH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbmV3QWN0aW9uKGR1cGxpY2F0ZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuRWRpdChhY3Rpb25FZGl0OiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydlZGl0J10sIGl0ZW0pIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5iZWZvcmVFZGl0KHRoaXMuYWN0aW9ucy5iZWZvcmVFZGl0LCBpZCwgaXRlbSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHN3aXRjaE1hcCgoYmVmb3JlRWRpdFJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRWRpdCkgPT5cclxuICAgICAgICAgICAgdGhpcy5leGVjdXRlRWRpdEFjdGlvbihhY3Rpb25FZGl0LCBiZWZvcmVFZGl0UmVzdWx0LCBpdGVtLCBpZClcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlRWRpdEFjdGlvbihcclxuICAgIGFjdGlvbjogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snZWRpdCddLFxyXG4gICAgYmVmb3JlRWRpdFJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRWRpdCxcclxuICAgIGl0ZW06IGFueSxcclxuICAgIGlkOiBzdHJpbmdcclxuICApIHtcclxuICAgIGNvbnN0IG5ld0VkaXRBY3Rpb24gPSBiZWZvcmVFZGl0UmVzdWx0Py5uZXdVcmwgPz8gYWN0aW9uO1xyXG4gICAgY29uc3QgYWxsb3dBY3Rpb24gPSBiZWZvcmVFZGl0UmVzdWx0Py5hbGxvd0FjdGlvbiA/PyB0cnVlO1xyXG5cclxuICAgIGlmICghYWxsb3dBY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgbmV3RWRpdEFjdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5vcGVuRWRpdFVybChuZXdFZGl0QWN0aW9uLCBpdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0gbmV3RWRpdEFjdGlvbihpZCwgaXRlbSk7XHJcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEl0ZW0gPT09ICdvYmplY3QnICYmIHVwZGF0ZWRJdGVtICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlVSVRhYmxlSXRlbShpdGVtLCB1dGlsLnJlbW92ZUtleXNQcm9wZXJ0aWVzKHRoaXMua2V5cywgdXBkYXRlZEl0ZW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBFTVBUWTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkVkaXRVcmwocGF0aDogc3RyaW5nLCBpdGVtKSB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJlc29sdmVVcmwoaXRlbSwgcGF0aCk7XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aCwgdXJsIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb2RpZnlVSVRhYmxlSXRlbShjdXJyZW50SXRlbSwgbmV3SXRlbVZhbHVlKSB7XHJcbiAgICBjb25zdCB0YWJsZUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPT09IGN1cnJlbnRJdGVtKTtcclxuICAgIHRoaXMuaXRlbXNbdGFibGVJdGVtXSA9IHsgLi4uY3VycmVudEl0ZW0sIC4uLm5ld0l0ZW1WYWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuTmV3KGFjdGlvbk5ldzogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snbmV3J10pIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXHJcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2VcclxuICAgICAgICAuYmVmb3JlTmV3KHRoaXMuYWN0aW9ucy5iZWZvcmVOZXcpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoYmVmb3JlTmV3UmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVOZXcpID0+IHRoaXMuZXhlY3V0ZU5ldyhhY3Rpb25OZXcsIGJlZm9yZU5ld1Jlc3VsdCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlTmV3KGFjdGlvbk5ldzogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snbmV3J10sIGJlZm9yZU5ld1Jlc3VsdD86IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZU5ldykge1xyXG4gICAgY29uc3QgYmVmb3JlID0gYmVmb3JlTmV3UmVzdWx0ID8/IHt9O1xyXG4gICAgY29uc3QgYWxsb3dBY3Rpb24gPSB0eXBlb2YgYmVmb3JlLmFsbG93QWN0aW9uID09PSAnYm9vbGVhbicgPyBiZWZvcmUuYWxsb3dBY3Rpb24gOiB0cnVlO1xyXG4gICAgY29uc3QgeyBuZXdVcmwgfSA9IGJlZm9yZTtcclxuXHJcbiAgICBpZiAoYWxsb3dBY3Rpb24gJiYgYWN0aW9uTmV3KSB7XHJcbiAgICAgIGlmIChuZXdVcmwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogbmV3VXJsIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbk5ldyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogYWN0aW9uTmV3IH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYWN0aW9uTmV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYXNvIGV4aXN0YSBtYWlzIGRlIHVtIGlkZW50aWZpY2Fkb3IsIHNlcsOhIGNvbmNhdGVuYWRvIGNvbSAnfCcuXHJcbiAgICpcclxuICAgKiBFeDogeyBpZDogMSwgY29tcGFueTogJ3BvJyB9XHJcbiAgICpcclxuICAgKiBQYXJhIG8gZW5kcG9pbnQgL3Jlc291cmNlcy86aWQgc2Vyw6EgZXhlY3V0YWRhIGEgdXJsIC9yZXNvdXJjZXMvMXxwb1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlKFxyXG4gICAgaXRlbSxcclxuICAgIGFjdGlvblJlbW92ZTogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1sncmVtb3ZlJ10sXHJcbiAgICBhY3Rpb25CZWZvcmVSZW1vdmU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2JlZm9yZVJlbW92ZSddXHJcbiAgKSB7XHJcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxyXG4gICAgICB0aGlzLnBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlXHJcbiAgICAgICAgLmJlZm9yZVJlbW92ZShhY3Rpb25CZWZvcmVSZW1vdmUsIHVuaXF1ZUtleSwgaXRlbSlcclxuICAgICAgICAucGlwZShzd2l0Y2hNYXAoYmVmb3JlUmVtb3ZlID0+IHRoaXMuZGVsZXRlQWN0aW9uKGl0ZW0sIGFjdGlvblJlbW92ZSwgYmVmb3JlUmVtb3ZlKSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGVBY3Rpb24oXHJcbiAgICBpdGVtLFxyXG4gICAgYWN0aW9uUmVtb3ZlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmUnXSxcclxuICAgIGJlZm9yZVJlbW92ZTogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlUmVtb3ZlXHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHsgYWxsb3dBY3Rpb24sIG5ld1VybCB9ID0gYmVmb3JlUmVtb3ZlIHx8IHt9O1xyXG4gICAgY29uc3QgYWxsb3cgPSBhbGxvd0FjdGlvbiA/PyB0cnVlO1xyXG5cclxuICAgIGlmIChhbGxvdykge1xyXG4gICAgICBsZXQgdW5pcXVlS2V5ID0gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSk7XHJcbiAgICAgIGNvbnN0IHJlc291cmNlVG9SZW1vdmVLZXkgPSB0aGlzLnJldHVyblJlc291cmNlc0tleXMoW2l0ZW1dKTtcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgYWN0aW9uUmVtb3ZlID09PSAnYm9vbGVhbicgfHwgbmV3VXJsKSB7XHJcbiAgICAgICAgdW5pcXVlS2V5ID0gbmV3VXJsID8gdW5kZWZpbmVkIDogdW5pcXVlS2V5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlXHJcbiAgICAgICAgICAuZGVsZXRlUmVzb3VyY2UodW5pcXVlS2V5LCBuZXdVcmwpXHJcbiAgICAgICAgICAucGlwZShtYXAoKCkgPT4gdGhpcy5yZW1vdmVGcm9tVUkocmVzb3VyY2VUb1JlbW92ZUtleSwgdGhpcy5saXRlcmFscy5yZW1vdmVTdWNjZXNzTm90aWZpY2F0aW9uKSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gb2YoYWN0aW9uUmVtb3ZlKHVuaXF1ZUtleSwgaXRlbSkpLnBpcGUoXHJcbiAgICAgICAgdGFwKHJlbW92ZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVJdGVtID0gcmVtb3ZlID8/IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tVUkocmVzb3VyY2VUb1JlbW92ZUtleSwgdGhpcy5saXRlcmFscy5yZW1vdmVTdWNjZXNzTm90aWZpY2F0aW9uLCByZW1vdmVJdGVtKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvZih7fSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUZyb21VSShpdGVtczogQXJyYXk8YW55PiwgbWVzc2FnZTogc3RyaW5nLCByZW1vdmUgPSB0cnVlKSB7XHJcbiAgICBpZiAocmVtb3ZlID09PSB0cnVlICYmIGl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5yZW1vdmVMb2NhbEl0ZW1zKGl0ZW1zKTtcclxuICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5zdWNjZXNzKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVBbGwoXHJcbiAgICBhY3Rpb25SZW1vdmVBbGw6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ3JlbW92ZUFsbCddLFxyXG4gICAgYWN0aW9uQmVmb3JlUmVtb3ZlQWxsOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydiZWZvcmVSZW1vdmVBbGwnXVxyXG4gICkge1xyXG4gICAgY29uc3Qgb3JpZ2luYWxSZXNvdXJjZXNLZXlzID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zS2V5cygpO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5iZWZvcmVSZW1vdmVBbGwoYWN0aW9uQmVmb3JlUmVtb3ZlQWxsLCBvcmlnaW5hbFJlc291cmNlc0tleXMpXHJcbiAgICAgICAgLnBpcGUoc3dpdGNoTWFwKGJlZm9yZVJlbW92ZSA9PiB0aGlzLmRlbGV0ZUFsbEFjdGlvbihhY3Rpb25SZW1vdmVBbGwsIGJlZm9yZVJlbW92ZSwgb3JpZ2luYWxSZXNvdXJjZXNLZXlzKSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEl0ZW1zS2V5cygpIHtcclxuICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS4kc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChyZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJldHVyblJlc291cmNlc0tleXMocmVzb3VyY2VzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmV0dXJuUmVzb3VyY2VzS2V5cyhyZXNvdXJjZXMpIHtcclxuICAgIHJldHVybiB1dGlsLm1hcEFycmF5QnlQcm9wZXJ0aWVzKHJlc291cmNlcywgdGhpcy5rZXlzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlQWxsQWN0aW9uKFxyXG4gICAgYWN0aW9uUmVtb3ZlQWxsOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmVBbGwnXSxcclxuICAgIGJlZm9yZVJlbW92ZUFsbDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlUmVtb3ZlQWxsLFxyXG4gICAgb3JpZ2luYWxSZXNvdXJjZXM6IEFycmF5PGFueT5cclxuICApIHtcclxuICAgIGNvbnN0IHsgYWxsb3dBY3Rpb24sIG5ld1VybCwgcmVzb3VyY2VzIH0gPSBiZWZvcmVSZW1vdmVBbGwgPz8ge307XHJcbiAgICBjb25zdCBhbGxvdyA9IGFsbG93QWN0aW9uID8/IHRydWU7XHJcbiAgICBjb25zdCByZXNvdXJjZXN0b0RlbGV0ZSA9IHJlc291cmNlcyA/PyBvcmlnaW5hbFJlc291cmNlcztcclxuXHJcbiAgICBpZiAoYWxsb3cgJiYgQXJyYXkuaXNBcnJheShyZXNvdXJjZXN0b0RlbGV0ZSkpIHtcclxuICAgICAgaWYgKHR5cGVvZiBhY3Rpb25SZW1vdmVBbGwgPT09ICdib29sZWFuJyB8fCBuZXdVcmwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb1BhZ2VEeW5hbWljU2VydmljZS5kZWxldGVSZXNvdXJjZXMocmVzb3VyY2VzdG9EZWxldGUsIG5ld1VybCkucGlwZShcclxuICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVVJKHJlc291cmNlc3RvRGVsZXRlLCB0aGlzLmxpdGVyYWxzLnJlbW92ZUFsbFN1Y2Nlc3NOb3RpZmljYXRpb24pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvZihhY3Rpb25SZW1vdmVBbGwocmVzb3VyY2VzdG9EZWxldGUpKS5waXBlKFxyXG4gICAgICAgIHRhcChyZW1vdmVJdGVtcyA9PiB0aGlzLnJlbW92ZUZyb21VSShyZW1vdmVJdGVtcywgdGhpcy5saXRlcmFscy5yZW1vdmVTdWNjZXNzTm90aWZpY2F0aW9uKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2Yoe30pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVMb2NhbEl0ZW1zKGl0ZW1zS2V5c1RvUmVtb3ZlID0gW10pIHtcclxuICAgIGlmIChpdGVtc0tleXNUb1JlbW92ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1LZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcclxuICAgICAgICByZXR1cm4gIWl0ZW1zS2V5c1RvUmVtb3ZlLmZpbmQoaXRlbUtleVRvUmVtb3ZlID0+IHV0aWwudmFsdWVzRnJvbU9iamVjdChpdGVtS2V5VG9SZW1vdmUpLmpvaW4oJ3wnKSA9PT0gaXRlbUtleSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNvbHZlVXJsKGl0ZW06IGFueSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcclxuXHJcbiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC86aWQvZywgdW5pcXVlS2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UGFnZUFjdGlvbnMoYWN0aW9uczogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucykge1xyXG4gICAgaWYgKGFjdGlvbnM/Lm5ldykge1xyXG4gICAgICB0aGlzLmRlZmF1bHRQYWdlQWN0aW9ucyA9IFt7IGxhYmVsOiB0aGlzLmxpdGVyYWxzLnBhZ2VBY3Rpb24sIGFjdGlvbjogdGhpcy5vcGVuTmV3LmJpbmQodGhpcywgYWN0aW9ucy5uZXcpIH1dO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1DdXN0b21BY3Rpb25zVG9QYWdlTGlzdEFjdGlvbihcclxuICAgIGN1c3RvbUFjdGlvbnM6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbUFjdGlvbj5cclxuICApOiBBcnJheTxQb1BhZ2VBY3Rpb24+IHtcclxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXHJcbiAgICByZXR1cm4gY3VzdG9tQWN0aW9ucy5tYXAoY3VzdG9tQWN0aW9uID0+ICh7XHJcbiAgICAgIGxhYmVsOiBjdXN0b21BY3Rpb24ubGFiZWwsXHJcbiAgICAgIGFjdGlvbjogdGhpcy5jYWxsUGFnZUN1c3RvbUFjdGlvbi5iaW5kKHRoaXMsIGN1c3RvbUFjdGlvbiksXHJcbiAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGlzYWJsZVBhZ2VDdXN0b21BY3Rpb24uYmluZCh0aGlzLCBjdXN0b21BY3Rpb24pLFxyXG4gICAgICAuLi4oY3VzdG9tQWN0aW9uLmljb24gJiYgeyBpY29uOiBjdXN0b21BY3Rpb24uaWNvbiB9KSxcclxuICAgICAgdmlzaWJsZTogY3VzdG9tQWN0aW9uLnZpc2libGVcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNmb3JtVGFibGVDdXN0b21BY3Rpb25zVG9UYWJsZUFjdGlvbnMoXHJcbiAgICB0YWJsZUN1c3RvbUFjdGlvbnM6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbVRhYmxlQWN0aW9uPlxyXG4gICk6IEFycmF5PFBvVGFibGVBY3Rpb24+IHtcclxuICAgIHJldHVybiB0YWJsZUN1c3RvbUFjdGlvbnMubWFwKHRhYmxlQ3VzdG9tQWN0aW9uID0+ICh7XHJcbiAgICAgIGxhYmVsOiB0YWJsZUN1c3RvbUFjdGlvbi5sYWJlbCxcclxuICAgICAgaWNvbjogdGFibGVDdXN0b21BY3Rpb24uaWNvbixcclxuICAgICAgYWN0aW9uOiB0aGlzLmNhbGxUYWJsZUN1c3RvbUFjdGlvbi5iaW5kKHRoaXMsIHRhYmxlQ3VzdG9tQWN0aW9uKSxcclxuICAgICAgZGlzYWJsZWQ6IHRhYmxlQ3VzdG9tQWN0aW9uLmRpc2FibGVkLFxyXG4gICAgICB2aXNpYmxlOiB0YWJsZUN1c3RvbUFjdGlvbi52aXNpYmxlXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRGlzYWJsZVBhZ2VDdXN0b21BY3Rpb24oY3VzdG9tQWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY3VzdG9tQWN0aW9uLnNlbGVjdGFibGUgJiYgIXRoaXMuZ2V0U2VsZWN0ZWRJdGVtc0tleXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsbFBhZ2VDdXN0b21BY3Rpb24oY3VzdG9tQWN0aW9uOiBQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21BY3Rpb24pIHtcclxuICAgIGlmIChjdXN0b21BY3Rpb24uYWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBjdXN0b21BY3Rpb24uc2VsZWN0YWJsZSA/IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtc0tleXMoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IHNlbmRDdXN0b21BY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlXHJcbiAgICAgICAgLmN1c3RvbUFjdGlvbihjdXN0b21BY3Rpb24uYWN0aW9uLCBzZWxlY3RlZEl0ZW1zKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc2VuZEN1c3RvbUFjdGlvblN1YnNjcmlwdGlvbik7XHJcbiAgICB9IGVsc2UgaWYgKGN1c3RvbUFjdGlvbi51cmwpIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogY3VzdG9tQWN0aW9uLnVybCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsbFRhYmxlQ3VzdG9tQWN0aW9uKGN1c3RvbUFjdGlvbjogUG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24sIHNlbGVjdGVkSXRlbSkge1xyXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWRBY3Rpb24gPSBzZWxlY3RlZEl0ZW07XHJcbiAgICBpZiAoY3VzdG9tQWN0aW9uLmFjdGlvbikge1xyXG4gICAgICBjb25zdCBzZW5kQ3VzdG9tQWN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5jdXN0b21BY3Rpb24oY3VzdG9tQWN0aW9uLmFjdGlvbiwgc2VsZWN0ZWRJdGVtKVxyXG4gICAgICAgIC5zdWJzY3JpYmUodXBkYXRlZEl0ZW0gPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB1cGRhdGVkSXRlbSA9PT0gJ29iamVjdCcgJiYgdXBkYXRlZEl0ZW0gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RpZnlVSVRhYmxlSXRlbShzZWxlY3RlZEl0ZW0sIHV0aWwucmVtb3ZlS2V5c1Byb3BlcnRpZXModGhpcy5rZXlzLCB1cGRhdGVkSXRlbSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzZW5kQ3VzdG9tQWN0aW9uU3Vic2NyaXB0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAoY3VzdG9tQWN0aW9uLnVybCkge1xyXG4gICAgICBpZiAoaXNFeHRlcm5hbExpbmsoY3VzdG9tQWN0aW9uLnVybCkpIHtcclxuICAgICAgICBvcGVuRXh0ZXJuYWxMaW5rKHRoaXMuY3JlYXRlQ29uY2F0ZW5hdGVkVXJsKGN1c3RvbUFjdGlvbi5jb25jYXRLZXlzLCBjdXN0b21BY3Rpb24udXJsLCBzZWxlY3RlZEl0ZW0pKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlVG8oe1xyXG4gICAgICAgICAgcGF0aDogdGhpcy5jcmVhdGVDb25jYXRlbmF0ZWRVcmwoY3VzdG9tQWN0aW9uLmNvbmNhdEtleXMsIGN1c3RvbUFjdGlvbi51cmwsIHNlbGVjdGVkSXRlbSlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRSZW1vdmVBbGxBY3Rpb24oKSB7XHJcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl9hY3Rpb25zO1xyXG4gICAgaWYgKHRoaXMuc2hvd1JlbW92ZShhY3Rpb24ucmVtb3ZlQWxsKSkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRQYWdlQWN0aW9ucyA9IFtcclxuICAgICAgICAuLi50aGlzLl9kZWZhdWx0UGFnZUFjdGlvbnMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMucGFnZUFjdGlvblJlbW92ZUFsbCxcclxuICAgICAgICAgIGFjdGlvbjogdGhpcy5jb25maXJtUmVtb3ZlQWxsLmJpbmQodGhpcywgYWN0aW9uLnJlbW92ZUFsbCwgYWN0aW9uLmJlZm9yZVJlbW92ZUFsbCksXHJcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlUmVtb3ZlQWxsLmJpbmQodGhpcylcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc2FibGVSZW1vdmVBbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuZ2V0U2VsZWN0ZWRJdGVtc0tleXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGFibGVBY3Rpb25zKGFjdGlvbnM6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnMpIHtcclxuICAgIGlmIChhY3Rpb25zKSB7XHJcbiAgICAgIGNvbnN0IHZpc2libGVSZW1vdmUgPSB0aGlzLnNob3dSZW1vdmUoYWN0aW9ucy5yZW1vdmUpO1xyXG4gICAgICB0aGlzLmRlZmF1bHRUYWJsZUFjdGlvbnMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYWN0aW9uOiB0aGlzLm9wZW5EZXRhaWwuYmluZCh0aGlzLCBhY3Rpb25zLmRldGFpbCksXHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5saXRlcmFscy50YWJsZUFjdGlvblZpZXcsXHJcbiAgICAgICAgICB2aXNpYmxlOiAhIXRoaXMuX2FjdGlvbnMuZGV0YWlsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBhY3Rpb246IHRoaXMub3BlbkVkaXQuYmluZCh0aGlzLCBhY3Rpb25zLmVkaXQpLFxyXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMudGFibGVBY3Rpb25FZGl0LFxyXG4gICAgICAgICAgdmlzaWJsZTogISF0aGlzLl9hY3Rpb25zLmVkaXRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGFjdGlvbjogdGhpcy5vcGVuRHVwbGljYXRlLmJpbmQodGhpcywgYWN0aW9ucy5kdXBsaWNhdGUpLFxyXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMudGFibGVBY3Rpb25EdXBsaWNhdGUsXHJcbiAgICAgICAgICB2aXNpYmxlOiAhIXRoaXMuX2FjdGlvbnMuZHVwbGljYXRlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBhY3Rpb246IHRoaXMuY29uZmlybVJlbW92ZS5iaW5kKHRoaXMsIGFjdGlvbnMucmVtb3ZlLCBhY3Rpb25zLmJlZm9yZVJlbW92ZSksXHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5saXRlcmFscy50YWJsZUFjdGlvbkRlbGV0ZSxcclxuICAgICAgICAgIHNlcGFyYXRvcjogdHJ1ZSxcclxuICAgICAgICAgIHR5cGU6ICdkYW5nZXInLFxyXG4gICAgICAgICAgdmlzaWJsZTogdmlzaWJsZVJlbW92ZVxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERhdGFGcm9tQVBJKCkge1xyXG4gICAgY29uc3QgeyBzZXJ2aWNlQXBpOiBzZXJ2aWNlQXBpRnJvbVJvdXRlLCBzZXJ2aWNlTWV0YWRhdGFBcGksIHNlcnZpY2VMb2FkQXBpIH0gPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGE7XHJcblxyXG4gICAgY29uc3Qgb25Mb2FkID0gc2VydmljZUxvYWRBcGkgfHwgdGhpcy5vbkxvYWQ7XHJcbiAgICB0aGlzLnNlcnZpY2VBcGkgPSBzZXJ2aWNlQXBpRnJvbVJvdXRlIHx8IHRoaXMuc2VydmljZUFwaTtcclxuXHJcbiAgICB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmNvbmZpZ1NlcnZpY2VBcGkoeyBlbmRwb2ludDogdGhpcy5zZXJ2aWNlQXBpLCBtZXRhZGF0YTogc2VydmljZU1ldGFkYXRhQXBpIH0pO1xyXG5cclxuICAgIGNvbnN0IG1ldGFkYXRhJCA9IHRoaXMuZ2V0TWV0YWRhdGEoc2VydmljZUFwaUZyb21Sb3V0ZSwgb25Mb2FkKTtcclxuICAgIGxldCBkYXRhJDtcclxuICAgIGlmICh0aGlzLnF1aWNrU2VhcmNoVmFsdWUpIHtcclxuICAgICAgY29uc3QgcGFyYW1zUXVpY2tTZWFyY2hWYWx1ZSA9IHsgW3RoaXMucXVpY2tTZWFyY2hQYXJhbV06IHRoaXMucXVpY2tTZWFyY2hWYWx1ZSB9O1xyXG4gICAgICBkYXRhJCA9IHRoaXMubG9hZERhdGEocGFyYW1zUXVpY2tTZWFyY2hWYWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRhJCA9IHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxyXG4gICAgICBtZXRhZGF0YSRcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxGaWx0ZXJzID0gdGhpcy5nZXRJbml0aWFsVmFsdWVzRnJvbUZpbHRlcigpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhpbml0aWFsRmlsdGVycykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEluaXRpYWxWYWx1ZXNGcm9tRmlsdGVyKCkge1xyXG4gICAgY29uc3QgaW5pdGlhbEZpbHRlcnMgPSB0aGlzLmZpbHRlcnMucmVkdWNlKFxyXG4gICAgICAocmVzdWx0LCBpdGVtKSA9PiBPYmplY3QuYXNzaWduKHJlc3VsdCwgeyBbaXRlbS5wcm9wZXJ0eV06IGl0ZW0uaW5pdFZhbHVlIH0pLFxyXG4gICAgICB7fVxyXG4gICAgKTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyhpbml0aWFsRmlsdGVycykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAoIWluaXRpYWxGaWx0ZXJzW2tleV0pIHtcclxuICAgICAgICBkZWxldGUgaW5pdGlhbEZpbHRlcnNba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGluaXRpYWxGaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkT3B0aW9uc09uSW5pdGlhbGl6ZShvbkxvYWQ6IFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24pIHtcclxuICAgIGlmIChvbkxvYWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9EeW5hbWljUGFnZU9wdGlvbnMob25Mb2FkKS5waXBlKFxyXG4gICAgICAgIHRhcChyZXNwb25zZVBvT3B0aW9uID0+XHJcbiAgICAgICAgICB0aGlzLnBvUGFnZUN1c3RvbWl6YXRpb25TZXJ2aWNlLmNoYW5nZU9yaWdpbmFsT3B0aW9uc1RvTmV3T3B0aW9ucyh0aGlzLCByZXNwb25zZVBvT3B0aW9uKVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBvRHluYW1pY1BhZ2VPcHRpb25zKG9uTG9hZDogVXJsT3JQb0N1c3RvbWl6YXRpb25GdW5jdGlvbik6IE9ic2VydmFibGU8UG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucz4ge1xyXG4gICAgY29uc3Qgb3JpZ2luYWxPcHRpb246IFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnMgPSB7XHJcbiAgICAgIGZpZWxkczogdGhpcy5maWVsZHMsXHJcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucyxcclxuICAgICAgYnJlYWRjcnVtYjogdGhpcy5icmVhZGNydW1iLFxyXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcclxuICAgICAga2VlcEZpbHRlcnM6IHRoaXMua2VlcEZpbHRlcnMsXHJcbiAgICAgIGNvbmNhdEZpbHRlcnM6IHRoaXMuY29uY2F0RmlsdGVycyxcclxuICAgICAgaGlkZVJlbW92ZUFsbERpc2NsYWltZXI6IHRoaXMuaGlkZVJlbW92ZUFsbERpc2NsYWltZXIsXHJcbiAgICAgIGhpZGVDbG9zZURpc2NsYWltZXJzOiB0aGlzLmhpZGVDbG9zZURpc2NsYWltZXJzLFxyXG4gICAgICBwYWdlQ3VzdG9tQWN0aW9uczogdGhpcy5wYWdlQ3VzdG9tQWN0aW9ucyxcclxuICAgICAgdGFibGVDdXN0b21BY3Rpb25zOiB0aGlzLnRhYmxlQ3VzdG9tQWN0aW9ucyxcclxuICAgICAgcXVpY2tTZWFyY2hXaWR0aDogdGhpcy5xdWlja1NlYXJjaFdpZHRoXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHBhZ2VPcHRpb25TY2hlbWE6IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hPFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnM+ID0ge1xyXG4gICAgICBzY2hlbWE6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ2ZpZWxkcycsXHJcbiAgICAgICAgICBtZXJnZTogdHJ1ZSxcclxuICAgICAgICAgIGtleUZvck1lcmdlOiAncHJvcGVydHknXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ2FjdGlvbnMnLFxyXG4gICAgICAgICAgbWVyZ2U6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAnYnJlYWRjcnVtYidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAndGl0bGUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ2tlZXBGaWx0ZXJzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZVByb3A6ICdxdWlja1NlYXJjaFdpZHRoJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZVByb3A6ICdjb25jYXRGaWx0ZXJzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZVByb3A6ICdoaWRlUmVtb3ZlQWxsRGlzY2xhaW1lcidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAnaGlkZUNsb3NlRGlzY2xhaW1lcnMnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ3BhZ2VDdXN0b21BY3Rpb25zJyxcclxuICAgICAgICAgIG1lcmdlOiB0cnVlLFxyXG4gICAgICAgICAga2V5Rm9yTWVyZ2U6ICdsYWJlbCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAndGFibGVDdXN0b21BY3Rpb25zJyxcclxuICAgICAgICAgIG1lcmdlOiB0cnVlLFxyXG4gICAgICAgICAga2V5Rm9yTWVyZ2U6ICdsYWJlbCdcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UuZ2V0Q3VzdG9tT3B0aW9ucyhvbkxvYWQsIG9yaWdpbmFsT3B0aW9uLCBwYWdlT3B0aW9uU2NoZW1hKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd1JlbW92ZTxUPihhY3Rpb25SZW1vdmU6IFQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvblJlbW92ZSA/PyBmYWxzZTtcclxuICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIGFjdGlvbjtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJWYWx1ZShmaWx0ZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkcy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIGlmIChmaWx0ZXIuaGFzT3duUHJvcGVydHkoaXRlbS5wcm9wZXJ0eSkpIHtcclxuICAgICAgICBpdGVtLmluaXRWYWx1ZSA9IGZpbHRlcltpdGVtLnByb3BlcnR5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhZ2VBY3Rpb25zKCkge1xyXG4gICAgdGhpcy5wYWdlQWN0aW9ucyA9IFsuLi50aGlzLl9kZWZhdWx0UGFnZUFjdGlvbnMsIC4uLnRoaXMuX2N1c3RvbVBhZ2VMaXN0QWN0aW9uc107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRhYmxlQWN0aW9ucygpIHtcclxuICAgIGNvbnN0IGRlZmF1bHRUYWJsZUFjdGlvbnNXaXRob3V0QWN0aW9uRGVsZXRlID0gdGhpcy5fZGVmYXVsdFRhYmxlQWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgIHRhYmxlQWN0aW9uID0+IHRhYmxlQWN0aW9uLmxhYmVsICE9PSB0aGlzLmxpdGVyYWxzLnRhYmxlQWN0aW9uRGVsZXRlXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGVsZXRlID0gdGhpcy5fZGVmYXVsdFRhYmxlQWN0aW9ucy5maW5kKFxyXG4gICAgICB0YWJsZUFjdGlvbiA9PiB0YWJsZUFjdGlvbi5sYWJlbCA9PT0gdGhpcy5saXRlcmFscy50YWJsZUFjdGlvbkRlbGV0ZVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBuZXdUYWJsZUFjdGlvbnMgPSBbLi4uZGVmYXVsdFRhYmxlQWN0aW9uc1dpdGhvdXRBY3Rpb25EZWxldGUsIC4uLnRoaXMuX2N1c3RvbVRhYmxlQWN0aW9uc107XHJcblxyXG4gICAgaWYgKHRhYmxlQWN0aW9uRGVsZXRlKSB7XHJcbiAgICAgIG5ld1RhYmxlQWN0aW9ucy5wdXNoKHRhYmxlQWN0aW9uRGVsZXRlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IG5ld1RhYmxlQWN0aW9ucztcclxuICB9XHJcbn1cclxuIiwiPHBvLXBhZ2UtZHluYW1pYy1zZWFyY2hcclxuICBbcC1hY3Rpb25zXT1cInBhZ2VBY3Rpb25zXCJcclxuICBbcC1icmVhZGNydW1iXT1cImJyZWFkY3J1bWJcIlxyXG4gIFtwLWhpZGUtY2xvc2UtZGlzY2xhaW1lcnNdPVwiaGlkZUNsb3NlRGlzY2xhaW1lcnNcIlxyXG4gIFtwLWZpbHRlcnNdPVwiZmlsdGVyc1wiXHJcbiAgW3Ata2VlcC1maWx0ZXJzXT1cImtlZXBGaWx0ZXJzXCJcclxuICBbcC1saXRlcmFsc109XCJzZWFyY2hMaXRlcmFsc1wiXHJcbiAgW3AtY29uY2F0LWZpbHRlcnNdPVwiY29uY2F0RmlsdGVyc1wiXHJcbiAgW3AtaGlkZS1yZW1vdmUtYWxsLWRpc2NsYWltZXJdPVwiaGlkZVJlbW92ZUFsbERpc2NsYWltZXJcIlxyXG4gIFtwLXF1aWNrLXNlYXJjaC13aWR0aF09XCJxdWlja1NlYXJjaFdpZHRoXCJcclxuICBbcC10aXRsZV09XCJ0aXRsZVwiXHJcbiAgKHAtYWR2YW5jZWQtc2VhcmNoKT1cIm9uQWR2YW5jZWRTZWFyY2goJGV2ZW50KVwiXHJcbiAgKHAtY2hhbmdlLWRpc2NsYWltZXJzKT1cIm9uQ2hhbmdlRGlzY2xhaW1lcnMoJGV2ZW50KVwiXHJcbiAgKHAtcXVpY2stc2VhcmNoKT1cIm9uUXVpY2tTZWFyY2goJGV2ZW50KVwiXHJcbiAgW3AtcXVpY2stc2VhcmNoLXZhbHVlXT1cInF1aWNrU2VhcmNoVmFsdWUgfHwgJydcIlxyXG4+XHJcbiAgPHBvLXRhYmxlXHJcbiAgICBbcC1zb3J0XT1cInRydWVcIlxyXG4gICAgW3AtYWN0aW9uc109XCJ0YWJsZUFjdGlvbnNcIlxyXG4gICAgW3AtYWN0aW9ucy1yaWdodF09XCJhY3Rpb25SaWdodFwiXHJcbiAgICBbcC1zZWxlY3RhYmxlXT1cImVuYWJsZVNlbGVjdGlvblRhYmxlXCJcclxuICAgIFtwLWNvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICBbcC1pdGVtc109XCJpdGVtc1wiXHJcbiAgICBbcC1oZWlnaHRdPVwiaGVpZ2h0XCJcclxuICAgIFtwLWluZmluaXRlLXNjcm9sbF09XCJpbmZpbml0ZVNjcm9sbFwiXHJcbiAgICBbcC1zaG93LW1vcmUtZGlzYWJsZWRdPVwiIWhhc05leHRcIlxyXG4gICAgKHAtc2hvdy1tb3JlKT1cInNob3dNb3JlKClcIlxyXG4gICAgKHAtc29ydC1ieSk9XCJvblNvcnQoJGV2ZW50KVwiXHJcbiAgICAocC1jaGFuZ2UtdmlzaWJsZS1jb2x1bW5zKT1cIm9uQ2hhbmdlVmlzaWJsZUNvbHVtbnMoJGV2ZW50KVwiXHJcbiAgICAocC1yZXN0b3JlLWNvbHVtbi1tYW5hZ2VyKT1cIm9uQ29sdW1uUmVzdG9yZU1hbmFnZXIoJGV2ZW50KVwiXHJcbiAgICAocC1zb3J0LWJ5KT1cIm9uU29ydEJ5KCRldmVudClcIlxyXG4gID5cclxuICA8L3BvLXRhYmxlPlxyXG48L3BvLXBhZ2UtZHluYW1pYy1zZWFyY2g+XHJcbiJdfQ==
1076
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1keW5hbWljLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1keW5hbWljLXRhYmxlL3BvLXBhZ2UtZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZW1wbGF0ZXMvc3JjL2xpYi9jb21wb25lbnRzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS9wby1wYWdlLWR5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsWUFBWSxFQUFjLEtBQUssRUFBVSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUNMLFlBQVksRUFRWixxQkFBcUIsRUFDckIsZUFBZSxFQUNoQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFFekMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFFMUcsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFlOUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7OztBQUd0RyxNQUFNLGlCQUFpQixHQUFHLEVB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LGdCQUFnQjtrQkFBbEQsS0FBSzttQkFBQyxzQkFBc0I7WUFlTixNQUFNO2tCQUE1QixLQUFLO21CQUFDLFVBQVU7WUFxQnNCLG9CQUFvQjtrQkFBMUQsS0FBSzttQkFBQywwQkFBMEI7WUFpQkUsZ0JBQWdCO2tCQUFsRCxLQUFLO21CQUFDLHNCQUFzQjtZQWdCTSxnQkFBZ0I7a0JBQWxELEtBQUs7bUJBQUMsc0JBQXNCO1lBOENSLGNBQWM7a0JBQWxDLEtBQUs7bUJBQUMsWUFBWTtZQVVPLFNBQVM7a0JBQWxDLEtBQUs7bUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgRU1QVFksIGNvbmNhdCwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgSW5wdXRCb29sZWFuLFxyXG4gIFBvRGlhbG9nQ29uZmlybU9wdGlvbnMsXHJcbiAgUG9EaWFsb2dTZXJ2aWNlLFxyXG4gIFBvTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gIFBvTm90aWZpY2F0aW9uU2VydmljZSxcclxuICBQb1BhZ2VBY3Rpb24sXHJcbiAgUG9UYWJsZUFjdGlvbixcclxuICBQb1RhYmxlQ29sdW1uU29ydCxcclxuICBQb1RhYmxlQ29sdW1uU29ydFR5cGUsXHJcbiAgcG9Mb2NhbGVEZWZhdWx0XHJcbn0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xyXG5cclxuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlscy91dGlsJztcclxuXHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNEZXRhaWxDb21wb25lbnQgfSBmcm9tICcuLi9wby1wYWdlLWR5bmFtaWMtZGV0YWlsL3BvLXBhZ2UtZHluYW1pYy1kZXRhaWwuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7IHBvUGFnZUR5bmFtaWNUYWJsZUxpdGVyYWxzRGVmYXVsdCB9IGZyb20gJy4vcG8tcGFnZS1keW5hbWljLXRhYmxlLWxpdGVyYWxzJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0xpc3RCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9wby1wYWdlLWR5bmFtaWMtbGlzdC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tcGFnZS1keW5hbWljL3BvLXBhZ2UtZHluYW1pYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtYWN0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1vcHRpb25zLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUN1c3RvbWl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9wby1wYWdlLWN1c3RvbWl6YXRpb24vcG8tcGFnZS1jdXN0b21pemF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljT3B0aW9uc1NjaGVtYSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvcG8tcGFnZS1jdXN0b21pemF0aW9uL3BvLXBhZ2UtZHluYW1pYy1vcHRpb25zLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZU1ldGFEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1tZXRhZGF0YS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZSB9IGZyb20gJy4vcG8tcGFnZS1keW5hbWljLXRhYmxlLWFjdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZUVkaXQgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWJlZm9yZS1lZGl0LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZU5ldyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtYmVmb3JlLW5ldy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVSZW1vdmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWJlZm9yZS1yZW1vdmUuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRGV0YWlsIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1iZWZvcmUtZGV0YWlsLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZUR1cGxpY2F0ZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtYmVmb3JlLWR1cGxpY2F0ZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVSZW1vdmVBbGwgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWJlZm9yZS1yZW1vdmUtYWxsLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbUFjdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtY3VzdG9tLWFjdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21UYWJsZUFjdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtY3VzdG9tLXRhYmxlLWFjdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBpc0V4dGVybmFsTGluaywgb3BlbkV4dGVybmFsTGluaywgcmVtb3ZlRHVwbGljYXRlSXRlbXNXaXRoQXJyYXlLZXkgfSBmcm9tICcuLi8uLi91dGlscy91dGlsJztcclxuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1NlYXJjaExpdGVyYWxzIH0gZnJvbSAnLi4vcG8tcGFnZS1keW5hbWljLXNlYXJjaC9wby1wYWdlLWR5bmFtaWMtc2VhcmNoLWxpdGVyYWxzLmludGVyZmFjZSc7XHJcblxyXG5jb25zdCBQQUdFX1NJWkVfREVGQVVMVCA9IDEwO1xyXG5cclxudHlwZSBVcmxPclBvQ3VzdG9taXphdGlvbkZ1bmN0aW9uID0gc3RyaW5nIHwgKCgpID0+IFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnMpO1xyXG5cclxuLyoqXHJcbiAqIEBkb2NzRXh0ZW5kcyBQb1BhZ2VEeW5hbWljTGlzdEJhc2VDb21wb25lbnRcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqXHJcbiAqIE8gYHBvLXBhZ2UtZHluYW1pYy10YWJsZWAgw6kgdW1hIHDDoWdpbmEgcXVlIGV4aWJlIHVtYSBsaXN0YSBkZSByZWdpc3Ryb3MgZW0gdW1hIHRhYmVsYSBiYXNlYWRvIGVtIHVtYSBsaXN0YSBkZSBmaWVsZHMsXHJcbiAqIG8gbWVzbW8gdGFtYsOpbSBzdXBvcnRhIG1ldGFkYWRvcyBjb25mb3JtZSBlc3BlY2lmaWNhZG8gbmEgZG9jdW1lbnRhw6fDo28uXHJcbiAqXHJcbiAqICMjIyBVdGlsaXphw6fDo28gdmlhIHJvdGFcclxuICpcclxuICogQW8gdXRpbGl6YXIgYXMgcm90YXMgcGFyYSBjYXJyZWdhciBvIHRlbXBsYXRlLCBvIGBwYWdlLWR5bmFtaWMtdGFibGVgIGRpc3BvbmliaWxpemEgcHJvcHJpZWRhZGVzIHBhcmFcclxuICogcG9kZXIgZXNwZWNpZmljYXIgbyBlbmRwb2ludCBkb3MgZGFkb3MgZSBkb3MgbWV0YWRhZG9zLiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcclxuICpcclxuICogTyBjb21wb25lbnRlIHByaW1laXJvIGlyw6EgY2FycmVnYXIgbyBtZXRhZGFkbyBkYSByb3RhIGRlZmluaWRhIG5hIHByb3ByaWVkYWRlIHNlcnZpY2VNZXRhZGF0YUFwaVxyXG4gKiBlIGRlcG9pcyBpcsOhIGJ1c2NhciBkYSByb3RhIGRlZmluaWRhIG5hIHByb3ByaWVkYWRlIHNlcnZpY2VMb2FkQXBpXHJcbiAqXHJcbiAqID4gQ2FzbyBvIHNlcnZpZG9yIHJldG9ybmFyIHVtIGVycm8gYW8gcmVjdXBlcmFyIG8gbWV0YWRhZG9zLCBzZXLDoSByZXBhc3NhZG8gbyBtZXRhZGFkb3Mgc2Fsdm8gZW0gY2FjaGUsXHJcbiAqIHNlIG8gY2FjaGUgbsOjbyBleGlzdGUgc2Vyw6EgZGlzcGFyYWRvIHVtYSBub3RpZmljYcOnw6NvLlxyXG4gKlxyXG4gKiBgYGBcclxuICoge1xyXG4gKiAgIHBhdGg6ICdwZW9wbGUnLFxyXG4gKiAgIGNvbXBvbmVudDogUG9QYWdlRHluYW1pY1RhYmxlQ29tcG9uZW50LFxyXG4gKiAgIGRhdGE6IHtcclxuICogICAgIHNlcnZpY2VBcGk6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvdjEvcGVvcGxlJywgLy8gZW5kcG9pbnQgZG9zIGRhZG9zXHJcbiAqICAgICBzZXJ2aWNlTWV0YWRhdGFBcGk6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvdjEvbWV0YWRhdGEnLCAvLyBlbmRwb2ludCBkb3MgbWV0YWRhZG9zIHV0aWxpemFuZG8gbyBtw6l0b2RvIEhUVFAgR2V0XHJcbiAqICAgICBzZXJ2aWNlTG9hZEFwaTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9sb2FkLW1ldGFkYXRhJyAvLyBlbmRwb2ludCBkZSBjdXN0b21pemHDp8O1ZXMgZG9zIG1ldGFkYWRvcyB1dGlsaXphbmRvIG8gbcOpdG9kbyBIVFRQIFBvc3RcclxuICogICB9XHJcbiAqIH1cclxuICpcclxuICogYGBgXHJcbiAqXHJcbiAqIEEgcmVxdWlzacOnw6NvIGRvcyBtZXRhZGFkb3Mgw6kgZmVpdGEgbmEgaW5pY2lhbGl6YcOnw6NvIGRvIHRlbXBsYXRlIHBhcmEgYnVzY2FyIG9zIG1ldGFkYWRvcyBkYSBww6FnaW5hIHBhc3NhbmRvIG9cclxuICogdGlwbyBkbyBtZXRhZGFkbyBlc3BlcmFkbyBlIGEgdmVyc8OjbyBjYWNoZWFkYSBwZWxvIGJyb3dzZXIuXHJcbiAqXHJcbiAqIE8gZm9ybWF0byBlc3BlcmFkbyBuYSByZXNwb3N0YSBkYSByZXF1aXNpw6fDo28gZXN0w6EgZXNwZWNpZmljYWRvIG5hIGludGVyZmFjZVxyXG4gKiBbUG9QYWdlRHluYW1pY1RhYmxlTWV0YWRhdGFdKC9kb2N1bWVudGF0aW9uL3BvLXBhZ2UtZHluYW1pYy10YWJsZSNwby1wYWdlLWR5bmFtaWMtdGFibGUtbWV0YWRhdGEpLiBQb3IgZXhlbXBsbzpcclxuICpcclxuICogYGBgXHJcbiAqICB7XHJcbiAqICAgdmVyc2lvbjogMSxcclxuICogICB0aXRsZTogJ1BlcnNvbiBUYWJsZScsXHJcbiAqICAgZmllbGRzOiBbXHJcbiAqICAgICB7IHByb3BlcnR5OiAnaWQnLCBrZXk6IHRydWUsIGRpc2FibGVkOiB0cnVlIH0sXHJcbiAqICAgICB7IHByb3BlcnR5OiAnc3RhdHVzJyB9LFxyXG4gKiAgICAgeyBwcm9wZXJ0eTogJ25hbWUnIH0sXHJcbiAqICAgICB7IHByb3BlcnR5OiAnbmlja25hbWUnIH0sXHJcbiAqICAgICB7IHByb3BlcnR5OiAnYmlydGhkYXRlJywgbGFiZWw6ICdCaXJ0aCBkYXRlJyB9LFxyXG4gKiAgICAgeyBwcm9wZXJ0eTogJ2dlbnJlJyB9LFxyXG4gKiAgICAgeyBwcm9wZXJ0eTogJ2NpdHknIH0sXHJcbiAqICAgICB7IHByb3BlcnR5OiAnY291bnRyeScgfVxyXG4gKiAgIF0sXHJcbiAqICAga2VlcEZpbHRlcnM6IHRydWVcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogPiBDYXNvIG8gZW5kcG9pbnQgZG9zIG1ldGFkYWRvcyBuw6NvIHNlamEgZXNwZWNpZmljYWRvLCBzZXLDoSBmZWl0byB1bWEgcmVxdWlzacOnw6NvIHV0aWxpemFuZG8gbyBgc2VydmljZUFwaWAgZGEgc2VndWludGUgZm9ybWE6XHJcbiAqIGBgYFxyXG4gKiBHRVQge2VuZC1wb2ludH0vbWV0YWRhdGE/dHlwZT1saXN0JnZlcnNpb249e3ZlcnNpb259XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tcGFnZS1keW5hbWljLXRhYmxlLWJhc2ljXCIgdGl0bGU9XCJQTyBQYWdlIER5bmFtaWMgVGFibGUgQmFzaWNcIj5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWJhc2ljL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtYmFzaWMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxyXG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtYmFzaWMvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1iYXNpYy5jb21wb25lbnQudHNcIj4gPC9maWxlPlxyXG4gKiA8L2V4YW1wbGU+XHJcbiAqXHJcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1wYWdlLWR5bmFtaWMtdGFibGUtcGVvcGxlXCIgdGl0bGU9XCJQTyBQYWdlIER5bmFtaWMgVGFibGUgLSBQZW9wbGVcIj5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXBlb3BsZS9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXBlb3BsZS5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XHJcbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1wZW9wbGUvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1wZW9wbGUuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cclxuICogPC9leGFtcGxlPlxyXG4gKlxyXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzXCIgdGl0bGU9XCJQTyBQYWdlIER5bmFtaWMgVGFibGUgLSBVc2Vyc1wiPlxyXG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtdXNlcnMvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS11c2Vycy5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XHJcbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS11c2Vycy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XHJcbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS11c2Vycy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzLnNlcnZpY2UudHNcIj4gPC9maWxlPlxyXG4gKiA8L2V4YW1wbGU+XHJcbiAqXHJcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1wYWdlLWR5bmFtaWMtdGFibGUtaG90ZWxzXCIgdGl0bGU9XCJQTyBQYWdlIER5bmFtaWMgVGFibGUgLSBIb3RlbHNcIj5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWhvdGVscy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWhvdGVscy5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XHJcbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1ob3RlbHMvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1ob3RlbHMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cclxuICogPC9leGFtcGxlPlxyXG4gKlxyXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tcGFnZS1keW5hbWljLXRhYmxlLWRyYWctYW5kLWRyb3BcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBUYWJsZSAtIERyYWcgYW5kIERyb3BcIj5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWRyYWctYW5kLWRyb3Avc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1kcmFnLWFuZC1kcm9wLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cclxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWRyYWctYW5kLWRyb3Avc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1kcmFnLWFuZC1kcm9wLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XHJcbiAqIDwvZXhhbXBsZT5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncG8tcGFnZS1keW5hbWljLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcG8tcGFnZS1keW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBwcm92aWRlcnM6IFtQb1BhZ2VEeW5hbWljU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFBvUGFnZUR5bmFtaWNUYWJsZUNvbXBvbmVudCBleHRlbmRzIFBvUGFnZUR5bmFtaWNMaXN0QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKipcclxuICAgKiBGdW7Dp8OjbyBvdSBzZXJ2acOnbyBxdWUgc2Vyw6EgZXhlY3V0YWRvIG5hIGluaWNpYWxpemHDp8OjbyBkbyBjb21wb25lbnRlLlxyXG4gICAqXHJcbiAgICogQSBwcm9wcmllZGFkZSBhY2VpdGEgb3Mgc2VndWludGVzIHRpcG9zOlxyXG4gICAqIC0gYHN0cmluZ2A6ICpFbmRwb2ludCogdXNhZG8gcGVsbyBjb21wb25lbnRlIHBhcmEgcmVxdWlzacOnw6NvIHZpYSBgUE9TVGAuXHJcbiAgICogLSBgZnVuY3Rpb25gOiBNw6l0b2RvIHF1ZSBzZXLDoSBleGVjdXRhZG8uXHJcbiAgICpcclxuICAgKiBPIHJldG9ybm8gZGVzdGEgZnVuw6fDo28gZGV2ZSBzZXIgZG8gdGlwbyBgUG9QYWdlRHluYW1pY1RhYmxlT3B0aW9uc2AsXHJcbiAgICogb25kZSBvIHVzdcOhcmlvIHBvZGVyw6EgY3VzdG9taXphciBub3ZvcyBjYW1wb3MsIGJyZWFkY3J1bWIsIHRpdGxlIGUgYWN0aW9uc1xyXG4gICAqXHJcbiAgICogUG9yIGV4ZW1wbG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiBnZXRQYWdlT3B0aW9ucygpOiBQb1BhZ2VEeW5hbWljVGFibGVPcHRpb25zIHtcclxuICAgKiByZXR1cm4ge1xyXG4gICAqICAgYWN0aW9uczpcclxuICAgKiAgICAgeyBuZXc6ICduZXcnLCBlZGl0OiAnZWRpdC86aWQnLCByZW1vdmU6IHRydWUgfSxcclxuICAgKiAgIGZpZWxkczogW1xyXG4gICAqICAgICB7IHByb3BlcnR5OiAnaWRDYXJkJywgZ3JpZENvbHVtbnM6IDYgfVxyXG4gICAqICAgXVxyXG4gICAqIH07XHJcbiAgICogfVxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUGFyYSByZWZlcmVuY2lhciBhIHN1YSBmdW7Dp8OjbyB1dGlsaXplIGEgcHJvcHJpZWRhZGUgYGJpbmRgLCBwb3IgZXhlbXBsbzpcclxuICAgKiBgYGBcclxuICAgKiAgW3AtbG9hZF09XCJvbkxvYWRPcHRpb25zLmJpbmQodGhpcylcIlxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1sb2FkJykgb25Mb2FkOiBzdHJpbmcgfCAoKCkgPT4gUG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBNYW50w6ltIG5hIG1vZGFsIGRlIGBCdXNjYSBBdmFuw6dhZGFgIG9zIHZhbG9yZXMgcHJlZW5jaGlkb3MgZG8gw7psdGltbyBmaWx0cm8gcmVhbGl6YWRvIHBlbG8gdXN1w6FyaW8uXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXHJcbiAgICovXHJcbiAgQElucHV0Qm9vbGVhbigpXHJcbiAgQElucHV0KCdwLWtlZXAtZmlsdGVycycpXHJcbiAga2VlcEZpbHRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIERlZmluZSBxdWUgYSBjb2x1bmEgZGUgYcOnw7VlcyBmaWNhcsOhIG5vIGxhZG8gZGlyZWl0byBkYSB0YWJlbGEuXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXHJcbiAgICovXHJcbiAgQElucHV0Qm9vbGVhbigpXHJcbiAgQElucHV0KCdwLWFjdGlvbnMtcmlnaHQnKVxyXG4gIGFjdGlvblJpZ2h0PzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBhIHV0aWxpemHDp8OjbyBkYSBwZXNxdWlzYSByw6FwaWRhIGp1bnRvIGNvbSBhIHBlc3F1aXNhIGF2YW7Dp2FkYS5cclxuICAgKlxyXG4gICAqIERlc3RhIGZvcm1hLCBhbyB0ZXIgdW1hIHBlc3F1aXNhIGF2YW7Dp2FkYSBlc3RhYmVsZWNpZGEgZSBzZXJcclxuICAgKiBwcmVlbmNoaWRvIGEgcGVzcXVpc2EgcsOhcGlkYSwgbyBmaWx0cm8gc2Vyw6EgY29uY2F0ZW5hZG8gYWRpY2lvbmFuZG8gYSBwZXNxdWlzYVxyXG4gICAqIHLDoXBpZGEgdGFtYsOpbSBuYSBsaXN0YSBkZSBgZGlzY2xhaW1lcnNgIGEgYXBsaWNhbmRvIHVtYSBub3ZhIGJ1c2NhIGNvbSBhIGNvbmNhdGVuYcOnw6NvLlxyXG4gICAqXHJcbiAgICogUG9yIGV4ZW1wbG8sIGNvbSBvcyBzZWd1aW50ZXMgZmlsdHJvcyBhcGxpY2Fkb3M6XHJcbiAgICogICAtIGZpbHRybyBhdmFuw6dhZG86IGB7IG5hbWU6ICdNaWtlJywgYWdlOiAnMTInIH1gXHJcbiAgICogICAtIGZpbHRybyByw6FwaWRvOiBgeyBzZWFyY2g6ICdwYXBlcicgfWBcclxuICAgKlxyXG4gICAqIEEgcmVxdWlzacOnw6NvIGRvcyBkYWRvcyBuYSBBUEkgZmljYXLDoSBjb20gb3MgcGFyw6JtZXRyb3M6XHJcbiAgICogYGBgXHJcbiAgICogcGFnZT0xJnBhZ2VTaXplPTEwJm5hbWU9TWlrZSZhZ2U9MTImc2VhcmNoPXBhcGVyXHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXHJcbiAgICovXHJcbiAgQElucHV0Qm9vbGVhbigpXHJcbiAgQElucHV0KCdwLWNvbmNhdC1maWx0ZXJzJylcclxuICBjb25jYXRGaWx0ZXJzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBPY3VsdGEgbyBib3TDo28gcGFyYSByZW1vdmVyIHRvZG9zIG9zICpkaXNjbGFpbWVycyogZG8gZ3J1cG8uXHJcbiAgICpcclxuICAgKiA+IFBvciBwYWRyw6NvLCBvIG1lc21vIMOpIGV4aWJpZG8gw6AgcGFydGlyIGRlIGRvaXMgb3UgbWFpcyAqZGlzY2xhaW1lcnMqIGNvbSBhIG9ww6fDo28gYGhpZGVDbG9zZWAgaGFiaWxpdGFkYS5cclxuICAgKlxyXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcclxuICAgKi9cclxuICBASW5wdXRCb29sZWFuKClcclxuICBASW5wdXQoJ3AtaGlkZS1yZW1vdmUtYWxsLWRpc2NsYWltZXInKVxyXG4gIGhpZGVSZW1vdmVBbGxEaXNjbGFpbWVyPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogU2UgdmVyZGFkZWlybywgYXRpdmEgYSBmdW5jaW9uYWxpZGFkZSBkZSBzY3JvbGwgaW5maW5pdG8gcGFyYSBhIHRhYmVsYSBlIG8gYm90w6NvIFwiQ2FycmVnYXIgTWFpc1wiIGRlaXhhcsOhIGRlIHNlciBleGliaWRvLiBBbyBjaGVnYXIgbm8gZmltIGRhIHRhYmVsYVxyXG4gICAqIGV4ZWN1dGFyw6EgYSBmdW7Dp8OjbyBgcC1zaG93LW1vcmVgLlxyXG4gICAqXHJcbiAgICogKipSZWdyYXMgZGUgdXRpbGl6YcOnw6NvOioqXHJcbiAgICogIC0gTyBzY3JvbGwgaW5maW5pdG8gc8OzIGZ1bmNpb25hIHBhcmEgdGFiZWxhcyBxdWUgdXRpbGl6YW0gYSBwcm9wcmllZGFkZSBgcC1oZWlnaHRgIGUgcXVlIHBvc3N1ZW0gbyBzY3JvbGwgasOhIG5hIGNhcmdhIGluaWNpYWwgZG9zIGRhZG9zLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dEJvb2xlYW4oKVxyXG4gIEBJbnB1dCgncC1pbmZpbml0ZS1zY3JvbGwnKVxyXG4gIGluZmluaXRlU2Nyb2xsPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBoYXNOZXh0ID0gZmFsc2U7XHJcbiAgaXRlbXMgPSBbXTtcclxuICBsaXRlcmFscztcclxuICBwYWdlQWN0aW9uczogQXJyYXk8UG9QYWdlQWN0aW9uPiA9IFtdO1xyXG4gIHRhYmxlQWN0aW9uczogQXJyYXk8UG9UYWJsZUFjdGlvbj4gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfYWN0aW9uczogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucyA9IHt9O1xyXG4gIHByaXZhdGUgX3BhZ2VDdXN0b21BY3Rpb25zOiBBcnJheTxQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21BY3Rpb24+ID0gW107XHJcbiAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfb2xkUXVpY2tTZWFyY2hQYXJhbTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3F1aWNrU2VhcmNoUGFyYW06IHN0cmluZyA9ICdzZWFyY2gnO1xyXG4gIHByaXZhdGUgX3F1aWNrU2VhcmNoVmFsdWU6IHN0cmluZztcclxuICBwcml2YXRlIF9xdWlja1NlYXJjaFdpZHRoOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfdGFibGVDdXN0b21BY3Rpb25zOiBBcnJheTxQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21UYWJsZUFjdGlvbj4gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBwYWdlOiBudW1iZXIgPSAxO1xyXG4gIHByaXZhdGUgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcbiAgcHJpdmF0ZSBpdGVtU2VsZWN0ZWRBY3Rpb247XHJcbiAgcHJpdmF0ZSBwYXJhbXMgPSB7fTtcclxuICBwcml2YXRlIHNvcnRlZENvbHVtbjogUG9UYWJsZUNvbHVtblNvcnQ7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHByaXZhdGUgaGFzQ3VzdG9tQWN0aW9uV2l0aFNlbGVjdGFibGUgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfY3VzdG9tUGFnZUxpc3RBY3Rpb25zOiBBcnJheTxQb1BhZ2VBY3Rpb24+ID0gW107XHJcbiAgcHJpdmF0ZSBfY3VzdG9tVGFibGVBY3Rpb25zOiBBcnJheTxQb1RhYmxlQWN0aW9uPiA9IFtdO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRQYWdlQWN0aW9uczogQXJyYXk8UG9QYWdlQWN0aW9uPiA9IFtdO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRUYWJsZUFjdGlvbnM6IEFycmF5PFBvVGFibGVBY3Rpb24+ID0gW107XHJcbiAgcHJpdmF0ZSBfaGlkZUNsb3NlRGlzY2xhaW1lcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICBwcml2YXRlIF9kcmFnZ2FibGUgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBzZXQgZGVmYXVsdFBhZ2VBY3Rpb25zKHZhbHVlOiBBcnJheTxQb1BhZ2VBY3Rpb24+KSB7XHJcbiAgICB0aGlzLl9kZWZhdWx0UGFnZUFjdGlvbnMgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlUGFnZUFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0IGRlZmF1bHRUYWJsZUFjdGlvbnModmFsdWU6IEFycmF5PFBvVGFibGVBY3Rpb24+KSB7XHJcbiAgICB0aGlzLl9kZWZhdWx0VGFibGVBY3Rpb25zID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVRhYmxlQWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXQgY3VzdG9tUGFnZUxpc3RBY3Rpb25zKHZhbHVlOiBBcnJheTxQb1BhZ2VBY3Rpb24+KSB7XHJcbiAgICB0aGlzLl9jdXN0b21QYWdlTGlzdEFjdGlvbnMgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlUGFnZUFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0IGN1c3RvbVRhYmxlQWN0aW9ucyh2YWx1ZTogQXJyYXk8UG9UYWJsZUFjdGlvbj4pIHtcclxuICAgIHRoaXMuX2N1c3RvbVRhYmxlQWN0aW9ucyA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBBw6fDtWVzIGRhIHDDoWdpbmEgZSBkYSB0YWJlbGEuXHJcbiAgICogPiBDYXNvIHV0aWxpemFyIGEgYcOnw6NvIHBhZHLDo28gZGUgZXhjbHVpciwgYSBtZXNtYSBzZXLDoSBleGliaWRhIHBvciDDumx0aW1vIG5hIHRhYmVsYS5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtYWN0aW9ucycpIHNldCBhY3Rpb25zKHZhbHVlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zKSB7XHJcbiAgICB0aGlzLl9hY3Rpb25zID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID4gMCA/IHZhbHVlIDoge307XHJcblxyXG4gICAgdGhpcy5zZXRQYWdlQWN0aW9ucyh0aGlzLmFjdGlvbnMpO1xyXG4gICAgdGhpcy5zZXRSZW1vdmVBbGxBY3Rpb24oKTtcclxuICAgIHRoaXMuc2V0VGFibGVBY3Rpb25zKHRoaXMuYWN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aW9ucygpOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIExpc3RhIGRlIGHDp8O1ZXMgY3VzdG9taXphZGFzIGRhIHDDoWdpbmEgcXVlIHNlcsOjbyBpbmNvcnBvcmFkYXMgw6BzIGHDp8O1ZXNcclxuICAgKiBpbmZvcm1hZGFzIGF0cmF2w6lzIGRhIHByb3ByaWVkYWRlIGBwLWFjdGlvbnNgLlxyXG4gICAqXHJcbiAgICogRXNzYXMgYcOnw7VlcyBmaWNhbSBsb2NhbGl6YWRhcyBuYSBwYXJ0ZSBzdXBlcmlvciBkYSBww6FnaW5hIGVtIGJvdMO1ZXMgY29tIGHDp8O1ZXMuXHJcbiAgICpcclxuICAgKiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcclxuICAgKiBgYGBcclxuICAgKiBbXHJcbiAgICogIHsgbGFiZWw6ICdFeHBvcnQnLCBhY3Rpb246IHRoaXMuZXhwb3J0LmJpbmQodGhpcykgfSxcclxuICAgKiAgeyBsYWJlbDogJ1ByaW50JywgYWN0aW9uOiB0aGlzLnByaW50LmJpbmQodGhpcykgfVxyXG4gICAqIF07XHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXBhZ2UtY3VzdG9tLWFjdGlvbnMnKSBzZXQgcGFnZUN1c3RvbUFjdGlvbnModmFsdWU6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbUFjdGlvbj4pIHtcclxuICAgIHRoaXMuX3BhZ2VDdXN0b21BY3Rpb25zID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xyXG5cclxuICAgIHRoaXMuY3VzdG9tUGFnZUxpc3RBY3Rpb25zID0gdGhpcy50cmFuc2Zvcm1DdXN0b21BY3Rpb25zVG9QYWdlTGlzdEFjdGlvbih0aGlzLnBhZ2VDdXN0b21BY3Rpb25zKTtcclxuICAgIHRoaXMuaGFzQ3VzdG9tQWN0aW9uV2l0aFNlbGVjdGFibGUgPSB0aGlzLnBhZ2VDdXN0b21BY3Rpb25zLnNvbWUoY3VzdG9tQWN0aW9uID0+IGN1c3RvbUFjdGlvbi5zZWxlY3RhYmxlKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlQ3VzdG9tQWN0aW9ucygpOiBBcnJheTxQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21BY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlQ3VzdG9tQWN0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBMaXN0YSBkZSBhw6fDtWVzIGN1c3RvbWl6YWRhcyBuYSB0YWJlbGEgZGEgcMOhZ2luYSBxdWUgc2Vyw6NvIGluY29ycG9yYWRhcyDDoHMgYcOnw7Vlc1xyXG4gICAqIGluZm9ybWFkYXMgYXRyYXbDqXMgZGEgcHJvcHJpZWRhZGUgYHAtYWN0aW9uc2AuXHJcbiAgICpcclxuICAgKiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcclxuICAgKiBgYGBcclxuICAgKiBbXHJcbiAgICogIHsgbGFiZWw6ICdBcHBseSBkaXNjb3VudCcsIGFjdGlvbjogdGhpcy5hcHBseURpc2NvdW50LmJpbmQodGhpcykgfSxcclxuICAgKiAgeyBsYWJlbDogJ0RldGFpbHMnLCBhY3Rpb246IHRoaXMuZGV0YWlscy5iaW5kKHRoaXMpIH1cclxuICAgKiBdO1xyXG4gICAqIGBgYFxyXG4gICAqID4gQ2FzbyB1dGlsaXphciBhIGHDp8OjbyBwYWRyw6NvIGRlIGV4Y2x1aXIsIGEgbWVzbWEgc2Vyw6EgZXhpYmlkYSBwb3Igw7psdGltbyBuYSB0YWJlbGEuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXRhYmxlLWN1c3RvbS1hY3Rpb25zJykgc2V0IHRhYmxlQ3VzdG9tQWN0aW9ucyh2YWx1ZTogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24+KSB7XHJcbiAgICB0aGlzLl90YWJsZUN1c3RvbUFjdGlvbnMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XHJcblxyXG4gICAgdGhpcy5jdXN0b21UYWJsZUFjdGlvbnMgPSB0aGlzLnRyYW5zZm9ybVRhYmxlQ3VzdG9tQWN0aW9uc1RvVGFibGVBY3Rpb25zKHRoaXMudGFibGVDdXN0b21BY3Rpb25zKTtcclxuICB9XHJcblxyXG4gIGdldCB0YWJsZUN1c3RvbUFjdGlvbnMoKTogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZUN1c3RvbUFjdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogTGFyZ3VyYSBkbyBjYW1wbyBkZSBidXNjYSwgdXRpbGl6YW5kbyBvICpHcmlkIFN5c3RlbSosXHJcbiAgICogZSBsaW1pdGFkbyBhbyBtw6F4aW1vIGRlIDYgY29sdW5hcy4gTyB0YW1hbmhvIG3DrW5pbW8gw6kgY29udHJvbGFkb1xyXG4gICAqIGNvbmZvcm1lIHJlc29sdcOnw6NvIGRlIHRlbGEgcGFyYSBtYW50ZXIgYSBjb25zaXN0w6puY2lhIGRvIGxheW91dC5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtcXVpY2stc2VhcmNoLXdpZHRoJykgc2V0IHF1aWNrU2VhcmNoV2lkdGgodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fcXVpY2tTZWFyY2hXaWR0aCA9IHV0aWwuY29udmVydFRvSW50KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBxdWlja1NlYXJjaFdpZHRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tTZWFyY2hXaWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBEZWZpbmUgYSBhbHR1cmEgZGEgdGFiZWxhIGVtICpwaXhlbHMqIGUgZml4YSBvIGNhYmXDp2FsaG8uXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWhlaWdodCcpIHNldCBoZWlnaHQodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5faGVpZ2h0ID0gdXRpbC5jb252ZXJ0VG9JbnQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBMaXN0YSBkZSBmaWx0cm9zIHF1ZSB0ZXLDo28gYSBvcMOnw6NvIGRlIGZlY2hhciBvY3VsdGFkYVxyXG4gICAqIGVtIHNldSByZXNwZWN0aXZvIGRpc2NsYWltZXIuIFV0aWxpemFyIG8gYXRyaWJ1dG8gYHByb3BlcnR5YCBkbyBjYW1wby5cclxuICAgKlxyXG4gICAqIEV4ZW1wbG8gZGUgdXRpbGl6YcOnw6NvOlxyXG4gICAqIGBgYFxyXG4gICAqIFsnY2l0eScsJ25hbWUnXTtcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBASW5wdXQoJ3AtaGlkZS1jbG9zZS1kaXNjbGFpbWVycycpIHNldCBoaWRlQ2xvc2VEaXNjbGFpbWVycyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgdGhpcy5faGlkZUNsb3NlRGlzY2xhaW1lcnMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XHJcbiAgfVxyXG5cclxuICBnZXQgaGlkZUNsb3NlRGlzY2xhaW1lcnMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGlkZUNsb3NlRGlzY2xhaW1lcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogSWRlbnRpZmljYWRvciBkbyBwYXLDom1ldHJvIGVudmlhZG8gYW8gc2VydmnDp28gYW8gcmVhbGl6YXIgdW1hIGJ1c2NhIHLDoXBpZGEuXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCAnc2VhcmNoJ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1xdWljay1zZWFyY2gtcGFyYW0nKSBzZXQgcXVpY2tTZWFyY2hQYXJhbSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9xdWlja1NlYXJjaFBhcmFtID0gdmFsdWUgPz8gJ3NlYXJjaCc7XHJcbiAgfVxyXG5cclxuICBnZXQgcXVpY2tTZWFyY2hQYXJhbSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3F1aWNrU2VhcmNoUGFyYW07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogVmFsb3IgcGFkcsOjbyBuYSBidXNjYSByw6FwaWRhIGFvIGluaWNpYWxpemFyIG8gY29tcG9uZW50ZVxyXG4gICAqXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXF1aWNrLXNlYXJjaC12YWx1ZScpIHNldCBxdWlja1NlYXJjaFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3F1aWNrU2VhcmNoVmFsdWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBxdWlja1NlYXJjaFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tTZWFyY2hWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBPYmpldG8gY29tIGFzIGxpdGVyYWlzIHVzYWRhcyBubyBgcG8tcGFnZS1keW5hbWljLXRhYmxlYC5cclxuICAgKlxyXG4gICAqIEV4aXN0ZW0gZHVhcyBtYW5laXJhcyBkZSBjdXN0b21pemFyIG8gY29tcG9uZW50ZSwgcGFzc2FuZG8gdW0gb2JqZXRvIGNvbSB0b2RhcyBhcyBsaXRlcmFpcyBkaXNwb27DrXZlaXM6XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiAgY29uc3QgY3VzdG9tTGl0ZXJhbHM6IFBvUGFnZUR5bmFtaWNTZWFyY2hMaXRlcmFscyA9IHtcclxuICAgKiAgICBkaXNjbGFpbWVyR3JvdXBUaXRsZTogJ0ZpbHRyb3MgYXBsaWNhZG9zOicsXHJcbiAgICogICAgZmlsdGVyVGl0bGU6ICdGaWx0cm8gYXZhbsOnYWRvJyxcclxuICAgKiAgICBmaWx0ZXJDYW5jZWxMYWJlbDogJ0ZlY2hhcicsXHJcbiAgICogICAgZmlsdGVyQ29uZmlybUxhYmVsOiAnQXBsaWNhcicsXHJcbiAgICogICAgcXVpY2tTZWFyY2hMYWJlbDogJ1ZhbG9yIHBlc3F1aXNhZG86JyxcclxuICAgKiAgICBzZWFyY2hQbGFjZWhvbGRlcjogJ1Blc3F1aXNlIGFxdWknXHJcbiAgICogIH07XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBPdSBwYXNzYW5kbyBhcGVuYXMgYXMgbGl0ZXJhaXMgcXVlIGRlc2VqYSBjdXN0b21pemFyOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogIGNvbnN0IGN1c3RvbUxpdGVyYWxzOiBQb1BhZ2VEeW5hbWljU2VhcmNoTGl0ZXJhbHMgPSB7XHJcbiAgICogICAgZmlsdGVyVGl0bGU6ICdGaWx0cm8gYXZhbsOnYWRvJ1xyXG4gICAqICB9O1xyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogRSBwYXJhIGNhcnJlZ2FyIGFzIGxpdGVyYWlzIGN1c3RvbWl6YWRhcywgYmFzdGEgYXBlbmFzIHBhc3NhciBvIG9iamV0byBwYXJhIG8gY29tcG9uZW50ZS5cclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIDxwby1wYWdlLWR5bmFtaWMtdGFibGVcclxuICAgKiAgIFtwLWxpdGVyYWxzXT1cImN1c3RvbUxpdGVyYWxzXCI+XHJcbiAgICogPC9wby1wYWdlLWR5bmFtaWMtdGFibGU+XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiA+IE8gdmFsb3IgcGFkcsOjbyBzZXLDoSB0cmFkdXppZG8gZGUgYWNvcmRvIGNvbSBvIGlkaW9tYSBjb25maWd1cmFkbyBubyBbYFBvSTE4blNlcnZpY2VgXSgvZG9jdW1lbnRhdGlvbi9wby1pMThuKSBvdSAqYnJvd3NlciouXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxpdGVyYWxzJykgc2VhcmNoTGl0ZXJhbHM6IFBvUGFnZUR5bmFtaWNTZWFyY2hMaXRlcmFscztcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEhhYmlsaXRhIG8gbW9kbyBkcmFnIGFuZCBkcm9wIHBhcmEgYXMgY29sdW5hcyBkYSB0YWJlbGEuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoJ3AtZHJhZ2dhYmxlJykgc2V0IGRyYWdnYWJsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZHJhZ2dhYmxlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgZHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RyYWdnYWJsZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBwb0RpYWxvZ1NlcnZpY2U6IFBvRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9Ob3RpZmljYXRpb246IFBvTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9QYWdlRHluYW1pY1NlcnZpY2U6IFBvUGFnZUR5bmFtaWNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZTogUG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZSxcclxuICAgIGxhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xyXG5cclxuICAgIHRoaXMubGl0ZXJhbHMgPSB7XHJcbiAgICAgIC4uLnBvUGFnZUR5bmFtaWNUYWJsZUxpdGVyYWxzRGVmYXVsdFtwb0xvY2FsZURlZmF1bHRdLFxyXG4gICAgICAuLi5wb1BhZ2VEeW5hbWljVGFibGVMaXRlcmFsc0RlZmF1bHRbbGFuZ3VhZ2VdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWREYXRhRnJvbUFQSSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG9uQWR2YW5jZWRTZWFyY2goZmlsdGVyKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoeyBwYWdlOiAxLCAuLi5maWx0ZXIgfSkuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5wYXJhbXMgPSBmaWx0ZXI7XHJcblxyXG4gICAgaWYgKHRoaXMua2VlcEZpbHRlcnMpIHtcclxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VEaXNjbGFpbWVycyhkaXNjbGFpbWVycykge1xyXG4gICAgY29uc3QgZmlsdGVyID0ge307XHJcblxyXG4gICAgZGlzY2xhaW1lcnMuZm9yRWFjaChkaXNjbGFpbWVyID0+IHtcclxuICAgICAgZmlsdGVyW2Rpc2NsYWltZXIucHJvcGVydHldID0gZGlzY2xhaW1lci52YWx1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMub25BZHZhbmNlZFNlYXJjaChmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgb25RdWlja1NlYXJjaCh0ZXJtVHlwZWRJblF1aWNrU2VhcmNoKSB7XHJcbiAgICBjb25zdCBxdWlja1NlYXJjaFBhcmFtID0gdGVybVR5cGVkSW5RdWlja1NlYXJjaCA/IHsgW3RoaXMucXVpY2tTZWFyY2hQYXJhbV06IHRlcm1UeXBlZEluUXVpY2tTZWFyY2ggfSA6IHt9O1xyXG4gICAgdGhpcy5wYXJhbXMgPSB0aGlzLmNvbmNhdEZpbHRlcnMgPyB7IC4uLnRoaXMucGFyYW1zLCAuLi5xdWlja1NlYXJjaFBhcmFtIH0gOiB7IC4uLnF1aWNrU2VhcmNoUGFyYW0gfTtcclxuXHJcbiAgICBpZiAodGhpcy5fb2xkUXVpY2tTZWFyY2hQYXJhbSBpbiB0aGlzLnBhcmFtcyAmJiB0aGlzLl9vbGRRdWlja1NlYXJjaFBhcmFtICE9PSB0aGlzLnF1aWNrU2VhcmNoUGFyYW0pIHtcclxuICAgICAgZGVsZXRlIHRoaXMucGFyYW1zW3RoaXMuX29sZFF1aWNrU2VhcmNoUGFyYW1dO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX29sZFF1aWNrU2VhcmNoUGFyYW0gPSB0aGlzLnF1aWNrU2VhcmNoUGFyYW07XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEodGVybVR5cGVkSW5RdWlja1NlYXJjaCA/IHsgcGFnZTogMSwgLi4udGhpcy5wYXJhbXMgfSA6IHVuZGVmaW5lZCkuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgb25Tb3J0KHNvcnRlZENvbHVtbjogUG9UYWJsZUNvbHVtblNvcnQpIHtcclxuICAgIGlmICh0aGlzLmhlaWdodCkge1xyXG4gICAgICBjb25zdCBvcmRlciA9IHNvcnRlZENvbHVtbi50eXBlID09PSAnYXNjZW5kaW5nJyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgdXRpbC5zb3J0QXJyYXlPZk9iamVjdHModGhpcy5pdGVtcywgc29ydGVkQ29sdW1uLmNvbHVtbi5wcm9wZXJ0eSwgb3JkZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSBzb3J0ZWRDb2x1bW47XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVZpc2libGVDb2x1bW5zKHZhbHVlKSB7XHJcbiAgICB0aGlzLmNoYW5nZVZpc2libGVDb2x1bW5zLmVtaXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25Db2x1bW5SZXN0b3JlTWFuYWdlcih2YWx1ZTogQXJyYXk8U3RyaW5nPikge1xyXG4gICAgdGhpcy5jb2x1bW5SZXN0b3JlTWFuYWdlci5lbWl0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uU29ydEJ5KHNvcnRlZENvbHVtbjogUG9UYWJsZUNvbHVtblNvcnQpIHtcclxuICAgIHRoaXMuc29ydEJ5LmVtaXQoc29ydGVkQ29sdW1uKTtcclxuICB9XHJcblxyXG4gIHNob3dNb3JlKCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmxvYWREYXRhKHsgcGFnZTogKyt0aGlzLnBhZ2UsIC4uLnRoaXMucGFyYW1zIH0pLnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIGdldCBlbmFibGVTZWxlY3Rpb25UYWJsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0FjdGlvblJlbW92ZUFsbCB8fCB0aGlzLmhhc0N1c3RvbUFjdGlvbldpdGhTZWxlY3RhYmxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0FjdGlvblJlbW92ZUFsbCgpIHtcclxuICAgIHJldHVybiAhIXRoaXMuYWN0aW9ucy5yZW1vdmVBbGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW7Dp8OjbyBxdWUgcmVhbGl6YSBhIGF0dWFsaXphw6fDo28gZG9zIGRhZG9zIGRhIHRhYmVsYS5cclxuICAgKlxyXG4gICAqIFBhcmEgdXRpbGl6w6EtbGEgw6kgbmVjZXNzw6FyaW8gY2FwdHVyYXIgYSBpbnN0w6JuY2lhIGRvIGBwYWdlIGR5bmFtaWMgdGFibGVgLCBjb21vIHBvciBleGVtcGxvOlxyXG4gICAqXHJcbiAgICogYGBgIGh0bWxcclxuICAgKiA8cG8tcGFnZS1keW5hbWljLXRhYmxlICNkeW5hbWljVGFibGUgW3Atc2VydmljZS1hcGldPVwic2VydmljZUFwaVwiPjwvcG8tcGFnZS1keW5hbWljLXRhYmxlPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogYGBgIGphdmFzY3JpcHRcclxuICAgKiBpbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVDb21wb25lbnQsIFBvRHluYW1pY0Zvcm1GaWVsZCB9IGZyb20gJ0Bwby11aS9uZy1jb21wb25lbnRzJztcclxuICAgKlxyXG4gICAqIC4uLlxyXG4gICAqXHJcbiAgICogQFZpZXdDaGlsZCgnZHluYW1pY1RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgZHluYW1pY1RhYmxlOiBQb1BhZ2VEeW5hbWljVGFibGVDb21wb25lbnQ7XHJcbiAgICpcclxuICAgKiBwYWdlQ3VzdG9tQWN0aW9uczogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tQWN0aW9uPiA9IFtcclxuICAgKiB7XHJcbiAgICogICBsYWJlbDogJ1VwZGF0ZScsXHJcbiAgICogICBhY3Rpb246IHRoaXMudXBkYXRlVGFibGUuYmluZCh0aGlzKSxcclxuICAgKiAgIGljb246ICdwby1pY29uLXJlZnJlc2gnXHJcbiAgICogfV1cclxuICAgKlxyXG4gICAqIHVwZGF0ZVRhYmxlKCkge1xyXG4gICAqICAgdGhpcy5keW5hbWljVGFibGUudXBkYXRlRGF0YVRhYmxlKCk7XHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3twYWdlOiBudW1iZXIsIGtleTogdmFsdWUgfX0gZmlsdGVyIFByb3ByaWVkYWRlIHBhcmEgZW52aW8gZGUgdW0gZmlsdHJvIGN1c3RvbWl6YWRvLlxyXG4gICAqIEV4ZW1wbG8gZGUgZW52aW86XHJcbiAgICpcclxuICAgKmBgYFxyXG4gICAqIHRoaXMuZHluYW1pY1RhYmxlLnVwZGF0ZURhdGFUYWJsZSh7cGFnZTogMywgc2VhcmNoOiAnQnJhc2lsJ30pO1xyXG4gICAqIGBgYFxyXG4gICAqIENhc28gbsOjbyBzZWphIHBhc3NhZG8gdW0gZmlsdHJvIGN1c3RvbWl6YWRvIHBhcmEgbyBtw6l0b2RvIGB1cGRhdGVEYXRhVGFibGVgIGEgdGFiZWxhIHNlcsOhIGF0dWFsaXphZGEgY29uZm9ybWUgYSBww6FnaW5hIGRvIHVsdGltbyBpdGVtIG1vZGlmaWNhZG8uXHJcbiAgICovXHJcbiAgcHVibGljIHVwZGF0ZURhdGFUYWJsZShmaWx0ZXI/OiBhbnkpIHtcclxuICAgIGNvbnN0IGluZGV4SXRlbVNlbGVjdGVkID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSB0aGlzLml0ZW1TZWxlY3RlZEFjdGlvbik7XHJcbiAgICBjb25zdCBwYWdlTnVtYmVyID0gTWF0aC5mbG9vcihpbmRleEl0ZW1TZWxlY3RlZCAvIFBBR0VfU0laRV9ERUZBVUxUKTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyIDwgMCA/IHRoaXMuY3VycmVudFBhZ2UgOiBwYWdlTnVtYmVyICsgMTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbHRlcikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoZmlsdGVyKS5zdWJzY3JpYmUoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoeyBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLCAuLi50aGlzLnBhcmFtcyB9KS5zdWJzY3JpYmUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpcm1SZW1vdmUoXHJcbiAgICBhY3Rpb25SZW1vdmU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ3JlbW92ZSddLFxyXG4gICAgYWN0aW9uQmVmb3JlUmVtb3ZlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydiZWZvcmVSZW1vdmUnXSxcclxuICAgIGl0ZW1cclxuICApIHtcclxuICAgIGNvbnN0IGNvbmZpcm1PcHRpb25zOiBQb0RpYWxvZ0NvbmZpcm1PcHRpb25zID0ge1xyXG4gICAgICB0aXRsZTogdGhpcy5saXRlcmFscy5jb25maXJtUmVtb3ZlVGl0bGUsXHJcbiAgICAgIG1lc3NhZ2U6IHRoaXMubGl0ZXJhbHMuY29uZmlybVJlbW92ZU1lc3NhZ2UsXHJcbiAgICAgIGNvbmZpcm06IHRoaXMucmVtb3ZlLmJpbmQodGhpcywgaXRlbSwgYWN0aW9uUmVtb3ZlLCBhY3Rpb25CZWZvcmVSZW1vdmUpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucG9EaWFsb2dTZXJ2aWNlLmNvbmZpcm0oY29uZmlybU9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maXJtUmVtb3ZlQWxsKFxyXG4gICAgYWN0aW9uUmVtb3ZlQWxsOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmUnXSxcclxuICAgIGFjdGlvbkJlZm9yZVJlbW92ZUFsbDogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snYmVmb3JlUmVtb3ZlJ11cclxuICApIHtcclxuICAgIGNvbnN0IGNvbmZpcm1PcHRpb25zOiBQb0RpYWxvZ0NvbmZpcm1PcHRpb25zID0ge1xyXG4gICAgICB0aXRsZTogdGhpcy5saXRlcmFscy5jb25maXJtUmVtb3ZlQWxsVGl0bGUsXHJcbiAgICAgIG1lc3NhZ2U6IHRoaXMubGl0ZXJhbHMuY29uZmlybVJlbW92ZUFsbE1lc3NhZ2UsXHJcbiAgICAgIGNvbmZpcm06IHRoaXMucmVtb3ZlQWxsLmJpbmQodGhpcywgYWN0aW9uUmVtb3ZlQWxsLCBhY3Rpb25CZWZvcmVSZW1vdmVBbGwpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucG9EaWFsb2dTZXJ2aWNlLmNvbmZpcm0oY29uZmlybU9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRVbmlxdWVLZXkoaXRlbSkge1xyXG4gICAgY29uc3Qga2V5cyA9IHV0aWwubWFwT2JqZWN0QnlQcm9wZXJ0aWVzKGl0ZW0sIHRoaXMua2V5cyk7XHJcblxyXG4gICAgcmV0dXJuIHV0aWwudmFsdWVzRnJvbU9iamVjdChrZXlzKS5qb2luKCd8Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE9yZGVyUGFyYW0oc29ydGVkQ29sdW1uOiBQb1RhYmxlQ29sdW1uU29ydCA9IHsgdHlwZTogdW5kZWZpbmVkIH0pIHtcclxuICAgIGNvbnN0IHsgY29sdW1uLCB0eXBlIH0gPSBzb3J0ZWRDb2x1bW47XHJcblxyXG4gICAgaWYgKCFjb2x1bW4pIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlID09PSBQb1RhYmxlQ29sdW1uU29ydFR5cGUuRGVzY2VuZGluZykge1xyXG4gICAgICByZXR1cm4geyBvcmRlcjogYC0ke2NvbHVtbi5wcm9wZXJ0eX1gIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgb3JkZXI6IGAke2NvbHVtbi5wcm9wZXJ0eX1gIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWREYXRhKHBhcmFtczogeyBwYWdlPzogbnVtYmVyOyBzZWFyY2g/OiBzdHJpbmcgfSA9IHt9KSB7XHJcbiAgICBpZiAoIXRoaXMuc2VydmljZUFwaSkge1xyXG4gICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHRoaXMubGl0ZXJhbHMubG9hZERhdGFFcnJvck5vdGlmaWNhdGlvbik7XHJcbiAgICAgIHJldHVybiBFTVBUWTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvcmRlclBhcmFtID0gdGhpcy5nZXRPcmRlclBhcmFtKHRoaXMuc29ydGVkQ29sdW1uKTtcclxuICAgIGNvbnN0IGRlZmF1bHRQYXJhbXM6IGFueSA9IHsgcGFnZTogMSwgcGFnZVNpemU6IFBBR0VfU0laRV9ERUZBVUxUIH07XHJcbiAgICBjb25zdCBmdWxsUGFyYW1zOiBhbnkgPSB7IC4uLmRlZmF1bHRQYXJhbXMsIC4uLnBhcmFtcywgLi4ub3JkZXJQYXJhbSB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmdldFJlc291cmNlcyhmdWxsUGFyYW1zKS5waXBlKFxyXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIGxldCBuZXdBcnJheTtcclxuICAgICAgICBpZiAoZnVsbFBhcmFtcy5wYWdlID09PSAxKSB7XHJcbiAgICAgICAgICBuZXdBcnJheSA9IHJlbW92ZUR1cGxpY2F0ZUl0ZW1zV2l0aEFycmF5S2V5KHJlc3BvbnNlLml0ZW1zLCByZXNwb25zZS5pdGVtcywgdGhpcy5rZXlzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3QXJyYXkgPSByZW1vdmVEdXBsaWNhdGVJdGVtc1dpdGhBcnJheUtleSh0aGlzLml0ZW1zLCByZXNwb25zZS5pdGVtcywgdGhpcy5rZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IG5ld0FycmF5ID8gWy4uLm5ld0FycmF5XSA6IHRoaXMuaXRlbXM7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gZnVsbFBhcmFtcy5wYWdlO1xyXG4gICAgICAgIHRoaXMuaGFzTmV4dCA9IHJlc3BvbnNlLmhhc05leHQ7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNZXRhZGF0YShcclxuICAgIHNlcnZpY2VBcGlGcm9tUm91dGU6IHN0cmluZyxcclxuICAgIG9uTG9hZDogVXJsT3JQb0N1c3RvbWl6YXRpb25GdW5jdGlvblxyXG4gICk6IE9ic2VydmFibGU8UG9QYWdlRHluYW1pY1RhYmxlTWV0YURhdGE+IHtcclxuICAgIGlmIChzZXJ2aWNlQXBpRnJvbVJvdXRlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmdldE1ldGFkYXRhPFBvUGFnZUR5bmFtaWNUYWJsZU1ldGFEYXRhPigpLnBpcGUoXHJcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIHRoaXMuYXV0b1JvdXRlciA9IHJlc3BvbnNlLmF1dG9Sb3V0ZXIgfHwgdGhpcy5hdXRvUm91dGVyO1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25zID0gcmVzcG9uc2UuYWN0aW9ucyB8fCB0aGlzLmFjdGlvbnM7XHJcbiAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSByZXNwb25zZS5icmVhZGNydW1iIHx8IHRoaXMuYnJlYWRjcnVtYjtcclxuICAgICAgICAgIHRoaXMuZmllbGRzID0gcmVzcG9uc2UuZmllbGRzIHx8IHRoaXMuZmllbGRzO1xyXG4gICAgICAgICAgdGhpcy50aXRsZSA9IHJlc3BvbnNlLnRpdGxlIHx8IHRoaXMudGl0bGU7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VDdXN0b21BY3Rpb25zID0gcmVzcG9uc2UucGFnZUN1c3RvbUFjdGlvbnMgfHwgdGhpcy5wYWdlQ3VzdG9tQWN0aW9ucztcclxuICAgICAgICAgIHRoaXMudGFibGVDdXN0b21BY3Rpb25zID0gcmVzcG9uc2UudGFibGVDdXN0b21BY3Rpb25zIHx8IHRoaXMudGFibGVDdXN0b21BY3Rpb25zO1xyXG4gICAgICAgICAgdGhpcy5rZWVwRmlsdGVycyA9IHJlc3BvbnNlLmtlZXBGaWx0ZXJzIHx8IHRoaXMua2VlcEZpbHRlcnM7XHJcbiAgICAgICAgICB0aGlzLmNvbmNhdEZpbHRlcnMgPSByZXNwb25zZS5jb25jYXRGaWx0ZXJzIHx8IHRoaXMuY29uY2F0RmlsdGVycztcclxuICAgICAgICAgIHRoaXMuaGlkZVJlbW92ZUFsbERpc2NsYWltZXIgPSByZXNwb25zZS5oaWRlUmVtb3ZlQWxsRGlzY2xhaW1lciB8fCB0aGlzLmhpZGVSZW1vdmVBbGxEaXNjbGFpbWVyO1xyXG4gICAgICAgICAgdGhpcy5oaWRlQ2xvc2VEaXNjbGFpbWVycyA9IHJlc3BvbnNlLmhpZGVDbG9zZURpc2NsYWltZXJzIHx8IHRoaXMuaGlkZUNsb3NlRGlzY2xhaW1lcnM7XHJcbiAgICAgICAgICB0aGlzLnF1aWNrU2VhcmNoV2lkdGggPSByZXNwb25zZS5xdWlja1NlYXJjaFdpZHRoIHx8IHRoaXMucXVpY2tTZWFyY2hXaWR0aDtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5sb2FkT3B0aW9uc09uSW5pdGlhbGl6ZShvbkxvYWQpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCk7XHJcbiAgfVxyXG5cclxuICAvLyBAdG9kbyBWYWxpZGFyIHJvdGFzIG5hIG3Do28gcG9pcyBzZSBleGlzdGlyIHVtYSByb3RhICcqKicgbyBjYXRjaCBkbyBuYXZpZ2F0aW9uIG7Do28gZnVuY2lvbmEuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvKFxyXG4gICAgcm91dGU6IHsgcGF0aDogc3RyaW5nOyBjb21wb25lbnQ/OyB1cmw/OiBzdHJpbmc7IHBhcmFtcz86IGFueSB9LFxyXG4gICAgZm9yY2VTdG9wQXV0b1JvdXRlcjogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcm91dGUudXJsIHx8IHJvdXRlLnBhdGhdLCB7IHF1ZXJ5UGFyYW1zOiByb3V0ZS5wYXJhbXMgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICBpZiAoZm9yY2VTdG9wQXV0b1JvdXRlciB8fCAhdGhpcy5hdXRvUm91dGVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5jb25maWcudW5zaGlmdCg8Um91dGU+e1xyXG4gICAgICAgIHBhdGg6IHJvdXRlLnBhdGgsXHJcbiAgICAgICAgY29tcG9uZW50OiByb3V0ZS5jb21wb25lbnQsXHJcbiAgICAgICAgZGF0YTogeyBzZXJ2aWNlQXBpOiB0aGlzLnNlcnZpY2VBcGksIGF1dG9Sb3V0ZXI6IHRydWUgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMubmF2aWdhdGVUbyhyb3V0ZSwgdHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ29uY2F0ZW5hdGVkVXJsKGNvbmNhdEtleXM6IGJvb2xlYW4sIHVybDogc3RyaW5nLCBzZWxlY3RlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5cyA9IHRoaXMua2V5cy5tYXAoa2V5ID0+IGVuY29kZVVSSUNvbXBvbmVudChzZWxlY3RlZEl0ZW1ba2V5XSkpLmpvaW4oKTtcclxuICAgIHJldHVybiBjb25jYXRLZXlzID8gYCR7dXJsfS8ke2tleXN9YCA6IHVybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkRldGFpbChhY3Rpb246IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2RldGFpbCddLCBpdGVtKSB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMuZm9ybWF0VW5pcXVlS2V5KGl0ZW0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5iZWZvcmVEZXRhaWwodGhpcy5hY3Rpb25zLmJlZm9yZURldGFpbCwgaWQsIGl0ZW0pXHJcbiAgICAgICAgLnN1YnNjcmliZSgoYmVmb3JlRGV0YWlsUmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVEZXRhaWwpID0+XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVEZXRhaWwoYWN0aW9uLCBiZWZvcmVEZXRhaWxSZXN1bHQsIGlkLCBpdGVtKVxyXG4gICAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4ZWN1dGVEZXRhaWwoXHJcbiAgICBhY3Rpb246IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2RldGFpbCddLFxyXG4gICAgYmVmb3JlRGV0YWlsUmVzdWx0PzogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlTmV3LFxyXG4gICAgaWQ/OiBzdHJpbmcsXHJcbiAgICBpdGVtPzogYW55XHJcbiAgKSB7XHJcbiAgICBjb25zdCBiZWZvcmUgPSBiZWZvcmVEZXRhaWxSZXN1bHQgPz8ge307XHJcbiAgICBjb25zdCBhbGxvd0FjdGlvbiA9IHR5cGVvZiBiZWZvcmUuYWxsb3dBY3Rpb24gPT09ICdib29sZWFuJyA/IGJlZm9yZS5hbGxvd0FjdGlvbiA6IHRydWU7XHJcbiAgICBjb25zdCB7IG5ld1VybCB9ID0gYmVmb3JlO1xyXG5cclxuICAgIGlmIChhbGxvd0FjdGlvbiAmJiBhY3Rpb24pIHtcclxuICAgICAgaWYgKG5ld1VybCkge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldFBhdGhGcm9tTmV3VXJsKG5ld1VybCwgaWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLnJlc29sdmVVcmwoaXRlbSwgYWN0aW9uKTtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoOiBhY3Rpb24sIHVybCwgY29tcG9uZW50OiBQb1BhZ2VEeW5hbWljRGV0YWlsQ29tcG9uZW50IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFjdGlvbihpZCwgaXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGF0aEZyb21OZXdVcmwobmV3VXJsOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKG5ld1VybC5pbmNsdWRlcygnOmlkJykpIHtcclxuICAgICAgcmV0dXJuIG5ld1VybC5yZXBsYWNlKC86aWQvZywgaWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1VybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkR1cGxpY2F0ZShhY3Rpb25EdXBsaWNhdGU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2R1cGxpY2F0ZSddLCBpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSk7XHJcbiAgICBjb25zdCBkdXBsaWNhdGVzID0gdXRpbC5yZW1vdmVLZXlzUHJvcGVydGllcyh0aGlzLmtleXMsIHV0aWwubWFwT2JqZWN0QnlQcm9wZXJ0aWVzKGl0ZW0sIHRoaXMuZHVwbGljYXRlcykpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXHJcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2VcclxuICAgICAgICAuYmVmb3JlRHVwbGljYXRlKHRoaXMuYWN0aW9ucy5iZWZvcmVEdXBsaWNhdGUsIGlkLCBkdXBsaWNhdGVzKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGJlZm9yZUR1cGxpY2F0ZVJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRHVwbGljYXRlKSA9PlxyXG4gICAgICAgICAgdGhpcy5leGVjdXRlRHVwbGljYXRlKGFjdGlvbkR1cGxpY2F0ZSwgYmVmb3JlRHVwbGljYXRlUmVzdWx0LCBkdXBsaWNhdGVzKVxyXG4gICAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4ZWN1dGVEdXBsaWNhdGUoXHJcbiAgICBhY3Rpb25EdXBsaWNhdGU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2R1cGxpY2F0ZSddLFxyXG4gICAgYmVmb3JlRHVwbGljYXRlUmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVEdXBsaWNhdGUsXHJcbiAgICBkdXBsaWNhdGVzOiBhbnlcclxuICApIHtcclxuICAgIGNvbnN0IGJlZm9yZSA9IGJlZm9yZUR1cGxpY2F0ZVJlc3VsdCA/PyB7fTtcclxuICAgIGNvbnN0IGFsbG93QWN0aW9uID0gdHlwZW9mIGJlZm9yZS5hbGxvd0FjdGlvbiA9PT0gJ2Jvb2xlYW4nID8gYmVmb3JlLmFsbG93QWN0aW9uIDogdHJ1ZTtcclxuICAgIGNvbnN0IGJlZm9yZUR1cGxpY2F0ZVJlc291cmNlID0gYmVmb3JlLnJlc291cmNlO1xyXG4gICAgY29uc3QgbmV3QWN0aW9uID0gYmVmb3JlLm5ld1VybCA/PyBhY3Rpb25EdXBsaWNhdGU7XHJcblxyXG4gICAgaWYgKGFsbG93QWN0aW9uICYmIGFjdGlvbkR1cGxpY2F0ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIGJlZm9yZUR1cGxpY2F0ZVJlc291cmNlID09PSAnb2JqZWN0JyAmJiBiZWZvcmVEdXBsaWNhdGVSZXNvdXJjZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGR1cGxpY2F0ZXMgPSB1dGlsLnJlbW92ZUtleXNQcm9wZXJ0aWVzKHRoaXMua2V5cywgYmVmb3JlRHVwbGljYXRlUmVzb3VyY2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIG5ld0FjdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogbmV3QWN0aW9uLCBwYXJhbXM6IHsgZHVwbGljYXRlOiBKU09OLnN0cmluZ2lmeShkdXBsaWNhdGVzKSB9IH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbmV3QWN0aW9uKGR1cGxpY2F0ZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuRWRpdChhY3Rpb25FZGl0OiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydlZGl0J10sIGl0ZW0pIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5iZWZvcmVFZGl0KHRoaXMuYWN0aW9ucy5iZWZvcmVFZGl0LCBpZCwgaXRlbSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHN3aXRjaE1hcCgoYmVmb3JlRWRpdFJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRWRpdCkgPT5cclxuICAgICAgICAgICAgdGhpcy5leGVjdXRlRWRpdEFjdGlvbihhY3Rpb25FZGl0LCBiZWZvcmVFZGl0UmVzdWx0LCBpdGVtLCBpZClcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlRWRpdEFjdGlvbihcclxuICAgIGFjdGlvbjogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snZWRpdCddLFxyXG4gICAgYmVmb3JlRWRpdFJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRWRpdCxcclxuICAgIGl0ZW06IGFueSxcclxuICAgIGlkOiBzdHJpbmdcclxuICApIHtcclxuICAgIGNvbnN0IG5ld0VkaXRBY3Rpb24gPSBiZWZvcmVFZGl0UmVzdWx0Py5uZXdVcmwgPz8gYWN0aW9uO1xyXG4gICAgY29uc3QgYWxsb3dBY3Rpb24gPSBiZWZvcmVFZGl0UmVzdWx0Py5hbGxvd0FjdGlvbiA/PyB0cnVlO1xyXG5cclxuICAgIGlmICghYWxsb3dBY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgbmV3RWRpdEFjdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5vcGVuRWRpdFVybChuZXdFZGl0QWN0aW9uLCBpdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0gbmV3RWRpdEFjdGlvbihpZCwgaXRlbSk7XHJcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEl0ZW0gPT09ICdvYmplY3QnICYmIHVwZGF0ZWRJdGVtICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlVSVRhYmxlSXRlbShpdGVtLCB1dGlsLnJlbW92ZUtleXNQcm9wZXJ0aWVzKHRoaXMua2V5cywgdXBkYXRlZEl0ZW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBFTVBUWTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkVkaXRVcmwocGF0aDogc3RyaW5nLCBpdGVtKSB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJlc29sdmVVcmwoaXRlbSwgcGF0aCk7XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aCwgdXJsIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb2RpZnlVSVRhYmxlSXRlbShjdXJyZW50SXRlbSwgbmV3SXRlbVZhbHVlKSB7XHJcbiAgICBjb25zdCB0YWJsZUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPT09IGN1cnJlbnRJdGVtKTtcclxuICAgIHRoaXMuaXRlbXNbdGFibGVJdGVtXSA9IHsgLi4uY3VycmVudEl0ZW0sIC4uLm5ld0l0ZW1WYWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuTmV3KGFjdGlvbk5ldzogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snbmV3J10pIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXHJcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2VcclxuICAgICAgICAuYmVmb3JlTmV3KHRoaXMuYWN0aW9ucy5iZWZvcmVOZXcpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoYmVmb3JlTmV3UmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVOZXcpID0+IHRoaXMuZXhlY3V0ZU5ldyhhY3Rpb25OZXcsIGJlZm9yZU5ld1Jlc3VsdCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlTmV3KGFjdGlvbk5ldzogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snbmV3J10sIGJlZm9yZU5ld1Jlc3VsdD86IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZU5ldykge1xyXG4gICAgY29uc3QgYmVmb3JlID0gYmVmb3JlTmV3UmVzdWx0ID8/IHt9O1xyXG4gICAgY29uc3QgYWxsb3dBY3Rpb24gPSB0eXBlb2YgYmVmb3JlLmFsbG93QWN0aW9uID09PSAnYm9vbGVhbicgPyBiZWZvcmUuYWxsb3dBY3Rpb24gOiB0cnVlO1xyXG4gICAgY29uc3QgeyBuZXdVcmwgfSA9IGJlZm9yZTtcclxuXHJcbiAgICBpZiAoYWxsb3dBY3Rpb24gJiYgYWN0aW9uTmV3KSB7XHJcbiAgICAgIGlmIChuZXdVcmwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogbmV3VXJsIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbk5ldyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogYWN0aW9uTmV3IH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYWN0aW9uTmV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYXNvIGV4aXN0YSBtYWlzIGRlIHVtIGlkZW50aWZpY2Fkb3IsIHNlcsOhIGNvbmNhdGVuYWRvIGNvbSAnfCcuXHJcbiAgICpcclxuICAgKiBFeDogeyBpZDogMSwgY29tcGFueTogJ3BvJyB9XHJcbiAgICpcclxuICAgKiBQYXJhIG8gZW5kcG9pbnQgL3Jlc291cmNlcy86aWQgc2Vyw6EgZXhlY3V0YWRhIGEgdXJsIC9yZXNvdXJjZXMvMXxwb1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlKFxyXG4gICAgaXRlbSxcclxuICAgIGFjdGlvblJlbW92ZTogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1sncmVtb3ZlJ10sXHJcbiAgICBhY3Rpb25CZWZvcmVSZW1vdmU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2JlZm9yZVJlbW92ZSddXHJcbiAgKSB7XHJcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxyXG4gICAgICB0aGlzLnBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlXHJcbiAgICAgICAgLmJlZm9yZVJlbW92ZShhY3Rpb25CZWZvcmVSZW1vdmUsIHVuaXF1ZUtleSwgaXRlbSlcclxuICAgICAgICAucGlwZShzd2l0Y2hNYXAoYmVmb3JlUmVtb3ZlID0+IHRoaXMuZGVsZXRlQWN0aW9uKGl0ZW0sIGFjdGlvblJlbW92ZSwgYmVmb3JlUmVtb3ZlKSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGVBY3Rpb24oXHJcbiAgICBpdGVtLFxyXG4gICAgYWN0aW9uUmVtb3ZlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmUnXSxcclxuICAgIGJlZm9yZVJlbW92ZTogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlUmVtb3ZlXHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHsgYWxsb3dBY3Rpb24sIG5ld1VybCB9ID0gYmVmb3JlUmVtb3ZlIHx8IHt9O1xyXG4gICAgY29uc3QgYWxsb3cgPSBhbGxvd0FjdGlvbiA/PyB0cnVlO1xyXG5cclxuICAgIGlmIChhbGxvdykge1xyXG4gICAgICBsZXQgdW5pcXVlS2V5ID0gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSk7XHJcbiAgICAgIGNvbnN0IHJlc291cmNlVG9SZW1vdmVLZXkgPSB0aGlzLnJldHVyblJlc291cmNlc0tleXMoW2l0ZW1dKTtcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgYWN0aW9uUmVtb3ZlID09PSAnYm9vbGVhbicgfHwgbmV3VXJsKSB7XHJcbiAgICAgICAgdW5pcXVlS2V5ID0gbmV3VXJsID8gdW5kZWZpbmVkIDogdW5pcXVlS2V5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlXHJcbiAgICAgICAgICAuZGVsZXRlUmVzb3VyY2UodW5pcXVlS2V5LCBuZXdVcmwpXHJcbiAgICAgICAgICAucGlwZShtYXAoKCkgPT4gdGhpcy5yZW1vdmVGcm9tVUkocmVzb3VyY2VUb1JlbW92ZUtleSwgdGhpcy5saXRlcmFscy5yZW1vdmVTdWNjZXNzTm90aWZpY2F0aW9uKSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gb2YoYWN0aW9uUmVtb3ZlKHVuaXF1ZUtleSwgaXRlbSkpLnBpcGUoXHJcbiAgICAgICAgdGFwKHJlbW92ZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVJdGVtID0gcmVtb3ZlID8/IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVGcm9tVUkocmVzb3VyY2VUb1JlbW92ZUtleSwgdGhpcy5saXRlcmFscy5yZW1vdmVTdWNjZXNzTm90aWZpY2F0aW9uLCByZW1vdmVJdGVtKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvZih7fSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUZyb21VSShpdGVtczogQXJyYXk8YW55PiwgbWVzc2FnZTogc3RyaW5nLCByZW1vdmUgPSB0cnVlKSB7XHJcbiAgICBpZiAocmVtb3ZlID09PSB0cnVlICYmIGl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5yZW1vdmVMb2NhbEl0ZW1zKGl0ZW1zKTtcclxuICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5zdWNjZXNzKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVBbGwoXHJcbiAgICBhY3Rpb25SZW1vdmVBbGw6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ3JlbW92ZUFsbCddLFxyXG4gICAgYWN0aW9uQmVmb3JlUmVtb3ZlQWxsOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydiZWZvcmVSZW1vdmVBbGwnXVxyXG4gICkge1xyXG4gICAgY29uc3Qgb3JpZ2luYWxSZXNvdXJjZXNLZXlzID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zS2V5cygpO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5iZWZvcmVSZW1vdmVBbGwoYWN0aW9uQmVmb3JlUmVtb3ZlQWxsLCBvcmlnaW5hbFJlc291cmNlc0tleXMpXHJcbiAgICAgICAgLnBpcGUoc3dpdGNoTWFwKGJlZm9yZVJlbW92ZSA9PiB0aGlzLmRlbGV0ZUFsbEFjdGlvbihhY3Rpb25SZW1vdmVBbGwsIGJlZm9yZVJlbW92ZSwgb3JpZ2luYWxSZXNvdXJjZXNLZXlzKSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEl0ZW1zS2V5cygpIHtcclxuICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS4kc2VsZWN0ZWQpO1xyXG5cclxuICAgIGlmIChyZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJldHVyblJlc291cmNlc0tleXMocmVzb3VyY2VzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmV0dXJuUmVzb3VyY2VzS2V5cyhyZXNvdXJjZXMpIHtcclxuICAgIHJldHVybiB1dGlsLm1hcEFycmF5QnlQcm9wZXJ0aWVzKHJlc291cmNlcywgdGhpcy5rZXlzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlQWxsQWN0aW9uKFxyXG4gICAgYWN0aW9uUmVtb3ZlQWxsOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmVBbGwnXSxcclxuICAgIGJlZm9yZVJlbW92ZUFsbDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlUmVtb3ZlQWxsLFxyXG4gICAgb3JpZ2luYWxSZXNvdXJjZXM6IEFycmF5PGFueT5cclxuICApIHtcclxuICAgIGNvbnN0IHsgYWxsb3dBY3Rpb24sIG5ld1VybCwgcmVzb3VyY2VzIH0gPSBiZWZvcmVSZW1vdmVBbGwgPz8ge307XHJcbiAgICBjb25zdCBhbGxvdyA9IGFsbG93QWN0aW9uID8/IHRydWU7XHJcbiAgICBjb25zdCByZXNvdXJjZXN0b0RlbGV0ZSA9IHJlc291cmNlcyA/PyBvcmlnaW5hbFJlc291cmNlcztcclxuXHJcbiAgICBpZiAoYWxsb3cgJiYgQXJyYXkuaXNBcnJheShyZXNvdXJjZXN0b0RlbGV0ZSkpIHtcclxuICAgICAgaWYgKHR5cGVvZiBhY3Rpb25SZW1vdmVBbGwgPT09ICdib29sZWFuJyB8fCBuZXdVcmwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb1BhZ2VEeW5hbWljU2VydmljZS5kZWxldGVSZXNvdXJjZXMocmVzb3VyY2VzdG9EZWxldGUsIG5ld1VybCkucGlwZShcclxuICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVVJKHJlc291cmNlc3RvRGVsZXRlLCB0aGlzLmxpdGVyYWxzLnJlbW92ZUFsbFN1Y2Nlc3NOb3RpZmljYXRpb24pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvZihhY3Rpb25SZW1vdmVBbGwocmVzb3VyY2VzdG9EZWxldGUpKS5waXBlKFxyXG4gICAgICAgIHRhcChyZW1vdmVJdGVtcyA9PiB0aGlzLnJlbW92ZUZyb21VSShyZW1vdmVJdGVtcywgdGhpcy5saXRlcmFscy5yZW1vdmVTdWNjZXNzTm90aWZpY2F0aW9uKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2Yoe30pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVMb2NhbEl0ZW1zKGl0ZW1zS2V5c1RvUmVtb3ZlID0gW10pIHtcclxuICAgIGlmIChpdGVtc0tleXNUb1JlbW92ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1LZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcclxuICAgICAgICByZXR1cm4gIWl0ZW1zS2V5c1RvUmVtb3ZlLmZpbmQoaXRlbUtleVRvUmVtb3ZlID0+IHV0aWwudmFsdWVzRnJvbU9iamVjdChpdGVtS2V5VG9SZW1vdmUpLmpvaW4oJ3wnKSA9PT0gaXRlbUtleSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNvbHZlVXJsKGl0ZW06IGFueSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcclxuXHJcbiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC86aWQvZywgdW5pcXVlS2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UGFnZUFjdGlvbnMoYWN0aW9uczogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucykge1xyXG4gICAgaWYgKGFjdGlvbnM/Lm5ldykge1xyXG4gICAgICB0aGlzLmRlZmF1bHRQYWdlQWN0aW9ucyA9IFt7IGxhYmVsOiB0aGlzLmxpdGVyYWxzLnBhZ2VBY3Rpb24sIGFjdGlvbjogdGhpcy5vcGVuTmV3LmJpbmQodGhpcywgYWN0aW9ucy5uZXcpIH1dO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1DdXN0b21BY3Rpb25zVG9QYWdlTGlzdEFjdGlvbihcclxuICAgIGN1c3RvbUFjdGlvbnM6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbUFjdGlvbj5cclxuICApOiBBcnJheTxQb1BhZ2VBY3Rpb24+IHtcclxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXHJcbiAgICByZXR1cm4gY3VzdG9tQWN0aW9ucy5tYXAoY3VzdG9tQWN0aW9uID0+ICh7XHJcbiAgICAgIGxhYmVsOiBjdXN0b21BY3Rpb24ubGFiZWwsXHJcbiAgICAgIGFjdGlvbjogdGhpcy5jYWxsUGFnZUN1c3RvbUFjdGlvbi5iaW5kKHRoaXMsIGN1c3RvbUFjdGlvbiksXHJcbiAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGlzYWJsZVBhZ2VDdXN0b21BY3Rpb24uYmluZCh0aGlzLCBjdXN0b21BY3Rpb24pLFxyXG4gICAgICAuLi4oY3VzdG9tQWN0aW9uLmljb24gJiYgeyBpY29uOiBjdXN0b21BY3Rpb24uaWNvbiB9KSxcclxuICAgICAgdmlzaWJsZTogY3VzdG9tQWN0aW9uLnZpc2libGVcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNmb3JtVGFibGVDdXN0b21BY3Rpb25zVG9UYWJsZUFjdGlvbnMoXHJcbiAgICB0YWJsZUN1c3RvbUFjdGlvbnM6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbVRhYmxlQWN0aW9uPlxyXG4gICk6IEFycmF5PFBvVGFibGVBY3Rpb24+IHtcclxuICAgIHJldHVybiB0YWJsZUN1c3RvbUFjdGlvbnMubWFwKHRhYmxlQ3VzdG9tQWN0aW9uID0+ICh7XHJcbiAgICAgIGxhYmVsOiB0YWJsZUN1c3RvbUFjdGlvbi5sYWJlbCxcclxuICAgICAgaWNvbjogdGFibGVDdXN0b21BY3Rpb24uaWNvbixcclxuICAgICAgYWN0aW9uOiB0aGlzLmNhbGxUYWJsZUN1c3RvbUFjdGlvbi5iaW5kKHRoaXMsIHRhYmxlQ3VzdG9tQWN0aW9uKSxcclxuICAgICAgZGlzYWJsZWQ6IHRhYmxlQ3VzdG9tQWN0aW9uLmRpc2FibGVkLFxyXG4gICAgICB2aXNpYmxlOiB0YWJsZUN1c3RvbUFjdGlvbi52aXNpYmxlXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRGlzYWJsZVBhZ2VDdXN0b21BY3Rpb24oY3VzdG9tQWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY3VzdG9tQWN0aW9uLnNlbGVjdGFibGUgJiYgIXRoaXMuZ2V0U2VsZWN0ZWRJdGVtc0tleXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsbFBhZ2VDdXN0b21BY3Rpb24oY3VzdG9tQWN0aW9uOiBQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21BY3Rpb24pIHtcclxuICAgIGlmIChjdXN0b21BY3Rpb24uYWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBjdXN0b21BY3Rpb24uc2VsZWN0YWJsZSA/IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtc0tleXMoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IHNlbmRDdXN0b21BY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlXHJcbiAgICAgICAgLmN1c3RvbUFjdGlvbihjdXN0b21BY3Rpb24uYWN0aW9uLCBzZWxlY3RlZEl0ZW1zKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc2VuZEN1c3RvbUFjdGlvblN1YnNjcmlwdGlvbik7XHJcbiAgICB9IGVsc2UgaWYgKGN1c3RvbUFjdGlvbi51cmwpIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogY3VzdG9tQWN0aW9uLnVybCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsbFRhYmxlQ3VzdG9tQWN0aW9uKGN1c3RvbUFjdGlvbjogUG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24sIHNlbGVjdGVkSXRlbSkge1xyXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWRBY3Rpb24gPSBzZWxlY3RlZEl0ZW07XHJcbiAgICBpZiAoY3VzdG9tQWN0aW9uLmFjdGlvbikge1xyXG4gICAgICBjb25zdCBzZW5kQ3VzdG9tQWN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxyXG4gICAgICAgIC5jdXN0b21BY3Rpb24oY3VzdG9tQWN0aW9uLmFjdGlvbiwgc2VsZWN0ZWRJdGVtKVxyXG4gICAgICAgIC5zdWJzY3JpYmUodXBkYXRlZEl0ZW0gPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB1cGRhdGVkSXRlbSA9PT0gJ29iamVjdCcgJiYgdXBkYXRlZEl0ZW0gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RpZnlVSVRhYmxlSXRlbShzZWxlY3RlZEl0ZW0sIHV0aWwucmVtb3ZlS2V5c1Byb3BlcnRpZXModGhpcy5rZXlzLCB1cGRhdGVkSXRlbSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzZW5kQ3VzdG9tQWN0aW9uU3Vic2NyaXB0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAoY3VzdG9tQWN0aW9uLnVybCkge1xyXG4gICAgICBpZiAoaXNFeHRlcm5hbExpbmsoY3VzdG9tQWN0aW9uLnVybCkpIHtcclxuICAgICAgICBvcGVuRXh0ZXJuYWxMaW5rKHRoaXMuY3JlYXRlQ29uY2F0ZW5hdGVkVXJsKGN1c3RvbUFjdGlvbi5jb25jYXRLZXlzLCBjdXN0b21BY3Rpb24udXJsLCBzZWxlY3RlZEl0ZW0pKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlVG8oe1xyXG4gICAgICAgICAgcGF0aDogdGhpcy5jcmVhdGVDb25jYXRlbmF0ZWRVcmwoY3VzdG9tQWN0aW9uLmNvbmNhdEtleXMsIGN1c3RvbUFjdGlvbi51cmwsIHNlbGVjdGVkSXRlbSlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRSZW1vdmVBbGxBY3Rpb24oKSB7XHJcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl9hY3Rpb25zO1xyXG4gICAgaWYgKHRoaXMuc2hvd1JlbW92ZShhY3Rpb24ucmVtb3ZlQWxsKSkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRQYWdlQWN0aW9ucyA9IFtcclxuICAgICAgICAuLi50aGlzLl9kZWZhdWx0UGFnZUFjdGlvbnMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMucGFnZUFjdGlvblJlbW92ZUFsbCxcclxuICAgICAgICAgIGFjdGlvbjogdGhpcy5jb25maXJtUmVtb3ZlQWxsLmJpbmQodGhpcywgYWN0aW9uLnJlbW92ZUFsbCwgYWN0aW9uLmJlZm9yZVJlbW92ZUFsbCksXHJcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlUmVtb3ZlQWxsLmJpbmQodGhpcylcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc2FibGVSZW1vdmVBbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuZ2V0U2VsZWN0ZWRJdGVtc0tleXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGFibGVBY3Rpb25zKGFjdGlvbnM6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnMpIHtcclxuICAgIGlmIChhY3Rpb25zKSB7XHJcbiAgICAgIGNvbnN0IHZpc2libGVSZW1vdmUgPSB0aGlzLnNob3dSZW1vdmUoYWN0aW9ucy5yZW1vdmUpO1xyXG4gICAgICB0aGlzLmRlZmF1bHRUYWJsZUFjdGlvbnMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYWN0aW9uOiB0aGlzLm9wZW5EZXRhaWwuYmluZCh0aGlzLCBhY3Rpb25zLmRldGFpbCksXHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5saXRlcmFscy50YWJsZUFjdGlvblZpZXcsXHJcbiAgICAgICAgICB2aXNpYmxlOiAhIXRoaXMuX2FjdGlvbnMuZGV0YWlsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBhY3Rpb246IHRoaXMub3BlbkVkaXQuYmluZCh0aGlzLCBhY3Rpb25zLmVkaXQpLFxyXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMudGFibGVBY3Rpb25FZGl0LFxyXG4gICAgICAgICAgdmlzaWJsZTogISF0aGlzLl9hY3Rpb25zLmVkaXRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGFjdGlvbjogdGhpcy5vcGVuRHVwbGljYXRlLmJpbmQodGhpcywgYWN0aW9ucy5kdXBsaWNhdGUpLFxyXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMudGFibGVBY3Rpb25EdXBsaWNhdGUsXHJcbiAgICAgICAgICB2aXNpYmxlOiAhIXRoaXMuX2FjdGlvbnMuZHVwbGljYXRlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBhY3Rpb246IHRoaXMuY29uZmlybVJlbW92ZS5iaW5kKHRoaXMsIGFjdGlvbnMucmVtb3ZlLCBhY3Rpb25zLmJlZm9yZVJlbW92ZSksXHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5saXRlcmFscy50YWJsZUFjdGlvbkRlbGV0ZSxcclxuICAgICAgICAgIHNlcGFyYXRvcjogdHJ1ZSxcclxuICAgICAgICAgIHR5cGU6ICdkYW5nZXInLFxyXG4gICAgICAgICAgdmlzaWJsZTogdmlzaWJsZVJlbW92ZVxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERhdGFGcm9tQVBJKCkge1xyXG4gICAgY29uc3QgeyBzZXJ2aWNlQXBpOiBzZXJ2aWNlQXBpRnJvbVJvdXRlLCBzZXJ2aWNlTWV0YWRhdGFBcGksIHNlcnZpY2VMb2FkQXBpIH0gPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGE7XHJcblxyXG4gICAgY29uc3Qgb25Mb2FkID0gc2VydmljZUxvYWRBcGkgfHwgdGhpcy5vbkxvYWQ7XHJcbiAgICB0aGlzLnNlcnZpY2VBcGkgPSBzZXJ2aWNlQXBpRnJvbVJvdXRlIHx8IHRoaXMuc2VydmljZUFwaTtcclxuXHJcbiAgICB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmNvbmZpZ1NlcnZpY2VBcGkoeyBlbmRwb2ludDogdGhpcy5zZXJ2aWNlQXBpLCBtZXRhZGF0YTogc2VydmljZU1ldGFkYXRhQXBpIH0pO1xyXG5cclxuICAgIGNvbnN0IG1ldGFkYXRhJCA9IHRoaXMuZ2V0TWV0YWRhdGEoc2VydmljZUFwaUZyb21Sb3V0ZSwgb25Mb2FkKTtcclxuICAgIGxldCBkYXRhJDtcclxuICAgIGlmICh0aGlzLnF1aWNrU2VhcmNoVmFsdWUpIHtcclxuICAgICAgY29uc3QgcGFyYW1zUXVpY2tTZWFyY2hWYWx1ZSA9IHsgW3RoaXMucXVpY2tTZWFyY2hQYXJhbV06IHRoaXMucXVpY2tTZWFyY2hWYWx1ZSB9O1xyXG4gICAgICBkYXRhJCA9IHRoaXMubG9hZERhdGEocGFyYW1zUXVpY2tTZWFyY2hWYWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRhJCA9IHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxyXG4gICAgICBtZXRhZGF0YSRcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxGaWx0ZXJzID0gdGhpcy5nZXRJbml0aWFsVmFsdWVzRnJvbUZpbHRlcigpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhpbml0aWFsRmlsdGVycykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEluaXRpYWxWYWx1ZXNGcm9tRmlsdGVyKCkge1xyXG4gICAgY29uc3QgaW5pdGlhbEZpbHRlcnMgPSB0aGlzLmZpbHRlcnMucmVkdWNlKFxyXG4gICAgICAocmVzdWx0LCBpdGVtKSA9PiBPYmplY3QuYXNzaWduKHJlc3VsdCwgeyBbaXRlbS5wcm9wZXJ0eV06IGl0ZW0uaW5pdFZhbHVlIH0pLFxyXG4gICAgICB7fVxyXG4gICAgKTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyhpbml0aWFsRmlsdGVycykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAoIWluaXRpYWxGaWx0ZXJzW2tleV0pIHtcclxuICAgICAgICBkZWxldGUgaW5pdGlhbEZpbHRlcnNba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGluaXRpYWxGaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkT3B0aW9uc09uSW5pdGlhbGl6ZShvbkxvYWQ6IFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24pIHtcclxuICAgIGlmIChvbkxvYWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9EeW5hbWljUGFnZU9wdGlvbnMob25Mb2FkKS5waXBlKFxyXG4gICAgICAgIHRhcChyZXNwb25zZVBvT3B0aW9uID0+XHJcbiAgICAgICAgICB0aGlzLnBvUGFnZUN1c3RvbWl6YXRpb25TZXJ2aWNlLmNoYW5nZU9yaWdpbmFsT3B0aW9uc1RvTmV3T3B0aW9ucyh0aGlzLCByZXNwb25zZVBvT3B0aW9uKVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBvRHluYW1pY1BhZ2VPcHRpb25zKG9uTG9hZDogVXJsT3JQb0N1c3RvbWl6YXRpb25GdW5jdGlvbik6IE9ic2VydmFibGU8UG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucz4ge1xyXG4gICAgY29uc3Qgb3JpZ2luYWxPcHRpb246IFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnMgPSB7XHJcbiAgICAgIGZpZWxkczogdGhpcy5maWVsZHMsXHJcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucyxcclxuICAgICAgYnJlYWRjcnVtYjogdGhpcy5icmVhZGNydW1iLFxyXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcclxuICAgICAga2VlcEZpbHRlcnM6IHRoaXMua2VlcEZpbHRlcnMsXHJcbiAgICAgIGNvbmNhdEZpbHRlcnM6IHRoaXMuY29uY2F0RmlsdGVycyxcclxuICAgICAgaGlkZVJlbW92ZUFsbERpc2NsYWltZXI6IHRoaXMuaGlkZVJlbW92ZUFsbERpc2NsYWltZXIsXHJcbiAgICAgIGhpZGVDbG9zZURpc2NsYWltZXJzOiB0aGlzLmhpZGVDbG9zZURpc2NsYWltZXJzLFxyXG4gICAgICBwYWdlQ3VzdG9tQWN0aW9uczogdGhpcy5wYWdlQ3VzdG9tQWN0aW9ucyxcclxuICAgICAgdGFibGVDdXN0b21BY3Rpb25zOiB0aGlzLnRhYmxlQ3VzdG9tQWN0aW9ucyxcclxuICAgICAgcXVpY2tTZWFyY2hXaWR0aDogdGhpcy5xdWlja1NlYXJjaFdpZHRoXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHBhZ2VPcHRpb25TY2hlbWE6IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hPFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnM+ID0ge1xyXG4gICAgICBzY2hlbWE6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ2ZpZWxkcycsXHJcbiAgICAgICAgICBtZXJnZTogdHJ1ZSxcclxuICAgICAgICAgIGtleUZvck1lcmdlOiAncHJvcGVydHknXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ2FjdGlvbnMnLFxyXG4gICAgICAgICAgbWVyZ2U6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAnYnJlYWRjcnVtYidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAndGl0bGUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ2tlZXBGaWx0ZXJzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZVByb3A6ICdxdWlja1NlYXJjaFdpZHRoJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZVByb3A6ICdjb25jYXRGaWx0ZXJzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZVByb3A6ICdoaWRlUmVtb3ZlQWxsRGlzY2xhaW1lcidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAnaGlkZUNsb3NlRGlzY2xhaW1lcnMnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lUHJvcDogJ3BhZ2VDdXN0b21BY3Rpb25zJyxcclxuICAgICAgICAgIG1lcmdlOiB0cnVlLFxyXG4gICAgICAgICAga2V5Rm9yTWVyZ2U6ICdsYWJlbCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWVQcm9wOiAndGFibGVDdXN0b21BY3Rpb25zJyxcclxuICAgICAgICAgIG1lcmdlOiB0cnVlLFxyXG4gICAgICAgICAga2V5Rm9yTWVyZ2U6ICdsYWJlbCdcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UuZ2V0Q3VzdG9tT3B0aW9ucyhvbkxvYWQsIG9yaWdpbmFsT3B0aW9uLCBwYWdlT3B0aW9uU2NoZW1hKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd1JlbW92ZTxUPihhY3Rpb25SZW1vdmU6IFQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvblJlbW92ZSA/PyBmYWxzZTtcclxuICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIGFjdGlvbjtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJWYWx1ZShmaWx0ZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkcy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIGlmIChmaWx0ZXIuaGFzT3duUHJvcGVydHkoaXRlbS5wcm9wZXJ0eSkpIHtcclxuICAgICAgICBpdGVtLmluaXRWYWx1ZSA9IGZpbHRlcltpdGVtLnByb3BlcnR5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhZ2VBY3Rpb25zKCkge1xyXG4gICAgdGhpcy5wYWdlQWN0aW9ucyA9IFsuLi50aGlzLl9kZWZhdWx0UGFnZUFjdGlvbnMsIC4uLnRoaXMuX2N1c3RvbVBhZ2VMaXN0QWN0aW9uc107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRhYmxlQWN0aW9ucygpIHtcclxuICAgIGNvbnN0IGRlZmF1bHRUYWJsZUFjdGlvbnNXaXRob3V0QWN0aW9uRGVsZXRlID0gdGhpcy5fZGVmYXVsdFRhYmxlQWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgIHRhYmxlQWN0aW9uID0+IHRhYmxlQWN0aW9uLmxhYmVsICE9PSB0aGlzLmxpdGVyYWxzLnRhYmxlQWN0aW9uRGVsZXRlXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGVsZXRlID0gdGhpcy5fZGVmYXVsdFRhYmxlQWN0aW9ucy5maW5kKFxyXG4gICAgICB0YWJsZUFjdGlvbiA9PiB0YWJsZUFjdGlvbi5sYWJlbCA9PT0gdGhpcy5saXRlcmFscy50YWJsZUFjdGlvbkRlbGV0ZVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBuZXdUYWJsZUFjdGlvbnMgPSBbLi4uZGVmYXVsdFRhYmxlQWN0aW9uc1dpdGhvdXRBY3Rpb25EZWxldGUsIC4uLnRoaXMuX2N1c3RvbVRhYmxlQWN0aW9uc107XHJcblxyXG4gICAgaWYgKHRhYmxlQWN0aW9uRGVsZXRlKSB7XHJcbiAgICAgIG5ld1RhYmxlQWN0aW9ucy5wdXNoKHRhYmxlQWN0aW9uRGVsZXRlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IG5ld1RhYmxlQWN0aW9ucztcclxuICB9XHJcbn1cclxuIiwiPHBvLXBhZ2UtZHluYW1pYy1zZWFyY2hcclxuICBbcC1hY3Rpb25zXT1cInBhZ2VBY3Rpb25zXCJcclxuICBbcC1icmVhZGNydW1iXT1cImJyZWFkY3J1bWJcIlxyXG4gIFtwLWhpZGUtY2xvc2UtZGlzY2xhaW1lcnNdPVwiaGlkZUNsb3NlRGlzY2xhaW1lcnNcIlxyXG4gIFtwLWZpbHRlcnNdPVwiZmlsdGVyc1wiXHJcbiAgW3Ata2VlcC1maWx0ZXJzXT1cImtlZXBGaWx0ZXJzXCJcclxuICBbcC1saXRlcmFsc109XCJzZWFyY2hMaXRlcmFsc1wiXHJcbiAgW3AtY29uY2F0LWZpbHRlcnNdPVwiY29uY2F0RmlsdGVyc1wiXHJcbiAgW3AtaGlkZS1yZW1vdmUtYWxsLWRpc2NsYWltZXJdPVwiaGlkZVJlbW92ZUFsbERpc2NsYWltZXJcIlxyXG4gIFtwLXF1aWNrLXNlYXJjaC13aWR0aF09XCJxdWlja1NlYXJjaFdpZHRoXCJcclxuICBbcC10aXRsZV09XCJ0aXRsZVwiXHJcbiAgKHAtYWR2YW5jZWQtc2VhcmNoKT1cIm9uQWR2YW5jZWRTZWFyY2goJGV2ZW50KVwiXHJcbiAgKHAtY2hhbmdlLWRpc2NsYWltZXJzKT1cIm9uQ2hhbmdlRGlzY2xhaW1lcnMoJGV2ZW50KVwiXHJcbiAgKHAtcXVpY2stc2VhcmNoKT1cIm9uUXVpY2tTZWFyY2goJGV2ZW50KVwiXHJcbiAgW3AtcXVpY2stc2VhcmNoLXZhbHVlXT1cInF1aWNrU2VhcmNoVmFsdWUgfHwgJydcIlxyXG4+XHJcbiAgPHBvLXRhYmxlXHJcbiAgICBbcC1zb3J0XT1cInRydWVcIlxyXG4gICAgW3AtYWN0aW9uc109XCJ0YWJsZUFjdGlvbnNcIlxyXG4gICAgW3AtYWN0aW9ucy1yaWdodF09XCJhY3Rpb25SaWdodFwiXHJcbiAgICBbcC1zZWxlY3RhYmxlXT1cImVuYWJsZVNlbGVjdGlvblRhYmxlXCJcclxuICAgIFtwLWNvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICBbcC1pdGVtc109XCJpdGVtc1wiXHJcbiAgICBbcC1oZWlnaHRdPVwiaGVpZ2h0XCJcclxuICAgIFtwLWhpZGUtYmF0Y2gtYWN0aW9uc109XCJ0cnVlXCJcclxuICAgIFtwLWluZmluaXRlLXNjcm9sbF09XCJpbmZpbml0ZVNjcm9sbFwiXHJcbiAgICBbcC1zaG93LW1vcmUtZGlzYWJsZWRdPVwiIWhhc05leHRcIlxyXG4gICAgKHAtc2hvdy1tb3JlKT1cInNob3dNb3JlKClcIlxyXG4gICAgKHAtc29ydC1ieSk9XCJvblNvcnQoJGV2ZW50KVwiXHJcbiAgICAocC1jaGFuZ2UtdmlzaWJsZS1jb2x1bW5zKT1cIm9uQ2hhbmdlVmlzaWJsZUNvbHVtbnMoJGV2ZW50KVwiXHJcbiAgICAocC1yZXN0b3JlLWNvbHVtbi1tYW5hZ2VyKT1cIm9uQ29sdW1uUmVzdG9yZU1hbmFnZXIoJGV2ZW50KVwiXHJcbiAgICAocC1zb3J0LWJ5KT1cIm9uU29ydEJ5KCRldmVudClcIlxyXG4gICAgW3AtZHJhZ2dhYmxlXT1cImRyYWdnYWJsZVwiXHJcbiAgPlxyXG4gIDwvcG8tdGFibGU+XHJcbjwvcG8tcGFnZS1keW5hbWljLXNlYXJjaD5cclxuIl19