@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
333 lines • 44.6 kB
JavaScript
import { Component } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { FormlyFormBuilder } from '@ngx-formly/core';
import { Lwm2mBootstrapParametersService } from '@c8y/ngx-components/protocol-lwm2m/services';
import { BindingMode, SecurityMode } from '@c8y/ngx-components/protocol-lwm2m/model';
import { gettext, AlertService, Permissions, CommonModule, CoreModule } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "@ngx-formly/core";
import * as i3 from "@c8y/ngx-components/protocol-lwm2m/services";
import * as i4 from "@angular/router";
import * as i5 from "@angular/forms";
export class Lwm2mBootstrapParametersComponent {
constructor(alertService, permissions, builder, lwm2mBootstrapParametersSvc, route) {
this.alertService = alertService;
this.permissions = permissions;
this.builder = builder;
this.lwm2mBootstrapParametersSvc = lwm2mBootstrapParametersSvc;
this.route = route;
this.form = new FormGroup({});
this.model = {};
this.options = {
formState: {
disabled: false,
mainModel: this.model
}
};
this.writePermissionMissingAlert = {
text: gettext('You do not have write permissions. This form is read-only.'),
type: 'info'
};
this.DISABLED_HINT_TEXT = gettext('Change the security mode to enable this field.');
this.pattern = /^([a-fA-F0-9]{2})+$/;
this.deviceId = this.route?.snapshot?.parent?.params?.id;
}
async ngOnInit() {
const parameters = await this.getBootstrapParameters();
const { bindingMode, bootstrapId, bootstrapKey, bootstrapShortServerId, defaultMaximumPeriod, defaultMinimumPeriod, securityMode, endpoint, generateBootstrapServerConfig, lwm2mShortServerId, serverUri, registrationLifeTime, serverPublicKey, securityInstanceOffset, publicKeyOrId, secretKey } = parameters;
const leftFields = [
{
key: 'endpoint',
id: 'bs-endpoint',
type: 'string',
defaultValue: endpoint,
templateOptions: {
label: gettext('Endpoint'),
placeholder: 'urn:imei:012345678901234',
readonly: true
}
},
{
key: 'securityMode',
id: 'bs-securityMode',
type: 'select',
defaultValue: securityMode || SecurityMode.NO_SEC,
templateOptions: {
label: gettext('Security mode'),
options: [
{ label: SecurityMode.NO_SEC, value: SecurityMode.NO_SEC },
{ label: SecurityMode.PSK, value: SecurityMode.PSK }
],
required: true
}
},
{
key: 'bootstrapId',
id: 'bs-bootstrapId',
type: 'string',
templateOptions: {
label: gettext('Bootstrap PSK ID'),
description: this.DISABLED_HINT_TEXT,
required: true
},
hooks: {
onInit: (field) => {
field.formControl.patchValue(bootstrapId);
}
},
expressionProperties: {
'templateOptions.disabled': (model, formState, field) => this.disablePSKField(formState, field)
}
},
{
key: 'bootstrapKey',
id: 'bs-bootstrapKey',
type: 'string',
templateOptions: {
label: gettext('Bootstrap pre-shared key'),
description: this.DISABLED_HINT_TEXT,
placeholder: '0123456789abcdef',
required: true,
pattern: this.pattern
},
hooks: {
onInit: (field) => {
field.formControl.patchValue(bootstrapKey);
}
},
expressionProperties: {
'templateOptions.disabled': (model, formState, field) => this.disablePSKField(formState, field)
}
},
{
key: 'securityInstanceOffset',
id: 'bs-securityInstanceOffset',
type: 'number',
defaultValue: securityInstanceOffset,
templateOptions: {
label: gettext('Security instance offset'),
placeholder: '0',
min: 0
}
},
{
key: 'bootstrapShortServerId',
id: 'bs-bootstrapShortServerId',
type: 'number',
defaultValue: bootstrapShortServerId,
templateOptions: {
label: gettext('LWM2M bootstrap short server ID'),
placeholder: '0',
min: 0
}
},
{
key: 'registrationLifeTime',
id: 'bs-registrationLifeTime',
type: 'number',
defaultValue: registrationLifeTime,
templateOptions: {
label: gettext('Registration lifetime'),
description: gettext('in seconds'),
placeholder: '600',
min: 0
}
},
{
key: 'bindingMode',
id: 'bs-bindingMode',
type: 'select',
defaultValue: bindingMode || BindingMode.U,
templateOptions: {
label: gettext('Binding mode'),
options: [
{ label: gettext('UDP'), value: BindingMode.U },
{ label: gettext('UDP with queue mode'), value: BindingMode.UQ }
]
}
}
];
const rightFields = [
{
key: 'serverPublicKey',
id: 'bs-serverPublicKey',
type: 'string',
defaultValue: serverPublicKey,
templateOptions: {
label: gettext('Server public key'),
placeholder: 'AAAAB3NzaC1yc2E…'
}
},
{
key: 'serverUri',
id: 'bs-serverUri',
type: 'string',
defaultValue: serverUri,
templateOptions: {
label: gettext('LWM2M server URI'),
placeholder: 'coaps://<LWM2M-server-domain>:<coaps-port>'
}
},
{
key: 'publicKeyOrId',
id: 'bs-publicKeyOrId',
type: 'string',
templateOptions: {
label: gettext('LWM2M PSK ID'),
description: this.DISABLED_HINT_TEXT,
required: true
},
hooks: {
onInit: (field) => {
field.formControl.patchValue(publicKeyOrId);
}
},
expressionProperties: {
'templateOptions.disabled': (model, formState, field) => this.disablePSKField(formState, field)
}
},
{
key: 'secretKey',
id: 'bs-secretKey',
type: 'string',
templateOptions: {
label: gettext('LWM2M pre-shared key'),
description: this.DISABLED_HINT_TEXT,
placeholder: '0123456789abcdef',
required: true,
pattern: this.pattern
},
hooks: {
onInit: (field) => {
field.formControl.patchValue(secretKey);
}
},
expressionProperties: {
'templateOptions.disabled': (model, formState, field) => this.disablePSKField(formState, field)
}
},
{
key: 'lwm2mShortServerId',
id: 'bs-lwm2mShortServerId',
type: 'number',
defaultValue: lwm2mShortServerId,
templateOptions: {
label: gettext('LWM2M short server ID'),
placeholder: '0',
min: 0
}
},
{
key: 'generateBootstrapServerConfig',
id: 'bs-generateBootstrapServerConfig',
type: 'select',
defaultValue: generateBootstrapServerConfig || false,
templateOptions: {
label: gettext('Generate bootstrap server config'),
options: [
{ label: gettext('Yes'), value: true },
{ label: gettext('No'), value: false }
]
}
},
{
key: 'defaultMinimumPeriod',
id: 'bs-defaultMinimumPeriod',
type: 'number',
defaultValue: defaultMinimumPeriod,
templateOptions: {
label: gettext('Default minimum period'),
description: gettext('in seconds'),
placeholder: '10',
min: 0
}
},
{
key: 'defaultMaximumPeriod',
id: 'bs-defaultMaximumPeriod',
type: 'number',
defaultValue: defaultMaximumPeriod,
templateOptions: {
label: gettext('Default maximum period'),
description: gettext('in seconds'),
placeholder: '60',
min: 0
}
}
];
this.fields = [
{
fieldGroupClassName: 'card-block d-grid grid__col--6-6',
fieldGroup: [
{
fieldGroupClassName: 'form-group p-24 p-t-8 p-b-8 m-b-0',
fieldGroup: leftFields
},
{
fieldGroupClassName: 'form-group p-24 p-t-8 p-b-8 m-b-0',
fieldGroup: rightFields
}
]
}
];
this.builder.buildForm(this.form, this.fields, this.model, this.options);
const userHasWritePermission = this.permissions.hasRole(Permissions.ROLE_INVENTORY_ADMIN);
if (Object.keys(parameters).length === 0 || !userHasWritePermission) {
this.form.disable();
this.options.formState.disabled = true;
}
if (!userHasWritePermission) {
this.alertService.info(this.writePermissionMissingAlert.text);
}
}
ngOnDestroy() {
// alertService checks if given alert exists.
// save to remove it without additional checks
this.alertService.remove(this.writePermissionMissingAlert);
}
disablePSKField(formState, field) {
if (formState.disabled) {
delete field.templateOptions.description;
return true;
}
else if (!formState.mainModel.securityMode ||
formState.mainModel.securityMode === SecurityMode.NO_SEC) {
field.templateOptions.description = this.DISABLED_HINT_TEXT;
field.formControl.patchValue(null);
return true;
}
delete field.templateOptions.description;
return false;
}
async save() {
try {
await this.lwm2mBootstrapParametersSvc.update({ ...this.model, ...{ id: this.deviceId } });
this.alertService.success(gettext('Bootstrap parameters updated'));
// disables save button
this.form.markAsPristine();
this.form.updateValueAndValidity();
}
catch (error) {
this.alertService.addServerFailure({ ...error });
}
}
async getBootstrapParameters() {
try {
return (await this.lwm2mBootstrapParametersSvc.detail(this.deviceId))
.data;
}
catch (error) {
this.alertService.addServerFailure({ ...error });
return {};
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mBootstrapParametersComponent, deps: [{ token: i1.AlertService }, { token: i1.Permissions }, { token: i2.FormlyFormBuilder }, { token: i3.Lwm2mBootstrapParametersService }, { token: i4.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: Lwm2mBootstrapParametersComponent, isStandalone: true, selector: "c8y-lwm2m-bootstrap-parameters", ngImport: i0, template: "<form (ngSubmit)=\"save()\">\n <div class=\"card content-fullpage fit-h\">\n <div class=\"card-header separator grid__col--fullspan\">\n <h1 class=\"card-title\">{{ 'LWM2M bootstrap parameters' | translate }}</h1>\n </div>\n <div class=\"inner-scroll\">\n <formly-form\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </div>\n <div\n [hidden]=\"options.formState.disabled\"\n class=\"card-footer separator grid__col--fullspan sticky-bottom\"\n >\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"form.invalid || !form.dirty\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mBootstrapParametersComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-lwm2m-bootstrap-parameters', imports: [CommonModule, CoreModule], standalone: true, template: "<form (ngSubmit)=\"save()\">\n <div class=\"card content-fullpage fit-h\">\n <div class=\"card-header separator grid__col--fullspan\">\n <h1 class=\"card-title\">{{ 'LWM2M bootstrap parameters' | translate }}</h1>\n </div>\n <div class=\"inner-scroll\">\n <formly-form\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </div>\n <div\n [hidden]=\"options.formState.disabled\"\n class=\"card-footer separator grid__col--fullspan sticky-bottom\"\n >\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"form.invalid || !form.dirty\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n</form>\n" }]
}], ctorParameters: () => [{ type: i1.AlertService }, { type: i1.Permissions }, { type: i2.FormlyFormBuilder }, { type: i3.Lwm2mBootstrapParametersService }, { type: i4.ActivatedRoute }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHdtMm0tYm9vdHN0cmFwLXBhcmFtZXRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvdG9jb2wtbHdtMm0vY29tcG9uZW50cy9ib290c3RyYXAtcGFyYW1ldGVycy9sd20ybS1ib290c3RyYXAtcGFyYW1ldGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm90b2NvbC1sd20ybS9jb21wb25lbnRzL2Jvb3RzdHJhcC1wYXJhbWV0ZXJzL2x3bTJtLWJvb3RzdHJhcC1wYXJhbWV0ZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFxQixpQkFBaUIsRUFBcUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RixPQUFPLEVBQ0wsV0FBVyxFQUVYLFlBQVksRUFDYixNQUFNLDBDQUEwQyxDQUFDO0FBQ2xELE9BQU8sRUFDTCxPQUFPLEVBQ1AsWUFBWSxFQUNaLFdBQVcsRUFFWCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7QUFRN0IsTUFBTSxPQUFPLGlDQUFpQztJQXNCNUMsWUFDVSxZQUEwQixFQUMxQixXQUF3QixFQUN4QixPQUEwQixFQUMxQiwyQkFBNEQsRUFDNUQsS0FBcUI7UUFKckIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDMUIsZ0NBQTJCLEdBQTNCLDJCQUEyQixDQUFpQztRQUM1RCxVQUFLLEdB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QjtZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCO1FBQzFCLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNsRSxJQUFnQyxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNqRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDOytHQW5XVSxpQ0FBaUM7bUdBQWpDLGlDQUFpQywwRkN6QjlDLHMwQkE0QkEsMkNETlksWUFBWSw4RkFBRSxVQUFVOzs0RkFHdkIsaUNBQWlDO2tCQU43QyxTQUFTOytCQUNFLGdDQUFnQyxXQUVqQyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsY0FDdkIsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEZvcm1seUZpZWxkQ29uZmlnLCBGb3JtbHlGb3JtQnVpbGRlciwgRm9ybWx5Rm9ybU9wdGlvbnMgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEx3bTJtQm9vdHN0cmFwUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3Byb3RvY29sLWx3bTJtL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIEJpbmRpbmdNb2RlLFxuICBMd20ybUJvb3RzdHJhcFBhcmFtZXRlcnMsXG4gIFNlY3VyaXR5TW9kZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3Byb3RvY29sLWx3bTJtL21vZGVsJztcbmltcG9ydCB7XG4gIGdldHRleHQsXG4gIEFsZXJ0U2VydmljZSxcbiAgUGVybWlzc2lvbnMsXG4gIEFsZXJ0LFxuICBDb21tb25Nb2R1bGUsXG4gIENvcmVNb2R1bGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1sd20ybS1ib290c3RyYXAtcGFyYW1ldGVycycsXG4gIHRlbXBsYXRlVXJsOiAnLi9sd20ybS1ib290c3RyYXAtcGFyYW1ldGVycy5jb21wb25lbnQuaHRtbCcsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENvcmVNb2R1bGVdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEx3bTJtQm9vdHN0cmFwUGFyYW1ldGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICBmb3JtOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgbW9kZWwgPSB7fTtcbiAgb3B0aW9uczogRm9ybWx5Rm9ybU9wdGlvbnMgPSB7XG4gICAgZm9ybVN0YXRlOiB7XG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBtYWluTW9kZWw6IHRoaXMubW9kZWxcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3cml0ZVBlcm1pc3Npb25NaXNzaW5nQWxlcnQ6IEFsZXJ0ID0ge1xuICAgIHRleHQ6IGdldHRleHQoJ1lvdSBkbyBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9ucy4gVGhpcyBmb3JtIGlzIHJlYWQtb25seS4nKSxcbiAgICB0eXBlOiAnaW5mbydcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IERJU0FCTEVEX0hJTlRfVEVYVDogc3RyaW5nID0gZ2V0dGV4dChcbiAgICAnQ2hhbmdlIHRoZSBzZWN1cml0eSBtb2RlIHRvIGVuYWJsZSB0aGlzIGZpZWxkLidcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXR0ZXJuOiBSZWdFeHAgPSAvXihbYS1mQS1GMC05XXsyfSkrJC87XG4gIHByaXZhdGUgZGV2aWNlSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25zLFxuICAgIHByaXZhdGUgYnVpbGRlcjogRm9ybWx5Rm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBsd20ybUJvb3RzdHJhcFBhcmFtZXRlcnNTdmM6IEx3bTJtQm9vdHN0cmFwUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG4gICAgdGhpcy5kZXZpY2VJZCA9IHRoaXMucm91dGU/LnNuYXBzaG90Py5wYXJlbnQ/LnBhcmFtcz8uaWQ7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBMd20ybUJvb3RzdHJhcFBhcmFtZXRlcnMgPSBhd2FpdCB0aGlzLmdldEJvb3RzdHJhcFBhcmFtZXRlcnMoKTtcbiAgICBjb25zdCB7XG4gICAgICBiaW5kaW5nTW9kZSxcbiAgICAgIGJvb3RzdHJhcElkLFxuICAgICAgYm9vdHN0cmFwS2V5LFxuICAgICAgYm9vdHN0cmFwU2hvcnRTZXJ2ZXJJZCxcbiAgICAgIGRlZmF1bHRNYXhpbXVtUGVyaW9kLFxuICAgICAgZGVmYXVsdE1pbmltdW1QZXJpb2QsXG4gICAgICBzZWN1cml0eU1vZGUsXG4gICAgICBlbmRwb2ludCxcbiAgICAgIGdlbmVyYXRlQm9vdHN0cmFwU2VydmVyQ29uZmlnLFxuICAgICAgbHdtMm1TaG9ydFNlcnZlcklkLFxuICAgICAgc2VydmVyVXJpLFxuICAgICAgcmVnaXN0cmF0aW9uTGlmZVRpbWUsXG4gICAgICBzZXJ2ZXJQdWJsaWNLZXksXG4gICAgICBzZWN1cml0eUluc3RhbmNlT2Zmc2V0LFxuICAgICAgcHVibGljS2V5T3JJZCxcbiAgICAgIHNlY3JldEtleVxuICAgIH06IEx3bTJtQm9vdHN0cmFwUGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG5cbiAgICBjb25zdCBsZWZ0RmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW1xuICAgICAge1xuICAgICAgICBrZXk6ICdlbmRwb2ludCcsXG4gICAgICAgIGlkOiAnYnMtZW5kcG9pbnQnLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBlbmRwb2ludCxcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0VuZHBvaW50JyksXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICd1cm46aW1laTowMTIzNDU2Nzg5MDEyMzQnLFxuICAgICAgICAgIHJlYWRvbmx5OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NlY3VyaXR5TW9kZScsXG4gICAgICAgIGlkOiAnYnMtc2VjdXJpdHlNb2RlJyxcbiAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogc2VjdXJpdHlNb2RlIHx8IFNlY3VyaXR5TW9kZS5OT19TRUMsXG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdTZWN1cml0eSBtb2RlJyksXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogU2VjdXJpdHlNb2RlLk5PX1NFQywgdmFsdWU6IFNlY3VyaXR5TW9kZS5OT19TRUMgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6IFNlY3VyaXR5TW9kZS5QU0ssIHZhbHVlOiBTZWN1cml0eU1vZGUuUFNLIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2Jvb3RzdHJhcElkJyxcbiAgICAgICAgaWQ6ICdicy1ib290c3RyYXBJZCcsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB0ZW1wbGF0ZU9wdGlvbnM6IHtcbiAgICAgICAgICBsYWJlbDogZ2V0dGV4dCgnQm9vdHN0cmFwIFBTSyBJRCcpLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLkRJU0FCTEVEX0hJTlRfVEVYVCxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBob29rczoge1xuICAgICAgICAgIG9uSW5pdDogKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShib290c3RyYXBJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBleHByZXNzaW9uUHJvcGVydGllczoge1xuICAgICAgICAgICd0ZW1wbGF0ZU9wdGlvbnMuZGlzYWJsZWQnOiAobW9kZWw6IGFueSwgZm9ybVN0YXRlOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT5cbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVBTS0ZpZWxkKGZvcm1TdGF0ZSwgZmllbGQpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2Jvb3RzdHJhcEtleScsXG4gICAgICAgIGlkOiAnYnMtYm9vdHN0cmFwS2V5JyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdCb290c3RyYXAgcHJlLXNoYXJlZCBrZXknKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5ESVNBQkxFRF9ISU5UX1RFWFQsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICcwMTIzNDU2Nzg5YWJjZGVmJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBwYXR0ZXJuOiB0aGlzLnBhdHRlcm5cbiAgICAgICAgfSxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICBvbkluaXQ6IChmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgIGZpZWxkLmZvcm1Db250cm9sLnBhdGNoVmFsdWUoYm9vdHN0cmFwS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV4cHJlc3Npb25Qcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgJ3RlbXBsYXRlT3B0aW9ucy5kaXNhYmxlZCc6IChtb2RlbDogYW55LCBmb3JtU3RhdGU6IGFueSwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PlxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlUFNLRmllbGQoZm9ybVN0YXRlLCBmaWVsZClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2VjdXJpdHlJbnN0YW5jZU9mZnNldCcsXG4gICAgICAgIGlkOiAnYnMtc2VjdXJpdHlJbnN0YW5jZU9mZnNldCcsXG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHNlY3VyaXR5SW5zdGFuY2VPZmZzZXQsXG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdTZWN1cml0eSBpbnN0YW5jZSBvZmZzZXQnKSxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJzAnLFxuICAgICAgICAgIG1pbjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdib290c3RyYXBTaG9ydFNlcnZlcklkJyxcbiAgICAgICAgaWQ6ICdicy1ib290c3RyYXBTaG9ydFNlcnZlcklkJyxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogYm9vdHN0cmFwU2hvcnRTZXJ2ZXJJZCxcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0xXTTJNIGJvb3RzdHJhcCBzaG9ydCBzZXJ2ZXIgSUQnKSxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJzAnLFxuICAgICAgICAgIG1pbjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZWdpc3RyYXRpb25MaWZlVGltZScsXG4gICAgICAgIGlkOiAnYnMtcmVnaXN0cmF0aW9uTGlmZVRpbWUnLFxuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiByZWdpc3RyYXRpb25MaWZlVGltZSxcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgbGFiZWw6IGdldHRleHQoJ1JlZ2lzdHJhdGlvbiBsaWZldGltZScpLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdpbiBzZWNvbmRzJyksXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICc2MDAnLFxuICAgICAgICAgIG1pbjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdiaW5kaW5nTW9kZScsXG4gICAgICAgIGlkOiAnYnMtYmluZGluZ01vZGUnLFxuICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBiaW5kaW5nTW9kZSB8fCBCaW5kaW5nTW9kZS5VLFxuICAgICAgICB0ZW1wbGF0ZU9wdGlvbnM6IHtcbiAgICAgICAgICBsYWJlbDogZ2V0dGV4dCgnQmluZGluZyBtb2RlJyksXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogZ2V0dGV4dCgnVURQJyksIHZhbHVlOiBCaW5kaW5nTW9kZS5VIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiBnZXR0ZXh0KCdVRFAgd2l0aCBxdWV1ZSBtb2RlJyksIHZhbHVlOiBCaW5kaW5nTW9kZS5VUSB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXTtcblxuICAgIGNvbnN0IHJpZ2h0RmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW1xuICAgICAge1xuICAgICAgICBrZXk6ICdzZXJ2ZXJQdWJsaWNLZXknLFxuICAgICAgICBpZDogJ2JzLXNlcnZlclB1YmxpY0tleScsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHNlcnZlclB1YmxpY0tleSxcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgbGFiZWw6IGdldHRleHQoJ1NlcnZlciBwdWJsaWMga2V5JyksXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdBQUFBQjNOemFDMXljMkXigKYnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NlcnZlclVyaScsXG4gICAgICAgIGlkOiAnYnMtc2VydmVyVXJpJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogc2VydmVyVXJpLFxuICAgICAgICB0ZW1wbGF0ZU9wdGlvbnM6IHtcbiAgICAgICAgICBsYWJlbDogZ2V0dGV4dCgnTFdNMk0gc2VydmVyIFVSSScpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnY29hcHM6Ly88TFdNMk0tc2VydmVyLWRvbWFpbj46PGNvYXBzLXBvcnQ+J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdwdWJsaWNLZXlPcklkJyxcbiAgICAgICAgaWQ6ICdicy1wdWJsaWNLZXlPcklkJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdMV00yTSBQU0sgSUQnKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5ESVNBQkxFRF9ISU5UX1RFWFQsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICBvbkluaXQ6IChmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgIGZpZWxkLmZvcm1Db250cm9sLnBhdGNoVmFsdWUocHVibGljS2V5T3JJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBleHByZXNzaW9uUHJvcGVydGllczoge1xuICAgICAgICAgICd0ZW1wbGF0ZU9wdGlvbnMuZGlzYWJsZWQnOiAobW9kZWw6IGFueSwgZm9ybVN0YXRlOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT5cbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVBTS0ZpZWxkKGZvcm1TdGF0ZSwgZmllbGQpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NlY3JldEtleScsXG4gICAgICAgIGlkOiAnYnMtc2VjcmV0S2V5JyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczoge1xuICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdMV00yTSBwcmUtc2hhcmVkIGtleScpLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLkRJU0FCTEVEX0hJTlRfVEVYVCxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJzAxMjM0NTY3ODlhYmNkZWYnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHBhdHRlcm46IHRoaXMucGF0dGVyblxuICAgICAgICB9LFxuICAgICAgICBob29rczoge1xuICAgICAgICAgIG9uSW5pdDogKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShzZWNyZXRLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXhwcmVzc2lvblByb3BlcnRpZXM6IHtcbiAgICAgICAgICAndGVtcGxhdGVPcHRpb25zLmRpc2FibGVkJzogKG1vZGVsOiBhbnksIGZvcm1TdGF0ZTogYW55LCBmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQU0tGaWVsZChmb3JtU3RhdGUsIGZpZWxkKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdsd20ybVNob3J0U2VydmVySWQnLFxuICAgICAgICBpZDogJ2JzLWx3bTJtU2hvcnRTZXJ2ZXJJZCcsXG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGx3bTJtU2hvcnRTZXJ2ZXJJZCxcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0xXTTJNIHNob3J0IHNlcnZlciBJRCcpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnMCcsXG4gICAgICAgICAgbWluOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2dlbmVyYXRlQm9vdHN0cmFwU2VydmVyQ29uZmlnJyxcbiAgICAgICAgaWQ6ICdicy1nZW5lcmF0ZUJvb3RzdHJhcFNlcnZlckNvbmZpZycsXG4gICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdlbmVyYXRlQm9vdHN0cmFwU2VydmVyQ29uZmlnIHx8IGZhbHNlLFxuICAgICAgICB0ZW1wbGF0ZU9wdGlvbnM6IHtcbiAgICAgICAgICBsYWJlbDogZ2V0dGV4dCgnR2VuZXJhdGUgYm9vdHN0cmFwIHNlcnZlciBjb25maWcnKSxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiBnZXR0ZXh0KCdZZXMnKSwgdmFsdWU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6IGdldHRleHQoJ05vJyksIHZhbHVlOiBmYWxzZSB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkZWZhdWx0TWluaW11bVBlcmlvZCcsXG4gICAgICAgIGlkOiAnYnMtZGVmYXVsdE1pbmltdW1QZXJpb2QnLFxuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0TWluaW11bVBlcmlvZCxcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0RlZmF1bHQgbWluaW11bSBwZXJpb2QnKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnaW4gc2Vjb25kcycpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnMTAnLFxuICAgICAgICAgIG1pbjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkZWZhdWx0TWF4aW11bVBlcmlvZCcsXG4gICAgICAgIGlkOiAnYnMtZGVmYXVsdE1heGltdW1QZXJpb2QnLFxuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0TWF4aW11bVBlcmlvZCxcbiAgICAgICAgdGVtcGxhdGVPcHRpb25zOiB7XG4gICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0RlZmF1bHQgbWF4aW11bSBwZXJpb2QnKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnaW4gc2Vjb25kcycpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnNjAnLFxuICAgICAgICAgIG1pbjogMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgXTtcblxuICAgIHRoaXMuZmllbGRzID0gW1xuICAgICAge1xuICAgICAgICBmaWVsZEdyb3VwQ2xhc3NOYW1lOiAnY2FyZC1ibG9jayBkLWdyaWQgZ3JpZF9fY29sLS02LTYnLFxuICAgICAgICBmaWVsZEdyb3VwOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmllbGRHcm91cENsYXNzTmFtZTogJ2Zvcm0tZ3JvdXAgcC0yNCBwLXQtOCBwLWItOCBtLWItMCcsXG4gICAgICAgICAgICBmaWVsZEdyb3VwOiBsZWZ0RmllbGRzXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZEdyb3VwQ2xhc3NOYW1lOiAnZm9ybS1ncm91cCBwLTI0IHAtdC04IHAtYi04IG0tYi0wJyxcbiAgICAgICAgICAgIGZpZWxkR3JvdXA6IHJpZ2h0RmllbGRzXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXTtcblxuICAgIHRoaXMuYnVpbGRlci5idWlsZEZvcm0odGhpcy5mb3JtLCB0aGlzLmZpZWxkcywgdGhpcy5tb2RlbCwgdGhpcy5vcHRpb25zKTtcblxuICAgIGNvbnN0IHVzZXJIYXNXcml0ZVBlcm1pc3Npb24gPSB0aGlzLnBlcm1pc3Npb25zLmhhc1JvbGUoUGVybWlzc2lvbnMuUk9MRV9JTlZFTlRPUllfQURNSU4pO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA9PT0gMCB8fCAhdXNlckhhc1dyaXRlUGVybWlzc2lvbikge1xuICAgICAgdGhpcy5mb3JtLmRpc2FibGUoKTtcblxuICAgICAgdGhpcy5vcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VySGFzV3JpdGVQZXJtaXNzaW9uKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5pbmZvKHRoaXMud3JpdGVQZXJtaXNzaW9uTWlzc2luZ0FsZXJ0LnRleHQgYXMgc3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBhbGVydFNlcnZpY2UgY2hlY2tzIGlmIGdpdmVuIGFsZXJ0IGV4aXN0cy5cbiAgICAvLyBzYXZlIHRvIHJlbW92ZSBpdCB3aXRob3V0IGFkZGl0aW9uYWwgY2hlY2tzXG4gICAgdGhpcy5hbGVydFNlcnZpY2UucmVtb3ZlKHRoaXMud3JpdGVQZXJtaXNzaW9uTWlzc2luZ0FsZXJ0KTtcbiAgfVxuXG4gIGRpc2FibGVQU0tGaWVsZChcbiAgICBmb3JtU3RhdGU6IHsgZGlzYWJsZWQ6IGJvb2xlYW47IG1haW5Nb2RlbDogTHdtMm1Cb290c3RyYXBQYXJhbWV0ZXJzIH0sXG4gICAgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnXG4gICkge1xuICAgIGlmIChmb3JtU3RhdGUuZGlzYWJsZWQpIHtcbiAgICAgIGRlbGV0ZSBmaWVsZC50ZW1wbGF0ZU9wdGlvbnMuZGVzY3JpcHRpb247XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgIWZvcm1TdGF0ZS5tYWluTW9kZWwuc2VjdXJpdHlNb2RlIHx8XG4gICAgICBmb3JtU3RhdGUubWFpbk1vZGVsLnNlY3VyaXR5TW9kZSA9PT0gU2VjdXJpdHlNb2RlLk5PX1NFQ1xuICAgICkge1xuICAgICAgZmllbGQudGVtcGxhdGVPcHRpb25zLmRlc2NyaXB0aW9uID0gdGhpcy5ESVNBQkxFRF9ISU5UX1RFWFQ7XG4gICAgICBmaWVsZC5mb3JtQ29udHJvbC5wYXRjaFZhbHVlKG51bGwpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlbGV0ZSBmaWVsZC50ZW1wbGF0ZU9wdGlvbnMuZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5sd20ybUJvb3RzdHJhcFBhcmFtZXRlcnNTdmMudXBkYXRlKHsgLi4udGhpcy5tb2RlbCwgLi4ueyBpZDogdGhpcy5kZXZpY2VJZCB9IH0pO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdCb290c3RyYXAgcGFyYW1ldGVycyB1cGRhdGVkJykpO1xuICAgICAgLy8gZGlzYWJsZXMgc2F2ZSBidXR0b25cbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZSh7IC4uLmVycm9yIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEJvb3RzdHJhcFBhcmFtZXRlcnMoKTogUHJvbWlzZTxMd20ybUJvb3RzdHJhcFBhcmFtZXRlcnM+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmx3bTJtQm9vdHN0cmFwUGFyYW1ldGVyc1N2Yy5kZXRhaWwodGhpcy5kZXZpY2VJZCkpXG4gICAgICAgIC5kYXRhIGFzIEx3bTJtQm9vdHN0cmFwUGFyYW1ldGVycztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZSh7IC4uLmVycm9yIH0pO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxufVxuIiwiPGZvcm0gKG5nU3VibWl0KT1cInNhdmUoKVwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZCBjb250ZW50LWZ1bGxwYWdlIGZpdC1oXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHNlcGFyYXRvciBncmlkX19jb2wtLWZ1bGxzcGFuXCI+XG4gICAgICA8aDEgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgJ0xXTTJNIGJvb3RzdHJhcCBwYXJhbWV0ZXJzJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbFwiPlxuICAgICAgPGZvcm1seS1mb3JtXG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgICBbZmllbGRzXT1cImZpZWxkc1wiXG4gICAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgPjwvZm9ybWx5LWZvcm0+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgW2hpZGRlbl09XCJvcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZFwiXG4gICAgICBjbGFzcz1cImNhcmQtZm9vdGVyIHNlcGFyYXRvciBncmlkX19jb2wtLWZ1bGxzcGFuIHN0aWNreS1ib3R0b21cIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkIHx8ICFmb3JtLmRpcnR5XCJcbiAgICAgID5cbiAgICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=