@c8y/ngx-components 1021.74.0 → 1021.75.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/register-device/general/general-device-registration.component.mjs +10 -4
- package/fesm2022/c8y-ngx-components-register-device.mjs +9 -3
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/locales/de.po +3 -0
- package/locales/es.po +3 -0
- package/locales/fr.po +3 -0
- package/locales/ja_JP.po +3 -0
- package/locales/ko.po +3 -0
- package/locales/locales.pot +3 -0
- package/locales/nl.po +3 -0
- package/locales/pl.po +3 -0
- package/locales/pt_BR.po +3 -0
- package/locales/zh_CN.po +3 -0
- package/locales/zh_TW.po +3 -0
- package/package.json +1 -1
- package/register-device/general/general-device-registration.component.d.ts.map +1 -1
|
@@ -275,8 +275,14 @@ export class GeneralDeviceRegistrationComponent {
|
|
|
275
275
|
TENANT: el.tenant?.id || ''
|
|
276
276
|
};
|
|
277
277
|
});
|
|
278
|
+
const escapeValue = (value) => {
|
|
279
|
+
if (value.includes(';') || value.includes('"')) {
|
|
280
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
281
|
+
}
|
|
282
|
+
return value;
|
|
283
|
+
};
|
|
278
284
|
const csvRows = dataToSend
|
|
279
|
-
.map(row => fullCsvHeaders.map(header => row[header] ?? '').join(';'))
|
|
285
|
+
.map(row => fullCsvHeaders.map(header => escapeValue(row[header] ?? '')).join(';'))
|
|
280
286
|
.join('\n');
|
|
281
287
|
const csvContent = csvHeaders + csvRows;
|
|
282
288
|
const blob = new Blob([csvContent], { type: 'text/csv' });
|
|
@@ -292,7 +298,7 @@ export class GeneralDeviceRegistrationComponent {
|
|
|
292
298
|
return defer(() => from(this.inventoryService.listQuery({ __filter: { __has: 'c8y_IsDeviceGroup' }, __orderby: [{ name: 1 }] }, { ...this.FILTER }))).pipe(shareReplay(1));
|
|
293
299
|
}
|
|
294
300
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GeneralDeviceRegistrationComponent, deps: [{ token: i1.TenantUiService }, { token: i2.TenantService }, { token: i3.RegisterDeviceService }, { token: i2.InventoryService }, { token: i0.ChangeDetectorRef }, { token: i4.BsModalRef }, { token: i1.GainsightService }, { token: i2.DeviceRegistrationBulkService }, { token: i1.FeatureCacheService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
295
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeneralDeviceRegistrationComponent, selector: "c8y-general-device-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i5.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i8.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i9.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
301
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeneralDeviceRegistrationComponent, selector: "c8y-general-device-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n data-cy=\"device-registration-failure-message\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i5.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i8.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i9.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
296
302
|
}
|
|
297
303
|
__decorate([
|
|
298
304
|
memoize(),
|
|
@@ -314,6 +320,6 @@ __decorate([
|
|
|
314
320
|
], GeneralDeviceRegistrationComponent.prototype, "getGroups$", null);
|
|
315
321
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GeneralDeviceRegistrationComponent, decorators: [{
|
|
316
322
|
type: Component,
|
|
317
|
-
args: [{ selector: 'c8y-general-device-registration', changeDetection: ChangeDetectionStrategy.OnPush, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
323
|
+
args: [{ selector: 'c8y-general-device-registration', changeDetection: ChangeDetectionStrategy.OnPush, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n data-cy=\"device-registration-failure-message\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
318
324
|
}], ctorParameters: () => [{ type: i1.TenantUiService }, { type: i2.TenantService }, { type: i3.RegisterDeviceService }, { type: i2.InventoryService }, { type: i0.ChangeDetectorRef }, { type: i4.BsModalRef }, { type: i1.GainsightService }, { type: i2.DeviceRegistrationBulkService }, { type: i1.FeatureCacheService }], propDecorators: { canLoadTenants$: [], getTenants$: [], getGroups$: [] } });
|
|
319
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1kZXZpY2UtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlZ2lzdGVyLWRldmljZS9nZW5lcmFsL2dlbmVyYWwtZGV2aWNlLXJlZ2lzdHJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9yZWdpc3Rlci1kZXZpY2UvZ2VuZXJhbC9nZW5lcmFsLWRldmljZS1yZWdpc3RyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLE9BQU8sRUFFUCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBMEIsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQ0wsNkJBQTZCLEVBRTdCLGdCQUFnQixFQUdoQixhQUFhLEVBQ2QsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7Ozs7QUFjakYsTUFBTSxPQUFPLGtDQUFrQztJQWdMN0MsWUFDVSxlQUFnQyxFQUNoQyxhQUE0QixF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QztJQUdPLFVBQVU7UUFDaEIsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQ2hCLElBQUksQ0FDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUM3QixFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFDdEUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDbkIsQ0FDRixDQUNGLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7K0dBcFZVLGtDQUFrQzttR0FBbEMsa0NBQWtDLHVFQzVDL0MseW9OQThMQTs7QUQrS1U7SUFEUCxPQUFPLEVBQUU7OztvQ0FDaUIsVUFBVTt5RUFFcEM7QUFHTztJQURQLE9BQU8sRUFBRTs7O29DQUNhLFVBQVU7cUVBRWhDO0FBR087SUFEUCxPQUFPLEVBQUU7OztvQ0FDWSxVQUFVO29FQVMvQjs0RkFwVlUsa0NBQWtDO2tCQUw5QyxTQUFTOytCQUNFLGlDQUFpQyxtQkFFMUIsdUJBQXVCLENBQUMsTUFBTTt5VkFtVXZDLGVBQWUsTUFLZixXQUFXLE1BS1gsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtbHlGaWVsZENvbmZpZywgRm9ybWx5Rm9ybU9wdGlvbnMgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7XG4gIFRlbmFudFVpU2VydmljZSxcbiAgZ2V0dGV4dCxcbiAgQzh5U3RlcHBlcixcbiAgbWVtb2l6ZSxcbiAgR2FpbnNpZ2h0U2VydmljZSxcbiAgRmVhdHVyZUNhY2hlU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIFN1YmplY3QsIGRlZmVyLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEZXZpY2VSZWdpc3RyYXRpb25CdWxrU2VydmljZSxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElSZXN1bHRMaXN0LFxuICBJVGVuYW50LFxuICBUZW5hbnRTZXJ2aWNlXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFJlZ2lzdGVyRGV2aWNlU2VydmljZSB9IGZyb20gJy4uL3JlZ2lzdGVyLWRldmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IENka1N0ZXAgfSBmcm9tICdAYW5ndWxhci9jZGsvc3RlcHBlcic7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBFU1RDc3ZIZWFkZXJzIH0gZnJvbSAnLi4vYnVsay9idWxrLWRldmljZS1yZWdpc3RyYXRpb24tbW9kYWwuY29tcG9uZW50JztcblxuaW50ZXJmYWNlIEdlbmVyYWxEZXZpY2VSZWdpc3RyYXRpb25Nb2RlbFR5cGUge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnQ/OiB7IGlkOiBzdHJpbmcgfTtcbiAgZ3JvdXA/OiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfTtcbiAgb25lVGltZVBhc3N3b3JkPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZ2VuZXJhbC1kZXZpY2UtcmVnaXN0cmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICdnZW5lcmFsLWRldmljZS1yZWdpc3RyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmFsRGV2aWNlUmVnaXN0cmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgTUFOQUdFTUVOVCA9ICdtYW5hZ2VtZW50JztcbiAgcmVhZG9ubHkgRklMVEVSOiBvYmplY3QgPSB7XG4gICAgd2l0aFRvdGFsUGFnZXM6IHRydWUsXG4gICAgcGFnZVNpemU6IDI1XG4gIH07XG5cbiAgdXNlRVNUJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBjZXJ0aWZpY2F0ZUF1dGhvcml0eUZlYXR1cmVFbmFibGVkID1cbiAgICB0aGlzLmZlYXR1cmVDYWNoZVNlcnZpY2UuZ2V0RmVhdHVyZVN0YXRlKCdjZXJ0aWZpY2F0ZS1hdXRob3JpdHknKTtcblxuICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIG1vZGVsID0ge1xuICAgIGRldmljZXNUb0NyZWF0ZTogW3t9IGFzIEdlbmVyYWxEZXZpY2VSZWdpc3RyYXRpb25Nb2RlbFR5cGVdXG4gIH07XG4gIG9wdGlvbnM6IEZvcm1seUZvcm1PcHRpb25zID0ge1xuICAgIGZvcm1TdGF0ZToge1xuICAgICAgY2FuTG9hZFRlbmFudHM6IHRydWUsXG4gICAgICB1c2VFU1Q6IHRoaXMudXNlRVNUJC5nZXRWYWx1ZSgpXG4gICAgfVxuICB9O1xuXG4gIFBST0RVQ1RfRVhQRVJJRU5DRSA9IHtcbiAgICBFVkVOVDogJ2RldmljZVJlZ2lzdHJhdGlvbicsXG4gICAgQ09NUE9ORU5UOiAnc2luZ2xlLWdlbmVyYWwtcmVnaXN0cmF0aW9uJyxcbiAgICBSRVNVTFQ6IHsgU1VDQ0VTUzogJ3JlZ2lzdHJhdGlvblN1Y2Nlc3MnLCBGQUlMVVJFOiAncmVnaXN0cmF0aW9uRmFpbHVyZScgfVxuICB9O1xuXG4gIGlzTG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHN1Y2Nlc3M6IHsgaWQ6IHN0cmluZyB9W10gPSBbXTtcbiAgZmFpbGVkOiB7IGlkOiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmc7IGRldGFpbHM/OiBhbnkgfVtdID0gW107XG5cbiAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBrZXk6ICdkZXZpY2VzVG9DcmVhdGUnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYWRkVGV4dDogZ2V0dGV4dCgnQWRkIGRldmljZScpLFxuICAgICAgICBhZGRUZXh0RGF0YUN5OiAnYWRkLWRldmljZSdcbiAgICAgIH0sXG4gICAgICBmaWVsZEFycmF5OiB7XG4gICAgICAgIGZpZWxkR3JvdXA6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdpZCcsXG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICcwMTIzYWIzMmZjZCcsXG4gICAgICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdEZXZpY2UgSUQnKSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgIHVuaXF1ZToge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSAoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucm9vdC5nZXQoJ2RldmljZXNUb0NyZWF0ZScpIGFzIEZvcm1BcnJheTxcbiAgICAgICAgICAgICAgICAgICAgICBGb3JtR3JvdXA8eyBpZDogRm9ybUNvbnRyb2w8c3RyaW5nPiB9PlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICApLmNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZWwgPT4gZWwuY29udHJvbHMuaWQpXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKGVsID0+IGVsICE9PSBjb250cm9sICYmIGVsLnZhbHVlID09PSBjb250cm9sLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhZm91bmQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAoKSA9PiBnZXR0ZXh0KCdEZXZpY2UgSUQgZHVwbGljYXRlcyBhcmUgbm90IGFsbG93ZWQnKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICd0ZW5hbnQnLFxuICAgICAgICAgICAgdHlwZTogJ3R5cGVhaGVhZCcsXG4gICAgICAgICAgICBleHByZXNzaW9uczoge1xuICAgICAgICAgICAgICBoaWRlOiBmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybVN0YXRlID0gZmllbGQub3B0aW9ucz8uZm9ybVN0YXRlO1xuICAgICAgICAgICAgICAgIGlmICghZm9ybVN0YXRlPy5jYW5Mb2FkVGVuYW50cykge1xuICAgICAgICAgICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhZm9ybVN0YXRlPy5jYW5Mb2FkVGVuYW50cyB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogeyBpZDogdGhpcy5NQU5BR0VNRU5UIH0sXG4gICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICBsYWJlbDogZ2V0dGV4dCgnQWRkIHRvIHRlbmFudCcpLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgYzh5Rm9yT3B0aW9uczogdGhpcy5jYW5Mb2FkVGVuYW50cyQoKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihjYW5Mb2FkID0+IGNhbkxvYWQpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldFRlbmFudHMkKCkpXG4gICAgICAgICAgICAgICkgYXMgT2JzZXJ2YWJsZTxJUmVzdWx0TGlzdDxJVGVuYW50Pj4sXG4gICAgICAgICAgICAgIGNvbnRhaW5lcjogJ2JvZHknLFxuICAgICAgICAgICAgICBkaXNwbGF5UHJvcGVydHk6ICdpZCcsXG4gICAgICAgICAgICAgIHZhbHVlUHJvcGVydGllczogWydpZCddXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgICAgb25Jbml0OiBfZmllbGQgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmNhbkxvYWRUZW5hbnRzJCgpLnBpcGUoXG4gICAgICAgICAgICAgICAgICB0YXAoY2FuTG9hZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtU3RhdGUuY2FuTG9hZFRlbmFudHMgPSBjYW5Mb2FkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnZ3JvdXAnLFxuICAgICAgICAgICAgdHlwZTogJ3R5cGVhaGVhZCcsXG4gICAgICAgICAgICBleHByZXNzaW9uczoge1xuICAgICAgICAgICAgICAncHJvcHMuZGlzYWJsZWQnOiAoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybVN0YXRlID0gZmllbGQub3B0aW9ucz8uZm9ybVN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gZmllbGQubW9kZWw7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1TdGF0ZT8uY2FuTG9hZFRlbmFudHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChtb2RlbD8udGVuYW50Py5pZCAhPT0gdGhpcy5NQU5BR0VNRU5UKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuICEobW9kZWw/LnRlbmFudD8uaWQgPT09IHRoaXMuTUFOQUdFTUVOVCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZD8ucHJvcHM/LmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0FkZCB0byBncm91cCcpLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dChcbiAgICAgICAgICAgICAgICAnWW91IGNhbiBhZGQgZGV2aWNlIHRvIHNwZWNpZmljIGdyb3VwIGZvciBtYW5hZ2VtZW50IHRlbmFudCBvbmx5LidcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgY29udGFpbmVyOiAnYm9keScsXG4gICAgICAgICAgICAgIGRpc3BsYXlQcm9wZXJ0eTogJ25hbWUnLFxuICAgICAgICAgICAgICB2YWx1ZVByb3BlcnRpZXM6IFsnaWQnXSxcbiAgICAgICAgICAgICAgYzh5Rm9yT3B0aW9uczogdGhpcy5nZXRHcm91cHMkKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rczoge1xuICAgICAgICAgICAgICBvbkluaXQ6IF9maWVsZCA9PlxuICAgICAgICAgICAgICAgIHRoaXMuY2FuTG9hZFRlbmFudHMkKCkucGlwZShcbiAgICAgICAgICAgICAgICAgIHRhcChjYW5Mb2FkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvcm1TdGF0ZS5jYW5Mb2FkVGVuYW50cyA9IGNhbkxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdvbmVUaW1lUGFzc3dvcmQnLFxuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBleHByZXNzaW9uczoge1xuICAgICAgICAgICAgICBoaWRlOiBmaWVsZCA9PiAhZmllbGQub3B0aW9ucz8uZm9ybVN0YXRlPy51c2VFU1RcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1RydUROM0g0NUwwJyxcbiAgICAgICAgICAgICAgbGFiZWw6IGdldHRleHQoJ09uZS10aW1lIHBhc3N3b3JkJyksXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgICAgb25Jbml0OiBfZmllbGQgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnVzZUVTVCQucGlwZShcbiAgICAgICAgICAgICAgICAgIHRhcCh1c2VFU1QgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybVN0YXRlLnVzZUVTVCA9IHVzZUVTVDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9XG4gIF07XG5cbiAgcmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMub25TdWNjZXNzZnVsQ2xvc2luZyA9IHJlc29sdmU7XG4gICAgdGhpcy5vbkNhbmNlbCA9IHJlamVjdDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvblN1Y2Nlc3NmdWxDbG9zaW5nOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIG9uQ2FuY2VsOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIGxhc3RDcmVhdGVkRGV2aWNlczogR2VuZXJhbERldmljZVJlZ2lzdHJhdGlvbk1vZGVsVHlwZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0ZW5hbnRVSVNlcnZpY2U6IFRlbmFudFVpU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFNlcnZpY2U6IFRlbmFudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWdpc3RlckRldmljZVNlcnZpY2U6IFJlZ2lzdGVyRGV2aWNlU2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGV2aWNlUmVnaXN0cmF0aW9uU2VydmljZTogRGV2aWNlUmVnaXN0cmF0aW9uQnVsa1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmZWF0dXJlQ2FjaGVTZXJ2aWNlOiBGZWF0dXJlQ2FjaGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuaXNMb2FkaW5nJCA9IHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmxvYWRpbmckO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcmVnaXN0ZXJEZXZpY2UoZXZlbnRPYmplY3Q6IHsgc3RlcHBlcjogQzh5U3RlcHBlcjsgc3RlcDogQ2RrU3RlcCB9KSB7XG4gICAgIXRoaXMudXNlRVNUJC5nZXRWYWx1ZSgpID8gdGhpcy5jcmVhdGUoZXZlbnRPYmplY3QpIDogdGhpcy5yZWdpc3RlckJ5RXN0KGV2ZW50T2JqZWN0KTtcbiAgfVxuXG4gIGZpeEVycm9ycyhldmVudDogeyBzdGVwcGVyOiBDOHlTdGVwcGVyOyBzdGVwOiBDZGtTdGVwIH0sIGZhaWxlZFJlcXVlc3RzOiBhbnkpIHtcbiAgICBpZiAoZmFpbGVkUmVxdWVzdHMgJiYgZmFpbGVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5vcHRpb25zLnJlc2V0TW9kZWwoe1xuICAgICAgICBkZXZpY2VzVG9DcmVhdGU6IFtcbiAgICAgICAgICAuLi50aGlzLmxhc3RDcmVhdGVkRGV2aWNlcy5maWx0ZXIoZWwgPT5cbiAgICAgICAgICAgIGZhaWxlZFJlcXVlc3RzLm1hcChkYXRhID0+IGRhdGEuaWQpLmluY2x1ZGVzKGVsLmlkKVxuICAgICAgICAgIClcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgZXZlbnQ/LnN0ZXBwZXIucHJldmlvdXMoKTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gICAgdGhpcy5vblN1Y2Nlc3NmdWxDbG9zaW5nKCk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgICB0aGlzLm9uQ2FuY2VsKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZShldmVudE9iamVjdDogeyBzdGVwcGVyOiBDOHlTdGVwcGVyOyBzdGVwOiBDZGtTdGVwIH0pIHtcbiAgICBpZiAodGhpcy5tb2RlbD8uZGV2aWNlc1RvQ3JlYXRlPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxhc3RDcmVhdGVkRGV2aWNlcyA9IFsuLi50aGlzLm1vZGVsLmRldmljZXNUb0NyZWF0ZV07XG5cbiAgICAgIGNvbnN0IGRhdGFUb1NlbmQgPSB0aGlzLm1vZGVsLmRldmljZXNUb0NyZWF0ZS5tYXAoXG4gICAgICAgIChlbDogR2VuZXJhbERldmljZVJlZ2lzdHJhdGlvbk1vZGVsVHlwZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgaWQsIHRlbmFudCwgZ3JvdXAgfSA9IGVsO1xuICAgICAgICAgIGxldCBkYXRhOiB7IGlkOiBzdHJpbmc7IHRlbmFudElkPzogc3RyaW5nOyBncm91cElkPzogc3RyaW5nIH0gPSB7IGlkIH07XG5cbiAgICAgICAgICBpZiAodGVuYW50Py5pZCkge1xuICAgICAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgdGVuYW50SWQ6IHRlbmFudC5pZCB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChncm91cD8uaWQpIHtcbiAgICAgICAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyb3VwSWQ6IGdyb3VwLmlkIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlXG4gICAgICAgIC5jcmVhdGVNdWx0aXBsZShkYXRhVG9TZW5kKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUocmVxdWVzdHMgPT4ge1xuICAgICAgICAgIHRoaXMuc3VjY2VzcyA9IHJlcXVlc3RzLnN1Y2Nlc3MgPz8gW107XG4gICAgICAgICAgaWYgKHRoaXMuc3VjY2Vzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KHRoaXMuUFJPRFVDVF9FWFBFUklFTkNFLkVWRU5ULCB7XG4gICAgICAgICAgICAgIHJlc3VsdDogdGhpcy5QUk9EVUNUX0VYUEVSSUVOQ0UuUkVTVUxULlNVQ0NFU1MsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5QUk9EVUNUX0VYUEVSSUVOQ0UuQ09NUE9ORU5UXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmZhaWxlZCA9IHJlcXVlc3RzLmZhaWxlZCA/PyBbXTtcbiAgICAgICAgICBpZiAodGhpcy5mYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudCh0aGlzLlBST0RVQ1RfRVhQRVJJRU5DRS5FVkVOVCwge1xuICAgICAgICAgICAgICByZXN1bHQ6IHRoaXMuUFJPRFVDVF9FWFBFUklFTkNFLlJFU1VMVC5GQUlMVVJFLFxuICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuUFJPRFVDVF9FWFBFUklFTkNFLkNPTVBPTkVOVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50T2JqZWN0KSB7XG4gICAgICAgICAgICBldmVudE9iamVjdC5zdGVwcGVyLm5leHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJCeUVzdChldmVudE9iamVjdDogeyBzdGVwcGVyOiBDOHlTdGVwcGVyOyBzdGVwOiBDZGtTdGVwIH0pIHtcbiAgICB0aGlzLmxhc3RDcmVhdGVkRGV2aWNlcyA9IFsuLi50aGlzLm1vZGVsLmRldmljZXNUb0NyZWF0ZV07XG4gICAgdGhpcy5kZXZpY2VSZWdpc3RyYXRpb25TZXJ2aWNlXG4gICAgICAuY3JlYXRlKHRoaXMuY29udmVydE9iamVjdFRvQ1NWRmlsZSh0aGlzLm1vZGVsLmRldmljZXNUb0NyZWF0ZSkpXG4gICAgICAudGhlbigoeyByZXMsIGRhdGEgfSkgPT4ge1xuICAgICAgICBpZiAocmVzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAgIHRoaXMuZmFpbGVkID0gZGF0YS5mYWlsZWRDcmVhdGlvbkxpc3QubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiB2YWx1ZS5kZXZpY2VJZCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWUuZmFpbHVyZVJlYXNvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBmYWlsZWRJZHMgPSBuZXcgU2V0KHRoaXMuZmFpbGVkLm1hcChpdGVtID0+IGl0ZW0uaWQpKTtcbiAgICAgICAgICB0aGlzLnN1Y2Nlc3MgPSB0aGlzLm1vZGVsLmRldmljZXNUb0NyZWF0ZS5maWx0ZXIoaXRlbSA9PiAhZmFpbGVkSWRzLmhhcyhpdGVtLmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnRPYmplY3Quc3RlcHBlci5uZXh0KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgZXZlbnRPYmplY3Quc3RlcHBlci5uZXh0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydE9iamVjdFRvQ1NWRmlsZShkYXRhOiBhbnkpOiBGaWxlIHtcbiAgICBjb25zdCBmdWxsQ3N2SGVhZGVycyA9IEVTVENzdkhlYWRlcnM7XG5cbiAgICBjb25zdCBjc3ZIZWFkZXJzID0gZnVsbENzdkhlYWRlcnMuam9pbignOycpICsgJ1xcbic7XG4gICAgY29uc3QgZGF0YVRvU2VuZCA9IGRhdGEubWFwKGVsID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIElEOiBlbC5pZCxcbiAgICAgICAgQVVUSF9UWVBFOiAnQ0VSVElGSUNBVEVTJyxcbiAgICAgICAgRU5ST0xMTUVOVF9PVFA6IGVsLm9uZVRpbWVQYXNzd29yZCxcbiAgICAgICAgUEFUSDogZWwuZ3JvdXA/LmlkIHx8ICcnLFxuICAgICAgICBURU5BTlQ6IGVsLnRlbmFudD8uaWQgfHwgJydcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjc3ZSb3dzID0gZGF0YVRvU2VuZFxuICAgICAgLm1hcChyb3cgPT4gZnVsbENzdkhlYWRlcnMubWFwKGhlYWRlciA9PiByb3dbaGVhZGVyXSA/PyAnJykuam9pbignOycpKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgY3N2Q29udGVudCA9IGNzdkhlYWRlcnMgKyBjc3ZSb3dzO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY3N2Q29udGVudF0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcbiAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBgRVNUUmVnaXN0cmF0aW9uRmlsZS5jc3ZgLCB7IHR5cGU6ICd0ZXh0L2NzdicgfSk7XG4gIH1cblxuICBAbWVtb2l6ZSgpXG4gIHByaXZhdGUgY2FuTG9hZFRlbmFudHMkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkZWZlcigoKSA9PiBmcm9tKHRoaXMudGVuYW50VUlTZXJ2aWNlLmlzTWFuYWdlbWVudFRlbmFudCgpKSkucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gIH1cblxuICBAbWVtb2l6ZSgpXG4gIHByaXZhdGUgZ2V0VGVuYW50cyQoKTogT2JzZXJ2YWJsZTxJUmVzdWx0TGlzdDxJVGVuYW50Pj4ge1xuICAgIHJldHVybiBkZWZlcigoKSA9PiBmcm9tKHRoaXMudGVuYW50U2VydmljZS5saXN0KHRoaXMuRklMVEVSKSkpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICB9XG5cbiAgQG1lbW9pemUoKVxuICBwcml2YXRlIGdldEdyb3VwcyQoKTogT2JzZXJ2YWJsZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgIGZyb20oXG4gICAgICAgIHRoaXMuaW52ZW50b3J5U2VydmljZS5saXN0UXVlcnkoXG4gICAgICAgICAgeyBfX2ZpbHRlcjogeyBfX2hhczogJ2M4eV9Jc0RldmljZUdyb3VwJyB9LCBfX29yZGVyYnk6IFt7IG5hbWU6IDEgfV0gfSxcbiAgICAgICAgICB7IC4uLnRoaXMuRklMVEVSIH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICkucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gIH1cbn1cbiIsIjxjOHktbW9kYWxcbiAgW3RpdGxlXT1cIidSZWdpc3RlciBkZXZpY2VzJyB8IHRyYW5zbGF0ZVwiXG4gIFtoZWFkZXJDbGFzc2VzXT1cIidkaWFsb2ctaGVhZGVyJ1wiXG4gIFtjdXN0b21Gb290ZXJdPVwidHJ1ZVwiXG4+XG4gIDxuZy1jb250YWluZXIgYzh5LW1vZGFsLXRpdGxlPlxuICAgIDxzcGFuIFtjOHlJY29uXT1cIidjOHktZGV2aWNlLWNvbm5lY3QnXCI+PC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGM4eS1zdGVwcGVyXG4gICAgW2hpZGVTdGVwUHJvZ3Jlc3NdPVwidHJ1ZVwiXG4gICAgbGluZWFyXG4gICAgYzh5LW1vZGFsLWJvZHlcbiAgPlxuICAgIDxjZGstc3RlcCBbc3RlcENvbnRyb2xdPVwiZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHN0aWNreS10b3AgYmctY29tcG9uZW50XCI+XG4gICAgICAgIDxwXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LTE2IHNlcGFyYXRvci1ib3R0b20gcC0xNlwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBSZWdpc3RlciBnZW5lcmFsIGRldmljZXNcbiAgICAgICAgPC9wPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cImM4eS1zd2l0Y2ggbS0yNCBhLWktY2VudGVyXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdDcmVhdGUgZGV2aWNlIGNlcnRpZmljYXRlcyBkdXJpbmcgZGV2aWNlIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIGZvcj1cInVzZUVTVFwiXG4gICAgICAgICAgKm5nSWY9XCJjZXJ0aWZpY2F0ZUF1dGhvcml0eUZlYXR1cmVFbmFibGVkIHwgYXN5bmNcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cInVzZUVTVFwiXG4gICAgICAgICAgICBuYW1lPVwidXNlRVNUXCJcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJ1c2VFU1QkLmdldFZhbHVlKClcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXNlRVNUJC5uZXh0KCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAge3sgJ0NyZWF0ZSBkZXZpY2UgY2VydGlmaWNhdGVzIGR1cmluZyBkZXZpY2UgcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHBvcG92ZXI9XCJ7e1xuICAgICAgICAgICAgICAnVGhlIGRldmljZSByZWdpc3RyYXRpb24gcHJvY2VzcyBpbmNsdWRlcyBjcmVhdGluZyBkZXZpY2UgY2VydGlmaWNhdGVzLCB3aGljaCBhcmUgaXNzdWVkIGJ5IHRoZSB0ZW5hbnRcXCdzIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpLidcbiAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPGZvcm1seS1mb3JtXG4gICAgICAgICAgY2xhc3M9XCJmb3JtbHktZ3JvdXAtYXJyYXktY29scyBkLWJsb2NrIHAtbC0yNCBwLWItMjQgbWluLWhlaWdodC1maXQgcC1yLThcIlxuICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgICAgIFtmaWVsZHNdPVwiZmllbGRzXCJcbiAgICAgICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3AtdC0yNCc6ICEoY2VydGlmaWNhdGVBdXRob3JpdHlGZWF0dXJlRW5hYmxlZCB8IGFzeW5jKSB9XCJcbiAgICAgICAgPjwvZm9ybWx5LWZvcm0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjOHktc3RlcHBlci1idXR0b25zXG4gICAgICAgIGNsYXNzPVwic3RpY2t5LWJvdHRvbSBkLWJsb2NrIHAtdC0xNiBwLWItMTYgc2VwYXJhdG9yLXRvcCBiZy1sZXZlbC0wXCJcbiAgICAgICAgKG9uTmV4dCk9XCJyZWdpc3RlckRldmljZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImNhbmNlbCgpXCJcbiAgICAgICAgW3Nob3dCdXR0b25zXT1cInsgY2FuY2VsOiB0cnVlLCBuZXh0OiB0cnVlIH1cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWZvcm0/LnZhbGlkXCJcbiAgICAgICAgW3BlbmRpbmddPVwiaXNMb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgID48L2M4eS1zdGVwcGVyLWJ1dHRvbnM+XG4gICAgPC9jZGstc3RlcD5cbiAgICA8Y2RrLXN0ZXAgc3RhdGU9XCJmaW5hbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtMjQgbWluLWhlaWdodC1maXRcIj5cbiAgICAgICAgPGM4eS1vcGVyYXRpb24tcmVzdWx0XG4gICAgICAgICAgY2xhc3M9XCJsZWFkXCJcbiAgICAgICAgICB0eXBlPVwic3VjY2Vzc1wiXG4gICAgICAgICAgKm5nSWY9XCJzdWNjZXNzLmxlbmd0aCA9PT0gMSAmJiBmYWlsZWQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICB0ZXh0PVwie3sgJ0RldmljZSByZWdpc3RlcmVkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgW3NpemVdPVwiODRcIlxuICAgICAgICAgIFt2ZXJ0aWNhbF09XCJ0cnVlXCJcbiAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgICAgIDxjOHktb3BlcmF0aW9uLXJlc3VsdFxuICAgICAgICAgIGNsYXNzPVwibGVhZFwiXG4gICAgICAgICAgdHlwZT1cImVycm9yXCJcbiAgICAgICAgICAqbmdJZj1cInN1Y2Nlc3MubGVuZ3RoID09PSAwICYmIGZhaWxlZC5sZW5ndGggPT09IDFcIlxuICAgICAgICAgIHRleHQ9XCJ7eyAnRmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIFtzaXplXT1cIjg0XCJcbiAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgID48L2M4eS1vcGVyYXRpb24tcmVzdWx0PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWNjZXNzLmxlbmd0aCA+IDEgfHwgZmFpbGVkLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICA8Yzh5LW9wZXJhdGlvbi1yZXN1bHRcbiAgICAgICAgICAgIGNsYXNzPVwibGVhZFwiXG4gICAgICAgICAgICB0eXBlPVwic3VjY2Vzc1wiXG4gICAgICAgICAgICAqbmdJZj1cImZhaWxlZC5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgW3RleHRdPVwiXG4gICAgICAgICAgICAgICd7eyBzdWNjZXNzZnVsRGV2aWNlc0NvdW50IH19IGRldmljZXMgcmVnaXN0ZXJlZCdcbiAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBzdWNjZXNzZnVsRGV2aWNlc0NvdW50OiBzdWNjZXNzLmxlbmd0aCB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW3NpemVdPVwiODRcIlxuICAgICAgICAgICAgW3ZlcnRpY2FsXT1cInRydWVcIlxuICAgICAgICAgID48L2M4eS1vcGVyYXRpb24tcmVzdWx0PlxuICAgICAgICAgIDxjOHktb3BlcmF0aW9uLXJlc3VsdFxuICAgICAgICAgICAgY2xhc3M9XCJsZWFkXCJcbiAgICAgICAgICAgIHR5cGU9XCJlcnJvclwiXG4gICAgICAgICAgICAqbmdJZj1cInN1Y2Nlc3MubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgIFt0ZXh0XT1cIlxuICAgICAgICAgICAgICAne3sgZmFpbGVkRGV2aWNlc0NvdW50IH19IGRldmljZXMgZmFpbGVkIHRvIHJlZ2lzdGVyJ1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGZhaWxlZERldmljZXNDb3VudDogZmFpbGVkLmxlbmd0aCB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW3NpemVdPVwiODRcIlxuICAgICAgICAgICAgW3ZlcnRpY2FsXT1cInRydWVcIlxuICAgICAgICAgID48L2M4eS1vcGVyYXRpb24tcmVzdWx0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJwLWwtMjQgcC1yLTI0IHRleHQtY2VudGVyXCJcbiAgICAgICAgICAqbmdJZj1cInN1Y2Nlc3MubGVuZ3RoID4gMCAmJiBmYWlsZWQubGVuZ3RoID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8Yzh5LW9wZXJhdGlvbi1yZXN1bHRcbiAgICAgICAgICAgIGNsYXNzPVwibGVhZFwiXG4gICAgICAgICAgICB0eXBlPVwiZXJyb3JcIlxuICAgICAgICAgICAgdGV4dD1cInt7ICdTZXZlcmFsIGRldmljZXMgZmFpbGVkIHRvIHJlZ2lzdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbc2l6ZV09XCI4NFwiXG4gICAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgICAgICAgPHBcbiAgICAgICAgICAgIGNsYXNzPVwicC1iLTE2IHRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiBmYWlsZWQubGVuZ3RoLCB0b3RhbDogZmFpbGVkLmxlbmd0aCArIHN1Y2Nlc3MubGVuZ3RoIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbiBmYWlsZWQgZm9yIHt7IGNvdW50IH19IGRldmljZXMgb3V0IG9mIHt7IHRvdGFsIH19LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibS1iLTggcC1sLTI0IHAtci0yNFwiXG4gICAgICAgICAgZGF0YS1jeT1cImRldmljZS1yZWdpc3RyYXRpb24tc3VjY2Vzcy1tZXNzYWdlXCJcbiAgICAgICAgICAqbmdJZj1cInN1Y2Nlc3MubGVuZ3RoID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhKHVzZUVTVCQgfCBhc3luYylcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgVHVybiBvbiB0aGUgcmVnaXN0ZXJlZCBkZXZpY2VzIGFuZCB3YWl0IGZvciBjb25uZWN0aW9ucyB0byBiZSBlc3RhYmxpc2hlZC4gT25jZSBhIGRldmljZVxuICAgICAgICAgICAgaXMgY29ubmVjdGVkLCBpdHMgc3RhdHVzIHdpbGwgY2hhbmdlIHRvIFwiUGVuZGluZyBhY2NlcHRhbmNlXCIuIFlvdSB3aWxsIG5lZWQgdG8gYXBwcm92ZVxuICAgICAgICAgICAgaXQgYnkgY2xpY2tpbmcgb24gdGhlIFwiQWNjZXB0XCIgYnV0dG9uLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJ1c2VFU1QkIHwgYXN5bmNcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgVGhlIHN1Y2Nlc3NmdWxseSBlbnJvbGxlZCBkZXZpY2VzIGNhbiBub3cgcmVxdWVzdCBzaWduZWQgY2VydGlmaWNhdGVzIGFuZCB1c2UgdGhlbSB0b1xuICAgICAgICAgICAgY29ubmVjdCBhbmQgYXV0aGVudGljYXRlIHRvIHRoZSBwbGF0Zm9ybSB2aWEgY2VydGlmaWNhdGUtYmFzZWQgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJzZXBhcmF0b3ItdG9wIG0tdC0xNlwiPlxuICAgICAgICAgIDxjOHktbGkgKm5nRm9yPVwibGV0IGZhaWwgb2YgZmFpbGVkXCI+XG4gICAgICAgICAgICA8Yzh5LWxpLWljb25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIidiYW4nXCJcbiAgICAgICAgICAgID48L2M4eS1saS1pY29uPlxuICAgICAgICAgICAgPHA+e3sgZmFpbD8uaWQgfX08L3A+XG4gICAgICAgICAgICA8c21hbGw+e3sgZmFpbD8ubWVzc2FnZSB8IHRyYW5zbGF0ZSB9fTwvc21hbGw+XG4gICAgICAgICAgICA8Yzh5LWxpLWNvbGxhcHNlPlxuICAgICAgICAgICAgICA8cHJlPjxjb2RlPnt7IGZhaWw/LmRldGFpbHMgfCBqc29uIH19PC9jb2RlPjwvcHJlPlxuICAgICAgICAgICAgPC9jOHktbGktY29sbGFwc2U+XG4gICAgICAgICAgPC9jOHktbGk+XG5cbiAgICAgICAgICA8Yzh5LWxpICpuZ0Zvcj1cImxldCBzIG9mIHN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxjOHktbGktaWNvblxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc3VjY2Vzc1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cIidjaGVjay1jaXJjbGUnXCJcbiAgICAgICAgICAgID48L2M4eS1saS1pY29uPlxuICAgICAgICAgICAge3sgcz8uaWQgfX1cbiAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgPC9jOHktbGlzdC1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGM4eS1zdGVwcGVyLWJ1dHRvbnNcbiAgICAgICAgY2xhc3M9XCJzdGlja3ktYm90dG9tIGQtYmxvY2sgcC10LTE2IHAtYi0xNiBzZXBhcmF0b3ItdG9wIGJnLWxldmVsLTBcIlxuICAgICAgICAob25DdXN0b20pPVwiY2xvc2UoKVwiXG4gICAgICAgIChvbkJhY2spPVwiZml4RXJyb3JzKCRldmVudCwgZmFpbGVkKVwiXG4gICAgICAgIFtzaG93QnV0dG9uc109XCJ7IGJhY2s6IGZhaWxlZC5sZW5ndGggPiAwLCBjdXN0b206IHRydWUgfVwiXG4gICAgICAgIFtsYWJlbHNdPVwieyBiYWNrOiAnRml4IGVycm9ycycsIGN1c3RvbTogJ0Nsb3NlJyB9XCJcbiAgICAgID48L2M4eS1zdGVwcGVyLWJ1dHRvbnM+XG4gICAgPC9jZGstc3RlcD5cbiAgPC9jOHktc3RlcHBlcj5cbjwvYzh5LW1vZGFsPlxuIl19
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1kZXZpY2UtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlZ2lzdGVyLWRldmljZS9nZW5lcmFsL2dlbmVyYWwtZGV2aWNlLXJlZ2lzdHJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9yZWdpc3Rlci1kZXZpY2UvZ2VuZXJhbC9nZW5lcmFsLWRldmljZS1yZWdpc3RyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLE9BQU8sRUFFUCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBMEIsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQ0wsNkJBQTZCLEVBRTdCLGdCQUFnQixFQUdoQixhQUFhLEVBQ2QsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7Ozs7QUFjakYsTUFBTSxPQUFPLGtDQUFrQztJQWdMN0MsWUFDVSxlQUFnQyxFQUNoQyxhQUE0QixF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LENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFHTyxXQUFXO1FBQ2pCLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBR08sVUFBVTtRQUNoQixPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FDaEIsSUFBSSxDQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzdCLEVBQUUsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUN0RSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNuQixDQUNGLENBQ0YsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQzsrR0EzVlUsa0NBQWtDO21HQUFsQyxrQ0FBa0MsdUVDNUMvQyxvc05BK0xBOztBRHFMVTtJQURQLE9BQU8sRUFBRTs7O29DQUNpQixVQUFVO3lFQUVwQztBQUdPO0lBRFAsT0FBTyxFQUFFOzs7b0NBQ2EsVUFBVTtxRUFFaEM7QUFHTztJQURQLE9BQU8sRUFBRTs7O29DQUNZLFVBQVU7b0VBUy9COzRGQTNWVSxrQ0FBa0M7a0JBTDlDLFNBQVM7K0JBQ0UsaUNBQWlDLG1CQUUxQix1QkFBdUIsQ0FBQyxNQUFNO3lWQTBVdkMsZUFBZSxNQUtmLFdBQVcsTUFLWCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1seUZpZWxkQ29uZmlnLCBGb3JtbHlGb3JtT3B0aW9ucyB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtcbiAgVGVuYW50VWlTZXJ2aWNlLFxuICBnZXR0ZXh0LFxuICBDOHlTdGVwcGVyLFxuICBtZW1vaXplLFxuICBHYWluc2lnaHRTZXJ2aWNlLFxuICBGZWF0dXJlQ2FjaGVTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZGVmZXIsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIERldmljZVJlZ2lzdHJhdGlvbkJ1bGtTZXJ2aWNlLFxuICBJTWFuYWdlZE9iamVjdCxcbiAgSW52ZW50b3J5U2VydmljZSxcbiAgSVJlc3VsdExpc3QsXG4gIElUZW5hbnQsXG4gIFRlbmFudFNlcnZpY2Vcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgUmVnaXN0ZXJEZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vcmVnaXN0ZXItZGV2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2RrU3RlcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zdGVwcGVyJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IEVTVENzdkhlYWRlcnMgfSBmcm9tICcuLi9idWxrL2J1bGstZGV2aWNlLXJlZ2lzdHJhdGlvbi1tb2RhbC5jb21wb25lbnQnO1xuXG5pbnRlcmZhY2UgR2VuZXJhbERldmljZVJlZ2lzdHJhdGlvbk1vZGVsVHlwZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudD86IHsgaWQ6IHN0cmluZyB9O1xuICBncm91cD86IHsgaWQ6IHN0cmluZzsgbmFtZT86IHN0cmluZyB9O1xuICBvbmVUaW1lUGFzc3dvcmQ/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1nZW5lcmFsLWRldmljZS1yZWdpc3RyYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJ2dlbmVyYWwtZGV2aWNlLXJlZ2lzdHJhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyYWxEZXZpY2VSZWdpc3RyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICByZWFkb25seSBNQU5BR0VNRU5UID0gJ21hbmFnZW1lbnQnO1xuICByZWFkb25seSBGSUxURVI6IG9iamVjdCA9IHtcbiAgICB3aXRoVG90YWxQYWdlczogdHJ1ZSxcbiAgICBwYWdlU2l6ZTogMjVcbiAgfTtcblxuICB1c2VFU1QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGNlcnRpZmljYXRlQXV0aG9yaXR5RmVhdHVyZUVuYWJsZWQgPVxuICAgIHRoaXMuZmVhdHVyZUNhY2hlU2VydmljZS5nZXRGZWF0dXJlU3RhdGUoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScpO1xuXG4gIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgbW9kZWwgPSB7XG4gICAgZGV2aWNlc1RvQ3JlYXRlOiBbe30gYXMgR2VuZXJhbERldmljZVJlZ2lzdHJhdGlvbk1vZGVsVHlwZV1cbiAgfTtcbiAgb3B0aW9uczogRm9ybWx5Rm9ybU9wdGlvbnMgPSB7XG4gICAgZm9ybVN0YXRlOiB7XG4gICAgICBjYW5Mb2FkVGVuYW50czogdHJ1ZSxcbiAgICAgIHVzZUVTVDogdGhpcy51c2VFU1QkLmdldFZhbHVlKClcbiAgICB9XG4gIH07XG5cbiAgUFJPRFVDVF9FWFBFUklFTkNFID0ge1xuICAgIEVWRU5UOiAnZGV2aWNlUmVnaXN0cmF0aW9uJyxcbiAgICBDT01QT05FTlQ6ICdzaW5nbGUtZ2VuZXJhbC1yZWdpc3RyYXRpb24nLFxuICAgIFJFU1VMVDogeyBTVUNDRVNTOiAncmVnaXN0cmF0aW9uU3VjY2VzcycsIEZBSUxVUkU6ICdyZWdpc3RyYXRpb25GYWlsdXJlJyB9XG4gIH07XG5cbiAgaXNMb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgc3VjY2VzczogeyBpZDogc3RyaW5nIH1bXSA9IFtdO1xuICBmYWlsZWQ6IHsgaWQ6IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZzsgZGV0YWlscz86IGFueSB9W10gPSBbXTtcblxuICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXG4gICAge1xuICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgIGtleTogJ2RldmljZXNUb0NyZWF0ZScsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhZGRUZXh0OiBnZXR0ZXh0KCdBZGQgZGV2aWNlJyksXG4gICAgICAgIGFkZFRleHREYXRhQ3k6ICdhZGQtZGV2aWNlJ1xuICAgICAgfSxcbiAgICAgIGZpZWxkQXJyYXk6IHtcbiAgICAgICAgZmllbGRHcm91cDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ2lkJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZm9jdXM6IHRydWUsXG4gICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJzAxMjNhYjMyZmNkJyxcbiAgICAgICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0RldmljZSBJRCcpLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICAgdW5pcXVlOiB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IChcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5yb290LmdldCgnZGV2aWNlc1RvQ3JlYXRlJykgYXMgRm9ybUFycmF5PFxuICAgICAgICAgICAgICAgICAgICAgIEZvcm1Hcm91cDx7IGlkOiBGb3JtQ29udHJvbDxzdHJpbmc+IH0+XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICkuY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChlbCA9PiBlbC5jb250cm9scy5pZClcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoZWwgPT4gZWwgIT09IGNvbnRyb2wgJiYgZWwudmFsdWUgPT09IGNvbnRyb2wudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICFmb3VuZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICgpID0+IGdldHRleHQoJ0RldmljZSBJRCBkdXBsaWNhdGVzIGFyZSBub3QgYWxsb3dlZCcpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ3RlbmFudCcsXG4gICAgICAgICAgICB0eXBlOiAndHlwZWFoZWFkJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiB7XG4gICAgICAgICAgICAgIGhpZGU6IGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSBmaWVsZC5vcHRpb25zPy5mb3JtU3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3JtU3RhdGU/LmNhbkxvYWRUZW5hbnRzKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5mb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICFmb3JtU3RhdGU/LmNhbkxvYWRUZW5hbnRzIHx8IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB7IGlkOiB0aGlzLk1BTkFHRU1FTlQgfSxcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdBZGQgdG8gdGVuYW50JyksXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBjOHlGb3JPcHRpb25zOiB0aGlzLmNhbkxvYWRUZW5hbnRzJCgpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKGNhbkxvYWQgPT4gY2FuTG9hZCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0VGVuYW50cyQoKSlcbiAgICAgICAgICAgICAgKSBhcyBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElUZW5hbnQ+PixcbiAgICAgICAgICAgICAgY29udGFpbmVyOiAnYm9keScsXG4gICAgICAgICAgICAgIGRpc3BsYXlQcm9wZXJ0eTogJ2lkJyxcbiAgICAgICAgICAgICAgdmFsdWVQcm9wZXJ0aWVzOiBbJ2lkJ11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rczoge1xuICAgICAgICAgICAgICBvbkluaXQ6IF9maWVsZCA9PlxuICAgICAgICAgICAgICAgIHRoaXMuY2FuTG9hZFRlbmFudHMkKCkucGlwZShcbiAgICAgICAgICAgICAgICAgIHRhcChjYW5Mb2FkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvcm1TdGF0ZS5jYW5Mb2FkVGVuYW50cyA9IGNhbkxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdncm91cCcsXG4gICAgICAgICAgICB0eXBlOiAndHlwZWFoZWFkJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiB7XG4gICAgICAgICAgICAgICdwcm9wcy5kaXNhYmxlZCc6IChmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSBmaWVsZC5vcHRpb25zPy5mb3JtU3RhdGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBmaWVsZC5tb2RlbDtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybVN0YXRlPy5jYW5Mb2FkVGVuYW50cykge1xuICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsPy50ZW5hbnQ/LmlkICE9PSB0aGlzLk1BTkFHRU1FTlQpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gIShtb2RlbD8udGVuYW50Py5pZCA9PT0gdGhpcy5NQU5BR0VNRU5UKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZpZWxkPy5wcm9wcz8uZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBsYWJlbDogZ2V0dGV4dCgnQWRkIHRvIGdyb3VwJyksXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KFxuICAgICAgICAgICAgICAgICdZb3UgY2FuIGFkZCBkZXZpY2UgdG8gc3BlY2lmaWMgZ3JvdXAgZm9yIG1hbmFnZW1lbnQgdGVuYW50IG9ubHkuJ1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBjb250YWluZXI6ICdib2R5JyxcbiAgICAgICAgICAgICAgZGlzcGxheVByb3BlcnR5OiAnbmFtZScsXG4gICAgICAgICAgICAgIHZhbHVlUHJvcGVydGllczogWydpZCddLFxuICAgICAgICAgICAgICBjOHlGb3JPcHRpb25zOiB0aGlzLmdldEdyb3VwcyQoKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICAgIG9uSW5pdDogX2ZpZWxkID0+XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5Mb2FkVGVuYW50cyQoKS5waXBlKFxuICAgICAgICAgICAgICAgICAgdGFwKGNhbkxvYWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybVN0YXRlLmNhbkxvYWRUZW5hbnRzID0gY2FuTG9hZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ29uZVRpbWVQYXNzd29yZCcsXG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiB7XG4gICAgICAgICAgICAgIGhpZGU6IGZpZWxkID0+ICFmaWVsZC5vcHRpb25zPy5mb3JtU3RhdGU/LnVzZUVTVFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnVHJ1RE4zSDQ1TDAnLFxuICAgICAgICAgICAgICBsYWJlbDogZ2V0dGV4dCgnT25lLXRpbWUgcGFzc3dvcmQnKSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rczoge1xuICAgICAgICAgICAgICBvbkluaXQ6IF9maWVsZCA9PlxuICAgICAgICAgICAgICAgIHRoaXMudXNlRVNUJC5waXBlKFxuICAgICAgICAgICAgICAgICAgdGFwKHVzZUVTVCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtU3RhdGUudXNlRVNUID0gdXNlRVNUO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH1cbiAgXTtcblxuICByZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5vblN1Y2Nlc3NmdWxDbG9zaW5nID0gcmVzb2x2ZTtcbiAgICB0aGlzLm9uQ2FuY2VsID0gcmVqZWN0O1xuICB9KTtcblxuICBwcml2YXRlIG9uU3VjY2Vzc2Z1bENsb3Npbmc6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25DYW5jZWw6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgbGFzdENyZWF0ZWREZXZpY2VzOiBHZW5lcmFsRGV2aWNlUmVnaXN0cmF0aW9uTW9kZWxUeXBlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRlbmFudFVJU2VydmljZTogVGVuYW50VWlTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50U2VydmljZTogVGVuYW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlZ2lzdGVyRGV2aWNlU2VydmljZTogUmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgYnNNb2RhbFJlZjogQnNNb2RhbFJlZixcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkZXZpY2VSZWdpc3RyYXRpb25TZXJ2aWNlOiBEZXZpY2VSZWdpc3RyYXRpb25CdWxrU2VydmljZSxcbiAgICBwcml2YXRlIGZlYXR1cmVDYWNoZVNlcnZpY2U6IEZlYXR1cmVDYWNoZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pc0xvYWRpbmckID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubG9hZGluZyQ7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICByZWdpc3RlckRldmljZShldmVudE9iamVjdDogeyBzdGVwcGVyOiBDOHlTdGVwcGVyOyBzdGVwOiBDZGtTdGVwIH0pIHtcbiAgICAhdGhpcy51c2VFU1QkLmdldFZhbHVlKCkgPyB0aGlzLmNyZWF0ZShldmVudE9iamVjdCkgOiB0aGlzLnJlZ2lzdGVyQnlFc3QoZXZlbnRPYmplY3QpO1xuICB9XG5cbiAgZml4RXJyb3JzKGV2ZW50OiB7IHN0ZXBwZXI6IEM4eVN0ZXBwZXI7IHN0ZXA6IENka1N0ZXAgfSwgZmFpbGVkUmVxdWVzdHM6IGFueSkge1xuICAgIGlmIChmYWlsZWRSZXF1ZXN0cyAmJiBmYWlsZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9wdGlvbnMucmVzZXRNb2RlbCh7XG4gICAgICAgIGRldmljZXNUb0NyZWF0ZTogW1xuICAgICAgICAgIC4uLnRoaXMubGFzdENyZWF0ZWREZXZpY2VzLmZpbHRlcihlbCA9PlxuICAgICAgICAgICAgZmFpbGVkUmVxdWVzdHMubWFwKGRhdGEgPT4gZGF0YS5pZCkuaW5jbHVkZXMoZWwuaWQpXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICBldmVudD8uc3RlcHBlci5wcmV2aW91cygpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgICB0aGlzLm9uU3VjY2Vzc2Z1bENsb3NpbmcoKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICAgIHRoaXMub25DYW5jZWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlKGV2ZW50T2JqZWN0OiB7IHN0ZXBwZXI6IEM4eVN0ZXBwZXI7IHN0ZXA6IENka1N0ZXAgfSkge1xuICAgIGlmICh0aGlzLm1vZGVsPy5kZXZpY2VzVG9DcmVhdGU/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubGFzdENyZWF0ZWREZXZpY2VzID0gWy4uLnRoaXMubW9kZWwuZGV2aWNlc1RvQ3JlYXRlXTtcblxuICAgICAgY29uc3QgZGF0YVRvU2VuZCA9IHRoaXMubW9kZWwuZGV2aWNlc1RvQ3JlYXRlLm1hcChcbiAgICAgICAgKGVsOiBHZW5lcmFsRGV2aWNlUmVnaXN0cmF0aW9uTW9kZWxUeXBlKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBpZCwgdGVuYW50LCBncm91cCB9ID0gZWw7XG4gICAgICAgICAgbGV0IGRhdGE6IHsgaWQ6IHN0cmluZzsgdGVuYW50SWQ/OiBzdHJpbmc7IGdyb3VwSWQ/OiBzdHJpbmcgfSA9IHsgaWQgfTtcblxuICAgICAgICAgIGlmICh0ZW5hbnQ/LmlkKSB7XG4gICAgICAgICAgICBkYXRhID0geyAuLi5kYXRhLCB0ZW5hbnRJZDogdGVuYW50LmlkIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGdyb3VwPy5pZCkge1xuICAgICAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JvdXBJZDogZ3JvdXAuaWQgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2VcbiAgICAgICAgLmNyZWF0ZU11bHRpcGxlKGRhdGFUb1NlbmQpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZShyZXF1ZXN0cyA9PiB7XG4gICAgICAgICAgdGhpcy5zdWNjZXNzID0gcmVxdWVzdHMuc3VjY2VzcyA/PyBbXTtcbiAgICAgICAgICBpZiAodGhpcy5zdWNjZXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQodGhpcy5QUk9EVUNUX0VYUEVSSUVOQ0UuRVZFTlQsIHtcbiAgICAgICAgICAgICAgcmVzdWx0OiB0aGlzLlBST0RVQ1RfRVhQRVJJRU5DRS5SRVNVTFQuU1VDQ0VTUyxcbiAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLlBST0RVQ1RfRVhQRVJJRU5DRS5DT01QT05FTlRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZmFpbGVkID0gcmVxdWVzdHMuZmFpbGVkID8/IFtdO1xuICAgICAgICAgIGlmICh0aGlzLmZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KHRoaXMuUFJPRFVDVF9FWFBFUklFTkNFLkVWRU5ULCB7XG4gICAgICAgICAgICAgIHJlc3VsdDogdGhpcy5QUk9EVUNUX0VYUEVSSUVOQ0UuUkVTVUxULkZBSUxVUkUsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5QUk9EVUNUX0VYUEVSSUVOQ0UuQ09NUE9ORU5UXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnRPYmplY3QpIHtcbiAgICAgICAgICAgIGV2ZW50T2JqZWN0LnN0ZXBwZXIubmV4dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckJ5RXN0KGV2ZW50T2JqZWN0OiB7IHN0ZXBwZXI6IEM4eVN0ZXBwZXI7IHN0ZXA6IENka1N0ZXAgfSkge1xuICAgIHRoaXMubGFzdENyZWF0ZWREZXZpY2VzID0gWy4uLnRoaXMubW9kZWwuZGV2aWNlc1RvQ3JlYXRlXTtcbiAgICB0aGlzLmRldmljZVJlZ2lzdHJhdGlvblNlcnZpY2VcbiAgICAgIC5jcmVhdGUodGhpcy5jb252ZXJ0T2JqZWN0VG9DU1ZGaWxlKHRoaXMubW9kZWwuZGV2aWNlc1RvQ3JlYXRlKSlcbiAgICAgIC50aGVuKCh7IHJlcywgZGF0YSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgICAgdGhpcy5mYWlsZWQgPSBkYXRhLmZhaWxlZENyZWF0aW9uTGlzdC5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IHZhbHVlLmRldmljZUlkLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZS5mYWlsdXJlUmVhc29uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGZhaWxlZElkcyA9IG5ldyBTZXQodGhpcy5mYWlsZWQubWFwKGl0ZW0gPT4gaXRlbS5pZCkpO1xuICAgICAgICAgIHRoaXMuc3VjY2VzcyA9IHRoaXMubW9kZWwuZGV2aWNlc1RvQ3JlYXRlLmZpbHRlcihpdGVtID0+ICFmYWlsZWRJZHMuaGFzKGl0ZW0uaWQpKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudE9iamVjdC5zdGVwcGVyLm5leHQoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBldmVudE9iamVjdC5zdGVwcGVyLm5leHQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T2JqZWN0VG9DU1ZGaWxlKGRhdGE6IGFueSk6IEZpbGUge1xuICAgIGNvbnN0IGZ1bGxDc3ZIZWFkZXJzID0gRVNUQ3N2SGVhZGVycztcblxuICAgIGNvbnN0IGNzdkhlYWRlcnMgPSBmdWxsQ3N2SGVhZGVycy5qb2luKCc7JykgKyAnXFxuJztcbiAgICBjb25zdCBkYXRhVG9TZW5kID0gZGF0YS5tYXAoZWwgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgSUQ6IGVsLmlkLFxuICAgICAgICBBVVRIX1RZUEU6ICdDRVJUSUZJQ0FURVMnLFxuICAgICAgICBFTlJPTExNRU5UX09UUDogZWwub25lVGltZVBhc3N3b3JkLFxuICAgICAgICBQQVRIOiBlbC5ncm91cD8uaWQgfHwgJycsXG4gICAgICAgIFRFTkFOVDogZWwudGVuYW50Py5pZCB8fCAnJ1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGVzY2FwZVZhbHVlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnOycpIHx8IHZhbHVlLmluY2x1ZGVzKCdcIicpKSB7XG4gICAgICAgIHJldHVybiBgXCIke3ZhbHVlLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG5cbiAgICBjb25zdCBjc3ZSb3dzID0gZGF0YVRvU2VuZFxuICAgICAgLm1hcChyb3cgPT4gZnVsbENzdkhlYWRlcnMubWFwKGhlYWRlciA9PiBlc2NhcGVWYWx1ZShyb3dbaGVhZGVyXSA/PyAnJykpLmpvaW4oJzsnKSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IGNzdkNvbnRlbnQgPSBjc3ZIZWFkZXJzICsgY3N2Um93cztcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdicgfSk7XG4gICAgcmV0dXJuIG5ldyBGaWxlKFtibG9iXSwgYEVTVFJlZ2lzdHJhdGlvbkZpbGUuY3N2YCwgeyB0eXBlOiAndGV4dC9jc3YnIH0pO1xuICB9XG5cbiAgQG1lbW9pemUoKVxuICBwcml2YXRlIGNhbkxvYWRUZW5hbnRzJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gZGVmZXIoKCkgPT4gZnJvbSh0aGlzLnRlbmFudFVJU2VydmljZS5pc01hbmFnZW1lbnRUZW5hbnQoKSkpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICB9XG5cbiAgQG1lbW9pemUoKVxuICBwcml2YXRlIGdldFRlbmFudHMkKCk6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SVRlbmFudD4+IHtcbiAgICByZXR1cm4gZGVmZXIoKCkgPT4gZnJvbSh0aGlzLnRlbmFudFNlcnZpY2UubGlzdCh0aGlzLkZJTFRFUikpKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgfVxuXG4gIEBtZW1vaXplKClcbiAgcHJpdmF0ZSBnZXRHcm91cHMkKCk6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+PiB7XG4gICAgcmV0dXJuIGRlZmVyKCgpID0+XG4gICAgICBmcm9tKFxuICAgICAgICB0aGlzLmludmVudG9yeVNlcnZpY2UubGlzdFF1ZXJ5KFxuICAgICAgICAgIHsgX19maWx0ZXI6IHsgX19oYXM6ICdjOHlfSXNEZXZpY2VHcm91cCcgfSwgX19vcmRlcmJ5OiBbeyBuYW1lOiAxIH1dIH0sXG4gICAgICAgICAgeyAuLi50aGlzLkZJTFRFUiB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICApLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICB9XG59XG4iLCI8Yzh5LW1vZGFsXG4gIFt0aXRsZV09XCInUmVnaXN0ZXIgZGV2aWNlcycgfCB0cmFuc2xhdGVcIlxuICBbaGVhZGVyQ2xhc3Nlc109XCInZGlhbG9nLWhlYWRlcidcIlxuICBbY3VzdG9tRm9vdGVyXT1cInRydWVcIlxuPlxuICA8bmctY29udGFpbmVyIGM4eS1tb2RhbC10aXRsZT5cbiAgICA8c3BhbiBbYzh5SWNvbl09XCInYzh5LWRldmljZS1jb25uZWN0J1wiPjwvc3Bhbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxjOHktc3RlcHBlclxuICAgIFtoaWRlU3RlcFByb2dyZXNzXT1cInRydWVcIlxuICAgIGxpbmVhclxuICAgIGM4eS1tb2RhbC1ib2R5XG4gID5cbiAgICA8Y2RrLXN0ZXAgW3N0ZXBDb250cm9sXT1cImZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBzdGlja3ktdG9wIGJnLWNvbXBvbmVudFwiPlxuICAgICAgICA8cFxuICAgICAgICAgIGNsYXNzPVwidGV4dC1tZWRpdW0gdGV4dC0xNiBzZXBhcmF0b3ItYm90dG9tIHAtMTZcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgUmVnaXN0ZXIgZ2VuZXJhbCBkZXZpY2VzXG4gICAgICAgIDwvcD5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJjOHktc3dpdGNoIG0tMjQgYS1pLWNlbnRlclwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnQ3JlYXRlIGRldmljZSBjZXJ0aWZpY2F0ZXMgZHVyaW5nIGRldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBmb3I9XCJ1c2VFU1RcIlxuICAgICAgICAgICpuZ0lmPVwiY2VydGlmaWNhdGVBdXRob3JpdHlGZWF0dXJlRW5hYmxlZCB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgaWQ9XCJ1c2VFU1RcIlxuICAgICAgICAgICAgbmFtZT1cInVzZUVTVFwiXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwidXNlRVNUJC5nZXRWYWx1ZSgpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVzZUVTVCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgIHt7ICdDcmVhdGUgZGV2aWNlIGNlcnRpZmljYXRlcyBkdXJpbmcgZGV2aWNlIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgJ1RoZSBkZXZpY2UgcmVnaXN0cmF0aW9uIHByb2Nlc3MgaW5jbHVkZXMgY3JlYXRpbmcgZGV2aWNlIGNlcnRpZmljYXRlcywgd2hpY2ggYXJlIGlzc3VlZCBieSB0aGUgdGVuYW50XFwncyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKS4nXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxmb3JtbHktZm9ybVxuICAgICAgICAgIGNsYXNzPVwiZm9ybWx5LWdyb3VwLWFycmF5LWNvbHMgZC1ibG9jayBwLWwtMjQgcC1iLTI0IG1pbi1oZWlnaHQtZml0IHAtci04XCJcbiAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcbiAgICAgICAgICBbZmllbGRzXT1cImZpZWxkc1wiXG4gICAgICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdwLXQtMjQnOiAhKGNlcnRpZmljYXRlQXV0aG9yaXR5RmVhdHVyZUVuYWJsZWQgfCBhc3luYykgfVwiXG4gICAgICAgID48L2Zvcm1seS1mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgICA8Yzh5LXN0ZXBwZXItYnV0dG9uc1xuICAgICAgICBjbGFzcz1cInN0aWNreS1ib3R0b20gZC1ibG9jayBwLXQtMTYgcC1iLTE2IHNlcGFyYXRvci10b3AgYmctbGV2ZWwtMFwiXG4gICAgICAgIChvbk5leHQpPVwicmVnaXN0ZXJEZXZpY2UoJGV2ZW50KVwiXG4gICAgICAgIChvbkNhbmNlbCk9XCJjYW5jZWwoKVwiXG4gICAgICAgIFtzaG93QnV0dG9uc109XCJ7IGNhbmNlbDogdHJ1ZSwgbmV4dDogdHJ1ZSB9XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtPy52YWxpZFwiXG4gICAgICAgIFtwZW5kaW5nXT1cImlzTG9hZGluZyQgfCBhc3luY1wiXG4gICAgICA+PC9jOHktc3RlcHBlci1idXR0b25zPlxuICAgIDwvY2RrLXN0ZXA+XG4gICAgPGNkay1zdGVwIHN0YXRlPVwiZmluYWxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTI0IG1pbi1oZWlnaHQtZml0XCI+XG4gICAgICAgIDxjOHktb3BlcmF0aW9uLXJlc3VsdFxuICAgICAgICAgIGNsYXNzPVwibGVhZFwiXG4gICAgICAgICAgdHlwZT1cInN1Y2Nlc3NcIlxuICAgICAgICAgICpuZ0lmPVwic3VjY2Vzcy5sZW5ndGggPT09IDEgJiYgZmFpbGVkLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgdGV4dD1cInt7ICdEZXZpY2UgcmVnaXN0ZXJlZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIFtzaXplXT1cIjg0XCJcbiAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgID48L2M4eS1vcGVyYXRpb24tcmVzdWx0PlxuICAgICAgICA8Yzh5LW9wZXJhdGlvbi1yZXN1bHRcbiAgICAgICAgICBjbGFzcz1cImxlYWRcIlxuICAgICAgICAgIHR5cGU9XCJlcnJvclwiXG4gICAgICAgICAgKm5nSWY9XCJzdWNjZXNzLmxlbmd0aCA9PT0gMCAmJiBmYWlsZWQubGVuZ3RoID09PSAxXCJcbiAgICAgICAgICB0ZXh0PVwie3sgJ0ZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBbc2l6ZV09XCI4NFwiXG4gICAgICAgICAgW3ZlcnRpY2FsXT1cInRydWVcIlxuICAgICAgICA+PC9jOHktb3BlcmF0aW9uLXJlc3VsdD5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3VjY2Vzcy5sZW5ndGggPiAxIHx8IGZhaWxlZC5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgPGM4eS1vcGVyYXRpb24tcmVzdWx0XG4gICAgICAgICAgICBjbGFzcz1cImxlYWRcIlxuICAgICAgICAgICAgdHlwZT1cInN1Y2Nlc3NcIlxuICAgICAgICAgICAgKm5nSWY9XCJmYWlsZWQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgIFt0ZXh0XT1cIlxuICAgICAgICAgICAgICAne3sgc3VjY2Vzc2Z1bERldmljZXNDb3VudCB9fSBkZXZpY2VzIHJlZ2lzdGVyZWQnXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgc3VjY2Vzc2Z1bERldmljZXNDb3VudDogc3VjY2Vzcy5sZW5ndGggfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtzaXplXT1cIjg0XCJcbiAgICAgICAgICAgIFt2ZXJ0aWNhbF09XCJ0cnVlXCJcbiAgICAgICAgICA+PC9jOHktb3BlcmF0aW9uLXJlc3VsdD5cbiAgICAgICAgICA8Yzh5LW9wZXJhdGlvbi1yZXN1bHRcbiAgICAgICAgICAgIGNsYXNzPVwibGVhZFwiXG4gICAgICAgICAgICB0eXBlPVwiZXJyb3JcIlxuICAgICAgICAgICAgKm5nSWY9XCJzdWNjZXNzLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICBbdGV4dF09XCJcbiAgICAgICAgICAgICAgJ3t7IGZhaWxlZERldmljZXNDb3VudCB9fSBkZXZpY2VzIGZhaWxlZCB0byByZWdpc3RlcidcbiAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBmYWlsZWREZXZpY2VzQ291bnQ6IGZhaWxlZC5sZW5ndGggfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtzaXplXT1cIjg0XCJcbiAgICAgICAgICAgIFt2ZXJ0aWNhbF09XCJ0cnVlXCJcbiAgICAgICAgICA+PC9jOHktb3BlcmF0aW9uLXJlc3VsdD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwicC1sLTI0IHAtci0yNCB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgZGF0YS1jeT1cImRldmljZS1yZWdpc3RyYXRpb24tZmFpbHVyZS1tZXNzYWdlXCJcbiAgICAgICAgICAqbmdJZj1cInN1Y2Nlc3MubGVuZ3RoID4gMCAmJiBmYWlsZWQubGVuZ3RoID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8Yzh5LW9wZXJhdGlvbi1yZXN1bHRcbiAgICAgICAgICAgIGNsYXNzPVwibGVhZFwiXG4gICAgICAgICAgICB0eXBlPVwiZXJyb3JcIlxuICAgICAgICAgICAgdGV4dD1cInt7ICdTZXZlcmFsIGRldmljZXMgZmFpbGVkIHRvIHJlZ2lzdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbc2l6ZV09XCI4NFwiXG4gICAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgICAgICAgPHBcbiAgICAgICAgICAgIGNsYXNzPVwicC1iLTE2IHRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiBmYWlsZWQubGVuZ3RoLCB0b3RhbDogZmFpbGVkLmxlbmd0aCArIHN1Y2Nlc3MubGVuZ3RoIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbiBmYWlsZWQgZm9yIHt7IGNvdW50IH19IGRldmljZXMgb3V0IG9mIHt7IHRvdGFsIH19LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibS1iLTggcC1sLTI0IHAtci0yNFwiXG4gICAgICAgICAgZGF0YS1jeT1cImRldmljZS1yZWdpc3RyYXRpb24tc3VjY2Vzcy1tZXNzYWdlXCJcbiAgICAgICAgICAqbmdJZj1cInN1Y2Nlc3MubGVuZ3RoID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhKHVzZUVTVCQgfCBhc3luYylcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgVHVybiBvbiB0aGUgcmVnaXN0ZXJlZCBkZXZpY2VzIGFuZCB3YWl0IGZvciBjb25uZWN0aW9ucyB0byBiZSBlc3RhYmxpc2hlZC4gT25jZSBhIGRldmljZVxuICAgICAgICAgICAgaXMgY29ubmVjdGVkLCBpdHMgc3RhdHVzIHdpbGwgY2hhbmdlIHRvIFwiUGVuZGluZyBhY2NlcHRhbmNlXCIuIFlvdSB3aWxsIG5lZWQgdG8gYXBwcm92ZVxuICAgICAgICAgICAgaXQgYnkgY2xpY2tpbmcgb24gdGhlIFwiQWNjZXB0XCIgYnV0dG9uLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJ1c2VFU1QkIHwgYXN5bmNcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgVGhlIHN1Y2Nlc3NmdWxseSBlbnJvbGxlZCBkZXZpY2VzIGNhbiBub3cgcmVxdWVzdCBzaWduZWQgY2VydGlmaWNhdGVzIGFuZCB1c2UgdGhlbSB0b1xuICAgICAgICAgICAgY29ubmVjdCBhbmQgYXV0aGVudGljYXRlIHRvIHRoZSBwbGF0Zm9ybSB2aWEgY2VydGlmaWNhdGUtYmFzZWQgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJzZXBhcmF0b3ItdG9wIG0tdC0xNlwiPlxuICAgICAgICAgIDxjOHktbGkgKm5nRm9yPVwibGV0IGZhaWwgb2YgZmFpbGVkXCI+XG4gICAgICAgICAgICA8Yzh5LWxpLWljb25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIidiYW4nXCJcbiAgICAgICAgICAgID48L2M4eS1saS1pY29uPlxuICAgICAgICAgICAgPHA+e3sgZmFpbD8uaWQgfX08L3A+XG4gICAgICAgICAgICA8c21hbGw+e3sgZmFpbD8ubWVzc2FnZSB8IHRyYW5zbGF0ZSB9fTwvc21hbGw+XG4gICAgICAgICAgICA8Yzh5LWxpLWNvbGxhcHNlPlxuICAgICAgICAgICAgICA8cHJlPjxjb2RlPnt7IGZhaWw/LmRldGFpbHMgfCBqc29uIH19PC9jb2RlPjwvcHJlPlxuICAgICAgICAgICAgPC9jOHktbGktY29sbGFwc2U+XG4gICAgICAgICAgPC9jOHktbGk+XG5cbiAgICAgICAgICA8Yzh5LWxpICpuZ0Zvcj1cImxldCBzIG9mIHN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxjOHktbGktaWNvblxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc3VjY2Vzc1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cIidjaGVjay1jaXJjbGUnXCJcbiAgICAgICAgICAgID48L2M4eS1saS1pY29uPlxuICAgICAgICAgICAge3sgcz8uaWQgfX1cbiAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgPC9jOHktbGlzdC1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGM4eS1zdGVwcGVyLWJ1dHRvbnNcbiAgICAgICAgY2xhc3M9XCJzdGlja3ktYm90dG9tIGQtYmxvY2sgcC10LTE2IHAtYi0xNiBzZXBhcmF0b3ItdG9wIGJnLWxldmVsLTBcIlxuICAgICAgICAob25DdXN0b20pPVwiY2xvc2UoKVwiXG4gICAgICAgIChvbkJhY2spPVwiZml4RXJyb3JzKCRldmVudCwgZmFpbGVkKVwiXG4gICAgICAgIFtzaG93QnV0dG9uc109XCJ7IGJhY2s6IGZhaWxlZC5sZW5ndGggPiAwLCBjdXN0b206IHRydWUgfVwiXG4gICAgICAgIFtsYWJlbHNdPVwieyBiYWNrOiAnRml4IGVycm9ycycsIGN1c3RvbTogJ0Nsb3NlJyB9XCJcbiAgICAgID48L2M4eS1zdGVwcGVyLWJ1dHRvbnM+XG4gICAgPC9jZGstc3RlcD5cbiAgPC9jOHktc3RlcHBlcj5cbjwvYzh5LW1vZGFsPlxuIl19
|
|
@@ -596,8 +596,14 @@ class GeneralDeviceRegistrationComponent {
|
|
|
596
596
|
TENANT: el.tenant?.id || ''
|
|
597
597
|
};
|
|
598
598
|
});
|
|
599
|
+
const escapeValue = (value) => {
|
|
600
|
+
if (value.includes(';') || value.includes('"')) {
|
|
601
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
602
|
+
}
|
|
603
|
+
return value;
|
|
604
|
+
};
|
|
599
605
|
const csvRows = dataToSend
|
|
600
|
-
.map(row => fullCsvHeaders.map(header => row[header] ?? '').join(';'))
|
|
606
|
+
.map(row => fullCsvHeaders.map(header => escapeValue(row[header] ?? '')).join(';'))
|
|
601
607
|
.join('\n');
|
|
602
608
|
const csvContent = csvHeaders + csvRows;
|
|
603
609
|
const blob = new Blob([csvContent], { type: 'text/csv' });
|
|
@@ -613,7 +619,7 @@ class GeneralDeviceRegistrationComponent {
|
|
|
613
619
|
return defer(() => from(this.inventoryService.listQuery({ __filter: { __has: 'c8y_IsDeviceGroup' }, __orderby: [{ name: 1 }] }, { ...this.FILTER }))).pipe(shareReplay(1));
|
|
614
620
|
}
|
|
615
621
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GeneralDeviceRegistrationComponent, deps: [{ token: i1$1.TenantUiService }, { token: i2.TenantService }, { token: RegisterDeviceService }, { token: i2.InventoryService }, { token: i0.ChangeDetectorRef }, { token: i4.BsModalRef }, { token: i1$1.GainsightService }, { token: i2.DeviceRegistrationBulkService }, { token: i1$1.FeatureCacheService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
616
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeneralDeviceRegistrationComponent, selector: "c8y-general-device-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i5$2.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1$1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i6.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1$1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1$1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1$1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1$1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1$1.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
622
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeneralDeviceRegistrationComponent, selector: "c8y-general-device-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n data-cy=\"device-registration-failure-message\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i5$2.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1$1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i6.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1$1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1$1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1$1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1$1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1$1.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
617
623
|
}
|
|
618
624
|
__decorate([
|
|
619
625
|
memoize(),
|
|
@@ -635,7 +641,7 @@ __decorate([
|
|
|
635
641
|
], GeneralDeviceRegistrationComponent.prototype, "getGroups$", null);
|
|
636
642
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GeneralDeviceRegistrationComponent, decorators: [{
|
|
637
643
|
type: Component,
|
|
638
|
-
args: [{ selector: 'c8y-general-device-registration', changeDetection: ChangeDetectionStrategy.OnPush, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
644
|
+
args: [{ selector: 'c8y-general-device-registration', changeDetection: ChangeDetectionStrategy.OnPush, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n linear\n c8y-modal-body\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p\n class=\"text-medium text-16 separator-bottom p-16\"\n translate\n >\n Register general devices\n </p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n id=\"useEST\"\n name=\"useEST\"\n type=\"checkbox\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Create device certificates during device registration' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"cancel()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n data-cy=\"device-registration-failure-message\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\n >\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <p\n class=\"p-b-16 text-danger\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon\n class=\"text-danger\"\n [icon]=\"'ban'\"\n ></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"close()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
639
645
|
}], ctorParameters: () => [{ type: i1$1.TenantUiService }, { type: i2.TenantService }, { type: RegisterDeviceService }, { type: i2.InventoryService }, { type: i0.ChangeDetectorRef }, { type: i4.BsModalRef }, { type: i1$1.GainsightService }, { type: i2.DeviceRegistrationBulkService }, { type: i1$1.FeatureCacheService }], propDecorators: { canLoadTenants$: [], getTenants$: [], getGroups$: [] } });
|
|
640
646
|
|
|
641
647
|
class GeneralDeviceRegistrationService {
|