@openziti/ziti-console-lib 0.4.0 → 0.4.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.
Files changed (66) hide show
  1. package/assets/styles/global.scss +8 -1
  2. package/esm2022/lib/features/card/card.component.mjs +9 -3
  3. package/esm2022/lib/features/card-list/card-list.component.mjs +16 -13
  4. package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +33 -0
  5. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +11 -7
  6. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +68 -34
  7. package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +3 -5
  8. package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +69 -37
  9. package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +90 -8
  10. package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +44 -30
  11. package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +2 -1
  12. package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +21 -17
  13. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +9 -6
  14. package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +9 -11
  15. package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +16 -12
  16. package/esm2022/lib/pages/identities/identities-page.component.mjs +11 -12
  17. package/esm2022/lib/pages/identities/identities-page.service.mjs +24 -42
  18. package/esm2022/lib/pages/services/services-page.component.mjs +10 -16
  19. package/esm2022/lib/pages/services/services-page.service.mjs +22 -12
  20. package/esm2022/lib/shared/list-page-component.class.mjs +1 -1
  21. package/esm2022/lib/shared/list-page-service.class.mjs +20 -2
  22. package/esm2022/lib/version.mjs +2 -2
  23. package/esm2022/lib/ziti-console-lib.module.mjs +6 -3
  24. package/esm2022/public-api.mjs +3 -1
  25. package/fesm2022/openziti-ziti-console-lib.mjs +5541 -5333
  26. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  27. package/lib/features/card/card.component.d.ts +3 -1
  28. package/lib/features/card/card.component.d.ts.map +1 -1
  29. package/lib/features/card-list/card-list.component.d.ts +5 -2
  30. package/lib/features/card-list/card-list.component.d.ts.map +1 -1
  31. package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts +19 -0
  32. package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts.map +1 -0
  33. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +3 -4
  34. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
  35. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +10 -5
  36. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -1
  37. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +1 -4
  38. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -1
  39. package/lib/features/projectable-forms/identity/identity-form.component.d.ts +9 -3
  40. package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
  41. package/lib/features/projectable-forms/projectable-form.class.d.ts +25 -4
  42. package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
  43. package/lib/features/projectable-forms/service/service-form.component.d.ts +10 -5
  44. package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -1
  45. package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
  46. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +5 -2
  47. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -1
  48. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +1 -4
  49. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
  50. package/lib/pages/edge-routers/edge-routers-page.component.d.ts +1 -1
  51. package/lib/pages/edge-routers/edge-routers-page.service.d.ts +3 -1
  52. package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -1
  53. package/lib/pages/identities/identities-page.component.d.ts.map +1 -1
  54. package/lib/pages/identities/identities-page.service.d.ts +4 -2
  55. package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
  56. package/lib/pages/services/services-page.component.d.ts.map +1 -1
  57. package/lib/pages/services/services-page.service.d.ts +5 -1
  58. package/lib/pages/services/services-page.service.d.ts.map +1 -1
  59. package/lib/shared/list-page-component.class.d.ts.map +1 -1
  60. package/lib/shared/list-page-service.class.d.ts +7 -1
  61. package/lib/shared/list-page-service.class.d.ts.map +1 -1
  62. package/lib/ziti-console-lib.module.d.ts +18 -17
  63. package/lib/ziti-console-lib.module.d.ts.map +1 -1
  64. package/package.json +1 -1
  65. package/public-api.d.ts +2 -0
  66. package/public-api.d.ts.map +1 -1
@@ -12,25 +12,28 @@ import * as i2 from "../../../messaging/growler.service";
12
12
  import * as i3 from "@angular/material/dialog";
13
13
  import * as i4 from "../../../../services/validation.service";
14
14
  import * as i5 from "../../../../pages/services/services-page.service";
15
- import * as i6 from "@angular/common";
16
- import * as i7 from "@angular/forms";
17
- import * as i8 from "@angular/material/tooltip";
18
- import * as i9 from "../../form-header/form-header.component";
19
- import * as i10 from "../../form-field-container/form-field-container.component";
20
- import * as i11 from "../../../tag-selector/tag-selector.component";
21
- import * as i12 from "../../../../services/settings.service";
22
- import * as i13 from "../../../../services/ziti-data.service";
15
+ import * as i6 from "@angular/router";
16
+ import * as i7 from "@angular/common";
17
+ import * as i8 from "@angular/forms";
18
+ import * as i9 from "@angular/material/tooltip";
19
+ import * as i10 from "../../form-header/form-header.component";
20
+ import * as i11 from "../../form-field-container/form-field-container.component";
21
+ import * as i12 from "../../../tag-selector/tag-selector.component";
22
+ import * as i13 from "../../../../services/settings.service";
23
+ import * as i14 from "../../../../services/ziti-data.service";
23
24
  // @ts-ignore
24
25
  const { app } = window;
25
26
  class SimpleServiceComponent extends ProjectableForm {
26
- constructor(settingsService, svc, zitiService, growlerService, extService, dialogForm, validationService, servicesPageService) {
27
- super(growlerService, extService);
27
+ constructor(settingsService, svc, zitiService, growlerService, extService, dialogForm, validationService, servicesPageService, router, route) {
28
+ super(growlerService, extService, zitiService, router, route);
28
29
  this.settingsService = settingsService;
29
30
  this.svc = svc;
30
31
  this.zitiService = zitiService;
31
32
  this.dialogForm = dialogForm;
32
33
  this.validationService = validationService;
33
34
  this.servicesPageService = servicesPageService;
35
+ this.router = router;
36
+ this.route = route;
34
37
  this.serviceRoleAttributes = [];
35
38
  this.identityRoleAttributes = [];
36
39
  this.identityNamedAttributes = [];
@@ -109,6 +112,7 @@ class SimpleServiceComponent extends ProjectableForm {
109
112
  this.selected = new EventEmitter();
110
113
  }
111
114
  ngOnInit() {
115
+ super.ngOnInit();
112
116
  this.controllerDomain = this.settingsService?.settings?.selectedEdgeController;
113
117
  this.zitiSessionId = this.settingsService?.settings?.session?.id;
114
118
  this.initFormData();
@@ -167,7 +171,7 @@ class SimpleServiceComponent extends ProjectableForm {
167
171
  this.save();
168
172
  break;
169
173
  case 'close':
170
- this.closeModal(true, true, 'cards');
174
+ this.router?.navigateByUrl(`/services/select`);
171
175
  break;
172
176
  case 'toggle-view':
173
177
  this.formView = action.data;
@@ -650,23 +654,23 @@ class SimpleServiceComponent extends ProjectableForm {
650
654
  }
651
655
  clear() {
652
656
  }
653
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SimpleServiceComponent, deps: [{ token: SETTINGS_SERVICE }, { token: i1.ServiceFormService }, { token: ZITI_DATA_SERVICE }, { token: i2.GrowlerService }, { token: SERVICE_EXTENSION_SERVICE }, { token: i3.MatDialog }, { token: i4.ValidationService }, { token: i5.ServicesPageService }], target: i0.ɵɵFactoryTarget.Component }); }
654
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SimpleServiceComponent, selector: "lib-simple-service", inputs: { serviceRoleAttributes: "serviceRoleAttributes", identityRoleAttributes: "identityRoleAttributes", identityNamedAttributes: "identityNamedAttributes" }, outputs: { close: "close", selected: "selected" }, usesInheritance: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper simple-service-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(true, false, 'cards', $event)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"showForm ? 'Create a Simple Service' : 'Service Creation Summary'\"\n [actionButtonText]=\"'Save'\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"simple-service-form-container projectable-form-container\">\n <div class=\"form-group-column three-fifths\" *ngIf=\"showForm\">\n <div id=\"InlineServiceArea\" class=\"anyadd\">\n <div class=\"simple-service-inputs\">\n <lib-form-field-container [title]=\"'Service Details'\">\n <div class=\"form-field-input-group service-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Service Name</span>\n </div>\n <input\n class=\"form-field-input\"\n placeholder=\"Name this service\"\n autofocus\n #nameFieldInput\n [ngClass]=\"{error: errors.name}\"\n [(ngModel)]=\"serviceApiData.name\"\n (keyup)=\"serviceNameChanged($event)\"\n (change)=\"validateServiceName()\"\n />\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">SELECT OR CREATE SERVICE ATTRIBUTES</span>\n </div>\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"serviceApiData.roleAttributes\"\n [availableRoleAttributes]=\"serviceRoleAttributes\"\n [placeholder]=\"'Add attributes to group services'\"\n ></lib-tag-selector>\n </div>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n </div>\n <div class=\"simple-service-center-content\" *ngIf=\"showForm\">\n <div class=\"form-group-row\">\n <lib-form-field-container\n [title]=\"'ACCESSING CONFIGURATION'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'How will client applications use this service? Specify a hostname/IP and port, or use the &quot;SDK Only&quot; toggle for an application embedded configuration.'\"\n >\n <div class=\"form-field-input-group accessing-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">What identities can access this service?</span>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"dialPolicyNamedAttributes\"\n [(selectedRoleAttributes)]=\"dialPolicyRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Select identity attributes to grant access'\"\n [hasError]=\"errors.dialIdentities\"\n (selectedNamedAttributesChange)=\"validateDialIdentities()\"\n (selectedRoleAttributesChange)=\"validateDialIdentities()\"\n (filterChange)=\"getIdentityNamedAttributes($event)\"\n ></lib-tag-selector>\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">How will the service be accessed?</span>\n </div>\n <div class=\"grid addressPort\">\n <div class=\"config-item-container\">\n <span class=\"config-item-label\">SDK ONLY</span>\n <div\n class=\"sdk-toggle form-field-toggle\"\n >\n <div class=\"switchGrid\">\n <div>\n <div\n (click)=\"toggleSdkOnlyDial()\"\n [ngClass]=\"{ on: sdkOnlyDial }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!sdkOnlyDial\" class=\"on-label\">YES</span>\n <span [hidden]=\"sdkOnlyDial\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyDial}\">\n <div class=\"config-hostname-label\">\n <span class=\"config-item-label\">HOSTNAME / IP</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Accessing hostnames must include a '.'\"\n matTooltipPosition=\"above\"\n ></div>\n <span *ngIf=\"errors.interceptAddressFormat\" class=\"error-label\">Accessing hostnames must include a '.'</span>\n </div>\n <input id=\"HowTo\" type=\"text\" maxlength=\"100\" data-i18n=\"EgHost\" (change)=\"validateInterceptAddress()\" [ngClass]=\"{error: errors.interceptAddress}\" [placeholder]=\"sdkOnlyDial ? '' : 'e.g. myservice.ziti'\" [(ngModel)]=\"sdkOnlyDial ? '' : interceptConfigApiData.data.addresses[0]\">\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyDial}\">\n <span class=\"config-item-label\">PORT</span>\n <input id=\"HowToPort\" type=\"number\" maxlength=\"10\" (change)=\"validateInterceptPort()\" [ngClass]=\"{error: errors.interceptPort}\" [placeholder]=\"sdkOnlyDial ? '' : 443\" (keyup)=\"interceptPortChanged($event)\" [(ngModel)]=\"sdkOnlyDial ? '' : interceptPort\">\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'HOSTING CONFIGURATION'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Where should traffic for this service be sent? Specify a protocol, hostname/IP, and port, or use the &quot;SDK Only&quot; toggle for an application embedded configuration.'\"\n\n >\n <div class=\"form-field-input-group hosting-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">What identities can host this service?</span>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"bindPolicyNamedAttributes\"\n [(selectedRoleAttributes)]=\"bindPolicyRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Select identity attributes'\"\n [hasError]=\"errors.bindIdentities\"\n (selectedNamedAttributesChange)=\"validateBindIdentities()\"\n (selectedRoleAttributesChange)=\"validateBindIdentities()\"\n ></lib-tag-selector>\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Where should traffic be sent?</span>\n </div>\n <div class=\"grid addressFull\">\n <div class=\"config-item-container\">\n <span class=\"config-item-label\">SDK ONLY</span>\n <div\n class=\"sdk-toggle form-field-toggle\"\n >\n <div class=\"switchGrid\">\n <div>\n <div\n (click)=\"toggleSdkOnlyBind()\"\n [ngClass]=\"{ on: sdkOnlyBind }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!sdkOnlyBind\" class=\"on-label\">YES</span>\n <span [hidden]=\"sdkOnlyBind\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">PROTOCOL</span>\n <select id=\"HostedProtocol\" (change)=\"hostProtocolsChanged($event)\" [(ngModel)]=\"sdkOnlyBind ? '' : hostProtocol\">\n <option value=\"tcp\">TCP</option>\n <option value=\"udp\" >UDP</option>\n <option value=\"both\" >TCP/UDP</option>\n </select>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">HOSTNAME / IP</span>\n <input id=\"HostedHost\" type=\"text\" maxlength=\"100\" data-i18n=\"EgHost\" (change)=\"validateHostAddress()\" [ngClass]=\"{error: errors.hostAddress}\" [placeholder]=\"sdkOnlyBind ? '' : 'e.g. myservice.ziti'\" [(ngModel)]=\"sdkOnlyBind ? '' : hostConfigApiData.data.address\">\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">PORT</span>\n <input id=\"HostedPort\" type=\"number\" maxlength=\"10\" (change)=\"validateHostPort()\" [ngClass]=\"{error: errors.hostPort}\" [placeholder]=\"sdkOnlyBind ? '' : 443\" [(ngModel)]=\"sdkOnlyBind ? '' : hostConfigApiData.data.port\">\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n </div>\n</div>", styles: [".ziti-entity-header-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.simple-service-wrapper .simple-service-form-container .form-group-column{height:-moz-fit-content;height:fit-content;max-width:650px;width:100%;transition:var(--transition);flex-grow:0;padding-bottom:0}.simple-service-wrapper .simple-service-form-container .simple-service-center-content lib-form-field-container{min-width:375px}.simple-service-wrapper .simple-service-form-container .simple-service-center-content .form-field-input-group{display:flex;flex-direction:column;gap:15px}.simple-service-wrapper .grid.addressFull{grid-template-columns:70px 95px auto 65px}.simple-service-wrapper .grid.addressPort{grid-template-columns:70px auto 65px}.simple-service-wrapper input:disabled{opacity:.5!important}.simple-service-wrapper .addressPort .config-item-container.disabled,.simple-service-wrapper .addressFull .config-item-container.disabled{opacity:.3;pointer-events:none}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle{color:var(--white);display:flex;justify-content:space-between;height:var(--defaultInputHeight);align-items:center;margin-bottom:0}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .label{display:flex;font-size:14px;font-weight:600;text-transform:uppercase}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle{margin:0;display:flex;align-items:center;width:60px;height:28px;font-size:14px;line-height:25px;font-weight:800;font-family:Open Sans,Arial,sans-serif;background-color:var(--icon);color:var(--white);text-align:center;cursor:pointer;position:relative;float:left;border-radius:13px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle.on,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle.on{background-color:var(--green)}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .switch,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .switch{width:20px;height:20px;border-radius:10px;background-color:var(--white);transition:var(--transition);position:absolute;top:4px;z-index:10}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .switch.on,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .switch.on{left:35px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .on-label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .on-label{margin-left:7px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .off-label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .off-label{margin-left:32px}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label{display:flex;flex-direction:row;justify-content:flex-start;white-space:nowrap}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label .form-field-info,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label .form-field-info{margin-top:1px}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label .error-label,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label .error-label{margin-left:5px}.simple-service-wrapper .form-field-input-group.service-group{gap:10px;display:flex;flex-direction:column}.simple-service-wrapper .form-field-input-group.accessing-group{gap:15px;display:flex;flex-direction:column}.simple-service-wrapper .form-field-input-group .form-field-sub-group{display:flex;flex-direction:column;gap:5px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .config-title-row{height:14px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressFull,.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressPort{gap:10px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressFull select{height:var(--defaultInputHeight)}.simple-service-wrapper .simple-service-center-content{display:flex;flex-direction:column;width:100%;align-items:center;justify-content:center}.simple-service-wrapper .simple-service-center-content .form-group-row{flex-wrap:nowrap;gap:30;max-width:1200px;justify-content:center;padding:0}.config-item-label{color:#a9abaf;font-weight:600;margin-bottom:5px;position:relative;display:flex}.simple-service-inputs{display:flex;flex-direction:column;gap:15px}.form-field-input-group .form-field-title{color:var(--offWhite);margin-bottom:10px}.config-item .config-container.encryption-pod{background-color:#222f3e;background-image:linear-gradient(90deg,#232f3e,#f6f7fb);background-image:-ms-linear-gradient(90deg,rgb(35,47,62) 0%,rgb(246,247,251) 100%);border-radius:7px}.config-item .config-container .config-container-label{color:#fff}@media only screen and (max-width: 1475px){.simple-service-wrapper .form-group-row.simple-service-image-container{display:none}.simple-service-wrapper .form-group-row.simple-service-center-content{gap:30px}}@media only screen and (max-width: 2000px){.simple-service-wrapper .simple-service-center-content{max-width:650px;padding:0}.simple-service-wrapper .simple-service-center-content .form-group-row{flex-wrap:wrap;gap:15px}.simple-service-wrapper .simple-service-center-content .form-field-divider-container{padding-left:0;padding-right:0}}::ng-deep .simple-service-wrapper input{max-height:var(--defaultInputHeight);min-height:0px;height:var(--defaultInputHeight)}::ng-deep .simple-service-wrapper .select2-search__field{height:100%;min-height:40px;max-height:40px}::ng-deep .simple-service-wrapper .select2-selection__rendered{padding:0;max-height:115px!important;overflow:auto}::ng-deep .simple-service-wrapper .form-header-container{align-items:center}::ng-deep .simple-service-wrapper .form-header-container .form-header-group{width:650px!important}::ng-deep .simple-service-wrapper .form-header-container .header-actions-container{min-width:0px}::ng-deep .simple-service-wrapper .form-header-container .form-header-toggle-container{display:none}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.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: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: i10.FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader", "headerActions"], outputs: ["actionRequested"] }, { kind: "component", type: i11.TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }] }); }
657
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SimpleServiceComponent, deps: [{ token: SETTINGS_SERVICE }, { token: i1.ServiceFormService }, { token: ZITI_DATA_SERVICE }, { token: i2.GrowlerService }, { token: SERVICE_EXTENSION_SERVICE }, { token: i3.MatDialog }, { token: i4.ValidationService }, { token: i5.ServicesPageService }, { token: i6.Router }, { token: i6.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
658
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SimpleServiceComponent, selector: "lib-simple-service", inputs: { serviceRoleAttributes: "serviceRoleAttributes", identityRoleAttributes: "identityRoleAttributes", identityNamedAttributes: "identityNamedAttributes" }, outputs: { close: "close", selected: "selected" }, usesInheritance: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper simple-service-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(true, false, 'cards', $event)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"showForm ? 'Create a Simple Service' : 'Service Creation Summary'\"\n [actionButtonText]=\"'Save'\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"simple-service-form-container projectable-form-container\">\n <div class=\"form-group-column three-fifths\" *ngIf=\"showForm\">\n <div id=\"InlineServiceArea\" class=\"anyadd\">\n <div class=\"simple-service-inputs\">\n <lib-form-field-container [title]=\"'Service Details'\">\n <div class=\"form-field-input-group service-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Service Name</span>\n </div>\n <input\n class=\"form-field-input\"\n placeholder=\"Name this service\"\n autofocus\n #nameFieldInput\n [ngClass]=\"{error: errors.name}\"\n [(ngModel)]=\"serviceApiData.name\"\n (keyup)=\"serviceNameChanged($event)\"\n (change)=\"validateServiceName()\"\n />\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">SELECT OR CREATE SERVICE ATTRIBUTES</span>\n </div>\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"serviceApiData.roleAttributes\"\n [availableRoleAttributes]=\"serviceRoleAttributes\"\n [placeholder]=\"'Add attributes to group services'\"\n ></lib-tag-selector>\n </div>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n </div>\n <div class=\"simple-service-center-content\" *ngIf=\"showForm\">\n <div class=\"form-group-row\">\n <lib-form-field-container\n [title]=\"'ACCESSING CONFIGURATION'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'How will client applications use this service? Specify a hostname/IP and port, or use the &quot;SDK Only&quot; toggle for an application embedded configuration.'\"\n >\n <div class=\"form-field-input-group accessing-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">What identities can access this service?</span>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"dialPolicyNamedAttributes\"\n [(selectedRoleAttributes)]=\"dialPolicyRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Select identity attributes to grant access'\"\n [hasError]=\"errors.dialIdentities\"\n (selectedNamedAttributesChange)=\"validateDialIdentities()\"\n (selectedRoleAttributesChange)=\"validateDialIdentities()\"\n (filterChange)=\"getIdentityNamedAttributes($event)\"\n ></lib-tag-selector>\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">How will the service be accessed?</span>\n </div>\n <div class=\"grid addressPort\">\n <div class=\"config-item-container\">\n <span class=\"config-item-label\">SDK ONLY</span>\n <div\n class=\"sdk-toggle form-field-toggle\"\n >\n <div class=\"switchGrid\">\n <div>\n <div\n (click)=\"toggleSdkOnlyDial()\"\n [ngClass]=\"{ on: sdkOnlyDial }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!sdkOnlyDial\" class=\"on-label\">YES</span>\n <span [hidden]=\"sdkOnlyDial\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyDial}\">\n <div class=\"config-hostname-label\">\n <span class=\"config-item-label\">HOSTNAME / IP</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Accessing hostnames must include a '.'\"\n matTooltipPosition=\"above\"\n ></div>\n <span *ngIf=\"errors.interceptAddressFormat\" class=\"error-label\">Accessing hostnames must include a '.'</span>\n </div>\n <input id=\"HowTo\" type=\"text\" maxlength=\"100\" data-i18n=\"EgHost\" (change)=\"validateInterceptAddress()\" [ngClass]=\"{error: errors.interceptAddress}\" [placeholder]=\"sdkOnlyDial ? '' : 'e.g. myservice.ziti'\" [(ngModel)]=\"sdkOnlyDial ? '' : interceptConfigApiData.data.addresses[0]\">\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyDial}\">\n <span class=\"config-item-label\">PORT</span>\n <input id=\"HowToPort\" type=\"number\" maxlength=\"10\" (change)=\"validateInterceptPort()\" [ngClass]=\"{error: errors.interceptPort}\" [placeholder]=\"sdkOnlyDial ? '' : 443\" (keyup)=\"interceptPortChanged($event)\" [(ngModel)]=\"sdkOnlyDial ? '' : interceptPort\">\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'HOSTING CONFIGURATION'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Where should traffic for this service be sent? Specify a protocol, hostname/IP, and port, or use the &quot;SDK Only&quot; toggle for an application embedded configuration.'\"\n\n >\n <div class=\"form-field-input-group hosting-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">What identities can host this service?</span>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"bindPolicyNamedAttributes\"\n [(selectedRoleAttributes)]=\"bindPolicyRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Select identity attributes'\"\n [hasError]=\"errors.bindIdentities\"\n (selectedNamedAttributesChange)=\"validateBindIdentities()\"\n (selectedRoleAttributesChange)=\"validateBindIdentities()\"\n ></lib-tag-selector>\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Where should traffic be sent?</span>\n </div>\n <div class=\"grid addressFull\">\n <div class=\"config-item-container\">\n <span class=\"config-item-label\">SDK ONLY</span>\n <div\n class=\"sdk-toggle form-field-toggle\"\n >\n <div class=\"switchGrid\">\n <div>\n <div\n (click)=\"toggleSdkOnlyBind()\"\n [ngClass]=\"{ on: sdkOnlyBind }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!sdkOnlyBind\" class=\"on-label\">YES</span>\n <span [hidden]=\"sdkOnlyBind\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">PROTOCOL</span>\n <select id=\"HostedProtocol\" (change)=\"hostProtocolsChanged($event)\" [(ngModel)]=\"sdkOnlyBind ? '' : hostProtocol\">\n <option value=\"tcp\">TCP</option>\n <option value=\"udp\" >UDP</option>\n <option value=\"both\" >TCP/UDP</option>\n </select>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">HOSTNAME / IP</span>\n <input id=\"HostedHost\" type=\"text\" maxlength=\"100\" data-i18n=\"EgHost\" (change)=\"validateHostAddress()\" [ngClass]=\"{error: errors.hostAddress}\" [placeholder]=\"sdkOnlyBind ? '' : 'e.g. myservice.ziti'\" [(ngModel)]=\"sdkOnlyBind ? '' : hostConfigApiData.data.address\">\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">PORT</span>\n <input id=\"HostedPort\" type=\"number\" maxlength=\"10\" (change)=\"validateHostPort()\" [ngClass]=\"{error: errors.hostPort}\" [placeholder]=\"sdkOnlyBind ? '' : 443\" [(ngModel)]=\"sdkOnlyBind ? '' : hostConfigApiData.data.port\">\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n </div>\n</div>", styles: [".ziti-entity-header-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.simple-service-wrapper .simple-service-form-container .form-group-column{height:-moz-fit-content;height:fit-content;max-width:650px;width:100%;transition:var(--transition);flex-grow:0;padding-bottom:0}.simple-service-wrapper .simple-service-form-container .simple-service-center-content lib-form-field-container{min-width:375px}.simple-service-wrapper .simple-service-form-container .simple-service-center-content .form-field-input-group{display:flex;flex-direction:column;gap:15px}.simple-service-wrapper .grid.addressFull{grid-template-columns:70px 95px auto 65px}.simple-service-wrapper .grid.addressPort{grid-template-columns:70px auto 65px}.simple-service-wrapper input:disabled{opacity:.5!important}.simple-service-wrapper .addressPort .config-item-container.disabled,.simple-service-wrapper .addressFull .config-item-container.disabled{opacity:.3;pointer-events:none}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle{color:var(--white);display:flex;justify-content:space-between;height:var(--defaultInputHeight);align-items:center;margin-bottom:0}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .label{display:flex;font-size:14px;font-weight:600;text-transform:uppercase}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle{margin:0;display:flex;align-items:center;width:60px;height:28px;font-size:14px;line-height:25px;font-weight:800;font-family:Open Sans,Arial,sans-serif;background-color:var(--icon);color:var(--white);text-align:center;cursor:pointer;position:relative;float:left;border-radius:13px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle.on,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle.on{background-color:var(--green)}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .switch,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .switch{width:20px;height:20px;border-radius:10px;background-color:var(--white);transition:var(--transition);position:absolute;top:4px;z-index:10}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .switch.on,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .switch.on{left:35px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .on-label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .on-label{margin-left:7px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .off-label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .off-label{margin-left:32px}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label{display:flex;flex-direction:row;justify-content:flex-start;white-space:nowrap}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label .form-field-info,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label .form-field-info{margin-top:1px}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label .error-label,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label .error-label{margin-left:5px}.simple-service-wrapper .form-field-input-group.service-group{gap:10px;display:flex;flex-direction:column}.simple-service-wrapper .form-field-input-group.accessing-group{gap:15px;display:flex;flex-direction:column}.simple-service-wrapper .form-field-input-group .form-field-sub-group{display:flex;flex-direction:column;gap:5px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .config-title-row{height:14px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressFull,.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressPort{gap:10px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressFull select{height:var(--defaultInputHeight)}.simple-service-wrapper .simple-service-center-content{display:flex;flex-direction:column;width:100%;align-items:center;justify-content:center}.simple-service-wrapper .simple-service-center-content .form-group-row{flex-wrap:nowrap;gap:30;max-width:1200px;justify-content:center;padding:0}.config-item-label{color:#a9abaf;font-weight:600;margin-bottom:5px;position:relative;display:flex}.simple-service-inputs{display:flex;flex-direction:column;gap:15px}.form-field-input-group .form-field-title{color:var(--offWhite);margin-bottom:10px}.config-item .config-container.encryption-pod{background-color:#222f3e;background-image:linear-gradient(90deg,#232f3e,#f6f7fb);background-image:-ms-linear-gradient(90deg,rgb(35,47,62) 0%,rgb(246,247,251) 100%);border-radius:7px}.config-item .config-container .config-container-label{color:#fff}@media only screen and (max-width: 1475px){.simple-service-wrapper .form-group-row.simple-service-image-container{display:none}.simple-service-wrapper .form-group-row.simple-service-center-content{gap:30px}}@media only screen and (max-width: 2000px){.simple-service-wrapper .simple-service-center-content{max-width:650px;padding:0}.simple-service-wrapper .simple-service-center-content .form-group-row{flex-wrap:wrap;gap:15px}.simple-service-wrapper .simple-service-center-content .form-field-divider-container{padding-left:0;padding-right:0}}::ng-deep .simple-service-wrapper input{max-height:var(--defaultInputHeight);min-height:0px;height:var(--defaultInputHeight)}::ng-deep .simple-service-wrapper .select2-search__field{height:100%;min-height:40px;max-height:40px}::ng-deep .simple-service-wrapper .select2-selection__rendered{padding:0;max-height:115px!important;overflow:auto}::ng-deep .simple-service-wrapper .form-header-container{align-items:center}::ng-deep .simple-service-wrapper .form-header-container .form-header-group{width:650px!important}::ng-deep .simple-service-wrapper .form-header-container .header-actions-container{min-width:0px}::ng-deep .simple-service-wrapper .form-header-container .form-header-toggle-container{display:none}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.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: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i10.FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: i11.FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader", "headerActions"], outputs: ["actionRequested"] }, { kind: "component", type: i12.TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }] }); }
655
659
  }
656
660
  export { SimpleServiceComponent };
657
661
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SimpleServiceComponent, decorators: [{
658
662
  type: Component,
659
663
  args: [{ selector: 'lib-simple-service', template: "<div class=\"projectable-form-wrapper simple-service-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(true, false, 'cards', $event)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"showForm ? 'Create a Simple Service' : 'Service Creation Summary'\"\n [actionButtonText]=\"'Save'\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"simple-service-form-container projectable-form-container\">\n <div class=\"form-group-column three-fifths\" *ngIf=\"showForm\">\n <div id=\"InlineServiceArea\" class=\"anyadd\">\n <div class=\"simple-service-inputs\">\n <lib-form-field-container [title]=\"'Service Details'\">\n <div class=\"form-field-input-group service-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Service Name</span>\n </div>\n <input\n class=\"form-field-input\"\n placeholder=\"Name this service\"\n autofocus\n #nameFieldInput\n [ngClass]=\"{error: errors.name}\"\n [(ngModel)]=\"serviceApiData.name\"\n (keyup)=\"serviceNameChanged($event)\"\n (change)=\"validateServiceName()\"\n />\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">SELECT OR CREATE SERVICE ATTRIBUTES</span>\n </div>\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"serviceApiData.roleAttributes\"\n [availableRoleAttributes]=\"serviceRoleAttributes\"\n [placeholder]=\"'Add attributes to group services'\"\n ></lib-tag-selector>\n </div>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n </div>\n <div class=\"simple-service-center-content\" *ngIf=\"showForm\">\n <div class=\"form-group-row\">\n <lib-form-field-container\n [title]=\"'ACCESSING CONFIGURATION'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'How will client applications use this service? Specify a hostname/IP and port, or use the &quot;SDK Only&quot; toggle for an application embedded configuration.'\"\n >\n <div class=\"form-field-input-group accessing-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">What identities can access this service?</span>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"dialPolicyNamedAttributes\"\n [(selectedRoleAttributes)]=\"dialPolicyRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Select identity attributes to grant access'\"\n [hasError]=\"errors.dialIdentities\"\n (selectedNamedAttributesChange)=\"validateDialIdentities()\"\n (selectedRoleAttributesChange)=\"validateDialIdentities()\"\n (filterChange)=\"getIdentityNamedAttributes($event)\"\n ></lib-tag-selector>\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">How will the service be accessed?</span>\n </div>\n <div class=\"grid addressPort\">\n <div class=\"config-item-container\">\n <span class=\"config-item-label\">SDK ONLY</span>\n <div\n class=\"sdk-toggle form-field-toggle\"\n >\n <div class=\"switchGrid\">\n <div>\n <div\n (click)=\"toggleSdkOnlyDial()\"\n [ngClass]=\"{ on: sdkOnlyDial }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!sdkOnlyDial\" class=\"on-label\">YES</span>\n <span [hidden]=\"sdkOnlyDial\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyDial}\">\n <div class=\"config-hostname-label\">\n <span class=\"config-item-label\">HOSTNAME / IP</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Accessing hostnames must include a '.'\"\n matTooltipPosition=\"above\"\n ></div>\n <span *ngIf=\"errors.interceptAddressFormat\" class=\"error-label\">Accessing hostnames must include a '.'</span>\n </div>\n <input id=\"HowTo\" type=\"text\" maxlength=\"100\" data-i18n=\"EgHost\" (change)=\"validateInterceptAddress()\" [ngClass]=\"{error: errors.interceptAddress}\" [placeholder]=\"sdkOnlyDial ? '' : 'e.g. myservice.ziti'\" [(ngModel)]=\"sdkOnlyDial ? '' : interceptConfigApiData.data.addresses[0]\">\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyDial}\">\n <span class=\"config-item-label\">PORT</span>\n <input id=\"HowToPort\" type=\"number\" maxlength=\"10\" (change)=\"validateInterceptPort()\" [ngClass]=\"{error: errors.interceptPort}\" [placeholder]=\"sdkOnlyDial ? '' : 443\" (keyup)=\"interceptPortChanged($event)\" [(ngModel)]=\"sdkOnlyDial ? '' : interceptPort\">\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'HOSTING CONFIGURATION'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Where should traffic for this service be sent? Specify a protocol, hostname/IP, and port, or use the &quot;SDK Only&quot; toggle for an application embedded configuration.'\"\n\n >\n <div class=\"form-field-input-group hosting-group\">\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">What identities can host this service?</span>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"bindPolicyNamedAttributes\"\n [(selectedRoleAttributes)]=\"bindPolicyRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Select identity attributes'\"\n [hasError]=\"errors.bindIdentities\"\n (selectedNamedAttributesChange)=\"validateBindIdentities()\"\n (selectedRoleAttributesChange)=\"validateBindIdentities()\"\n ></lib-tag-selector>\n </div>\n <div class=\"form-field-sub-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Where should traffic be sent?</span>\n </div>\n <div class=\"grid addressFull\">\n <div class=\"config-item-container\">\n <span class=\"config-item-label\">SDK ONLY</span>\n <div\n class=\"sdk-toggle form-field-toggle\"\n >\n <div class=\"switchGrid\">\n <div>\n <div\n (click)=\"toggleSdkOnlyBind()\"\n [ngClass]=\"{ on: sdkOnlyBind }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!sdkOnlyBind\" class=\"on-label\">YES</span>\n <span [hidden]=\"sdkOnlyBind\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">PROTOCOL</span>\n <select id=\"HostedProtocol\" (change)=\"hostProtocolsChanged($event)\" [(ngModel)]=\"sdkOnlyBind ? '' : hostProtocol\">\n <option value=\"tcp\">TCP</option>\n <option value=\"udp\" >UDP</option>\n <option value=\"both\" >TCP/UDP</option>\n </select>\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">HOSTNAME / IP</span>\n <input id=\"HostedHost\" type=\"text\" maxlength=\"100\" data-i18n=\"EgHost\" (change)=\"validateHostAddress()\" [ngClass]=\"{error: errors.hostAddress}\" [placeholder]=\"sdkOnlyBind ? '' : 'e.g. myservice.ziti'\" [(ngModel)]=\"sdkOnlyBind ? '' : hostConfigApiData.data.address\">\n </div>\n <div class=\"config-item-container\" [ngClass]=\"{disabled: sdkOnlyBind}\">\n <span class=\"config-item-label\">PORT</span>\n <input id=\"HostedPort\" type=\"number\" maxlength=\"10\" (change)=\"validateHostPort()\" [ngClass]=\"{error: errors.hostPort}\" [placeholder]=\"sdkOnlyBind ? '' : 443\" [(ngModel)]=\"sdkOnlyBind ? '' : hostConfigApiData.data.port\">\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n </div>\n</div>", styles: [".ziti-entity-header-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.simple-service-wrapper .simple-service-form-container .form-group-column{height:-moz-fit-content;height:fit-content;max-width:650px;width:100%;transition:var(--transition);flex-grow:0;padding-bottom:0}.simple-service-wrapper .simple-service-form-container .simple-service-center-content lib-form-field-container{min-width:375px}.simple-service-wrapper .simple-service-form-container .simple-service-center-content .form-field-input-group{display:flex;flex-direction:column;gap:15px}.simple-service-wrapper .grid.addressFull{grid-template-columns:70px 95px auto 65px}.simple-service-wrapper .grid.addressPort{grid-template-columns:70px auto 65px}.simple-service-wrapper input:disabled{opacity:.5!important}.simple-service-wrapper .addressPort .config-item-container.disabled,.simple-service-wrapper .addressFull .config-item-container.disabled{opacity:.3;pointer-events:none}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle{color:var(--white);display:flex;justify-content:space-between;height:var(--defaultInputHeight);align-items:center;margin-bottom:0}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .label{display:flex;font-size:14px;font-weight:600;text-transform:uppercase}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle{margin:0;display:flex;align-items:center;width:60px;height:28px;font-size:14px;line-height:25px;font-weight:800;font-family:Open Sans,Arial,sans-serif;background-color:var(--icon);color:var(--white);text-align:center;cursor:pointer;position:relative;float:left;border-radius:13px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle.on,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle.on{background-color:var(--green)}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .switch,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .switch{width:20px;height:20px;border-radius:10px;background-color:var(--white);transition:var(--transition);position:absolute;top:4px;z-index:10}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .switch.on,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .switch.on{left:35px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .on-label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .on-label{margin-left:7px}.simple-service-wrapper .addressPort .config-item-container .sdk-toggle .toggle .off-label,.simple-service-wrapper .addressFull .config-item-container .sdk-toggle .toggle .off-label{margin-left:32px}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label{display:flex;flex-direction:row;justify-content:flex-start;white-space:nowrap}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label .form-field-info,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label .form-field-info{margin-top:1px}.simple-service-wrapper .addressPort .config-item-container .config-hostname-label .error-label,.simple-service-wrapper .addressFull .config-item-container .config-hostname-label .error-label{margin-left:5px}.simple-service-wrapper .form-field-input-group.service-group{gap:10px;display:flex;flex-direction:column}.simple-service-wrapper .form-field-input-group.accessing-group{gap:15px;display:flex;flex-direction:column}.simple-service-wrapper .form-field-input-group .form-field-sub-group{display:flex;flex-direction:column;gap:5px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .config-title-row{height:14px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressFull,.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressPort{gap:10px}.simple-service-wrapper .form-field-input-group .form-field-sub-group .addressFull select{height:var(--defaultInputHeight)}.simple-service-wrapper .simple-service-center-content{display:flex;flex-direction:column;width:100%;align-items:center;justify-content:center}.simple-service-wrapper .simple-service-center-content .form-group-row{flex-wrap:nowrap;gap:30;max-width:1200px;justify-content:center;padding:0}.config-item-label{color:#a9abaf;font-weight:600;margin-bottom:5px;position:relative;display:flex}.simple-service-inputs{display:flex;flex-direction:column;gap:15px}.form-field-input-group .form-field-title{color:var(--offWhite);margin-bottom:10px}.config-item .config-container.encryption-pod{background-color:#222f3e;background-image:linear-gradient(90deg,#232f3e,#f6f7fb);background-image:-ms-linear-gradient(90deg,rgb(35,47,62) 0%,rgb(246,247,251) 100%);border-radius:7px}.config-item .config-container .config-container-label{color:#fff}@media only screen and (max-width: 1475px){.simple-service-wrapper .form-group-row.simple-service-image-container{display:none}.simple-service-wrapper .form-group-row.simple-service-center-content{gap:30px}}@media only screen and (max-width: 2000px){.simple-service-wrapper .simple-service-center-content{max-width:650px;padding:0}.simple-service-wrapper .simple-service-center-content .form-group-row{flex-wrap:wrap;gap:15px}.simple-service-wrapper .simple-service-center-content .form-field-divider-container{padding-left:0;padding-right:0}}::ng-deep .simple-service-wrapper input{max-height:var(--defaultInputHeight);min-height:0px;height:var(--defaultInputHeight)}::ng-deep .simple-service-wrapper .select2-search__field{height:100%;min-height:40px;max-height:40px}::ng-deep .simple-service-wrapper .select2-selection__rendered{padding:0;max-height:115px!important;overflow:auto}::ng-deep .simple-service-wrapper .form-header-container{align-items:center}::ng-deep .simple-service-wrapper .form-header-container .form-header-group{width:650px!important}::ng-deep .simple-service-wrapper .form-header-container .header-actions-container{min-width:0px}::ng-deep .simple-service-wrapper .form-header-container .form-header-toggle-container{display:none}\n"] }]
660
- }], ctorParameters: function () { return [{ type: i12.SettingsService, decorators: [{
664
+ }], ctorParameters: function () { return [{ type: i13.SettingsService, decorators: [{
661
665
  type: Inject,
662
666
  args: [SETTINGS_SERVICE]
663
- }] }, { type: i1.ServiceFormService }, { type: i13.ZitiDataService, decorators: [{
667
+ }] }, { type: i1.ServiceFormService }, { type: i14.ZitiDataService, decorators: [{
664
668
  type: Inject,
665
669
  args: [ZITI_DATA_SERVICE]
666
670
  }] }, { type: i2.GrowlerService }, { type: undefined, decorators: [{
667
671
  type: Inject,
668
672
  args: [SERVICE_EXTENSION_SERVICE]
669
- }] }, { type: i3.MatDialog }, { type: i4.ValidationService }, { type: i5.ServicesPageService }]; }, propDecorators: { serviceRoleAttributes: [{
673
+ }] }, { type: i3.MatDialog }, { type: i4.ValidationService }, { type: i5.ServicesPageService }, { type: i6.Router }, { type: i6.ActivatedRoute }]; }, propDecorators: { serviceRoleAttributes: [{
670
674
  type: Input
671
675
  }], identityRoleAttributes: [{
672
676
  type: Input
@@ -677,4 +681,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
677
681
  }], selected: [{
678
682
  type: Output
679
683
  }] } });
