@c8y/ngx-components 1018.0.175 → 1018.0.176

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.
@@ -1,12 +1,15 @@
1
1
  import { SimpleChanges } from '@angular/core';
2
2
  import { TenantLoginOptionType } from '@c8y/client';
3
3
  import { AuthConfiguration } from './auth-configuration.model';
4
+ import { ControlContainer } from '@angular/forms';
4
5
  import { AuthenticationRestrictions } from './basic-settings.model';
5
6
  import * as i0 from "@angular/core";
6
7
  export declare class BasicAuthSettingsComponent {
8
+ private controlContainer;
7
9
  authConfiguration: AuthConfiguration;
8
10
  preferredLoginOptionType: TenantLoginOptionType;
9
11
  tenantLoginOptionTypeEnum: typeof TenantLoginOptionType;
12
+ constructor(controlContainer: ControlContainer);
10
13
  ngOnChanges(changes: SimpleChanges): void;
11
14
  ngDoCheck(): void;
12
15
  get forbiddenWebBrowsers(): boolean;
@@ -3,11 +3,12 @@ import { TenantLoginOptionType } from '@c8y/client';
3
3
  import { ControlContainer, NgForm } from '@angular/forms';
4
4
  import { UserAgent, isBasic } from './basic-settings.model';
5
5
  import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/forms";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@angular/common";
8
8
  import * as i3 from "@c8y/ngx-components";
9
9
  export class BasicAuthSettingsComponent {
10
- constructor() {
10
+ constructor(controlContainer) {
11
+ this.controlContainer = controlContainer;
11
12
  this.preferredLoginOptionType = TenantLoginOptionType.BASIC;
12
13
  this.tenantLoginOptionTypeEnum = TenantLoginOptionType;
13
14
  }
@@ -33,9 +34,11 @@ export class BasicAuthSettingsComponent {
33
34
  }
34
35
  forbiddenUserAgentsRemove(id) {
35
36
  this.authenticationRestrictions.forbiddenUserAgents = this.remove(this.authenticationRestrictions.forbiddenUserAgents, id);
37
+ this.controlContainer.control.markAsDirty();
36
38
  }
37
39
  trustedUserAgentsRemove(id) {
38
40
  this.authenticationRestrictions.trustedUserAgents = this.remove(this.authenticationRestrictions.trustedUserAgents, id);
41
+ this.controlContainer.control.markAsDirty();
39
42
  }
40
43
  get authenticationRestrictions() {
41
44
  return this.authConfiguration.loginOptions.find(isBasic).authenticationRestrictions;
@@ -51,12 +54,12 @@ export class BasicAuthSettingsComponent {
51
54
  return newArray;
52
55
  }
53
56
  }
54
- BasicAuthSettingsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: BasicAuthSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
- BasicAuthSettingsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: BasicAuthSettingsComponent, selector: "c8y-basic-auth-settings", inputs: { authConfiguration: "authConfiguration" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"card-block separator-top\"\n *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Basic Auth restrictions' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n <span></span>\n <span>{{ 'Forbidden for web browsers' | translate }}</span>\n </label>\n <div\n class=\"alert alert-warning\"\n *ngIf=\"\n preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n \"\n >\n {{\n 'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n | translate\n }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Forbidden user agents' | translate }}\">\n {{ 'Forbidden user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n [(ngModel)]=\"forbiddenUserAgent.value\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Trusted user agents' | translate }}\">\n {{ 'Trusted user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n [(ngModel)]=\"trustedUserAgent.value\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger text-primary\"\n (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n class=\"btn btn-dot text-primary\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
57
+ BasicAuthSettingsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: BasicAuthSettingsComponent, deps: [{ token: i1.ControlContainer }], target: i0.ɵɵFactoryTarget.Component });
58
+ BasicAuthSettingsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: BasicAuthSettingsComponent, selector: "c8y-basic-auth-settings", inputs: { authConfiguration: "authConfiguration" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"card-block separator-top\"\n *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Basic Auth restrictions' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n <span></span>\n <span>{{ 'Forbidden for web browsers' | translate }}</span>\n </label>\n <div\n class=\"alert alert-warning\"\n *ngIf=\"\n preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n \"\n >\n {{\n 'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n | translate\n }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Forbidden user agents' | translate }}\">\n {{ 'Forbidden user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n [(ngModel)]=\"forbiddenUserAgent.value\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Trusted user agents' | translate }}\">\n {{ 'Trusted user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n [(ngModel)]=\"trustedUserAgent.value\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger text-primary\"\n (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n class=\"btn btn-dot text-primary\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
56
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: BasicAuthSettingsComponent, decorators: [{
57
60
  type: Component,
58
61
  args: [{ selector: 'c8y-basic-auth-settings', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div\n class=\"card-block separator-top\"\n *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Basic Auth restrictions' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n <span></span>\n <span>{{ 'Forbidden for web browsers' | translate }}</span>\n </label>\n <div\n class=\"alert alert-warning\"\n *ngIf=\"\n preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n \"\n >\n {{\n 'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n | translate\n }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Forbidden user agents' | translate }}\">\n {{ 'Forbidden user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n [(ngModel)]=\"forbiddenUserAgent.value\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Trusted user agents' | translate }}\">\n {{ 'Trusted user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n [(ngModel)]=\"trustedUserAgent.value\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger text-primary\"\n (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n class=\"btn btn-dot text-primary\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
59
- }], propDecorators: { authConfiguration: [{
62
+ }], ctorParameters: function () { return [{ type: i1.ControlContainer }]; }, propDecorators: { authConfiguration: [{
60
63
  type: Input
61
64
  }] } });
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hdXRoLWNvbmZpZ3VyYXRpb24vYmFzaWMtc2V0dGluZ3MvYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9hdXRoLWNvbmZpZ3VyYXRpb24vYmFzaWMtc2V0dGluZ3MvYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUE4QixPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFPeEYsTUFBTSxPQUFPLDBCQUEwQjtJQUx2QztRQVNFLDZCQUF3QixHQUEwQixxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFFOUUsOEJBQXlCLEdBQUcscUJBQXFCLENBQUM7S0F1RG5EO0lBckRDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFO1lBQ3ZFLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzNCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUM7U0FDbkU7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsRUFBRTtZQUNyRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDO1lBQ2hGLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLHFCQUFxQixDQUFDLEtBQUssRUFBRTtnQkFDakUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzthQUNuQztTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxLQUFjO1FBQ3JDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRixDQUFDO0lBRUQseUJBQXlCLENBQUMsRUFBRTtRQUMxQixJQUFJLENBQUMsMEJBQTBCLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FDL0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixFQUNuRCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUM3RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQ2pELEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksMEJBQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsMEJBQTBCLENBQUM7SUFDdEYsQ0FBQztJQUVELEdBQUcsQ0FBQyxVQUFVO1FBQ1osVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDM0IsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7dUhBNURVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLHdJQ1h2QyxnaUpBMEhBLCt0Q0RqSGlCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzJGQUV4RCwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UseUJBQXlCLGlCQUVwQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs4QkFJbkUsaUJBQWlCO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGVuYW50TG9naW5PcHRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQXV0aENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2F1dGgtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVc2VyQWdlbnQsIEF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLCBpc0Jhc2ljIH0gZnJvbSAnLi9iYXNpYy1zZXR0aW5ncy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1iYXNpYy1hdXRoLXNldHRpbmdzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2ljLWF1dGgtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIEJhc2ljQXV0aFNldHRpbmdzQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgYXV0aENvbmZpZ3VyYXRpb246IEF1dGhDb25maWd1cmF0aW9uO1xuXG4gIHByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTogVGVuYW50TG9naW5PcHRpb25UeXBlID0gVGVuYW50TG9naW5PcHRpb25UeXBlLkJBU0lDO1xuXG4gIHRlbmFudExvZ2luT3B0aW9uVHlwZUVudW0gPSBUZW5hbnRMb2dpbk9wdGlvblR5cGU7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmF1dGhDb25maWd1cmF0aW9uICYmIGNoYW5nZXMuYXV0aENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSA9XG4gICAgICAgIGNoYW5nZXMuYXV0aENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMucHJlZmVycmVkTG9naW5PcHRpb25UeXBlICE9PSB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSkge1xuICAgICAgdGhpcy5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgPSB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTtcbiAgICAgIGlmICh0aGlzLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSA9PT0gVGVuYW50TG9naW5PcHRpb25UeXBlLkJBU0lDKSB7XG4gICAgICAgIHRoaXMuZm9yYmlkZGVuV2ViQnJvd3NlcnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgZm9yYmlkZGVuV2ViQnJvd3NlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMuZm9yYmlkZGVuQ2xpZW50cy5pbmNsdWRlcygnV0VCX0JST1dTRVJTJyk7XG4gIH1cblxuICBzZXQgZm9yYmlkZGVuV2ViQnJvd3NlcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlbkNsaWVudHMgPSB2YWx1ZSA/IFsnV0VCX0JST1dTRVJTJ10gOiBbXTtcbiAgfVxuXG4gIGZvcmJpZGRlblVzZXJBZ2VudHNSZW1vdmUoaWQpIHtcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlblVzZXJBZ2VudHMgPSB0aGlzLnJlbW92ZShcbiAgICAgIHRoaXMuYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMuZm9yYmlkZGVuVXNlckFnZW50cyxcbiAgICAgIGlkXG4gICAgKTtcbiAgfVxuXG4gIHRydXN0ZWRVc2VyQWdlbnRzUmVtb3ZlKGlkKSB7XG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy50cnVzdGVkVXNlckFnZW50cyA9IHRoaXMucmVtb3ZlKFxuICAgICAgdGhpcy5hdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy50cnVzdGVkVXNlckFnZW50cyxcbiAgICAgIGlkXG4gICAgKTtcbiAgfVxuXG4gIGdldCBhdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucygpOiBBdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZ3VyYXRpb24ubG9naW5PcHRpb25zLmZpbmQoaXNCYXNpYykuYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnM7XG4gIH1cblxuICBhZGQoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24ucHVzaChuZXcgVXNlckFnZW50KCcnKSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZShjb2xsZWN0aW9uLCBpZCkge1xuICAgIGNvbnN0IG5ld0FycmF5ID0gY29sbGVjdGlvbi5maWx0ZXIob2JqID0+IG9iai5pZCAhPT0gaWQpO1xuICAgIGlmICghbmV3QXJyYXkubGVuZ3RoKSB7XG4gICAgICBuZXdBcnJheS5wdXNoKG5ldyBVc2VyQWdlbnQoJycpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiY2FyZC1ibG9jayBzZXBhcmF0b3ItdG9wXCJcbiAgKm5nSWY9XCJhdXRoQ29uZmlndXJhdGlvbi5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgIT09ICdCQVNJQydcIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29sLXNtLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaDQgdGV4dC1ub3JtYWwgdGV4dC1yaWdodCB0ZXh0LWxlZnQteHNcIj5cbiAgICAgIHt7ICdCYXNpYyBBdXRoIHJlc3RyaWN0aW9ucycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoXCIgdGl0bGU9XCJ7eyAnRm9yYmlkZGVuIGZvciB3ZWIgYnJvd3NlcnMnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImZvcmJpZGRlbldlYkJyb3dzZXJzXCIgWyhuZ01vZGVsKV09XCJmb3JiaWRkZW5XZWJCcm93c2Vyc1wiIC8+XG4gICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eyAnRm9yYmlkZGVuIGZvciB3ZWIgYnJvd3NlcnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSA9PT0gdGVuYW50TG9naW5PcHRpb25UeXBlRW51bS5CQVNJQyAmJiBmb3JiaWRkZW5XZWJCcm93c2Vyc1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAnWW91IGFyZSBhYm91dCB0byBmb3JiaWQgYnJvd3NlcnMgZnJvbSB1c2luZyBCYXNpYyBhdXRoZW50aWNhdGlvbi4gVGhpcyB3aWxsIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyB3ZWIgYXBwbGljYXRpb25zIG9uIHlvdXIgdGVuYW50IGJlY2F1c2UgeW91IGFyZSBnb2luZyB0byBzZXQgQmFzaWMgYXV0aGVudGljYXRpb24gYXMgdGhlIHByZWZlcnJlZCBsb2dpbiBtb2RlLidcbiAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxsYWJlbCB0aXRsZT1cInt7ICdGb3JiaWRkZW4gdXNlciBhZ2VudHMnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAge3sgJ0ZvcmJpZGRlbiB1c2VyIGFnZW50cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAgbS10LThcIlxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IGZvcmJpZGRlblVzZXJBZ2VudCBvZiBhdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy5mb3JiaWRkZW5Vc2VyQWdlbnRzO1xuICAgICAgICAgICAgbGFzdCBhcyBpc0xhc3Q7XG4gICAgICAgICAgICBmaXJzdCBhcyBpc0ZpcnN0XG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW25hbWVdPVwiJ2ZvcmJpZGRlblVzZXJBZ2VudCcgKyBmb3JiaWRkZW5Vc2VyQWdlbnQuaWRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JiaWRkZW5Vc2VyQWdlbnQudmFsdWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gZm9yYmlkZGVuLWFnZW50XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG4gY29sLXNtLTJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhKGlzRmlyc3QgJiYgaXNMYXN0ICYmIGZvcmJpZGRlblVzZXJBZ2VudC52YWx1ZSA9PT0gJycpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cIidmb3JiaWRkZW5Vc2VyQWdlbnRSZW1vdmUnICsgZm9yYmlkZGVuVXNlckFnZW50LmlkXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgdGV4dC1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcmJpZGRlblVzZXJBZ2VudHNSZW1vdmUoZm9yYmlkZGVuVXNlckFnZW50LmlkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZGx0LWM4eS1pY29uLW1pbnVzLWNpcmNsZSB0ZXh0LWRhbmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgdGV4dC1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZChhdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy5mb3JiaWRkZW5Vc2VyQWdlbnRzKVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNMYXN0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJkbHQtYzh5LWljb24tcGx1cy1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICA8bGFiZWwgdGl0bGU9XCJ7eyAnVHJ1c3RlZCB1c2VyIGFnZW50cycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICB7eyAnVHJ1c3RlZCB1c2VyIGFnZW50cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAgbS10LThcIlxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IHRydXN0ZWRVc2VyQWdlbnQgb2YgYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMudHJ1c3RlZFVzZXJBZ2VudHM7XG4gICAgICAgICAgICBsYXN0IGFzIGlzTGFzdDtcbiAgICAgICAgICAgIGZpcnN0IGFzIGlzRmlyc3RcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbbmFtZV09XCIndHJ1c3RlZFVzZXJBZ2VudCcgKyB0cnVzdGVkVXNlckFnZW50LmlkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IHRydXN0ZWQtYWdlbnRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0cnVzdGVkVXNlckFnZW50LnZhbHVlXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG4gY29sLXNtLTJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhKGlzRmlyc3QgJiYgaXNMYXN0ICYmIHRydXN0ZWRVc2VyQWdlbnQudmFsdWUgPT09ICcnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbbmFtZV09XCIndHJ1c3RlZFVzZXJBZ2VudFJlbW92ZScgKyB0cnVzdGVkVXNlckFnZW50LmlkXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIHRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0cnVzdGVkVXNlckFnZW50c1JlbW92ZSh0cnVzdGVkVXNlckFnZW50LmlkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZGx0LWM4eS1pY29uLW1pbnVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGQoYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMudHJ1c3RlZFVzZXJBZ2VudHMpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAqbmdJZj1cImlzTGFzdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZGx0LWM4eS1pY29uLXBsdXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hdXRoLWNvbmZpZ3VyYXRpb24vYmFzaWMtc2V0dGluZ3MvYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9hdXRoLWNvbmZpZ3VyYXRpb24vYmFzaWMtc2V0dGluZ3MvYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUE4QixPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFPeEYsTUFBTSxPQUFPLDBCQUEwQjtJQVFyQyxZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUp0RCw2QkFBd0IsR0FBMEIscUJBQXFCLENBQUMsS0FBSyxDQUFDO1FBRTlFLDhCQUF5QixHQUFHLHFCQUFxQixDQUFDO0lBRU8sQ0FBQztJQUUxRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRTtZQUN2RSxJQUFJLENBQUMsd0JBQXdCO2dCQUMzQixPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDO1NBQ25FO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUU7WUFDckYsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQztZQUNoRixJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7YUFDbkM7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELElBQUksb0JBQW9CLENBQUMsS0FBYztRQUNyQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkYsQ0FBQztJQUVELHlCQUF5QixDQUFDLEVBQUU7UUFDMUIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQy9ELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxtQkFBbUIsRUFDbkQsRUFBRSxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUM3RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQ2pELEVBQUUsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSwwQkFBMEI7UUFDNUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztJQUN0RixDQUFDO0lBRUQsR0FBRyxDQUFDLFVBQVU7UUFDWixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUMzQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOzt1SEFoRVUsMEJBQTBCOzJHQUExQiwwQkFBMEIsd0lDWHZDLGdpSkEwSEEsK3RDRGpIaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7MkZBRXhELDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDRSx5QkFBeUIsaUJBRXBCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDO3VHQUluRSxpQkFBaUI7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZW5hbnRMb2dpbk9wdGlvblR5cGUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBdXRoQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vYXV0aC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFVzZXJBZ2VudCwgQXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMsIGlzQmFzaWMgfSBmcm9tICcuL2Jhc2ljLXNldHRpbmdzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWJhc2ljLWF1dGgtc2V0dGluZ3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV1cbn0pXG5leHBvcnQgY2xhc3MgQmFzaWNBdXRoU2V0dGluZ3NDb21wb25lbnQge1xuICBASW5wdXQoKVxuICBhdXRoQ29uZmlndXJhdGlvbjogQXV0aENvbmZpZ3VyYXRpb247XG5cbiAgcHJlZmVycmVkTG9naW5PcHRpb25UeXBlOiBUZW5hbnRMb2dpbk9wdGlvblR5cGUgPSBUZW5hbnRMb2dpbk9wdGlvblR5cGUuQkFTSUM7XG5cbiAgdGVuYW50TG9naW5PcHRpb25UeXBlRW51bSA9IFRlbmFudExvZ2luT3B0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmF1dGhDb25maWd1cmF0aW9uICYmIGNoYW5nZXMuYXV0aENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSA9XG4gICAgICAgIGNoYW5nZXMuYXV0aENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMucHJlZmVycmVkTG9naW5PcHRpb25UeXBlICE9PSB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSkge1xuICAgICAgdGhpcy5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgPSB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTtcbiAgICAgIGlmICh0aGlzLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSA9PT0gVGVuYW50TG9naW5PcHRpb25UeXBlLkJBU0lDKSB7XG4gICAgICAgIHRoaXMuZm9yYmlkZGVuV2ViQnJvd3NlcnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgZm9yYmlkZGVuV2ViQnJvd3NlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMuZm9yYmlkZGVuQ2xpZW50cy5pbmNsdWRlcygnV0VCX0JST1dTRVJTJyk7XG4gIH1cblxuICBzZXQgZm9yYmlkZGVuV2ViQnJvd3NlcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlbkNsaWVudHMgPSB2YWx1ZSA/IFsnV0VCX0JST1dTRVJTJ10gOiBbXTtcbiAgfVxuXG4gIGZvcmJpZGRlblVzZXJBZ2VudHNSZW1vdmUoaWQpIHtcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlblVzZXJBZ2VudHMgPSB0aGlzLnJlbW92ZShcbiAgICAgIHRoaXMuYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMuZm9yYmlkZGVuVXNlckFnZW50cyxcbiAgICAgIGlkXG4gICAgKTtcbiAgICB0aGlzLmNvbnRyb2xDb250YWluZXIuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgdHJ1c3RlZFVzZXJBZ2VudHNSZW1vdmUoaWQpIHtcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLnRydXN0ZWRVc2VyQWdlbnRzID0gdGhpcy5yZW1vdmUoXG4gICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLnRydXN0ZWRVc2VyQWdlbnRzLFxuICAgICAgaWRcbiAgICApO1xuICAgIHRoaXMuY29udHJvbENvbnRhaW5lci5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBnZXQgYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMoKTogQXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWd1cmF0aW9uLmxvZ2luT3B0aW9ucy5maW5kKGlzQmFzaWMpLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zO1xuICB9XG5cbiAgYWRkKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uLnB1c2gobmV3IFVzZXJBZ2VudCgnJykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmUoY29sbGVjdGlvbiwgaWQpIHtcbiAgICBjb25zdCBuZXdBcnJheSA9IGNvbGxlY3Rpb24uZmlsdGVyKG9iaiA9PiBvYmouaWQgIT09IGlkKTtcbiAgICBpZiAoIW5ld0FycmF5Lmxlbmd0aCkge1xuICAgICAgbmV3QXJyYXkucHVzaChuZXcgVXNlckFnZW50KCcnKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNhcmQtYmxvY2sgc2VwYXJhdG9yLXRvcFwiXG4gICpuZ0lmPVwiYXV0aENvbmZpZ3VyYXRpb24ucHJlZmVycmVkTG9naW5PcHRpb25UeXBlICE9PSAnQkFTSUMnXCJcbj5cbiAgPGRpdiBjbGFzcz1cImNvbC1zbS0yXCI+XG4gICAgPGRpdiBjbGFzcz1cImg0IHRleHQtbm9ybWFsIHRleHQtcmlnaHQgdGV4dC1sZWZ0LXhzXCI+XG4gICAgICB7eyAnQmFzaWMgQXV0aCByZXN0cmljdGlvbnMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXN3aXRjaFwiIHRpdGxlPVwie3sgJ0ZvcmJpZGRlbiBmb3Igd2ViIGJyb3dzZXJzJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJmb3JiaWRkZW5XZWJCcm93c2Vyc1wiIFsobmdNb2RlbCldPVwiZm9yYmlkZGVuV2ViQnJvd3NlcnNcIiAvPlxuICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0ZvcmJpZGRlbiBmb3Igd2ViIGJyb3dzZXJzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBwcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgPT09IHRlbmFudExvZ2luT3B0aW9uVHlwZUVudW0uQkFTSUMgJiYgZm9yYmlkZGVuV2ViQnJvd3NlcnNcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gZm9yYmlkIGJyb3dzZXJzIGZyb20gdXNpbmcgQmFzaWMgYXV0aGVudGljYXRpb24uIFRoaXMgd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgd2ViIGFwcGxpY2F0aW9ucyBvbiB5b3VyIHRlbmFudCBiZWNhdXNlIHlvdSBhcmUgZ29pbmcgdG8gc2V0IEJhc2ljIGF1dGhlbnRpY2F0aW9uIGFzIHRoZSBwcmVmZXJyZWQgbG9naW4gbW9kZS4nXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICA8bGFiZWwgdGl0bGU9XCJ7eyAnRm9yYmlkZGVuIHVzZXIgYWdlbnRzJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgIHt7ICdGb3JiaWRkZW4gdXNlciBhZ2VudHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwIG0tdC04XCJcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCBmb3JiaWRkZW5Vc2VyQWdlbnQgb2YgYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMuZm9yYmlkZGVuVXNlckFnZW50cztcbiAgICAgICAgICAgIGxhc3QgYXMgaXNMYXN0O1xuICAgICAgICAgICAgZmlyc3QgYXMgaXNGaXJzdFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtuYW1lXT1cIidmb3JiaWRkZW5Vc2VyQWdlbnQnICsgZm9yYmlkZGVuVXNlckFnZW50LmlkXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9yYmlkZGVuVXNlckFnZW50LnZhbHVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IGZvcmJpZGRlbi1hZ2VudFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuIGNvbC1zbS0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShpc0ZpcnN0ICYmIGlzTGFzdCAmJiBmb3JiaWRkZW5Vc2VyQWdlbnQudmFsdWUgPT09ICcnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbbmFtZV09XCInZm9yYmlkZGVuVXNlckFnZW50UmVtb3ZlJyArIGZvcmJpZGRlblVzZXJBZ2VudC5pZFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IHRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJmb3JiaWRkZW5Vc2VyQWdlbnRzUmVtb3ZlKGZvcmJpZGRlblVzZXJBZ2VudC5pZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImRsdC1jOHktaWNvbi1taW51cy1jaXJjbGUgdGV4dC1kYW5nZXJcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IHRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGQoYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMuZm9yYmlkZGVuVXNlckFnZW50cylcIlxuICAgICAgICAgICAgICAqbmdJZj1cImlzTGFzdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZGx0LWM4eS1pY29uLXBsdXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ1RydXN0ZWQgdXNlciBhZ2VudHMnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAge3sgJ1RydXN0ZWQgdXNlciBhZ2VudHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwIG0tdC04XCJcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCB0cnVzdGVkVXNlckFnZW50IG9mIGF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLnRydXN0ZWRVc2VyQWdlbnRzO1xuICAgICAgICAgICAgbGFzdCBhcyBpc0xhc3Q7XG4gICAgICAgICAgICBmaXJzdCBhcyBpc0ZpcnN0XG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW25hbWVdPVwiJ3RydXN0ZWRVc2VyQWdlbnQnICsgdHJ1c3RlZFVzZXJBZ2VudC5pZFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSB0cnVzdGVkLWFnZW50XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZFVzZXJBZ2VudC52YWx1ZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuIGNvbC1zbS0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShpc0ZpcnN0ICYmIGlzTGFzdCAmJiB0cnVzdGVkVXNlckFnZW50LnZhbHVlID09PSAnJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiJ3RydXN0ZWRVc2VyQWdlbnRSZW1vdmUnICsgdHJ1c3RlZFVzZXJBZ2VudC5pZFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IGJ0bi1kb3QtLWRhbmdlciB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidHJ1c3RlZFVzZXJBZ2VudHNSZW1vdmUodHJ1c3RlZFVzZXJBZ2VudC5pZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImRsdC1jOHktaWNvbi1taW51cy1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkKGF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLnRydXN0ZWRVc2VyQWdlbnRzKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgdGV4dC1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0xhc3RcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImRsdC1jOHktaWNvbi1wbHVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19