mmhglobal-dynamicform 2.36.0 → 2.36.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,12 +10,13 @@ import { ZComponentHelper, StateType } from "mmhglobal-zcore";
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "mmhglobal-zcore";
12
12
  import * as i2 from "./zgrid.service";
13
+ import * as i3 from "../services/zcomponent.service";
13
14
  export class ZGridBindingDirective extends DataBindingDirective {
14
15
  constructor(grid, // Injecting GridComponent provides access to the scope and context of the GridComponent.
15
16
  webapiService, toastService,
16
17
  //private mainService: MainService,
17
18
  //private offlineDatabaseService: OfflineDatabaseService,
18
- signalrService, gridService, loggingService, stateSettingService) {
19
+ signalrService, gridService, loggingService, stateSettingService, componentService) {
19
20
  super(grid);
20
21
  this.webapiService = webapiService;
21
22
  this.toastService = toastService;
@@ -23,6 +24,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
23
24
  this.gridService = gridService;
24
25
  this.loggingService = loggingService;
25
26
  this.stateSettingService = stateSettingService;
27
+ this.componentService = componentService;
26
28
  this.changeEvent = {
27
29
  pageChanged: false,
28
30
  filterChanged: false,
@@ -489,6 +491,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
489
491
  }
490
492
  handleGetDataBindingComplete(data, skipCacheData) {
491
493
  this.aggregateHandling(data.dataSet);
494
+ this.handleDateTimeIgnoringTimeZone(data.dataSet);
492
495
  this.grid.data = { data: data.dataSet, total: data.totalCount };
493
496
  if (!skipCacheData) {
494
497
  const stateLogic = this.gridService.getGridStateLogic(this.field);
@@ -673,6 +676,23 @@ export class ZGridBindingDirective extends DataBindingDirective {
673
676
  col.aggregateValue = aggregateValue;
674
677
  });
675
678
  }
679
+ handleDateTimeIgnoringTimeZone(dataSet) {
680
+ // Column types related to date and time handling
681
+ const dateColumnTypes = ['zdate', 'ztime', 'zdatetime', 'zshortdate', 'zuidatetime', 'zuitime'];
682
+ // Filter columns that have date-related types
683
+ const dateTimeColumns = this.gridSetting.columns.filter(col => dateColumnTypes.includes(col.Type));
684
+ // Filter columns where the timezone should be ignored
685
+ const ignoreTimeZoneColumns = dateTimeColumns.filter(col => col.IsIgnoreTimeZone);
686
+ // If there are columns that should ignore the timezone
687
+ if (ignoreTimeZoneColumns.length > 0) {
688
+ dataSet.forEach(data => {
689
+ ignoreTimeZoneColumns.forEach(col => {
690
+ // Adjust datetime based on the timezone ignoring setting
691
+ data[col.Value] = this.componentService.localizeDateTimeByIgnoringTimeZone(data[col.Value], col);
692
+ });
693
+ });
694
+ }
695
+ }
676
696
  /**
677
697
  * Reset aggregate values for columns with aggregate types.
678
698
  *
@@ -837,7 +857,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
837
857
  this.loggingService.debugLog('generated grid columns', this.gridSetting);
838
858
  }
839
859
  }
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 });
860
+ 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 }, { token: i3.ZComponentService }], target: i0.ɵɵFactoryTarget.Directive });
841
861
  ZGridBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.3", type: ZGridBindingDirective, selector: "[zgridbinding]", inputs: { zgridbinding: "zgridbinding" }, usesInheritance: true, ngImport: i0 });
842
862
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, decorators: [{
843
863
  type: Directive,
@@ -847,7 +867,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
847
867
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
848
868
  type: Inject,
849
869
  args: [GridComponent]
850
- }] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }, { type: i1.StateSettingService }]; }, propDecorators: { zgridbinding: [{
870
+ }] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }, { type: i1.StateSettingService }, { type: i3.ZComponentService }]; }, propDecorators: { zgridbinding: [{
851
871
  type: Input
852
872
  }] } });
853
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQXlDLE1BQU0sOEJBQThCLENBQUM7QUFLMUgseURBQXlEO0FBQ3pELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNWLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDbkMseURBQXlEO0lBQ2pELGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCLEVBQzlCLG1CQUF3QztRQUVoRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFUSixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUcxQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWM7UUFDekIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFoRTFDLGdCQUFXLEdB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QUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixZQUFZLEVBQUUsWUFBWTtZQUMxQixVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsUUFBUTtZQUNsQixXQUFXLEVBQUUsV0FBVztTQUN6QixDQUFDO1FBQ0YscUNBQXFDO1FBQ3JDLElBQUksUUFBUSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRTtZQUN0RSxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUVELGdEQUFnRDtRQUNoRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDcEQsT0FBTyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtJQUN6QiwrREFBK0Q7SUFDL0QsaURBQWlEO0lBQ2pELHNDQUFzQztJQUUvQixVQUFVLENBQUMsT0FBYztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDdkMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsQ0FBQzs7a0hBcitCVSxxQkFBcUIsa0JBeUR0QixhQUFhO3NHQXpEWixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjs7MEJBMERJLE1BQU07MkJBQUMsYUFBYTswTkFsRGQsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBEYXRhQmluZGluZ0RpcmVjdGl2ZSwgR3JpZENvbXBvbmVudCwgRGF0YVN0YXRlQ2hhbmdlRXZlbnQsIFBhZ2VDaGFuZ2VFdmVudCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkXCI7XHJcbmltcG9ydCB7IFNvcnREZXNjcmlwdG9yLCBGaWx0ZXJEZXNjcmlwdG9yLCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBaR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi96Z3JpZC5zZXJ2aWNlXCI7XHJcbi8vaW1wb3J0IHsgTWFpblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvbWFpbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudEhlbHBlciwgWkZpZWxkLCBaR3JpZFBvc3RBcGlQYXJhbXMsXHJcbiAgV2ViQXBpU2VydmljZSwgWkdyb3VwLCBUb2FzdFNlcnZpY2UsIFNpZ25hbHJTZXJ2aWNlLCBBY3Rpb25UeXBlLCBaR3JpZENvbHVtbkNvbmZpZ3MsIFpHcmlkU2V0dGluZ3MsIExvZ2dpbmdTZXJ2aWNlLCBaR3JpZEZpbHRlclBhcmFtcyxcclxuICBTdGF0ZVR5cGUsIFN0YXRlU2V0dGluZ1NlcnZpY2VcclxufSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcblxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiW3pncmlkYmluZGluZ11cIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFpHcmlkQmluZGluZ0RpcmVjdGl2ZSBleHRlbmRzIERhdGFCaW5kaW5nRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSB7XHJcbiAgICBwYWdlQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgIHNvcnRDaGFuZ2VkOiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgemdyaWRiaW5kaW5nOiB7XHJcbiAgICBkYXRhOiBaRmllbGQ7XHJcbiAgICBncm91cDogWkdyb3VwO1xyXG4gICAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXM7XHJcbiAgICBncmlkU3ViamVjdDogU3ViamVjdDxhbnk+O1xyXG4gICAgZ3JpZFNldHRpbmc6IFpHcmlkU2V0dGluZ3M7XHJcbiAgfTtcclxuXHJcbiAgLy9zdGF0ZTogU3RhdGUgPSB7XHJcbiAgLy8gIHNraXA6IDAsXHJcbiAgLy8gIHRha2U6IDEwLFxyXG4gIC8vfTtcclxuXHJcbiAgLy9ncmlkQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgLy91c2FibGVDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICByZXNvdXJjZVVSTCA9IG51bGw7XHJcblxyXG4gIHBhZ2luYXRpb25BcGlQb3N0VXJsID0gbnVsbDtcclxuXHJcbiAgZGF0YVNvdXJjZSA9IG51bGw7XHJcblxyXG4gIGdldCBncmlkU2V0dGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZztcclxuICB9XHJcbiAgc2V0IGdyaWRTZXR0aW5nKHZhbHVlKSB7XHJcbiAgICB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZyA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgZmllbGQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YTtcclxuICB9XHJcblxyXG4gIGdldCBncnAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXA7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JpZFN1YmplY3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFyYW1zKCk6IFpHcmlkUG9zdEFwaVBhcmFtcyB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcucGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLmRhdGE7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoR3JpZENvbXBvbmVudCkgZ3JpZCwgLy8gSW5qZWN0aW5nIEdyaWRDb21wb25lbnQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzY29wZSBhbmQgY29udGV4dCBvZiB0aGUgR3JpZENvbXBvbmVudC5cclxuICAgIHByaXZhdGUgd2ViYXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICAvL3ByaXZhdGUgbWFpblNlcnZpY2U6IE1haW5TZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG9mZmxpbmVEYXRhYmFzZVNlcnZpY2U6IE9mZmxpbmVEYXRhYmFzZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpZ25hbHJTZXJ2aWNlOiBTaWduYWxyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFpHcmlkU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9nZ2luZ1NlcnZpY2U6IExvZ2dpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdGF0ZVNldHRpbmdTZXJ2aWNlOiBTdGF0ZVNldHRpbmdTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihncmlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZmllbGQuUGFnZVNpemUgfHwgMjA7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmZpZWxkLkRhdGFTb3VyY2UgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLnJlc291cmNlVVJMID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZmllbGQuUmVzb3VyY2VVUkwsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZXNvdXJjZVVSTCkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuTmFtZSAhPT0gXCJBY3Rpdml0eUxvZ0dyaWRcIikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICBcIk5vIGluaXRpYWxpc2UgZm9yIEZpZWxkLlJlc291cmNlVVJMOiBcIixcclxuICAgICAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldFJlc291cmNlVXJsKHRoaXMucmVzb3VyY2VVUkwpO1xyXG5cclxuICAgICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQuRGlzYWJsZUdlbmVyYXRlQ29sdW1uQnlGb3JtKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcywgdGhpcy5ncnApO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1uRmllbGRzKSkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sdW1ucyhjb2x1bW5GaWVsZHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVHcmlkQ29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmV0cmlldmVHcmlkU3RhdGVDYWNoZShzdGF0ZVR5cGU6IFN0YXRlVHlwZSwgZmllbGQ6IFpGaWVsZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkU2VydmljZS5nZXRTdGF0ZUNhY2hlKHN0YXRlVHlwZSwgZmllbGQpLnBpcGUoXHJcbiAgICAgIG1hcCgoc2V0dGluZ0NhY2hlVmFsdWUpID0+IHtcclxuICAgICAgICAvLyBJZiBzZXR0aW5nQ2FjaGVWYWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCwgY29udGludWUgd2l0aCBhIGZhbGxiYWNrIHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHNldHRpbmdDYWNoZVZhbHVlO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChzZXR0aW5nQ2FjaGVWYWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmIChzZXR0aW5nQ2FjaGVWYWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyc2VkSnNvbkRhdGEgPSBzZXR0aW5nQ2FjaGVWYWx1ZSBhcyBaR3JpZFNldHRpbmdzO1xyXG4gICAgICAgICAgaWYgKHBhcnNlZEpzb25EYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID0gcGFyc2VkSnNvbkRhdGEuZ3JpZFN0YXRlID8/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbkNvbmZpZ3VyYXRpb25zID0gcGFyc2VkSnNvbkRhdGEuY29sdW1uQ29uZmlndXJhdGlvbnMgPz8gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlc291cmNlVXJsKHJlc291cmNlVXJsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGFycmF5ID0gcmVzb3VyY2VVcmwuc3BsaXQoXCIvYXBpL1wiKTtcclxuICAgIGlmICghIWFycmF5WzFdKSB7XHJcbiAgICAgIGFycmF5WzFdID0gXCJQYWdlXCIgKyBhcnJheVsxXTtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCA9IGFycmF5LmpvaW4oXCIvYXBpL1wiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IHRoaXMucmVzb3VyY2VVUkwuc3BsaXQoXCIvXCIpO1xyXG4gICAgICBhcnJbYXJyLmxlbmd0aCAtIDJdID0gXCJQYWdlXCIgKyBhcnJbYXJyLmxlbmd0aCAtIDJdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyLmpvaW4oXCIvXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCkge1xyXG4gICAgLy8gVXNlIGZpZWxkIG93biByZWZlcmVuY2VJZCBpZiBhdmFpbGFibGVcclxuICAgIGNvbnN0IHJlZklkID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZUlkKCkgfHwgdGhpcy5ncnAucmVmZXJlbmNlSWQ7XHJcbiAgICBjb25zdCByZWZGaWVsZCA9IHRoaXMuZmllbGQuUmVmZXJlbmNlRmllbGQgfHwgdGhpcy5ncnAucGFyZW50UmVmZXJlbmNlRmllbGQ7XHJcbiAgICBpZiAocmVmSWQgJiYgcmVmRmllbGQpIHtcclxuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB7XHJcbiAgICAgICAga2V5OiByZWZGaWVsZCxcclxuICAgICAgICBvcHM6IFwiPVwiLFxyXG4gICAgICAgIHZhbHVlOiByZWZJZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHtcclxuICAgIGxldCBmaWVsZFJlZmVyZW5jZUlkID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmZpZWxkLlJlZmVyZW5jZUlkKSB7XHJcbiAgICAgIGZpZWxkUmVmZXJlbmNlSWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZWZlcmVuY2VJZCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkUmVmZXJlbmNlSWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVHcmlkQ29sdW1ucygpIHtcclxuICAgIGNvbnN0IGNvbHVtbkZpZWxkcyQ6IE9ic2VydmFibGU8YW55PiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgdGhpcy5maWVsZC5Db2x1bW5GaWVsZHMsXHJcbiAgICAgIHRoaXMuZ3JwXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjb2x1bW5GaWVsZHMkKSB7XHJcbiAgICAgIGNvbHVtbkZpZWxkcyQucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuXHJcbiAgICAgICAgICBpZiAoZ3JpZFN0YXRlTG9naWMgJiYgZ3JpZFN0YXRlTG9naWMgIT09IFN0YXRlVHlwZS5jYWNoZWREYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXRyaWV2ZUdyaWRTdGF0ZUNhY2hlKFN0YXRlVHlwZS5zYXZlZFNldHRpbmcsIHRoaXMuZmllbGQpLnBpcGUoXHJcbiAgICAgICAgICAgICAgbWFwKChzdGF0ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gb2YoZGF0YSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdyaWRTZXR0aW5nLCAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGNvbHVtbkZpZWxkOiBkYXRhLFxyXG4gICAgICAgICAgICBncm91cDogdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXBcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKHRoaXMuZ3JpZFNldHRpbmcpO1xyXG4gICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5kZWJ1Z0xvZygnZ2VuZXJhdGVkIGdyaWQgY29sdW1ucycsIHRoaXMuZ3JpZFNldHRpbmcpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyUGFyYW1zQ29sdW1ucygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXIoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyUGFyYW1zKCk7XHJcbiAgICAgICAgICB0aGlzLmdldFNvcnRpbmcoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0R3JhbnRUeXBlKCk7XHJcbiAgICAgICAgICB0aGlzLnNldEhpZGRlbkNvbHVtbih0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbkNvbmZpZ3VyYXRpb25zKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5yZWZlcklkID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZUlkKCkgfHwgdGhpcy5ncnAucmVmZXJlbmNlSWQgfHwgbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10pIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdGYWlsIHRvIGdlbmVyYXRlIGdyaWQgY29sdW1uIGZpZWxkcy4nKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5maWVsZC5Db2x1bW5GaWVsZHMpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2tpcExvYWRSZXNvdXJjZVVSTERhdGEoc2V0dGluZ1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddID0gIXNldHRpbmdWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgdGl0bGUgb2YgYSBjb2x1bW4gaW4gdGhlIGdyaWQgc2V0dGluZyBiYXNlZCBvbiBpdHMgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiB0byB1cGRhdGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbE5hbWUgLSBUaGUgbmV3IHRpdGxlIGZvciB0aGUgY29sdW1uLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRDb2x1bW5OYW1lKGNvbFZhbHVlOiBzdHJpbmcsIGNvbE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gRmluZCB0aGUgY29sdW1uIHdpdGggdGhlIG1hdGNoaW5nIGNvbFZhbHVlLlxyXG4gICAgY29uc3QgY29sdW1uVG9VcGRhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChmaWVsZCA9PiBmaWVsZC5WYWx1ZSA9PT0gY29sVmFsdWUpO1xyXG5cclxuICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgZm91bmQsIHVwZGF0ZSBpdHMgdGl0bGUgcHJvcGVydHkgd2l0aCBjb2xOYW1lLlxyXG4gICAgaWYgKGNvbHVtblRvVXBkYXRlKSB7XHJcbiAgICAgIGNvbHVtblRvVXBkYXRlLnRpdGxlID0gY29sTmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdmlzaWJpbGl0eSBvZiBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBiYXNlZCBvbiBpdHMgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiB0byBzZXQgdmlzaWJpbGl0eSBmb3IuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBpc1Zpc2libGUgLSBXaGV0aGVyIHRoZSBjb2x1bW4gc2hvdWxkIGJlIHZpc2libGUgKHRydWUpIG9yIGhpZGRlbiAoZmFsc2UpLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRDb2x1bW5WaXNpYmxlKGNvbFZhbHVlOiBzdHJpbmcsIGlzVmlzaWJsZTogYm9vbGVhbikge1xyXG4gICAgLy8gRmluZCB0aGUgY29sdW1uIHdpdGggdGhlIG1hdGNoaW5nIGNvbFZhbHVlLlxyXG4gICAgY29uc3QgY29sdW1uVG9VcGRhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChmaWVsZCA9PiBmaWVsZC5WYWx1ZSA9PT0gY29sVmFsdWUpO1xyXG5cclxuICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgZm91bmQsIHVwZGF0ZSBpdHMgJ2hpZGRlbicgcHJvcGVydHkgYmFzZWQgb24gJ2lzVmlzaWJsZScuXHJcbiAgICBpZiAoY29sdW1uVG9VcGRhdGUpIHtcclxuICAgICAgY29sdW1uVG9VcGRhdGUuaGlkZGVuID0gIWlzVmlzaWJsZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGZpbHRlciBwYXJhbWV0ZXJzIGZvciBjb2x1bW5zIGFuZCBzZXQgdGhlbSBpbiB0aGUgJ3BhcmFtcycgb2JqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXNDb2x1bW5zKCkge1xyXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIHN0b3JlIGNvbHVtbiBmaWVsZHMuXHJcbiAgICBjb25zdCBjb2xGaWVsZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGdyaWQgY29sdW1ucyB0byBidWlsZCBjb2x1bW4gZmllbGQgc3RyaW5ncy5cclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi52YWx1ZUV4cHIpIHtcclxuICAgICAgICAvLyBJZiAndmFsdWVFeHByJyBleGlzdHMsIHVzZSBpdCBhcyBhbiBhbGlhcyBmb3IgdGhlIGZpZWxkLlxyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGNvbHVtbi52YWx1ZUV4cHIgKyBcIiBhcyBcIiArIGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goY29sdW1uLmZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ0lkJyBpcyBpbiB0aGUgY29sdW1uIGZpZWxkczsgaWYgbm90LCBhZGQgaXQuXHJcbiAgICBpZiAoY29sRmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKGNvbEZpZWxkcy5pbmRleE9mKFwiSWRcIikgPT09IC0xKSB7XHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goXCJJZFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgZ2VuZXJhdGVkIGNvbHVtbiBmaWVsZHMuXHJcbiAgICBjb25zdCB0bXBHcmlkQ29sdW1uOiBhbnlbXSA9IFtdO1xyXG4gICAgdG1wR3JpZENvbHVtbi5wdXNoKGNvbEZpZWxkcy5qb2luKFwiLFwiKSk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIGdlbmVyYXRlSGlkZGVuQ29sdW1ucyBpbiB0aGUgc2V0dGluZywgYWRkIHRoZW0gdG8gdGhlIGFycmF5LlxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ2VuZXJhdGVIaWRkZW5Db2x1bW5zPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRtcEdyaWRDb2x1bW4ucHVzaCh0aGlzLmdyaWRTZXR0aW5nLmdlbmVyYXRlSGlkZGVuQ29sdW1ucy5qb2luKFwiLFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2V0IHRoZSAncGFyYW1zLmNvbHVtbnMnIHByb3BlcnR5IHdpdGggdGhlIGNvbmNhdGVuYXRlZCBjb2x1bW4gZmllbGRzLlxyXG4gICAgdGhpcy5wYXJhbXMuY29sdW1ucyA9IHRtcEdyaWRDb2x1bW4uam9pbihcIixcIik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlICdwYXJhbXMuZmlsdGVycycgcHJvcGVydHkgYmFzZWQgb24gdGhlICdmaWVsZC5GaWx0ZXJzJyBwcm9wZXJ0eS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyKCkge1xyXG4gICAgaWYgKHRoaXMucGFyYW1zLmZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzKSB7XHJcbiAgICAgIC8vIENvbWJpbmUgJ3BhcmFtcy5maWx0ZXJzJyBhbmQgJ2ZpZWxkLkZpbHRlcnMnIHVzaW5nICcmJicgaWYgYm90aCBleGlzdC5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IGAke3RoaXMucGFyYW1zLmZpbHRlcnN9ICYmICR7dGhpcy5maWVsZC5GaWx0ZXJzfWA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gVXNlICdmaWVsZC5GaWx0ZXJzJyBkaXJlY3RseSBpZiAncGFyYW1zLmZpbHRlcnMnIGRvZXNuJ3QgZXhpc3QuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2ZpZWxkLkZpbHRlcnMnIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gJ2dyb3VwLicgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGFjdHVhbCB2YWx1ZXMuXHJcbiAgICBpZiAodGhpcy5maWVsZC5GaWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIikuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkpIHtcclxuICAgICAgY29uc3QgZmlsdGVyS2V5VmFsUGFpcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnMuc3BsaXQoXCIgXCIpO1xyXG4gICAgICBjb25zdCBncnBWYWx1ZXMgPSBmaWx0ZXJLZXlWYWxQYWlycy5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQudHJpbSgpLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpO1xyXG5cclxuICAgICAgZ3JwVmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbFZhbCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh2YWwsIHRoaXMuZ3JwKTtcclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gdGhpcy5wYXJhbXMuZmlsdGVycy5yZXBsYWNlKHZhbCwgYWN0dWFsVmFsKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZpbHRlciBwYXJhbWV0ZXJzIGluIHRoZSAncGFyYW1zLmZpbHRlclBhcmFtcycgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkWydGaWx0ZXJQYXJhbXMnXScuIGZpbHRlclBhcmFtcyA9PT0gdXNlZCBmb3IgdGhlIGlucHV0IGluIHRoZSBjb2x1bW4gZmlsdGVyIGF0IHRoZSBVSS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zKCkge1xyXG4gICAgY29uc3QgZmlsdGVyUGFyYW1zID0gdGhpcy5maWVsZFsnRmlsdGVyUGFyYW1zJ107XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXIgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJQYXJhbXMuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIHN0YXJ0cyB3aXRoIFwiZ3JvdXAuXCIsIGV4dGVuZCB0aGUgZXhpc3RpbmcgYXJyYXkuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW1xyXG4gICAgICAgICAgLi4udGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLFxyXG4gICAgICAgICAgLi4uWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpbHRlclBhcmFtcywgdGhpcy5ncnApXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBJZiAnZmlsdGVyUGFyYW1zJyBkb2VzIG5vdCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICBmaWx0ZXJQYXJhbXNcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGNvbHVtbiBmaWx0ZXJzIGluIHRoZSBncmlkIHN0YXRlIGFuZCBhcHBlbmQgdG8gZmlsdGVycGFyYW1cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZT8uZmlsdGVyPy5maWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLmZpbHRlcj8uZmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUGFyYW0gPSB7XHJcbiAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZmlsdGVyLm9wZXJhdG9yKSxcclxuICAgICAgICAgIHZhbHVlOiBmaWx0ZXIudmFsdWUgPT09IG51bGwgPyBcIlwiIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGFyYW0gPSB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMuZmluZCgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0gZmlsdGVyUGFyYW0ua2V5KTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdQYXJhbSkge1xyXG4gICAgICAgICAgLy8gSWYgYSBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5IGV4aXN0cywgdXBkYXRlIGl0cyB2YWx1ZS5cclxuICAgICAgICAgIGV4aXN0aW5nUGFyYW0udmFsdWUgPSBmaWx0ZXJQYXJhbS52YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gSWYgbm8gZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSwgYWRkIGl0IHRvIHRoZSBmaWx0ZXIgcGFyYW1ldGVycy5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBzb3J0aW5nIG9yZGVyIGluIHRoZSAncGFyYW1zLnNvcnRPcmRlcicgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkLlNvcnRPcmRlcicuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldFNvcnRpbmcoKSB7XHJcbiAgICBjb25zdCBzb3J0T3JkZXIgPSB0aGlzLmZpZWxkLlNvcnRPcmRlcjtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnc29ydE9yZGVyJyBpcyBkZWZpbmVkIGFuZCBzdGFydHMgd2l0aCBcImdyb3VwLlwiLlxyXG4gICAgaWYgKHNvcnRPcmRlciAmJiBzb3J0T3JkZXIuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoc29ydE9yZGVyLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgJ3NvcnRPcmRlcicgaXMgbm90IGRlZmluZWQgb3IgZG9lc24ndCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyID0gc29ydE9yZGVyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHNvcnQgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLnNvcnRPcmRlcnMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnQpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydC5mb3JFYWNoKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gZGVzY3JpcHRvci5maWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1uTmFtZSA9IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmllbGQudmFsdWVFeHByIDogZGVzY3JpcHRvci5maWVsZDtcclxuXHJcbiAgICAgICAgICAvLyBDaGVjayBpZiBhIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU29ydENvbHVtbkluZGV4ID0gdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLmZpbmRJbmRleCgobmFtZSkgPT4gbmFtZSA9PT0gc29ydENvbHVtbk5hbWUpO1xyXG5cclxuICAgICAgICAgIGlmIChleGlzdGluZ1NvcnRDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gSWYgYSBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLCB1cGRhdGUgaXRzIHNvcnQgb3JkZXIuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnNbZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXhdID0gZGVzY3JpcHRvci5kaXI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBubyBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUsIGFkZCBpdCB0byB0aGUgc29ydCBjb2x1bW5zIGFuZCBzb3J0IG9yZGVycy5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLnB1c2goc29ydENvbHVtbk5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZGVzY3JpcHRvci5kaXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGdyYW50IHR5cGUgaW4gdGhlICdwYXJhbXMuZ3JhbnRUeXBlJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGQuR3JhbnRUeXBlJy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R3JhbnRUeXBlKCkge1xyXG4gICAgY29uc3QgZ3JhbnRUeXBlID0gdGhpcy5maWVsZC5HcmFudFR5cGU7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2dyYW50VHlwZScgaXMgZGVmaW5lZC5cclxuICAgIGlmIChncmFudFR5cGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmdyYW50VHlwZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShncmFudFR5cGUudG9TdHJpbmcoKSwgdGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSAnaGlkZGVuJyBwcm9wZXJ0eSBmb3IgY29sdW1ucyBpbiAnZ3JpZFNldHRpbmcnIGJhc2VkIG9uICdjb2x1bW5Db25maWdzJy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7WkdyaWRDb2x1bW5Db25maWdzW119IGNvbHVtbkNvbmZpZ3MgLSBUaGUgY29sdW1uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRIaWRkZW5Db2x1bW4oY29sdW1uQ29uZmlnczogWkdyaWRDb2x1bW5Db25maWdzW10pIHtcclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMgJiYgY29sdW1uQ29uZmlncykge1xyXG4gICAgICAvLyBGaWx0ZXIgb3V0IGhpZGRlbiBjb2x1bW5zIGluICdjb2x1bW5Db25maWdzJy5cclxuICAgICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IGNvbHVtbkNvbmZpZ3MuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaGlkZGVuID09PSB0cnVlKTtcclxuXHJcbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBoaWRkZW4gY29sdW1ucyBhbmQgdXBkYXRlICdncmlkU2V0dGluZycgYWNjb3JkaW5nbHkuXHJcbiAgICAgIGhpZGRlbkNvbHVtbnMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gaGlkZGVuQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICBpZiAoY29sdW1uKSB7XHJcbiAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZGF0YSBmb3IgZGF0YSBiaW5kaW5nLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBza2lwVXNlQ2FjaGUgLSBXaGV0aGVyIHRvIHNraXAgdXNpbmcgY2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREYXRhQmluZGluZyhza2lwVXNlQ2FjaGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcblxyXG4gICAgLy8gY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgLy8gaWYgKCFjYWNoZUluZm8gfHwgc2tpcFVzZUNhY2hlKSB7XHJcbiAgICAvLyAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGlmIChjYWNoZUluZm8pIHtcclxuICAgIC8vICAgY29uc3QgZ3JpZFN0YXRlTG9naWMgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUxvZ2ljKHRoaXMuZmllbGQpO1xyXG4gICAgLy8gICBpZiAoZ3JpZFN0YXRlTG9naWMgPT09IEdyaWRTdGF0ZUxvZ2ljVHlwZS5TZXR0aW5nT25seSkge1xyXG4gICAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgICByZXR1cm47XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBjb21tZW50IG91dCBvbiAyMDI0MTAwMS4gZGVmYXVsdCB0byBmZXRjaCB0aGUgZGF0YSBmcm9tIGFwaSBpbnN0ZWFkIG9mIGxvYWRpbmcgZnJvbXQgaGUgY2FjaGUuXHJcbiAgICAvLyBpZiAoIXRoaXMuY2hhbmdlRXZlbnQucGFnZUNoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuc29ydENoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgLy8gICBjb25zdCBjdXJyZW50RGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICAvLyAgIGNvbnN0IHJlc3VsdCA9IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkoY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhQ2FjaGVJbmZvLm9mZmxpbmVEYXRhYmFzZUtleSk7XHJcbiAgICAvLyAgIGlmIChyZXN1bHQpIHtcclxuICAgIC8vICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUocmVzdWx0LmRhdGEsIHRydWUpO1xyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBncmlkIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEdyaWREYXRhKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgaWYgKCF0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdHcmlkIHBhZ2luYXRpb24gQVBJIFVSTCBpcyB1bmRlZmluZWQuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdGF0ZVNraXAgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNraXAgOiB0aGlzLnN0YXRlLnNraXA7XHJcbiAgICAgIGNvbnN0IHN0YXRlVGFrZSA9IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUudGFrZSA6IHRoaXMuc3RhdGUudGFrZTtcclxuXHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKHN0YXRlU2tpcCwgc3RhdGVUYWtlKTtcclxuICAgICAgdGhpcy5wYXJhbXMucGFnZVNpemUgPSBzdGF0ZVRha2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZC5FeHRlcm5hbFBhZ2luYXRpb24pIHtcclxuICAgICAgICAvLyBGb3IgUE9TVCBtZXRob2QgUGFnZSBXZWJBUElcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5wb3N0QXBpKHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwsIHRoaXMucGFyYW1zLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXNwKSA9PiB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUocmVzcCksXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIkVycm9yIG9jY3VyIGluIGxvYWRpbmcgdGhlIGRhdGFcIiwgXCJtaWRkbGVcIiwgZmFsc2UsIDE1MDAsIFwiZGFuZ2VyXCIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEZvciBHRVQgbWV0aG9kXHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QXBpKHRoaXMucmVzb3VyY2VVUkwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHRvdGFsQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3AuZGF0YVNldCkge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwLmRhdGFTZXQ7XHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHJlc3AudG90YWxDb3VudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhID0gcmVzcDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZSh7IGRhdGFTZXQ6IGRhdGEsIHRvdGFsQ291bnQ6IHRvdGFsQ291bnQgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IGRhdGFTZXQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5EYXRhU291cmNlLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmRhdGEgPSBkYXRhU2V0O1xyXG4gICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIHRoaXMubm90aWZ5RGF0YUNoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGRhdGE6IGFueSwgc2tpcENhY2hlRGF0YT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuYWdncmVnYXRlSGFuZGxpbmcoZGF0YS5kYXRhU2V0KTtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBkYXRhLmRhdGFTZXQsIHRvdGFsOiBkYXRhLnRvdGFsQ291bnQgfTtcclxuICAgIGlmICghc2tpcENhY2hlRGF0YSkge1xyXG4gICAgICBjb25zdCBzdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKHN0YXRlTG9naWMgPT09IFN0YXRlVHlwZS5jYWNoZWREYXRhU2V0dGluZyB8fCBzdGF0ZUxvZ2ljID09PSBTdGF0ZVR5cGUuc2F2ZWRBbmRDYWNoZWREYXRhU2V0dGluZykge1xyXG4gICAgICAgIHRoaXMuY2FjaGVHcmlkRGF0YShzdGF0ZUxvZ2ljKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWZ0ZXJEYXRhQmluZGVkKGRhdGEpO1xyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlRXZlbnRGbGFnKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IHtcclxuICAgICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlR3JpZERhdGEoc3RhdGVMb2dpYzogU3RhdGVUeXBlKSB7XHJcbiAgICBjb25zdCBjYWNoZU5hbWUgPSB0aGlzLnN0YXRlU2V0dGluZ1NlcnZpY2UuZ2V0U3RvcmFnZUNhY2hlS2V5KHN0YXRlTG9naWMsIHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZ3JpZFN0YXRlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuZ3JpZD8uZGF0YSB8fCBudWxsO1xyXG5cclxuICAgIGlmICghZ3JpZERhdGFbJ2RhdGEnXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAgICAgY29uc3QgY29sdW1uQ29uZmlndXJhdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zQ29uZmlnKHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTZXR0aW5nLmNvbHVtbnMpO1xyXG4gICAgICBsZXQgdXBkYXRlZERhdGEgPSBbLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgIGxldCBza2lwTGlzdCA9IFtncmlkU3RhdGUuc2tpcF07XHJcbiAgICAgIGxldCBjdXJyZW50R3JpZFNraXAgPSBncmlkU3RhdGUuc2tpcDtcclxuXHJcbiAgICAgIGNvbnN0IGNhY2hlR3JpZERhdGEgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YVNldDogdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICB0b3RhbENvdW50OiBncmlkRGF0YVsndG90YWwnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZFN0YXRlOiBncmlkU3RhdGUsXHJcbiAgICAgICAgc2tpcExpc3Q6IHNraXBMaXN0LFxyXG4gICAgICAgIGNhY2hlRHVyYXRpb246IGNhY2hlSW5mby5DYWNoZUR1cmF0aW9uLFxyXG4gICAgICAgIGNvbHVtbkNvbmZpZ3VyYXRpb25zOiBjb2x1bW5Db25maWd1cmF0aW9uc1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGNhY2hlTmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FjaGVHcmlkRGF0YSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cIkZlYXR1cmVEZXZlbG9wbWVudHxDb21wZXRlbmN5XCJcclxuICAvLyBjb21tZW50ZWQgb3V0IGZvciBmdXR1cmUgcmVmZXJlbmNlIGFuZCByZS1kZXZlbG9wLlxyXG4gIC8vIHByaXZhdGUgYXN5bmMgc3Vic2NyaWJlQ2FjaGVEYXRhQ2hhbmdlcygpIHtcclxuICAvLyAgIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAvLyAgIGlmIChjYWNoZUluZm8gJiYgIWNhY2hlSW5mby5EaXNhYmxlQ2FjaGVEYXRhKSB7XHJcbiAgLy8gICAgIC8vIGNhbm5vdCB1c2UgbWFpbiBzZXJ2aWNlIGhlcmUuIHdpbGwgZ2V0IGNpcmN1bGFyIGVycm9yIHdoZW4gYnVpbGQgbGliXHJcbiAgLy8gICAgIC8vdGhpcy5tYWluU2VydmljZS5qb2luUHJvamVjdFNpZ25hbFIoKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGNhbGxCYWNrRnVuY3Rpb24gPSBgJHtjYWNoZUluZm8uTmFtZX1faGFuZGxlUmVjZWl2ZWRNZXNzYWdlYDtcclxuXHJcbiAgLy8gICAgIC8vIGNyZWF0ZSBhbmQgYmluZCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrIGZvciB0aGUgZ3JpZCBpbiB0aGUgZ3JvdXAgdHJpZ2dlciBieSBzaWduYWxSLlxyXG4gIC8vICAgICBpZiAoIXRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIpIHtcclxuICAvLyAgICAgICB0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyID0ge307XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcltjYWxsQmFja0Z1bmN0aW9uXSA9IHRoaXMuaGFuZGxlUmVjZWl2ZWRNZXNzYWdlLmJpbmQodGhpcyk7XHJcblxyXG4gIC8vICAgICBjb25zdCBnZW5lcmF0ZWRDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gIC8vICAgICBpZiAoZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZSAmJiBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZFRhYmxlKSB7XHJcbiAgLy8gICAgICAgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZS5mb3JFYWNoKGRiID0+IHtcclxuICAvLyAgICAgICAgIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkVGFibGUuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGAke2RifXwke3RhYmxlfWA7XHJcbiAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKGBMaXN0ZW5pbmcgdG8gZXZlbnQgbmFtZTogJHtldmVudE5hbWV9YCk7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudCh0aGlzLmdycCwgYCR7ZXZlbnROYW1lfWAsIGBncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyLiR7Y2FsbEJhY2tGdW5jdGlvbn1gKTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhc3luYyBoYW5kbGVSZWNlaXZlZE1lc3NhZ2UoZ3JvdXA6IFpHcm91cCwgcmVzdWx0OiBhbnksIGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhgVGhlIFNpZ25hbHIgdHJpZ2dlciBoYXMgYmVlbiBkZXRlY3RlZC4gTm93LCBwcm9jZWVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUgYW5kIGdyaWQgZGF0YS5gKTtcclxuXHJcbiAgLy8gICBjb25zdCByZXNwb25zZWRSZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XHJcbiAgLy8gICBjb25zdCBhY3Rpb25UeXBlID0gcmVzcG9uc2VkUmVzdWx0LkFjdGlvbjtcclxuICAvLyAgIGNvbnN0IHJlc3BvbnNlZFJlc3VsdElkID0gcmVzcG9uc2VkUmVzdWx0WydJZCddO1xyXG4gIC8vICAgY29uc3QgdGVtcFBhcmFtcyA9IFpDb21wb25lbnRIZWxwZXIuZGVlcENsb25lKHRoaXMucGFyYW1zKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhID0gYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuXHJcbiAgLy8gICBpZiAoY3VycmVudERhdGEpIHtcclxuICAvLyAgICAgdGVtcFBhcmFtcy5maWx0ZXJzID0gYElkPSR7cmVzcG9uc2VkUmVzdWx0SWR9YDtcclxuXHJcbiAgLy8gICAgIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLkRlbGV0ZSkge1xyXG4gIC8vICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldCA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maWx0ZXIoaXRlbSA9PiBpdGVtLklkICE9PSBwYXJzZUludChyZXNwb25zZWRSZXN1bHRJZCkpO1xyXG5cclxuICAvLyAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMud2ViYXBpU2VydmljZS5wb3N0QXBpKHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwsIHRlbXBQYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpLnN1YnNjcmliZShhc3luYyByZXNwID0+IHtcclxuXHJcbiAgLy8gICAgICAgICBjb25zdCBkYXRhYmFzZVJlY29yZCA9IHJlc3AuZGF0YVNldFswXTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAoZGF0YWJhc2VSZWNvcmQpIHtcclxuICAvLyAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuVXBkYXRlKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgaW5kZXhUb1VwZGF0ZSA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLklkID09PSBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKGluZGV4VG9VcGRhdGUgIT09IC0xKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHVwZGF0ZWQgbmFtZVxyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSB7IC4uLmN1cnJlbnREYXRhLmRhdGEuZGF0YVNldFtpbmRleFRvVXBkYXRlXSwgLi4uZGF0YWJhc2VSZWNvcmQgfTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgaXRlbSB3aXRoIHRoZSB1cGRhdGVkIG9uZVxyXG4gIC8vICAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0W2luZGV4VG9VcGRhdGVdID0gdXBkYXRlZEl0ZW07XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCBmb3VuZCB3aXRoIElEOlwiLCBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2UgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuQWRkICYmIGN1cnJlbnREYXRhLmdyaWRTdGF0ZS5za2lwIDwgMjApIHtcclxuICAvLyAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQudW5zaGlmdChkYXRhYmFzZVJlY29yZCk7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG4gIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIC8vIFVuYWJsZSB0byBnZXQgZGF0YSwgcmVmcmVzaCB0aGUgd2hvbGUgZ3JpZCBkYXRhIGZyb20gQVBJXHJcbiAgLy8gICAgICAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIC8vIFVuYWJsZSB0byBnZXQgZnJvbSBpbmRleGVkREIgc3RyYWlnaHQgZ2V0IGZyb20gQVBJXHJcbiAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJEYXRhQmluZGVkKGRhdGEpIHtcclxuICAgIC8vIGFsbG93IHRvIGNhbGwgYmFjayBwcm9qZWN0IHBhZ2UgYWZ0ZXIgZGF0YSBiaW5kZWQuXHJcbiAgICBsZXQgYmluZGVkVmFsdWUgPSB0aGlzLnpncmlkYmluZGluZy5kYXRhWydBZnRlckRhdGFCaW5kZWQnXTtcclxuICAgIGlmIChiaW5kZWRWYWx1ZSkge1xyXG4gICAgICBjb25zdCBtZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMpO1xyXG4gICAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGJpbmRlZFZhbHVlLm1hdGNoKC9cXGJcXCguKi9naSk7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgYmluZGVkVmFsdWUgPSBiaW5kZWRWYWx1ZS5yZXBsYWNlKHBhcmFtc1swXSwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJpbmRlZFZhbHVlID0gYmluZGVkVmFsdWUucmVwbGFjZSgnbW9kYWxHcm91cC4nLCAnZ3JvdXAuJyk7XHJcbiAgICAgICAgY2FsbEZ1bmMgPSBldmFsKCdtZS56Z3JpZGJpbmRpbmcuJyArIGJpbmRlZFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkVycm9yIHdoZW4gZ2V0R3JvdXBWYWx1ZTogXCIsXHJcbiAgICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICAgIG5ld0Z1bmMoZXZlbnQsIG1lLnpncmlkYmluZGluZy5kYXRhLCBkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBbXSwgdG90YWw6IDAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBjb2x1bW4gYWdncmVnYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSAtIFRoZSBkYXRhIHRvIGFnZ3JlZ2F0ZS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGFnZ3JlZ2F0ZUhhbmRsaW5nKGRhdGE6IGFueSkge1xyXG4gICAgY29uc3QgYWdncmVnYXRlQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5hZ2dyZWdhdGVUeXBlKTtcclxuXHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSBjb2wuZmllbGQ7XHJcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVR5cGUgPSBjb2wuYWdncmVnYXRlVHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJzonLCAnJyk7XHJcblxyXG4gICAgICBsZXQgYWdncmVnYXRlVmFsdWUgPSBudWxsO1xyXG4gICAgICBzd2l0Y2ggKGFnZ3JlZ2F0ZVR5cGUpIHtcclxuICAgICAgICBjYXNlIFwidG90YWxcIjpcclxuICAgICAgICBjYXNlIFwic3VtXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKCh0b3RhbCwgbmV4dCkgPT4gdG90YWwgKyBuZXh0W2ZpZWxkXSwgMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYXZlcmFnZVwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApIC8gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiY291bnRcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWF4XCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA+IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaW5cIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdIDwgY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IGFnZ3JlZ2F0ZVZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBhZ2dyZWdhdGUgdmFsdWVzIGZvciBjb2x1bW5zIHdpdGggYWdncmVnYXRlIHR5cGVzLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVSZXNldFZhbHVlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWdncmVnYXRlQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5hZ2dyZWdhdGVUeXBlKTtcclxuICAgIGFnZ3JlZ2F0ZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb2wuYWdncmVnYXRlVmFsdWUgPSAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgcGFnZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BhZ2VDaGFuZ2VFdmVudH0gZXZlbnQgLSBUaGUgcGFnZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2VDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gdGhpcy5nZXRQYWdlTm8oZXZlbnQuc2tpcCwgdGhpcy5wYXJhbXMucGFnZVNpemUpO1xyXG4gICAgdGhpcy5zdGF0ZS5za2lwID0gZXZlbnQuc2tpcDtcclxuICAgIHRoaXMuY2hhbmdlRXZlbnQucGFnZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHNvcnQgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTb3J0RGVzY3JpcHRvcltdfSBzb3J0IC0gVGhlIHNvcnQgZGVzY3JpcHRvciBhcnJheS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc29ydENoYW5nZShzb3J0OiBTb3J0RGVzY3JpcHRvcltdKTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnQgPSBzb3J0O1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzID0gW107XHJcbiAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzID0gW107XHJcblxyXG4gICAgc29ydC5mb3JFYWNoKChkZXNjcmlwdG9yOiBTb3J0RGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICBpZiAoZGVzY3JpcHRvci5kaXIpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZGVzY3JpcHRvci5kaXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gZGVzY3JpcHRvci5maWVsZCk7XHJcbiAgICAgICAgY29uc3Qgc29ydENvbHVtbk5hbWUgPSBmaWVsZC52YWx1ZUV4cHIgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnZhbHVlRXhwciA6IGRlc2NyaXB0b3IuZmllbGQ7XHJcblxyXG4gICAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5wdXNoKHNvcnRDb2x1bW5OYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnNvcnRDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IGV2ZW50IC0gVGhlIGZpbHRlciBjaGFuZ2UgZXZlbnQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSAwO1xyXG4gICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW107XHJcbiAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuZmlsdGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGV2ZW50LmZpbHRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5maWVsZCA9PT0gaXRlbS5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGl0ZW0udmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChpdGVtLmZpbHRlcnMpIHtcclxuICAgICAgICAgIGl0ZW0uZmlsdGVycy5mb3JFYWNoKChmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyUGFyYW06IFpHcmlkRmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgIGtleTogZmlsdGVyLmZpZWxkIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZmlsdGVyLm9wZXJhdG9yKSxcclxuICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGZpbHRlci52YWx1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyUGFyYW06IFpHcmlkRmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICAgICAgICBrZXk6IGl0ZW0uZmllbGQsXHJcbiAgICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihpdGVtLm9wZXJhdG9yKSxcclxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC52YWx1ZUV4cHIpIHtcclxuICAgICAgICAgICAgZmlsdGVyUGFyYW0ua2V5ID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnRmlsdGVyV2l0aG91dEJyYWNrZXQnXSA/IGAke2ZpZWxkLnZhbHVlRXhwcn1gIDogYCgke2ZpZWxkLnZhbHVlRXhwcn0pYDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbj8uT25DaGFuZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZSB0cmlnZ2VyZWRcIik7XHJcbiAgICAgIC8vIFVzZSBzd2l0Y2hNYXAgdG8gaGFuZGxlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uXHJcbiAgICAgIG9mKHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlclBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGZyb20gdGhlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgIGxldCBleHByZXNzaW9uID0gdGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZTtcclxuXHJcbiAgICAgICAgICAvLyBSZXBsYWNlICdtb2RhbEdyb3VwLicgd2l0aCAnZ3JvdXAuJyBhbmQgJ2dyb3VwLicgd2l0aCAnZ3JwLidcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoL21vZGFsR3JvdXBcXC4vZywgJ2dyb3VwLicpLnJlcGxhY2UoL2dyb3VwXFwuL2csICdncnAuJyk7XHJcblxyXG4gICAgICAgICAgLy8gRW5zdXJlIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICd0aGlzLicgdG8gYXZvaWQgYWNjZXNzaW5nIGdsb2JhbCBzY29wZVxyXG4gICAgICAgICAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoJ3RoaXMuJykpIHtcclxuICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGB0aGlzLiR7ZXhwcmVzc2lvbn1gO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bmMgPSBldmFsKGV4cHJlc3Npb24pO1xyXG4gICAgICAgICAgaWYgKCFmdW5jKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UubG9nKGAke2V4cHJlc3Npb259IG5vdCBmb3VuZCBpbiB0aGlzIHNjb3BlIGZvciAke3RoaXMuZmllbGQuTmFtZX0gZ3JpZC5gKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIGZ1bmN0aW9uIG5vdCBmb3VuZCwgd2UgcmV0dXJuIHRoZSBvcmlnaW5hbCBwYXJhbXMuXHJcbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JwKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gY2FsbEZ1bmMoZmlsdGVyUGFyYW1zKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgodXBkYXRlZEZpbHRlclBhcmFtczogYW55W10pID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyh1cGRhdGVkRmlsdGVyUGFyYW1zKTtcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIGZpbHRlclBhcmFtc1xyXG4gICAgICAgIGlmICh1cGRhdGVkRmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSB1cGRhdGVkRmlsdGVyUGFyYW1zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIEdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlXHJcbiAgICAgIHRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkYXRhU3RhdGVDaGFuZ2Uoc3RhdGU6IERhdGFTdGF0ZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA9IHN0YXRlO1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVSZXNldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXAgZmlsdGVyIG9wZXJhdG9yIHRvIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yIC0gVGhlIGZpbHRlciBvcGVyYXRvci5cclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBtYXBwZWQgZmlsdGVyIG9wZXJhdG9yIHZhbHVlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWFwRmlsdGVyT3BlcmF0b3Iob3BlcmF0b3I6IGFueSkge1xyXG4gICAgY29uc3Qgb3BlcmF0b3JNYXBwaW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgXCJlcVwiOiBcImVxXCIsXHJcbiAgICAgIFwibmVxXCI6IFwibmVxXCIsXHJcbiAgICAgIFwibHRcIjogXCJsdFwiLFxyXG4gICAgICBcImx0ZVwiOiBcImx0ZVwiLFxyXG4gICAgICBcImd0XCI6IFwiZ3RcIixcclxuICAgICAgXCJndGVcIjogXCJndGVcIixcclxuICAgICAgXCJzdGFydHN3aXRoXCI6IFwic3RhcnRzd2l0aFwiLFxyXG4gICAgICBcImVuZHN3aXRoXCI6IFwiZW5kc3dpdGhcIixcclxuICAgICAgXCJpc251bGxcIjogXCJpc251bGxcIixcclxuICAgICAgXCJpc25vdG51bGxcIjogXCJpc25vdG51bGxcIixcclxuICAgIH07XHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBcImNvbnRhaW5zXCJcclxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJjb250YWluc1wiICYmICF0aGlzLmZpZWxkWydGaWx0ZXJDb250YWluc1VzaW5nRXF1YWwnXSkge1xyXG4gICAgICByZXR1cm4gXCJjb250YWluc1wiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiB0aGUgbWFwcGVkIG9wZXJhdG9yIG9yIGRlZmF1bHQgdG8gXCI9PVwiXHJcbiAgICByZXR1cm4gb3BlcmF0b3JNYXBwaW5nc1tvcGVyYXRvcl0gfHwgXCI9PVwiO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQYWdlTm8oc3RhdGVTa2lwOiBudW1iZXIsIHN0YXRlVGFrZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gc3RhdGVTa2lwIC8gc3RhdGVUYWtlO1xyXG4gIH1cclxuXHJcbiAgLy8gY29sdW1uRmllbGQgPSBkYXRhOiBBcnJheTxaRmllbGQ+LFxyXG4gIC8vIGNvbHVtbnMgPSBncmlkQ29sdW1uczogYW55W10sXHJcbiAgLy8gZ3JvdXAgPSBncm91cDogWkdyb3VwLFxyXG4gIC8vIGNvbHVtbkNvbmZpZ3VyYXRpb25zID0gZ3JpZFNldHRpbmdzPzogWkdyaWRDb2x1bW5TZXR0aW5nc1tdLFxyXG4gIC8vIGdlbmVyYXRlSGlkZGVuQ29sdW1ucyA9IHVzYWJsZUNvbHVtbnM/OiBhbnlbXSxcclxuICAvLyBncmlkQXR0cmlidXRlcyA9IGdyaWRGaWVsZD86IFpGaWVsZFxyXG5cclxuICBwdWJsaWMgc2V0Q29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5GaWVsZCA9IGNvbHVtbnM7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKHRoaXMuZ3JpZFNldHRpbmcpO1xyXG5cclxuICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWdMb2coJ2dlbmVyYXRlZCBncmlkIGNvbHVtbnMnLCB0aGlzLmdyaWRTZXR0aW5nKTtcclxuICB9XHJcbn1cclxuIl19
873
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQXlDLE1BQU0sOEJBQThCLENBQUM7QUFLMUgseURBQXlEO0FBQ3pELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNWLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBT3pCLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxvQkFBb0I7SUF3RDdELFlBQ3lCLElBQUksRUFBRSx5RkFBeUY7SUFDOUcsYUFBNEIsRUFDNUIsWUFBMEI7SUFDbEMsbUNBQW1DO0lBQ25DLHlEQUF5RDtJQUNqRCxjQUE4QixFQUM5QixXQUF5QixFQUN6QixjQUE4QixFQUM5QixtQkFBd0MsRUFDeEMsZ0JBQW1DO1FBRTNDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVZKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBYztRQUN6QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtR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UUFBUTtZQUNsQixXQUFXLEVBQUUsV0FBVztTQUN6QixDQUFDO1FBQ0YscUNBQXFDO1FBQ3JDLElBQUksUUFBUSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRTtZQUN0RSxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUVELGdEQUFnRDtRQUNoRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDcEQsT0FBTyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtJQUN6QiwrREFBK0Q7SUFDL0QsaURBQWlEO0lBQ2pELHNDQUFzQztJQUUvQixVQUFVLENBQUMsT0FBYztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDdkMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsQ0FBQzs7a0hBNS9CVSxxQkFBcUIsa0JBeUR0QixhQUFhO3NHQXpEWixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjs7MEJBMERJLE1BQU07MkJBQUMsYUFBYTswUEFsRGQsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBEYXRhQmluZGluZ0RpcmVjdGl2ZSwgR3JpZENvbXBvbmVudCwgRGF0YVN0YXRlQ2hhbmdlRXZlbnQsIFBhZ2VDaGFuZ2VFdmVudCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkXCI7XHJcbmltcG9ydCB7IFNvcnREZXNjcmlwdG9yLCBGaWx0ZXJEZXNjcmlwdG9yLCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBaR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi96Z3JpZC5zZXJ2aWNlXCI7XHJcbi8vaW1wb3J0IHsgTWFpblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvbWFpbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudEhlbHBlciwgWkZpZWxkLCBaR3JpZFBvc3RBcGlQYXJhbXMsXHJcbiAgV2ViQXBpU2VydmljZSwgWkdyb3VwLCBUb2FzdFNlcnZpY2UsIFNpZ25hbHJTZXJ2aWNlLCBBY3Rpb25UeXBlLCBaR3JpZENvbHVtbkNvbmZpZ3MsIFpHcmlkU2V0dGluZ3MsIExvZ2dpbmdTZXJ2aWNlLCBaR3JpZEZpbHRlclBhcmFtcyxcclxuICBTdGF0ZVR5cGUsIFN0YXRlU2V0dGluZ1NlcnZpY2VcclxufSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcbmltcG9ydCB7IFpDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZVwiO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt6Z3JpZGJpbmRpbmddXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgZXh0ZW5kcyBEYXRhQmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0ge1xyXG4gICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgZmlsdGVyQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBzb3J0Q2hhbmdlZDogZmFsc2VcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHpncmlkYmluZGluZzoge1xyXG4gICAgZGF0YTogWkZpZWxkO1xyXG4gICAgZ3JvdXA6IFpHcm91cDtcclxuICAgIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gICAgZ3JpZFN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzO1xyXG4gIH07XHJcblxyXG4gIC8vc3RhdGU6IFN0YXRlID0ge1xyXG4gIC8vICBza2lwOiAwLFxyXG4gIC8vICB0YWtlOiAxMCxcclxuICAvL307XHJcblxyXG4gIC8vZ3JpZENvbHVtbnM6IGFueVtdID0gW107XHJcblxyXG4gIC8vdXNhYmxlQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgcmVzb3VyY2VVUkwgPSBudWxsO1xyXG5cclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybCA9IG51bGw7XHJcblxyXG4gIGRhdGFTb3VyY2UgPSBudWxsO1xyXG5cclxuICBnZXQgZ3JpZFNldHRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmc7XHJcbiAgfVxyXG4gIHNldCBncmlkU2V0dGluZyh2YWx1ZSkge1xyXG4gICAgdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmcgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IGZpZWxkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRTdWJqZWN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmFtcygpOiBaR3JpZFBvc3RBcGlQYXJhbXMge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLnBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBnZXREYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEdyaWRDb21wb25lbnQpIGdyaWQsIC8vIEluamVjdGluZyBHcmlkQ29tcG9uZW50IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2NvcGUgYW5kIGNvbnRleHQgb2YgdGhlIEdyaWRDb21wb25lbnQuXHJcbiAgICBwcml2YXRlIHdlYmFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZSxcclxuICAgIC8vcHJpdmF0ZSBvZmZsaW5lRGF0YWJhc2VTZXJ2aWNlOiBPZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzaWduYWxyU2VydmljZTogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBaR3JpZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvZ2dpbmdTZXJ2aWNlOiBMb2dnaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RhdGVTZXR0aW5nU2VydmljZTogU3RhdGVTZXR0aW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5maWVsZC5QYWdlU2l6ZSB8fCAyMDtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZmllbGQuRGF0YVNvdXJjZSA/PyBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VVUkwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5OYW1lICE9PSBcIkFjdGl2aXR5TG9nR3JpZFwiKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIFwiTm8gaW5pdGlhbGlzZSBmb3IgRmllbGQuUmVzb3VyY2VVUkw6IFwiLFxyXG4gICAgICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0UmVzb3VyY2VVcmwodGhpcy5yZXNvdXJjZVVSTCk7XHJcblxyXG4gICAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5EaXNhYmxlR2VuZXJhdGVDb2x1bW5CeUZvcm0pIHtcclxuICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLCB0aGlzLmdycCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5GaWVsZHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zKGNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXRyaWV2ZUdyaWRTdGF0ZUNhY2hlKHN0YXRlVHlwZTogU3RhdGVUeXBlLCBmaWVsZDogWkZpZWxkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRTZXJ2aWNlLmdldFN0YXRlQ2FjaGUoc3RhdGVUeXBlLCBmaWVsZCkucGlwZShcclxuICAgICAgbWFwKChzZXR0aW5nQ2FjaGVWYWx1ZSkgPT4ge1xyXG4gICAgICAgIC8vIElmIHNldHRpbmdDYWNoZVZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLCBjb250aW51ZSB3aXRoIGEgZmFsbGJhY2sgdmFsdWVcclxuICAgICAgICByZXR1cm4gc2V0dGluZ0NhY2hlVmFsdWU7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHNldHRpbmdDYWNoZVZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdDYWNoZVZhbHVlKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJzZWRKc29uRGF0YSA9IHNldHRpbmdDYWNoZVZhbHVlIGFzIFpHcmlkU2V0dGluZ3M7XHJcbiAgICAgICAgICBpZiAocGFyc2VkSnNvbkRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBwYXJzZWRKc29uRGF0YS5ncmlkU3RhdGUgPz8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnMgPSBwYXJzZWRKc29uRGF0YS5jb2x1bW5Db25maWd1cmF0aW9ucyA/PyBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVzb3VyY2VVcmwocmVzb3VyY2VVcmw6IHN0cmluZykge1xyXG4gICAgY29uc3QgYXJyYXkgPSByZXNvdXJjZVVybC5zcGxpdChcIi9hcGkvXCIpO1xyXG4gICAgaWYgKCEhYXJyYXlbMV0pIHtcclxuICAgICAgYXJyYXlbMV0gPSBcIlBhZ2VcIiArIGFycmF5WzFdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyYXkuam9pbihcIi9hcGkvXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5yZXNvdXJjZVVSTC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGFyclthcnIubGVuZ3RoIC0gMl0gPSBcIlBhZ2VcIiArIGFyclthcnIubGVuZ3RoIC0gMl07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBhcnIuam9pbihcIi9cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKSB7XHJcbiAgICAvLyBVc2UgZmllbGQgb3duIHJlZmVyZW5jZUlkIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZDtcclxuICAgIGNvbnN0IHJlZkZpZWxkID0gdGhpcy5maWVsZC5SZWZlcmVuY2VGaWVsZCB8fCB0aGlzLmdycC5wYXJlbnRSZWZlcmVuY2VGaWVsZDtcclxuICAgIGlmIChyZWZJZCAmJiByZWZGaWVsZCkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHtcclxuICAgICAgICBrZXk6IHJlZkZpZWxkLFxyXG4gICAgICAgIG9wczogXCI9XCIsXHJcbiAgICAgICAgdmFsdWU6IHJlZklkLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZFJlZmVyZW5jZUlkKCkge1xyXG4gICAgbGV0IGZpZWxkUmVmZXJlbmNlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuUmVmZXJlbmNlSWQpIHtcclxuICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlZmVyZW5jZUlkLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRSZWZlcmVuY2VJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZUdyaWRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgY29sdW1uRmllbGRzJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyxcclxuICAgICAgdGhpcy5ncnBcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGNvbHVtbkZpZWxkcyQpIHtcclxuICAgICAgY29sdW1uRmllbGRzJC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZ3JpZFN0YXRlTG9naWMgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUxvZ2ljKHRoaXMuZmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChncmlkU3RhdGVMb2dpYyAmJiBncmlkU3RhdGVMb2dpYyAhPT0gU3RhdGVUeXBlLmNhY2hlZERhdGFTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJldHJpZXZlR3JpZFN0YXRlQ2FjaGUoU3RhdGVUeXBlLnNhdmVkU2V0dGluZywgdGhpcy5maWVsZCkucGlwZShcclxuICAgICAgICAgICAgICBtYXAoKHN0YXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZ3JpZFNldHRpbmcsIC8vIFByZXNlcnZlIGV4aXN0aW5nIHByb3BlcnRpZXNcclxuICAgICAgICAgICAgY29sdW1uRmllbGQ6IGRhdGEsXHJcbiAgICAgICAgICAgIGdyb3VwOiB0aGlzLnpncmlkYmluZGluZy5ncm91cFxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnModGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnTG9nKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXNDb2x1bW5zKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0U29ydGluZygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRHcmFudFR5cGUoKTtcclxuICAgICAgICAgIHRoaXMuc2V0SGlkZGVuQ29sdW1uKHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnMpO1xyXG5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLnJlZmVySWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZCB8fCBudWxsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWwgdG8gZ2VuZXJhdGUgZ3JpZCBjb2x1bW4gZmllbGRzLicpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTa2lwTG9hZFJlc291cmNlVVJMRGF0YShzZXR0aW5nVmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10gPSAhc2V0dGluZ1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSB0aXRsZSBvZiBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBzZXR0aW5nIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sTmFtZSAtIFRoZSBuZXcgdGl0bGUgZm9yIHRoZSBjb2x1bW4uXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtbk5hbWUoY29sVmFsdWU6IHN0cmluZywgY29sTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyB0aXRsZSBwcm9wZXJ0eSB3aXRoIGNvbE5hbWUuXHJcbiAgICBpZiAoY29sdW1uVG9VcGRhdGUpIHtcclxuICAgICAgY29sdW1uVG9VcGRhdGUudGl0bGUgPSBjb2xOYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgY29sdW1uIGluIHRoZSBncmlkIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHNldCB2aXNpYmlsaXR5IGZvci5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVmlzaWJsZSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgdmlzaWJsZSAodHJ1ZSkgb3IgaGlkZGVuIChmYWxzZSkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtblZpc2libGUoY29sVmFsdWU6IHN0cmluZywgaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyAnaGlkZGVuJyBwcm9wZXJ0eSBiYXNlZCBvbiAnaXNWaXNpYmxlJy5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS5oaWRkZW4gPSAhaXNWaXNpYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIGNvbHVtbnMgYW5kIHNldCB0aGVtIGluIHRoZSAncGFyYW1zJyBvYmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlclBhcmFtc0NvbHVtbnMoKSB7XHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gc3RvcmUgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IGNvbEZpZWxkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ3JpZCBjb2x1bW5zIHRvIGJ1aWxkIGNvbHVtbiBmaWVsZCBzdHJpbmdzLlxyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnZhbHVlRXhwcikge1xyXG4gICAgICAgIC8vIElmICd2YWx1ZUV4cHInIGV4aXN0cywgdXNlIGl0IGFzIGFuIGFsaWFzIGZvciB0aGUgZmllbGQuXHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goY29sdW1uLnZhbHVlRXhwciArIFwiIGFzIFwiICsgY29sdW1uLmZpZWxkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnSWQnIGlzIGluIHRoZSBjb2x1bW4gZmllbGRzOyBpZiBub3QsIGFkZCBpdC5cclxuICAgIGlmIChjb2xGaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoY29sRmllbGRzLmluZGV4T2YoXCJJZFwiKSA9PT0gLTEpIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChcIklkXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IHRtcEdyaWRDb2x1bW46IGFueVtdID0gW107XHJcbiAgICB0bXBHcmlkQ29sdW1uLnB1c2goY29sRmllbGRzLmpvaW4oXCIsXCIpKTtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSBhcmUgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zIGluIHRoZSBzZXR0aW5nLCBhZGQgdGhlbSB0byB0aGUgYXJyYXkuXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdG1wR3JpZENvbHVtbi5wdXNoKHRoaXMuZ3JpZFNldHRpbmcuZ2VuZXJhdGVIaWRkZW5Db2x1bW5zLmpvaW4oXCIsXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgdGhlICdwYXJhbXMuY29sdW1ucycgcHJvcGVydHkgd2l0aCB0aGUgY29uY2F0ZW5hdGVkIGNvbHVtbiBmaWVsZHMuXHJcbiAgICB0aGlzLnBhcmFtcy5jb2x1bW5zID0gdG1wR3JpZENvbHVtbi5qb2luKFwiLFwiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgJ3BhcmFtcy5maWx0ZXJzJyBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgJ2ZpZWxkLkZpbHRlcnMnIHByb3BlcnR5LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gQ29tYmluZSAncGFyYW1zLmZpbHRlcnMnIGFuZCAnZmllbGQuRmlsdGVycycgdXNpbmcgJyYmJyBpZiBib3RoIGV4aXN0LlxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gYCR7dGhpcy5wYXJhbXMuZmlsdGVyc30gJiYgJHt0aGlzLmZpZWxkLkZpbHRlcnN9YDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCF0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBVc2UgJ2ZpZWxkLkZpbHRlcnMnIGRpcmVjdGx5IGlmICdwYXJhbXMuZmlsdGVycycgZG9lc24ndCBleGlzdC5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMuZmllbGQuRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZmllbGQuRmlsdGVycycgY29udGFpbnMgcmVmZXJlbmNlcyB0byAnZ3JvdXAuJyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYWN0dWFsIHZhbHVlcy5cclxuICAgIGlmICh0aGlzLmZpZWxkLkZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzLnNwbGl0KFwiIFwiKS5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJLZXlWYWxQYWlycyA9IHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIik7XHJcbiAgICAgIGNvbnN0IGdycFZhbHVlcyA9IGZpbHRlcktleVZhbFBhaXJzLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSk7XHJcblxyXG4gICAgICBncnBWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsVmFsID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHZhbCwgdGhpcy5ncnApO1xyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLnBhcmFtcy5maWx0ZXJzLnJlcGxhY2UodmFsLCBhY3R1YWxWYWwpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgaW4gdGhlICdwYXJhbXMuZmlsdGVyUGFyYW1zJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGRbJ0ZpbHRlclBhcmFtcyddJy4gZmlsdGVyUGFyYW1zID09PSB1c2VkIGZvciB0aGUgaW5wdXQgaW4gdGhlIGNvbHVtbiBmaWx0ZXIgYXQgdGhlIFVJLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXMoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJQYXJhbXMgPSB0aGlzLmZpZWxkWydGaWx0ZXJQYXJhbXMnXTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGZpbHRlciBwYXJhbWV0ZXJzIGlmIHVuZGVmaW5lZC5cclxuICAgIGlmICghdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgaWYgKGZpbHRlclBhcmFtcy5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgICAgLy8gSWYgJ2ZpbHRlclBhcmFtcycgc3RhcnRzIHdpdGggXCJncm91cC5cIiwgZXh0ZW5kIHRoZSBleGlzdGluZyBhcnJheS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICAuLi5aQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZmlsdGVyUGFyYW1zLCB0aGlzLmdycClcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIGRvZXMgbm90IHN0YXJ0IHdpdGggXCJncm91cC5cIiwgdXNlIGl0IGRpcmVjdGx5LlxyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtcclxuICAgICAgICAgIC4uLnRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyxcclxuICAgICAgICAgIGZpbHRlclBhcmFtc1xyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgY29sdW1uIGZpbHRlcnMgaW4gdGhlIGdyaWQgc3RhdGUgYW5kIGFwcGVuZCB0byBmaWx0ZXJwYXJhbVxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlPy5maWx0ZXI/LmZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuZmlsdGVyPy5maWx0ZXJzPy5mb3JFYWNoKChmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbSA9IHtcclxuICAgICAgICAgIGtleTogZmlsdGVyLmZpZWxkIGFzIHN0cmluZyxcclxuICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBDaGVjayBpZiBhIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXkgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQYXJhbSA9IHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5maW5kKChwYXJhbSkgPT4gcGFyYW0ua2V5ID09PSBmaWx0ZXJQYXJhbS5rZXkpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ1BhcmFtKSB7XHJcbiAgICAgICAgICAvLyBJZiBhIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXkgZXhpc3RzLCB1cGRhdGUgaXRzIHZhbHVlLlxyXG4gICAgICAgICAgZXhpc3RpbmdQYXJhbS52YWx1ZSA9IGZpbHRlclBhcmFtLnZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiBubyBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5LCBhZGQgaXQgdG8gdGhlIGZpbHRlciBwYXJhbWV0ZXJzLlxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHNvcnRpbmcgb3JkZXIgaW4gdGhlICdwYXJhbXMuc29ydE9yZGVyJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGQuU29ydE9yZGVyJy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0U29ydGluZygpIHtcclxuICAgIGNvbnN0IHNvcnRPcmRlciA9IHRoaXMuZmllbGQuU29ydE9yZGVyO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdzb3J0T3JkZXInIGlzIGRlZmluZWQgYW5kIHN0YXJ0cyB3aXRoIFwiZ3JvdXAuXCIuXHJcbiAgICBpZiAoc29ydE9yZGVyICYmIHNvcnRPcmRlci5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlciA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShzb3J0T3JkZXIsIHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBJZiAnc29ydE9yZGVyJyBpcyBub3QgZGVmaW5lZCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggXCJncm91cC5cIiwgdXNlIGl0IGRpcmVjdGx5LlxyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBzb3J0T3JkZXI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc29ydCBwYXJhbWV0ZXJzIGlmIHVuZGVmaW5lZC5cclxuICAgIGlmICghdGhpcy5wYXJhbXMuc29ydE9yZGVycykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzID0gW107XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydCkge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5zb3J0LmZvckVhY2goKGRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICBpZiAoZGVzY3JpcHRvci5kaXIpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBkZXNjcmlwdG9yLmZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIGlmIGEgc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXggPSB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMuZmluZEluZGV4KChuYW1lKSA9PiBuYW1lID09PSBzb3J0Q29sdW1uTmFtZSk7XHJcblxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nU29ydENvbHVtbkluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAvLyBJZiBhIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBleGlzdHMsIHVwZGF0ZSBpdHMgc29ydCBvcmRlci5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyc1tleGlzdGluZ1NvcnRDb2x1bW5JbmRleF0gPSBkZXNjcmlwdG9yLmRpcjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIG5vIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSwgYWRkIGl0IHRvIHRoZSBzb3J0IGNvbHVtbnMgYW5kIHNvcnQgb3JkZXJzLlxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMucHVzaChkZXNjcmlwdG9yLmRpcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZ3JhbnQgdHlwZSBpbiB0aGUgJ3BhcmFtcy5ncmFudFR5cGUnIHByb3BlcnR5IGJhc2VkIG9uICdmaWVsZC5HcmFudFR5cGUnLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHcmFudFR5cGUoKSB7XHJcbiAgICBjb25zdCBncmFudFR5cGUgPSB0aGlzLmZpZWxkLkdyYW50VHlwZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZ3JhbnRUeXBlJyBpcyBkZWZpbmVkLlxyXG4gICAgaWYgKGdyYW50VHlwZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZ3JhbnRUeXBlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGdyYW50VHlwZS50b1N0cmluZygpLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlICdoaWRkZW4nIHByb3BlcnR5IGZvciBjb2x1bW5zIGluICdncmlkU2V0dGluZycgYmFzZWQgb24gJ2NvbHVtbkNvbmZpZ3MnLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaR3JpZENvbHVtbkNvbmZpZ3NbXX0gY29sdW1uQ29uZmlncyAtIFRoZSBjb2x1bW4gY29uZmlndXJhdGlvbiBzZXR0aW5ncy5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIHNldEhpZGRlbkNvbHVtbihjb2x1bW5Db25maWdzOiBaR3JpZENvbHVtbkNvbmZpZ3NbXSkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucyAmJiBjb2x1bW5Db25maWdzKSB7XHJcbiAgICAgIC8vIEZpbHRlciBvdXQgaGlkZGVuIGNvbHVtbnMgaW4gJ2NvbHVtbkNvbmZpZ3MnLlxyXG4gICAgICBjb25zdCBoaWRkZW5Db2x1bW5zID0gY29sdW1uQ29uZmlncy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5oaWRkZW4gPT09IHRydWUpO1xyXG5cclxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGhpZGRlbiBjb2x1bW5zIGFuZCB1cGRhdGUgJ2dyaWRTZXR0aW5nJyBhY2NvcmRpbmdseS5cclxuICAgICAgaGlkZGVuQ29sdW1ucy5mb3JFYWNoKGhpZGRlbkNvbHVtbiA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBoaWRkZW5Db2x1bW4uZmllbGQpO1xyXG4gICAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICAgIGNvbHVtbi5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBkYXRhIGZvciBkYXRhIGJpbmRpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBVc2VDYWNoZSAtIFdoZXRoZXIgdG8gc2tpcCB1c2luZyBjYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwuXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcbiAgICovXHJcbiAgcHVibGljIGdldERhdGFCaW5kaW5nKHNraXBVc2VDYWNoZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuXHJcbiAgICAvLyBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICAvLyBpZiAoIWNhY2hlSW5mbyB8fCBza2lwVXNlQ2FjaGUpIHtcclxuICAgIC8vICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKGNhY2hlSW5mbykge1xyXG4gICAgLy8gICBjb25zdCBncmlkU3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcbiAgICAvLyAgIGlmIChncmlkU3RhdGVMb2dpYyA9PT0gR3JpZFN0YXRlTG9naWNUeXBlLlNldHRpbmdPbmx5KSB7XHJcbiAgICAvLyAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGNvbW1lbnQgb3V0IG9uIDIwMjQxMDAxLiBkZWZhdWx0IHRvIGZldGNoIHRoZSBkYXRhIGZyb20gYXBpIGluc3RlYWQgb2YgbG9hZGluZyBmcm9tdCBoZSBjYWNoZS5cclxuICAgIC8vIGlmICghdGhpcy5jaGFuZ2VFdmVudC5wYWdlQ2hhbmdlZCAmJiAhdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCAmJiAhdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgIC8vICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuICAgIC8vICAgaWYgKHJlc3VsdCkge1xyXG4gICAgLy8gICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXN1bHQuZGF0YSwgdHJ1ZSk7XHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGdyaWQgZGF0YS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R3JpZERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICBpZiAoIXRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0dyaWQgcGFnaW5hdGlvbiBBUEkgVVJMIGlzIHVuZGVmaW5lZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlU2tpcCA9IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc2tpcCA6IHRoaXMuc3RhdGUuc2tpcDtcclxuICAgICAgY29uc3Qgc3RhdGVUYWtlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS50YWtlIDogdGhpcy5zdGF0ZS50YWtlO1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMucGFnZU5vID0gdGhpcy5nZXRQYWdlTm8oc3RhdGVTa2lwLCBzdGF0ZVRha2UpO1xyXG4gICAgICB0aGlzLnBhcmFtcy5wYWdlU2l6ZSA9IHN0YXRlVGFrZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkLkV4dGVybmFsUGFnaW5hdGlvbikge1xyXG4gICAgICAgIC8vIEZvciBQT1NUIG1ldGhvZCBQYWdlIFdlYkFQSVxyXG4gICAgICAgIHRoaXMud2ViYXBpU2VydmljZVxyXG4gICAgICAgICAgLnBvc3RBcGkodGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCwgdGhpcy5wYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3ApID0+IHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXNwKSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiRXJyb3Igb2NjdXIgaW4gbG9hZGluZyB0aGUgZGF0YVwiLCBcIm1pZGRsZVwiLCBmYWxzZSwgMTUwMCwgXCJkYW5nZXJcIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gRm9yIEdFVCBtZXRob2RcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBcGkodGhpcy5yZXNvdXJjZVVSTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxDb3VudCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcC5kYXRhU2V0KSB7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IHJlc3AuZGF0YVNldDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC50b3RhbENvdW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwO1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSByZXNwLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHsgZGF0YVNldDogZGF0YSwgdG90YWxDb3VudDogdG90YWxDb3VudCB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc3QgZGF0YVNldCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLkRhdGFTb3VyY2UsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFTZXQ7XHJcbiAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoZGF0YTogYW55LCBza2lwQ2FjaGVEYXRhPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVIYW5kbGluZyhkYXRhLmRhdGFTZXQpO1xyXG4gICAgdGhpcy5oYW5kbGVEYXRlVGltZUlnbm9yaW5nVGltZVpvbmUoZGF0YS5kYXRhU2V0KTtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBkYXRhLmRhdGFTZXQsIHRvdGFsOiBkYXRhLnRvdGFsQ291bnQgfTtcclxuICAgIGlmICghc2tpcENhY2hlRGF0YSkge1xyXG4gICAgICBjb25zdCBzdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKHN0YXRlTG9naWMgPT09IFN0YXRlVHlwZS5jYWNoZWREYXRhU2V0dGluZyB8fCBzdGF0ZUxvZ2ljID09PSBTdGF0ZVR5cGUuc2F2ZWRBbmRDYWNoZWREYXRhU2V0dGluZykge1xyXG4gICAgICAgIHRoaXMuY2FjaGVHcmlkRGF0YShzdGF0ZUxvZ2ljKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWZ0ZXJEYXRhQmluZGVkKGRhdGEpO1xyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlRXZlbnRGbGFnKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IHtcclxuICAgICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlR3JpZERhdGEoc3RhdGVMb2dpYzogU3RhdGVUeXBlKSB7XHJcbiAgICBjb25zdCBjYWNoZU5hbWUgPSB0aGlzLnN0YXRlU2V0dGluZ1NlcnZpY2UuZ2V0U3RvcmFnZUNhY2hlS2V5KHN0YXRlTG9naWMsIHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZ3JpZFN0YXRlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuZ3JpZD8uZGF0YSB8fCBudWxsO1xyXG5cclxuICAgIGlmICghZ3JpZERhdGFbJ2RhdGEnXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAgICAgY29uc3QgY29sdW1uQ29uZmlndXJhdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zQ29uZmlnKHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTZXR0aW5nLmNvbHVtbnMpO1xyXG4gICAgICBsZXQgdXBkYXRlZERhdGEgPSBbLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgIGxldCBza2lwTGlzdCA9IFtncmlkU3RhdGUuc2tpcF07XHJcbiAgICAgIGxldCBjdXJyZW50R3JpZFNraXAgPSBncmlkU3RhdGUuc2tpcDtcclxuXHJcbiAgICAgIGNvbnN0IGNhY2hlR3JpZERhdGEgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YVNldDogdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICB0b3RhbENvdW50OiBncmlkRGF0YVsndG90YWwnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZFN0YXRlOiBncmlkU3RhdGUsXHJcbiAgICAgICAgc2tpcExpc3Q6IHNraXBMaXN0LFxyXG4gICAgICAgIGNhY2hlRHVyYXRpb246IGNhY2hlSW5mby5DYWNoZUR1cmF0aW9uLFxyXG4gICAgICAgIGNvbHVtbkNvbmZpZ3VyYXRpb25zOiBjb2x1bW5Db25maWd1cmF0aW9uc1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGNhY2hlTmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FjaGVHcmlkRGF0YSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cIkZlYXR1cmVEZXZlbG9wbWVudHxDb21wZXRlbmN5XCJcclxuICAvLyBjb21tZW50ZWQgb3V0IGZvciBmdXR1cmUgcmVmZXJlbmNlIGFuZCByZS1kZXZlbG9wLlxyXG4gIC8vIHByaXZhdGUgYXN5bmMgc3Vic2NyaWJlQ2FjaGVEYXRhQ2hhbmdlcygpIHtcclxuICAvLyAgIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAvLyAgIGlmIChjYWNoZUluZm8gJiYgIWNhY2hlSW5mby5EaXNhYmxlQ2FjaGVEYXRhKSB7XHJcbiAgLy8gICAgIC8vIGNhbm5vdCB1c2UgbWFpbiBzZXJ2aWNlIGhlcmUuIHdpbGwgZ2V0IGNpcmN1bGFyIGVycm9yIHdoZW4gYnVpbGQgbGliXHJcbiAgLy8gICAgIC8vdGhpcy5tYWluU2VydmljZS5qb2luUHJvamVjdFNpZ25hbFIoKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGNhbGxCYWNrRnVuY3Rpb24gPSBgJHtjYWNoZUluZm8uTmFtZX1faGFuZGxlUmVjZWl2ZWRNZXNzYWdlYDtcclxuXHJcbiAgLy8gICAgIC8vIGNyZWF0ZSBhbmQgYmluZCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrIGZvciB0aGUgZ3JpZCBpbiB0aGUgZ3JvdXAgdHJpZ2dlciBieSBzaWduYWxSLlxyXG4gIC8vICAgICBpZiAoIXRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIpIHtcclxuICAvLyAgICAgICB0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyID0ge307XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcltjYWxsQmFja0Z1bmN0aW9uXSA9IHRoaXMuaGFuZGxlUmVjZWl2ZWRNZXNzYWdlLmJpbmQodGhpcyk7XHJcblxyXG4gIC8vICAgICBjb25zdCBnZW5lcmF0ZWRDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gIC8vICAgICBpZiAoZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZSAmJiBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZFRhYmxlKSB7XHJcbiAgLy8gICAgICAgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZS5mb3JFYWNoKGRiID0+IHtcclxuICAvLyAgICAgICAgIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkVGFibGUuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGAke2RifXwke3RhYmxlfWA7XHJcbiAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKGBMaXN0ZW5pbmcgdG8gZXZlbnQgbmFtZTogJHtldmVudE5hbWV9YCk7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudCh0aGlzLmdycCwgYCR7ZXZlbnROYW1lfWAsIGBncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyLiR7Y2FsbEJhY2tGdW5jdGlvbn1gKTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhc3luYyBoYW5kbGVSZWNlaXZlZE1lc3NhZ2UoZ3JvdXA6IFpHcm91cCwgcmVzdWx0OiBhbnksIGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhgVGhlIFNpZ25hbHIgdHJpZ2dlciBoYXMgYmVlbiBkZXRlY3RlZC4gTm93LCBwcm9jZWVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUgYW5kIGdyaWQgZGF0YS5gKTtcclxuXHJcbiAgLy8gICBjb25zdCByZXNwb25zZWRSZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XHJcbiAgLy8gICBjb25zdCBhY3Rpb25UeXBlID0gcmVzcG9uc2VkUmVzdWx0LkFjdGlvbjtcclxuICAvLyAgIGNvbnN0IHJlc3BvbnNlZFJlc3VsdElkID0gcmVzcG9uc2VkUmVzdWx0WydJZCddO1xyXG4gIC8vICAgY29uc3QgdGVtcFBhcmFtcyA9IFpDb21wb25lbnRIZWxwZXIuZGVlcENsb25lKHRoaXMucGFyYW1zKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhID0gYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuXHJcbiAgLy8gICBpZiAoY3VycmVudERhdGEpIHtcclxuICAvLyAgICAgdGVtcFBhcmFtcy5maWx0ZXJzID0gYElkPSR7cmVzcG9uc2VkUmVzdWx0SWR9YDtcclxuXHJcbiAgLy8gICAgIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLkRlbGV0ZSkge1xyXG4gIC8vICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldCA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maWx0ZXIoaXRlbSA9PiBpdGVtLklkICE9PSBwYXJzZUludChyZXNwb25zZWRSZXN1bHRJZCkpO1xyXG5cclxuICAvLyAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMud2ViYXBpU2VydmljZS5wb3N0QXBpKHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwsIHRlbXBQYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpLnN1YnNjcmliZShhc3luYyByZXNwID0+IHtcclxuXHJcbiAgLy8gICAgICAgICBjb25zdCBkYXRhYmFzZVJlY29yZCA9IHJlc3AuZGF0YVNldFswXTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAoZGF0YWJhc2VSZWNvcmQpIHtcclxuICAvLyAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuVXBkYXRlKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgaW5kZXhUb1VwZGF0ZSA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLklkID09PSBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKGluZGV4VG9VcGRhdGUgIT09IC0xKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHVwZGF0ZWQgbmFtZVxyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSB7IC4uLmN1cnJlbnREYXRhLmRhdGEuZGF0YVNldFtpbmRleFRvVXBkYXRlXSwgLi4uZGF0YWJhc2VSZWNvcmQgfTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgaXRlbSB3aXRoIHRoZSB1cGRhdGVkIG9uZVxyXG4gIC8vICAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0W2luZGV4VG9VcGRhdGVdID0gdXBkYXRlZEl0ZW07XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCBmb3VuZCB3aXRoIElEOlwiLCBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2UgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuQWRkICYmIGN1cnJlbnREYXRhLmdyaWRTdGF0ZS5za2lwIDwgMjApIHtcclxuICAvLyAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQudW5zaGlmdChkYXRhYmFzZVJlY29yZCk7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG4gIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIC8vIFVuYWJsZSB0byBnZXQgZGF0YSwgcmVmcmVzaCB0aGUgd2hvbGUgZ3JpZCBkYXRhIGZyb20gQVBJXHJcbiAgLy8gICAgICAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIC8vIFVuYWJsZSB0byBnZXQgZnJvbSBpbmRleGVkREIgc3RyYWlnaHQgZ2V0IGZyb20gQVBJXHJcbiAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJEYXRhQmluZGVkKGRhdGEpIHtcclxuICAgIC8vIGFsbG93IHRvIGNhbGwgYmFjayBwcm9qZWN0IHBhZ2UgYWZ0ZXIgZGF0YSBiaW5kZWQuXHJcbiAgICBsZXQgYmluZGVkVmFsdWUgPSB0aGlzLnpncmlkYmluZGluZy5kYXRhWydBZnRlckRhdGFCaW5kZWQnXTtcclxuICAgIGlmIChiaW5kZWRWYWx1ZSkge1xyXG4gICAgICBjb25zdCBtZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMpO1xyXG4gICAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGJpbmRlZFZhbHVlLm1hdGNoKC9cXGJcXCguKi9naSk7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgYmluZGVkVmFsdWUgPSBiaW5kZWRWYWx1ZS5yZXBsYWNlKHBhcmFtc1swXSwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJpbmRlZFZhbHVlID0gYmluZGVkVmFsdWUucmVwbGFjZSgnbW9kYWxHcm91cC4nLCAnZ3JvdXAuJyk7XHJcbiAgICAgICAgY2FsbEZ1bmMgPSBldmFsKCdtZS56Z3JpZGJpbmRpbmcuJyArIGJpbmRlZFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkVycm9yIHdoZW4gZ2V0R3JvdXBWYWx1ZTogXCIsXHJcbiAgICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICAgIG5ld0Z1bmMoZXZlbnQsIG1lLnpncmlkYmluZGluZy5kYXRhLCBkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBbXSwgdG90YWw6IDAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBjb2x1bW4gYWdncmVnYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSAtIFRoZSBkYXRhIHRvIGFnZ3JlZ2F0ZS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGFnZ3JlZ2F0ZUhhbmRsaW5nKGRhdGE6IGFueSkge1xyXG4gICAgY29uc3QgYWdncmVnYXRlQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5hZ2dyZWdhdGVUeXBlKTtcclxuXHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSBjb2wuZmllbGQ7XHJcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVR5cGUgPSBjb2wuYWdncmVnYXRlVHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJzonLCAnJyk7XHJcblxyXG4gICAgICBsZXQgYWdncmVnYXRlVmFsdWUgPSBudWxsO1xyXG4gICAgICBzd2l0Y2ggKGFnZ3JlZ2F0ZVR5cGUpIHtcclxuICAgICAgICBjYXNlIFwidG90YWxcIjpcclxuICAgICAgICBjYXNlIFwic3VtXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKCh0b3RhbCwgbmV4dCkgPT4gdG90YWwgKyBuZXh0W2ZpZWxkXSwgMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYXZlcmFnZVwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApIC8gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiY291bnRcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWF4XCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA+IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaW5cIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdIDwgY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IGFnZ3JlZ2F0ZVZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZURhdGVUaW1lSWdub3JpbmdUaW1lWm9uZShkYXRhU2V0OiBhbnkpIHtcclxuICAgIC8vIENvbHVtbiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUgaGFuZGxpbmdcclxuICAgIGNvbnN0IGRhdGVDb2x1bW5UeXBlcyA9IFsnemRhdGUnLCAnenRpbWUnLCAnemRhdGV0aW1lJywgJ3pzaG9ydGRhdGUnLCAnenVpZGF0ZXRpbWUnLCAnenVpdGltZSddO1xyXG5cclxuICAgIC8vIEZpbHRlciBjb2x1bW5zIHRoYXQgaGF2ZSBkYXRlLXJlbGF0ZWQgdHlwZXNcclxuICAgIGNvbnN0IGRhdGVUaW1lQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGRhdGVDb2x1bW5UeXBlcy5pbmNsdWRlcyhjb2wuVHlwZSkpO1xyXG5cclxuICAgIC8vIEZpbHRlciBjb2x1bW5zIHdoZXJlIHRoZSB0aW1lem9uZSBzaG91bGQgYmUgaWdub3JlZFxyXG4gICAgY29uc3QgaWdub3JlVGltZVpvbmVDb2x1bW5zID0gZGF0ZVRpbWVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLklzSWdub3JlVGltZVpvbmUpO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBjb2x1bW5zIHRoYXQgc2hvdWxkIGlnbm9yZSB0aGUgdGltZXpvbmVcclxuICAgIGlmIChpZ25vcmVUaW1lWm9uZUNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBkYXRhU2V0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgaWdub3JlVGltZVpvbmVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgIC8vIEFkanVzdCBkYXRldGltZSBiYXNlZCBvbiB0aGUgdGltZXpvbmUgaWdub3Jpbmcgc2V0dGluZ1xyXG4gICAgICAgICAgZGF0YVtjb2wuVmFsdWVdID0gdGhpcy5jb21wb25lbnRTZXJ2aWNlLmxvY2FsaXplRGF0ZVRpbWVCeUlnbm9yaW5nVGltZVpvbmUoZGF0YVtjb2wuVmFsdWVdLCBjb2wpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGFnZ3JlZ2F0ZSB2YWx1ZXMgZm9yIGNvbHVtbnMgd2l0aCBhZ2dyZWdhdGUgdHlwZXMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGFnZ3JlZ2F0ZVJlc2V0VmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhZ2dyZWdhdGVDb2x1bW5zID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmFnZ3JlZ2F0ZVR5cGUpO1xyXG4gICAgYWdncmVnYXRlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBwYWdlIGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGFnZUNoYW5nZUV2ZW50fSBldmVudCAtIFRoZSBwYWdlIGNoYW5nZSBldmVudC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgcGFnZUNoYW5nZShldmVudDogUGFnZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSB0aGlzLmdldFBhZ2VObyhldmVudC5za2lwLCB0aGlzLnBhcmFtcy5wYWdlU2l6ZSk7XHJcbiAgICB0aGlzLnN0YXRlLnNraXAgPSBldmVudC5za2lwO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5wYWdlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgc29ydCBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NvcnREZXNjcmlwdG9yW119IHNvcnQgLSBUaGUgc29ydCBkZXNjcmlwdG9yIGFycmF5LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzb3J0Q2hhbmdlKHNvcnQ6IFNvcnREZXNjcmlwdG9yW10pOiB2b2lkIHtcclxuICAgIHRoaXMuc29ydCA9IHNvcnQ7XHJcbiAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMgPSBbXTtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMgPSBbXTtcclxuXHJcbiAgICBzb3J0LmZvckVhY2goKGRlc2NyaXB0b3I6IFNvcnREZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgIGlmIChkZXNjcmlwdG9yLmRpcikge1xyXG4gICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMucHVzaChkZXNjcmlwdG9yLmRpcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBkZXNjcmlwdG9yLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBzb3J0Q29sdW1uTmFtZSA9IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmllbGQudmFsdWVFeHByIDogZGVzY3JpcHRvci5maWVsZDtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzLnB1c2goc29ydENvbHVtbk5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2hhbmdlRXZlbnQuc29ydENoYW5nZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGZpbHRlciBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gZXZlbnQgLSBUaGUgZmlsdGVyIGNoYW5nZSBldmVudC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgZmlsdGVyQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IDA7XHJcbiAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXTtcclxuICAgIHRoaXMuc2V0RmlsdGVyUGFyYW1zQnlQYXJlbnRSZWZJZCgpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgIGlmIChldmVudCAmJiBldmVudC5maWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZXZlbnQuZmlsdGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLmZpZWxkID09PSBpdGVtLmZpZWxkKTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0udmFsdWUgPT09IG51bGwgPyBcIlwiIDogaXRlbS52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0uZmlsdGVycykge1xyXG4gICAgICAgICAgaXRlbS5maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbTogWkdyaWRGaWx0ZXJQYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAga2V5OiBmaWx0ZXIuZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXIudmFsdWUgPT09IG51bGwgPyBcIlwiIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbTogWkdyaWRGaWx0ZXJQYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIGtleTogaXRlbS5maWVsZCxcclxuICAgICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGl0ZW0ub3BlcmF0b3IpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnZhbHVlRXhwcikge1xyXG4gICAgICAgICAgICBmaWx0ZXJQYXJhbS5rZXkgPSB0aGlzLnpncmlkYmluZGluZy5kYXRhWydGaWx0ZXJXaXRob3V0QnJhY2tldCddID8gYCR7ZmllbGQudmFsdWVFeHByfWAgOiBgKCR7ZmllbGQudmFsdWVFeHByfSlgO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uPy5PbkNoYW5nZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlIHRyaWdnZXJlZFwiKTtcclxuICAgICAgLy8gVXNlIHN3aXRjaE1hcCB0byBoYW5kbGUgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25cclxuICAgICAgb2YodGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKS5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoZmlsdGVyUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gZnJvbSB0aGUgY29uZmlndXJhdGlvblxyXG4gICAgICAgICAgbGV0IGV4cHJlc3Npb24gPSB0aGlzLmZpZWxkLkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlO1xyXG5cclxuICAgICAgICAgIC8vIFJlcGxhY2UgJ21vZGFsR3JvdXAuJyB3aXRoICdncm91cC4nIGFuZCAnZ3JvdXAuJyB3aXRoICdncnAuJ1xyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSgvbW9kYWxHcm91cFxcLi9nLCAnZ3JvdXAuJykucmVwbGFjZSgvZ3JvdXBcXC4vZywgJ2dycC4nKTtcclxuXHJcbiAgICAgICAgICAvLyBFbnN1cmUgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggJ3RoaXMuJyB0byBhdm9pZCBhY2Nlc3NpbmcgZ2xvYmFsIHNjb3BlXHJcbiAgICAgICAgICBpZiAoIWV4cHJlc3Npb24uc3RhcnRzV2l0aCgndGhpcy4nKSkge1xyXG4gICAgICAgICAgICBleHByZXNzaW9uID0gYHRoaXMuJHtleHByZXNzaW9ufWA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVuYyA9IGV2YWwoZXhwcmVzc2lvbik7XHJcbiAgICAgICAgICBpZiAoIWZ1bmMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5sb2coYCR7ZXhwcmVzc2lvbn0gbm90IGZvdW5kIGluIHRoaXMgc2NvcGUgZm9yICR7dGhpcy5maWVsZC5OYW1lfSBncmlkLmApO1xyXG5cclxuICAgICAgICAgICAgLy8gU2luY2UgZnVuY3Rpb24gbm90IGZvdW5kLCB3ZSByZXR1cm4gdGhlIG9yaWdpbmFsIHBhcmFtcy5cclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgY2FsbEZ1bmMgPSBmdW5jLmJpbmQodGhpcy5ncnApO1xyXG5cclxuICAgICAgICAgIHJldHVybiBjYWxsRnVuYyhmaWx0ZXJQYXJhbXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCh1cGRhdGVkRmlsdGVyUGFyYW1zOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgZmlsdGVyUGFyYW1zXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IHVwZGF0ZWRGaWx0ZXJQYXJhbXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2VcclxuICAgICAgdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRhdGFTdGF0ZUNoYW5nZShzdGF0ZTogRGF0YVN0YXRlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID0gc3RhdGU7XHJcbiAgICB0aGlzLmFnZ3JlZ2F0ZVJlc2V0VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcCBmaWx0ZXIgb3BlcmF0b3IgdG8gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0b3IgLSBUaGUgZmlsdGVyIG9wZXJhdG9yLlxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIG1hcHBlZCBmaWx0ZXIgb3BlcmF0b3IgdmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJPcGVyYXRvcihvcGVyYXRvcjogYW55KSB7XHJcbiAgICBjb25zdCBvcGVyYXRvck1hcHBpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICBcImVxXCI6IFwiZXFcIixcclxuICAgICAgXCJuZXFcIjogXCJuZXFcIixcclxuICAgICAgXCJsdFwiOiBcImx0XCIsXHJcbiAgICAgIFwibHRlXCI6IFwibHRlXCIsXHJcbiAgICAgIFwiZ3RcIjogXCJndFwiLFxyXG4gICAgICBcImd0ZVwiOiBcImd0ZVwiLFxyXG4gICAgICBcInN0YXJ0c3dpdGhcIjogXCJzdGFydHN3aXRoXCIsXHJcbiAgICAgIFwiZW5kc3dpdGhcIjogXCJlbmRzd2l0aFwiLFxyXG4gICAgICBcImlzbnVsbFwiOiBcImlzbnVsbFwiLFxyXG4gICAgICBcImlzbm90bnVsbFwiOiBcImlzbm90bnVsbFwiLFxyXG4gICAgfTtcclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIFwiY29udGFpbnNcIlxyXG4gICAgaWYgKG9wZXJhdG9yID09PSBcImNvbnRhaW5zXCIgJiYgIXRoaXMuZmllbGRbJ0ZpbHRlckNvbnRhaW5zVXNpbmdFcXVhbCddKSB7XHJcbiAgICAgIHJldHVybiBcImNvbnRhaW5zXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBtYXBwZWQgb3BlcmF0b3Igb3IgZGVmYXVsdCB0byBcIj09XCJcclxuICAgIHJldHVybiBvcGVyYXRvck1hcHBpbmdzW29wZXJhdG9yXSB8fCBcIj09XCI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhZ2VObyhzdGF0ZVNraXA6IG51bWJlciwgc3RhdGVUYWtlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBzdGF0ZVNraXAgLyBzdGF0ZVRha2U7XHJcbiAgfVxyXG5cclxuICAvLyBjb2x1bW5GaWVsZCA9IGRhdGE6IEFycmF5PFpGaWVsZD4sXHJcbiAgLy8gY29sdW1ucyA9IGdyaWRDb2x1bW5zOiBhbnlbXSxcclxuICAvLyBncm91cCA9IGdyb3VwOiBaR3JvdXAsXHJcbiAgLy8gY29sdW1uQ29uZmlndXJhdGlvbnMgPSBncmlkU2V0dGluZ3M/OiBaR3JpZENvbHVtblNldHRpbmdzW10sXHJcbiAgLy8gZ2VuZXJhdGVIaWRkZW5Db2x1bW5zID0gdXNhYmxlQ29sdW1ucz86IGFueVtdLFxyXG4gIC8vIGdyaWRBdHRyaWJ1dGVzID0gZ3JpZEZpZWxkPzogWkZpZWxkXHJcblxyXG4gIHB1YmxpYyBzZXRDb2x1bW5zKGNvbHVtbnM6IGFueVtdKSB7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbkZpZWxkID0gY29sdW1ucztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnModGhpcy5ncmlkU2V0dGluZyk7XHJcblxyXG4gICAgdGhpcy5sb2dnaW5nU2VydmljZS5kZWJ1Z0xvZygnZ2VuZXJhdGVkIGdyaWQgY29sdW1ucycsIHRoaXMuZ3JpZFNldHRpbmcpO1xyXG4gIH1cclxufVxyXG4iXX0=