mmhglobal-dynamicform 2.34.0 → 2.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +20 -0
  2. package/esm2020/lib/components/datalistingfieldbase.component.mjs +2 -2
  3. package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +1 -1
  4. package/esm2020/lib/kcard/kcard.component.mjs +1 -1
  5. package/esm2020/lib/services/main.service.mjs +2 -2
  6. package/esm2020/lib/services/zcomponent.debug.service.mjs +2 -2
  7. package/esm2020/lib/sfdatetimepicker/sfdatetimepicker.component.mjs +5 -3
  8. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +1 -1
  9. package/esm2020/lib/uibulletin/uibulletin.component.mjs +1 -1
  10. package/esm2020/lib/zbuttons/zbuttons.component.mjs +1 -1
  11. package/esm2020/lib/zdatetime/zdatetime.component.mjs +1 -1
  12. package/esm2020/lib/zgrid/container/zgrid-container.component.mjs +1 -1
  13. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +132 -132
  14. package/esm2020/lib/zgrid/zgrid.component.mjs +57 -33
  15. package/esm2020/lib/zgrid/zgrid.service.mjs +62 -58
  16. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +1 -1
  17. package/esm2020/lib/zmodal/zmodal.component.mjs +1 -1
  18. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +30 -23
  19. package/esm2020/lib/ztree/ztree.component.mjs +1 -1
  20. package/esm2020/lib/ztreelist/ztreelist.component.mjs +1 -1
  21. package/esm2020/lib/zudf/zudf.component.mjs +8 -6
  22. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +1 -1
  23. package/fesm2015/mmhglobal-dynamicform.mjs +324 -293
  24. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
  25. package/fesm2020/mmhglobal-dynamicform.mjs +303 -262
  26. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
  27. package/lib/sfdatetimepicker/sfdatetimepicker.component.d.ts +1 -0
  28. package/lib/zgrid/zgrid.binding.directive.d.ts +5 -6
  29. package/lib/zgrid/zgrid.component.d.ts +5 -3
  30. package/lib/zgrid/zgrid.service.d.ts +10 -16
  31. package/lib/zselectmultiple/zselectmultiple.component.d.ts +4 -1
  32. package/lib/zudf/zudf.component.d.ts +3 -2
  33. package/package.json +1 -1
@@ -3,12 +3,10 @@ import { Directive, Input, Inject } from "@angular/core";
3
3
  /********** Ionic **********/
4
4
  /********** Plugin **********/
5
5
  import { of } from "rxjs";
6
- import { switchMap, tap } from "rxjs/operators";
6
+ import { map, switchMap, tap } from "rxjs/operators";
7
7
  import { DataBindingDirective, GridComponent } from "@progress/kendo-angular-grid";
8
- /********** Component & Service **********/
9
- import { GridSettingType, GridStateLogicType } from "./zgrid.service";
10
8
  //import { MainService } from "../services/main.service";
11
- import { ZComponentHelper, ActionType } from "mmhglobal-zcore";
9
+ import { ZComponentHelper, StateType } from "mmhglobal-zcore";
12
10
  import * as i0 from "@angular/core";
13
11
  import * as i1 from "mmhglobal-zcore";
14
12
  import * as i2 from "./zgrid.service";
@@ -16,14 +14,15 @@ export class ZGridBindingDirective extends DataBindingDirective {
16
14
  constructor(grid, // Injecting GridComponent provides access to the scope and context of the GridComponent.
17
15
  webapiService, toastService,
18
16
  //private mainService: MainService,
19
- offlineDatabaseService, signalrService, gridService, loggingService) {
17
+ //private offlineDatabaseService: OfflineDatabaseService,
18
+ signalrService, gridService, loggingService, stateSettingService) {
20
19
  super(grid);
21
20
  this.webapiService = webapiService;
22
21
  this.toastService = toastService;
23
- this.offlineDatabaseService = offlineDatabaseService;
24
22
  this.signalrService = signalrService;
25
23
  this.gridService = gridService;
26
24
  this.loggingService = loggingService;
25
+ this.stateSettingService = stateSettingService;
27
26
  this.changeEvent = {
28
27
  pageChanged: false,
29
28
  filterChanged: false,
@@ -95,11 +94,24 @@ export class ZGridBindingDirective extends DataBindingDirective {
95
94
  }
96
95
  }
97
96
  ngAfterViewInit() {
98
- this.subscribeCacheDataChanges();
99
97
  }
100
98
  ngOnDestroy() {
101
99
  super.ngOnDestroy();
102
100
  }
101
+ retrieveGridStateCache(stateType, field) {
102
+ return this.gridService.getStateCache(stateType, field).pipe(map((settingCacheValue) => {
103
+ // If settingCacheValue is null or undefined, continue with a fallback value
104
+ return settingCacheValue;
105
+ }), tap((settingCacheValue) => {
106
+ if (settingCacheValue) {
107
+ const parsedJsonData = settingCacheValue;
108
+ if (parsedJsonData) {
109
+ this.gridSetting.gridState = parsedJsonData.gridState ?? this.gridSetting.gridState;
110
+ this.gridSetting.columnConfigurations = parsedJsonData.columnConfigurations ?? null;
111
+ }
112
+ }
113
+ }));
114
+ }
103
115
  setResourceUrl(resourceUrl) {
104
116
  const array = resourceUrl.split("/api/");
105
117
  if (!!array[1]) {
@@ -135,23 +147,19 @@ export class ZGridBindingDirective extends DataBindingDirective {
135
147
  generateGridColumns() {
136
148
  const columnFields$ = ZComponentHelper.getGroupValue(this.field.ColumnFields, this.grp);
137
149
  if (columnFields$) {
138
- columnFields$.pipe(tap((data) => {
139
- let columnsConfig = null;
140
- // Note: Obtaining the grid state is during initialization; if not, it will prevent the grid from loading.
141
- const settingCacheName = this.gridService.getGridStateCacheStorageKey(GridSettingType.SavedSetting, this.field);
142
- const settingCacheValue = sessionStorage.getItem(settingCacheName);
143
- if (settingCacheValue) {
144
- const parsedJsonData = JSON.parse(decodeURIComponent(settingCacheValue));
145
- if (parsedJsonData) {
146
- columnsConfig = parsedJsonData.columnConfigurations ?? null;
147
- this.gridSetting.gridState = parsedJsonData.gridState;
148
- }
150
+ columnFields$.pipe(switchMap((data) => {
151
+ const gridStateLogic = this.gridService.getGridStateLogic(this.field);
152
+ if (gridStateLogic && gridStateLogic !== StateType.cachedDataSetting) {
153
+ return this.retrieveGridStateCache(StateType.savedSetting, this.field).pipe(map((state) => {
154
+ return data;
155
+ }));
149
156
  }
157
+ return of(data);
158
+ }), tap((data) => {
150
159
  this.gridSetting = {
151
160
  ...this.gridSetting,
152
161
  columnField: data,
153
- group: this.zgridbinding.group,
154
- columnConfigurations: columnsConfig
162
+ group: this.zgridbinding.group
155
163
  };
156
164
  ZComponentHelper.getGridColumns(this.gridSetting);
157
165
  this.loggingService.debugLog('generated grid columns', this.gridSetting);
@@ -398,18 +406,19 @@ export class ZGridBindingDirective extends DataBindingDirective {
398
406
  */
399
407
  getDataBinding(skipUseCache) {
400
408
  this.grid.loading = true;
401
- const cacheInfo = this.zgridbinding.data.CacheInfo;
402
- if (!cacheInfo || skipUseCache) {
403
- this.getGridData();
404
- return;
405
- }
406
- if (cacheInfo) {
407
- const gridStateLogic = this.gridService.getGridStateLogic(this.field);
408
- if (gridStateLogic === GridStateLogicType.SettingOnly) {
409
- this.getGridData();
410
- return;
411
- }
412
- }
409
+ this.getGridData();
410
+ // const cacheInfo = this.zgridbinding.data.CacheInfo;
411
+ // if (!cacheInfo || skipUseCache) {
412
+ // this.getGridData();
413
+ // return;
414
+ // }
415
+ // if (cacheInfo) {
416
+ // const gridStateLogic = this.gridService.getGridStateLogic(this.field);
417
+ // if (gridStateLogic === GridStateLogicType.SettingOnly) {
418
+ // this.getGridData();
419
+ // return;
420
+ // }
421
+ // }
413
422
  // comment out on 20241001. default to fetch the data from api instead of loading fromt he cache.
414
423
  // if (!this.changeEvent.pageChanged && !this.changeEvent.sortChanged && !this.changeEvent.filterChanged) {
415
424
  // const currentDataCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
@@ -421,7 +430,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
421
430
  // }
422
431
  // }
423
432
  // else {
424
- this.getGridData();
433
+ // this.getGridData();
425
434
  // }
426
435
  }
427
436
  /**
@@ -482,10 +491,9 @@ export class ZGridBindingDirective extends DataBindingDirective {
482
491
  this.aggregateHandling(data.dataSet);
483
492
  this.grid.data = { data: data.dataSet, total: data.totalCount };
484
493
  if (!skipCacheData) {
485
- const gridStateLogic = this.gridService.getGridStateLogic(this.field);
486
- if (gridStateLogic === GridStateLogicType.DataCacheOnly || gridStateLogic === GridStateLogicType.SettingAndDataCache) {
487
- this.cacheGridData();
488
- this.subscribeCacheDataChanges();
494
+ const stateLogic = this.gridService.getGridStateLogic(this.field);
495
+ if (stateLogic === StateType.cachedDataSetting || stateLogic === StateType.savedAndCachedDataSetting) {
496
+ this.cacheGridData(stateLogic);
489
497
  }
490
498
  }
491
499
  this.grid.loading = false;
@@ -500,8 +508,8 @@ export class ZGridBindingDirective extends DataBindingDirective {
500
508
  sortChanged: false
501
509
  };
502
510
  }
503
- async cacheGridData() {
504
- const me = this;
511
+ cacheGridData(stateLogic) {
512
+ const cacheName = this.stateSettingService.getStorageCacheKey(stateLogic, this.field);
505
513
  const gridState = this.gridSetting.gridState;
506
514
  const gridData = this.grid?.data || null;
507
515
  if (!gridData['data']) {
@@ -509,18 +517,10 @@ export class ZGridBindingDirective extends DataBindingDirective {
509
517
  }
510
518
  const cacheInfo = this.zgridbinding.data.CacheInfo;
511
519
  if (cacheInfo && !cacheInfo.DisableCacheData) {
512
- // keep originalData
513
- const originalDataCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
514
- const result = await this.offlineDatabaseService.getItemByKey(originalDataCacheInfo, originalDataCacheInfo.offlineDatabaseKey);
520
+ const columnConfigurations = ZComponentHelper.getGridColumnsConfig(this.zgridbinding.gridSetting.columns);
515
521
  let updatedData = [...gridData['data']];
516
522
  let skipList = [gridState.skip];
517
523
  let currentGridSkip = gridState.skip;
518
- if (originalDataCacheInfo.appendPaginationData) {
519
- if (result && !result.skipList.includes(currentGridSkip)) {
520
- updatedData = [...result.data.dataSet, ...gridData['data']];
521
- skipList = [...result.skipList, ...skipList];
522
- }
523
- }
524
524
  const cacheGridData = {
525
525
  data: {
526
526
  dataSet: updatedData,
@@ -529,91 +529,91 @@ export class ZGridBindingDirective extends DataBindingDirective {
529
529
  gridState: gridState,
530
530
  skipList: skipList,
531
531
  cacheDuration: cacheInfo.CacheDuration,
532
- //columnConfigurations: me.grid.columns // by including this property will cause circular reference error.
532
+ columnConfigurations: columnConfigurations
533
533
  };
534
- await this.offlineDatabaseService.addItem(originalDataCacheInfo, cacheGridData);
534
+ sessionStorage.setItem(cacheName, JSON.stringify(cacheGridData));
535
535
  }
536
536
  }
537
537
  //"FeatureDevelopment|Competency"
538
- async subscribeCacheDataChanges() {
539
- const cacheInfo = this.zgridbinding.data.CacheInfo;
540
- if (cacheInfo && !cacheInfo.DisableCacheData) {
541
- // cannot use main service here. will get circular error when build lib
542
- //this.mainService.joinProjectSignalR();
543
- const callBackFunction = `${cacheInfo.Name}_handleReceivedMessage`;
544
- // create and bind a function to be called back for the grid in the group trigger by signalR.
545
- if (!this.grp.signalRCallbackHandler) {
546
- this.grp.signalRCallbackHandler = {};
547
- }
548
- this.grp.signalRCallbackHandler[callBackFunction] = this.handleReceivedMessage.bind(this);
549
- const generatedCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
550
- if (generatedCacheInfo.definedDatabase && generatedCacheInfo.definedTable) {
551
- generatedCacheInfo.definedDatabase.forEach(db => {
552
- generatedCacheInfo.definedTable.forEach(table => {
553
- const eventName = `${db}|${table}`;
554
- console.log(`Listening to event name: ${eventName}`);
555
- this.signalrService.subscribeToEvent(this.grp, `${eventName}`, `group.signalRCallbackHandler.${callBackFunction}`);
556
- });
557
- });
558
- }
559
- }
560
- }
561
- async handleReceivedMessage(group, result, eventName) {
562
- console.log(`The Signalr trigger has been detected. Now, proceed to update the cache and grid data.`);
563
- const responsedResult = JSON.parse(result);
564
- const actionType = responsedResult.Action;
565
- const responsedResultId = responsedResult['Id'];
566
- const tempParams = ZComponentHelper.deepClone(this.params);
567
- const currentDataCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
568
- const currentData = await this.offlineDatabaseService.getItemByKey(currentDataCacheInfo, currentDataCacheInfo.offlineDatabaseKey);
569
- if (currentData) {
570
- tempParams.filters = `Id=${responsedResultId}`;
571
- if (actionType === ActionType.Delete) {
572
- currentData.data.dataSet = currentData.data.dataSet.filter(item => item.Id !== parseInt(responsedResultId));
573
- this.handleGetDataBindingComplete(currentData.data, true);
574
- await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
575
- this.handleGetDataBindingComplete(currentData.data, true);
576
- console.log(`Item updated: ${currentData}`);
577
- }
578
- else {
579
- this.webapiService.postApi(this.paginationApiPostUrl, tempParams, null, null, null, null, true).subscribe(async (resp) => {
580
- const databaseRecord = resp.dataSet[0];
581
- if (databaseRecord) {
582
- if (actionType === ActionType.Update) {
583
- const indexToUpdate = currentData.data.dataSet.findIndex(item => item.Id === databaseRecord.Id);
584
- if (indexToUpdate !== -1) {
585
- // Create a new object with the updated name
586
- const updatedItem = { ...currentData.data.dataSet[indexToUpdate], ...databaseRecord };
587
- // Replace the old item with the updated one
588
- currentData.data.dataSet[indexToUpdate] = updatedItem;
589
- this.handleGetDataBindingComplete(currentData.data, true);
590
- await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
591
- console.log(`Item updated: ${currentData}`);
592
- }
593
- else {
594
- console.log("Item not found with ID:", databaseRecord.Id);
595
- }
596
- }
597
- else if (actionType === ActionType.Add && currentData.gridState.skip < 20) {
598
- currentData.data.dataSet.unshift(databaseRecord);
599
- this.handleGetDataBindingComplete(currentData.data, true);
600
- await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
601
- this.handleGetDataBindingComplete(currentData.data, true);
602
- console.log(`Item updated: ${currentData}`);
603
- }
604
- }
605
- else {
606
- // Unable to get data, refresh the whole grid data from API
607
- this.getGridData();
608
- }
609
- });
610
- }
611
- }
612
- else {
613
- // Unable to get from indexedDB straight get from API
614
- this.getGridData();
615
- }
616
- }
538
+ // commented out for future reference and re-develop.
539
+ // private async subscribeCacheDataChanges() {
540
+ // const cacheInfo = this.zgridbinding.data.CacheInfo;
541
+ // if (cacheInfo && !cacheInfo.DisableCacheData) {
542
+ // // cannot use main service here. will get circular error when build lib
543
+ // //this.mainService.joinProjectSignalR();
544
+ // const callBackFunction = `${cacheInfo.Name}_handleReceivedMessage`;
545
+ // // create and bind a function to be called back for the grid in the group trigger by signalR.
546
+ // if (!this.grp.signalRCallbackHandler) {
547
+ // this.grp.signalRCallbackHandler = {};
548
+ // }
549
+ // this.grp.signalRCallbackHandler[callBackFunction] = this.handleReceivedMessage.bind(this);
550
+ // const generatedCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
551
+ // if (generatedCacheInfo.definedDatabase && generatedCacheInfo.definedTable) {
552
+ // generatedCacheInfo.definedDatabase.forEach(db => {
553
+ // generatedCacheInfo.definedTable.forEach(table => {
554
+ // const eventName = `${db}|${table}`;
555
+ // console.log(`Listening to event name: ${eventName}`);
556
+ // this.signalrService.subscribeToEvent(this.grp, `${eventName}`, `group.signalRCallbackHandler.${callBackFunction}`);
557
+ // });
558
+ // });
559
+ // }
560
+ // }
561
+ // }
562
+ // async handleReceivedMessage(group: ZGroup, result: any, eventName: string) {
563
+ // console.log(`The Signalr trigger has been detected. Now, proceed to update the cache and grid data.`);
564
+ // const responsedResult = JSON.parse(result);
565
+ // const actionType = responsedResult.Action;
566
+ // const responsedResultId = responsedResult['Id'];
567
+ // const tempParams = ZComponentHelper.deepClone(this.params);
568
+ // const currentDataCacheInfo = this.gridService.generateCacheInfo(this.zgridbinding.data);
569
+ // const currentData = await this.offlineDatabaseService.getItemByKey(currentDataCacheInfo, currentDataCacheInfo.offlineDatabaseKey);
570
+ // if (currentData) {
571
+ // tempParams.filters = `Id=${responsedResultId}`;
572
+ // if (actionType === ActionType.Delete) {
573
+ // currentData.data.dataSet = currentData.data.dataSet.filter(item => item.Id !== parseInt(responsedResultId));
574
+ // this.handleGetDataBindingComplete(currentData.data, true);
575
+ // await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
576
+ // this.handleGetDataBindingComplete(currentData.data, true);
577
+ // console.log(`Item updated: ${currentData}`);
578
+ // }
579
+ // else {
580
+ // this.webapiService.postApi(this.paginationApiPostUrl, tempParams, null, null, null, null, true).subscribe(async resp => {
581
+ // const databaseRecord = resp.dataSet[0];
582
+ // if (databaseRecord) {
583
+ // if (actionType === ActionType.Update) {
584
+ // const indexToUpdate = currentData.data.dataSet.findIndex(item => item.Id === databaseRecord.Id);
585
+ // if (indexToUpdate !== -1) {
586
+ // // Create a new object with the updated name
587
+ // const updatedItem = { ...currentData.data.dataSet[indexToUpdate], ...databaseRecord };
588
+ // // Replace the old item with the updated one
589
+ // currentData.data.dataSet[indexToUpdate] = updatedItem;
590
+ // this.handleGetDataBindingComplete(currentData.data, true);
591
+ // await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
592
+ // console.log(`Item updated: ${currentData}`);
593
+ // } else {
594
+ // console.log("Item not found with ID:", databaseRecord.Id);
595
+ // }
596
+ // }
597
+ // else if (actionType === ActionType.Add && currentData.gridState.skip < 20) {
598
+ // currentData.data.dataSet.unshift(databaseRecord);
599
+ // this.handleGetDataBindingComplete(currentData.data, true);
600
+ // await this.offlineDatabaseService.updateItem(currentDataCacheInfo, currentData);
601
+ // this.handleGetDataBindingComplete(currentData.data, true);
602
+ // console.log(`Item updated: ${currentData}`);
603
+ // }
604
+ // }
605
+ // else {
606
+ // // Unable to get data, refresh the whole grid data from API
607
+ // this.getGridData();
608
+ // }
609
+ // });
610
+ // }
611
+ // }
612
+ // else {
613
+ // // Unable to get from indexedDB straight get from API
614
+ // this.getGridData();
615
+ // }
616
+ // }
617
617
  afterDataBinded(data) {
618
618
  // allow to call back project page after data binded.
619
619
  let bindedValue = this.zgridbinding.data['AfterDataBinded'];
@@ -837,7 +837,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
837
837
  this.loggingService.debugLog('generated grid columns', this.gridSetting);
838
838
  }
839
839
  }
840
- ZGridBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, deps: [{ token: GridComponent }, { token: i1.WebApiService }, { token: i1.ToastService }, { token: i1.OfflineDatabaseService }, { token: i1.SignalrService }, { token: i2.ZGridService }, { token: i1.LoggingService }], target: i0.ɵɵFactoryTarget.Directive });
840
+ ZGridBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, deps: [{ token: GridComponent }, { token: i1.WebApiService }, { token: i1.ToastService }, { token: i1.SignalrService }, { token: i2.ZGridService }, { token: i1.LoggingService }, { token: i1.StateSettingService }], target: i0.ɵɵFactoryTarget.Directive });
841
841
  ZGridBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.3", type: ZGridBindingDirective, selector: "[zgridbinding]", inputs: { zgridbinding: "zgridbinding" }, usesInheritance: true, ngImport: i0 });
842
842
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, decorators: [{
843
843
  type: Directive,
@@ -847,7 +847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
847
847
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
848
848
  type: Inject,
849
849
  args: [GridComponent]
850
- }] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.OfflineDatabaseService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }]; }, propDecorators: { zgridbinding: [{
850
+ }] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }, { type: i1.StateSettingService }]; }, propDecorators: { zgridbinding: [{
851
851
  type: Input
852
852
  }] } });
853
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBeUMsTUFBTSw4QkFBOEIsQ0FBQztBQUcxSCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRix5REFBeUQ7QUFDekQsT0FBTyxFQUNMLGdCQUFnQixFQUM2RCxVQUFVLEVBQ3hGLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDM0Isc0JBQThDLEVBQzlDLGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCO1FBRXRDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRTFCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxD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VTtZQUN0QixRQUFRLEVBQUUsUUFBUTtZQUNsQixXQUFXLEVBQUUsV0FBVztTQUN6QixDQUFDO1FBQ0YscUNBQXFDO1FBQ3JDLElBQUksUUFBUSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRTtZQUN0RSxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUVELGdEQUFnRDtRQUNoRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDcEQsT0FBTyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtJQUN6QiwrREFBK0Q7SUFDL0QsaURBQWlEO0lBQ2pELHNDQUFzQztJQUUvQixVQUFVLENBQUMsT0FBYztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDdkMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsQ0FBQzs7a0hBMzlCVSxxQkFBcUIsa0JBeUR0QixhQUFhO3NHQXpEWixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjs7MEJBMERJLE1BQU07MkJBQUMsYUFBYTs2TkFsRGQsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRGF0YUJpbmRpbmdEaXJlY3RpdmUsIEdyaWRDb21wb25lbnQsIERhdGFTdGF0ZUNoYW5nZUV2ZW50LCBQYWdlQ2hhbmdlRXZlbnQgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZFwiO1xyXG5pbXBvcnQgeyBTb3J0RGVzY3JpcHRvciwgRmlsdGVyRGVzY3JpcHRvciwgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWRhdGEtcXVlcnlcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgR3JpZFNldHRpbmdUeXBlLCBHcmlkU3RhdGVMb2dpY1R5cGUsIFpHcmlkU2VydmljZSB9IGZyb20gXCIuL3pncmlkLnNlcnZpY2VcIjtcclxuLy9pbXBvcnQgeyBNYWluU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9tYWluLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBaQ29tcG9uZW50SGVscGVyLCBaRmllbGQsIFpHcmlkUG9zdEFwaVBhcmFtcyxcclxuICBXZWJBcGlTZXJ2aWNlLCBaR3JvdXAsIFRvYXN0U2VydmljZSwgT2ZmbGluZURhdGFiYXNlU2VydmljZSwgU2lnbmFsclNlcnZpY2UsIEFjdGlvblR5cGUsIFpHcmlkQ29sdW1uQ29uZmlncywgWkdyaWRTZXR0aW5ncywgTG9nZ2luZ1NlcnZpY2UsIFpHcmlkRmlsdGVyUGFyYW1zXHJcbn0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt6Z3JpZGJpbmRpbmddXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgZXh0ZW5kcyBEYXRhQmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0ge1xyXG4gICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgZmlsdGVyQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBzb3J0Q2hhbmdlZDogZmFsc2VcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHpncmlkYmluZGluZzoge1xyXG4gICAgZGF0YTogWkZpZWxkO1xyXG4gICAgZ3JvdXA6IFpHcm91cDtcclxuICAgIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gICAgZ3JpZFN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzO1xyXG4gIH07XHJcblxyXG4gIC8vc3RhdGU6IFN0YXRlID0ge1xyXG4gIC8vICBza2lwOiAwLFxyXG4gIC8vICB0YWtlOiAxMCxcclxuICAvL307XHJcblxyXG4gIC8vZ3JpZENvbHVtbnM6IGFueVtdID0gW107XHJcblxyXG4gIC8vdXNhYmxlQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgcmVzb3VyY2VVUkwgPSBudWxsO1xyXG5cclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybCA9IG51bGw7XHJcblxyXG4gIGRhdGFTb3VyY2UgPSBudWxsO1xyXG5cclxuICBnZXQgZ3JpZFNldHRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmc7XHJcbiAgfVxyXG4gIHNldCBncmlkU2V0dGluZyh2YWx1ZSkge1xyXG4gICAgdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmcgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IGZpZWxkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRTdWJqZWN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmFtcygpOiBaR3JpZFBvc3RBcGlQYXJhbXMge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLnBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBnZXREYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEdyaWRDb21wb25lbnQpIGdyaWQsIC8vIEluamVjdGluZyBHcmlkQ29tcG9uZW50IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2NvcGUgYW5kIGNvbnRleHQgb2YgdGhlIEdyaWRDb21wb25lbnQuXHJcbiAgICBwcml2YXRlIHdlYmFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZSxcclxuICAgIHByaXZhdGUgb2ZmbGluZURhdGFiYXNlU2VydmljZTogT2ZmbGluZURhdGFiYXNlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2lnbmFsclNlcnZpY2U6IFNpZ25hbHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogWkdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2dnaW5nU2VydmljZTogTG9nZ2luZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5maWVsZC5QYWdlU2l6ZSB8fCAyMDtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZmllbGQuRGF0YVNvdXJjZSA/PyBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VVUkwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5OYW1lICE9PSBcIkFjdGl2aXR5TG9nR3JpZFwiKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIFwiTm8gaW5pdGlhbGlzZSBmb3IgRmllbGQuUmVzb3VyY2VVUkw6IFwiLFxyXG4gICAgICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0UmVzb3VyY2VVcmwodGhpcy5yZXNvdXJjZVVSTCk7XHJcblxyXG4gICAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5EaXNhYmxlR2VuZXJhdGVDb2x1bW5CeUZvcm0pIHtcclxuICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLCB0aGlzLmdycCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5GaWVsZHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zKGNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVzb3VyY2VVcmwocmVzb3VyY2VVcmw6IHN0cmluZykge1xyXG4gICAgY29uc3QgYXJyYXkgPSByZXNvdXJjZVVybC5zcGxpdChcIi9hcGkvXCIpO1xyXG4gICAgaWYgKCEhYXJyYXlbMV0pIHtcclxuICAgICAgYXJyYXlbMV0gPSBcIlBhZ2VcIiArIGFycmF5WzFdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyYXkuam9pbihcIi9hcGkvXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5yZXNvdXJjZVVSTC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGFyclthcnIubGVuZ3RoIC0gMl0gPSBcIlBhZ2VcIiArIGFyclthcnIubGVuZ3RoIC0gMl07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBhcnIuam9pbihcIi9cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKSB7XHJcbiAgICAvLyBVc2UgZmllbGQgb3duIHJlZmVyZW5jZUlkIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZDtcclxuICAgIGNvbnN0IHJlZkZpZWxkID0gdGhpcy5maWVsZC5SZWZlcmVuY2VGaWVsZCB8fCB0aGlzLmdycC5wYXJlbnRSZWZlcmVuY2VGaWVsZDtcclxuICAgIGlmIChyZWZJZCAmJiByZWZGaWVsZCkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHtcclxuICAgICAgICBrZXk6IHJlZkZpZWxkLFxyXG4gICAgICAgIG9wczogXCI9XCIsXHJcbiAgICAgICAgdmFsdWU6IHJlZklkLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZFJlZmVyZW5jZUlkKCkge1xyXG4gICAgbGV0IGZpZWxkUmVmZXJlbmNlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuUmVmZXJlbmNlSWQpIHtcclxuICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlZmVyZW5jZUlkLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRSZWZlcmVuY2VJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZUdyaWRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgY29sdW1uRmllbGRzJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyxcclxuICAgICAgdGhpcy5ncnBcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGNvbHVtbkZpZWxkcyQpIHtcclxuICAgICAgY29sdW1uRmllbGRzJC5waXBlKFxyXG4gICAgICAgIHRhcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbHVtbnNDb25maWcgPSBudWxsO1xyXG5cclxuICAgICAgICAgIC8vIE5vdGU6IE9idGFpbmluZyB0aGUgZ3JpZCBzdGF0ZSBpcyBkdXJpbmcgaW5pdGlhbGl6YXRpb247IGlmIG5vdCwgaXQgd2lsbCBwcmV2ZW50IHRoZSBncmlkIGZyb20gbG9hZGluZy5cclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdDYWNoZU5hbWUgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUNhY2hlU3RvcmFnZUtleShHcmlkU2V0dGluZ1R5cGUuU2F2ZWRTZXR0aW5nLCB0aGlzLmZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdDYWNoZVZhbHVlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXR0aW5nQ2FjaGVOYW1lKTtcclxuICAgICAgICAgIGlmIChzZXR0aW5nQ2FjaGVWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRKc29uRGF0YSA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHNldHRpbmdDYWNoZVZhbHVlKSkgYXMgWkdyaWRTZXR0aW5ncztcclxuICAgICAgICAgICAgaWYgKHBhcnNlZEpzb25EYXRhKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uc0NvbmZpZyA9IHBhcnNlZEpzb25EYXRhLmNvbHVtbkNvbmZpZ3VyYXRpb25zID8/IG51bGw7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBwYXJzZWRKc29uRGF0YS5ncmlkU3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdyaWRTZXR0aW5nLCAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGNvbHVtbkZpZWxkOiBkYXRhLFxyXG4gICAgICAgICAgICBncm91cDogdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXAsXHJcbiAgICAgICAgICAgIGNvbHVtbkNvbmZpZ3VyYXRpb25zOiBjb2x1bW5zQ29uZmlnXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWdMb2coJ2dlbmVyYXRlZCBncmlkIGNvbHVtbnMnLCB0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtc0NvbHVtbnMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtcygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRTb3J0aW5nKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEdyYW50VHlwZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRIaWRkZW5Db2x1bW4odGhpcy5ncmlkU2V0dGluZy5jb2x1bW5Db25maWd1cmF0aW9ucyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMucmVmZXJJZCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHx8IHRoaXMuZ3JwLnJlZmVyZW5jZUlkIHx8IG51bGw7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbCB0byBnZW5lcmF0ZSBncmlkIGNvbHVtbiBmaWVsZHMuJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNraXBMb2FkUmVzb3VyY2VVUkxEYXRhKHNldHRpbmdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSA9ICFzZXR0aW5nVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHRpdGxlIG9mIGEgY29sdW1uIGluIHRoZSBncmlkIHNldHRpbmcgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xOYW1lIC0gVGhlIG5ldyB0aXRsZSBmb3IgdGhlIGNvbHVtbi5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uTmFtZShjb2xWYWx1ZTogc3RyaW5nLCBjb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzIHRpdGxlIHByb3BlcnR5IHdpdGggY29sTmFtZS5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS50aXRsZSA9IGNvbE5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBjb2x1bW4gaW4gdGhlIGdyaWQgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gc2V0IHZpc2liaWxpdHkgZm9yLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNWaXNpYmxlIC0gV2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSB2aXNpYmxlICh0cnVlKSBvciBoaWRkZW4gKGZhbHNlKS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShjb2xWYWx1ZTogc3RyaW5nLCBpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzICdoaWRkZW4nIHByb3BlcnR5IGJhc2VkIG9uICdpc1Zpc2libGUnLlxyXG4gICAgaWYgKGNvbHVtblRvVXBkYXRlKSB7XHJcbiAgICAgIGNvbHVtblRvVXBkYXRlLmhpZGRlbiA9ICFpc1Zpc2libGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBmaWx0ZXIgcGFyYW1ldGVycyBmb3IgY29sdW1ucyBhbmQgc2V0IHRoZW0gaW4gdGhlICdwYXJhbXMnIG9iamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zQ29sdW1ucygpIHtcclxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byBzdG9yZSBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgY29sRmllbGRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBncmlkIGNvbHVtbnMgdG8gYnVpbGQgY29sdW1uIGZpZWxkIHN0cmluZ3MuXHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udmFsdWVFeHByKSB7XHJcbiAgICAgICAgLy8gSWYgJ3ZhbHVlRXhwcicgZXhpc3RzLCB1c2UgaXQgYXMgYW4gYWxpYXMgZm9yIHRoZSBmaWVsZC5cclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4udmFsdWVFeHByICsgXCIgYXMgXCIgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdJZCcgaXMgaW4gdGhlIGNvbHVtbiBmaWVsZHM7IGlmIG5vdCwgYWRkIGl0LlxyXG4gICAgaWYgKGNvbEZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChjb2xGaWVsZHMuaW5kZXhPZihcIklkXCIpID09PSAtMSkge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKFwiSWRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgdG1wR3JpZENvbHVtbjogYW55W10gPSBbXTtcclxuICAgIHRtcEdyaWRDb2x1bW4ucHVzaChjb2xGaWVsZHMuam9pbihcIixcIikpO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgaW4gdGhlIHNldHRpbmcsIGFkZCB0aGVtIHRvIHRoZSBhcnJheS5cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdlbmVyYXRlSGlkZGVuQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0bXBHcmlkQ29sdW1uLnB1c2godGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnMuam9pbihcIixcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNldCB0aGUgJ3BhcmFtcy5jb2x1bW5zJyBwcm9wZXJ0eSB3aXRoIHRoZSBjb25jYXRlbmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIHRoaXMucGFyYW1zLmNvbHVtbnMgPSB0bXBHcmlkQ29sdW1uLmpvaW4oXCIsXCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSAncGFyYW1zLmZpbHRlcnMnIHByb3BlcnR5IGJhc2VkIG9uIHRoZSAnZmllbGQuRmlsdGVycycgcHJvcGVydHkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcigpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBDb21iaW5lICdwYXJhbXMuZmlsdGVycycgYW5kICdmaWVsZC5GaWx0ZXJzJyB1c2luZyAnJiYnIGlmIGJvdGggZXhpc3QuIFxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gYCR7dGhpcy5wYXJhbXMuZmlsdGVyc30gJiYgJHt0aGlzLmZpZWxkLkZpbHRlcnN9YDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCF0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBVc2UgJ2ZpZWxkLkZpbHRlcnMnIGRpcmVjdGx5IGlmICdwYXJhbXMuZmlsdGVycycgZG9lc24ndCBleGlzdC5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMuZmllbGQuRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZmllbGQuRmlsdGVycycgY29udGFpbnMgcmVmZXJlbmNlcyB0byAnZ3JvdXAuJyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYWN0dWFsIHZhbHVlcy5cclxuICAgIGlmICh0aGlzLmZpZWxkLkZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzLnNwbGl0KFwiIFwiKS5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJLZXlWYWxQYWlycyA9IHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIik7XHJcbiAgICAgIGNvbnN0IGdycFZhbHVlcyA9IGZpbHRlcktleVZhbFBhaXJzLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSk7XHJcblxyXG4gICAgICBncnBWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsVmFsID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHZhbCwgdGhpcy5ncnApO1xyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLnBhcmFtcy5maWx0ZXJzLnJlcGxhY2UodmFsLCBhY3R1YWxWYWwpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgaW4gdGhlICdwYXJhbXMuZmlsdGVyUGFyYW1zJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGRbJ0ZpbHRlclBhcmFtcyddJy4gZmlsdGVyUGFyYW1zID09PSB1c2VkIGZvciB0aGUgaW5wdXQgaW4gdGhlIGNvbHVtbiBmaWx0ZXIgYXQgdGhlIFVJLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXMoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJQYXJhbXMgPSB0aGlzLmZpZWxkWydGaWx0ZXJQYXJhbXMnXTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGZpbHRlciBwYXJhbWV0ZXJzIGlmIHVuZGVmaW5lZC5cclxuICAgIGlmICghdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgaWYgKGZpbHRlclBhcmFtcy5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgICAgLy8gSWYgJ2ZpbHRlclBhcmFtcycgc3RhcnRzIHdpdGggXCJncm91cC5cIiwgZXh0ZW5kIHRoZSBleGlzdGluZyBhcnJheS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICAuLi5aQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZmlsdGVyUGFyYW1zLCB0aGlzLmdycClcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIGRvZXMgbm90IHN0YXJ0IHdpdGggXCJncm91cC5cIiwgdXNlIGl0IGRpcmVjdGx5LlxyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtcclxuICAgICAgICAgIC4uLnRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyxcclxuICAgICAgICAgIGZpbHRlclBhcmFtc1xyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgY29sdW1uIGZpbHRlcnMgaW4gdGhlIGdyaWQgc3RhdGUgYW5kIGFwcGVuZCB0byBmaWx0ZXJwYXJhbSBcclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZT8uZmlsdGVyPy5maWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLmZpbHRlcj8uZmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUGFyYW0gPSB7XHJcbiAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZmlsdGVyLm9wZXJhdG9yKSxcclxuICAgICAgICAgIHZhbHVlOiBmaWx0ZXIudmFsdWUgPT09IG51bGwgPyBcIlwiIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGFyYW0gPSB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMuZmluZCgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0gZmlsdGVyUGFyYW0ua2V5KTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdQYXJhbSkge1xyXG4gICAgICAgICAgLy8gSWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGV4aXN0cywgdXBkYXRlIGl0cyB2YWx1ZS5cclxuICAgICAgICAgIGV4aXN0aW5nUGFyYW0udmFsdWUgPSBmaWx0ZXJQYXJhbS52YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gSWYgbm8gZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSwgYWRkIGl0IHRvIHRoZSBmaWx0ZXIgcGFyYW1ldGVycy5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBzb3J0aW5nIG9yZGVyIGluIHRoZSAncGFyYW1zLnNvcnRPcmRlcicgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkLlNvcnRPcmRlcicuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldFNvcnRpbmcoKSB7XHJcbiAgICBjb25zdCBzb3J0T3JkZXIgPSB0aGlzLmZpZWxkLlNvcnRPcmRlcjtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnc29ydE9yZGVyJyBpcyBkZWZpbmVkIGFuZCBzdGFydHMgd2l0aCBcImdyb3VwLlwiLlxyXG4gICAgaWYgKHNvcnRPcmRlciAmJiBzb3J0T3JkZXIuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoc29ydE9yZGVyLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgJ3NvcnRPcmRlcicgaXMgbm90IGRlZmluZWQgb3IgZG9lc24ndCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyID0gc29ydE9yZGVyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHNvcnQgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLnNvcnRPcmRlcnMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnQpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydC5mb3JFYWNoKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gZGVzY3JpcHRvci5maWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1uTmFtZSA9IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmllbGQudmFsdWVFeHByIDogZGVzY3JpcHRvci5maWVsZDtcclxuXHJcbiAgICAgICAgICAvLyBDaGVjayBpZiBhIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU29ydENvbHVtbkluZGV4ID0gdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLmZpbmRJbmRleCgobmFtZSkgPT4gbmFtZSA9PT0gc29ydENvbHVtbk5hbWUpO1xyXG5cclxuICAgICAgICAgIGlmIChleGlzdGluZ1NvcnRDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gSWYgYSBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLCB1cGRhdGUgaXRzIHNvcnQgb3JkZXIuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnNbZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXhdID0gZGVzY3JpcHRvci5kaXI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBubyBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUsIGFkZCBpdCB0byB0aGUgc29ydCBjb2x1bW5zIGFuZCBzb3J0IG9yZGVycy5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLnB1c2goc29ydENvbHVtbk5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZGVzY3JpcHRvci5kaXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGdyYW50IHR5cGUgaW4gdGhlICdwYXJhbXMuZ3JhbnRUeXBlJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGQuR3JhbnRUeXBlJy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R3JhbnRUeXBlKCkge1xyXG4gICAgY29uc3QgZ3JhbnRUeXBlID0gdGhpcy5maWVsZC5HcmFudFR5cGU7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2dyYW50VHlwZScgaXMgZGVmaW5lZC5cclxuICAgIGlmIChncmFudFR5cGUpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZ3JhbnRUeXBlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGdyYW50VHlwZS50b1N0cmluZygpLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlICdoaWRkZW4nIHByb3BlcnR5IGZvciBjb2x1bW5zIGluICdncmlkU2V0dGluZycgYmFzZWQgb24gJ2NvbHVtbkNvbmZpZ3MnLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaR3JpZENvbHVtbkNvbmZpZ3NbXX0gY29sdW1uQ29uZmlncyAtIFRoZSBjb2x1bW4gY29uZmlndXJhdGlvbiBzZXR0aW5ncy5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIHNldEhpZGRlbkNvbHVtbihjb2x1bW5Db25maWdzOiBaR3JpZENvbHVtbkNvbmZpZ3NbXSkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucyAmJiBjb2x1bW5Db25maWdzKSB7XHJcbiAgICAgIC8vIEZpbHRlciBvdXQgaGlkZGVuIGNvbHVtbnMgaW4gJ2NvbHVtbkNvbmZpZ3MnLlxyXG4gICAgICBjb25zdCBoaWRkZW5Db2x1bW5zID0gY29sdW1uQ29uZmlncy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5oaWRkZW4gPT09IHRydWUpO1xyXG5cclxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGhpZGRlbiBjb2x1bW5zIGFuZCB1cGRhdGUgJ2dyaWRTZXR0aW5nJyBhY2NvcmRpbmdseS5cclxuICAgICAgaGlkZGVuQ29sdW1ucy5mb3JFYWNoKGhpZGRlbkNvbHVtbiA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBoaWRkZW5Db2x1bW4uZmllbGQpO1xyXG4gICAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICAgIGNvbHVtbi5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBkYXRhIGZvciBkYXRhIGJpbmRpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBVc2VDYWNoZSAtIFdoZXRoZXIgdG8gc2tpcCB1c2luZyBjYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwuXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcbiAgICovXHJcbiAgcHVibGljIGdldERhdGFCaW5kaW5nKHNraXBVc2VDYWNoZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAgIGlmICghY2FjaGVJbmZvIHx8IHNraXBVc2VDYWNoZSkge1xyXG4gICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvKSB7XHJcbiAgICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBHcmlkU3RhdGVMb2dpY1R5cGUuU2V0dGluZ09ubHkpIHtcclxuICAgICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29tbWVudCBvdXQgb24gMjAyNDEwMDEuIGRlZmF1bHQgdG8gZmV0Y2ggdGhlIGRhdGEgZnJvbSBhcGkgaW5zdGVhZCBvZiBsb2FkaW5nIGZyb210IGhlIGNhY2hlLlxyXG4gICAgLy8gaWYgKCF0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkICYmICF0aGlzLmNoYW5nZUV2ZW50LnNvcnRDaGFuZ2VkICYmICF0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQpIHtcclxuICAgIC8vICAgY29uc3QgY3VycmVudERhdGFDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gICAgLy8gICBjb25zdCByZXN1bHQgPSB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UuZ2V0SXRlbUJ5S2V5KGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG4gICAgLy8gICBpZiAocmVzdWx0KSB7XHJcbiAgICAvLyAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHJlc3VsdC5kYXRhLCB0cnVlKTtcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZ3JpZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHcmlkRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIGlmICghdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignR3JpZCBwYWdpbmF0aW9uIEFQSSBVUkwgaXMgdW5kZWZpbmVkLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3RhdGVTa2lwID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5za2lwIDogdGhpcy5zdGF0ZS5za2lwO1xyXG4gICAgICBjb25zdCBzdGF0ZVRha2UgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnRha2UgOiB0aGlzLnN0YXRlLnRha2U7XHJcblxyXG4gICAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSB0aGlzLmdldFBhZ2VObyhzdGF0ZVNraXAsIHN0YXRlVGFrZSk7XHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VTaXplID0gc3RhdGVUYWtlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZmllbGQuRXh0ZXJuYWxQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgLy8gRm9yIFBPU1QgbWV0aG9kIFBhZ2UgV2ViQVBJIFxyXG4gICAgICAgIHRoaXMud2ViYXBpU2VydmljZVxyXG4gICAgICAgICAgLnBvc3RBcGkodGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCwgdGhpcy5wYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3ApID0+IHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXNwKSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiRXJyb3Igb2NjdXIgaW4gbG9hZGluZyB0aGUgZGF0YVwiLCBcIm1pZGRsZVwiLCBmYWxzZSwgMTUwMCwgXCJkYW5nZXJcIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gRm9yIEdFVCBtZXRob2RcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBcGkodGhpcy5yZXNvdXJjZVVSTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxDb3VudCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcC5kYXRhU2V0KSB7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IHJlc3AuZGF0YVNldDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC50b3RhbENvdW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwO1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSByZXNwLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHsgZGF0YVNldDogZGF0YSwgdG90YWxDb3VudDogdG90YWxDb3VudCB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc3QgZGF0YVNldCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLkRhdGFTb3VyY2UsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFTZXQ7XHJcbiAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoZGF0YTogYW55LCBza2lwQ2FjaGVEYXRhPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVIYW5kbGluZyhkYXRhLmRhdGFTZXQpO1xyXG4gICAgdGhpcy5ncmlkLmRhdGEgPSB7IGRhdGE6IGRhdGEuZGF0YVNldCwgdG90YWw6IGRhdGEudG90YWxDb3VudCB9O1xyXG4gICAgaWYgKCFza2lwQ2FjaGVEYXRhKSB7XHJcbiAgICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBHcmlkU3RhdGVMb2dpY1R5cGUuRGF0YUNhY2hlT25seSB8fCBncmlkU3RhdGVMb2dpYyA9PT0gR3JpZFN0YXRlTG9naWNUeXBlLlNldHRpbmdBbmREYXRhQ2FjaGUpIHtcclxuICAgICAgICB0aGlzLmNhY2hlR3JpZERhdGEoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWZ0ZXJEYXRhQmluZGVkKGRhdGEpO1xyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlRXZlbnRGbGFnKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IHtcclxuICAgICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNhY2hlR3JpZERhdGEoKSB7XHJcbiAgICBjb25zdCBtZSA9IHRoaXM7XHJcbiAgICBjb25zdCBncmlkU3RhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZTtcclxuICAgIGNvbnN0IGdyaWREYXRhID0gdGhpcy5ncmlkPy5kYXRhIHx8IG51bGw7XHJcblxyXG4gICAgaWYgKCFncmlkRGF0YVsnZGF0YSddKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvICYmICFjYWNoZUluZm8uRGlzYWJsZUNhY2hlRGF0YSkge1xyXG4gICAgICAvLyBrZWVwIG9yaWdpbmFsRGF0YSBcclxuICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShvcmlnaW5hbERhdGFDYWNoZUluZm8sIG9yaWdpbmFsRGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG4gICAgICBsZXQgdXBkYXRlZERhdGEgPSBbLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgIGxldCBza2lwTGlzdCA9IFtncmlkU3RhdGUuc2tpcF07XHJcbiAgICAgIGxldCBjdXJyZW50R3JpZFNraXAgPSBncmlkU3RhdGUuc2tpcDtcclxuXHJcbiAgICAgIGlmIChvcmlnaW5hbERhdGFDYWNoZUluZm8uYXBwZW5kUGFnaW5hdGlvbkRhdGEpIHtcclxuICAgICAgICBpZiAocmVzdWx0ICYmICFyZXN1bHQuc2tpcExpc3QuaW5jbHVkZXMoY3VycmVudEdyaWRTa2lwKSkge1xyXG4gICAgICAgICAgdXBkYXRlZERhdGEgPSBbLi4ucmVzdWx0LmRhdGEuZGF0YVNldCwgLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgICAgICBza2lwTGlzdCA9IFsuLi5yZXN1bHQuc2tpcExpc3QsIC4uLnNraXBMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNhY2hlR3JpZERhdGEgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YVNldDogdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICB0b3RhbENvdW50OiBncmlkRGF0YVsndG90YWwnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZFN0YXRlOiBncmlkU3RhdGUsXHJcbiAgICAgICAgc2tpcExpc3Q6IHNraXBMaXN0LFxyXG4gICAgICAgIGNhY2hlRHVyYXRpb246IGNhY2hlSW5mby5DYWNoZUR1cmF0aW9uLFxyXG4gICAgICAgIC8vY29sdW1uQ29uZmlndXJhdGlvbnM6IG1lLmdyaWQuY29sdW1ucyAvLyBieSBpbmNsdWRpbmcgdGhpcyBwcm9wZXJ0eSB3aWxsIGNhdXNlIGNpcmN1bGFyIHJlZmVyZW5jZSBlcnJvci4gXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5hZGRJdGVtKG9yaWdpbmFsRGF0YUNhY2hlSW5mbywgY2FjaGVHcmlkRGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1wiRmVhdHVyZURldmVsb3BtZW50fENvbXBldGVuY3lcIiBcclxuICBwcml2YXRlIGFzeW5jIHN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvICYmICFjYWNoZUluZm8uRGlzYWJsZUNhY2hlRGF0YSkge1xyXG4gICAgICAvLyBjYW5ub3QgdXNlIG1haW4gc2VydmljZSBoZXJlLiB3aWxsIGdldCBjaXJjdWxhciBlcnJvciB3aGVuIGJ1aWxkIGxpYlxyXG4gICAgICAvL3RoaXMubWFpblNlcnZpY2Uuam9pblByb2plY3RTaWduYWxSKCk7XHJcblxyXG4gICAgICBjb25zdCBjYWxsQmFja0Z1bmN0aW9uID0gYCR7Y2FjaGVJbmZvLk5hbWV9X2hhbmRsZVJlY2VpdmVkTWVzc2FnZWA7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgYW5kIGJpbmQgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayBmb3IgdGhlIGdyaWQgaW4gdGhlIGdyb3VwIHRyaWdnZXIgYnkgc2lnbmFsUi5cclxuICAgICAgaWYgKCF0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlciA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXJbY2FsbEJhY2tGdW5jdGlvbl0gPSB0aGlzLmhhbmRsZVJlY2VpdmVkTWVzc2FnZS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgY29uc3QgZ2VuZXJhdGVkQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgICAgaWYgKGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkRGF0YWJhc2UgJiYgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWRUYWJsZSkge1xyXG4gICAgICAgIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkRGF0YWJhc2UuZm9yRWFjaChkYiA9PiB7XHJcbiAgICAgICAgICBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZFRhYmxlLmZvckVhY2godGFibGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBgJHtkYn18JHt0YWJsZX1gO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIHRvIGV2ZW50IG5hbWU6ICR7ZXZlbnROYW1lfWApO1xyXG4gICAgICAgICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLnN1YnNjcmliZVRvRXZlbnQodGhpcy5ncnAsIGAke2V2ZW50TmFtZX1gLCBgZ3JvdXAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlci4ke2NhbGxCYWNrRnVuY3Rpb259YCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlUmVjZWl2ZWRNZXNzYWdlKGdyb3VwOiBaR3JvdXAsIHJlc3VsdDogYW55LCBldmVudE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc29sZS5sb2coYFRoZSBTaWduYWxyIHRyaWdnZXIgaGFzIGJlZW4gZGV0ZWN0ZWQuIE5vdywgcHJvY2VlZCB0byB1cGRhdGUgdGhlIGNhY2hlIGFuZCBncmlkIGRhdGEuYCk7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VkUmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG4gICAgY29uc3QgYWN0aW9uVHlwZSA9IHJlc3BvbnNlZFJlc3VsdC5BY3Rpb247XHJcbiAgICBjb25zdCByZXNwb25zZWRSZXN1bHRJZCA9IHJlc3BvbnNlZFJlc3VsdFsnSWQnXTtcclxuICAgIGNvbnN0IHRlbXBQYXJhbXMgPSBaQ29tcG9uZW50SGVscGVyLmRlZXBDbG9uZSh0aGlzLnBhcmFtcyk7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0YSA9IGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkoY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhQ2FjaGVJbmZvLm9mZmxpbmVEYXRhYmFzZUtleSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnREYXRhKSB7XHJcbiAgICAgIHRlbXBQYXJhbXMuZmlsdGVycyA9IGBJZD0ke3Jlc3BvbnNlZFJlc3VsdElkfWA7XHJcblxyXG4gICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5EZWxldGUpIHtcclxuICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQgPSBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQuZmlsdGVyKGl0ZW0gPT4gaXRlbS5JZCAhPT0gcGFyc2VJbnQocmVzcG9uc2VkUmVzdWx0SWQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2UucG9zdEFwaSh0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsLCB0ZW1wUGFyYW1zLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKS5zdWJzY3JpYmUoYXN5bmMgcmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGF0YWJhc2VSZWNvcmQgPSByZXNwLmRhdGFTZXRbMF07XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFiYXNlUmVjb3JkKSB7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLlVwZGF0ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4VG9VcGRhdGUgPSBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5JZCA9PT0gZGF0YWJhc2VSZWNvcmQuSWQpO1xyXG4gICAgICAgICAgICAgIGlmIChpbmRleFRvVXBkYXRlICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSB1cGRhdGVkIG5hbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0geyAuLi5jdXJyZW50RGF0YS5kYXRhLmRhdGFTZXRbaW5kZXhUb1VwZGF0ZV0sIC4uLmRhdGFiYXNlUmVjb3JkIH07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb2xkIGl0ZW0gd2l0aCB0aGUgdXBkYXRlZCBvbmVcclxuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldFtpbmRleFRvVXBkYXRlXSA9IHVwZGF0ZWRJdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSXRlbSBub3QgZm91bmQgd2l0aCBJRDpcIiwgZGF0YWJhc2VSZWNvcmQuSWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLkFkZCAmJiBjdXJyZW50RGF0YS5ncmlkU3RhdGUuc2tpcCA8IDIwKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LnVuc2hpZnQoZGF0YWJhc2VSZWNvcmQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVbmFibGUgdG8gZ2V0IGRhdGEsIHJlZnJlc2ggdGhlIHdob2xlIGdyaWQgZGF0YSBmcm9tIEFQSVxyXG4gICAgICAgICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBVbmFibGUgdG8gZ2V0IGZyb20gaW5kZXhlZERCIHN0cmFpZ2h0IGdldCBmcm9tIEFQSVxyXG4gICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGF0YUJpbmRlZChkYXRhKSB7XHJcbiAgICAvLyBhbGxvdyB0byBjYWxsIGJhY2sgcHJvamVjdCBwYWdlIGFmdGVyIGRhdGEgYmluZGVkLlxyXG4gICAgbGV0IGJpbmRlZFZhbHVlID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnQWZ0ZXJEYXRhQmluZGVkJ107XHJcbiAgICBpZiAoYmluZGVkVmFsdWUpIHtcclxuICAgICAgY29uc3QgbWUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzKTtcclxuICAgICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBiaW5kZWRWYWx1ZS5tYXRjaCgvXFxiXFwoLiovZ2kpO1xyXG4gICAgICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgICAgIGJpbmRlZFZhbHVlID0gYmluZGVkVmFsdWUucmVwbGFjZShwYXJhbXNbMF0sIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiaW5kZWRWYWx1ZSA9IGJpbmRlZFZhbHVlLnJlcGxhY2UoJ21vZGFsR3JvdXAuJywgJ2dyb3VwLicpO1xyXG4gICAgICAgIGNhbGxGdW5jID0gZXZhbCgnbWUuemdyaWRiaW5kaW5nLicgKyBiaW5kZWRWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgICBlcnJvclxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIGNvbnN0IG5ld0Z1bmMgPSBjYWxsRnVuYy5iaW5kKG1lKTtcclxuICAgICAgICBuZXdGdW5jKGV2ZW50LCBtZS56Z3JpZGJpbmRpbmcuZGF0YSwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckRhdGEoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQuZGF0YSA9IHsgZGF0YTogW10sIHRvdGFsOiAwIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgY29sdW1uIGFnZ3JlZ2F0aW9uIGZvciB0aGUgZ2l2ZW4gZGF0YS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55W119IGRhdGEgLSBUaGUgZGF0YSB0byBhZ2dyZWdhdGUuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVIYW5kbGluZyhkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcblxyXG4gICAgYWdncmVnYXRlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gY29sLmZpZWxkO1xyXG4gICAgICBjb25zdCBhZ2dyZWdhdGVUeXBlID0gY29sLmFnZ3JlZ2F0ZVR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCc6JywgJycpO1xyXG5cclxuICAgICAgbGV0IGFnZ3JlZ2F0ZVZhbHVlID0gbnVsbDtcclxuICAgICAgc3dpdGNoIChhZ2dyZWdhdGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRvdGFsXCI6XHJcbiAgICAgICAgY2FzZSBcInN1bVwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImF2ZXJhZ2VcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKSAvIGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImNvdW50XCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1heFwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgocCwgYykgPT4gcFtmaWVsZF0gPiBjW2ZpZWxkXSA/IHAgOiBjKVtmaWVsZF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWluXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA8IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2wuYWdncmVnYXRlVmFsdWUgPSBhZ2dyZWdhdGVWYWx1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgYWdncmVnYXRlIHZhbHVlcyBmb3IgY29sdW1ucyB3aXRoIGFnZ3JlZ2F0ZSB0eXBlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlUmVzZXRWYWx1ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQYWdlQ2hhbmdlRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKGV2ZW50OiBQYWdlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKGV2ZW50LnNraXAsIHRoaXMucGFyYW1zLnBhZ2VTaXplKTtcclxuICAgIHRoaXMuc3RhdGUuc2tpcCA9IGV2ZW50LnNraXA7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBzb3J0IGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U29ydERlc2NyaXB0b3JbXX0gc29ydCAtIFRoZSBzb3J0IGRlc2NyaXB0b3IgYXJyYXkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ID0gc29ydDtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG5cclxuICAgIHNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcjogU29ydERlc2NyaXB0b3IpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCA9IHRydWU7XHJcbiAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZmlsdGVyIGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55fSBldmVudCAtIFRoZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcblxyXG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBldmVudC5maWx0ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGl0ZW0uZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBpdGVtLnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS5maWx0ZXJzKSB7XHJcbiAgICAgICAgICBpdGVtLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtOiBaR3JpZEZpbHRlclBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtOiBaR3JpZEZpbHRlclBhcmFtcyA9IHtcclxuICAgICAgICAgICAga2V5OiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoaXRlbS5vcGVyYXRvciksXHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQudmFsdWVFeHByKSB7XHJcbiAgICAgICAgICAgIGZpbHRlclBhcmFtLmtleSA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGFbJ0ZpbHRlcldpdGhvdXRCcmFja2V0J10gPyBgJHtmaWVsZC52YWx1ZUV4cHJ9YCA6IGAoJHtmaWVsZC52YWx1ZUV4cHJ9KWA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQuR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24/Lk9uQ2hhbmdlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2UgdHJpZ2dlcmVkXCIpO1xyXG4gICAgICAvLyBVc2Ugc3dpdGNoTWFwIHRvIGhhbmRsZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvblxyXG4gICAgICBvZih0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChmaWx0ZXJQYXJhbXMpID0+IHtcclxuICAgICAgICAgIC8vIEdldCB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uXHJcbiAgICAgICAgICBsZXQgZXhwcmVzc2lvbiA9IHRoaXMuZmllbGQuR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2U7XHJcblxyXG4gICAgICAgICAgLy8gUmVwbGFjZSAnbW9kYWxHcm91cC4nIHdpdGggJ2dyb3VwLicgYW5kICdncm91cC4nIHdpdGggJ2dycC4nXHJcbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9tb2RhbEdyb3VwXFwuL2csICdncm91cC4nKS5yZXBsYWNlKC9ncm91cFxcLi9nLCAnZ3JwLicpO1xyXG5cclxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAndGhpcy4nIHRvIGF2b2lkIGFjY2Vzc2luZyBnbG9iYWwgc2NvcGVcclxuICAgICAgICAgIGlmICghZXhwcmVzc2lvbi5zdGFydHNXaXRoKCd0aGlzLicpKSB7XHJcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBgdGhpcy4ke2V4cHJlc3Npb259YDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBmdW5jID0gZXZhbChleHByZXNzaW9uKTtcclxuICAgICAgICAgIGlmICghZnVuYykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZyhgJHtleHByZXNzaW9ufSBub3QgZm91bmQgaW4gdGhpcyBzY29wZSBmb3IgJHt0aGlzLmZpZWxkLk5hbWV9IGdyaWQuYCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTaW5jZSBmdW5jdGlvbiBub3QgZm91bmQsIHdlIHJldHVybiB0aGUgb3JpZ2luYWwgcGFyYW1zLlxyXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdycCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGNhbGxGdW5jKGZpbHRlclBhcmFtcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKHVwZGF0ZWRGaWx0ZXJQYXJhbXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2codXBkYXRlZEZpbHRlclBhcmFtcyk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBmaWx0ZXJQYXJhbXNcclxuICAgICAgICBpZiAodXBkYXRlZEZpbHRlclBhcmFtcykge1xyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gdXBkYXRlZEZpbHRlclBhcmFtcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZVxyXG4gICAgICB0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGF0YVN0YXRlQ2hhbmdlKHN0YXRlOiBEYXRhU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBzdGF0ZTtcclxuICAgIHRoaXMuYWdncmVnYXRlUmVzZXRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwIGZpbHRlciBvcGVyYXRvciB0byBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIFRoZSBmaWx0ZXIgb3BlcmF0b3IuXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbWFwcGVkIGZpbHRlciBvcGVyYXRvciB2YWx1ZS5cclxuICAgKi9cclxuICBwcml2YXRlIG1hcEZpbHRlck9wZXJhdG9yKG9wZXJhdG9yOiBhbnkpIHtcclxuICAgIGNvbnN0IG9wZXJhdG9yTWFwcGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAgIFwiZXFcIjogXCJlcVwiLFxyXG4gICAgICBcIm5lcVwiOiBcIm5lcVwiLFxyXG4gICAgICBcImx0XCI6IFwibHRcIixcclxuICAgICAgXCJsdGVcIjogXCJsdGVcIixcclxuICAgICAgXCJndFwiOiBcImd0XCIsXHJcbiAgICAgIFwiZ3RlXCI6IFwiZ3RlXCIsXHJcbiAgICAgIFwic3RhcnRzd2l0aFwiOiBcInN0YXJ0c3dpdGhcIixcclxuICAgICAgXCJlbmRzd2l0aFwiOiBcImVuZHN3aXRoXCIsXHJcbiAgICAgIFwiaXNudWxsXCI6IFwiaXNudWxsXCIsXHJcbiAgICAgIFwiaXNub3RudWxsXCI6IFwiaXNub3RudWxsXCIsXHJcbiAgICB9O1xyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgXCJjb250YWluc1wiXHJcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiY29udGFpbnNcIiAmJiAhdGhpcy5maWVsZFsnRmlsdGVyQ29udGFpbnNVc2luZ0VxdWFsJ10pIHtcclxuICAgICAgcmV0dXJuIFwiY29udGFpbnNcIjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIG1hcHBlZCBvcGVyYXRvciBvciBkZWZhdWx0IHRvIFwiPT1cIlxyXG4gICAgcmV0dXJuIG9wZXJhdG9yTWFwcGluZ3Nbb3BlcmF0b3JdIHx8IFwiPT1cIjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFnZU5vKHN0YXRlU2tpcDogbnVtYmVyLCBzdGF0ZVRha2U6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHN0YXRlU2tpcCAvIHN0YXRlVGFrZTtcclxuICB9XHJcblxyXG4gIC8vIGNvbHVtbkZpZWxkID0gZGF0YTogQXJyYXk8WkZpZWxkPixcclxuICAvLyBjb2x1bW5zID0gZ3JpZENvbHVtbnM6IGFueVtdLFxyXG4gIC8vIGdyb3VwID0gZ3JvdXA6IFpHcm91cCxcclxuICAvLyBjb2x1bW5Db25maWd1cmF0aW9ucyA9IGdyaWRTZXR0aW5ncz86IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSxcclxuICAvLyBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgPSB1c2FibGVDb2x1bW5zPzogYW55W10sXHJcbiAgLy8gZ3JpZEF0dHJpYnV0ZXMgPSBncmlkRmllbGQ/OiBaRmllbGRcclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uczogYW55W10pIHtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uRmllbGQgPSBjb2x1bW5zO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnTG9nKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
853
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQXlDLE1BQU0sOEJBQThCLENBQUM7QUFLMUgseURBQXlEO0FBQ3pELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNWLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDbkMseURBQXlEO0lBQ2pELGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCLEVBQzlCLG1CQUF3QztRQUVoRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFUSixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUcxQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWM7UUFDekIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFoRTFDLGdCQUFXLEdB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STtZQUNWLEtBQUssRUFBRSxLQUFLO1lBQ1osWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLFdBQVc7U0FDekIsQ0FBQztRQUNGLHFDQUFxQztRQUNyQyxJQUFJLFFBQVEsS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLEVBQUU7WUFDdEUsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFFRCxnREFBZ0Q7UUFDaEQsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUFpQixFQUFFLFNBQWlCO1FBQ3BELE9BQU8sU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLGdDQUFnQztJQUNoQyx5QkFBeUI7SUFDekIsK0RBQStEO0lBQy9ELGlEQUFpRDtJQUNqRCxzQ0FBc0M7SUFFL0IsVUFBVSxDQUFDLE9BQWM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQ3ZDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLENBQUM7O2tIQXIrQlUscUJBQXFCLGtCQXlEdEIsYUFBYTtzR0F6RFoscUJBQXFCOzJGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtpQkFDM0I7OzBCQTBESSxNQUFNOzJCQUFDLGFBQWE7ME5BbERkLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRGF0YUJpbmRpbmdEaXJlY3RpdmUsIEdyaWRDb21wb25lbnQsIERhdGFTdGF0ZUNoYW5nZUV2ZW50LCBQYWdlQ2hhbmdlRXZlbnQgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZFwiO1xyXG5pbXBvcnQgeyBTb3J0RGVzY3JpcHRvciwgRmlsdGVyRGVzY3JpcHRvciwgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWRhdGEtcXVlcnlcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgWkdyaWRTZXJ2aWNlIH0gZnJvbSBcIi4vemdyaWQuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IE1haW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL21haW4uc2VydmljZVwiO1xyXG5pbXBvcnQge1xyXG4gIFpDb21wb25lbnRIZWxwZXIsIFpGaWVsZCwgWkdyaWRQb3N0QXBpUGFyYW1zLFxyXG4gIFdlYkFwaVNlcnZpY2UsIFpHcm91cCwgVG9hc3RTZXJ2aWNlLCBTaWduYWxyU2VydmljZSwgQWN0aW9uVHlwZSwgWkdyaWRDb2x1bW5Db25maWdzLCBaR3JpZFNldHRpbmdzLCBMb2dnaW5nU2VydmljZSwgWkdyaWRGaWx0ZXJQYXJhbXMsXHJcbiAgU3RhdGVUeXBlLCBTdGF0ZVNldHRpbmdTZXJ2aWNlXHJcbn0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt6Z3JpZGJpbmRpbmddXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgZXh0ZW5kcyBEYXRhQmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0ge1xyXG4gICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgZmlsdGVyQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBzb3J0Q2hhbmdlZDogZmFsc2VcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHpncmlkYmluZGluZzoge1xyXG4gICAgZGF0YTogWkZpZWxkO1xyXG4gICAgZ3JvdXA6IFpHcm91cDtcclxuICAgIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gICAgZ3JpZFN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzO1xyXG4gIH07XHJcblxyXG4gIC8vc3RhdGU6IFN0YXRlID0ge1xyXG4gIC8vICBza2lwOiAwLFxyXG4gIC8vICB0YWtlOiAxMCxcclxuICAvL307XHJcblxyXG4gIC8vZ3JpZENvbHVtbnM6IGFueVtdID0gW107XHJcblxyXG4gIC8vdXNhYmxlQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgcmVzb3VyY2VVUkwgPSBudWxsO1xyXG5cclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybCA9IG51bGw7XHJcblxyXG4gIGRhdGFTb3VyY2UgPSBudWxsO1xyXG5cclxuICBnZXQgZ3JpZFNldHRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmc7XHJcbiAgfVxyXG4gIHNldCBncmlkU2V0dGluZyh2YWx1ZSkge1xyXG4gICAgdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmcgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IGZpZWxkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRTdWJqZWN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmFtcygpOiBaR3JpZFBvc3RBcGlQYXJhbXMge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLnBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBnZXREYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEdyaWRDb21wb25lbnQpIGdyaWQsIC8vIEluamVjdGluZyBHcmlkQ29tcG9uZW50IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2NvcGUgYW5kIGNvbnRleHQgb2YgdGhlIEdyaWRDb21wb25lbnQuXHJcbiAgICBwcml2YXRlIHdlYmFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZSxcclxuICAgIC8vcHJpdmF0ZSBvZmZsaW5lRGF0YWJhc2VTZXJ2aWNlOiBPZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzaWduYWxyU2VydmljZTogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBaR3JpZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvZ2dpbmdTZXJ2aWNlOiBMb2dnaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RhdGVTZXR0aW5nU2VydmljZTogU3RhdGVTZXR0aW5nU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoZ3JpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLmZpZWxkLlBhZ2VTaXplIHx8IDIwO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5maWVsZC5EYXRhU291cmNlID8/IG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZVVSTCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMucmVzb3VyY2VVUkwpIHtcclxuICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnpncmlkYmluZGluZy5kYXRhLk5hbWUgIT09IFwiQWN0aXZpdHlMb2dHcmlkXCIpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgXCJObyBpbml0aWFsaXNlIGZvciBGaWVsZC5SZXNvdXJjZVVSTDogXCIsXHJcbiAgICAgICAgICAgIHRoaXMuZmllbGQuUmVzb3VyY2VVUkxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRSZXNvdXJjZVVybCh0aGlzLnJlc291cmNlVVJMKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0RmlsdGVyUGFyYW1zQnlQYXJlbnRSZWZJZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLkRpc2FibGVHZW5lcmF0ZUNvbHVtbkJ5Rm9ybSkge1xyXG4gICAgICBjb25zdCBjb2x1bW5GaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5maWVsZC5Db2x1bW5GaWVsZHMsIHRoaXMuZ3JwKTtcclxuXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbkZpZWxkcykpIHtcclxuICAgICAgICB0aGlzLnNldENvbHVtbnMoY29sdW1uRmllbGRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10pIHtcclxuICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldHJpZXZlR3JpZFN0YXRlQ2FjaGUoc3RhdGVUeXBlOiBTdGF0ZVR5cGUsIGZpZWxkOiBaRmllbGQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZFNlcnZpY2UuZ2V0U3RhdGVDYWNoZShzdGF0ZVR5cGUsIGZpZWxkKS5waXBlKFxyXG4gICAgICBtYXAoKHNldHRpbmdDYWNoZVZhbHVlKSA9PiB7XHJcbiAgICAgICAgLy8gSWYgc2V0dGluZ0NhY2hlVmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQsIGNvbnRpbnVlIHdpdGggYSBmYWxsYmFjayB2YWx1ZSBcclxuICAgICAgICByZXR1cm4gc2V0dGluZ0NhY2hlVmFsdWU7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHNldHRpbmdDYWNoZVZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdDYWNoZVZhbHVlKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJzZWRKc29uRGF0YSA9IHNldHRpbmdDYWNoZVZhbHVlIGFzIFpHcmlkU2V0dGluZ3M7XHJcbiAgICAgICAgICBpZiAocGFyc2VkSnNvbkRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBwYXJzZWRKc29uRGF0YS5ncmlkU3RhdGUgPz8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnMgPSBwYXJzZWRKc29uRGF0YS5jb2x1bW5Db25maWd1cmF0aW9ucyA/PyBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIHB1YmxpYyBzZXRSZXNvdXJjZVVybChyZXNvdXJjZVVybDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhcnJheSA9IHJlc291cmNlVXJsLnNwbGl0KFwiL2FwaS9cIik7XHJcbiAgICBpZiAoISFhcnJheVsxXSkge1xyXG4gICAgICBhcnJheVsxXSA9IFwiUGFnZVwiICsgYXJyYXlbMV07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBhcnJheS5qb2luKFwiL2FwaS9cIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBhcnIgPSB0aGlzLnJlc291cmNlVVJMLnNwbGl0KFwiL1wiKTtcclxuICAgICAgYXJyW2Fyci5sZW5ndGggLSAyXSA9IFwiUGFnZVwiICsgYXJyW2Fyci5sZW5ndGggLSAyXTtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCA9IGFyci5qb2luKFwiL1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RmlsdGVyUGFyYW1zQnlQYXJlbnRSZWZJZCgpIHtcclxuICAgIC8vIFVzZSBmaWVsZCBvd24gcmVmZXJlbmNlSWQgaWYgYXZhaWxhYmxlXHJcbiAgICBjb25zdCByZWZJZCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHx8IHRoaXMuZ3JwLnJlZmVyZW5jZUlkO1xyXG4gICAgY29uc3QgcmVmRmllbGQgPSB0aGlzLmZpZWxkLlJlZmVyZW5jZUZpZWxkIHx8IHRoaXMuZ3JwLnBhcmVudFJlZmVyZW5jZUZpZWxkO1xyXG4gICAgaWYgKHJlZklkICYmIHJlZkZpZWxkKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0ge1xyXG4gICAgICAgIGtleTogcmVmRmllbGQsXHJcbiAgICAgICAgb3BzOiBcIj1cIixcclxuICAgICAgICB2YWx1ZTogcmVmSWQsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkUmVmZXJlbmNlSWQoKSB7XHJcbiAgICBsZXQgZmllbGRSZWZlcmVuY2VJZCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5maWVsZC5SZWZlcmVuY2VJZCkge1xyXG4gICAgICBmaWVsZFJlZmVyZW5jZUlkID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZmllbGQuUmVmZXJlbmNlSWQsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZFJlZmVyZW5jZUlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdlbmVyYXRlR3JpZENvbHVtbnMoKSB7XHJcbiAgICBjb25zdCBjb2x1bW5GaWVsZHMkOiBPYnNlcnZhYmxlPGFueT4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgIHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLFxyXG4gICAgICB0aGlzLmdycFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY29sdW1uRmllbGRzJCkge1xyXG4gICAgICBjb2x1bW5GaWVsZHMkLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBncmlkU3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGdyaWRTdGF0ZUxvZ2ljICYmIGdyaWRTdGF0ZUxvZ2ljICE9PSBTdGF0ZVR5cGUuY2FjaGVkRGF0YVNldHRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0cmlldmVHcmlkU3RhdGVDYWNoZShTdGF0ZVR5cGUuc2F2ZWRTZXR0aW5nLCB0aGlzLmZpZWxkKS5waXBlKFxyXG4gICAgICAgICAgICAgIG1hcCgoc3RhdGUpID0+IHsgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7ICBcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZ3JpZFNldHRpbmcsIC8vIFByZXNlcnZlIGV4aXN0aW5nIHByb3BlcnRpZXNcclxuICAgICAgICAgICAgY29sdW1uRmllbGQ6IGRhdGEsXHJcbiAgICAgICAgICAgIGdyb3VwOiB0aGlzLnpncmlkYmluZGluZy5ncm91cFxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnModGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnTG9nKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXNDb2x1bW5zKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0U29ydGluZygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRHcmFudFR5cGUoKTtcclxuICAgICAgICAgIHRoaXMuc2V0SGlkZGVuQ29sdW1uKHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnMpO1xyXG5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLnJlZmVySWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZCB8fCBudWxsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWwgdG8gZ2VuZXJhdGUgZ3JpZCBjb2x1bW4gZmllbGRzLicpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTa2lwTG9hZFJlc291cmNlVVJMRGF0YShzZXR0aW5nVmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10gPSAhc2V0dGluZ1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSB0aXRsZSBvZiBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBzZXR0aW5nIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sTmFtZSAtIFRoZSBuZXcgdGl0bGUgZm9yIHRoZSBjb2x1bW4uXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtbk5hbWUoY29sVmFsdWU6IHN0cmluZywgY29sTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyB0aXRsZSBwcm9wZXJ0eSB3aXRoIGNvbE5hbWUuXHJcbiAgICBpZiAoY29sdW1uVG9VcGRhdGUpIHtcclxuICAgICAgY29sdW1uVG9VcGRhdGUudGl0bGUgPSBjb2xOYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgY29sdW1uIGluIHRoZSBncmlkIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHNldCB2aXNpYmlsaXR5IGZvci5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVmlzaWJsZSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgdmlzaWJsZSAodHJ1ZSkgb3IgaGlkZGVuIChmYWxzZSkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtblZpc2libGUoY29sVmFsdWU6IHN0cmluZywgaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyAnaGlkZGVuJyBwcm9wZXJ0eSBiYXNlZCBvbiAnaXNWaXNpYmxlJy5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS5oaWRkZW4gPSAhaXNWaXNpYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIGNvbHVtbnMgYW5kIHNldCB0aGVtIGluIHRoZSAncGFyYW1zJyBvYmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlclBhcmFtc0NvbHVtbnMoKSB7XHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gc3RvcmUgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IGNvbEZpZWxkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ3JpZCBjb2x1bW5zIHRvIGJ1aWxkIGNvbHVtbiBmaWVsZCBzdHJpbmdzLlxyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnZhbHVlRXhwcikge1xyXG4gICAgICAgIC8vIElmICd2YWx1ZUV4cHInIGV4aXN0cywgdXNlIGl0IGFzIGFuIGFsaWFzIGZvciB0aGUgZmllbGQuXHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goY29sdW1uLnZhbHVlRXhwciArIFwiIGFzIFwiICsgY29sdW1uLmZpZWxkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnSWQnIGlzIGluIHRoZSBjb2x1bW4gZmllbGRzOyBpZiBub3QsIGFkZCBpdC5cclxuICAgIGlmIChjb2xGaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoY29sRmllbGRzLmluZGV4T2YoXCJJZFwiKSA9PT0gLTEpIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChcIklkXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IHRtcEdyaWRDb2x1bW46IGFueVtdID0gW107XHJcbiAgICB0bXBHcmlkQ29sdW1uLnB1c2goY29sRmllbGRzLmpvaW4oXCIsXCIpKTtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSBhcmUgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zIGluIHRoZSBzZXR0aW5nLCBhZGQgdGhlbSB0byB0aGUgYXJyYXkuXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdG1wR3JpZENvbHVtbi5wdXNoKHRoaXMuZ3JpZFNldHRpbmcuZ2VuZXJhdGVIaWRkZW5Db2x1bW5zLmpvaW4oXCIsXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgdGhlICdwYXJhbXMuY29sdW1ucycgcHJvcGVydHkgd2l0aCB0aGUgY29uY2F0ZW5hdGVkIGNvbHVtbiBmaWVsZHMuXHJcbiAgICB0aGlzLnBhcmFtcy5jb2x1bW5zID0gdG1wR3JpZENvbHVtbi5qb2luKFwiLFwiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgJ3BhcmFtcy5maWx0ZXJzJyBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgJ2ZpZWxkLkZpbHRlcnMnIHByb3BlcnR5LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gQ29tYmluZSAncGFyYW1zLmZpbHRlcnMnIGFuZCAnZmllbGQuRmlsdGVycycgdXNpbmcgJyYmJyBpZiBib3RoIGV4aXN0LiBcclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IGAke3RoaXMucGFyYW1zLmZpbHRlcnN9ICYmICR7dGhpcy5maWVsZC5GaWx0ZXJzfWA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gVXNlICdmaWVsZC5GaWx0ZXJzJyBkaXJlY3RseSBpZiAncGFyYW1zLmZpbHRlcnMnIGRvZXNuJ3QgZXhpc3QuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2ZpZWxkLkZpbHRlcnMnIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gJ2dyb3VwLicgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGFjdHVhbCB2YWx1ZXMuXHJcbiAgICBpZiAodGhpcy5maWVsZC5GaWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIikuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkpIHtcclxuICAgICAgY29uc3QgZmlsdGVyS2V5VmFsUGFpcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnMuc3BsaXQoXCIgXCIpO1xyXG4gICAgICBjb25zdCBncnBWYWx1ZXMgPSBmaWx0ZXJLZXlWYWxQYWlycy5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQudHJpbSgpLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpO1xyXG5cclxuICAgICAgZ3JwVmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbFZhbCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh2YWwsIHRoaXMuZ3JwKTtcclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gdGhpcy5wYXJhbXMuZmlsdGVycy5yZXBsYWNlKHZhbCwgYWN0dWFsVmFsKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZpbHRlciBwYXJhbWV0ZXJzIGluIHRoZSAncGFyYW1zLmZpbHRlclBhcmFtcycgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkWydGaWx0ZXJQYXJhbXMnXScuIGZpbHRlclBhcmFtcyA9PT0gdXNlZCBmb3IgdGhlIGlucHV0IGluIHRoZSBjb2x1bW4gZmlsdGVyIGF0IHRoZSBVSS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zKCkge1xyXG4gICAgY29uc3QgZmlsdGVyUGFyYW1zID0gdGhpcy5maWVsZFsnRmlsdGVyUGFyYW1zJ107XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXIgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJQYXJhbXMuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIHN0YXJ0cyB3aXRoIFwiZ3JvdXAuXCIsIGV4dGVuZCB0aGUgZXhpc3RpbmcgYXJyYXkuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW1xyXG4gICAgICAgICAgLi4udGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLFxyXG4gICAgICAgICAgLi4uWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpbHRlclBhcmFtcywgdGhpcy5ncnApXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBJZiAnZmlsdGVyUGFyYW1zJyBkb2VzIG5vdCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICBmaWx0ZXJQYXJhbXNcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGNvbHVtbiBmaWx0ZXJzIGluIHRoZSBncmlkIHN0YXRlIGFuZCBhcHBlbmQgdG8gZmlsdGVycGFyYW0gXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU/LmZpbHRlcj8uZmlsdGVycykge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5maWx0ZXI/LmZpbHRlcnM/LmZvckVhY2goKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclBhcmFtID0ge1xyXG4gICAgICAgICAga2V5OiBmaWx0ZXIuZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGZpbHRlci52YWx1ZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGEgZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICBjb25zdCBleGlzdGluZ1BhcmFtID0gdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLmZpbmQoKHBhcmFtKSA9PiBwYXJhbS5rZXkgPT09IGZpbHRlclBhcmFtLmtleSk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nUGFyYW0pIHtcclxuICAgICAgICAgIC8vIElmIGEgZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSBleGlzdHMsIHVwZGF0ZSBpdHMgdmFsdWUuXHJcbiAgICAgICAgICBleGlzdGluZ1BhcmFtLnZhbHVlID0gZmlsdGVyUGFyYW0udmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIG5vIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXksIGFkZCBpdCB0byB0aGUgZmlsdGVyIHBhcmFtZXRlcnMuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgc29ydGluZyBvcmRlciBpbiB0aGUgJ3BhcmFtcy5zb3J0T3JkZXInIHByb3BlcnR5IGJhc2VkIG9uICdmaWVsZC5Tb3J0T3JkZXInLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRTb3J0aW5nKCkge1xyXG4gICAgY29uc3Qgc29ydE9yZGVyID0gdGhpcy5maWVsZC5Tb3J0T3JkZXI7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ3NvcnRPcmRlcicgaXMgZGVmaW5lZCBhbmQgc3RhcnRzIHdpdGggXCJncm91cC5cIi5cclxuICAgIGlmIChzb3J0T3JkZXIgJiYgc29ydE9yZGVyLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHNvcnRPcmRlciwgdGhpcy5ncnApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIElmICdzb3J0T3JkZXInIGlzIG5vdCBkZWZpbmVkIG9yIGRvZXNuJ3Qgc3RhcnQgd2l0aCBcImdyb3VwLlwiLCB1c2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBzb3J0IHBhcmFtZXRlcnMgaWYgdW5kZWZpbmVkLlxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5zb3J0T3JkZXJzKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMgPSBbXTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5zb3J0KSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmRpcikge1xyXG4gICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgICAgY29uc3Qgc29ydENvbHVtbk5hbWUgPSBmaWVsZC52YWx1ZUV4cHIgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnZhbHVlRXhwciA6IGRlc2NyaXB0b3IuZmllbGQ7XHJcblxyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvcnRDb2x1bW5JbmRleCA9IHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5maW5kSW5kZXgoKG5hbWUpID0+IG5hbWUgPT09IHNvcnRDb2x1bW5OYW1lKTtcclxuXHJcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIElmIGEgc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0cywgdXBkYXRlIGl0cyBzb3J0IG9yZGVyLlxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzW2V4aXN0aW5nU29ydENvbHVtbkluZGV4XSA9IGRlc2NyaXB0b3IuZGlyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSWYgbm8gc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lLCBhZGQgaXQgdG8gdGhlIHNvcnQgY29sdW1ucyBhbmQgc29ydCBvcmRlcnMuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5wdXNoKHNvcnRDb2x1bW5OYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBncmFudCB0eXBlIGluIHRoZSAncGFyYW1zLmdyYW50VHlwZScgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkLkdyYW50VHlwZScuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEdyYW50VHlwZSgpIHtcclxuICAgIGNvbnN0IGdyYW50VHlwZSA9IHRoaXMuZmllbGQuR3JhbnRUeXBlO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdncmFudFR5cGUnIGlzIGRlZmluZWQuXHJcbiAgICBpZiAoZ3JhbnRUeXBlKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmdyYW50VHlwZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShncmFudFR5cGUudG9TdHJpbmcoKSwgdGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSAnaGlkZGVuJyBwcm9wZXJ0eSBmb3IgY29sdW1ucyBpbiAnZ3JpZFNldHRpbmcnIGJhc2VkIG9uICdjb2x1bW5Db25maWdzJy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7WkdyaWRDb2x1bW5Db25maWdzW119IGNvbHVtbkNvbmZpZ3MgLSBUaGUgY29sdW1uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRIaWRkZW5Db2x1bW4oY29sdW1uQ29uZmlnczogWkdyaWRDb2x1bW5Db25maWdzW10pIHtcclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMgJiYgY29sdW1uQ29uZmlncykge1xyXG4gICAgICAvLyBGaWx0ZXIgb3V0IGhpZGRlbiBjb2x1bW5zIGluICdjb2x1bW5Db25maWdzJy5cclxuICAgICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IGNvbHVtbkNvbmZpZ3MuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaGlkZGVuID09PSB0cnVlKTtcclxuXHJcbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBoaWRkZW4gY29sdW1ucyBhbmQgdXBkYXRlICdncmlkU2V0dGluZycgYWNjb3JkaW5nbHkuXHJcbiAgICAgIGhpZGRlbkNvbHVtbnMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gaGlkZGVuQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICBpZiAoY29sdW1uKSB7XHJcbiAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZGF0YSBmb3IgZGF0YSBiaW5kaW5nLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBza2lwVXNlQ2FjaGUgLSBXaGV0aGVyIHRvIHNraXAgdXNpbmcgY2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREYXRhQmluZGluZyhza2lwVXNlQ2FjaGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcblxyXG4gICAgLy8gY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgLy8gaWYgKCFjYWNoZUluZm8gfHwgc2tpcFVzZUNhY2hlKSB7XHJcbiAgICAvLyAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGlmIChjYWNoZUluZm8pIHtcclxuICAgIC8vICAgY29uc3QgZ3JpZFN0YXRlTG9naWMgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUxvZ2ljKHRoaXMuZmllbGQpO1xyXG4gICAgLy8gICBpZiAoZ3JpZFN0YXRlTG9naWMgPT09IEdyaWRTdGF0ZUxvZ2ljVHlwZS5TZXR0aW5nT25seSkge1xyXG4gICAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgICByZXR1cm47XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBjb21tZW50IG91dCBvbiAyMDI0MTAwMS4gZGVmYXVsdCB0byBmZXRjaCB0aGUgZGF0YSBmcm9tIGFwaSBpbnN0ZWFkIG9mIGxvYWRpbmcgZnJvbXQgaGUgY2FjaGUuXHJcbiAgICAvLyBpZiAoIXRoaXMuY2hhbmdlRXZlbnQucGFnZUNoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuc29ydENoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgLy8gICBjb25zdCBjdXJyZW50RGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICAvLyAgIGNvbnN0IHJlc3VsdCA9IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkoY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhQ2FjaGVJbmZvLm9mZmxpbmVEYXRhYmFzZUtleSk7XHJcbiAgICAvLyAgIGlmIChyZXN1bHQpIHtcclxuICAgIC8vICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUocmVzdWx0LmRhdGEsIHRydWUpO1xyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBncmlkIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEdyaWREYXRhKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgaWYgKCF0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdHcmlkIHBhZ2luYXRpb24gQVBJIFVSTCBpcyB1bmRlZmluZWQuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdGF0ZVNraXAgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNraXAgOiB0aGlzLnN0YXRlLnNraXA7XHJcbiAgICAgIGNvbnN0IHN0YXRlVGFrZSA9IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUudGFrZSA6IHRoaXMuc3RhdGUudGFrZTtcclxuXHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKHN0YXRlU2tpcCwgc3RhdGVUYWtlKTtcclxuICAgICAgdGhpcy5wYXJhbXMucGFnZVNpemUgPSBzdGF0ZVRha2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZC5FeHRlcm5hbFBhZ2luYXRpb24pIHtcclxuICAgICAgICAvLyBGb3IgUE9TVCBtZXRob2QgUGFnZSBXZWJBUEkgXHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlXHJcbiAgICAgICAgICAucG9zdEFwaSh0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsLCB0aGlzLnBhcmFtcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzcCkgPT4gdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHJlc3ApLFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXCJFcnJvciBvY2N1ciBpbiBsb2FkaW5nIHRoZSBkYXRhXCIsIFwibWlkZGxlXCIsIGZhbHNlLCAxNTAwLCBcImRhbmdlclwiKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBGb3IgR0VUIG1ldGhvZFxyXG4gICAgICAgIHRoaXMud2ViYXBpU2VydmljZVxyXG4gICAgICAgICAgLmdldEFwaSh0aGlzLnJlc291cmNlVVJMLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwLmRhdGFTZXQpIHtcclxuICAgICAgICAgICAgICBkYXRhID0gcmVzcC5kYXRhU2V0O1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSByZXNwLnRvdGFsQ291bnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IHJlc3A7XHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHJlc3AubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoeyBkYXRhU2V0OiBkYXRhLCB0b3RhbENvdW50OiB0b3RhbENvdW50IH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zdCBkYXRhU2V0ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZmllbGQuRGF0YVNvdXJjZSxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5kYXRhID0gZGF0YVNldDtcclxuICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICB0aGlzLm5vdGlmeURhdGFDaGFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShkYXRhOiBhbnksIHNraXBDYWNoZURhdGE/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmFnZ3JlZ2F0ZUhhbmRsaW5nKGRhdGEuZGF0YVNldCk7XHJcbiAgICB0aGlzLmdyaWQuZGF0YSA9IHsgZGF0YTogZGF0YS5kYXRhU2V0LCB0b3RhbDogZGF0YS50b3RhbENvdW50IH07XHJcbiAgICBpZiAoIXNraXBDYWNoZURhdGEpIHtcclxuICAgICAgY29uc3Qgc3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcbiAgICAgIGlmIChzdGF0ZUxvZ2ljID09PSBTdGF0ZVR5cGUuY2FjaGVkRGF0YVNldHRpbmcgfHwgc3RhdGVMb2dpYyA9PT0gU3RhdGVUeXBlLnNhdmVkQW5kQ2FjaGVkRGF0YVNldHRpbmcpIHtcclxuICAgICAgICB0aGlzLmNhY2hlR3JpZERhdGEoc3RhdGVMb2dpYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFmdGVyRGF0YUJpbmRlZChkYXRhKTtcclxuICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgIHRoaXMubm90aWZ5RGF0YUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENoYW5nZUV2ZW50RmxhZygpIHtcclxuICAgIHRoaXMuY2hhbmdlRXZlbnQgPSB7XHJcbiAgICAgIHBhZ2VDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgZmlsdGVyQ2hhbmdlZDogZmFsc2UsXHJcbiAgICAgIHNvcnRDaGFuZ2VkOiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZUdyaWREYXRhKHN0YXRlTG9naWM6IFN0YXRlVHlwZSkge1xyXG4gICAgY29uc3QgY2FjaGVOYW1lID0gdGhpcy5zdGF0ZVNldHRpbmdTZXJ2aWNlLmdldFN0b3JhZ2VDYWNoZUtleShzdGF0ZUxvZ2ljLCB0aGlzLmZpZWxkKTtcclxuICAgIGNvbnN0IGdyaWRTdGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlO1xyXG4gICAgY29uc3QgZ3JpZERhdGEgPSB0aGlzLmdyaWQ/LmRhdGEgfHwgbnVsbDtcclxuXHJcbiAgICBpZiAoIWdyaWREYXRhWydkYXRhJ10pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAgIGlmIChjYWNoZUluZm8gJiYgIWNhY2hlSW5mby5EaXNhYmxlQ2FjaGVEYXRhKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkNvbmZpZ3VyYXRpb25zID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1uc0NvbmZpZyh0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZy5jb2x1bW5zKTtcclxuICAgICAgbGV0IHVwZGF0ZWREYXRhID0gWy4uLmdyaWREYXRhWydkYXRhJ11dO1xyXG4gICAgICBsZXQgc2tpcExpc3QgPSBbZ3JpZFN0YXRlLnNraXBdO1xyXG4gICAgICBsZXQgY3VycmVudEdyaWRTa2lwID0gZ3JpZFN0YXRlLnNraXA7XHJcblxyXG4gICAgICBjb25zdCBjYWNoZUdyaWREYXRhID0ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGRhdGFTZXQ6IHVwZGF0ZWREYXRhLFxyXG4gICAgICAgICAgdG90YWxDb3VudDogZ3JpZERhdGFbJ3RvdGFsJ11cclxuICAgICAgICB9LFxyXG4gICAgICAgIGdyaWRTdGF0ZTogZ3JpZFN0YXRlLFxyXG4gICAgICAgIHNraXBMaXN0OiBza2lwTGlzdCxcclxuICAgICAgICBjYWNoZUR1cmF0aW9uOiBjYWNoZUluZm8uQ2FjaGVEdXJhdGlvbixcclxuICAgICAgICBjb2x1bW5Db25maWd1cmF0aW9uczogY29sdW1uQ29uZmlndXJhdGlvbnNcclxuICAgICAgfVxyXG5cclxuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShjYWNoZU5hbWUsIEpTT04uc3RyaW5naWZ5KGNhY2hlR3JpZERhdGEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vXCJGZWF0dXJlRGV2ZWxvcG1lbnR8Q29tcGV0ZW5jeVwiIFxyXG4gIC8vIGNvbW1lbnRlZCBvdXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UgYW5kIHJlLWRldmVsb3AuXHJcbiAgLy8gcHJpdmF0ZSBhc3luYyBzdWJzY3JpYmVDYWNoZURhdGFDaGFuZ2VzKCkge1xyXG4gIC8vICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gIC8vICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAvLyAgICAgLy8gY2Fubm90IHVzZSBtYWluIHNlcnZpY2UgaGVyZS4gd2lsbCBnZXQgY2lyY3VsYXIgZXJyb3Igd2hlbiBidWlsZCBsaWJcclxuICAvLyAgICAgLy90aGlzLm1haW5TZXJ2aWNlLmpvaW5Qcm9qZWN0U2lnbmFsUigpO1xyXG5cclxuICAvLyAgICAgY29uc3QgY2FsbEJhY2tGdW5jdGlvbiA9IGAke2NhY2hlSW5mby5OYW1lfV9oYW5kbGVSZWNlaXZlZE1lc3NhZ2VgO1xyXG5cclxuICAvLyAgICAgLy8gY3JlYXRlIGFuZCBiaW5kIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJhY2sgZm9yIHRoZSBncmlkIGluIHRoZSBncm91cCB0cmlnZ2VyIGJ5IHNpZ25hbFIuXHJcbiAgLy8gICAgIGlmICghdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcikge1xyXG4gIC8vICAgICAgIHRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIgPSB7fTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICB0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyW2NhbGxCYWNrRnVuY3Rpb25dID0gdGhpcy5oYW5kbGVSZWNlaXZlZE1lc3NhZ2UuYmluZCh0aGlzKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGdlbmVyYXRlZENhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgLy8gICAgIGlmIChnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZERhdGFiYXNlICYmIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkVGFibGUpIHtcclxuICAvLyAgICAgICBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZERhdGFiYXNlLmZvckVhY2goZGIgPT4ge1xyXG4gIC8vICAgICAgICAgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWRUYWJsZS5mb3JFYWNoKHRhYmxlID0+IHtcclxuICAvLyAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gYCR7ZGJ9fCR7dGFibGV9YDtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coYExpc3RlbmluZyB0byBldmVudCBuYW1lOiAke2V2ZW50TmFtZX1gKTtcclxuICAvLyAgICAgICAgICAgdGhpcy5zaWduYWxyU2VydmljZS5zdWJzY3JpYmVUb0V2ZW50KHRoaXMuZ3JwLCBgJHtldmVudE5hbWV9YCwgYGdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIuJHtjYWxsQmFja0Z1bmN0aW9ufWApO1xyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGFzeW5jIGhhbmRsZVJlY2VpdmVkTWVzc2FnZShncm91cDogWkdyb3VwLCByZXN1bHQ6IGFueSwgZXZlbnROYW1lOiBzdHJpbmcpIHtcclxuICAvLyAgIGNvbnNvbGUubG9nKGBUaGUgU2lnbmFsciB0cmlnZ2VyIGhhcyBiZWVuIGRldGVjdGVkLiBOb3csIHByb2NlZWQgdG8gdXBkYXRlIHRoZSBjYWNoZSBhbmQgZ3JpZCBkYXRhLmApO1xyXG5cclxuICAvLyAgIGNvbnN0IHJlc3BvbnNlZFJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcclxuICAvLyAgIGNvbnN0IGFjdGlvblR5cGUgPSByZXNwb25zZWRSZXN1bHQuQWN0aW9uO1xyXG4gIC8vICAgY29uc3QgcmVzcG9uc2VkUmVzdWx0SWQgPSByZXNwb25zZWRSZXN1bHRbJ0lkJ107XHJcbiAgLy8gICBjb25zdCB0ZW1wUGFyYW1zID0gWkNvbXBvbmVudEhlbHBlci5kZWVwQ2xvbmUodGhpcy5wYXJhbXMpO1xyXG4gIC8vICAgY29uc3QgY3VycmVudERhdGFDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gIC8vICAgY29uc3QgY3VycmVudERhdGEgPSBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UuZ2V0SXRlbUJ5S2V5KGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG5cclxuICAvLyAgIGlmIChjdXJyZW50RGF0YSkge1xyXG4gIC8vICAgICB0ZW1wUGFyYW1zLmZpbHRlcnMgPSBgSWQ9JHtyZXNwb25zZWRSZXN1bHRJZH1gO1xyXG5cclxuICAvLyAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuRGVsZXRlKSB7XHJcbiAgLy8gICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0ID0gY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LmZpbHRlcihpdGVtID0+IGl0ZW0uSWQgIT09IHBhcnNlSW50KHJlc3BvbnNlZFJlc3VsdElkKSk7XHJcblxyXG4gIC8vICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuICAvLyAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAvLyAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlLnBvc3RBcGkodGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCwgdGVtcFBhcmFtcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSkuc3Vic2NyaWJlKGFzeW5jIHJlc3AgPT4ge1xyXG5cclxuICAvLyAgICAgICAgIGNvbnN0IGRhdGFiYXNlUmVjb3JkID0gcmVzcC5kYXRhU2V0WzBdO1xyXG5cclxuICAvLyAgICAgICAgIGlmIChkYXRhYmFzZVJlY29yZCkge1xyXG4gIC8vICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbmRleFRvVXBkYXRlID0gY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uSWQgPT09IGRhdGFiYXNlUmVjb3JkLklkKTtcclxuICAvLyAgICAgICAgICAgICBpZiAoaW5kZXhUb1VwZGF0ZSAhPT0gLTEpIHtcclxuICAvLyAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgdXBkYXRlZCBuYW1lXHJcbiAgLy8gICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkSXRlbSA9IHsgLi4uY3VycmVudERhdGEuZGF0YS5kYXRhU2V0W2luZGV4VG9VcGRhdGVdLCAuLi5kYXRhYmFzZVJlY29yZCB9O1xyXG5cclxuICAvLyAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG9sZCBpdGVtIHdpdGggdGhlIHVwZGF0ZWQgb25lXHJcbiAgLy8gICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXRbaW5kZXhUb1VwZGF0ZV0gPSB1cGRhdGVkSXRlbTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkl0ZW0gbm90IGZvdW5kIHdpdGggSUQ6XCIsIGRhdGFiYXNlUmVjb3JkLklkKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5BZGQgJiYgY3VycmVudERhdGEuZ3JpZFN0YXRlLnNraXAgPCAyMCkge1xyXG4gIC8vICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC51bnNoaWZ0KGRhdGFiYXNlUmVjb3JkKTtcclxuICAvLyAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcbiAgLy8gICAgICAgICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBlbHNlIHtcclxuICAvLyAgICAgICAgICAgLy8gVW5hYmxlIHRvIGdldCBkYXRhLCByZWZyZXNoIHRoZSB3aG9sZSBncmlkIGRhdGEgZnJvbSBBUElcclxuICAvLyAgICAgICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBlbHNlIHtcclxuICAvLyAgICAgLy8gVW5hYmxlIHRvIGdldCBmcm9tIGluZGV4ZWREQiBzdHJhaWdodCBnZXQgZnJvbSBBUElcclxuICAvLyAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRhdGFCaW5kZWQoZGF0YSkge1xyXG4gICAgLy8gYWxsb3cgdG8gY2FsbCBiYWNrIHByb2plY3QgcGFnZSBhZnRlciBkYXRhIGJpbmRlZC5cclxuICAgIGxldCBiaW5kZWRWYWx1ZSA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGFbJ0FmdGVyRGF0YUJpbmRlZCddO1xyXG4gICAgaWYgKGJpbmRlZFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IG1lID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcyk7XHJcbiAgICAgIGxldCBjYWxsRnVuYztcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gYmluZGVkVmFsdWUubWF0Y2goL1xcYlxcKC4qL2dpKTtcclxuICAgICAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgICAgICBiaW5kZWRWYWx1ZSA9IGJpbmRlZFZhbHVlLnJlcGxhY2UocGFyYW1zWzBdLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmluZGVkVmFsdWUgPSBiaW5kZWRWYWx1ZS5yZXBsYWNlKCdtb2RhbEdyb3VwLicsICdncm91cC4nKTtcclxuICAgICAgICBjYWxsRnVuYyA9IGV2YWwoJ21lLnpncmlkYmluZGluZy4nICsgYmluZGVkVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICAgIFwiID4gRXJyb3I6IFwiLFxyXG4gICAgICAgICAgZXJyb3JcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgICAgbmV3RnVuYyhldmVudCwgbWUuemdyaWRiaW5kaW5nLmRhdGEsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJEYXRhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLmRhdGEgPSB7IGRhdGE6IFtdLCB0b3RhbDogMCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGNvbHVtbiBhZ2dyZWdhdGlvbiBmb3IgdGhlIGdpdmVuIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueVtdfSBkYXRhIC0gVGhlIGRhdGEgdG8gYWdncmVnYXRlLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlSGFuZGxpbmcoZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBhZ2dyZWdhdGVDb2x1bW5zID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmFnZ3JlZ2F0ZVR5cGUpO1xyXG5cclxuICAgIGFnZ3JlZ2F0ZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IGNvbC5maWVsZDtcclxuICAgICAgY29uc3QgYWdncmVnYXRlVHlwZSA9IGNvbC5hZ2dyZWdhdGVUeXBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnOicsICcnKTtcclxuXHJcbiAgICAgIGxldCBhZ2dyZWdhdGVWYWx1ZSA9IG51bGw7XHJcbiAgICAgIHN3aXRjaCAoYWdncmVnYXRlVHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJ0b3RhbFwiOlxyXG4gICAgICAgIGNhc2UgXCJzdW1cIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJhdmVyYWdlXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKCh0b3RhbCwgbmV4dCkgPT4gdG90YWwgKyBuZXh0W2ZpZWxkXSwgMCkgLyBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJjb3VudFwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtYXhcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdID4gY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1pblwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgocCwgYykgPT4gcFtmaWVsZF0gPCBjW2ZpZWxkXSA/IHAgOiBjKVtmaWVsZF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gYWdncmVnYXRlVmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGFnZ3JlZ2F0ZSB2YWx1ZXMgZm9yIGNvbHVtbnMgd2l0aCBhZ2dyZWdhdGUgdHlwZXMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGFnZ3JlZ2F0ZVJlc2V0VmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhZ2dyZWdhdGVDb2x1bW5zID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmFnZ3JlZ2F0ZVR5cGUpO1xyXG4gICAgYWdncmVnYXRlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBwYWdlIGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGFnZUNoYW5nZUV2ZW50fSBldmVudCAtIFRoZSBwYWdlIGNoYW5nZSBldmVudC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgcGFnZUNoYW5nZShldmVudDogUGFnZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSB0aGlzLmdldFBhZ2VObyhldmVudC5za2lwLCB0aGlzLnBhcmFtcy5wYWdlU2l6ZSk7XHJcbiAgICB0aGlzLnN0YXRlLnNraXAgPSBldmVudC5za2lwO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5wYWdlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgc29ydCBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NvcnREZXNjcmlwdG9yW119IHNvcnQgLSBUaGUgc29ydCBkZXNjcmlwdG9yIGFycmF5LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzb3J0Q2hhbmdlKHNvcnQ6IFNvcnREZXNjcmlwdG9yW10pOiB2b2lkIHtcclxuICAgIHRoaXMuc29ydCA9IHNvcnQ7XHJcbiAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMgPSBbXTtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMgPSBbXTtcclxuXHJcbiAgICBzb3J0LmZvckVhY2goKGRlc2NyaXB0b3I6IFNvcnREZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgIGlmIChkZXNjcmlwdG9yLmRpcikge1xyXG4gICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMucHVzaChkZXNjcmlwdG9yLmRpcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBkZXNjcmlwdG9yLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBzb3J0Q29sdW1uTmFtZSA9IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmllbGQudmFsdWVFeHByIDogZGVzY3JpcHRvci5maWVsZDtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLnB1c2goc29ydENvbHVtbk5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2hhbmdlRXZlbnQuc29ydENoYW5nZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGZpbHRlciBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gZXZlbnQgLSBUaGUgZmlsdGVyIGNoYW5nZSBldmVudC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgZmlsdGVyQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IDA7XHJcbiAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXTtcclxuICAgIHRoaXMuc2V0RmlsdGVyUGFyYW1zQnlQYXJlbnRSZWZJZCgpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgIGlmIChldmVudCAmJiBldmVudC5maWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZXZlbnQuZmlsdGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLmZpZWxkID09PSBpdGVtLmZpZWxkKTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0udmFsdWUgPT09IG51bGwgPyBcIlwiIDogaXRlbS52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0uZmlsdGVycykge1xyXG4gICAgICAgICAgaXRlbS5maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbTogWkdyaWRGaWx0ZXJQYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAga2V5OiBmaWx0ZXIuZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXIudmFsdWUgPT09IG51bGwgPyBcIlwiIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbTogWkdyaWRGaWx0ZXJQYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIGtleTogaXRlbS5maWVsZCxcclxuICAgICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGl0ZW0ub3BlcmF0b3IpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnZhbHVlRXhwcikge1xyXG4gICAgICAgICAgICBmaWx0ZXJQYXJhbS5rZXkgPSB0aGlzLnpncmlkYmluZGluZy5kYXRhWydGaWx0ZXJXaXRob3V0QnJhY2tldCddID8gYCR7ZmllbGQudmFsdWVFeHByfWAgOiBgKCR7ZmllbGQudmFsdWVFeHByfSlgO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uPy5PbkNoYW5nZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlIHRyaWdnZXJlZFwiKTtcclxuICAgICAgLy8gVXNlIHN3aXRjaE1hcCB0byBoYW5kbGUgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25cclxuICAgICAgb2YodGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKS5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoZmlsdGVyUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gZnJvbSB0aGUgY29uZmlndXJhdGlvblxyXG4gICAgICAgICAgbGV0IGV4cHJlc3Npb24gPSB0aGlzLmZpZWxkLkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlO1xyXG5cclxuICAgICAgICAgIC8vIFJlcGxhY2UgJ21vZGFsR3JvdXAuJyB3aXRoICdncm91cC4nIGFuZCAnZ3JvdXAuJyB3aXRoICdncnAuJ1xyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSgvbW9kYWxHcm91cFxcLi9nLCAnZ3JvdXAuJykucmVwbGFjZSgvZ3JvdXBcXC4vZywgJ2dycC4nKTtcclxuXHJcbiAgICAgICAgICAvLyBFbnN1cmUgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggJ3RoaXMuJyB0byBhdm9pZCBhY2Nlc3NpbmcgZ2xvYmFsIHNjb3BlXHJcbiAgICAgICAgICBpZiAoIWV4cHJlc3Npb24uc3RhcnRzV2l0aCgndGhpcy4nKSkge1xyXG4gICAgICAgICAgICBleHByZXNzaW9uID0gYHRoaXMuJHtleHByZXNzaW9ufWA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVuYyA9IGV2YWwoZXhwcmVzc2lvbik7XHJcbiAgICAgICAgICBpZiAoIWZ1bmMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5sb2coYCR7ZXhwcmVzc2lvbn0gbm90IGZvdW5kIGluIHRoaXMgc2NvcGUgZm9yICR7dGhpcy5maWVsZC5OYW1lfSBncmlkLmApO1xyXG5cclxuICAgICAgICAgICAgLy8gU2luY2UgZnVuY3Rpb24gbm90IGZvdW5kLCB3ZSByZXR1cm4gdGhlIG9yaWdpbmFsIHBhcmFtcy5cclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgY2FsbEZ1bmMgPSBmdW5jLmJpbmQodGhpcy5ncnApO1xyXG5cclxuICAgICAgICAgIHJldHVybiBjYWxsRnVuYyhmaWx0ZXJQYXJhbXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCh1cGRhdGVkRmlsdGVyUGFyYW1zOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgZmlsdGVyUGFyYW1zXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IHVwZGF0ZWRGaWx0ZXJQYXJhbXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2VcclxuICAgICAgdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRhdGFTdGF0ZUNoYW5nZShzdGF0ZTogRGF0YVN0YXRlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID0gc3RhdGU7XHJcbiAgICB0aGlzLmFnZ3JlZ2F0ZVJlc2V0VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcCBmaWx0ZXIgb3BlcmF0b3IgdG8gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0b3IgLSBUaGUgZmlsdGVyIG9wZXJhdG9yLlxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIG1hcHBlZCBmaWx0ZXIgb3BlcmF0b3IgdmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJPcGVyYXRvcihvcGVyYXRvcjogYW55KSB7XHJcbiAgICBjb25zdCBvcGVyYXRvck1hcHBpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICBcImVxXCI6IFwiZXFcIixcclxuICAgICAgXCJuZXFcIjogXCJuZXFcIixcclxuICAgICAgXCJsdFwiOiBcImx0XCIsXHJcbiAgICAgIFwibHRlXCI6IFwibHRlXCIsXHJcbiAgICAgIFwiZ3RcIjogXCJndFwiLFxyXG4gICAgICBcImd0ZVwiOiBcImd0ZVwiLFxyXG4gICAgICBcInN0YXJ0c3dpdGhcIjogXCJzdGFydHN3aXRoXCIsXHJcbiAgICAgIFwiZW5kc3dpdGhcIjogXCJlbmRzd2l0aFwiLFxyXG4gICAgICBcImlzbnVsbFwiOiBcImlzbnVsbFwiLFxyXG4gICAgICBcImlzbm90bnVsbFwiOiBcImlzbm90bnVsbFwiLFxyXG4gICAgfTtcclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIFwiY29udGFpbnNcIlxyXG4gICAgaWYgKG9wZXJhdG9yID09PSBcImNvbnRhaW5zXCIgJiYgIXRoaXMuZmllbGRbJ0ZpbHRlckNvbnRhaW5zVXNpbmdFcXVhbCddKSB7XHJcbiAgICAgIHJldHVybiBcImNvbnRhaW5zXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBtYXBwZWQgb3BlcmF0b3Igb3IgZGVmYXVsdCB0byBcIj09XCJcclxuICAgIHJldHVybiBvcGVyYXRvck1hcHBpbmdzW29wZXJhdG9yXSB8fCBcIj09XCI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhZ2VObyhzdGF0ZVNraXA6IG51bWJlciwgc3RhdGVUYWtlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBzdGF0ZVNraXAgLyBzdGF0ZVRha2U7XHJcbiAgfVxyXG5cclxuICAvLyBjb2x1bW5GaWVsZCA9IGRhdGE6IEFycmF5PFpGaWVsZD4sXHJcbiAgLy8gY29sdW1ucyA9IGdyaWRDb2x1bW5zOiBhbnlbXSxcclxuICAvLyBncm91cCA9IGdyb3VwOiBaR3JvdXAsXHJcbiAgLy8gY29sdW1uQ29uZmlndXJhdGlvbnMgPSBncmlkU2V0dGluZ3M/OiBaR3JpZENvbHVtblNldHRpbmdzW10sXHJcbiAgLy8gZ2VuZXJhdGVIaWRkZW5Db2x1bW5zID0gdXNhYmxlQ29sdW1ucz86IGFueVtdLFxyXG4gIC8vIGdyaWRBdHRyaWJ1dGVzID0gZ3JpZEZpZWxkPzogWkZpZWxkXHJcblxyXG4gIHB1YmxpYyBzZXRDb2x1bW5zKGNvbHVtbnM6IGFueVtdKSB7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbkZpZWxkID0gY29sdW1ucztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnModGhpcy5ncmlkU2V0dGluZyk7XHJcblxyXG4gICAgdGhpcy5sb2dnaW5nU2VydmljZS5kZWJ1Z0xvZygnZ2VuZXJhdGVkIGdyaWQgY29sdW1ucycsIHRoaXMuZ3JpZFNldHRpbmcpO1xyXG4gIH1cclxufVxyXG4iXX0=