UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

116 lines 23.9 kB
import { Component, Input, ViewChild } from '@angular/core'; import { C8yStepper, GainsightService, gettext } from '@c8y/ngx-components'; import { FormGroup } from '@angular/forms'; import { BsModalRef } from 'ngx-bootstrap/modal'; import { ExtensibleDeviceRegistrationService } from './extensible-device-registration.service'; import { RegisterDeviceService } from '../../register-device.service'; import { STEP_STATE } from '@angular/cdk/stepper'; import { PRODUCT_EXPERIENCE_BASE_REGISTRATION } from '../base-device-registration.model'; import * as i0 from "@angular/core"; import * as i1 from "./extensible-device-registration.service"; import * as i2 from "../../register-device.service"; import * as i3 from "ngx-bootstrap/modal"; import * as i4 from "@c8y/ngx-components"; import * as i5 from "@angular/common"; import * as i6 from "@angular/cdk/stepper"; import * as i7 from "@ngx-formly/core"; export class ExtensibleDeviceRegistrationStepperComponent { constructor(customProviderService, registerDeviceService, bsModalRef, gainsightService) { this.customProviderService = customProviderService; this.registerDeviceService = registerDeviceService; this.bsModalRef = bsModalRef; this.gainsightService = gainsightService; this.pendingStatus = false; this.forms = []; this.model = {}; this.SERVER_ERROR = gettext('Cannot register your device.'); this.SUCCESSFUL_REGISTRATION = gettext('Your device was successfully registered.'); this.NO_CONNECTION = gettext('Unable to reach the microservice.'); } ngOnInit() { this.steps.forEach(() => this.forms.push(new FormGroup({}))); } async save() { this.pendingStatus = true; this.errorMessage = null; const { res, data } = await this.customProviderService .registerDevice(this.contextPath, this.model) .catch(() => { return { res: undefined, data: undefined }; }) .finally(() => { this.pendingStatus = false; this.stepper.next(); }); if (res && data) { if (res.status >= 400 && res.status < 500) { this.handleError(data.message || this.SERVER_ERROR); } else if (res.status >= 500) { this.handleError(this.SERVER_ERROR); } else { this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, { result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS, component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_SINGLE }); this.message = this.SUCCESSFUL_REGISTRATION; } } else { this.handleError(this.NO_CONNECTION); } } close() { this.bsModalRef.hide(); } complete() { this.registerDeviceService.list(); this.bsModalRef.hide(); } goToFirstStep() { this.stepper.selectedIndex = 0; } isRegistrationStep() { return this.stepper.selectedIndex === this.steps.length - 1; } finalStepStatus() { if (this.stepper.selectedIndex === this.steps.length) { if (this.errorMessage) { return STEP_STATE.ERROR; } else { return STEP_STATE.DONE; } } else { return STEP_STATE.NUMBER; } } handleError(message) { this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, { result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE, component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_SINGLE }); this.errorMessage = message; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExtensibleDeviceRegistrationStepperComponent, deps: [{ token: i1.ExtensibleDeviceRegistrationService }, { token: i2.RegisterDeviceService }, { token: i3.BsModalRef }, { token: i4.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ExtensibleDeviceRegistrationStepperComponent, selector: "c8y-extensible-device-registration-stepper", inputs: { contextPath: "contextPath", labels: "labels", steps: "steps" }, viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-stepper\n [disableProgressButtons]=\"true\"\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n [customClasses]=\"['m-40', 'm-t-8', 'm-b-16']\"\n>\n <cdk-step *ngFor=\"let step of steps; let i = index\" [stepControl]=\"forms[i]\" [label]=\"labels[i]\">\n <c8y-form-group class=\"form-group p-24 p-b-0 p-t-16\">\n <formly-form [form]=\"forms[i]\" [fields]=\"step\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: true, next: true }\"\n [labels]=\"{ next: 'Register' }\"\n (onCancel)=\"close()\"\n (onNext)=\"save()\"\n [pending]=\"pendingStatus\"\n [disabled]=\"forms[i].invalid\"\n ></c8y-stepper-buttons>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"!isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: i !== 0, next: true }\"\n [disabled]=\"forms[i].invalid\"\n (onCancel)=\"close()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step [state]=\"finalStepStatus()\" label=\"{{ 'Summary' | translate }}\">\n <c8y-operation-result\n *ngIf=\"!errorMessage; else errorInfo\"\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <ng-template #errorInfo>\n <c8y-operation-result\n text=\"{{ errorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n [showButtons]=\"{ cancel: errorMessage, back: errorMessage, next: !errorMessage }\"\n [labels]=\"{ back: 'Fix issue', next: 'Close' }\"\n (onCancel)=\"close()\"\n (onNext)=\"complete()\"\n (onBack)=\"goToFirstStep()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n</c8y-stepper>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i4.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: i4.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExtensibleDeviceRegistrationStepperComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-extensible-device-registration-stepper', template: "<c8y-stepper\n [disableProgressButtons]=\"true\"\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n [customClasses]=\"['m-40', 'm-t-8', 'm-b-16']\"\n>\n <cdk-step *ngFor=\"let step of steps; let i = index\" [stepControl]=\"forms[i]\" [label]=\"labels[i]\">\n <c8y-form-group class=\"form-group p-24 p-b-0 p-t-16\">\n <formly-form [form]=\"forms[i]\" [fields]=\"step\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: true, next: true }\"\n [labels]=\"{ next: 'Register' }\"\n (onCancel)=\"close()\"\n (onNext)=\"save()\"\n [pending]=\"pendingStatus\"\n [disabled]=\"forms[i].invalid\"\n ></c8y-stepper-buttons>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"!isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: i !== 0, next: true }\"\n [disabled]=\"forms[i].invalid\"\n (onCancel)=\"close()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step [state]=\"finalStepStatus()\" label=\"{{ 'Summary' | translate }}\">\n <c8y-operation-result\n *ngIf=\"!errorMessage; else errorInfo\"\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <ng-template #errorInfo>\n <c8y-operation-result\n text=\"{{ errorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n [showButtons]=\"{ cancel: errorMessage, back: errorMessage, next: !errorMessage }\"\n [labels]=\"{ back: 'Fix issue', next: 'Close' }\"\n (onCancel)=\"close()\"\n (onNext)=\"complete()\"\n (onBack)=\"goToFirstStep()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n</c8y-stepper>\n" }] }], ctorParameters: () => [{ type: i1.ExtensibleDeviceRegistrationService }, { type: i2.RegisterDeviceService }, { type: i3.BsModalRef }, { type: i4.GainsightService }], propDecorators: { stepper: [{ type: ViewChild, args: [C8yStepper, { static: true }] }], contextPath: [{ type: Input }], labels: [{ type: Input }], steps: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaWJsZS1kZXZpY2UtcmVnaXN0cmF0aW9uLXN0ZXBwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcmVnaXN0ZXItZGV2aWNlL2V4dGVuc2libGUvc2luZ2xlL2V4dGVuc2libGUtZGV2aWNlLXJlZ2lzdHJhdGlvbi1zdGVwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3JlZ2lzdGVyLWRldmljZS9leHRlbnNpYmxlL3NpbmdsZS9leHRlbnNpYmxlLWRldmljZS1yZWdpc3RyYXRpb24tc3RlcHBlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7O0FBTXpGLE1BQU0sT0FBTyw0Q0FBNEM7SUFpQnZELFlBQ1UscUJBQTBELEVBQzFELHFCQUE0QyxFQUM1QyxVQUFzQixFQUN0QixnQkFBa0M7UUFIbEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFxQztRQUMxRCwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLGVBQVUsR0FBVixVQUFVLENBQVk7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QUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztZQUMxQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUFlO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsb0NBQW9DLENBQUMsS0FBSyxFQUFFO1lBQzdFLE1BQU0sRUFBRSxvQ0FBb0MsQ0FBQyxNQUFNLENBQUMsT0FBTztZQUMzRCxTQUFTLEVBQUUsb0NBQW9DLENBQUMsU0FBUyxDQUFDLGlCQUFpQjtTQUM1RSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUM5QixDQUFDOytHQWhHVSw0Q0FBNEM7bUdBQTVDLDRDQUE0QyxxTUFNNUMsVUFBVSw4RENwQnZCLG9yRUF5REE7OzRGRDNDYSw0Q0FBNEM7a0JBSnhELFNBQVM7K0JBQ0UsNENBQTRDO29NQVV0RCxPQUFPO3NCQUROLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHOUIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEM4eVN0ZXBwZXIsIEdhaW5zaWdodFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IEV4dGVuc2libGVEZXZpY2VSZWdpc3RyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpYmxlLWRldmljZS1yZWdpc3RyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpc3RlckRldmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9yZWdpc3Rlci1kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtbHlGaWVsZENvbmZpZyB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgU1RFUF9TVEFURSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zdGVwcGVyJztcbmltcG9ydCB7IFBST0RVQ1RfRVhQRVJJRU5DRV9CQVNFX1JFR0lTVFJBVElPTiB9IGZyb20gJy4uL2Jhc2UtZGV2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1leHRlbnNpYmxlLWRldmljZS1yZWdpc3RyYXRpb24tc3RlcHBlcicsXG4gIHRlbXBsYXRlVXJsOiAnZXh0ZW5zaWJsZS1kZXZpY2UtcmVnaXN0cmF0aW9uLXN0ZXBwZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEV4dGVuc2libGVEZXZpY2VSZWdpc3RyYXRpb25TdGVwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgcGVuZGluZ1N0YXR1cyA9IGZhbHNlO1xuICBmb3JtczogRm9ybUdyb3VwW10gPSBbXTtcbiAgbW9kZWw6IGFueSA9IHt9O1xuICBAVmlld0NoaWxkKEM4eVN0ZXBwZXIsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHN0ZXBwZXI6IEM4eVN0ZXBwZXI7XG5cbiAgQElucHV0KCkgY29udGV4dFBhdGg6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgc3RlcHM6IEZvcm1seUZpZWxkQ29uZmlnW11bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IFNFUlZFUl9FUlJPUiA9IGdldHRleHQoJ0Nhbm5vdCByZWdpc3RlciB5b3VyIGRldmljZS4nKTtcbiAgcHJpdmF0ZSByZWFkb25seSBTVUNDRVNTRlVMX1JFR0lTVFJBVElPTiA9IGdldHRleHQoJ1lvdXIgZGV2aWNlIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4nKTtcbiAgcHJpdmF0ZSByZWFkb25seSBOT19DT05ORUNUSU9OID0gZ2V0dGV4dCgnVW5hYmxlIHRvIHJlYWNoIHRoZSBtaWNyb3NlcnZpY2UuJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjdXN0b21Qcm92aWRlclNlcnZpY2U6IEV4dGVuc2libGVEZXZpY2VSZWdpc3RyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVnaXN0ZXJEZXZpY2VTZXJ2aWNlOiBSZWdpc3RlckRldmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBic01vZGFsUmVmOiBCc01vZGFsUmVmLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdGVwcy5mb3JFYWNoKCgpID0+IHRoaXMuZm9ybXMucHVzaChuZXcgRm9ybUdyb3VwKHt9KSkpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0aGlzLnBlbmRpbmdTdGF0dXMgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gbnVsbDtcbiAgICBjb25zdCB7IHJlcywgZGF0YSB9ID0gYXdhaXQgdGhpcy5jdXN0b21Qcm92aWRlclNlcnZpY2VcbiAgICAgIC5yZWdpc3RlckRldmljZSh0aGlzLmNvbnRleHRQYXRoLCB0aGlzLm1vZGVsKVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkYXRhOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0ZXBwZXIubmV4dCgpO1xuICAgICAgfSk7XG5cbiAgICBpZiAocmVzICYmIGRhdGEpIHtcbiAgICAgIGlmIChyZXMuc3RhdHVzID49IDQwMCAmJiByZXMuc3RhdHVzIDwgNTAwKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZGF0YS5tZXNzYWdlIHx8IHRoaXMuU0VSVkVSX0VSUk9SKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcih0aGlzLlNFUlZFUl9FUlJPUik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFBST0RVQ1RfRVhQRVJJRU5DRV9CQVNFX1JFR0lTVFJBVElPTi5FVkVOVCwge1xuICAgICAgICAgIHJlc3VsdDogUFJPRFVDVF9FWFBFUklFTkNFX0JBU0VfUkVHSVNUUkFUSU9OLlJFU1VMVC5TVUNDRVNTLFxuICAgICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFX0JBU0VfUkVHSVNUUkFUSU9OLkNPTVBPTkVOVC5FWFRFTlNJQkxFX1NJTkdMRVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gdGhpcy5TVUNDRVNTRlVMX1JFR0lTVFJBVElPTjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcih0aGlzLk5PX0NPTk5FQ1RJT04pO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxuICBjb21wbGV0ZSgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5saXN0KCk7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4gIGdvVG9GaXJzdFN0ZXAoKSB7XG4gICAgdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXggPSAwO1xuICB9XG5cbiAgaXNSZWdpc3RyYXRpb25TdGVwKCkge1xuICAgIHJldHVybiB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy5zdGVwcy5sZW5ndGggLSAxO1xuICB9XG5cbiAgZmluYWxTdGVwU3RhdHVzKCkge1xuICAgIGlmICh0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLmVycm9yTWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gU1RFUF9TVEFURS5FUlJPUjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBTVEVQX1NUQVRFLkRPTkU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTVEVQX1NUQVRFLk5VTUJFUjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQoUFJPRFVDVF9FWFBFUklFTkNFX0JBU0VfUkVHSVNUUkFUSU9OLkVWRU5ULCB7XG4gICAgICByZXN1bHQ6IFBST0RVQ1RfRVhQRVJJRU5DRV9CQVNFX1JFR0lTVFJBVElPTi5SRVNVTFQuRkFJTFVSRSxcbiAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFX0JBU0VfUkVHSVNUUkFUSU9OLkNPTVBPTkVOVC5FWFRFTlNJQkxFX1NJTkdMRVxuICAgIH0pO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gbWVzc2FnZTtcbiAgfVxufVxuIiwiPGM4eS1zdGVwcGVyXG4gIFtkaXNhYmxlUHJvZ3Jlc3NCdXR0b25zXT1cInRydWVcIlxuICBbZGlzYWJsZURlZmF1bHRJY29uc109XCJ7IGVkaXQ6IHRydWUsIGRvbmU6IGZhbHNlIH1cIlxuICBbY3VzdG9tQ2xhc3Nlc109XCJbJ20tNDAnLCAnbS10LTgnLCAnbS1iLTE2J11cIlxuPlxuICA8Y2RrLXN0ZXAgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXhcIiBbc3RlcENvbnRyb2xdPVwiZm9ybXNbaV1cIiBbbGFiZWxdPVwibGFiZWxzW2ldXCI+XG4gICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwiZm9ybS1ncm91cCBwLTI0IHAtYi0wIHAtdC0xNlwiPlxuICAgICAgPGZvcm1seS1mb3JtIFtmb3JtXT1cImZvcm1zW2ldXCIgW2ZpZWxkc109XCJzdGVwXCIgW21vZGVsXT1cIm1vZGVsXCI+PC9mb3JtbHktZm9ybT5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgIDxjOHktc3RlcHBlci1idXR0b25zXG4gICAgICBjbGFzcz1cInN0aWNreS1ib3R0b20gZC1ibG9jayBtb2RhbC1mb290ZXIgc2VwYXJhdG9yLXRvcCBiZy1jb21wb25lbnRcIlxuICAgICAgKm5nSWY9XCJpc1JlZ2lzdHJhdGlvblN0ZXAoKVwiXG4gICAgICBbc2hvd0J1dHRvbnNdPVwieyBjYW5jZWw6IHRydWUsIGJhY2s6IHRydWUsIG5leHQ6IHRydWUgfVwiXG4gICAgICBbbGFiZWxzXT1cInsgbmV4dDogJ1JlZ2lzdGVyJyB9XCJcbiAgICAgIChvbkNhbmNlbCk9XCJjbG9zZSgpXCJcbiAgICAgIChvbk5leHQpPVwic2F2ZSgpXCJcbiAgICAgIFtwZW5kaW5nXT1cInBlbmRpbmdTdGF0dXNcIlxuICAgICAgW2Rpc2FibGVkXT1cImZvcm1zW2ldLmludmFsaWRcIlxuICAgID48L2M4eS1zdGVwcGVyLWJ1dHRvbnM+XG4gICAgPGM4eS1zdGVwcGVyLWJ1dHRvbnNcbiAgICAgIGNsYXNzPVwic3RpY2t5LWJvdHRvbSBkLWJsb2NrIG1vZGFsLWZvb3RlciBzZXBhcmF0b3ItdG9wIGJnLWNvbXBvbmVudFwiXG4gICAgICAqbmdJZj1cIiFpc1JlZ2lzdHJhdGlvblN0ZXAoKVwiXG4gICAgICBbc2hvd0J1dHRvbnNdPVwieyBjYW5jZWw6IHRydWUsIGJhY2s6IGkgIT09IDAsIG5leHQ6IHRydWUgfVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybXNbaV0uaW52YWxpZFwiXG4gICAgICAob25DYW5jZWwpPVwiY2xvc2UoKVwiXG4gICAgPjwvYzh5LXN0ZXBwZXItYnV0dG9ucz5cbiAgPC9jZGstc3RlcD5cbiAgPGNkay1zdGVwIFtzdGF0ZV09XCJmaW5hbFN0ZXBTdGF0dXMoKVwiIGxhYmVsPVwie3sgJ1N1bW1hcnknIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgPGM4eS1vcGVyYXRpb24tcmVzdWx0XG4gICAgICAqbmdJZj1cIiFlcnJvck1lc3NhZ2U7IGVsc2UgZXJyb3JJbmZvXCJcbiAgICAgIHRleHQ9XCJ7eyBtZXNzYWdlIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIFtzaXplXT1cIjg0XCJcbiAgICAgIFt2ZXJ0aWNhbF09XCJ0cnVlXCJcbiAgICAgIHR5cGU9XCJzdWNjZXNzXCJcbiAgICAgIGNsYXNzPVwibGVhZFwiXG4gICAgICBkYXRhLWN5PVwic3VjY2Vzc1wiXG4gICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgPG5nLXRlbXBsYXRlICNlcnJvckluZm8+XG4gICAgICA8Yzh5LW9wZXJhdGlvbi1yZXN1bHRcbiAgICAgICAgdGV4dD1cInt7IGVycm9yTWVzc2FnZSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFtzaXplXT1cIjg0XCJcbiAgICAgICAgW3ZlcnRpY2FsXT1cInRydWVcIlxuICAgICAgICB0eXBlPVwiZXJyb3JcIlxuICAgICAgICBjbGFzcz1cImxlYWRcIlxuICAgICAgICBkYXRhLWN5PVwiZXJyb3JcIlxuICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8Yzh5LXN0ZXBwZXItYnV0dG9uc1xuICAgICAgY2xhc3M9XCJzdGlja3ktYm90dG9tIGQtYmxvY2sgbW9kYWwtZm9vdGVyIHNlcGFyYXRvci10b3AgYmctY29tcG9uZW50XCJcbiAgICAgIFtzaG93QnV0dG9uc109XCJ7IGNhbmNlbDogZXJyb3JNZXNzYWdlLCBiYWNrOiBlcnJvck1lc3NhZ2UsIG5leHQ6ICFlcnJvck1lc3NhZ2UgfVwiXG4gICAgICBbbGFiZWxzXT1cInsgYmFjazogJ0ZpeCBpc3N1ZScsIG5leHQ6ICdDbG9zZScgfVwiXG4gICAgICAob25DYW5jZWwpPVwiY2xvc2UoKVwiXG4gICAgICAob25OZXh0KT1cImNvbXBsZXRlKClcIlxuICAgICAgKG9uQmFjayk9XCJnb1RvRmlyc3RTdGVwKClcIlxuICAgID48L2M4eS1zdGVwcGVyLWJ1dHRvbnM+XG4gIDwvY2RrLXN0ZXA+XG48L2M4eS1zdGVwcGVyPlxuIl19