UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

58 lines 20.6 kB
import { Component } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; import { ApplicationService, ApplicationType } from '@c8y/client'; import { AlertService, WizardComponent } from '@c8y/ngx-components'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/client"; import * as i2 from "@angular/forms"; import * as i3 from "@c8y/ngx-components"; import * as i4 from "@angular/common"; export class AddExternalApplicationComponent { constructor(applicationService, formBuilder, alertService, wizardComponent) { this.applicationService = applicationService; this.formBuilder = formBuilder; this.alertService = alertService; this.wizardComponent = wizardComponent; } ngOnInit() { this.initForm(); } back() { this.wizardComponent.reset(); } cancel() { this.wizardComponent.close(); } done() { this.wizardComponent.close(); } async save(app) { const appToSave = { manifest: {}, externalUrl: app.externalUrl, type: ApplicationType.EXTERNAL, name: app.name, key: app.key }; try { this.createdApp = await this.applicationService.create(appToSave); } catch (ex) { this.alertService.addServerFailure(ex); } } initForm() { this.formGroup = this.formBuilder.group({ name: ['', [Validators.required, Validators.maxLength(120)]], key: ['', [Validators.required, Validators.maxLength(120)]], externalUrl: ['', Validators.required] }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddExternalApplicationComponent, deps: [{ token: i1.ApplicationService }, { token: i2.FormBuilder }, { token: i3.AlertService }, { token: i3.WizardComponent }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AddExternalApplicationComponent, selector: "c8y-add-external-application", ngImport: i0, template: "<form *ngIf=\"!createdApp; else appCreated\" [formGroup]=\"formGroup\" novalidate>\n <c8y-wizard-header>\n <i [c8yIcon]=\"'cloud-link'\"></i>\n <h4 translate id=\"modal-title\">Add external application</h4>\n </c8y-wizard-header>\n\n <c8y-wizard-body>\n <p class=\"p-16 text-medium text-center bg-level-0 separator-bottom sticky-top\">\n {{ 'Provide external application details' | translate }}\n </p>\n <div class=\"modal-body p-t-8\" id=\"modal-body\">\n <c8y-form-group>\n <label style=\"text-align: left\">{{ 'Name' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"name\"\n name=\"name\"\n placeholder=\"{{ 'e.g. My application' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label style=\"text-align: left\">{{ 'Application key' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"key\"\n name=\"key\"\n placeholder=\"{{ 'e.g. my-external-application-key' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label style=\"text-align: left\">{{ 'External URL' | translate }}</label>\n <input\n [pattern]=\"'^(?!javascript:).+'\"\n class=\"form-control\"\n formControlName=\"externalUrl\"\n name=\"externalUrl\"\n placeholder=\"{{ 'e.g.' | translate }} https://www.example.com\"\n required\n type=\"url\"\n />\n </c8y-form-group>\n </div>\n </c8y-wizard-body>\n\n <c8y-wizard-footer>\n <button\n (click)=\"back()\"\n class=\"btn btn-default\"\n title=\"{{ 'Back' | translate }}\"\n translate\n type=\"button\"\n >\n Back\n </button>\n <button (click)=\"cancel()\" class=\"btn btn-default\" title=\"{{ 'Cancel' | translate }}\" translate>\n Cancel\n </button>\n <button\n (click)=\"save(formGroup.value)\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n class=\"btn btn-primary btn-form\"\n title=\"{{ 'Add application' | translate }}\"\n type=\"button\"\n >\n {{ 'Add application' | translate }}\n </button>\n </c8y-wizard-footer>\n</form>\n<ng-template #appCreated>\n <c8y-wizard-body>\n <div class=\"d-flex d-col j-c-center a-i-center\" style=\"min-height: 324px\">\n <c8y-operation-result\n text=\"{{ 'Application created' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n </c8y-wizard-body>\n <c8y-wizard-footer>\n <button (click)=\"done()\" class=\"btn btn-default\" title=\"{{ 'Done' | translate }}\" translate>\n Done\n </button>\n <a\n (click)=\"$event.stopPropagation()\"\n [href]=\"formGroup.value.externalUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"btn btn-primary\"\n title=\"{{ 'Open' | translate }}\"\n >\n <i c8yIcon=\"external-link\" class=\"m-r-4\"></i>\n {{ 'Open' | translate }}\n </a>\n </c8y-wizard-footer>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i3.WizardHeaderComponent, selector: "c8y-wizard-header" }, { kind: "component", type: i3.WizardBodyComponent, selector: "c8y-wizard-body" }, { kind: "component", type: i3.WizardFooterComponent, selector: "c8y-wizard-footer" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddExternalApplicationComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-add-external-application', template: "<form *ngIf=\"!createdApp; else appCreated\" [formGroup]=\"formGroup\" novalidate>\n <c8y-wizard-header>\n <i [c8yIcon]=\"'cloud-link'\"></i>\n <h4 translate id=\"modal-title\">Add external application</h4>\n </c8y-wizard-header>\n\n <c8y-wizard-body>\n <p class=\"p-16 text-medium text-center bg-level-0 separator-bottom sticky-top\">\n {{ 'Provide external application details' | translate }}\n </p>\n <div class=\"modal-body p-t-8\" id=\"modal-body\">\n <c8y-form-group>\n <label style=\"text-align: left\">{{ 'Name' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"name\"\n name=\"name\"\n placeholder=\"{{ 'e.g. My application' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label style=\"text-align: left\">{{ 'Application key' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"key\"\n name=\"key\"\n placeholder=\"{{ 'e.g. my-external-application-key' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label style=\"text-align: left\">{{ 'External URL' | translate }}</label>\n <input\n [pattern]=\"'^(?!javascript:).+'\"\n class=\"form-control\"\n formControlName=\"externalUrl\"\n name=\"externalUrl\"\n placeholder=\"{{ 'e.g.' | translate }} https://www.example.com\"\n required\n type=\"url\"\n />\n </c8y-form-group>\n </div>\n </c8y-wizard-body>\n\n <c8y-wizard-footer>\n <button\n (click)=\"back()\"\n class=\"btn btn-default\"\n title=\"{{ 'Back' | translate }}\"\n translate\n type=\"button\"\n >\n Back\n </button>\n <button (click)=\"cancel()\" class=\"btn btn-default\" title=\"{{ 'Cancel' | translate }}\" translate>\n Cancel\n </button>\n <button\n (click)=\"save(formGroup.value)\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n class=\"btn btn-primary btn-form\"\n title=\"{{ 'Add application' | translate }}\"\n type=\"button\"\n >\n {{ 'Add application' | translate }}\n </button>\n </c8y-wizard-footer>\n</form>\n<ng-template #appCreated>\n <c8y-wizard-body>\n <div class=\"d-flex d-col j-c-center a-i-center\" style=\"min-height: 324px\">\n <c8y-operation-result\n text=\"{{ 'Application created' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n </c8y-wizard-body>\n <c8y-wizard-footer>\n <button (click)=\"done()\" class=\"btn btn-default\" title=\"{{ 'Done' | translate }}\" translate>\n Done\n </button>\n <a\n (click)=\"$event.stopPropagation()\"\n [href]=\"formGroup.value.externalUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"btn btn-primary\"\n title=\"{{ 'Open' | translate }}\"\n >\n <i c8yIcon=\"external-link\" class=\"m-r-4\"></i>\n {{ 'Open' | translate }}\n </a>\n </c8y-wizard-footer>\n</ng-template>\n" }] }], ctorParameters: () => [{ type: i1.ApplicationService }, { type: i2.FormBuilder }, { type: i3.AlertService }, { type: i3.WizardComponent }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWV4dGVybmFsLWFwcGxpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9hcHBsaWNhdGlvbnMvYWRkLWV4dGVybmFsLWFwcGxpY2FpdG9uL2FkZC1leHRlcm5hbC1hcHBsaWNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9lY29zeXN0ZW0vYXBwbGljYXRpb25zL2FkZC1leHRlcm5hbC1hcHBsaWNhaXRvbi9hZGQtZXh0ZXJuYWwtYXBwbGljYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQU1wRSxNQUFNLE9BQU8sK0JBQStCO0lBSTFDLFlBQ1Usa0JBQXNDLEVBQ3RDLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLGVBQWdDO1FBSGhDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO0lBQ3ZDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQWlCO1FBQzFCLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLFFBQVEsRUFBRSxFQUFlO1lBQ3pCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztZQUM1QixJQUFJLEVBQUUsZUFBZSxDQUFDLFFBQVE7WUFDOUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1NBQ2IsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLFFBQVE7UUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3RDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNELFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBaERVLCtCQUErQjttR0FBL0IsK0JBQStCLG9FQ1Q1QyxtdUdBdUdBOzs0RkQ5RmEsK0JBQStCO2tCQUozQyxTQUFTOytCQUNFLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TZXJ2aWNlLCBBcHBsaWNhdGlvblR5cGUsIElBcHBsaWNhdGlvbiwgSU1hbmlmZXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBXaXphcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFkZC1leHRlcm5hbC1hcHBsaWNhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtZXh0ZXJuYWwtYXBwbGljYXRpb24uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFkZEV4dGVybmFsQXBwbGljYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcbiAgY3JlYXRlZEFwcDogSUFwcGxpY2F0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwbGljYXRpb25TZXJ2aWNlOiBBcHBsaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHdpemFyZENvbXBvbmVudDogV2l6YXJkQ29tcG9uZW50XG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRGb3JtKCk7XG4gIH1cblxuICBiYWNrKCkge1xuICAgIHRoaXMud2l6YXJkQ29tcG9uZW50LnJlc2V0KCk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy53aXphcmRDb21wb25lbnQuY2xvc2UoKTtcbiAgfVxuXG4gIGRvbmUoKSB7XG4gICAgdGhpcy53aXphcmRDb21wb25lbnQuY2xvc2UoKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoYXBwOiBJQXBwbGljYXRpb24pIHtcbiAgICBjb25zdCBhcHBUb1NhdmUgPSB7XG4gICAgICBtYW5pZmVzdDoge30gYXMgSU1hbmlmZXN0LFxuICAgICAgZXh0ZXJuYWxVcmw6IGFwcC5leHRlcm5hbFVybCxcbiAgICAgIHR5cGU6IEFwcGxpY2F0aW9uVHlwZS5FWFRFUk5BTCxcbiAgICAgIG5hbWU6IGFwcC5uYW1lLFxuICAgICAga2V5OiBhcHAua2V5XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jcmVhdGVkQXBwID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuY3JlYXRlKGFwcFRvU2F2ZSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEyMCldXSxcbiAgICAgIGtleTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTIwKV1dLFxuICAgICAgZXh0ZXJuYWxVcmw6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGZvcm0gKm5nSWY9XCIhY3JlYXRlZEFwcDsgZWxzZSBhcHBDcmVhdGVkXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiBub3ZhbGlkYXRlPlxuICA8Yzh5LXdpemFyZC1oZWFkZXI+XG4gICAgPGkgW2M4eUljb25dPVwiJ2Nsb3VkLWxpbmsnXCI+PC9pPlxuICAgIDxoNCB0cmFuc2xhdGUgaWQ9XCJtb2RhbC10aXRsZVwiPkFkZCBleHRlcm5hbCBhcHBsaWNhdGlvbjwvaDQ+XG4gIDwvYzh5LXdpemFyZC1oZWFkZXI+XG5cbiAgPGM4eS13aXphcmQtYm9keT5cbiAgICA8cCBjbGFzcz1cInAtMTYgdGV4dC1tZWRpdW0gdGV4dC1jZW50ZXIgYmctbGV2ZWwtMCBzZXBhcmF0b3ItYm90dG9tIHN0aWNreS10b3BcIj5cbiAgICAgIHt7ICdQcm92aWRlIGV4dGVybmFsIGFwcGxpY2F0aW9uIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9wPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHAtdC04XCIgaWQ9XCJtb2RhbC1ib2R5XCI+XG4gICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnRcIj57eyAnTmFtZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiXG4gICAgICAgICAgbmFtZT1cIm5hbWVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gTXkgYXBwbGljYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgLz5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdFwiPnt7ICdBcHBsaWNhdGlvbiBrZXknIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImtleVwiXG4gICAgICAgICAgbmFtZT1cImtleVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLiBteS1leHRlcm5hbC1hcHBsaWNhdGlvbi1rZXknIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgLz5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdFwiPnt7ICdFeHRlcm5hbCBVUkwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgW3BhdHRlcm5dPVwiJ14oPyFqYXZhc2NyaXB0OikuKydcIlxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJleHRlcm5hbFVybFwiXG4gICAgICAgICAgbmFtZT1cImV4dGVybmFsVXJsXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSBodHRwczovL3d3dy5leGFtcGxlLmNvbVwiXG4gICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgLz5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPC9kaXY+XG4gIDwvYzh5LXdpemFyZC1ib2R5PlxuXG4gIDxjOHktd2l6YXJkLWZvb3Rlcj5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwiYmFjaygpXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgIHRpdGxlPVwie3sgJ0JhY2snIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHRyYW5zbGF0ZVxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgQmFja1xuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImNhbmNlbCgpXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCIgdHJhbnNsYXRlPlxuICAgICAgQ2FuY2VsXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgKGNsaWNrKT1cInNhdmUoZm9ybUdyb3VwLnZhbHVlKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybUdyb3VwLmludmFsaWQgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1mb3JtXCJcbiAgICAgIHRpdGxlPVwie3sgJ0FkZCBhcHBsaWNhdGlvbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAge3sgJ0FkZCBhcHBsaWNhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9jOHktd2l6YXJkLWZvb3Rlcj5cbjwvZm9ybT5cbjxuZy10ZW1wbGF0ZSAjYXBwQ3JlYXRlZD5cbiAgPGM4eS13aXphcmQtYm9keT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtY29sIGotYy1jZW50ZXIgYS1pLWNlbnRlclwiIHN0eWxlPVwibWluLWhlaWdodDogMzI0cHhcIj5cbiAgICAgIDxjOHktb3BlcmF0aW9uLXJlc3VsdFxuICAgICAgICB0ZXh0PVwie3sgJ0FwcGxpY2F0aW9uIGNyZWF0ZWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgW3NpemVdPVwiODRcIlxuICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgIHR5cGU9XCJzdWNjZXNzXCJcbiAgICAgICAgY2xhc3M9XCJsZWFkXCJcbiAgICAgID48L2M4eS1vcGVyYXRpb24tcmVzdWx0PlxuICAgIDwvZGl2PlxuICA8L2M4eS13aXphcmQtYm9keT5cbiAgPGM4eS13aXphcmQtZm9vdGVyPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImRvbmUoKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgdGl0bGU9XCJ7eyAnRG9uZScgfCB0cmFuc2xhdGUgfX1cIiB0cmFuc2xhdGU+XG4gICAgICBEb25lXG4gICAgPC9idXR0b24+XG4gICAgPGFcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgW2hyZWZdPVwiZm9ybUdyb3VwLnZhbHVlLmV4dGVybmFsVXJsXCJcbiAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIHRpdGxlPVwie3sgJ09wZW4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICA+XG4gICAgICA8aSBjOHlJY29uPVwiZXh0ZXJuYWwtbGlua1wiIGNsYXNzPVwibS1yLTRcIj48L2k+XG4gICAgICB7eyAnT3BlbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2E+XG4gIDwvYzh5LXdpemFyZC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuIl19