angular-slickgrid 3.0.5 → 3.3.1
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.
- package/README.md +20 -24
- package/angular-slickgrid.metadata.json +1 -1
- package/app/modules/angular-slickgrid/components/angular-slickgrid.component.d.ts +11 -3
- package/app/modules/angular-slickgrid/index.d.ts +0 -1
- package/bundles/angular-slickgrid.umd.js +100 -249
- package/bundles/angular-slickgrid.umd.js.map +1 -1
- package/esm2015/app/modules/angular-slickgrid/components/angular-slickgrid.component.js +90 -71
- package/esm2015/app/modules/angular-slickgrid/global-grid-options.js +4 -3
- package/esm2015/app/modules/angular-slickgrid/index.js +1 -2
- package/esm2015/app/modules/angular-slickgrid/modules/angular-slickgrid.module.js +1 -4
- package/fesm2015/angular-slickgrid.js +95 -209
- package/fesm2015/angular-slickgrid.js.map +1 -1
- package/package.json +18 -10
- package/app/modules/angular-slickgrid/components/slick-pagination.component.d.ts +0 -42
- package/esm2015/app/modules/angular-slickgrid/components/slick-pagination.component.js +0 -137
|
@@ -20,9 +20,10 @@ BackendUtilityService, CollectionService, EventNamingStyle, ExtensionService, Fi
|
|
|
20
20
|
AutoTooltipExtension, CheckboxSelectorExtension, CellExternalCopyManagerExtension, CellMenuExtension, ColumnPickerExtension, ContextMenuExtension, DraggableGroupingExtension, ExtensionUtility, GridMenuExtension, GroupItemMetaProviderExtension, HeaderMenuExtension, HeaderButtonExtension, RowSelectionExtension, RowMoveManagerExtension,
|
|
21
21
|
// utilities
|
|
22
22
|
autoAddEditorFormatterToColumnsWithEditor, emptyElement, GridStateType, } from '@slickgrid-universal/common';
|
|
23
|
-
import { SlickFooterComponent } from '@slickgrid-universal/custom-footer-component';
|
|
24
23
|
import { EventPubSubService } from '@slickgrid-universal/event-pub-sub';
|
|
25
24
|
import { SlickEmptyWarningComponent } from '@slickgrid-universal/empty-warning-component';
|
|
25
|
+
import { SlickFooterComponent } from '@slickgrid-universal/custom-footer-component';
|
|
26
|
+
import { SlickPaginationComponent } from '@slickgrid-universal/pagination-component';
|
|
26
27
|
import { RxJsResource } from '@slickgrid-universal/rxjs-observable';
|
|
27
28
|
import { dequal } from 'dequal/lite';
|
|
28
29
|
import { Constants } from '../constants';
|
|
@@ -78,11 +79,11 @@ export class AngularSlickgridComponent {
|
|
|
78
79
|
const autoTooltipExtension = new AutoTooltipExtension(this.sharedService);
|
|
79
80
|
const cellExternalCopyManagerExtension = new CellExternalCopyManagerExtension(this.extensionUtility, this.sharedService);
|
|
80
81
|
const cellMenuExtension = new CellMenuExtension(this.extensionUtility, this.sharedService, this.translaterService);
|
|
81
|
-
const contextMenuExtension = new ContextMenuExtension(this.extensionUtility, this.sharedService, this.treeDataService, this.translaterService);
|
|
82
|
+
const contextMenuExtension = new ContextMenuExtension(this.extensionUtility, this._eventPubSubService, this.sharedService, this.treeDataService, this.translaterService);
|
|
82
83
|
const columnPickerExtension = new ColumnPickerExtension(this.extensionUtility, this.sharedService);
|
|
83
84
|
const checkboxExtension = new CheckboxSelectorExtension(this.sharedService);
|
|
84
|
-
const draggableGroupingExtension = new DraggableGroupingExtension(this.extensionUtility, this.sharedService);
|
|
85
|
-
const gridMenuExtension = new GridMenuExtension(this.extensionUtility, this.filterService, this.sharedService, this.sortService, this.backendUtilityService, this.translaterService);
|
|
85
|
+
const draggableGroupingExtension = new DraggableGroupingExtension(this.extensionUtility, this._eventPubSubService, this.sharedService);
|
|
86
|
+
const gridMenuExtension = new GridMenuExtension(this.extensionUtility, this.filterService, this._eventPubSubService, this.sharedService, this.sortService, this.backendUtilityService, this.translaterService);
|
|
86
87
|
const groupItemMetaProviderExtension = new GroupItemMetaProviderExtension(this.sharedService);
|
|
87
88
|
const headerButtonExtension = new HeaderButtonExtension(this.extensionUtility, this.sharedService);
|
|
88
89
|
const headerMenuExtension = new HeaderMenuExtension(this.extensionUtility, this.filterService, this._eventPubSubService, this.sharedService, this.sortService, this.translaterService);
|
|
@@ -127,15 +128,15 @@ export class AngularSlickgridComponent {
|
|
|
127
128
|
return this._paginationOptions;
|
|
128
129
|
}
|
|
129
130
|
set paginationOptions(newPaginationOptions) {
|
|
130
|
-
var _a;
|
|
131
|
+
var _a, _b, _c;
|
|
131
132
|
if (newPaginationOptions && this._paginationOptions) {
|
|
132
|
-
this._paginationOptions = Object.assign(Object.assign({}, this._paginationOptions), newPaginationOptions);
|
|
133
|
+
this._paginationOptions = Object.assign(Object.assign(Object.assign({}, this.gridOptions.pagination), this._paginationOptions), newPaginationOptions);
|
|
133
134
|
}
|
|
134
135
|
else {
|
|
135
136
|
this._paginationOptions = newPaginationOptions;
|
|
136
137
|
}
|
|
137
|
-
this.gridOptions.pagination = this._paginationOptions;
|
|
138
|
-
this.paginationService.updateTotalItems((
|
|
138
|
+
this.gridOptions.pagination = (_a = this._paginationOptions) !== null && _a !== void 0 ? _a : this.gridOptions.pagination;
|
|
139
|
+
this.paginationService.updateTotalItems((_c = (_b = this.gridOptions.pagination) === null || _b === void 0 ? void 0 : _b.totalItems) !== null && _c !== void 0 ? _c : 0, true);
|
|
139
140
|
}
|
|
140
141
|
set columnDefinitions(columnDefinitions) {
|
|
141
142
|
this._columnDefinitions = columnDefinitions;
|
|
@@ -176,7 +177,7 @@ export class AngularSlickgridComponent {
|
|
|
176
177
|
return this.sharedService.hierarchicalDataset;
|
|
177
178
|
}
|
|
178
179
|
set datasetHierarchical(newHierarchicalDataset) {
|
|
179
|
-
var _a, _b, _c, _d;
|
|
180
|
+
var _a, _b, _c, _d, _f;
|
|
180
181
|
const isDatasetEqual = dequal(newHierarchicalDataset, (_b = (_a = this.sharedService) === null || _a === void 0 ? void 0 : _a.hierarchicalDataset) !== null && _b !== void 0 ? _b : []);
|
|
181
182
|
const prevFlatDatasetLn = this._currentDatasetLength;
|
|
182
183
|
this.sharedService.hierarchicalDataset = newHierarchicalDataset;
|
|
@@ -185,9 +186,8 @@ export class AngularSlickgridComponent {
|
|
|
185
186
|
}
|
|
186
187
|
// when a hierarchical dataset is set afterward, we can reset the flat dataset and call a tree data sort that will overwrite the flat dataset
|
|
187
188
|
if (newHierarchicalDataset && this.slickGrid && ((_d = this.sortService) === null || _d === void 0 ? void 0 : _d.processTreeDataInitialSort)) {
|
|
188
|
-
this.dataView.setItems([], this.gridOptions.datasetIdPropertyName);
|
|
189
|
+
this.dataView.setItems([], (_f = this.gridOptions.datasetIdPropertyName) !== null && _f !== void 0 ? _f : 'id');
|
|
189
190
|
this.sortService.processTreeDataInitialSort();
|
|
190
|
-
this.sortTreeDataset([]);
|
|
191
191
|
// we also need to reset/refresh the Tree Data filters because if we inserted new item(s) then it might not show up without doing this refresh
|
|
192
192
|
// however we need 1 cpu cycle before having the DataView refreshed, so we need to wrap this check in a setTimeout
|
|
193
193
|
setTimeout(() => {
|
|
@@ -196,8 +196,8 @@ export class AngularSlickgridComponent {
|
|
|
196
196
|
this.filterService.refreshTreeDataFilters();
|
|
197
197
|
}
|
|
198
198
|
});
|
|
199
|
+
this._isDatasetHierarchicalInitialized = true;
|
|
199
200
|
}
|
|
200
|
-
this._isDatasetHierarchicalInitialized = true;
|
|
201
201
|
}
|
|
202
202
|
get elementRef() {
|
|
203
203
|
return this.elm;
|
|
@@ -216,6 +216,9 @@ export class AngularSlickgridComponent {
|
|
|
216
216
|
set isDatasetInitialized(isInitialized) {
|
|
217
217
|
this._isDatasetInitialized = isInitialized;
|
|
218
218
|
}
|
|
219
|
+
set isDatasetHierarchicalInitialized(isInitialized) {
|
|
220
|
+
this._isDatasetHierarchicalInitialized = isInitialized;
|
|
221
|
+
}
|
|
219
222
|
get registeredResources() {
|
|
220
223
|
return this._registeredResources;
|
|
221
224
|
}
|
|
@@ -234,7 +237,7 @@ export class AngularSlickgridComponent {
|
|
|
234
237
|
this._eventPubSubService.publish('onAfterGridDestroyed', true);
|
|
235
238
|
}
|
|
236
239
|
destroy(shouldEmptyDomElementContainer = false) {
|
|
237
|
-
var _a, _b, _c, _d, _f, _g;
|
|
240
|
+
var _a, _b, _c, _d, _f, _g, _h;
|
|
238
241
|
// dispose of all Services
|
|
239
242
|
this.serviceList.forEach((service) => {
|
|
240
243
|
if (service && service.dispose) {
|
|
@@ -253,21 +256,22 @@ export class AngularSlickgridComponent {
|
|
|
253
256
|
this._registeredResources = [];
|
|
254
257
|
}
|
|
255
258
|
// dispose the Components
|
|
256
|
-
(_a = this.
|
|
257
|
-
(_b = this.
|
|
258
|
-
|
|
259
|
+
(_a = this.slickEmptyWarning) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
260
|
+
(_b = this.slickFooter) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
261
|
+
(_c = this.slickPagination) === null || _c === void 0 ? void 0 : _c.dispose();
|
|
262
|
+
if ((_d = this._eventHandler) === null || _d === void 0 ? void 0 : _d.unsubscribeAll) {
|
|
259
263
|
this._eventHandler.unsubscribeAll();
|
|
260
264
|
}
|
|
261
|
-
(
|
|
265
|
+
(_f = this._eventPubSubService) === null || _f === void 0 ? void 0 : _f.unsubscribeAll();
|
|
262
266
|
if (this.dataView) {
|
|
263
|
-
if ((
|
|
267
|
+
if ((_g = this.dataView) === null || _g === void 0 ? void 0 : _g.setItems) {
|
|
264
268
|
this.dataView.setItems([]);
|
|
265
269
|
}
|
|
266
270
|
if (this.dataView.destroy) {
|
|
267
271
|
this.dataView.destroy();
|
|
268
272
|
}
|
|
269
273
|
}
|
|
270
|
-
if ((
|
|
274
|
+
if ((_h = this.slickGrid) === null || _h === void 0 ? void 0 : _h.destroy) {
|
|
271
275
|
this.slickGrid.destroy(shouldEmptyDomElementContainer);
|
|
272
276
|
}
|
|
273
277
|
if (this.backendServiceApi) {
|
|
@@ -321,7 +325,7 @@ export class AngularSlickgridComponent {
|
|
|
321
325
|
}
|
|
322
326
|
}
|
|
323
327
|
initialization(eventHandler) {
|
|
324
|
-
var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
328
|
+
var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
325
329
|
this.gridOptions.translater = this.translaterService;
|
|
326
330
|
this._eventHandler = eventHandler;
|
|
327
331
|
// when detecting a frozen grid, we'll automatically enable the mousewheel scroll handler so that we can scroll from both left/right frozen containers
|
|
@@ -391,13 +395,14 @@ export class AngularSlickgridComponent {
|
|
|
391
395
|
}
|
|
392
396
|
// user could show a custom footer with the data metrics (dataset length and last updated timestamp)
|
|
393
397
|
if (!this.gridOptions.enablePagination && this.gridOptions.showCustomFooter && this.gridOptions.customFooterOptions && this.gridContainerElement) {
|
|
394
|
-
this.slickFooter = new SlickFooterComponent(this.slickGrid, this.gridOptions.customFooterOptions, this.translaterService);
|
|
398
|
+
this.slickFooter = new SlickFooterComponent(this.slickGrid, this.gridOptions.customFooterOptions, this._eventPubSubService, this.translaterService);
|
|
395
399
|
this.slickFooter.renderFooter(this.gridContainerElement);
|
|
396
400
|
}
|
|
397
401
|
if (!this.customDataView && this.dataView) {
|
|
402
|
+
// load the data in the DataView (unless it's a hierarchical dataset, if so it will be loaded after the initial tree sort)
|
|
398
403
|
const initialDataset = ((_j = this.gridOptions) === null || _j === void 0 ? void 0 : _j.enableTreeData) ? this.sortTreeDataset(this._dataset) : this._dataset;
|
|
399
404
|
this.dataView.beginUpdate();
|
|
400
|
-
this.dataView.setItems(initialDataset || [], this.gridOptions.datasetIdPropertyName);
|
|
405
|
+
this.dataView.setItems(initialDataset || [], (_k = this.gridOptions.datasetIdPropertyName) !== null && _k !== void 0 ? _k : 'id');
|
|
401
406
|
this.dataView.endUpdate();
|
|
402
407
|
// if you don't want the items that are not visible (due to being filtered out or being on a different page)
|
|
403
408
|
// to stay selected, pass 'false' to the second arg
|
|
@@ -447,13 +452,13 @@ export class AngularSlickgridComponent {
|
|
|
447
452
|
this.bindResizeHook(this.slickGrid, this.gridOptions);
|
|
448
453
|
// bind the Backend Service API callback functions only after the grid is initialized
|
|
449
454
|
// because the preProcess() and onInit() might get triggered
|
|
450
|
-
if ((
|
|
455
|
+
if ((_l = this.gridOptions) === null || _l === void 0 ? void 0 : _l.backendServiceApi) {
|
|
451
456
|
this.bindBackendCallbackFunctions(this.gridOptions);
|
|
452
457
|
}
|
|
453
458
|
// local grid, check if we need to show the Pagination
|
|
454
459
|
// if so then also check if there's any presets and finally initialize the PaginationService
|
|
455
460
|
// a local grid with Pagination presets will potentially have a different total of items, we'll need to get it from the DataView and update our total
|
|
456
|
-
if (((
|
|
461
|
+
if (((_m = this.gridOptions) === null || _m === void 0 ? void 0 : _m.enablePagination) && this._isLocalGrid) {
|
|
457
462
|
this.showPagination = true;
|
|
458
463
|
this.loadLocalGridPagination(this.dataset);
|
|
459
464
|
}
|
|
@@ -461,11 +466,11 @@ export class AngularSlickgridComponent {
|
|
|
461
466
|
// Slick Grid & DataView objects
|
|
462
467
|
dataView: this.dataView,
|
|
463
468
|
slickGrid: this.slickGrid,
|
|
464
|
-
extensions: (
|
|
469
|
+
extensions: (_o = this.extensionService) === null || _o === void 0 ? void 0 : _o.extensionList,
|
|
465
470
|
// public methods
|
|
466
471
|
destroy: this.destroy.bind(this),
|
|
467
472
|
// return all available Services (non-singleton)
|
|
468
|
-
backendService: (
|
|
473
|
+
backendService: (_q = (_p = this.gridOptions) === null || _p === void 0 ? void 0 : _p.backendServiceApi) === null || _q === void 0 ? void 0 : _q.service,
|
|
469
474
|
filterService: this.filterService,
|
|
470
475
|
gridEventService: this.gridEventService,
|
|
471
476
|
gridStateService: this.gridStateService,
|
|
@@ -507,13 +512,13 @@ export class AngularSlickgridComponent {
|
|
|
507
512
|
* @param dataset
|
|
508
513
|
*/
|
|
509
514
|
refreshGridData(dataset, totalCount) {
|
|
510
|
-
var _a, _b, _c, _d, _f;
|
|
515
|
+
var _a, _b, _c, _d, _f, _g;
|
|
511
516
|
if (this.gridOptions && this.gridOptions.enableEmptyDataWarningMessage && Array.isArray(dataset)) {
|
|
512
517
|
const finalTotalCount = totalCount || dataset.length;
|
|
513
518
|
this.displayEmptyDataWarning(finalTotalCount < 1);
|
|
514
519
|
}
|
|
515
520
|
if (Array.isArray(dataset) && this.slickGrid && ((_a = this.dataView) === null || _a === void 0 ? void 0 : _a.setItems)) {
|
|
516
|
-
this.dataView.setItems(dataset, this.gridOptions.datasetIdPropertyName);
|
|
521
|
+
this.dataView.setItems(dataset, (_b = this.gridOptions.datasetIdPropertyName) !== null && _b !== void 0 ? _b : 'id');
|
|
517
522
|
if (!this.gridOptions.backendServiceApi && !this.gridOptions.enableTreeData) {
|
|
518
523
|
this.dataView.reSort();
|
|
519
524
|
}
|
|
@@ -531,11 +536,11 @@ export class AngularSlickgridComponent {
|
|
|
531
536
|
}
|
|
532
537
|
// display the Pagination component only after calling this refresh data first, we call it here so that if we preset pagination page number it will be shown correctly
|
|
533
538
|
this.showPagination = (this.gridOptions && (this.gridOptions.enablePagination || (this.gridOptions.backendServiceApi && this.gridOptions.enablePagination === undefined))) ? true : false;
|
|
534
|
-
if (this._paginationOptions && ((
|
|
539
|
+
if (this._paginationOptions && ((_c = this.gridOptions) === null || _c === void 0 ? void 0 : _c.pagination) && ((_d = this.gridOptions) === null || _d === void 0 ? void 0 : _d.backendServiceApi)) {
|
|
535
540
|
const paginationOptions = this.setPaginationOptionsWhenPresetDefined(this.gridOptions, this._paginationOptions);
|
|
536
541
|
// when we have a totalCount use it, else we'll take it from the pagination object
|
|
537
542
|
// only update the total items if it's different to avoid refreshing the UI
|
|
538
|
-
const totalRecords = (totalCount !== undefined) ? totalCount : ((
|
|
543
|
+
const totalRecords = (totalCount !== undefined) ? totalCount : ((_g = (_f = this.gridOptions) === null || _f === void 0 ? void 0 : _f.pagination) === null || _g === void 0 ? void 0 : _g.totalItems);
|
|
539
544
|
if (totalRecords !== undefined && totalRecords !== this.totalItems) {
|
|
540
545
|
this.totalItems = +totalRecords;
|
|
541
546
|
}
|
|
@@ -622,9 +627,10 @@ export class AngularSlickgridComponent {
|
|
|
622
627
|
if (gridOptions.enableTranslate) {
|
|
623
628
|
this.translateColumnHeaderTitleKeys();
|
|
624
629
|
this.translateColumnGroupKeys();
|
|
625
|
-
this.translateCustomFooterTexts();
|
|
626
630
|
}
|
|
627
631
|
this.subscriptions.push(this.translate.onLangChange.subscribe(() => {
|
|
632
|
+
// publish event of the same name that Slickgrid-Universal uses on a language change event
|
|
633
|
+
this._eventPubSubService.publish('onLanguageChange');
|
|
628
634
|
if (gridOptions.enableTranslate) {
|
|
629
635
|
this.extensionService.translateCellMenu();
|
|
630
636
|
this.extensionService.translateColumnHeaders();
|
|
@@ -632,7 +638,6 @@ export class AngularSlickgridComponent {
|
|
|
632
638
|
this.extensionService.translateContextMenu();
|
|
633
639
|
this.extensionService.translateGridMenu();
|
|
634
640
|
this.extensionService.translateHeaderMenu();
|
|
635
|
-
this.translateCustomFooterTexts();
|
|
636
641
|
this.translateColumnHeaderTitleKeys();
|
|
637
642
|
this.translateColumnGroupKeys();
|
|
638
643
|
if (gridOptions.createPreHeaderPanel && !gridOptions.enableDraggableGrouping) {
|
|
@@ -641,32 +646,6 @@ export class AngularSlickgridComponent {
|
|
|
641
646
|
}
|
|
642
647
|
}));
|
|
643
648
|
}
|
|
644
|
-
if (!this.customDataView) {
|
|
645
|
-
// bind external sorting (backend) when available or default onSort (dataView)
|
|
646
|
-
if (gridOptions.enableSorting) {
|
|
647
|
-
// bind external sorting (backend) unless specified to use the local one
|
|
648
|
-
if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalSorting) {
|
|
649
|
-
this.sortService.bindBackendOnSort(grid);
|
|
650
|
-
}
|
|
651
|
-
else {
|
|
652
|
-
this.sortService.bindLocalOnSort(grid);
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
// bind external filter (backend) when available or default onFilter (dataView)
|
|
656
|
-
if (gridOptions.enableFiltering) {
|
|
657
|
-
this.filterService.init(grid);
|
|
658
|
-
// bind external filter (backend) unless specified to use the local one
|
|
659
|
-
if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalFiltering) {
|
|
660
|
-
this.filterService.bindBackendOnFilter(grid);
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
this.filterService.bindLocalOnFilter(grid);
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
// load any presets if any (after dataset is initialized)
|
|
667
|
-
this.loadColumnPresetsWhenDatasetInitialized();
|
|
668
|
-
this.loadFilterPresetsWhenDatasetInitialized();
|
|
669
|
-
}
|
|
670
649
|
// if user set an onInit Backend, we'll run it right away (and if so, we also need to run preProcess, internalPostProcess & postProcess)
|
|
671
650
|
if (gridOptions.backendServiceApi) {
|
|
672
651
|
const backendApi = gridOptions.backendServiceApi;
|
|
@@ -700,16 +679,41 @@ export class AngularSlickgridComponent {
|
|
|
700
679
|
this.gridEventService.bindOnCellChange(grid);
|
|
701
680
|
this.gridEventService.bindOnClick(grid);
|
|
702
681
|
if (dataView && grid) {
|
|
682
|
+
// bind external sorting (backend) when available or default onSort (dataView)
|
|
683
|
+
if (gridOptions.enableSorting) {
|
|
684
|
+
// bind external sorting (backend) unless specified to use the local one
|
|
685
|
+
if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalSorting) {
|
|
686
|
+
this.sortService.bindBackendOnSort(grid);
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
this.sortService.bindLocalOnSort(grid);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
// bind external filter (backend) when available or default onFilter (dataView)
|
|
693
|
+
if (gridOptions.enableFiltering) {
|
|
694
|
+
this.filterService.init(grid);
|
|
695
|
+
// bind external filter (backend) unless specified to use the local one
|
|
696
|
+
if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalFiltering) {
|
|
697
|
+
this.filterService.bindBackendOnFilter(grid);
|
|
698
|
+
}
|
|
699
|
+
else {
|
|
700
|
+
this.filterService.bindLocalOnFilter(grid);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
// load any presets if any (after dataset is initialized)
|
|
704
|
+
this.loadColumnPresetsWhenDatasetInitialized();
|
|
705
|
+
this.loadFilterPresetsWhenDatasetInitialized();
|
|
703
706
|
// When data changes in the DataView, we need to refresh the metrics and/or display a warning if the dataset is empty
|
|
704
707
|
const onRowCountChangedHandler = dataView.onRowCountChanged;
|
|
705
708
|
this._eventHandler.subscribe(onRowCountChangedHandler, (_e, args) => {
|
|
706
709
|
grid.invalidate();
|
|
707
|
-
this.handleOnItemCountChanged(
|
|
710
|
+
this.handleOnItemCountChanged(this.dataView.getFilteredItemCount() || 0, dataView.getItemCount());
|
|
708
711
|
});
|
|
709
712
|
const onSetItemsCalledHandler = dataView.onSetItemsCalled;
|
|
710
713
|
this._eventHandler.subscribe(onSetItemsCalledHandler, (_e, args) => {
|
|
711
714
|
var _a;
|
|
712
|
-
|
|
715
|
+
grid.invalidate();
|
|
716
|
+
this.handleOnItemCountChanged(this.dataView.getFilteredItemCount(), args.itemCount);
|
|
713
717
|
// when user has resize by content enabled, we'll force a full width calculation since we change our entire dataset
|
|
714
718
|
if (args.itemCount > 0 && (this.gridOptions.autosizeColumnsByCellContentOnFirstLoad || this.gridOptions.enableAutoResizeColumnsByCellContent)) {
|
|
715
719
|
this.resizerService.resizeColumnsByCellContent(!((_a = this.gridOptions) === null || _a === void 0 ? void 0 : _a.resizeByContentOnlyOnFirstLoad));
|
|
@@ -729,7 +733,7 @@ export class AngularSlickgridComponent {
|
|
|
729
733
|
});
|
|
730
734
|
}
|
|
731
735
|
}
|
|
732
|
-
//
|
|
736
|
+
// did the user add a colspan callback? If so, hook it into the DataView getItemMetadata
|
|
733
737
|
if (gridOptions && gridOptions.colspanCallback && dataView && dataView.getItem && dataView.getItemMetadata) {
|
|
734
738
|
dataView.getItemMetadata = (rowNumber) => {
|
|
735
739
|
let callbackResult = null;
|
|
@@ -819,7 +823,6 @@ export class AngularSlickgridComponent {
|
|
|
819
823
|
this.resizerService.resizeGrid();
|
|
820
824
|
}
|
|
821
825
|
if (options.enableAutoResize) {
|
|
822
|
-
this.resizerService.bindAutoResizeDataGrid();
|
|
823
826
|
if (grid && options.autoFitColumnsOnFirstLoad && options.enableAutoSizeColumns) {
|
|
824
827
|
grid.autosizeColumns();
|
|
825
828
|
}
|
|
@@ -870,7 +873,10 @@ export class AngularSlickgridComponent {
|
|
|
870
873
|
if ((_b = this.gridOptions) === null || _b === void 0 ? void 0 : _b.backendServiceApi) {
|
|
871
874
|
(_c = this.backendUtilityService) === null || _c === void 0 ? void 0 : _c.refreshBackendDataset(this.gridOptions);
|
|
872
875
|
}
|
|
876
|
+
this.renderPagination(this.showPagination);
|
|
873
877
|
}));
|
|
878
|
+
// also initialize (render) the pagination component
|
|
879
|
+
this.renderPagination();
|
|
874
880
|
this._isPaginationInitialized = true;
|
|
875
881
|
}
|
|
876
882
|
this.cd.detectChanges();
|
|
@@ -1053,6 +1059,26 @@ export class AngularSlickgridComponent {
|
|
|
1053
1059
|
this.paginationService.addRxJsResource(this.rxjs);
|
|
1054
1060
|
this.containerService.registerInstance('RxJsResource', this.rxjs);
|
|
1055
1061
|
}
|
|
1062
|
+
/**
|
|
1063
|
+
* Render (or dispose) the Pagination Component, user can optionally provide False (to not show it) which will in term dispose of the Pagination,
|
|
1064
|
+
* also while disposing we can choose to omit the disposable of the Pagination Service (if we are simply toggling the Pagination, we want to keep the Service alive)
|
|
1065
|
+
* @param {Boolean} showPagination - show (new render) or not (dispose) the Pagination
|
|
1066
|
+
* @param {Boolean} shouldDisposePaginationService - when disposing the Pagination, do we also want to dispose of the Pagination Service? (defaults to True)
|
|
1067
|
+
*/
|
|
1068
|
+
renderPagination(showPagination = true) {
|
|
1069
|
+
var _a;
|
|
1070
|
+
if (((_a = this.gridOptions) === null || _a === void 0 ? void 0 : _a.enablePagination) && !this._isPaginationInitialized && showPagination) {
|
|
1071
|
+
this.slickPagination = new SlickPaginationComponent(this.paginationService, this._eventPubSubService, this.sharedService, this.translaterService);
|
|
1072
|
+
this.slickPagination.renderPagination(this.gridContainerElement);
|
|
1073
|
+
this._isPaginationInitialized = true;
|
|
1074
|
+
}
|
|
1075
|
+
else if (!showPagination) {
|
|
1076
|
+
if (this.slickPagination) {
|
|
1077
|
+
this.slickPagination.dispose();
|
|
1078
|
+
}
|
|
1079
|
+
this._isPaginationInitialized = false;
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1056
1082
|
/**
|
|
1057
1083
|
* Takes a flat dataset with parent/child relationship, sort it (via its tree structure) and return the sorted flat array
|
|
1058
1084
|
* @param {Array<Object>} flatDatasetInput - flat dataset input
|
|
@@ -1107,13 +1133,6 @@ export class AngularSlickgridComponent {
|
|
|
1107
1133
|
return Object.assign(Object.assign({}, column), { editor: column.editor && column.editor.model, internalColumnEditor: Object.assign({}, column.editor) });
|
|
1108
1134
|
});
|
|
1109
1135
|
}
|
|
1110
|
-
/** Translate all Custom Footer Texts (footer with metrics) */
|
|
1111
|
-
translateCustomFooterTexts() {
|
|
1112
|
-
var _a, _b;
|
|
1113
|
-
if (this.slickFooter && ((_a = this.translaterService) === null || _a === void 0 ? void 0 : _a.translate)) {
|
|
1114
|
-
(_b = this.slickFooter) === null || _b === void 0 ? void 0 : _b.translateCustomFooterTexts();
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
1136
|
translateColumnHeaderTitleKeys() {
|
|
1118
1137
|
// translate all columns (including hidden columns)
|
|
1119
1138
|
this.extensionUtility.translateItems(this.sharedService.allColumns, 'nameKey', 'name');
|
|
@@ -1150,7 +1169,7 @@ export class AngularSlickgridComponent {
|
|
|
1150
1169
|
AngularSlickgridComponent.decorators = [
|
|
1151
1170
|
{ type: Component, args: [{
|
|
1152
1171
|
selector: 'angular-slickgrid',
|
|
1153
|
-
template: "<div id=\"slickGridContainer-{{gridId}}\" class=\"gridPane\">\r\n <div attr.id='{{gridId}}' class=\"slickgrid-container\" style=\"width: 100%\">\r\n </div>\r\n
|
|
1172
|
+
template: "<div id=\"slickGridContainer-{{gridId}}\" class=\"gridPane\">\r\n <div attr.id='{{gridId}}' class=\"slickgrid-container\" style=\"width: 100%\">\r\n </div>\r\n</div>",
|
|
1154
1173
|
providers: [
|
|
1155
1174
|
// make everything transient (non-singleton)
|
|
1156
1175
|
AngularUtilService,
|
|
@@ -1180,4 +1199,4 @@ AngularSlickgridComponent.propDecorators = {
|
|
|
1180
1199
|
dataset: [{ type: Input }],
|
|
1181
1200
|
datasetHierarchical: [{ type: Input }]
|
|
1182
1201
|
};
|
|
1183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixpR0FBaUc7QUFDakcsT0FBTyxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTyx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sMkNBQTJDLENBQUM7QUFFbkQsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFaEQsT0FBTztBQW1CTCxXQUFXO0FBQ1gscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsRUFDZixXQUFXLEVBQ1gsZUFBZTtBQUVmLGFBQWE7QUFDYixvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLGdDQUFnQyxFQUNoQyxpQkFB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UUFFRCx5R0FBeUc7UUFDekcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQXVDLENBQUM7UUFDMUYsSUFBSSxDQUFBLGFBQWEsYUFBYixhQUFhLHVCQUFiLGFBQWEsQ0FBRSxPQUFPLE1BQUksYUFBYSxhQUFiLGFBQWEsdUJBQWIsYUFBYSxDQUFFLGdCQUFnQixDQUFBLEVBQUU7WUFDN0QsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9DO0lBQ0gsQ0FBQzs7O1lBbHlDRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsOGNBQWlEO2dCQUNqRCxTQUFTLEVBQUU7b0JBQ1QsNENBQTRDO29CQUM1QyxrQkFBa0I7b0JBQ2xCLGNBQWM7b0JBQ2Qsc0JBQXNCO29CQUN0QixpQkFBaUI7aUJBQ2xCO2FBQ0Y7OztZQWpCUSxrQkFBa0I7WUE3RUgsY0FBYztZQUFFLGlCQUFpQjtZQStFaEQsZ0JBQWdCO1lBL0U2QyxVQUFVO1lBQ3ZFLGdCQUFnQix1QkE0UXBCLFFBQVE7WUFwTUosaUJBQWlCLHVCQXFNckIsUUFBUTs0Q0FDUixNQUFNLFNBQUMsUUFBUTs0Q0FDZixNQUFNLFNBQUMsaUJBQWlCOzs7NkJBMUgxQixLQUFLO3FCQUNMLEtBQUs7MEJBQ0wsS0FBSztnQ0FFTCxLQUFLO2dDQWNMLEtBQUs7c0JBY0wsS0FBSztrQ0F5QkwsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCAzcmQgcGFydHkgdmVuZG9yIGxpYnNcclxuLy8gb25seSBpbXBvcnQgdGhlIG5lY2Vzc2FyeSBjb3JlIGxpYiwgZWFjaCB3aWxsIGJlIGltcG9ydGVkIG9uIGRlbWFuZCB3aGVuIGVuYWJsZWQgKHZpYSByZXF1aXJlKVxyXG5pbXBvcnQgJ2pxdWVyeS11aS91aS93aWRnZXRzL2RyYWdnYWJsZSc7XHJcbmltcG9ydCAnanF1ZXJ5LXVpL3VpL3dpZGdldHMvZHJvcHBhYmxlJztcclxuaW1wb3J0ICdqcXVlcnktdWkvdWkvd2lkZ2V0cy9zb3J0YWJsZSc7XHJcbmltcG9ydCAnc2xpY2tncmlkL2xpYi9qcXVlcnkuZXZlbnQuZHJhZy0yLjMuMCc7XHJcbmltcG9ydCAnc2xpY2tncmlkL2xpYi9qcXVlcnkubW91c2V3aGVlbCc7XHJcbmltcG9ydCAnc2xpY2tncmlkL3NsaWNrLmNvcmUnO1xyXG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5ncmlkJztcclxuaW1wb3J0ICdzbGlja2dyaWQvc2xpY2suZGF0YXZpZXcnO1xyXG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5ncm91cGl0ZW1tZXRhZGF0YXByb3ZpZGVyJztcclxuXHJcbi8vIC4uLnRoZW4gZXZlcnl0aGluZyBlbHNlLi4uXHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIEFwcGxpY2F0aW9uUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAvLyBpbnRlcmZhY2VzL3R5cGVzXHJcbiAgQXV0b0NvbXBsZXRlRWRpdG9yLFxyXG4gIEJhY2tlbmRTZXJ2aWNlQXBpLFxyXG4gIEJhY2tlbmRTZXJ2aWNlT3B0aW9uLFxyXG4gIENvbHVtbixcclxuICBDb2x1bW5FZGl0b3IsXHJcbiAgRGF0YVZpZXdPcHRpb24sXHJcbiAgRXh0ZXJuYWxSZXNvdXJjZSxcclxuICBMb2NhbGUsXHJcbiAgTWV0cmljcyxcclxuICBQYWdpbmF0aW9uLFxyXG4gIFNlbGVjdEVkaXRvcixcclxuICBTZXJ2aWNlUGFnaW5hdGlvbixcclxuICBTbGlja0RhdGFWaWV3LFxyXG4gIFNsaWNrRXZlbnRIYW5kbGVyLFxyXG4gIFNsaWNrR3JpZCxcclxuICBTbGlja05hbWVzcGFjZSxcclxuXHJcbiAgLy8gc2VydmljZXNcclxuICBCYWNrZW5kVXRpbGl0eVNlcnZpY2UsXHJcbiAgQ29sbGVjdGlvblNlcnZpY2UsXHJcbiAgRXZlbnROYW1pbmdTdHlsZSxcclxuICBFeHRlbnNpb25TZXJ2aWNlLFxyXG4gIEZpbHRlckZhY3RvcnksXHJcbiAgRmlsdGVyU2VydmljZSxcclxuICBHcmlkRXZlbnRTZXJ2aWNlLFxyXG4gIEdyaWRTZXJ2aWNlLFxyXG4gIEdyaWRTdGF0ZVNlcnZpY2UsXHJcbiAgR3JvdXBpbmdBbmRDb2xzcGFuU2VydmljZSxcclxuICBQYWdpbmF0aW9uU2VydmljZSxcclxuICBSZXNpemVyU2VydmljZSxcclxuICBSeEpzRmFjYWRlLFxyXG4gIFNoYXJlZFNlcnZpY2UsXHJcbiAgU2xpY2tncmlkQ29uZmlnLFxyXG4gIFNvcnRTZXJ2aWNlLFxyXG4gIFRyZWVEYXRhU2VydmljZSxcclxuXHJcbiAgLy8gZXh0ZW5zaW9uc1xyXG4gIEF1dG9Ub29sdGlwRXh0ZW5zaW9uLFxyXG4gIENoZWNrYm94U2VsZWN0b3JFeHRlbnNpb24sXHJcbiAgQ2VsbEV4dGVybmFsQ29weU1hbmFnZXJFeHRlbnNpb24sXHJcbiAgQ2VsbE1lbnVFeHRlbnNpb24sXHJcbiAgQ29sdW1uUGlja2VyRXh0ZW5zaW9uLFxyXG4gIENvbnRleHRNZW51RXh0ZW5zaW9uLFxyXG4gIERyYWdnYWJsZUdyb3VwaW5nRXh0ZW5zaW9uLFxyXG4gIEV4dGVuc2lvblV0aWxpdHksXHJcbiAgR3JpZE1lbnVFeHRlbnNpb24sXHJcbiAgR3JvdXBJdGVtTWV0YVByb3ZpZGVyRXh0ZW5zaW9uLFxyXG4gIEhlYWRlck1lbnVFeHRlbnNpb24sXHJcbiAgSGVhZGVyQnV0dG9uRXh0ZW5zaW9uLFxyXG4gIFJvd1NlbGVjdGlvbkV4dGVuc2lvbixcclxuICBSb3dNb3ZlTWFuYWdlckV4dGVuc2lvbixcclxuXHJcbiAgLy8gdXRpbGl0aWVzXHJcbiAgYXV0b0FkZEVkaXRvckZvcm1hdHRlclRvQ29sdW1uc1dpdGhFZGl0b3IsXHJcbiAgZW1wdHlFbGVtZW50LFxyXG4gIEdldFNsaWNrRXZlbnRUeXBlLFxyXG4gIEdyaWRTdGF0ZVR5cGUsXHJcbn0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY29tbW9uJztcclxuaW1wb3J0IHsgU2xpY2tGb290ZXJDb21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jdXN0b20tZm9vdGVyLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEV2ZW50UHViU3ViU2VydmljZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2V2ZW50LXB1Yi1zdWInO1xyXG5pbXBvcnQgeyBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2VtcHR5LXdhcm5pbmctY29tcG9uZW50JztcclxuaW1wb3J0IHsgUnhKc1Jlc291cmNlIH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvcnhqcy1vYnNlcnZhYmxlJztcclxuaW1wb3J0IHsgZGVxdWFsIH0gZnJvbSAnZGVxdWFsL2xpdGUnO1xyXG5cclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQW5ndWxhckdyaWRJbnN0YW5jZSwgRXh0ZXJuYWxUZXN0aW5nRGVwZW5kZW5jaWVzLCBHcmlkT3B0aW9uLCB9IGZyb20gJy4vLi4vbW9kZWxzL2luZGV4JztcclxuaW1wb3J0IHsgR2xvYmFsR3JpZE9wdGlvbnMgfSBmcm9tICcuLy4uL2dsb2JhbC1ncmlkLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zbGF0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IHVuc3Vic2NyaWJlQWxsT2JzZXJ2YWJsZXMgfSBmcm9tICcuLy4uL3NlcnZpY2VzL3V0aWxpdGllcyc7XHJcblxyXG4vLyBTZXJ2aWNlc1xyXG5pbXBvcnQgeyBBbmd1bGFyVXRpbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hbmd1bGFyVXRpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUm93RGV0YWlsVmlld0V4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbnMvcm93RGV0YWlsVmlld0V4dGVuc2lvbic7XHJcbmltcG9ydCB7IENvbnRhaW5lclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb250YWluZXIuc2VydmljZSc7XHJcblxyXG4vLyB1c2luZyBleHRlcm5hbCBub24tdHlwZWQganMgbGlicmFyaWVzXHJcbmRlY2xhcmUgY29uc3QgU2xpY2s6IFNsaWNrTmFtZXNwYWNlO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhbmd1bGFyLXNsaWNrZ3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FuZ3VsYXItc2xpY2tncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIC8vIG1ha2UgZXZlcnl0aGluZyB0cmFuc2llbnQgKG5vbi1zaW5nbGV0b24pXHJcbiAgICBBbmd1bGFyVXRpbFNlcnZpY2UsXHJcbiAgICBBcHBsaWNhdGlvblJlZixcclxuICAgIFJvd0RldGFpbFZpZXdFeHRlbnNpb24sXHJcbiAgICBUcmFuc2xhdGVyU2VydmljZSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyU2xpY2tncmlkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIF9kYXRhc2V0PzogYW55W10gfCBudWxsO1xyXG4gIHByaXZhdGUgX2NvbHVtbkRlZmluaXRpb25zITogQ29sdW1uW107XHJcbiAgcHJpdmF0ZSBfY3VycmVudERhdGFzZXRMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgX2V2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIgPSBuZXcgU2xpY2suRXZlbnRIYW5kbGVyKCk7XHJcbiAgcHJpdmF0ZSBfZXZlbnRQdWJTdWJTZXJ2aWNlITogRXZlbnRQdWJTdWJTZXJ2aWNlO1xyXG4gIHByaXZhdGUgX2FuZ3VsYXJHcmlkSW5zdGFuY2VzOiBBbmd1bGFyR3JpZEluc3RhbmNlIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNHcmlkSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0RhdGFzZXRJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0xvY2FsR3JpZCA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJlZFJlc291cmNlczogRXh0ZXJuYWxSZXNvdXJjZVtdID0gW107XHJcbiAgZGF0YVZpZXchOiBTbGlja0RhdGFWaWV3O1xyXG4gIHNsaWNrR3JpZCE6IFNsaWNrR3JpZDtcclxuICBncm91cGluZ0RlZmluaXRpb246IGFueSA9IHt9O1xyXG4gIGdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI6IGFueTtcclxuICBiYWNrZW5kU2VydmljZUFwaT86IEJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gIGxvY2FsZXMhOiBMb2NhbGU7XHJcbiAgbWV0cmljcz86IE1ldHJpY3M7XHJcbiAgc2hvd1BhZ2luYXRpb24gPSBmYWxzZTtcclxuICBzZXJ2aWNlTGlzdDogYW55W10gPSBbXTtcclxuICB0b3RhbEl0ZW1zID0gMDtcclxuICBwYWdpbmF0aW9uRGF0YT86IHtcclxuICAgIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uO1xyXG4gICAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlO1xyXG4gIH07XHJcbiAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgLy8gY29tcG9uZW50c1xyXG4gIHNsaWNrRW1wdHlXYXJuaW5nPzogU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQ7XHJcbiAgc2xpY2tGb290ZXI/OiBTbGlja0Zvb3RlckNvbXBvbmVudDtcclxuXHJcbiAgLy8gZXh0ZW5zaW9uc1xyXG4gIGV4dGVuc2lvblV0aWxpdHk6IEV4dGVuc2lvblV0aWxpdHk7XHJcblxyXG4gIC8vIHNlcnZpY2VzXHJcbiAgYmFja2VuZFV0aWxpdHlTZXJ2aWNlITogQmFja2VuZFV0aWxpdHlTZXJ2aWNlO1xyXG4gIGNvbGxlY3Rpb25TZXJ2aWNlOiBDb2xsZWN0aW9uU2VydmljZTtcclxuICBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlO1xyXG4gIGZpbHRlckZhY3RvcnkhOiBGaWx0ZXJGYWN0b3J5O1xyXG4gIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2U7XHJcbiAgZ3JpZEV2ZW50U2VydmljZTogR3JpZEV2ZW50U2VydmljZTtcclxuICBncmlkU2VydmljZTogR3JpZFNlcnZpY2U7XHJcbiAgZ3JpZFN0YXRlU2VydmljZTogR3JpZFN0YXRlU2VydmljZTtcclxuICBncm91cGluZ1NlcnZpY2U6IEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2U7XHJcbiAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlO1xyXG4gIHJlc2l6ZXJTZXJ2aWNlITogUmVzaXplclNlcnZpY2U7XHJcbiAgcnhqcz86IFJ4SnNGYWNhZGU7XHJcbiAgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZTtcclxuICBzb3J0U2VydmljZTogU29ydFNlcnZpY2U7XHJcbiAgdHJlZURhdGFTZXJ2aWNlOiBUcmVlRGF0YVNlcnZpY2U7XHJcblxyXG4gIEBJbnB1dCgpIGN1c3RvbURhdGFWaWV3OiBhbnk7XHJcbiAgQElucHV0KCkgZ3JpZElkOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBncmlkT3B0aW9ucyE6IEdyaWRPcHRpb247XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHBhZ2luYXRpb25PcHRpb25zKCk6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zO1xyXG4gIH1cclxuICBzZXQgcGFnaW5hdGlvbk9wdGlvbnMobmV3UGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmIChuZXdQYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucykge1xyXG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHsgLi4udGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMsIC4uLm5ld1BhZ2luYXRpb25PcHRpb25zIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IG5ld1BhZ2luYXRpb25PcHRpb25zO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uID0gdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnM7XHJcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVRvdGFsSXRlbXMobmV3UGFnaW5hdGlvbk9wdGlvbnM/LnRvdGFsSXRlbXMgPz8gMCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb2x1bW5EZWZpbml0aW9ucyhjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICBpZiAodGhpcy5faXNHcmlkSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QoY29sdW1uRGVmaW5pdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jb3B5Q29sdW1uV2lkdGhzUmVmZXJlbmNlKGNvbHVtbkRlZmluaXRpb25zKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IENvbHVtbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRhdGFzZXQoKTogYW55W10ge1xyXG4gICAgcmV0dXJuICh0aGlzLmN1c3RvbURhdGFWaWV3ID8gdGhpcy5zbGlja0dyaWQ/LmdldERhdGE/LigpIDogdGhpcy5kYXRhVmlldz8uZ2V0SXRlbXM/LigpKSB8fCBbXTtcclxuICB9XHJcbiAgc2V0IGRhdGFzZXQobmV3RGF0YXNldDogYW55W10pIHtcclxuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcclxuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0RhdGFzZXQsIHRoaXMuX2RhdGFzZXQgfHwgW10pO1xyXG4gICAgbGV0IGRhdGEgPSBuZXdEYXRhc2V0O1xyXG5cclxuICAgIC8vIHdoZW4gVHJlZSBEYXRhIGlzIGVuYWJsZWQgYW5kIHdlIGRvbid0IHlldCBoYXZlIHRoZSBoaWVyYXJjaGljYWwgZGF0YXNldCBmaWxsZWQsIHdlIGNhbiBmb3JjZSBhIGNvbnZlcnQrc29ydCBvZiB0aGUgYXJyYXlcclxuICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVUcmVlRGF0YSAmJiBBcnJheS5pc0FycmF5KG5ld0RhdGFzZXQpICYmIChuZXdEYXRhc2V0Lmxlbmd0aCA+IDAgfHwgbmV3RGF0YXNldC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xyXG4gICAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICBkYXRhID0gdGhpcy5zb3J0VHJlZURhdGFzZXQobmV3RGF0YXNldCwgIWlzRGF0YXNldEVxdWFsKTsgLy8gaWYgZGF0YXNldCBjaGFuZ2VkLCB0aGVuIGZvcmNlIGEgcmVmcmVzaCBhbnl3YXlcclxuICAgIH1cclxuICAgIHRoaXMuX2RhdGFzZXQgPSBkYXRhO1xyXG4gICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoZGF0YSB8fCBbXSk7XHJcbiAgICB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aCA9IChuZXdEYXRhc2V0IHx8IFtdKS5sZW5ndGg7XHJcblxyXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcclxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCBpZiB0aGUgcHJldkRhdGFzZXQgd2FzIGVtcHR5IHRoZW4gd2UgYXJlIG9uIGZpcnN0IGxvYWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIHByZXZEYXRhc2V0TG4gPT09IDApIHtcclxuICAgICAgdGhpcy5zbGlja0dyaWQuYXV0b3NpemVDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBkYXRhc2V0SGllcmFyY2hpY2FsKCk6IGFueVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldDtcclxuICB9XHJcbiAgc2V0IGRhdGFzZXRIaWVyYXJjaGljYWwobmV3SGllcmFyY2hpY2FsRGF0YXNldDogYW55W10gfCB1bmRlZmluZWQpIHtcclxuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQsIHRoaXMuc2hhcmVkU2VydmljZT8uaGllcmFyY2hpY2FsRGF0YXNldCA/PyBbXSk7XHJcbiAgICBjb25zdCBwcmV2RmxhdERhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBuZXdIaWVyYXJjaGljYWxEYXRhc2V0O1xyXG5cclxuICAgIGlmIChuZXdIaWVyYXJjaGljYWxEYXRhc2V0ICYmIHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgJiYgdGhpcy5maWx0ZXJTZXJ2aWNlPy5jbGVhckZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmNsZWFyRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gYSBoaWVyYXJjaGljYWwgZGF0YXNldCBpcyBzZXQgYWZ0ZXJ3YXJkLCB3ZSBjYW4gcmVzZXQgdGhlIGZsYXQgZGF0YXNldCBhbmQgY2FsbCBhIHRyZWUgZGF0YSBzb3J0IHRoYXQgd2lsbCBvdmVyd3JpdGUgdGhlIGZsYXQgZGF0YXNldFxyXG4gICAgaWYgKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQgJiYgdGhpcy5zbGlja0dyaWQgJiYgdGhpcy5zb3J0U2VydmljZT8ucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQpIHtcclxuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhbXSwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUpO1xyXG4gICAgICB0aGlzLnNvcnRTZXJ2aWNlLnByb2Nlc3NUcmVlRGF0YUluaXRpYWxTb3J0KCk7XHJcbiAgICAgIHRoaXMuc29ydFRyZWVEYXRhc2V0KFtdKTtcclxuICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHJlc2V0L3JlZnJlc2ggdGhlIFRyZWUgRGF0YSBmaWx0ZXJzIGJlY2F1c2UgaWYgd2UgaW5zZXJ0ZWQgbmV3IGl0ZW0ocykgdGhlbiBpdCBtaWdodCBub3Qgc2hvdyB1cCB3aXRob3V0IGRvaW5nIHRoaXMgcmVmcmVzaFxyXG4gICAgICAvLyBob3dldmVyIHdlIG5lZWQgMSBjcHUgY3ljbGUgYmVmb3JlIGhhdmluZyB0aGUgRGF0YVZpZXcgcmVmcmVzaGVkLCBzbyB3ZSBuZWVkIHRvIHdyYXAgdGhpcyBjaGVjayBpbiBhIHNldFRpbWVvdXRcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmxhdERhdGFzZXRMbiA9IHRoaXMuZGF0YVZpZXcuZ2V0SXRlbUNvdW50KCk7XHJcbiAgICAgICAgaWYgKGZsYXREYXRhc2V0TG4gPiAwICYmIChmbGF0RGF0YXNldExuICE9PSBwcmV2RmxhdERhdGFzZXRMbiB8fCAhaXNEYXRhc2V0RXF1YWwpKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVmcmVzaFRyZWVEYXRhRmlsdGVycygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVsZW1lbnRSZWYoKTogRWxlbWVudFJlZiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbG07XHJcbiAgfVxyXG5cclxuICBnZXQgZXZlbnRIYW5kbGVyKCk6IFNsaWNrRXZlbnRIYW5kbGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ldmVudEhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JpZENvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRDb250YWluZXJJZCB8fCAnJ31gKTtcclxuICB9XHJcblxyXG4gIC8qKiBHRVRURVIgdG8ga25vdyBpZiBkYXRhc2V0IHdhcyBpbml0aWFsaXplZCBvciBub3QgKi9cclxuICBnZXQgaXNEYXRhc2V0SW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG4gIC8qKiBTRVRURVIgdG8gY2hhbmdlIGlmIGRhdGFzZXQgd2FzIGluaXRpYWxpemVkIG9yIG5vdCAoc3RyaW5nbHkgdXNlZCBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzKSAqL1xyXG4gIHNldCBpc0RhdGFzZXRJbml0aWFsaXplZChpc0luaXRpYWxpemVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IGlzSW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVnaXN0ZXJlZFJlc291cmNlcygpOiBFeHRlcm5hbFJlc291cmNlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXM7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhclV0aWxTZXJ2aWNlOiBBbmd1bGFyVXRpbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcFJlZjogQXBwbGljYXRpb25SZWYsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyU2VydmljZTogQ29udGFpbmVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxtOiBFbGVtZW50UmVmLFxyXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZXJTZXJ2aWNlOiBUcmFuc2xhdGVyU2VydmljZSxcclxuICAgIEBJbmplY3QoJ2NvbmZpZycpIHByaXZhdGUgZm9yUm9vdENvbmZpZzogR3JpZE9wdGlvbixcclxuICAgIEBJbmplY3QoJ2V4dGVybmFsU2VydmljZScpIGV4dGVybmFsU2VydmljZXM6IEV4dGVybmFsVGVzdGluZ0RlcGVuZGVuY2llc1xyXG4gICkge1xyXG4gICAgY29uc3Qgc2xpY2tncmlkQ29uZmlnID0gbmV3IFNsaWNrZ3JpZENvbmZpZygpO1xyXG5cclxuICAgIC8vIGluaXRpYWxpemUgYW5kIGFzc2lnbiBhbGwgU2VydmljZSBEZXBlbmRlbmNpZXNcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmV2ZW50UHViU3ViU2VydmljZSA/PyBuZXcgRXZlbnRQdWJTdWJTZXJ2aWNlKHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSBFdmVudE5hbWluZ1N0eWxlLmNhbWVsQ2FzZTtcclxuXHJcbiAgICB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmJhY2tlbmRVdGlsaXR5U2VydmljZSA/PyBuZXcgQmFja2VuZFV0aWxpdHlTZXJ2aWNlKCk7XHJcbiAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncmlkRXZlbnRTZXJ2aWNlID8/IG5ldyBHcmlkRXZlbnRTZXJ2aWNlKCk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zaGFyZWRTZXJ2aWNlID8/IG5ldyBTaGFyZWRTZXJ2aWNlKCk7XHJcbiAgICB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uY29sbGVjdGlvblNlcnZpY2UgPz8gbmV3IENvbGxlY3Rpb25TZXJ2aWNlKHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5ID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXh0ZW5zaW9uVXRpbGl0eSA/PyBuZXcgRXh0ZW5zaW9uVXRpbGl0eSh0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gbmV3IEZpbHRlckZhY3Rvcnkoc2xpY2tncmlkQ29uZmlnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlLCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuZmlsdGVyU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmZpbHRlclNlcnZpY2UgPz8gbmV3IEZpbHRlclNlcnZpY2UodGhpcy5maWx0ZXJGYWN0b3J5IGFzIGFueSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMucmVzaXplclNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5yZXNpemVyU2VydmljZSA/PyBuZXcgUmVzaXplclNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuc29ydFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zb3J0U2VydmljZSA/PyBuZXcgU29ydFNlcnZpY2UodGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8udHJlZURhdGFTZXJ2aWNlID8/IG5ldyBUcmVlRGF0YVNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnBhZ2luYXRpb25TZXJ2aWNlID8/IG5ldyBQYWdpbmF0aW9uU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xyXG5cclxuICAgIC8vIGV4dGVuc2lvbnNcclxuICAgIGNvbnN0IGF1dG9Ub29sdGlwRXh0ZW5zaW9uID0gbmV3IEF1dG9Ub29sdGlwRXh0ZW5zaW9uKHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBjZWxsRXh0ZXJuYWxDb3B5TWFuYWdlckV4dGVuc2lvbiA9IG5ldyBDZWxsRXh0ZXJuYWxDb3B5TWFuYWdlckV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBjZWxsTWVudUV4dGVuc2lvbiA9IG5ldyBDZWxsTWVudUV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICBjb25zdCBjb250ZXh0TWVudUV4dGVuc2lvbiA9IG5ldyBDb250ZXh0TWVudUV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy50cmVlRGF0YVNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgY29uc3QgY29sdW1uUGlja2VyRXh0ZW5zaW9uID0gbmV3IENvbHVtblBpY2tlckV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBjaGVja2JveEV4dGVuc2lvbiA9IG5ldyBDaGVja2JveFNlbGVjdG9yRXh0ZW5zaW9uKHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBkcmFnZ2FibGVHcm91cGluZ0V4dGVuc2lvbiA9IG5ldyBEcmFnZ2FibGVHcm91cGluZ0V4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBncmlkTWVudUV4dGVuc2lvbiA9IG5ldyBHcmlkTWVudUV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuZmlsdGVyU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICBjb25zdCBncm91cEl0ZW1NZXRhUHJvdmlkZXJFeHRlbnNpb24gPSBuZXcgR3JvdXBJdGVtTWV0YVByb3ZpZGVyRXh0ZW5zaW9uKHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBoZWFkZXJCdXR0b25FeHRlbnNpb24gPSBuZXcgSGVhZGVyQnV0dG9uRXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgIGNvbnN0IGhlYWRlck1lbnVFeHRlbnNpb24gPSBuZXcgSGVhZGVyTWVudUV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuZmlsdGVyU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgY29uc3Qgcm93RGV0YWlsVmlld0V4dGVuc2lvbiA9IG5ldyBSb3dEZXRhaWxWaWV3RXh0ZW5zaW9uKHRoaXMuYW5ndWxhclV0aWxTZXJ2aWNlLCB0aGlzLmFwcFJlZiwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMucnhqcyk7XHJcbiAgICBjb25zdCByb3dNb3ZlTWFuYWdlckV4dGVuc2lvbiA9IG5ldyBSb3dNb3ZlTWFuYWdlckV4dGVuc2lvbih0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG4gICAgY29uc3Qgcm93U2VsZWN0aW9uRXh0ZW5zaW9uID0gbmV3IFJvd1NlbGVjdGlvbkV4dGVuc2lvbih0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmV4dGVuc2lvblNlcnZpY2UgPz8gbmV3IEV4dGVuc2lvblNlcnZpY2UoXHJcbiAgICAgIGF1dG9Ub29sdGlwRXh0ZW5zaW9uLFxyXG4gICAgICBjZWxsRXh0ZXJuYWxDb3B5TWFuYWdlckV4dGVuc2lvbixcclxuICAgICAgY2VsbE1lbnVFeHRlbnNpb24sXHJcbiAgICAgIGNoZWNrYm94RXh0ZW5zaW9uLFxyXG4gICAgICBjb2x1bW5QaWNrZXJFeHRlbnNpb24sXHJcbiAgICAgIGNvbnRleHRNZW51RXh0ZW5zaW9uLFxyXG4gICAgICBkcmFnZ2FibGVHcm91cGluZ0V4dGVuc2lvbixcclxuICAgICAgZ3JpZE1lbnVFeHRlbnNpb24sXHJcbiAgICAgIGdyb3VwSXRlbU1ldGFQcm92aWRlckV4dGVuc2lvbixcclxuICAgICAgaGVhZGVyQnV0dG9uRXh0ZW5zaW9uLFxyXG4gICAgICBoZWFkZXJNZW51RXh0ZW5zaW9uLFxyXG4gICAgICByb3dEZXRhaWxWaWV3RXh0ZW5zaW9uLFxyXG4gICAgICByb3dNb3ZlTWFuYWdlckV4dGVuc2lvbixcclxuICAgICAgcm93U2VsZWN0aW9uRXh0ZW5zaW9uLFxyXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UsXHJcbiAgICAgIHRoaXMudHJhbnNsYXRlclNlcnZpY2UsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRTdGF0ZVNlcnZpY2UgPz8gbmV3IEdyaWRTdGF0ZVNlcnZpY2UodGhpcy5leHRlbnNpb25TZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZ3JpZFNlcnZpY2UgPz8gbmV3IEdyaWRTZXJ2aWNlKHRoaXMuZ3JpZFN0YXRlU2VydmljZSwgdGhpcy5maWx0ZXJTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSwgdGhpcy50cmVlRGF0YVNlcnZpY2UpO1xyXG4gICAgdGhpcy5ncm91cGluZ1NlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlID8/IG5ldyBHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5leHRlbnNpb25TZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuc2VydmljZUxpc3QgPSBbXHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSxcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSxcclxuICAgICAgdGhpcy5ncm91cGluZ1NlcnZpY2UsXHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UsXHJcbiAgICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlLFxyXG4gICAgXTtcclxuXHJcbiAgICAvLyByZWdpc3RlciBhbGwgU2VydmljZSBpbnN0YW5jZXMgaW4gdGhlIGNvbnRhaW5lclxyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V4dGVuc2lvblV0aWxpdHknLCB0aGlzLmV4dGVuc2lvblV0aWxpdHkpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0ZpbHRlclNlcnZpY2UnLCB0aGlzLmZpbHRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0NvbGxlY3Rpb25TZXJ2aWNlJywgdGhpcy5jb2xsZWN0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXh0ZW5zaW9uU2VydmljZScsIHRoaXMuZXh0ZW5zaW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZEV2ZW50U2VydmljZScsIHRoaXMuZ3JpZEV2ZW50U2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZFNlcnZpY2UnLCB0aGlzLmdyaWRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkU3RhdGVTZXJ2aWNlJywgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlJywgdGhpcy5ncm91cGluZ1NlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1BhZ2luYXRpb25TZXJ2aWNlJywgdGhpcy5wYWdpbmF0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUmVzaXplclNlcnZpY2UnLCB0aGlzLnJlc2l6ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTaGFyZWRTZXJ2aWNlJywgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTb3J0U2VydmljZScsIHRoaXMuc29ydFNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V2ZW50UHViU3ViU2VydmljZScsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUHViU3ViU2VydmljZScsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnVHJhbnNsYXRlclNlcnZpY2UnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdUcmVlRGF0YVNlcnZpY2UnLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemF0aW9uKHRoaXMuX2V2ZW50SGFuZGxlcik7XHJcbiAgICB0aGlzLl9pc0dyaWRJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgLy8gcmVjaGVjayB0aGUgZW1wdHkgd2FybmluZyBtZXNzYWdlIGFmdGVyIGdyaWQgaXMgc2hvd24gc28gdGhhdCBpdCB3b3JrcyBpbiBldmVyeSB1c2UgY2FzZVxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVFbXB0eURhdGFXYXJuaW5nTWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YXNldCkpIHtcclxuICAgICAgY29uc3QgZmluYWxUb3RhbENvdW50ID0gdGhpcy5kYXRhc2V0Lmxlbmd0aDtcclxuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZERlc3Ryb3knLCB0aGlzLnNsaWNrR3JpZCk7XHJcbiAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkFmdGVyR3JpZERlc3Ryb3llZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveShzaG91bGRFbXB0eURvbUVsZW1lbnRDb250YWluZXIgPSBmYWxzZSkge1xyXG4gICAgLy8gZGlzcG9zZSBvZiBhbGwgU2VydmljZXNcclxuICAgIHRoaXMuc2VydmljZUxpc3QuZm9yRWFjaCgoc2VydmljZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChzZXJ2aWNlICYmIHNlcnZpY2UuZGlzcG9zZSkge1xyXG4gICAgICAgIHNlcnZpY2UuZGlzcG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VydmljZUxpc3QgPSBbXTtcclxuXHJcbiAgICAvLyBkaXNwb3NlIGFsbCByZWdpc3RlcmVkIGV4dGVybmFsIHJlc291cmNlc1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcclxuICAgICAgd2hpbGUgKHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wb3AoKTtcclxuICAgICAgICBpZiAocmVzb3VyY2U/LmRpc3Bvc2UpIHtcclxuICAgICAgICAgIHJlc291cmNlLmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRpc3Bvc2UgdGhlIENvbXBvbmVudHNcclxuICAgIHRoaXMuc2xpY2tGb290ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuc2xpY2tFbXB0eVdhcm5pbmc/LmRpc3Bvc2UoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZXZlbnRIYW5kbGVyPy51bnN1YnNjcmliZUFsbCkge1xyXG4gICAgICB0aGlzLl9ldmVudEhhbmRsZXIudW5zdWJzY3JpYmVBbGwoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZT8udW5zdWJzY3JpYmVBbGwoKTtcclxuICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFWaWV3Py5zZXRJdGVtcykge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoW10pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmRlc3Ryb3kpIHtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3LmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2xpY2tHcmlkPy5kZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmRlc3Ryb3koc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXModGhpcy5iYWNrZW5kU2VydmljZUFwaSkpIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5iYWNrZW5kU2VydmljZUFwaVtwcm9wIGFzIGtleW9mIEJhY2tlbmRTZXJ2aWNlQXBpXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpKSB7XHJcbiAgICAgICh0aGlzLmNvbHVtbkRlZmluaXRpb25zIGFzIGFueSlbcHJvcF0gPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuc2hhcmVkU2VydmljZSkpIHtcclxuICAgICAgKHRoaXMuc2hhcmVkU2VydmljZSBhcyBhbnkpW3Byb3BdID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3ZSBjb3VsZCBvcHRpb25hbGx5IGFsc28gZW1wdHkgdGhlIGNvbnRlbnQgb2YgdGhlIGdyaWQgY29udGFpbmVyIERPTSBlbGVtZW50XHJcbiAgICBpZiAoc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHRoaXMuZW1wdHlHcmlkQ29udGFpbmVyRWxtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWxzbyB1bnN1YnNjcmliZSBhbGwgUnhKUyBzdWJzY3JpcHRpb25zXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSB1bnN1YnNjcmliZUFsbE9ic2VydmFibGVzKHRoaXMuc3Vic2NyaXB0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5fZGF0YXNldCA9IG51bGw7XHJcbiAgICB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBlbXB0eUdyaWRDb250YWluZXJFbG0oKSB7XHJcbiAgICBjb25zdCBncmlkQ29udGFpbmVySWQgPSB0aGlzLmdyaWRPcHRpb25zPy5ncmlkQ29udGFpbmVySWQgPz8gJ2dyaWQxJztcclxuICAgIGNvbnN0IGdyaWRDb250YWluZXJFbG0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtncmlkQ29udGFpbmVySWR9YCk7XHJcbiAgICBlbXB0eUVsZW1lbnQoZ3JpZENvbnRhaW5lckVsbSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgb3VyIGludGVybmFsIFBvc3QgUHJvY2VzcyBjYWxsYmFjaywgaXQgd2lsbCBleGVjdXRlIGludGVybmFsbHkgYWZ0ZXIgd2UgZ2V0IGJhY2sgcmVzdWx0IGZyb20gdGhlIFByb2Nlc3MgYmFja2VuZCBjYWxsXHJcbiAgICogRm9yIG5vdywgdGhpcyBpcyBHcmFwaFFMIFNlcnZpY2UgT05MWSBmZWF0dXJlIGFuZCBpdCB3aWxsIGJhc2ljYWxseSByZWZyZXNoIHRoZSBEYXRhc2V0ICYgUGFnaW5hdGlvbiB3aXRob3V0IGhhdmluZyB0aGUgdXNlciB0byBjcmVhdGUgaGlzIG93biBQb3N0UHJvY2VzcyBldmVyeSB0aW1lXHJcbiAgICovXHJcbiAgY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayhncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlKSB7XHJcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGlTZXJ2aWNlID0gYmFja2VuZEFwaS5zZXJ2aWNlO1xyXG5cclxuICAgICAgLy8gaW50ZXJuYWxQb3N0UHJvY2VzcyBvbmx5IHdvcmtzIChmb3Igbm93KSB3aXRoIGEgR3JhcGhRTCBTZXJ2aWNlLCBzbyBtYWtlIHN1cmUgaXQgaXMgb2YgdGhhdCB0eXBlXHJcbiAgICAgIGlmICh0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuZ2V0RGF0YXNldE5hbWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBiYWNrZW5kQXBpLmludGVybmFsUG9zdFByb2Nlc3MgPSAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSgpIDogJyc7XHJcbiAgICAgICAgICBpZiAocHJvY2Vzc1Jlc3VsdD8uZGF0YVtkYXRhc2V0TmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ25vZGVzJykgPyAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdLm5vZGVzIDogKHByb2Nlc3NSZXN1bHQgYXMgYW55KS5kYXRhW2RhdGFzZXROYW1lXTtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ3RvdGFsQ291bnQnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0udG90YWxDb3VudCA6IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hHcmlkRGF0YShkYXRhLCB0b3RhbENvdW50IHx8IDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemF0aW9uKGV2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIpIHtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMudHJhbnNsYXRlciA9IHRoaXMudHJhbnNsYXRlclNlcnZpY2U7XHJcbiAgICB0aGlzLl9ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXI7XHJcblxyXG4gICAgLy8gd2hlbiBkZXRlY3RpbmcgYSBmcm96ZW4gZ3JpZCwgd2UnbGwgYXV0b21hdGljYWxseSBlbmFibGUgdGhlIG1vdXNld2hlZWwgc2Nyb2xsIGhhbmRsZXIgc28gdGhhdCB3ZSBjYW4gc2Nyb2xsIGZyb20gYm90aCBsZWZ0L3JpZ2h0IGZyb3plbiBjb250YWluZXJzXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiAoKHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuUm93ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Sb3cgPj0gMCkgfHwgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA+PSAwKSAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZU1vdXNlV2hlZWxTY3JvbGxIYW5kbGVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVNb3VzZVdoZWVsU2Nyb2xsSGFuZGxlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSB0aGlzLmdyaWRPcHRpb25zPy5ldmVudE5hbWluZ1N0eWxlID8/IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZENyZWF0ZScsIHRydWUpO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YXNldCBpcyBpbml0aWFsaXplZCAoaWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpdCBjYW5ub3QgZ2V0TGVuZ3RoIG9mIG51bGwpXHJcbiAgICB0aGlzLl9kYXRhc2V0ID0gdGhpcy5fZGF0YXNldCB8fCBbXTtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB0aGlzLm1lcmdlR3JpZE9wdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb247XHJcbiAgICB0aGlzLmxvY2FsZXMgPSB0aGlzLmdyaWRPcHRpb25zPy5sb2NhbGVzID8/IENvbnN0YW50cy5sb2NhbGVzO1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZUFwaSA9IHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgdGhpcy5faXNMb2NhbEdyaWQgPSAhdGhpcy5iYWNrZW5kU2VydmljZUFwaTsgLy8gY29uc2lkZXJlZCBhIGxvY2FsIGdyaWQgaWYgaXQgZG9lc24ndCBoYXZlIGEgYmFja2VuZCBzZXJ2aWNlIHNldFxyXG5cclxuICAgIHRoaXMuY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgY29uc3QgZGF0YXZpZXdJbmxpbmVGaWx0ZXJzID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LmlubGluZUZpbHRlcnMgfHwgZmFsc2U7XHJcbiAgICAgIGxldCBkYXRhVmlld09wdGlvbnM6IERhdGFWaWV3T3B0aW9uID0geyBpbmxpbmVGaWx0ZXJzOiBkYXRhdmlld0lubGluZUZpbHRlcnMgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmRyYWdnYWJsZUdyb3VwaW5nIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlR3JvdXBpbmcpIHtcclxuICAgICAgICB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSBuZXcgU2xpY2suRGF0YS5Hcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyKCk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XHJcbiAgICAgICAgZGF0YVZpZXdPcHRpb25zID0geyAuLi5kYXRhVmlld09wdGlvbnMsIGdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI6IHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciB9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgU2xpY2suRGF0YS5EYXRhVmlldyhkYXRhVmlld09wdGlvbnMpO1xyXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25EYXRhdmlld0NyZWF0ZWQnLCB0aGlzLmRhdGFWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgYW55IHBvc3NpYmxlIFNlcnZpY2VzIHRoYXQgdXNlciB3YW50IHRvIHJlZ2lzdGVyIHdoaWNoIGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZFxyXG4gICAgLy8gUnhKUyBSZXNvdXJjZSBpcyBpbiB0aGlzIGxvdCBiZWNhdXNlIGl0IGhhcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGFuZCBkb2Vzbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluaXRpYWxpemVkXHJcbiAgICB0aGlzLnByZVJlZ2lzdGVyUmVzb3VyY2VzKCk7XHJcblxyXG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyLCB3ZSBwcm92aWRlIHRoZSBwcm9wZXJ0eSBcImVkaXRvclwiIGFzIGFuIEFuZ3VsYXItU2xpY2tncmlkIGVkaXRvciBjb21wbGV4IG9iamVjdFxyXG4gICAgLy8gaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XHJcbiAgICAvLyBzbyBpbiBvdXIgbGliIHdlIHdpbGwgc3dhcCBcImVkaXRvclwiIGFuZCBjb3B5IGl0IGludG8gYSBuZXcgcHJvcGVydHkgY2FsbGVkIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIlxyXG4gICAgLy8gdGhlbiB0YWtlIGJhY2sgXCJlZGl0b3IubW9kZWxcIiBhbmQgbWFrZSBpdCB0aGUgbmV3IFwiZWRpdG9yXCIgc28gdGhhdCBTbGlja0dyaWQgRWRpdG9yIEZhY3Rvcnkgc3RpbGwgd29ya3NcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gdGhpcy5zd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xyXG5cclxuICAgIC8vIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGF1dG9tYXRpY2FsbHkgYWRkIGEgQ3VzdG9tIEVkaXRvciBGb3JtYXR0ZXIsIHdlIG5lZWQgdG8gY2FsbCB0aGUgYXV0byBhZGQgZnVuY3Rpb24gYWdhaW5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpIHtcclxuICAgICAgYXV0b0FkZEVkaXRvckZvcm1hdHRlclRvQ29sdW1uc1dpdGhFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMsIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b0FkZEN1c3RvbUVkaXRvckZvcm1hdHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSByZWZlcmVuY2UgZm9yIGFsbCBjb2x1bW5zIGJlZm9yZSB0aGV5IG9wdGlvbmFsbHkgYmVjb21lIGhpZGRlbi92aXNpYmxlXHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucyA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuY3JlYXRlRXh0ZW5zaW9uc0JlZm9yZUdyaWRDcmVhdGlvbih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcblxyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUGlubmluZy9Gcm96ZW4gXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gYXBwbHkgdGhlbSBpbiB0aGUgZ3JpZCBvcHRpb25zXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5waW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB7IC4uLnRoaXMuZ3JpZE9wdGlvbnMsIC4uLnRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5waW5uaW5nIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYnVpbGQgU2xpY2tHcmlkIEdyaWQsIGFsc28gdXNlciBtaWdodCBvcHRpb25hbGx5IHBhc3MgYSBjdXN0b20gZGF0YXZpZXcgKGUuZy4gcmVtb3RlIG1vZGVsKVxyXG4gICAgdGhpcy5zbGlja0dyaWQgPSBuZXcgU2xpY2suR3JpZChgIyR7dGhpcy5ncmlkSWR9YCwgdGhpcy5jdXN0b21EYXRhVmlldyB8fCB0aGlzLmRhdGFWaWV3LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGF0YVZpZXcgPSB0aGlzLmRhdGFWaWV3O1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNsaWNrR3JpZCA9IHRoaXMuc2xpY2tHcmlkO1xyXG5cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5iaW5kRGlmZmVyZW50RXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5iaW5kRGlmZmVyZW50SG9va3ModGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuZGF0YVZpZXcpO1xyXG5cclxuICAgIC8vIHdoZW4gaXQncyBhIGZyb3plbiBncmlkLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGZyb3plbiBjb2x1bW4gaWQgZm9yIHJlZmVyZW5jZSBpZiB3ZSBldmVyIHNob3cvaGlkZSBjb2x1bW4gZnJvbSBDb2x1bW5QaWNrZXIvR3JpZE1lbnUgYWZ0ZXJ3YXJkXHJcbiAgICBjb25zdCBmcm96ZW5Db2x1bW5JbmRleCA9IHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA6IC0xO1xyXG4gICAgaWYgKGZyb3plbkNvbHVtbkluZGV4ID49IDAgJiYgZnJvemVuQ29sdW1uSW5kZXggPD0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5mcm96ZW5WaXNpYmxlQ29sdW1uSWQgPSB0aGlzLl9jb2x1bW5EZWZpbml0aW9uc1tmcm96ZW5Db2x1bW5JbmRleF0uaWQgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGFueSBwb3NzaWJsZSBTZXJ2aWNlcyB0aGF0IHVzZXIgd2FudCB0byByZWdpc3RlclxyXG4gICAgdGhpcy5yZWdpc3RlclJlc291cmNlcygpO1xyXG5cclxuICAgIC8vIGluaXRpYWxpemUgdGhlIFNsaWNrR3JpZCBncmlkXHJcbiAgICB0aGlzLnNsaWNrR3JpZC5pbml0KCk7XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZWQgdGhlIHJlc2l6ZXIgc2VydmljZSBvbmx5IGFmdGVyIFNsaWNrR3JpZCBpcyBpbml0aWFsaXplZFxyXG4gICAgLy8gaWYgd2UgZG9uJ3Qgd2UgZW5kIHVwIGJpbmRpbmcgb3VyIHJlc2l6ZSB0byBhIGdyaWQgZWxlbWVudCB0aGF0IGRvZXNuJ3QgeWV0IGV4aXN0IGluIHRoZSBET00gYW5kIHRoZSByZXNpemVyIHNlcnZpY2Ugd2lsbCBmYWlsIHNpbGVudGx5IChiZWNhdXNlIGl0IGhhcyBhIHRyeS9jYXRjaCB0aGF0IHVuYmluZHMgdGhlIHJlc2l6ZSB3aXRob3V0IHRocm93aW5nIGJhY2spXHJcbiAgICBpZiAodGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHVzZXIgY291bGQgc2hvdyBhIGN1c3RvbSBmb290ZXIgd2l0aCB0aGUgZGF0YSBtZXRyaWNzIChkYXRhc2V0IGxlbmd0aCBhbmQgbGFzdCB1cGRhdGVkIHRpbWVzdGFtcClcclxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnMuc2hvd0N1c3RvbUZvb3RlciAmJiB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMgJiYgdGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyID0gbmV3IFNsaWNrRm9vdGVyQ29tcG9uZW50KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyLnJlbmRlckZvb3Rlcih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldykge1xyXG4gICAgICBjb25zdCBpbml0aWFsRGF0YXNldCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVRyZWVEYXRhID8gdGhpcy5zb3J0VHJlZURhdGFzZXQodGhpcy5fZGF0YXNldCkgOiB0aGlzLl9kYXRhc2V0O1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoaW5pdGlhbERhdGFzZXQgfHwgW10sIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lKTtcclxuICAgICAgdGhpcy5kYXRhVmlldy5lbmRVcGRhdGUoKTtcclxuXHJcbiAgICAgIC8vIGlmIHlvdSBkb24ndCB3YW50IHRoZSBpdGVtcyB0aGF0IGFyZSBub3QgdmlzaWJsZSAoZHVlIHRvIGJlaW5nIGZpbHRlcmVkIG91dCBvciBiZWluZyBvbiBhIGRpZmZlcmVudCBwYWdlKVxyXG4gICAgICAvLyB0byBzdGF5IHNlbGVjdGVkLCBwYXNzICdmYWxzZScgdG8gdGhlIHNlY29uZCBhcmdcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uTW9kZWwgPSB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLnNsaWNrR3JpZC5nZXRTZWxlY3Rpb25Nb2RlbCgpO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uTW9kZWwgJiYgdGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3ICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaGFzT3duUHJvcGVydHkoJ3N5bmNHcmlkU2VsZWN0aW9uJykpIHtcclxuICAgICAgICAvLyBpZiB3ZSBhcmUgdXNpbmcgYSBCYWNrZW5kIFNlcnZpY2UsIHdlIHdpbGwgZG8gYW4gZXh0cmEgZmxhZyBjaGVjaywgdGhlIHJlYXNvbiBpcyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgc29tZSB1bmludGVuZGVkIGJlaGF2aW9yc1xyXG4gICAgICAgIC8vIHdpdGggdGhlIEJhY2tlbmRTZXJ2aWNlQXBpIGJlY2F1c2UgdGVjaG5pY2FsbHkgdGhlIGRhdGEgaW4gdGhlIHBhZ2UgY2hhbmdlcyB0aGUgRGF0YVZpZXcgb24gZXZlcnkgcGFnZSBjaGFuZ2UuXHJcbiAgICAgICAgbGV0IHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5oYXNPd25Qcm9wZXJ0eSgnc3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2UnKSkge1xyXG4gICAgICAgICAgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQgPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlIGFzIGJvb2xlYW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzeW5jR3JpZFNlbGVjdGlvbiA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb247XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzeW5jR3JpZFNlbGVjdGlvbiA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICBsZXQgcHJlc2VydmVkUm93U2VsZWN0aW9uID0gc3luY0dyaWRTZWxlY3Rpb247XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgICAgICAgIC8vIHdoZW4gdXNpbmcgQmFja2VuZFNlcnZpY2VBcGksIHdlJ2xsIGJlIHVzaW5nIHRoZSBcInN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlXCIgZmxhZyBCVVQgXCJzeW5jR3JpZFNlbGVjdGlvblwiIG11c3QgYWxzbyBiZSBzZXQgdG8gVHJ1ZVxyXG4gICAgICAgICAgICBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24gPSBzeW5jR3JpZFNlbGVjdGlvbiAmJiBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb24odGhpcy5zbGlja0dyaWQsIHByZXNlcnZlZFJvd1NlbGVjdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3luY0dyaWRTZWxlY3Rpb24gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uKHRoaXMuc2xpY2tHcmlkLCBzeW5jR3JpZFNlbGVjdGlvbi5wcmVzZXJ2ZUhpZGRlbiwgc3luY0dyaWRTZWxlY3Rpb24ucHJlc2VydmVIaWRkZW5PblNlbGVjdGlvbkNoYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXRhc2V0TG4gPSB0aGlzLmRhdGFWaWV3LmdldExlbmd0aCgpIHx8IHRoaXMuX2RhdGFzZXQgJiYgdGhpcy5fZGF0YXNldC5sZW5ndGggfHwgMDtcclxuICAgICAgaWYgKGRhdGFzZXRMbiA+IDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24pKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcbiAgICAgICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXNlciBtaWdodCB3YW50IHRvIGhpZGUgdGhlIGhlYWRlciByb3cgb24gcGFnZSBsb2FkIGJ1dCBzdGlsbCBoYXZlIGBlbmFibGVGaWx0ZXJpbmc6IHRydWVgXHJcbiAgICAvLyBpZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBuZWVkIHRvIGhpZGUgdGhlIGhlYWRlclJvdyBPTkxZIEFGVEVSIGFsbCBmaWx0ZXJzIGdvdCBjcmVhdGVkICYgZGF0YVZpZXcgZXhpc3RcclxuICAgIGlmICh0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCkge1xyXG4gICAgICB0aGlzLnNob3dIZWFkZXJSb3coZmFsc2UpO1xyXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaXNoICYgZGlzcGF0Y2ggY2VydGFpbiBldmVudHNcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkdyaWRDcmVhdGVkJywgdGhpcy5zbGlja0dyaWQpO1xyXG5cclxuICAgIC8vIGFmdGVyIHRoZSBEYXRhVmlldyBpcyBjcmVhdGVkICYgdXBkYXRlZCBleGVjdXRlIHNvbWUgcHJvY2Vzc2VzXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgdGhpcy5leGVjdXRlQWZ0ZXJEYXRhdmlld0NyZWF0ZWQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGJpbmQgcmVzaXplIE9OTFkgYWZ0ZXIgdGhlIGRhdGFWaWV3IGlzIHJlYWR5XHJcbiAgICB0aGlzLmJpbmRSZXNpemVIb29rKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICAvLyBiaW5kIHRoZSBCYWNrZW5kIFNlcnZpY2UgQVBJIGNhbGxiYWNrIGZ1bmN0aW9ucyBvbmx5IGFmdGVyIHRoZSBncmlkIGlzIGluaXRpYWxpemVkXHJcbiAgICAvLyBiZWNhdXNlIHRoZSBwcmVQcm9jZXNzKCkgYW5kIG9uSW5pdCgpIG1pZ2h0IGdldCB0cmlnZ2VyZWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICB0aGlzLmJpbmRCYWNrZW5kQ2FsbGJhY2tGdW5jdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9jYWwgZ3JpZCwgY2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IHRoZSBQYWdpbmF0aW9uXHJcbiAgICAvLyBpZiBzbyB0aGVuIGFsc28gY2hlY2sgaWYgdGhlcmUncyBhbnkgcHJlc2V0cyBhbmQgZmluYWxseSBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uU2VydmljZVxyXG4gICAgLy8gYSBsb2NhbCBncmlkIHdpdGggUGFnaW5hdGlvbiBwcmVzZXRzIHdpbGwgcG90ZW50aWFsbHkgaGF2ZSBhIGRpZmZlcmVudCB0b3RhbCBvZiBpdGVtcywgd2UnbGwgbmVlZCB0byBnZXQgaXQgZnJvbSB0aGUgRGF0YVZpZXcgYW5kIHVwZGF0ZSBvdXIgdG90YWxcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLmxvYWRMb2NhbEdyaWRQYWdpbmF0aW9uKHRoaXMuZGF0YXNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB7XHJcbiAgICAgIC8vIFNsaWNrIEdyaWQgJiBEYXRhVmlldyBvYmplY3RzXHJcbiAgICAgIGRhdGFWaWV3OiB0aGlzLmRhdGFWaWV3LFxyXG4gICAgICBzbGlja0dyaWQ6IHRoaXMuc2xpY2tHcmlkLFxyXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvblNlcnZpY2U/LmV4dGVuc2lvbkxpc3QsXHJcblxyXG4gICAgICAvLyBwdWJsaWMgbWV0aG9kc1xyXG4gICAgICBkZXN0cm95OiB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIC8vIHJldHVybiBhbGwgYXZhaWxhYmxlIFNlcnZpY2VzIChub24tc2luZ2xldG9uKVxyXG4gICAgICBiYWNrZW5kU2VydmljZTogdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGk/LnNlcnZpY2UsXHJcbiAgICAgIGZpbHRlclNlcnZpY2U6IHRoaXMuZmlsdGVyU2VydmljZSxcclxuICAgICAgZ3JpZEV2ZW50U2VydmljZTogdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLFxyXG4gICAgICBncmlkU3RhdGVTZXJ2aWNlOiB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsXHJcbiAgICAgIGdyaWRTZXJ2aWNlOiB0aGlzLmdyaWRTZXJ2aWNlLFxyXG4gICAgICBncm91cGluZ1NlcnZpY2U6IHRoaXMuZ3JvdXBpbmdTZXJ2aWNlLFxyXG4gICAgICBleHRlbnNpb25TZXJ2aWNlOiB0aGlzLmV4dGVuc2lvblNlcnZpY2UsXHJcbiAgICAgIHBhZ2luYXRpb25TZXJ2aWNlOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLFxyXG4gICAgICByZXNpemVyU2VydmljZTogdGhpcy5yZXNpemVyU2VydmljZSxcclxuICAgICAgc29ydFNlcnZpY2U6IHRoaXMuc29ydFNlcnZpY2UsXHJcbiAgICAgIHRyZWVEYXRhU2VydmljZTogdGhpcy50cmVlRGF0YVNlcnZpY2UsXHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWxsIGluc3RhbmNlcyAoU2xpY2tHcmlkLCBEYXRhVmlldyAmIGFsbCBTZXJ2aWNlcylcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkFuZ3VsYXJHcmlkQ3JlYXRlZCcsIHRoaXMuX2FuZ3VsYXJHcmlkSW5zdGFuY2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIGEgUGFnaW5hdGlvbiBjaGFuZ2VkLCB3ZSB3aWxsIHRyaWdnZXIgYSBHcmlkIFN0YXRlIGNoYW5nZWQgd2l0aCB0aGUgbmV3IHBhZ2luYXRpb24gaW5mb1xyXG4gICAqIEFsc28gaWYgd2UgdXNlIFJvdyBTZWxlY3Rpb24gb3IgdGhlIENoZWNrYm94IFNlbGVjdG9yLCB3ZSBuZWVkIHRvIHJlc2V0IGFueSBzZWxlY3Rpb25cclxuICAgKi9cclxuICBwYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uOiBTZXJ2aWNlUGFnaW5hdGlvbikge1xyXG4gICAgY29uc3QgaXNTeW5jR3JpZFNlbGVjdGlvbkVuYWJsZWQgPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2U/Lm5lZWRUb1ByZXNlcnZlUm93U2VsZWN0aW9uKCkgPz8gZmFsc2U7XHJcbiAgICBpZiAoIWlzU3luY0dyaWRTZWxlY3Rpb25FbmFibGVkICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhbXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0gPSBwYWdpbmF0aW9uO1xyXG4gICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZSkge1xyXG4gICAgICBpZiAocGFnZVNpemUgIT09IHVuZGVmaW5lZCAmJiBwYWdlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY3VycmVudFBhZ2luYXRpb24gPSB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkdyaWRTdGF0ZUNoYW5nZWQnLCB7XHJcbiAgICAgIGNoYW5nZTogeyBuZXdWYWx1ZXM6IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfSwgdHlwZTogR3JpZFN0YXRlVHlwZS5wYWdpbmF0aW9uIH0sXHJcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEN1cnJlbnRHcmlkU3RhdGUoKVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBkYXRhc2V0IGNoYW5nZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgZW50aXJlIGdyaWQgVUkgJiBwb3NzaWJseSByZXNpemUgaXQgYXMgd2VsbFxyXG4gICAqIEBwYXJhbSBkYXRhc2V0XHJcbiAgICovXHJcbiAgcmVmcmVzaEdyaWREYXRhKGRhdGFzZXQ6IGFueVtdLCB0b3RhbENvdW50PzogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlICYmIEFycmF5LmlzQXJyYXkoZGF0YXNldCkpIHtcclxuICAgICAgY29uc3QgZmluYWxUb3RhbENvdW50ID0gdG90YWxDb3VudCB8fCBkYXRhc2V0Lmxlbmd0aDtcclxuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhc2V0KSAmJiB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmRhdGFWaWV3Py5zZXRJdGVtcykge1xyXG4gICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKGRhdGFzZXQsIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lKTtcclxuICAgICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyZWVEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhVmlldy5yZVNvcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGFzZXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGFzZXQpIHtcclxuICAgICAgICB0aGlzLnNsaWNrR3JpZC5pbnZhbGlkYXRlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGRpc3BsYXkgdGhlIFBhZ2luYXRpb24gY29tcG9uZW50IG9ubHkgYWZ0ZXIgY2FsbGluZyB0aGlzIHJlZnJlc2ggZGF0YSBmaXJzdCwgd2UgY2FsbCBpdCBoZXJlIHNvIHRoYXQgaWYgd2UgcHJlc2V0IHBhZ2luYXRpb24gcGFnZSBudW1iZXIgaXQgd2lsbCBiZSBzaG93biBjb3JyZWN0bHlcclxuICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9ICh0aGlzLmdyaWRPcHRpb25zICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID09PSB1bmRlZmluZWQpKSkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbiAmJiB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25PcHRpb25zID0gdGhpcy5zZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zIGFzIFBhZ2luYXRpb24pO1xyXG4gICAgICAgIC8vIHdoZW4gd2UgaGF2ZSBhIHRvdGFsQ291bnQgdXNlIGl0LCBlbHNlIHdlJ2xsIHRha2UgaXQgZnJvbSB0aGUgcGFnaW5hdGlvbiBvYmplY3RcclxuICAgICAgICAvLyBvbmx5IHVwZGF0ZSB0aGUgdG90YWwgaXRlbXMgaWYgaXQncyBkaWZmZXJlbnQgdG8gYXZvaWQgcmVmcmVzaGluZyB0aGUgVUlcclxuICAgICAgICBjb25zdCB0b3RhbFJlY29yZHMgPSAodG90YWxDb3VudCAhPT0gdW5kZWZpbmVkKSA/IHRvdGFsQ291bnQgOiAodGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbj8udG90YWxJdGVtcyk7XHJcbiAgICAgICAgaWYgKHRvdGFsUmVjb3JkcyAhPT0gdW5kZWZpbmVkICYmIHRvdGFsUmVjb3JkcyAhPT0gdGhpcy50b3RhbEl0ZW1zKSB7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSArdG90YWxSZWNvcmRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlIHdpdGggbmV3IHBhZ2luYXRpb24gb3B0aW9ucyAod2hpY2ggbWlnaHQgaGF2ZSBwcmVzZXRzKVxyXG4gICAgICAgIGlmICghdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVBhZ2luYXRpb25TZXJ2aWNlKHBhZ2luYXRpb25PcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBwYWdpbmF0aW9uIHNlcnZpY2Ugd2l0aCB0aGUgbmV3IHRvdGFsXHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVRvdGFsSXRlbXModGhpcy50b3RhbEl0ZW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc2l6ZSB0aGUgZ3JpZCBpbnNpZGUgYSBzbGlnaHQgdGltZW91dCwgaW4gY2FzZSBvdGhlciBET00gZWxlbWVudCBjaGFuZ2VkIHByaW9yIHRvIHRoZSByZXNpemUgKGxpa2UgYSBmaWx0ZXIvcGFnaW5hdGlvbiBjaGFuZ2VkKVxyXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplKSB7XHJcbiAgICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLmdyaWRPcHRpb25zLmF1dG9SZXNpemUgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvUmVzaXplLmRlbGF5O1xyXG4gICAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZChkZWxheSB8fCAxMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZXJlJ3MgYW55IFBhZ2luYXRpb24gUHJlc2V0cyBkZWZpbmVkIGluIHRoZSBHcmlkIE9wdGlvbnMsXHJcbiAgICogaWYgdGhlcmUgYXJlIHRoZW4gbG9hZCB0aGVtIGluIHRoZSBwYWdpbmF0aW9uT3B0aW9ucyBvYmplY3RcclxuICAgKi9cclxuICBzZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uLCBwYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbik6IFBhZ2luYXRpb24ge1xyXG4gICAgaWYgKGdyaWRPcHRpb25zLnByZXNldHM/LnBhZ2luYXRpb24gJiYgcGFnaW5hdGlvbk9wdGlvbnMgJiYgIXRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkKSB7XHJcbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLnBhZ2VTaXplID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uLnBhZ2VTaXplO1xyXG4gICAgICBwYWdpbmF0aW9uT3B0aW9ucy5wYWdlTnVtYmVyID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uLnBhZ2VOdW1iZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFnaW5hdGlvbk9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEeW5hbWljYWxseSBjaGFuZ2Ugb3IgdXBkYXRlIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgbGlzdC5cclxuICAgKiBXZSB3aWxsIHJlLXJlbmRlciB0aGUgZ3JpZCBzbyB0aGF0IHRoZSBuZXcgaGVhZGVyIGFuZCBkYXRhIHNob3dzIHVwIGNvcnJlY3RseS5cclxuICAgKiBJZiB1c2luZyBpMThuLCB3ZSBhbHNvIG5lZWQgdG8gdHJpZ2dlciBhIHJlLXRyYW5zbGF0ZSBvZiB0aGUgY29sdW1uIGhlYWRlcnNcclxuICAgKi9cclxuICB1cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QobmV3Q29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XHJcbiAgICAvLyBtYXAvc3dhcCB0aGUgaW50ZXJuYWwgbGlicmFyeSBFZGl0b3IgdG8gdGhlIFNsaWNrR3JpZCBFZGl0b3IgZmFjdG9yeVxyXG4gICAgbmV3Q29sdW1uRGVmaW5pdGlvbnMgPSB0aGlzLnN3YXBJbnRlcm5hbEVkaXRvclRvU2xpY2tHcmlkRmFjdG9yeUVkaXRvcihuZXdDb2x1bW5EZWZpbml0aW9ucyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5IZWFkZXJzKGZhbHNlLCBuZXdDb2x1bW5EZWZpbml0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucmVuZGVyQ29sdW1uSGVhZGVycyhuZXdDb2x1bW5EZWZpbml0aW9ucywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xyXG4gICAgICB0aGlzLnNsaWNrR3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50ICYmIHRoaXMucmVzaXplclNlcnZpY2U/LnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSB7XHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgdGhlIGZpbHRlciByb3cgZGlzcGxheWVkIG9uIGZpcnN0IHJvdywgd2UgY2FuIG9wdGlvbmFsbHkgcGFzcyBmYWxzZSB0byBoaWRlIGl0LlxyXG4gICAqIEBwYXJhbSBzaG93aW5nXHJcbiAgICovXHJcbiAgc2hvd0hlYWRlclJvdyhzaG93aW5nID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zbGlja0dyaWQuc2V0SGVhZGVyUm93VmlzaWJpbGl0eShzaG93aW5nLCBmYWxzZSk7XHJcbiAgICBpZiAoc2hvd2luZyA9PT0gdHJ1ZSAmJiB0aGlzLl9pc0dyaWRJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLnNsaWNrR3JpZC5zZXRDb2x1bW5zKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNob3dpbmc7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIHByaXZhdGUgZnVuY3Rpb25zXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIExvb3AgdGhyb3VnaCBhbGwgY29sdW1uIGRlZmluaXRpb25zIGFuZCBjb3B5IHRoZSBvcmlnaW5hbCBvcHRpb25hbCBgd2lkdGhgIHByb3BlcnRpZXMgb3B0aW9uYWxseSBwcm92aWRlZCBieSB0aGUgdXNlci5cclxuICAgKiBXZSB3aWxsIHVzZSB0aGlzIHdoZW4gZG9pbmcgYSByZXNpemUgYnkgY2VsbCBjb250ZW50LCBpZiB1c2VyIHByb3ZpZGVkIGEgYHdpZHRoYCBpdCB3b24ndCBvdmVycmlkZSBpdC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvcHlDb2x1bW5XaWR0aHNSZWZlcmVuY2UoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5EZWZpbml0aW9ucy5mb3JFYWNoKGNvbCA9PiBjb2wub3JpZ2luYWxXaWR0aCA9IGNvbC53aWR0aCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BsYXlFbXB0eURhdGFXYXJuaW5nKHNob3dXYXJuaW5nID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZz8uc2hvd0VtcHR5RGF0YU1lc3NhZ2Uoc2hvd1dhcm5pbmcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiaW5kRGlmZmVyZW50SG9va3MoZ3JpZDogU2xpY2tHcmlkLCBncmlkT3B0aW9uczogR3JpZE9wdGlvbiwgZGF0YVZpZXc6IFNsaWNrRGF0YVZpZXcpIHtcclxuICAgIC8vIG9uIGxvY2FsZSBjaGFuZ2UsIHdlIGhhdmUgdG8gbWFudWFsbHkgdHJhbnNsYXRlIHRoZSBIZWFkZXJzLCBHcmlkTWVudVxyXG4gICAgaWYgKHRoaXMudHJhbnNsYXRlPy5vbkxhbmdDaGFuZ2UpIHtcclxuICAgICAgLy8gdHJhbnNsYXRlIHNvbWUgb2YgdGhlbSBvbiBmaXJzdCBsb2FkLCB0aGVuIG9uIGVhY2ggbGFuZ3VhZ2UgY2hhbmdlXHJcbiAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVDdXN0b21Gb290ZXJUZXh0cygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNlbGxNZW51KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5IZWFkZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5QaWNrZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbnRleHRNZW51KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVHcmlkTWVudSgpO1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudHJhbnNsYXRlSGVhZGVyTWVudSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUN1c3RvbUZvb3RlclRleHRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XHJcbiAgICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5jcmVhdGVQcmVIZWFkZXJQYW5lbCAmJiAhZ3JpZE9wdGlvbnMuZW5hYmxlRHJhZ2dhYmxlR3JvdXBpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nU2VydmljZS50cmFuc2xhdGVHcm91cGluZ0FuZENvbFNwYW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgLy8gYmluZCBleHRlcm5hbCBzb3J0aW5nIChiYWNrZW5kKSB3aGVuIGF2YWlsYWJsZSBvciBkZWZhdWx0IG9uU29ydCAoZGF0YVZpZXcpXHJcbiAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVTb3J0aW5nKSB7XHJcbiAgICAgICAgLy8gYmluZCBleHRlcm5hbCBzb3J0aW5nIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICFncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaS51c2VMb2NhbFNvcnRpbmcpIHtcclxuICAgICAgICAgIHRoaXMuc29ydFNlcnZpY2UuYmluZEJhY2tlbmRPblNvcnQoZ3JpZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc29ydFNlcnZpY2UuYmluZExvY2FsT25Tb3J0KGdyaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYmluZCBleHRlcm5hbCBmaWx0ZXIgKGJhY2tlbmQpIHdoZW4gYXZhaWxhYmxlIG9yIGRlZmF1bHQgb25GaWx0ZXIgKGRhdGFWaWV3KVxyXG4gICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmluaXQoZ3JpZCk7XHJcblxyXG4gICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgZmlsdGVyIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICFncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaS51c2VMb2NhbEZpbHRlcmluZykge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmJpbmRCYWNrZW5kT25GaWx0ZXIoZ3JpZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5iaW5kTG9jYWxPbkZpbHRlcihncmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGxvYWQgYW55IHByZXNldHMgaWYgYW55IChhZnRlciBkYXRhc2V0IGlzIGluaXRpYWxpemVkKVxyXG4gICAgICB0aGlzLmxvYWRDb2x1bW5QcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xyXG4gICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBpZiB1c2VyIHNldCBhbiBvbkluaXQgQmFja2VuZCwgd2UnbGwgcnVuIGl0IHJpZ2h0IGF3YXkgKGFuZCBpZiBzbywgd2UgYWxzbyBuZWVkIHRvIHJ1biBwcmVQcm9jZXNzLCBpbnRlcm5hbFBvc3RQcm9jZXNzICYgcG9zdFByb2Nlc3MpXHJcbiAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpIHtcclxuICAgICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG5cclxuICAgICAgaWYgKGJhY2tlbmRBcGk/LnNlcnZpY2U/LmluaXQpIHtcclxuICAgICAgICBiYWNrZW5kQXBpLnNlcnZpY2UuaW5pdChiYWNrZW5kQXBpLm9wdGlvbnMsIGdyaWRPcHRpb25zLnBhZ2luYXRpb24sIHRoaXMuc2xpY2tHcmlkLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFWaWV3ICYmIGdyaWQpIHtcclxuICAgICAgY29uc3Qgc2xpY2tncmlkRXZlbnRQcmVmaXggPSB0aGlzLmdyaWRPcHRpb25zPy5kZWZhdWx0U2xpY2tncmlkRXZlbnRQcmVmaXggPz8gJyc7XHJcblxyXG4gICAgICAvLyBleHBvc2UgYWxsIFNsaWNrIEdyaWQgRXZlbnRzIHRocm91Z2ggZGlzcGF0Y2hcclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGdyaWQpIHtcclxuICAgICAgICBpZiAoZ3JpZC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wLnN0YXJ0c1dpdGgoJ29uJykpIHtcclxuICAgICAgICAgIGNvbnN0IGdyaWRFdmVudEhhbmRsZXIgPSAoZ3JpZCBhcyBhbnkpW3Byb3BdO1xyXG4gICAgICAgICAgY29uc3QgZ3JpZEV2ZW50TmFtZSA9IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5nZXRFdmVudE5hbWVCeU5hbWluZ0NvbnZlbnRpb24ocHJvcCwgc2xpY2tncmlkRXZlbnRQcmVmaXgpO1xyXG4gICAgICAgICAgKHRoaXMuX2V2ZW50SGFuZGxlciBhcyBTbGlja0V2ZW50SGFuZGxlcjxHZXRTbGlja0V2ZW50VHlwZTx0eXBlb2YgZ3JpZEV2ZW50SGFuZGxlcj4+KS5zdWJzY3JpYmUoZ3JpZEV2ZW50SGFuZGxlciwgKGV2ZW50LCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZGlzcGF0Y2hDdXN0b21FdmVudChncmlkRXZlbnROYW1lLCB7IGV2ZW50RGF0YTogZXZlbnQsIGFyZ3MgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGV4cG9zZSBhbGwgU2xpY2sgRGF0YVZpZXcgRXZlbnRzIHRocm91Z2ggZGlzcGF0Y2hcclxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGRhdGFWaWV3KSB7XHJcbiAgICAgICAgaWYgKGRhdGFWaWV3Lmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3Auc3RhcnRzV2l0aCgnb24nKSkge1xyXG4gICAgICAgICAgY29uc3QgZGF0YVZpZXdFdmVudEhhbmRsZXIgPSAoZGF0YVZpZXcgYXMgYW55KVtwcm9wXTtcclxuICAgICAgICAgICh0aGlzLl9ldmVudEhhbmRsZXIgYXMgU2xpY2tFdmVudEhhbmRsZXI8R2V0U2xpY2tFdmVudFR5cGU8dHlwZW9mIGRhdGFWaWV3RXZlbnRIYW5kbGVyPj4pLnN1YnNjcmliZShkYXRhVmlld0V2ZW50SGFuZGxlciwgKGV2ZW50LCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3RXZlbnROYW1lID0gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmdldEV2ZW50TmFtZUJ5TmFtaW5nQ29udmVudGlvbihwcm9wLCBzbGlja2dyaWRFdmVudFByZWZpeCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZGlzcGF0Y2hDdXN0b21FdmVudChkYXRhVmlld0V2ZW50TmFtZSwgeyBldmVudERhdGE6IGV2ZW50LCBhcmdzIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBvbiBjZWxsIGNsaWNrLCBtYWlubHkgdXNlZCB3aXRoIHRoZSBjb2x1bW5EZWYuYWN0aW9uIGNhbGxiYWNrXHJcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZS5iaW5kT25DZWxsQ2hhbmdlKGdyaWQpO1xyXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UuYmluZE9uQ2xpY2soZ3JpZCk7XHJcblxyXG4gICAgICBpZiAoZGF0YVZpZXcgJiYgZ3JpZCkge1xyXG4gICAgICAgIC8vIFdoZW4gZGF0YSBjaGFuZ2VzIGluIHRoZSBEYXRhVmlldywgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBtZXRyaWNzIGFuZC9vciBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgZGF0YXNldCBpcyBlbXB0eVxyXG4gICAgICAgIGNvbnN0IG9uUm93Q291bnRDaGFuZ2VkSGFuZGxlciA9IGRhdGFWaWV3Lm9uUm93Q291bnRDaGFuZ2VkO1xyXG4gICAgICAgICh0aGlzLl9ldmVudEhhbmRsZXIgYXMgU2xpY2tFdmVudEhhbmRsZXI8R2V0U2xpY2tFdmVudFR5cGU8dHlwZW9mIG9uUm93Q291bnRDaGFuZ2VkSGFuZGxlcj4+KS5zdWJzY3JpYmUob25Sb3dDb3VudENoYW5nZWRIYW5kbGVyLCAoX2UsIGFyZ3MpID0+IHtcclxuICAgICAgICAgIGdyaWQuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoYXJncy5jdXJyZW50IHx8IDAsIGRhdGFWaWV3LmdldEl0ZW1Db3VudCgpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBvblNldEl0ZW1zQ2FsbGVkSGFuZGxlciA9IGRhdGFWaWV3Lm9uU2V0SXRlbXNDYWxsZWQ7XHJcbiAgICAgICAgKHRoaXMuX2V2ZW50SGFuZGxlciBhcyBTbGlja0V2ZW50SGFuZGxlcjxHZXRTbGlja0V2ZW50VHlwZTx0eXBlb2Ygb25TZXRJdGVtc0NhbGxlZEhhbmRsZXI+Pikuc3Vic2NyaWJlKG9uU2V0SXRlbXNDYWxsZWRIYW5kbGVyLCAoX2UsIGFyZ3MpID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKGRhdGFWaWV3LmdldExlbmd0aCgpLCBhcmdzLml0ZW1Db3VudCk7XHJcblxyXG4gICAgICAgICAgLy8gd2hlbiB1c2VyIGhhcyByZXNpemUgYnkgY29udGVudCBlbmFibGVkLCB3ZSdsbCBmb3JjZSBhIGZ1bGwgd2lkdGggY2FsY3VsYXRpb24gc2luY2Ugd2UgY2hhbmdlIG91ciBlbnRpcmUgZGF0YXNldFxyXG4gICAgICAgICAgaWYgKGFyZ3MuaXRlbUNvdW50ID4gMCAmJiAodGhpcy5ncmlkT3B0aW9ucy5hdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWQgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQoIXRoaXMuZ3JpZE9wdGlvbnM/LnJlc2l6ZUJ5Q29udGVudE9ubHlPbkZpcnN0TG9hZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9uUm93c0NoYW5nZWRIYW5kbGVyID0gZGF0YVZpZXcub25Sb3dzQ2hhbmdlZDtcclxuICAgICAgICAodGhpcy5fZXZlbnRIYW5kbGVyIGFzIFNsaWNrRXZlbnRIYW5kbGVyPEdldFNsaWNrRXZlbnRUeXBlPHR5cGVvZiBvblJvd3NDaGFuZ2VkSGFuZGxlcj4+KS5zdWJzY3JpYmUob25Sb3dzQ2hhbmdlZEhhbmRsZXIsIChfZSwgYXJncykgPT4ge1xyXG4gICAgICAgICAgLy8gZmlsdGVyaW5nIGRhdGEgd2l0aCBsb2NhbCBkYXRhc2V0IHdpbGwgbm90IGFsd2F5cyBzaG93IGNvcnJlY3RseSB1bmxlc3Mgd2UgY2FsbCB0aGlzIHVwZGF0ZVJvdy9yZW5kZXJcclxuICAgICAgICAgIC8vIGFsc28gZG9uJ3QgdXNlIFwiaW52YWxpZGF0ZVJvd3NcIiBzaW5jZSBpdCBkZXN0cm95cyB0aGUgZW50aXJlIHJvdyBhbmQgYXMgYmFkIHVzZXIgZXhwZXJpZW5jZSB3aGVuIHVwZGF0aW5nIGEgcm93XHJcbiAgICAgICAgICAvLyBzZWUgY29tbWl0OiBodHRwczovL2dpdGh1Yi5jb20vZ2hpc2NvZGluZy9hdXJlbGlhLXNsaWNrZ3JpZC9jb21taXQvOGM1MDNhNGQ0NWZiYTExY2JkOGQ4Y2M0NjdmYWU4ZDE3N2NjNGY2MFxyXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiAhZ3JpZE9wdGlvbnMuZW5hYmxlUm93RGV0YWlsVmlldykge1xyXG4gICAgICAgICAgICBpZiAoYXJncz8ucm93cyAmJiBBcnJheS5pc0FycmF5KGFyZ3Mucm93cykpIHtcclxuICAgICAgICAgICAgICBhcmdzLnJvd3MuZm9yRWFjaCgocm93OiBudW1iZXIpID0+IGdyaWQudXBkYXRlUm93KHJvdykpO1xyXG4gICAgICAgICAgICAgIGdyaWQucmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRvZXMgdGhlIHVzZXIgaGF2ZSBhIGNvbHNwYW4gY2FsbGJhY2s/XHJcbiAgICBpZiAoZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrICYmIGRhdGFWaWV3ICYmIGRhdGFWaWV3LmdldEl0ZW0gJiYgZGF0YVZpZXcuZ2V0SXRlbU1ldGFkYXRhKSB7XHJcbiAgICAgIGRhdGFWaWV3LmdldEl0ZW1NZXRhZGF0YSA9IChyb3dOdW1iZXI6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBjYWxsYmFja1Jlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjayAmJiBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2spIHtcclxuICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrKGRhdGFWaWV3LmdldEl0ZW0ocm93TnVtYmVyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdDtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZEJhY2tlbmRDYWxsYmFja0Z1bmN0aW9ucyhncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgY29uc3QgYmFja2VuZEFwaVNlcnZpY2UgPSBiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGkuc2VydmljZTtcclxuICAgIGNvbnN0IHNlcnZpY2VPcHRpb25zOiBCYWNrZW5kU2VydmljZU9wdGlvbiA9IGJhY2tlbmRBcGlTZXJ2aWNlPy5vcHRpb25zID8/IHt9O1xyXG4gICAgY29uc3QgaXNFeGVjdXRlQ29tbWFuZE9uSW5pdCA9ICghc2VydmljZU9wdGlvbnMpID8gZmFsc2UgOiAoKHNlcnZpY2VPcHRpb25zICYmIHNlcnZpY2VPcHRpb25zLmhhc093blByb3BlcnR5KCdleGVjdXRlUHJvY2Vzc0NvbW1hbmRPbkluaXQnKSkgPyBzZXJ2aWNlT3B0aW9uc1snZXhlY3V0ZVByb2Nlc3NDb21tYW5kT25Jbml0J10gOiB0cnVlKTtcclxuXHJcbiAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UpIHtcclxuICAgICAgLy8gdXBkYXRlIGJhY2tlbmQgZmlsdGVycyAoaWYgbmVlZCBiZSkgQkVGT1JFIHRoZSBxdWVyeSBydW5zICh2aWEgdGhlIG9uSW5pdCBjb21tYW5kIGEgZmV3IGxpbmVzIGJlbG93KVxyXG4gICAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBhbnkgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgZ3JpZFxyXG4gICAgICBpZiAoZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cykge1xyXG4gICAgICAgIC8vIEZpbHRlcnMgXCJwcmVzZXRzXCJcclxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycykgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMoZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU29ydGVycyBcInByZXNldHNcIlxyXG4gICAgICAgIGlmIChiYWNrZW5kQXBpU2VydmljZS51cGRhdGVTb3J0ZXJzICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzKSAmJiBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gd2hlbiB1c2luZyBtdWx0aS1jb2x1bW4gc29ydCwgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYnV0IG9uIHNpbmdsZSBzb3J0IHRoZW4gb25seSBncmFiIHRoZSBmaXJzdCBzb3J0IHByb3ZpZGVkXHJcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMubXVsdGlDb2x1bW5Tb3J0ID8gZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzIDogZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLnNsaWNlKDAsIDEpO1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlU29ydGVycyh1bmRlZmluZWQsIHNvcnRDb2x1bW5zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUGFnaW5hdGlvbiBcInByZXNldHNcIlxyXG4gICAgICAgIGlmIChiYWNrZW5kQXBpU2VydmljZS51cGRhdGVQYWdpbmF0aW9uICYmIGdyaWRPcHRpb25zLnByZXNldHMucGFnaW5hdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9ID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uO1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlUGFnaW5hdGlvbihwYWdlTnVtYmVyLCBwYWdlU2l6ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0Q29sdW1uRmlsdGVycygpO1xyXG4gICAgICAgIGlmIChjb2x1bW5GaWx0ZXJzICYmIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMpIHtcclxuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMoY29sdW1uRmlsdGVycywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZXhlY3V0ZSBvbkluaXQgY29tbWFuZCB3aGVuIG5lY2Vzc2FyeVxyXG4gICAgICBpZiAoYmFja2VuZEFwaSAmJiBiYWNrZW5kQXBpU2VydmljZSAmJiAoYmFja2VuZEFwaS5vbkluaXQgfHwgaXNFeGVjdXRlQ29tbWFuZE9uSW5pdCkpIHtcclxuICAgICAgICBjb25zdCBxdWVyeSA9ICh0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuYnVpbGRRdWVyeSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5idWlsZFF1ZXJ5KCkgOiAnJztcclxuICAgICAgICBjb25zdCBwcm9jZXNzID0gKGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQpID8gKGJhY2tlbmRBcGkucHJvY2VzcyAmJiBiYWNrZW5kQXBpLnByb2Nlc3MocXVlcnkpIHx8IG51bGwpIDogKGJhY2tlbmRBcGkub25Jbml0ICYmIGJhY2tlbmRBcGkub25Jbml0KHF1ZXJ5KSB8fCBudWxsKTtcclxuXHJcbiAgICAgICAgLy8gd3JhcCB0aGlzIGluc2lkZSBhIHNldFRpbWVvdXQgdG8gYXZvaWQgdGltaW5nIGlzc3VlIHNpbmNlIHRoZSBncmlkT3B0aW9ucyBuZWVkcyB0byBiZSByZWFkeSBiZWZvcmUgcnVubmluZyB0aGlzIG9uSW5pdFxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYmFja2VuZFV0aWxpdHlTZXJ2aWNlID0gdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgYXMgQmFja2VuZFV0aWxpdHlTZXJ2aWNlO1xyXG5cclxuICAgICAgICAgIC8vIGtlZXAgc3RhcnQgdGltZSAmIGVuZCB0aW1lc3RhbXBzICYgcmV0dXJuIGl0IGFmdGVyIHByb2Nlc3MgZXhlY3V0aW9uXHJcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICAgIC8vIHJ1biBhbnkgcHJlLXByb2Nlc3MsIGlmIGRlZmluZWQsIGZvciBleGFtcGxlIGEgc3Bpbm5lclxyXG4gICAgICAgICAgaWYgKGJhY2tlbmRBcGkucHJlUHJvY2Vzcykge1xyXG4gICAgICAgICAgICBiYWNrZW5kQXBpLnByZVByb2Nlc3MoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyB0aGUgcHJvY2Vzc2VzIGNhbiBiZSBhIFByb21pc2UgKGxpa2UgSHR0cClcclxuICAgICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zID8/IDA7XHJcbiAgICAgICAgICBpZiAocHJvY2VzcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgcHJvY2Vzc1xyXG4gICAgICAgICAgICAgIC50aGVuKChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5leGVjdXRlQmFja2VuZFByb2Nlc3Nlc0NhbGxiYWNrKHN0YXJ0VGltZSwgcHJvY2Vzc1Jlc3VsdCwgYmFja2VuZEFwaSwgdG90YWxJdGVtcykpXHJcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLm9uQmFja2VuZEVycm9yKGVycm9yLCBiYWNrZW5kQXBpKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MgJiYgdGhpcy5yeGpzPy5pc09ic2VydmFibGUocHJvY2VzcykpIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgKHByb2Nlc3MgYXMgT2JzZXJ2YWJsZTxhbnk+KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKHByb2Nlc3NSZXN1bHQ6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLmV4ZWN1dGVCYWNrZW5kUHJvY2Vzc2VzQ2FsbGJhY2soc3RhcnRUaW1lLCBwcm9jZXNzUmVzdWx0LCBiYWNrZW5kQXBpLCB0b3RhbEl0ZW1zKSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLm9uQmFja2VuZEVycm9yKGVycm9yLCBiYWNrZW5kQXBpKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZFJlc2l6ZUhvb2soZ3JpZDogU2xpY2tHcmlkLCBvcHRpb25zOiBHcmlkT3B0aW9uKSB7XHJcbiAgICBpZiAoKG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmF1dG9zaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRPbkZpcnN0TG9hZCkgfHwgKG9wdGlvbnMuZW5hYmxlQXV0b1NpemVDb2x1bW5zICYmIG9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtBbmd1bGFyLVNsaWNrZ3JpZF0gWW91IGNhbm5vdCBlbmFibGUgYm90aCBhdXRvc2l6ZS9maXQgdmlld3BvcnQgJiByZXNpemUgYnkgY29udGVudCwgeW91IG11c3QgY2hvb3NlIHdoaWNoIHJlc2l6ZSB0ZWNobmlxdWUgdG8gdXNlLiBZb3UgY2FuIGVuYWJsZSB0aGVzZSAyIG9wdGlvbnMgKFwiYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZFwiIGFuZCBcImVuYWJsZUF1dG9TaXplQ29sdW1uc1wiKSBPUiB0aGVzZSBvdGhlciAyIG9wdGlvbnMgKFwiYXV0b3NpemVDb2x1bW5zQnlDZWxsQ29udGVudE9uRmlyc3RMb2FkXCIgYW5kIFwiZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50XCIpLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGV4cGFuZC9hdXRvZml0IGNvbHVtbnMgb24gZmlyc3QgcGFnZSBsb2FkXHJcbiAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcclxuICAgICAgZ3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhdXRvLXJlc2l6ZSBncmlkIG9uIGJyb3dzZXIgcmVzaXplXHJcbiAgICBpZiAob3B0aW9ucy5ncmlkSGVpZ2h0IHx8IG9wdGlvbnMuZ3JpZFdpZHRoKSB7XHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgwLCB7IGhlaWdodDogb3B0aW9ucy5ncmlkSGVpZ2h0LCB3aWR0aDogb3B0aW9ucy5ncmlkV2lkdGggfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUdyaWQoKTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLmVuYWJsZUF1dG9SZXNpemUpIHtcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5iaW5kQXV0b1Jlc2l6ZURhdGFHcmlkKCk7XHJcbiAgICAgIGlmIChncmlkICYmIG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xyXG4gICAgICAgIGdyaWQuYXV0b3NpemVDb2x1bW5zKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhlY3V0ZUFmdGVyRGF0YXZpZXdDcmVhdGVkKF9ncmlkOiBTbGlja0dyaWQsIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XHJcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBTb3J0IFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIERPTVxyXG4gICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgaWYgKGdyaWRPcHRpb25zLnByZXNldHMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMpKSB7XHJcbiAgICAgICAgLy8gd2hlbiB1c2luZyBtdWx0aS1jb2x1bW4gc29ydCwgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYnV0IG9uIHNpbmdsZSBzb3J0IHRoZW4gb25seSBncmFiIHRoZSBmaXJzdCBzb3J0IHByb3ZpZGVkXHJcbiAgICAgICAgY29uc3Qgc29ydENvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLm11bHRpQ29sdW1uU29ydCA/IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycyA6IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5zbGljZSgwLCAxKTtcclxuICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmxvYWRHcmlkU29ydGVycyhzb3J0Q29sdW1ucyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBXaGVuIGRhdGEgY2hhbmdlcyBpbiB0aGUgRGF0YVZpZXcsIHdlJ2xsIHJlZnJlc2ggdGhlIG1ldHJpY3MgYW5kL29yIGRpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZSBkYXRhc2V0IGlzIGVtcHR5ICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoY3VycmVudFBhZ2VSb3dJdGVtQ291bnQ6IG51bWJlciwgdG90YWxJdGVtQ291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGggPSB0b3RhbEl0ZW1Db3VudDtcclxuICAgIHRoaXMubWV0cmljcyA9IHtcclxuICAgICAgc3RhcnRUaW1lOiBuZXcgRGF0ZSgpLFxyXG4gICAgICBlbmRUaW1lOiBuZXcgRGF0ZSgpLFxyXG4gICAgICBpdGVtQ291bnQ6IGN1cnJlbnRQYWdlUm93SXRlbUNvdW50LFxyXG4gICAgICB0b3RhbEl0ZW1Db3VudFxyXG4gICAgfTtcclxuICAgIC8vIGlmIGN1c3RvbSBmb290ZXIgaXMgZW5hYmxlZCwgdGhlbiB3ZSdsbCB1cGRhdGUgaXRzIG1ldHJpY3NcclxuICAgIGlmICh0aGlzLnNsaWNrRm9vdGVyKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tGb290ZXIubWV0cmljcyA9IHRoaXMubWV0cmljcztcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuIHVzaW5nIGxvY2FsIChpbi1tZW1vcnkpIGRhdGFzZXQsIHdlJ2xsIGRpc3BsYXkgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBmaWx0ZXJlZCBkYXRhIGlzIGVtcHR5XHJcbiAgICBpZiAodGhpcy5faXNMb2NhbEdyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UpIHtcclxuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhjdXJyZW50UGFnZVJvd0l0ZW1Db3VudCA9PT0gMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVQYWdpbmF0aW9uU2VydmljZShwYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbikge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uRGF0YSA9IHtcclxuICAgICAgICBncmlkT3B0aW9uczogdGhpcy5ncmlkT3B0aW9ucyxcclxuICAgICAgICBwYWdpbmF0aW9uU2VydmljZTogdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS50b3RhbEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHBhZ2luYXRpb25PcHRpb25zLCB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKTtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnN1YnNjcmliZSgnb25QYWdpbmF0aW9uQ2hhbmdlZCcsIChwYWdpbmF0aW9uQ2hhbmdlczogU2VydmljZVBhZ2luYXRpb24pID0+IHtcclxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZWQocGFnaW5hdGlvbkNoYW5nZXMpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5zdWJzY3JpYmUoJ29uUGFnaW5hdGlvblZpc2liaWxpdHlDaGFuZ2VkJywgKHZpc2liaWxpdHk6IHsgdmlzaWJsZTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gdmlzaWJpbGl0eT8udmlzaWJsZSA/PyBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZT8ucmVmcmVzaEJhY2tlbmREYXRhc2V0KHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIExvYWQgdGhlIEVkaXRvciBDb2xsZWN0aW9uIGFzeW5jaHJvbm91c2x5IGFuZCByZXBsYWNlIHRoZSBcImNvbGxlY3Rpb25cIiBwcm9wZXJ0eSB3aGVuIE9ic2VydmFibGUgcmVzb2x2ZXMgKi9cclxuICBwcml2YXRlIGxvYWRFZGl0b3JDb2xsZWN0aW9uQXN5bmMoY29sdW1uOiBDb2x1bW4pIHtcclxuICAgIGNvbnN0IGNvbGxlY3Rpb25Bc3luYyA9IGNvbHVtbiAmJiBjb2x1bW4uZWRpdG9yICYmIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuY29sbGVjdGlvbkFzeW5jO1xyXG4gICAgaWYgKGNvbGxlY3Rpb25Bc3luYyBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgY29sbGVjdGlvbkFzeW5jLnN1YnNjcmliZSgocmVzb2x2ZWRDb2xsZWN0aW9uKSA9PiB0aGlzLnVwZGF0ZUVkaXRvckNvbGxlY3Rpb24oY29sdW1uLCByZXNvbHZlZENvbGxlY3Rpb24pKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uQXN5bmMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgIC8vIHdhaXQgZm9yIHRoZSBcImNvbGxlY3Rpb25Bc3luY1wiLCBvbmNlIHJlc29sdmVkIHdlIHdpbGwgc2F2ZSBpdCBpbnRvIHRoZSBcImNvbGxlY3Rpb25cIlxyXG4gICAgICAvLyB0aGUgY29sbGVjdGlvbkFzeW5jIGNhbiBiZSBvZiAzIHR5cGVzIEh0dHBDbGllbnQsIEh0dHBGZXRjaCBvciBhIFByb21pc2VcclxuICAgICAgY29sbGVjdGlvbkFzeW5jLnRoZW4oKHJlc3BvbnNlOiBhbnkgfCBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVFZGl0b3JDb2xsZWN0aW9uKGNvbHVtbiwgcmVzcG9uc2UpOyAvLyBmcm9tIFByb21pc2VcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIExvYWQgYW55IHBvc3NpYmxlIENvbHVtbnMgR3JpZCBQcmVzZXRzICovXHJcbiAgcHJpdmF0ZSBsb2FkQ29sdW1uUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKSB7XHJcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBDb2x1bW5zIFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIGdyaWRcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucykgJiYgdGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBncmlkQ29sdW1uczogQ29sdW1uW10gPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UuZ2V0QXNzb2NpYXRlZEdyaWRDb2x1bW5zKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucyk7XHJcbiAgICAgIGlmIChncmlkQ29sdW1ucyAmJiBBcnJheS5pc0FycmF5KGdyaWRDb2x1bW5zKSAmJiBncmlkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGNoZWNrYm94IHNlbGVjdG9yIGlzIGFsc28gdmlzaWJsZSBpZiBpdCBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xyXG4gICAgICAgICAgY29uc3QgY2hlY2tib3hDb2x1bW4gPSAoQXJyYXkuaXNBcnJheSh0aGlzLl9jb2x1bW5EZWZpbml0aW9ucykgJiYgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoID4gMCkgPyB0aGlzLl9jb2x1bW5EZWZpbml0aW9uc1swXSA6IG51bGw7XHJcbiAgICAgICAgICBpZiAoY2hlY2tib3hDb2x1bW4gJiYgY2hlY2tib3hDb2x1bW4uaWQgPT09ICdfY2hlY2tib3hfc2VsZWN0b3InICYmIGdyaWRDb2x1bW5zWzBdLmlkICE9PSAnX2NoZWNrYm94X3NlbGVjdG9yJykge1xyXG4gICAgICAgICAgICBncmlkQ29sdW1ucy51bnNoaWZ0KGNoZWNrYm94Q29sdW1uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGtlZXAgY29weSB0aGUgb3JpZ2luYWwgb3B0aW9uYWwgYHdpZHRoYCBwcm9wZXJ0aWVzIG9wdGlvbmFsbHkgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAgICAgLy8gV2Ugd2lsbCB1c2UgdGhpcyB3aGVuIGRvaW5nIGEgcmVzaXplIGJ5IGNlbGwgY29udGVudCwgaWYgdXNlciBwcm92aWRlZCBhIGB3aWR0aGAgaXQgd29uJ3Qgb3ZlcnJpZGUgaXQuXHJcbiAgICAgICAgZ3JpZENvbHVtbnMuZm9yRWFjaChjb2wgPT4gY29sLm9yaWdpbmFsV2lkdGggPSBjb2wud2lkdGgpO1xyXG5cclxuICAgICAgICAvLyBmaW5hbGx5IHNldCB0aGUgbmV3IHByZXNldHMgY29sdW1ucyAoaW5jbHVkaW5nIGNoZWNrYm94IHNlbGVjdG9yIGlmIG5lZWQgYmUpXHJcbiAgICAgICAgdGhpcy5zbGlja0dyaWQuc2V0Q29sdW1ucyhncmlkQ29sdW1ucyk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gZ3JpZENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMb2FkIGFueSBwb3NzaWJsZSBGaWx0ZXJzIEdyaWQgUHJlc2V0cyAqL1xyXG4gIHByaXZhdGUgbG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgRmlsdGVyIFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIERPTVxyXG4gICAgICAvLyBhbHNvIG5vdGUgdGhhdCBhIHByZXNldHMgb2YgVHJlZSBEYXRhIFRvZ2dsaW5nIHdpbGwgYWxzbyBjYWxsIHRoaXMgbWV0aG9kIGJlY2F1c2UgVHJlZSBEYXRhIHRvZ2dsaW5nIGRvZXMgd29yayB3aXRoIGRhdGEgZmlsdGVyaW5nXHJcbiAgICAgIC8vIChjb2xsYXBzaW5nIGEgcGFyZW50IHdpbGwgYmFzaWNhbGx5IHVzZSBGaWx0ZXIgZm9yIGhpZGRpbmcgKGFrYSBjb2xsYXBzaW5nKSBhd2F5IHRoZSBjaGlsZCB1bmRlcm5lYXQgaXQpXHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMgJiYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMpIHx8IEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy50cmVlRGF0YT8udG9nZ2xlZEl0ZW1zKSkpIHtcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucG9wdWxhdGVDb2x1bW5GaWx0ZXJTZWFyY2hUZXJtUHJlc2V0cyh0aGlzLmdyaWRPcHRpb25zLnByZXNldHM/LmZpbHRlcnMgfHwgW10pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBsb2NhbCBncmlkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgdGhlIFBhZ2luYXRpb25cclxuICAgKiBpZiBzbyB0aGVuIGFsc28gY2hlY2sgaWYgdGhlcmUncyBhbnkgcHJlc2V0cyBhbmQgZmluYWxseSBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uU2VydmljZVxyXG4gICAqIGEgbG9jYWwgZ3JpZCB3aXRoIFBhZ2luYXRpb24gcHJlc2V0cyB3aWxsIHBvdGVudGlhbGx5IGhhdmUgYSBkaWZmZXJlbnQgdG90YWwgb2YgaXRlbXMsIHdlJ2xsIG5lZWQgdG8gZ2V0IGl0IGZyb20gdGhlIERhdGFWaWV3IGFuZCB1cGRhdGUgb3VyIHRvdGFsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkTG9jYWxHcmlkUGFnaW5hdGlvbihkYXRhc2V0PzogYW55W10pIHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKSB7XHJcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IEFycmF5LmlzQXJyYXkoZGF0YXNldCkgPyBkYXRhc2V0Lmxlbmd0aCA6IDA7XHJcbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLmRhdGFWaWV3Py5nZXRQYWdpbmdJbmZvKSB7XHJcbiAgICAgICAgY29uc3Qgc2xpY2tQYWdpbmdJbmZvID0gdGhpcy5kYXRhVmlldy5nZXRQYWdpbmdJbmZvKCk7XHJcbiAgICAgICAgaWYgKHNsaWNrUGFnaW5nSW5mbz8uaGFzT3duUHJvcGVydHkoJ3RvdGFsUm93cycpICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zLnRvdGFsSXRlbXMgIT09IHNsaWNrUGFnaW5nSW5mby50b3RhbFJvd3MpIHtcclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHNsaWNrUGFnaW5nSW5mby50b3RhbFJvd3MgfHwgMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMudG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcclxuICAgICAgY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSB0aGlzLnNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQodGhpcy5ncmlkT3B0aW9ucywgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMpO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVQYWdpbmF0aW9uU2VydmljZShwYWdpbmF0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTG9hZCBhbnkgUm93IFNlbGVjdGlvbnMgaW50byB0aGUgRGF0YVZpZXcgdGhhdCB3ZXJlIHByZXNldHMgYnkgdGhlIHVzZXIgKi9cclxuICBwcml2YXRlIGxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCkge1xyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUm93IFNlbGVjdGlvbnMgXCJwcmVzZXRzXCJcclxuICAgIGNvbnN0IHByZXNldHMgPSB0aGlzLmdyaWRPcHRpb25zPy5wcmVzZXRzO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWwgPSB0aGlzLnNsaWNrR3JpZD8uZ2V0U2VsZWN0aW9uTW9kZWw/LigpO1xyXG4gICAgY29uc3QgZW5hYmxlUm93U2VsZWN0aW9uID0gdGhpcy5ncmlkT3B0aW9ucyAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKTtcclxuICAgIGlmIChlbmFibGVSb3dTZWxlY3Rpb24gJiYgc2VsZWN0aW9uTW9kZWwgJiYgcHJlc2V0cyAmJiBwcmVzZXRzLnJvd1NlbGVjdGlvbiAmJiAoQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcykgfHwgQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5kYXRhQ29udGV4dElkcykpKSB7XHJcbiAgICAgIGxldCBkYXRhQ29udGV4dElkcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmRhdGFDb250ZXh0SWRzO1xyXG4gICAgICBsZXQgZ3JpZFJvd0luZGV4ZXMgPSBwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcztcclxuXHJcbiAgICAgIC8vIG1hcHMgdGhlIElEcyB0byB0aGUgR3JpZCBSb3dzIGFuZCB2aWNlIHZlcnNhLCB0aGUgXCJkYXRhQ29udGV4dElkc1wiIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG90aGVyXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFDb250ZXh0SWRzKSAmJiBkYXRhQ29udGV4dElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ3JpZFJvd0luZGV4ZXMgPSB0aGlzLmRhdGFWaWV3Lm1hcElkc1RvUm93cyhkYXRhQ29udGV4dElkcykgfHwgW107XHJcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykgJiYgZ3JpZFJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGRhdGFDb250ZXh0SWRzID0gdGhpcy5kYXRhVmlldy5tYXBSb3dzVG9JZHMoZ3JpZFJvd0luZGV4ZXMpIHx8IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZS5zZWxlY3RlZFJvd0RhdGFDb250ZXh0SWRzID0gZGF0YUNvbnRleHRJZHM7XHJcblxyXG4gICAgICAvLyBjaGFuZ2UgdGhlIHNlbGVjdGVkIHJvd3MgZXhjZXB0IFVOTEVTUyBpdCdzIGEgTG9jYWwgR3JpZCB3aXRoIFBhZ2luYXRpb25cclxuICAgICAgLy8gbG9jYWwgUGFnaW5hdGlvbiB1c2VzIHRoZSBEYXRhVmlldyBhbmQgdGhhdCBhbHNvIHRyaWdnZXIgYSBjaGFuZ2UvcmVmcmVzaFxyXG4gICAgICAvLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIDIgR3JpZCBTdGF0ZSBjaGFuZ2VzIGp1c3QgMVxyXG4gICAgICBpZiAoKHRoaXMuX2lzTG9jYWxHcmlkICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24pIHx8ICF0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIEFycmF5LmlzQXJyYXkoZ3JpZFJvd0luZGV4ZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhncmlkUm93SW5kZXhlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogR3JpZE9wdGlvbik6IEdyaWRPcHRpb24ge1xyXG4gICAgZ3JpZE9wdGlvbnMuZ3JpZElkID0gdGhpcy5ncmlkSWQ7XHJcbiAgICBncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgPSBgc2xpY2tHcmlkQ29udGFpbmVyLSR7dGhpcy5ncmlkSWR9YDtcclxuXHJcbiAgICAvLyBpZiB3ZSBoYXZlIGEgYmFja2VuZFNlcnZpY2VBcGkgYW5kIHRoZSBlbmFibGVQYWdpbmF0aW9uIGlzIHVuZGVmaW5lZCwgd2UnbGwgYXNzdW1lIHRoYXQgd2UgZG8gd2FudCB0byBzZWUgaXQsIGVsc2UgZ2V0IHRoYXQgZGVmaW5lZCB2YWx1ZVxyXG4gICAgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9ICgoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uKSB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyB1c2UganF1ZXJ5IGV4dGVuZCB0byBkZWVwIG1lcmdlICYgY29weSB0byBhdm9pZCBpbW11dGFibGUgcHJvcGVydGllcyBiZWluZyBjaGFuZ2VkIGluIEdsb2JhbEdyaWRPcHRpb25zIGFmdGVyIGEgcm91dGUgY2hhbmdlXHJcbiAgICBjb25zdCBvcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIEdsb2JhbEdyaWRPcHRpb25zLCB0aGlzLmZvclJvb3RDb25maWcsIGdyaWRPcHRpb25zKSBhcyBHcmlkT3B0aW9uO1xyXG5cclxuICAgIC8vIHVzaW5nIGpRdWVyeSBleHRlbmQgdG8gZG8gYSBkZWVwIGNsb25lIGhhcyBhbiB1bndhbnRlZCBzaWRlIG9uIG9iamVjdHMgYW5kIHBhZ2VTaXplcyBidXQgRVM2IHNwcmVhZCBoYXMgb3RoZXIgd29yc3Qgc2lkZSBlZmZlY3RzXHJcbiAgICAvLyBzbyB3ZSB3aWxsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwYWdlU2l6ZXMgd2hlbiBuZWVkZWQsIHRoaXMgaXMgdGhlIG9ubHkgb25lIGNhdXNpbmcgaXNzdWVzIHNvIGZhci5cclxuICAgIC8vIGpRdWVyeSB3cm90ZSB0aGlzIG9uIHRoZWlyIGRvY3M6OiBPbiBhIGRlZXAgZXh0ZW5kLCBPYmplY3QgYW5kIEFycmF5IGFyZSBleHRlbmRlZCwgYnV0IG9iamVjdCB3cmFwcGVycyBvbiBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBTdHJpbmcsIEJvb2xlYW4sIGFuZCBOdW1iZXIgYXJlIG5vdC5cclxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uICYmIChncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uIHx8IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpKSAmJiBncmlkT3B0aW9ucy5wYWdpbmF0aW9uICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucGFnaW5hdGlvbi5wYWdlU2l6ZXMpKSB7XHJcbiAgICAgIG9wdGlvbnMucGFnaW5hdGlvbi5wYWdlU2l6ZXMgPSBncmlkT3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbHNvIG1ha2Ugc3VyZSB0byBzaG93IHRoZSBoZWFkZXIgcm93IGlmIHVzZXIgaGF2ZSBlbmFibGVkIGZpbHRlcmluZ1xyXG4gICAgdGhpcy5faGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSAob3B0aW9ucy5zaG93SGVhZGVyUm93ID09PSBmYWxzZSk7XHJcbiAgICBpZiAob3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcgJiYgIW9wdGlvbnMuc2hvd0hlYWRlclJvdykge1xyXG4gICAgICBvcHRpb25zLnNob3dIZWFkZXJSb3cgPSBvcHRpb25zLmVuYWJsZUZpbHRlcmluZztcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuIHdlIHVzZSBQYWdpbmF0aW9uIG9uIExvY2FsIEdyaWQsIGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHdpdGhvdXQgZW5hYmxlRmlsdGVyaW5nXHJcbiAgICAvLyBzbyB3ZSdsbCBlbmFibGUgdGhlIGZpbHRlcmluZyBidXQgd2UnbGwga2VlcCB0aGUgaGVhZGVyIHJvdyBoaWRkZW5cclxuICAgIGlmIChvcHRpb25zICYmICFvcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiBvcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gJiYgdGhpcy5faXNMb2NhbEdyaWQpIHtcclxuICAgICAgb3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcgPSB0cnVlO1xyXG4gICAgICBvcHRpb25zLnNob3dIZWFkZXJSb3cgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqIFByZS1SZWdpc3RlciBhbnkgUmVzb3VyY2UgdGhhdCBkb24ndCByZXF1aXJlIFNsaWNrR3JpZCB0byBiZSBpbnN0YW50aWF0ZWQgKGZvciBleGFtcGxlIFJ4SlMgUmVzb3VyY2UpICovXHJcbiAgcHJpdmF0ZSBwcmVSZWdpc3RlclJlc291cmNlcygpIHtcclxuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMgPSB0aGlzLmdyaWRPcHRpb25zLnJlZ2lzdGVyRXh0ZXJuYWxSZXNvdXJjZXMgfHwgW107XHJcblxyXG4gICAgLy8gQW5ndWxhci1TbGlja2dyaWQgcmVxdWlyZXMgUnhKUywgc28gd2UnbGwgcmVnaXN0ZXIgaXQgYXMgdGhlIGZpcnN0IHJlc291cmNlXHJcbiAgICB0aGlzLnJlZ2lzdGVyUnhKc1Jlc291cmNlKG5ldyBSeEpzUmVzb3VyY2UoKSBhcyBSeEpzRmFjYWRlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVnaXN0ZXJSZXNvdXJjZXMoKSB7XHJcbiAgICAvLyBhdCB0aGlzIHBvaW50LCB3ZSBjb25zaWRlciBhbGwgdGhlIHJlZ2lzdGVyZWQgc2VydmljZXMgYXMgZXh0ZXJuYWwgc2VydmljZXMsIGFueXRoaW5nIGVsc2UgcmVnaXN0ZXJlZCBhZnRlcndhcmQgYXJlbid0IGV4dGVybmFsXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSkge1xyXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZXh0ZXJuYWxSZWdpc3RlcmVkUmVzb3VyY2VzID0gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdXNoIGFsbCBvdGhlciBTZXJ2aWNlcyB0aGF0IHdlIHdhbnQgdG8gYmUgcmVnaXN0ZXJlZFxyXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuZ3JpZFNlcnZpY2UsIHRoaXMuZ3JpZFN0YXRlU2VydmljZSk7XHJcblxyXG4gICAgLy8gd2hlbiB1c2luZyBHcm91cGluZy9EcmFnZ2FibGVHcm91cGluZy9Db2xzcGFuIHJlZ2lzdGVyIGl0cyBTZXJ2aWNlXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jcmVhdGVQcmVIZWFkZXJQYW5lbCAmJiAhdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVEcmFnZ2FibGVHcm91cGluZykge1xyXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5ncm91cGluZ1NlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gdXNpbmcgVHJlZSBEYXRhIFZpZXcsIHJlZ2lzdGVyIGl0cyBTZXJ2aWNlXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmVlRGF0YSkge1xyXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy50cmVlRGF0YVNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gdXNlciBlbmFibGVzIHRyYW5zbGF0aW9uLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBIZWFkZXJzIG9uIGZpcnN0IHBhc3MgJiBzdWJzZXF1ZW50bHkgaW4gdGhlIGJpbmREaWZmZXJlbnRIb29rc1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5IZWFkZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWxzbyBpbml0aWFsaXplIChyZW5kZXIpIHRoZSBlbXB0eSB3YXJuaW5nIGNvbXBvbmVudFxyXG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZyA9IG5ldyBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudCgpO1xyXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuc2xpY2tFbXB0eVdhcm5pbmcpO1xyXG5cclxuICAgIC8vIGJpbmQgJiBpbml0aWFsaXplIGFsbCBDb21wb25lbnRzL1NlcnZpY2VzIHRoYXQgd2VyZSB0YWdnZWQgYXMgZW5hYmxlZFxyXG4gICAgLy8gcmVnaXN0ZXIgYWxsIHNlcnZpY2VzIGJ5IGV4ZWN1dGluZyB0aGVpciBpbml0IG1ldGhvZCBhbmQgcHJvdmlkaW5nIHRoZW0gd2l0aCB0aGUgR3JpZCBvYmplY3RcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcmVzb3VyY2UuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgcmVzb3VyY2UuaW5pdCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5jb250YWluZXJTZXJ2aWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZWdpc3RlciB0aGUgUnhKUyBSZXNvdXJjZSBpbiBhbGwgbmVjZXNzYXJ5IHNlcnZpY2VzIHdoaWNoIHVzZXMgKi9cclxuICBwcml2YXRlIHJlZ2lzdGVyUnhKc1Jlc291cmNlKHJlc291cmNlOiBSeEpzRmFjYWRlKSB7XHJcbiAgICB0aGlzLnJ4anMgPSByZXNvdXJjZTtcclxuICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xyXG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5LmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xyXG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xyXG4gICAgdGhpcy5zb3J0U2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcclxuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUnhKc1Jlc291cmNlJywgdGhpcy5yeGpzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRha2VzIGEgZmxhdCBkYXRhc2V0IHdpdGggcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCwgc29ydCBpdCAodmlhIGl0cyB0cmVlIHN0cnVjdHVyZSkgYW5kIHJldHVybiB0aGUgc29ydGVkIGZsYXQgYXJyYXlcclxuICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGZsYXREYXRhc2V0SW5wdXQgLSBmbGF0IGRhdGFzZXQgaW5wdXRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZvcmNlR3JpZFJlZnJlc2ggLSBvcHRpb25hbGx5IGZvcmNlIGEgZnVsbCBncmlkIHJlZnJlc2hcclxuICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gc29ydCBmbGF0IHBhcmVudC9jaGlsZCBkYXRhc2V0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzb3J0VHJlZURhdGFzZXQ8VD4oZmxhdERhdGFzZXRJbnB1dDogVFtdLCBmb3JjZUdyaWRSZWZyZXNoID0gZmFsc2UpOiBUW10ge1xyXG4gICAgY29uc3QgcHJldkRhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xyXG4gICAgbGV0IHNvcnRlZERhdGFzZXRSZXN1bHQ7XHJcbiAgICBsZXQgZmxhdERhdGFzZXRPdXRwdXQ6IGFueVtdID0gW107XHJcblxyXG4gICAgLy8gaWYgdGhlIGhpZXJhcmNoaWNhbCBkYXRhc2V0IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIHRoZW4gbm8gbmVlZCB0byByZS1jb252ZXJ0IGl0LCB3ZSBjYW4gdXNlIGl0IGRpcmVjdGx5IGZyb20gdGhlIHNoYXJlZCBzZXJ2aWNlIHJlZlxyXG4gICAgaWYgKHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkICYmIHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCkge1xyXG4gICAgICBzb3J0ZWREYXRhc2V0UmVzdWx0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2Uuc29ydEhpZXJhcmNoaWNhbERhdGFzZXQodGhpcy5kYXRhc2V0SGllcmFyY2hpY2FsKTtcclxuICAgICAgZmxhdERhdGFzZXRPdXRwdXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmZsYXQ7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmxhdERhdGFzZXRJbnB1dCkgJiYgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy50cmVlRGF0YU9wdGlvbnM/LmluaXRpYWxTb3J0KSB7XHJcbiAgICAgICAgLy8gZWxzZSB3ZSBuZWVkIHRvIGZpcnN0IGNvbnZlcnQgdGhlIGZsYXQgZGF0YXNldCB0byBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGFuZCB0aGVuIHNvcnRcclxuICAgICAgICBzb3J0ZWREYXRhc2V0UmVzdWx0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2UuY29udmVydEZsYXRQYXJlbnRDaGlsZFRvVHJlZURhdGFzZXRBbmRTb3J0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IHNvcnRlZERhdGFzZXRSZXN1bHQuaGllcmFyY2hpY2FsO1xyXG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5mbGF0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGVsc2Ugd2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIgcHJvdmlkZWQgYW4gYXJyYXkgdGhhdCBpcyBhbHJlYWR5IHNvcnRlZCAodXNlcidzIHJlc3BvbnNhYmlsaXR5KVxyXG4gICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gc2ltcGx5IGNvbnZlcnQgdGhlIGFycmF5IHRvIGEgdHJlZSBzdHJ1Y3R1cmUgYW5kIHdlJ3JlIGRvbmUsIG5vIG5lZWQgdG8gc29ydFxyXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2UuY29udmVydEZsYXRQYXJlbnRDaGlsZFRvVHJlZURhdGFzZXQoZmxhdERhdGFzZXRJbnB1dCwgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgZmxhdERhdGFzZXRPdXRwdXQgPSBmbGF0RGF0YXNldElucHV0IHx8IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgd2UgYWRkL3JlbW92ZSBpdGVtKHMpIGZyb20gdGhlIGRhdGFzZXQsIHdlIG5lZWQgdG8gYWxzbyByZWZyZXNoIG91ciB0cmVlIGRhdGEgZmlsdGVyc1xyXG4gICAgaWYgKGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCAmJiAoZm9yY2VHcmlkUmVmcmVzaCB8fCBmbGF0RGF0YXNldElucHV0Lmxlbmd0aCAhPT0gcHJldkRhdGFzZXRMbikpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZnJlc2hUcmVlRGF0YUZpbHRlcnMoZmxhdERhdGFzZXRPdXRwdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmbGF0RGF0YXNldE91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciBjb252ZW5pZW5jZSB0byB0aGUgdXNlciwgd2UgcHJvdmlkZSB0aGUgcHJvcGVydHkgXCJlZGl0b3JcIiBhcyBhbiBBbmd1bGFyLVNsaWNrZ3JpZCBlZGl0b3IgY29tcGxleCBvYmplY3RcclxuICAgKiBob3dldmVyIFwiZWRpdG9yXCIgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFNsaWNrR3JpZCBmb3IgaXQncyBvd24gRWRpdG9yIEZhY3RvcnlcclxuICAgKiBzbyBpbiBvdXIgbGliIHdlIHdpbGwgc3dhcCBcImVkaXRvclwiIGFuZCBjb3B5IGl0IGludG8gYSBuZXcgcHJvcGVydHkgY2FsbGVkIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIlxyXG4gICAqIHRoZW4gdGFrZSBiYWNrIFwiZWRpdG9yLm1vZGVsXCIgYW5kIG1ha2UgaXQgdGhlIG5ldyBcImVkaXRvclwiIHNvIHRoYXQgU2xpY2tHcmlkIEVkaXRvciBGYWN0b3J5IHN0aWxsIHdvcmtzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XHJcbiAgICBpZiAoY29sdW1uRGVmaW5pdGlvbnMuc29tZShjb2wgPT4gYCR7Y29sLmlkfWAuaW5jbHVkZXMoJy4nKSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW0FuZ3VsYXItU2xpY2tncmlkXSBNYWtlIHN1cmUgdGhhdCBub25lIG9mIHlvdXIgQ29sdW1uIERlZmluaXRpb24gXCJpZFwiIHByb3BlcnR5IGluY2x1ZGVzIGEgZG90IGluIGl0cyBuYW1lIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgRWRpdG9ycy4gRm9yIGV4YW1wbGUgaWYgeW91ciBjb2x1bW4gZGVmaW5pdGlvbiBcImZpZWxkXCIgcHJvcGVydHkgaXMgXCJ1c2VyLmZpcnN0TmFtZVwiIHRoZW4gdXNlIFwiZmlyc3ROYW1lXCIgYXMgdGhlIGNvbHVtbiBcImlkXCIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbkRlZmluaXRpb25zLm1hcCgoY29sdW1uOiBDb2x1bW4gfCBhbnkpID0+IHtcclxuICAgICAgLy8gb24gZXZlcnkgRWRpdG9yIHRoYXQgaGF2ZSBhIFwiY29sbGVjdGlvbkFzeW5jXCIsIHJlc29sdmUgdGhlIGRhdGEgYW5kIGFzc2lnbiBpdCB0byB0aGUgXCJjb2xsZWN0aW9uXCIgcHJvcGVydHlcclxuICAgICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IuY29sbGVjdGlvbkFzeW5jKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRWRpdG9yQ29sbGVjdGlvbkFzeW5jKGNvbHVtbik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgLi4uY29sdW1uLCBlZGl0b3I6IGNvbHVtbi5lZGl0b3IgJiYgY29sdW1uLmVkaXRvci5tb2RlbCwgaW50ZXJuYWxDb2x1bW5FZGl0b3I6IHsgLi4uY29sdW1uLmVkaXRvciB9IH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmFuc2xhdGUgYWxsIEN1c3RvbSBGb290ZXIgVGV4dHMgKGZvb3RlciB3aXRoIG1ldHJpY3MpICovXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVDdXN0b21Gb290ZXJUZXh0cygpIHtcclxuICAgIGlmICh0aGlzLnNsaWNrRm9vdGVyICYmIHRoaXMudHJhbnNsYXRlclNlcnZpY2U/LnRyYW5zbGF0ZSkge1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyPy50cmFuc2xhdGVDdXN0b21Gb290ZXJUZXh0cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVDb2x1bW5IZWFkZXJUaXRsZUtleXMoKSB7XHJcbiAgICAvLyB0cmFuc2xhdGUgYWxsIGNvbHVtbnMgKGluY2x1ZGluZyBoaWRkZW4gY29sdW1ucylcclxuICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eS50cmFuc2xhdGVJdGVtcyh0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucywgJ25hbWVLZXknLCAnbmFtZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVDb2x1bW5Hcm91cEtleXMoKSB7XHJcbiAgICAvLyB0cmFuc2xhdGUgYWxsIGNvbHVtbiBncm91cHMgKGluY2x1ZGluZyBoaWRkZW4gY29sdW1ucylcclxuICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eS50cmFuc2xhdGVJdGVtcyh0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucywgJ2NvbHVtbkdyb3VwS2V5JywgJ2NvbHVtbkdyb3VwJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3IuY29sbGVjdGlvblwiIHByb3BlcnR5LlxyXG4gICAqIFNpbmNlIHRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBhc3luYyBjYWxsIHJlc29sdmVzLCB0aGUgcG9pbnRlciB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgXCJjb2x1bW5cIiBhcmd1bWVudCBwYXNzZWQuXHJcbiAgICogT25jZSB3ZSBmb3VuZCB0aGUgbmV3IHBvaW50ZXIsIHdlIHdpbGwgcmVhc3NpZ24gdGhlIFwiZWRpdG9yXCIgYW5kIFwiY29sbGVjdGlvblwiIHRvIHRoZSBcImludGVybmFsQ29sdW1uRWRpdG9yXCIgc28gaXQgaGFzIG5ld2VzdCBjb2xsZWN0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVFZGl0b3JDb2xsZWN0aW9uPFQgPSBhbnk+KGNvbHVtbjogQ29sdW1uPFQ+LCBuZXdDb2xsZWN0aW9uOiBUW10pIHtcclxuICAgIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuY29sbGVjdGlvbiA9IG5ld0NvbGxlY3Rpb247XHJcbiAgICAoY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3IpLmRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gZmluZCB0aGUgbmV3IGNvbHVtbiByZWZlcmVuY2UgcG9pbnRlciAmIHJlLWFzc2lnbiB0aGUgbmV3IGVkaXRvciB0byB0aGUgaW50ZXJuYWxDb2x1bW5FZGl0b3JcclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLnNsaWNrR3JpZC5nZXRDb2x1bW5zKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5zKSkge1xyXG4gICAgICBjb25zdCBjb2x1bW5SZWYgPSBjb2x1bW5zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiBjb2wuaWQgPT09IGNvbHVtbi5pZCk7XHJcbiAgICAgIGlmIChjb2x1bW5SZWYpIHtcclxuICAgICAgICBjb2x1bW5SZWYuaW50ZXJuYWxDb2x1bW5FZGl0b3IgPSBjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBjdXJyZW50IEVkaXRvciwgcmVtb3ZlIGl0IGZyb20gdGhlIERPTSB0aGVuIHJlLWVuYWJsZSBpdCBhbmQgcmUtcmVuZGVyIGl0IHdpdGggdGhlIG5ldyBjb2xsZWN0aW9uLlxyXG4gICAgY29uc3QgY3VycmVudEVkaXRvciA9IHRoaXMuc2xpY2tHcmlkLmdldENlbGxFZGl0b3IoKSBhcyBBdXRvQ29tcGxldGVFZGl0b3IgfCBTZWxlY3RFZGl0b3I7XHJcbiAgICBpZiAoY3VycmVudEVkaXRvcj8uZGlzYWJsZSAmJiBjdXJyZW50RWRpdG9yPy5yZW5kZXJEb21FbGVtZW50KSB7XHJcbiAgICAgIGN1cnJlbnRFZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgICBjdXJyZW50RWRpdG9yLmRpc2FibGUoZmFsc2UpO1xyXG4gICAgICBjdXJyZW50RWRpdG9yLnJlbmRlckRvbUVsZW1lbnQobmV3Q29sbGVjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
1202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixpR0FBaUc7QUFDakcsT0FBTyxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTyx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sMkNBQTJDLENBQUM7QUFFbkQsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFaEQsT0FBTztBQW1CTCxXQUFXO0FBQ1gscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsRUFDZixXQUFXLEVBQ1gsZUFBZTtBQUVmLGFBQWE7QUFDYixvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLGdDQUFnQyxFQUNoQyxpQkFB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LHVCQUFiLGFBQWEsQ0FBRSxPQUFPLE1BQUksYUFBYSxhQUFiLGFBQWEsdUJBQWIsYUFBYSxDQUFFLGdCQUFnQixDQUFBLEVBQUU7WUFDN0QsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9DO0lBQ0gsQ0FBQzs7O1lBcnpDRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsbUxBQWlEO2dCQUNqRCxTQUFTLEVBQUU7b0JBQ1QsNENBQTRDO29CQUM1QyxrQkFBa0I7b0JBQ2xCLGNBQWM7b0JBQ2Qsc0JBQXNCO29CQUN0QixpQkFBaUI7aUJBQ2xCO2FBQ0Y7OztZQWpCUSxrQkFBa0I7WUE5RUgsY0FBYztZQUFFLGlCQUFpQjtZQWdGaEQsZ0JBQWdCO1lBaEY2QyxVQUFVO1lBQ3ZFLGdCQUFnQix1QkFnUnBCLFFBQVE7WUF2TUosaUJBQWlCLHVCQXdNckIsUUFBUTs0Q0FDUixNQUFNLFNBQUMsUUFBUTs0Q0FDZixNQUFNLFNBQUMsaUJBQWlCOzs7NkJBNUgxQixLQUFLO3FCQUNMLEtBQUs7MEJBQ0wsS0FBSztnQ0FFTCxLQUFLO2dDQWNMLEtBQUs7c0JBY0wsS0FBSztrQ0F5QkwsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCAzcmQgcGFydHkgdmVuZG9yIGxpYnNcclxuLy8gb25seSBpbXBvcnQgdGhlIG5lY2Vzc2FyeSBjb3JlIGxpYiwgZWFjaCB3aWxsIGJlIGltcG9ydGVkIG9uIGRlbWFuZCB3aGVuIGVuYWJsZWQgKHZpYSByZXF1aXJlKVxyXG5pbXBvcnQgJ2pxdWVyeS11aS91aS93aWRnZXRzL2RyYWdnYWJsZSc7XHJcbmltcG9ydCAnanF1ZXJ5LXVpL3VpL3dpZGdldHMvZHJvcHBhYmxlJztcclxuaW1wb3J0ICdqcXVlcnktdWkvdWkvd2lkZ2V0cy9zb3J0YWJsZSc7XHJcbmltcG9ydCAnc2xpY2tncmlkL2xpYi9qcXVlcnkuZXZlbnQuZHJhZy0yLjMuMCc7XHJcbmltcG9ydCAnc2xpY2tncmlkL2xpYi9qcXVlcnkubW91c2V3aGVlbCc7XHJcbmltcG9ydCAnc2xpY2tncmlkL3NsaWNrLmNvcmUnO1xyXG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5ncmlkJztcclxuaW1wb3J0ICdzbGlja2dyaWQvc2xpY2suZGF0YXZpZXcnO1xyXG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5ncm91cGl0ZW1tZXRhZGF0YXByb3ZpZGVyJztcclxuXHJcbi8vIC4uLnRoZW4gZXZlcnl0aGluZyBlbHNlLi4uXHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIEFwcGxpY2F0aW9uUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAvLyBpbnRlcmZhY2VzL3R5cGVzXHJcbiAgQXV0b0NvbXBsZXRlRWRpdG9yLFxyXG4gIEJhY2tlbmRTZXJ2aWNlQXBpLFxyXG4gIEJhY2tlbmRTZXJ2aWNlT3B0aW9uLFxyXG4gIENvbHVtbixcclxuICBDb2x1bW5FZGl0b3IsXHJcbiAgRGF0YVZpZXdPcHRpb24sXHJcbiAgRXh0ZXJuYWxSZXNvdXJjZSxcclxuICBMb2NhbGUsXHJcbiAgTWV0cmljcyxcclxuICBQYWdpbmF0aW9uLFxyXG4gIFNlbGVjdEVkaXRvcixcclxuICBTZXJ2aWNlUGFnaW5hdGlvbixcclxuICBTbGlja0RhdGFWaWV3LFxyXG4gIFNsaWNrRXZlbnRIYW5kbGVyLFxyXG4gIFNsaWNrR3JpZCxcclxuICBTbGlja05hbWVzcGFjZSxcclxuXHJcbiAgLy8gc2VydmljZXNcclxuICBCYWNrZW5kVXRpbGl0eVNlcnZpY2UsXHJcbiAgQ29sbGVjdGlvblNlcnZpY2UsXHJcbiAgRXZlbnROYW1pbmdTdHlsZSxcclxuICBFeHRlbnNpb25TZXJ2aWNlLFxyXG4gIEZpbHRlckZhY3RvcnksXHJcbiAgRmlsdGVyU2VydmljZSxcclxuICBHcmlkRXZlbnRTZXJ2aWNlLFxyXG4gIEdyaWRTZXJ2aWNlLFxyXG4gIEdyaWRTdGF0ZVNlcnZpY2UsXHJcbiAgR3JvdXBpbmdBbmRDb2xzcGFuU2VydmljZSxcclxuICBQYWdpbmF0aW9uU2VydmljZSxcclxuICBSZXNpemVyU2VydmljZSxcclxuICBSeEpzRmFjYWRlLFxyXG4gIFNoYXJlZFNlcnZpY2UsXHJcbiAgU2xpY2tncmlkQ29uZmlnLFxyXG4gIFNvcnRTZXJ2aWNlLFxyXG4gIFRyZWVEYXRhU2VydmljZSxcclxuXHJcbiAgLy8gZXh0ZW5zaW9uc1xyXG4gIEF1dG9Ub29sdGlwRXh0ZW5zaW9uLFxyXG4gIENoZWNrYm94U2VsZWN0b3JFeHRlbnNpb24sXHJcbiAgQ2VsbEV4dGVybmFsQ29weU1hbmFnZXJFeHRlbnNpb24sXHJcbiAgQ2VsbE1lbnVFeHRlbnNpb24sXHJcbiAgQ29sdW1uUGlja2VyRXh0ZW5zaW9uLFxyXG4gIENvbnRleHRNZW51RXh0ZW5zaW9uLFxyXG4gIERyYWdnYWJsZUdyb3VwaW5nRXh0ZW5zaW9uLFxyXG4gIEV4dGVuc2lvblV0aWxpdHksXHJcbiAgR3JpZE1lbnVFeHRlbnNpb24sXHJcbiAgR3JvdXBJdGVtTWV0YVByb3ZpZGVyRXh0ZW5zaW9uLFxyXG4gIEhlYWRlck1lbnVFeHRlbnNpb24sXHJcbiAgSGVhZGVyQnV0dG9uRXh0ZW5zaW9uLFxyXG4gIFJvd1NlbGVjdGlvbkV4dGVuc2lvbixcclxuICBSb3dNb3ZlTWFuYWdlckV4dGVuc2lvbixcclxuXHJcbiAgLy8gdXRpbGl0aWVzXHJcbiAgYXV0b0FkZEVkaXRvckZvcm1hdHRlclRvQ29sdW1uc1dpdGhFZGl0b3IsXHJcbiAgZW1wdHlFbGVtZW50LFxyXG4gIEdldFNsaWNrRXZlbnRUeXBlLFxyXG4gIEdyaWRTdGF0ZVR5cGUsXHJcbn0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY29tbW9uJztcclxuaW1wb3J0IHsgRXZlbnRQdWJTdWJTZXJ2aWNlIH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvZXZlbnQtcHViLXN1Yic7XHJcbmltcG9ydCB7IFNsaWNrRW1wdHlXYXJuaW5nQ29tcG9uZW50IH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvZW1wdHktd2FybmluZy1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbGlja0Zvb3RlckNvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2N1c3RvbS1mb290ZXItY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvcGFnaW5hdGlvbi1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSeEpzUmVzb3VyY2UgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9yeGpzLW9ic2VydmFibGUnO1xyXG5pbXBvcnQgeyBkZXF1YWwgfSBmcm9tICdkZXF1YWwvbGl0ZSc7XHJcblxyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBBbmd1bGFyR3JpZEluc3RhbmNlLCBFeHRlcm5hbFRlc3RpbmdEZXBlbmRlbmNpZXMsIEdyaWRPcHRpb24sIH0gZnJvbSAnLi8uLi9tb2RlbHMvaW5kZXgnO1xyXG5pbXBvcnQgeyBHbG9iYWxHcmlkT3B0aW9ucyB9IGZyb20gJy4vLi4vZ2xvYmFsLWdyaWQtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNsYXRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgdW5zdWJzY3JpYmVBbGxPYnNlcnZhYmxlcyB9IGZyb20gJy4vLi4vc2VydmljZXMvdXRpbGl0aWVzJztcclxuXHJcbi8vIFNlcnZpY2VzXHJcbmltcG9ydCB7IEFuZ3VsYXJVdGlsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FuZ3VsYXJVdGlsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3dEZXRhaWxWaWV3RXh0ZW5zaW9uIH0gZnJvbSAnLi4vZXh0ZW5zaW9ucy9yb3dEZXRhaWxWaWV3RXh0ZW5zaW9uJztcclxuaW1wb3J0IHsgQ29udGFpbmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnRhaW5lci5zZXJ2aWNlJztcclxuXHJcbi8vIHVzaW5nIGV4dGVybmFsIG5vbi10eXBlZCBqcyBsaWJyYXJpZXNcclxuZGVjbGFyZSBjb25zdCBTbGljazogU2xpY2tOYW1lc3BhY2U7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FuZ3VsYXItc2xpY2tncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgLy8gbWFrZSBldmVyeXRoaW5nIHRyYW5zaWVudCAobm9uLXNpbmdsZXRvbilcclxuICAgIEFuZ3VsYXJVdGlsU2VydmljZSxcclxuICAgIEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgUm93RGV0YWlsVmlld0V4dGVuc2lvbixcclxuICAgIFRyYW5zbGF0ZXJTZXJ2aWNlLFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJTbGlja2dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX2RhdGFzZXQ/OiBhbnlbXSB8IG51bGw7XHJcbiAgcHJpdmF0ZSBfY29sdW1uRGVmaW5pdGlvbnMhOiBDb2x1bW5bXTtcclxuICBwcml2YXRlIF9jdXJyZW50RGF0YXNldExlbmd0aCA9IDA7XHJcbiAgcHJpdmF0ZSBfZXZlbnRIYW5kbGVyOiBTbGlja0V2ZW50SGFuZGxlciA9IG5ldyBTbGljay5FdmVudEhhbmRsZXIoKTtcclxuICBwcml2YXRlIF9ldmVudFB1YlN1YlNlcnZpY2UhOiBFdmVudFB1YlN1YlNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBfYW5ndWxhckdyaWRJbnN0YW5jZXM6IEFuZ3VsYXJHcmlkSW5zdGFuY2UgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0dyaWRJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzRGF0YXNldEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzTG9jYWxHcmlkID0gdHJ1ZTtcclxuICBwcml2YXRlIF9wYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9yZWdpc3RlcmVkUmVzb3VyY2VzOiBFeHRlcm5hbFJlc291cmNlW10gPSBbXTtcclxuICBkYXRhVmlldyE6IFNsaWNrRGF0YVZpZXc7XHJcbiAgc2xpY2tHcmlkITogU2xpY2tHcmlkO1xyXG4gIGdyb3VwaW5nRGVmaW5pdGlvbjogYW55ID0ge307XHJcbiAgZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcjogYW55O1xyXG4gIGJhY2tlbmRTZXJ2aWNlQXBpPzogQmFja2VuZFNlcnZpY2VBcGk7XHJcbiAgbG9jYWxlcyE6IExvY2FsZTtcclxuICBtZXRyaWNzPzogTWV0cmljcztcclxuICBzaG93UGFnaW5hdGlvbiA9IGZhbHNlO1xyXG4gIHNlcnZpY2VMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHRvdGFsSXRlbXMgPSAwO1xyXG4gIHBhZ2luYXRpb25EYXRhPzoge1xyXG4gICAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb247XHJcbiAgICBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XHJcbiAgfTtcclxuICBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICAvLyBjb21wb25lbnRzXHJcbiAgc2xpY2tFbXB0eVdhcm5pbmc/OiBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudDtcclxuICBzbGlja0Zvb3Rlcj86IFNsaWNrRm9vdGVyQ29tcG9uZW50O1xyXG4gIHNsaWNrUGFnaW5hdGlvbj86IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudDtcclxuXHJcbiAgLy8gZXh0ZW5zaW9uc1xyXG4gIGV4dGVuc2lvblV0aWxpdHk6IEV4dGVuc2lvblV0aWxpdHk7XHJcblxyXG4gIC8vIHNlcnZpY2VzXHJcbiAgYmFja2VuZFV0aWxpdHlTZXJ2aWNlITogQmFja2VuZFV0aWxpdHlTZXJ2aWNlO1xyXG4gIGNvbGxlY3Rpb25TZXJ2aWNlOiBDb2xsZWN0aW9uU2VydmljZTtcclxuICBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlO1xyXG4gIGZpbHRlckZhY3RvcnkhOiBGaWx0ZXJGYWN0b3J5O1xyXG4gIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2U7XHJcbiAgZ3JpZEV2ZW50U2VydmljZTogR3JpZEV2ZW50U2VydmljZTtcclxuICBncmlkU2VydmljZTogR3JpZFNlcnZpY2U7XHJcbiAgZ3JpZFN0YXRlU2VydmljZTogR3JpZFN0YXRlU2VydmljZTtcclxuICBncm91cGluZ1NlcnZpY2U6IEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2U7XHJcbiAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlO1xyXG4gIHJlc2l6ZXJTZXJ2aWNlITogUmVzaXplclNlcnZpY2U7XHJcbiAgcnhqcz86IFJ4SnNGYWNhZGU7XHJcbiAgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZTtcclxuICBzb3J0U2VydmljZTogU29ydFNlcnZpY2U7XHJcbiAgdHJlZURhdGFTZXJ2aWNlOiBUcmVlRGF0YVNlcnZpY2U7XHJcblxyXG4gIEBJbnB1dCgpIGN1c3RvbURhdGFWaWV3OiBhbnk7XHJcbiAgQElucHV0KCkgZ3JpZElkOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBncmlkT3B0aW9ucyE6IEdyaWRPcHRpb247XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHBhZ2luYXRpb25PcHRpb25zKCk6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zO1xyXG4gIH1cclxuICBzZXQgcGFnaW5hdGlvbk9wdGlvbnMobmV3UGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmIChuZXdQYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucykge1xyXG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHsgLi4udGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uLCAuLi50aGlzLl9wYWdpbmF0aW9uT3B0aW9ucywgLi4ubmV3UGFnaW5hdGlvbk9wdGlvbnMgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0gbmV3UGFnaW5hdGlvbk9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24gPSB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA/PyB0aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb247XHJcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVRvdGFsSXRlbXModGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zID8/IDAsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY29sdW1uRGVmaW5pdGlvbnMoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IGNvbHVtbkRlZmluaXRpb25zO1xyXG4gICAgaWYgKHRoaXMuX2lzR3JpZEluaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uRGVmaW5pdGlvbnNMaXN0KGNvbHVtbkRlZmluaXRpb25zKTtcclxuICAgIH1cclxuICAgIGlmIChjb2x1bW5EZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuY29weUNvbHVtbldpZHRoc1JlZmVyZW5jZShjb2x1bW5EZWZpbml0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBjb2x1bW5EZWZpbml0aW9ucygpOiBDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBkYXRhc2V0KCk6IGFueVtdIHtcclxuICAgIHJldHVybiAodGhpcy5jdXN0b21EYXRhVmlldyA/IHRoaXMuc2xpY2tHcmlkPy5nZXREYXRhPy4oKSA6IHRoaXMuZGF0YVZpZXc/LmdldEl0ZW1zPy4oKSkgfHwgW107XHJcbiAgfVxyXG4gIHNldCBkYXRhc2V0KG5ld0RhdGFzZXQ6IGFueVtdKSB7XHJcbiAgICBjb25zdCBwcmV2RGF0YXNldExuID0gdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGg7XHJcbiAgICBjb25zdCBpc0RhdGFzZXRFcXVhbCA9IGRlcXVhbChuZXdEYXRhc2V0LCB0aGlzLl9kYXRhc2V0IHx8IFtdKTtcclxuICAgIGxldCBkYXRhID0gbmV3RGF0YXNldDtcclxuXHJcbiAgICAvLyB3aGVuIFRyZWUgRGF0YSBpcyBlbmFibGVkIGFuZCB3ZSBkb24ndCB5ZXQgaGF2ZSB0aGUgaGllcmFyY2hpY2FsIGRhdGFzZXQgZmlsbGVkLCB3ZSBjYW4gZm9yY2UgYSBjb252ZXJ0K3NvcnQgb2YgdGhlIGFycmF5XHJcbiAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlVHJlZURhdGEgJiYgQXJyYXkuaXNBcnJheShuZXdEYXRhc2V0KSAmJiAobmV3RGF0YXNldC5sZW5ndGggPiAwIHx8IG5ld0RhdGFzZXQubGVuZ3RoICE9PSBwcmV2RGF0YXNldExuIHx8ICFpc0RhdGFzZXRFcXVhbCkpIHtcclxuICAgICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgZGF0YSA9IHRoaXMuc29ydFRyZWVEYXRhc2V0KG5ld0RhdGFzZXQsICFpc0RhdGFzZXRFcXVhbCk7IC8vIGlmIGRhdGFzZXQgY2hhbmdlZCwgdGhlbiBmb3JjZSBhIHJlZnJlc2ggYW55d2F5XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kYXRhc2V0ID0gZGF0YTtcclxuICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKGRhdGEgfHwgW10pO1xyXG4gICAgdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGggPSAobmV3RGF0YXNldCB8fCBbXSkubGVuZ3RoO1xyXG5cclxuICAgIC8vIGV4cGFuZC9hdXRvZml0IGNvbHVtbnMgb24gZmlyc3QgcGFnZSBsb2FkXHJcbiAgICAvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaWYgdGhlIHByZXZEYXRhc2V0IHdhcyBlbXB0eSB0aGVuIHdlIGFyZSBvbiBmaXJzdCBsb2FkXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBwcmV2RGF0YXNldExuID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmF1dG9zaXplQ29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZGF0YXNldEhpZXJhcmNoaWNhbCgpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQ7XHJcbiAgfVxyXG4gIHNldCBkYXRhc2V0SGllcmFyY2hpY2FsKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQ6IGFueVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBjb25zdCBpc0RhdGFzZXRFcXVhbCA9IGRlcXVhbChuZXdIaWVyYXJjaGljYWxEYXRhc2V0LCB0aGlzLnNoYXJlZFNlcnZpY2U/LmhpZXJhcmNoaWNhbERhdGFzZXQgPz8gW10pO1xyXG4gICAgY29uc3QgcHJldkZsYXREYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0ID0gbmV3SGllcmFyY2hpY2FsRGF0YXNldDtcclxuXHJcbiAgICBpZiAobmV3SGllcmFyY2hpY2FsRGF0YXNldCAmJiB0aGlzLmNvbHVtbkRlZmluaXRpb25zICYmIHRoaXMuZmlsdGVyU2VydmljZT8uY2xlYXJGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5jbGVhckZpbHRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuIGEgaGllcmFyY2hpY2FsIGRhdGFzZXQgaXMgc2V0IGFmdGVyd2FyZCwgd2UgY2FuIHJlc2V0IHRoZSBmbGF0IGRhdGFzZXQgYW5kIGNhbGwgYSB0cmVlIGRhdGEgc29ydCB0aGF0IHdpbGwgb3ZlcndyaXRlIHRoZSBmbGF0IGRhdGFzZXRcclxuICAgIGlmIChuZXdIaWVyYXJjaGljYWxEYXRhc2V0ICYmIHRoaXMuc2xpY2tHcmlkICYmIHRoaXMuc29ydFNlcnZpY2U/LnByb2Nlc3NUcmVlRGF0YUluaXRpYWxTb3J0KSB7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoW10sIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YXNldElkUHJvcGVydHlOYW1lID8/ICdpZCcpO1xyXG4gICAgICB0aGlzLnNvcnRTZXJ2aWNlLnByb2Nlc3NUcmVlRGF0YUluaXRpYWxTb3J0KCk7XHJcblxyXG4gICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gcmVzZXQvcmVmcmVzaCB0aGUgVHJlZSBEYXRhIGZpbHRlcnMgYmVjYXVzZSBpZiB3ZSBpbnNlcnRlZCBuZXcgaXRlbShzKSB0aGVuIGl0IG1pZ2h0IG5vdCBzaG93IHVwIHdpdGhvdXQgZG9pbmcgdGhpcyByZWZyZXNoXHJcbiAgICAgIC8vIGhvd2V2ZXIgd2UgbmVlZCAxIGNwdSBjeWNsZSBiZWZvcmUgaGF2aW5nIHRoZSBEYXRhVmlldyByZWZyZXNoZWQsIHNvIHdlIG5lZWQgdG8gd3JhcCB0aGlzIGNoZWNrIGluIGEgc2V0VGltZW91dFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBmbGF0RGF0YXNldExuID0gdGhpcy5kYXRhVmlldy5nZXRJdGVtQ291bnQoKTtcclxuICAgICAgICBpZiAoZmxhdERhdGFzZXRMbiA+IDAgJiYgKGZsYXREYXRhc2V0TG4gIT09IHByZXZGbGF0RGF0YXNldExuIHx8ICFpc0RhdGFzZXRFcXVhbCkpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWZyZXNoVHJlZURhdGFGaWx0ZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGVsZW1lbnRSZWYoKTogRWxlbWVudFJlZiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbG07XHJcbiAgfVxyXG5cclxuICBnZXQgZXZlbnRIYW5kbGVyKCk6IFNsaWNrRXZlbnRIYW5kbGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ldmVudEhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JpZENvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRDb250YWluZXJJZCB8fCAnJ31gKTtcclxuICB9XHJcblxyXG4gIC8qKiBHRVRURVIgdG8ga25vdyBpZiBkYXRhc2V0IHdhcyBpbml0aWFsaXplZCBvciBub3QgKi9cclxuICBnZXQgaXNEYXRhc2V0SW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG4gIC8qKiBTRVRURVIgdG8gY2hhbmdlIGlmIGRhdGFzZXQgd2FzIGluaXRpYWxpemVkIG9yIG5vdCAoc3RyaW5nbHkgdXNlZCBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzKSAqL1xyXG4gIHNldCBpc0RhdGFzZXRJbml0aWFsaXplZChpc0luaXRpYWxpemVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IGlzSW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG4gIHNldCBpc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZChpc0luaXRpYWxpemVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGlzSW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVnaXN0ZXJlZFJlc291cmNlcygpOiBFeHRlcm5hbFJlc291cmNlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXM7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhclV0aWxTZXJ2aWNlOiBBbmd1bGFyVXRpbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcFJlZjogQXBwbGljYXRpb25SZWYsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyU2VydmljZTogQ29udGFpbmVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxtOiBFbGVtZW50UmVmLFxyXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZXJTZXJ2aWNlOiBUcmFuc2xhdGVyU2VydmljZSxcclxuICAgIEBJbmplY3QoJ2NvbmZpZycpIHByaXZhdGUgZm9yUm9vdENvbmZpZzogR3JpZE9wdGlvbixcclxuICAgIEBJbmplY3QoJ2V4dGVybmFsU2VydmljZScpIGV4dGVybmFsU2VydmljZXM6IEV4dGVybmFsVGVzdGluZ0RlcGVuZGVuY2llc1xyXG4gICkge1xyXG4gICAgY29uc3Qgc2xpY2tncmlkQ29uZmlnID0gbmV3IFNsaWNrZ3JpZENvbmZpZygpO1xyXG5cclxuICAgIC8vIGluaXRpYWxpemUgYW5kIGFzc2lnbiBhbGwgU2VydmljZSBEZXBlbmRlbmNpZXNcclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmV2ZW50UHViU3ViU2VydmljZSA/PyBuZXcgRXZlbnRQdWJTdWJTZXJ2aWNlKHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSBFdmVudE5hbWluZ1N0eWxlLmNhbWVsQ2FzZTtcclxuXHJcbiAgICB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmJhY2tlbmRVdGlsaXR5U2VydmljZSA/PyBuZXcgQmFja2VuZFV0aWxpdHlTZXJ2aWNlKCk7XHJcbiAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncmlkRXZlbnRTZXJ2aWNlID8/IG5ldyBHcmlkRXZlbnRTZXJ2aWNlKCk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zaGFyZWRTZXJ2aWNlID8/IG5ldyBTaGFyZWRTZXJ2aWNlKCk7XHJcbiAgICB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uY29sbGVjdGlvblNlcnZpY2UgPz8gbmV3IENvbGxlY3Rpb25TZXJ2aWNlKHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5ID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXh0ZW5zaW9uVXRpbGl0eSA/PyBuZXcgRXh0ZW5zaW9uVXRpbGl0eSh0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gbmV3IEZpbHRlckZhY3Rvcnkoc2xpY2tncmlkQ29uZmlnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlLCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuZmlsdGVyU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmZpbHRlclNlcnZpY2UgPz8gbmV3IEZpbHRlclNlcnZpY2UodGhpcy5maWx0ZXJGYWN0b3J5IGFzIGFueSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMucmVzaXplclNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5yZXNpemVyU2VydmljZSA/PyBuZXcgUmVzaXplclNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuc29ydFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zb3J0U2VydmljZSA/PyBuZXcgU29ydFNlcnZpY2UodGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcclxuICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8udHJlZURhdGFTZXJ2aWNlID8/IG5ldyBUcmVlRGF0YVNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnBhZ2luYXRpb25TZXJ2aWNlID8/IG5ldyBQYWdpbmF0aW9uU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xyXG5cclxuICAgIC8vIGV4dGVuc2lvbnNcclxuICAgIGNvbnN0IGF1dG9Ub29sdGlwRXh0ZW5zaW9uID0gbmV3IEF1dG9Ub29sdGlwRXh0ZW5zaW9uKHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBjZWxsRXh0ZXJuYWxDb3B5TWFuYWdlckV4dGVuc2lvbiA9IG5ldyBDZWxsRXh0ZXJuYWxDb3B5TWFuYWdlckV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCBjZWxsTWVudUV4dGVuc2lvbiA9IG5ldyBDZWxsTWVudUV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICBjb25zdCBjb250ZXh0TWVudUV4dGVuc2lvbiA9IG5ldyBDb250ZXh0TWVudUV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblV0aWxpdHksIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICBjb25zdCBjb2x1bW5QaWNrZXJFeHRlbnNpb24gPSBuZXcgQ29sdW1uUGlja2VyRXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgIGNvbnN0IGNoZWNrYm94RXh0ZW5zaW9uID0gbmV3IENoZWNrYm94U2VsZWN0b3JFeHRlbnNpb24odGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgIGNvbnN0IGRyYWdnYWJsZUdyb3VwaW5nRXh0ZW5zaW9uID0gbmV3IERyYWdnYWJsZUdyb3VwaW5nRXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG4gICAgY29uc3QgZ3JpZE1lbnVFeHRlbnNpb24gPSBuZXcgR3JpZE1lbnVFeHRlbnNpb24odGhpcy5leHRlbnNpb25VdGlsaXR5LCB0aGlzLmZpbHRlclNlcnZpY2UsdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgIGNvbnN0IGdyb3VwSXRlbU1ldGFQcm92aWRlckV4dGVuc2lvbiA9IG5ldyBHcm91cEl0ZW1NZXRhUHJvdmlkZXJFeHRlbnNpb24odGhpcy5zaGFyZWRTZXJ2aWNlKTtcclxuICAgIGNvbnN0IGhlYWRlckJ1dHRvbkV4dGVuc2lvbiA9IG5ldyBIZWFkZXJCdXR0b25FeHRlbnNpb24odGhpcy5leHRlbnNpb25VdGlsaXR5LCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG4gICAgY29uc3QgaGVhZGVyTWVudUV4dGVuc2lvbiA9IG5ldyBIZWFkZXJNZW51RXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5maWx0ZXJTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICBjb25zdCByb3dEZXRhaWxWaWV3RXh0ZW5zaW9uID0gbmV3IFJvd0RldGFpbFZpZXdFeHRlbnNpb24odGhpcy5hbmd1bGFyVXRpbFNlcnZpY2UsIHRoaXMuYXBwUmVmLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5yeGpzKTtcclxuICAgIGNvbnN0IHJvd01vdmVNYW5hZ2VyRXh0ZW5zaW9uID0gbmV3IFJvd01vdmVNYW5hZ2VyRXh0ZW5zaW9uKHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICBjb25zdCByb3dTZWxlY3Rpb25FeHRlbnNpb24gPSBuZXcgUm93U2VsZWN0aW9uRXh0ZW5zaW9uKHRoaXMuc2hhcmVkU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXh0ZW5zaW9uU2VydmljZSA/PyBuZXcgRXh0ZW5zaW9uU2VydmljZShcclxuICAgICAgYXV0b1Rvb2x0aXBFeHRlbnNpb24sXHJcbiAgICAgIGNlbGxFeHRlcm5hbENvcHlNYW5hZ2VyRXh0ZW5zaW9uLFxyXG4gICAgICBjZWxsTWVudUV4dGVuc2lvbixcclxuICAgICAgY2hlY2tib3hFeHRlbnNpb24sXHJcbiAgICAgIGNvbHVtblBpY2tlckV4dGVuc2lvbixcclxuICAgICAgY29udGV4dE1lbnVFeHRlbnNpb24sXHJcbiAgICAgIGRyYWdnYWJsZUdyb3VwaW5nRXh0ZW5zaW9uLFxyXG4gICAgICBncmlkTWVudUV4dGVuc2lvbixcclxuICAgICAgZ3JvdXBJdGVtTWV0YVByb3ZpZGVyRXh0ZW5zaW9uLFxyXG4gICAgICBoZWFkZXJCdXR0b25FeHRlbnNpb24sXHJcbiAgICAgIGhlYWRlck1lbnVFeHRlbnNpb24sXHJcbiAgICAgIHJvd0RldGFpbFZpZXdFeHRlbnNpb24sXHJcbiAgICAgIHJvd01vdmVNYW5hZ2VyRXh0ZW5zaW9uLFxyXG4gICAgICByb3dTZWxlY3Rpb25FeHRlbnNpb24sXHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZSxcclxuICAgICAgdGhpcy50cmFuc2xhdGVyU2VydmljZSxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZ3JpZFN0YXRlU2VydmljZSA/PyBuZXcgR3JpZFN0YXRlU2VydmljZSh0aGlzLmV4dGVuc2lvblNlcnZpY2UsIHRoaXMuZmlsdGVyU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UsIHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcclxuICAgIHRoaXMuZ3JpZFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncmlkU2VydmljZSA/PyBuZXcgR3JpZFNlcnZpY2UodGhpcy5ncmlkU3RhdGVTZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5wYWdpbmF0aW9uU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB0aGlzLmdyb3VwaW5nU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/Lmdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UgPz8gbmV3IEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UodGhpcy5leHRlbnNpb25VdGlsaXR5LCB0aGlzLmV4dGVuc2lvblNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5zZXJ2aWNlTGlzdCA9IFtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLFxyXG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSxcclxuICAgICAgdGhpcy5ncmlkU2VydmljZSxcclxuICAgICAgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmdyb3VwaW5nU2VydmljZSxcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcclxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZSxcclxuICAgICAgdGhpcy5zb3J0U2VydmljZSxcclxuICAgICAgdGhpcy50cmVlRGF0YVNlcnZpY2UsXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIHJlZ2lzdGVyIGFsbCBTZXJ2aWNlIGluc3RhbmNlcyBpbiB0aGUgY29udGFpbmVyXHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXh0ZW5zaW9uVXRpbGl0eScsIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRmlsdGVyU2VydmljZScsIHRoaXMuZmlsdGVyU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnQ29sbGVjdGlvblNlcnZpY2UnLCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdFeHRlbnNpb25TZXJ2aWNlJywgdGhpcy5leHRlbnNpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkRXZlbnRTZXJ2aWNlJywgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkU2VydmljZScsIHRoaXMuZ3JpZFNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyaWRTdGF0ZVNlcnZpY2UnLCB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UnLCB0aGlzLmdyb3VwaW5nU2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUGFnaW5hdGlvblNlcnZpY2UnLCB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdSZXNpemVyU2VydmljZScsIHRoaXMucmVzaXplclNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1NoYXJlZFNlcnZpY2UnLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1NvcnRTZXJ2aWNlJywgdGhpcy5zb3J0U2VydmljZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXZlbnRQdWJTdWJTZXJ2aWNlJywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdQdWJTdWJTZXJ2aWNlJywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdUcmFuc2xhdGVyU2VydmljZScsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xyXG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1RyZWVEYXRhU2VydmljZScsIHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6YXRpb24odGhpcy5fZXZlbnRIYW5kbGVyKTtcclxuICAgIHRoaXMuX2lzR3JpZEluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICAvLyByZWNoZWNrIHRoZSBlbXB0eSB3YXJuaW5nIG1lc3NhZ2UgYWZ0ZXIgZ3JpZCBpcyBzaG93biBzbyB0aGF0IGl0IHdvcmtzIGluIGV2ZXJ5IHVzZSBjYXNlXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlICYmIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhc2V0KSkge1xyXG4gICAgICBjb25zdCBmaW5hbFRvdGFsQ291bnQgPSB0aGlzLmRhdGFzZXQubGVuZ3RoO1xyXG4gICAgICB0aGlzLmRpc3BsYXlFbXB0eURhdGFXYXJuaW5nKGZpbmFsVG90YWxDb3VudCA8IDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25CZWZvcmVHcmlkRGVzdHJveScsIHRoaXMuc2xpY2tHcmlkKTtcclxuICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQWZ0ZXJHcmlkRGVzdHJveWVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KHNob3VsZEVtcHR5RG9tRWxlbWVudENvbnRhaW5lciA9IGZhbHNlKSB7XHJcbiAgICAvLyBkaXNwb3NlIG9mIGFsbCBTZXJ2aWNlc1xyXG4gICAgdGhpcy5zZXJ2aWNlTGlzdC5mb3JFYWNoKChzZXJ2aWNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHNlcnZpY2UgJiYgc2VydmljZS5kaXNwb3NlKSB7XHJcbiAgICAgICAgc2VydmljZS5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZXJ2aWNlTGlzdCA9IFtdO1xyXG5cclxuICAgIC8vIGRpc3Bvc2UgYWxsIHJlZ2lzdGVyZWQgZXh0ZXJuYWwgcmVzb3VyY2VzXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSkge1xyXG4gICAgICB3aGlsZSAodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnBvcCgpO1xyXG4gICAgICAgIGlmIChyZXNvdXJjZT8uZGlzcG9zZSkge1xyXG4gICAgICAgICAgcmVzb3VyY2UuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGlzcG9zZSB0aGUgQ29tcG9uZW50c1xyXG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZz8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5zbGlja0Zvb3Rlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5zbGlja1BhZ2luYXRpb24/LmRpc3Bvc2UoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZXZlbnRIYW5kbGVyPy51bnN1YnNjcmliZUFsbCkge1xyXG4gICAgICB0aGlzLl9ldmVudEhhbmRsZXIudW5zdWJzY3JpYmVBbGwoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZT8udW5zdWJzY3JpYmVBbGwoKTtcclxuICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFWaWV3Py5zZXRJdGVtcykge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoW10pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmRlc3Ryb3kpIHtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3LmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2xpY2tHcmlkPy5kZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmRlc3Ryb3koc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXModGhpcy5iYWNrZW5kU2VydmljZUFwaSkpIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5iYWNrZW5kU2VydmljZUFwaVtwcm9wIGFzIGtleW9mIEJhY2tlbmRTZXJ2aWNlQXBpXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpKSB7XHJcbiAgICAgICh0aGlzLmNvbHVtbkRlZmluaXRpb25zIGFzIGFueSlbcHJvcF0gPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuc2hhcmVkU2VydmljZSkpIHtcclxuICAgICAgKHRoaXMuc2hhcmVkU2VydmljZSBhcyBhbnkpW3Byb3BdID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3ZSBjb3VsZCBvcHRpb25hbGx5IGFsc28gZW1wdHkgdGhlIGNvbnRlbnQgb2YgdGhlIGdyaWQgY29udGFpbmVyIERPTSBlbGVtZW50XHJcbiAgICBpZiAoc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHRoaXMuZW1wdHlHcmlkQ29udGFpbmVyRWxtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWxzbyB1bnN1YnNjcmliZSBhbGwgUnhKUyBzdWJzY3JpcHRpb25zXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSB1bnN1YnNjcmliZUFsbE9ic2VydmFibGVzKHRoaXMuc3Vic2NyaXB0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5fZGF0YXNldCA9IG51bGw7XHJcbiAgICB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBlbXB0eUdyaWRDb250YWluZXJFbG0oKSB7XHJcbiAgICBjb25zdCBncmlkQ29udGFpbmVySWQgPSB0aGlzLmdyaWRPcHRpb25zPy5ncmlkQ29udGFpbmVySWQgPz8gJ2dyaWQxJztcclxuICAgIGNvbnN0IGdyaWRDb250YWluZXJFbG0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtncmlkQ29udGFpbmVySWR9YCk7XHJcbiAgICBlbXB0eUVsZW1lbnQoZ3JpZENvbnRhaW5lckVsbSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgb3VyIGludGVybmFsIFBvc3QgUHJvY2VzcyBjYWxsYmFjaywgaXQgd2lsbCBleGVjdXRlIGludGVybmFsbHkgYWZ0ZXIgd2UgZ2V0IGJhY2sgcmVzdWx0IGZyb20gdGhlIFByb2Nlc3MgYmFja2VuZCBjYWxsXHJcbiAgICogRm9yIG5vdywgdGhpcyBpcyBHcmFwaFFMIFNlcnZpY2UgT05MWSBmZWF0dXJlIGFuZCBpdCB3aWxsIGJhc2ljYWxseSByZWZyZXNoIHRoZSBEYXRhc2V0ICYgUGFnaW5hdGlvbiB3aXRob3V0IGhhdmluZyB0aGUgdXNlciB0byBjcmVhdGUgaGlzIG93biBQb3N0UHJvY2VzcyBldmVyeSB0aW1lXHJcbiAgICovXHJcbiAgY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayhncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlKSB7XHJcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGlTZXJ2aWNlID0gYmFja2VuZEFwaS5zZXJ2aWNlO1xyXG5cclxuICAgICAgLy8gaW50ZXJuYWxQb3N0UHJvY2VzcyBvbmx5IHdvcmtzIChmb3Igbm93KSB3aXRoIGEgR3JhcGhRTCBTZXJ2aWNlLCBzbyBtYWtlIHN1cmUgaXQgaXMgb2YgdGhhdCB0eXBlXHJcbiAgICAgIGlmICh0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuZ2V0RGF0YXNldE5hbWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBiYWNrZW5kQXBpLmludGVybmFsUG9zdFByb2Nlc3MgPSAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSgpIDogJyc7XHJcbiAgICAgICAgICBpZiAocHJvY2Vzc1Jlc3VsdD8uZGF0YVtkYXRhc2V0TmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ25vZGVzJykgPyAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdLm5vZGVzIDogKHByb2Nlc3NSZXN1bHQgYXMgYW55KS5kYXRhW2RhdGFzZXROYW1lXTtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ3RvdGFsQ291bnQnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0udG90YWxDb3VudCA6IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hHcmlkRGF0YShkYXRhLCB0b3RhbENvdW50IHx8IDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemF0aW9uKGV2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIpIHtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMudHJhbnNsYXRlciA9IHRoaXMudHJhbnNsYXRlclNlcnZpY2U7XHJcbiAgICB0aGlzLl9ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXI7XHJcblxyXG4gICAgLy8gd2hlbiBkZXRlY3RpbmcgYSBmcm96ZW4gZ3JpZCwgd2UnbGwgYXV0b21hdGljYWxseSBlbmFibGUgdGhlIG1vdXNld2hlZWwgc2Nyb2xsIGhhbmRsZXIgc28gdGhhdCB3ZSBjYW4gc2Nyb2xsIGZyb20gYm90aCBsZWZ0L3JpZ2h0IGZyb3plbiBjb250YWluZXJzXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiAoKHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuUm93ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Sb3cgPj0gMCkgfHwgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA+PSAwKSAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZU1vdXNlV2hlZWxTY3JvbGxIYW5kbGVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVNb3VzZVdoZWVsU2Nyb2xsSGFuZGxlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSB0aGlzLmdyaWRPcHRpb25zPy5ldmVudE5hbWluZ1N0eWxlID8/IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xyXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZENyZWF0ZScsIHRydWUpO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YXNldCBpcyBpbml0aWFsaXplZCAoaWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpdCBjYW5ub3QgZ2V0TGVuZ3RoIG9mIG51bGwpXHJcbiAgICB0aGlzLl9kYXRhc2V0ID0gdGhpcy5fZGF0YXNldCB8fCBbXTtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB0aGlzLm1lcmdlR3JpZE9wdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb247XHJcbiAgICB0aGlzLmxvY2FsZXMgPSB0aGlzLmdyaWRPcHRpb25zPy5sb2NhbGVzID8/IENvbnN0YW50cy5sb2NhbGVzO1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZUFwaSA9IHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgdGhpcy5faXNMb2NhbEdyaWQgPSAhdGhpcy5iYWNrZW5kU2VydmljZUFwaTsgLy8gY29uc2lkZXJlZCBhIGxvY2FsIGdyaWQgaWYgaXQgZG9lc24ndCBoYXZlIGEgYmFja2VuZCBzZXJ2aWNlIHNldFxyXG5cclxuICAgIHRoaXMuY3JlYXRlQmFja2VuZEFwaUludGVybmFsUG9zdFByb2Nlc3NDYWxsYmFjayh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcclxuICAgICAgY29uc3QgZGF0YXZpZXdJbmxpbmVGaWx0ZXJzID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LmlubGluZUZpbHRlcnMgfHwgZmFsc2U7XHJcbiAgICAgIGxldCBkYXRhVmlld09wdGlvbnM6IERhdGFWaWV3T3B0aW9uID0geyBpbmxpbmVGaWx0ZXJzOiBkYXRhdmlld0lubGluZUZpbHRlcnMgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmRyYWdnYWJsZUdyb3VwaW5nIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlR3JvdXBpbmcpIHtcclxuICAgICAgICB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSBuZXcgU2xpY2suRGF0YS5Hcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyKCk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XHJcbiAgICAgICAgZGF0YVZpZXdPcHRpb25zID0geyAuLi5kYXRhVmlld09wdGlvbnMsIGdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI6IHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciB9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgU2xpY2suRGF0YS5EYXRhVmlldyhkYXRhVmlld09wdGlvbnMpO1xyXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25EYXRhdmlld0NyZWF0ZWQnLCB0aGlzLmRhdGFWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgYW55IHBvc3NpYmxlIFNlcnZpY2VzIHRoYXQgdXNlciB3YW50IHRvIHJlZ2lzdGVyIHdoaWNoIGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZFxyXG4gICAgLy8gUnhKUyBSZXNvdXJjZSBpcyBpbiB0aGlzIGxvdCBiZWNhdXNlIGl0IGhhcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGFuZCBkb2Vzbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluaXRpYWxpemVkXHJcbiAgICB0aGlzLnByZVJlZ2lzdGVyUmVzb3VyY2VzKCk7XHJcblxyXG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyLCB3ZSBwcm92aWRlIHRoZSBwcm9wZXJ0eSBcImVkaXRvclwiIGFzIGFuIEFuZ3VsYXItU2xpY2tncmlkIGVkaXRvciBjb21wbGV4IG9iamVjdFxyXG4gICAgLy8gaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XHJcbiAgICAvLyBzbyBpbiBvdXIgbGliIHdlIHdpbGwgc3dhcCBcImVkaXRvclwiIGFuZCBjb3B5IGl0IGludG8gYSBuZXcgcHJvcGVydHkgY2FsbGVkIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIlxyXG4gICAgLy8gdGhlbiB0YWtlIGJhY2sgXCJlZGl0b3IubW9kZWxcIiBhbmQgbWFrZSBpdCB0aGUgbmV3IFwiZWRpdG9yXCIgc28gdGhhdCBTbGlja0dyaWQgRWRpdG9yIEZhY3Rvcnkgc3RpbGwgd29ya3NcclxuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gdGhpcy5zd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xyXG5cclxuICAgIC8vIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGF1dG9tYXRpY2FsbHkgYWRkIGEgQ3VzdG9tIEVkaXRvciBGb3JtYXR0ZXIsIHdlIG5lZWQgdG8gY2FsbCB0aGUgYXV0byBhZGQgZnVuY3Rpb24gYWdhaW5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpIHtcclxuICAgICAgYXV0b0FkZEVkaXRvckZvcm1hdHRlclRvQ29sdW1uc1dpdGhFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMsIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b0FkZEN1c3RvbUVkaXRvckZvcm1hdHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSByZWZlcmVuY2UgZm9yIGFsbCBjb2x1bW5zIGJlZm9yZSB0aGV5IG9wdGlvbmFsbHkgYmVjb21lIGhpZGRlbi92aXNpYmxlXHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucyA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuY3JlYXRlRXh0ZW5zaW9uc0JlZm9yZUdyaWRDcmVhdGlvbih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcblxyXG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUGlubmluZy9Gcm96ZW4gXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gYXBwbHkgdGhlbSBpbiB0aGUgZ3JpZCBvcHRpb25zXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5waW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB7IC4uLnRoaXMuZ3JpZE9wdGlvbnMsIC4uLnRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5waW5uaW5nIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYnVpbGQgU2xpY2tHcmlkIEdyaWQsIGFsc28gdXNlciBtaWdodCBvcHRpb25hbGx5IHBhc3MgYSBjdXN0b20gZGF0YXZpZXcgKGUuZy4gcmVtb3RlIG1vZGVsKVxyXG4gICAgdGhpcy5zbGlja0dyaWQgPSBuZXcgU2xpY2suR3JpZChgIyR7dGhpcy5ncmlkSWR9YCwgdGhpcy5jdXN0b21EYXRhVmlldyB8fCB0aGlzLmRhdGFWaWV3LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGF0YVZpZXcgPSB0aGlzLmRhdGFWaWV3O1xyXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNsaWNrR3JpZCA9IHRoaXMuc2xpY2tHcmlkO1xyXG5cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5iaW5kRGlmZmVyZW50RXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5iaW5kRGlmZmVyZW50SG9va3ModGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuZGF0YVZpZXcpO1xyXG5cclxuICAgIC8vIHdoZW4gaXQncyBhIGZyb3plbiBncmlkLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGZyb3plbiBjb2x1bW4gaWQgZm9yIHJlZmVyZW5jZSBpZiB3ZSBldmVyIHNob3cvaGlkZSBjb2x1bW4gZnJvbSBDb2x1bW5QaWNrZXIvR3JpZE1lbnUgYWZ0ZXJ3YXJkXHJcbiAgICBjb25zdCBmcm96ZW5Db2x1bW5JbmRleCA9IHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA6IC0xO1xyXG4gICAgaWYgKGZyb3plbkNvbHVtbkluZGV4ID49IDAgJiYgZnJvemVuQ29sdW1uSW5kZXggPD0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5mcm96ZW5WaXNpYmxlQ29sdW1uSWQgPSB0aGlzLl9jb2x1bW5EZWZpbml0aW9uc1tmcm96ZW5Db2x1bW5JbmRleF0uaWQgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGFueSBwb3NzaWJsZSBTZXJ2aWNlcyB0aGF0IHVzZXIgd2FudCB0byByZWdpc3RlclxyXG4gICAgdGhpcy5yZWdpc3RlclJlc291cmNlcygpO1xyXG5cclxuICAgIC8vIGluaXRpYWxpemUgdGhlIFNsaWNrR3JpZCBncmlkXHJcbiAgICB0aGlzLnNsaWNrR3JpZC5pbml0KCk7XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZWQgdGhlIHJlc2l6ZXIgc2VydmljZSBvbmx5IGFmdGVyIFNsaWNrR3JpZCBpcyBpbml0aWFsaXplZFxyXG4gICAgLy8gaWYgd2UgZG9uJ3Qgd2UgZW5kIHVwIGJpbmRpbmcgb3VyIHJlc2l6ZSB0byBhIGdyaWQgZWxlbWVudCB0aGF0IGRvZXNuJ3QgeWV0IGV4aXN0IGluIHRoZSBET00gYW5kIHRoZSByZXNpemVyIHNlcnZpY2Ugd2lsbCBmYWlsIHNpbGVudGx5IChiZWNhdXNlIGl0IGhhcyBhIHRyeS9jYXRjaCB0aGF0IHVuYmluZHMgdGhlIHJlc2l6ZSB3aXRob3V0IHRocm93aW5nIGJhY2spXHJcbiAgICBpZiAodGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHVzZXIgY291bGQgc2hvdyBhIGN1c3RvbSBmb290ZXIgd2l0aCB0aGUgZGF0YSBtZXRyaWNzIChkYXRhc2V0IGxlbmd0aCBhbmQgbGFzdCB1cGRhdGVkIHRpbWVzdGFtcClcclxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnMuc2hvd0N1c3RvbUZvb3RlciAmJiB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMgJiYgdGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNsaWNrRm9vdGVyID0gbmV3IFNsaWNrRm9vdGVyQ29tcG9uZW50KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XHJcbiAgICAgIHRoaXMuc2xpY2tGb290ZXIucmVuZGVyRm9vdGVyKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jdXN0b21EYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3KSB7XHJcbiAgICAgIC8vIGxvYWQgdGhlIGRhdGEgaW4gdGhlIERhdGFWaWV3ICh1bmxlc3MgaXQncyBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0LCBpZiBzbyBpdCB3aWxsIGJlIGxvYWRlZCBhZnRlciB0aGUgaW5pdGlhbCB0cmVlIHNvcnQpXHJcbiAgICAgIGNvbnN0IGluaXRpYWxEYXRhc2V0ID0gdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlVHJlZURhdGEgPyB0aGlzLnNvcnRUcmVlRGF0YXNldCh0aGlzLl9kYXRhc2V0KSA6IHRoaXMuX2RhdGFzZXQ7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhpbml0aWFsRGF0YXNldCB8fCBbXSwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgPz8gJ2lkJyk7XHJcbiAgICAgIHRoaXMuZGF0YVZpZXcuZW5kVXBkYXRlKCk7XHJcblxyXG4gICAgICAvLyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgaXRlbXMgdGhhdCBhcmUgbm90IHZpc2libGUgKGR1ZSB0byBiZWluZyBmaWx0ZXJlZCBvdXQgb3IgYmVpbmcgb24gYSBkaWZmZXJlbnQgcGFnZSlcclxuICAgICAgLy8gdG8gc3RheSBzZWxlY3RlZCwgcGFzcyAnZmFsc2UnIHRvIHRoZSBzZWNvbmQgYXJnXHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsID0gdGhpcy5zbGlja0dyaWQgJiYgdGhpcy5zbGlja0dyaWQuZ2V0U2VsZWN0aW9uTW9kZWwoKTtcclxuICAgICAgaWYgKHNlbGVjdGlvbk1vZGVsICYmIHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3Lmhhc093blByb3BlcnR5KCdzeW5jR3JpZFNlbGVjdGlvbicpKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIHVzaW5nIGEgQmFja2VuZCBTZXJ2aWNlLCB3ZSB3aWxsIGRvIGFuIGV4dHJhIGZsYWcgY2hlY2ssIHRoZSByZWFzb24gaXMgYmVjYXVzZSBpdCBtaWdodCBoYXZlIHNvbWUgdW5pbnRlbmRlZCBiZWhhdmlvcnNcclxuICAgICAgICAvLyB3aXRoIHRoZSBCYWNrZW5kU2VydmljZUFwaSBiZWNhdXNlIHRlY2huaWNhbGx5IHRoZSBkYXRhIGluIHRoZSBwYWdlIGNoYW5nZXMgdGhlIERhdGFWaWV3IG9uIGV2ZXJ5IHBhZ2UgY2hhbmdlLlxyXG4gICAgICAgIGxldCBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaGFzT3duUHJvcGVydHkoJ3N5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlJykpIHtcclxuICAgICAgICAgIHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbldpdGhCYWNrZW5kU2VydmljZSBhcyBib29sZWFuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3luY0dyaWRTZWxlY3Rpb24gPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc3luY0dyaWRTZWxlY3Rpb24gPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgbGV0IHByZXNlcnZlZFJvd1NlbGVjdGlvbiA9IHN5bmNHcmlkU2VsZWN0aW9uO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICAgICAgICAvLyB3aGVuIHVzaW5nIEJhY2tlbmRTZXJ2aWNlQXBpLCB3ZSdsbCBiZSB1c2luZyB0aGUgXCJzeW5jR3JpZFNlbGVjdGlvbldpdGhCYWNrZW5kU2VydmljZVwiIGZsYWcgQlVUIFwic3luY0dyaWRTZWxlY3Rpb25cIiBtdXN0IGFsc28gYmUgc2V0IHRvIFRydWVcclxuICAgICAgICAgICAgcHJlc2VydmVkUm93U2VsZWN0aW9uID0gc3luY0dyaWRTZWxlY3Rpb24gJiYgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uKHRoaXMuc2xpY2tHcmlkLCBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN5bmNHcmlkU2VsZWN0aW9uID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgdGhpcy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbih0aGlzLnNsaWNrR3JpZCwgc3luY0dyaWRTZWxlY3Rpb24ucHJlc2VydmVIaWRkZW4sIHN5bmNHcmlkU2VsZWN0aW9uLnByZXNlcnZlSGlkZGVuT25TZWxlY3Rpb25DaGFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZGF0YXNldExuID0gdGhpcy5kYXRhVmlldy5nZXRMZW5ndGgoKSB8fCB0aGlzLl9kYXRhc2V0ICYmIHRoaXMuX2RhdGFzZXQubGVuZ3RoIHx8IDA7XHJcbiAgICAgIGlmIChkYXRhc2V0TG4gPiAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkUm93U2VsZWN0aW9uUHJlc2V0V2hlbkV4aXN0cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xyXG4gICAgICAgIHRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHVzZXIgbWlnaHQgd2FudCB0byBoaWRlIHRoZSBoZWFkZXIgcm93IG9uIHBhZ2UgbG9hZCBidXQgc3RpbGwgaGF2ZSBgZW5hYmxlRmlsdGVyaW5nOiB0cnVlYFxyXG4gICAgLy8gaWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UgbmVlZCB0byBoaWRlIHRoZSBoZWFkZXJSb3cgT05MWSBBRlRFUiBhbGwgZmlsdGVycyBnb3QgY3JlYXRlZCAmIGRhdGFWaWV3IGV4aXN0XHJcbiAgICBpZiAodGhpcy5faGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQpIHtcclxuICAgICAgdGhpcy5zaG93SGVhZGVyUm93KGZhbHNlKTtcclxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gdGhpcy5faGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGlzaCAmIGRpc3BhdGNoIGNlcnRhaW4gZXZlbnRzXHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25HcmlkQ3JlYXRlZCcsIHRoaXMuc2xpY2tHcmlkKTtcclxuXHJcbiAgICAvLyBhZnRlciB0aGUgRGF0YVZpZXcgaXMgY3JlYXRlZCAmIHVwZGF0ZWQgZXhlY3V0ZSBzb21lIHByb2Nlc3Nlc1xyXG4gICAgaWYgKCF0aGlzLmN1c3RvbURhdGFWaWV3KSB7XHJcbiAgICAgIHRoaXMuZXhlY3V0ZUFmdGVyRGF0YXZpZXdDcmVhdGVkKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBiaW5kIHJlc2l6ZSBPTkxZIGFmdGVyIHRoZSBkYXRhVmlldyBpcyByZWFkeVxyXG4gICAgdGhpcy5iaW5kUmVzaXplSG9vayh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucyk7XHJcblxyXG4gICAgLy8gYmluZCB0aGUgQmFja2VuZCBTZXJ2aWNlIEFQSSBjYWxsYmFjayBmdW5jdGlvbnMgb25seSBhZnRlciB0aGUgZ3JpZCBpcyBpbml0aWFsaXplZFxyXG4gICAgLy8gYmVjYXVzZSB0aGUgcHJlUHJvY2VzcygpIGFuZCBvbkluaXQoKSBtaWdodCBnZXQgdHJpZ2dlcmVkXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkpIHtcclxuICAgICAgdGhpcy5iaW5kQmFja2VuZENhbGxiYWNrRnVuY3Rpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvY2FsIGdyaWQsIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyB0aGUgUGFnaW5hdGlvblxyXG4gICAgLy8gaWYgc28gdGhlbiBhbHNvIGNoZWNrIGlmIHRoZXJlJ3MgYW55IHByZXNldHMgYW5kIGZpbmFsbHkgaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvblNlcnZpY2VcclxuICAgIC8vIGEgbG9jYWwgZ3JpZCB3aXRoIFBhZ2luYXRpb24gcHJlc2V0cyB3aWxsIHBvdGVudGlhbGx5IGhhdmUgYSBkaWZmZXJlbnQgdG90YWwgb2YgaXRlbXMsIHdlJ2xsIG5lZWQgdG8gZ2V0IGl0IGZyb20gdGhlIERhdGFWaWV3IGFuZCB1cGRhdGUgb3VyIHRvdGFsXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5sb2FkTG9jYWxHcmlkUGFnaW5hdGlvbih0aGlzLmRhdGFzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2FuZ3VsYXJHcmlkSW5zdGFuY2VzID0ge1xyXG4gICAgICAvLyBTbGljayBHcmlkICYgRGF0YVZpZXcgb2JqZWN0c1xyXG4gICAgICBkYXRhVmlldzogdGhpcy5kYXRhVmlldyxcclxuICAgICAgc2xpY2tHcmlkOiB0aGlzLnNsaWNrR3JpZCxcclxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25TZXJ2aWNlPy5leHRlbnNpb25MaXN0LFxyXG5cclxuICAgICAgLy8gcHVibGljIG1ldGhvZHNcclxuICAgICAgZGVzdHJveTogdGhpcy5kZXN0cm95LmJpbmQodGhpcyksXHJcblxyXG4gICAgICAvLyByZXR1cm4gYWxsIGF2YWlsYWJsZSBTZXJ2aWNlcyAobm9uLXNpbmdsZXRvbilcclxuICAgICAgYmFja2VuZFNlcnZpY2U6IHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpPy5zZXJ2aWNlLFxyXG4gICAgICBmaWx0ZXJTZXJ2aWNlOiB0aGlzLmZpbHRlclNlcnZpY2UsXHJcbiAgICAgIGdyaWRFdmVudFNlcnZpY2U6IHRoaXMuZ3JpZEV2ZW50U2VydmljZSxcclxuICAgICAgZ3JpZFN0YXRlU2VydmljZTogdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLFxyXG4gICAgICBncmlkU2VydmljZTogdGhpcy5ncmlkU2VydmljZSxcclxuICAgICAgZ3JvdXBpbmdTZXJ2aWNlOiB0aGlzLmdyb3VwaW5nU2VydmljZSxcclxuICAgICAgZXh0ZW5zaW9uU2VydmljZTogdGhpcy5leHRlbnNpb25TZXJ2aWNlLFxyXG4gICAgICBwYWdpbmF0aW9uU2VydmljZTogdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcclxuICAgICAgcmVzaXplclNlcnZpY2U6IHRoaXMucmVzaXplclNlcnZpY2UsXHJcbiAgICAgIHNvcnRTZXJ2aWNlOiB0aGlzLnNvcnRTZXJ2aWNlLFxyXG4gICAgICB0cmVlRGF0YVNlcnZpY2U6IHRoaXMudHJlZURhdGFTZXJ2aWNlLFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsbCBpbnN0YW5jZXMgKFNsaWNrR3JpZCwgRGF0YVZpZXcgJiBhbGwgU2VydmljZXMpXHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25Bbmd1bGFyR3JpZENyZWF0ZWQnLCB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBhIFBhZ2luYXRpb24gY2hhbmdlZCwgd2Ugd2lsbCB0cmlnZ2VyIGEgR3JpZCBTdGF0ZSBjaGFuZ2VkIHdpdGggdGhlIG5ldyBwYWdpbmF0aW9uIGluZm9cclxuICAgKiBBbHNvIGlmIHdlIHVzZSBSb3cgU2VsZWN0aW9uIG9yIHRoZSBDaGVja2JveCBTZWxlY3Rvciwgd2UgbmVlZCB0byByZXNldCBhbnkgc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgcGFnaW5hdGlvbkNoYW5nZWQocGFnaW5hdGlvbjogU2VydmljZVBhZ2luYXRpb24pIHtcclxuICAgIGNvbnN0IGlzU3luY0dyaWRTZWxlY3Rpb25FbmFibGVkID0gdGhpcy5ncmlkU3RhdGVTZXJ2aWNlPy5uZWVkVG9QcmVzZXJ2ZVJvd1NlbGVjdGlvbigpID8/IGZhbHNlO1xyXG4gICAgaWYgKCFpc1N5bmNHcmlkU2VsZWN0aW9uRW5hYmxlZCAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yKSkge1xyXG4gICAgICB0aGlzLnNsaWNrR3JpZC5zZXRTZWxlY3RlZFJvd3MoW10pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9ID0gcGFnaW5hdGlvbjtcclxuICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UpIHtcclxuICAgICAgaWYgKHBhZ2VTaXplICE9PSB1bmRlZmluZWQgJiYgcGFnZU51bWJlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmN1cnJlbnRQYWdpbmF0aW9uID0geyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25HcmlkU3RhdGVDaGFuZ2VkJywge1xyXG4gICAgICBjaGFuZ2U6IHsgbmV3VmFsdWVzOiB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0sIHR5cGU6IEdyaWRTdGF0ZVR5cGUucGFnaW5hdGlvbiB9LFxyXG4gICAgICBncmlkU3RhdGU6IHRoaXMuZ3JpZFN0YXRlU2VydmljZS5nZXRDdXJyZW50R3JpZFN0YXRlKClcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gZGF0YXNldCBjaGFuZ2VzLCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGVudGlyZSBncmlkIFVJICYgcG9zc2libHkgcmVzaXplIGl0IGFzIHdlbGxcclxuICAgKiBAcGFyYW0gZGF0YXNldFxyXG4gICAqL1xyXG4gIHJlZnJlc2hHcmlkRGF0YShkYXRhc2V0OiBhbnlbXSwgdG90YWxDb3VudD86IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVFbXB0eURhdGFXYXJuaW5nTWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KGRhdGFzZXQpKSB7XHJcbiAgICAgIGNvbnN0IGZpbmFsVG90YWxDb3VudCA9IHRvdGFsQ291bnQgfHwgZGF0YXNldC5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoZmluYWxUb3RhbENvdW50IDwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YXNldCkgJiYgdGhpcy5zbGlja0dyaWQgJiYgdGhpcy5kYXRhVmlldz8uc2V0SXRlbXMpIHtcclxuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhkYXRhc2V0LCB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSA/PyAnaWQnKTtcclxuICAgICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyZWVEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhVmlldy5yZVNvcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGFzZXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGFzZXQpIHtcclxuICAgICAgICB0aGlzLnNsaWNrR3JpZC5pbnZhbGlkYXRlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGRpc3BsYXkgdGhlIFBhZ2luYXRpb24gY29tcG9uZW50IG9ubHkgYWZ0ZXIgY2FsbGluZyB0aGlzIHJlZnJlc2ggZGF0YSBmaXJzdCwgd2UgY2FsbCBpdCBoZXJlIHNvIHRoYXQgaWYgd2UgcHJlc2V0IHBhZ2luYXRpb24gcGFnZSBudW1iZXIgaXQgd2lsbCBiZSBzaG93biBjb3JyZWN0bHlcclxuICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9ICh0aGlzLmdyaWRPcHRpb25zICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID09PSB1bmRlZmluZWQpKSkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbiAmJiB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25PcHRpb25zID0gdGhpcy5zZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zIGFzIFBhZ2luYXRpb24pO1xyXG4gICAgICAgIC8vIHdoZW4gd2UgaGF2ZSBhIHRvdGFsQ291bnQgdXNlIGl0LCBlbHNlIHdlJ2xsIHRha2UgaXQgZnJvbSB0aGUgcGFnaW5hdGlvbiBvYmplY3RcclxuICAgICAgICAvLyBvbmx5IHVwZGF0ZSB0aGUgdG90YWwgaXRlbXMgaWYgaXQncyBkaWZmZXJlbnQgdG8gYXZvaWQgcmVmcmVzaGluZyB0aGUgVUlcclxuICAgICAgICBjb25zdCB0b3RhbFJlY29yZHMgPSAodG90YWxDb3VudCAhPT0gdW5kZWZpbmVkKSA/IHRvdGFsQ291bnQgOiAodGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbj8udG90YWxJdGVtcyk7XHJcbiAgICAgICAgaWYgKHRvdGFsUmVjb3JkcyAhPT0gdW5kZWZpbmVkICYmIHRvdGFsUmVjb3JkcyAhPT0gdGhpcy50b3RhbEl0ZW1zKSB7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSArdG90YWxSZWNvcmRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlIHdpdGggbmV3IHBhZ2luYXRpb24gb3B0aW9ucyAod2hpY2ggbWlnaHQgaGF2ZSBwcmVzZXRzKVxyXG4gICAgICAgIGlmICghdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVBhZ2luYXRpb25TZXJ2aWNlKHBhZ2luYXRpb25PcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBwYWdpbmF0aW9uIHNlcnZpY2Ugd2l0aCB0aGUgbmV3IHRvdGFsXHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVRvdGFsSXRlbXModGhpcy50b3RhbEl0ZW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc2l6ZSB0aGUgZ3JpZCBpbnNpZGUgYSBzbGlnaHQgdGltZW91dCwgaW4gY2FzZSBvdGhlciBET00gZWxlbWVudCBjaGFuZ2VkIHByaW9yIHRvIHRoZSByZXNpemUgKGxpa2UgYSBmaWx0ZXIvcGFnaW5hdGlvbiBjaGFuZ2VkKVxyXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplKSB7XHJcbiAgICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLmdyaWRPcHRpb25zLmF1dG9SZXNpemUgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvUmVzaXplLmRlbGF5O1xyXG4gICAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZChkZWxheSB8fCAxMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZXJlJ3MgYW55IFBhZ2luYXRpb24gUHJlc2V0cyBkZWZpbmVkIGluIHRoZSBHcmlkIE9wdGlvbnMsXHJcbiAgICogaWYgdGhlcmUgYXJlIHRoZW4gbG9hZCB0aGVtIGluIHRoZSBwYWdpbmF0aW9uT3B0aW9ucyBvYmplY3RcclxuICAgKi9cclxuICBzZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uLCBwYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbik6IFBhZ2luYXRpb24ge1xyXG4gICAgaWYgKGdyaWRPcHRpb25zLnByZXNldHM/LnBhZ2luYXRpb24gJiYgcGFnaW5hdGlvbk9wdGlvbnMgJiYgIXRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkKSB7XHJcbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLnBhZ2VTaXplID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uLnBhZ2VTaXplO1xyXG4gICAgICBwYWdpbmF0aW9uT3B0aW9ucy5wYWdlTnVtYmVyID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uLnBhZ2VOdW1iZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFnaW5hdGlvbk9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEeW5hbWljYWxseSBjaGFuZ2Ugb3IgdXBkYXRlIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgbGlzdC5cclxuICAgKiBXZSB3aWxsIHJlLXJlbmRlciB0aGUgZ3JpZCBzbyB0aGF0IHRoZSBuZXcgaGVhZGVyIGFuZCBkYXRhIHNob3dzIHVwIGNvcnJlY3RseS5cclxuICAgKiBJZiB1c2luZyBpMThuLCB3ZSBhbHNvIG5lZWQgdG8gdHJpZ2dlciBhIHJlLXRyYW5zbGF0ZSBvZiB0aGUgY29sdW1uIGhlYWRlcnNcclxuICAgKi9cclxuICB1cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QobmV3Q29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XHJcbiAgICAvLyBtYXAvc3dhcCB0aGUgaW50ZXJuYWwgbGlicmFyeSBFZGl0b3IgdG8gdGhlIFNsaWNrR3JpZCBFZGl0b3IgZmFjdG9yeVxyXG4gICAgbmV3Q29sdW1uRGVmaW5pdGlvbnMgPSB0aGlzLnN3YXBJbnRlcm5hbEVkaXRvclRvU2xpY2tHcmlkRmFjdG9yeUVkaXRvcihuZXdDb2x1bW5EZWZpbml0aW9ucyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5IZWFkZXJzKGZhbHNlLCBuZXdDb2x1bW5EZWZpbml0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucmVuZGVyQ29sdW1uSGVhZGVycyhuZXdDb2x1bW5EZWZpbml0aW9ucywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xyXG4gICAgICB0aGlzLnNsaWNrR3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50ICYmIHRoaXMucmVzaXplclNlcnZpY2U/LnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSB7XHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgdGhlIGZpbHRlciByb3cgZGlzcGxheWVkIG9uIGZpcnN0IHJvdywgd2UgY2FuIG9wdGlvbmFsbHkgcGFzcyBmYWxzZSB0byBoaWRlIGl0LlxyXG4gICAqIEBwYXJhbSBzaG93aW5nXHJcbiAgICovXHJcbiAgc2hvd0hlYWRlclJvdyhzaG93aW5nID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zbGlja0dyaWQuc2V0SGVhZGVyUm93VmlzaWJpbGl0eShzaG93aW5nLCBmYWxzZSk7XHJcbiAgICBpZiAoc2hvd2luZyA9PT0gdHJ1ZSAmJiB0aGlzLl9pc0dyaWRJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLnNsaWNrR3JpZC5zZXRDb2x1bW5zKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNob3dpbmc7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIHByaXZhdGUgZnVuY3Rpb25zXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIExvb3AgdGhyb3VnaCBhbGwgY29sdW1uIGRlZmluaXRpb25zIGFuZCBjb3B5IHRoZSBvcmlnaW5hbCBvcHRpb25hbCBgd2lkdGhgIHByb3BlcnRpZXMgb3B0aW9uYWxseSBwcm92aWRlZCBieSB0aGUgdXNlci5cclxuICAgKiBXZSB3aWxsIHVzZSB0aGlzIHdoZW4gZG9pbmcgYSByZXNpemUgYnkgY2VsbCBjb250ZW50LCBpZiB1c2VyIHByb3ZpZGVkIGEgYHdpZHRoYCBpdCB3b24ndCBvdmVycmlkZSBpdC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvcHlDb2x1bW5XaWR0aHNSZWZlcmVuY2UoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5EZWZpbml0aW9ucy5mb3JFYWNoKGNvbCA9PiBjb2wub3JpZ2luYWxXaWR0aCA9IGNvbC53aWR0aCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BsYXlFbXB0eURhdGFXYXJuaW5nKHNob3dXYXJuaW5nID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZz8uc2hvd0VtcHR5RGF0YU1lc3NhZ2Uoc2hvd1dhcm5pbmcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiaW5kRGlmZmVyZW50SG9va3MoZ3JpZDogU2xpY2tHcmlkLCBncmlkT3B0aW9uczogR3JpZE9wdGlvbiwgZGF0YVZpZXc6IFNsaWNrRGF0YVZpZXcpIHtcclxuICAgIC8vIG9uIGxvY2FsZSBjaGFuZ2UsIHdlIGhhdmUgdG8gbWFudWFsbHkgdHJhbnNsYXRlIHRoZSBIZWFkZXJzLCBHcmlkTWVudVxyXG4gICAgaWYgKHRoaXMudHJhbnNsYXRlPy5vbkxhbmdDaGFuZ2UpIHtcclxuICAgICAgLy8gdHJhbnNsYXRlIHNvbWUgb2YgdGhlbSBvbiBmaXJzdCBsb2FkLCB0aGVuIG9uIGVhY2ggbGFuZ3VhZ2UgY2hhbmdlXHJcbiAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gcHVibGlzaCBldmVudCBvZiB0aGUgc2FtZSBuYW1lIHRoYXQgU2xpY2tncmlkLVVuaXZlcnNhbCB1c2VzIG9uIGEgbGFuZ3VhZ2UgY2hhbmdlIGV2ZW50XHJcbiAgICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25MYW5ndWFnZUNoYW5nZScpO1xyXG5cclxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNlbGxNZW51KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5IZWFkZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5QaWNrZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbnRleHRNZW51KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVHcmlkTWVudSgpO1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudHJhbnNsYXRlSGVhZGVyTWVudSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpO1xyXG4gICAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuY3JlYXRlUHJlSGVhZGVyUGFuZWwgJiYgIWdyaWRPcHRpb25zLmVuYWJsZURyYWdnYWJsZUdyb3VwaW5nKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cGluZ1NlcnZpY2UudHJhbnNsYXRlR3JvdXBpbmdBbmRDb2xTcGFuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHVzZXIgc2V0IGFuIG9uSW5pdCBCYWNrZW5kLCB3ZSdsbCBydW4gaXQgcmlnaHQgYXdheSAoYW5kIGlmIHNvLCB3ZSBhbHNvIG5lZWQgdG8gcnVuIHByZVByb2Nlc3MsIGludGVybmFsUG9zdFByb2Nlc3MgJiBwb3N0UHJvY2VzcylcclxuICAgIGlmIChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSkge1xyXG4gICAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XHJcblxyXG4gICAgICBpZiAoYmFja2VuZEFwaT8uc2VydmljZT8uaW5pdCkge1xyXG4gICAgICAgIGJhY2tlbmRBcGkuc2VydmljZS5pbml0KGJhY2tlbmRBcGkub3B0aW9ucywgZ3JpZE9wdGlvbnMucGFnaW5hdGlvbiwgdGhpcy5zbGlja0dyaWQsIHRoaXMuc2hhcmVkU2VydmljZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YVZpZXcgJiYgZ3JpZCkge1xyXG4gICAgICBjb25zdCBzbGlja2dyaWRFdmVudFByZWZpeCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmRlZmF1bHRTbGlja2dyaWRFdmVudFByZWZpeCA/PyAnJztcclxuXHJcbiAgICAgIC8vIGV4cG9zZSBhbGwgU2xpY2sgR3JpZCBFdmVudHMgdGhyb3VnaCBkaXNwYXRjaFxyXG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZ3JpZCkge1xyXG4gICAgICAgIGlmIChncmlkLmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3Auc3RhcnRzV2l0aCgnb24nKSkge1xyXG4gICAgICAgICAgY29uc3QgZ3JpZEV2ZW50SGFuZGxlciA9IChncmlkIGFzIGFueSlbcHJvcF07XHJcbiAgICAgICAgICBjb25zdCBncmlkRXZlbnROYW1lID0gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmdldEV2ZW50TmFtZUJ5TmFtaW5nQ29udmVudGlvbihwcm9wLCBzbGlja2dyaWRFdmVudFByZWZpeCk7XHJcbiAgICAgICAgICAodGhpcy5fZXZlbnRIYW5kbGVyIGFzIFNsaWNrRXZlbnRIYW5kbGVyPEdldFNsaWNrRXZlbnRUeXBlPHR5cGVvZiBncmlkRXZlbnRIYW5kbGVyPj4pLnN1YnNjcmliZShncmlkRXZlbnRIYW5kbGVyLCAoZXZlbnQsIGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5kaXNwYXRjaEN1c3RvbUV2ZW50KGdyaWRFdmVudE5hbWUsIHsgZXZlbnREYXRhOiBldmVudCwgYXJncyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZXhwb3NlIGFsbCBTbGljayBEYXRhVmlldyBFdmVudHMgdGhyb3VnaCBkaXNwYXRjaFxyXG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGF0YVZpZXcpIHtcclxuICAgICAgICBpZiAoZGF0YVZpZXcuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcC5zdGFydHNXaXRoKCdvbicpKSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhVmlld0V2ZW50SGFuZGxlciA9IChkYXRhVmlldyBhcyBhbnkpW3Byb3BdO1xyXG4gICAgICAgICAgKHRoaXMuX2V2ZW50SGFuZGxlciBhcyBTbGlja0V2ZW50SGFuZGxlcjxHZXRTbGlja0V2ZW50VHlwZTx0eXBlb2YgZGF0YVZpZXdFdmVudEhhbmRsZXI+Pikuc3Vic2NyaWJlKGRhdGFWaWV3RXZlbnRIYW5kbGVyLCAoZXZlbnQsIGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXdFdmVudE5hbWUgPSB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZ2V0RXZlbnROYW1lQnlOYW1pbmdDb252ZW50aW9uKHByb3AsIHNsaWNrZ3JpZEV2ZW50UHJlZml4KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5kaXNwYXRjaEN1c3RvbUV2ZW50KGRhdGFWaWV3RXZlbnROYW1lLCB7IGV2ZW50RGF0YTogZXZlbnQsIGFyZ3MgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIG9uIGNlbGwgY2xpY2ssIG1haW5seSB1c2VkIHdpdGggdGhlIGNvbHVtbkRlZi5hY3Rpb24gY2FsbGJhY2tcclxuICAgICAgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLmJpbmRPbkNlbGxDaGFuZ2UoZ3JpZCk7XHJcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZS5iaW5kT25DbGljayhncmlkKTtcclxuXHJcbiAgICAgIGlmIChkYXRhVmlldyAmJiBncmlkKSB7XHJcbiAgICAgICAgLy8gYmluZCBleHRlcm5hbCBzb3J0aW5nIChiYWNrZW5kKSB3aGVuIGF2YWlsYWJsZSBvciBkZWZhdWx0IG9uU29ydCAoZGF0YVZpZXcpXHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgc29ydGluZyAoYmFja2VuZCkgdW5sZXNzIHNwZWNpZmllZCB0byB1c2UgdGhlIGxvY2FsIG9uZVxyXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICFncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaS51c2VMb2NhbFNvcnRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0U2VydmljZS5iaW5kQmFja2VuZE9uU29ydChncmlkKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydFNlcnZpY2UuYmluZExvY2FsT25Tb3J0KGdyaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYmluZCBleHRlcm5hbCBmaWx0ZXIgKGJhY2tlbmQpIHdoZW4gYXZhaWxhYmxlIG9yIGRlZmF1bHQgb25GaWx0ZXIgKGRhdGFWaWV3KVxyXG4gICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5pbml0KGdyaWQpO1xyXG5cclxuICAgICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgZmlsdGVyIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXHJcbiAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgIWdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpLnVzZUxvY2FsRmlsdGVyaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5iaW5kQmFja2VuZE9uRmlsdGVyKGdyaWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmJpbmRMb2NhbE9uRmlsdGVyKGdyaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbG9hZCBhbnkgcHJlc2V0cyBpZiBhbnkgKGFmdGVyIGRhdGFzZXQgaXMgaW5pdGlhbGl6ZWQpXHJcbiAgICAgICAgdGhpcy5sb2FkQ29sdW1uUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcclxuICAgICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xyXG5cclxuICAgICAgICAvLyBXaGVuIGRhdGEgY2hhbmdlcyBpbiB0aGUgRGF0YVZpZXcsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgbWV0cmljcyBhbmQvb3IgZGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlIGRhdGFzZXQgaXMgZW1wdHlcclxuICAgICAgICBjb25zdCBvblJvd0NvdW50Q2hhbmdlZEhhbmRsZXIgPSBkYXRhVmlldy5vblJvd0NvdW50Q2hhbmdlZDtcclxuICAgICAgICAodGhpcy5fZXZlbnRIYW5kbGVyIGFzIFNsaWNrRXZlbnRIYW5kbGVyPEdldFNsaWNrRXZlbnRUeXBlPHR5cGVvZiBvblJvd0NvdW50Q2hhbmdlZEhhbmRsZXI+Pikuc3Vic2NyaWJlKG9uUm93Q291bnRDaGFuZ2VkSGFuZGxlciwgKF9lLCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICBncmlkLmludmFsaWRhdGUoKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKHRoaXMuZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB8fCAwLCBkYXRhVmlldy5nZXRJdGVtQ291bnQoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3Qgb25TZXRJdGVtc0NhbGxlZEhhbmRsZXIgPSBkYXRhVmlldy5vblNldEl0ZW1zQ2FsbGVkO1xyXG4gICAgICAgICh0aGlzLl9ldmVudEhhbmRsZXIgYXMgU2xpY2tFdmVudEhhbmRsZXI8R2V0U2xpY2tFdmVudFR5cGU8dHlwZW9mIG9uU2V0SXRlbXNDYWxsZWRIYW5kbGVyPj4pLnN1YnNjcmliZShvblNldEl0ZW1zQ2FsbGVkSGFuZGxlciwgKF9lLCBhcmdzKSA9PiB7XHJcbiAgICAgICAgICBncmlkLmludmFsaWRhdGUoKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKHRoaXMuZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSwgYXJncy5pdGVtQ291bnQpO1xyXG5cclxuICAgICAgICAgIC8vIHdoZW4gdXNlciBoYXMgcmVzaXplIGJ5IGNvbnRlbnQgZW5hYmxlZCwgd2UnbGwgZm9yY2UgYSBmdWxsIHdpZHRoIGNhbGN1bGF0aW9uIHNpbmNlIHdlIGNoYW5nZSBvdXIgZW50aXJlIGRhdGFzZXRcclxuICAgICAgICAgIGlmIChhcmdzLml0ZW1Db3VudCA+IDAgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuYXV0b3NpemVDb2x1bW5zQnlDZWxsQ29udGVudE9uRmlyc3RMb2FkIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KCF0aGlzLmdyaWRPcHRpb25zPy5yZXNpemVCeUNvbnRlbnRPbmx5T25GaXJzdExvYWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBvblJvd3NDaGFuZ2VkSGFuZGxlciA9IGRhdGFWaWV3Lm9uUm93c0NoYW5nZWQ7XHJcbiAgICAgICAgKHRoaXMuX2V2ZW50SGFuZGxlciBhcyBTbGlja0V2ZW50SGFuZGxlcjxHZXRTbGlja0V2ZW50VHlwZTx0eXBlb2Ygb25Sb3dzQ2hhbmdlZEhhbmRsZXI+Pikuc3Vic2NyaWJlKG9uUm93c0NoYW5nZWRIYW5kbGVyLCAoX2UsIGFyZ3MpID0+IHtcclxuICAgICAgICAgIC8vIGZpbHRlcmluZyBkYXRhIHdpdGggbG9jYWwgZGF0YXNldCB3aWxsIG5vdCBhbHdheXMgc2hvdyBjb3JyZWN0bHkgdW5sZXNzIHdlIGNhbGwgdGhpcyB1cGRhdGVSb3cvcmVuZGVyXHJcbiAgICAgICAgICAvLyBhbHNvIGRvbid0IHVzZSBcImludmFsaWRhdGVSb3dzXCIgc2luY2UgaXQgZGVzdHJveXMgdGhlIGVudGlyZSByb3cgYW5kIGFzIGJhZCB1c2VyIGV4cGVyaWVuY2Ugd2hlbiB1cGRhdGluZyBhIHJvd1xyXG4gICAgICAgICAgLy8gc2VlIGNvbW1pdDogaHR0cHM6Ly9naXRodWIuY29tL2doaXNjb2RpbmcvYXVyZWxpYS1zbGlja2dyaWQvY29tbWl0LzhjNTAzYTRkNDVmYmExMWNiZDhkOGNjNDY3ZmFlOGQxNzdjYzRmNjBcclxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcgJiYgIWdyaWRPcHRpb25zLmVuYWJsZVJvd0RldGFpbFZpZXcpIHtcclxuICAgICAgICAgICAgaWYgKGFyZ3M/LnJvd3MgJiYgQXJyYXkuaXNBcnJheShhcmdzLnJvd3MpKSB7XHJcbiAgICAgICAgICAgICAgYXJncy5yb3dzLmZvckVhY2goKHJvdzogbnVtYmVyKSA9PiBncmlkLnVwZGF0ZVJvdyhyb3cpKTtcclxuICAgICAgICAgICAgICBncmlkLnJlbmRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBkaWQgdGhlIHVzZXIgYWRkIGEgY29sc3BhbiBjYWxsYmFjaz8gSWYgc28sIGhvb2sgaXQgaW50byB0aGUgRGF0YVZpZXcgZ2V0SXRlbU1ldGFkYXRhXHJcbiAgICBpZiAoZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrICYmIGRhdGFWaWV3ICYmIGRhdGFWaWV3LmdldEl0ZW0gJiYgZGF0YVZpZXcuZ2V0SXRlbU1ldGFkYXRhKSB7XHJcbiAgICAgIGRhdGFWaWV3LmdldEl0ZW1NZXRhZGF0YSA9IChyb3dOdW1iZXI6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBjYWxsYmFja1Jlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjayAmJiBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2spIHtcclxuICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrKGRhdGFWaWV3LmdldEl0ZW0ocm93TnVtYmVyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdDtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZEJhY2tlbmRDYWxsYmFja0Z1bmN0aW9ucyhncmlkT3B0aW9uczogR3JpZE9wdGlvbikge1xyXG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xyXG4gICAgY29uc3QgYmFja2VuZEFwaVNlcnZpY2UgPSBiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGkuc2VydmljZTtcclxuICAgIGNvbnN0IHNlcnZpY2VPcHRpb25zOiBCYWNrZW5kU2VydmljZU9wdGlvbiA9IGJhY2tlbmRBcGlTZXJ2aWNlPy5vcHRpb25zID8/IHt9O1xyXG4gICAgY29uc3QgaXNFeGVjdXRlQ29tbWFuZE9uSW5pdCA9ICghc2VydmljZU9wdGlvbnMpID8gZmFsc2UgOiAoKHNlcnZpY2VPcHRpb25zICYmIHNlcnZpY2VPcHRpb25zLmhhc093blByb3BlcnR5KCdleGVjdXRlUHJvY2Vzc0NvbW1hbmRPbkluaXQnKSkgPyBzZXJ2aWNlT3B0aW9uc1snZXhlY3V0ZVByb2Nlc3NDb21tYW5kT25Jbml0J10gOiB0cnVlKTtcclxuXHJcbiAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UpIHtcclxuICAgICAgLy8gdXBkYXRlIGJhY2tlbmQgZmlsdGVycyAoaWYgbmVlZCBiZSkgQkVGT1JFIHRoZSBxdWVyeSBydW5zICh2aWEgdGhlIG9uSW5pdCBjb21tYW5kIGEgZmV3IGxpbmVzIGJlbG93KVxyXG4gICAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBhbnkgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgZ3JpZFxyXG4gICAgICBpZiAoZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cykge1xyXG4gICAgICAgIC8vIEZpbHRlcnMgXCJwcmVzZXRzXCJcclxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycykgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMoZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU29ydGVycyBcInByZXNldHNcIlxyXG4gICAgICAgIGlmIChiYWNrZW5kQXBpU2VydmljZS51cGRhdGVTb3J0ZXJzICYmIEFycmF5LmlzQXJyYXkoZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzKSAmJiBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gd2hlbiB1c2luZyBtdWx0aS1jb2x1bW4gc29ydCwgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYnV0IG9uIHNpbmdsZSBzb3J0IHRoZW4gb25seSBncmFiIHRoZSBmaXJzdCBzb3J0IHByb3ZpZGVkXHJcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMubXVsdGlDb2x1bW5Tb3J0ID8gZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzIDogZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLnNsaWNlKDAsIDEpO1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlU29ydGVycyh1bmRlZmluZWQsIHNvcnRDb2x1bW5zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUGFnaW5hdGlvbiBcInByZXNldHNcIlxyXG4gICAgICAgIGlmIChiYWNrZW5kQXBpU2VydmljZS51cGRhdGVQYWdpbmF0aW9uICYmIGdyaWRPcHRpb25zLnByZXNldHMucGFnaW5hdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9ID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uO1xyXG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlUGFnaW5hdGlvbihwYWdlTnVtYmVyLCBwYWdlU2l6ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0Q29sdW1uRmlsdGVycygpO1xyXG4gICAgICAgIGlmIChjb2x1bW5GaWx0ZXJzICYmIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMpIHtcclxuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMoY29sdW1uRmlsdGVycywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZXhlY3V0ZSBvbkluaXQgY29tbWFuZCB3aGVuIG5lY2Vzc2FyeVxyXG4gICAgICBpZiAoYmFja2VuZEFwaSAmJiBiYWNrZW5kQXBpU2VydmljZSAmJiAoYmFja2VuZEFwaS5vbkluaXQgfHwgaXNFeGVjdXRlQ29tbWFuZE9uSW5pdCkpIHtcclxuICAgICAgICBjb25zdCBxdWVyeSA9ICh0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuYnVpbGRRdWVyeSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5idWlsZFF1ZXJ5KCkgOiAnJztcclxuICAgICAgICBjb25zdCBwcm9jZXNzID0gKGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQpID8gKGJhY2tlbmRBcGkucHJvY2VzcyAmJiBiYWNrZW5kQXBpLnByb2Nlc3MocXVlcnkpIHx8IG51bGwpIDogKGJhY2tlbmRBcGkub25Jbml0ICYmIGJhY2tlbmRBcGkub25Jbml0KHF1ZXJ5KSB8fCBudWxsKTtcclxuXHJcbiAgICAgICAgLy8gd3JhcCB0aGlzIGluc2lkZSBhIHNldFRpbWVvdXQgdG8gYXZvaWQgdGltaW5nIGlzc3VlIHNpbmNlIHRoZSBncmlkT3B0aW9ucyBuZWVkcyB0byBiZSByZWFkeSBiZWZvcmUgcnVubmluZyB0aGlzIG9uSW5pdFxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYmFja2VuZFV0aWxpdHlTZXJ2aWNlID0gdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgYXMgQmFja2VuZFV0aWxpdHlTZXJ2aWNlO1xyXG5cclxuICAgICAgICAgIC8vIGtlZXAgc3RhcnQgdGltZSAmIGVuZCB0aW1lc3RhbXBzICYgcmV0dXJuIGl0IGFmdGVyIHByb2Nlc3MgZXhlY3V0aW9uXHJcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICAgIC8vIHJ1biBhbnkgcHJlLXByb2Nlc3MsIGlmIGRlZmluZWQsIGZvciBleGFtcGxlIGEgc3Bpbm5lclxyXG4gICAgICAgICAgaWYgKGJhY2tlbmRBcGkucHJlUHJvY2Vzcykge1xyXG4gICAgICAgICAgICBiYWNrZW5kQXBpLnByZVByb2Nlc3MoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyB0aGUgcHJvY2Vzc2VzIGNhbiBiZSBhIFByb21pc2UgKGxpa2UgSHR0cClcclxuICAgICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zID8/IDA7XHJcbiAgICAgICAgICBpZiAocHJvY2VzcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgcHJvY2Vzc1xyXG4gICAgICAgICAgICAgIC50aGVuKChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5leGVjdXRlQmFja2VuZFByb2Nlc3Nlc0NhbGxiYWNrKHN0YXJ0VGltZSwgcHJvY2Vzc1Jlc3VsdCwgYmFja2VuZEFwaSwgdG90YWxJdGVtcykpXHJcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLm9uQmFja2VuZEVycm9yKGVycm9yLCBiYWNrZW5kQXBpKSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MgJiYgdGhpcy5yeGpzPy5pc09ic2VydmFibGUocHJvY2VzcykpIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgKHByb2Nlc3MgYXMgT2JzZXJ2YWJsZTxhbnk+KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKHByb2Nlc3NSZXN1bHQ6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLmV4ZWN1dGVCYWNrZW5kUHJvY2Vzc2VzQ2FsbGJhY2soc3RhcnRUaW1lLCBwcm9jZXNzUmVzdWx0LCBiYWNrZW5kQXBpLCB0b3RhbEl0ZW1zKSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLm9uQmFja2VuZEVycm9yKGVycm9yLCBiYWNrZW5kQXBpKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZFJlc2l6ZUhvb2soZ3JpZDogU2xpY2tHcmlkLCBvcHRpb25zOiBHcmlkT3B0aW9uKSB7XHJcbiAgICBpZiAoKG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmF1dG9zaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRPbkZpcnN0TG9hZCkgfHwgKG9wdGlvbnMuZW5hYmxlQXV0b1NpemVDb2x1bW5zICYmIG9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtBbmd1bGFyLVNsaWNrZ3JpZF0gWW91IGNhbm5vdCBlbmFibGUgYm90aCBhdXRvc2l6ZS9maXQgdmlld3BvcnQgJiByZXNpemUgYnkgY29udGVudCwgeW91IG11c3QgY2hvb3NlIHdoaWNoIHJlc2l6ZSB0ZWNobmlxdWUgdG8gdXNlLiBZb3UgY2FuIGVuYWJsZSB0aGVzZSAyIG9wdGlvbnMgKFwiYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZFwiIGFuZCBcImVuYWJsZUF1dG9TaXplQ29sdW1uc1wiKSBPUiB0aGVzZSBvdGhlciAyIG9wdGlvbnMgKFwiYXV0b3NpemVDb2x1bW5zQnlDZWxsQ29udGVudE9uRmlyc3RMb2FkXCIgYW5kIFwiZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50XCIpLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGV4cGFuZC9hdXRvZml0IGNvbHVtbnMgb24gZmlyc3QgcGFnZSBsb2FkXHJcbiAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcclxuICAgICAgZ3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhdXRvLXJlc2l6ZSBncmlkIG9uIGJyb3dzZXIgcmVzaXplXHJcbiAgICBpZiAob3B0aW9ucy5ncmlkSGVpZ2h0IHx8IG9wdGlvbnMuZ3JpZFdpZHRoKSB7XHJcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgwLCB7IGhlaWdodDogb3B0aW9ucy5ncmlkSGVpZ2h0LCB3aWR0aDogb3B0aW9ucy5ncmlkV2lkdGggfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUdyaWQoKTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLmVuYWJsZUF1dG9SZXNpemUpIHtcclxuICAgICAgaWYgKGdyaWQgJiYgb3B0aW9ucy5hdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkICYmIG9wdGlvbnMuZW5hYmxlQXV0b1NpemVDb2x1bW5zKSB7XHJcbiAgICAgICAgZ3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlQWZ0ZXJEYXRhdmlld0NyZWF0ZWQoX2dyaWQ6IFNsaWNrR3JpZCwgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pIHtcclxuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIFNvcnQgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgRE9NXHJcbiAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlU29ydGluZykge1xyXG4gICAgICBpZiAoZ3JpZE9wdGlvbnMucHJlc2V0cyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycykpIHtcclxuICAgICAgICAvLyB3aGVuIHVzaW5nIG11bHRpLWNvbHVtbiBzb3J0LCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBidXQgb24gc2luZ2xlIHNvcnQgdGhlbiBvbmx5IGdyYWIgdGhlIGZpcnN0IHNvcnQgcHJvdmlkZWRcclxuICAgICAgICBjb25zdCBzb3J0Q29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMubXVsdGlDb2x1bW5Tb3J0ID8gZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzIDogZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLnNsaWNlKDAsIDEpO1xyXG4gICAgICAgIHRoaXMuc29ydFNlcnZpY2UubG9hZEdyaWRTb3J0ZXJzKHNvcnRDb2x1bW5zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFdoZW4gZGF0YSBjaGFuZ2VzIGluIHRoZSBEYXRhVmlldywgd2UnbGwgcmVmcmVzaCB0aGUgbWV0cmljcyBhbmQvb3IgZGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlIGRhdGFzZXQgaXMgZW1wdHkgKi9cclxuICBwcml2YXRlIGhhbmRsZU9uSXRlbUNvdW50Q2hhbmdlZChjdXJyZW50UGFnZVJvd0l0ZW1Db3VudDogbnVtYmVyLCB0b3RhbEl0ZW1Db3VudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aCA9IHRvdGFsSXRlbUNvdW50O1xyXG4gICAgdGhpcy5tZXRyaWNzID0ge1xyXG4gICAgICBzdGFydFRpbWU6IG5ldyBEYXRlKCksXHJcbiAgICAgIGVuZFRpbWU6IG5ldyBEYXRlKCksXHJcbiAgICAgIGl0ZW1Db3VudDogY3VycmVudFBhZ2VSb3dJdGVtQ291bnQsXHJcbiAgICAgIHRvdGFsSXRlbUNvdW50XHJcbiAgICB9O1xyXG4gICAgLy8gaWYgY3VzdG9tIGZvb3RlciBpcyBlbmFibGVkLCB0aGVuIHdlJ2xsIHVwZGF0ZSBpdHMgbWV0cmljc1xyXG4gICAgaWYgKHRoaXMuc2xpY2tGb290ZXIpIHtcclxuICAgICAgdGhpcy5zbGlja0Zvb3Rlci5tZXRyaWNzID0gdGhpcy5tZXRyaWNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gdXNpbmcgbG9jYWwgKGluLW1lbW9yeSkgZGF0YXNldCwgd2UnbGwgZGlzcGxheSBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIGZpbHRlcmVkIGRhdGEgaXMgZW1wdHlcclxuICAgIGlmICh0aGlzLl9pc0xvY2FsR3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVFbXB0eURhdGFXYXJuaW5nTWVzc2FnZSkge1xyXG4gICAgICB0aGlzLmRpc3BsYXlFbXB0eURhdGFXYXJuaW5nKGN1cnJlbnRQYWdlUm93SXRlbUNvdW50ID09PSAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVBhZ2luYXRpb25TZXJ2aWNlKHBhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucykge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25EYXRhID0ge1xyXG4gICAgICAgIGdyaWRPcHRpb25zOiB0aGlzLmdyaWRPcHRpb25zLFxyXG4gICAgICAgIHBhZ2luYXRpb25TZXJ2aWNlOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnRvdGFsSXRlbXMgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuaW5pdCh0aGlzLnNsaWNrR3JpZCwgcGFnaW5hdGlvbk9wdGlvbnMsIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkpO1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlKCdvblBhZ2luYXRpb25DaGFuZ2VkJywgKHBhZ2luYXRpb25DaGFuZ2VzOiBTZXJ2aWNlUGFnaW5hdGlvbikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uQ2hhbmdlcyk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnN1YnNjcmliZSgnb25QYWdpbmF0aW9uVmlzaWJpbGl0eUNoYW5nZWQnLCAodmlzaWJpbGl0eTogeyB2aXNpYmxlOiBib29sZWFuIH0pID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb24gPSB2aXNpYmlsaXR5Py52aXNpYmxlID8/IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlPy5yZWZyZXNoQmFja2VuZERhdGFzZXQodGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlbmRlclBhZ2luYXRpb24odGhpcy5zaG93UGFnaW5hdGlvbik7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgICAgLy8gYWxzbyBpbml0aWFsaXplIChyZW5kZXIpIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudFxyXG4gICAgICB0aGlzLnJlbmRlclBhZ2luYXRpb24oKTtcclxuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogTG9hZCB0aGUgRWRpdG9yIENvbGxlY3Rpb24gYXN5bmNocm9ub3VzbHkgYW5kIHJlcGxhY2UgdGhlIFwiY29sbGVjdGlvblwiIHByb3BlcnR5IHdoZW4gT2JzZXJ2YWJsZSByZXNvbHZlcyAqL1xyXG4gIHByaXZhdGUgbG9hZEVkaXRvckNvbGxlY3Rpb25Bc3luYyhjb2x1bW46IENvbHVtbikge1xyXG4gICAgY29uc3QgY29sbGVjdGlvbkFzeW5jID0gY29sdW1uICYmIGNvbHVtbi5lZGl0b3IgJiYgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5jb2xsZWN0aW9uQXN5bmM7XHJcbiAgICBpZiAoY29sbGVjdGlvbkFzeW5jIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICBjb2xsZWN0aW9uQXN5bmMuc3Vic2NyaWJlKChyZXNvbHZlZENvbGxlY3Rpb24pID0+IHRoaXMudXBkYXRlRWRpdG9yQ29sbGVjdGlvbihjb2x1bW4sIHJlc29sdmVkQ29sbGVjdGlvbikpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25Bc3luYyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgLy8gd2FpdCBmb3IgdGhlIFwiY29sbGVjdGlvbkFzeW5jXCIsIG9uY2UgcmVzb2x2ZWQgd2Ugd2lsbCBzYXZlIGl0IGludG8gdGhlIFwiY29sbGVjdGlvblwiXHJcbiAgICAgIC8vIHRoZSBjb2xsZWN0aW9uQXN5bmMgY2FuIGJlIG9mIDMgdHlwZXMgSHR0cENsaWVudCwgSHR0cEZldGNoIG9yIGEgUHJvbWlzZVxyXG4gICAgICBjb2xsZWN0aW9uQXN5bmMudGhlbigocmVzcG9uc2U6IGFueSB8IGFueVtdKSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUVkaXRvckNvbGxlY3Rpb24oY29sdW1uLCByZXNwb25zZSk7IC8vIGZyb20gUHJvbWlzZVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTG9hZCBhbnkgcG9zc2libGUgQ29sdW1ucyBHcmlkIFByZXNldHMgKi9cclxuICBwcml2YXRlIGxvYWRDb2x1bW5QcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpIHtcclxuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIENvbHVtbnMgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgZ3JpZFxyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cyAmJiBBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5jb2x1bW5zKSAmJiB0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGdyaWRDb2x1bW5zOiBDb2x1bW5bXSA9IHRoaXMuZ3JpZFN0YXRlU2VydmljZS5nZXRBc3NvY2lhdGVkR3JpZENvbHVtbnModGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5jb2x1bW5zKTtcclxuICAgICAgaWYgKGdyaWRDb2x1bW5zICYmIEFycmF5LmlzQXJyYXkoZ3JpZENvbHVtbnMpICYmIGdyaWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY2hlY2tib3ggc2VsZWN0b3IgaXMgYWxzbyB2aXNpYmxlIGlmIGl0IGlzIGVuYWJsZWRcclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGVja2JveENvbHVtbiA9IChBcnJheS5pc0FycmF5KHRoaXMuX2NvbHVtbkRlZmluaXRpb25zKSAmJiB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucy5sZW5ndGggPiAwKSA/IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zWzBdIDogbnVsbDtcclxuICAgICAgICAgIGlmIChjaGVja2JveENvbHVtbiAmJiBjaGVja2JveENvbHVtbi5pZCA9PT0gJ19jaGVja2JveF9zZWxlY3RvcicgJiYgZ3JpZENvbHVtbnNbMF0uaWQgIT09ICdfY2hlY2tib3hfc2VsZWN0b3InKSB7XHJcbiAgICAgICAgICAgIGdyaWRDb2x1bW5zLnVuc2hpZnQoY2hlY2tib3hDb2x1bW4pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8ga2VlcCBjb3B5IHRoZSBvcmlnaW5hbCBvcHRpb25hbCBgd2lkdGhgIHByb3BlcnRpZXMgb3B0aW9uYWxseSBwcm92aWRlZCBieSB0aGUgdXNlci5cclxuICAgICAgICAvLyBXZSB3aWxsIHVzZSB0aGlzIHdoZW4gZG9pbmcgYSByZXNpemUgYnkgY2VsbCBjb250ZW50LCBpZiB1c2VyIHByb3ZpZGVkIGEgYHdpZHRoYCBpdCB3b24ndCBvdmVycmlkZSBpdC5cclxuICAgICAgICBncmlkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiBjb2wub3JpZ2luYWxXaWR0aCA9IGNvbC53aWR0aCk7XHJcblxyXG4gICAgICAgIC8vIGZpbmFsbHkgc2V0IHRoZSBuZXcgcHJlc2V0cyBjb2x1bW5zIChpbmNsdWRpbmcgY2hlY2tib3ggc2VsZWN0b3IgaWYgbmVlZCBiZSlcclxuICAgICAgICB0aGlzLnNsaWNrR3JpZC5zZXRDb2x1bW5zKGdyaWRDb2x1bW5zKTtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UudmlzaWJsZUNvbHVtbnMgPSBncmlkQ29sdW1ucztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIExvYWQgYW55IHBvc3NpYmxlIEZpbHRlcnMgR3JpZCBQcmVzZXRzICovXHJcbiAgcHJpdmF0ZSBsb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiAhdGhpcy5jdXN0b21EYXRhVmlldykge1xyXG4gICAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBGaWx0ZXIgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgRE9NXHJcbiAgICAgIC8vIGFsc28gbm90ZSB0aGF0IGEgcHJlc2V0cyBvZiBUcmVlIERhdGEgVG9nZ2xpbmcgd2lsbCBhbHNvIGNhbGwgdGhpcyBtZXRob2QgYmVjYXVzZSBUcmVlIERhdGEgdG9nZ2xpbmcgZG9lcyB3b3JrIHdpdGggZGF0YSBmaWx0ZXJpbmdcclxuICAgICAgLy8gKGNvbGxhcHNpbmcgYSBwYXJlbnQgd2lsbCBiYXNpY2FsbHkgdXNlIEZpbHRlciBmb3IgaGlkZGluZyAoYWthIGNvbGxhcHNpbmcpIGF3YXkgdGhlIGNoaWxkIHVuZGVybmVhdCBpdClcclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cyAmJiAoQXJyYXkuaXNBcnJheSh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycykgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmdyaWRPcHRpb25zLnByZXNldHM/LnRyZWVEYXRhPy50b2dnbGVkSXRlbXMpKSkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5wb3B1bGF0ZUNvbHVtbkZpbHRlclNlYXJjaFRlcm1QcmVzZXRzKHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cz8uZmlsdGVycyB8fCBbXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGxvY2FsIGdyaWQsIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyB0aGUgUGFnaW5hdGlvblxyXG4gICAqIGlmIHNvIHRoZW4gYWxzbyBjaGVjayBpZiB0aGVyZSdzIGFueSBwcmVzZXRzIGFuZCBmaW5hbGx5IGluaXRpYWxpemUgdGhlIFBhZ2luYXRpb25TZXJ2aWNlXHJcbiAgICogYSBsb2NhbCBncmlkIHdpdGggUGFnaW5hdGlvbiBwcmVzZXRzIHdpbGwgcG90ZW50aWFsbHkgaGF2ZSBhIGRpZmZlcmVudCB0b3RhbCBvZiBpdGVtcywgd2UnbGwgbmVlZCB0byBnZXQgaXQgZnJvbSB0aGUgRGF0YVZpZXcgYW5kIHVwZGF0ZSBvdXIgdG90YWxcclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRMb2NhbEdyaWRQYWdpbmF0aW9uKGRhdGFzZXQ/OiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMpIHtcclxuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gQXJyYXkuaXNBcnJheShkYXRhc2V0KSA/IGRhdGFzZXQubGVuZ3RoIDogMDtcclxuICAgICAgaWYgKHRoaXMuX3BhZ2luYXRpb25PcHRpb25zICYmIHRoaXMuZGF0YVZpZXc/LmdldFBhZ2luZ0luZm8pIHtcclxuICAgICAgICBjb25zdCBzbGlja1BhZ2luZ0luZm8gPSB0aGlzLmRhdGFWaWV3LmdldFBhZ2luZ0luZm8oKTtcclxuICAgICAgICBpZiAoc2xpY2tQYWdpbmdJbmZvPy5oYXNPd25Qcm9wZXJ0eSgndG90YWxSb3dzJykgJiYgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMudG90YWxJdGVtcyAhPT0gc2xpY2tQYWdpbmdJbmZvLnRvdGFsUm93cykge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gc2xpY2tQYWdpbmdJbmZvLnRvdGFsUm93cyB8fCAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucy50b3RhbEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgICBjb25zdCBwYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuc2V0UGFnaW5hdGlvbk9wdGlvbnNXaGVuUHJlc2V0RGVmaW5lZCh0aGlzLmdyaWRPcHRpb25zLCB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVBhZ2luYXRpb25TZXJ2aWNlKHBhZ2luYXRpb25PcHRpb25zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMb2FkIGFueSBSb3cgU2VsZWN0aW9ucyBpbnRvIHRoZSBEYXRhVmlldyB0aGF0IHdlcmUgcHJlc2V0cyBieSB0aGUgdXNlciAqL1xyXG4gIHByaXZhdGUgbG9hZFJvd1NlbGVjdGlvblByZXNldFdoZW5FeGlzdHMoKSB7XHJcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBSb3cgU2VsZWN0aW9ucyBcInByZXNldHNcIlxyXG4gICAgY29uc3QgcHJlc2V0cyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnByZXNldHM7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbCA9IHRoaXMuc2xpY2tHcmlkPy5nZXRTZWxlY3Rpb25Nb2RlbD8uKCk7XHJcbiAgICBjb25zdCBlbmFibGVSb3dTZWxlY3Rpb24gPSB0aGlzLmdyaWRPcHRpb25zICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24pO1xyXG4gICAgaWYgKGVuYWJsZVJvd1NlbGVjdGlvbiAmJiBzZWxlY3Rpb25Nb2RlbCAmJiBwcmVzZXRzICYmIHByZXNldHMucm93U2VsZWN0aW9uICYmIChBcnJheS5pc0FycmF5KHByZXNldHMucm93U2VsZWN0aW9uLmdyaWRSb3dJbmRleGVzKSB8fCBBcnJheS5pc0FycmF5KHByZXNldHMucm93U2VsZWN0aW9uLmRhdGFDb250ZXh0SWRzKSkpIHtcclxuICAgICAgbGV0IGRhdGFDb250ZXh0SWRzID0gcHJlc2V0cy5yb3dTZWxlY3Rpb24uZGF0YUNvbnRleHRJZHM7XHJcbiAgICAgIGxldCBncmlkUm93SW5kZXhlcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmdyaWRSb3dJbmRleGVzO1xyXG5cclxuICAgICAgLy8gbWFwcyB0aGUgSURzIHRvIHRoZSBHcmlkIFJvd3MgYW5kIHZpY2UgdmVyc2EsIHRoZSBcImRhdGFDb250ZXh0SWRzXCIgaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGUgb3RoZXJcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUNvbnRleHRJZHMpICYmIGRhdGFDb250ZXh0SWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkUm93SW5kZXhlcyA9IHRoaXMuZGF0YVZpZXcubWFwSWRzVG9Sb3dzKGRhdGFDb250ZXh0SWRzKSB8fCBbXTtcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGdyaWRSb3dJbmRleGVzKSAmJiBncmlkUm93SW5kZXhlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZGF0YUNvbnRleHRJZHMgPSB0aGlzLmRhdGFWaWV3Lm1hcFJvd3NUb0lkcyhncmlkUm93SW5kZXhlcykgfHwgW107XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLnNlbGVjdGVkUm93RGF0YUNvbnRleHRJZHMgPSBkYXRhQ29udGV4dElkcztcclxuXHJcbiAgICAgIC8vIGNoYW5nZSB0aGUgc2VsZWN0ZWQgcm93cyBleGNlcHQgVU5MRVNTIGl0J3MgYSBMb2NhbCBHcmlkIHdpdGggUGFnaW5hdGlvblxyXG4gICAgICAvLyBsb2NhbCBQYWdpbmF0aW9uIHVzZXMgdGhlIERhdGFWaWV3IGFuZCB0aGF0IGFsc28gdHJpZ2dlciBhIGNoYW5nZS9yZWZyZXNoXHJcbiAgICAgIC8vIGFuZCB3ZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgMiBHcmlkIFN0YXRlIGNoYW5nZXMganVzdCAxXHJcbiAgICAgIGlmICgodGhpcy5faXNMb2NhbEdyaWQgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbikgfHwgIXRoaXMuX2lzTG9jYWxHcmlkKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykpIHtcclxuICAgICAgICAgICAgdGhpcy5zbGlja0dyaWQuc2V0U2VsZWN0ZWRSb3dzKGdyaWRSb3dJbmRleGVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZUdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKTogR3JpZE9wdGlvbiB7XHJcbiAgICBncmlkT3B0aW9ucy5ncmlkSWQgPSB0aGlzLmdyaWRJZDtcclxuICAgIGdyaWRPcHRpb25zLmdyaWRDb250YWluZXJJZCA9IGBzbGlja0dyaWRDb250YWluZXItJHt0aGlzLmdyaWRJZH1gO1xyXG5cclxuICAgIC8vIGlmIHdlIGhhdmUgYSBiYWNrZW5kU2VydmljZUFwaSBhbmQgdGhlIGVuYWJsZVBhZ2luYXRpb24gaXMgdW5kZWZpbmVkLCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBkbyB3YW50IHRvIHNlZSBpdCwgZWxzZSBnZXQgdGhhdCBkZWZpbmVkIHZhbHVlXHJcbiAgICBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID0gKChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID09PSB1bmRlZmluZWQpID8gdHJ1ZSA6IGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24pIHx8IGZhbHNlO1xyXG5cclxuICAgIC8vIHVzZSBqcXVlcnkgZXh0ZW5kIHRvIGRlZXAgbWVyZ2UgJiBjb3B5IHRvIGF2b2lkIGltbXV0YWJsZSBwcm9wZXJ0aWVzIGJlaW5nIGNoYW5nZWQgaW4gR2xvYmFsR3JpZE9wdGlvbnMgYWZ0ZXIgYSByb3V0ZSBjaGFuZ2VcclxuICAgIGNvbnN0IG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgR2xvYmFsR3JpZE9wdGlvbnMsIHRoaXMuZm9yUm9vdENvbmZpZywgZ3JpZE9wdGlvbnMpIGFzIEdyaWRPcHRpb247XHJcblxyXG4gICAgLy8gdXNpbmcgalF1ZXJ5IGV4dGVuZCB0byBkbyBhIGRlZXAgY2xvbmUgaGFzIGFuIHVud2FudGVkIHNpZGUgb24gb2JqZWN0cyBhbmQgcGFnZVNpemVzIGJ1dCBFUzYgc3ByZWFkIGhhcyBvdGhlciB3b3JzdCBzaWRlIGVmZmVjdHNcclxuICAgIC8vIHNvIHdlIHdpbGwganVzdCBvdmVyd3JpdGUgdGhlIHBhZ2VTaXplcyB3aGVuIG5lZWRlZCwgdGhpcyBpcyB0aGUgb25seSBvbmUgY2F1c2luZyBpc3N1ZXMgc28gZmFyLlxyXG4gICAgLy8galF1ZXJ5IHdyb3RlIHRoaXMgb24gdGhlaXIgZG9jczo6IE9uIGEgZGVlcCBleHRlbmQsIE9iamVjdCBhbmQgQXJyYXkgYXJlIGV4dGVuZGVkLCBidXQgb2JqZWN0IHdyYXBwZXJzIG9uIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIFN0cmluZywgQm9vbGVhbiwgYW5kIE51bWJlciBhcmUgbm90LlxyXG4gICAgaWYgKG9wdGlvbnM/LnBhZ2luYXRpb24gJiYgKGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpICYmIGdyaWRPcHRpb25zLnBhZ2luYXRpb24gJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplcykpIHtcclxuICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplcyA9IGdyaWRPcHRpb25zLnBhZ2luYXRpb24ucGFnZVNpemVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsc28gbWFrZSBzdXJlIHRvIHNob3cgdGhlIGhlYWRlciByb3cgaWYgdXNlciBoYXZlIGVuYWJsZWQgZmlsdGVyaW5nXHJcbiAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IChvcHRpb25zLnNob3dIZWFkZXJSb3cgPT09IGZhbHNlKTtcclxuICAgIGlmIChvcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiAhb3B0aW9ucy5zaG93SGVhZGVyUm93KSB7XHJcbiAgICAgIG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9IG9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdoZW4gd2UgdXNlIFBhZ2luYXRpb24gb24gTG9jYWwgR3JpZCwgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgd2l0aG91dCBlbmFibGVGaWx0ZXJpbmdcclxuICAgIC8vIHNvIHdlJ2xsIGVuYWJsZSB0aGUgZmlsdGVyaW5nIGJ1dCB3ZSdsbCBrZWVwIHRoZSBoZWFkZXIgcm93IGhpZGRlblxyXG4gICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nICYmIG9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLl9pc0xvY2FsR3JpZCkge1xyXG4gICAgICBvcHRpb25zLmVuYWJsZUZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKiogUHJlLVJlZ2lzdGVyIGFueSBSZXNvdXJjZSB0aGF0IGRvbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluc3RhbnRpYXRlZCAoZm9yIGV4YW1wbGUgUnhKUyBSZXNvdXJjZSkgKi9cclxuICBwcml2YXRlIHByZVJlZ2lzdGVyUmVzb3VyY2VzKCkge1xyXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IHRoaXMuZ3JpZE9wdGlvbnMucmVnaXN0ZXJFeHRlcm5hbFJlc291cmNlcyB8fCBbXTtcclxuXHJcbiAgICAvLyBBbmd1bGFyLVNsaWNrZ3JpZCByZXF1aXJlcyBSeEpTLCBzbyB3ZSdsbCByZWdpc3RlciBpdCBhcyB0aGUgZmlyc3QgcmVzb3VyY2VcclxuICAgIHRoaXMucmVnaXN0ZXJSeEpzUmVzb3VyY2UobmV3IFJ4SnNSZXNvdXJjZSgpIGFzIFJ4SnNGYWNhZGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3RlclJlc291cmNlcygpIHtcclxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIHdlIGNvbnNpZGVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlcyBhcyBleHRlcm5hbCBzZXJ2aWNlcywgYW55dGhpbmcgZWxzZSByZWdpc3RlcmVkIGFmdGVyd2FyZCBhcmVuJ3QgZXh0ZXJuYWxcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpKSB7XHJcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5leHRlcm5hbFJlZ2lzdGVyZWRSZXNvdXJjZXMgPSB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1c2ggYWxsIG90aGVyIFNlcnZpY2VzIHRoYXQgd2Ugd2FudCB0byBiZSByZWdpc3RlcmVkXHJcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5ncmlkU2VydmljZSwgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlKTtcclxuXHJcbiAgICAvLyB3aGVuIHVzaW5nIEdyb3VwaW5nL0RyYWdnYWJsZUdyb3VwaW5nL0NvbHNwYW4gcmVnaXN0ZXIgaXRzIFNlcnZpY2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNyZWF0ZVByZUhlYWRlclBhbmVsICYmICF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZURyYWdnYWJsZUdyb3VwaW5nKSB7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLmdyb3VwaW5nU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2luZyBUcmVlIERhdGEgVmlldywgcmVnaXN0ZXIgaXRzIFNlcnZpY2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyZWVEYXRhKSB7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnRyZWVEYXRhU2VydmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2hlbiB1c2VyIGVuYWJsZXMgdHJhbnNsYXRpb24sIHdlIG5lZWQgdG8gdHJhbnNsYXRlIEhlYWRlcnMgb24gZmlyc3QgcGFzcyAmIHN1YnNlcXVlbnRseSBpbiB0aGUgYmluZERpZmZlcmVudEhvb2tzXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcclxuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIGVtcHR5IHdhcm5pbmcgY29tcG9uZW50XHJcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nID0gbmV3IFNsaWNrRW1wdHlXYXJuaW5nQ29tcG9uZW50KCk7XHJcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5zbGlja0VtcHR5V2FybmluZyk7XHJcblxyXG4gICAgLy8gYmluZCAmIGluaXRpYWxpemUgYWxsIENvbXBvbmVudHMvU2VydmljZXMgdGhhdCB3ZXJlIHRhZ2dlZCBhcyBlbmFibGVkXHJcbiAgICAvLyByZWdpc3RlciBhbGwgc2VydmljZXMgYnkgZXhlY3V0aW5nIHRoZWlyIGluaXQgbWV0aG9kIGFuZCBwcm92aWRpbmcgdGhlbSB3aXRoIHRoZSBHcmlkIG9iamVjdFxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcclxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByZXNvdXJjZS5pbml0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICByZXNvdXJjZS5pbml0KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmNvbnRhaW5lclNlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlZ2lzdGVyIHRoZSBSeEpTIFJlc291cmNlIGluIGFsbCBuZWNlc3Nhcnkgc2VydmljZXMgd2hpY2ggdXNlcyAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJSeEpzUmVzb3VyY2UocmVzb3VyY2U6IFJ4SnNGYWNhZGUpIHtcclxuICAgIHRoaXMucnhqcyA9IHJlc291cmNlO1xyXG4gICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XHJcbiAgICB0aGlzLnNvcnRTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdSeEpzUmVzb3VyY2UnLCB0aGlzLnJ4anMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVyIChvciBkaXNwb3NlKSB0aGUgUGFnaW5hdGlvbiBDb21wb25lbnQsIHVzZXIgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBGYWxzZSAodG8gbm90IHNob3cgaXQpIHdoaWNoIHdpbGwgaW4gdGVybSBkaXNwb3NlIG9mIHRoZSBQYWdpbmF0aW9uLFxyXG4gICAqIGFsc28gd2hpbGUgZGlzcG9zaW5nIHdlIGNhbiBjaG9vc2UgdG8gb21pdCB0aGUgZGlzcG9zYWJsZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlIChpZiB3ZSBhcmUgc2ltcGx5IHRvZ2dsaW5nIHRoZSBQYWdpbmF0aW9uLCB3ZSB3YW50IHRvIGtlZXAgdGhlIFNlcnZpY2UgYWxpdmUpXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBzaG93UGFnaW5hdGlvbiAtIHNob3cgKG5ldyByZW5kZXIpIG9yIG5vdCAoZGlzcG9zZSkgdGhlIFBhZ2luYXRpb25cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3VsZERpc3Bvc2VQYWdpbmF0aW9uU2VydmljZSAtIHdoZW4gZGlzcG9zaW5nIHRoZSBQYWdpbmF0aW9uLCBkbyB3ZSBhbHNvIHdhbnQgdG8gZGlzcG9zZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlPyAoZGVmYXVsdHMgdG8gVHJ1ZSlcclxuICAgKi9cclxuICBwcml2YXRlIHJlbmRlclBhZ2luYXRpb24oc2hvd1BhZ2luYXRpb24gPSB0cnVlKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlUGFnaW5hdGlvbiAmJiAhdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgJiYgc2hvd1BhZ2luYXRpb24pIHtcclxuICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24gPSBuZXcgU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50KHRoaXMucGFnaW5hdGlvblNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcclxuICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24ucmVuZGVyUGFnaW5hdGlvbih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICghc2hvd1BhZ2luYXRpb24pIHtcclxuICAgICAgaWYgKHRoaXMuc2xpY2tQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24uZGlzcG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYWtlcyBhIGZsYXQgZGF0YXNldCB3aXRoIHBhcmVudC9jaGlsZCByZWxhdGlvbnNoaXAsIHNvcnQgaXQgKHZpYSBpdHMgdHJlZSBzdHJ1Y3R1cmUpIGFuZCByZXR1cm4gdGhlIHNvcnRlZCBmbGF0IGFycmF5XHJcbiAgICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmbGF0RGF0YXNldElucHV0IC0gZmxhdCBkYXRhc2V0IGlucHV0XHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUdyaWRSZWZyZXNoIC0gb3B0aW9uYWxseSBmb3JjZSBhIGZ1bGwgZ3JpZCByZWZyZXNoXHJcbiAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IHNvcnQgZmxhdCBwYXJlbnQvY2hpbGQgZGF0YXNldFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFRyZWVEYXRhc2V0PFQ+KGZsYXREYXRhc2V0SW5wdXQ6IFRbXSwgZm9yY2VHcmlkUmVmcmVzaCA9IGZhbHNlKTogVFtdIHtcclxuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcclxuICAgIGxldCBzb3J0ZWREYXRhc2V0UmVzdWx0O1xyXG4gICAgbGV0IGZsYXREYXRhc2V0T3V0cHV0OiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoaWVyYXJjaGljYWwgZGF0YXNldCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCB0aGVuIG5vIG5lZWQgdG8gcmUtY29udmVydCBpdCwgd2UgY2FuIHVzZSBpdCBkaXJlY3RseSBmcm9tIHRoZSBzaGFyZWQgc2VydmljZSByZWZcclxuICAgIGlmICh0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCAmJiB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwpIHtcclxuICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLnNvcnRIaWVyYXJjaGljYWxEYXRhc2V0KHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCk7XHJcbiAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5mbGF0O1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZsYXREYXRhc2V0SW5wdXQpICYmIGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8udHJlZURhdGFPcHRpb25zPy5pbml0aWFsU29ydCkge1xyXG4gICAgICAgIC8vIGVsc2Ugd2UgbmVlZCB0byBmaXJzdCBjb252ZXJ0IHRoZSBmbGF0IGRhdGFzZXQgdG8gYSBoaWVyYXJjaGljYWwgZGF0YXNldCBhbmQgdGhlbiBzb3J0XHJcbiAgICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0QW5kU29ydChmbGF0RGF0YXNldElucHV0LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmhpZXJhcmNoaWNhbDtcclxuICAgICAgICBmbGF0RGF0YXNldE91dHB1dCA9IHNvcnRlZERhdGFzZXRSZXN1bHQuZmxhdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBlbHNlIHdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIHByb3ZpZGVkIGFuIGFycmF5IHRoYXQgaXMgYWxyZWFkeSBzb3J0ZWQgKHVzZXIncyByZXNwb25zYWJpbGl0eSlcclxuICAgICAgICAvLyBhbmQgc28gd2UgY2FuIHNpbXBseSBjb252ZXJ0IHRoZSBhcnJheSB0byBhIHRyZWUgc3RydWN0dXJlIGFuZCB3ZSdyZSBkb25lLCBubyBuZWVkIHRvIHNvcnRcclxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gZmxhdERhdGFzZXRJbnB1dCB8fCBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHdlIGFkZC9yZW1vdmUgaXRlbShzKSBmcm9tIHRoZSBkYXRhc2V0LCB3ZSBuZWVkIHRvIGFsc28gcmVmcmVzaCBvdXIgdHJlZSBkYXRhIGZpbHRlcnNcclxuICAgIGlmIChmbGF0RGF0YXNldElucHV0Lmxlbmd0aCA+IDAgJiYgKGZvcmNlR3JpZFJlZnJlc2ggfHwgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4pKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWZyZXNoVHJlZURhdGFGaWx0ZXJzKGZsYXREYXRhc2V0T3V0cHV0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmxhdERhdGFzZXRPdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIsIHdlIHByb3ZpZGUgdGhlIHByb3BlcnR5IFwiZWRpdG9yXCIgYXMgYW4gQW5ndWxhci1TbGlja2dyaWQgZWRpdG9yIGNvbXBsZXggb2JqZWN0XHJcbiAgICogaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XHJcbiAgICogc28gaW4gb3VyIGxpYiB3ZSB3aWxsIHN3YXAgXCJlZGl0b3JcIiBhbmQgY29weSBpdCBpbnRvIGEgbmV3IHByb3BlcnR5IGNhbGxlZCBcImludGVybmFsQ29sdW1uRWRpdG9yXCJcclxuICAgKiB0aGVuIHRha2UgYmFjayBcImVkaXRvci5tb2RlbFwiIGFuZCBtYWtlIGl0IHRoZSBuZXcgXCJlZGl0b3JcIiBzbyB0aGF0IFNsaWNrR3JpZCBFZGl0b3IgRmFjdG9yeSBzdGlsbCB3b3Jrc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xyXG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLnNvbWUoY29sID0+IGAke2NvbC5pZH1gLmluY2x1ZGVzKCcuJykpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tBbmd1bGFyLVNsaWNrZ3JpZF0gTWFrZSBzdXJlIHRoYXQgbm9uZSBvZiB5b3VyIENvbHVtbiBEZWZpbml0aW9uIFwiaWRcIiBwcm9wZXJ0eSBpbmNsdWRlcyBhIGRvdCBpbiBpdHMgbmFtZSBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSBzb21lIHByb2JsZW1zIHdpdGggdGhlIEVkaXRvcnMuIEZvciBleGFtcGxlIGlmIHlvdXIgY29sdW1uIGRlZmluaXRpb24gXCJmaWVsZFwiIHByb3BlcnR5IGlzIFwidXNlci5maXJzdE5hbWVcIiB0aGVuIHVzZSBcImZpcnN0TmFtZVwiIGFzIHRoZSBjb2x1bW4gXCJpZFwiLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW5EZWZpbml0aW9ucy5tYXAoKGNvbHVtbjogQ29sdW1uIHwgYW55KSA9PiB7XHJcbiAgICAgIC8vIG9uIGV2ZXJ5IEVkaXRvciB0aGF0IGhhdmUgYSBcImNvbGxlY3Rpb25Bc3luY1wiLCByZXNvbHZlIHRoZSBkYXRhIGFuZCBhc3NpZ24gaXQgdG8gdGhlIFwiY29sbGVjdGlvblwiIHByb3BlcnR5XHJcbiAgICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmVkaXRvciAmJiBjb2x1bW4uZWRpdG9yLmNvbGxlY3Rpb25Bc3luYykge1xyXG4gICAgICAgIHRoaXMubG9hZEVkaXRvckNvbGxlY3Rpb25Bc3luYyhjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgZWRpdG9yOiBjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IubW9kZWwsIGludGVybmFsQ29sdW1uRWRpdG9yOiB7IC4uLmNvbHVtbi5lZGl0b3IgfSB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zbGF0ZUNvbHVtbkhlYWRlclRpdGxlS2V5cygpIHtcclxuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1ucyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LnRyYW5zbGF0ZUl0ZW1zKHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zLCAnbmFtZUtleScsICduYW1lJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpIHtcclxuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1uIGdyb3VwcyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxyXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LnRyYW5zbGF0ZUl0ZW1zKHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zLCAnY29sdW1uR3JvdXBLZXknLCAnY29sdW1uR3JvdXAnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgXCJpbnRlcm5hbENvbHVtbkVkaXRvci5jb2xsZWN0aW9uXCIgcHJvcGVydHkuXHJcbiAgICogU2luY2UgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzeW5jIGNhbGwgcmVzb2x2ZXMsIHRoZSBwb2ludGVyIHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBcImNvbHVtblwiIGFyZ3VtZW50IHBhc3NlZC5cclxuICAgKiBPbmNlIHdlIGZvdW5kIHRoZSBuZXcgcG9pbnRlciwgd2Ugd2lsbCByZWFzc2lnbiB0aGUgXCJlZGl0b3JcIiBhbmQgXCJjb2xsZWN0aW9uXCIgdG8gdGhlIFwiaW50ZXJuYWxDb2x1bW5FZGl0b3JcIiBzbyBpdCBoYXMgbmV3ZXN0IGNvbGxlY3Rpb25cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUVkaXRvckNvbGxlY3Rpb248VCA9IGFueT4oY29sdW1uOiBDb2x1bW48VD4sIG5ld0NvbGxlY3Rpb246IFRbXSkge1xyXG4gICAgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5jb2xsZWN0aW9uID0gbmV3Q29sbGVjdGlvbjtcclxuICAgIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBmaW5kIHRoZSBuZXcgY29sdW1uIHJlZmVyZW5jZSBwb2ludGVyICYgcmUtYXNzaWduIHRoZSBuZXcgZWRpdG9yIHRvIHRoZSBpbnRlcm5hbENvbHVtbkVkaXRvclxyXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuc2xpY2tHcmlkLmdldENvbHVtbnMoKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtblJlZiA9IGNvbHVtbnMuZmluZCgoY29sOiBDb2x1bW4pID0+IGNvbC5pZCA9PT0gY29sdW1uLmlkKTtcclxuICAgICAgaWYgKGNvbHVtblJlZikge1xyXG4gICAgICAgIGNvbHVtblJlZi5pbnRlcm5hbENvbHVtbkVkaXRvciA9IGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IGN1cnJlbnQgRWRpdG9yLCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NIHRoZW4gcmUtZW5hYmxlIGl0IGFuZCByZS1yZW5kZXIgaXQgd2l0aCB0aGUgbmV3IGNvbGxlY3Rpb24uXHJcbiAgICBjb25zdCBjdXJyZW50RWRpdG9yID0gdGhpcy5zbGlja0dyaWQuZ2V0Q2VsbEVkaXRvcigpIGFzIEF1dG9Db21wbGV0ZUVkaXRvciB8IFNlbGVjdEVkaXRvcjtcclxuICAgIGlmIChjdXJyZW50RWRpdG9yPy5kaXNhYmxlICYmIGN1cnJlbnRFZGl0b3I/LnJlbmRlckRvbUVsZW1lbnQpIHtcclxuICAgICAgY3VycmVudEVkaXRvci5kZXN0cm95KCk7XHJcbiAgICAgIGN1cnJlbnRFZGl0b3IuZGlzYWJsZShmYWxzZSk7XHJcbiAgICAgIGN1cnJlbnRFZGl0b3IucmVuZGVyRG9tRWxlbWVudChuZXdDb2xsZWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|