ngx-histaff-alpha 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,7 +31,7 @@ import * as i7 from "../../../libraries/alert/alert.service";
31
31
  import * as i8 from "@angular/router";
32
32
  import * as i9 from "../../../services/auth.service";
33
33
  import * as i10 from "../../services/dom.service";
34
- import * as i11 from "../../../services/grpc.service";
34
+ import * as i11 from "../../../services/app-config.service";
35
35
  import * as i12 from "@angular/common";
36
36
  import * as i13 from "@angular/forms";
37
37
  export var EnumPermissionObjectType;
@@ -40,7 +40,7 @@ export var EnumPermissionObjectType;
40
40
  EnumPermissionObjectType["USER_GROUP"] = "USER_GROUP";
41
41
  })(EnumPermissionObjectType || (EnumPermissionObjectType = {}));
42
42
  export class CorePermissionComponent extends BaseComponent {
43
- constructor(mls, dialogService, ras, corePermissionService, appService, layoutService, alertService, router, route, authService, domService, grpcService) {
43
+ constructor(mls, dialogService, ras, corePermissionService, appService, layoutService, alertService, router, route, authService, domService, appConfigService) {
44
44
  super(mls);
45
45
  this.mls = mls;
46
46
  this.dialogService = dialogService;
@@ -53,7 +53,7 @@ export class CorePermissionComponent extends BaseComponent {
53
53
  this.route = route;
54
54
  this.authService = authService;
55
55
  this.domService = domService;
56
- this.grpcService = grpcService;
56
+ this.appConfigService = appConfigService;
57
57
  this.loading = true;
58
58
  this.selectedData = [];
59
59
  this.tabHeaders = [
@@ -220,6 +220,15 @@ export class CorePermissionComponent extends BaseComponent {
220
220
  if (x[0].ok && x[0].status === 200) {
221
221
  const body = x[0].body;
222
222
  if (body.statusCode === 200) {
223
+ // check functionId to be in elements of permission array
224
+ if (!!body?.innerBody?.length) {
225
+ const checkItem = body.innerBody[0];
226
+ if (!checkItem?.functionId) {
227
+ if (isDevMode() || this.appConfigService.DEBUG_ENABLED) {
228
+ this.alertService.error(`Each row of the list returned by ${this.queryFunctionActionPermissionListApiEndpoint} must have a field named functionId. Please check the Backend!`, noneAutoClosedAlertOptions);
229
+ }
230
+ }
231
+ }
223
232
  this.corePermissionService.selectedObjectActionPermissions$.next(body.innerBody);
224
233
  this.updateInitialActionPermissionValueJsonString(body.innerBody);
225
234
  }
@@ -423,7 +432,7 @@ export class CorePermissionComponent extends BaseComponent {
423
432
  this.corePermissionService.selectedObject$.next(null);
424
433
  this.corePermissionService.selectedObjectActionPermissions$.next([]);
425
434
  }
426
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CorePermissionComponent, deps: [{ token: i1.MultiLanguageService }, { token: i2.DialogService }, { token: i3.RandomAvatarService }, { token: i4.CorePermissionService }, { token: i5.AppService }, { token: i6.LayoutService }, { token: i7.AlertService }, { token: i8.Router }, { token: i8.ActivatedRoute }, { token: i9.AuthService }, { token: i10.DomService }, { token: i11.GrpcService }], target: i0.ɵɵFactoryTarget.Component }); }
435
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CorePermissionComponent, deps: [{ token: i1.MultiLanguageService }, { token: i2.DialogService }, { token: i3.RandomAvatarService }, { token: i4.CorePermissionService }, { token: i5.AppService }, { token: i6.LayoutService }, { token: i7.AlertService }, { token: i8.Router }, { token: i8.ActivatedRoute }, { token: i9.AuthService }, { token: i10.DomService }, { token: i11.AppConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
427
436
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: CorePermissionComponent, isStandalone: true, selector: "core-permission", inputs: { type: "type" }, viewQueries: [{ propertyName: "avatar", first: true, predicate: ["avatar"], descendants: true }, { propertyName: "actions", first: true, predicate: ["actions"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #container class=\"core-permission-container\" [ngStyle]=\"{ height: height + 'px'}\">\r\n <core-page-header [title]=\"title\" (buttonClick)=\"onCorePageHeaderButtonClick($event)\"></core-page-header>\r\n\r\n <core-composition [left]=\"userSeeker\" [leftWidth]=\"200\" [main]=\"tabs\" [height]=\"compositionHeight\">\r\n </core-composition>\r\n\r\n <div class=\"state-tracker container container-fluid\" *ngIf=\"showStateTracker && isRootUser\">\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <span>Compare</span>\r\n <i class=\"feather-x\" (click)=\"onClickCloseState()\"></i>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialActionPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentActionPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialOrgPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentOrgPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #tabs>\r\n <core-tabs [headers]=\"tabHeaders\" [contents]=\"[tab1, tab2]\" [height]=\"compositionHeight\"></core-tabs>\r\n</ng-template>\r\n\r\n<ng-template #tab1>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-permission-actions [loading]=\"loading\" [(ngModel)]=\"actionPermissionValue\"\r\n (ngModelChange)=\"onActionPermissionValueChange($event)\" [disabled]=\"!!!allowEdit\" [height]=\"corePermissionActionsHeight\"></core-permission-actions>\r\n</ng-template>\r\n\r\n<ng-template #userSeeker>\r\n\r\n <core-list-lazy [queryListApi]=\"objectQueryListApi\" [textField]=\"objectListTextField\" [(ngModel)]=\"objectId\"\r\n (ngModelChange)=\"onObjectIdChange($event)\" [height]=\"compositionHeight\" [blockingInteraction$]=\"blockingLeftListInteraction$\"></core-list-lazy>\r\n\r\n\r\n</ng-template>\r\n\r\n<ng-template #tab2>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-org-tree [fullWidthMode]=\"true\" [accessorMode]=\"treeAccessorMode\" [(ngModel)]=\"orgIds\" [disabled]=\"!!!allowEdit\"\r\n (itemClick)=\"onOrgTreeItemCheck($event)\" name=\"orgIds\" ngDefaultControl [height]=\"treeHeight\"></core-org-tree>\r\n</ng-template>", styles: [".core-permission-container{--z-index: 1}.core-permission-container .state-tracker{display:block;position:fixed;width:100%;height:50vh;top:0;left:0;z-index:var(--z-index);background-color:wheat}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i13.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CoreOrgTreeComponent, selector: "core-org-tree", inputs: ["lineColor", "fullWidthMode", "accessorMode", "fullRendering", "height", "disabledLoopExpand", "showCheckInheritance"], outputs: ["itemDoubleClick", "itemClick"] }, { kind: "component", type: CoreTabsComponent, selector: "core-tabs", inputs: ["headers", "contents", "headerTools", "height", "headerLineHeight"], outputs: ["onHeaderClick", "onToolItemClick"] }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup"], outputs: ["buttonClick"] }, { kind: "component", type: CoreCompositionComponent, selector: "core-composition", inputs: ["coreCompositionInstanceNumber", "top", "left", "leftWidth", "main", "height", "defaultResizeOff"] }, { kind: "component", type: CoreListLazyComponent, selector: "core-list-lazy", inputs: ["title", "queryListApi", "textField", "pipe", "height", "blockingInteraction$"] }, { kind: "component", type: CorePermissionActionsComponent, selector: "core-permission-actions", inputs: ["loading", "height"] }] }); }
428
437
  }
429
438
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CorePermissionComponent, decorators: [{
@@ -443,7 +452,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
443
452
  CoreConfirmDialogComponent,
444
453
  CoreApiProgressComponent
445
454
  ], template: "<div #container class=\"core-permission-container\" [ngStyle]=\"{ height: height + 'px'}\">\r\n <core-page-header [title]=\"title\" (buttonClick)=\"onCorePageHeaderButtonClick($event)\"></core-page-header>\r\n\r\n <core-composition [left]=\"userSeeker\" [leftWidth]=\"200\" [main]=\"tabs\" [height]=\"compositionHeight\">\r\n </core-composition>\r\n\r\n <div class=\"state-tracker container container-fluid\" *ngIf=\"showStateTracker && isRootUser\">\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <span>Compare</span>\r\n <i class=\"feather-x\" (click)=\"onClickCloseState()\"></i>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialActionPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentActionPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialOrgPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentOrgPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #tabs>\r\n <core-tabs [headers]=\"tabHeaders\" [contents]=\"[tab1, tab2]\" [height]=\"compositionHeight\"></core-tabs>\r\n</ng-template>\r\n\r\n<ng-template #tab1>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-permission-actions [loading]=\"loading\" [(ngModel)]=\"actionPermissionValue\"\r\n (ngModelChange)=\"onActionPermissionValueChange($event)\" [disabled]=\"!!!allowEdit\" [height]=\"corePermissionActionsHeight\"></core-permission-actions>\r\n</ng-template>\r\n\r\n<ng-template #userSeeker>\r\n\r\n <core-list-lazy [queryListApi]=\"objectQueryListApi\" [textField]=\"objectListTextField\" [(ngModel)]=\"objectId\"\r\n (ngModelChange)=\"onObjectIdChange($event)\" [height]=\"compositionHeight\" [blockingInteraction$]=\"blockingLeftListInteraction$\"></core-list-lazy>\r\n\r\n\r\n</ng-template>\r\n\r\n<ng-template #tab2>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-org-tree [fullWidthMode]=\"true\" [accessorMode]=\"treeAccessorMode\" [(ngModel)]=\"orgIds\" [disabled]=\"!!!allowEdit\"\r\n (itemClick)=\"onOrgTreeItemCheck($event)\" name=\"orgIds\" ngDefaultControl [height]=\"treeHeight\"></core-org-tree>\r\n</ng-template>", styles: [".core-permission-container{--z-index: 1}.core-permission-container .state-tracker{display:block;position:fixed;width:100%;height:50vh;top:0;left:0;z-index:var(--z-index);background-color:wheat}\n"] }]
446
- }], ctorParameters: () => [{ type: i1.MultiLanguageService }, { type: i2.DialogService }, { type: i3.RandomAvatarService }, { type: i4.CorePermissionService }, { type: i5.AppService }, { type: i6.LayoutService }, { type: i7.AlertService }, { type: i8.Router }, { type: i8.ActivatedRoute }, { type: i9.AuthService }, { type: i10.DomService }, { type: i11.GrpcService }], propDecorators: { type: [{
455
+ }], ctorParameters: () => [{ type: i1.MultiLanguageService }, { type: i2.DialogService }, { type: i3.RandomAvatarService }, { type: i4.CorePermissionService }, { type: i5.AppService }, { type: i6.LayoutService }, { type: i7.AlertService }, { type: i8.Router }, { type: i8.ActivatedRoute }, { type: i9.AuthService }, { type: i10.DomService }, { type: i11.AppConfigService }], propDecorators: { type: [{
447
456
  type: Input
448
457
  }], avatar: [{
449
458
  type: ViewChild,
@@ -455,4 +464,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
455
464
  type: ViewChild,
456
465
  args: ['container']
457
466
  }] } });
458
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS1wZXJtaXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLXBlcm1pc3Npb24vY29yZS1wZXJtaXNzaW9uL2NvcmUtcGVybWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaGlzdGFmZi1hbHBoYS9zcmMvbGliL2FwcC9saWJyYXJpZXMvY29yZS1wZXJtaXNzaW9uL2NvcmUtcGVybWlzc2lvbi9jb3JlLXBlcm1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsS0FBSyxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFFLGVBQWUsRUFBYyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBbUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUU1RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFjNUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDNUksT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0ZBQXNGLENBQUM7QUFDN0gsT0FBTyxFQUFFLFlBQVksRUFBRSwwQkFBMEIsRUFB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QUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMscUJBQXFCLENBQUMsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7OEdBemRVLHVCQUF1QjtrR0FBdkIsdUJBQXVCLDRZQzFGcEMsMjFFQXFEYyw0UERvQlYsWUFBWSx5TkFDWixXQUFXLGtuQkFDWCxvQkFBb0Isc09BRXBCLGlCQUFpQixtTEFDakIsdUJBQXVCLDZKQUN2Qix3QkFBd0IsMEtBQ3hCLHFCQUFxQixxSkFHckIsOEJBQThCOzsyRkFPckIsdUJBQXVCO2tCQXJCbkMsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG9CQUFvQjt3QkFDcEIsNEJBQTRCO3dCQUM1QixpQkFBaUI7d0JBQ2pCLHVCQUF1Qjt3QkFDdkIsd0JBQXdCO3dCQUN4QixxQkFBcUI7d0JBQ3JCLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQiw4QkFBOEI7d0JBQzlCLDBCQUEwQjt3QkFDMUIsd0JBQXdCO3FCQUN6Qjs0WUFNUSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ2UsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUNHLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDSSxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBpc0Rldk1vZGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB6aXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9saWJyYXJpZXMvYmFzZS1jb21wb25lbnQvYmFzZS9iYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBFbnVtVHJhbnNsYXRlS2V5IH0gZnJvbSBcImFscGhhLWdsb2JhbC1jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgRW51bUZpbHRlck9wZXJhdG9yLCBJRmlsdGVyT3BlcmF0b3IgfSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JUXVlcnlMaXN0UmVxdWVzdFwiO1xyXG5pbXBvcnQgeyBJQ29yZVBhZ2VMaXN0QXBpRGVmaW5pdGlvbiwgSUNvcmVQYWdlTGlzdEVkaXRSb3V0aW5nIH0gZnJvbSBcIi4uLy4uLy4uL2xpYnJhcmllcy9jb3JlLXBhZ2UtbGlzdC9jb3JlLXBhZ2UtbGlzdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgYXBpIH0gZnJvbSBcImFscGhhLWdsb2JhbC1jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgSUNvcmVUYWJsZUNvbHVtbkl0ZW0gfSBmcm9tIFwiLi4vLi4vY29yZS10YWJsZS9JQ29yZVRhYmxlQ29sdW1uSXRlbVwiO1xyXG5pbXBvcnQgeyBFbnVtQ29yZVRhYmxlUGlwZVR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtdGFibGUvRW51bUNvcmVUYWJsZVBpcGVUeXBlXCI7XHJcblxyXG5pbXBvcnQgeyBNdWx0aUxhbmd1YWdlU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9tdWx0aS1sYW5ndWFnZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFJhbmRvbUF2YXRhclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvcmFuZG9tLWF2YXRhci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvcmVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9saWJyYXJpZXMvY29yZS1wZXJtaXNzaW9uL2NvcmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvYXBwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2xpYnJhcmllcy9hbGVydC9hbGVydC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEb21TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2RvbS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvbGF5b3V0LnNlcnZpY2VcIjtcclxuXHJcbmltcG9ydCB7IElDb3JlTGlzdE9wdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9saWJyYXJpZXMvY29yZS1saXN0L2NvcmUtbGlzdC9jb3JlLWxpc3QuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElGb3JtYXRlZFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZvcm1hdGVkUmVzcG9uc2VcIjtcclxuaW1wb3J0IHsgSUNvcmVCdXR0b25WTlMgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtYnV0dG9uLWdyb3VwLXZucy9jb3JlLWJ1dHRvbi1ncm91cC12bnMvSUNvcmVCdXR0b25WTlNcIjtcclxuaW1wb3J0IHsgQ29yZU9yZ1RyZWVDb21wb25lbnQsIEVudW1Db3JlT3JnVHJlZWFBY2Nlc3Nvck1vZGUgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtb3JnLXRyZWUvY29yZS1vcmctdHJlZS9jb3JlLW9yZy10cmVlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBFbnVtQ29yZUJ1dHRvblZOU0NvZGUgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtYnV0dG9uLWdyb3VwLXZucy9jb3JlLWJ1dHRvbi1ncm91cC12bnMvRW51bUNvcmVCdXR0b25WTlNDb2RlXCI7XHJcbmltcG9ydCB7IGFsZXJ0T3B0aW9ucywgbm9uZUF1dG9DbG9zZWRBbGVydE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzL2FsZXJ0T3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBDb3JlUGVybWlzc2lvbkFjdGlvbnNDb21wb25lbnQsIElDb3JlRnVuY3Rpb25BY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtcGVybWlzc2lvbi1hY3Rpb25zL2NvcmUtcGVybWlzc2lvbi1hY3Rpb25zL2NvcmUtcGVybWlzc2lvbi1hY3Rpb25zLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQ29yZVBhZ2VMaXN0Q29udGVudENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb3JlLXBhZ2UtbGlzdC1jb250ZW50L2NvcmUtcGFnZS1saXN0LWNvbnRlbnQvY29yZS1wYWdlLWxpc3QtY29udGVudC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ29yZVRhYnNDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS10YWJzL2NvcmUtdGFicy9jb3JlLXRhYnMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvcmVQYWdlSGVhZGVyQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvcmUtcGFnZS1oZWFkZXIvY29yZS1wYWdlLWhlYWRlci9jb3JlLXBhZ2UtaGVhZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb3JlQ29tcG9zaXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS1jb21wb3NpdGlvbi9jb3JlLWNvbXBvc2l0aW9uL2NvcmUtY29tcG9zaXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvcmVMaXN0TGF6eUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb3JlLWxpc3QtbGF6eS9jb3JlLWxpc3QtbGF6eS9jb3JlLWxpc3QtbGF6eS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gXCIuLi8uLi8uLi9hcHAtcGlwZXMvdHJhbnNsYXRlLnBpcGVcIjtcclxuaW1wb3J0IHsgQ29yZVRhZ3NDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS10YWdzL2NvcmUtdGFncy9jb3JlLXRhZ3MuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvcmVDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvcmUtY29uZmlybS1kaWFsb2cvY29yZS1jb25maXJtLWRpYWxvZy9jb3JlLWNvbmZpcm0tZGlhbG9nLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb3JlQXBpUHJvZ3Jlc3NDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS1hcGktcHJvZ3Jlc3MvY29yZS1hcGktcHJvZ3Jlc3MvY29yZS1hcGktcHJvZ3Jlc3MuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdycGNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2dycGMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlclBlcm1pc3Npb25Nb2RlbCB7XHJcbiAgdXNlcklkOiBzdHJpbmc7XHJcbiAgZnVuY3Rpb25JZDogbnVtYmVyO1xyXG4gIGFjdGlvbklkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJPcmdQZXJtaXNzaW9uTW9kZWwge1xyXG4gIHVzZXJJZDogc3RyaW5nO1xyXG4gIG9yZ0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyb3VwUGVybWlzc2lvbk1vZGVsIHtcclxuICBncm91cElkOiBudW1iZXI7XHJcbiAgZnVuY3Rpb25JZDogbnVtYmVyO1xyXG4gIGFjdGlvbklkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyb3VwT3JnUGVybWlzc2lvbk1vZGVsIHtcclxuICBncm91cElkOiBudW1iZXI7XHJcbiAgb3JnSWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gRW51bVBlcm1pc3Npb25PYmplY3RUeXBlIHtcclxuICBVU0VSID0gJ1VTRVInLFxyXG4gIFVTRVJfR1JPVVAgPSAnVVNFUl9HUk9VUCdcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjb3JlLXBlcm1pc3Npb24nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBDb3JlT3JnVHJlZUNvbXBvbmVudCxcclxuICAgIENvcmVQYWdlTGlzdENvbnRlbnRDb21wb25lbnQsXHJcbiAgICBDb3JlVGFic0NvbXBvbmVudCxcclxuICAgIENvcmVQYWdlSGVhZGVyQ29tcG9uZW50LFxyXG4gICAgQ29yZUNvbXBvc2l0aW9uQ29tcG9uZW50LFxyXG4gICAgQ29yZUxpc3RMYXp5Q29tcG9uZW50LFxyXG4gICAgVHJhbnNsYXRlUGlwZSxcclxuICAgIENvcmVUYWdzQ29tcG9uZW50LFxyXG4gICAgQ29yZVBlcm1pc3Npb25BY3Rpb25zQ29tcG9uZW50LFxyXG4gICAgQ29yZUNvbmZpcm1EaWFsb2dDb21wb25lbnQsXHJcbiAgICBDb3JlQXBpUHJvZ3Jlc3NDb21wb25lbnRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3JlLXBlcm1pc3Npb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvcmUtcGVybWlzc2lvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3JlUGVybWlzc2lvbkNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQElucHV0KCkgdHlwZSE6IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZTtcclxuICBAVmlld0NoaWxkKCdhdmF0YXInKSBhdmF0YXIhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2FjdGlvbnMnKSBhY3Rpb25zITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXIhOiBFbGVtZW50UmVmO1xyXG5cclxuICBoZWlnaHQhOiBudW1iZXI7XHJcbiAgdGl0bGUhOiBFbnVtVHJhbnNsYXRlS2V5XHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgcGlwZSE6IEVudW1Db3JlVGFibGVQaXBlVHlwZTtcclxuXHJcbiAgaXNSb290VXNlciE6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgY29tcG9zaXRpb25IZWlnaHQhOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWREYXRhOiBhbnlbXSA9IFtdO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG92ZXJyaWRlIG1sczogTXVsdGlMYW5ndWFnZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcmFzOiBSYW5kb21BdmF0YXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb3JlUGVybWlzc2lvblNlcnZpY2U6IENvcmVQZXJtaXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBwU2VydmljZTogQXBwU2VydmljZSxcclxuICAgIHB1YmxpYyBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkb21TZXJ2aWNlOiBEb21TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBncnBjU2VydmljZTogR3JwY1NlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKG1scyk7XHJcblxyXG4gICAgdGhpcy5kZWZhdWx0QXZhdGFyID0gcmFzLmdldCgpO1xyXG4gICAgdGhpcy5jb3JlUGVybWlzc2lvblNlcnZpY2UuaW5zdGFuY2VOdW1iZXIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCd1cGVybWlzc2lvbicpKSB0aGlzLnR5cGUgPSBFbnVtUGVybWlzc2lvbk9iamVjdFR5cGUuVVNFUlxyXG4gICAgaWYgKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnZ3JvdXBwZXJtaXNzaW9uJykpIHRoaXMudHlwZSA9IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSX0dST1VQXHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMucm91dGUucGFyYW1NYXAuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgIGNvbnN0IGlkID0geC5nZXQoJ2lkJyk7XHJcbiAgICAgICAgaWYgKCEhaWQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQkLm5leHQoaWQpXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSX0dST1VQKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQkLm5leHQoTnVtYmVyKGlkKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApXHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZGF0YSQuc3Vic2NyaWJlKHggPT4gdGhpcy5pc1Jvb3RVc2VyID0geD8uaXNSb290KVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgdGFiSGVhZGVyczogc3RyaW5nW10gPSBbXHJcbiAgICBFbnVtVHJhbnNsYXRlS2V5LlVJX1VTRVJfR1JPVVBfUEVSTUlTU0lPTl9GVU5DVElPTl9UQUIsIC8vIG1ha2UgdXNlIG9mIGFuIGV4aXN0aW5nIGtleVxyXG4gICAgRW51bVRyYW5zbGF0ZUtleS5VSV9VU0VSX0dST1VQX1BFUk1JU1NJT05fT1JHX1VOSVRfVEFCLCAvLyBtYWtlIHVzZSBvZiBhbiBleGlzdGluZyBrZXlcclxuICBdXHJcblxyXG4gIG9iamVjdElkITogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIG9iamVjdElkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4obnVsbCk7XHJcbiAgb3JnSWRzOiBudW1iZXJbXSA9IFtdO1xyXG4gIG9iamVjdFF1ZXJ5TGlzdEFwaSE6IGFwaTtcclxuICBvYmplY3RMaXN0VGV4dEZpZWxkITogc3RyaW5nO1xyXG4gIHBlbmRpbmdBY3Rpb24hOiBhbnk7XHJcbiAgcGVuZGluZ09iamVjdElkITogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDtcclxuXHJcbiAgc2hvd1N0YXRlVHJhY2tlciE6IGJvb2xlYW47XHJcblxyXG4gIHVzZXJMaXN0VGV4dFBpcGU6IEVudW1Db3JlVGFibGVQaXBlVHlwZSA9IEVudW1Db3JlVGFibGVQaXBlVHlwZS5VUFBFUkNBU0U7XHJcblxyXG4gIHRyZWVBY2Nlc3Nvck1vZGU6IEVudW1Db3JlT3JnVHJlZWFBY2Nlc3Nvck1vZGUgPSBFbnVtQ29yZU9yZ1RyZWVhQWNjZXNzb3JNb2RlLkNIRUNLRUQ7XHJcblxyXG4gIHVzZXJPcHRpb25zOiBJQ29yZUxpc3RPcHRpb25bXSA9IFtdXHJcblxyXG4gIG91dGVyRmlsdGVyT3BlcmF0b3JzOiBJRmlsdGVyT3BlcmF0b3JbXSA9IFtcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICd1c2VySWQnLFxyXG4gICAgICBvcGVyYXRvcjogRW51bUZpbHRlck9wZXJhdG9yLkVRVUFMXHJcbiAgICB9XHJcbiAgXVxyXG5cclxuICBsZWZ0QXBpRGVmaW5pdGlvbjogSUNvcmVQYWdlTGlzdEFwaURlZmluaXRpb24gPSB7XHJcbiAgICBxdWVyeUxpc3RSZWxhdGl2ZVBhdGg6IGFwaS5TWVNfVVNFUl9RVUVSWV9MSVNULFxyXG4gIH1cclxuXHJcbiAgYXBpRGVmaW5pdGlvbjogSUNvcmVQYWdlTGlzdEFwaURlZmluaXRpb24gPSB7XHJcbiAgICBxdWVyeUxpc3RSZWxhdGl2ZVBhdGg6IGFwaS5TWVNfVVNFUl9QRVJNSVNTSU9OX1FVRVJZX0xJU1QsXHJcbiAgfVxyXG5cclxuICBhbGxvd0VkaXQhOiBib29sZWFuO1xyXG5cclxuICBjb2x1bW5zOiBJQ29yZVRhYmxlQ29sdW1uSXRlbVtdID0gW1xyXG4gICAge1xyXG4gICAgICBjYXB0aW9uOiBFbnVtVHJhbnNsYXRlS2V5LlVJX0VOVElUWV9GSUVMRF9DQVBUSU9OX0NPTU1PTl9JRCxcclxuICAgICAgZmllbGQ6ICdpZCcsXHJcbiAgICAgIGhpZGRlbjogdHJ1ZSxcclxuICAgICAgdHlwZTogJ251bWJlcicsXHJcbiAgICAgIGFsaWduOiAncmlnaHQnLFxyXG4gICAgICB3aWR0aDogMCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGNhcHRpb246IEVudW1UcmFuc2xhdGVLZXkuVUlfRU5USVRZX0ZJRUxEX0NBUFRJT05fU1lTX01PRFVMRV9OQU1FQ09ERSxcclxuICAgICAgZmllbGQ6ICdtb2R1bGVOYW1lQ29kZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICB3aWR0aDogMTUwLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgY2FwdGlvbjogRW51bVRyYW5zbGF0ZUtleS5VSV9FTlRJVFlfRklFTERfQ0FQVElPTl9TWVNfRlVOQ1RJT05fUEFUSCxcclxuICAgICAgZmllbGQ6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGFsaWduOiAnbGVmdCcsXHJcbiAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICB9LFxyXG4gICAgLypcclxuICAgIHtcclxuICAgICAgY2FwdGlvbjogRW51bVRyYW5zbGF0ZUtleS5VSV9FTlRJVFlfRklFTERfQ0FQVElPTl9TWVNfRlVOQ1RJT05fR1JPVVBfTkFNRUNPREUsXHJcbiAgICAgIGZpZWxkOiAnZ3JvdXBOYW1lQ29kZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICB3aWR0aDogMTUwLFxyXG4gICAgfSxcclxuICAgICovXHJcbiAgICB7XHJcbiAgICAgIGNhcHRpb246IEVudW1UcmFuc2xhdGVLZXkuVUlfRU5USVRZX0ZJRUxEX0NBUFRJT05fU1lTX0ZVTkNUSU9OX05BTUVDT0RFLFxyXG4gICAgICBmaWVsZDogJ2Z1bmN0aW9uTmFtZUNvZGUnLFxyXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgYWxpZ246ICdsZWZ0JyxcclxuICAgICAgd2lkdGg6IDE1MCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGNhcHRpb246IEVudW1UcmFuc2xhdGVLZXkuVUlfRU5USVRZX0ZJRUxEX0NBUFRJT05fU1lTX0FDVElPTl9OQU1FQ09ERSxcclxuICAgICAgZmllbGQ6ICdhcHBBY3Rpb25zJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGFsaWduOiAnbGVmdCcsXHJcbiAgICAgIGhpZGVTZWFyY2hCb3g6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAxMDAwLFxyXG4gICAgICB0ZW1wbGF0ZVJlZjogdGhpcy5hY3Rpb25zLFxyXG4gICAgICB0ZW1wbGF0ZVJlZkFsbG93RWRpdE9uUm93QWN0aXZlZDogdHJ1ZVxyXG4gICAgfSxcclxuICBdXHJcblxyXG4gIGRlZmF1bHRBdmF0YXIhOiBzdHJpbmc7XHJcbiAgdHJlZUhlaWdodCE6IG51bWJlcjtcclxuICBjb3JlUGVybWlzc2lvbkFjdGlvbnNIZWlnaHQhOiBudW1iZXI7XHJcbiAgZGlhbG9nSW5zdGFuY2VOdW1iZXIhOiBudW1iZXI7XHJcblxyXG4gIGVkaXRSb3V0ZTogSUNvcmVQYWdlTGlzdEVkaXRSb3V0aW5nID0ge1xyXG4gICAgYXV4aWxpYXJ5OiAncG9wdXBBdXgnXHJcbiAgfVxyXG5cclxuICBhY3Rpb25QZXJtaXNzaW9uVmFsdWU6IElDb3JlRnVuY3Rpb25BY3Rpb25bXSA9IFtdXHJcbiAgaW5pdGlhbEFjdGlvblBlcm1pc3Npb25WYWx1ZUpzb25TdHJpbmchOiBzdHJpbmdcclxuICBjdXJyZW50QWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyE6IHN0cmluZ1xyXG4gIG9yZ1Blcm1pc3Npb25WYWx1ZTogbnVtYmVyW10gPSBbXVxyXG4gIGluaXRpYWxPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nITogc3RyaW5nXHJcbiAgY3VycmVudE9yZ1Blcm1pc3Npb25WYWx1ZUpzb25TdHJpbmchOiBzdHJpbmdcclxuXHJcblxyXG4gIHF1ZXJ5RnVuY3Rpb25BY3Rpb25QZXJtaXNzaW9uTGlzdEFwaUVuZHBvaW50ITogc3RyaW5nO1xyXG4gIHF1ZXJ5T3JnUGVybWlzc2lvbkxpc3RBcGlFbmRwb2ludCE6IHN0cmluZztcclxuXHJcbiAgYmxvY2tpbmdMZWZ0TGlzdEludGVyYWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICB1cGRhdGVJbml0aWFsQWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyhmdW5jdGlvbkFjdGlvbnM6IElDb3JlRnVuY3Rpb25BY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0aWFsQWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQsIGFjdGlvbnM6IGZ1bmN0aW9uQWN0aW9ucyB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUluaXRpYWxPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nKG9yZ0lkczogbnVtYmVyW10pOiB2b2lkIHtcclxuICAgIHRoaXMub3JnUGVybWlzc2lvblZhbHVlID0gb3JnSWRzO1xyXG4gICAgdGhpcy5pbml0aWFsT3JnUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQsIG9yZ0lkczogb3JnSWRzIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpZWxkID09PSAnYXBwQWN0aW9ucycpWzBdLnRlbXBsYXRlUmVmID0gdGhpcy5hY3Rpb25zO1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLmNvbnRlbnRDb250YWluZXJIZWlnaHQkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25IZWlnaHQgPSB4IC0gdGhpcy5sYXlvdXRTZXJ2aWNlLmNvcmVQYWdlSGVhZGVySGVpZ2h0IC0gdGhpcy5sYXlvdXRTZXJ2aWNlLmJhc2ljU3BhY2luZ1xyXG4gICAgICAgICAgdGhpcy5jb3JlUGVybWlzc2lvbkFjdGlvbnNIZWlnaHQgPSB0aGlzLmNvbXBvc2l0aW9uSGVpZ2h0IC0gdGhpcy5sYXlvdXRTZXJ2aWNlLmNvcmVUYWJzSGVhZGVyTGluZUhlaWdodCAtIHRoaXMubGF5b3V0U2VydmljZS5iYXNpY1NwYWNpbmdcclxuICAgICAgICAgIHRoaXMudHJlZUhlaWdodCA9IHggLSB0aGlzLmxheW91dFNlcnZpY2UuY29yZVBhZ2VIZWFkZXJIZWlnaHQgLSB0aGlzLmxheW91dFNlcnZpY2UuYmFzaWNTcGFjaW5nICogMiAtIHRoaXMubGF5b3V0U2VydmljZS5jb3JlVGFic0hlYWRlckxpbmVIZWlnaHRcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcblxyXG4gICAgICBpZiAodGhpcy50eXBlID09PSBFbnVtUGVybWlzc2lvbk9iamVjdFR5cGUuVVNFUikge1xyXG4gICAgICAgIHRoaXMudGl0bGUgPSBFbnVtVHJhbnNsYXRlS2V5LlVJX0NPTVBPTkVOVF9USVRMRV9VU0VSX1BFUk1JU1NJT05cclxuICAgICAgICB0aGlzLnBpcGUgPSBFbnVtQ29yZVRhYmxlUGlwZVR5cGUuTE9XRVJDQVNFXHJcbiAgICAgICAgdGhpcy5vYmplY3RRdWVyeUxpc3RBcGkgPSBhcGkuU1lTX1VTRVJfUVVFUllfTElTVFxyXG4gICAgICAgIHRoaXMucXVlcnlGdW5jdGlvbkFjdGlvblBlcm1pc3Npb25MaXN0QXBpRW5kcG9pbnQgPSBhcGkuU1lTX1VTRVJfUVVFUllfRlVOQ1RJT05fQUNUSU9OX1BFUk1JU1NJT05fTElTVFxyXG4gICAgICAgIHRoaXMucXVlcnlPcmdQZXJtaXNzaW9uTGlzdEFwaUVuZHBvaW50ID0gYXBpLlNZU19VU0VSX1FVRVJZX1VTRVJfT1JHX1BFUk1JU1NJT05fTElTVFxyXG4gICAgICAgIHRoaXMub2JqZWN0TGlzdFRleHRGaWVsZCA9IFwidXNlcm5hbWVcIlxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gRW51bVBlcm1pc3Npb25PYmplY3RUeXBlLlVTRVJfR1JPVVApIHtcclxuICAgICAgICB0aGlzLnRpdGxlID0gRW51bVRyYW5zbGF0ZUtleS5VSV9DT01QT05FTlRfVElUTEVfVVNFUl9HUk9VUF9QRVJNSVNTSU9OXHJcbiAgICAgICAgdGhpcy5waXBlID0gRW51bUNvcmVUYWJsZVBpcGVUeXBlLlVQUEVSQ0FTRVxyXG4gICAgICAgIHRoaXMub2JqZWN0UXVlcnlMaXN0QXBpID0gYXBpLlNZU19HUk9VUF9RVUVSWV9MSVNUXHJcbiAgICAgICAgdGhpcy5xdWVyeUZ1bmN0aW9uQWN0aW9uUGVybWlzc2lvbkxpc3RBcGlFbmRwb2ludCA9IGFwaS5TWVNfR1JPVVBfUVVFUllfRlVOQ1RJT05fQUNUSU9OX1BFUk1JU1NJT05fTElTVF9HUlBDXHJcbiAgICAgICAgdGhpcy5xdWVyeU9yZ1Blcm1pc3Npb25MaXN0QXBpRW5kcG9pbnQgPSBhcGkuU1lTX0dST1VQX1FVRVJZX0dST1VQX09SR19QRVJNSVNTSU9OX0xJU1RcclxuICAgICAgICB0aGlzLm9iamVjdExpc3RUZXh0RmllbGQgPSBcIm5hbWVcIlxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IodGhpcy5tbHMudHJhbnMoJ1VJX1BFUk1JU1NJT05fT0JKRUNUX0lTX1VOREVGSU5FRCcsIHRoaXMubGFuZyksIG5vbmVBdXRvQ2xvc2VkQWxlcnRPcHRpb25zKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmRpYWxvZ0NvbmZpcm1lZCQucGlwZShcclxuICAgICAgICAgIGZpbHRlcih4ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICEheCAmJiAhIXguY29uZmlybWVkICYmICEheD8uaW5zdGFuY2VOdW1iZXJcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRoaXMuZGlhbG9nU2VydmljZS5kaWFsb2dDb25maXJtZWQkXCIsIHgpXHJcbiAgICAgICAgICBpZiAoISEheD8uY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQgPSB0aGlzLm9iamVjdElkJC52YWx1ZSE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UucmVzZXRTZXJ2aWNlKClcclxuXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG5cclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkT2JqZWN0QWN0aW9uUGVybWlzc2lvbnMkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgIHRoaXMuYWN0aW9uUGVybWlzc2lvblZhbHVlID0geDtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLm9iamVjdElkJC5waXBlKFxyXG4gICAgICAgICAgZmlsdGVyKHggPT4gISF4ICYmIHggIT09IDAgJiYgeCAhPT0gJzAnKSxcclxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICBtYXAoeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkT2JqZWN0QWN0aW9uUGVybWlzc2lvbnMkLm5leHQoW10pO1xyXG4gICAgICAgICAgICB0aGlzLm9yZ0lkcyA9IFtdO1xyXG4gICAgICAgICAgICByZXR1cm4geDtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja2luZ0xlZnRMaXN0SW50ZXJhY3Rpb24kLm5leHQodHJ1ZSlcclxuICAgICAgICAgICAgaWYgKCEhIXRoaXMub2JqZWN0SWQpIHRoaXMub2JqZWN0SWQgPSBvYmplY3RJZCE7XHJcbiAgICAgICAgICAgIHJldHVybiB6aXAoW1xyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5nZXQodGhpcy5xdWVyeUZ1bmN0aW9uQWN0aW9uUGVybWlzc2lvbkxpc3RBcGlFbmRwb2ludCArICc/b2JqZWN0SWQ9JyArIG9iamVjdElkICsgXCImdXNlR3JvdXBJZkVtcHR5PWZhbHNlXCIpLFxyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5nZXQodGhpcy5xdWVyeU9yZ1Blcm1pc3Npb25MaXN0QXBpRW5kcG9pbnQgKyAnP29iamVjdElkPScgKyBvYmplY3RJZCArIFwiJnVzZUdyb3VwSWZFbXB0eT1mYWxzZVwiKV0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICkuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmJsb2NraW5nTGVmdExpc3RJbnRlcmFjdGlvbiQubmV4dChmYWxzZSlcclxuICAgICAgICAgIGlmICh4WzBdLm9rICYmIHhbMF0uc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgY29uc3QgYm9keTogSUZvcm1hdGVkUmVzcG9uc2UgPSB4WzBdLmJvZHk7XHJcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkT2JqZWN0QWN0aW9uUGVybWlzc2lvbnMkLm5leHQoYm9keS5pbm5lckJvZHkpO1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlSW5pdGlhbEFjdGlvblBlcm1pc3Npb25WYWx1ZUpzb25TdHJpbmcoYm9keS5pbm5lckJvZHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoeFsxXS5vayAmJiB4WzFdLnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvZHkxOiBJRm9ybWF0ZWRSZXNwb25zZSA9IHhbMV0uYm9keTtcclxuICAgICAgICAgICAgLy90aGlzLnJlc3BvbnNlU2VydmljZS5yZXNvbHZlKGJvZHkxKTtcclxuICAgICAgICAgICAgaWYgKGJvZHkxLnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMub3JnSWRzID0gYm9keTEuaW5uZXJCb2R5O1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlSW5pdGlhbE9yZ1Blcm1pc3Npb25WYWx1ZUpzb25TdHJpbmcoYm9keTEuaW5uZXJCb2R5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuXHJcbiAgICAgIHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLXotaW5kZXgnLCB0aGlzLmRvbVNlcnZpY2UuZ2V0TWF4WkluZGV4KCkpXHJcblxyXG4gICAgfSlcclxuXHJcbiAgfVxyXG5cclxuICAvKiBXZSBkbyBub3QgdXBkYXRlIHRoZSBncmlkIHdoZW4gdXNlcklkIGNoYW5nZXMgKi9cclxuICBvbk9iamVjdElkQ2hhbmdlKG9iamVjdElkOiBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLm9iamVjdElkID0gb2JqZWN0SWQ7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbb2JqZWN0SWQudG9TdHJpbmcoKV0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZS5wYXJlbnQgfSlcclxuICB9XHJcblxyXG4gIG9uQ29yZVBhZ2VIZWFkZXJCdXR0b25DbGljayhlOiBJQ29yZUJ1dHRvblZOUykge1xyXG4gICAgc3dpdGNoIChlLmNvZGUpIHtcclxuICAgICAgY2FzZSBFbnVtQ29yZUJ1dHRvblZOU0NvZGUuSEVBREVSX0VESVQ6XHJcbiAgICAgICAgaWYgKCEhdGhpcy5vYmplY3RJZCkge1xyXG4gICAgICAgICAgdGhpcy5hbGxvd0VkaXQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5pbmZvKHRoaXMubWxzLnRyYW5zKCdVSV9VU0VSX1BFUk1JU1NJT05fTk9fVVNFUl9TRUxFQ1RFRCcsIHRoaXMubGFuZyksIGFsZXJ0T3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEVudW1Db3JlQnV0dG9uVk5TQ29kZS5IRUFERVJfVVBFUk1JU1NJT05fREVMRVRFOlxyXG5cclxuICAgICAgICBpZiAoIXRoaXMub2JqZWN0SWQpIHtcclxuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLndhcm4odGhpcy5tbHMudHJhbnMoRW51bVRyYW5zbGF0ZUtleS5VSV9VU0VSX1BFUk1JU1NJT05fVE9fRURJVF9QTEVBU0VfU0VMRUNUX0FfVVNFUiksIGFsZXJ0T3B0aW9ucylcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS50aXRsZSQubmV4dChFbnVtVHJhbnNsYXRlS2V5LlVJX0NPUkVfRElBTE9HX1NFUlZJQ0VfQ09ORklSTUFUSU9OKVxyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub2tCdXR0b25UZXh0JC5uZXh0KEVudW1UcmFuc2xhdGVLZXkuVUlfQ09SRV9DT05GSVJNX0RJQUxPR19CVVRUT05fQ09ORklSTSlcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNhbmNlbEJ1dHRvblRleHQkLm5leHQoRW51bVRyYW5zbGF0ZUtleS5VSV9DT1JFX0NPTkZJUk1fRElBTE9HX0JVVFRPTl9DQU5DRUwpXHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93Q2FuY2VsT25seSQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5idXN5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmJvZHkkLm5leHQoRW51bVRyYW5zbGF0ZUtleS5VSV9DT1JFX0RJQUxPR19TRVJWSUNFX0FSRV9ZT1VfU1VSRV9UT19ERUxFVEUpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdERlbGV0ZUlkczogYW55W10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGEuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICBsaXN0RGVsZXRlSWRzLnB1c2goeFt0aGlzLmNvbHVtbnNbMV0uZmllbGRdKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmluZm9ybWF0aW9uTGluZXMkLm5leHQobGlzdERlbGV0ZUlkcylcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dDb25maXJtRGlhbG9nJC5uZXh0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFbnVtQ29yZUJ1dHRvblZOU0NvZGUuSEVBREVSX1NBVkU6XHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gRW51bVBlcm1pc3Npb25PYmplY3RUeXBlLlVTRVIpIHtcclxuICAgICAgICAgIGNvbnN0IGFjdGlvblJhbmdlOiBJVXNlclBlcm1pc3Npb25Nb2RlbFtdID0gW107XHJcbiAgICAgICAgICB0aGlzLmFjdGlvblBlcm1pc3Npb25WYWx1ZS5tYXAoZiA9PiB7XHJcbiAgICAgICAgICAgIGYuYWxsb3dlZEFjdGlvbklkcz8ubWFwKGlkID0+IHtcclxuICAgICAgICAgICAgICBhY3Rpb25SYW5nZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogdGhpcy5vYmplY3RJZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25JZDogZi5mdW5jdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uSWQ6IGlkXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCBvcmdSYW5nZTogSVVzZXJPcmdQZXJtaXNzaW9uTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5vcmdJZHMubWFwKG8gPT4ge1xyXG4gICAgICAgICAgICBvcmdSYW5nZS5wdXNoKHtcclxuICAgICAgICAgICAgICB1c2VySWQ6IHRoaXMub2JqZWN0SWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICBvcmdJZDogb1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnN0IGFjdGlvblBheWxvYWQgPSB7IHVzZXJJZDogdGhpcy5vYmplY3RJZCwgcmFuZ2U6IGFjdGlvblJhbmdlIH1cclxuICAgICAgICAgIGNvbnN0IG9yZ1BheWxvYWQgPSB7IHVzZXJJZDogdGhpcy5vYmplY3RJZCwgcmFuZ2U6IG9yZ1JhbmdlIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuXHJcbiAgICAgICAgICAgIHppcChbXHJcbiAgICAgICAgICAgICAgdGhpcy5hcHBTZXJ2aWNlLnBvc3QoYXBpLlNZU19VU0VSX0ZVTkNUSU9OX0FDVElPTl9QRVJNSVNTSU9OX1VQREFURV9SQU5HRSwgYWN0aW9uUGF5bG9hZCksXHJcbiAgICAgICAgICAgICAgdGhpcy5hcHBTZXJ2aWNlLnBvc3QoYXBpLlNZU19VU0VSX09SR19QRVJNSVNTSU9OX1VQREFURV9SQU5HRSwgb3JnUGF5bG9hZClcclxuICAgICAgICAgICAgXSkuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWxsb3dFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgaWYgKHhbMF0ub2sgJiYgeFswXS5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keTogSUZvcm1hdGVkUmVzcG9uc2UgPSB4WzBdLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMucmVzcG9uc2VTZXJ2aWNlLnJlc29sdmUoYm9keSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoSlNPTi5zdHJpbmdpZnkoeFswXSwgbnVsbCwgMiksIGFsZXJ0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh4WzFdLm9rICYmIHhbMV0uc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkxOiBJRm9ybWF0ZWRSZXNwb25zZSA9IHhbMV0uYm9keTtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5yZXNwb25zZVNlcnZpY2UucmVzb2x2ZShib2R5MSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keTEuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKEpTT04uc3RyaW5naWZ5KHhbMF0sIG51bGwsIDIpLCBhbGVydE9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gRW51bVBlcm1pc3Npb25PYmplY3RUeXBlLlVTRVJfR1JPVVApIHtcclxuICAgICAgICAgIGNvbnN0IGFjdGlvblJhbmdlOiBJR3JvdXBQZXJtaXNzaW9uTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25QZXJtaXNzaW9uVmFsdWUubWFwKGYgPT4ge1xyXG4gICAgICAgICAgICBmLmFsbG93ZWRBY3Rpb25JZHM/Lm1hcChpZCA9PiB7XHJcbiAgICAgICAgICAgICAgYWN0aW9uUmFuZ2UucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBncm91cElkOiBOdW1iZXIodGhpcy5vYmplY3RJZCksXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbklkOiBmLmZ1bmN0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICBhY3Rpb25JZDogaWRcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnN0IG9yZ1JhbmdlOiBJR3JvdXBPcmdQZXJtaXNzaW9uTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5vcmdJZHMubWFwKG8gPT4ge1xyXG4gICAgICAgICAgICBvcmdSYW5nZS5wdXNoKHtcclxuICAgICAgICAgICAgICBncm91cElkOiBOdW1iZXIodGhpcy5vYmplY3RJZCksXHJcbiAgICAgICAgICAgICAgb3JnSWQ6IG9cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25QYXlsb2FkID0geyBncm91cElkOiB0aGlzLm9iamVjdElkLCByYW5nZTogYWN0aW9uUmFuZ2UgfVxyXG4gICAgICAgICAgY29uc3Qgb3JnUGF5bG9hZCA9IHsgZ3JvdXBJZDogdGhpcy5vYmplY3RJZCwgcmFuZ2U6IG9yZ1JhbmdlIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuXHJcbiAgICAgICAgICAgIHppcChbXHJcbiAgICAgICAgICAgICAgdGhpcy5hcHBTZXJ2aWNlLnBvc3QoYXBpLlNZU19HUk9VUF9GVU5DVElPTl9BQ1RJT05fUEVSTUlTU0lPTl9VUERBVEVfUkFOR0UsIGFjdGlvblBheWxvYWQpLFxyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5wb3N0KGFwaS5TWVNfR1JPVVBfT1JHX1BFUk1JU1NJT05fVVBEQVRFX1JBTkdFLCBvcmdQYXlsb2FkKVxyXG4gICAgICAgICAgICBdKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hbGxvd0VkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBpZiAoeFswXS5vayAmJiB4WzBdLnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5OiBJRm9ybWF0ZWRSZXNwb25zZSA9IHhbMF0uYm9keTtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5yZXNwb25zZVNlcnZpY2UucmVzb2x2ZShib2R5KTtcclxuICAgICAgICAgICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmFsZXJ0U2VydmljZS5lcnJvcihKU09OLnN0cmluZ2lmeSh4WzBdLCBudWxsLCAyKSwgYWxlcnRPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHhbMV0ub2sgJiYgeFsxXS5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keTE6IElGb3JtYXRlZFJlc3BvbnNlID0geFsxXS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLnJlc3BvbnNlU2VydmljZS5yZXNvbHZlKGJvZHkxKTtcclxuICAgICAgICAgICAgICAgIGlmIChib2R5MS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoSlNPTi5zdHJpbmdpZnkoeFswXSwgbnVsbCwgMiksIGFsZXJ0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkFjdGlvblBlcm1pc3Npb25WYWx1ZUNoYW5nZShlOiBJQ29yZUZ1bmN0aW9uQWN0aW9uW10pOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKFwib25BY3Rpb25QZXJtaXNzaW9uVmFsdWVDaGFuZ2VcIiwgZSk7XHJcbiAgfVxyXG5cclxuICBvbk9yZ1RyZWVJdGVtQ2hlY2soZTogYW55KSB7XHJcbiAgICBpZiAoISEhdGhpcy5hbGxvd0VkaXQpIHtcclxuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuaW5mbyh0aGlzLm1scy50cmFucygnVUlfVVNFUl9QRVJNSVNTSU9OX1RPX0VESVRfUExFQVNFX1NFTEVDVF9BX1VTRVJfQU5EX0NMSUNLX1RIRV9QRU5DSUwnLCB0aGlzLmxhbmcpLCBhbGVydE9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbGlja0Nsb3NlU3RhdGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dTdGF0ZVRyYWNrZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNhbkRlYWN0aXZhdGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jdXJyZW50QWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aW9uUGVybWlzc2lvblZhbHVlKTtcclxuICAgIGNvbnN0IGNvbmRpdGlvbjEgPSB0aGlzLmN1cnJlbnRBY3Rpb25QZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nID09PSB0aGlzLmluaXRpYWxBY3Rpb25QZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nO1xyXG4gICAgdGhpcy5jdXJyZW50T3JnUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3JnUGVybWlzc2lvblZhbHVlKTtcclxuICAgIGNvbnN0IGNvbmRpdGlvbjIgPSB0aGlzLmN1cnJlbnRPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nID09PSB0aGlzLmluaXRpYWxPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nO1xyXG4gICAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9uMSAmJiBjb25kaXRpb24yO1xyXG5cclxuICAgIHJldHVybiB0cnVlOyAvLyBUTyBET1xyXG5cclxuICAgIGlmIChjb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgdGhpcy5wZW5kaW5nQWN0aW9uID0gJ0NIQU5HRVNfV0lMTF9CRV9MT1NUJztcclxuICAgICAgdGhpcy5kaWFsb2dJbnN0YW5jZU51bWJlciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICB0aGlzLnNob3dTdGF0ZVRyYWNrZXIgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmJ1c3kgPSB0cnVlO1xyXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuZGlhbG9nQ29uZmlybWVkJC5uZXh0KHtcclxuICAgICAgICBjb25maXJtZWQ6IGZhbHNlLFxyXG4gICAgICAgIGluc3RhbmNlTnVtYmVyOiB0aGlzLmRpYWxvZ0luc3RhbmNlTnVtYmVyXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93Q29uZmlybURpYWxvZyQubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRpdGxlJC5uZXh0KEVudW1UcmFuc2xhdGVLZXkuVUlfQ09SRV9DT05GSVJNX0RJQUxPR19USVRMRSk7XHJcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5ib2R5JC5uZXh0KEVudW1UcmFuc2xhdGVLZXkuVUlfQ09SRV9DT05GSVJNX0RJQUxPR19CT0RZX0NIQU5HRVNfV0lMTF9CRV9MT1NUKTtcclxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9rQnV0dG9uVGV4dCQubmV4dChFbnVtVHJhbnNsYXRlS2V5LlVJX0NPUkVfQ09ORklSTV9ESUFMT0dfQlVUVE9OX0NPTkZJUk0pO1xyXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY2FuY2VsQnV0dG9uVGV4dCQubmV4dChFbnVtVHJhbnNsYXRlS2V5LlVJX0NPUkVfQ09ORklSTV9ESUFMT0dfQlVUVE9OX0dPX0JBQ0tfVE9fRURJVF9GT1JNKTtcclxuICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IHRoaXMuZGlhbG9nU2VydmljZS5jYW5EZWFjdGl2YXRlJC5hc09ic2VydmFibGUoKTtcclxuICAgICAgcmV0dXJuIG9ic2VydmFibGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5tYXAoeCA9PiB4Py51bnN1YnNjcmliZSgpKVxyXG4gICAgdGhpcy5jb3JlUGVybWlzc2lvblNlcnZpY2UuaW5zdGFuY2VOdW1iZXIgPSBudWxsO1xyXG4gICAgdGhpcy5jb3JlUGVybWlzc2lvblNlcnZpY2Uuc2VsZWN0ZWRPYmplY3QkLm5leHQobnVsbCk7XHJcbiAgICB0aGlzLmNvcmVQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZE9iamVjdEFjdGlvblBlcm1pc3Npb25zJC5uZXh0KFtdKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgI2NvbnRhaW5lciBjbGFzcz1cImNvcmUtcGVybWlzc2lvbi1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7IGhlaWdodDogaGVpZ2h0ICsgJ3B4J31cIj5cclxuICA8Y29yZS1wYWdlLWhlYWRlciBbdGl0bGVdPVwidGl0bGVcIiAoYnV0dG9uQ2xpY2spPVwib25Db3JlUGFnZUhlYWRlckJ1dHRvbkNsaWNrKCRldmVudClcIj48L2NvcmUtcGFnZS1oZWFkZXI+XHJcblxyXG4gIDxjb3JlLWNvbXBvc2l0aW9uIFtsZWZ0XT1cInVzZXJTZWVrZXJcIiBbbGVmdFdpZHRoXT1cIjIwMFwiIFttYWluXT1cInRhYnNcIiBbaGVpZ2h0XT1cImNvbXBvc2l0aW9uSGVpZ2h0XCI+XHJcbiAgPC9jb3JlLWNvbXBvc2l0aW9uPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwic3RhdGUtdHJhY2tlciBjb250YWluZXIgY29udGFpbmVyLWZsdWlkXCIgKm5nSWY9XCJzaG93U3RhdGVUcmFja2VyICYmIGlzUm9vdFVzZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXggZC1mbGV4LWJldHdlZW5cIj5cclxuICAgICAgPHNwYW4+Q29tcGFyZTwvc3Bhbj5cclxuICAgICAgPGkgY2xhc3M9XCJmZWF0aGVyLXhcIiAoY2xpY2spPVwib25DbGlja0Nsb3NlU3RhdGUoKVwiPjwvaT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICB7eyBpbml0aWFsQWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAge3sgY3VycmVudEFjdGlvblBlcm1pc3Npb25WYWx1ZUpzb25TdHJpbmcgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAge3sgaW5pdGlhbE9yZ1Blcm1pc3Npb25WYWx1ZUpzb25TdHJpbmcgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgIHt7IGN1cnJlbnRPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdGFicz5cclxuICA8Y29yZS10YWJzIFtoZWFkZXJzXT1cInRhYkhlYWRlcnNcIiBbY29udGVudHNdPVwiW3RhYjEsIHRhYjJdXCIgW2hlaWdodF09XCJjb21wb3NpdGlvbkhlaWdodFwiPjwvY29yZS10YWJzPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0YWIxPlxyXG4gIDxkaXYgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGxheW91dFNlcnZpY2UuYmFzaWNTcGFjaW5nICsgJ3B4JyB9XCI+PC9kaXY+XHJcbiAgPGNvcmUtcGVybWlzc2lvbi1hY3Rpb25zIFtsb2FkaW5nXT1cImxvYWRpbmdcIiBbKG5nTW9kZWwpXT1cImFjdGlvblBlcm1pc3Npb25WYWx1ZVwiXHJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvbkFjdGlvblBlcm1pc3Npb25WYWx1ZUNoYW5nZSgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cIiEhIWFsbG93RWRpdFwiIFtoZWlnaHRdPVwiY29yZVBlcm1pc3Npb25BY3Rpb25zSGVpZ2h0XCI+PC9jb3JlLXBlcm1pc3Npb24tYWN0aW9ucz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdXNlclNlZWtlcj5cclxuXHJcbiAgPGNvcmUtbGlzdC1sYXp5IFtxdWVyeUxpc3RBcGldPVwib2JqZWN0UXVlcnlMaXN0QXBpXCIgW3RleHRGaWVsZF09XCJvYmplY3RMaXN0VGV4dEZpZWxkXCIgWyhuZ01vZGVsKV09XCJvYmplY3RJZFwiXHJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvbk9iamVjdElkQ2hhbmdlKCRldmVudClcIiBbaGVpZ2h0XT1cImNvbXBvc2l0aW9uSGVpZ2h0XCIgW2Jsb2NraW5nSW50ZXJhY3Rpb24kXT1cImJsb2NraW5nTGVmdExpc3RJbnRlcmFjdGlvbiRcIj48L2NvcmUtbGlzdC1sYXp5PlxyXG5cclxuXHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3RhYjI+XHJcbiAgPGRpdiBbbmdTdHlsZV09XCJ7IGhlaWdodDogbGF5b3V0U2VydmljZS5iYXNpY1NwYWNpbmcgKyAncHgnIH1cIj48L2Rpdj5cclxuICA8Y29yZS1vcmctdHJlZSBbZnVsbFdpZHRoTW9kZV09XCJ0cnVlXCIgW2FjY2Vzc29yTW9kZV09XCJ0cmVlQWNjZXNzb3JNb2RlXCIgWyhuZ01vZGVsKV09XCJvcmdJZHNcIiBbZGlzYWJsZWRdPVwiISEhYWxsb3dFZGl0XCJcclxuICAgIChpdGVtQ2xpY2spPVwib25PcmdUcmVlSXRlbUNoZWNrKCRldmVudClcIiBuYW1lPVwib3JnSWRzXCIgbmdEZWZhdWx0Q29udHJvbCBbaGVpZ2h0XT1cInRyZWVIZWlnaHRcIj48L2NvcmUtb3JnLXRyZWU+XHJcbjwvbmctdGVtcGxhdGU+Il19
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS1wZXJtaXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLXBlcm1pc3Npb24vY29yZS1wZXJtaXNzaW9uL2NvcmUtcGVybWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaGlzdGFmZi1hbHBoYS9zcmMvbGliL2FwcC9saWJyYXJpZXMvY29yZS1wZXJtaXNzaW9uL2NvcmUtcGVybWlzc2lvbi9jb3JlLXBlcm1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsS0FBSyxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFFLGVBQWUsRUFBYyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBbUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUU1RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFjNUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDNUksT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0ZBQXNGLENBQUM7QUFDN0gsT0FBTyxFQUFFLFlBQVksRUFBRSwwQkFBMEIsRUFB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O3dCQUNqQiw4QkFBOEI7d0JBQzlCLDBCQUEwQjt3QkFDMUIsd0JBQXdCO3FCQUN6QjtpWkFNUSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ2UsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUNHLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDSSxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBpc0Rldk1vZGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB6aXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9saWJyYXJpZXMvYmFzZS1jb21wb25lbnQvYmFzZS9iYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBFbnVtVHJhbnNsYXRlS2V5IH0gZnJvbSBcImFscGhhLWdsb2JhbC1jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgRW51bUZpbHRlck9wZXJhdG9yLCBJRmlsdGVyT3BlcmF0b3IgfSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JUXVlcnlMaXN0UmVxdWVzdFwiO1xyXG5pbXBvcnQgeyBJQ29yZVBhZ2VMaXN0QXBpRGVmaW5pdGlvbiwgSUNvcmVQYWdlTGlzdEVkaXRSb3V0aW5nIH0gZnJvbSBcIi4uLy4uLy4uL2xpYnJhcmllcy9jb3JlLXBhZ2UtbGlzdC9jb3JlLXBhZ2UtbGlzdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgYXBpIH0gZnJvbSBcImFscGhhLWdsb2JhbC1jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgSUNvcmVUYWJsZUNvbHVtbkl0ZW0gfSBmcm9tIFwiLi4vLi4vY29yZS10YWJsZS9JQ29yZVRhYmxlQ29sdW1uSXRlbVwiO1xyXG5pbXBvcnQgeyBFbnVtQ29yZVRhYmxlUGlwZVR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtdGFibGUvRW51bUNvcmVUYWJsZVBpcGVUeXBlXCI7XHJcblxyXG5pbXBvcnQgeyBNdWx0aUxhbmd1YWdlU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9tdWx0aS1sYW5ndWFnZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFJhbmRvbUF2YXRhclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvcmFuZG9tLWF2YXRhci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvcmVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9saWJyYXJpZXMvY29yZS1wZXJtaXNzaW9uL2NvcmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvYXBwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2xpYnJhcmllcy9hbGVydC9hbGVydC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEb21TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2RvbS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvbGF5b3V0LnNlcnZpY2VcIjtcclxuXHJcbmltcG9ydCB7IElDb3JlTGlzdE9wdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9saWJyYXJpZXMvY29yZS1saXN0L2NvcmUtbGlzdC9jb3JlLWxpc3QuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElGb3JtYXRlZFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZvcm1hdGVkUmVzcG9uc2VcIjtcclxuaW1wb3J0IHsgSUNvcmVCdXR0b25WTlMgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtYnV0dG9uLWdyb3VwLXZucy9jb3JlLWJ1dHRvbi1ncm91cC12bnMvSUNvcmVCdXR0b25WTlNcIjtcclxuaW1wb3J0IHsgQ29yZU9yZ1RyZWVDb21wb25lbnQsIEVudW1Db3JlT3JnVHJlZWFBY2Nlc3Nvck1vZGUgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtb3JnLXRyZWUvY29yZS1vcmctdHJlZS9jb3JlLW9yZy10cmVlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBFbnVtQ29yZUJ1dHRvblZOU0NvZGUgfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtYnV0dG9uLWdyb3VwLXZucy9jb3JlLWJ1dHRvbi1ncm91cC12bnMvRW51bUNvcmVCdXR0b25WTlNDb2RlXCI7XHJcbmltcG9ydCB7IGFsZXJ0T3B0aW9ucywgbm9uZUF1dG9DbG9zZWRBbGVydE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzL2FsZXJ0T3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBDb3JlUGVybWlzc2lvbkFjdGlvbnNDb21wb25lbnQsIElDb3JlRnVuY3Rpb25BY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUtcGVybWlzc2lvbi1hY3Rpb25zL2NvcmUtcGVybWlzc2lvbi1hY3Rpb25zL2NvcmUtcGVybWlzc2lvbi1hY3Rpb25zLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQ29yZVBhZ2VMaXN0Q29udGVudENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb3JlLXBhZ2UtbGlzdC1jb250ZW50L2NvcmUtcGFnZS1saXN0LWNvbnRlbnQvY29yZS1wYWdlLWxpc3QtY29udGVudC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ29yZVRhYnNDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS10YWJzL2NvcmUtdGFicy9jb3JlLXRhYnMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvcmVQYWdlSGVhZGVyQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvcmUtcGFnZS1oZWFkZXIvY29yZS1wYWdlLWhlYWRlci9jb3JlLXBhZ2UtaGVhZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb3JlQ29tcG9zaXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS1jb21wb3NpdGlvbi9jb3JlLWNvbXBvc2l0aW9uL2NvcmUtY29tcG9zaXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvcmVMaXN0TGF6eUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb3JlLWxpc3QtbGF6eS9jb3JlLWxpc3QtbGF6eS9jb3JlLWxpc3QtbGF6eS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gXCIuLi8uLi8uLi9hcHAtcGlwZXMvdHJhbnNsYXRlLnBpcGVcIjtcclxuaW1wb3J0IHsgQ29yZVRhZ3NDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS10YWdzL2NvcmUtdGFncy9jb3JlLXRhZ3MuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvcmVDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvcmUtY29uZmlybS1kaWFsb2cvY29yZS1jb25maXJtLWRpYWxvZy9jb3JlLWNvbmZpcm0tZGlhbG9nLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb3JlQXBpUHJvZ3Jlc3NDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS1hcGktcHJvZ3Jlc3MvY29yZS1hcGktcHJvZ3Jlc3MvY29yZS1hcGktcHJvZ3Jlc3MuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvYXBwLWNvbmZpZy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyUGVybWlzc2lvbk1vZGVsIHtcclxuICB1c2VySWQ6IHN0cmluZztcclxuICBmdW5jdGlvbklkOiBudW1iZXI7XHJcbiAgYWN0aW9uSWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck9yZ1Blcm1pc3Npb25Nb2RlbCB7XHJcbiAgdXNlcklkOiBzdHJpbmc7XHJcbiAgb3JnSWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JvdXBQZXJtaXNzaW9uTW9kZWwge1xyXG4gIGdyb3VwSWQ6IG51bWJlcjtcclxuICBmdW5jdGlvbklkOiBudW1iZXI7XHJcbiAgYWN0aW9uSWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JvdXBPcmdQZXJtaXNzaW9uTW9kZWwge1xyXG4gIGdyb3VwSWQ6IG51bWJlcjtcclxuICBvcmdJZDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBFbnVtUGVybWlzc2lvbk9iamVjdFR5cGUge1xyXG4gIFVTRVIgPSAnVVNFUicsXHJcbiAgVVNFUl9HUk9VUCA9ICdVU0VSX0dST1VQJ1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NvcmUtcGVybWlzc2lvbicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIENvcmVPcmdUcmVlQ29tcG9uZW50LFxyXG4gICAgQ29yZVBhZ2VMaXN0Q29udGVudENvbXBvbmVudCxcclxuICAgIENvcmVUYWJzQ29tcG9uZW50LFxyXG4gICAgQ29yZVBhZ2VIZWFkZXJDb21wb25lbnQsXHJcbiAgICBDb3JlQ29tcG9zaXRpb25Db21wb25lbnQsXHJcbiAgICBDb3JlTGlzdExhenlDb21wb25lbnQsXHJcbiAgICBUcmFuc2xhdGVQaXBlLFxyXG4gICAgQ29yZVRhZ3NDb21wb25lbnQsXHJcbiAgICBDb3JlUGVybWlzc2lvbkFjdGlvbnNDb21wb25lbnQsXHJcbiAgICBDb3JlQ29uZmlybURpYWxvZ0NvbXBvbmVudCxcclxuICAgIENvcmVBcGlQcm9ncmVzc0NvbXBvbmVudFxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvcmUtcGVybWlzc2lvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29yZS1wZXJtaXNzaW9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvcmVQZXJtaXNzaW9uQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBASW5wdXQoKSB0eXBlITogRW51bVBlcm1pc3Npb25PYmplY3RUeXBlO1xyXG4gIEBWaWV3Q2hpbGQoJ2F2YXRhcicpIGF2YXRhciE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnYWN0aW9ucycpIGFjdGlvbnMhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIGhlaWdodCE6IG51bWJlcjtcclxuICB0aXRsZSE6IEVudW1UcmFuc2xhdGVLZXlcclxuICBsb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBwaXBlITogRW51bUNvcmVUYWJsZVBpcGVUeXBlO1xyXG5cclxuICBpc1Jvb3RVc2VyITogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBjb21wb3NpdGlvbkhlaWdodCE6IG51bWJlcjtcclxuICBzZWxlY3RlZERhdGE6IGFueVtdID0gW107XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbWxzOiBNdWx0aUxhbmd1YWdlU2VydmljZSxcclxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByYXM6IFJhbmRvbUF2YXRhclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVQZXJtaXNzaW9uU2VydmljZTogQ29yZVBlcm1pc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBBcHBTZXJ2aWNlLFxyXG4gICAgcHVibGljIGxheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRvbVNlcnZpY2U6IERvbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKG1scyk7XHJcblxyXG4gICAgdGhpcy5kZWZhdWx0QXZhdGFyID0gcmFzLmdldCgpO1xyXG4gICAgdGhpcy5jb3JlUGVybWlzc2lvblNlcnZpY2UuaW5zdGFuY2VOdW1iZXIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCd1cGVybWlzc2lvbicpKSB0aGlzLnR5cGUgPSBFbnVtUGVybWlzc2lvbk9iamVjdFR5cGUuVVNFUlxyXG4gICAgaWYgKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnZ3JvdXBwZXJtaXNzaW9uJykpIHRoaXMudHlwZSA9IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSX0dST1VQXHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMucm91dGUucGFyYW1NYXAuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgIGNvbnN0IGlkID0geC5nZXQoJ2lkJyk7XHJcbiAgICAgICAgaWYgKCEhaWQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQkLm5leHQoaWQpXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSX0dST1VQKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQkLm5leHQoTnVtYmVyKGlkKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApXHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZGF0YSQuc3Vic2NyaWJlKHggPT4gdGhpcy5pc1Jvb3RVc2VyID0geD8uaXNSb290KVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgdGFiSGVhZGVyczogc3RyaW5nW10gPSBbXHJcbiAgICBFbnVtVHJhbnNsYXRlS2V5LlVJX1VTRVJfR1JPVVBfUEVSTUlTU0lPTl9GVU5DVElPTl9UQUIsIC8vIG1ha2UgdXNlIG9mIGFuIGV4aXN0aW5nIGtleVxyXG4gICAgRW51bVRyYW5zbGF0ZUtleS5VSV9VU0VSX0dST1VQX1BFUk1JU1NJT05fT1JHX1VOSVRfVEFCLCAvLyBtYWtlIHVzZSBvZiBhbiBleGlzdGluZyBrZXlcclxuICBdXHJcblxyXG4gIG9iamVjdElkITogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIG9iamVjdElkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4obnVsbCk7XHJcbiAgb3JnSWRzOiBudW1iZXJbXSA9IFtdO1xyXG4gIG9iamVjdFF1ZXJ5TGlzdEFwaSE6IGFwaTtcclxuICBvYmplY3RMaXN0VGV4dEZpZWxkITogc3RyaW5nO1xyXG4gIHBlbmRpbmdBY3Rpb24hOiBhbnk7XHJcbiAgcGVuZGluZ09iamVjdElkITogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDtcclxuXHJcbiAgc2hvd1N0YXRlVHJhY2tlciE6IGJvb2xlYW47XHJcblxyXG4gIHVzZXJMaXN0VGV4dFBpcGU6IEVudW1Db3JlVGFibGVQaXBlVHlwZSA9IEVudW1Db3JlVGFibGVQaXBlVHlwZS5VUFBFUkNBU0U7XHJcblxyXG4gIHRyZWVBY2Nlc3Nvck1vZGU6IEVudW1Db3JlT3JnVHJlZWFBY2Nlc3Nvck1vZGUgPSBFbnVtQ29yZU9yZ1RyZWVhQWNjZXNzb3JNb2RlLkNIRUNLRUQ7XHJcblxyXG4gIHVzZXJPcHRpb25zOiBJQ29yZUxpc3RPcHRpb25bXSA9IFtdXHJcblxyXG4gIG91dGVyRmlsdGVyT3BlcmF0b3JzOiBJRmlsdGVyT3BlcmF0b3JbXSA9IFtcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICd1c2VySWQnLFxyXG4gICAgICBvcGVyYXRvcjogRW51bUZpbHRlck9wZXJhdG9yLkVRVUFMXHJcbiAgICB9XHJcbiAgXVxyXG5cclxuICBsZWZ0QXBpRGVmaW5pdGlvbjogSUNvcmVQYWdlTGlzdEFwaURlZmluaXRpb24gPSB7XHJcbiAgICBxdWVyeUxpc3RSZWxhdGl2ZVBhdGg6IGFwaS5TWVNfVVNFUl9RVUVSWV9MSVNULFxyXG4gIH1cclxuXHJcbiAgYXBpRGVmaW5pdGlvbjogSUNvcmVQYWdlTGlzdEFwaURlZmluaXRpb24gPSB7XHJcbiAgICBxdWVyeUxpc3RSZWxhdGl2ZVBhdGg6IGFwaS5TWVNfVVNFUl9QRVJNSVNTSU9OX1FVRVJZX0xJU1QsXHJcbiAgfVxyXG5cclxuICBhbGxvd0VkaXQhOiBib29sZWFuO1xyXG5cclxuICBjb2x1bW5zOiBJQ29yZVRhYmxlQ29sdW1uSXRlbVtdID0gW1xyXG4gICAge1xyXG4gICAgICBjYXB0aW9uOiBFbnVtVHJhbnNsYXRlS2V5LlVJX0VOVElUWV9GSUVMRF9DQVBUSU9OX0NPTU1PTl9JRCxcclxuICAgICAgZmllbGQ6ICdpZCcsXHJcbiAgICAgIGhpZGRlbjogdHJ1ZSxcclxuICAgICAgdHlwZTogJ251bWJlcicsXHJcbiAgICAgIGFsaWduOiAncmlnaHQnLFxyXG4gICAgICB3aWR0aDogMCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGNhcHRpb246IEVudW1UcmFuc2xhdGVLZXkuVUlfRU5USVRZX0ZJRUxEX0NBUFRJT05fU1lTX01PRFVMRV9OQU1FQ09ERSxcclxuICAgICAgZmllbGQ6ICdtb2R1bGVOYW1lQ29kZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICB3aWR0aDogMTUwLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgY2FwdGlvbjogRW51bVRyYW5zbGF0ZUtleS5VSV9FTlRJVFlfRklFTERfQ0FQVElPTl9TWVNfRlVOQ1RJT05fUEFUSCxcclxuICAgICAgZmllbGQ6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGFsaWduOiAnbGVmdCcsXHJcbiAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICB9LFxyXG4gICAgLypcclxuICAgIHtcclxuICAgICAgY2FwdGlvbjogRW51bVRyYW5zbGF0ZUtleS5VSV9FTlRJVFlfRklFTERfQ0FQVElPTl9TWVNfRlVOQ1RJT05fR1JPVVBfTkFNRUNPREUsXHJcbiAgICAgIGZpZWxkOiAnZ3JvdXBOYW1lQ29kZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICB3aWR0aDogMTUwLFxyXG4gICAgfSxcclxuICAgICovXHJcbiAgICB7XHJcbiAgICAgIGNhcHRpb246IEVudW1UcmFuc2xhdGVLZXkuVUlfRU5USVRZX0ZJRUxEX0NBUFRJT05fU1lTX0ZVTkNUSU9OX05BTUVDT0RFLFxyXG4gICAgICBmaWVsZDogJ2Z1bmN0aW9uTmFtZUNvZGUnLFxyXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgYWxpZ246ICdsZWZ0JyxcclxuICAgICAgd2lkdGg6IDE1MCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGNhcHRpb246IEVudW1UcmFuc2xhdGVLZXkuVUlfRU5USVRZX0ZJRUxEX0NBUFRJT05fU1lTX0FDVElPTl9OQU1FQ09ERSxcclxuICAgICAgZmllbGQ6ICdhcHBBY3Rpb25zJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGFsaWduOiAnbGVmdCcsXHJcbiAgICAgIGhpZGVTZWFyY2hCb3g6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAxMDAwLFxyXG4gICAgICB0ZW1wbGF0ZVJlZjogdGhpcy5hY3Rpb25zLFxyXG4gICAgICB0ZW1wbGF0ZVJlZkFsbG93RWRpdE9uUm93QWN0aXZlZDogdHJ1ZVxyXG4gICAgfSxcclxuICBdXHJcblxyXG4gIGRlZmF1bHRBdmF0YXIhOiBzdHJpbmc7XHJcbiAgdHJlZUhlaWdodCE6IG51bWJlcjtcclxuICBjb3JlUGVybWlzc2lvbkFjdGlvbnNIZWlnaHQhOiBudW1iZXI7XHJcbiAgZGlhbG9nSW5zdGFuY2VOdW1iZXIhOiBudW1iZXI7XHJcblxyXG4gIGVkaXRSb3V0ZTogSUNvcmVQYWdlTGlzdEVkaXRSb3V0aW5nID0ge1xyXG4gICAgYXV4aWxpYXJ5OiAncG9wdXBBdXgnXHJcbiAgfVxyXG5cclxuICBhY3Rpb25QZXJtaXNzaW9uVmFsdWU6IElDb3JlRnVuY3Rpb25BY3Rpb25bXSA9IFtdXHJcbiAgaW5pdGlhbEFjdGlvblBlcm1pc3Npb25WYWx1ZUpzb25TdHJpbmchOiBzdHJpbmdcclxuICBjdXJyZW50QWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyE6IHN0cmluZ1xyXG4gIG9yZ1Blcm1pc3Npb25WYWx1ZTogbnVtYmVyW10gPSBbXVxyXG4gIGluaXRpYWxPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nITogc3RyaW5nXHJcbiAgY3VycmVudE9yZ1Blcm1pc3Npb25WYWx1ZUpzb25TdHJpbmchOiBzdHJpbmdcclxuXHJcblxyXG4gIHF1ZXJ5RnVuY3Rpb25BY3Rpb25QZXJtaXNzaW9uTGlzdEFwaUVuZHBvaW50ITogc3RyaW5nO1xyXG4gIHF1ZXJ5T3JnUGVybWlzc2lvbkxpc3RBcGlFbmRwb2ludCE6IHN0cmluZztcclxuXHJcbiAgYmxvY2tpbmdMZWZ0TGlzdEludGVyYWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICB1cGRhdGVJbml0aWFsQWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyhmdW5jdGlvbkFjdGlvbnM6IElDb3JlRnVuY3Rpb25BY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0aWFsQWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQsIGFjdGlvbnM6IGZ1bmN0aW9uQWN0aW9ucyB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUluaXRpYWxPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nKG9yZ0lkczogbnVtYmVyW10pOiB2b2lkIHtcclxuICAgIHRoaXMub3JnUGVybWlzc2lvblZhbHVlID0gb3JnSWRzO1xyXG4gICAgdGhpcy5pbml0aWFsT3JnUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQsIG9yZ0lkczogb3JnSWRzIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpZWxkID09PSAnYXBwQWN0aW9ucycpWzBdLnRlbXBsYXRlUmVmID0gdGhpcy5hY3Rpb25zO1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLmNvbnRlbnRDb250YWluZXJIZWlnaHQkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25IZWlnaHQgPSB4IC0gdGhpcy5sYXlvdXRTZXJ2aWNlLmNvcmVQYWdlSGVhZGVySGVpZ2h0IC0gdGhpcy5sYXlvdXRTZXJ2aWNlLmJhc2ljU3BhY2luZ1xyXG4gICAgICAgICAgdGhpcy5jb3JlUGVybWlzc2lvbkFjdGlvbnNIZWlnaHQgPSB0aGlzLmNvbXBvc2l0aW9uSGVpZ2h0IC0gdGhpcy5sYXlvdXRTZXJ2aWNlLmNvcmVUYWJzSGVhZGVyTGluZUhlaWdodCAtIHRoaXMubGF5b3V0U2VydmljZS5iYXNpY1NwYWNpbmdcclxuICAgICAgICAgIHRoaXMudHJlZUhlaWdodCA9IHggLSB0aGlzLmxheW91dFNlcnZpY2UuY29yZVBhZ2VIZWFkZXJIZWlnaHQgLSB0aGlzLmxheW91dFNlcnZpY2UuYmFzaWNTcGFjaW5nICogMiAtIHRoaXMubGF5b3V0U2VydmljZS5jb3JlVGFic0hlYWRlckxpbmVIZWlnaHRcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcblxyXG4gICAgICBpZiAodGhpcy50eXBlID09PSBFbnVtUGVybWlzc2lvbk9iamVjdFR5cGUuVVNFUikge1xyXG4gICAgICAgIHRoaXMudGl0bGUgPSBFbnVtVHJhbnNsYXRlS2V5LlVJX0NPTVBPTkVOVF9USVRMRV9VU0VSX1BFUk1JU1NJT05cclxuICAgICAgICB0aGlzLnBpcGUgPSBFbnVtQ29yZVRhYmxlUGlwZVR5cGUuTE9XRVJDQVNFXHJcbiAgICAgICAgdGhpcy5vYmplY3RRdWVyeUxpc3RBcGkgPSBhcGkuU1lTX1VTRVJfUVVFUllfTElTVFxyXG4gICAgICAgIHRoaXMucXVlcnlGdW5jdGlvbkFjdGlvblBlcm1pc3Npb25MaXN0QXBpRW5kcG9pbnQgPSBhcGkuU1lTX1VTRVJfUVVFUllfRlVOQ1RJT05fQUNUSU9OX1BFUk1JU1NJT05fTElTVFxyXG4gICAgICAgIHRoaXMucXVlcnlPcmdQZXJtaXNzaW9uTGlzdEFwaUVuZHBvaW50ID0gYXBpLlNZU19VU0VSX1FVRVJZX1VTRVJfT1JHX1BFUk1JU1NJT05fTElTVFxyXG4gICAgICAgIHRoaXMub2JqZWN0TGlzdFRleHRGaWVsZCA9IFwidXNlcm5hbWVcIlxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gRW51bVBlcm1pc3Npb25PYmplY3RUeXBlLlVTRVJfR1JPVVApIHtcclxuICAgICAgICB0aGlzLnRpdGxlID0gRW51bVRyYW5zbGF0ZUtleS5VSV9DT01QT05FTlRfVElUTEVfVVNFUl9HUk9VUF9QRVJNSVNTSU9OXHJcbiAgICAgICAgdGhpcy5waXBlID0gRW51bUNvcmVUYWJsZVBpcGVUeXBlLlVQUEVSQ0FTRVxyXG4gICAgICAgIHRoaXMub2JqZWN0UXVlcnlMaXN0QXBpID0gYXBpLlNZU19HUk9VUF9RVUVSWV9MSVNUXHJcbiAgICAgICAgdGhpcy5xdWVyeUZ1bmN0aW9uQWN0aW9uUGVybWlzc2lvbkxpc3RBcGlFbmRwb2ludCA9IGFwaS5TWVNfR1JPVVBfUVVFUllfRlVOQ1RJT05fQUNUSU9OX1BFUk1JU1NJT05fTElTVF9HUlBDXHJcbiAgICAgICAgdGhpcy5xdWVyeU9yZ1Blcm1pc3Npb25MaXN0QXBpRW5kcG9pbnQgPSBhcGkuU1lTX0dST1VQX1FVRVJZX0dST1VQX09SR19QRVJNSVNTSU9OX0xJU1RcclxuICAgICAgICB0aGlzLm9iamVjdExpc3RUZXh0RmllbGQgPSBcIm5hbWVcIlxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IodGhpcy5tbHMudHJhbnMoJ1VJX1BFUk1JU1NJT05fT0JKRUNUX0lTX1VOREVGSU5FRCcsIHRoaXMubGFuZyksIG5vbmVBdXRvQ2xvc2VkQWxlcnRPcHRpb25zKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmRpYWxvZ0NvbmZpcm1lZCQucGlwZShcclxuICAgICAgICAgIGZpbHRlcih4ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICEheCAmJiAhIXguY29uZmlybWVkICYmICEheD8uaW5zdGFuY2VOdW1iZXJcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRoaXMuZGlhbG9nU2VydmljZS5kaWFsb2dDb25maXJtZWQkXCIsIHgpXHJcbiAgICAgICAgICBpZiAoISEheD8uY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQgPSB0aGlzLm9iamVjdElkJC52YWx1ZSE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UucmVzZXRTZXJ2aWNlKClcclxuXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG5cclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkT2JqZWN0QWN0aW9uUGVybWlzc2lvbnMkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgIHRoaXMuYWN0aW9uUGVybWlzc2lvblZhbHVlID0geDtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLm9iamVjdElkJC5waXBlKFxyXG4gICAgICAgICAgZmlsdGVyKHggPT4gISF4ICYmIHggIT09IDAgJiYgeCAhPT0gJzAnKSxcclxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICBtYXAoeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkT2JqZWN0QWN0aW9uUGVybWlzc2lvbnMkLm5leHQoW10pO1xyXG4gICAgICAgICAgICB0aGlzLm9yZ0lkcyA9IFtdO1xyXG4gICAgICAgICAgICByZXR1cm4geDtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja2luZ0xlZnRMaXN0SW50ZXJhY3Rpb24kLm5leHQodHJ1ZSlcclxuICAgICAgICAgICAgaWYgKCEhIXRoaXMub2JqZWN0SWQpIHRoaXMub2JqZWN0SWQgPSBvYmplY3RJZCE7XHJcbiAgICAgICAgICAgIHJldHVybiB6aXAoW1xyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5nZXQodGhpcy5xdWVyeUZ1bmN0aW9uQWN0aW9uUGVybWlzc2lvbkxpc3RBcGlFbmRwb2ludCArICc/b2JqZWN0SWQ9JyArIG9iamVjdElkICsgXCImdXNlR3JvdXBJZkVtcHR5PWZhbHNlXCIpLFxyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5nZXQodGhpcy5xdWVyeU9yZ1Blcm1pc3Npb25MaXN0QXBpRW5kcG9pbnQgKyAnP29iamVjdElkPScgKyBvYmplY3RJZCArIFwiJnVzZUdyb3VwSWZFbXB0eT1mYWxzZVwiKV0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICkuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmJsb2NraW5nTGVmdExpc3RJbnRlcmFjdGlvbiQubmV4dChmYWxzZSlcclxuICAgICAgICAgIGlmICh4WzBdLm9rICYmIHhbMF0uc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgY29uc3QgYm9keTogSUZvcm1hdGVkUmVzcG9uc2UgPSB4WzBdLmJvZHk7XHJcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG5cclxuICAgICAgICAgICAgICAvLyBjaGVjayBmdW5jdGlvbklkIHRvIGJlIGluIGVsZW1lbnRzIG9mIHBlcm1pc3Npb24gYXJyYXlcclxuICAgICAgICAgICAgICBpZiAoISFib2R5Py5pbm5lckJvZHk/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJdGVtID0gYm9keSEuaW5uZXJCb2R5IVswXVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjaGVja0l0ZW0/LmZ1bmN0aW9uSWQpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpIHx8IHRoaXMuYXBwQ29uZmlnU2VydmljZS5ERUJVR19FTkFCTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoYEVhY2ggcm93IG9mIHRoZSBsaXN0IHJldHVybmVkIGJ5ICR7dGhpcy5xdWVyeUZ1bmN0aW9uQWN0aW9uUGVybWlzc2lvbkxpc3RBcGlFbmRwb2ludH0gbXVzdCBoYXZlIGEgZmllbGQgbmFtZWQgZnVuY3Rpb25JZC4gUGxlYXNlIGNoZWNrIHRoZSBCYWNrZW5kIWAsIG5vbmVBdXRvQ2xvc2VkQWxlcnRPcHRpb25zKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB0aGlzLmNvcmVQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZE9iamVjdEFjdGlvblBlcm1pc3Npb25zJC5uZXh0KGJvZHkuaW5uZXJCb2R5KTtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUluaXRpYWxBY3Rpb25QZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nKGJvZHkuaW5uZXJCb2R5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHhbMV0ub2sgJiYgeFsxXS5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICBjb25zdCBib2R5MTogSUZvcm1hdGVkUmVzcG9uc2UgPSB4WzFdLmJvZHk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5yZXNwb25zZVNlcnZpY2UucmVzb2x2ZShib2R5MSk7XHJcbiAgICAgICAgICAgIGlmIChib2R5MS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICB0aGlzLm9yZ0lkcyA9IGJvZHkxLmlubmVyQm9keTtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUluaXRpYWxPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nKGJvZHkxLmlubmVyQm9keSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcblxyXG4gICAgICB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS16LWluZGV4JywgdGhpcy5kb21TZXJ2aWNlLmdldE1heFpJbmRleCgpKVxyXG5cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgLyogV2UgZG8gbm90IHVwZGF0ZSB0aGUgZ3JpZCB3aGVuIHVzZXJJZCBjaGFuZ2VzICovXHJcbiAgb25PYmplY3RJZENoYW5nZShvYmplY3RJZDogc3RyaW5nIHwgbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNvcmVQZXJtaXNzaW9uU2VydmljZS5vYmplY3RJZCA9IG9iamVjdElkO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW29iamVjdElkLnRvU3RyaW5nKCldLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUucGFyZW50IH0pXHJcbiAgfVxyXG5cclxuICBvbkNvcmVQYWdlSGVhZGVyQnV0dG9uQ2xpY2soZTogSUNvcmVCdXR0b25WTlMpIHtcclxuICAgIHN3aXRjaCAoZS5jb2RlKSB7XHJcbiAgICAgIGNhc2UgRW51bUNvcmVCdXR0b25WTlNDb2RlLkhFQURFUl9FRElUOlxyXG4gICAgICAgIGlmICghIXRoaXMub2JqZWN0SWQpIHtcclxuICAgICAgICAgIHRoaXMuYWxsb3dFZGl0ID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuaW5mbyh0aGlzLm1scy50cmFucygnVUlfVVNFUl9QRVJNSVNTSU9OX05PX1VTRVJfU0VMRUNURUQnLCB0aGlzLmxhbmcpLCBhbGVydE9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFbnVtQ29yZUJ1dHRvblZOU0NvZGUuSEVBREVSX1VQRVJNSVNTSU9OX0RFTEVURTpcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLm9iamVjdElkKSB7XHJcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS53YXJuKHRoaXMubWxzLnRyYW5zKEVudW1UcmFuc2xhdGVLZXkuVUlfVVNFUl9QRVJNSVNTSU9OX1RPX0VESVRfUExFQVNFX1NFTEVDVF9BX1VTRVIpLCBhbGVydE9wdGlvbnMpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UudGl0bGUkLm5leHQoRW51bVRyYW5zbGF0ZUtleS5VSV9DT1JFX0RJQUxPR19TRVJWSUNFX0NPTkZJUk1BVElPTilcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9rQnV0dG9uVGV4dCQubmV4dChFbnVtVHJhbnNsYXRlS2V5LlVJX0NPUkVfQ09ORklSTV9ESUFMT0dfQlVUVE9OX0NPTkZJUk0pXHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5jYW5jZWxCdXR0b25UZXh0JC5uZXh0KEVudW1UcmFuc2xhdGVLZXkuVUlfQ09SRV9DT05GSVJNX0RJQUxPR19CVVRUT05fQ0FOQ0VMKVxyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0NhbmNlbE9ubHkkLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYnVzeSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5ib2R5JC5uZXh0KEVudW1UcmFuc2xhdGVLZXkuVUlfQ09SRV9ESUFMT0dfU0VSVklDRV9BUkVfWU9VX1NVUkVfVE9fREVMRVRFKTtcclxuICAgICAgICAgICAgbGV0IGxpc3REZWxldGVJZHM6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgbGlzdERlbGV0ZUlkcy5wdXNoKHhbdGhpcy5jb2x1bW5zWzFdLmZpZWxkXSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5pbmZvcm1hdGlvbkxpbmVzJC5uZXh0KGxpc3REZWxldGVJZHMpXHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93Q29uZmlybURpYWxvZyQubmV4dCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRW51bUNvcmVCdXR0b25WTlNDb2RlLkhFQURFUl9TQVZFOlxyXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25SYW5nZTogSVVzZXJQZXJtaXNzaW9uTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25QZXJtaXNzaW9uVmFsdWUubWFwKGYgPT4ge1xyXG4gICAgICAgICAgICBmLmFsbG93ZWRBY3Rpb25JZHM/Lm1hcChpZCA9PiB7XHJcbiAgICAgICAgICAgICAgYWN0aW9uUmFuZ2UucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHRoaXMub2JqZWN0SWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGYuZnVuY3Rpb25JZCxcclxuICAgICAgICAgICAgICAgIGFjdGlvbklkOiBpZFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY29uc3Qgb3JnUmFuZ2U6IElVc2VyT3JnUGVybWlzc2lvbk1vZGVsW10gPSBbXTtcclxuICAgICAgICAgIHRoaXMub3JnSWRzLm1hcChvID0+IHtcclxuICAgICAgICAgICAgb3JnUmFuZ2UucHVzaCh7XHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLm9iamVjdElkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgb3JnSWQ6IG9cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25QYXlsb2FkID0geyB1c2VySWQ6IHRoaXMub2JqZWN0SWQsIHJhbmdlOiBhY3Rpb25SYW5nZSB9XHJcbiAgICAgICAgICBjb25zdCBvcmdQYXlsb2FkID0geyB1c2VySWQ6IHRoaXMub2JqZWN0SWQsIHJhbmdlOiBvcmdSYW5nZSB9XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblxyXG4gICAgICAgICAgICB6aXAoW1xyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5wb3N0KGFwaS5TWVNfVVNFUl9GVU5DVElPTl9BQ1RJT05fUEVSTUlTU0lPTl9VUERBVEVfUkFOR0UsIGFjdGlvblBheWxvYWQpLFxyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5wb3N0KGFwaS5TWVNfVVNFUl9PUkdfUEVSTUlTU0lPTl9VUERBVEVfUkFOR0UsIG9yZ1BheWxvYWQpXHJcbiAgICAgICAgICAgIF0pLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmFsbG93RWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGlmICh4WzBdLm9rICYmIHhbMF0uc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHk6IElGb3JtYXRlZFJlc3BvbnNlID0geFswXS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLnJlc3BvbnNlU2VydmljZS5yZXNvbHZlKGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKEpTT04uc3RyaW5naWZ5KHhbMF0sIG51bGwsIDIpLCBhbGVydE9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoeFsxXS5vayAmJiB4WzFdLnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5MTogSUZvcm1hdGVkUmVzcG9uc2UgPSB4WzFdLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMucmVzcG9uc2VTZXJ2aWNlLnJlc29sdmUoYm9keTEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkxLnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmFsZXJ0U2VydmljZS5lcnJvcihKU09OLnN0cmluZ2lmeSh4WzBdLCBudWxsLCAyKSwgYWxlcnRPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IEVudW1QZXJtaXNzaW9uT2JqZWN0VHlwZS5VU0VSX0dST1VQKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25SYW5nZTogSUdyb3VwUGVybWlzc2lvbk1vZGVsW10gPSBbXTtcclxuICAgICAgICAgIHRoaXMuYWN0aW9uUGVybWlzc2lvblZhbHVlLm1hcChmID0+IHtcclxuICAgICAgICAgICAgZi5hbGxvd2VkQWN0aW9uSWRzPy5tYXAoaWQgPT4ge1xyXG4gICAgICAgICAgICAgIGFjdGlvblJhbmdlLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBJZDogTnVtYmVyKHRoaXMub2JqZWN0SWQpLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25JZDogZi5mdW5jdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uSWQ6IGlkXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCBvcmdSYW5nZTogSUdyb3VwT3JnUGVybWlzc2lvbk1vZGVsW10gPSBbXTtcclxuICAgICAgICAgIHRoaXMub3JnSWRzLm1hcChvID0+IHtcclxuICAgICAgICAgICAgb3JnUmFuZ2UucHVzaCh7XHJcbiAgICAgICAgICAgICAgZ3JvdXBJZDogTnVtYmVyKHRoaXMub2JqZWN0SWQpLFxyXG4gICAgICAgICAgICAgIG9yZ0lkOiBvXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY29uc3QgYWN0aW9uUGF5bG9hZCA9IHsgZ3JvdXBJZDogdGhpcy5vYmplY3RJZCwgcmFuZ2U6IGFjdGlvblJhbmdlIH1cclxuICAgICAgICAgIGNvbnN0IG9yZ1BheWxvYWQgPSB7IGdyb3VwSWQ6IHRoaXMub2JqZWN0SWQsIHJhbmdlOiBvcmdSYW5nZSB9XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblxyXG4gICAgICAgICAgICB6aXAoW1xyXG4gICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5wb3N0KGFwaS5TWVNfR1JPVVBfRlVOQ1RJT05fQUNUSU9OX1BFUk1JU1NJT05fVVBEQVRFX1JBTkdFLCBhY3Rpb25QYXlsb2FkKSxcclxuICAgICAgICAgICAgICB0aGlzLmFwcFNlcnZpY2UucG9zdChhcGkuU1lTX0dST1VQX09SR19QRVJNSVNTSU9OX1VQREFURV9SQU5HRSwgb3JnUGF5bG9hZClcclxuICAgICAgICAgICAgXSkuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWxsb3dFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgaWYgKHhbMF0ub2sgJiYgeFswXS5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keTogSUZvcm1hdGVkUmVzcG9uc2UgPSB4WzBdLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMucmVzcG9uc2VTZXJ2aWNlLnJlc29sdmUoYm9keSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoSlNPTi5zdHJpbmdpZnkoeFswXSwgbnVsbCwgMiksIGFsZXJ0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh4WzFdLm9rICYmIHhbMV0uc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkxOiBJRm9ybWF0ZWRSZXNwb25zZSA9IHhbMV0uYm9keTtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5yZXNwb25zZVNlcnZpY2UucmVzb2x2ZShib2R5MSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keTEuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKEpTT04uc3RyaW5naWZ5KHhbMF0sIG51bGwsIDIpLCBhbGVydE9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25BY3Rpb25QZXJtaXNzaW9uVmFsdWVDaGFuZ2UoZTogSUNvcmVGdW5jdGlvbkFjdGlvbltdKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyhcIm9uQWN0aW9uUGVybWlzc2lvblZhbHVlQ2hhbmdlXCIsIGUpO1xyXG4gIH1cclxuXHJcbiAgb25PcmdUcmVlSXRlbUNoZWNrKGU6IGFueSkge1xyXG4gICAgaWYgKCEhIXRoaXMuYWxsb3dFZGl0KSB7XHJcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmluZm8odGhpcy5tbHMudHJhbnMoJ1VJX1VTRVJfUEVSTUlTU0lPTl9UT19FRElUX1BMRUFTRV9TRUxFQ1RfQV9VU0VSX0FORF9DTElDS19USEVfUEVOQ0lMJywgdGhpcy5sYW5nKSwgYWxlcnRPcHRpb25zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xpY2tDbG9zZVN0YXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93U3RhdGVUcmFja2VyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjYW5EZWFjdGl2YXRlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBib29sZWFuIHtcclxuICAgIHRoaXMuY3VycmVudEFjdGlvblBlcm1pc3Npb25WYWx1ZUpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGlvblBlcm1pc3Npb25WYWx1ZSk7XHJcbiAgICBjb25zdCBjb25kaXRpb24xID0gdGhpcy5jdXJyZW50QWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9PT0gdGhpcy5pbml0aWFsQWN0aW9uUGVybWlzc2lvblZhbHVlSnNvblN0cmluZztcclxuICAgIHRoaXMuY3VycmVudE9yZ1Blcm1pc3Npb25WYWx1ZUpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9yZ1Blcm1pc3Npb25WYWx1ZSk7XHJcbiAgICBjb25zdCBjb25kaXRpb24yID0gdGhpcy5jdXJyZW50T3JnUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyA9PT0gdGhpcy5pbml0aWFsT3JnUGVybWlzc2lvblZhbHVlSnNvblN0cmluZztcclxuICAgIGNvbnN0IGNvbmRpdGlvbiA9IGNvbmRpdGlvbjEgJiYgY29uZGl0aW9uMjtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTsgLy8gVE8gRE9cclxuXHJcbiAgICBpZiAoY29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIHRoaXMucGVuZGluZ0FjdGlvbiA9ICdDSEFOR0VTX1dJTExfQkVfTE9TVCc7XHJcbiAgICAgIHRoaXMuZGlhbG9nSW5zdGFuY2VOdW1iZXIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgdGhpcy5zaG93U3RhdGVUcmFja2VyID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5idXN5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmRpYWxvZ0NvbmZpcm1lZCQubmV4dCh7XHJcbiAgICAgICAgY29uZmlybWVkOiBmYWxzZSxcclxuICAgICAgICBpbnN0YW5jZU51bWJlcjogdGhpcy5kaWFsb2dJbnN0YW5jZU51bWJlclxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0NvbmZpcm1EaWFsb2ckLm5leHQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS50aXRsZSQubmV4dChFbnVtVHJhbnNsYXRlS2V5LlVJX0NPUkVfQ09ORklSTV9ESUFMT0dfVElUTEUpO1xyXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYm9keSQubmV4dChFbnVtVHJhbnNsYXRlS2V5LlVJX0NPUkVfQ09ORklSTV9ESUFMT0dfQk9EWV9DSEFOR0VTX1dJTExfQkVfTE9TVCk7XHJcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5va0J1dHRvblRleHQkLm5leHQoRW51bVRyYW5zbGF0ZUtleS5VSV9DT1JFX0NPTkZJUk1fRElBTE9HX0JVVFRPTl9DT05GSVJNKTtcclxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNhbmNlbEJ1dHRvblRleHQkLm5leHQoRW51bVRyYW5zbGF0ZUtleS5VSV9DT1JFX0NPTkZJUk1fRElBTE9HX0JVVFRPTl9HT19CQUNLX1RPX0VESVRfRk9STSk7XHJcbiAgICAgIGNvbnN0IG9ic2VydmFibGUgPSB0aGlzLmRpYWxvZ1NlcnZpY2UuY2FuRGVhY3RpdmF0ZSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgIHJldHVybiBvYnNlcnZhYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMubWFwKHggPT4geD8udW5zdWJzY3JpYmUoKSlcclxuICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLmluc3RhbmNlTnVtYmVyID0gbnVsbDtcclxuICAgIHRoaXMuY29yZVBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkT2JqZWN0JC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy5jb3JlUGVybWlzc2lvblNlcnZpY2Uuc2VsZWN0ZWRPYmplY3RBY3Rpb25QZXJtaXNzaW9ucyQubmV4dChbXSk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2ICNjb250YWluZXIgY2xhc3M9XCJjb3JlLXBlcm1pc3Npb24tY29udGFpbmVyXCIgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGhlaWdodCArICdweCd9XCI+XHJcbiAgPGNvcmUtcGFnZS1oZWFkZXIgW3RpdGxlXT1cInRpdGxlXCIgKGJ1dHRvbkNsaWNrKT1cIm9uQ29yZVBhZ2VIZWFkZXJCdXR0b25DbGljaygkZXZlbnQpXCI+PC9jb3JlLXBhZ2UtaGVhZGVyPlxyXG5cclxuICA8Y29yZS1jb21wb3NpdGlvbiBbbGVmdF09XCJ1c2VyU2Vla2VyXCIgW2xlZnRXaWR0aF09XCIyMDBcIiBbbWFpbl09XCJ0YWJzXCIgW2hlaWdodF09XCJjb21wb3NpdGlvbkhlaWdodFwiPlxyXG4gIDwvY29yZS1jb21wb3NpdGlvbj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInN0YXRlLXRyYWNrZXIgY29udGFpbmVyIGNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwic2hvd1N0YXRlVHJhY2tlciAmJiBpc1Jvb3RVc2VyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGQtZmxleC1iZXR3ZWVuXCI+XHJcbiAgICAgIDxzcGFuPkNvbXBhcmU8L3NwYW4+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmVhdGhlci14XCIgKGNsaWNrKT1cIm9uQ2xpY2tDbG9zZVN0YXRlKClcIj48L2k+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAge3sgaW5pdGlhbEFjdGlvblBlcm1pc3Npb25WYWx1ZUpzb25TdHJpbmcgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgIHt7IGN1cnJlbnRBY3Rpb25QZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgIHt7IGluaXRpYWxPcmdQZXJtaXNzaW9uVmFsdWVKc29uU3RyaW5nIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICB7eyBjdXJyZW50T3JnUGVybWlzc2lvblZhbHVlSnNvblN0cmluZyB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI3RhYnM+XHJcbiAgPGNvcmUtdGFicyBbaGVhZGVyc109XCJ0YWJIZWFkZXJzXCIgW2NvbnRlbnRzXT1cIlt0YWIxLCB0YWIyXVwiIFtoZWlnaHRdPVwiY29tcG9zaXRpb25IZWlnaHRcIj48L2NvcmUtdGFicz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdGFiMT5cclxuICA8ZGl2IFtuZ1N0eWxlXT1cInsgaGVpZ2h0OiBsYXlvdXRTZXJ2aWNlLmJhc2ljU3BhY2luZyArICdweCcgfVwiPjwvZGl2PlxyXG4gIDxjb3JlLXBlcm1pc3Npb24tYWN0aW9ucyBbbG9hZGluZ109XCJsb2FkaW5nXCIgWyhuZ01vZGVsKV09XCJhY3Rpb25QZXJtaXNzaW9uVmFsdWVcIlxyXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25BY3Rpb25QZXJtaXNzaW9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCIhISFhbGxvd0VkaXRcIiBbaGVpZ2h0XT1cImNvcmVQZXJtaXNzaW9uQWN0aW9uc0hlaWdodFwiPjwvY29yZS1wZXJtaXNzaW9uLWFjdGlvbnM+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3VzZXJTZWVrZXI+XHJcblxyXG4gIDxjb3JlLWxpc3QtbGF6eSBbcXVlcnlMaXN0QXBpXT1cIm9iamVjdFF1ZXJ5TGlzdEFwaVwiIFt0ZXh0RmllbGRdPVwib2JqZWN0TGlzdFRleHRGaWVsZFwiIFsobmdNb2RlbCldPVwib2JqZWN0SWRcIlxyXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25PYmplY3RJZENoYW5nZSgkZXZlbnQpXCIgW2hlaWdodF09XCJjb21wb3NpdGlvbkhlaWdodFwiIFtibG9ja2luZ0ludGVyYWN0aW9uJF09XCJibG9ja2luZ0xlZnRMaXN0SW50ZXJhY3Rpb24kXCI+PC9jb3JlLWxpc3QtbGF6eT5cclxuXHJcblxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0YWIyPlxyXG4gIDxkaXYgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGxheW91dFNlcnZpY2UuYmFzaWNTcGFjaW5nICsgJ3B4JyB9XCI+PC9kaXY+XHJcbiAgPGNvcmUtb3JnLXRyZWUgW2Z1bGxXaWR0aE1vZGVdPVwidHJ1ZVwiIFthY2Nlc3Nvck1vZGVdPVwidHJlZUFjY2Vzc29yTW9kZVwiIFsobmdNb2RlbCldPVwib3JnSWRzXCIgW2Rpc2FibGVkXT1cIiEhIWFsbG93RWRpdFwiXHJcbiAgICAoaXRlbUNsaWNrKT1cIm9uT3JnVHJlZUl0ZW1DaGVjaygkZXZlbnQpXCIgbmFtZT1cIm9yZ0lkc1wiIG5nRGVmYXVsdENvbnRyb2wgW2hlaWdodF09XCJ0cmVlSGVpZ2h0XCI+PC9jb3JlLW9yZy10cmVlPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
@@ -20438,7 +20438,7 @@ var EnumPermissionObjectType;
20438
20438
  EnumPermissionObjectType["USER_GROUP"] = "USER_GROUP";
20439
20439
  })(EnumPermissionObjectType || (EnumPermissionObjectType = {}));
20440
20440
  class CorePermissionComponent extends BaseComponent {
20441
- constructor(mls, dialogService, ras, corePermissionService, appService, layoutService, alertService, router, route, authService, domService, grpcService) {
20441
+ constructor(mls, dialogService, ras, corePermissionService, appService, layoutService, alertService, router, route, authService, domService, appConfigService) {
20442
20442
  super(mls);
20443
20443
  this.mls = mls;
20444
20444
  this.dialogService = dialogService;
@@ -20451,7 +20451,7 @@ class CorePermissionComponent extends BaseComponent {
20451
20451
  this.route = route;
20452
20452
  this.authService = authService;
20453
20453
  this.domService = domService;
20454
- this.grpcService = grpcService;
20454
+ this.appConfigService = appConfigService;
20455
20455
  this.loading = true;
20456
20456
  this.selectedData = [];
20457
20457
  this.tabHeaders = [
@@ -20618,6 +20618,15 @@ class CorePermissionComponent extends BaseComponent {
20618
20618
  if (x[0].ok && x[0].status === 200) {
20619
20619
  const body = x[0].body;
20620
20620
  if (body.statusCode === 200) {
20621
+ // check functionId to be in elements of permission array
20622
+ if (!!body?.innerBody?.length) {
20623
+ const checkItem = body.innerBody[0];
20624
+ if (!checkItem?.functionId) {
20625
+ if (isDevMode() || this.appConfigService.DEBUG_ENABLED) {
20626
+ this.alertService.error(`Each row of the list returned by ${this.queryFunctionActionPermissionListApiEndpoint} must have a field named functionId. Please check the Backend!`, noneAutoClosedAlertOptions);
20627
+ }
20628
+ }
20629
+ }
20621
20630
  this.corePermissionService.selectedObjectActionPermissions$.next(body.innerBody);
20622
20631
  this.updateInitialActionPermissionValueJsonString(body.innerBody);
20623
20632
  }
@@ -20821,7 +20830,7 @@ class CorePermissionComponent extends BaseComponent {
20821
20830
  this.corePermissionService.selectedObject$.next(null);
20822
20831
  this.corePermissionService.selectedObjectActionPermissions$.next([]);
20823
20832
  }
20824
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CorePermissionComponent, deps: [{ token: MultiLanguageService }, { token: DialogService }, { token: RandomAvatarService }, { token: CorePermissionService }, { token: AppService }, { token: LayoutService }, { token: AlertService }, { token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: AuthService }, { token: DomService }, { token: GrpcService }], target: i0.ɵɵFactoryTarget.Component }); }
20833
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CorePermissionComponent, deps: [{ token: MultiLanguageService }, { token: DialogService }, { token: RandomAvatarService }, { token: CorePermissionService }, { token: AppService }, { token: LayoutService }, { token: AlertService }, { token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: AuthService }, { token: DomService }, { token: AppConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
20825
20834
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: CorePermissionComponent, isStandalone: true, selector: "core-permission", inputs: { type: "type" }, viewQueries: [{ propertyName: "avatar", first: true, predicate: ["avatar"], descendants: true }, { propertyName: "actions", first: true, predicate: ["actions"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #container class=\"core-permission-container\" [ngStyle]=\"{ height: height + 'px'}\">\r\n <core-page-header [title]=\"title\" (buttonClick)=\"onCorePageHeaderButtonClick($event)\"></core-page-header>\r\n\r\n <core-composition [left]=\"userSeeker\" [leftWidth]=\"200\" [main]=\"tabs\" [height]=\"compositionHeight\">\r\n </core-composition>\r\n\r\n <div class=\"state-tracker container container-fluid\" *ngIf=\"showStateTracker && isRootUser\">\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <span>Compare</span>\r\n <i class=\"feather-x\" (click)=\"onClickCloseState()\"></i>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialActionPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentActionPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialOrgPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentOrgPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #tabs>\r\n <core-tabs [headers]=\"tabHeaders\" [contents]=\"[tab1, tab2]\" [height]=\"compositionHeight\"></core-tabs>\r\n</ng-template>\r\n\r\n<ng-template #tab1>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-permission-actions [loading]=\"loading\" [(ngModel)]=\"actionPermissionValue\"\r\n (ngModelChange)=\"onActionPermissionValueChange($event)\" [disabled]=\"!!!allowEdit\" [height]=\"corePermissionActionsHeight\"></core-permission-actions>\r\n</ng-template>\r\n\r\n<ng-template #userSeeker>\r\n\r\n <core-list-lazy [queryListApi]=\"objectQueryListApi\" [textField]=\"objectListTextField\" [(ngModel)]=\"objectId\"\r\n (ngModelChange)=\"onObjectIdChange($event)\" [height]=\"compositionHeight\" [blockingInteraction$]=\"blockingLeftListInteraction$\"></core-list-lazy>\r\n\r\n\r\n</ng-template>\r\n\r\n<ng-template #tab2>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-org-tree [fullWidthMode]=\"true\" [accessorMode]=\"treeAccessorMode\" [(ngModel)]=\"orgIds\" [disabled]=\"!!!allowEdit\"\r\n (itemClick)=\"onOrgTreeItemCheck($event)\" name=\"orgIds\" ngDefaultControl [height]=\"treeHeight\"></core-org-tree>\r\n</ng-template>", styles: [".core-permission-container{--z-index: 1}.core-permission-container .state-tracker{display:block;position:fixed;width:100%;height:50vh;top:0;left:0;z-index:var(--z-index);background-color:wheat}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CoreOrgTreeComponent, selector: "core-org-tree", inputs: ["lineColor", "fullWidthMode", "accessorMode", "fullRendering", "height", "disabledLoopExpand", "showCheckInheritance"], outputs: ["itemDoubleClick", "itemClick"] }, { kind: "component", type: CoreTabsComponent, selector: "core-tabs", inputs: ["headers", "contents", "headerTools", "height", "headerLineHeight"], outputs: ["onHeaderClick", "onToolItemClick"] }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup"], outputs: ["buttonClick"] }, { kind: "component", type: CoreCompositionComponent, selector: "core-composition", inputs: ["coreCompositionInstanceNumber", "top", "left", "leftWidth", "main", "height", "defaultResizeOff"] }, { kind: "component", type: CoreListLazyComponent, selector: "core-list-lazy", inputs: ["title", "queryListApi", "textField", "pipe", "height", "blockingInteraction$"] }, { kind: "component", type: CorePermissionActionsComponent, selector: "core-permission-actions", inputs: ["loading", "height"] }] }); }
20826
20835
  }
20827
20836
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CorePermissionComponent, decorators: [{
@@ -20841,7 +20850,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
20841
20850
  CoreConfirmDialogComponent,
20842
20851
  CoreApiProgressComponent
20843
20852
  ], template: "<div #container class=\"core-permission-container\" [ngStyle]=\"{ height: height + 'px'}\">\r\n <core-page-header [title]=\"title\" (buttonClick)=\"onCorePageHeaderButtonClick($event)\"></core-page-header>\r\n\r\n <core-composition [left]=\"userSeeker\" [leftWidth]=\"200\" [main]=\"tabs\" [height]=\"compositionHeight\">\r\n </core-composition>\r\n\r\n <div class=\"state-tracker container container-fluid\" *ngIf=\"showStateTracker && isRootUser\">\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <span>Compare</span>\r\n <i class=\"feather-x\" (click)=\"onClickCloseState()\"></i>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialActionPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentActionPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n {{ initialOrgPermissionValueJsonString }}\r\n </div>\r\n <div class=\"col-md-6\">\r\n {{ currentOrgPermissionValueJsonString }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #tabs>\r\n <core-tabs [headers]=\"tabHeaders\" [contents]=\"[tab1, tab2]\" [height]=\"compositionHeight\"></core-tabs>\r\n</ng-template>\r\n\r\n<ng-template #tab1>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-permission-actions [loading]=\"loading\" [(ngModel)]=\"actionPermissionValue\"\r\n (ngModelChange)=\"onActionPermissionValueChange($event)\" [disabled]=\"!!!allowEdit\" [height]=\"corePermissionActionsHeight\"></core-permission-actions>\r\n</ng-template>\r\n\r\n<ng-template #userSeeker>\r\n\r\n <core-list-lazy [queryListApi]=\"objectQueryListApi\" [textField]=\"objectListTextField\" [(ngModel)]=\"objectId\"\r\n (ngModelChange)=\"onObjectIdChange($event)\" [height]=\"compositionHeight\" [blockingInteraction$]=\"blockingLeftListInteraction$\"></core-list-lazy>\r\n\r\n\r\n</ng-template>\r\n\r\n<ng-template #tab2>\r\n <div [ngStyle]=\"{ height: layoutService.basicSpacing + 'px' }\"></div>\r\n <core-org-tree [fullWidthMode]=\"true\" [accessorMode]=\"treeAccessorMode\" [(ngModel)]=\"orgIds\" [disabled]=\"!!!allowEdit\"\r\n (itemClick)=\"onOrgTreeItemCheck($event)\" name=\"orgIds\" ngDefaultControl [height]=\"treeHeight\"></core-org-tree>\r\n</ng-template>", styles: [".core-permission-container{--z-index: 1}.core-permission-container .state-tracker{display:block;position:fixed;width:100%;height:50vh;top:0;left:0;z-index:var(--z-index);background-color:wheat}\n"] }]
20844
- }], ctorParameters: () => [{ type: MultiLanguageService }, { type: DialogService }, { type: RandomAvatarService }, { type: CorePermissionService }, { type: AppService }, { type: LayoutService }, { type: AlertService }, { type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: AuthService }, { type: DomService }, { type: GrpcService }], propDecorators: { type: [{
20853
+ }], ctorParameters: () => [{ type: MultiLanguageService }, { type: DialogService }, { type: RandomAvatarService }, { type: CorePermissionService }, { type: AppService }, { type: LayoutService }, { type: AlertService }, { type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: AuthService }, { type: DomService }, { type: AppConfigService }], propDecorators: { type: [{
20845
20854
  type: Input
20846
20855
  }], avatar: [{
20847
20856
  type: ViewChild,