680
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNlcnZpY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Byb2plY3RhYmxlLWZvcm1zL3NlcnZpY2Uvc2ltcGxlLXNlcnZpY2Uvc2ltcGxlLXNlcnZpY2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Byb2plY3RhYmxlLWZvcm1zL3NlcnZpY2Uvc2ltcGxlLXNlcnZpY2Uvc2ltcGxlLXNlcnZpY2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBQyxnQkFBZ0IsRUFBa0IsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUMseUJBQXlCLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDdEYsT0FBTyxFQUFDLGlCQUFpQixFQUFrQixNQUFNLHdDQUF3QyxDQUFDO0FBRzFGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUU5RCxPQUFPLEVBQUMsOEJBQThCLEVBQUMsTUFBTSxvRUFBb0UsQ0FBQztBQUNsSCxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQUl4RSxhQUFhO0FBQ2IsTUFBTSxFQUFDLEdBQUcsRUFBQyxHQUFHLE1BQU0sQ0FBQztBQUVyQixNQUthLHNCQUF1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Q0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsSUFBSSxtQkFBbUIsSUFBSSxjQUFjLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQztRQUNsSCxHQUFHLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSztJQUNMLENBQUM7K0dBaHBCVSxzQkFBc0Isa0JBOEZyQixnQkFBZ0IsK0NBRWhCLGlCQUFpQiwyQ0FFakIseUJBQXlCO21HQWxHMUIsc0JBQXNCLHNTQ3RCbkMsMDlaQTJMTTs7U0RyS08sc0JBQXNCOzRGQUF0QixzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9COzswQkFrR3pCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFFdkIsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUV4QixNQUFNOzJCQUFDLHlCQUF5QjtzSUFqRzVCLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQXVGSSxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1Byb2plY3RhYmxlRm9ybX0gZnJvbSBcIi4uLy4uL3Byb2plY3RhYmxlLWZvcm0uY2xhc3NcIjtcbmltcG9ydCB7U0VUVElOR1NfU0VSVklDRSwgU2V0dGluZ3NTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc2V0dGluZ3Muc2VydmljZVwiO1xuaW1wb3J0IHtTRVJWSUNFX0VYVEVOU0lPTl9TRVJWSUNFLCBTZXJ2aWNlRm9ybVNlcnZpY2V9IGZyb20gXCIuLi9zZXJ2aWNlLWZvcm0uc2VydmljZVwiO1xuaW1wb3J0IHtaSVRJX0RBVEFfU0VSVklDRSwgWml0aURhdGFTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMveml0aS1kYXRhLnNlcnZpY2VcIjtcbmltcG9ydCB7R3Jvd2xlclNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9tZXNzYWdpbmcvZ3Jvd2xlci5zZXJ2aWNlXCI7XG5pbXBvcnQge0V4dGVuc2lvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9leHRlbmRhYmxlL2V4dGVuc2lvbnMtbm9vcC5zZXJ2aWNlXCI7XG5pbXBvcnQge0dyb3dsZXJNb2RlbH0gZnJvbSBcIi4uLy4uLy4uL21lc3NhZ2luZy9ncm93bGVyLm1vZGVsXCI7XG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xuaW1wb3J0IHtDcmVhdGlvblN1bW1hcnlEaWFsb2dDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi9jcmVhdGlvbi1zdW1tYXJ5LWRpYWxvZy9jcmVhdGlvbi1zdW1tYXJ5LWRpYWxvZy5jb21wb25lbnRcIjtcbmltcG9ydCB7aXNFbXB0eSwgaXNOaWwsIGlzTmFOLCB1bnNldCwgY2xvbmVEZWVwLCBpc0VxdWFsfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtWYWxpZGF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7U2VydmljZXNQYWdlU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uLy4uL3BhZ2VzL3NlcnZpY2VzL3NlcnZpY2VzLXBhZ2Uuc2VydmljZVwiO1xuXG4vLyBAdHMtaWdub3JlXG5jb25zdCB7YXBwfSA9IHdpbmRvdztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXNpbXBsZS1zZXJ2aWNlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbXBsZS1zZXJ2aWNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2ltcGxlLXNlcnZpY2UuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTaW1wbGVTZXJ2aWNlQ29tcG9uZW50IGV4dGVuZHMgUHJvamVjdGFibGVGb3JtIHtcbiAgQElucHV0KCkgc2VydmljZVJvbGVBdHRyaWJ1dGVzOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBpZGVudGl0eVJvbGVBdHRyaWJ1dGVzOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBpZGVudGl0eU5hbWVkQXR0cmlidXRlczogYW55W10gPSBbXTtcblxuICBzaG93Rm9ybSA9IHRydWU7XG4gIGZvcm1WaWV3ID0gJ3NpbXBsZSc7XG4gIGNvbnRyb2xsZXJEb21haW4gPSAnJztcbiAgeml0aVNlc3Npb25JZDtcbiAgaW50ZXJjZXB0UG9ydDtcbiAgaG9zdFByb3RvY29sID0gJ3RjcCc7XG4gIHNlcnZpY2VDbGlDb21tYW5kID0gJyc7XG4gIGludGVyY2VwdENvbmZpZ0NsaUNvbW1hbmQgPSAnJztcbiAgaG9zdENvbmZpZ0NsaUNvbW1hbmQgPSAnJztcbiAgZGlhbFBvbGljeUNsaUNvbW1hbmQgPSAnJztcbiAgYmluZFBvbGljeUNsaUNvbW1hbmQgPSAnJztcbiAgc2VydmljZUFwaVVybCA9ICcnO1xuICBpbnRlcmNlcHRDb25maWdBcGlVcmwgPSAnJztcbiAgaG9zdENvbmZpZ0FwaVVybCA9ICcnO1xuICBkaWFsUG9saWN5QXBpVXJsID0gJyc7XG4gIGJpbmRQb2xpY3lBcGlVcmwgPSAnJztcbiAgaW5pdFNlcnZpY2VBcGlEYXRhID0ge1xuICAgIG5hbWU6IFwiXCIsXG4gICAgcm9sZUF0dHJpYnV0ZXM6IFtdLFxuICAgIGNvbmZpZ3M6IFtdLFxuICAgIGVuY3J5cHRpb25SZXF1aXJlZDogdHJ1ZVxuICB9O1xuICBpbml0SW50ZXJjZXB0Q29uZmlnQXBpRGF0YSA9IHtcbiAgICBuYW1lOiBcIlwiLFxuICAgIGNvbmZpZ1R5cGVJZDpcImc3Y0lXYmNHZ1wiLFxuICAgIGRhdGE6IHtcbiAgICAgIHBvcnRSYW5nZXM6IFtdLFxuICAgICAgYWRkcmVzc2VzOiBbXSxcbiAgICAgIHByb3RvY29sczogWyd0Y3AnLCAndWRwJ11cbiAgICB9XG4gIH07XG4gIGluaXRIb3N0Q29uZmlnQXBpRGF0YSA9IHtcbiAgICBuYW1lOiAnJyxcbiAgICBjb25maWdUeXBlSWQ6IFwiTkg1cDRGcEdSXCIsXG4gICAgZGF0YToge1xuICAgICAgYWRkcmVzczogXCJcIixcbiAgICAgIHBvcnQ6IHVuZGVmaW5lZCxcbiAgICAgIGZvcndhcmRQcm90b2NvbDogdHJ1ZSxcbiAgICAgIGFsbG93ZWRQcm90b2NvbHM6IFsndGNwJ11cbiAgICB9XG4gIH07XG4gIGluaXREaWFsUG9saWN5QXBpRGF0YSA9IHtcbiAgICBuYW1lOiBcIlwiLFxuICAgIHR5cGU6IFwiRGlhbFwiLFxuICAgIHNlbWFudGljOiBcIkFueU9mXCIsXG4gICAgc2VydmljZVJvbGVzOiBbXSxcbiAgICBpZGVudGl0eVJvbGVzOiBbXVxuICB9O1xuICBpbml0QmluZFBvbGljeUFwaURhdGEgPSB7XG4gICAgbmFtZTogXCJcIixcbiAgICB0eXBlOiBcIkJpbmRcIixcbiAgICBzZW1hbnRpYzogXCJBbnlPZlwiLFxuICAgIHNlcnZpY2VSb2xlczogW10sXG4gICAgaWRlbnRpdHlSb2xlczogW11cbiAgfTtcbiAgc2VydmljZUFwaURhdGE7XG4gIGludGVyY2VwdENvbmZpZ0FwaURhdGE7XG4gIGhvc3RDb25maWdBcGlEYXRhO1xuICBkaWFsUG9saWN5QXBpRGF0YTtcbiAgYmluZFBvbGljeUFwaURhdGE7XG4gIGRpYWxQb2xpY3lOYW1lZEF0dHJpYnV0ZXMgPSBbXTtcbiAgZGlhbFBvbGljeVJvbGVBdHRyaWJ1dGVzID0gW107XG4gIGJpbmRQb2xpY3lOYW1lZEF0dHJpYnV0ZXMgPSBbXTtcbiAgYmluZFBvbGljeVJvbGVBdHRyaWJ1dGVzID0gW107XG4gIGlkZW50aXRpZXNOYW1lSWRNYXAgPSB7fTtcbiAgaW50ZXJjZXB0Q29uZmlnSWQ7XG4gIGhvc3RDb25maWdJZDtcbiAgc2VydmljZUlkO1xuICBzZGtPbmx5RGlhbCA9IGZhbHNlO1xuICBzZGtPbmx5QmluZCA9IGZhbHNlO1xuICBmb3JtRGF0YSA9IHt9O1xuICBkaWFsb2dSZWY6IGFueTtcblxuICBpbnRlcmNlcHRJbmNyZW1lbnQgPSAtMTtcbiAgaG9zdEluY3JlbWVudCA9IC0xO1xuICBzZXJ2aWNlSW5jcmVtZW50ID0gLTE7XG4gIGRpYWxJbmNyZW1lbnQgPSAtMTtcbiAgYmluZEluY3JlbWVudCA9IC0xO1xuXG4gIHNlcnZpY2VEYXRhQ2hhbmdlID0gZmFsc2U7XG4gIGludGVyY2VwdERhdGFDaGFuZ2UgPSBmYWxzZTtcbiAgaG9zdERhdGFDaGFuZ2UgPSBmYWxzZTtcbiAgZGlhbERhdGFDaGFuZ2UgPSBmYWxzZTtcbiAgYmluZERhdGFDaGFuZ2UgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIEBJbmplY3QoU0VUVElOR1NfU0VSVklDRSkgcHVibGljIHNldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxuICAgICAgcHVibGljIHN2YzogU2VydmljZUZvcm1TZXJ2aWNlLFxuICAgICAgQEluamVjdChaSVRJX0RBVEFfU0VSVklDRSkgcHJpdmF0ZSB6aXRpU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgZ3Jvd2xlclNlcnZpY2U6IEdyb3dsZXJTZXJ2aWNlLFxuICAgICAgQEluamVjdChTRVJWSUNFX0VYVEVOU0lPTl9TRVJWSUNFKSBleHRTZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSBkaWFsb2dGb3JtOiBNYXREaWFsb2csXG4gICAgICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgIHByaXZhdGUgc2VydmljZXNQYWdlU2VydmljZTogU2VydmljZXNQYWdlU2VydmljZVxuICApIHtcbiAgICBzdXBlcihncm93bGVyU2VydmljZSwgZXh0U2VydmljZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXJEb21haW4gPSB0aGlzLnNldHRpbmdzU2VydmljZT8uc2V0dGluZ3M/LnNlbGVjdGVkRWRnZUNvbnRyb2xsZXI7XG4gICAgdGhpcy56aXRpU2Vzc2lvbklkID0gdGhpcy5zZXR0aW5nc1NlcnZpY2U/LnNldHRpbmdzPy5zZXNzaW9uPy5pZDtcbiAgICB0aGlzLmluaXRGb3JtRGF0YSgpO1xuICAgIHRoaXMuZ2V0SWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMoKTtcbiAgfVxuXG4gIGluaXRGb3JtRGF0YSgpIHtcbiAgICB0aGlzLnNlcnZpY2VBcGlVcmwgPSBgJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9zZXJ2aWNlc2A7XG4gICAgdGhpcy5pbnRlcmNlcHRDb25maWdBcGlVcmwgPSBgJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9jb25maWdzYDtcbiAgICB0aGlzLmhvc3RDb25maWdBcGlVcmwgPSBgJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9jb25maWdzYDtcbiAgICB0aGlzLmRpYWxQb2xpY3lBcGlVcmwgPSBgJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9zZXJ2aWNlLXBvbGljaWVzYDtcbiAgICB0aGlzLmJpbmRQb2xpY3lBcGlVcmwgPSBgJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9zZXJ2aWNlLXBvbGljaWVzYDtcbiAgICB0aGlzLnNlcnZpY2VDbGlDb21tYW5kID0gJyc7XG4gICAgdGhpcy5pbnRlcmNlcHRDb25maWdDbGlDb21tYW5kID0gJyc7XG4gICAgdGhpcy5ob3N0Q29uZmlnQ2xpQ29tbWFuZCA9ICcnO1xuICAgIHRoaXMuZGlhbFBvbGljeUNsaUNvbW1hbmQgPSAnJztcbiAgICB0aGlzLmJpbmRQb2xpY3lDbGlDb21tYW5kID0gJyc7XG4gICAgdGhpcy5pbnRlcmNlcHRDb25maWdJZCA9ICcnO1xuICAgIHRoaXMuaG9zdENvbmZpZ0lkID0gJyc7XG4gICAgdGhpcy5zZXJ2aWNlSWQgPSAnJztcbiAgICB0aGlzLnNka09ubHlEaWFsID0gZmFsc2U7XG4gICAgdGhpcy5zZGtPbmx5QmluZCA9IGZhbHNlO1xuICAgIHRoaXMuaW50ZXJjZXB0UG9ydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRpYWxQb2xpY3lOYW1lZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICB0aGlzLmRpYWxQb2xpY3lSb2xlQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuYmluZFBvbGljeU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuYmluZFBvbGljeVJvbGVBdHRyaWJ1dGVzID0gW107XG4gICAgdGhpcy5zZXJ2aWNlQXBpRGF0YSA9IGNsb25lRGVlcCh0aGlzLmluaXRTZXJ2aWNlQXBpRGF0YSk7XG4gICAgdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhID0gY2xvbmVEZWVwKHRoaXMuaW5pdEludGVyY2VwdENvbmZpZ0FwaURhdGEpO1xuICAgIHRoaXMuaG9zdENvbmZpZ0FwaURhdGEgPSBjbG9uZURlZXAodGhpcy5pbml0SG9zdENvbmZpZ0FwaURhdGEpO1xuICAgIHRoaXMuZGlhbFBvbGljeUFwaURhdGEgPSBjbG9uZURlZXAodGhpcy5pbml0RGlhbFBvbGljeUFwaURhdGEpO1xuICAgIHRoaXMuYmluZFBvbGljeUFwaURhdGEgPSBjbG9uZURlZXAodGhpcy5pbml0QmluZFBvbGljeUFwaURhdGEpO1xuICAgIHRoaXMuc2VydmljZXNQYWdlU2VydmljZS5nZXRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIHRoaXMuc2VydmljZVJvbGVBdHRyaWJ1dGVzID0gcmVzdWx0LmRhdGE7XG4gICAgfSk7XG4gIH1cblxuICBnZXRJZGVudGl0eU5hbWVkQXR0cmlidXRlcyhmaWx0ZXI/KSB7XG4gICAgY29uc3QgcGFnaW5nID0ge1xuICAgICAgc2VhcmNoT246ICduYW1lJyxcbiAgICAgIGZpbHRlcjogZmlsdGVyIHx8ICcnLFxuICAgICAgdG90YWw6IDMwLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNvcnQ6ICduYW1lJyxcbiAgICAgIG9yZGVyOiAnYXNjJ1xuICAgIH07XG4gICAgdGhpcy56aXRpU2VydmljZS5nZXQoJ2lkZW50aXRpZXMnLCBwYWdpbmcsIFtdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IG5hbWVkQXR0cmlidXRlcyA9IHJlc3VsdC5kYXRhLm1hcCgoaWRlbnRpdHkpID0+IHtcbiAgICAgICAgdGhpcy5pZGVudGl0aWVzTmFtZUlkTWFwW2lkZW50aXR5Lm5hbWVdID0gaWRlbnRpdHkuaWQ7XG4gICAgICAgIHJldHVybiBpZGVudGl0eS5uYW1lO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzID0gbmFtZWRBdHRyaWJ1dGVzO1xuICAgIH0pO1xuICB9XG5cbiAgaGVhZGVyQWN0aW9uUmVxdWVzdGVkKGFjdGlvbikge1xuICAgIHN3aXRjaChhY3Rpb24ubmFtZSkge1xuICAgICAgY2FzZSAnc2F2ZSc6XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsKHRydWUsIHRydWUsICdjYXJkcycpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9nZ2xlLXZpZXcnOlxuICAgICAgICB0aGlzLmZvcm1WaWV3ID0gYWN0aW9uLmRhdGE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVNka09ubHlEaWFsKCkge1xuICAgIHRoaXMuc2RrT25seURpYWwgPSAhdGhpcy5zZGtPbmx5RGlhbDtcbiAgfVxuXG4gIHRvZ2dsZVNka09ubHlCaW5kKCkge1xuICAgIHRoaXMuc2RrT25seUJpbmQgPSAhdGhpcy5zZGtPbmx5QmluZDtcbiAgfVxuXG4gIHNlcnZpY2VOYW1lQ2hhbmdlZChldmVudCkge1xuICAgIHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5uYW1lID0gYCR7dGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lfS1pbnRlcmNlcHQtY29uZmlnYFxuICAgIHRoaXMuaG9zdENvbmZpZ0FwaURhdGEubmFtZSA9IGAke3RoaXMuc2VydmljZUFwaURhdGEubmFtZX0taG9zdC1jb25maWdgXG4gICAgdGhpcy5kaWFsUG9saWN5QXBpRGF0YS5uYW1lID0gYCR7dGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lfS1kaWFsLXBvbGljeWBcbiAgICB0aGlzLmJpbmRQb2xpY3lBcGlEYXRhLm5hbWUgPSBgJHt0aGlzLnNlcnZpY2VBcGlEYXRhLm5hbWV9LWJpbmQtcG9saWN5YFxuICB9XG5cbiAgaW50ZXJjZXB0UG9ydENoYW5nZWQoJGV2ZW50KSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuaW50ZXJjZXB0UG9ydCkgfHwgaXNOYU4odGhpcy5pbnRlcmNlcHRQb3J0KSkge1xuICAgICAgdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEucG9ydFJhbmdlcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEuZGF0YS5wb3J0UmFuZ2VzWzBdID0ge1xuICAgICAgaGlnaDogdGhpcy5pbnRlcmNlcHRQb3J0LFxuICAgICAgbG93OiB0aGlzLmludGVyY2VwdFBvcnRcbiAgICB9O1xuICB9XG5cbiAgaG9zdFByb3RvY29sc0NoYW5nZWQoJGV2ZW50KSB7XG4gICAgc3dpdGNoICh0aGlzLmhvc3RQcm90b2NvbCkge1xuICAgICAgY2FzZSAnYm90aCc6XG4gICAgICAgIHRoaXMuaG9zdENvbmZpZ0FwaURhdGEuZGF0YS5hbGxvd2VkUHJvdG9jb2xzID0gWyd0Y3AnLCAndWRwJ11cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEuYWxsb3dlZFByb3RvY29scyA9IFt0aGlzLmhvc3RQcm90b2NvbF07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUocmVmcmVzaD8pIHtcbiAgICBpZiAoIXRoaXMudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IHRoaXMuc2hvd1N1bW1hcnkoKTtcbiAgICB0aGlzLnNlcnZpY2VBcGlEYXRhLmNvbmZpZ3MgPSBbXTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZUludGVyY2VwdENvbmZpZyhzdW1tYXJ5RGF0YSk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVIb3N0Q29uZmlnKHN1bW1hcnlEYXRhKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVNlcnZpY2Uoc3VtbWFyeURhdGEpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlUG9saWN5KHN1bW1hcnlEYXRhLCAnRGlhbCcpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlUG9saWN5KHN1bW1hcnlEYXRhLCAnQmluZCcpO1xuXG4gICAgY29uc3QgZ3Jvd2xlckRhdGEgPSBuZXcgR3Jvd2xlck1vZGVsKFxuICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICdTdWNjZXNzJyxcbiAgICAgICAgYFNpbXBsZSBTZXJ2aWNlICR7dGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lfSBDcmVhdGVkYCxcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBjcmVhdGVkIGVudGl0aWVzIGZvciBzaW1wbGUgc2VydmljZSAke3RoaXMuc2VydmljZUFwaURhdGEubmFtZX1gLFxuICAgICk7XG4gICAgdGhpcy5ncm93bGVyU2VydmljZS5zaG93KGdyb3dsZXJEYXRhKTtcblxuICAgIHN1bW1hcnlEYXRhPy5mb3JFYWNoKChlbnRpdHlUeXBlKSA9PiB7XG4gICAgICBlbnRpdHlUeXBlLmVudGl0aWVzPy5mb3JFYWNoKChlbnRpdHkpID0+IHtcbiAgICAgICAgaWYgKGVudGl0eS50eXBlID09PSAnc2VydmljZXMnKSB7XG4gICAgICAgICAgZW50aXR5LmNsaUNvbW1hbmQgPSB0aGlzLnNlcnZpY2VDbGlDb21tYW5kO1xuICAgICAgICAgIGVudGl0eS5hcGlSZXF1ZXN0ID0gdGhpcy5nZXRTZXJ2aWNlc0FwaVJlcXVlc3QoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRpdHkudHlwZSA9PT0gJ2NvbmZpZ3MnICYmIGVudGl0eS5zdWJ0eXBlID09PSAnaW50ZXJjZXB0Jykge1xuICAgICAgICAgIGVudGl0eS5jbGlDb21tYW5kID0gdGhpcy5pbnRlcmNlcHRDb25maWdDbGlDb21tYW5kO1xuICAgICAgICAgIGVudGl0eS5hcGlSZXF1ZXN0ID0gdGhpcy5nZXRJbnRlcmNlcHRDb25maWdBcGlSZXF1ZXN0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW50aXR5LnR5cGUgPT09ICdjb25maWdzJyAmJiBlbnRpdHkuc3VidHlwZSA9PT0gJ2hvc3QnKSB7XG4gICAgICAgICAgZW50aXR5LmNsaUNvbW1hbmQgPSB0aGlzLmhvc3RDb25maWdDbGlDb21tYW5kO1xuICAgICAgICAgIGVudGl0eS5hcGlSZXF1ZXN0ID0gdGhpcy5nZXRIb3N0Q29uZmlnQXBpUmVxdWVzdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudGl0eS50eXBlID09PSAnc2VydmljZS1wb2xpY2llcycgJiYgZW50aXR5LnN1YnR5cGUgPT09ICdkaWFsJykge1xuICAgICAgICAgIGVudGl0eS5jbGlDb21tYW5kID0gdGhpcy5kaWFsUG9saWN5Q2xpQ29tbWFuZDtcbiAgICAgICAgICBlbnRpdHkuYXBpUmVxdWVzdCA9IHRoaXMuZ2V0RGlhbEFwaVJlcXVlc3QoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRpdHkudHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnICYmIGVudGl0eS5zdWJ0eXBlID09PSAnYmluZCcpIHtcbiAgICAgICAgICBlbnRpdHkuY2xpQ29tbWFuZCA9IHRoaXMuYmluZFBvbGljeUNsaUNvbW1hbmQ7XG4gICAgICAgICAgZW50aXR5LmFwaVJlcXVlc3QgPSB0aGlzLmdldEJpbmRBcGlSZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2hvd1N1bW1hcnkoKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0U3VtbWFyeSA9IHtcbiAgICAgIG5hbWU6IHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5uYW1lLFxuICAgICAgdHlwZTogJ2NvbmZpZ3MnLFxuICAgICAgc3VidHlwZTogJ2ludGVyY2VwdCcsXG4gICAgICBhcGlEYXRhOiB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEsXG4gICAgICBjbGlDb21tYW5kOiB0aGlzLmludGVyY2VwdENvbmZpZ0NsaUNvbW1hbmQsXG4gICAgICBhcGlSZXF1ZXN0OiAnJyxcbiAgICAgIGFwaVVybDogdGhpcy5pbnRlcmNlcHRDb25maWdBcGlVcmwsXG4gICAgICBzdGF0dXM6ICdsb2FkaW5nJyxcbiAgICAgIHJldHJ5OiB0aGlzLmNyZWF0ZUludGVyY2VwdENvbmZpZy5iaW5kKHRoaXMpLFxuICAgIH07XG4gICAgY29uc3QgaG9zdFN1bW1hcnkgPSB7XG4gICAgICBuYW1lOiB0aGlzLmhvc3RDb25maWdBcGlEYXRhLm5hbWUsXG4gICAgICB0eXBlOiAnY29uZmlncycsXG4gICAgICBzdWJ0eXBlOiAnaG9zdCcsXG4gICAgICBhcGlEYXRhOiB0aGlzLmhvc3RDb25maWdBcGlEYXRhLFxuICAgICAgY2xpQ29tbWFuZDogdGhpcy5ob3N0Q29uZmlnQ2xpQ29tbWFuZCxcbiAgICAgIGFwaVJlcXVlc3Q6ICcnLFxuICAgICAgYXBpVXJsOiB0aGlzLmhvc3RDb25maWdBcGlVcmwsXG4gICAgICBzdGF0dXM6ICdsb2FkaW5nJyxcbiAgICAgIHJldHJ5OiB0aGlzLmNyZWF0ZUhvc3RDb25maWcuYmluZCh0aGlzKVxuICAgIH07XG4gICAgY29uc3Qgc3VtbWFyeURhdGE6IGFueSA9IFtcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6ICdTZXJ2aWNlcycsXG4gICAgICAgIGVudGl0aWVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogJ3NlcnZpY2VzJyxcbiAgICAgICAgICAgIGFwaURhdGE6IHRoaXMuc2VydmljZUFwaURhdGEsXG4gICAgICAgICAgICBjbGlDb21tYW5kOiB0aGlzLnNlcnZpY2VDbGlDb21tYW5kLFxuICAgICAgICAgICAgYXBpUmVxdWVzdDogJycsXG4gICAgICAgICAgICBhcGlVcmw6IHRoaXMuc2VydmljZUFwaVVybCxcbiAgICAgICAgICAgIHN0YXR1czogJ2xvYWRpbmcnLFxuICAgICAgICAgICAgcmV0cnk6IHRoaXMuY3JlYXRlU2VydmljZS5iaW5kKHRoaXMpXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0aXRsZTogJ1NlcnZpY2UgUG9saWNpZXMnLFxuICAgICAgICBlbnRpdGllczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuZGlhbFBvbGljeUFwaURhdGEubmFtZSxcbiAgICAgICAgICAgIHR5cGU6ICdzZXJ2aWNlLXBvbGljaWVzJyxcbiAgICAgICAgICAgIHN1YnR5cGU6ICdkaWFsJyxcbiAgICAgICAgICAgIGFwaURhdGE6IHRoaXMuZGlhbFBvbGljeUFwaURhdGEsXG4gICAgICAgICAgICBjbGlDb21tYW5kOiB0aGlzLmRpYWxQb2xpY3lDbGlDb21tYW5kLFxuICAgICAgICAgICAgYXBpUmVxdWVzdDogJycsXG4gICAgICAgICAgICBhcGlVcmw6IHRoaXMuZGlhbFBvbGljeUFwaVVybCxcbiAgICAgICAgICAgIHN0YXR1czogJ2xvYWRpbmcnLFxuICAgICAgICAgICAgcmV0cnk6IChzdW1tYXJ5RGF0YSkgPT4geyB0aGlzLmNyZWF0ZVBvbGljeShzdW1tYXJ5RGF0YSwgJ0RpYWwnKSB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLmJpbmRQb2xpY3lBcGlEYXRhLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiAnc2VydmljZS1wb2xpY2llcycsXG4gICAgICAgICAgICBzdWJ0eXBlOiAnYmluZCcsXG4gICAgICAgICAgICBhcGlEYXRhOiB0aGlzLmJpbmRQb2xpY3lBcGlEYXRhLFxuICAgICAgICAgICAgY2xpQ29tbWFuZDogdGhpcy5iaW5kUG9saWN5Q2xpQ29tbWFuZCxcbiAgICAgICAgICAgIGFwaVJlcXVlc3Q6ICcnLFxuICAgICAgICAgICAgYXBpVXJsOiB0aGlzLmJpbmRQb2xpY3lBcGlVcmwsXG4gICAgICAgICAgICBzdGF0dXM6ICdsb2FkaW5nJyxcbiAgICAgICAgICAgIHJldHJ5OiAoc3VtbWFyeURhdGEpID0+IHsgdGhpcy5jcmVhdGVQb2xpY3koc3VtbWFyeURhdGEsICdCaW5kJykgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF07XG4gICAgaWYgKCF0aGlzLnNka09ubHlEaWFsICYmICF0aGlzLnNka09ubHlCaW5kKSB7XG4gICAgICBzdW1tYXJ5RGF0YS5zcGxpY2UoMCwwLHtcbiAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9ucycsXG4gICAgICAgIGVudGl0aWVzOiBbaW50ZXJjZXB0U3VtbWFyeSwgaG9zdFN1bW1hcnldXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnNka09ubHlEaWFsKSB7XG4gICAgICBzdW1tYXJ5RGF0YS5zcGxpY2UoMCwwLHtcbiAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9ucycsXG4gICAgICAgIGVudGl0aWVzOiBbaW50ZXJjZXB0U3VtbWFyeV1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2RrT25seUJpbmQpIHtcbiAgICAgIHN1bW1hcnlEYXRhLnNwbGljZSgwLDAse1xuICAgICAgICB0aXRsZTogJ0NvbmZpZ3VyYXRpb25zJyxcbiAgICAgICAgZW50aXRpZXM6IFtob3N0U3VtbWFyeV1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgc3VtbWFyeURhdGE6IHN1bW1hcnlEYXRhXG4gICAgfTtcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nRm9ybS5vcGVuKENyZWF0aW9uU3VtbWFyeURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgfSk7XG4gICAgdGhpcy5kaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ25ldycpIHtcbiAgICAgICAgdGhpcy5pbml0Rm9ybURhdGEoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAnY2FuY2VsJykge1xuICAgICAgICAvLy8gRG8gbm90aGluZywgc3RheSBvbiBwYWdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsb3NlTW9kYWwodHJ1ZSwgdHJ1ZSwgJycpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdW1tYXJ5RGF0YTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUludGVyY2VwdENvbmZpZyhzdW1tYXJ5RGF0YSkge1xuICAgIGlmICh0aGlzLnNka09ubHlEaWFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzdGF0dXM7XG4gICAgdGhpcy5pbnRlcmNlcHRJbmNyZW1lbnQrKztcbiAgICBsZXQgcG9zdEZpeCA9ICcnO1xuICAgIGlmICh0aGlzLmludGVyY2VwdEluY3JlbWVudCA+IDApIHtcbiAgICAgIHBvc3RGaXggPSAnXycgKyB0aGlzLmludGVyY2VwdEluY3JlbWVudDtcbiAgICB9XG4gICAgdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLm5hbWUgPSB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEubmFtZSArIHBvc3RGaXg7XG4gICAgY29uc3QgaW50ZXJjZXB0Q29uZmlnUmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlLnBvc3QoJ2NvbmZpZ3MnLCB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEsIHRydWUpLmNhdGNoKChyZXN1bHQpID0+IHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgaWYgKGludGVyY2VwdENvbmZpZ1Jlc3VsdC5lcnJvcikge1xuICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcmNlcHRDb25maWdJZCA9IGludGVyY2VwdENvbmZpZ1Jlc3VsdC5pZCA/IGludGVyY2VwdENvbmZpZ1Jlc3VsdC5pZCA6IGludGVyY2VwdENvbmZpZ1Jlc3VsdC5kYXRhLmlkO1xuICAgICAgdGhpcy5zZXJ2aWNlQXBpRGF0YS5jb25maWdzLnB1c2godGhpcy5pbnRlcmNlcHRDb25maWdJZCk7XG4gICAgICB0aGlzLmludGVyY2VwdENvbmZpZ0NsaUNvbW1hbmQgPSBgeml0aSBlZGdlIGNyZWF0ZSBjb25maWcgJyR7dGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLm5hbWV9JyAnJHt0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEuY29uZmlnVHlwZUlkfScgJyR7SlNPTi5zdHJpbmdpZnkodGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEpfSdgO1xuICAgICAgc3RhdHVzID0gJ2RvbmUnO1xuICAgICAgdGhpcy5pbnRlcmNlcHRJbmNyZW1lbnQgPSAtMTtcbiAgICB9XG4gICAgc3VtbWFyeURhdGFbMF0uZW50aXRpZXNbMF0uc3RhdHVzID0gc3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlSG9zdENvbmZpZyhzdW1tYXJ5RGF0YSkge1xuICAgIGlmICh0aGlzLnNka09ubHlCaW5kKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzdGF0dXM7XG4gICAgdGhpcy5ob3N0SW5jcmVtZW50Kys7XG4gICAgbGV0IHBvc3RGaXggPSAnJztcbiAgICBpZiAodGhpcy5ob3N0SW5jcmVtZW50ID4gMCkge1xuICAgICAgcG9zdEZpeCA9ICdfJyArIHRoaXMuaG9zdEluY3JlbWVudDtcbiAgICB9XG4gICAgdGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5uYW1lID0gdGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5uYW1lICsgcG9zdEZpeDtcbiAgICBjb25zdCBob3N0Q29uZmlnUmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlLnBvc3QoJ2NvbmZpZ3MnLCB0aGlzLmhvc3RDb25maWdBcGlEYXRhLCB0cnVlKS5jYXRjaCgocmVzdWx0KSA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIGlmIChob3N0Q29uZmlnUmVzdWx0LmVycm9yKSB7XG4gICAgICBzdGF0dXMgPSAnZXJyb3InO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhvc3RDb25maWdJZCA9IGhvc3RDb25maWdSZXN1bHQuaWQgPyBob3N0Q29uZmlnUmVzdWx0LmlkIDogaG9zdENvbmZpZ1Jlc3VsdC5kYXRhLmlkO1xuICAgICAgdGhpcy5zZXJ2aWNlQXBpRGF0YS5jb25maWdzLnB1c2godGhpcy5ob3N0Q29uZmlnSWQpO1xuICAgICAgdGhpcy5ob3N0Q29uZmlnQ2xpQ29tbWFuZCA9IGB6aXRpIGVkZ2UgY3JlYXRlIGNvbmZpZyAnJHt0aGlzLmhvc3RDb25maWdBcGlEYXRhLm5hbWV9JyAnJHt0aGlzLmhvc3RDb25maWdBcGlEYXRhLmNvbmZpZ1R5cGVJZH0nICcke0pTT04uc3RyaW5naWZ5KHRoaXMuaG9zdENvbmZpZ0FwaURhdGEuZGF0YSl9J2A7XG4gICAgICBzdGF0dXMgPSAnZG9uZSc7XG4gICAgICB0aGlzLmhvc3RJbmNyZW1lbnQgPSAtMTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2RrT25seURpYWwpIHtcbiAgICAgIHN1bW1hcnlEYXRhWzBdLmVudGl0aWVzWzBdLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIHN1bW1hcnlEYXRhWzBdLmVudGl0aWVzWzBdLmFwaURhdGEgPSB0aGlzLmhvc3RDb25maWdBcGlEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdW1tYXJ5RGF0YVswXS5lbnRpdGllc1sxXS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBzdW1tYXJ5RGF0YVswXS5lbnRpdGllc1swXS5hcGlEYXRhID0gdGhpcy5ob3N0Q29uZmlnQXBpRGF0YTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2aWNlKHN1bW1hcnlEYXRhKSB7XG4gICAgdGhpcy5zZXJ2aWNlSW5jcmVtZW50Kys7XG4gICAgbGV0IHBvc3RGaXggPSAnJztcbiAgICBpZiAodGhpcy5zZXJ2aWNlSW5jcmVtZW50ID4gMCkge1xuICAgICAgcG9zdEZpeCA9ICdfJyArIHRoaXMuc2VydmljZUluY3JlbWVudDtcbiAgICB9XG4gICAgdGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lID0gdGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lICsgcG9zdEZpeDtcbiAgICBjb25zdCBzZXJ2aWNlUmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlLnBvc3QoJ3NlcnZpY2VzJywgdGhpcy5zZXJ2aWNlQXBpRGF0YSwgdHJ1ZSkuY2F0Y2goKHJlc3VsdCkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICBsZXQgc2VydmljZVN0YXR1cztcbiAgICBpZiAoc2VydmljZVJlc3VsdC5lcnJvcikge1xuICAgICAgc2VydmljZVN0YXR1cyA9ICdlcnJvcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VydmljZUlkID0gc2VydmljZVJlc3VsdC5pZCA/IHNlcnZpY2VSZXN1bHQuaWQgOiBzZXJ2aWNlUmVzdWx0LmRhdGEuaWQ7XG4gICAgICBzZXJ2aWNlU3RhdHVzID0gJ2RvbmUnO1xuICAgICAgbGV0IGNsaUNvbmZpZ0lkcyA9ICcnO1xuICAgICAgaWYgKCF0aGlzLnNka09ubHlEaWFsICYmICF0aGlzLnNka09ubHlCaW5kKSB7XG4gICAgICAgIGNsaUNvbmZpZ0lkcyA9IGAtLWNvbmZpZ3MgJyR7dGhpcy5pbnRlcmNlcHRDb25maWdJZH0sJHt0aGlzLmhvc3RDb25maWdJZH0nYDtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2RrT25seUJpbmQgJiYgdGhpcy5zZGtPbmx5QmluZCkge1xuICAgICAgICBjbGlDb25maWdJZHMgPSBgLS1jb25maWdzICcke3RoaXMuaW50ZXJjZXB0Q29uZmlnSWR9J2A7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2RrT25seUJpbmQgJiYgIXRoaXMuc2RrT25seUJpbmQpIHtcbiAgICAgICAgY2xpQ29uZmlnSWRzID0gYC0tY29uZmlncyAnJHt0aGlzLmludGVyY2VwdENvbmZpZ0lkfSdgO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXJ2aWNlQ2xpQ29tbWFuZCA9IGB6aXRpIGVkZ2UgY3JlYXRlIHNlcnZpY2UgJyR7dGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lfScgJHtjbGlDb25maWdJZHN9YFxuICAgICAgdGhpcy5zZXJ2aWNlSW5jcmVtZW50ID0gLTE7XG4gICAgfVxuICAgIGNvbnN0IHN1bW1hcnlJbmRleCA9ICh0aGlzLnNka09ubHlEaWFsICYmIHRoaXMuc2RrT25seUJpbmQpID8gMCA6IDE7XG4gICAgc3VtbWFyeURhdGFbc3VtbWFyeUluZGV4XS5lbnRpdGllc1swXS5zdGF0dXMgPSBzZXJ2aWNlU3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUG9saWN5KHN1bW1hcnlEYXRhLCB0eXBlID0gJ0RpYWwnKSB7XG4gICAgbGV0IHBvbGljeUFwaURhdGEsIHJvbGVBdHRyaWJ1dGVzLCBuYW1lZEF0dHJpYnV0ZXM7XG4gICAgaWYgKHR5cGUgPT09ICdEaWFsJykge1xuICAgICAgdGhpcy5kaWFsSW5jcmVtZW50Kys7XG4gICAgICBsZXQgcG9zdEZpeCA9ICcnO1xuICAgICAgaWYgKHRoaXMuZGlhbEluY3JlbWVudCA+IDApIHtcbiAgICAgICAgcG9zdEZpeCA9ICdfJyArIHRoaXMuZGlhbEluY3JlbWVudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbFBvbGljeUFwaURhdGEubmFtZSA9IHRoaXMuZGlhbFBvbGljeUFwaURhdGEubmFtZSArIHBvc3RGaXg7XG4gICAgICBwb2xpY3lBcGlEYXRhID0gdGhpcy5kaWFsUG9saWN5QXBpRGF0YTtcbiAgICAgIHJvbGVBdHRyaWJ1dGVzID0gdGhpcy5kaWFsUG9saWN5Um9sZUF0dHJpYnV0ZXM7XG4gICAgICBuYW1lZEF0dHJpYnV0ZXMgPSB0aGlzLmRpYWxQb2xpY3lOYW1lZEF0dHJpYnV0ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmluZEluY3JlbWVudCsrO1xuICAgICAgbGV0IHBvc3RGaXggPSAnJztcbiAgICAgIGlmICh0aGlzLmJpbmRJbmNyZW1lbnQgPiAwKSB7XG4gICAgICAgIHBvc3RGaXggPSAnXycgKyB0aGlzLmJpbmRJbmNyZW1lbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLmJpbmRQb2xpY3lBcGlEYXRhLm5hbWUgPSB0aGlzLmJpbmRQb2xpY3lBcGlEYXRhLm5hbWUgKyBwb3N0Rml4O1xuICAgICAgcG9saWN5QXBpRGF0YSA9IHRoaXMuYmluZFBvbGljeUFwaURhdGE7XG4gICAgICByb2xlQXR0cmlidXRlcyA9IHRoaXMuYmluZFBvbGljeVJvbGVBdHRyaWJ1dGVzO1xuICAgICAgbmFtZWRBdHRyaWJ1dGVzID0gdGhpcy5iaW5kUG9saWN5TmFtZWRBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIHBvbGljeUFwaURhdGEuc2VydmljZVJvbGVzID0gW2BAJHt0aGlzLnNlcnZpY2VJZH1gXTtcbiAgICBsZXQgY2xpUm9sZXMgPSAnJztcbiAgICBsZXQgc3RhdHVzID0gJyc7XG4gICAgcG9saWN5QXBpRGF0YS5pZGVudGl0eVJvbGVzID0gbmFtZWRBdHRyaWJ1dGVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY2xpUm9sZXMgKz0gJ0AnICsgdGhpcy5pZGVudGl0aWVzTmFtZUlkTWFwW25hbWVdICsgJywnO1xuICAgICAgcmV0dXJuICdAJyArIHRoaXMuaWRlbnRpdGllc05hbWVJZE1hcFtuYW1lXTtcbiAgICB9KTtcbiAgICBwb2xpY3lBcGlEYXRhLmlkZW50aXR5Um9sZXMgPSBbLi4ucG9saWN5QXBpRGF0YS5pZGVudGl0eVJvbGVzLCAuLi5yb2xlQXR0cmlidXRlcy5tYXAoKHJvbGUpID0+IHtcbiAgICAgIGNsaVJvbGVzICs9ICcjJyArIHJvbGUgKyAnLCc7XG4gICAgICByZXR1cm4gJyMnICsgcm9sZTtcbiAgICB9KV07XG4gICAgY2xpUm9sZXMgPSBjbGlSb2xlcy5zbGljZSgwLCAtMSk7XG4gICAgY29uc3QgZGlhbFBvbGljeVJlc3VsdCA9IGF3YWl0IHRoaXMueml0aVNlcnZpY2UucG9zdCgnc2VydmljZS1wb2xpY2llcycsIHBvbGljeUFwaURhdGEpLmNhdGNoKChyZXN1bHQpID0+IHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgaWYgKGRpYWxQb2xpY3lSZXN1bHQuZXJyb3IpIHtcbiAgICAgIHN0YXR1cyA9ICdlcnJvcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cyA9ICdkb25lJztcbiAgICB9XG4gICAgY29uc3Qgc3VtbWFyeUluZGV4ID0gKHRoaXMuc2RrT25seURpYWwgJiYgdGhpcy5zZGtPbmx5QmluZCkgPyAxIDogMjtcbiAgICBjb25zdCBlbnRpdHlJbmRleCA9IHR5cGUgPT09ICdEaWFsJyA/IDAgOiAxO1xuICAgIHN1bW1hcnlEYXRhW3N1bW1hcnlJbmRleF0uZW50aXRpZXNbZW50aXR5SW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcbiAgICBjb25zdCBjbGlDb21tYW5kID0gYHppdGkgZWRnZSBjcmVhdGUgc2VydmljZS1wb2xpY3kgJyR7cG9saWN5QXBpRGF0YS5uYW1lfScgJHt0eXBlfSAtLXNlbWFudGljIEFueU9mIC0tc2VydmljZS1yb2xlcyAnQCR7dGhpcy5zZXJ2aWNlSWR9JyAtLWlkZW50aXR5LXJvbGVzICcke2NsaVJvbGVzfSdgO1xuICAgIGlmICh0eXBlID09PSAnRGlhbCcpIHtcbiAgICAgIHRoaXMuZGlhbFBvbGljeUNsaUNvbW1hbmQgPSBjbGlDb21tYW5kO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2RvbmUnKSB7XG4gICAgICAgIHRoaXMuZGlhbEluY3JlbWVudCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iaW5kSW5jcmVtZW50ID0gLTE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmluZFBvbGljeUNsaUNvbW1hbmQgPSBjbGlDb21tYW5kO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRoaXMuZXJyb3JzID0ge307XG4gICAgdGhpcy52YWxpZGF0ZVNlcnZpY2VOYW1lKCk7XG4gICAgdGhpcy52YWxpZGF0ZUludGVyY2VwdEFkZHJlc3MoKTtcbiAgICB0aGlzLnZhbGlkYXRlSW50ZXJjZXB0UG9ydCgpO1xuICAgIHRoaXMudmFsaWRhdGVIb3N0QWRkcmVzcygpO1xuICAgIHRoaXMudmFsaWRhdGVIb3N0UG9ydCgpO1xuICAgIHRoaXMudmFsaWRhdGVEaWFsSWRlbnRpdGllcygpXG4gICAgdGhpcy52YWxpZGF0ZUJpbmRJZGVudGl0aWVzKCk7XG4gICAgcmV0dXJuIGlzRW1wdHkodGhpcy5lcnJvcnMpO1xuICB9XG5cbiAgdmFsaWRhdGVTZXJ2aWNlTmFtZSgpIHtcbiAgICBpZiAoaXNFbXB0eSh0aGlzLnNlcnZpY2VBcGlEYXRhLm5hbWUpKSB7XG4gICAgICB0aGlzLmVycm9ycy5uYW1lID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICduYW1lJyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVJbnRlcmNlcHRBZGRyZXNzKCkge1xuICAgIGlmICh0aGlzLnNka09ubHlEaWFsKSB7XG4gICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2ludGVyY2VwdEFkZHJlc3MnKTtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnaW50ZXJjZXB0QWRkcmVzc0Zvcm1hdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNFbXB0eSh0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEuZGF0YS5hZGRyZXNzZXMpIHx8IGlzRW1wdHkodGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEuYWRkcmVzc2VzWzBdKSkge1xuICAgICAgdGhpcy5lcnJvcnMuaW50ZXJjZXB0QWRkcmVzcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghdGhpcy52YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkSW50ZXJjZXB0SG9zdCh0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEuZGF0YS5hZGRyZXNzZXNbMF0pKSB7XG4gICAgICB0aGlzLmVycm9ycy5pbnRlcmNlcHRBZGRyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXJyb3JzLmludGVyY2VwdEFkZHJlc3NGb3JtYXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2ludGVyY2VwdEFkZHJlc3MnKTtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnaW50ZXJjZXB0QWRkcmVzc0Zvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlSW50ZXJjZXB0UG9ydCgpIHtcbiAgICBpZiAodGhpcy5zZGtPbmx5RGlhbCkge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICdpbnRlcmNlcHRQb3J0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0VtcHR5KHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5kYXRhLnBvcnRSYW5nZXMpKSB7XG4gICAgICB0aGlzLmVycm9ycy5pbnRlcmNlcHRQb3J0ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVQb3J0UmFuZ2VzKHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5kYXRhLnBvcnRSYW5nZXMpKSB7XG4gICAgICB0aGlzLmVycm9ycy5pbnRlcmNlcHRQb3J0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICdpbnRlcmNlcHRQb3J0Jyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVIb3N0QWRkcmVzcygpIHtcbiAgICBpZiAoIXRoaXMuc2RrT25seUJpbmQgJiYgaXNFbXB0eSh0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEuYWRkcmVzcykpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhvc3RBZGRyZXNzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICdob3N0QWRkcmVzcycpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlSG9zdFBvcnQoKSB7XG4gICAgaWYgKHRoaXMuc2RrT25seUJpbmQpIHtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnaG9zdFBvcnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzTmlsKHRoaXMuaG9zdENvbmZpZ0FwaURhdGEuZGF0YS5wb3J0KSB8fCBpc05hTih0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEucG9ydCkpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhvc3RQb3J0ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLmlzVmFsaWRQb3J0KHRoaXMuaG9zdENvbmZpZ0FwaURhdGEuZGF0YS5wb3J0KSkge1xuICAgICAgdGhpcy5lcnJvcnMuaG9zdFBvcnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2hvc3RQb3J0Jyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVEaWFsSWRlbnRpdGllcygpIHtcbiAgICBpZiAoaXNFbXB0eShbLi4udGhpcy5kaWFsUG9saWN5TmFtZWRBdHRyaWJ1dGVzLCAuLi50aGlzLmRpYWxQb2xpY3lSb2xlQXR0cmlidXRlc10pKSB7XG4gICAgICB0aGlzLmVycm9ycy5kaWFsSWRlbnRpdGllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnZGlhbElkZW50aXRpZXMnKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUJpbmRJZGVudGl0aWVzKCkge1xuICAgIGlmIChpc0VtcHR5KFsuLi50aGlzLmJpbmRQb2xpY3lOYW1lZEF0dHJpYnV0ZXMsIC4uLnRoaXMuYmluZFBvbGljeVJvbGVBdHRyaWJ1dGVzXSkpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmJpbmRJZGVudGl0aWVzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICdiaW5kSWRlbnRpdGllcycpO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlcnZpY2VzQXBpUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gYGN1cmwgJyR7dGhpcy5jb250cm9sbGVyRG9tYWlufS9lZGdlL21hbmFnZW1lbnQvdjEvc2VydmljZXMnIFxcXFxcbiAgICAgIC1IICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicgXFxcXFxuICAgICAgLUggJ2NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbicgXFxcXFxuICAgICAgLUggJ3p0LXNlc3Npb246ICR7dGhpcy56aXRpU2Vzc2lvbklkfScgXFxcXFxuICAgICAgLS1kYXRhLXJhdyAnJHtKU09OLnN0cmluZ2lmeSh0aGlzLnNlcnZpY2VBcGlEYXRhKX0nIFxcXFxgXG4gIH1cblxuICBnZXRJbnRlcmNlcHRDb25maWdBcGlSZXF1ZXN0KCkge1xuICAgIHJldHVybiBgY3VybCAnJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9jb25maWdzJyBcXFxcXG4gICAgICAtSCAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonIFxcXFxcbiAgICAgIC1IICdjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFxcXFxcbiAgICAgIC1IICd6dC1zZXNzaW9uOiAke3RoaXMueml0aVNlc3Npb25JZH0nIFxcXFxcbiAgICAgIC0tZGF0YS1yYXcgJyR7SlNPTi5zdHJpbmdpZnkodGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhKX0nIFxcXFxgXG4gIH1cblxuICBnZXRIb3N0Q29uZmlnQXBpUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gYGN1cmwgJyR7dGhpcy5jb250cm9sbGVyRG9tYWlufS9lZGdlL21hbmFnZW1lbnQvdjEvY29uZmlncycgXFxcXFxuICAgICAgLUggJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyBcXFxcXG4gICAgICAtSCAnY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcXFxcXG4gICAgICAtSCAnenQtc2Vzc2lvbjogJHt0aGlzLnppdGlTZXNzaW9uSWR9JyBcXFxcXG4gICAgICAtLWRhdGEtcmF3ICcke0pTT04uc3RyaW5naWZ5KHRoaXMuaG9zdENvbmZpZ0FwaURhdGEpfScgXFxcXGBcbiAgfVxuXG4gIGdldERpYWxBcGlSZXF1ZXN0KCkge1xuICAgIHJldHVybiBgY3VybCAnJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9zZXJ2aWNlLXBvbGljaWVzJyBcXFxcXG4gICAgICAtSCAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonIFxcXFxcbiAgICAgIC1IICdjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFxcXFxcbiAgICAgIC1IICd6dC1zZXNzaW9uOiAke3RoaXMueml0aVNlc3Npb25JZH0nIFxcXFxcbiAgICAgIC0tZGF0YS1yYXcgJyR7SlNPTi5zdHJpbmdpZnkodGhpcy5kaWFsUG9saWN5QXBpRGF0YSl9JyBcXFxcYDtcbiAgfVxuXG4gIGdldEJpbmRBcGlSZXF1ZXN0KCkge1xuICAgIHJldHVybiBgY3VybCAnJHt0aGlzLmNvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9zZXJ2aWNlLXBvbGljaWVzJyBcXFxcXG4gICAgICAtSCAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonIFxcXFxcbiAgICAgIC1IICdjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFxcXFxcbiAgICAgIC1IICd6dC1zZXNzaW9uOiAke3RoaXMueml0aVNlc3Npb25JZH0nIFxcXFxcbiAgICAgIC0tZGF0YS1yYXcgJyR7SlNPTi5zdHJpbmdpZnkodGhpcy5iaW5kUG9saWN5QXBpRGF0YSl9JyBcXFxcYDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNoZWNrRGF0YUNoYW5nZSgpIHtcbiAgICBjb25zdCBzZXJ2aWNlRGF0YUNoYW5nZSA9ICFpc0VxdWFsKHRoaXMuaW5pdFNlcnZpY2VBcGlEYXRhLCB0aGlzLnNlcnZpY2VBcGlEYXRhKTtcbiAgICBjb25zdCBpbnRlcmNlcHREYXRhQ2hhbmdlID0gIWlzRXF1YWwodGhpcy5pbml0SW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5kYXRhLCB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEuZGF0YSk7XG4gICAgY29uc3QgaG9zdERhdGFDaGFuZ2UgPSAhaXNFcXVhbCh0aGlzLmluaXRIb3N0Q29uZmlnQXBpRGF0YS5kYXRhLCB0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEpO1xuICAgIGNvbnN0IGRpYWxEYXRhQ2hhbmdlID0gIWlzRXF1YWwodGhpcy5pbml0RGlhbFBvbGljeUFwaURhdGEsIHRoaXMuZGlhbFBvbGljeUFwaURhdGEpO1xuICAgIGNvbnN0IGJpbmREYXRhQ2hhbmdlID0gIWlzRXF1YWwodGhpcy5pbml0QmluZFBvbGljeUFwaURhdGEsIHRoaXMuYmluZFBvbGljeUFwaURhdGEpO1xuICAgIGNvbnN0IGRhdGFDaGFuZ2UgPSBzZXJ2aWNlRGF0YUNoYW5nZSAhPT0gdGhpcy5zZXJ2aWNlRGF0YUNoYW5nZSB8fCBpbnRlcmNlcHREYXRhQ2hhbmdlICE9PSB0aGlzLmludGVyY2VwdERhdGFDaGFuZ2UgfHwgaG9zdERhdGFDaGFuZ2UgIT09IHRoaXMuaG9zdERhdGFDaGFuZ2UgfHxcbiAgICAgICAgZGlhbERhdGFDaGFuZ2UgIT09IHRoaXMuZGlhbERhdGFDaGFuZ2UgfHwgYmluZERhdGFDaGFuZ2UgIT09IHRoaXMuYmluZERhdGFDaGFuZ2U7XG4gICAgaWYgKGRhdGFDaGFuZ2UpIHtcbiAgICAgIHRoaXMuc2VydmljZURhdGFDaGFuZ2UgPSBzZXJ2aWNlRGF0YUNoYW5nZTtcbiAgICAgIHRoaXMuaW50ZXJjZXB0RGF0YUNoYW5nZSA9IGludGVyY2VwdERhdGFDaGFuZ2U7XG4gICAgICB0aGlzLmhvc3REYXRhQ2hhbmdlID0gaG9zdERhdGFDaGFuZ2U7XG4gICAgICB0aGlzLmRpYWxEYXRhQ2hhbmdlID0gZGlhbERhdGFDaGFuZ2U7XG4gICAgICB0aGlzLmJpbmREYXRhQ2hhbmdlID0gYmluZERhdGFDaGFuZ2U7XG4gICAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdChkYXRhQ2hhbmdlKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YUNoYW5nZSA9IHNlcnZpY2VEYXRhQ2hhbmdlIHx8IGludGVyY2VwdERhdGFDaGFuZ2UgfHwgaG9zdERhdGFDaGFuZ2UgfHwgZGlhbERhdGFDaGFuZ2UgfHwgYmluZERhdGFDaGFuZ2U7XG4gICAgYXBwLmlzRGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHJvamVjdGFibGUtZm9ybS13cmFwcGVyIHNpbXBsZS1zZXJ2aWNlLXdyYXBwZXJcIlxuICAgICAoa2V5dXAuZW50ZXIpPVwic2F2ZSgkZXZlbnQpXCJcbiAgICAgKGtleXVwLmVzY2FwZSk9XCJjbG9zZU1vZGFsKHRydWUsIGZhbHNlLCAnY2FyZHMnLCAkZXZlbnQpXCJcbiAgICAgdGFiaW5kZXg9XCIwXCJcbj5cbiAgICA8bGliLWZvcm0taGVhZGVyXG4gICAgICAgICAgICBbZGF0YV09XCJmb3JtRGF0YVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwic2hvd0Zvcm0gPyAnQ3JlYXRlIGEgU2ltcGxlIFNlcnZpY2UnIDogJ1NlcnZpY2UgQ3JlYXRpb24gU3VtbWFyeSdcIlxuICAgICAgICAgICAgW2FjdGlvbkJ1dHRvblRleHRdPVwiJ1NhdmUnXCJcbiAgICAgICAgICAgIChhY3Rpb25SZXF1ZXN0ZWQpPVwiaGVhZGVyQWN0aW9uUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgICAgWyhmb3JtVmlldyldPVwiZm9ybVZpZXdcIlxuICAgID48L2xpYi1mb3JtLWhlYWRlcj5cbiAgICA8ZGl2IGNsYXNzPVwic2ltcGxlLXNlcnZpY2UtZm9ybS1jb250YWluZXIgcHJvamVjdGFibGUtZm9ybS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtY29sdW1uIHRocmVlLWZpZnRoc1wiICpuZ0lmPVwic2hvd0Zvcm1cIj5cbiAgICAgICAgICAgIDxkaXYgIGlkPVwiSW5saW5lU2VydmljZUFyZWFcIiBjbGFzcz1cImFueWFkZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW1wbGUtc2VydmljZS1pbnB1dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lciBbdGl0bGVdPVwiJ1NlcnZpY2UgRGV0YWlscydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0LWdyb3VwIHNlcnZpY2UtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1zdWItZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPlNlcnZpY2UgTmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmFtZSB0aGlzIHNlcnZpY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbmFtZUZpZWxkSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzLm5hbWV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VydmljZUFwaURhdGEubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VydmljZU5hbWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ2YWxpZGF0ZVNlcnZpY2VOYW1lKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLXN1Yi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWZpZWxkLXRpdGxlXCI+U0VMRUNUIE9SIENSRUFURSBTRVJWSUNFIEFUVFJJQlVURVM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzKV09XCJzZXJ2aWNlQXBpRGF0YS5yb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlUm9sZUF0dHJpYnV0ZXNdPVwic2VydmljZVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQWRkIGF0dHJpYnV0ZXMgdG8gZ3JvdXAgc2VydmljZXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGliLXRhZy1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNpbXBsZS1zZXJ2aWNlLWNlbnRlci1jb250ZW50XCIgKm5nSWY9XCJzaG93Rm9ybVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBQ0NFU1NJTkcgQ09ORklHVVJBVElPTidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRTdHlsZV09XCInei1pbmRleDogOTk5OTk5OTknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCInSG93IHdpbGwgY2xpZW50IGFwcGxpY2F0aW9ucyB1c2UgdGhpcyBzZXJ2aWNlPyBTcGVjaWZ5IGEgaG9zdG5hbWUvSVAgYW5kIHBvcnQsIG9yIHVzZSB0aGUgJnF1b3Q7U0RLIE9ubHkmcXVvdDsgdG9nZ2xlIGZvciBhbiBhcHBsaWNhdGlvbiBlbWJlZGRlZCBjb25maWd1cmF0aW9uLidcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtaW5wdXQtZ3JvdXAgYWNjZXNzaW5nLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1zdWItZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5XaGF0IGlkZW50aXRpZXMgY2FuIGFjY2VzcyB0aGlzIHNlcnZpY2U/PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItdGFnLXNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzKV09XCJkaWFsUG9saWN5TmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRSb2xlQXR0cmlidXRlcyldPVwiZGlhbFBvbGljeVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVOYW1lZEF0dHJpYnV0ZXNdPVwiaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F2YWlsYWJsZVJvbGVBdHRyaWJ1dGVzXT1cImlkZW50aXR5Um9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgaWRlbnRpdHkgYXR0cmlidXRlcyB0byBncmFudCBhY2Nlc3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNFcnJvcl09XCJlcnJvcnMuZGlhbElkZW50aXRpZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzQ2hhbmdlKT1cInZhbGlkYXRlRGlhbElkZW50aXRpZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRSb2xlQXR0cmlidXRlc0NoYW5nZSk9XCJ2YWxpZGF0ZURpYWxJZGVudGl0aWVzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJnZXRJZGVudGl0eU5hbWVkQXR0cmlidXRlcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1zdWItZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5Ib3cgd2lsbCB0aGUgc2VydmljZSBiZSBhY2Nlc3NlZD88L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgYWRkcmVzc1BvcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1pdGVtLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25maWctaXRlbS1sYWJlbFwiPlNESyBPTkxZPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkay10b2dnbGUgZm9ybS1maWVsZC10b2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2l0Y2hHcmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZGtPbmx5RGlhbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBvbjogc2RrT25seURpYWwgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cIiFzZGtPbmx5RGlhbFwiIGNsYXNzPVwib24tbGFiZWxcIj5ZRVM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJzZGtPbmx5RGlhbFwiIGNsYXNzPVwib2ZmLWxhYmVsXCI+Tk88L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXRjaFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWl0ZW0tY29udGFpbmVyXCIgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiBzZGtPbmx5RGlhbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctaG9zdG5hbWUtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmZpZy1pdGVtLWxhYmVsXCI+SE9TVE5BTUUgLyBJUDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1maWVsZC1pbmZvIGluZm9pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFjY2Vzc2luZyBob3N0bmFtZXMgbXVzdCBpbmNsdWRlIGEgJy4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImVycm9ycy5pbnRlcmNlcHRBZGRyZXNzRm9ybWF0XCIgY2xhc3M9XCJlcnJvci1sYWJlbFwiPkFjY2Vzc2luZyBob3N0bmFtZXMgbXVzdCBpbmNsdWRlIGEgJy4nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJIb3dUb1wiIHR5cGU9XCJ0ZXh0XCIgbWF4bGVuZ3RoPVwiMTAwXCIgZGF0YS1pMThuPVwiRWdIb3N0XCIgKGNoYW5nZSk9XCJ2YWxpZGF0ZUludGVyY2VwdEFkZHJlc3MoKVwiIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzLmludGVyY2VwdEFkZHJlc3N9XCIgW3BsYWNlaG9sZGVyXT1cInNka09ubHlEaWFsID8gJycgOiAnZS5nLiBteXNlcnZpY2Uueml0aSdcIiBbKG5nTW9kZWwpXT1cInNka09ubHlEaWFsID8gJycgOiBpbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEuYWRkcmVzc2VzWzBdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWl0ZW0tY29udGFpbmVyXCIgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiBzZGtPbmx5RGlhbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZmlnLWl0ZW0tbGFiZWxcIj5QT1JUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiSG93VG9Qb3J0XCIgdHlwZT1cIm51bWJlclwiIG1heGxlbmd0aD1cIjEwXCIgKGNoYW5nZSk9XCJ2YWxpZGF0ZUludGVyY2VwdFBvcnQoKVwiIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzLmludGVyY2VwdFBvcnR9XCIgW3BsYWNlaG9sZGVyXT1cInNka09ubHlEaWFsID8gJycgOiA0NDNcIiAoa2V5dXApPVwiaW50ZXJjZXB0UG9ydENoYW5nZWQoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwic2RrT25seURpYWwgPyAnJyA6IGludGVyY2VwdFBvcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidIT1NUSU5HIENPTkZJR1VSQVRJT04nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwiJ3otaW5kZXg6IDk5OTk5OTk5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiJ1doZXJlIHNob3VsZCB0cmFmZmljIGZvciB0aGlzIHNlcnZpY2UgYmUgc2VudD8gU3BlY2lmeSBhIHByb3RvY29sLCBob3N0bmFtZS9JUCwgYW5kIHBvcnQsIG9yIHVzZSB0aGUgJnF1b3Q7U0RLIE9ubHkmcXVvdDsgdG9nZ2xlIGZvciBhbiBhcHBsaWNhdGlvbiBlbWJlZGRlZCBjb25maWd1cmF0aW9uLidcIlxuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dC1ncm91cCBob3N0aW5nLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1zdWItZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5XaGF0IGlkZW50aXRpZXMgY2FuIGhvc3QgdGhpcyBzZXJ2aWNlPzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZE5hbWVkQXR0cmlidXRlcyldPVwiYmluZFBvbGljeU5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXMpXT1cImJpbmRQb2xpY3lSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cImlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVSb2xlQXR0cmlidXRlc109XCJpZGVudGl0eVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IGlkZW50aXR5IGF0dHJpYnV0ZXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNFcnJvcl09XCJlcnJvcnMuYmluZElkZW50aXRpZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzQ2hhbmdlKT1cInZhbGlkYXRlQmluZElkZW50aXRpZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRSb2xlQXR0cmlidXRlc0NoYW5nZSk9XCJ2YWxpZGF0ZUJpbmRJZGVudGl0aWVzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2xpYi10YWctc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLXN1Yi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctdGl0bGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPldoZXJlIHNob3VsZCB0cmFmZmljIGJlIHNlbnQ/PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGFkZHJlc3NGdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZmlnLWl0ZW0tbGFiZWxcIj5TREsgT05MWTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGstdG9nZ2xlIGZvcm0tZmllbGQtdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dpdGNoR3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2RrT25seUJpbmQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb246IHNka09ubHlCaW5kIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCIhc2RrT25seUJpbmRcIiBjbGFzcz1cIm9uLWxhYmVsXCI+WUVTPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwic2RrT25seUJpbmRcIiBjbGFzcz1cIm9mZi1sYWJlbFwiPk5PPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2l0Y2hcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1pdGVtLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogc2RrT25seUJpbmR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmZpZy1pdGVtLWxhYmVsXCI+UFJPVE9DT0w8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiSG9zdGVkUHJvdG9jb2xcIiAoY2hhbmdlKT1cImhvc3RQcm90b2NvbHNDaGFuZ2VkKCRldmVudClcIiBbKG5nTW9kZWwpXT1cInNka09ubHlCaW5kID8gJycgOiBob3N0UHJvdG9jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidGNwXCI+VENQPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInVkcFwiID5VRFA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYm90aFwiID5UQ1AvVURQPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctaXRlbS1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6IHNka09ubHlCaW5kfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25maWctaXRlbS1sYWJlbFwiPkhPU1ROQU1FIC8gSVA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJIb3N0ZWRIb3N0XCIgdHlwZT1cInRleHRcIiBtYXhsZW5ndGg9XCIxMDBcIiBkYXRhLWkxOG49XCJFZ0hvc3RcIiAoY2hhbmdlKT1cInZhbGlkYXRlSG9zdEFkZHJlc3MoKVwiIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzLmhvc3RBZGRyZXNzfVwiIFtwbGFjZWhvbGRlcl09XCJzZGtPbmx5QmluZCA/ICcnIDogJ2UuZy4gbXlzZXJ2aWNlLnppdGknXCIgWyhuZ01vZGVsKV09XCJzZGtPbmx5QmluZCA/ICcnIDogaG9zdENvbmZpZ0FwaURhdGEuZGF0YS5hZGRyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWl0ZW0tY29udGFpbmVyXCIgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiBzZGtPbmx5QmluZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZmlnLWl0ZW0tbGFiZWxcIj5QT1JUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiSG9zdGVkUG9ydFwiIHR5cGU9XCJudW1iZXJcIiBtYXhsZW5ndGg9XCIxMFwiIChjaGFuZ2UpPVwidmFsaWRhdGVIb3N0UG9ydCgpXCIgW25nQ2xhc3NdPVwie2Vycm9yOiBlcnJvcnMuaG9zdFBvcnR9XCIgW3BsYWNlaG9sZGVyXT1cInNka09ubHlCaW5kID8gJycgOiA0NDNcIiBbKG5nTW9kZWwpXT1cInNka09ubHlCaW5kID8gJycgOiBob3N0Q29uZmlnQXBpRGF0YS5kYXRhLnBvcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
684
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNlcnZpY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Byb2plY3RhYmxlLWZvcm1zL3NlcnZpY2Uvc2ltcGxlLXNlcnZpY2Uvc2ltcGxlLXNlcnZpY2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Byb2plY3RhYmxlLWZvcm1zL3NlcnZpY2Uvc2ltcGxlLXNlcnZpY2Uvc2ltcGxlLXNlcnZpY2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBQyxnQkFBZ0IsRUFBa0IsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUMseUJBQXlCLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDdEYsT0FBTyxFQUFDLGlCQUFpQixFQUFrQixNQUFNLHdDQUF3QyxDQUFDO0FBRzFGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUU5RCxPQUFPLEVBQUMsOEJBQThCLEVBQUMsTUFBTSxvRUFBb0UsQ0FBQztBQUNsSCxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLeEUsYUFBYTtBQUNiLE1BQU0sRUFBQyxHQUFHLEVBQUMsR0FBRyxNQUFNLENBQUM7QUFFckIsTUFLYSxzQkFBdUIsU0FBUSxlQUFlO0lBNkZ6RCxZQUNxQyxlQUFnQyxFQUMxRCxHQUF1QixFQUNNLFdBQTRCLEVBQ2hFLGNBQThCLEVBQ0ssVUFBNEIsRUFDdkQsVUFBcUIsRUFDckIsaUJBQW9DLEVBQ3BDLG1CQUF3QyxFQUM3QixNQUFjLEVBQ2QsS0FBcUI7UUFFMUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQVgzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDMUQsUUFBRyxHQUFILEdBQUcsQ0FBb0I7UUFDTSxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFHeEQsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBdEduQywwQkFBcUIsR0FBVSxFQUFFLENBQUM7UUFDbEMsMkJBQXNCLEdBQVUsRUFBRSxDQUFDO1FBQ25DLDRCQUF1QixHQUFVLEVBQUUsQ0FBQztRQUU3QyxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxRQUFRLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBR3RCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUN2Qiw4QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDL0IseUJBQW9CLEdBQUcsRUFBRSxDQUFDO1FBQzFCLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQix5QkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDMUIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUN0QixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLHVCQUFrQixHQUFHO1lBQ25CLElBQUksRUFBRSxFQUFFO1lBQ1IsY0FBYyxFQUFFLEVBQUU7WUFDbEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxrQkFBa0IsRUFBRSxJQUFJO1NBQ3pCLENBQUM7UUFDRiwrQkFBMEIsR0FBRztZQUMzQixJQUFJLEVBQUUsRUFBRTtZQUNSLFlBQVksRUFBQyxXQUFXO1lBQ3hCLElBQUksRUFBRTtnQkFDSixVQUFVLEVBQUUsRUFBRTtnQkFDZCxTQUFTLEVBQUUsRUFBRTtnQkFDYixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO2FBQzFCO1NBQ0YsQ0FBQztRQUNGLDBCQUFxQixHQUFHO1lBQ3RCLElBQUksRUFBRSxFQUFFO1lBQ1IsWUFBWSxFQUFFLFdBQVc7WUFDekIsSUFBSSxFQUFFO2dCQUNKLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxTQUFTO2dCQUNmLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQzthQUMxQjtTQUNGLENBQUM7UUFDRiwwQkFBcUIsR0FBRztZQUN0QixJQUFJLEVBQUUsRUFBRTtZQUNSLElBQUksRUFBRSxNQUFNO1lBQ1osUUFBUSxFQUFFLE9BQU87WUFDakIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsYUFBYSxFQUFFLEVBQUU7U0FDbEIsQ0FBQztRQUNGLDBCQUFxQixHQUFHO1lBQ3RCLElBQUksRUFBRSxFQUFFO1lBQ1IsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsT0FBTztZQUNqQixZQUFZLEVBQUUsRUFBRTtZQUNoQixhQUFhLEVBQUUsRUFBRTtTQUNsQixDQUFDO1FBTUYsOEJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBQy9CLDZCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUM5Qiw4QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDL0IsNkJBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQzlCLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUl6QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBR2QsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQixxQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QixrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFbkIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUViLFVBQUssR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNuRCxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFlaEUsQ0FBQztJQUVRLFFBQVE7UUFDZixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixDQUFDO1FBQy9FLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQiw4QkFBOEIsQ0FBQztRQUM1RSxJQUFJLENBQUMscUJBQXFCLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLDZCQUE2QixDQUFDO1FBQ25GLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsNkJBQTZCLENBQUM7UUFDOUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixzQ0FBc0MsQ0FBQztRQUN2RixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHNDQUFzQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxNQUFPO1FBQ2hDLE1BQU0sTUFBTSxHQUFHO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxFQUFFO1lBQ3BCLEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDN0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsZUFBZSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQU07UUFDMUIsUUFBTyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1osTUFBTTtZQUNSLEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNO1lBQ1IsS0FBSyxhQUFhO2dCQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQzVCLE1BQU07U0FDVDtJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN2QyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDdkMsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQUs7UUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxtQkFBbUIsQ0FBQTtRQUNqRixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGNBQWMsQ0FBQTtRQUN2RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGNBQWMsQ0FBQTtRQUN2RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGNBQWMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsTUFBTTtRQUN6QixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDakQsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUc7WUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ3hCLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQU07UUFDekIsUUFBUSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3pCLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUM3RCxNQUFNO1lBQ1I7Z0JBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDbkUsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBUTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3BCLE9BQU87U0FDUjtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQVksQ0FDaEMsU0FBUyxFQUNULFNBQVMsRUFDVCxrQkFBa0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLFVBQVUsRUFDcEQsb0RBQW9ELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQ2pGLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0QyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbEMsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtvQkFDOUIsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7b0JBQzNDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7aUJBQ2xEO3FCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7b0JBQ3RFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO29CQUNuRCxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2lCQUN6RDtxQkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO29CQUNqRSxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztvQkFDOUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztpQkFDcEQ7cUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO29CQUMxRSxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztvQkFDOUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDOUM7cUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO29CQUMxRSxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztvQkFDOUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDOUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSTtZQUN0QyxJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMseUJBQXlCO1lBQzFDLFVBQVUsRUFBRSxFQUFFO1lBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxxQkFBcUI7WUFDbEMsTUFBTSxFQUFFLFNBQVM7WUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQzdDLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRztZQUNsQixJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUk7WUFDakMsSUFBSSxFQUFFLFNBQVM7WUFDZixPQUFPLEVBQUUsTUFBTTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQ3JDLFVBQVUsRUFBRSxFQUFFO1lBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0IsTUFBTSxFQUFFLFNBQVM7WUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3hDLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBUTtZQUN2QjtnQkFDRSxLQUFLLEVBQUUsVUFBVTtnQkFDakIsUUFBUSxFQUFFO29CQUNSO3dCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUk7d0JBQzlCLElBQUksRUFBRSxVQUFVO3dCQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7d0JBQzVCLFVBQVUsRUFBRSxJQUFJLENBQUMsaUJBQWlCO3dCQUNsQyxVQUFVLEVBQUUsRUFBRTt3QkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQzFCLE1BQU0sRUFBRSxTQUFTO3dCQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNyQztpQkFDRjthQUNGO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLGtCQUFrQjtnQkFDekIsUUFBUSxFQUFFO29CQUNSO3dCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSTt3QkFDakMsSUFBSSxFQUFFLGtCQUFrQjt3QkFDeEIsT0FBTyxFQUFFLE1BQU07d0JBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7d0JBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsb0JBQW9CO3dCQUNyQyxVQUFVLEVBQUUsRUFBRTt3QkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjt3QkFDN0IsTUFBTSxFQUFFLFNBQVM7d0JBQ2pCLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO3FCQUNuRTtvQkFDRDt3QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUk7d0JBQ2pDLElBQUksRUFBRSxrQkFBa0I7d0JBQ3hCLE9BQU8sRUFBRSxNQUFNO3dCQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCO3dCQUMvQixVQUFVLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjt3QkFDckMsVUFBVSxFQUFFLEVBQUU7d0JBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7d0JBQzdCLE1BQU0sRUFBRSxTQUFTO3dCQUNqQixLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBLENBQUMsQ0FBQztxQkFDbkU7aUJBQ0Y7YUFDRjtTQUNGLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDMUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDO2dCQUNyQixLQUFLLEVBQUUsZ0JBQWdCO2dCQUN2QixRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUM7YUFDMUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUM1QixXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUM7Z0JBQ3JCLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2FBQzdCLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDNUIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDO2dCQUNyQixLQUFLLEVBQUUsZ0JBQWdCO2dCQUN2QixRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUM7YUFDeEIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxNQUFNLElBQUksR0FBRztZQUNYLFdBQVcsRUFBRSxXQUFXO1NBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFO1lBQ3BFLElBQUksRUFBRSxJQUFJO1lBQ1YsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNoRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjtpQkFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLDRCQUE0QjthQUM3QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQUMsV0FBVztRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUM5RSxNQUFNLHFCQUFxQixHQUFRLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM1SCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFO1lBQy9CLE1BQU0sR0FBRyxPQUFPLENBQUM7U0FDbEI7YUFBTTtZQUNMLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3RyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLDRCQUE0QixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNyTSxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUNELFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVc7UUFDaEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE9BQU87U0FDUjtRQUNELElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FBUSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEgsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUMxQixNQUFNLEdBQUcsT0FBTyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pGLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLDRCQUE0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNqTCxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDekI7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUM3RDthQUFNO1lBQ0wsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUM3RDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVc7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUN2QztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUM5RCxNQUFNLGFBQWEsR0FBUSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzdHLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLENBQUM7UUFDbEIsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFO1lBQ3ZCLGFBQWEsR0FBRyxPQUFPLENBQUM7U0FDekI7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0UsYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUN2QixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxZQUFZLEdBQUcsY0FBYyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDO2FBQzdFO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hELFlBQVksR0FBRyxjQUFjLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDO2FBQ3hEO2lCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hELFlBQVksR0FBRyxjQUFjLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDO2FBQ3hEO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLDZCQUE2QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQTtZQUNqRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUI7UUFDRCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7SUFDL0QsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxNQUFNO1FBQzNDLElBQUksYUFBYSxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUM7UUFDbkQsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRTtnQkFDMUIsT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztZQUNwRSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3ZDLGNBQWMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDL0MsZUFBZSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztTQUNsRDthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDcEM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBQ3BFLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDdkMsY0FBYyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztZQUMvQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1NBQ2xEO1FBRUQsYUFBYSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixhQUFhLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6RCxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDdkQsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLGFBQWEsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDNUYsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUM3QixPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNKLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN2RyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQzFCLE1BQU0sR0FBRyxPQUFPLENBQUM7U0FDbEI7YUFBTTtZQUNMLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDakI7UUFDRCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQUcsb0NBQW9DLGFBQWEsQ0FBQyxJQUFJLEtBQUssSUFBSSx1Q0FBdUMsSUFBSSxDQUFDLFNBQVMsdUJBQXVCLFFBQVEsR0FBRyxDQUFDO1FBQzFLLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNuQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDO1lBQ3ZDLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRTtnQkFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3pCO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBQzdCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO2FBQU07WUFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUM3QyxPQUFPO1NBQ1I7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pILElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1NBQ3JDO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3RHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1NBQzNDO2FBQU07WUFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUNsQzthQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO2FBQU07WUFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ2hDO2FBQU07WUFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDL0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDN0I7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUM3QjthQUFNO1lBQ0wsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFO1lBQ2xGLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUNuQzthQUFNO1lBQ0wsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUU7WUFDbEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQ25DO2FBQU07WUFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixPQUFPLFNBQVMsSUFBSSxDQUFDLGdCQUFnQjs7O3dCQUdqQixJQUFJLENBQUMsYUFBYTtvQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQTtJQUMzRCxDQUFDO0lBRUQsNEJBQTRCO1FBQzFCLE9BQU8sU0FBUyxJQUFJLENBQUMsZ0JBQWdCOzs7d0JBR2pCLElBQUksQ0FBQyxhQUFhO29CQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUE7SUFDbkUsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixPQUFPLFNBQVMsSUFBSSxDQUFDLGdCQUFnQjs7O3dCQUdqQixJQUFJLENBQUMsYUFBYTtvQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFBO0lBQzlELENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLFNBQVMsSUFBSSxDQUFDLGdCQUFnQjs7O3dCQUdqQixJQUFJLENBQUMsYUFBYTtvQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO0lBQy9ELENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLFNBQVMsSUFBSSxDQUFDLGdCQUFnQjs7O3dCQUdqQixJQUFJLENBQUMsYUFBYTtvQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO0lBQy9ELENBQUM7SUFFUSxlQUFlO1FBQ3RCLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRixNQUFNLG1CQUFtQixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdHLE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlGLE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwRixNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLEtBQUssSUFBSSxDQUFDLGlCQUFpQixJQUFJLG1CQUFtQixLQUFLLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxjQUFjLEtBQUssSUFBSSxDQUFDLGNBQWM7WUFDekosY0FBYyxLQUFLLElBQUksQ0FBQyxjQUFjLElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDckYsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7WUFDM0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1lBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsSUFBSSxtQkFBbUIsSUFBSSxjQUFjLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQztRQUNsSCxHQUFHLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSztJQUNMLENBQUM7K0dBbnBCVSxzQkFBc0Isa0JBOEZyQixnQkFBZ0IsK0NBRWhCLGlCQUFpQiwyQ0FFakIseUJBQXlCO21HQWxHMUIsc0JBQXNCLHNTQ3ZCbkMsMDlaQTJMTTs7U0RwS08sc0JBQXNCOzRGQUF0QixzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9COzswQkFrR3pCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFFdkIsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUV4QixNQUFNOzJCQUFDLHlCQUF5Qjt3TEFqRzVCLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQXVGSSxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1Byb2plY3RhYmxlRm9ybX0gZnJvbSBcIi4uLy4uL3Byb2plY3RhYmxlLWZvcm0uY2xhc3NcIjtcbmltcG9ydCB7U0VUVElOR1NfU0VSVklDRSwgU2V0dGluZ3NTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc2V0dGluZ3Muc2VydmljZVwiO1xuaW1wb3J0IHtTRVJWSUNFX0VYVEVOU0lPTl9TRVJWSUNFLCBTZXJ2aWNlRm9ybVNlcnZpY2V9IGZyb20gXCIuLi9zZXJ2aWNlLWZvcm0uc2VydmljZVwiO1xuaW1wb3J0IHtaSVRJX0RBVEFfU0VSVklDRSwgWml0aURhdGFTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMveml0aS1kYXRhLnNlcnZpY2VcIjtcbmltcG9ydCB7R3Jvd2xlclNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9tZXNzYWdpbmcvZ3Jvd2xlci5zZXJ2aWNlXCI7XG5pbXBvcnQge0V4dGVuc2lvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9leHRlbmRhYmxlL2V4dGVuc2lvbnMtbm9vcC5zZXJ2aWNlXCI7XG5pbXBvcnQge0dyb3dsZXJNb2RlbH0gZnJvbSBcIi4uLy4uLy4uL21lc3NhZ2luZy9ncm93bGVyLm1vZGVsXCI7XG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xuaW1wb3J0IHtDcmVhdGlvblN1bW1hcnlEaWFsb2dDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi9jcmVhdGlvbi1zdW1tYXJ5LWRpYWxvZy9jcmVhdGlvbi1zdW1tYXJ5LWRpYWxvZy5jb21wb25lbnRcIjtcbmltcG9ydCB7aXNFbXB0eSwgaXNOaWwsIGlzTmFOLCB1bnNldCwgY2xvbmVEZWVwLCBpc0VxdWFsfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtWYWxpZGF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7U2VydmljZXNQYWdlU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uLy4uL3BhZ2VzL3NlcnZpY2VzL3NlcnZpY2VzLXBhZ2Uuc2VydmljZVwiO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHthcHB9ID0gd2luZG93O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItc2ltcGxlLXNlcnZpY2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2ltcGxlLXNlcnZpY2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zaW1wbGUtc2VydmljZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNpbXBsZVNlcnZpY2VDb21wb25lbnQgZXh0ZW5kcyBQcm9qZWN0YWJsZUZvcm0ge1xuICBASW5wdXQoKSBzZXJ2aWNlUm9sZUF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGlkZW50aXR5Um9sZUF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzOiBhbnlbXSA9IFtdO1xuXG4gIHNob3dGb3JtID0gdHJ1ZTtcbiAgZm9ybVZpZXcgPSAnc2ltcGxlJztcbiAgY29udHJvbGxlckRvbWFpbiA9ICcnO1xuICB6aXRpU2Vzc2lvbklkO1xuICBpbnRlcmNlcHRQb3J0O1xuICBob3N0UHJvdG9jb2wgPSAndGNwJztcbiAgc2VydmljZUNsaUNvbW1hbmQgPSAnJztcbiAgaW50ZXJjZXB0Q29uZmlnQ2xpQ29tbWFuZCA9ICcnO1xuICBob3N0Q29uZmlnQ2xpQ29tbWFuZCA9ICcnO1xuICBkaWFsUG9saWN5Q2xpQ29tbWFuZCA9ICcnO1xuICBiaW5kUG9saWN5Q2xpQ29tbWFuZCA9ICcnO1xuICBzZXJ2aWNlQXBpVXJsID0gJyc7XG4gIGludGVyY2VwdENvbmZpZ0FwaVVybCA9ICcnO1xuICBob3N0Q29uZmlnQXBpVXJsID0gJyc7XG4gIGRpYWxQb2xpY3lBcGlVcmwgPSAnJztcbiAgYmluZFBvbGljeUFwaVVybCA9ICcnO1xuICBpbml0U2VydmljZUFwaURhdGEgPSB7XG4gICAgbmFtZTogXCJcIixcbiAgICByb2xlQXR0cmlidXRlczogW10sXG4gICAgY29uZmlnczogW10sXG4gICAgZW5jcnlwdGlvblJlcXVpcmVkOiB0cnVlXG4gIH07XG4gIGluaXRJbnRlcmNlcHRDb25maWdBcGlEYXRhID0ge1xuICAgIG5hbWU6IFwiXCIsXG4gICAgY29uZmlnVHlwZUlkOlwiZzdjSVdiY0dnXCIsXG4gICAgZGF0YToge1xuICAgICAgcG9ydFJhbmdlczogW10sXG4gICAgICBhZGRyZXNzZXM6IFtdLFxuICAgICAgcHJvdG9jb2xzOiBbJ3RjcCcsICd1ZHAnXVxuICAgIH1cbiAgfTtcbiAgaW5pdEhvc3RDb25maWdBcGlEYXRhID0ge1xuICAgIG5hbWU6ICcnLFxuICAgIGNvbmZpZ1R5cGVJZDogXCJOSDVwNEZwR1JcIixcbiAgICBkYXRhOiB7XG4gICAgICBhZGRyZXNzOiBcIlwiLFxuICAgICAgcG9ydDogdW5kZWZpbmVkLFxuICAgICAgZm9yd2FyZFByb3RvY29sOiB0cnVlLFxuICAgICAgYWxsb3dlZFByb3RvY29sczogWyd0Y3AnXVxuICAgIH1cbiAgfTtcbiAgaW5pdERpYWxQb2xpY3lBcGlEYXRhID0ge1xuICAgIG5hbWU6IFwiXCIsXG4gICAgdHlwZTogXCJEaWFsXCIsXG4gICAgc2VtYW50aWM6IFwiQW55T2ZcIixcbiAgICBzZXJ2aWNlUm9sZXM6IFtdLFxuICAgIGlkZW50aXR5Um9sZXM6IFtdXG4gIH07XG4gIGluaXRCaW5kUG9saWN5QXBpRGF0YSA9IHtcbiAgICBuYW1lOiBcIlwiLFxuICAgIHR5cGU6IFwiQmluZFwiLFxuICAgIHNlbWFudGljOiBcIkFueU9mXCIsXG4gICAgc2VydmljZVJvbGVzOiBbXSxcbiAgICBpZGVudGl0eVJvbGVzOiBbXVxuICB9O1xuICBzZXJ2aWNlQXBpRGF0YTtcbiAgaW50ZXJjZXB0Q29uZmlnQXBpRGF0YTtcbiAgaG9zdENvbmZpZ0FwaURhdGE7XG4gIGRpYWxQb2xpY3lBcGlEYXRhO1xuICBiaW5kUG9saWN5QXBpRGF0YTtcbiAgZGlhbFBvbGljeU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICBkaWFsUG9saWN5Um9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgYmluZFBvbGljeU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICBiaW5kUG9saWN5Um9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgaWRlbnRpdGllc05hbWVJZE1hcCA9IHt9O1xuICBpbnRlcmNlcHRDb25maWdJZDtcbiAgaG9zdENvbmZpZ0lkO1xuICBzZXJ2aWNlSWQ7XG4gIHNka09ubHlEaWFsID0gZmFsc2U7XG4gIHNka09ubHlCaW5kID0gZmFsc2U7XG4gIGZvcm1EYXRhID0ge307XG4gIGRpYWxvZ1JlZjogYW55O1xuXG4gIGludGVyY2VwdEluY3JlbWVudCA9IC0xO1xuICBob3N0SW5jcmVtZW50ID0gLTE7XG4gIHNlcnZpY2VJbmNyZW1lbnQgPSAtMTtcbiAgZGlhbEluY3JlbWVudCA9IC0xO1xuICBiaW5kSW5jcmVtZW50ID0gLTE7XG5cbiAgc2VydmljZURhdGFDaGFuZ2UgPSBmYWxzZTtcbiAgaW50ZXJjZXB0RGF0YUNoYW5nZSA9IGZhbHNlO1xuICBob3N0RGF0YUNoYW5nZSA9IGZhbHNlO1xuICBkaWFsRGF0YUNoYW5nZSA9IGZhbHNlO1xuICBiaW5kRGF0YUNoYW5nZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBjbG9zZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgQEluamVjdChTRVRUSU5HU19TRVJWSUNFKSBwdWJsaWMgc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsXG4gICAgICBwdWJsaWMgc3ZjOiBTZXJ2aWNlRm9ybVNlcnZpY2UsXG4gICAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBvdmVycmlkZSB6aXRpU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgZ3Jvd2xlclNlcnZpY2U6IEdyb3dsZXJTZXJ2aWNlLFxuICAgICAgQEluamVjdChTRVJWSUNFX0VYVEVOU0lPTl9TRVJWSUNFKSBleHRTZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSBkaWFsb2dGb3JtOiBNYXREaWFsb2csXG4gICAgICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgIHByaXZhdGUgc2VydmljZXNQYWdlU2VydmljZTogU2VydmljZXNQYWdlU2VydmljZSxcbiAgICAgIHByb3RlY3RlZCBvdmVycmlkZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgIHByb3RlY3RlZCBvdmVycmlkZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICkge1xuICAgIHN1cGVyKGdyb3dsZXJTZXJ2aWNlLCBleHRTZXJ2aWNlLCB6aXRpU2VydmljZSwgcm91dGVyLCByb3V0ZSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuY29udHJvbGxlckRvbWFpbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlPy5zZXR0aW5ncz8uc2VsZWN0ZWRFZGdlQ29udHJvbGxlcjtcbiAgICB0aGlzLnppdGlTZXNzaW9uSWQgPSB0aGlzLnNldHRpbmdzU2VydmljZT8uc2V0dGluZ3M/LnNlc3Npb24/LmlkO1xuICAgIHRoaXMuaW5pdEZvcm1EYXRhKCk7XG4gICAgdGhpcy5nZXRJZGVudGl0eU5hbWVkQXR0cmlidXRlcygpO1xuICB9XG5cbiAgaW5pdEZvcm1EYXRhKCkge1xuICAgIHRoaXMuc2VydmljZUFwaVVybCA9IGAke3RoaXMuY29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL3NlcnZpY2VzYDtcbiAgICB0aGlzLmludGVyY2VwdENvbmZpZ0FwaVVybCA9IGAke3RoaXMuY29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL2NvbmZpZ3NgO1xuICAgIHRoaXMuaG9zdENvbmZpZ0FwaVVybCA9IGAke3RoaXMuY29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL2NvbmZpZ3NgO1xuICAgIHRoaXMuZGlhbFBvbGljeUFwaVVybCA9IGAke3RoaXMuY29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL3NlcnZpY2UtcG9saWNpZXNgO1xuICAgIHRoaXMuYmluZFBvbGljeUFwaVVybCA9IGAke3RoaXMuY29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL3NlcnZpY2UtcG9saWNpZXNgO1xuICAgIHRoaXMuc2VydmljZUNsaUNvbW1hbmQgPSAnJztcbiAgICB0aGlzLmludGVyY2VwdENvbmZpZ0NsaUNvbW1hbmQgPSAnJztcbiAgICB0aGlzLmhvc3RDb25maWdDbGlDb21tYW5kID0gJyc7XG4gICAgdGhpcy5kaWFsUG9saWN5Q2xpQ29tbWFuZCA9ICcnO1xuICAgIHRoaXMuYmluZFBvbGljeUNsaUNvbW1hbmQgPSAnJztcbiAgICB0aGlzLmludGVyY2VwdENvbmZpZ0lkID0gJyc7XG4gICAgdGhpcy5ob3N0Q29uZmlnSWQgPSAnJztcbiAgICB0aGlzLnNlcnZpY2VJZCA9ICcnO1xuICAgIHRoaXMuc2RrT25seURpYWwgPSBmYWxzZTtcbiAgICB0aGlzLnNka09ubHlCaW5kID0gZmFsc2U7XG4gICAgdGhpcy5pbnRlcmNlcHRQb3J0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGlhbFBvbGljeU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuZGlhbFBvbGljeVJvbGVBdHRyaWJ1dGVzID0gW107XG4gICAgdGhpcy5iaW5kUG9saWN5TmFtZWRBdHRyaWJ1dGVzID0gW107XG4gICAgdGhpcy5iaW5kUG9saWN5Um9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICB0aGlzLnNlcnZpY2VBcGlEYXRhID0gY2xvbmVEZWVwKHRoaXMuaW5pdFNlcnZpY2VBcGlEYXRhKTtcbiAgICB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEgPSBjbG9uZURlZXAodGhpcy5pbml0SW50ZXJjZXB0Q29uZmlnQXBpRGF0YSk7XG4gICAgdGhpcy5ob3N0Q29uZmlnQXBpRGF0YSA9IGNsb25lRGVlcCh0aGlzLmluaXRIb3N0Q29uZmlnQXBpRGF0YSk7XG4gICAgdGhpcy5kaWFsUG9saWN5QXBpRGF0YSA9IGNsb25lRGVlcCh0aGlzLmluaXREaWFsUG9saWN5QXBpRGF0YSk7XG4gICAgdGhpcy5iaW5kUG9saWN5QXBpRGF0YSA9IGNsb25lRGVlcCh0aGlzLmluaXRCaW5kUG9saWN5QXBpRGF0YSk7XG4gICAgdGhpcy5zZXJ2aWNlc1BhZ2VTZXJ2aWNlLmdldFNlcnZpY2VSb2xlQXR0cmlidXRlcygpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5zZXJ2aWNlUm9sZUF0dHJpYnV0ZXMgPSByZXN1bHQuZGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzKGZpbHRlcj8pIHtcbiAgICBjb25zdCBwYWdpbmcgPSB7XG4gICAgICBzZWFyY2hPbjogJ25hbWUnLFxuICAgICAgZmlsdGVyOiBmaWx0ZXIgfHwgJycsXG4gICAgICB0b3RhbDogMzAsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc29ydDogJ25hbWUnLFxuICAgICAgb3JkZXI6ICdhc2MnXG4gICAgfTtcbiAgICB0aGlzLnppdGlTZXJ2aWNlLmdldCgnaWRlbnRpdGllcycsIHBhZ2luZywgW10pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgbmFtZWRBdHRyaWJ1dGVzID0gcmVzdWx0LmRhdGEubWFwKChpZGVudGl0eSkgPT4ge1xuICAgICAgICB0aGlzLmlkZW50aXRpZXNOYW1lSWRNYXBbaWRlbnRpdHkubmFtZV0gPSBpZGVudGl0eS5pZDtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5Lm5hbWU7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMgPSBuYW1lZEF0dHJpYnV0ZXM7XG4gICAgfSk7XG4gIH1cblxuICBoZWFkZXJBY3Rpb25SZXF1ZXN0ZWQoYWN0aW9uKSB7XG4gICAgc3dpdGNoKGFjdGlvbi5uYW1lKSB7XG4gICAgICBjYXNlICdzYXZlJzpcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICB0aGlzLnJvdXRlcj8ubmF2aWdhdGVCeVVybChgL3NlcnZpY2VzL3NlbGVjdGApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvZ2dsZS12aWV3JzpcbiAgICAgICAgdGhpcy5mb3JtVmlldyA9IGFjdGlvbi5kYXRhO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTZGtPbmx5RGlhbCgpIHtcbiAgICB0aGlzLnNka09ubHlEaWFsID0gIXRoaXMuc2RrT25seURpYWw7XG4gIH1cblxuICB0b2dnbGVTZGtPbmx5QmluZCgpIHtcbiAgICB0aGlzLnNka09ubHlCaW5kID0gIXRoaXMuc2RrT25seUJpbmQ7XG4gIH1cblxuICBzZXJ2aWNlTmFtZUNoYW5nZWQoZXZlbnQpIHtcbiAgICB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEubmFtZSA9IGAke3RoaXMuc2VydmljZUFwaURhdGEubmFtZX0taW50ZXJjZXB0LWNvbmZpZ2BcbiAgICB0aGlzLmhvc3RDb25maWdBcGlEYXRhLm5hbWUgPSBgJHt0aGlzLnNlcnZpY2VBcGlEYXRhLm5hbWV9LWhvc3QtY29uZmlnYFxuICAgIHRoaXMuZGlhbFBvbGljeUFwaURhdGEubmFtZSA9IGAke3RoaXMuc2VydmljZUFwaURhdGEubmFtZX0tZGlhbC1wb2xpY3lgXG4gICAgdGhpcy5iaW5kUG9saWN5QXBpRGF0YS5uYW1lID0gYCR7dGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lfS1iaW5kLXBvbGljeWBcbiAgfVxuXG4gIGludGVyY2VwdFBvcnRDaGFuZ2VkKCRldmVudCkge1xuICAgIGlmIChpc05pbCh0aGlzLmludGVyY2VwdFBvcnQpIHx8IGlzTmFOKHRoaXMuaW50ZXJjZXB0UG9ydCkpIHtcbiAgICAgIHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5kYXRhLnBvcnRSYW5nZXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEucG9ydFJhbmdlc1swXSA9IHtcbiAgICAgIGhpZ2g6IHRoaXMuaW50ZXJjZXB0UG9ydCxcbiAgICAgIGxvdzogdGhpcy5pbnRlcmNlcHRQb3J0XG4gICAgfTtcbiAgfVxuXG4gIGhvc3RQcm90b2NvbHNDaGFuZ2VkKCRldmVudCkge1xuICAgIHN3aXRjaCAodGhpcy5ob3N0UHJvdG9jb2wpIHtcbiAgICAgIGNhc2UgJ2JvdGgnOlxuICAgICAgICB0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEuYWxsb3dlZFByb3RvY29scyA9IFsndGNwJywgJ3VkcCddXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5kYXRhLmFsbG93ZWRQcm90b2NvbHMgPSBbdGhpcy5ob3N0UHJvdG9jb2xdO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKHJlZnJlc2g/KSB7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3VtbWFyeURhdGEgPSB0aGlzLnNob3dTdW1tYXJ5KCk7XG4gICAgdGhpcy5zZXJ2aWNlQXBpRGF0YS5jb25maWdzID0gW107XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVJbnRlcmNlcHRDb25maWcoc3VtbWFyeURhdGEpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlSG9zdENvbmZpZyhzdW1tYXJ5RGF0YSk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVTZXJ2aWNlKHN1bW1hcnlEYXRhKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVBvbGljeShzdW1tYXJ5RGF0YSwgJ0RpYWwnKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVBvbGljeShzdW1tYXJ5RGF0YSwgJ0JpbmQnKTtcblxuICAgIGNvbnN0IGdyb3dsZXJEYXRhID0gbmV3IEdyb3dsZXJNb2RlbChcbiAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAnU3VjY2VzcycsXG4gICAgICAgIGBTaW1wbGUgU2VydmljZSAke3RoaXMuc2VydmljZUFwaURhdGEubmFtZX0gQ3JlYXRlZGAsXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgY3JlYXRlZCBlbnRpdGllcyBmb3Igc2ltcGxlIHNlcnZpY2UgJHt0aGlzLnNlcnZpY2VBcGlEYXRhLm5hbWV9YCxcbiAgICApO1xuICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG5cbiAgICBzdW1tYXJ5RGF0YT8uZm9yRWFjaCgoZW50aXR5VHlwZSkgPT4ge1xuICAgICAgZW50aXR5VHlwZS5lbnRpdGllcz8uZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICAgIGlmIChlbnRpdHkudHlwZSA9PT0gJ3NlcnZpY2VzJykge1xuICAgICAgICAgIGVudGl0eS5jbGlDb21tYW5kID0gdGhpcy5zZXJ2aWNlQ2xpQ29tbWFuZDtcbiAgICAgICAgICBlbnRpdHkuYXBpUmVxdWVzdCA9IHRoaXMuZ2V0U2VydmljZXNBcGlSZXF1ZXN0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW50aXR5LnR5cGUgPT09ICdjb25maWdzJyAmJiBlbnRpdHkuc3VidHlwZSA9PT0gJ2ludGVyY2VwdCcpIHtcbiAgICAgICAgICBlbnRpdHkuY2xpQ29tbWFuZCA9IHRoaXMuaW50ZXJjZXB0Q29uZmlnQ2xpQ29tbWFuZDtcbiAgICAgICAgICBlbnRpdHkuYXBpUmVxdWVzdCA9IHRoaXMuZ2V0SW50ZXJjZXB0Q29uZmlnQXBpUmVxdWVzdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudGl0eS50eXBlID09PSAnY29uZmlncycgJiYgZW50aXR5LnN1YnR5cGUgPT09ICdob3N0Jykge1xuICAgICAgICAgIGVudGl0eS5jbGlDb21tYW5kID0gdGhpcy5ob3N0Q29uZmlnQ2xpQ29tbWFuZDtcbiAgICAgICAgICBlbnRpdHkuYXBpUmVxdWVzdCA9IHRoaXMuZ2V0SG9zdENvbmZpZ0FwaVJlcXVlc3QoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRpdHkudHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnICYmIGVudGl0eS5zdWJ0eXBlID09PSAnZGlhbCcpIHtcbiAgICAgICAgICBlbnRpdHkuY2xpQ29tbWFuZCA9IHRoaXMuZGlhbFBvbGljeUNsaUNvbW1hbmQ7XG4gICAgICAgICAgZW50aXR5LmFwaVJlcXVlc3QgPSB0aGlzLmdldERpYWxBcGlSZXF1ZXN0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW50aXR5LnR5cGUgPT09ICdzZXJ2aWNlLXBvbGljaWVzJyAmJiBlbnRpdHkuc3VidHlwZSA9PT0gJ2JpbmQnKSB7XG4gICAgICAgICAgZW50aXR5LmNsaUNvbW1hbmQgPSB0aGlzLmJpbmRQb2xpY3lDbGlDb21tYW5kO1xuICAgICAgICAgIGVudGl0eS5hcGlSZXF1ZXN0ID0gdGhpcy5nZXRCaW5kQXBpUmVxdWVzdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNob3dTdW1tYXJ5KCkge1xuICAgIGNvbnN0IGludGVyY2VwdFN1bW1hcnkgPSB7XG4gICAgICBuYW1lOiB0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEubmFtZSxcbiAgICAgIHR5cGU6ICdjb25maWdzJyxcbiAgICAgIHN1YnR5cGU6ICdpbnRlcmNlcHQnLFxuICAgICAgYXBpRGF0YTogdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLFxuICAgICAgY2xpQ29tbWFuZDogdGhpcy5pbnRlcmNlcHRDb25maWdDbGlDb21tYW5kLFxuICAgICAgYXBpUmVxdWVzdDogJycsXG4gICAgICBhcGlVcmw6IHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpVXJsLFxuICAgICAgc3RhdHVzOiAnbG9hZGluZycsXG4gICAgICByZXRyeTogdGhpcy5jcmVhdGVJbnRlcmNlcHRDb25maWcuYmluZCh0aGlzKSxcbiAgICB9O1xuICAgIGNvbnN0IGhvc3RTdW1tYXJ5ID0ge1xuICAgICAgbmFtZTogdGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5uYW1lLFxuICAgICAgdHlwZTogJ2NvbmZpZ3MnLFxuICAgICAgc3VidHlwZTogJ2hvc3QnLFxuICAgICAgYXBpRGF0YTogdGhpcy5ob3N0Q29uZmlnQXBpRGF0YSxcbiAgICAgIGNsaUNvbW1hbmQ6IHRoaXMuaG9zdENvbmZpZ0NsaUNvbW1hbmQsXG4gICAgICBhcGlSZXF1ZXN0OiAnJyxcbiAgICAgIGFwaVVybDogdGhpcy5ob3N0Q29uZmlnQXBpVXJsLFxuICAgICAgc3RhdHVzOiAnbG9hZGluZycsXG4gICAgICByZXRyeTogdGhpcy5jcmVhdGVIb3N0Q29uZmlnLmJpbmQodGhpcylcbiAgICB9O1xuICAgIGNvbnN0IHN1bW1hcnlEYXRhOiBhbnkgPSBbXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiAnU2VydmljZXMnLFxuICAgICAgICBlbnRpdGllczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuc2VydmljZUFwaURhdGEubmFtZSxcbiAgICAgICAgICAgIHR5cGU6ICdzZXJ2aWNlcycsXG4gICAgICAgICAgICBhcGlEYXRhOiB0aGlzLnNlcnZpY2VBcGlEYXRhLFxuICAgICAgICAgICAgY2xpQ29tbWFuZDogdGhpcy5zZXJ2aWNlQ2xpQ29tbWFuZCxcbiAgICAgICAgICAgIGFwaVJlcXVlc3Q6ICcnLFxuICAgICAgICAgICAgYXBpVXJsOiB0aGlzLnNlcnZpY2VBcGlVcmwsXG4gICAgICAgICAgICBzdGF0dXM6ICdsb2FkaW5nJyxcbiAgICAgICAgICAgIHJldHJ5OiB0aGlzLmNyZWF0ZVNlcnZpY2UuYmluZCh0aGlzKVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6ICdTZXJ2aWNlIFBvbGljaWVzJyxcbiAgICAgICAgZW50aXRpZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLmRpYWxQb2xpY3lBcGlEYXRhLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiAnc2VydmljZS1wb2xpY2llcycsXG4gICAgICAgICAgICBzdWJ0eXBlOiAnZGlhbCcsXG4gICAgICAgICAgICBhcGlEYXRhOiB0aGlzLmRpYWxQb2xpY3lBcGlEYXRhLFxuICAgICAgICAgICAgY2xpQ29tbWFuZDogdGhpcy5kaWFsUG9saWN5Q2xpQ29tbWFuZCxcbiAgICAgICAgICAgIGFwaVJlcXVlc3Q6ICcnLFxuICAgICAgICAgICAgYXBpVXJsOiB0aGlzLmRpYWxQb2xpY3lBcGlVcmwsXG4gICAgICAgICAgICBzdGF0dXM6ICdsb2FkaW5nJyxcbiAgICAgICAgICAgIHJldHJ5OiAoc3VtbWFyeURhdGEpID0+IHsgdGhpcy5jcmVhdGVQb2xpY3koc3VtbWFyeURhdGEsICdEaWFsJykgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5iaW5kUG9saWN5QXBpRGF0YS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogJ3NlcnZpY2UtcG9saWNpZXMnLFxuICAgICAgICAgICAgc3VidHlwZTogJ2JpbmQnLFxuICAgICAgICAgICAgYXBpRGF0YTogdGhpcy5iaW5kUG9saWN5QXBpRGF0YSxcbiAgICAgICAgICAgIGNsaUNvbW1hbmQ6IHRoaXMuYmluZFBvbGljeUNsaUNvbW1hbmQsXG4gICAgICAgICAgICBhcGlSZXF1ZXN0OiAnJyxcbiAgICAgICAgICAgIGFwaVVybDogdGhpcy5iaW5kUG9saWN5QXBpVXJsLFxuICAgICAgICAgICAgc3RhdHVzOiAnbG9hZGluZycsXG4gICAgICAgICAgICByZXRyeTogKHN1bW1hcnlEYXRhKSA9PiB7IHRoaXMuY3JlYXRlUG9saWN5KHN1bW1hcnlEYXRhLCAnQmluZCcpIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdO1xuICAgIGlmICghdGhpcy5zZGtPbmx5RGlhbCAmJiAhdGhpcy5zZGtPbmx5QmluZCkge1xuICAgICAgc3VtbWFyeURhdGEuc3BsaWNlKDAsMCx7XG4gICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdGlvbnMnLFxuICAgICAgICBlbnRpdGllczogW2ludGVyY2VwdFN1bW1hcnksIGhvc3RTdW1tYXJ5XVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5zZGtPbmx5RGlhbCkge1xuICAgICAgc3VtbWFyeURhdGEuc3BsaWNlKDAsMCx7XG4gICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdGlvbnMnLFxuICAgICAgICBlbnRpdGllczogW2ludGVyY2VwdFN1bW1hcnldXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnNka09ubHlCaW5kKSB7XG4gICAgICBzdW1tYXJ5RGF0YS5zcGxpY2UoMCwwLHtcbiAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9ucycsXG4gICAgICAgIGVudGl0aWVzOiBbaG9zdFN1bW1hcnldXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHN1bW1hcnlEYXRhOiBzdW1tYXJ5RGF0YVxuICAgIH07XG4gICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ0Zvcm0ub3BlbihDcmVhdGlvblN1bW1hcnlEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICduZXcnKSB7XG4gICAgICAgIHRoaXMuaW5pdEZvcm1EYXRhKCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgLy8vIERvIG5vdGhpbmcsIHN0YXkgb24gcGFnZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsKHRydWUsIHRydWUsICcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3VtbWFyeURhdGE7XG4gIH1cblxuICBhc3luYyBjcmVhdGVJbnRlcmNlcHRDb25maWcoc3VtbWFyeURhdGEpIHtcbiAgICBpZiAodGhpcy5zZGtPbmx5RGlhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhdHVzO1xuICAgIHRoaXMuaW50ZXJjZXB0SW5jcmVtZW50Kys7XG4gICAgbGV0IHBvc3RGaXggPSAnJztcbiAgICBpZiAodGhpcy5pbnRlcmNlcHRJbmNyZW1lbnQgPiAwKSB7XG4gICAgICBwb3N0Rml4ID0gJ18nICsgdGhpcy5pbnRlcmNlcHRJbmNyZW1lbnQ7XG4gICAgfVxuICAgIHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5uYW1lID0gdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLm5hbWUgKyBwb3N0Rml4O1xuICAgIGNvbnN0IGludGVyY2VwdENvbmZpZ1Jlc3VsdDogYW55ID0gYXdhaXQgdGhpcy56aXRpU2VydmljZS5wb3N0KCdjb25maWdzJywgdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLCB0cnVlKS5jYXRjaCgocmVzdWx0KSA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIGlmIChpbnRlcmNlcHRDb25maWdSZXN1bHQuZXJyb3IpIHtcbiAgICAgIHN0YXR1cyA9ICdlcnJvcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW50ZXJjZXB0Q29uZmlnSWQgPSBpbnRlcmNlcHRDb25maWdSZXN1bHQuaWQgPyBpbnRlcmNlcHRDb25maWdSZXN1bHQuaWQgOiBpbnRlcmNlcHRDb25maWdSZXN1bHQuZGF0YS5pZDtcbiAgICAgIHRoaXMuc2VydmljZUFwaURhdGEuY29uZmlncy5wdXNoKHRoaXMuaW50ZXJjZXB0Q29uZmlnSWQpO1xuICAgICAgdGhpcy5pbnRlcmNlcHRDb25maWdDbGlDb21tYW5kID0gYHppdGkgZWRnZSBjcmVhdGUgY29uZmlnICcke3RoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5uYW1lfScgJyR7dGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmNvbmZpZ1R5cGVJZH0nICcke0pTT04uc3RyaW5naWZ5KHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5kYXRhKX0nYDtcbiAgICAgIHN0YXR1cyA9ICdkb25lJztcbiAgICAgIHRoaXMuaW50ZXJjZXB0SW5jcmVtZW50ID0gLTE7XG4gICAgfVxuICAgIHN1bW1hcnlEYXRhWzBdLmVudGl0aWVzWzBdLnN0YXR1cyA9IHN0YXR1cztcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUhvc3RDb25maWcoc3VtbWFyeURhdGEpIHtcbiAgICBpZiAodGhpcy5zZGtPbmx5QmluZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhdHVzO1xuICAgIHRoaXMuaG9zdEluY3JlbWVudCsrO1xuICAgIGxldCBwb3N0Rml4ID0gJyc7XG4gICAgaWYgKHRoaXMuaG9zdEluY3JlbWVudCA+IDApIHtcbiAgICAgIHBvc3RGaXggPSAnXycgKyB0aGlzLmhvc3RJbmNyZW1lbnQ7XG4gICAgfVxuICAgIHRoaXMuaG9zdENvbmZpZ0FwaURhdGEubmFtZSA9IHRoaXMuaG9zdENvbmZpZ0FwaURhdGEubmFtZSArIHBvc3RGaXg7XG4gICAgY29uc3QgaG9zdENvbmZpZ1Jlc3VsdDogYW55ID0gYXdhaXQgdGhpcy56aXRpU2VydmljZS5wb3N0KCdjb25maWdzJywgdGhpcy5ob3N0Q29uZmlnQXBpRGF0YSwgdHJ1ZSkuY2F0Y2goKHJlc3VsdCkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICBpZiAoaG9zdENvbmZpZ1Jlc3VsdC5lcnJvcikge1xuICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ob3N0Q29uZmlnSWQgPSBob3N0Q29uZmlnUmVzdWx0LmlkID8gaG9zdENvbmZpZ1Jlc3VsdC5pZCA6IGhvc3RDb25maWdSZXN1bHQuZGF0YS5pZDtcbiAgICAgIHRoaXMuc2VydmljZUFwaURhdGEuY29uZmlncy5wdXNoKHRoaXMuaG9zdENvbmZpZ0lkKTtcbiAgICAgIHRoaXMuaG9zdENvbmZpZ0NsaUNvbW1hbmQgPSBgeml0aSBlZGdlIGNyZWF0ZSBjb25maWcgJyR7dGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5uYW1lfScgJyR7dGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5jb25maWdUeXBlSWR9JyAnJHtKU09OLnN0cmluZ2lmeSh0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEpfSdgO1xuICAgICAgc3RhdHVzID0gJ2RvbmUnO1xuICAgICAgdGhpcy5ob3N0SW5jcmVtZW50ID0gLTE7XG4gICAgfVxuICAgIGlmICh0aGlzLnNka09ubHlEaWFsKSB7XG4gICAgICBzdW1tYXJ5RGF0YVswXS5lbnRpdGllc1swXS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBzdW1tYXJ5RGF0YVswXS5lbnRpdGllc1swXS5hcGlEYXRhID0gdGhpcy5ob3N0Q29uZmlnQXBpRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VtbWFyeURhdGFbMF0uZW50aXRpZXNbMV0uc3RhdHVzID0gc3RhdHVzO1xuICAgICAgc3VtbWFyeURhdGFbMF0uZW50aXRpZXNbMF0uYXBpRGF0YSA9IHRoaXMuaG9zdENvbmZpZ0FwaURhdGE7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2VydmljZShzdW1tYXJ5RGF0YSkge1xuICAgIHRoaXMuc2VydmljZUluY3JlbWVudCsrO1xuICAgIGxldCBwb3N0Rml4ID0gJyc7XG4gICAgaWYgKHRoaXMuc2VydmljZUluY3JlbWVudCA+IDApIHtcbiAgICAgIHBvc3RGaXggPSAnXycgKyB0aGlzLnNlcnZpY2VJbmNyZW1lbnQ7XG4gICAgfVxuICAgIHRoaXMuc2VydmljZUFwaURhdGEubmFtZSA9IHRoaXMuc2VydmljZUFwaURhdGEubmFtZSArIHBvc3RGaXg7XG4gICAgY29uc3Qgc2VydmljZVJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy56aXRpU2VydmljZS5wb3N0KCdzZXJ2aWNlcycsIHRoaXMuc2VydmljZUFwaURhdGEsIHRydWUpLmNhdGNoKChyZXN1bHQpID0+IHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgbGV0IHNlcnZpY2VTdGF0dXM7XG4gICAgaWYgKHNlcnZpY2VSZXN1bHQuZXJyb3IpIHtcbiAgICAgIHNlcnZpY2VTdGF0dXMgPSAnZXJyb3InO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlcnZpY2VJZCA9IHNlcnZpY2VSZXN1bHQuaWQgPyBzZXJ2aWNlUmVzdWx0LmlkIDogc2VydmljZVJlc3VsdC5kYXRhLmlkO1xuICAgICAgc2VydmljZVN0YXR1cyA9ICdkb25lJztcbiAgICAgIGxldCBjbGlDb25maWdJZHMgPSAnJztcbiAgICAgIGlmICghdGhpcy5zZGtPbmx5RGlhbCAmJiAhdGhpcy5zZGtPbmx5QmluZCkge1xuICAgICAgICBjbGlDb25maWdJZHMgPSBgLS1jb25maWdzICcke3RoaXMuaW50ZXJjZXB0Q29uZmlnSWR9LCR7dGhpcy5ob3N0Q29uZmlnSWR9J2A7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNka09ubHlCaW5kICYmIHRoaXMuc2RrT25seUJpbmQpIHtcbiAgICAgICAgY2xpQ29uZmlnSWRzID0gYC0tY29uZmlncyAnJHt0aGlzLmludGVyY2VwdENvbmZpZ0lkfSdgO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNka09ubHlCaW5kICYmICF0aGlzLnNka09ubHlCaW5kKSB7XG4gICAgICAgIGNsaUNvbmZpZ0lkcyA9IGAtLWNvbmZpZ3MgJyR7dGhpcy5pbnRlcmNlcHRDb25maWdJZH0nYDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VydmljZUNsaUNvbW1hbmQgPSBgeml0aSBlZGdlIGNyZWF0ZSBzZXJ2aWNlICcke3RoaXMuc2VydmljZUFwaURhdGEubmFtZX0nICR7Y2xpQ29uZmlnSWRzfWBcbiAgICAgIHRoaXMuc2VydmljZUluY3JlbWVudCA9IC0xO1xuICAgIH1cbiAgICBjb25zdCBzdW1tYXJ5SW5kZXggPSAodGhpcy5zZGtPbmx5RGlhbCAmJiB0aGlzLnNka09ubHlCaW5kKSA/IDAgOiAxO1xuICAgIHN1bW1hcnlEYXRhW3N1bW1hcnlJbmRleF0uZW50aXRpZXNbMF0uc3RhdHVzID0gc2VydmljZVN0YXR1cztcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVBvbGljeShzdW1tYXJ5RGF0YSwgdHlwZSA9ICdEaWFsJykge1xuICAgIGxldCBwb2xpY3lBcGlEYXRhLCByb2xlQXR0cmlidXRlcywgbmFtZWRBdHRyaWJ1dGVzO1xuICAgIGlmICh0eXBlID09PSAnRGlhbCcpIHtcbiAgICAgIHRoaXMuZGlhbEluY3JlbWVudCsrO1xuICAgICAgbGV0IHBvc3RGaXggPSAnJztcbiAgICAgIGlmICh0aGlzLmRpYWxJbmNyZW1lbnQgPiAwKSB7XG4gICAgICAgIHBvc3RGaXggPSAnXycgKyB0aGlzLmRpYWxJbmNyZW1lbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLmRpYWxQb2xpY3lBcGlEYXRhLm5hbWUgPSB0aGlzLmRpYWxQb2xpY3lBcGlEYXRhLm5hbWUgKyBwb3N0Rml4O1xuICAgICAgcG9saWN5QXBpRGF0YSA9IHRoaXMuZGlhbFBvbGljeUFwaURhdGE7XG4gICAgICByb2xlQXR0cmlidXRlcyA9IHRoaXMuZGlhbFBvbGljeVJvbGVBdHRyaWJ1dGVzO1xuICAgICAgbmFtZWRBdHRyaWJ1dGVzID0gdGhpcy5kaWFsUG9saWN5TmFtZWRBdHRyaWJ1dGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbmRJbmNyZW1lbnQrKztcbiAgICAgIGxldCBwb3N0Rml4ID0gJyc7XG4gICAgICBpZiAodGhpcy5iaW5kSW5jcmVtZW50ID4gMCkge1xuICAgICAgICBwb3N0Rml4ID0gJ18nICsgdGhpcy5iaW5kSW5jcmVtZW50O1xuICAgICAgfVxuICAgICAgdGhpcy5iaW5kUG9saWN5QXBpRGF0YS5uYW1lID0gdGhpcy5iaW5kUG9saWN5QXBpRGF0YS5uYW1lICsgcG9zdEZpeDtcbiAgICAgIHBvbGljeUFwaURhdGEgPSB0aGlzLmJpbmRQb2xpY3lBcGlEYXRhO1xuICAgICAgcm9sZUF0dHJpYnV0ZXMgPSB0aGlzLmJpbmRQb2xpY3lSb2xlQXR0cmlidXRlcztcbiAgICAgIG5hbWVkQXR0cmlidXRlcyA9IHRoaXMuYmluZFBvbGljeU5hbWVkQXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBwb2xpY3lBcGlEYXRhLnNlcnZpY2VSb2xlcyA9IFtgQCR7dGhpcy5zZXJ2aWNlSWR9YF07XG4gICAgbGV0IGNsaVJvbGVzID0gJyc7XG4gICAgbGV0IHN0YXR1cyA9ICcnO1xuICAgIHBvbGljeUFwaURhdGEuaWRlbnRpdHlSb2xlcyA9IG5hbWVkQXR0cmlidXRlcy5tYXAoKG5hbWUpID0+IHtcbiAgICAgIGNsaVJvbGVzICs9ICdAJyArIHRoaXMuaWRlbnRpdGllc05hbWVJZE1hcFtuYW1lXSArICcsJztcbiAgICAgIHJldHVybiAnQCcgKyB0aGlzLmlkZW50aXRpZXNOYW1lSWRNYXBbbmFtZV07XG4gICAgfSk7XG4gICAgcG9saWN5QXBpRGF0YS5pZGVudGl0eVJvbGVzID0gWy4uLnBvbGljeUFwaURhdGEuaWRlbnRpdHlSb2xlcywgLi4ucm9sZUF0dHJpYnV0ZXMubWFwKChyb2xlKSA9PiB7XG4gICAgICBjbGlSb2xlcyArPSAnIycgKyByb2xlICsgJywnO1xuICAgICAgcmV0dXJuICcjJyArIHJvbGU7XG4gICAgfSldO1xuICAgIGNsaVJvbGVzID0gY2xpUm9sZXMuc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IGRpYWxQb2xpY3lSZXN1bHQgPSBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlLnBvc3QoJ3NlcnZpY2UtcG9saWNpZXMnLCBwb2xpY3lBcGlEYXRhKS5jYXRjaCgocmVzdWx0KSA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIGlmIChkaWFsUG9saWN5UmVzdWx0LmVycm9yKSB7XG4gICAgICBzdGF0dXMgPSAnZXJyb3InO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgPSAnZG9uZSc7XG4gICAgfVxuICAgIGNvbnN0IHN1bW1hcnlJbmRleCA9ICh0aGlzLnNka09ubHlEaWFsICYmIHRoaXMuc2RrT25seUJpbmQpID8gMSA6IDI7XG4gICAgY29uc3QgZW50aXR5SW5kZXggPSB0eXBlID09PSAnRGlhbCcgPyAwIDogMTtcbiAgICBzdW1tYXJ5RGF0YVtzdW1tYXJ5SW5kZXhdLmVudGl0aWVzW2VudGl0eUluZGV4XS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgY29uc3QgY2xpQ29tbWFuZCA9IGB6aXRpIGVkZ2UgY3JlYXRlIHNlcnZpY2UtcG9saWN5ICcke3BvbGljeUFwaURhdGEubmFtZX0nICR7dHlwZX0gLS1zZW1hbnRpYyBBbnlPZiAtLXNlcnZpY2Utcm9sZXMgJ0Ake3RoaXMuc2VydmljZUlkfScgLS1pZGVudGl0eS1yb2xlcyAnJHtjbGlSb2xlc30nYDtcbiAgICBpZiAodHlwZSA9PT0gJ0RpYWwnKSB7XG4gICAgICB0aGlzLmRpYWxQb2xpY3lDbGlDb21tYW5kID0gY2xpQ29tbWFuZDtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdkb25lJykge1xuICAgICAgICB0aGlzLmRpYWxJbmNyZW1lbnQgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYmluZEluY3JlbWVudCA9IC0xO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbmRQb2xpY3lDbGlDb21tYW5kID0gY2xpQ29tbWFuZDtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpIHtcbiAgICB0aGlzLmVycm9ycyA9IHt9O1xuICAgIHRoaXMudmFsaWRhdGVTZXJ2aWNlTmFtZSgpO1xuICAgIHRoaXMudmFsaWRhdGVJbnRlcmNlcHRBZGRyZXNzKCk7XG4gICAgdGhpcy52YWxpZGF0ZUludGVyY2VwdFBvcnQoKTtcbiAgICB0aGlzLnZhbGlkYXRlSG9zdEFkZHJlc3MoKTtcbiAgICB0aGlzLnZhbGlkYXRlSG9zdFBvcnQoKTtcbiAgICB0aGlzLnZhbGlkYXRlRGlhbElkZW50aXRpZXMoKVxuICAgIHRoaXMudmFsaWRhdGVCaW5kSWRlbnRpdGllcygpO1xuICAgIHJldHVybiBpc0VtcHR5KHRoaXMuZXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlU2VydmljZU5hbWUoKSB7XG4gICAgaWYgKGlzRW1wdHkodGhpcy5zZXJ2aWNlQXBpRGF0YS5uYW1lKSkge1xuICAgICAgdGhpcy5lcnJvcnMubmFtZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnbmFtZScpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlSW50ZXJjZXB0QWRkcmVzcygpIHtcbiAgICBpZiAodGhpcy5zZGtPbmx5RGlhbCkge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICdpbnRlcmNlcHRBZGRyZXNzJyk7XG4gICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2ludGVyY2VwdEFkZHJlc3NGb3JtYXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzRW1wdHkodGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEuYWRkcmVzc2VzKSB8fCBpc0VtcHR5KHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5kYXRhLmFkZHJlc3Nlc1swXSkpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmludGVyY2VwdEFkZHJlc3MgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsaWRhdGlvblNlcnZpY2UuaXNWYWxpZEludGVyY2VwdEhvc3QodGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEuYWRkcmVzc2VzWzBdKSkge1xuICAgICAgdGhpcy5lcnJvcnMuaW50ZXJjZXB0QWRkcmVzcyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9ycy5pbnRlcmNlcHRBZGRyZXNzRm9ybWF0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICdpbnRlcmNlcHRBZGRyZXNzJyk7XG4gICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2ludGVyY2VwdEFkZHJlc3NGb3JtYXQnKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUludGVyY2VwdFBvcnQoKSB7XG4gICAgaWYgKHRoaXMuc2RrT25seURpYWwpIHtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnaW50ZXJjZXB0UG9ydCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNFbXB0eSh0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEuZGF0YS5wb3J0UmFuZ2VzKSkge1xuICAgICAgdGhpcy5lcnJvcnMuaW50ZXJjZXB0UG9ydCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlUG9ydFJhbmdlcyh0aGlzLmludGVyY2VwdENvbmZpZ0FwaURhdGEuZGF0YS5wb3J0UmFuZ2VzKSkge1xuICAgICAgdGhpcy5lcnJvcnMuaW50ZXJjZXB0UG9ydCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnaW50ZXJjZXB0UG9ydCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlSG9zdEFkZHJlc3MoKSB7XG4gICAgaWYgKCF0aGlzLnNka09ubHlCaW5kICYmIGlzRW1wdHkodGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5kYXRhLmFkZHJlc3MpKSB7XG4gICAgICB0aGlzLmVycm9ycy5ob3N0QWRkcmVzcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnaG9zdEFkZHJlc3MnKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUhvc3RQb3J0KCkge1xuICAgIGlmICh0aGlzLnNka09ubHlCaW5kKSB7XG4gICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2hvc3RQb3J0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc05pbCh0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEucG9ydCkgfHwgaXNOYU4odGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5kYXRhLnBvcnQpKSB7XG4gICAgICB0aGlzLmVycm9ycy5ob3N0UG9ydCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghdGhpcy52YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkUG9ydCh0aGlzLmhvc3RDb25maWdBcGlEYXRhLmRhdGEucG9ydCkpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhvc3RQb3J0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zZXQodGhpcy5lcnJvcnMsICdob3N0UG9ydCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRGlhbElkZW50aXRpZXMoKSB7XG4gICAgaWYgKGlzRW1wdHkoWy4uLnRoaXMuZGlhbFBvbGljeU5hbWVkQXR0cmlidXRlcywgLi4udGhpcy5kaWFsUG9saWN5Um9sZUF0dHJpYnV0ZXNdKSkge1xuICAgICAgdGhpcy5lcnJvcnMuZGlhbElkZW50aXRpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2RpYWxJZGVudGl0aWVzJyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVCaW5kSWRlbnRpdGllcygpIHtcbiAgICBpZiAoaXNFbXB0eShbLi4udGhpcy5iaW5kUG9saWN5TmFtZWRBdHRyaWJ1dGVzLCAuLi50aGlzLmJpbmRQb2xpY3lSb2xlQXR0cmlidXRlc10pKSB7XG4gICAgICB0aGlzLmVycm9ycy5iaW5kSWRlbnRpdGllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc2V0KHRoaXMuZXJyb3JzLCAnYmluZElkZW50aXRpZXMnKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZXJ2aWNlc0FwaVJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIGBjdXJsICcke3RoaXMuY29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL3NlcnZpY2VzJyBcXFxcXG4gICAgICAtSCAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonIFxcXFxcbiAgICAgIC1IICdjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFxcXFxcbiAgICAgIC1IICd6dC1zZXNzaW9uOiAke3RoaXMueml0aVNlc3Npb25JZH0nIFxcXFxcbiAgICAgIC0tZGF0YS1yYXcgJyR7SlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2aWNlQXBpRGF0YSl9JyBcXFxcYFxuICB9XG5cbiAgZ2V0SW50ZXJjZXB0Q29uZmlnQXBpUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gYGN1cmwgJyR7dGhpcy5jb250cm9sbGVyRG9tYWlufS9lZGdlL21hbmFnZW1lbnQvdjEvY29uZmlncycgXFxcXFxuICAgICAgLUggJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyBcXFxcXG4gICAgICAtSCAnY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcXFxcXG4gICAgICAtSCAnenQtc2Vzc2lvbjogJHt0aGlzLnppdGlTZXNzaW9uSWR9JyBcXFxcXG4gICAgICAtLWRhdGEtcmF3ICcke0pTT04uc3RyaW5naWZ5KHRoaXMuaW50ZXJjZXB0Q29uZmlnQXBpRGF0YSl9JyBcXFxcYFxuICB9XG5cbiAgZ2V0SG9zdENvbmZpZ0FwaVJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIGBjdXJsICcke3RoaXMuY29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL2NvbmZpZ3MnIFxcXFxcbiAgICAgIC1IICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicgXFxcXFxuICAgICAgLUggJ2NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbicgXFxcXFxuICAgICAgLUggJ3p0LXNlc3Npb246ICR7dGhpcy56aXRpU2Vzc2lvbklkfScgXFxcXFxuICAgICAgLS1kYXRhLXJhdyAnJHtKU09OLnN0cmluZ2lmeSh0aGlzLmhvc3RDb25maWdBcGlEYXRhKX0nIFxcXFxgXG4gIH1cblxuICBnZXREaWFsQXBpUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gYGN1cmwgJyR7dGhpcy5jb250cm9sbGVyRG9tYWlufS9lZGdlL21hbmFnZW1lbnQvdjEvc2VydmljZS1wb2xpY2llcycgXFxcXFxuICAgICAgLUggJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyBcXFxcXG4gICAgICAtSCAnY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcXFxcXG4gICAgICAtSCAnenQtc2Vzc2lvbjogJHt0aGlzLnppdGlTZXNzaW9uSWR9JyBcXFxcXG4gICAgICAtLWRhdGEtcmF3ICcke0pTT04uc3RyaW5naWZ5KHRoaXMuZGlhbFBvbGljeUFwaURhdGEpfScgXFxcXGA7XG4gIH1cblxuICBnZXRCaW5kQXBpUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gYGN1cmwgJyR7dGhpcy5jb250cm9sbGVyRG9tYWlufS9lZGdlL21hbmFnZW1lbnQvdjEvc2VydmljZS1wb2xpY2llcycgXFxcXFxuICAgICAgLUggJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyBcXFxcXG4gICAgICAtSCAnY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcXFxcXG4gICAgICAtSCAnenQtc2Vzc2lvbjogJHt0aGlzLnppdGlTZXNzaW9uSWR9JyBcXFxcXG4gICAgICAtLWRhdGEtcmF3ICcke0pTT04uc3RyaW5naWZ5KHRoaXMuYmluZFBvbGljeUFwaURhdGEpfScgXFxcXGA7XG4gIH1cblxuICBvdmVycmlkZSBjaGVja0RhdGFDaGFuZ2UoKSB7XG4gICAgY29uc3Qgc2VydmljZURhdGFDaGFuZ2UgPSAhaXNFcXVhbCh0aGlzLmluaXRTZXJ2aWNlQXBpRGF0YSwgdGhpcy5zZXJ2aWNlQXBpRGF0YSk7XG4gICAgY29uc3QgaW50ZXJjZXB0RGF0YUNoYW5nZSA9ICFpc0VxdWFsKHRoaXMuaW5pdEludGVyY2VwdENvbmZpZ0FwaURhdGEuZGF0YSwgdGhpcy5pbnRlcmNlcHRDb25maWdBcGlEYXRhLmRhdGEpO1xuICAgIGNvbnN0IGhvc3REYXRhQ2hhbmdlID0gIWlzRXF1YWwodGhpcy5pbml0SG9zdENvbmZpZ0FwaURhdGEuZGF0YSwgdGhpcy5ob3N0Q29uZmlnQXBpRGF0YS5kYXRhKTtcbiAgICBjb25zdCBkaWFsRGF0YUNoYW5nZSA9ICFpc0VxdWFsKHRoaXMuaW5pdERpYWxQb2xpY3lBcGlEYXRhLCB0aGlzLmRpYWxQb2xpY3lBcGlEYXRhKTtcbiAgICBjb25zdCBiaW5kRGF0YUNoYW5nZSA9ICFpc0VxdWFsKHRoaXMuaW5pdEJpbmRQb2xpY3lBcGlEYXRhLCB0aGlzLmJpbmRQb2xpY3lBcGlEYXRhKTtcbiAgICBjb25zdCBkYXRhQ2hhbmdlID0gc2VydmljZURhdGFDaGFuZ2UgIT09IHRoaXMuc2VydmljZURhdGFDaGFuZ2UgfHwgaW50ZXJjZXB0RGF0YUNoYW5nZSAhPT0gdGhpcy5pbnRlcmNlcHREYXRhQ2hhbmdlIHx8IGhvc3REYXRhQ2hhbmdlICE9PSB0aGlzLmhvc3REYXRhQ2hhbmdlIHx8XG4gICAgICAgIGRpYWxEYXRhQ2hhbmdlICE9PSB0aGlzLmRpYWxEYXRhQ2hhbmdlIHx8IGJpbmREYXRhQ2hhbmdlICE9PSB0aGlzLmJpbmREYXRhQ2hhbmdlO1xuICAgIGlmIChkYXRhQ2hhbmdlKSB7XG4gICAgICB0aGlzLnNlcnZpY2VEYXRhQ2hhbmdlID0gc2VydmljZURhdGFDaGFuZ2U7XG4gICAgICB0aGlzLmludGVyY2VwdERhdGFDaGFuZ2UgPSBpbnRlcmNlcHREYXRhQ2hhbmdlO1xuICAgICAgdGhpcy5ob3N0RGF0YUNoYW5nZSA9IGhvc3REYXRhQ2hhbmdlO1xuICAgICAgdGhpcy5kaWFsRGF0YUNoYW5nZSA9IGRpYWxEYXRhQ2hhbmdlO1xuICAgICAgdGhpcy5iaW5kRGF0YUNoYW5nZSA9IGJpbmREYXRhQ2hhbmdlO1xuICAgICAgdGhpcy5kYXRhQ2hhbmdlLmVtaXQoZGF0YUNoYW5nZSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFDaGFuZ2UgPSBzZXJ2aWNlRGF0YUNoYW5nZSB8fCBpbnRlcmNlcHREYXRhQ2hhbmdlIHx8IGhvc3REYXRhQ2hhbmdlIHx8IGRpYWxEYXRhQ2hhbmdlIHx8IGJpbmREYXRhQ2hhbmdlO1xuICAgIGFwcC5pc0RpcnR5ID0gZmFsc2U7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInByb2plY3RhYmxlLWZvcm0td3JhcHBlciBzaW1wbGUtc2VydmljZS13cmFwcGVyXCJcbiAgICAgKGtleXVwLmVudGVyKT1cInNhdmUoJGV2ZW50KVwiXG4gICAgIChrZXl1cC5lc2NhcGUpPVwiY2xvc2VNb2RhbCh0cnVlLCBmYWxzZSwgJ2NhcmRzJywgJGV2ZW50KVwiXG4gICAgIHRhYmluZGV4PVwiMFwiXG4+XG4gICAgPGxpYi1mb3JtLWhlYWRlclxuICAgICAgICAgICAgW2RhdGFdPVwiZm9ybURhdGFcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInNob3dGb3JtID8gJ0NyZWF0ZSBhIFNpbXBsZSBTZXJ2aWNlJyA6ICdTZXJ2aWNlIENyZWF0aW9uIFN1bW1hcnknXCJcbiAgICAgICAgICAgIFthY3Rpb25CdXR0b25UZXh0XT1cIidTYXZlJ1wiXG4gICAgICAgICAgICAoYWN0aW9uUmVxdWVzdGVkKT1cImhlYWRlckFjdGlvblJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFsoZm9ybVZpZXcpXT1cImZvcm1WaWV3XCJcbiAgICA+PC9saWItZm9ybS1oZWFkZXI+XG4gICAgPGRpdiBjbGFzcz1cInNpbXBsZS1zZXJ2aWNlLWZvcm0tY29udGFpbmVyIHByb2plY3RhYmxlLWZvcm0tY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWNvbHVtbiB0aHJlZS1maWZ0aHNcIiAqbmdJZj1cInNob3dGb3JtXCI+XG4gICAgICAgICAgICA8ZGl2ICBpZD1cIklubGluZVNlcnZpY2VBcmVhXCIgY2xhc3M9XCJhbnlhZGRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ltcGxlLXNlcnZpY2UtaW5wdXRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXIgW3RpdGxlXT1cIidTZXJ2aWNlIERldGFpbHMnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dC1ncm91cCBzZXJ2aWNlLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtc3ViLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctdGl0bGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5TZXJ2aWNlIE5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgdGhpcyBzZXJ2aWNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI25hbWVGaWVsZElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ZXJyb3I6IGVycm9ycy5uYW1lfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlcnZpY2VBcGlEYXRhLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cInNlcnZpY2VOYW1lQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidmFsaWRhdGVTZXJ2aWNlTmFtZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1zdWItZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPlNFTEVDVCBPUiBDUkVBVEUgU0VSVklDRSBBVFRSSUJVVEVTPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi10YWctc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRSb2xlQXR0cmlidXRlcyldPVwic2VydmljZUFwaURhdGEucm9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F2YWlsYWJsZVJvbGVBdHRyaWJ1dGVzXT1cInNlcnZpY2VSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0FkZCBhdHRyaWJ1dGVzIHRvIGdyb3VwIHNlcnZpY2VzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2xpYi10YWctc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaW1wbGUtc2VydmljZS1jZW50ZXItY29udGVudFwiICpuZ0lmPVwic2hvd0Zvcm1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQUNDRVNTSU5HIENPTkZJR1VSQVRJT04nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwiJ3otaW5kZXg6IDk5OTk5OTk5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiJ0hvdyB3aWxsIGNsaWVudCBhcHBsaWNhdGlvbnMgdXNlIHRoaXMgc2VydmljZT8gU3BlY2lmeSBhIGhvc3RuYW1lL0lQIGFuZCBwb3J0LCBvciB1c2UgdGhlICZxdW90O1NESyBPbmx5JnF1b3Q7IHRvZ2dsZSBmb3IgYW4gYXBwbGljYXRpb24gZW1iZWRkZWQgY29uZmlndXJhdGlvbi4nXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0LWdyb3VwIGFjY2Vzc2luZy1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtc3ViLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWZpZWxkLXRpdGxlXCI+V2hhdCBpZGVudGl0aWVzIGNhbiBhY2Nlc3MgdGhpcyBzZXJ2aWNlPzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZE5hbWVkQXR0cmlidXRlcyldPVwiZGlhbFBvbGljeU5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXMpXT1cImRpYWxQb2xpY3lSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cImlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVSb2xlQXR0cmlidXRlc109XCJpZGVudGl0eVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IGlkZW50aXR5IGF0dHJpYnV0ZXMgdG8gZ3JhbnQgYWNjZXNzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzRXJyb3JdPVwiZXJyb3JzLmRpYWxJZGVudGl0aWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZE5hbWVkQXR0cmlidXRlc0NoYW5nZSk9XCJ2YWxpZGF0ZURpYWxJZGVudGl0aWVzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXNDaGFuZ2UpPVwidmFsaWRhdGVEaWFsSWRlbnRpdGllcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwiZ2V0SWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGliLXRhZy1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtc3ViLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWZpZWxkLXRpdGxlXCI+SG93IHdpbGwgdGhlIHNlcnZpY2UgYmUgYWNjZXNzZWQ/PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGFkZHJlc3NQb3J0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZmlnLWl0ZW0tbGFiZWxcIj5TREsgT05MWTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGstdG9nZ2xlIGZvcm0tZmllbGQtdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dpdGNoR3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2RrT25seURpYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb246IHNka09ubHlEaWFsIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCIhc2RrT25seURpYWxcIiBjbGFzcz1cIm9uLWxhYmVsXCI+WUVTPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwic2RrT25seURpYWxcIiBjbGFzcz1cIm9mZi1sYWJlbFwiPk5PPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2l0Y2hcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1pdGVtLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogc2RrT25seURpYWx9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWhvc3RuYW1lLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25maWctaXRlbS1sYWJlbFwiPkhPU1ROQU1FIC8gSVA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZmllbGQtaW5mbyBpbmZvaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBY2Nlc3NpbmcgaG9zdG5hbWVzIG11c3QgaW5jbHVkZSBhICcuJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJlcnJvcnMuaW50ZXJjZXB0QWRkcmVzc0Zvcm1hdFwiIGNsYXNzPVwiZXJyb3ItbGFiZWxcIj5BY2Nlc3NpbmcgaG9zdG5hbWVzIG11c3QgaW5jbHVkZSBhICcuJzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiSG93VG9cIiB0eXBlPVwidGV4dFwiIG1heGxlbmd0aD1cIjEwMFwiIGRhdGEtaTE4bj1cIkVnSG9zdFwiIChjaGFuZ2UpPVwidmFsaWRhdGVJbnRlcmNlcHRBZGRyZXNzKClcIiBbbmdDbGFzc109XCJ7ZXJyb3I6IGVycm9ycy5pbnRlcmNlcHRBZGRyZXNzfVwiIFtwbGFjZWhvbGRlcl09XCJzZGtPbmx5RGlhbCA/ICcnIDogJ2UuZy4gbXlzZXJ2aWNlLnppdGknXCIgWyhuZ01vZGVsKV09XCJzZGtPbmx5RGlhbCA/ICcnIDogaW50ZXJjZXB0Q29uZmlnQXBpRGF0YS5kYXRhLmFkZHJlc3Nlc1swXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1pdGVtLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogc2RrT25seURpYWx9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmZpZy1pdGVtLWxhYmVsXCI+UE9SVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cIkhvd1RvUG9ydFwiIHR5cGU9XCJudW1iZXJcIiBtYXhsZW5ndGg9XCIxMFwiIChjaGFuZ2UpPVwidmFsaWRhdGVJbnRlcmNlcHRQb3J0KClcIiBbbmdDbGFzc109XCJ7ZXJyb3I6IGVycm9ycy5pbnRlcmNlcHRQb3J0fVwiIFtwbGFjZWhvbGRlcl09XCJzZGtPbmx5RGlhbCA/ICcnIDogNDQzXCIgKGtleXVwKT1cImludGVyY2VwdFBvcnRDaGFuZ2VkKCRldmVudClcIiBbKG5nTW9kZWwpXT1cInNka09ubHlEaWFsID8gJycgOiBpbnRlcmNlcHRQb3J0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInSE9TVElORyBDT05GSUdVUkFUSU9OJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFN0eWxlXT1cIid6LWluZGV4OiA5OTk5OTk5OSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidXaGVyZSBzaG91bGQgdHJhZmZpYyBmb3IgdGhpcyBzZXJ2aWNlIGJlIHNlbnQ/IFNwZWNpZnkgYSBwcm90b2NvbCwgaG9zdG5hbWUvSVAsIGFuZCBwb3J0LCBvciB1c2UgdGhlICZxdW90O1NESyBPbmx5JnF1b3Q7IHRvZ2dsZSBmb3IgYW4gYXBwbGljYXRpb24gZW1iZWRkZWQgY29uZmlndXJhdGlvbi4nXCJcblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtaW5wdXQtZ3JvdXAgaG9zdGluZy1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtc3ViLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWZpZWxkLXRpdGxlXCI+V2hhdCBpZGVudGl0aWVzIGNhbiBob3N0IHRoaXMgc2VydmljZT88L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi10YWctc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXMpXT1cImJpbmRQb2xpY3lOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzKV09XCJiaW5kUG9saWN5Um9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F2YWlsYWJsZU5hbWVkQXR0cmlidXRlc109XCJpZGVudGl0eU5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlUm9sZUF0dHJpYnV0ZXNdPVwiaWRlbnRpdHlSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBpZGVudGl0eSBhdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzRXJyb3JdPVwiZXJyb3JzLmJpbmRJZGVudGl0aWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZE5hbWVkQXR0cmlidXRlc0NoYW5nZSk9XCJ2YWxpZGF0ZUJpbmRJZGVudGl0aWVzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXNDaGFuZ2UpPVwidmFsaWRhdGVCaW5kSWRlbnRpdGllcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1zdWItZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5XaGVyZSBzaG91bGQgdHJhZmZpYyBiZSBzZW50Pzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBhZGRyZXNzRnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWl0ZW0tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmZpZy1pdGVtLWxhYmVsXCI+U0RLIE9OTFk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RrLXRvZ2dsZSBmb3JtLWZpZWxkLXRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXRjaEdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNka09ubHlCaW5kKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IG9uOiBzZGtPbmx5QmluZCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiIXNka09ubHlCaW5kXCIgY2xhc3M9XCJvbi1sYWJlbFwiPllFUzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInNka09ubHlCaW5kXCIgY2xhc3M9XCJvZmYtbGFiZWxcIj5OTzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dpdGNoXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctaXRlbS1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6IHNka09ubHlCaW5kfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25maWctaXRlbS1sYWJlbFwiPlBST1RPQ09MPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cIkhvc3RlZFByb3RvY29sXCIgKGNoYW5nZSk9XCJob3N0UHJvdG9jb2xzQ2hhbmdlZCgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJzZGtPbmx5QmluZCA/ICcnIDogaG9zdFByb3RvY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInRjcFwiPlRDUDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ1ZHBcIiA+VURQPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJvdGhcIiA+VENQL1VEUDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWl0ZW0tY29udGFpbmVyXCIgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiBzZGtPbmx5QmluZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZmlnLWl0ZW0tbGFiZWxcIj5IT1NUTkFNRSAvIElQPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiSG9zdGVkSG9zdFwiIHR5cGU9XCJ0ZXh0XCIgbWF4bGVuZ3RoPVwiMTAwXCIgZGF0YS1pMThuPVwiRWdIb3N0XCIgKGNoYW5nZSk9XCJ2YWxpZGF0ZUhvc3RBZGRyZXNzKClcIiBbbmdDbGFzc109XCJ7ZXJyb3I6IGVycm9ycy5ob3N0QWRkcmVzc31cIiBbcGxhY2Vob2xkZXJdPVwic2RrT25seUJpbmQgPyAnJyA6ICdlLmcuIG15c2VydmljZS56aXRpJ1wiIFsobmdNb2RlbCldPVwic2RrT25seUJpbmQgPyAnJyA6IGhvc3RDb25maWdBcGlEYXRhLmRhdGEuYWRkcmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1pdGVtLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogc2RrT25seUJpbmR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmZpZy1pdGVtLWxhYmVsXCI+UE9SVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cIkhvc3RlZFBvcnRcIiB0eXBlPVwibnVtYmVyXCIgbWF4bGVuZ3RoPVwiMTBcIiAoY2hhbmdlKT1cInZhbGlkYXRlSG9zdFBvcnQoKVwiIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzLmhvc3RQb3J0fVwiIFtwbGFjZWhvbGRlcl09XCJzZGtPbmx5QmluZCA/ICcnIDogNDQzXCIgWyhuZ01vZGVsKV09XCJzZGtPbmx5QmluZCA/ICcnIDogaG9zdENvbmZpZ0FwaURhdGEuZGF0YS5wb3J0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19